package nebula.simpletemplate; public class TestLexer extends BaseTest { public void testOneExpr() throws Exception { String template = "<name>"; String expected = "[[@0,0:0='<',<LDELIM>,1:0], [@1,1:4='name',<ID>,1:1], " + "[@2,5:5='>',<RDELIM>,1:5]]"; checkTokens(template, expected); } public void testOneExpr_Dollar() throws Exception { String template = "${name}"; String expected = "[[@0,0:1='${',<LDELIM>,1:0], [@1,2:5='name',<ID>,1:2], " + "[@2,6:6='}',<RDELIM>,1:6]]"; checkTokens(template, expected,'$','}'); } public void testOneExprSurrounded() throws Exception { String template = "hi <name> mom"; String expected = "[[@0,0:2='hi ',<TEXT>,1:0], [@1,3:3='<',<LDELIM>,1:3], " + "[@2,4:7='name',<ID>,1:4], [@3,8:8='>',<RDELIM>,1:8], " + "[@4,9:12=' mom',<TEXT>,1:9]]"; checkTokens(template, expected); } public void testEscDelim() throws Exception { String template = "hi \\<name>"; String expected = "[[@0,0:9='hi <name>',<TEXT>,1:0]]"; checkTokens(template, expected); } public void testEscEsc() throws Exception { String template = "hi \\\\ foo"; String expected = "[[@0,0:8='hi \\ foo',<TEXT>,1:0]]"; checkTokens(template, expected); } public void testEscDelimHasCorrectStartChar() throws Exception { String template = "<a>\\<dog"; String expected = "[[@0,0:0='<',<LDELIM>,1:0], [@1,1:1='a',<ID>,1:1], [@2,2:2='>',<RDELIM>,1:2], " + "[@3,3:7='<dog',<TEXT>,1:3]]"; checkTokens(template, expected); } public void testEscChar() throws Exception { String template = "hi \\x"; String expected = "[[@0,0:4='hi \\x',<TEXT>,1:0]]"; checkTokens(template, expected); } public void testString() throws Exception { String template = "hi <foo(a=\">\")>"; String expected = "[[@0,0:2='hi ',<TEXT>,1:0], [@1,3:3='<',<LDELIM>,1:3], " + "[@2,4:6='foo',<ID>,1:4], [@3,7:7='(',<LPAREN>,1:7], " + "[@4,8:8='a',<ID>,1:8], [@5,9:9='=',<EQUALS>,1:9], " + "[@6,10:12='\">\"',<STRING>,1:10], [@7,13:13=')',<RPAREN>,1:13], " + "[@8,14:14='>',<RDELIM>,1:14]]"; checkTokens(template, expected); } public void testEscInString() throws Exception { String template = "hi <foo(a=\">\\\"\")>"; String expected = "[[@0,0:2='hi ',<TEXT>,1:0], [@1,3:3='<',<LDELIM>,1:3], [@2,4:6='foo',<ID>,1:4], " + "[@3,7:7='(',<LPAREN>,1:7], [@4,8:8='a',<ID>,1:8], [@5,9:9='=',<EQUALS>,1:9], " + "[@6,10:14='\">\"\"',<STRING>,1:10], [@7,15:15=')',<RPAREN>,1:15], " + "[@8,16:16='>',<RDELIM>,1:16]]"; checkTokens(template, expected); } public void testSubtemplate() throws Exception { String template = "hi <names:{n | <n>}>"; String expected = "[[@0,0:2='hi ',<TEXT>,1:0], [@1,3:3='<',<LDELIM>,1:3], [@2,4:8='names',<ID>,1:4], [@3,9:9=':',<COLON>,1:9], [@4,10:10='{',<LCURLY>,1:10], [@5,11:11='n',<ID>,1:11], [@6,13:13='|',<PIPE>,1:13], [@7,15:15='<',<LDELIM>,1:15], [@8,16:16='n',<ID>,1:16], [@9,17:17='>',<RDELIM>,1:17], [@10,18:18='}',<RCURLY>,1:18], [@11,19:19='>',<RDELIM>,1:19]]"; checkTokens(template, expected); } public void testSubtemplateNoArg() throws Exception { String template = "hi <names:{n | <n>}>"; String expected = "[[@0,0:2='hi ',<TEXT>,1:0], [@1,3:3='<',<LDELIM>,1:3], [@2,4:8='names',<ID>,1:4], [@3,9:9=':',<COLON>,1:9], [@4,10:10='{',<LCURLY>,1:10], [@5,11:11='n',<ID>,1:11], [@6,13:13='|',<PIPE>,1:13], [@7,15:15='<',<LDELIM>,1:15], [@8,16:16='n',<ID>,1:16], [@9,17:17='>',<RDELIM>,1:17], [@10,18:18='}',<RCURLY>,1:18], [@11,19:19='>',<RDELIM>,1:19]]"; checkTokens(template, expected); } public void testSubtemplateMultiArgs() throws Exception { String template = "hi <names:{x,y | <x><y>}>"; // semantically bogus String expected = "[[@0,0:2='hi ',<TEXT>,1:0], [@1,3:3='<',<LDELIM>,1:3], [@2,4:8='names',<ID>,1:4], [@3,9:9=':',<COLON>,1:9], [@4,10:10='{',<LCURLY>,1:10], [@5,11:11='x',<ID>,1:11], [@6,12:12=',',<COMMA>,1:12], [@7,13:13='y',<ID>,1:13], [@8,15:15='|',<PIPE>,1:15], [@9,17:17='<',<LDELIM>,1:17], [@10,18:18='x',<ID>,1:18], [@11,19:19='>',<RDELIM>,1:19], [@12,20:20='<',<LDELIM>,1:20], [@13,21:21='y',<ID>,1:21], [@14,22:22='>',<RDELIM>,1:22], [@15,23:23='}',<RCURLY>,1:23], [@16,24:24='>',<RDELIM>,1:24]]"; checkTokens(template, expected); } public void testNestedSubtemplate() throws Exception { String template = "hi <names:{n | <n:{x|<x>}>}>"; String expected = "[[@0,0:2='hi ',<TEXT>,1:0], [@1,3:3='<',<LDELIM>,1:3], [@2,4:8='names',<ID>,1:4], [@3,9:9=':',<COLON>,1:9], [@4,10:10='{',<LCURLY>,1:10], [@5,11:11='n',<ID>,1:11], [@6,13:13='|',<PIPE>,1:13], [@7,15:15='<',<LDELIM>,1:15], [@8,16:16='n',<ID>,1:16], [@9,17:17=':',<COLON>,1:17], [@10,18:18='{',<LCURLY>,1:18], [@11,19:19='x',<ID>,1:19], [@12,20:20='|',<PIPE>,1:20], [@13,21:21='<',<LDELIM>,1:21], [@14,22:22='x',<ID>,1:22], [@15,23:23='>',<RDELIM>,1:23], [@16,24:24='}',<RCURLY>,1:24], [@17,25:25='>',<RDELIM>,1:25], [@18,26:26='}',<RCURLY>,1:26], [@19,27:27='>',<RDELIM>,1:27]]"; checkTokens(template, expected); } public void testNestedList() throws Exception { String template = "*<[names, [\"foo\",\"bar\"]:{x|<x>!},phones]; separator=\", \">*"; // 01234567890123456 String expected = "[[@0,0:0='*',<TEXT>,1:0], [@1,1:1='<',<LDELIM>,1:1], [@2,2:2='[',<LBRACK>,1:2], [@3,3:7='names',<ID>,1:3], [@4,8:8=',',<COMMA>,1:8], [@5,10:10='[',<LBRACK>,1:10], [@6,11:15='\"foo\"',<STRING>,1:11], [@7,16:16=',',<COMMA>,1:16], [@8,17:21='\"bar\"',<STRING>,1:17], [@9,22:22=']',<RBRACK>,1:22], [@10,23:23=':',<COLON>,1:23], [@11,24:24='{',<LCURLY>,1:24], [@12,25:25='x',<ID>,1:25], [@13,26:26='|',<PIPE>,1:26], [@14,27:27='<',<LDELIM>,1:27], [@15,28:28='x',<ID>,1:28], [@16,29:29='>',<RDELIM>,1:29], [@17,30:30='!',<TEXT>,1:30], [@18,31:31='}',<RCURLY>,1:31], [@19,32:32=',',<COMMA>,1:32], [@20,33:38='phones',<ID>,1:33], [@21,39:39=']',<RBRACK>,1:39], [@22,40:40=';',<SEMI>,1:40], [@23,42:50='separator',<ID>,1:42], [@24,51:51='=',<EQUALS>,1:51], [@25,52:55='\", \"',<STRING>,1:52], [@26,56:56='>',<RDELIM>,1:56], [@27,57:57='*',<TEXT>,1:57]]"; checkTokens(template, expected); } public void testIF() throws Exception { String template = "<if(!name)>works<endif>"; String expected = "[[@0,0:0='<',<LDELIM>,1:0], [@1,1:2='if',<IF>,1:1], [@2,3:3='(',<LPAREN>,1:3], " + "[@3,4:4='!',<BANG>,1:4], [@4,5:8='name',<ID>,1:5], [@5,9:9=')',<RPAREN>,1:9], " + "[@6,10:10='>',<RDELIM>,1:10], [@7,11:15='works',<TEXT>,1:11], " + "[@8,16:16='<',<LDELIM>,1:16], [@9,17:21='endif',<ENDIF>,1:17], " + "[@10,22:22='>',<RDELIM>,1:22]]"; checkTokens(template, expected); } public void testIFNot() throws Exception { String template = "<if(!name)>works<endif>"; String expected = "[[@0,0:0='<',<LDELIM>,1:0], [@1,1:2='if',<IF>,1:1], [@2,3:3='(',<LPAREN>,1:3], " + "[@3,4:4='!',<BANG>,1:4], [@4,5:8='name',<ID>,1:5], [@5,9:9=')',<RPAREN>,1:9], " + "[@6,10:10='>',<RDELIM>,1:10], [@7,11:15='works',<TEXT>,1:11], " + "[@8,16:16='<',<LDELIM>,1:16], [@9,17:21='endif',<ENDIF>,1:17], " + "[@10,22:22='>',<RDELIM>,1:22]]"; checkTokens(template, expected); } public void testIFELSE() throws Exception { String template = "<if(name)>works<else>fail<endif>"; String expected = "[[@0,0:0='<',<LDELIM>,1:0], [@1,1:2='if',<IF>,1:1], [@2,3:3='(',<LPAREN>,1:3], " + "[@3,4:7='name',<ID>,1:4], [@4,8:8=')',<RPAREN>,1:8], [@5,9:9='>',<RDELIM>,1:9], " + "[@6,10:14='works',<TEXT>,1:10], [@7,15:15='<',<LDELIM>,1:15], " + "[@8,16:19='else',<ELSE>,1:16], [@9,20:20='>',<RDELIM>,1:20], " + "[@10,21:24='fail',<TEXT>,1:21], [@11,25:25='<',<LDELIM>,1:25], " + "[@12,26:30='endif',<ENDIF>,1:26], [@13,31:31='>',<RDELIM>,1:31]]"; checkTokens(template, expected); } public void testELSEIF() throws Exception { String template = "<if(name)>fail<elseif(id)>works<else>fail<endif>"; String expected = "[[@0,0:0='<',<LDELIM>,1:0], [@1,1:2='if',<IF>,1:1], [@2,3:3='(',<LPAREN>,1:3], " + "[@3,4:7='name',<ID>,1:4], [@4,8:8=')',<RPAREN>,1:8], [@5,9:9='>',<RDELIM>,1:9], " + "[@6,10:13='fail',<TEXT>,1:10], [@7,14:14='<',<LDELIM>,1:14], " + "[@8,15:20='elseif',<ELSEIF>,1:15], [@9,21:21='(',<LPAREN>,1:21], " + "[@10,22:23='id',<ID>,1:22], [@11,24:24=')',<RPAREN>,1:24], " + "[@12,25:25='>',<RDELIM>,1:25], [@13,26:30='works',<TEXT>,1:26], " + "[@14,31:31='<',<LDELIM>,1:31], [@15,32:35='else',<ELSE>,1:32], " + "[@16,36:36='>',<RDELIM>,1:36], [@17,37:40='fail',<TEXT>,1:37], " + "[@18,41:41='<',<LDELIM>,1:41], [@19,42:46='endif',<ENDIF>,1:42], " + "[@20,47:47='>',<RDELIM>,1:47]]"; checkTokens(template, expected); } public void testEmbeddedRegion() throws Exception { String template = "<@r>foo<@end>"; String expected = "[[@0,0:0='<',<LDELIM>,1:0], [@1,1:1='@',<AT>,1:1], [@2,2:2='r',<ID>,1:2], " + "[@3,3:3='>',<RDELIM>,1:3], [@4,4:6='foo',<TEXT>,1:4], [@5,7:7='<',<LDELIM>,1:7], " + "[@6,8:11='@end',<END>,1:8], [@7,12:12='>',<RDELIM>,1:12]]"; checkTokens(template, expected); } public void testRegion() throws Exception { String template = "<@r()>"; String expected = "[[@0,0:0='<',<LDELIM>,1:0], [@1,1:1='@',<AT>,1:1], [@2,2:2='r',<ID>,1:2], " + "[@3,3:3='(',<LPAREN>,1:3], [@4,4:4=')',<RPAREN>,1:4], [@5,5:5='>',<RDELIM>,1:5]]"; checkTokens(template, expected); } }