package org.watertemplate.interpreter.parser;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import static org.watertemplate.interpreter.parser.Terminal.*;
import static org.watertemplate.interpreter.parser.TokenFixture.*;
public class TokenStreamTest {
private TokenStream tokenStream;
@Before
public void before() {
tokenStream = new TokenStream(
If(),
PropertyKey("foo"),
Else(),
EndOfBlock());
}
@Test
public void hasAny() {
Assert.assertFalse(new TokenStream().hasAny());
Assert.assertTrue(tokenStream.hasAny());
}
@Test
public void currentAndShift() {
assertCurrentIsOfType(IF);
tokenStream.shift();
assertCurrentIsOfType(PROPERTY_KEY);
tokenStream.shift();
assertCurrentIsOfType(ELSE);
}
@Test
public void saveAndReset() {
int save = tokenStream.getCurrentTokenPosition();
assertCurrentIsOfType(IF);
tokenStream.shift();
tokenStream.shift();
tokenStream.shift();
assertCurrentIsNotOfType(IF);
tokenStream.reset(save);
assertCurrentIsOfType(IF);
}
@Test
public void remaining() {
Assert.assertEquals(4, tokenStream.remaining());
tokenStream.shift();
tokenStream.shift();
Assert.assertEquals(2, tokenStream.remaining());
tokenStream.shift();
tokenStream.shift();
Assert.assertEquals(0, tokenStream.remaining());
}
private void assertCurrentIsOfType(final Terminal terminal) {
Assert.assertTrue(current().canBe(terminal));
}
private void assertCurrentIsNotOfType(final Terminal terminal) {
Assert.assertFalse(current().canBe(terminal));
}
private Token current() {
return tokenStream.current();
}
}