Skip to content

Commit f3a30e9

Browse files
committed
Add settings plugin test
1 parent 958cd04 commit f3a30e9

File tree

1 file changed

+235
-0
lines changed

1 file changed

+235
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,235 @@
1+
package kotlinx.validation.test
2+
3+
import dev.adamko.kotlin.binary_compatibility_validator.test.utils.GradleProjectTest
4+
import dev.adamko.kotlin.binary_compatibility_validator.test.utils.build
5+
import dev.adamko.kotlin.binary_compatibility_validator.test.utils.buildGradleKts
6+
import dev.adamko.kotlin.binary_compatibility_validator.test.utils.dir
7+
import dev.adamko.kotlin.binary_compatibility_validator.test.utils.gradleKtsProjectTest
8+
import dev.adamko.kotlin.binary_compatibility_validator.test.utils.invariantNewlines
9+
import dev.adamko.kotlin.binary_compatibility_validator.test.utils.settingsGradleKts
10+
import dev.adamko.kotlin.binary_compatibility_validator.test.utils.shouldHaveOutcome
11+
import dev.adamko.kotlin.binary_compatibility_validator.test.utils.shouldNotHaveRunTask
12+
import io.kotest.assertions.asClue
13+
import io.kotest.assertions.withClue
14+
import io.kotest.core.spec.style.FunSpec
15+
import io.kotest.matchers.paths.shouldBeAFile
16+
import io.kotest.matchers.paths.shouldExist
17+
import io.kotest.matchers.shouldBe
18+
import io.kotest.matchers.string.shouldContain
19+
import kotlin.io.path.readText
20+
import org.gradle.testkit.runner.TaskOutcome
21+
import org.intellij.lang.annotations.Language
22+
23+
internal class SettingsPluginDslTest : FunSpec({
24+
25+
context("when BCV-MU is applied as a settings plugin") {
26+
27+
val kotlinJvmTest = TestCase(
28+
projectType = "Kotlin/JVM",
29+
project = kotlinJvmProjectWithBcvSettingsPlugin(),
30+
expectedPrintedBCVTargets = """
31+
|name: kotlinJvm
32+
|platformType: kotlinJvm
33+
|enabled: true
34+
|ignoredClasses: [com.package.MyIgnoredClass]
35+
|ignoredMarkers: [com.package.MyInternalApiAnnotationMarker]
36+
|ignoredPackages: [com.package.my_ignored_package]
37+
|inputClasses: [main, main]
38+
|inputJar: null
39+
|------------------------------
40+
|
41+
""".trimMargin()
42+
)
43+
44+
val kotlinMultiplatformTest = TestCase(
45+
projectType = "Kotlin/Multiplatform",
46+
project = kotlinMultiplatformProjectWithBcvSettingsPlugin(),
47+
expectedPrintedBCVTargets = """
48+
|name: jvm
49+
|platformType: jvm
50+
|enabled: true
51+
|ignoredClasses: [com.package.MyIgnoredClass]
52+
|ignoredMarkers: [com.package.MyInternalApiAnnotationMarker]
53+
|ignoredPackages: [com.package.my_ignored_package]
54+
|inputClasses: [main]
55+
|inputJar: null
56+
|------------------------------
57+
|
58+
""".trimMargin()
59+
)
60+
61+
listOf(
62+
kotlinJvmTest,
63+
kotlinMultiplatformTest,
64+
).forEach { testCase ->
65+
context("in a ${testCase.projectType} project") {
66+
67+
test("apiDump should be generated in all non-excluded subprojects") {
68+
testCase.project.projectDir.toFile()
69+
.walk()
70+
.filter { it.isDirectory && it.name == "api" }
71+
.forEach { it.deleteRecursively() }
72+
73+
testCase.project.runner
74+
.withArguments("apiDump", "--stacktrace")
75+
.build {
76+
output shouldContain "SUCCESSFUL"
77+
78+
withClue("root project is excluded from BCV") {
79+
shouldNotHaveRunTask(":apiDump")
80+
}
81+
82+
task(":sub1:apiDump") shouldHaveOutcome TaskOutcome.SUCCESS
83+
task(":sub2:apiDump") shouldHaveOutcome TaskOutcome.SUCCESS
84+
}
85+
86+
testCase.project.projectDir.resolve("sub1/api/sub1.api").asClue { apiDump ->
87+
apiDump.shouldExist()
88+
apiDump.shouldBeAFile()
89+
apiDump.readText().invariantNewlines() shouldBe /* language=TEXT */ """
90+
|
91+
""".trimMargin()
92+
}
93+
94+
testCase.project.projectDir.resolve("sub2/api/sub2.api").asClue { apiDump ->
95+
apiDump.shouldExist()
96+
apiDump.shouldBeAFile()
97+
apiDump.readText().invariantNewlines() shouldBe /* language=TEXT */ """
98+
|
99+
""".trimMargin()
100+
}
101+
}
102+
103+
test("expect the conventions set in the settings plugin are used in the subprojects") {
104+
testCase.project.runner.withArguments("printBCVTargets", "-q", "--stacktrace").build {
105+
output.invariantNewlines() shouldBe testCase.expectedPrintedBCVTargets
106+
}
107+
}
108+
}
109+
}
110+
}
111+
})
112+
113+
private data class TestCase(
114+
val projectType: String,
115+
val project: GradleProjectTest,
116+
@Language("TEXT")
117+
val expectedPrintedBCVTargets: String,
118+
)
119+
120+
private fun kotlinJvmProjectWithBcvSettingsPlugin() =
121+
gradleKtsProjectTest("settings-plugin-dsl-test/kotlin-jvm") {
122+
123+
settingsGradleKts += settingsGradleKtsWithBcvPlugin
124+
125+
buildGradleKts = "\n"
126+
127+
dir("sub1") {
128+
buildGradleKts = buildGradleKtsWithKotlinJvmAndBcvConfig
129+
}
130+
131+
dir("sub2") {
132+
buildGradleKts = buildGradleKtsWithKotlinJvmAndBcvConfig
133+
buildGradleKts += printBcvTargetsTask
134+
}
135+
}
136+
137+
138+
private fun kotlinMultiplatformProjectWithBcvSettingsPlugin() =
139+
gradleKtsProjectTest("settings-plugin-dsl-test/kotlin-multiplatform-jvm") {
140+
141+
settingsGradleKts += settingsGradleKtsWithBcvPlugin
142+
143+
buildGradleKts = "\n"
144+
145+
dir("sub1") {
146+
buildGradleKts = buildGradleKtsWithKotlinMultiplatformJvmAndBcvConfig
147+
}
148+
149+
dir("sub2") {
150+
buildGradleKts = buildGradleKtsWithKotlinMultiplatformJvmAndBcvConfig
151+
buildGradleKts += printBcvTargetsTask
152+
}
153+
}
154+
155+
@Language("kts")
156+
private val settingsGradleKtsWithBcvPlugin = """
157+
buildscript {
158+
dependencies {
159+
classpath("org.jetbrains.kotlin:kotlin-gradle-plugin-api:1.7.20")
160+
}
161+
}
162+
163+
164+
plugins {
165+
id("dev.adamko.kotlin.binary-compatibility-validator") version "0.0.3-SNAPSHOT"
166+
}
167+
168+
include(
169+
":sub1",
170+
":sub2",
171+
)
172+
173+
binaryCompatibilityValidator {
174+
ignoredProjects.add(":")
175+
defaultTargetValues {
176+
enabled.convention(true)
177+
ignoredClasses.set(listOf("com.package.MyIgnoredClass"))
178+
ignoredMarkers.set(listOf("com.package.MyInternalApiAnnotationMarker"))
179+
ignoredPackages.set(listOf("com.package.my_ignored_package"))
180+
}
181+
}
182+
183+
"""
184+
185+
@Language("kts")
186+
private val buildGradleKtsWithKotlinJvmAndBcvConfig = """
187+
plugins {
188+
kotlin("jvm") version "1.7.20"
189+
}
190+
191+
// check that the DSL is available:
192+
binaryCompatibilityValidator { }
193+
194+
"""
195+
196+
/**
197+
* Note: the `kotlin("multiplatform")` version should be set in [settingsGradleKtsWithBcvPlugin].
198+
*/
199+
@Language("kts")
200+
private val buildGradleKtsWithKotlinMultiplatformJvmAndBcvConfig = """
201+
plugins {
202+
kotlin("multiplatform") version "1.7.20"
203+
}
204+
205+
kotlin {
206+
jvm()
207+
}
208+
209+
// check that the DSL is available:
210+
binaryCompatibilityValidator { }
211+
212+
"""
213+
214+
@Language("kts")
215+
private val printBcvTargetsTask = """
216+
val printBCVTargets by tasks.registering {
217+
218+
val bcvTargets = binaryCompatibilityValidator.targets
219+
220+
doLast {
221+
bcvTargets.forEach {
222+
println("name: " + it.name)
223+
println("platformType: " + it.platformType)
224+
println("enabled: " + it.enabled.get())
225+
println("ignoredClasses: " + it.ignoredClasses.get())
226+
println("ignoredMarkers: " + it.ignoredMarkers.get())
227+
println("ignoredPackages: " + it.ignoredPackages.get())
228+
println("inputClasses: " + it.inputClasses.files.map { f -> f.name })
229+
println("inputJar: " + it.inputJar.orNull)
230+
println("------------------------------")
231+
}
232+
}
233+
}
234+
235+
"""

0 commit comments

Comments
 (0)