package de.skuzzle.polly.test.core.parser.scanner;
import java.util.Iterator;
import junit.framework.Assert;
import org.junit.Test;
import de.skuzzle.polly.core.parser.AbstractTokenStream;
import de.skuzzle.polly.core.parser.EscapedToken;
import de.skuzzle.polly.core.parser.InputScanner;
import de.skuzzle.polly.core.parser.ParseException;
import de.skuzzle.polly.core.parser.Position;
import de.skuzzle.polly.core.parser.Token;
import de.skuzzle.polly.core.parser.TokenType;
/**
* Test cases that test several basic token scanning functions.
*
* @author Simon Taddiken
*/
public class TestReadTokens extends AbstractScannerTest {
@Test
public void testReadTokens1() throws ParseException {
final String input = "10 abc ";
final AbstractTokenStream scanner = this.obtain(input);
Assert.assertTrue(scanner.lookAhead().matches(TokenType.NUMBER));
Assert.assertTrue(scanner.match(TokenType.NUMBER));
Assert.assertTrue(scanner.match(TokenType.SEPERATOR));
Assert.assertTrue(scanner.lookAhead().matches(TokenType.IDENTIFIER));
scanner.consume();
Assert.assertTrue(scanner.match(TokenType.SEPERATOR));
Assert.assertTrue(scanner.match(TokenType.EOS));
}
@Test
public void testReadTokens2() throws ParseException {
final String input = "10 abc ";
final AbstractTokenStream scanner = this.obtain(input);
Assert.assertTrue(scanner.match(TokenType.NUMBER));
Assert.assertTrue(scanner.match(TokenType.SEPERATOR));
scanner.pushBackFirst(new Token(TokenType.ADD, Position.NONE));
Assert.assertTrue(scanner.match(TokenType.ADD));
Assert.assertTrue(scanner.match(TokenType.IDENTIFIER));
}
@Test
public void testReadTokens3() throws ParseException {
final String input = "10 abc ";
final AbstractTokenStream scanner = this.obtain(input);
Assert.assertTrue(scanner.match(TokenType.NUMBER));
Assert.assertTrue(scanner.match(TokenType.SEPERATOR));
scanner.pushBackFirst(new Token(TokenType.ADD, Position.NONE));
scanner.pushBackFirst(new Token(TokenType.SUB, Position.NONE));
Assert.assertTrue(scanner.match(TokenType.SUB));
Assert.assertTrue(scanner.match(TokenType.ADD));
Assert.assertTrue(scanner.match(TokenType.IDENTIFIER));
}
@Test
public void testReadTokens4() throws ParseException {
final String input = "10 abc ";
final AbstractTokenStream scanner = this.obtain(input);
Assert.assertTrue(scanner.match(TokenType.NUMBER));
Assert.assertTrue(scanner.match(TokenType.SEPERATOR));
scanner.pushBackLast(new Token(TokenType.ADD, Position.NONE));
scanner.pushBackLast(new Token(TokenType.SUB, Position.NONE));
Assert.assertTrue(scanner.match(TokenType.ADD));
Assert.assertTrue(scanner.match(TokenType.SUB));
Assert.assertTrue(scanner.match(TokenType.IDENTIFIER));
}
@Test
public void testReadTokens5() throws ParseException {
final String input = "10 abc ";
final AbstractTokenStream scanner = this.obtain(input);
while (!scanner.match(TokenType.EOS)) {
scanner.consume();
}
scanner.pushBackLast(new Token(TokenType.ADD, Position.NONE));
scanner.pushBackLast(new Token(TokenType.SUB, Position.NONE));
Assert.assertTrue(scanner.match(TokenType.ADD));
Assert.assertTrue(scanner.match(TokenType.SUB));
Assert.assertTrue(scanner.match(TokenType.EOS));
}
@Test
public void testReadTokens6() throws ParseException {
final String input = "10 abc ";
final TokenType[] expected = {TokenType.NUMBER, TokenType.SEPERATOR,
TokenType.IDENTIFIER, TokenType.SEPERATOR, TokenType.EOS };
final AbstractTokenStream scanner = this.obtain(input);
int i = 0;
final Iterator<Token> it = scanner.iterator();
while (it.hasNext()) {
final Token next = it.next();
Assert.assertTrue(next.matches(expected[i++]));
}
}
@Test
public void testReadTokens7() throws ParseException {
final String input = "10 abc #channel%/!!=~;&&& |||== << <= >= >>+~+=-=??!\\(^^^$&|";
final InputScanner scanner = this.obtain(input);
Assert.assertTrue(scanner.match(TokenType.NUMBER));
Assert.assertTrue(scanner.match(TokenType.SEPERATOR));
Assert.assertTrue(scanner.match(TokenType.IDENTIFIER));
Assert.assertTrue(scanner.match(TokenType.SEPERATOR));
Assert.assertTrue(scanner.match(TokenType.CHANNEL));
scanner.setSkipWhiteSpaces(true);
Assert.assertTrue(scanner.match(TokenType.MOD));
Assert.assertTrue(scanner.match(TokenType.DIV));
Assert.assertTrue(scanner.match(TokenType.EXCLAMATION));
Assert.assertTrue(scanner.match(TokenType.NEQ));
Assert.assertTrue(scanner.match(TokenType.WAVE));
Assert.assertTrue(scanner.match(TokenType.SEMICOLON));
Assert.assertTrue(scanner.match(TokenType.BOOLEAN_AND));
Assert.assertTrue(scanner.match(TokenType.INT_AND));
//HACK: and or operator interference
Assert.assertTrue(scanner.match(TokenType.BOOLEAN_OR));
Assert.assertTrue(scanner.match(TokenType.INT_OR));
Assert.assertTrue(scanner.match(TokenType.EQ));
Assert.assertTrue(scanner.match(TokenType.LEFT_SHIFT));
Assert.assertTrue(scanner.match(TokenType.ELT));
Assert.assertTrue(scanner.match(TokenType.EGT));
Assert.assertTrue(scanner.match(TokenType.GT));
Assert.assertTrue(scanner.match(TokenType.GT));
Assert.assertTrue(scanner.match(TokenType.ADDWAVE));
Assert.assertTrue(scanner.match(TokenType.ADDEQUALS));
Assert.assertTrue(scanner.match(TokenType.SUBEQUALS));
Assert.assertTrue(scanner.match(TokenType.QUESTION));
Assert.assertTrue(scanner.match(TokenType.QUEST_EXCALAMTION));
Assert.assertTrue(scanner.match(TokenType.LAMBDA));
Assert.assertTrue(scanner.match(TokenType.XOR));
Assert.assertTrue(scanner.match(TokenType.POWER));
Assert.assertTrue(scanner.match(TokenType.DOLLAR));
Assert.assertTrue(scanner.match(TokenType.AND_OR));
}
@Test
public void testReadTokens8() throws ParseException {
final String input = "=7";
final AbstractTokenStream scanner = this.obtain(input);
Assert.assertTrue(scanner.match(TokenType.ERROR));
}
@Test
public void testReadTokens9() throws ParseException {
final String input = "\\#escaped";
final AbstractTokenStream scanner = this.obtain(input);
final Token la = scanner.consume();
Assert.assertTrue(la.matches(TokenType.ESCAPED));
final EscapedToken escaped = (EscapedToken) la;
Assert.assertTrue(escaped.getEscaped().matches(TokenType.CHANNEL));
}
}