|
| 1 | +package dotty.dokka |
| 2 | + |
| 3 | +import org.jetbrains.dokka.plugability.DokkaContext |
| 4 | +import org.jetbrains.dokka.model.{DModule, WithChildren} |
| 5 | +import org.jetbrains.dokka.pages.RootPageNode |
| 6 | +import org.jetbrains.dokka.testApi.testRunner.{DokkaTestGenerator, TestMethods} |
| 7 | +import org.jetbrains.dokka.testApi.logger.TestLogger |
| 8 | +import org.jetbrains.dokka.utilities.DokkaConsoleLogger |
| 9 | +import org.jetbrains.dokka.DokkaConfiguration |
| 10 | +import scala.jdk.CollectionConverters.{ListHasAsScala, SeqHasAsJava} |
| 11 | +import org.junit.{Test, Rule} |
| 12 | +import org.junit.rules.{TemporaryFolder, ErrorCollector} |
| 13 | +import java.io.File |
| 14 | + |
| 15 | +abstract class ScaladocTest(val name: String): |
| 16 | + def assertions: Seq[Assertion] |
| 17 | + |
| 18 | + private def getTempDir() : TemporaryFolder = |
| 19 | + val folder = new TemporaryFolder() |
| 20 | + folder.create() |
| 21 | + folder |
| 22 | + |
| 23 | + private def args = Args( |
| 24 | + name = "test", |
| 25 | + tastyRoots = Nil , |
| 26 | + classpath = System.getProperty("java.class.path"), |
| 27 | + None, |
| 28 | + output = getTempDir().getRoot, |
| 29 | + projectVersion = "1.0", |
| 30 | + projectTitle = None, |
| 31 | + projectLogo = None, |
| 32 | + defaultSyntax = None, |
| 33 | + sourceLinks = Nil |
| 34 | + ) |
| 35 | + |
| 36 | + private def tastyFiles = |
| 37 | + def listFilesSafe(dir: File) = Option(dir.listFiles).getOrElse { |
| 38 | + throw AssertionError(s"$dir not found. The test name is incorrect or scala3doc-testcases were not recompiled.") |
| 39 | + } |
| 40 | + def collectFiles(dir: File): List[String] = listFilesSafe(dir).toList.flatMap { |
| 41 | + case f if f.isDirectory => collectFiles(f) |
| 42 | + case f if f.getName endsWith ".tasty" => f.getAbsolutePath :: Nil |
| 43 | + case _ => Nil |
| 44 | + } |
| 45 | + collectFiles(File(s"${BuildInfo.test_testcasesOutputDir}/tests/$name")) |
| 46 | + |
| 47 | + @Rule |
| 48 | + def collector = _collector |
| 49 | + private val _collector = new ErrorCollector(); |
| 50 | + def reportError(msg: String) = collector.addError(new AssertionError(msg)) |
| 51 | + |
| 52 | + @Test |
| 53 | + def executeTest = |
| 54 | + DokkaTestGenerator( |
| 55 | + DottyDokkaConfig(DocConfiguration.Standalone(args, tastyFiles, Nil)), |
| 56 | + TestLogger(DokkaConsoleLogger.INSTANCE), |
| 57 | + assertions.asTestMethods, |
| 58 | + Nil.asJava |
| 59 | + ).generate() |
| 60 | + |
| 61 | +end ScaladocTest |
| 62 | + |
| 63 | +type Validator = () => Unit |
| 64 | + |
| 65 | +/** |
| 66 | + * Those assertions map 1-1 to their dokka counterparts. Some of them may be irrelevant in scala3doc. |
| 67 | + */ |
| 68 | +enum Assertion: |
| 69 | + case AfterPluginSetup(fn: DokkaContext => Unit) |
| 70 | + case DuringValidation(fn: Validator => Unit) |
| 71 | + case AfterDocumentablesCreation(fn: Seq[DModule] => Unit) |
| 72 | + case AfterPreMergeDocumentablesTransformation(fn: Seq[DModule] => Unit) |
| 73 | + case AfterDocumentablesMerge(fn: DModule => Unit) |
| 74 | + case AfterDocumentablesTransformation(fn: DModule => Unit) |
| 75 | + case AfterPagesGeneration(fn: RootPageNode => Unit) |
| 76 | + case AfterPagesTransformation(fn: RootPageNode => Unit) |
| 77 | + case AfterRendering(fn: (RootPageNode, DokkaContext) => Unit) |
| 78 | + |
| 79 | +extension (s: Seq[Assertion]): |
| 80 | + def asTestMethods: TestMethods = |
| 81 | + import Assertion._ |
| 82 | + TestMethods( |
| 83 | + (context => s.collect { case AfterPluginSetup(fn) => fn(context) }.kUnit), |
| 84 | + (validator => s.collect { case DuringValidation(fn) => fn(() => validator.invoke()) }.kUnit), |
| 85 | + (modules => s.collect { case AfterDocumentablesCreation(fn) => fn(modules.asScala.toSeq) }.kUnit), |
| 86 | + (modules => s.collect { case AfterPreMergeDocumentablesTransformation(fn) => fn(modules.asScala.toSeq) }.kUnit), |
| 87 | + (module => s.collect { case AfterDocumentablesMerge(fn) => fn(module)}.kUnit), |
| 88 | + (module => s.collect { case AfterDocumentablesTransformation(fn) => fn(module) }.kUnit), |
| 89 | + (root => s.collect { case AfterPagesGeneration(fn) => fn(root) }.kUnit), |
| 90 | + (root => s.collect { case AfterPagesTransformation(fn) => fn(root) }.kUnit), |
| 91 | + ((root, context) => s.collect { case AfterRendering(fn) => fn(root, context)}.kUnit) |
| 92 | + ) |
| 93 | + |
| 94 | +extension [T] (s: T): |
| 95 | + private def kUnit = kotlin.Unit.INSTANCE |
0 commit comments