|
1 "{ Package: 'stx:goodies/petitparser/compiler/tests' }" |
|
2 |
|
3 "{ NameSpace: Smalltalk }" |
|
4 |
|
5 TestCase subclass:#PPCTokenDetectorTest |
|
6 instanceVariableNames:'node result visitor' |
|
7 classVariableNames:'' |
|
8 poolDictionaries:'' |
|
9 category:'PetitCompiler-Tests-Visitors' |
|
10 ! |
|
11 |
|
12 !PPCTokenDetectorTest methodsFor:'as yet unclassified'! |
|
13 |
|
14 assert: object type: class |
|
15 self assert: object class == class |
|
16 ! |
|
17 |
|
18 setUp |
|
19 visitor := PPCTokenDetector new. |
|
20 ! |
|
21 |
|
22 testActionNode |
|
23 | seq characterNode1 characterNode2 tokenNode | |
|
24 characterNode1 := PPCCharacterNode new. |
|
25 characterNode2 := PPCCharacterNode new. |
|
26 |
|
27 seq := PPCSequenceNode new |
|
28 children: { characterNode1 . characterNode1 }; |
|
29 yourself. |
|
30 tokenNode := PPCTokenNode new |
|
31 child: seq; |
|
32 yourself. |
|
33 |
|
34 node := PPCActionNode new |
|
35 child: tokenNode; |
|
36 yourself. |
|
37 |
|
38 |
|
39 result := visitor visit: node. |
|
40 |
|
41 self assert: result type: PPCActionNode. |
|
42 self assert: result child type: PPCTokenNode. |
|
43 self assert: result child child type: PPCTokenSequenceNode. |
|
44 |
|
45 self assert: result == node. |
|
46 self assert: (result child child firstChild == characterNode1) not. |
|
47 self assert: (result child child firstChild = characterNode1). |
|
48 self assert: (result child child secondChild == characterNode1) not. |
|
49 self assert: (result child child secondChild = characterNode1). |
|
50 |
|
51 ! |
|
52 |
|
53 testNestedTrimmingToken |
|
54 | characterNode token ws seq trimmingToken | |
|
55 characterNode := PPCCharacterNode new. |
|
56 token := PPCTokenNode new |
|
57 child: characterNode; |
|
58 tokenClass: #foo; |
|
59 yourself. |
|
60 ws := PPCSentinelNode new. |
|
61 seq := PPCSequenceNode new |
|
62 children: { ws . token . ws }; |
|
63 yourself. |
|
64 trimmingToken := PPCActionNode new |
|
65 child: seq; |
|
66 propertyAt: #trimmingToken put: true; |
|
67 yourself. |
|
68 |
|
69 node := PPCSequenceNode new |
|
70 children: { characterNode . trimmingToken }; |
|
71 yourself. |
|
72 |
|
73 result := visitor visit: node. |
|
74 |
|
75 self assert: result type: PPCSequenceNode. |
|
76 self assert: result firstChild == characterNode. |
|
77 |
|
78 self assert: result secondChild type: PPCTrimmingTokenNode. |
|
79 self assert: result secondChild child = characterNode. |
|
80 self assert: (result secondChild child == characterNode) not. |
|
81 ! |
|
82 |
|
83 testNestedTrimmingToken2 |
|
84 | characterNode token1 ws seq1 seq2 seqWithToken trimmingToken1 token2 | |
|
85 characterNode := PPCCharacterNode new. |
|
86 ws := PPCSentinelNode new. |
|
87 |
|
88 token1 := PPCTokenNode new |
|
89 child: characterNode; |
|
90 tokenClass: #foo; |
|
91 yourself. |
|
92 seq1 := PPCSequenceNode new |
|
93 children: { ws . token1 . ws }; |
|
94 yourself. |
|
95 trimmingToken1 := PPCActionNode new |
|
96 child: seq1; |
|
97 propertyAt: #trimmingToken put: true; |
|
98 yourself. |
|
99 |
|
100 seqWithToken := PPCSequenceNode new |
|
101 children: { characterNode . trimmingToken1 }; |
|
102 yourself. |
|
103 |
|
104 token2 := PPCTokenNode new |
|
105 child: seqWithToken; |
|
106 tokenClass: #bar; |
|
107 yourself. |
|
108 seq2 := PPCSequenceNode new |
|
109 children: { ws . token2 . ws }; |
|
110 yourself. |
|
111 node := PPCActionNode new |
|
112 child: seq2; |
|
113 propertyAt: #trimmingToken put: true; |
|
114 yourself. |
|
115 result := visitor visit: node. |
|
116 |
|
117 self assert: result type: PPCTrimmingTokenNode . |
|
118 self assert: result child type: PPCTokenSequenceNode. |
|
119 ! |
|
120 |
|
121 testNestedTrimmingToken3 |
|
122 | trueToken falseToken booleanLiteral literal abc notBoolean id idSeq javaToken resultId resultBooleanLiteral resultIdBooleanLiteral | |
|
123 " |
|
124 This USE case is based on JavaToken |
|
125 |
|
126 javaToken := id / literal |
|
127 id := (not booleanLiteral, 'abc') token |
|
128 literal := booleanLiteral |
|
129 booleanLiteral := 'true' token / 'false' token |
|
130 " |
|
131 trueToken := 'true' asParser token asCompilerTree. |
|
132 falseToken := 'false' asParser token asCompilerTree. |
|
133 abc := 'abc' asParser asCompilerTree. |
|
134 |
|
135 booleanLiteral := PPCChoiceNode new |
|
136 children: { trueToken . falseToken }; yourself. |
|
137 |
|
138 literal := PPCForwardNode new |
|
139 name: #literal; |
|
140 child: booleanLiteral; yourself. |
|
141 notBoolean := PPCNotNode new |
|
142 child: booleanLiteral; yourself. |
|
143 idSeq := PPCSequenceNode new |
|
144 children: { notBoolean . abc }; yourself. |
|
145 id := PPCTokenNode new |
|
146 child: idSeq; yourself. |
|
147 javaToken := PPCChoiceNode new |
|
148 children: { id . literal }; yourself. |
|
149 |
|
150 result := visitor visit: javaToken. |
|
151 resultId := result firstChild. |
|
152 resultBooleanLiteral := result secondChild child. |
|
153 resultIdBooleanLiteral := resultId child firstChild child. |
|
154 |
|
155 |
|
156 |
|
157 self assert: result type: PPCChoiceNode. |
|
158 self assert: resultId type: PPCTokenNode. |
|
159 self assert: resultBooleanLiteral type: PPCChoiceNode. |
|
160 |
|
161 self assert: resultIdBooleanLiteral firstChild type: PPCLiteralNode. |
|
162 self assert: resultIdBooleanLiteral secondChild type: PPCLiteralNode. |
|
163 |
|
164 self assert: resultBooleanLiteral firstChild type: PPCTokenNode. |
|
165 self assert: resultBooleanLiteral secondChild type: PPCTokenNode. |
|
166 |
|
167 |
|
168 ! |
|
169 |
|
170 testNodeCopy |
|
171 | nilNode forwardNode | |
|
172 nilNode := PPCNilNode new. |
|
173 forwardNode := PPCForwardNode new |
|
174 child: nilNode; |
|
175 yourself. |
|
176 node := PPCTokenNode new |
|
177 child: forwardNode; |
|
178 yourself. |
|
179 |
|
180 result := visitor visit: node. |
|
181 |
|
182 self assert: (result == node). |
|
183 self assert: result child = forwardNode. |
|
184 self assert: (result child == forwardNode) not. |
|
185 self assert: (result child child = nilNode). |
|
186 self assert: (result child child == nilNode) not. |
|
187 ! |
|
188 |
|
189 testTokenSequence1 |
|
190 | seq characterNode1 characterNode2 | |
|
191 characterNode1 := PPCCharacterNode new. |
|
192 characterNode2 := PPCCharacterNode new. |
|
193 |
|
194 seq := PPCSequenceNode new |
|
195 children: { characterNode1 . characterNode1 }; |
|
196 yourself. |
|
197 node := PPCTokenNode new |
|
198 child: seq; |
|
199 yourself. |
|
200 |
|
201 |
|
202 result := visitor visit: node. |
|
203 |
|
204 self assert: result type: PPCTokenNode. |
|
205 self assert: result child type: PPCTokenSequenceNode. |
|
206 |
|
207 self assert: result == node. |
|
208 self assert: (result child firstChild == characterNode1) not. |
|
209 self assert: (result child firstChild = characterNode1). |
|
210 self assert: (result child secondChild == characterNode1) not. |
|
211 self assert: (result child secondChild = characterNode1). |
|
212 |
|
213 ! |
|
214 |
|
215 testTrimmingToken |
|
216 | seq characterNode ws token | |
|
217 characterNode := PPCCharacterNode new. |
|
218 token := PPCTokenNode new |
|
219 child: characterNode; |
|
220 tokenClass: #foo; |
|
221 yourself. |
|
222 ws := PPCSentinelNode new. |
|
223 |
|
224 seq := PPCSequenceNode new |
|
225 children: { ws . token . ws }; |
|
226 yourself. |
|
227 node := PPCActionNode new |
|
228 child: seq; |
|
229 propertyAt: #trimmingToken put: true; |
|
230 yourself. |
|
231 |
|
232 result := visitor visit: node. |
|
233 |
|
234 self assert: result type: PPCTrimmingTokenNode. |
|
235 self assert: result child type: PPCCharacterNode. |
|
236 self assert: result child = characterNode. |
|
237 self assert: (result child == characterNode) not. |
|
238 ! ! |
|
239 |