From 79a2b8a45eb54e1a2e5537d1f00aca41ba5de31c Mon Sep 17 00:00:00 2001 From: Jeff Boulter Date: Fri, 10 Nov 2017 21:30:43 -0500 Subject: [PATCH] support expression tests for select filter that use arguments --- .../jinjava/lib/exptest/IsEqualToExpTest.java | 3 +-- .../hubspot/jinjava/lib/filter/SelectFilter.java | 16 ++++++++++++---- .../jinjava/lib/filter/SelectFilterTest.java | 11 ++++++++--- 3 files changed, 21 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/hubspot/jinjava/lib/exptest/IsEqualToExpTest.java b/src/main/java/com/hubspot/jinjava/lib/exptest/IsEqualToExpTest.java index 25a3079f1..648b8d274 100644 --- a/src/main/java/com/hubspot/jinjava/lib/exptest/IsEqualToExpTest.java +++ b/src/main/java/com/hubspot/jinjava/lib/exptest/IsEqualToExpTest.java @@ -30,8 +30,7 @@ public String getName() { } @Override - public boolean evaluate(Object var, JinjavaInterpreter interpreter, - Object... args) { + public boolean evaluate(Object var, JinjavaInterpreter interpreter, Object... args) { if (args.length == 0) { throw new InterpretException(getName() + " test requires 1 argument"); } diff --git a/src/main/java/com/hubspot/jinjava/lib/filter/SelectFilter.java b/src/main/java/com/hubspot/jinjava/lib/filter/SelectFilter.java index 8c5597071..fe4cec106 100644 --- a/src/main/java/com/hubspot/jinjava/lib/filter/SelectFilter.java +++ b/src/main/java/com/hubspot/jinjava/lib/filter/SelectFilter.java @@ -1,7 +1,9 @@ package com.hubspot.jinjava.lib.filter; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; +import java.util.Map; import com.hubspot.jinjava.doc.annotations.JinjavaDoc; import com.hubspot.jinjava.doc.annotations.JinjavaParam; @@ -23,7 +25,7 @@ code = "{% set some_numbers = [10, 12, 13, 3, 5, 17, 22] %}\n" + "{% some_numbers|select('even') %}") }) -public class SelectFilter implements Filter { +public class SelectFilter implements AdvancedFilter { @Override public String getName() { @@ -31,14 +33,20 @@ public String getName() { } @Override - public Object filter(Object var, JinjavaInterpreter interpreter, String... args) { + public Object filter(Object var, JinjavaInterpreter interpreter, Object[] args, Map kwargs) { List result = new ArrayList<>(); if (args.length == 0) { throw new InterpretException(getName() + " requires an exp test to filter on", interpreter.getLineNumber()); } - ExpTest expTest = interpreter.getContext().getExpTest(args[0]); + Object[] expArgs = new Object[]{}; + + if (args.length > 1) { + expArgs = Arrays.copyOfRange(args, 1, args.length); + } + + ExpTest expTest = interpreter.getContext().getExpTest(args[0].toString()); if (expTest == null) { throw new InterpretException("No exp test defined for name '" + args[0] + "'", interpreter.getLineNumber()); } @@ -47,7 +55,7 @@ public Object filter(Object var, JinjavaInterpreter interpreter, String... args) while (loop.hasNext()) { Object val = loop.next(); - if (expTest.evaluate(val, interpreter)) { + if (expTest.evaluate(val, interpreter, expArgs)) { result.add(val); } } diff --git a/src/test/java/com/hubspot/jinjava/lib/filter/SelectFilterTest.java b/src/test/java/com/hubspot/jinjava/lib/filter/SelectFilterTest.java index e5f4d3e4c..1470bfd0b 100644 --- a/src/test/java/com/hubspot/jinjava/lib/filter/SelectFilterTest.java +++ b/src/test/java/com/hubspot/jinjava/lib/filter/SelectFilterTest.java @@ -17,13 +17,18 @@ public class SelectFilterTest { @Before public void setup() { jinjava = new Jinjava(); - jinjava.getGlobalContext().put("numbers", Lists.newArrayList(1, 2, 3, 4, 5)); + jinjava.getGlobalContext().put("numbers", Lists.newArrayList(1L, 2L, 3L, 4L, 5L)); } @Test public void testSelect() { - assertThat(jinjava.render("{{numbers|select('odd')}}", new HashMap())).isEqualTo("[1, 3, 5]"); - assertThat(jinjava.render("{{numbers|select('even')}}", new HashMap())).isEqualTo("[2, 4]"); + assertThat(jinjava.render("{{numbers|select('odd')}}", new HashMap<>())).isEqualTo("[1, 3, 5]"); + assertThat(jinjava.render("{{numbers|select('even')}}", new HashMap<>())).isEqualTo("[2, 4]"); + } + + @Test + public void testSelectWithEqualToAttr() { + assertThat(jinjava.render("{{numbers|select('equalto', 3)}}", new HashMap<>())).isEqualTo("[3]"); } }