/* * Copyright 2009 Google Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.common.css.compiler.ast; import junit.framework.TestCase; import java.io.IOException; /** * Tests for a more efficient implementation of the CharStream which only * expects to operate on {@code String} object. * * @author dgajda@google.com (Damian Gajda) */ public class StringCharStreamTest extends TestCase { public void testLocation() throws Exception { StringCharStream s = new StringCharStream( "01234\n" + "6789\n" + "bcd"); assertEquals("column", 0, s.getEndColumn()); assertEquals("line", 1, s.getEndLine()); assertEquals("char index", -1, s.getCharIndex()); readCharCheckLocation(s, '0', 1, 1, 0); readCharCheckLocation(s, '1', 1, 2, 1); readCharCheckLocation(s, '2', 1, 3, 2); readCharCheckLocation(s, '3', 1, 4, 3); readCharCheckLocation(s, '4', 1, 5, 4); readCharCheckLocation(s, '\n', 1, 6, 5); readCharCheckLocation(s, '6', 2, 1, 6); readCharCheckLocation(s, '7', 2, 2, 7); readCharCheckLocation(s, '8', 2, 3, 8); readCharCheckLocation(s, '9', 2, 4, 9); readCharCheckLocation(s, '\n', 2, 5, 10); readCharCheckLocation(s, 'b', 3, 1, 11); readCharCheckLocation(s, 'c', 3, 2, 12); readCharCheckLocation(s, 'd', 3, 3, 13); } public void testBackup() throws Exception { StringCharStream s = new StringCharStream( "01234\n" + "6789\n" + "bcd"); readCharCheckLocation(s, '0', 1, 1, 0); readCharCheckLocation(s, '1', 1, 2, 1); readCharCheckLocation(s, '2', 1, 3, 2); s.backup(3); readCharCheckLocation(s, '0', 1, 1, 0); readCharCheckLocation(s, '1', 1, 2, 1); readCharCheckLocation(s, '2', 1, 3, 2); s.backup(2); readCharCheckLocation(s, '1', 1, 2, 1); readCharCheckLocation(s, '2', 1, 3, 2); readCharCheckLocation(s, '3', 1, 4, 3); readCharCheckLocation(s, '4', 1, 5, 4); readCharCheckLocation(s, '\n', 1, 6, 5); readCharCheckLocation(s, '6', 2, 1, 6); readCharCheckLocation(s, '7', 2, 2, 7); s.backup(4); readCharCheckLocation(s, '4', 1, 5, 4); readCharCheckLocation(s, '\n', 1, 6, 5); readCharCheckLocation(s, '6', 2, 1, 6); readCharCheckLocation(s, '7', 2, 2, 7); s.backup(3); readCharCheckLocation(s, '\n', 1, 6, 5); readCharCheckLocation(s, '6', 2, 1, 6); readCharCheckLocation(s, '7', 2, 2, 7); readCharCheckLocation(s, '8', 2, 3, 8); readCharCheckLocation(s, '9', 2, 4, 9); readCharCheckLocation(s, '\n', 2, 5, 10); readCharCheckLocation(s, 'b', 3, 1, 11); readCharCheckLocation(s, 'c', 3, 2, 12); readCharCheckLocation(s, 'd', 3, 3, 13); s.backup(2); readCharCheckLocation(s, 'c', 3, 2, 12); readCharCheckLocation(s, 'd', 3, 3, 13); } public void testConvertCharacterIndex() throws Exception { StringCharStream s = new StringCharStream( "01234\n" + "6789\n" + "bcd"); checkCharacterIndex(s, 1, 1, 0); checkCharacterIndex(s, 1, 2, 1); checkCharacterIndex(s, 1, 3, 2); checkCharacterIndex(s, 1, 4, 3); checkCharacterIndex(s, 1, 5, 4); checkCharacterIndex(s, 1, 6, 5); checkCharacterIndex(s, 2, 1, 6); checkCharacterIndex(s, 2, 2, 7); checkCharacterIndex(s, 2, 3, 8); checkCharacterIndex(s, 2, 4, 9); checkCharacterIndex(s, 2, 5, 10); checkCharacterIndex(s, 3, 1, 11); checkCharacterIndex(s, 3, 2, 12); checkCharacterIndex(s, 3, 3, 13); } public void testGetImageAndGetSuffix() throws Exception { StringCharStream s = new StringCharStream( "01234\n" + "6789\n" + "bcd"); readCharCheckLocation(s, '0', 1, 1, 0); readCharCheckLocation(s, '1', 1, 2, 1); beginTokenCheckLocation(s, '2', 1, 3, 2); readCharCheckLocation(s, '3', 1, 4, 3); readCharCheckLocation(s, '4', 1, 5, 4); readCharCheckLocation(s, '\n', 1, 6, 5); readCharCheckLocation(s, '6', 2, 1, 6); assertEquals("234\n6", s.GetImage()); assertEquals("4\n6", new String(s.GetSuffix(3))); assertEquals("34\n6", new String(s.GetSuffix(4))); s.backup(2); readCharCheckLocation(s, '\n', 1, 6, 5); readCharCheckLocation(s, '6', 2, 1, 6); readCharCheckLocation(s, '7', 2, 2, 7); assertEquals("234\n67", s.GetImage()); beginTokenCheckLocation(s, '8', 2, 3, 8); readCharCheckLocation(s, '9', 2, 4, 9); readCharCheckLocation(s, '\n', 2, 5, 10); assertEquals("89\n", s.GetImage()); assertEquals("89\n", new String(s.GetSuffix(3))); // Try to reach behind the token start! assertEquals("789\n", new String(s.GetSuffix(4))); beginTokenCheckLocation(s, 'b', 3, 1, 11); readCharCheckLocation(s, 'c', 3, 2, 12); readCharCheckLocation(s, 'd', 3, 3, 13); assertEquals("bcd", s.GetImage()); assertEquals("cd", new String(s.GetSuffix(2))); assertEquals("\nbcd", new String(s.GetSuffix(4))); try { s.readChar(); fail(); } catch (IOException e) { // Should thrown an exception, when reaching behind the end of the string. } // Token creation and suffix creation, should be unaffected by trying to // read EOF. assertEquals("bcd", s.GetImage()); assertEquals("cd", new String(s.GetSuffix(2))); assertEquals("\nbcd", new String(s.GetSuffix(4))); } private void checkCharacterIndex(StringCharStream s, int line, int column, int charIndex) { assertEquals("char index", charIndex, s.convertToCharacterIndex(line, column)); } private void readCharCheckLocation( StringCharStream s, char c, int line, int column, int charIndex) throws IOException { assertEquals("char", c, s.readChar()); checkLocation(s, line, column, charIndex); } private void beginTokenCheckLocation( StringCharStream s, char c, int line, int column, int charIndex) throws IOException { assertEquals("char", c, s.BeginToken()); checkLocation(s, line, column, charIndex); assertEquals("begin column", column, s.getBeginColumn()); assertEquals("begin line", line, s.getBeginLine()); assertEquals("char index", charIndex, s.getCharIndex()); assertEquals("token start", charIndex, s.getTokenStart()); } private void checkLocation( StringCharStream s, int line, int column, int charIndex) { assertEquals("column", column, s.getEndColumn()); assertEquals("line", line, s.getEndLine()); assertEquals("char index", charIndex, s.getCharIndex()); } }