1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver"""Testsuite for TokenRewriteStream class."""
2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# don't care about docstrings
4324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# pylint: disable-msg=C0111
5324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
6324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport unittest
7324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport antlr3
8324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport testbase
9324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
10324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass T1(testbase.ANTLRTest):
11324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def setUp(self):
12324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.compileGrammar()
13324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
14324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
15324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def _parse(self, input):
16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        cStream = antlr3.StringStream(input)
17324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        lexer = self.getLexer(cStream)
18324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tStream = antlr3.TokenRewriteStream(lexer)
19324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tStream.fillBuffer()
20324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
21324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        return tStream
22324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
23324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
24324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testInsertBeforeIndex0(self):
25324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens = self._parse("abc")
26324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens.insertBefore(0, "0")
27324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
28324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        result = tokens.toString()
29324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        expecting = "0abc"
30324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(result, expecting)
31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testInsertAfterLastIndex(self):
34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens = self._parse("abc")
35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens.insertAfter(2, "x")
36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        result = tokens.toString()
38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        expecting = "abcx"
39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(result, expecting)
40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def test2InsertBeforeAfterMiddleIndex(self):
43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens = self._parse("abc")
44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens.insertBefore(1, "x")
45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens.insertAfter(1, "x")
46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        result = tokens.toString()
48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        expecting = "axbxc"
49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(result, expecting)
50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testReplaceIndex0(self):
53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens = self._parse("abc")
54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens.replace(0, "x")
55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        result = tokens.toString()
57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        expecting = "xbc"
58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(result, expecting)
59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testReplaceLastIndex(self):
62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens = self._parse("abc")
63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens.replace(2, "x")
64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        result = tokens.toString()
66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        expecting = "abx"
67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(result, expecting)
68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testReplaceMiddleIndex(self):
71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens = self._parse("abc")
72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens.replace(1, "x")
73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        result = tokens.toString()
75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        expecting = "axc"
76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(result, expecting)
77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def test2ReplaceMiddleIndex(self):
80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens = self._parse("abc")
81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens.replace(1, "x")
82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens.replace(1, "y")
83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        result = tokens.toString()
85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        expecting = "ayc"
86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(result, expecting)
87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def test2ReplaceMiddleIndex1InsertBefore(self):
90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens = self._parse("abc")
91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens.insertBefore(0, "_")
92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens.replace(1, "x")
93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens.replace(1, "y")
94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        result = tokens.toString()
96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        expecting = "_ayc"
97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(expecting, result)
98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testReplaceThenDeleteMiddleIndex(self):
101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens = self._parse("abc")
102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens.replace(1, "x")
103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens.delete(1)
104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        result = tokens.toString()
106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        expecting = "ac"
107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(result, expecting)
108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testInsertInPriorReplace(self):
111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens = self._parse("abc")
112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens.replace(0, 2, "x")
113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens.insertBefore(1, "0")
114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        try:
115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            tokens.toString()
116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            self.fail()
117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        except ValueError, exc:
118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            self.failUnlessEqual(
119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                str(exc),
120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                "insert op <InsertBeforeOp@1:\"0\"> within boundaries of "
121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                "previous <ReplaceOp@0..2:\"x\">"
122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                )
123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testInsertThenReplaceSameIndex(self):
125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens = self._parse("abc")
126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens.insertBefore(0, "0")
127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens.replace(0, "x")  # supercedes insert at 0
128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        result = tokens.toString()
130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        expecting = "0xbc"
131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(result, expecting)
132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def test2InsertMiddleIndex(self):
135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens = self._parse("abc")
136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens.insertBefore(1, "x")
137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens.insertBefore(1, "y")
138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        result = tokens.toString()
140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        expecting = "ayxbc"
141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(result, expecting)
142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def test2InsertThenReplaceIndex0(self):
145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens = self._parse("abc")
146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens.insertBefore(0, "x")
147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens.insertBefore(0, "y")
148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens.replace(0, "z")
149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        result = tokens.toString()
151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        expecting = "yxzbc"
152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(result, expecting)
153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testReplaceThenInsertBeforeLastIndex(self):
156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens = self._parse("abc")
157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens.replace(2, "x")
158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens.insertBefore(2, "y")
159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        result = tokens.toString()
161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        expecting = "abyx"
162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(result, expecting)
163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testInsertThenReplaceLastIndex(self):
166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens = self._parse("abc")
167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens.insertBefore(2, "y")
168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens.replace(2, "x")
169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        result = tokens.toString()
171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        expecting = "abyx"
172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(result, expecting)
173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testReplaceThenInsertAfterLastIndex(self):
176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens = self._parse("abc")
177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens.replace(2, "x")
178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens.insertAfter(2, "y")
179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        result = tokens.toString()
181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        expecting = "abxy"
182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(result, expecting)
183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testReplaceRangeThenInsertAtLeftEdge(self):
186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens = self._parse("abcccba")
187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens.replace(2, 4, "x")
188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens.insertBefore(2, "y")
189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        result = tokens.toString()
191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        expecting = "abyxba"
192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(result, expecting)
193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testReplaceRangeThenInsertAtRightEdge(self):
196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens = self._parse("abcccba")
197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens.replace(2, 4, "x")
198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens.insertBefore(4, "y") # no effect; within range of a replace
199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        try:
201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            tokens.toString()
202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            self.fail()
203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        except ValueError, exc:
204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            self.failUnlessEqual(
205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                str(exc),
206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                "insert op <InsertBeforeOp@4:\"y\"> within boundaries of "
207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                "previous <ReplaceOp@2..4:\"x\">")
208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testReplaceRangeThenInsertAfterRightEdge(self):
211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens = self._parse("abcccba")
212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens.replace(2, 4, "x")
213324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens.insertAfter(4, "y")
214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
215324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        result = tokens.toString()
216324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        expecting = "abxyba"
217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(result, expecting)
218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
220324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testReplaceAll(self):
221324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens = self._parse("abcccba")
222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens.replace(0, 6, "x")
223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        result = tokens.toString()
225324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        expecting = "x"
226324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(result, expecting)
227324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
228324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
229324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testReplaceSubsetThenFetch(self):
230324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens = self._parse("abcccba")
231324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens.replace(2, 4, "xyz")
232324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
233324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        result = tokens.toString(0, 6)
234324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        expecting = "abxyzba"
235324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(result, expecting)
236324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
237324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
238324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testReplaceThenReplaceSuperset(self):
239324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens = self._parse("abcccba")
240324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens.replace(2, 4, "xyz")
241324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens.replace(3, 5, "foo") # overlaps, error
242324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
243324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        try:
244324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            tokens.toString()
245324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            self.fail()
246324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        except ValueError, exc:
247324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            self.failUnlessEqual(
248324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                str(exc),
249324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                "replace op boundaries of <ReplaceOp@3..5:\"foo\"> overlap "
250324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                "with previous <ReplaceOp@2..4:\"xyz\">")
251324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
252324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
253324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testReplaceThenReplaceLowerIndexedSuperset(self):
254324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens = self._parse("abcccba")
255324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens.replace(2, 4, "xyz")
256324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens.replace(1, 3, "foo") # overlap, error
257324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
258324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        try:
259324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            tokens.toString()
260324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            self.fail()
261324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        except ValueError, exc:
262324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            self.failUnlessEqual(
263324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                str(exc),
264324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                "replace op boundaries of <ReplaceOp@1..3:\"foo\"> overlap "
265324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                "with previous <ReplaceOp@2..4:\"xyz\">")
266324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
267324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
268324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testReplaceSingleMiddleThenOverlappingSuperset(self):
269324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens = self._parse("abcba")
270324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens.replace(2, 2, "xyz")
271324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens.replace(0, 3, "foo")
272324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
273324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        result = tokens.toString()
274324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        expecting = "fooa"
275324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(result, expecting)
276324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
277324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
278324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testCombineInserts(self):
279324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens = self._parse("abc")
280324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens.insertBefore(0, "x")
281324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens.insertBefore(0, "y")
282324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        result = tokens.toString()
283324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        expecting = "yxabc"
284324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(expecting, result)
285324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
286324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
287324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testCombine3Inserts(self):
288324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens = self._parse("abc")
289324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens.insertBefore(1, "x")
290324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens.insertBefore(0, "y")
291324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens.insertBefore(1, "z")
292324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        result = tokens.toString()
293324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        expecting = "yazxbc"
294324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(expecting, result)
295324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
296324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
297324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testCombineInsertOnLeftWithReplace(self):
298324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens = self._parse("abc")
299324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens.replace(0, 2, "foo")
300324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens.insertBefore(0, "z") # combine with left edge of rewrite
301324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        result = tokens.toString()
302324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        expecting = "zfoo"
303324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(expecting, result)
304324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
305324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
306324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testCombineInsertOnLeftWithDelete(self):
307324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens = self._parse("abc")
308324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens.delete(0, 2)
309324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens.insertBefore(0, "z") # combine with left edge of rewrite
310324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        result = tokens.toString()
311324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        expecting = "z" # make sure combo is not znull
312324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(expecting, result)
313324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
314324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
315324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testDisjointInserts(self):
316324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens = self._parse("abc")
317324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens.insertBefore(1, "x")
318324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens.insertBefore(2, "y")
319324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens.insertBefore(0, "z")
320324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        result = tokens.toString()
321324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        expecting = "zaxbyc"
322324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(expecting, result)
323324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
324324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
325324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testOverlappingReplace(self):
326324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens = self._parse("abcc")
327324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens.replace(1, 2, "foo")
328324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens.replace(0, 3, "bar") # wipes prior nested replace
329324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        result = tokens.toString()
330324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        expecting = "bar"
331324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(expecting, result)
332324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
333324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
334324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testOverlappingReplace2(self):
335324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens = self._parse("abcc")
336324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens.replace(0, 3, "bar")
337324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens.replace(1, 2, "foo") # cannot split earlier replace
338324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
339324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        try:
340324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            tokens.toString()
341324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            self.fail()
342324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        except ValueError, exc:
343324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            self.failUnlessEqual(
344324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                str(exc),
345324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                "replace op boundaries of <ReplaceOp@1..2:\"foo\"> overlap "
346324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                "with previous <ReplaceOp@0..3:\"bar\">")
347324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
348324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
349324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testOverlappingReplace3(self):
350324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens = self._parse("abcc")
351324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens.replace(1, 2, "foo")
352324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens.replace(0, 2, "bar") # wipes prior nested replace
353324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        result = tokens.toString()
354324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        expecting = "barc"
355324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(expecting, result)
356324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
357324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
358324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testOverlappingReplace4(self):
359324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens = self._parse("abcc")
360324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens.replace(1, 2, "foo")
361324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens.replace(1, 3, "bar") # wipes prior nested replace
362324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        result = tokens.toString()
363324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        expecting = "abar"
364324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(expecting, result)
365324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
366324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
367324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testDropIdenticalReplace(self):
368324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens = self._parse("abcc")
369324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens.replace(1, 2, "foo")
370324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens.replace(1, 2, "foo") # drop previous, identical
371324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        result = tokens.toString()
372324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        expecting = "afooc"
373324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(expecting, result)
374324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
375324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
376324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testDropPrevCoveredInsert(self):
377324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens = self._parse("abc")
378324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens.insertBefore(1, "foo")
379324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens.replace(1, 2, "foo") # kill prev insert
380324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        result = tokens.toString()
381324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        expecting = "afoofoo"
382324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(expecting, result)
383324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
384324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
385324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testLeaveAloneDisjointInsert(self):
386324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens = self._parse("abcc")
387324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens.insertBefore(1, "x")
388324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens.replace(2, 3, "foo")
389324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        result = tokens.toString()
390324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        expecting = "axbfoo"
391324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(expecting, result)
392324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
393324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
394324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testLeaveAloneDisjointInsert2(self):
395324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens = self._parse("abcc")
396324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens.replace(2, 3, "foo")
397324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens.insertBefore(1, "x")
398324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        result = tokens.toString()
399324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        expecting = "axbfoo"
400324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(expecting, result)
401324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
402324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
403324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testInsertBeforeTokenThenDeleteThatToken(self):
404324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens = self._parse("abc")
405324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens.insertBefore(2, "y")
406324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens.delete(2)
407324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        result = tokens.toString()
408324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        expecting = "aby"
409324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(expecting, result)
410324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
411324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
412324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass T2(testbase.ANTLRTest):
413324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def setUp(self):
414324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.compileGrammar('t048rewrite2.g')
415324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
416324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
417324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def _parse(self, input):
418324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        cStream = antlr3.StringStream(input)
419324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        lexer = self.getLexer(cStream)
420324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tStream = antlr3.TokenRewriteStream(lexer)
421324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tStream.fillBuffer()
422324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
423324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        return tStream
424324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
425324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
426324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testToStringStartStop(self):
427324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # Tokens: 0123456789
428324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # Input:  x = 3 * 0
429324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens = self._parse("x = 3 * 0;")
430324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens.replace(4, 8, "0") # replace 3 * 0 with 0
431324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
432324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        result = tokens.toOriginalString()
433324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        expecting = "x = 3 * 0;"
434324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(expecting, result)
435324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
436324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        result = tokens.toString()
437324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        expecting = "x = 0;"
438324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(expecting, result)
439324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
440324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        result = tokens.toString(0, 9)
441324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        expecting = "x = 0;"
442324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(expecting, result)
443324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
444324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        result = tokens.toString(4, 8)
445324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        expecting = "0"
446324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(expecting, result)
447324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
448324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
449324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testToStringStartStop2(self):
450324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # Tokens: 012345678901234567
451324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # Input:  x = 3 * 0 + 2 * 0
452324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens = self._parse("x = 3 * 0 + 2 * 0;")
453324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
454324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        result = tokens.toOriginalString()
455324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        expecting = "x = 3 * 0 + 2 * 0;"
456324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(expecting, result)
457324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
458324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens.replace(4, 8, "0") # replace 3 * 0 with 0
459324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        result = tokens.toString()
460324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        expecting = "x = 0 + 2 * 0;"
461324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(expecting, result)
462324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
463324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        result = tokens.toString(0, 17)
464324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        expecting = "x = 0 + 2 * 0;"
465324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(expecting, result)
466324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
467324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        result = tokens.toString(4, 8)
468324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        expecting = "0"
469324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(expecting, result)
470324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
471324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        result = tokens.toString(0, 8)
472324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        expecting = "x = 0"
473324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(expecting, result)
474324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
475324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        result = tokens.toString(12, 16)
476324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        expecting = "2 * 0"
477324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(expecting, result)
478324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
479324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens.insertAfter(17, "// comment")
480324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        result = tokens.toString(12, 18)
481324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        expecting = "2 * 0;// comment"
482324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(expecting, result)
483324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
484324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        result = tokens.toString(0, 8) # try again after insert at end
485324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        expecting = "x = 0"
486324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(expecting, result)
487324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
488324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
489324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverif __name__ == '__main__':
490324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    unittest.main()
491