aboutsummaryrefslogtreecommitdiff
path: root/gradle-plugin/src/test/kotlin/com/google/devtools/ksp/gradle/testing/TestProject.kt
blob: 9af2222aac2bf5d98135265dba3fbe8d645ccd73 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
/*
 * Copyright 2021 Google LLC
 * Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
 *
 * 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.google.devtools.ksp.gradle.testing

import java.io.File

/**
 * Simple wrapper that represents a test project.
 */
class TestProject(
    val rootDir: File,
    val testConfig: TestConfig
) {
    val processorModule = TestModule(
        rootDir.resolve("processor")
    ).also {
        it.plugins.add(PluginDeclaration.kotlin("jvm", testConfig.kotlinBaseVersion))
        it.dependencies.add(
            DependencyDeclaration.artifact(
                "implementation",
                "com.google.devtools.ksp:symbol-processing-api:${testConfig.kspVersion}"
            )
        )
        // add gradle-plugin test classpath as a dependency to be able to load processors.
        it.dependencies.add(
            DependencyDeclaration.files(
                "implementation",
                testConfig.processorClasspath
            )
        )
    }

    val appModule = TestModule(
        rootDir.resolve("app")
    )

    fun writeFiles() {
        writeBuildFile()
        writeSettingsFile()
        appModule.writeBuildFile()
        processorModule.writeBuildFile()
    }

    private fun writeSettingsFile() {
        val contents = """
                include("processor")
                include("app")
                pluginManagement {
                    repositories {
                        maven("${testConfig.mavenRepoDir}")
                        gradlePluginPortal()
                        google()
                        maven("https://maven.pkg.jetbrains.space/kotlin/p/kotlin/bootstrap/")
                    }
                }
            """.trimIndent()
        rootDir.resolve("settings.gradle.kts").writeText(contents)
    }

    private fun writeBuildFile() {
        val rootBuildFile = buildString {
            appendln("plugins {")
            val allPlugins = (processorModule.plugins + appModule.plugins).distinct()
            allPlugins.forEach {
                appendln("""    ${it.text} version "${it.version}" apply false """)
            }
            appendln("}")
            appendln(
                """
            repositories {
                maven("${testConfig.mavenRepoDir}")
                mavenCentral()
                maven("https://maven.pkg.jetbrains.space/kotlin/p/kotlin/bootstrap/")
                google()
            }
            configurations.all {
                resolutionStrategy.eachDependency {
                    if (requested.group == "org.jetbrains.kotlin") {
                        useVersion("${testConfig.kotlinBaseVersion}")
                    }
                }
            }
            subprojects {
                repositories {
                    maven("${testConfig.mavenRepoDir}")
                    mavenCentral()
                    maven("https://maven.pkg.jetbrains.space/kotlin/p/kotlin/bootstrap/")
                    google()
                }
                configurations.all {
                    resolutionStrategy.eachDependency {
                        if (requested.group == "org.jetbrains.kotlin") {
                            useVersion("${testConfig.kotlinBaseVersion}")
                        }
                    }
                }
            }
            """.trimIndent()
            )
        }
        rootDir.resolve("build.gradle.kts").writeText(rootBuildFile)
    }
}