package org.trimou.engine.parser;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import java.util.List;
import org.junit.Test;
import org.trimou.AbstractEngineTest;
import org.trimou.engine.MustacheTagInfo;
import org.trimou.engine.MustacheTagType;
import org.trimou.engine.segment.ExtendSectionSegment;
import org.trimou.engine.segment.ExtendSegment;
import org.trimou.engine.segment.InvertedSectionSegment;
import org.trimou.engine.segment.SectionSegment;
import org.trimou.engine.segment.Segment;
import org.trimou.engine.segment.SegmentType;
/**
*
* @author Martin Kouba
*/
public class ParsingTest extends AbstractEngineTest {
@Test
public void testVariable() {
Template template = (Template) engine.compileMustache(
"parse_variable", "Hello {{foo}} and {{& me}}!");
List<Segment> segments = template.getRootSegment().getSegments();
assertEquals(5, segments.size());
validateSegment(segments, 0, SegmentType.TEXT, "Hello ");
validateSegment(segments, 1, SegmentType.VALUE, "foo");
validateSegment(segments, 2, SegmentType.TEXT, " and ");
validateSegment(segments, 3, SegmentType.VALUE, "me");
validateSegment(segments, 4, SegmentType.TEXT, "!");
MustacheTagInfo helloTag = segments.get(0).getTagInfo();
assertNull(helloTag);
MustacheTagInfo fooTag = segments.get(1).getTagInfo();
assertNotNull(fooTag);
assertEquals(MustacheTagType.VARIABLE, fooTag.getType());
assertEquals("foo", fooTag.getText());
assertEquals(1, fooTag.getLine());
assertEquals("parse_variable", fooTag.getTemplateName());
assertNotNull(fooTag.getChildTags());
assertTrue(fooTag.getChildTags().isEmpty());
assertNotNull(fooTag.getId());
assertEquals(template.getGeneratedId(), fooTag.getTemplateGeneratedId());
}
@Test
public void testComment() {
Template template = (Template) engine.compileMustache(
"parse_comment", "{{! ignore}}{{me}}");
List<Segment> segments = template.getRootSegment().getSegments();
// Comment tag is removed by default
assertEquals(1, segments.size());
validateSegment(segments, 0, SegmentType.VALUE, "me");
}
@Test
public void testSection() {
Template template = (Template) engine.compileMustache(
"parse_section",
"This is a {{#section}} jupi {{mustache}} {{/section}}");
List<Segment> segments = template.getRootSegment().getSegments();
assertEquals(2, segments.size());
validateSegment(segments, 0, SegmentType.TEXT, "This is a ");
validateSegment(segments, 1, SegmentType.SECTION, "section");
assertEquals(3, ((SectionSegment) segments.get(1)).getSegments().size());
// System.out.println(template.getSegmentTreeAsString());
}
@Test
public void testInvertedSection() {
Template template = (Template) engine
.compileMustache("parse_inv_section",
"This is a {{^section}} jupi {{/section}}");
List<Segment> segments = template.getRootSegment().getSegments();
assertEquals(2, segments.size());
validateSegment(segments, 0, SegmentType.TEXT, "This is a ");
validateSegment(segments, 1, SegmentType.INVERTED_SECTION, "section");
assertEquals(1, ((InvertedSectionSegment) segments.get(1))
.getSegments().size());
}
@Test
public void testDelimiters() {
Template template = (Template) engine.compileMustache(
"parse_delimiters",
"This {{=%% %%=}} is a %%foo%% jupi %%={{ }}=%% {{bar}}");
List<Segment> segments = template.getRootSegment().getSegments();
// Delimiters tag is removed by default
assertEquals(6, segments.size());
validateSegment(segments, 0, SegmentType.TEXT, "This ");
validateSegment(segments, 1, SegmentType.TEXT, " is a ");
validateSegment(segments, 2, SegmentType.VALUE, "foo");
validateSegment(segments, 3, SegmentType.TEXT, " jupi ");
validateSegment(segments, 4, SegmentType.TEXT, " ");
validateSegment(segments, 5, SegmentType.VALUE, "bar");
}
@Test
public void testPartials() {
Template template = (Template) engine.compileMustache(
"parse_partial", "START{{>partial}}END");
List<Segment> segments = template.getRootSegment().getSegments();
assertEquals(3, segments.size());
validateSegment(segments, 0, SegmentType.TEXT, "START");
validateSegment(segments, 1, SegmentType.PARTIAL, "partial");
validateSegment(segments, 2, SegmentType.TEXT, "END");
}
@Test
public void testLineSeparator() {
Template template = (Template) engine.compileMustache(
"parse_line_sep_01", "\nHello {{foo}}\r\n\n and {{& me}}!\nAND\r\r");
List<Segment> segments = template.getRootSegment().getSegments();
assertEquals(12, segments.size());
validateSegment(segments, 0, SegmentType.LINE_SEPARATOR, "\n");
validateSegment(segments, 1, SegmentType.TEXT, "Hello ");
validateSegment(segments, 2, SegmentType.VALUE, "foo");
validateSegment(segments, 3, SegmentType.LINE_SEPARATOR, "\r\n");
validateSegment(segments, 4, SegmentType.LINE_SEPARATOR, "\n");
validateSegment(segments, 5, SegmentType.TEXT, " and ");
validateSegment(segments, 6, SegmentType.VALUE, "me");
validateSegment(segments, 7, SegmentType.TEXT, "!");
validateSegment(segments, 8, SegmentType.LINE_SEPARATOR, "\n");
validateSegment(segments, 9, SegmentType.TEXT, "AND");
validateSegment(segments, 10, SegmentType.LINE_SEPARATOR, "\r");
validateSegment(segments, 11, SegmentType.LINE_SEPARATOR, "\r");
template = (Template) engine.compileMustache(
"parse_line_sep_02", "\n\n ");
segments = template.getRootSegment().getSegments();
assertEquals(3, segments.size());
validateSegment(segments, 0, SegmentType.LINE_SEPARATOR, "\n");
validateSegment(segments, 1, SegmentType.LINE_SEPARATOR, "\n");
validateSegment(segments, 2, SegmentType.TEXT, " ");
template = (Template) engine.compileMustache(
"parse_line_sep_03", "\r\n\r\n\r\r\n\n \n\r ");
segments = template.getRootSegment().getSegments();
assertEquals(9, segments.size());
validateSegment(segments, 0, SegmentType.LINE_SEPARATOR, "\r\n");
validateSegment(segments, 1, SegmentType.LINE_SEPARATOR, "\r\n");
validateSegment(segments, 2, SegmentType.LINE_SEPARATOR, "\r");
validateSegment(segments, 3, SegmentType.LINE_SEPARATOR, "\r\n");
validateSegment(segments, 4, SegmentType.LINE_SEPARATOR, "\n");
validateSegment(segments, 5, SegmentType.TEXT, " ");
validateSegment(segments, 6, SegmentType.LINE_SEPARATOR, "\n");
validateSegment(segments, 7, SegmentType.LINE_SEPARATOR, "\r");
validateSegment(segments, 8, SegmentType.TEXT, " ");
}
@Test
public void testStandaloneLines() {
Template template = (Template) engine
.compileMustache("parse_standalone_line",
"\nHello {{foo}}\n{{! Standalone}}\n and {{& me}}!\n{{#test}}\nyes\n{{/test}}");
List<Segment> segments = template.getRootSegment().getSegments();
assertEquals(9, segments.size());
assertEquals(SegmentType.LINE_SEPARATOR, segments.get(0).getType());
assertEquals(SegmentType.TEXT, segments.get(1).getType());
assertEquals(SegmentType.VALUE, segments.get(2).getType());
assertEquals(SegmentType.LINE_SEPARATOR, segments.get(3).getType());
assertEquals(SegmentType.TEXT, segments.get(4).getType());
assertEquals(SegmentType.VALUE, segments.get(5).getType());
assertEquals(SegmentType.TEXT, segments.get(6).getType());
assertEquals(SegmentType.LINE_SEPARATOR, segments.get(7).getType());
assertEquals(SegmentType.SECTION, segments.get(8).getType());
}
@Test
public void testExtendSegments() {
Template template = (Template) engine.compileMustache(
"parse_extend_super",
"Hello {{$insert}}default content{{/insert}}!");
List<Segment> segments = template.getRootSegment().getSegments();
assertEquals(3, segments.size());
assertEquals(SegmentType.TEXT, segments.get(0).getType());
assertEquals(SegmentType.EXTEND_SECTION, segments.get(1).getType());
assertEquals(SegmentType.TEXT, segments.get(2).getType());
segments = ((ExtendSectionSegment) segments.get(1)).getSegments();
assertEquals(1, segments.size());
assertEquals(SegmentType.TEXT, segments.get(0).getType());
template = (Template) engine
.compileMustache(
"parse_extend_sub",
"Intro... {{<super}} skip {{$insert}}default content{{/insert}} skip! {{/super}} ...outro");
segments = template.getRootSegment().getSegments();
assertEquals(3, segments.size());
assertEquals(SegmentType.TEXT, segments.get(0).getType());
assertEquals(SegmentType.EXTEND, segments.get(1).getType());
assertEquals(SegmentType.TEXT, segments.get(2).getType());
segments = ((ExtendSegment) segments.get(1)).getSegments();
assertEquals(1, segments.size());
assertEquals(SegmentType.EXTEND_SECTION, segments.get(0).getType());
}
@Test
public void testAccentedLetters() {
String text1 = "Teď testujeme";
String var1 = "akcentované";
String var2 = "ěščěšřéáíéířčžč";
Template template = (Template) engine.compileMustache(
"parse_accented_letters", text1 + "{{" + var1 + "}}{{& " + var2
+ "}}");
List<Segment> segments = template.getRootSegment().getSegments();
assertEquals(3, segments.size());
assertEquals(SegmentType.TEXT, segments.get(0).getType());
assertEquals(text1, segments.get(0).getText());
assertEquals(SegmentType.VALUE, segments.get(1).getType());
assertEquals(var1, segments.get(1).getText());
assertEquals(SegmentType.VALUE, segments.get(2).getType());
assertEquals(var2, segments.get(2).getText());
}
@Test
public void testLineSeparatorAfterIncompleteDelimiter() {
Template template = (Template) engine.compileMustache(
"parse_line_sep_incomplete_delim",
"{\nHello!");
List<Segment> segments = template.getRootSegment().getSegments();
assertEquals(3, segments.size());
validateSegment(segments, 0, SegmentType.TEXT, "{");
validateSegment(segments, 1, SegmentType.LINE_SEPARATOR, "\n");
validateSegment(segments, 2, SegmentType.TEXT, "Hello!");
}
static void validateSegment(List<Segment> segments, int index,
SegmentType expectedType, String expectedText) {
Segment segment = segments.get(index);
assertEquals(expectedType, segment.getType());
assertEquals(expectedText, segment.getText());
}
}