package org.jtwig.integration.node;
import org.jtwig.JtwigTemplate;
import org.jtwig.integration.AbstractIntegrationTest;
import org.jtwig.parser.ParseException;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.core.Is.is;
import static org.hamcrest.core.StringContains.containsString;
import static org.jtwig.JtwigModel.newModel;
public class ForTest extends AbstractIntegrationTest {
@Rule
public ExpectedException expectedException = ExpectedException.none();
@Test
public void simpleFor() throws Exception {
JtwigTemplate jtwigTemplate = JtwigTemplate.inlineTemplate("{% for i in list %}{{i}}{% endfor %}");
String result = jtwigTemplate.render(newModel().with("list", new Integer[]{1, 2}));
assertThat(result, is("12"));
}
@Test
public void forLoopNull() throws Exception {
JtwigTemplate jtwigTemplate = JtwigTemplate.inlineTemplate("{% for i in list %}{{i}}{% endfor %}");
String result = jtwigTemplate.render(newModel().with("list", null));
assertThat(result, is(""));
}
@Test
public void forLoopVariable() throws Exception {
JtwigTemplate jtwigTemplate = JtwigTemplate.inlineTemplate("{% for i in [1, 2] %}" +
"{% if (loop.first) %}f{% endif %}" +
"{{loop.index}}{{loop.index0}}{{loop.revindex}}{{loop.revindex0}}" +
"{% if (loop.last) %}l{% endif %}" +
"{% endfor %}");
String result = jtwigTemplate.render(newModel());
assertThat(result, is("f10212110l"));
}
@Test
public void nestedForLoopsAndLoopVariable() throws Exception {
String result = JtwigTemplate.inlineTemplate("{% for i in [1] %}" +
"{% for j in [1, 2, 3] %}" +
"a{{ loop.index }}" +
"{% endfor %}" +
"b{{ loop.index }}" +
"{% endfor %}").render(newModel());
assertThat(result, is("a1a2a3b1"));
}
@Test
public void forWhiteSpaceControl() throws Exception {
JtwigTemplate jtwigTemplate = JtwigTemplate.inlineTemplate(" {%- for i in list -%} {{i}} {%- endfor -%} ");
String result = jtwigTemplate.render(newModel().with("list", new Integer[]{1, 2}));
assertThat(result, is("12"));
}
@Test
public void forIsolatedContextOldVariable() throws Exception {
JtwigTemplate jtwigTemplate = JtwigTemplate.inlineTemplate("{% set a = 2 %}{% for i in list %}{% set a = 1 %}{% endfor %}{{ a }}");
String result = jtwigTemplate.render(newModel().with("list", new Integer[]{1, 2}));
assertThat(result, is("1"));
}
@Test
public void forIsolatedContextNewVariable() throws Exception {
JtwigTemplate jtwigTemplate = JtwigTemplate.inlineTemplate("{% for i in list %}{% set a = 1 %}{% endfor %}{{ a }}");
String result = jtwigTemplate.render(newModel().with("list", new Integer[]{1, 2}));
assertThat(result, is("1"));
}
@Test
public void simpleForMap() throws Exception {
JtwigTemplate jtwigTemplate = JtwigTemplate.inlineTemplate("{% for k,v in list %}{{k}}{{v}}{% endfor %}");
String result = jtwigTemplate.render(newModel().with("list", new Integer[]{1,2}));
assertThat(result, is("0112"));
}
@Test
public void invalidForWithoutVariable() throws Exception {
JtwigTemplate jtwigTemplate = JtwigTemplate.inlineTemplate("{% for in list %}{{k}}={{v}} {% endfor %}");
expectedException.expect(ParseException.class);
expectedException.expectMessage(containsString("Expecting a variable name in for loop"));
jtwigTemplate.render(newModel());
}
@Test
public void invalidForWithoutListVariable() throws Exception {
JtwigTemplate jtwigTemplate = JtwigTemplate.inlineTemplate("{% for i in %}{{k}}={{v}} {% endfor %}");
expectedException.expect(ParseException.class);
expectedException.expectMessage(containsString("Expecting an expression in for loop"));
jtwigTemplate.render(newModel());
}
@Test
public void invalidForWithoutIn() throws Exception {
JtwigTemplate jtwigTemplate = JtwigTemplate.inlineTemplate("{% for i list %}{{k}}={{v}} {% endfor %}");
expectedException.expect(ParseException.class);
expectedException.expectMessage(containsString("Malformed for loop, missing 'in' keyword. For example: {% for i in list %}"));
jtwigTemplate.render(newModel());
}
@Test
public void invalidForMissingEndCode() throws Exception {
JtwigTemplate jtwigTemplate = JtwigTemplate.inlineTemplate("{% for i in list ");
expectedException.expect(ParseException.class);
expectedException.expectMessage(containsString("Malformed for loop start syntax, missing code island ending symbol"));
jtwigTemplate.render(newModel());
}
@Test
public void invalidEndForMissingEndCode() throws Exception {
JtwigTemplate jtwigTemplate = JtwigTemplate.inlineTemplate("{% for i in list %}{% endfor ");
expectedException.expect(ParseException.class);
expectedException.expectMessage(containsString("Malformed for loop end syntax, missing code island ending symbol"));
jtwigTemplate.render(newModel());
}
@Test
public void invalidForMissingSecondVariable() throws Exception {
JtwigTemplate jtwigTemplate = JtwigTemplate.inlineTemplate("{% for k, in list %}");
expectedException.expect(ParseException.class);
expectedException.expectMessage(containsString("Expecting a second variable name in for loop. Example: {% for key, value in list %}"));
jtwigTemplate.render(newModel());
}
@Test
public void invalidForMissingEndTag() throws Exception {
JtwigTemplate jtwigTemplate = JtwigTemplate.inlineTemplate("{% for k in list %}");
expectedException.expect(ParseException.class);
expectedException.expectMessage(containsString("Missing endfor tag"));
jtwigTemplate.render(newModel());
}
}