/*
 * Copyright (C) 2015 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.performance

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.VariantBuildScriptGenerator
import org.junit.AfterClass
import org.junit.BeforeClass
import org.junit.ClassRule
import org.junit.Test

/**
 * Performance test on gradle plugin with a large number of variants
 */
class LargeVariantAndroidTest {
    @ClassRule
    static public GradleTestProject project = GradleTestProject.builder()
            .fromTestApp(new HelloWorldApp())
            .create()

    @BeforeClass
    static void setUp() {
        project.buildFile << new VariantBuildScriptGenerator(
                buildTypes: VariantBuildScriptGenerator.LARGE_NUMBER,
                productFlavors: VariantBuildScriptGenerator.LARGE_NUMBER,
                """
                apply plugin: "com.android.application"

                android {
                    compileSdkVersion $GradleTestProject.DEFAULT_COMPILE_SDK_VERSION
                    buildToolsVersion "$GradleTestProject.DEFAULT_BUILD_TOOL_VERSION"

                    buildTypes {
                        \${buildTypes}
                    }

                    productFlavors {
                        \${productFlavors}
                    }
                }
                """.stripIndent()).createBuildScript()
        project.execute("help");
    }

    @AfterClass
    static void cleanUp() {
        project = null
    }

    @Test
    void performanceTest() {
        project.execute("help")
    }
}
