package com.github.jknack.handlebars.internal;
import org.antlr.v4.runtime.ANTLRInputStream;
import org.antlr.v4.runtime.CommonTokenStream;
import org.antlr.v4.runtime.Token;
import org.antlr.v4.runtime.tree.ParseTree;
import org.junit.Test;
public class HbsParserTest {
private boolean printTokens = true;
@Test
public void hello() {
parse("Hello {{who}}\n!");
}
@Test
public void rawblock() {
parse("{{{{raw}}}} {{test}} {{{{/raw}}}}");
}
@Test
public void dynamicPartial() {
parse("{{> (partial)}}");
}
@Test
public void text() {
parse("Hello world!");
}
@Test
public void newlines() {
parse("Alan's\rTest");
}
@Test
public void var() {
parse("{{variable 678}}");
parse("{{array.[10]}}");
parse("{{array.[1foo]}}");
parse("{{array.['foo']}}");
parse("{{array.['foo or bar}}]}}");
parse("{{variable \"string\"}}");
parse("{{variable \"true\"}}");
parse("{{variable \"string\" 78}}");
}
@Test
public void comments() {
parse("12345{{! Comment Block! }}67890");
}
@Test
public void partial() {
parse("[ {{>include}} ]");
}
@Test
public void ampvar() {
parse("{{&variable 678}}");
parse("{{&variable \"string\"}}");
parse("{{&variable \"true\"}}");
parse("{{&variable \"string\" 78}}");
}
@Test
public void tvar() {
parse("{{{variable 678}}}");
parse("{{{variable \"string\"}}}");
parse("{{{variable \"true\"}}}");
parse("{{{variable \"string\" 78}}}");
}
@Test
public void block() {
parse("{{#block 678}}{{var}}{{/block}}");
parse("{{#block 678}}then{{^}}else{{/block}}");
parse("{{#block 678}}then{{^}}else{{/block}}");
}
@Test
public void unless() {
parse("{{^block}}{{var}}{{/block}}");
}
@Test
public void hash() {
parse("{{variable int=678}}");
parse("{{variable string='string'}}");
}
@Test
public void setDelim() {
parse("{{=<% %>=}}<%hello%><%={{ }}=%>{{reset}}");
parse("{{= | | =}}<|#lambda|-|/lambda|>");
parse("{{=+-+ +-+=}}+-+test+-+");
}
private ParseTree parse(final String input) {
return parse(input, "{{", "}}");
}
private ParseTree parse(final String input, final String start, final String delim) {
HbsErrorReporter errorReporter = new HbsErrorReporter("test.hbs");
final HbsLexer lexer = new HbsLexer(new ANTLRInputStream(input), start, delim);
lexer.removeErrorListeners();
lexer.addErrorListener(errorReporter);
CommonTokenStream tokens = new CommonTokenStream(lexer);
HbsParser parser = new HbsParser(tokens) {
@Override
void setStart(final String start) {
lexer.start = start;
}
@Override
void setEnd(final String end) {
lexer.end = end;
}
};
parser.removeErrorListeners();
parser.addErrorListener(errorReporter);
ParseTree tree = parser.template();
if (printTokens) {
String[] tokenNames = parser.tokenNames();
for (Token token : tokens.getTokens()) {
int type = token.getType();
String message = String.format("%s:%s:%s:%s", token.getText(), type == -1 ? ""
: tokenNames[token.getType()], token.getLine(), token.getCharPositionInLine());
System.out.println(message);
}
}
System.out.println(tree.toStringTree(parser));
return tree;
}
}