package org.jtwig.integration.issues; import org.jtwig.JtwigModel; import org.jtwig.JtwigTemplate; import org.jtwig.exceptions.ResolveValueException; 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.IsEqual.equalTo; import static org.hamcrest.core.StringContains.containsString; import static org.jtwig.environment.EnvironmentConfigurationBuilder.configuration; public class Issue112Test { @Rule public ExpectedException expectedException = ExpectedException.none(); // 1.A @Test public void outputNonexistentVarReturnsEmpty() throws Exception { JtwigModel model = new JtwigModel(); String result = JtwigTemplate .inlineTemplate("{{ nonexistent }}", configuration() .render().withStrictMode(false).and() .build()) .render(model); assertThat(result, is(equalTo(""))); } // 1.B @Test public void outputNonexistentVarThrowsException() throws Exception { expectedException.expectMessage(containsString("Variable 'nonexistent' undefined")); JtwigModel model = new JtwigModel(); JtwigTemplate .inlineTemplate("{{ nonexistent }}", configuration() .render().withStrictMode(true).and() .build()) .render(model); } // 2.A @Test public void selectionExampleWithStrictValidation() throws Exception { JtwigModel model = new JtwigModel(); String result = JtwigTemplate .inlineTemplate("{{ undefinedVar.length }}", configuration() .render().withStrictMode(false).and() .build()) .render(model); assertThat(result, is(equalTo(""))); } // 2.B @Test public void nestedSelectionExampleWithStrictValidation() throws Exception { JtwigModel model = new JtwigModel(); String result = JtwigTemplate .inlineTemplate("{{ undefinedVar.length.another }}", configuration() .render().withStrictMode(false).and() .build()) .render(model); assertThat(result, is(equalTo(""))); } // 2.C @Test public void selectionExampleWithoutStrictValidation() throws Exception { expectedException.expect(ResolveValueException.class); expectedException.expectMessage(containsString("Variable 'undefinedVar' undefined")); JtwigModel model = new JtwigModel(); JtwigTemplate .inlineTemplate("{{ undefinedVar.length }}", configuration() .render().withStrictMode(true).and() .build()) .render(model); } // 3.A @Test public void operationExampleWithoutStrictValidation () throws Exception {JtwigModel model = new JtwigModel(); String result = JtwigTemplate .inlineTemplate("{{ undefinedVar + 3 }}", configuration() .render().withStrictMode(false).and() .build()) .render(model); assertThat(result, is(equalTo("3"))); } // 3.B @Test public void operationExampleWithStrictValidation () throws Exception { expectedException.expect(ResolveValueException.class); expectedException.expectMessage(containsString("Variable 'undefinedVar' undefined")); JtwigModel model = new JtwigModel(); JtwigTemplate .inlineTemplate("{{ undefinedVar + 3 }}", configuration() .render().withStrictMode(true).and() .build()) .render(model); } // 3.C @Test public void operationWithNonexistentVarThrowsException() throws Exception { expectedException.expect(ResolveValueException.class); expectedException.expectMessage(containsString("Variable 'b' undefined")); JtwigModel model = new JtwigModel(); JtwigTemplate .inlineTemplate("{% set a = 5 %}{{ a - b }}", configuration() .render().withStrictMode(true).and() .build()) .render(model); } // 3.D @Test public void subtractOperationWithNullVarInStrictMode() throws Exception {JtwigModel model = new JtwigModel(); String result = JtwigTemplate .inlineTemplate("{% set a = 5 %}{% set b = null %}{{ a - b }}", configuration() .render().withStrictMode(true).and() .build()) .render(model); assertThat(result, is(equalTo("5"))); } // 3.E @Test public void subtractOperationWithNullVarInNonStrictMode() throws Exception { JtwigModel model = new JtwigModel(); String result = JtwigTemplate .inlineTemplate("{% set a = 5 %}{% set b = null %}{{ a - b }}", configuration() .render().withStrictMode(false).and() .build()) .render(model); assertThat(result, is(equalTo("5"))); } // 3.F @Test public void divOperationWithNullVarInStrictMode() throws Exception { expectedException.expect(ArithmeticException.class); expectedException.expectMessage(containsString("Division by zero")); JtwigModel model = new JtwigModel(); JtwigTemplate .inlineTemplate("{% set a = 5 %}{% set b = null %}{{ a / b }}", configuration() .render().withStrictMode(true).and() .build()) .render(model); } // 3.G @Test public void divOperationWithNullVarInNonStrictMode() throws Exception { expectedException.expect(ArithmeticException.class); expectedException.expectMessage(containsString("Division by zero")); JtwigModel model = new JtwigModel(); JtwigTemplate .inlineTemplate("{% set a = 5 %}{% set b = null %}{{ a / b }}", configuration() .render().withStrictMode(false).and() .build()) .render(model); } // 4.A @Test public void outputNullVarReturnsEmpty() throws Exception { JtwigModel model = new JtwigModel(); String result = JtwigTemplate .inlineTemplate("{% set nothing = null %}{{ nothing }}", configuration() .render().withStrictMode(false).and() .build()) .render(model); assertThat(result, is(equalTo(""))); } // 4.B @Test public void outputNullVarThrowsException() throws Exception {JtwigModel model = new JtwigModel(); String result = JtwigTemplate .inlineTemplate("{% set nothing = null %}{{ nothing }}", configuration() .render().withStrictMode(true).and() .build()) .render(model); assertThat(result, is(equalTo(""))); } @Test public void comparisonBetweenUndefinedAndZero() throws Exception {JtwigModel model = new JtwigModel(); String result = JtwigTemplate .inlineTemplate("{{ nothing == 0 }}", configuration() .render().withStrictMode(false).and() .build()) .render(model); assertThat(result, is(equalTo("true"))); } @Test public void comparisonBetweenUndefinedAndNull() throws Exception { JtwigModel model = new JtwigModel(); String result = JtwigTemplate .inlineTemplate("{{ nothing == null }}", configuration() .render().withStrictMode(false).and() .build()) .render(model); assertThat(result, is(equalTo("true"))); } @Test public void exceptionShouldDisplayFilename() throws Exception { expectedException.expect(ParseException.class); expectedException.expectMessage(containsString("classpath:/example/classpath-error.twig")); JtwigTemplate.classpathTemplate("/example/classpath-error.twig") .render(JtwigModel.newModel()); } }