package me.august.lumen;
import me.august.lumen.compile.scanner.LumenScanner;
import me.august.lumen.compile.scanner.Token;
import me.august.lumen.compile.scanner.TokenSource;
import me.august.lumen.compile.scanner.Type;
import me.august.lumen.compile.scanner.tokens.ImportPathToken;
import me.august.lumen.compile.scanner.tokens.NumberToken;
import org.junit.Assert;
import org.junit.Test;
import static me.august.lumen.compile.scanner.Type.*;
public class LexerTest {
private static final String TOKEN_TEST_FILE = "/token_test.txt";
private static TokenSource createLexer(String source) {
return new LumenScanner(source);
}
@Test
public void testTokens() {
Type[] expectedTypes = {
IDENTIFIER,
GT, GTE, SH_R, U_SH_R,
LT, LTE, SH_L,
L_PAREN, R_PAREN, L_BRACKET, R_BRACKET, L_BRACE, R_BRACE,
NUMBER, STRING,
PLUS, MIN, MULT, DIV,
NOT, NE,
BIT_OR, LOGIC_OR,
BIT_AND, LOGIC_AND,
ASSIGN, EQ,
COMMA, COLON,
INSTANCEOF_KEYWORD,
TRUE, FALSE, NULL /* "null" */, NULL /* "nil" */,
EOF
};
String src = Util.readResource(TOKEN_TEST_FILE);
TokenSource lexer = createLexer(src);
int count = 0;
while (true) {
Type type = lexer.nextToken().getType();
Assert.assertTrue(
"More tokens read than expected",
count < expectedTypes.length
);
Assert.assertEquals(
"Token mismatch",
expectedTypes[count], type
);
if (type == EOF) break;
count++;
}
}
@Test
public void testNumericLiterals() {
String[] literals = new String[]{"0x10", "010", "0b10", "1.0e10", "1L", "1F"};
Class[] expectedClasses = new Class[]{
Integer.class, Integer.class, Integer.class, Double.class, Long.class,
Float.class
};
for (int i = 0; i < literals.length; i++) {
Token token = createLexer(literals[i]).nextToken();
Assert.assertTrue(
"Expected token to be a NumberToken",
token instanceof NumberToken
);
NumberToken numToken = (NumberToken) token;
Assert.assertEquals(expectedClasses[i], numToken.getNumberType());
}
}
@Test
public void testImports() {
String src;
TokenSource lex;
Token tok;
// multi-class import test
src = "import foo.bar.{baz, wut}";
lex = createLexer(src);
Assert.assertEquals(Type.IMPORT_KEYWORD, lex.nextToken().getType());
tok = lex.nextToken();
Assert.assertEquals(Type.IMPORT_PATH, tok.getType());
Assert.assertTrue(
"Expected token to be an ImportPathToken",
tok instanceof ImportPathToken
);
// single-class import test
src = "import foo.bar.qux";
lex = createLexer(src);
Assert.assertEquals(Type.IMPORT_KEYWORD, lex.nextToken().getType());
tok = lex.nextToken();
Assert.assertEquals(Type.IMPORT_PATH, tok.getType());
Assert.assertTrue(
"Expected token to be an ImportPathToken",
tok instanceof ImportPathToken
);
}
@Test
public void testTokenPositioning() {
String src = "ident \"string\" ++ () [] {} - + ! * / %";
TokenSource lex = createLexer(src);
while (true) {
Token tok = lex.nextToken();
//System.out.println(tok.getType().name() + ": " + tok.getStart() + ".." + tok.getEnd());
if (tok.getType() == Type.EOF)
break;
}
}
}