package bluej.parser;
import java.io.StringReader;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import bluej.parser.lexer.JavaTokenFilter;
import bluej.parser.lexer.JavaTokenTypes;
import bluej.parser.lexer.LocatableToken;
| Tests for the Java lexer.
|
| @author Davin McCall
|
public class LexerTest
extends junit.framework.TestCase{
private TokenStream getLexerFor(String s)
{
TokenStream lexer = JavaParser.getLexer(new StringReader(s));
return new JavaTokenFilter(lexer, null);
}
private TokenStream getNonfilteringLexerFor(String s)
{
return JavaParser.getLexer(new StringReader(s));
}
public void testKeywordParse()
{
TokenStream ts = getLexerFor("public private protected volatile transient abstract synchronized strictfp static");
LocatableToken token = (LocatableToken) ts.nextToken();
assertTrue(token.getType() == JavaTokenTypes.LITERAL_public);
token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.LITERAL_private, token.getType());
token = (LocatableToken) ts.nextToken();
assertTrue(token.getType() == JavaTokenTypes.LITERAL_protected);
token = (LocatableToken) ts.nextToken();
assertTrue(token.getType() == JavaTokenTypes.LITERAL_volatile);
token = (LocatableToken) ts.nextToken();
assertTrue(token.getType() == JavaTokenTypes.LITERAL_transient);
token = (LocatableToken) ts.nextToken();
assertTrue(token.getType() == JavaTokenTypes.ABSTRACT);
token = (LocatableToken) ts.nextToken();
assertTrue(token.getType() == JavaTokenTypes.LITERAL_synchronized);
token = (LocatableToken) ts.nextToken();
assertTrue(token.getType() == JavaTokenTypes.STRICTFP);
token = (LocatableToken) ts.nextToken();
assertTrue(token.getType() == JavaTokenTypes.LITERAL_static);
token = (LocatableToken) ts.nextToken();
assertTrue(token.getType() == JavaTokenTypes.EOF);
ts = getLexerFor("return import package final");
token = (LocatableToken) ts.nextToken();
assertTrue(token.getType() == JavaTokenTypes.LITERAL_return);
token = (LocatableToken) ts.nextToken();
assertTrue(token.getType() == JavaTokenTypes.LITERAL_import);
token = (LocatableToken) ts.nextToken();
assertTrue(token.getType() == JavaTokenTypes.LITERAL_package);
token = (LocatableToken) ts.nextToken();
assertTrue(token.getType() == JavaTokenTypes.FINAL);
token = (LocatableToken) ts.nextToken();
assertTrue(token.getType() == JavaTokenTypes.EOF);
ts = getLexerFor("class interface enum extends implements");
token = (LocatableToken) ts.nextToken();
assertTrue(token.getType() == JavaTokenTypes.LITERAL_class);
token = (LocatableToken) ts.nextToken();
assertTrue(token.getType() == JavaTokenTypes.LITERAL_interface);
token = (LocatableToken) ts.nextToken();
assertTrue(token.getType() == JavaTokenTypes.LITERAL_enum);
token = (LocatableToken) ts.nextToken();
assertTrue(token.getType() == JavaTokenTypes.LITERAL_extends);
token = (LocatableToken) ts.nextToken();
assertTrue(token.getType() == JavaTokenTypes.LITERAL_implements);
token = (LocatableToken) ts.nextToken();
assertTrue(token.getType() == JavaTokenTypes.EOF);
ts = getLexerFor("short int long float double boolean char void");
token = (LocatableToken) ts.nextToken();
assertTrue(token.getType() == JavaTokenTypes.LITERAL_short);
token = (LocatableToken) ts.nextToken();
assertTrue(token.getType() == JavaTokenTypes.LITERAL_int);
token = (LocatableToken) ts.nextToken();
assertTrue(token.getType() == JavaTokenTypes.LITERAL_long);
token = (LocatableToken) ts.nextToken();
assertTrue(token.getType() == JavaTokenTypes.LITERAL_float);
token = (LocatableToken) ts.nextToken();
assertTrue(token.getType() == JavaTokenTypes.LITERAL_double);
token = (LocatableToken) ts.nextToken();
assertTrue(token.getType() == JavaTokenTypes.LITERAL_boolean);
token = (LocatableToken) ts.nextToken();
assertTrue(token.getType() == JavaTokenTypes.LITERAL_char);
token = (LocatableToken) ts.nextToken();
assertTrue(token.getType() == JavaTokenTypes.LITERAL_void);
token = (LocatableToken) ts.nextToken();
assertTrue(token.getType() == JavaTokenTypes.EOF);
ts = getLexerFor("null true false this super");
token = (LocatableToken) ts.nextToken();
assertTrue(token.getType() == JavaTokenTypes.LITERAL_null);
token = (LocatableToken) ts.nextToken();
assertTrue(token.getType() == JavaTokenTypes.LITERAL_true);
token = (LocatableToken) ts.nextToken();
assertTrue(token.getType() == JavaTokenTypes.LITERAL_false);
token = (LocatableToken) ts.nextToken();
assertTrue(token.getType() == JavaTokenTypes.LITERAL_this);
token = (LocatableToken) ts.nextToken();
assertTrue(token.getType() == JavaTokenTypes.LITERAL_super);
token = (LocatableToken) ts.nextToken();
assertTrue(token.getType() == JavaTokenTypes.EOF);
ts = getLexerFor("try catch throw if while do else switch case break continue");
token = (LocatableToken) ts.nextToken();
assertTrue(token.getType() == JavaTokenTypes.LITERAL_try);
token = (LocatableToken) ts.nextToken();
assertTrue(token.getType() == JavaTokenTypes.LITERAL_catch);
token = (LocatableToken) ts.nextToken();
assertTrue(token.getType() == JavaTokenTypes.LITERAL_throw);
token = (LocatableToken) ts.nextToken();
assertTrue(token.getType() == JavaTokenTypes.LITERAL_if);
token = (LocatableToken) ts.nextToken();
assertTrue(token.getType() == JavaTokenTypes.LITERAL_while);
token = (LocatableToken) ts.nextToken();
assertTrue(token.getType() == JavaTokenTypes.LITERAL_do);
token = (LocatableToken) ts.nextToken();
assertTrue(token.getType() == JavaTokenTypes.LITERAL_else);
token = (LocatableToken) ts.nextToken();
assertTrue(token.getType() == JavaTokenTypes.LITERAL_switch);
token = (LocatableToken) ts.nextToken();
assertTrue(token.getType() == JavaTokenTypes.LITERAL_case);
token = (LocatableToken) ts.nextToken();
assertTrue(token.getType() == JavaTokenTypes.LITERAL_break);
token = (LocatableToken) ts.nextToken();
assertTrue(token.getType() == JavaTokenTypes.LITERAL_continue);
token = (LocatableToken) ts.nextToken();
assertTrue(token.getType() == JavaTokenTypes.EOF);
ts = getLexerFor("goto");
}
public void testSymbols() throws Exception
{
TokenStream ts = getLexerFor("+ - = += -= / * /= *= : :: ! ~ @ % %=");
LocatableToken token = (LocatableToken) ts.nextToken();
assertTrue(token.getType() == JavaTokenTypes.PLUS);
token = (LocatableToken) ts.nextToken();
assertTrue(token.getType() == JavaTokenTypes.MINUS);
token = (LocatableToken) ts.nextToken();
assertTrue(token.getType() == JavaTokenTypes.ASSIGN);
token = (LocatableToken) ts.nextToken();
assertTrue(token.getType() == JavaTokenTypes.PLUS_ASSIGN);
token = (LocatableToken) ts.nextToken();
assertTrue(token.getType() == JavaTokenTypes.MINUS_ASSIGN);
token = (LocatableToken) ts.nextToken();
assertTrue(token.getType() == JavaTokenTypes.DIV);
token = (LocatableToken) ts.nextToken();
assertTrue(token.getType() == JavaTokenTypes.STAR);
token = (LocatableToken) ts.nextToken();
assertTrue(token.getType() == JavaTokenTypes.DIV_ASSIGN);
token = (LocatableToken) ts.nextToken();
assertTrue(token.getType() == JavaTokenTypes.STAR_ASSIGN);
token = (LocatableToken) ts.nextToken();
assertTrue(token.getType() == JavaTokenTypes.COLON);
token = (LocatableToken) ts.nextToken();
assertTrue(token.getType() == JavaTokenTypes.METHOD_REFERENCE);
token = (LocatableToken) ts.nextToken();
assertTrue(token.getType() == JavaTokenTypes.LNOT);
token = (LocatableToken) ts.nextToken();
assertTrue(token.getType() == JavaTokenTypes.BNOT);
token = (LocatableToken) ts.nextToken();
assertTrue(token.getType() == JavaTokenTypes.AT);
token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.MOD, token.getType());
token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.MOD_ASSIGN, token.getType());
token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.EOF, token.getType());
ts = getLexerFor("& | && || &= |= ^ ^= . ...");
token = (LocatableToken) ts.nextToken();
assertTrue(token.getType() == JavaTokenTypes.BAND);
token = (LocatableToken) ts.nextToken();
assertTrue(token.getType() == JavaTokenTypes.BOR);
token = (LocatableToken) ts.nextToken();
assertTrue(token.getType() == JavaTokenTypes.LAND);
token = (LocatableToken) ts.nextToken();
assertTrue(token.getType() == JavaTokenTypes.LOR);
token = (LocatableToken) ts.nextToken();
assertTrue(token.getType() == JavaTokenTypes.BAND_ASSIGN);
token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.BOR_ASSIGN, token.getType());
token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.BXOR, token.getType());
token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.BXOR_ASSIGN, token.getType());
token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.DOT, token.getType());
token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.TRIPLE_DOT, token.getType());
token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.EOF, token.getType());
ts = getLexerFor("<< >> <<= >>= >>> >>>=");
token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.SL, token.getType());
token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.SR, token.getType());
token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.SL_ASSIGN, token.getType());
token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.SR_ASSIGN, token.getType());
token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.BSR, token.getType());
token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.BSR_ASSIGN, token.getType());
ts = getLexerFor("< > <= >= != ==");
token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.LT, token.getType());
token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.GT, token.getType());
token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.LE, token.getType());
token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.GE, token.getType());
token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.NOT_EQUAL, token.getType());
token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.EQUAL, token.getType());
}
public void testSymbols2() throws Exception
{
TokenStream ts = getLexerFor("{([})]");
LocatableToken token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.LCURLY, token.getType());
token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.LPAREN, token.getType());
token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.LBRACK, token.getType());
token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.RCURLY, token.getType());
token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.RPAREN, token.getType());
token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.RBRACK, token.getType());
ts = getLexerFor("+++++-----!!!!~~~~(()){{}}");
token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.INC, token.getType());
token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.INC, token.getType());
token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.PLUS, token.getType());
token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.DEC, token.getType());
token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.DEC, token.getType());
token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.MINUS, token.getType());
token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.LNOT, token.getType());
token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.LNOT, token.getType());
token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.LNOT, token.getType());
token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.LNOT, token.getType());
token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.BNOT, token.getType());
token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.BNOT, token.getType());
token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.BNOT, token.getType());
token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.BNOT, token.getType());
token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.LPAREN, token.getType());
token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.LPAREN, token.getType());
token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.RPAREN, token.getType());
token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.RPAREN, token.getType());
token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.LCURLY, token.getType());
token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.LCURLY, token.getType());
token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.RCURLY, token.getType());
token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.RCURLY, token.getType());
token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.EOF, token.getType());
ts = getLexerFor(" [][] ]); ]).");
token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.LBRACK, token.getType());
token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.RBRACK, token.getType());
token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.LBRACK, token.getType());
token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.RBRACK, token.getType());
token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.RBRACK, token.getType());
token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.RPAREN, token.getType());
token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.SEMI, token.getType());
token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.RBRACK, token.getType());
token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.RPAREN, token.getType());
token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.DOT, token.getType());
ts = getLexerFor(">>, >>>,");
token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.SR, token.getType());
token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.COMMA, token.getType());
token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.BSR, token.getType());
token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.COMMA, token.getType());
token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.EOF, token.getType());
}
public void testIdentifiers() throws Exception
{
TokenStream ts = getLexerFor("_abc abc123 def123kjl98 \\u0396XYZ");
LocatableToken token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.IDENT, token.getType());
assertEquals("_abc", token.getText());
token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.IDENT, token.getType());
assertEquals("abc123", token.getText());
token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.IDENT, token.getType());
assertEquals("def123kjl98", token.getText());
token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.IDENT, token.getType());
assertEquals("\u0396XYZ", token.getText());
}
public void testOther() throws Exception
{
TokenStream ts = getLexerFor("\"a string\" an_identifier99 '\\n' 1234 1234l 0.34 .78 01.2 .56f 5.06d 0x1234");
LocatableToken token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.STRING_LITERAL, token.getType());
token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.IDENT, token.getType());
assertEquals("an_identifier99", token.getText());
token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.CHAR_LITERAL, token.getType());
token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.NUM_INT, token.getType());
token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.NUM_LONG, token.getType());
token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.NUM_DOUBLE, token.getType());
token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.NUM_DOUBLE, token.getType());
token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.NUM_DOUBLE, token.getType());
token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.NUM_FLOAT, token.getType());
token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.NUM_DOUBLE, token.getType());
token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.NUM_INT, token.getType());
token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.EOF, token.getType());
ts = getLexerFor("0x5678l 0x01AF02 0x01AF02l 44.3E6 44.3E6f");
token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.NUM_LONG, token.getType());
token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.NUM_INT, token.getType());
token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.NUM_LONG, token.getType());
token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.NUM_DOUBLE, token.getType());
token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.NUM_FLOAT, token.getType());
token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.EOF, token.getType());
ts = getLexerFor("/120.0f,");
token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.DIV, token.getType());
token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.NUM_FLOAT, token.getType());
token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.COMMA, token.getType());
}
public void testOther2() throws Exception
{
TokenStream ts = getNonfilteringLexerFor("/* multiline */ // single line");
LocatableToken token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.ML_COMMENT, token.getType());
assertEquals("/* multiline */", token.getText());
token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.SL_COMMENT, token.getType());
assertEquals(19, token.getColumn());
assertEquals(1, token.getLine());
assertEquals(33, token.getEndColumn());
assertEquals(1, token.getEndLine());
assertEquals("// single line", token.getText());
ts = getNonfilteringLexerFor("/**test*this***/");
token = (LocatableToken) ts.nextToken();
assertTrue(token.getType() == JavaTokenTypes.ML_COMMENT);
assertEquals("/**test*this***/", token.getText());
ts = getNonfilteringLexerFor("/*test/check*/");
token = (LocatableToken) ts.nextToken();
assertTrue(token.getType() == JavaTokenTypes.ML_COMMENT);
assertEquals("/*test/check*/", token.getText());
ts = getNonfilteringLexerFor("/*test//check*/");
token = (LocatableToken) ts.nextToken();
assertTrue(token.getType() == JavaTokenTypes.ML_COMMENT);
assertEquals("/*test//check*/", token.getText());
ts = getNonfilteringLexerFor("// single line comment\n an_identifier");
token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.SL_COMMENT, token.getType());
assertEquals("// single line comment", token.getText());
token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.IDENT, token.getType());
token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.EOF, token.getType());
ts = getNonfilteringLexerFor("");
token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.EOF, token.getType());
assertEquals(1, token.getColumn());
assertEquals(1, token.getLine());
token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.EOF, token.getType());
assertEquals(1, token.getColumn());
assertEquals(1, token.getLine());
}
public void testOther3() throws Exception
{
TokenStream ts = getLexerFor("\"a \\\"string\"identifier");
LocatableToken token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.STRING_LITERAL, token.getType());
assertEquals("\"a \\\"string\"", token.getText());
assertEquals(1, token.getColumn());
assertEquals(13, token.getEndColumn());
token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.IDENT, token.getType());
assertEquals(13, token.getColumn());
assertEquals("identifier", token.getText());
ts = getLexerFor("\" \\\\nn \\\\\"identifier");
token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.STRING_LITERAL, token.getType());
assertEquals("\" \\\\nn \\\\\"", token.getText());
assertEquals(11, token.getEndColumn());
token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.IDENT, token.getType());
assertEquals(11, token.getColumn());
assertEquals("identifier", token.getText());
ts = getLexerFor("ident1'\\''ident2");
token = (LocatableToken) ts.nextToken();
assertEquals(7, token.getEndColumn());
assertEquals(JavaTokenTypes.IDENT, token.getType());
token = (LocatableToken) ts.nextToken();
assertEquals(7, token.getColumn());
assertEquals(JavaTokenTypes.CHAR_LITERAL, token.getType());
assertEquals(11, token.getEndColumn());
assertEquals("'\\''", token.getText());
token = (LocatableToken) ts.nextToken();
assertEquals(11, token.getColumn());
assertEquals(JavaTokenTypes.IDENT, token.getType());
ts = getLexerFor("ident1'\\\\'ident2");
token = (LocatableToken) ts.nextToken();
assertEquals(7, token.getEndColumn());
assertEquals(JavaTokenTypes.IDENT, token.getType());
token = (LocatableToken) ts.nextToken();
assertEquals(7, token.getColumn());
assertEquals(JavaTokenTypes.CHAR_LITERAL, token.getType());
assertEquals(11, token.getEndColumn());
assertEquals("'\\\\'", token.getText());
token = (LocatableToken) ts.nextToken();
assertEquals(11, token.getColumn());
assertEquals(JavaTokenTypes.IDENT, token.getType());
}
public void testJava7NumLiterals() throws Exception
{
TokenStream ts = getLexerFor("1_000_000 1_000_000_000L 1_2.3_4f 1_2.3_4 1_2e3_4 0x12_34 " +
"0b111011001 0B1100110 0b11_00_11 0B11_11_00 0b11001L");
LocatableToken token = ts.nextToken();
assertEquals(JavaTokenTypes.NUM_INT, token.getType());
token = ts.nextToken();
assertEquals(JavaTokenTypes.NUM_LONG, token.getType());
token = ts.nextToken();
assertEquals(JavaTokenTypes.NUM_FLOAT, token.getType());
token = ts.nextToken();
assertEquals(JavaTokenTypes.NUM_DOUBLE, token.getType());
token = ts.nextToken();
assertEquals(JavaTokenTypes.NUM_DOUBLE, token.getType());
token = ts.nextToken();
assertEquals(JavaTokenTypes.NUM_INT, token.getType());
token = ts.nextToken();
assertEquals(JavaTokenTypes.NUM_INT, token.getType());
token = ts.nextToken();
assertEquals(JavaTokenTypes.NUM_INT, token.getType());
token = ts.nextToken();
assertEquals(JavaTokenTypes.NUM_INT, token.getType());
token = ts.nextToken();
assertEquals(JavaTokenTypes.NUM_INT, token.getType());
token = ts.nextToken();
assertEquals(JavaTokenTypes.NUM_LONG, token.getType());
}
public void testPositionTracking() throws Exception
{
TokenStream ts = getLexerFor("one two three\nfour five six \n seven eight nine");
LocatableToken token = (LocatableToken) ts.nextToken();
assertEquals(1, token.getLine());
assertEquals(1, token.getColumn());
assertEquals(1, token.getEndLine());
assertEquals(4, token.getEndColumn());
token = (LocatableToken) ts.nextToken();
token = (LocatableToken) ts.nextToken();
assertEquals(1, token.getLine());
assertEquals(9, token.getColumn());
assertEquals(1, token.getEndLine());
assertEquals(14, token.getEndColumn());
token = (LocatableToken) ts.nextToken();
assertEquals(2, token.getLine());
assertEquals(1, token.getColumn());
assertEquals(2, token.getEndLine());
assertEquals(5, token.getEndColumn());
token = (LocatableToken) ts.nextToken();
token = (LocatableToken) ts.nextToken();
token = (LocatableToken) ts.nextToken();
assertEquals(3, token.getLine());
assertEquals(3, token.getColumn());
ts = getNonfilteringLexerFor("\n/* This is a multi-line\ncomment\n*/");
token = (LocatableToken) ts.nextToken();
assertEquals(2, token.getLine());
assertEquals(1, token.getColumn());
assertEquals(4, token.getEndLine());
assertEquals(3, token.getEndColumn());
}
public void testPositionTracking2() throws Exception
{
TokenStream ts = getLexerFor("\\u0041ident another");
LocatableToken token = (LocatableToken) ts.nextToken();
assertEquals(1, token.getColumn());
assertEquals(12, token.getEndColumn());
token = (LocatableToken) ts.nextToken();
assertEquals(13, token.getColumn());
assertEquals(20, token.getEndColumn());
ts = getLexerFor("ident\\u0041 another");
token = (LocatableToken) ts.nextToken();
assertEquals(1, token.getColumn());
assertEquals(12, token.getEndColumn());
token = (LocatableToken) ts.nextToken();
assertEquals(13, token.getColumn());
assertEquals(20, token.getEndColumn());
ts = getLexerFor("one\\u0020two");
token = (LocatableToken) ts.nextToken();
assertEquals(4, token.getEndColumn());
token = (LocatableToken) ts.nextToken();
assertEquals(10, token.getColumn());
ts = getLexerFor("one\\u000Atwo");
token = (LocatableToken) ts.nextToken();
token = (LocatableToken) ts.nextToken();
assertEquals(1, token.getLine());
assertEquals(1, token.getEndLine());
assertEquals(10, token.getColumn());
assertEquals(13, token.getEndColumn());
}
public void testPositionTracking3() throws Exception
{
TokenStream ts = getLexerFor("one =");
LocatableToken token = (LocatableToken) ts.nextToken();
assertEquals(1, token.getColumn());
token = (LocatableToken) ts.nextToken();
assertEquals(5, token.getColumn());
token = (LocatableToken) ts.nextToken();
assertEquals(6, token.getColumn());
token = (LocatableToken) ts.nextToken();
assertEquals(6, token.getColumn());
}
public void testPositionTracking4() throws Exception
{
TokenStream ts = getLexerFor("\"somestring\" +\n \"another string\";");
LocatableToken token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.STRING_LITERAL, token.getType());
assertEquals(1, token.getColumn());
assertEquals(1, token.getLine());
assertEquals(13, token.getEndColumn());
assertEquals(1, token.getEndLine());
token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.PLUS, token.getType());
assertEquals(14, token.getColumn());
assertEquals(1, token.getLine());
assertEquals(15, token.getEndColumn());
assertEquals(1, token.getEndLine());
token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.STRING_LITERAL, token.getType());
assertEquals(5, token.getColumn());
assertEquals(2, token.getLine());
assertEquals(21, token.getEndColumn());
assertEquals(2, token.getEndLine());
token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.SEMI, token.getType());
assertEquals(21, token.getColumn());
assertEquals(2, token.getLine());
assertEquals(22, token.getEndColumn());
assertEquals(2, token.getEndLine());
}
public void testPositionTracking5() throws Exception
{
TokenStream ts = getLexerFor("999abcdef");
LocatableToken token = (LocatableToken) ts.nextToken();
if (token.getType() == JavaTokenTypes.INVALID) {
assertEquals(token.getColumn(), 1);
assertEquals(token.getEndColumn(), 10);
}
else {
assertEquals(JavaTokenTypes.NUM_INT, token.getType());
assertEquals(4, token.getEndColumn());
token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.IDENT, token.getType());
assertEquals(4, token.getColumn());
assertEquals(10, token.getEndColumn());
}
token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.EOF, token.getType());
assertEquals(10, token.getColumn());
ts = getLexerFor("999|=");
token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.NUM_INT, token.getType());
assertEquals(4, token.getEndColumn());
token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.BOR_ASSIGN, token.getType());
assertEquals(4, token.getColumn());
ts = getLexerFor(" 999\n {");
token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.NUM_INT, token.getType());
assertEquals(6, token.getEndColumn());
token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.LCURLY, token.getType());
assertEquals(3, token.getColumn());
assertEquals(2, token.getLine());
}
public void testBroken() throws Exception
{
TokenStream ts = getLexerFor("\\");
LocatableToken token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.INVALID, token.getType());
ts = getLexerFor("]\\\n");
token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.RBRACK, token.getType());
assertEquals(1, token.getColumn());
assertEquals(2, token.getEndColumn());
token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.INVALID, token.getType());
assertEquals(2, token.getColumn());
assertEquals(3, token.getEndColumn());
ts = getLexerFor("/* Unterminated comment\n}");
token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.INVALID, token.getType());
assertEquals(1, token.getColumn());
assertEquals(1, token.getLine());
assertEquals(2, token.getEndColumn());
assertEquals(2, token.getEndLine());
token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.EOF, token.getType());
assertEquals(2, token.getColumn());
assertEquals(2, token.getEndLine());
ts = getLexerFor("\\u95 incomplete unicode escape");
token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.INVALID, token.getType());
assertEquals(1, token.getColumn());
assertEquals(5, token.getEndColumn());
token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.IDENT, token.getType());
assertEquals(6, token.getColumn());
ts = getLexerFor(".. incomplete ellipsis");
token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.INVALID, token.getType());
assertEquals(1, token.getColumn());
assertEquals(3, token.getEndColumn());
token = (LocatableToken) ts.nextToken();
assertEquals(4, token.getColumn());
ts = getLexerFor(" 'ab + -\n an_identifier");
token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.INVALID, token.getType());
assertEquals(3, token.getColumn());
assertEquals(10, token.getEndColumn());
assertEquals(1, token.getLine());
assertEquals(1, token.getEndLine());
token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.IDENT, token.getType());
assertEquals(2, token.getColumn());
assertEquals(2, token.getLine());
ts = getLexerFor(" \"ab + -\n an_identifier");
token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.INVALID, token.getType());
assertEquals(3, token.getColumn());
assertEquals(10, token.getEndColumn());
assertEquals(1, token.getLine());
assertEquals(1, token.getEndLine());
token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.IDENT, token.getType());
assertEquals(2, token.getColumn());
assertEquals(2, token.getLine());
}
public void testStressLexer() throws Exception
{
Map<Integer,String> tokenMap = new HashMap<Integer,String>();
tokenMap.put(JavaTokenTypes.COMMA, ",");
tokenMap.put(JavaTokenTypes.PLUS, "+");
tokenMap.put(JavaTokenTypes.MINUS, "-");
tokenMap.put(JavaTokenTypes.ASSIGN, "=");
tokenMap.put(JavaTokenTypes.LT, "<");
tokenMap.put(JavaTokenTypes.GT, ">");
tokenMap.put(JavaTokenTypes.EQUAL, "==");
tokenMap.put(JavaTokenTypes.SL, "<<");
tokenMap.put(JavaTokenTypes.SR, ">>");
tokenMap.put(JavaTokenTypes.BSR, ">>>");
tokenMap.put(JavaTokenTypes.NOT_EQUAL, "!=");
tokenMap.put(JavaTokenTypes.LE, "<=");
tokenMap.put(JavaTokenTypes.GE, ">=");
tokenMap.put(JavaTokenTypes.SL_ASSIGN, "<<=");
tokenMap.put(JavaTokenTypes.SR_ASSIGN, ">>=");
tokenMap.put(JavaTokenTypes.BSR_ASSIGN, ">>>=");
tokenMap.put(JavaTokenTypes.PLUS_ASSIGN, "+=");
tokenMap.put(JavaTokenTypes.MINUS_ASSIGN, "-=");
tokenMap.put(JavaTokenTypes.STAR_ASSIGN, "*=");
tokenMap.put(JavaTokenTypes.DIV_ASSIGN, "/=");
tokenMap.put(JavaTokenTypes.MOD_ASSIGN, "%=");
tokenMap.put(JavaTokenTypes.BOR_ASSIGN, "|=");
tokenMap.put(JavaTokenTypes.BAND_ASSIGN, "&=");
tokenMap.put(JavaTokenTypes.BXOR_ASSIGN, "^=");
tokenMap.put(JavaTokenTypes.LPAREN, "(");
tokenMap.put(JavaTokenTypes.RPAREN, ")");
tokenMap.put(JavaTokenTypes.LBRACK, "[");
tokenMap.put(JavaTokenTypes.RBRACK, "]");
tokenMap.put(JavaTokenTypes.LCURLY, "{");
tokenMap.put(JavaTokenTypes.RCURLY, "}");
tokenMap.put(JavaTokenTypes.DOT, ".");
tokenMap.put(JavaTokenTypes.IDENT, "abcdefg");
tokenMap.put(JavaTokenTypes.STRING_LITERAL, "\"A string literal\"");
tokenMap.put(JavaTokenTypes.CHAR_LITERAL, "'n'");
tokenMap.put(JavaTokenTypes.LAMBDA, "->");
Map<Integer,Set<Integer>> cantFollow = new HashMap<Integer,Set<Integer>>();
Set<Integer> nonSet = new HashSet<Integer>();
nonSet.add(JavaTokenTypes.PLUS);
nonSet.add(JavaTokenTypes.PLUS_ASSIGN);
nonSet.add(JavaTokenTypes.INC);
nonSet.add(JavaTokenTypes.ASSIGN);
nonSet.add(JavaTokenTypes.EQUAL);
cantFollow.put(JavaTokenTypes.PLUS, nonSet);
nonSet = new HashSet<Integer>();
nonSet.add(JavaTokenTypes.MINUS);
nonSet.add(JavaTokenTypes.MINUS_ASSIGN);
nonSet.add(JavaTokenTypes.DEC);
nonSet.add(JavaTokenTypes.ASSIGN);
nonSet.add(JavaTokenTypes.EQUAL);
nonSet.add(JavaTokenTypes.GT);
nonSet.add(JavaTokenTypes.SR);
nonSet.add(JavaTokenTypes.BSR);
nonSet.add(JavaTokenTypes.SR_ASSIGN);
nonSet.add(JavaTokenTypes.BSR_ASSIGN);
nonSet.add(JavaTokenTypes.GE);
nonSet.add(JavaTokenTypes.LAMBDA);
cantFollow.put(JavaTokenTypes.MINUS, nonSet);
nonSet = new HashSet<Integer>();
nonSet.add(JavaTokenTypes.ASSIGN);
nonSet.add(JavaTokenTypes.EQUAL);
cantFollow.put(JavaTokenTypes.ASSIGN, nonSet);
nonSet = new HashSet<Integer>();
nonSet.add(JavaTokenTypes.LT);
nonSet.add(JavaTokenTypes.LE);
nonSet.add(JavaTokenTypes.SL);
nonSet.add(JavaTokenTypes.SL_ASSIGN);
nonSet.add(JavaTokenTypes.ASSIGN);
nonSet.add(JavaTokenTypes.EQUAL);
cantFollow.put(JavaTokenTypes.LT, nonSet);
nonSet = new HashSet<Integer>();
nonSet.add(JavaTokenTypes.GT);
nonSet.add(JavaTokenTypes.GE);
nonSet.add(JavaTokenTypes.SR);
nonSet.add(JavaTokenTypes.BSR);
nonSet.add(JavaTokenTypes.SR_ASSIGN);
nonSet.add(JavaTokenTypes.BSR_ASSIGN);
nonSet.add(JavaTokenTypes.ASSIGN);
nonSet.add(JavaTokenTypes.EQUAL);
cantFollow.put(JavaTokenTypes.GT, nonSet);
cantFollow.put(JavaTokenTypes.SR, nonSet);
nonSet = new HashSet<Integer>();
nonSet.add(JavaTokenTypes.ASSIGN);
nonSet.add(JavaTokenTypes.EQUAL);
cantFollow.put(JavaTokenTypes.SL, nonSet);
cantFollow.put(JavaTokenTypes.BSR, nonSet);
nonSet = new HashSet<Integer>();
nonSet.add(JavaTokenTypes.DOT);
cantFollow.put(JavaTokenTypes.DOT, nonSet);
nonSet = new HashSet<Integer>();
nonSet.add(JavaTokenTypes.IDENT);
cantFollow.put(JavaTokenTypes.IDENT, nonSet);
Set<Integer> tokens = tokenMap.keySet();
for (Iterator<Integer> i = tokens.iterator(); i.hasNext(); ) {
int ival = i.next();
for (Iterator<Integer> j = tokens.iterator(); j.hasNext(); ) {
int jval = j.next();
Set<Integer> notToFollow = cantFollow.get(ival);
if (notToFollow != null && notToFollow.contains(jval)) {
continue;
}
String testMe = tokenMap.get(ival) + tokenMap.get(jval);
TokenStream ts = getLexerFor(testMe);
LocatableToken token = (LocatableToken) ts.nextToken();
assertEquals(ival, token.getType());
token = (LocatableToken) ts.nextToken();
assertEquals(jval, token.getType());
token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.EOF, token.getType());
assertEquals(testMe.length() + 1, token.getColumn());
token = (LocatableToken) ts.nextToken();
assertEquals(JavaTokenTypes.EOF, token.getType());
assertEquals(testMe.length() + 1, token.getColumn());
testMe = tokenMap.get(ival) + "\n" + tokenMap.get(jval);
ts = getLexerFor(testMe);
token = (LocatableToken) ts.nextToken();
assertEquals(1, token.getColumn());
assertEquals(1 + tokenMap.get(ival).length(), token.getEndColumn());
assertEquals(1, token.getLine());
assertEquals(1, token.getEndLine());
token = (LocatableToken) ts.nextToken();
assertEquals(jval, token.getType());
assertEquals(1, token.getColumn());
assertEquals(2, token.getLine());
}
}
}
}
top,
use,
map,
class LexerTest
. getLexerFor
. getNonfilteringLexerFor
. testKeywordParse
. testSymbols
. testSymbols2
. testIdentifiers
. testOther
. testOther2
. testOther3
. testJava7NumLiterals
. testPositionTracking
. testPositionTracking2
. testPositionTracking3
. testPositionTracking4
. testPositionTracking5
. testBroken
. testStressLexer
988 neLoCode
+ 2 LoComm