From b1ad9e29bec57c83668c4086dbe025336ccae79c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ivan=20=E2=80=9CCLOVIS=E2=80=9D=20Canet?= Date: Sat, 2 May 2026 18:41:27 +0200 Subject: [PATCH] test(test-runner): Test all Markdown files in the :test-data modules --- .../src/jvmTest/kotlin/FindTestCases.kt | 37 ++++++++++++++---- test-runner/src/jvmTest/kotlin/Runner.kt | 38 ++++++++++--------- 2 files changed, 50 insertions(+), 25 deletions(-) diff --git a/test-runner/src/jvmTest/kotlin/FindTestCases.kt b/test-runner/src/jvmTest/kotlin/FindTestCases.kt index 8df1b7a..dbd4bf3 100644 --- a/test-runner/src/jvmTest/kotlin/FindTestCases.kt +++ b/test-runner/src/jvmTest/kotlin/FindTestCases.kt @@ -1,8 +1,9 @@ package opensavvy.dokka.material.mkdocs.test +import opensavvy.prepared.compat.filesystem.div import java.io.File -fun findTestCases(): List { +fun findTestCases(): List { val srcFolder = File("../test-data/src").absoluteFile check(srcFolder.exists()) check(srcFolder.isDirectory) @@ -10,17 +11,37 @@ fun findTestCases(): List { val platformFolders = srcFolder.listFiles() checkNotNull(platformFolders) { "No platform folders found in test data source" } - val commonMain = platformFolders.firstOrNull { it.name == "commonMain" } - checkNotNull(commonMain) { "No commonMain folder found in test data source: ${srcFolder}/commonMain" } - val testCases = platformFolders .map { File(it, "kotlin") } - .flatMap { - it.listFiles()?.asList().orEmpty() + .flatMap { kotlinFolder -> + kotlinFolder.findMarkdownRecursively().map { child -> + TestCase(child.absoluteFile, child.relativeTo(kotlinFolder)) + } } - .filter { it.isDirectory } - .distinctBy { it.name } check(testCases.isNotEmpty()) { "No test cases were found" } return testCases } + +data class TestCase( + val absolute: File, + val relative: File, +) + +private fun File.findMarkdownRecursively(): List { + if (!isDirectory) + return emptyList() + + val files = listFiles() + ?: return emptyList() + + return files.filter { it.isFile && it.extension == "md" } + + files.filter { it.isDirectory }.flatMap { it.findMarkdownRecursively() } +} + +fun File.root(): File = + parentFile?.root() ?: this + +fun File.replaceRoot(by: File): File = + if (parentFile == null) by + else parentFile!!.replaceRoot(by) / this.name diff --git a/test-runner/src/jvmTest/kotlin/Runner.kt b/test-runner/src/jvmTest/kotlin/Runner.kt index 54b0a70..99b083a 100644 --- a/test-runner/src/jvmTest/kotlin/Runner.kt +++ b/test-runner/src/jvmTest/kotlin/Runner.kt @@ -3,6 +3,7 @@ package opensavvy.dokka.material.mkdocs.test import opensavvy.prepared.compat.filesystem.div import opensavvy.prepared.runner.testballoon.preparedSuite import opensavvy.prepared.suite.config.CoroutineTimeout +import java.io.File import kotlin.test.assertEquals import kotlin.time.Duration.Companion.minutes @@ -22,28 +23,31 @@ val IntegrationTests by preparedSuite { } for (case in cases) { - test("Test case: ${case.name}") { - check(case.isDirectory) + test("Test case: ${case.relative}") { + val generated = generateDocs() - val outputDirectory = generateDocs() / "test-data" / "opensavvy.dokka.material.mkdocs.test.${case.name}" - check(outputDirectory.isDirectory) { "No output directory was generated for test case" } - println("» Generated in: ${outputDirectory.absolutePath}") + val packageCase = "opensavvy.dokka.material.mkdocs.test.${case.relative.root().name}" + println("» Package: $packageCase") + + val generatedRelativePath = case.relative.replaceRoot(File(packageCase)) + println("» Relative: ${case.relative}") + println(" $generatedRelativePath") - val markdownFiles = case.listFiles { _, name -> name.endsWith(".md") } + val outputDirectory = generated / "test-data" + check(outputDirectory.isDirectory) { "No output directory was generated for test case" } + val actualFile = outputDirectory.resolve(case.relative.replaceRoot(File(packageCase))) - for (file in markdownFiles) { - println("» Checking: ${file.name}") + println("» Output: file://${outputDirectory.absolutePath}") + println("» Expected: file://${case.absolute}") + println("» Generated: file://${actualFile.absolutePath}") - val expected = file.readText() - val actualFile = outputDirectory / file.name - val actual = actualFile.readText() + val expected = case.absolute.readText() + val actual = actualFile.readText() - assertEquals( - expected = expected, - actual = actual, - message = "Found a difference between the reference file file://${file.absolutePath} and the generated file file://${actualFile.absolutePath}" - ) - } + assertEquals( + expected = expected, + actual = actual, + ) } } } -- 2.51.2