xref: /aosp_15_r20/external/antlr/runtime/Python/tests/t048rewrite.py (revision 16467b971bd3e2009fad32dd79016f2c7e421deb)
1*16467b97STreehugger Robot"""Testsuite for TokenRewriteStream class."""
2*16467b97STreehugger Robot
3*16467b97STreehugger Robot# don't care about docstrings
4*16467b97STreehugger Robot# pylint: disable-msg=C0111
5*16467b97STreehugger Robot
6*16467b97STreehugger Robotimport unittest
7*16467b97STreehugger Robotimport antlr3
8*16467b97STreehugger Robotimport testbase
9*16467b97STreehugger Robot
10*16467b97STreehugger Robotclass T1(testbase.ANTLRTest):
11*16467b97STreehugger Robot    def setUp(self):
12*16467b97STreehugger Robot        self.compileGrammar()
13*16467b97STreehugger Robot
14*16467b97STreehugger Robot
15*16467b97STreehugger Robot    def _parse(self, input):
16*16467b97STreehugger Robot        cStream = antlr3.StringStream(input)
17*16467b97STreehugger Robot        lexer = self.getLexer(cStream)
18*16467b97STreehugger Robot        tStream = antlr3.TokenRewriteStream(lexer)
19*16467b97STreehugger Robot        tStream.fillBuffer()
20*16467b97STreehugger Robot
21*16467b97STreehugger Robot        return tStream
22*16467b97STreehugger Robot
23*16467b97STreehugger Robot
24*16467b97STreehugger Robot    def testInsertBeforeIndex0(self):
25*16467b97STreehugger Robot        tokens = self._parse("abc")
26*16467b97STreehugger Robot        tokens.insertBefore(0, "0")
27*16467b97STreehugger Robot
28*16467b97STreehugger Robot        result = tokens.toString()
29*16467b97STreehugger Robot        expecting = "0abc"
30*16467b97STreehugger Robot        self.failUnlessEqual(result, expecting)
31*16467b97STreehugger Robot
32*16467b97STreehugger Robot
33*16467b97STreehugger Robot    def testInsertAfterLastIndex(self):
34*16467b97STreehugger Robot        tokens = self._parse("abc")
35*16467b97STreehugger Robot        tokens.insertAfter(2, "x")
36*16467b97STreehugger Robot
37*16467b97STreehugger Robot        result = tokens.toString()
38*16467b97STreehugger Robot        expecting = "abcx"
39*16467b97STreehugger Robot        self.failUnlessEqual(result, expecting)
40*16467b97STreehugger Robot
41*16467b97STreehugger Robot
42*16467b97STreehugger Robot    def test2InsertBeforeAfterMiddleIndex(self):
43*16467b97STreehugger Robot        tokens = self._parse("abc")
44*16467b97STreehugger Robot        tokens.insertBefore(1, "x")
45*16467b97STreehugger Robot        tokens.insertAfter(1, "x")
46*16467b97STreehugger Robot
47*16467b97STreehugger Robot        result = tokens.toString()
48*16467b97STreehugger Robot        expecting = "axbxc"
49*16467b97STreehugger Robot        self.failUnlessEqual(result, expecting)
50*16467b97STreehugger Robot
51*16467b97STreehugger Robot
52*16467b97STreehugger Robot    def testReplaceIndex0(self):
53*16467b97STreehugger Robot        tokens = self._parse("abc")
54*16467b97STreehugger Robot        tokens.replace(0, "x")
55*16467b97STreehugger Robot
56*16467b97STreehugger Robot        result = tokens.toString()
57*16467b97STreehugger Robot        expecting = "xbc"
58*16467b97STreehugger Robot        self.failUnlessEqual(result, expecting)
59*16467b97STreehugger Robot
60*16467b97STreehugger Robot
61*16467b97STreehugger Robot    def testReplaceLastIndex(self):
62*16467b97STreehugger Robot        tokens = self._parse("abc")
63*16467b97STreehugger Robot        tokens.replace(2, "x")
64*16467b97STreehugger Robot
65*16467b97STreehugger Robot        result = tokens.toString()
66*16467b97STreehugger Robot        expecting = "abx"
67*16467b97STreehugger Robot        self.failUnlessEqual(result, expecting)
68*16467b97STreehugger Robot
69*16467b97STreehugger Robot
70*16467b97STreehugger Robot    def testReplaceMiddleIndex(self):
71*16467b97STreehugger Robot        tokens = self._parse("abc")
72*16467b97STreehugger Robot        tokens.replace(1, "x")
73*16467b97STreehugger Robot
74*16467b97STreehugger Robot        result = tokens.toString()
75*16467b97STreehugger Robot        expecting = "axc"
76*16467b97STreehugger Robot        self.failUnlessEqual(result, expecting)
77*16467b97STreehugger Robot
78*16467b97STreehugger Robot
79*16467b97STreehugger Robot    def test2ReplaceMiddleIndex(self):
80*16467b97STreehugger Robot        tokens = self._parse("abc")
81*16467b97STreehugger Robot        tokens.replace(1, "x")
82*16467b97STreehugger Robot        tokens.replace(1, "y")
83*16467b97STreehugger Robot
84*16467b97STreehugger Robot        result = tokens.toString()
85*16467b97STreehugger Robot        expecting = "ayc"
86*16467b97STreehugger Robot        self.failUnlessEqual(result, expecting)
87*16467b97STreehugger Robot
88*16467b97STreehugger Robot
89*16467b97STreehugger Robot    def test2ReplaceMiddleIndex1InsertBefore(self):
90*16467b97STreehugger Robot        tokens = self._parse("abc")
91*16467b97STreehugger Robot        tokens.insertBefore(0, "_")
92*16467b97STreehugger Robot        tokens.replace(1, "x")
93*16467b97STreehugger Robot        tokens.replace(1, "y")
94*16467b97STreehugger Robot
95*16467b97STreehugger Robot        result = tokens.toString()
96*16467b97STreehugger Robot        expecting = "_ayc"
97*16467b97STreehugger Robot        self.failUnlessEqual(expecting, result)
98*16467b97STreehugger Robot
99*16467b97STreehugger Robot
100*16467b97STreehugger Robot    def testReplaceThenDeleteMiddleIndex(self):
101*16467b97STreehugger Robot        tokens = self._parse("abc")
102*16467b97STreehugger Robot        tokens.replace(1, "x")
103*16467b97STreehugger Robot        tokens.delete(1)
104*16467b97STreehugger Robot
105*16467b97STreehugger Robot        result = tokens.toString()
106*16467b97STreehugger Robot        expecting = "ac"
107*16467b97STreehugger Robot        self.failUnlessEqual(result, expecting)
108*16467b97STreehugger Robot
109*16467b97STreehugger Robot
110*16467b97STreehugger Robot    def testInsertInPriorReplace(self):
111*16467b97STreehugger Robot        tokens = self._parse("abc")
112*16467b97STreehugger Robot        tokens.replace(0, 2, "x")
113*16467b97STreehugger Robot        tokens.insertBefore(1, "0")
114*16467b97STreehugger Robot        try:
115*16467b97STreehugger Robot            tokens.toString()
116*16467b97STreehugger Robot            self.fail()
117*16467b97STreehugger Robot        except ValueError, exc:
118*16467b97STreehugger Robot            self.failUnlessEqual(
119*16467b97STreehugger Robot                str(exc),
120*16467b97STreehugger Robot                "insert op <InsertBeforeOp@1:\"0\"> within boundaries of "
121*16467b97STreehugger Robot                "previous <[email protected]:\"x\">"
122*16467b97STreehugger Robot                )
123*16467b97STreehugger Robot
124*16467b97STreehugger Robot    def testInsertThenReplaceSameIndex(self):
125*16467b97STreehugger Robot        tokens = self._parse("abc")
126*16467b97STreehugger Robot        tokens.insertBefore(0, "0")
127*16467b97STreehugger Robot        tokens.replace(0, "x")  # supercedes insert at 0
128*16467b97STreehugger Robot
129*16467b97STreehugger Robot        result = tokens.toString()
130*16467b97STreehugger Robot        expecting = "0xbc"
131*16467b97STreehugger Robot        self.failUnlessEqual(result, expecting)
132*16467b97STreehugger Robot
133*16467b97STreehugger Robot
134*16467b97STreehugger Robot    def test2InsertMiddleIndex(self):
135*16467b97STreehugger Robot        tokens = self._parse("abc")
136*16467b97STreehugger Robot        tokens.insertBefore(1, "x")
137*16467b97STreehugger Robot        tokens.insertBefore(1, "y")
138*16467b97STreehugger Robot
139*16467b97STreehugger Robot        result = tokens.toString()
140*16467b97STreehugger Robot        expecting = "ayxbc"
141*16467b97STreehugger Robot        self.failUnlessEqual(result, expecting)
142*16467b97STreehugger Robot
143*16467b97STreehugger Robot
144*16467b97STreehugger Robot    def test2InsertThenReplaceIndex0(self):
145*16467b97STreehugger Robot        tokens = self._parse("abc")
146*16467b97STreehugger Robot        tokens.insertBefore(0, "x")
147*16467b97STreehugger Robot        tokens.insertBefore(0, "y")
148*16467b97STreehugger Robot        tokens.replace(0, "z")
149*16467b97STreehugger Robot
150*16467b97STreehugger Robot        result = tokens.toString()
151*16467b97STreehugger Robot        expecting = "yxzbc"
152*16467b97STreehugger Robot        self.failUnlessEqual(result, expecting)
153*16467b97STreehugger Robot
154*16467b97STreehugger Robot
155*16467b97STreehugger Robot    def testReplaceThenInsertBeforeLastIndex(self):
156*16467b97STreehugger Robot        tokens = self._parse("abc")
157*16467b97STreehugger Robot        tokens.replace(2, "x")
158*16467b97STreehugger Robot        tokens.insertBefore(2, "y")
159*16467b97STreehugger Robot
160*16467b97STreehugger Robot        result = tokens.toString()
161*16467b97STreehugger Robot        expecting = "abyx"
162*16467b97STreehugger Robot        self.failUnlessEqual(result, expecting)
163*16467b97STreehugger Robot
164*16467b97STreehugger Robot
165*16467b97STreehugger Robot    def testInsertThenReplaceLastIndex(self):
166*16467b97STreehugger Robot        tokens = self._parse("abc")
167*16467b97STreehugger Robot        tokens.insertBefore(2, "y")
168*16467b97STreehugger Robot        tokens.replace(2, "x")
169*16467b97STreehugger Robot
170*16467b97STreehugger Robot        result = tokens.toString()
171*16467b97STreehugger Robot        expecting = "abyx"
172*16467b97STreehugger Robot        self.failUnlessEqual(result, expecting)
173*16467b97STreehugger Robot
174*16467b97STreehugger Robot
175*16467b97STreehugger Robot    def testReplaceThenInsertAfterLastIndex(self):
176*16467b97STreehugger Robot        tokens = self._parse("abc")
177*16467b97STreehugger Robot        tokens.replace(2, "x")
178*16467b97STreehugger Robot        tokens.insertAfter(2, "y")
179*16467b97STreehugger Robot
180*16467b97STreehugger Robot        result = tokens.toString()
181*16467b97STreehugger Robot        expecting = "abxy"
182*16467b97STreehugger Robot        self.failUnlessEqual(result, expecting)
183*16467b97STreehugger Robot
184*16467b97STreehugger Robot
185*16467b97STreehugger Robot    def testReplaceRangeThenInsertAtLeftEdge(self):
186*16467b97STreehugger Robot        tokens = self._parse("abcccba")
187*16467b97STreehugger Robot        tokens.replace(2, 4, "x")
188*16467b97STreehugger Robot        tokens.insertBefore(2, "y")
189*16467b97STreehugger Robot
190*16467b97STreehugger Robot        result = tokens.toString()
191*16467b97STreehugger Robot        expecting = "abyxba"
192*16467b97STreehugger Robot        self.failUnlessEqual(result, expecting)
193*16467b97STreehugger Robot
194*16467b97STreehugger Robot
195*16467b97STreehugger Robot    def testReplaceRangeThenInsertAtRightEdge(self):
196*16467b97STreehugger Robot        tokens = self._parse("abcccba")
197*16467b97STreehugger Robot        tokens.replace(2, 4, "x")
198*16467b97STreehugger Robot        tokens.insertBefore(4, "y") # no effect; within range of a replace
199*16467b97STreehugger Robot
200*16467b97STreehugger Robot        try:
201*16467b97STreehugger Robot            tokens.toString()
202*16467b97STreehugger Robot            self.fail()
203*16467b97STreehugger Robot        except ValueError, exc:
204*16467b97STreehugger Robot            self.failUnlessEqual(
205*16467b97STreehugger Robot                str(exc),
206*16467b97STreehugger Robot                "insert op <InsertBeforeOp@4:\"y\"> within boundaries of "
207*16467b97STreehugger Robot                "previous <[email protected]:\"x\">")
208*16467b97STreehugger Robot
209*16467b97STreehugger Robot
210*16467b97STreehugger Robot    def testReplaceRangeThenInsertAfterRightEdge(self):
211*16467b97STreehugger Robot        tokens = self._parse("abcccba")
212*16467b97STreehugger Robot        tokens.replace(2, 4, "x")
213*16467b97STreehugger Robot        tokens.insertAfter(4, "y")
214*16467b97STreehugger Robot
215*16467b97STreehugger Robot        result = tokens.toString()
216*16467b97STreehugger Robot        expecting = "abxyba"
217*16467b97STreehugger Robot        self.failUnlessEqual(result, expecting)
218*16467b97STreehugger Robot
219*16467b97STreehugger Robot
220*16467b97STreehugger Robot    def testReplaceAll(self):
221*16467b97STreehugger Robot        tokens = self._parse("abcccba")
222*16467b97STreehugger Robot        tokens.replace(0, 6, "x")
223*16467b97STreehugger Robot
224*16467b97STreehugger Robot        result = tokens.toString()
225*16467b97STreehugger Robot        expecting = "x"
226*16467b97STreehugger Robot        self.failUnlessEqual(result, expecting)
227*16467b97STreehugger Robot
228*16467b97STreehugger Robot
229*16467b97STreehugger Robot    def testReplaceSubsetThenFetch(self):
230*16467b97STreehugger Robot        tokens = self._parse("abcccba")
231*16467b97STreehugger Robot        tokens.replace(2, 4, "xyz")
232*16467b97STreehugger Robot
233*16467b97STreehugger Robot        result = tokens.toString(0, 6)
234*16467b97STreehugger Robot        expecting = "abxyzba"
235*16467b97STreehugger Robot        self.failUnlessEqual(result, expecting)
236*16467b97STreehugger Robot
237*16467b97STreehugger Robot
238*16467b97STreehugger Robot    def testReplaceThenReplaceSuperset(self):
239*16467b97STreehugger Robot        tokens = self._parse("abcccba")
240*16467b97STreehugger Robot        tokens.replace(2, 4, "xyz")
241*16467b97STreehugger Robot        tokens.replace(3, 5, "foo") # overlaps, error
242*16467b97STreehugger Robot
243*16467b97STreehugger Robot        try:
244*16467b97STreehugger Robot            tokens.toString()
245*16467b97STreehugger Robot            self.fail()
246*16467b97STreehugger Robot        except ValueError, exc:
247*16467b97STreehugger Robot            self.failUnlessEqual(
248*16467b97STreehugger Robot                str(exc),
249*16467b97STreehugger Robot                "replace op boundaries of <[email protected]:\"foo\"> overlap "
250*16467b97STreehugger Robot                "with previous <[email protected]:\"xyz\">")
251*16467b97STreehugger Robot
252*16467b97STreehugger Robot
253*16467b97STreehugger Robot    def testReplaceThenReplaceLowerIndexedSuperset(self):
254*16467b97STreehugger Robot        tokens = self._parse("abcccba")
255*16467b97STreehugger Robot        tokens.replace(2, 4, "xyz")
256*16467b97STreehugger Robot        tokens.replace(1, 3, "foo") # overlap, error
257*16467b97STreehugger Robot
258*16467b97STreehugger Robot        try:
259*16467b97STreehugger Robot            tokens.toString()
260*16467b97STreehugger Robot            self.fail()
261*16467b97STreehugger Robot        except ValueError, exc:
262*16467b97STreehugger Robot            self.failUnlessEqual(
263*16467b97STreehugger Robot                str(exc),
264*16467b97STreehugger Robot                "replace op boundaries of <[email protected]:\"foo\"> overlap "
265*16467b97STreehugger Robot                "with previous <[email protected]:\"xyz\">")
266*16467b97STreehugger Robot
267*16467b97STreehugger Robot
268*16467b97STreehugger Robot    def testReplaceSingleMiddleThenOverlappingSuperset(self):
269*16467b97STreehugger Robot        tokens = self._parse("abcba")
270*16467b97STreehugger Robot        tokens.replace(2, 2, "xyz")
271*16467b97STreehugger Robot        tokens.replace(0, 3, "foo")
272*16467b97STreehugger Robot
273*16467b97STreehugger Robot        result = tokens.toString()
274*16467b97STreehugger Robot        expecting = "fooa"
275*16467b97STreehugger Robot        self.failUnlessEqual(result, expecting)
276*16467b97STreehugger Robot
277*16467b97STreehugger Robot
278*16467b97STreehugger Robot    def testCombineInserts(self):
279*16467b97STreehugger Robot        tokens = self._parse("abc")
280*16467b97STreehugger Robot        tokens.insertBefore(0, "x")
281*16467b97STreehugger Robot        tokens.insertBefore(0, "y")
282*16467b97STreehugger Robot        result = tokens.toString()
283*16467b97STreehugger Robot        expecting = "yxabc"
284*16467b97STreehugger Robot        self.failUnlessEqual(expecting, result)
285*16467b97STreehugger Robot
286*16467b97STreehugger Robot
287*16467b97STreehugger Robot    def testCombine3Inserts(self):
288*16467b97STreehugger Robot        tokens = self._parse("abc")
289*16467b97STreehugger Robot        tokens.insertBefore(1, "x")
290*16467b97STreehugger Robot        tokens.insertBefore(0, "y")
291*16467b97STreehugger Robot        tokens.insertBefore(1, "z")
292*16467b97STreehugger Robot        result = tokens.toString()
293*16467b97STreehugger Robot        expecting = "yazxbc"
294*16467b97STreehugger Robot        self.failUnlessEqual(expecting, result)
295*16467b97STreehugger Robot
296*16467b97STreehugger Robot
297*16467b97STreehugger Robot    def testCombineInsertOnLeftWithReplace(self):
298*16467b97STreehugger Robot        tokens = self._parse("abc")
299*16467b97STreehugger Robot        tokens.replace(0, 2, "foo")
300*16467b97STreehugger Robot        tokens.insertBefore(0, "z") # combine with left edge of rewrite
301*16467b97STreehugger Robot        result = tokens.toString()
302*16467b97STreehugger Robot        expecting = "zfoo"
303*16467b97STreehugger Robot        self.failUnlessEqual(expecting, result)
304*16467b97STreehugger Robot
305*16467b97STreehugger Robot
306*16467b97STreehugger Robot    def testCombineInsertOnLeftWithDelete(self):
307*16467b97STreehugger Robot        tokens = self._parse("abc")
308*16467b97STreehugger Robot        tokens.delete(0, 2)
309*16467b97STreehugger Robot        tokens.insertBefore(0, "z") # combine with left edge of rewrite
310*16467b97STreehugger Robot        result = tokens.toString()
311*16467b97STreehugger Robot        expecting = "z" # make sure combo is not znull
312*16467b97STreehugger Robot        self.failUnlessEqual(expecting, result)
313*16467b97STreehugger Robot
314*16467b97STreehugger Robot
315*16467b97STreehugger Robot    def testDisjointInserts(self):
316*16467b97STreehugger Robot        tokens = self._parse("abc")
317*16467b97STreehugger Robot        tokens.insertBefore(1, "x")
318*16467b97STreehugger Robot        tokens.insertBefore(2, "y")
319*16467b97STreehugger Robot        tokens.insertBefore(0, "z")
320*16467b97STreehugger Robot        result = tokens.toString()
321*16467b97STreehugger Robot        expecting = "zaxbyc"
322*16467b97STreehugger Robot        self.failUnlessEqual(expecting, result)
323*16467b97STreehugger Robot
324*16467b97STreehugger Robot
325*16467b97STreehugger Robot    def testOverlappingReplace(self):
326*16467b97STreehugger Robot        tokens = self._parse("abcc")
327*16467b97STreehugger Robot        tokens.replace(1, 2, "foo")
328*16467b97STreehugger Robot        tokens.replace(0, 3, "bar") # wipes prior nested replace
329*16467b97STreehugger Robot        result = tokens.toString()
330*16467b97STreehugger Robot        expecting = "bar"
331*16467b97STreehugger Robot        self.failUnlessEqual(expecting, result)
332*16467b97STreehugger Robot
333*16467b97STreehugger Robot
334*16467b97STreehugger Robot    def testOverlappingReplace2(self):
335*16467b97STreehugger Robot        tokens = self._parse("abcc")
336*16467b97STreehugger Robot        tokens.replace(0, 3, "bar")
337*16467b97STreehugger Robot        tokens.replace(1, 2, "foo") # cannot split earlier replace
338*16467b97STreehugger Robot
339*16467b97STreehugger Robot        try:
340*16467b97STreehugger Robot            tokens.toString()
341*16467b97STreehugger Robot            self.fail()
342*16467b97STreehugger Robot        except ValueError, exc:
343*16467b97STreehugger Robot            self.failUnlessEqual(
344*16467b97STreehugger Robot                str(exc),
345*16467b97STreehugger Robot                "replace op boundaries of <[email protected]:\"foo\"> overlap "
346*16467b97STreehugger Robot                "with previous <[email protected]:\"bar\">")
347*16467b97STreehugger Robot
348*16467b97STreehugger Robot
349*16467b97STreehugger Robot    def testOverlappingReplace3(self):
350*16467b97STreehugger Robot        tokens = self._parse("abcc")
351*16467b97STreehugger Robot        tokens.replace(1, 2, "foo")
352*16467b97STreehugger Robot        tokens.replace(0, 2, "bar") # wipes prior nested replace
353*16467b97STreehugger Robot        result = tokens.toString()
354*16467b97STreehugger Robot        expecting = "barc"
355*16467b97STreehugger Robot        self.failUnlessEqual(expecting, result)
356*16467b97STreehugger Robot
357*16467b97STreehugger Robot
358*16467b97STreehugger Robot    def testOverlappingReplace4(self):
359*16467b97STreehugger Robot        tokens = self._parse("abcc")
360*16467b97STreehugger Robot        tokens.replace(1, 2, "foo")
361*16467b97STreehugger Robot        tokens.replace(1, 3, "bar") # wipes prior nested replace
362*16467b97STreehugger Robot        result = tokens.toString()
363*16467b97STreehugger Robot        expecting = "abar"
364*16467b97STreehugger Robot        self.failUnlessEqual(expecting, result)
365*16467b97STreehugger Robot
366*16467b97STreehugger Robot
367*16467b97STreehugger Robot    def testDropIdenticalReplace(self):
368*16467b97STreehugger Robot        tokens = self._parse("abcc")
369*16467b97STreehugger Robot        tokens.replace(1, 2, "foo")
370*16467b97STreehugger Robot        tokens.replace(1, 2, "foo") # drop previous, identical
371*16467b97STreehugger Robot        result = tokens.toString()
372*16467b97STreehugger Robot        expecting = "afooc"
373*16467b97STreehugger Robot        self.failUnlessEqual(expecting, result)
374*16467b97STreehugger Robot
375*16467b97STreehugger Robot
376*16467b97STreehugger Robot    def testDropPrevCoveredInsert(self):
377*16467b97STreehugger Robot        tokens = self._parse("abc")
378*16467b97STreehugger Robot        tokens.insertBefore(1, "foo")
379*16467b97STreehugger Robot        tokens.replace(1, 2, "foo") # kill prev insert
380*16467b97STreehugger Robot        result = tokens.toString()
381*16467b97STreehugger Robot        expecting = "afoofoo"
382*16467b97STreehugger Robot        self.failUnlessEqual(expecting, result)
383*16467b97STreehugger Robot
384*16467b97STreehugger Robot
385*16467b97STreehugger Robot    def testLeaveAloneDisjointInsert(self):
386*16467b97STreehugger Robot        tokens = self._parse("abcc")
387*16467b97STreehugger Robot        tokens.insertBefore(1, "x")
388*16467b97STreehugger Robot        tokens.replace(2, 3, "foo")
389*16467b97STreehugger Robot        result = tokens.toString()
390*16467b97STreehugger Robot        expecting = "axbfoo"
391*16467b97STreehugger Robot        self.failUnlessEqual(expecting, result)
392*16467b97STreehugger Robot
393*16467b97STreehugger Robot
394*16467b97STreehugger Robot    def testLeaveAloneDisjointInsert2(self):
395*16467b97STreehugger Robot        tokens = self._parse("abcc")
396*16467b97STreehugger Robot        tokens.replace(2, 3, "foo")
397*16467b97STreehugger Robot        tokens.insertBefore(1, "x")
398*16467b97STreehugger Robot        result = tokens.toString()
399*16467b97STreehugger Robot        expecting = "axbfoo"
400*16467b97STreehugger Robot        self.failUnlessEqual(expecting, result)
401*16467b97STreehugger Robot
402*16467b97STreehugger Robot
403*16467b97STreehugger Robot    def testInsertBeforeTokenThenDeleteThatToken(self):
404*16467b97STreehugger Robot        tokens = self._parse("abc")
405*16467b97STreehugger Robot        tokens.insertBefore(2, "y")
406*16467b97STreehugger Robot        tokens.delete(2)
407*16467b97STreehugger Robot        result = tokens.toString()
408*16467b97STreehugger Robot        expecting = "aby"
409*16467b97STreehugger Robot        self.failUnlessEqual(expecting, result)
410*16467b97STreehugger Robot
411*16467b97STreehugger Robot
412*16467b97STreehugger Robotclass T2(testbase.ANTLRTest):
413*16467b97STreehugger Robot    def setUp(self):
414*16467b97STreehugger Robot        self.compileGrammar('t048rewrite2.g')
415*16467b97STreehugger Robot
416*16467b97STreehugger Robot
417*16467b97STreehugger Robot    def _parse(self, input):
418*16467b97STreehugger Robot        cStream = antlr3.StringStream(input)
419*16467b97STreehugger Robot        lexer = self.getLexer(cStream)
420*16467b97STreehugger Robot        tStream = antlr3.TokenRewriteStream(lexer)
421*16467b97STreehugger Robot        tStream.fillBuffer()
422*16467b97STreehugger Robot
423*16467b97STreehugger Robot        return tStream
424*16467b97STreehugger Robot
425*16467b97STreehugger Robot
426*16467b97STreehugger Robot    def testToStringStartStop(self):
427*16467b97STreehugger Robot        # Tokens: 0123456789
428*16467b97STreehugger Robot        # Input:  x = 3 * 0
429*16467b97STreehugger Robot        tokens = self._parse("x = 3 * 0;")
430*16467b97STreehugger Robot        tokens.replace(4, 8, "0") # replace 3 * 0 with 0
431*16467b97STreehugger Robot
432*16467b97STreehugger Robot        result = tokens.toOriginalString()
433*16467b97STreehugger Robot        expecting = "x = 3 * 0;"
434*16467b97STreehugger Robot        self.failUnlessEqual(expecting, result)
435*16467b97STreehugger Robot
436*16467b97STreehugger Robot        result = tokens.toString()
437*16467b97STreehugger Robot        expecting = "x = 0;"
438*16467b97STreehugger Robot        self.failUnlessEqual(expecting, result)
439*16467b97STreehugger Robot
440*16467b97STreehugger Robot        result = tokens.toString(0, 9)
441*16467b97STreehugger Robot        expecting = "x = 0;"
442*16467b97STreehugger Robot        self.failUnlessEqual(expecting, result)
443*16467b97STreehugger Robot
444*16467b97STreehugger Robot        result = tokens.toString(4, 8)
445*16467b97STreehugger Robot        expecting = "0"
446*16467b97STreehugger Robot        self.failUnlessEqual(expecting, result)
447*16467b97STreehugger Robot
448*16467b97STreehugger Robot
449*16467b97STreehugger Robot    def testToStringStartStop2(self):
450*16467b97STreehugger Robot        # Tokens: 012345678901234567
451*16467b97STreehugger Robot        # Input:  x = 3 * 0 + 2 * 0
452*16467b97STreehugger Robot        tokens = self._parse("x = 3 * 0 + 2 * 0;")
453*16467b97STreehugger Robot
454*16467b97STreehugger Robot        result = tokens.toOriginalString()
455*16467b97STreehugger Robot        expecting = "x = 3 * 0 + 2 * 0;"
456*16467b97STreehugger Robot        self.failUnlessEqual(expecting, result)
457*16467b97STreehugger Robot
458*16467b97STreehugger Robot        tokens.replace(4, 8, "0") # replace 3 * 0 with 0
459*16467b97STreehugger Robot        result = tokens.toString()
460*16467b97STreehugger Robot        expecting = "x = 0 + 2 * 0;"
461*16467b97STreehugger Robot        self.failUnlessEqual(expecting, result)
462*16467b97STreehugger Robot
463*16467b97STreehugger Robot        result = tokens.toString(0, 17)
464*16467b97STreehugger Robot        expecting = "x = 0 + 2 * 0;"
465*16467b97STreehugger Robot        self.failUnlessEqual(expecting, result)
466*16467b97STreehugger Robot
467*16467b97STreehugger Robot        result = tokens.toString(4, 8)
468*16467b97STreehugger Robot        expecting = "0"
469*16467b97STreehugger Robot        self.failUnlessEqual(expecting, result)
470*16467b97STreehugger Robot
471*16467b97STreehugger Robot        result = tokens.toString(0, 8)
472*16467b97STreehugger Robot        expecting = "x = 0"
473*16467b97STreehugger Robot        self.failUnlessEqual(expecting, result)
474*16467b97STreehugger Robot
475*16467b97STreehugger Robot        result = tokens.toString(12, 16)
476*16467b97STreehugger Robot        expecting = "2 * 0"
477*16467b97STreehugger Robot        self.failUnlessEqual(expecting, result)
478*16467b97STreehugger Robot
479*16467b97STreehugger Robot        tokens.insertAfter(17, "// comment")
480*16467b97STreehugger Robot        result = tokens.toString(12, 18)
481*16467b97STreehugger Robot        expecting = "2 * 0;// comment"
482*16467b97STreehugger Robot        self.failUnlessEqual(expecting, result)
483*16467b97STreehugger Robot
484*16467b97STreehugger Robot        result = tokens.toString(0, 8) # try again after insert at end
485*16467b97STreehugger Robot        expecting = "x = 0"
486*16467b97STreehugger Robot        self.failUnlessEqual(expecting, result)
487*16467b97STreehugger Robot
488*16467b97STreehugger Robot
489*16467b97STreehugger Robotif __name__ == '__main__':
490*16467b97STreehugger Robot    unittest.main()
491