package org.watertemplate.interpreter.parser;
import org.junit.Test;
import org.watertemplate.interpreter.parser.exception.IncorrectLocationForToken;
import org.watertemplate.interpreter.parser.exception.NoMoreTokensOnStreamException;
import static org.junit.Assert.assertNotNull;
import static org.watertemplate.interpreter.parser.TokenFixture.*;
public class NonTerminalIfTest {
@Test
public void noElse() {
TokenStream tokenStream = new TokenStream(
Wave(), If(), Blank(), PropertyKey("x"), Colon(),
EndOfBlock()
);
assertNotNull(NonTerminal.IF_COMMAND.buildAbstractSyntaxTree(tokenStream));
}
@Test
public void emptyBodies() {
TokenStream tokenStream = new TokenStream(
Wave(), If(), Blank(), PropertyKey("x"), Colon(),
Else(),
EndOfBlock()
);
assertNotNull(NonTerminal.IF_COMMAND.buildAbstractSyntaxTree(tokenStream));
}
@Test
public void regular() {
TokenStream tokenStream = new TokenStream(
Wave(), If(), Blank(), PropertyKey("x"), Colon(),
Text("foo text bar text"),
Else(),
Text("bar text foo text"),
EndOfBlock()
);
assertNotNull(NonTerminal.IF_COMMAND.buildAbstractSyntaxTree(tokenStream));
}
@Test
public void nested() {
TokenStream tokenStream = new TokenStream(
Wave(), If(), Blank(), PropertyKey("x"), Colon(),
Wave(), If(), Blank(), PropertyKey("y"), Colon(),
Text("nested foo text bar text"),
Else(),
Wave(), If(), Blank(), PropertyKey("y"), Colon(),
Text("else nested foo text bar text"),
Else(),
Text("else nested foo text bar text"),
EndOfBlock(),
EndOfBlock(),
Else(),
Text("bar text foo text"),
EndOfBlock()
);
assertNotNull(NonTerminal.IF_COMMAND.buildAbstractSyntaxTree(tokenStream));
}
@Test (expected = IncorrectLocationForToken.class)
public void invalidNested() {
TokenStream tokenStream = new TokenStream(
Wave(), If(), Blank(), PropertyKey("x"), Colon(),
Wave(), If(), Blank(), PropertyKey("y"), Colon(),
Text("nested bar text foo text"),
Else(),
Text("nested foo text bar text"),
// new EndOfBlock(), intentionally commented for visualization purpose.
Else(),
Text("bar text foo text"),
EndOfBlock()
);
NonTerminal.IF_COMMAND.buildAbstractSyntaxTree(tokenStream);
}
@Test(expected = NoMoreTokensOnStreamException.class)
public void missingEnd() {
TokenStream tokenStream = new TokenStream(
Wave(), If(), Blank(), PropertyKey("x"), Colon(),
Text("foo text bar text"),
Else(),
Text("bar text foo text")
// new EndOfBlock(), intentionally commented for visualization purpose.
);
NonTerminal.IF_COMMAND.buildAbstractSyntaxTree(tokenStream);
}
}