package de.skuzzle.polly.test.core.parser; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStreamReader; import junit.framework.Assert; import org.junit.Test; import de.skuzzle.polly.core.parser.PushbackReader; public class PushbackReaderTest { private PushbackReader obtain(String input) { return new PushbackReader(new InputStreamReader( new ByteArrayInputStream(input.getBytes()))); } @Test public void testReader1() throws IOException { final String input = "abc"; final PushbackReader reader = this.obtain(input); Assert.assertEquals(0, reader.getPosition()); Assert.assertEquals('a', reader.read()); Assert.assertEquals(1, reader.getPosition()); Assert.assertEquals('b', reader.read()); Assert.assertEquals(2, reader.getPosition()); Assert.assertEquals('c', reader.read()); Assert.assertEquals(3, reader.getPosition()); Assert.assertEquals(-1, reader.read()); Assert.assertTrue(reader.eos()); Assert.assertEquals(-1, reader.read()); Assert.assertEquals(3, reader.getPosition()); Assert.assertTrue(reader.eos()); } @Test public void testReader2() throws IOException { final String input = "abc"; final PushbackReader reader = this.obtain(input); Assert.assertEquals('a', reader.read()); Assert.assertEquals(1, reader.getPosition()); reader.pushback('a'); Assert.assertEquals(0, reader.getPosition()); Assert.assertEquals('a', reader.read()); Assert.assertEquals(1, reader.getPosition()); Assert.assertEquals('b', reader.read()); Assert.assertEquals('c', reader.read()); Assert.assertEquals(-1, reader.read()); Assert.assertEquals(3, reader.getPosition()); } @Test public void testReader3() throws IOException { final String input = "abc"; final PushbackReader reader = this.obtain(input); reader.pushbackInvisible('d'); Assert.assertEquals(0, reader.getPosition()); Assert.assertEquals('d', reader.read()); Assert.assertEquals(0, reader.getPosition()); Assert.assertEquals('a', reader.read()); Assert.assertEquals(1, reader.getPosition()); Assert.assertEquals('b', reader.read()); Assert.assertEquals(2, reader.getPosition()); } @Test public void testReader4() throws IOException { final String input = "abc"; final PushbackReader reader = this.obtain(input); reader.pushbackInvisible('d'); reader.pushbackInvisible('e'); Assert.assertEquals(0, reader.getPosition()); Assert.assertEquals('d', reader.read()); Assert.assertEquals(0, reader.getPosition()); Assert.assertEquals('e', reader.read()); Assert.assertEquals(0, reader.getPosition()); Assert.assertEquals('a', reader.read()); Assert.assertEquals(1, reader.getPosition()); Assert.assertEquals('b', reader.read()); Assert.assertEquals(2, reader.getPosition()); } @Test public void testReader5() throws IOException { final String input = "abc"; final PushbackReader reader = this.obtain(input); Assert.assertEquals('a', reader.read()); Assert.assertEquals('b', reader.read()); Assert.assertEquals('c', reader.read()); Assert.assertEquals(-1, reader.read()); Assert.assertTrue(reader.eos()); reader.pushbackInvisible('d'); Assert.assertFalse(reader.eos()); Assert.assertEquals(3, reader.getPosition()); } @Test public void testReader8() throws IOException { final String input = "a"; final PushbackReader reader = this.obtain(input); reader.read(); reader.read(); Assert.assertTrue(reader.eos()); reader.pushbackInvisible('a'); Assert.assertFalse(reader.eos()); Assert.assertEquals('a', reader.read()); Assert.assertEquals(-1, reader.read()); Assert.assertTrue(reader.eos()); } @Test public void testReader9() throws IOException { final String input = "a"; final PushbackReader reader = this.obtain(input); reader.pushbackInvisible('b'); reader.read(); reader.read(); reader.read(); Assert.assertTrue(reader.eos()); } @Test public void testReader10() throws IOException { final String input = ""; final PushbackReader reader = this.obtain(input); Assert.assertEquals(-1, reader.read()); Assert.assertTrue(reader.eos()); } @Test public void testReader11() throws IOException { final String input = ""; final PushbackReader reader = this.obtain(input); reader.pushbackInvisible('a'); Assert.assertEquals('a', reader.read()); Assert.assertEquals(-1, reader.read()); Assert.assertTrue(reader.eos()); } @Test public void testReader12() throws IOException { final String input = "a\nb\rc"; final PushbackReader reader = this.obtain(input); Assert.assertEquals(0, reader.getLineNumber()); Assert.assertEquals(0, reader.getCol()); Assert.assertEquals('a', reader.read()); Assert.assertEquals(1, reader.getCol()); Assert.assertEquals('\n', reader.read()); Assert.assertEquals(1, reader.getLineNumber()); Assert.assertEquals(0, reader.getCol()); Assert.assertEquals(1, reader.getCols(0)); Assert.assertEquals('b', reader.read()); Assert.assertEquals(1, reader.getCol()); Assert.assertEquals('\n', reader.read()); Assert.assertEquals(2, reader.getLineNumber()); Assert.assertEquals(0, reader.getCol()); Assert.assertEquals(1, reader.getCols(1)); Assert.assertEquals('c', reader.read()); Assert.assertEquals(-1, reader.read()); Assert.assertTrue(reader.eos()); } @Test public void testReader13() throws IOException { final String input = "\n"; final PushbackReader reader = this.obtain(input); int line = reader.getLineNumber(); int col = reader.getCol(); int c = reader.read(); int lineAfter = reader.getLineNumber(); int colAfter = reader.getCol(); reader.pushback(c); Assert.assertEquals(line, reader.getLineNumber()); Assert.assertEquals(col, reader.getCol()); Assert.assertEquals(c, reader.read()); Assert.assertEquals(lineAfter, reader.getLineNumber()); Assert.assertEquals(colAfter, reader.getCol()); Assert.assertEquals(0, reader.getCols(0)); } @Test public void testReader14() throws IOException { final String input = "a\ncd"; final PushbackReader reader = this.obtain(input); reader.pushbackInvisible('b'); Assert.assertEquals(0, reader.getLineNumber()); Assert.assertEquals(0, reader.getCol()); int c = reader.read(); Assert.assertEquals(c, 'b'); Assert.assertEquals(0, reader.getLineNumber()); Assert.assertEquals(0, reader.getCol()); Assert.assertEquals('a', reader.read()); Assert.assertEquals('\n', reader.read()); Assert.assertEquals(1, reader.getLineNumber()); reader.pushbackInvisible('\n'); Assert.assertEquals('\n', reader.read()); Assert.assertEquals(1, reader.getLineNumber()); Assert.assertEquals('c', reader.read()); Assert.assertEquals(1, reader.getLineNumber()); Assert.assertEquals(1, reader.getCol()); Assert.assertEquals('d', reader.read()); Assert.assertEquals(-1, reader.read()); Assert.assertEquals(1, reader.getCols(0)); Assert.assertEquals(2, reader.getCols(1)); } @Test public void testReader15() throws IOException { final String input = "abcd\ncd"; final PushbackReader reader = this.obtain(input); Assert.assertEquals('a', reader.read()); Assert.assertEquals('b', reader.read()); Assert.assertEquals('c', reader.read()); Assert.assertEquals('d', reader.read()); Assert.assertEquals('\n', reader.read()); Assert.assertEquals(1, reader.getLineNumber()); Assert.assertEquals(0, reader.getCol()); reader.pushback('\n'); Assert.assertEquals(0, reader.getLineNumber()); Assert.assertEquals(4, reader.getCol()); } @Test public void testReader16() throws IOException { final String input = "abcd\ncd"; final PushbackReader reader = this.obtain(input); Assert.assertEquals('a', reader.read()); Assert.assertEquals('b', reader.read()); Assert.assertEquals('c', reader.read()); Assert.assertEquals('d', reader.read()); reader.pushback('x'); Assert.assertEquals('x', reader.read()); Assert.assertEquals('\n', reader.read()); Assert.assertEquals(1, reader.getLineNumber()); Assert.assertEquals(0, reader.getCol()); reader.pushback('\n'); Assert.assertEquals(0, reader.getLineNumber()); Assert.assertEquals(4, reader.getCol()); } }