1
- /** Adapted from https://github.com/sbt/sbt/blob/0.13/compile/interface/src/test/scala/xsbt/DependencySpecification.scala */
2
1
package xsbt
3
2
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
-
11
3
import xsbti .TestCallback .ExtractedClassDependencies
12
4
13
- @ RunWith (classOf [JUnitRunner ])
14
- class DependencySpecification extends Specification {
5
+ import org .junit .Test
6
+ import org .junit .Assert ._
7
+
8
+ class DependencySpecification {
15
9
16
- " Extracted source dependencies from public members" in {
10
+ @ Test
11
+ def extractedClassDependenciesFromPublicMembers = {
17
12
val classDependencies = extractClassDependenciesPublic
18
13
val memberRef = classDependencies.memberRef
19
14
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" ) )
33
28
// 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" ) )
35
30
}
36
31
37
- " Extracted source dependencies from private members" in {
38
- val classDependencies = extractClassDependenciesPrivate
32
+ @ Test
33
+ def extractedClassDependenciesFromLocalMembers = {
34
+ val classDependencies = extractClassDependenciesLocal
39
35
val memberRef = classDependencies.memberRef
40
36
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" ))
49
50
}
50
51
51
- " Extracted source dependencies with trait as first parent" in {
52
+ @ Test
53
+ def extractedClassDependenciesWithTraitAsFirstParent = {
52
54
val classDependencies = extractClassDependenciesTraitAsFirstPatent
53
55
val memberRef = classDependencies.memberRef
54
56
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" ) )
59
61
// verify that memberRef captures the oddity described in documentation of `Relations.inheritance`
60
62
// we are mainly interested whether dependency on A is captured in `memberRef` relation so
61
63
// 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" ) )
64
66
// 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" ) )
67
69
}
68
70
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
+
72
81
val memberRef = classDependencies.memberRef
73
82
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)
74
100
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" ))
81
146
}
82
- */
83
147
84
148
private def extractClassDependenciesPublic : ExtractedClassDependencies = {
85
149
val srcA = " class A"
86
150
val srcB = " class B extends D[A]"
87
151
val srcC = """ |class C {
88
- | def a: A = null
89
- |}""" .stripMargin
152
+ | def a: A = null
153
+ |}""" .stripMargin
90
154
val srcD = " class D[T]"
91
155
val srcE = " trait E[T]"
92
156
val srcF = " trait F extends A with E[D[B]] { self: G.MyC => }"
@@ -97,20 +161,21 @@ class DependencySpecification extends Specification {
97
161
val srcH = " trait H extends G.T[Int] with (E[Int] @unchecked)"
98
162
99
163
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)
102
166
classDependencies
103
167
}
104
168
105
- private def extractClassDependenciesPrivate : ExtractedClassDependencies = {
169
+ private def extractClassDependenciesLocal : ExtractedClassDependencies = {
106
170
val srcA = " class A"
107
171
val srcB = " class B"
108
172
val srcC = " class C { private class Inner1 extends A }"
109
173
val srcD = " class D { def foo: Unit = { class Inner2 extends B } }"
174
+ val srcE = " class E { def foo: Unit = { new B {} } }"
110
175
111
176
val compilerForTesting = new ScalaCompilerForUnitTesting
112
177
val classDependencies =
113
- compilerForTesting.extractDependenciesFromSrcs(srcA, srcB, srcC, srcD)
178
+ compilerForTesting.extractDependenciesFromSrcs(srcA, srcB, srcC, srcD, srcE )
114
179
classDependencies
115
180
}
116
181
@@ -125,27 +190,4 @@ class DependencySpecification extends Specification {
125
190
compilerForTesting.extractDependenciesFromSrcs(srcA, srcB, srcC, srcD)
126
191
classDependencies
127
192
}
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