1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverpackage org.antlr.runtime.test {
2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	import flexunit.framework.TestCase;
3324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	
4324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	import org.antlr.runtime.ANTLRStringStream;
5324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	import org.antlr.runtime.CharStream;
6324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	import org.antlr.runtime.CharStreamConstants;
7324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	
8324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	public class TestANTLRStringStream extends TestCase {
9324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		
10324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		public function TestANTLRStringStream()	{
11324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			super();
12324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		}
13324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		
14324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		public function testConsume():void {
15324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			var stream:CharStream = new ANTLRStringStream("abc");
16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			assertEquals(stream.size, 3);
17324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			assertEquals(stream.charPositionInLine, 0);
18324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			assertEquals(stream.line, 1);
19324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			assertEquals(stream.index, 0);
20324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			
21324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			for (var i:int = 0; i < stream.size; i++) {
22324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				stream.consume();
23324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				
24324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				assertEquals(stream.size, 3); // invariant
25324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				assertEquals(stream.charPositionInLine, i + 1);  
26324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				assertEquals(stream.line, 1); // invariant
27324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				assertEquals(stream.index, i + 1);
28324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			}
29324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			
30324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			// now consume past EOF for a few ticks, nothing should change
31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			for (i = 0; i < 5; i++) {
32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				stream.consume();
33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				
34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				assertEquals(stream.size, 3); // invariant
35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				assertEquals(stream.charPositionInLine, 3);  
36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				assertEquals(stream.line, 1); // invariant
37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				assertEquals(stream.index, 3);
38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			}
39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				
40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		}
41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		
42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		public function testLA():void {
43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			var stream:CharStream = new ANTLRStringStream("abc");
44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			assertEquals(stream.LA(-1), CharStreamConstants.EOF);  // should be EOF
45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			assertEquals(stream.LA(0), 0); // should be 0 (undefined)
46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			assertEquals(stream.LA(1), "a".charCodeAt(0));
47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			assertEquals(stream.LA(2), "b".charCodeAt(0));
48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			assertEquals(stream.LA(3), "c".charCodeAt(0));
49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			assertEquals(stream.LA(4), CharStreamConstants.EOF);
50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			
51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			// now consume() one byte and run some more tests.
52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			stream.consume();
53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			assertEquals(stream.LA(-2), CharStreamConstants.EOF);
54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			assertEquals(stream.LA(-1), "a".charCodeAt(0));
55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			assertEquals(stream.LA(0), 0); // should be 0 (undefined)
56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			assertEquals(stream.LA(1), "b".charCodeAt(0));
57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			assertEquals(stream.LA(2), "c".charCodeAt(0));
58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			assertEquals(stream.LA(3), CharStreamConstants.EOF);
59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		}
60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		
61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		public function testReset():void {
62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			var stream:ANTLRStringStream = new ANTLRStringStream("abc");
63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			assertEquals(stream.size, 3);
64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			assertEquals(stream.charPositionInLine, 0);
65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			assertEquals(stream.line, 1);
66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			assertEquals(stream.index, 0);
67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			
68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			stream.consume();
69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			stream.consume();
70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			
71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			assertEquals(stream.size, 3);
72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			assertEquals(stream.charPositionInLine, 2);
73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			assertEquals(stream.line, 1);
74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			assertEquals(stream.index, 2);
75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			
76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			stream.reset();
77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			
78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			assertEquals(stream.size, 3);
79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			assertEquals(stream.charPositionInLine, 0);
80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			assertEquals(stream.line, 1);
81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			assertEquals(stream.index, 0);
82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			
83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		}
84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		
85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		public function testMark():void {
86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			var stream:ANTLRStringStream = new ANTLRStringStream("a\nbc");
87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			
88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			// setup a couple of markers
89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			var mark1:int = stream.mark();
90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			stream.consume();
91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			stream.consume();
92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			var mark2:int = stream.mark();
93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			stream.consume();
94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			
95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			// make sure we are where we expect to be
96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			assertEquals(stream.charPositionInLine, 1);
97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			assertEquals(stream.line, 2);
98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			assertEquals(stream.index, 3);
99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			
100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			assertEquals(mark1, 1);
101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			assertTrue(mark1 != mark2);
102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			
103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			stream.rewindTo(mark2);
104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			assertEquals(stream.charPositionInLine, 0);
105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			assertEquals(stream.line, 2);
106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			assertEquals(stream.index, 2);
107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			
108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			stream.rewindTo(mark1);
109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			assertEquals(stream.index, 0);
110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			assertEquals(stream.charPositionInLine, 0);
111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			assertEquals(stream.line, 1);
112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			
113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			// test two-level rewind
114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			mark1 = stream.mark();
115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			stream.consume();
116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			stream.consume();
117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			stream.mark();
118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			stream.consume();
119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			
120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			// make sure we are where we expect to be
121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			assertEquals(stream.charPositionInLine, 1);
122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			assertEquals(stream.line, 2);
123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			assertEquals(stream.index, 3);
124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			
125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			stream.rewindTo(mark1);
126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			assertEquals(stream.index, 0);
127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			assertEquals(stream.charPositionInLine, 0);
128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			assertEquals(stream.line, 1);	
129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		}
130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}