tests: add test case for framework field in scala test classes request

This commit is contained in:
Kamil Podsiadlo 2022-03-10 19:56:49 +01:00
parent 1396e1605d
commit ce978a19ed
3 changed files with 23 additions and 21 deletions

View File

@ -39,6 +39,7 @@ import scala.collection.mutable
import scala.util.control.NonFatal
import scala.util.{ Failure, Success, Try }
import scala.annotation.nowarn
import sbt.testing.Framework
object BuildServerProtocol {
import sbt.internal.bsp.codec.JsonProtocol._
@ -844,25 +845,20 @@ object BuildServerProtocol {
Keys.definedTests.?.value match {
case None => Vector.empty
case Some(definitions) =>
val fingerprints = Keys.loadedTestFrameworks.?.value
.getOrElse(Map.empty)
.values
.flatMap { framework =>
framework.fingerprints().map(fingerprint => (fingerprint, framework))
}
.toMap
val frameworks: Seq[Framework] = Keys.loadedTestFrameworks.?.value
.map(_.values.toSeq)
.getOrElse(Seq.empty)
definitions
.groupBy(defn => fingerprints.get(defn.fingerprint))
.map {
case (framework, definitions) =>
ScalaTestClassesItem(
bspTargetIdentifier.value,
definitions.map(_.name).toVector,
framework.map(_.name())
)
}
.toSeq
val grouped = TestFramework.testMap(frameworks, definitions)
grouped.map {
case (framework, definitions) =>
ScalaTestClassesItem(
bspTargetIdentifier.value,
definitions.map(_.name).toVector,
framework.name()
)
}.toSeq
}
}

View File

@ -308,7 +308,8 @@ object BuildServerTest extends AbstractServerTest {
assert(svr.waitForString(10.seconds) { s =>
(s contains """"id":"72"""") &&
(s contains """"tests.FailingTest"""") &&
(s contains """"tests.PassingTest"""")
(s contains """"tests.PassingTest"""") &&
(s contains """"framework":"ScalaTest"""")
})
}

View File

@ -231,21 +231,26 @@ object TestFramework {
): Vector[(String, TestFunction)] =
for (d <- inputs; act <- mapped.get(d.name)) yield (d.name, act)
private[this] def testMap(
def testMap(
frameworks: Seq[Framework],
tests: Seq[TestDefinition]
): Map[Framework, Set[TestDefinition]] = {
import scala.collection.mutable.{ HashMap, HashSet, Set }
val map = new HashMap[Framework, Set[TestDefinition]]
def assignTest(test: TestDefinition): Unit = {
def isTestForFramework(framework: Framework) = getFingerprints(framework).exists { t =>
matches(t, test.fingerprint)
}
for (framework <- frameworks.find(isTestForFramework))
frameworks.find(isTestForFramework).foreach { framework =>
map.getOrElseUpdate(framework, new HashSet[TestDefinition]) += test
}
}
if (frameworks.nonEmpty)
for (test <- tests) assignTest(test)
map.toMap.mapValues(_.toSet).toMap
}