44package org.jetbrains.dokka.gradle.engine.parameters
55
66import io.kotest.core.spec.style.FunSpec
7+ import io.kotest.core.test.TestScope
8+ import io.kotest.inspectors.shouldForAll
79import io.kotest.matchers.collections.shouldBeEmpty
810import io.kotest.matchers.collections.shouldContainExactly
11+ import io.kotest.matchers.collections.shouldContainExactlyInAnyOrder
12+ import io.kotest.matchers.file.shouldBeAFile
913import io.kotest.matchers.shouldBe
1014import org.gradle.api.Project
1115import org.gradle.kotlin.dsl.apply
@@ -16,6 +20,11 @@ import org.jetbrains.dokka.gradle.DokkaPlugin
1620import org.jetbrains.dokka.gradle.engine.parameters.VisibilityModifier.Public
1721import org.jetbrains.dokka.gradle.utils.create_
1822import org.jetbrains.dokka.gradle.utils.enableV2Plugin
23+ import java.nio.file.Path
24+ import kotlin.io.path.Path
25+ import kotlin.io.path.createDirectories
26+ import kotlin.io.path.relativeTo
27+ import kotlin.io.path.writeText
1928
2029class DokkaSourceSetSpecTest : FunSpec ({
2130
@@ -147,153 +156,160 @@ class DokkaSourceSetSpecTest : FunSpec({
147156
148157 context("DokkaSourceSetSpec inputSourceFiles -> ") {
149158
150- test("should contain all files from sourceRoots when no suppression is configured") {
151- val project = createProject()
152- val dss = project.createDokkaSourceSetSpec("foo")
153-
154- val srcDir = project.file("src/main/kotlin").apply { mkdirs() }
155- val file1 = srcDir.resolve("File1 .kt").apply { writeText("class File1 ") }
156- val file2 = srcDir.resolve("File2 .kt").apply { writeText("class File2 ") }
157-
158- dss.sourceRoots.from(srcDir)
159-
160- dss.inputSourceFiles.shouldContainExactly(file1, file2)
161- }
162-
163- test("should exclude manually suppressed files from suppressedFiles") {
164- val project = createProject()
165- val dss = project.createDokkaSourceSetSpec("foo")
166-
167- val srcDir = project.file("src/main/kotlin").apply { mkdirs() }
168- val file1 = srcDir.resolve("File1 .kt").apply { writeText("class File1 ") }
169- val file2 = srcDir.resolve("File2 .kt").apply { writeText("class File2 ") }
170- val file3 = srcDir.resolve("File3 .kt").apply { writeText("class File3 ") }
159+ val project = createProject()
171160
172- dss.sourceRoots.from(srcDir)
173- dss.suppressedFiles.from(file2)
174- dss.suppressGeneratedFiles.set(false)
161+ val projectDir = project.projectDir.toPath()
162+ fun Path .createClass(name: String ) {
163+ createDirectories()
164+ resolve("$name.kt").writeText("class $name")
165+ }
166+
167+ val mainSourceDir =
168+ projectDir.resolve("src/main/kotlin").apply {
169+ resolve("com/example").apply {
170+ createClass("MainCls ")
171+ resolve("sub").apply {
172+ createClass("Sub1MainCls ")
173+ createClass("Sub2MainCls ")
174+ }
175+ }
176+ }
177+ val generatedSrcDir =
178+ projectDir.resolve("build/generated/kotlin").apply {
179+ createClass("BuildGenCls ")
180+ resolve("sub").apply {
181+ createClass("Sub1BuildGenCls ")
182+ createClass("Sub2BuildGenCls ")
183+ }
184+ }
185+ val customGeneratedSrcDir =
186+ projectDir.resolve("src/customGenerated/kotlin").apply {
187+ createClass("CustomGenCls ")
188+ resolve("sub").apply {
189+ createClass("Sub1CustomGenCls ")
190+ createClass("Sub2CustomGenCls ")
191+ }
192+ }
175193
176- dss.inputSourceFiles.shouldContainExactly(file1, file3)
194+ fun TestScope .createDss(): DokkaSourceSetSpec {
195+ val dss = project.createDokkaSourceSetSpec(testCase.name.testName)
196+ dss.sourceRoots.from(mainSourceDir, generatedSrcDir, customGeneratedSrcDir)
197+ return dss
177198 }
178199
179- test("should exclude generated files when suppressGeneratedFiles is true") {
180- val project = createProject()
181- val dss = project.createDokkaSourceSetSpec("foo")
182-
183- val srcDir = project.file("src/main/kotlin").apply { mkdirs() }
184- val regularFile = srcDir.resolve("Regular .kt").apply { writeText("class Regular ") }
185- val generatedDir = project.file("build/generated/source").apply { mkdirs() }
186- generatedDir.resolve("Generated .kt").apply { writeText("class Generated ") }
200+ fun DokkaSourceSetSpec .inputSourceFilesToRelativePaths(): List <Path > =
201+ inputSourceFiles.map { it.toPath().relativeTo(projectDir) }
187202
188- dss.sourceRoots.from(srcDir, generatedDir)
189- dss.suppressGeneratedFiles.set(true)
190-
191- dss.inputSourceFiles.shouldContainExactly(regularFile)
203+ test("build/generated should be excluded by default") {
204+ val dss = createDss()
205+ dss.inputSourceFilesToRelativePaths() shouldContainExactlyInAnyOrder listOf(
206+ Path ("src/customGenerated/kotlin/CustomGenCls .kt"),
207+ Path ("src/customGenerated/kotlin/sub/Sub1CustomGenCls .kt"),
208+ Path ("src/customGenerated/kotlin/sub/Sub2CustomGenCls .kt"),
209+ Path ("src/main/kotlin/com/example/MainCls .kt"),
210+ Path ("src/main/kotlin/com/example/sub/Sub1MainCls .kt"),
211+ Path ("src/main/kotlin/com/example/sub/Sub2MainCls .kt"),
212+ )
192213 }
193-
194- test("should include generated files when suppressGeneratedFiles is false") {
195- val project = createProject()
196- val dss = project.createDokkaSourceSetSpec("foo")
197-
198- val srcDir = project.file("src/main/kotlin").apply { mkdirs() }
199- val regularFile = srcDir.resolve("Regular .kt").apply { writeText("class Regular ") }
200- val generatedDir = project.file("build/generated/source").apply { mkdirs() }
201- val generatedFile = generatedDir.resolve("Generated .kt").apply { writeText("class Generated ") }
202-
203- dss.sourceRoots.from(srcDir, generatedDir)
214+ test("when suppressGeneratedFiles is set to false, expect all source files are included") {
215+ val dss = createDss()
204216 dss.suppressGeneratedFiles.set(false)
205-
206- dss.inputSourceFiles.shouldContainExactly(generatedFile, regularFile)
207- }
208-
209- test("should correctly apply both suppressedFiles and suppressGeneratedFiles filters") {
210- val project = createProject()
211- val dss = project.createDokkaSourceSetSpec("foo")
212-
213- val srcDir = project.file("src/main/kotlin").apply { mkdirs() }
214- val file1 = srcDir.resolve("File1 .kt").apply { writeText("class File1 ") }
215- val file2 = srcDir.resolve("File2 .kt").apply { writeText("class File2 ") }
216- val generatedDir = project.file("build/generated/source").apply { mkdirs() }
217- generatedDir.resolve("Generated .kt").apply { writeText("class Generated ") }
218-
219- dss.sourceRoots.from(srcDir, generatedDir)
220- dss.suppressedFiles.from(file2)
221- dss.suppressGeneratedFiles.set(true)
222-
223- dss.inputSourceFiles.shouldContainExactly(file1)
224- }
225-
226- test("should handle multiple source roots correctly") {
227- val project = createProject()
228- val dss = project.createDokkaSourceSetSpec("foo")
229-
230- val srcDir1 = project.file("src/main/kotlin").apply { mkdirs() }
231- val file1 = srcDir1.resolve("File1 .kt").apply { writeText("class File1 ") }
232- val srcDir2 = project.file("src/test/kotlin").apply { mkdirs() }
233- val file2 = srcDir2.resolve("File2 .kt").apply { writeText("class File2 ") }
234- val srcDir3 = project.file("src/integration/kotlin").apply { mkdirs() }
235- val file3 = srcDir3.resolve("File3 .kt").apply { writeText("class File3 ") }
236-
237- dss.sourceRoots.from(srcDir1, srcDir2, srcDir3)
217+ dss.inputSourceFilesToRelativePaths() shouldContainExactlyInAnyOrder listOf(
218+ Path ("build/generated/kotlin/BuildGenCls .kt"),
219+ Path ("build/generated/kotlin/sub/Sub1BuildGenCls .kt"),
220+ Path ("build/generated/kotlin/sub/Sub2BuildGenCls .kt"),
221+ Path ("src/customGenerated/kotlin/CustomGenCls .kt"),
222+ Path ("src/customGenerated/kotlin/sub/Sub1CustomGenCls .kt"),
223+ Path ("src/customGenerated/kotlin/sub/Sub2CustomGenCls .kt"),
224+ Path ("src/main/kotlin/com/example/MainCls .kt"),
225+ Path ("src/main/kotlin/com/example/sub/Sub1MainCls .kt"),
226+ Path ("src/main/kotlin/com/example/sub/Sub2MainCls .kt"),
227+ )
228+ }
229+ test("input source files should only contain files, not directories") {
230+ val dss = createDss()
238231 dss.suppressGeneratedFiles.set(false)
239-
240- dss.inputSourceFiles.shouldContainExactly(file3, file1, file2)
232+ dss.inputSourceFiles.files.shouldForAll { it.shouldBeAFile() }
241233 }
242-
243- test("should filter files correctly with nested directory structures") {
244- val project = createProject()
245- val dss = project.createDokkaSourceSetSpec("foo")
246-
247- val srcDir = project.file("src/main/kotlin").apply { mkdirs() }
248- val packageDir = srcDir.resolve("com/example").apply { mkdirs() }
249- val file1 = packageDir.resolve("File1 .kt").apply { writeText("class File1 ") }
250- val subPackageDir = packageDir.resolve("sub").apply { mkdirs() }
251- val file2 = subPackageDir.resolve("File2 .kt").apply { writeText("class File2 ") }
252- val file3 = subPackageDir.resolve("File3 .kt").apply { writeText("class File3 ") }
253-
254- dss.sourceRoots.from(srcDir)
255- dss.suppressedFiles.from(file2)
234+ test("expect files can be excluded by exact path") {
235+ val dss = createDss()
256236 dss.suppressGeneratedFiles.set(false)
257-
258- dss.inputSourceFiles.shouldContainExactly(file1, file3)
259- }
260-
261- test("should exclude entire suppressed directories") {
262- val project = createProject()
263- val dss = project.createDokkaSourceSetSpec("foo")
264-
265- val srcDir = project.file ("src/main /kotlin").apply { mkdirs() }
266- val file1 = srcDir.resolve(" File1 .kt").apply { writeText("class File1 ") }
267- val suppressedDir = srcDir.resolve("suppressed").apply { mkdirs() }
268- suppressedDir.resolve(" File2 .kt").apply { writeText("class File2 ") }
269- suppressedDir.resolve(" File3 .kt").apply { writeText("class File3 ") }
270-
271- dss.sourceRoots.from(srcDir)
272- dss.suppressedFiles.from(suppressedDir )
237+ dss.suppressedFiles.from(
238+ "build/generated/kotlin/sub/ Sub1BuildGenCls .kt",
239+ "src/customGenerated/kotlin/sub/ Sub1CustomGenCls .kt",
240+ "src/main/kotlin/com/example/sub/ Sub1MainCls .kt",
241+ )
242+ dss.inputSourceFilesToRelativePaths() shouldContainExactlyInAnyOrder listOf(
243+ Path ("build/generated/kotlin/ BuildGenCls .kt"),
244+ Path ("build/generated/kotlin/sub/ Sub2BuildGenCls .kt"),
245+ Path ("src/customGenerated /kotlin/ CustomGenCls .kt"),
246+ Path ("src/customGenerated/kotlin/sub/ Sub2CustomGenCls .kt"),
247+ Path ("src/main/kotlin/com/example/ MainCls .kt"),
248+ Path ("src/main/kotlin/com/example/sub/ Sub2MainCls .kt"),
249+ )
250+ }
251+ test("expect files can be excluded by base directories") {
252+ val dss = createDss( )
273253 dss.suppressGeneratedFiles.set(false)
274-
275- dss.inputSourceFiles.shouldContainExactly(file1)
276- }
277-
278- test("should contain only files from deeply nested directory structures") {
279- val project = createProject()
280- val dss = project.createDokkaSourceSetSpec("foo")
281-
282- val srcDir = project.file("src/main/kotlin").apply { mkdirs() }
283- val level1 = srcDir.resolve("com").apply { mkdirs() }
284- val level2 = level1.resolve("example").apply { mkdirs() }
285- val level3 = level2.resolve("domain").apply { mkdirs() }
286- val level4 = level3.resolve("model").apply { mkdirs() }
287- val level5 = level4.resolve("internal").apply { mkdirs() }
288-
289- val file1 = level1.resolve("Root .kt").apply { writeText("class Root ") }
290- val file2 = level3.resolve("Domain .kt").apply { writeText("class Domain ") }
291- val file3 = level5.resolve("Internal .kt").apply { writeText("class Internal ") }
292-
293- dss.sourceRoots.from(srcDir)
254+ dss.suppressedFiles.from(
255+ "build/",
256+ "src/",
257+ )
258+ dss.inputSourceFilesToRelativePaths().shouldBeEmpty()
259+ }
260+ test("expect files can be excluded by sub directories") {
261+ val dss = createDss()
294262 dss.suppressGeneratedFiles.set(false)
295-
296- dss.inputSourceFiles.shouldContainExactly(file1, file2, file3)
263+ dss.suppressedFiles.from(
264+ "build/generated/kotlin/sub/",
265+ "src/customGenerated/kotlin/sub/",
266+ "src/main/kotlin/com/example/sub/",
267+ )
268+ dss.inputSourceFilesToRelativePaths() shouldContainExactlyInAnyOrder listOf(
269+ Path ("build/generated/kotlin/BuildGenCls .kt"),
270+ Path ("src/customGenerated/kotlin/CustomGenCls .kt"),
271+ Path ("src/main/kotlin/com/example/MainCls .kt"),
272+ )
273+ }
274+ test("expect nested files can be excluded") {
275+ val dss = createDss()
276+ dss.suppressGeneratedFiles.set(false)
277+ dss.suppressedFiles.from(
278+ "build/generated/kotlin/sub/",
279+ "src/customGenerated/kotlin/sub/",
280+ "src/main/kotlin/com/example/sub/",
281+ )
282+ dss.inputSourceFilesToRelativePaths() shouldContainExactlyInAnyOrder listOf(
283+ Path ("build/generated/kotlin/BuildGenCls .kt"),
284+ Path ("src/customGenerated/kotlin/CustomGenCls .kt"),
285+ Path ("src/main/kotlin/com/example/MainCls .kt"),
286+ )
287+ }
288+ test("expect suppressGeneratedFiles and suppressedFiles (by specific files) exclude all generated and specified files") {
289+ val dss = createDss()
290+ dss.suppressGeneratedFiles.set(true)
291+ dss.suppressedFiles.from(
292+ "src/customGenerated/kotlin/sub/Sub1CustomGenCls .kt",
293+ "src/customGenerated/kotlin/sub/Sub2CustomGenCls .kt",
294+ "src/main/kotlin/com/example/sub/Sub1MainCls .kt",
295+ "src/main/kotlin/com/example/sub/Sub2MainCls .kt",
296+ )
297+ dss.inputSourceFilesToRelativePaths() shouldContainExactlyInAnyOrder listOf(
298+ Path ("src/customGenerated/kotlin/CustomGenCls .kt"),
299+ Path ("src/main/kotlin/com/example/MainCls .kt"),
300+ )
301+ }
302+ test("expect suppressGeneratedFiles and suppressedFiles (by directories) exclude all generated and specified files") {
303+ val dss = createDss()
304+ dss.suppressGeneratedFiles.set(true)
305+ dss.suppressedFiles.from(
306+ "src/customGenerated/kotlin/",
307+ )
308+ dss.inputSourceFilesToRelativePaths() shouldContainExactlyInAnyOrder listOf(
309+ Path ("src/main/kotlin/com/example/MainCls .kt"),
310+ Path ("src/main/kotlin/com/example/sub/Sub1MainCls .kt"),
311+ Path ("src/main/kotlin/com/example/sub/Sub2MainCls .kt"),
312+ )
297313 }
298314 }
299315}) {
0 commit comments