|
1 "{ Package: 'stx:goodies/petitparser/compiler/tests' }" |
|
2 |
|
3 TestCase subclass:#PPCNodeTest |
|
4 instanceVariableNames:'' |
|
5 classVariableNames:'' |
|
6 poolDictionaries:'' |
|
7 category:'PetitCompiler-Tests-Nodes' |
|
8 ! |
|
9 |
|
10 PPCNodeTest comment:'' |
|
11 ! |
|
12 |
|
13 !PPCNodeTest methodsFor:'as yet unclassified'! |
|
14 |
|
15 testCopy |
|
16 | n1 n2 | |
|
17 n1 := PPCDelegateNode new |
|
18 child: #foo; |
|
19 yourself. |
|
20 n2 := n1 copy. |
|
21 self assert: (n1 = n2). |
|
22 |
|
23 n2 child: #bar. |
|
24 self assert: (n1 = n2) not. |
|
25 ! |
|
26 |
|
27 testCopy2 |
|
28 | n1 n2 | |
|
29 n1 := PPCSequenceNode new |
|
30 children: (Array with: #foo with: #bar); |
|
31 yourself. |
|
32 n2 := n1 copy. |
|
33 self assert: (n1 = n2). |
|
34 |
|
35 n2 children at: 1 put: #zorg. |
|
36 self assert: (n1 = n2) not. |
|
37 ! |
|
38 |
|
39 testEquals |
|
40 self assert: (PPCNode new = PPCNode new). |
|
41 ! |
|
42 |
|
43 testEquals2 |
|
44 | n1 n2 n3 | |
|
45 n1 := PPCDelegateNode new |
|
46 child: #foo; |
|
47 yourself. |
|
48 n2 := PPCDelegateNode new |
|
49 child: #bar; |
|
50 yourself. |
|
51 n3 := PPCDelegateNode new |
|
52 child: #foo; |
|
53 yourself. |
|
54 |
|
55 self assert: (n1 = n3). |
|
56 self assert: (n1 = n2) not. |
|
57 ! ! |
|
58 |
|
59 !PPCNodeTest methodsFor:'test support'! |
|
60 |
|
61 assert: object type: class |
|
62 self assert: object class == class |
|
63 ! ! |
|
64 |
|
65 !PPCNodeTest methodsFor:'tests - converting'! |
|
66 |
|
67 testConvertBlock |
|
68 | parser tree | |
|
69 parser := [ :ctx | [ctx atEnd] whileFalse ] asParser. |
|
70 tree := parser asCompilerTree. |
|
71 |
|
72 self assert: tree type: PPCPluggableNode. |
|
73 self assert: tree block asString = '[ :ctx | [ ctx atEnd ] whileFalse ]'. |
|
74 ! |
|
75 |
|
76 testConvertChoice |
|
77 | parser tree | |
|
78 parser := 'foo' asParser / $b asParser. |
|
79 tree := parser asCompilerTree. |
|
80 |
|
81 self assert: tree type: PPCChoiceNode. |
|
82 self assert: tree children size = 2. |
|
83 self assert: tree children first type: PPCLiteralNode. |
|
84 self assert: tree children second type: PPCCharacterNode. |
|
85 ! |
|
86 |
|
87 testConvertNil |
|
88 | parser tree | |
|
89 parser := nil asParser. |
|
90 tree := parser asCompilerTree. |
|
91 |
|
92 self assert: tree type: PPCNilNode. |
|
93 ! |
|
94 |
|
95 testConvertSequence |
|
96 | parser tree | |
|
97 parser := 'foo' asParser, $b asParser. |
|
98 tree := parser asCompilerTree. |
|
99 |
|
100 self assert: tree type: PPCSequenceNode. |
|
101 self assert: tree children size = 2. |
|
102 self assert: tree children first type: PPCLiteralNode. |
|
103 self assert: tree children second type: PPCCharacterNode. |
|
104 ! |
|
105 |
|
106 testConvertToken |
|
107 | parser tree | |
|
108 parser := 'foo' asParser token. |
|
109 tree := parser asCompilerTree. |
|
110 |
|
111 self assert: tree type: PPCTokenNode. |
|
112 self assert: tree child type: PPCLiteralNode. |
|
113 |
|
114 parser := ('foo' asParser, $b asParser) token. |
|
115 tree := parser asCompilerTree. |
|
116 |
|
117 self assert: tree type: PPCTokenNode. |
|
118 self assert: tree child type: PPCSequenceNode. |
|
119 |
|
120 parser := $d asParser token star. |
|
121 tree := parser asCompilerTree. |
|
122 |
|
123 self assert: tree type: PPCStarNode. |
|
124 self assert: tree child type: PPCTokenNode. |
|
125 self assert: tree child child type: PPCCharacterNode. |
|
126 ! |
|
127 |
|
128 testConvertTrimmingToken |
|
129 | parser tree | |
|
130 parser := 'foo' asParser trimmingToken. |
|
131 tree := parser asCompilerTree optimizeTree. |
|
132 |
|
133 self assert: tree type: PPCTrimmingTokenNode. |
|
134 self assert: tree child type: PPCInlineLiteralNode. |
|
135 self assert: (tree whitespace allNodes allSatisfy: [ :n | n isKindOf: PPCNode ]). |
|
136 |
|
137 parser := ('foo' asParser, $b asParser) trimmingToken. |
|
138 tree := parser asCompilerTree optimizeTree. |
|
139 |
|
140 self assert: tree type: PPCTrimmingTokenNode. |
|
141 self assert: tree child type: PPCTokenSequenceNode. |
|
142 self assert: tree whitespace type: PPCTokenStarMessagePredicateNode. |
|
143 |
|
144 parser := $d asParser trimmingToken star. |
|
145 tree := parser asCompilerTree optimizeTree. |
|
146 |
|
147 self assert: tree type: PPCStarNode. |
|
148 self assert: tree child type: PPCTrimmingTokenNode. |
|
149 self assert: tree child child type: PPCInlineCharacterNode. |
|
150 ! ! |
|
151 |
|
152 !PPCNodeTest methodsFor:'tests - epsilon'! |
|
153 |
|
154 testActionAcceptsEpsilon |
|
155 | tree | |
|
156 tree := ('foo' asParser token optional ==> [ :e | e ]) asCompilerTree. |
|
157 self assert: tree acceptsEpsilon. |
|
158 ! |
|
159 |
|
160 testChoiceAcceptsEpsilon |
|
161 | tree | |
|
162 tree := ($a asParser / $b asParser star) asCompilerTree. |
|
163 self assert: tree acceptsEpsilon. |
|
164 ! |
|
165 |
|
166 testLiteralAcceptsEpsilon |
|
167 | tree | |
|
168 tree := 'foo' asParser asCompilerTree. |
|
169 self assert: tree acceptsEpsilon not. |
|
170 |
|
171 tree := '' asParser asCompilerTree. |
|
172 self assert: tree acceptsEpsilon. |
|
173 ! |
|
174 |
|
175 testPlusAcceptsEpsilon |
|
176 | tree | |
|
177 tree := ($b asParser plus) asCompilerTree. |
|
178 self assert: tree acceptsEpsilon not. |
|
179 |
|
180 tree := #letter asParser plus asCompilerTree. |
|
181 self assert: tree acceptsEpsilon not. |
|
182 ! |
|
183 |
|
184 testSequenceAcceptsEpsilon |
|
185 | tree parser | |
|
186 parser := 'foo' asParser token optional, 'bar' asParser token star, ($a asParser / $b asParser star). |
|
187 tree := parser asCompilerTree. |
|
188 self assert: tree acceptsEpsilon. |
|
189 ! |
|
190 |
|
191 testStarAcceptsEpsilon |
|
192 | tree | |
|
193 tree := $b asParser star asCompilerTree. |
|
194 self assert: tree acceptsEpsilon. |
|
195 ! |
|
196 |
|
197 testTokenAcceptsEpsilon |
|
198 | tree | |
|
199 tree := ($a asParser / $b asParser plus) token asCompilerTree. |
|
200 self assert: tree acceptsEpsilon not. |
|
201 |
|
202 tree := ($a asParser / $b asParser star) token asCompilerTree. |
|
203 self assert: tree acceptsEpsilon. |
|
204 ! ! |
|
205 |