@@ -3,6 +3,16 @@ package org.bblfsh.client.v2.libuast
3
3
import org .bblfsh .client .v2 .{BblfshClient , JArray , JInt , JNode , JObject , JString }
4
4
// TODO import org.bblfsh.client.v2.nodes._
5
5
import org .scalatest .{BeforeAndAfter , BeforeAndAfterAll , FlatSpec , Matchers }
6
+ import org .scalatest .prop .TableDrivenPropertyChecks ._
7
+ import BblfshClient .{
8
+ TreeOrder ,
9
+ PreOrder ,
10
+ PostOrder ,
11
+ ChildrenOrder ,
12
+ PositionOrder ,
13
+ AnyOrder ,
14
+ LevelOrder
15
+ }
6
16
7
17
class IteratorManagedTest extends FlatSpec
8
18
with Matchers
@@ -23,7 +33,7 @@ class IteratorManagedTest extends FlatSpec
23
33
}
24
34
25
35
" Managed UAST iterator" should " return non-empty results on JVM objects" in {
26
- iter = BblfshClient .iterator(mangedRootNode, BblfshClient . PreOrder )
36
+ iter = BblfshClient .iterator(mangedRootNode, PreOrder )
27
37
iter.hasNext() should be(true )
28
38
29
39
val nodes = iter.toList
@@ -36,7 +46,7 @@ class IteratorManagedTest extends FlatSpec
36
46
}
37
47
38
48
" Managed UAST iterator" should " go though all nodes of small object" in {
39
- iter = BblfshClient .iterator(mangedRootNode, BblfshClient . PreOrder )
49
+ iter = BblfshClient .iterator(mangedRootNode, PreOrder )
40
50
val nodes = iter.toList
41
51
42
52
nodes.size should be(3 ) // number of composite nodes
@@ -107,30 +117,67 @@ class IteratorManagedTest extends FlatSpec
107
117
.map(_ (" @type" ).asInstanceOf [JString ].str)
108
118
.toList
109
119
110
- // Equivalent of the test.py#testIteratorPreOrder
111
- // https://github.com/bblfsh/python-client/blob/15ffb98bfa09e6aae4d1580f0e4f02eb2a530205/bblfsh/test.py#L270
112
- " Managed UAST iterator" should " return nodes in PreOrder" in {
113
- val preIter = BblfshClient .iterator(testTree, BblfshClient .PreOrder )
114
- val nodes = getNodeTypes(preIter)
115
-
116
- val poActual = Seq (" root" , " son1" , " son1_1" , " son1_2" , " son2" , " son2_1" , " son2_2" )
117
- nodes should have size (poActual.size)
118
- nodes shouldEqual poActual
119
-
120
- preIter.close()
120
+ def getNodePositions (iterator : Libuast .UastIter ): List [(Long , Long , Long )] = {
121
+ def positionToTuple (pos : JObject ): Option [(Long , Long , Long )] = {
122
+ val offset = pos.get(" offset" )
123
+ val line = pos.get(" line" )
124
+ val col = pos.get(" col" )
125
+ val maybePos = (offset, line, col)
126
+
127
+ maybePos match {
128
+ case (Some (o : JInt ), Some (l : JInt ), Some (c : JInt )) =>
129
+ Some (o.num, l.num, c.num)
130
+ case _ => None
131
+ }
132
+ }
133
+
134
+ // Filter only the nodes which correspond to
135
+ // positions and have a start field
136
+ iterator
137
+ .collect { case node : JObject =>
138
+ node.get(" @pos" ).collect { case pos : JObject =>
139
+ pos.get(" start" ).collect { case start : JObject =>
140
+ positionToTuple(start)
141
+ // The result of this is an Option[Option]. Convert it to a single option
142
+ }.flatten
143
+ // Likewise
144
+ }.flatten
145
+ }
146
+ .collect { case Some (pos) => pos }
147
+ .toList
121
148
}
122
149
123
- " Managed UAST iterator" should " return nodes in PostOrder" in {
124
- val postIter = BblfshClient .iterator(testTree, BblfshClient .PostOrder )
125
- val nodes = getNodeTypes(postIter)
150
+ val iterators =
151
+ Table (
152
+ (" order" , " expected" ),
153
+ (PreOrder , Seq (" root" , " son1" , " son1_1" , " son1_2" , " son2" , " son2_1" , " son2_2" )),
154
+ (PostOrder , Seq (" son1_1" , " son1_2" , " son1" , " son2_1" , " son2_2" , " son2" , " root" )),
155
+ (LevelOrder , Seq (" root" , " son1" , " son2" , " son1_1" , " son1_2" , " son2_1" , " son2_2" )),
156
+ (PositionOrder , Seq (" root" , " son1" , " son2_1" , " son1_1" , " son1_2" , " son2_2" , " son2" )),
157
+ (AnyOrder , Seq (" root" , " son1" , " son2_1" , " son1_1" , " son1_2" , " son2_2" , " son2" )),
158
+ (ChildrenOrder , Seq (" son1" , " son2" ))
159
+ )
160
+
161
+ forAll (iterators) { (order : TreeOrder , expected : Seq [String ]) =>
162
+ val iter = BblfshClient .iterator(testTree, order)
163
+ val nodes = getNodeTypes(iter)
126
164
127
- val poActual = Seq (" son1_1" , " son1_2" , " son1" , " son2_1" , " son2_2" , " son2" , " root" )
128
- nodes should have size (poActual.size)
129
- nodes shouldEqual poActual
165
+ order match {
166
+ case AnyOrder =>
167
+ nodes.toSet shouldEqual expected.toSet
168
+ case _ =>
169
+ nodes shouldEqual expected
170
+ }
130
171
131
- postIter .close()
172
+ iter .close()
132
173
}
133
174
134
- // TODO(#108) more tests coverage for other iteration orders, refactor to a table-driven test
175
+ " Positions in PositionOrder" should " actually be ordered" in {
176
+ val posIter = BblfshClient .iterator(testTree, PositionOrder )
177
+ val positions = getNodePositions(posIter)
178
+ val expected = Seq ((0 ,1 ,1 ), (2 ,2 ,2 ), (5 ,5 ,1 ), (10 ,10 ,1 ), (10 ,10 ,1 ), (15 ,15 ,1 ), (100 ,100 ,1 ))
179
+ positions shouldEqual expected
135
180
181
+ posIter.close()
182
+ }
136
183
}
0 commit comments