Skip to content

Commit a07e81a

Browse files
committed
revert manual sorting, refactor inputSourceFiles tests
1 parent c0f25ee commit a07e81a

File tree

2 files changed

+154
-138
lines changed

2 files changed

+154
-138
lines changed

dokka-runners/dokka-gradle-plugin/src/main/kotlin/engine/parameters/DokkaSourceSetSpec.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ package org.jetbrains.dokka.gradle.engine.parameters
55

66
import org.gradle.api.*
77
import org.gradle.api.file.ConfigurableFileCollection
8+
import org.gradle.api.file.FileCollection
89
import org.gradle.api.model.ObjectFactory
910
import org.gradle.api.plugins.ExtensionAware
1011
import org.gradle.api.provider.Property
@@ -16,7 +17,6 @@ import org.jetbrains.dokka.gradle.engine.parameters.SourceSetIdSpec.Companion.do
1617
import org.jetbrains.dokka.gradle.internal.InternalDokkaGradlePluginApi
1718
import org.jetbrains.dokka.gradle.internal.adding
1819
import org.jetbrains.dokka.gradle.internal.domainObjectContainer
19-
import java.io.File
2020
import java.io.Serializable
2121
import javax.inject.Inject
2222
import kotlin.DeprecationLevel.ERROR
@@ -448,12 +448,12 @@ constructor(
448448
@get:InputFiles
449449
@get:IgnoreEmptyDirectories
450450
@get:PathSensitive(PathSensitivity.RELATIVE)
451-
internal val inputSourceFiles: List<File>
451+
internal val inputSourceFiles: FileCollection
452452
get() = sourceRoots.asFileTree.filter { sourceFile ->
453453
suppressedFiles.none { suppressedFile ->
454454
sourceFile.startsWith(suppressedFile)
455455
}
456-
}.sortedBy { it.invariantSeparatorsPath } // FileTrees have an unstable order (even on the same machine)
456+
}
457457

458458
companion object {
459459

dokka-runners/dokka-gradle-plugin/src/test/kotlin/engine/parameters/DokkaSourceSetSpecTest.kt

Lines changed: 151 additions & 135 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,12 @@
44
package org.jetbrains.dokka.gradle.engine.parameters
55

66
import io.kotest.core.spec.style.FunSpec
7+
import io.kotest.core.test.TestScope
8+
import io.kotest.inspectors.shouldForAll
79
import io.kotest.matchers.collections.shouldBeEmpty
810
import io.kotest.matchers.collections.shouldContainExactly
11+
import io.kotest.matchers.collections.shouldContainExactlyInAnyOrder
12+
import io.kotest.matchers.file.shouldBeAFile
913
import io.kotest.matchers.shouldBe
1014
import org.gradle.api.Project
1115
import org.gradle.kotlin.dsl.apply
@@ -16,6 +20,11 @@ import org.jetbrains.dokka.gradle.DokkaPlugin
1620
import org.jetbrains.dokka.gradle.engine.parameters.VisibilityModifier.Public
1721
import org.jetbrains.dokka.gradle.utils.create_
1822
import 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

2029
class 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

Comments
 (0)