package uk.co.badgersinfoil.metaas.impl.antlr;
import org.antlr.runtime.ANTLRStringStream;
import org.antlr.runtime.CharStream;
import org.antlr.runtime.CommonToken;
import org.antlr.runtime.Token;
import org.antlr.runtime.TokenSource;
import org.asdt.core.internal.antlr.AS3Lexer;
import org.asdt.core.internal.antlr.AS3Parser;
import uk.co.badgersinfoil.metaas.impl.ASTUtils;
import junit.framework.TestCase;
public class LinkedListTokenStreamTest extends TestCase {
private static final int TYPE_TEST = 123;
public void testEOF() {
TokenSource source = new TokenSource() {
private boolean done = false;
public Token nextToken() {
if (done) {
return Token.EOF_TOKEN;
}
done = true;
return new CommonToken(TYPE_TEST, "test");
}
};
LinkedListTokenSource linkedSource = new LinkedListTokenSource(source);
LinkedListTokenStream stream = new LinkedListTokenStream(linkedSource);
LinkedListToken tok = next(stream);
assertEquals(TYPE_TEST, tok.getType());
LinkedListToken eof = next(stream);
assertEquals(CharStream.EOF, eof.getType());
assertEquals(tok, eof.getPrev());
LinkedListToken eof2 = next(stream);
assertEquals(CharStream.EOF, eof2.getType());
assertSame(eof, eof2);
assertEquals(tok, eof2.getPrev());
}
private LinkedListToken next(LinkedListTokenStream stream) {
LinkedListToken tok = (LinkedListToken)stream.LT(1);
stream.consume();
return tok;
}
public void testMarkRewind() {
ANTLRStringStream input = new ANTLRStringStream("package { b");
AS3Lexer lex = new AS3Lexer(input);
LinkedListTokenSource src = new LinkedListTokenSource(lex);
LinkedListTokenStream str = new LinkedListTokenStream(src);
ASTUtils.assertAS3TokenTypeIs(AS3Parser.PACKAGE, str.LA(1));
str.consume();
ASTUtils.assertAS3TokenTypeIs(AS3Parser.LCURLY, str.LA(1));
int mark = str.mark();
assertEquals(2, mark);
str.consume();
ASTUtils.assertAS3TokenTypeIs(AS3Parser.IDENT, str.LA(1));
str.rewind(mark);
ASTUtils.assertAS3TokenTypeIs(AS3Parser.LCURLY, str.LA(1));
str.consume();
// no-args version should just go back to last mark
str.rewind();
assertEquals(mark, str.index());
}
}