Skip to content

Commit 6d339d0

Browse files
committed
Port Unit test from latest Zinc
1 parent 950735d commit 6d339d0

File tree

3 files changed

+543
-272
lines changed

3 files changed

+543
-272
lines changed
Lines changed: 126 additions & 84 deletions
Original file line numberDiff line numberDiff line change
@@ -1,92 +1,156 @@
1-
/** Adapted from https://github.com/sbt/sbt/blob/0.13/compile/interface/src/test/scala/xsbt/DependencySpecification.scala */
21
package xsbt
32

4-
import org.junit.runner.RunWith
5-
import xsbti.api.ClassLike
6-
import xsbti.api.Def
7-
import xsbt.api.SameAPI
8-
import org.specs2.mutable.Specification
9-
import org.specs2.runner.JUnitRunner
10-
113
import xsbti.TestCallback.ExtractedClassDependencies
124

13-
@RunWith(classOf[JUnitRunner])
14-
class DependencySpecification extends Specification {
5+
import org.junit.Test
6+
import org.junit.Assert._
7+
8+
class DependencySpecification {
159

16-
"Extracted source dependencies from public members" in {
10+
@Test
11+
def extractedClassDependenciesFromPublicMembers = {
1712
val classDependencies = extractClassDependenciesPublic
1813
val memberRef = classDependencies.memberRef
1914
val inheritance = classDependencies.inheritance
20-
memberRef("A") === Set.empty
21-
inheritance("A") === Set.empty
22-
memberRef("B") === Set("A", "D")
23-
inheritance("B") === Set("D")
24-
memberRef("C") === Set("A")
25-
inheritance("C") === Set.empty
26-
memberRef("D") === Set.empty
27-
inheritance("D") === Set.empty
28-
memberRef("E") === Set.empty
29-
inheritance("E") === Set.empty
30-
memberRef("F") === Set("A", "B", "C", "D", "E", "G")
31-
inheritance("F") === Set("A", "E")
32-
memberRef("H") === Set("B", "E", "G")
15+
assertEquals(memberRef("A"), Set.empty)
16+
assertEquals(inheritance("A"), Set.empty)
17+
assertEquals(memberRef("B"), Set("A", "D"))
18+
assertEquals(inheritance("B"), Set("D"))
19+
assertEquals(memberRef("C"), Set("A"))
20+
assertEquals(inheritance("C"), Set.empty)
21+
assertEquals(memberRef("D"), Set.empty)
22+
assertEquals(inheritance("D"), Set.empty)
23+
assertEquals(memberRef("E"), Set.empty)
24+
assertEquals(inheritance("E"), Set.empty)
25+
assertEquals(memberRef("F"), Set("A", "B", "D", "E", "G", "C")) // C is the underlying type of MyC
26+
assertEquals(inheritance("F"), Set("A", "E"))
27+
assertEquals(memberRef("H"), Set("B", "E", "G"))
3328
// aliases and applied type constructors are expanded so we have inheritance dependency on B
34-
inheritance("H") === Set("B", "E")
29+
assertEquals(inheritance("H"), Set("B", "E"))
3530
}
3631

37-
"Extracted source dependencies from private members" in {
38-
val classDependencies = extractClassDependenciesPrivate
32+
@Test
33+
def extractedClassDependenciesFromLocalMembers = {
34+
val classDependencies = extractClassDependenciesLocal
3935
val memberRef = classDependencies.memberRef
4036
val inheritance = classDependencies.inheritance
41-
memberRef("A") === Set.empty
42-
inheritance("A") === Set.empty
43-
memberRef("B") === Set.empty
44-
inheritance("B") === Set.empty
45-
memberRef("C.Inner1") === Set("A")
46-
inheritance("C.Inner1") === Set("A")
47-
memberRef("D._$Inner2") === Set("B")
48-
inheritance("D._$Inner2") === Set("B")
37+
val localInheritance = classDependencies.localInheritance
38+
assertEquals(memberRef("A"), Set.empty)
39+
assertEquals(inheritance("A"), Set.empty)
40+
assertEquals(memberRef("B"), Set.empty)
41+
assertEquals(inheritance("B"), Set.empty)
42+
assertEquals(memberRef("C.Inner1"), Set("A"))
43+
assertEquals(inheritance("C.Inner1"), Set("A"))
44+
assertEquals(memberRef("D"), Set("B"))
45+
assertEquals(inheritance("D"), Set.empty)
46+
assertEquals(localInheritance("D"), Set("B"))
47+
assertEquals(memberRef("E"), Set("B"))
48+
assertEquals(inheritance("E"), Set.empty)
49+
assertEquals(localInheritance("E"), Set("B"))
4950
}
5051

51-
"Extracted source dependencies with trait as first parent" in {
52+
@Test
53+
def extractedClassDependenciesWithTraitAsFirstParent = {
5254
val classDependencies = extractClassDependenciesTraitAsFirstPatent
5355
val memberRef = classDependencies.memberRef
5456
val inheritance = classDependencies.inheritance
55-
memberRef("A") === Set.empty
56-
inheritance("A") === Set.empty
57-
memberRef("B") === Set("A")
58-
inheritance("B") === Set("A")
57+
assertEquals(memberRef("A"), Set.empty)
58+
assertEquals(inheritance("A"), Set.empty)
59+
assertEquals(memberRef("B"), Set("A"))
60+
assertEquals(inheritance("B"), Set("A"))
5961
// verify that memberRef captures the oddity described in documentation of `Relations.inheritance`
6062
// we are mainly interested whether dependency on A is captured in `memberRef` relation so
6163
// the invariant that says that memberRef is superset of inheritance relation is preserved
62-
memberRef("C") === Set("A", "B")
63-
inheritance("C") === Set("A", "B")
64+
assertEquals(memberRef("C"), Set("A", "B"))
65+
assertEquals(inheritance("C"), Set("A", "B"))
6466
// same as above but indirect (C -> B -> A), note that only A is visible here
65-
memberRef("D") === Set("A", "C")
66-
inheritance("D") === Set("A", "C")
67+
assertEquals(memberRef("D"), Set("A", "C"))
68+
assertEquals(inheritance("D"), Set("A", "C"))
6769
}
6870

69-
/*
70-
"Extracted source dependencies from macro arguments" in {
71-
val classDependencies = extractClassDependenciesFromMacroArgument
71+
@Test
72+
def extractedClassDependenciesFromARefinement = {
73+
val srcFoo =
74+
"object Outer {\n class Inner { type Xyz }\n\n type TypeInner = Inner { type Xyz = Int }\n}"
75+
val srcBar = "object Bar {\n def bar: Outer.TypeInner = null\n}"
76+
77+
val compilerForTesting = new ScalaCompilerForUnitTesting
78+
val classDependencies =
79+
compilerForTesting.extractDependenciesFromSrcs(srcFoo, srcBar)
80+
7281
val memberRef = classDependencies.memberRef
7382
val inheritance = classDependencies.inheritance
83+
assertEquals(memberRef("Outer"), Set.empty)
84+
assertEquals(inheritance("Outer"), Set.empty)
85+
assertEquals(memberRef("Bar"), Set("Outer", "Outer$.Inner"))
86+
assertEquals(inheritance("Bar"), Set.empty)
87+
}
88+
89+
@Test
90+
def extractedClassDependenciesOnAnObjectCorrectly = {
91+
val srcA =
92+
"""object A {
93+
| def foo = { B; () }
94+
|}""".stripMargin
95+
val srcB = "object B"
96+
97+
val compilerForTesting = new ScalaCompilerForUnitTesting
98+
val classDependencies =
99+
compilerForTesting.extractDependenciesFromSrcs(srcA, srcB)
74100

75-
memberRef("A") === Set("B", "C")
76-
inheritance("A") === Set.empty
77-
memberRef("B") === Set.empty
78-
inheritance("B") === Set.empty
79-
memberRef("C") === Set.empty
80-
inheritance("C") === Set.empty
101+
val memberRef = classDependencies.memberRef
102+
val inheritance = classDependencies.inheritance
103+
assertEquals(memberRef("A"), Set("B"))
104+
assertEquals(inheritance("A"), Set.empty)
105+
assertEquals(memberRef("B"), Set.empty)
106+
assertEquals(inheritance("B"), Set.empty)
107+
}
108+
109+
@Test
110+
def extractedTopLevelImportDependencies = {
111+
val srcA =
112+
"""
113+
|package abc
114+
|object A {
115+
| class Inner
116+
|}
117+
|class A2""".stripMargin
118+
val srcB = "import abc.A; import abc.A.Inner; class B"
119+
val srcC = "import abc.{A, A2}; class C"
120+
val srcD = "import abc.{A2 => Foo}; class D"
121+
val srcE = "import abc.A._; class E"
122+
val srcF = "import abc._; class F"
123+
val srcG =
124+
"""|package foo {
125+
| package bar {
126+
| import abc.A
127+
| class G
128+
| }
129+
|}
130+
""".stripMargin
131+
val srcH = "class H { import abc.A }"
132+
133+
val compilerForTesting = new ScalaCompilerForUnitTesting
134+
val deps = compilerForTesting
135+
.extractDependenciesFromSrcs(srcA, srcB, srcC, srcD, srcE, srcF, srcG, srcH)
136+
.memberRef
137+
138+
assertEquals(deps("A"), Set.empty)
139+
assertEquals(deps("B"), Set("abc.A", "abc.A$.Inner"))
140+
assertEquals(deps("C"), Set("abc.A", "abc.A2"))
141+
assertEquals(deps("D"), Set("abc.A2"))
142+
assertEquals(deps("E"), Set("abc.A"))
143+
assertEquals(deps("F"), Set.empty)
144+
assertEquals(deps("foo.bar.G"), Set("abc.A"))
145+
assertEquals(deps("H"), Set("abc.A"))
81146
}
82-
*/
83147

84148
private def extractClassDependenciesPublic: ExtractedClassDependencies = {
85149
val srcA = "class A"
86150
val srcB = "class B extends D[A]"
87151
val srcC = """|class C {
88-
| def a: A = null
89-
|}""".stripMargin
152+
| def a: A = null
153+
|}""".stripMargin
90154
val srcD = "class D[T]"
91155
val srcE = "trait E[T]"
92156
val srcF = "trait F extends A with E[D[B]] { self: G.MyC => }"
@@ -97,20 +161,21 @@ class DependencySpecification extends Specification {
97161
val srcH = "trait H extends G.T[Int] with (E[Int] @unchecked)"
98162

99163
val compilerForTesting = new ScalaCompilerForUnitTesting
100-
val classDependencies = compilerForTesting.extractDependenciesFromSrcs(srcA, srcB, srcC,
101-
srcD, srcE, srcF, srcG, srcH)
164+
val classDependencies =
165+
compilerForTesting.extractDependenciesFromSrcs(srcA, srcB, srcC, srcD, srcE, srcF, srcG, srcH)
102166
classDependencies
103167
}
104168

105-
private def extractClassDependenciesPrivate: ExtractedClassDependencies = {
169+
private def extractClassDependenciesLocal: ExtractedClassDependencies = {
106170
val srcA = "class A"
107171
val srcB = "class B"
108172
val srcC = "class C { private class Inner1 extends A }"
109173
val srcD = "class D { def foo: Unit = { class Inner2 extends B } }"
174+
val srcE = "class E { def foo: Unit = { new B {} } }"
110175

111176
val compilerForTesting = new ScalaCompilerForUnitTesting
112177
val classDependencies =
113-
compilerForTesting.extractDependenciesFromSrcs(srcA, srcB, srcC, srcD)
178+
compilerForTesting.extractDependenciesFromSrcs(srcA, srcB, srcC, srcD, srcE)
114179
classDependencies
115180
}
116181

@@ -125,27 +190,4 @@ class DependencySpecification extends Specification {
125190
compilerForTesting.extractDependenciesFromSrcs(srcA, srcB, srcC, srcD)
126191
classDependencies
127192
}
128-
129-
/*
130-
private def extractClassDependenciesFromMacroArgument: ExtractedClassDependencies = {
131-
val srcA = "class A { println(B.printTree(C.foo)) }"
132-
val srcB = """
133-
|import scala.language.experimental.macros
134-
|import scala.reflect.macros._
135-
|object B {
136-
| def printTree(arg: Any) = macro printTreeImpl
137-
| def printTreeImpl(c: Context)(arg: c.Expr[Any]): c.Expr[String] = {
138-
| val argStr = arg.tree.toString
139-
| val literalStr = c.universe.Literal(c.universe.Constant(argStr))
140-
| c.Expr[String](literalStr)
141-
| }
142-
|}""".stripMargin
143-
val srcC = "object C { val foo = 1 }"
144-
145-
val compilerForTesting = new ScalaCompilerForUnitTesting(nameHashing = true)
146-
val classDependencies =
147-
compilerForTesting.extractDependenciesFromSrcs(List(Map('B -> srcB, 'C -> srcC), Map('A -> srcA)))
148-
classDependencies
149-
}
150-
*/
151-
}
193+
}

0 commit comments

Comments
 (0)