diff options
Diffstat (limited to 'examples/scala-js/test-suite/src/test/scala/scala/scalajs/testsuite/utils/TestDetector.scala')
-rw-r--r-- | examples/scala-js/test-suite/src/test/scala/scala/scalajs/testsuite/utils/TestDetector.scala | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/examples/scala-js/test-suite/src/test/scala/scala/scalajs/testsuite/utils/TestDetector.scala b/examples/scala-js/test-suite/src/test/scala/scala/scalajs/testsuite/utils/TestDetector.scala new file mode 100644 index 0000000..ad67a95 --- /dev/null +++ b/examples/scala-js/test-suite/src/test/scala/scala/scalajs/testsuite/utils/TestDetector.scala @@ -0,0 +1,33 @@ +package scala.scalajs.testsuite.utils + +import scala.scalajs.js +import js.annotation.JSExport +import js.JSConverters._ + +/** An ad-hoc but centralized way to detect tests in this test suite */ +@JSExport("scalajs.TestDetector") +object TestDetector { + + private final val basePackage = "scala.scalajs.testsuite" + + def detectTestNames(): List[String] = detectTestsInternal().map(_._2).toList + + @JSExport + def loadDetectedTests(): Unit = detectTestsInternal().foreach(_._1()) + + private def detectTestsInternal() = { + val parts = basePackage.split('.') + val base = parts.foldLeft(js.Dynamic.global)(_.selectDynamic(_)) + + // We make sure to use only exported modules (not classes) by checking + // .prototype of the exporters. + for { + pName <- js.Object.properties(base) + testName <- js.Object.properties(base.selectDynamic(pName)) + test = base.selectDynamic(pName).selectDynamic(testName) + if js.Object.getPrototypeOf(test.prototype.asInstanceOf[js.Object]) eq + js.Object.asInstanceOf[js.Dynamic].prototype + } yield (test, s"$basePackage.$pName.$testName") + } + +} |