package org.watertemplate.interpreter.parser;
import org.junit.Test;
import java.util.List;
import static org.junit.Assert.assertEquals;
public class LexerTest {
@Test
public void testReadAmbiguousTokens() {
assertEquals(9, lex("~if x: ~ :~").size());
assertEquals(11, lex("~if x.y: ~ :~").size());
assertEquals(13, lex("a ~if x.y: ~ :~").size());
assertEquals(15, lex("a ~if x.y: ~x~ :~").size());
assertEquals(10, lex("~if x:: ~ :~").size());
assertEquals(11, lex("~if x:: ~ ::~").size());
assertEquals(12, lex("~if x:: ~~ ::~").size());
}
@Test
public void validTexts() {
assertEquals(1, lex("a").size());
assertEquals(1, lex("ab").size());
assertEquals(3, lex("a b").size());
assertEquals(3, lex("a\nb").size());
assertEquals(3, lex("a\tb").size());
assertEquals(3, lex("a\t\nb").size());
}
@Test
public void differentStarts() {
assertEquals(4, lex(".~i~").size());
assertEquals(4, lex("<span>~i~").size());
assertEquals(4, lex("\n~i~").size());
assertEquals(4, lex(" ~i~").size());
assertEquals(4, lex("asd~i~").size());
assertEquals(6, lex("asd.fgh~i~").size());
assertEquals(6, lex(" in ~i~").size());
assertEquals(3, lex(":~i~").size());
assertEquals(4, lex("~~i~").size());
}
@Test
public void validProperties() {
assertEquals(4, lex("a~i~").size());
assertEquals(4, lex("~i~b").size());
assertEquals(6, lex("~i~~id~").size());
assertEquals(7, lex("~i~ ~id~").size());
assertEquals(7, lex("~i~\n~id~").size());
assertEquals(7, lex("~i~\t~id~").size());
assertEquals(7, lex("~i~\t~id~\n").size());
}
@Test
public void validIds() {
assertEquals(3, lex("~a~").size());
assertEquals(5, lex("~a._~").size());
assertEquals(5, lex("~a.bc~").size());
assertEquals(7, lex("~a.b.c~").size());
assertEquals(7, lex("~a1.b2.c3~").size());
assertEquals(12, lex("~a.b.c~a.b.c").size());
}
@Test
public void validAccessors() {
assertEquals(1, lex(".").size());
assertEquals(2, lex("a.").size());
assertEquals(3, lex(".a.").size());
assertEquals(4, lex(".a.b").size());
assertEquals(7, lex("a.~a.b~").size());
assertEquals(9, lex("a.~a.b~.abc").size());
assertEquals(17, lex("abcd.~a.b~. .~x.y.z~").size());
}
@Test
public void validIfs() {
assertEquals(6, lex("~if foo::~").size());
assertEquals(8, lex("~if foo.bar::~").size());
assertEquals(9, lex("~if foo.bar: :~").size());
assertEquals(13, lex("~if x.y: ~z~ :~").size());
assertEquals(14, lex("~if x.y: ~z~ :else::~").size());
assertEquals(15, lex("~if x.y: ~z~ :else: :~").size());
assertEquals(15, lex("~if x::else: ~if j: :~:~").size());
}
@Test
public void validFors() {
assertEquals(10, lex("~for foo in bar::~").size());
assertEquals(12, lex("~for foo.bar in x::~").size());
assertEquals(11, lex("~for x in y::else::~").size());
assertEquals(13, lex("~for x in y: :else: :~").size());
assertEquals(20, lex("~for x y z in if for if y::~").size());
assertEquals(29, lex("~for x in y: ~x~:else: ~if x.a.b.c::else::~:~").size());
}
@Test
public void validWhitespaces() {
assertEquals(9, lex("~if foo.bar: :~").size());
assertEquals(13, lex("~for x in y: :else: :~").size());
assertEquals(11, lex("~for\t\tx\tin y::else::~").size());
assertEquals(11, lex("~for\n\t\tx\n\t\tin\n\t\ty::else::~").size());
assertEquals(4, lex("~if :").size());
assertEquals(6, lex("~if x :").size());
assertEquals(12, lex("~for x in x.y :").size());
}
@Test
public void invalidCommands() {
assertEquals(1, lex("~").size());
assertEquals(2, lex("~x").size());
assertEquals(2, lex("~if").size());
assertEquals(2, lex("~if ").size());
assertEquals(11, lex("~if x ::else: :x~").size());
assertEquals(5, lex(": else :").size());
assertEquals(6, lex("~if *(::").size());
}
@Test
public void colonsAndWavesAsText() {
assertEquals(7, lex("~if x:::~").size());
assertEquals(9, lex("~if x: ~ :~").size());
assertEquals(10, lex("~if x: ~: :~").size());
assertEquals(10, lex("~if x: ~~ :~").size());
assertEquals(11, lex("~if x: ~:: :~").size());
assertEquals(9, lex("~if x: ~:else::~").size());
assertEquals(11, lex("~if x: ~:else: ~:~").size());
assertEquals(12, lex("~if x: ~:else:: ~:~").size());
}
private List<Token> lex(final String input) {
return new Lexer().tokenize(input);
}
}