@Test public void itResolvesInnerListVal() { Map<String, Object> dict = Maps.newHashMap(); List<String> inner = Lists.newArrayList("val"); dict.put("inner", inner); context.put("thedict", dict); Object val = interpreter.resolveELExpression("thedict.inner[0]", -1); assertThat(val).isEqualTo("val"); }
@Test public void itResolvesListStringNegativeIndicatingFirst() { context.put("thelist", Lists.newArrayList("foo", "bar", "blah")); Object val = interpreter.resolveELExpression("thelist[-3]", -1); assertThat(val).isEqualTo("foo"); }
@Test public void listRangeSyntax() { List<?> theList = Lists.newArrayList(1, 2, 3, 4, 5); context.put("mylist", theList); assertThat(val("mylist[0:3]")).isEqualTo(Lists.newArrayList(1, 2, 3)); assertThat(val("mylist[5:15]")).isEqualTo(Lists.newArrayList()); assertThat(val("mylist[2]")).isEqualTo(3); }
@Test public void conditionalExprWithElse() { context.put("foo", "bar"); assertThat(val("'hello' if foo=='bar' else 'barf'")).isEqualTo("hello"); assertThat(val("'hello' if foo=='barf' else 'hi'")).isEqualTo("hi"); }
@Test public void itResolvesDictValWithBracket() { Map<String, Object> dict = Maps.newHashMap(); dict.put("foo", "bar"); context.put("thedict", dict); Object val = interpreter.resolveELExpression("thedict['foo']", -1); assertThat(val).isEqualTo("bar"); assertThat(interpreter.getContext().wasExpressionResolved("thedict['foo']")).isTrue(); }
@Test public void itResolvesOtherMethodsOnCustomMapObject() { MyCustomMap dict = new MyCustomMap(); context.put("thedict", dict); Object val = interpreter.resolveELExpression("thedict.size", -1); assertThat(val).isEqualTo("777"); Object val1 = interpreter.resolveELExpression("thedict.size()", -1); assertThat(val1).isEqualTo(3); Object val2 = interpreter.resolveELExpression("thedict.items()", -1); assertThat(val2.toString()).isEqualTo("[foo=bar, two=2, size=777]"); }
@Test public void enterScopeTryWithResources() { interpreter.getContext().put("foo", "parent"); try (InterpreterScopeClosable c = interpreter.enterScope()) { interpreter.getContext().put("foo", "child"); assertThat(interpreter.resolveELExpression("foo", 1)).isEqualTo("child"); } assertThat(interpreter.resolveELExpression("foo", 1)).isEqualTo("parent"); }
@Test public void itTreatsNotFoundPropsAsNull() { context.put("settings", new Object()); TagNode n = fixture("if-non-existent-prop"); assertThat(tag.interpret(n, interpreter).trim()).isEmpty(); }
@Before public void setup() { jinjava = new Jinjava(); jinjava.getGlobalContext().put("numbers", Lists.newArrayList(1L, 2L, 3L, 4L, 5L)); }
@Test public void itSupportsDictionarySyntax() throws Exception { context.put("i_am_seven", 7L); context.put("the_list", Lists.newArrayList(1L, 2L, 3L)); TagNode tagNode = (TagNode) fixture("set-dictionary"); tag.interpret(tagNode, interpreter); Map<String, Object> result = (Map<String, Object>) interpreter.resolveObject("the_dictionary", -1,-1); assertThat(result).contains(entry("seven", 7L)); }
@Test public void presentNestedOptionalProperty() { context.put("myobj", new OptionalProperty(new MyClass(new Date(0)), "foo")); assertThat(Objects.toString(interpreter.resolveELExpression("myobj.nested.date", -1))).isEqualTo( "1970-01-01 00:00:00"); assertThat(interpreter.getErrorsCopy()).isEmpty(); }
@Test public void itAssignsVarToVar() throws Exception { context.put("primary_font_size_num", 10); TagNode tagNode = (TagNode) fixture("set-var-exp"); tag.interpret(tagNode, interpreter); assertThat(interpreter.resolveObject("primary_line_height", -1, -1)).isEqualTo(15.0); }
@Test public void itWillNotReturnClassObjects() { context.put("myobj", new MyClass(new Date(0))); interpreter.resolveELExpression("myobj.getClass()", -1); assertThat(interpreter.getErrorsCopy()).isNotEmpty(); TemplateError e = interpreter.getErrorsCopy().get(0); assertThat(e.getMessage()).contains("Cannot find method 'getClass'"); }
@Test public void presentOptionalProperty() { context.put("myobj", new OptionalProperty(null, "foo")); assertThat(interpreter.resolveELExpression("myobj.val", -1)).isEqualTo("foo"); assertThat(interpreter.getErrorsCopy()).isEmpty(); }
@Test public void forLoopUsingLoopLastVar() { context.put("the_list", Lists.newArrayList(1L, 2L, 3L, 7L)); TagNode tagNode = (TagNode) fixture("loop-last-var"); Document dom = Jsoup.parseBodyFragment(tag.interpret(tagNode, interpreter)); assertThat(dom.select("h3")).hasSize(3); }
@Test public void itStoresResolvedFunctions() { context.put("datetime", 12345); final JinjavaConfig config = JinjavaConfig.newBuilder().build(); String template = "{% for i in range(1, 5) %}{{i}} {% endfor %}\n{{ unixtimestamp(datetime) }}"; final RenderResult renderResult = jinjava.renderForResult(template, context, config); assertThat(renderResult.getOutput()).isEqualTo("1 2 3 4 \n12000"); assertThat(renderResult.getContext().getResolvedFunctions()).hasSameElementsAs(ImmutableSet.of(":range", ":unixtimestamp")); }
@Test public void itSupportsArraySyntax() throws Exception { context.put("i_am_seven", 7L); TagNode tagNode = (TagNode) fixture("set-array"); tag.interpret(tagNode, interpreter); List<Object> result = (List<Object>) interpreter.resolveObject("the_list", -1,-1); assertThat(result).containsExactly(1L, 2L, 3L, 7L); }