/*
 * Copyright 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.
 */

import androidx.build.LibraryGroups
import androidx.build.LibraryVersions
import androidx.build.Publish
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

import static androidx.build.dependencies.DependenciesKt.*

plugins {
    id("AndroidXPlugin")
    id("com.android.library")
    id("AndroidXUiPlugin")
    id("kotlin-multiplatform")
}

dependencies {
    kotlinPlugin project(path: ":compose:compose-compiler")
}

kotlin {
    android()
    sourceSets {
        commonMain.dependencies {
            api project(":compose:animation:animation-core")
            api project(":compose:runtime:runtime-dispatch")
            api project(":compose:ui:ui")
            api project(":compose:ui:ui-geometry")
            api project(":compose:ui:ui-text")
            api project(":compose:ui:ui-unit")
            api project(":compose:ui:ui-util")

            implementation(KOTLIN_STDLIB_COMMON)
            implementation project(":compose:animation:animation")
            implementation project(":compose:foundation:foundation")
            implementation project(":compose:foundation:foundation-layout")
            implementation project(":compose:foundation:foundation-text")
            implementation project(":compose:runtime:runtime")
            implementation project(":compose:runtime:runtime-saved-instance-state")
        }

        androidMain.dependencies {
            api(JUNIT)
            api(ANDROIDX_TEST_EXT_JUNIT)
            api "androidx.activity:activity:1.2.0-alpha02"
            api project(":compose:runtime:runtime")
            api project(":compose:ui:ui-graphics")

            implementation(ANDROIDX_TEST_RULES)
            implementation(ANDROIDX_TEST_RUNNER)
            implementation(ESPRESSO_CORE)
        }

        test.dependencies {
            implementation(TRUTH)
        }

        androidAndroidTest.dependencies {
            implementation(TRUTH)
            implementation project(':compose:material:material')
            implementation project(":compose:ui:ui")
        }
    }
}

android {
    tasks.withType(KotlinCompile).configureEach {
        kotlinOptions {
            freeCompilerArgs += ["-XXLanguage:-NewInference"]
            useIR = true
        }
    }
}

androidx {
    name = "Compose Testing"
    publish = Publish.SNAPSHOT_AND_RELEASE
    mavenVersion = LibraryVersions.COMPOSE
    mavenGroup = LibraryGroups.UI
    inceptionYear = "2019"
    description = "Compose testing library"
}