TestANTLRStringStream.as revision 324c4644fee44b9898524c09511bd33c3f12e2df
1package org.antlr.runtime.test {
2	import flexunit.framework.TestCase;
3	
4	import org.antlr.runtime.ANTLRStringStream;
5	import org.antlr.runtime.CharStream;
6	import org.antlr.runtime.CharStreamConstants;
7	
8	public class TestANTLRStringStream extends TestCase {
9		
10		public function TestANTLRStringStream()	{
11			super();
12		}
13		
14		public function testConsume():void {
15			var stream:CharStream = new ANTLRStringStream("abc");
16			assertEquals(stream.size, 3);
17			assertEquals(stream.charPositionInLine, 0);
18			assertEquals(stream.line, 1);
19			assertEquals(stream.index, 0);
20			
21			for (var i:int = 0; i < stream.size; i++) {
22				stream.consume();
23				
24				assertEquals(stream.size, 3); // invariant
25				assertEquals(stream.charPositionInLine, i + 1);  
26				assertEquals(stream.line, 1); // invariant
27				assertEquals(stream.index, i + 1);
28			}
29			
30			// now consume past EOF for a few ticks, nothing should change
31			for (i = 0; i < 5; i++) {
32				stream.consume();
33				
34				assertEquals(stream.size, 3); // invariant
35				assertEquals(stream.charPositionInLine, 3);  
36				assertEquals(stream.line, 1); // invariant
37				assertEquals(stream.index, 3);
38			}
39				
40		}
41		
42		public function testLA():void {
43			var stream:CharStream = new ANTLRStringStream("abc");
44			assertEquals(stream.LA(-1), CharStreamConstants.EOF);  // should be EOF
45			assertEquals(stream.LA(0), 0); // should be 0 (undefined)
46			assertEquals(stream.LA(1), "a".charCodeAt(0));
47			assertEquals(stream.LA(2), "b".charCodeAt(0));
48			assertEquals(stream.LA(3), "c".charCodeAt(0));
49			assertEquals(stream.LA(4), CharStreamConstants.EOF);
50			
51			// now consume() one byte and run some more tests.
52			stream.consume();
53			assertEquals(stream.LA(-2), CharStreamConstants.EOF);
54			assertEquals(stream.LA(-1), "a".charCodeAt(0));
55			assertEquals(stream.LA(0), 0); // should be 0 (undefined)
56			assertEquals(stream.LA(1), "b".charCodeAt(0));
57			assertEquals(stream.LA(2), "c".charCodeAt(0));
58			assertEquals(stream.LA(3), CharStreamConstants.EOF);
59		}
60		
61		public function testReset():void {
62			var stream:ANTLRStringStream = new ANTLRStringStream("abc");
63			assertEquals(stream.size, 3);
64			assertEquals(stream.charPositionInLine, 0);
65			assertEquals(stream.line, 1);
66			assertEquals(stream.index, 0);
67			
68			stream.consume();
69			stream.consume();
70			
71			assertEquals(stream.size, 3);
72			assertEquals(stream.charPositionInLine, 2);
73			assertEquals(stream.line, 1);
74			assertEquals(stream.index, 2);
75			
76			stream.reset();
77			
78			assertEquals(stream.size, 3);
79			assertEquals(stream.charPositionInLine, 0);
80			assertEquals(stream.line, 1);
81			assertEquals(stream.index, 0);
82			
83		}
84		
85		public function testMark():void {
86			var stream:ANTLRStringStream = new ANTLRStringStream("a\nbc");
87			
88			// setup a couple of markers
89			var mark1:int = stream.mark();
90			stream.consume();
91			stream.consume();
92			var mark2:int = stream.mark();
93			stream.consume();
94			
95			// make sure we are where we expect to be
96			assertEquals(stream.charPositionInLine, 1);
97			assertEquals(stream.line, 2);
98			assertEquals(stream.index, 3);
99			
100			assertEquals(mark1, 1);
101			assertTrue(mark1 != mark2);
102			
103			stream.rewindTo(mark2);
104			assertEquals(stream.charPositionInLine, 0);
105			assertEquals(stream.line, 2);
106			assertEquals(stream.index, 2);
107			
108			stream.rewindTo(mark1);
109			assertEquals(stream.index, 0);
110			assertEquals(stream.charPositionInLine, 0);
111			assertEquals(stream.line, 1);
112			
113			// test two-level rewind
114			mark1 = stream.mark();
115			stream.consume();
116			stream.consume();
117			stream.mark();
118			stream.consume();
119			
120			// make sure we are where we expect to be
121			assertEquals(stream.charPositionInLine, 1);
122			assertEquals(stream.line, 2);
123			assertEquals(stream.index, 3);
124			
125			stream.rewindTo(mark1);
126			assertEquals(stream.index, 0);
127			assertEquals(stream.charPositionInLine, 0);
128			assertEquals(stream.line, 1);	
129		}
130	}
131}