1 package 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 }