Skip to content

Commit 266725f

Browse files
authored
Merge pull request #10554 from lampepfl/diagram-tests
Hirarchy diagram tests for scala3doc
2 parents c042be9 + 9b7f7ab commit 266725f

File tree

3 files changed

+146
-0
lines changed

3 files changed

+146
-0
lines changed
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package tests
2+
3+
package hierarchy
4+
5+
trait A1
6+
trait A2[T]
7+
trait A3[A, B]
8+
9+
10+
trait B1 extends A1
11+
trait B2 extends A1 with A2[Int]
12+
trait B3 extends A2[Int] with A3[Int, String]
13+
14+
class C1[A, B, C] extends B1 with B2 with B3
15+
16+
trait D1
17+
trait D2[T, R]
18+
trait D3
19+
20+
class E1 extends C1[Int, String, Boolean] with D1
21+
class E2 extends C1[Int, Boolean, Any] with D2[Int, Boolean] with D3
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package dotty.dokka.model.api
2+
3+
import org.jetbrains.dokka.model.DModule
4+
import scala.jdk.CollectionConverters.{ListHasAsScala, SeqHasAsJava}
5+
import dotty.dokka.model.api._
6+
7+
extension (m: DModule)
8+
def visitMembers(callback: Member => Unit): Unit =
9+
def visitClasslike(c: Member): Unit =
10+
callback(c)
11+
c.allMembers.foreach(visitClasslike(_))
12+
m.getPackages.asScala.foreach(_.allMembers.foreach(visitClasslike(_)))
13+
14+
extension (s: Signature)
15+
def getName: String =
16+
s.map {
17+
case s: String => s
18+
case l: Link => l.name
19+
}.mkString
20+
21+
extension (m: Member):
22+
def getDirectParentsAsStrings: Seq[String] =
23+
m.directParents.map(_.getName).sorted
24+
def getParentsAsStrings: Seq[String] =
25+
m.parents.map(_.signature.getName).sorted
26+
def getKnownChildrenAsStrings: Seq[String] =
27+
m.knownChildren.map(_.signature.getName).sorted
Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
package dotty.dokka.diagram
2+
3+
import dotty.dokka.ScaladocTest
4+
import dotty.dokka.Assertion.AfterDocumentablesTransformation
5+
import dotty.dokka.kUnit
6+
import dotty.dokka.model.api._
7+
import scala.jdk.CollectionConverters.{ListHasAsScala, SeqHasAsJava}
8+
import org.junit.Assert.{assertSame, assertTrue, assertEquals}
9+
10+
class HierarchyTest extends ScaladocTest("hierarchy"):
11+
override def assertions = Seq(
12+
AfterDocumentablesTransformation { m =>
13+
m.visitMembers { x =>
14+
if (x.getName == "C1") {
15+
assertEquals(List("A1", "A2[Int]", "A3[Int, String]", "Any", "B1", "B2", "B3", "Object"), x.getParentsAsStrings)
16+
assertEquals(List("B1", "B2", "B3"), x.getDirectParentsAsStrings)
17+
assertEquals(List("E1", "E2"), x.getKnownChildrenAsStrings)
18+
val graph = MemberExtension.getFrom(x).map(_.graph)
19+
assertTrue("Graph is empty!", graph.isDefined)
20+
assertEquals(
21+
Set(
22+
"Object" -> "Any",
23+
"A1" -> "Object",
24+
"A2[Int]" -> "Object",
25+
"A3[Int, String]" -> "Object",
26+
"B1" -> "Object",
27+
"B1" -> "A1",
28+
"B2" -> "Object",
29+
"B2" -> "A1",
30+
"B2" -> "A2[Int]",
31+
"B3" -> "Object",
32+
"B3" -> "A2[Int]",
33+
"B3" -> "A3[Int, String]",
34+
"C1[A, B, C]" -> "Object",
35+
"C1[A, B, C]" -> "B1",
36+
"C1[A, B, C]" -> "B2",
37+
"C1[A, B, C]" -> "B3",
38+
"E1" -> "C1[A, B, C]",
39+
"E2" -> "C1[A, B, C]"
40+
),
41+
graph.get.edges.map((a, b) => (a.signature.getName, b.signature.getName)).toSet
42+
)
43+
}
44+
if (x.getName == "E2") {
45+
assertEquals(List("A1", "A2[Int]", "A3[Int, String]", "Any", "B1", "B2", "B3", "C1[Int, Boolean, Any]", "D2[Int, Boolean]", "D3", "Object"), x.getParentsAsStrings)
46+
assertEquals(List("C1[Int, Boolean, Any]", "D2[Int, Boolean]", "D3"), x.getDirectParentsAsStrings)
47+
assertEquals(List.empty, x.getKnownChildrenAsStrings)
48+
val graph = MemberExtension.getFrom(x).map(_.graph)
49+
assertTrue("Graph is empty!", graph.isDefined)
50+
assertEquals(
51+
Set(
52+
"Object" -> "Any",
53+
// "A1" -> "Object", // These are not applicable beacuase of bug and its workaround
54+
// "A2[Int]" -> "Object", // More info at ClassLikeSupport.scala:37
55+
// "A3[Int, String]" -> "Object",
56+
// "B1" -> "Object",
57+
// "B1" -> "A1",
58+
// "B2" -> "Object",
59+
// "B2" -> "A1",
60+
// "B2" -> "A2[Int]",
61+
// "B3" -> "Object",
62+
// "B3" -> "A2[Int]",
63+
// "B3" -> "A3[Int, String]",
64+
// "C1[Int, Boolean, Any]" -> "Object",
65+
// "C1[Int, Boolean, Any]" -> "B1",
66+
// "C1[Int, Boolean, Any]" -> "B2",
67+
// "C1[Int, Boolean, Any]" -> "B3",
68+
"E2" -> "D2[Int, Boolean]",
69+
"E2" -> "D3",
70+
"D2[Int, Boolean]" -> "Object",
71+
"D3" -> "Object",
72+
"E2" -> "C1[Int, Boolean, Any]"
73+
),
74+
graph.get.edges.map((a, b) => (a.signature.getName, b.signature.getName)).toSet
75+
)
76+
}
77+
if (x.getName == "A2") {
78+
assertEquals(List("Any", "Object"), x.getParentsAsStrings)
79+
assertEquals(List.empty, x.getDirectParentsAsStrings)
80+
assertEquals(List("B2", "B3", "C1[A, B, C]", "E1", "E2"), x.getKnownChildrenAsStrings)
81+
val graph = MemberExtension.getFrom(x).map(_.graph)
82+
assertTrue("Graph is empty!", graph.isDefined)
83+
assertEquals(
84+
Set(
85+
"Object" -> "Any",
86+
"A2[T]" -> "Object",
87+
"B2" -> "A2[T]", // These are not actually true, becuase we lose information about hierarchy in subtypes and their possible mapping to supertypes other that that type itself, e. g. linking to `Object`
88+
"B3" -> "A2[T]",
89+
"C1[A, B, C]" -> "A2[T]",
90+
"E1" -> "A2[T]",
91+
"E2" -> "A2[T]"
92+
),
93+
graph.get.edges.map((a, b) => (a.signature.getName, b.signature.getName)).toSet
94+
)
95+
}
96+
}
97+
}
98+
)

0 commit comments

Comments
 (0)