/*
 * Copyright 2023 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 org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType

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

androidXMultiplatform {
    android()
    ios()
    jvm()
    linux()
    mac()

    sourceSets {
        commonTest {
            dependencies {
                implementation(project(":sqlite:sqlite"))
                implementation(libs.kotlinStdlib)
                implementation(libs.kotlinTest)
                implementation(project(":kruth:kruth"))
            }
        }
        androidInstrumentedTest {
            dependsOn(commonTest)
            dependencies {
                implementation(project(":sqlite:sqlite-framework"))
                implementation(project(":sqlite:sqlite-bundled"))

                implementation(libs.kotlinTestJunit)
                implementation(libs.testRunner)
                implementation(libs.testCore)
            }
        }
        jvmTest {
            dependsOn(commonTest)
            dependencies {
                implementation(project(":sqlite:sqlite-bundled"))

                implementation(libs.kotlinTestJunit)
            }
        }
        nativeTest {
            dependsOn(commonTest)
            dependencies {
                implementation(project(":sqlite:sqlite-framework"))
                implementation(project(":sqlite:sqlite-bundled"))
            }
        }
        targets.configureEach { target ->
            if (target.platformType == KotlinPlatformType.native) {
                target.compilations["test"].defaultSourceSet {
                    dependsOn(nativeTest)
                }
            }
        }
    }
}

android {
    namespace "androidx.sqlite.driver.test"
}

androidx {
    name = "SQLite Driver Coformance Base Tests"
    inceptionYear = "2023"
    description = "SQLite Kotlin driver coformance base tests"
}