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

/**
 * This file was created using the `create_project.py` script located in the
 * `<AndroidX root>/development/project-creator` directory.
 *
 * Please use that script when creating a new project, rather than copying an existing project and
 * modifying its settings.
 */

import androidx.build.SoftwareType
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
    id("AndroidXPlugin")
    id("com.android.library")
    id("org.jetbrains.kotlin.android")
}

android {
    defaultConfig {
        testInstrumentationRunner = "androidx.benchmark.junit4.AndroidBenchmarkRunner"
    }
    buildTypes.configureEach {
        consumerProguardFiles "proguard-rules.pro"
    }
    namespace = "androidx.benchmark.junit4"
}

dependencies {
    api(project(":benchmark:benchmark-common"))

    api(libs.junit)
    api(libs.kotlinStdlib)

    implementation("androidx.test:rules:1.5.0")
    implementation("androidx.test:runner:1.5.2")
    implementation("androidx.tracing:tracing-ktx:1.1.0")
    api("androidx.annotation:annotation:1.8.1")

    androidTestImplementation(project(":internal-testutils-ktx"))
    androidTestImplementation(libs.testCore)
    androidTestImplementation(libs.testExtJunit)
    androidTestImplementation(libs.kotlinTest)
}

androidx {
    name = "Benchmark - JUnit4"
    type = SoftwareType.PUBLISHED_LIBRARY
    inceptionYear = "2019"
    description = "Android Benchmark - JUnit4"
    legacyDisableKotlinStrictApiMode = true
    deviceTests {
        enableAlsoRunningOnPhysicalDevices = true
    }
    samples(project(":benchmark:benchmark-samples"))
}

tasks.withType(KotlinCompile).configureEach {
    kotlinOptions {
        // Enable using experimental APIs from within same version group
        freeCompilerArgs += [
                "-opt-in=androidx.benchmark.ExperimentalBenchmarkConfigApi",
                "-opt-in=androidx.benchmark.perfetto.ExperimentalPerfettoCaptureApi",
        ]
    }
}
