/*
 * Copyright (C) 2018 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.build.gradle.integration.application

import com.android.build.gradle.integration.common.truth.TruthHelper.assertThat

import com.android.build.gradle.integration.common.fixture.GradleTestProject
import com.android.build.gradle.integration.common.fixture.app.HelloWorldApp
import com.android.build.gradle.integration.common.fixture.app.TestSourceFile;
import com.android.builder.model.SyncIssue
import com.google.common.collect.Iterables
import org.junit.Rule
import org.junit.Test

/** Test basic project with min sdk version in the manifest.  */
class MinSdkVersionTest {
    @Rule
    @JvmField
    val project = GradleTestProject.builder()
            .fromTestApp(helloWorldApp)
            .create()

    companion object {
        val helloWorldApp = HelloWorldApp.forPlugin("com.android.application")
        init {
            helloWorldApp.replaceFile(
                    TestSourceFile(
                            "src/main/AndroidManifest.xml",
                            "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"
                                    + "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n"
                                    + "      package=\"com.example.helloworld\"\n"
                                    + "      android:versionCode=\"1\"\n"
                                    + "      android:versionName=\"1.0\">\n"
                                    + "\n"
                                    + "    <uses-sdk android:minSdkVersion=\"3\" />\n"
                                    + "    <application android:label=\"@string/app_name\">\n"
                                    + "        <activity android:name=\".HelloWorld\"\n"
                                    + "                  android:label=\"@string/app_name\">\n"
                                    + "            <intent-filter>\n"
                                    + "                <action android:name=\"android.intent.action.MAIN\" />\n"
                                    + "                <category android:name=\"android.intent.category.LAUNCHER\" />\n"
                                    + "            </intent-filter>\n"
                                    + "        </activity>\n"
                                    + "    </application>\n"
                                    + "</manifest>\n"))
        }
    }

    @Test
    fun checkMinSdkSyncIssue() {
        val issues = project.model().ignoreSyncIssues().fetchAndroidProjects().onlyModelSyncIssues
        assertThat(issues).hasSize(1)

        val issue = Iterables.getOnlyElement(issues)
        assertThat(issue).hasType(SyncIssue.TYPE_MIN_SDK_VERSION_IN_MANIFEST)
        assertThat(issue).hasSeverity(SyncIssue.SEVERITY_ERROR)
    }

}
