aboutsummaryrefslogtreecommitdiff
path: root/velocity-engine-core/src/test/java/org/apache/velocity/test/VarargMethodsTestCase.java
diff options
context:
space:
mode:
Diffstat (limited to 'velocity-engine-core/src/test/java/org/apache/velocity/test/VarargMethodsTestCase.java')
-rw-r--r--velocity-engine-core/src/test/java/org/apache/velocity/test/VarargMethodsTestCase.java278
1 files changed, 278 insertions, 0 deletions
diff --git a/velocity-engine-core/src/test/java/org/apache/velocity/test/VarargMethodsTestCase.java b/velocity-engine-core/src/test/java/org/apache/velocity/test/VarargMethodsTestCase.java
new file mode 100644
index 00000000..a87bba8e
--- /dev/null
+++ b/velocity-engine-core/src/test/java/org/apache/velocity/test/VarargMethodsTestCase.java
@@ -0,0 +1,278 @@
+package org.apache.velocity.test;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import org.apache.velocity.VelocityContext;
+
+/**
+ * Used to check that vararg method calls on references work properly
+ */
+public class VarargMethodsTestCase extends BaseTestCase
+{
+ public VarargMethodsTestCase(final String name)
+ {
+ super(name);
+ }
+
+ @Override
+ protected void setUpContext(VelocityContext context)
+ {
+ context.put("nice", new NiceTool());
+ context.put("nasty", new NastyTool());
+ context.put("objects", new Object[] { this, VelocityContext.class });
+ context.put("strings", new String[] { "one", "two" });
+ context.put("doubles", new double[] { 1.5, 2.5 });
+ context.put("float", 1f);
+ context.put("ints", new int[] { 1, 2 });
+ }
+
+ public void testStrings()
+ {
+ assertEvalEquals("onetwo", "$nice.var($strings)");
+ assertEvalEquals("onetwo", "$nice.var('one','two')");
+ assertEvalEquals("one", "$nice.var('one')");
+ assertEvalEquals("", "$nice.var()");
+ }
+
+ public void testDoubles()
+ {
+ assertEvalEquals("4.0", "$nice.add($doubles)");
+ assertEvalEquals("3.0", "$nice.add(1,2)");
+ assertEvalEquals("1.0", "$nice.add(1)");
+ assertEvalEquals("0.0", "$nice.add()");
+ }
+
+ public void testFloatToDoubleVarArg()
+ {
+ assertEvalEquals("1.0", "$nice.add($float)");
+ }
+
+ public void testStringVsStrings()
+ {
+ assertEvalEquals("onlyone", "$nasty.var('one')");
+ assertEvalEquals("onlynull", "$nasty.var($null)");
+ assertEvalEquals("", "$nasty.var()");
+ }
+
+ public void testIntVsDoubles()
+ {
+ assertEvalEquals("1", "$nasty.add(1)");
+ assertEvalEquals("1.0", "$nasty.add(1.0)");
+ assertEvalEquals("3.0", "$nasty.add(1.0,2)");
+ }
+
+ public void testInts()
+ {
+ assertEvalEquals("3", "$nasty.add($ints)");
+ assertEvalEquals("3", "$nasty.add(1,2)");
+ assertEvalEquals("1", "$nasty.add(1)");
+ // add(int[]) wins because it is "more specific"
+ assertEvalEquals("0", "$nasty.add()");
+ }
+
+ public void testStringsVsObjectsAKASubclassVararg()
+ {
+ assertEvalEquals("objects", "$nice.test($objects)");
+ assertEvalEquals("objects", "$nice.test($nice,$nasty,$ints)");
+ assertEvalEquals("strings", "$nice.test('foo')");
+ }
+
+ public void testObjectVarArgVsObjectEtc()
+ {
+ assertEvalEquals("object,string", "$nasty.test($nice,'foo')");
+ }
+
+ public void testObjectVarArgVsObjectVelocity605()
+ {
+ assertEvalEquals("string", "$nasty.test('joe')");
+ assertEvalEquals("object", "$nasty.test($nice)");
+ }
+
+ public void testNoArgs()
+ {
+ assertEvalEquals("noargs", "$nasty.test()");
+ }
+
+ public void testPassingArrayToVarArgVelocity642()
+ {
+ assertEvalEquals("[one, two]", "$nasty.test642($strings)");
+ assertEvalEquals("[1, 2]", "#set( $list = [1..2] )$nasty.test642($list.toArray())");
+ }
+
+ public void testNullToPrimitiveVarArg()
+ {
+ assertEvalEquals("int[]", "$nasty.test649($null)");
+ }
+
+ public void testArgsBeforeVarargWithNoArgs()
+ {
+ assertEvalEquals("String,String,Object[]", "$nasty.test651('a','b')");
+ }
+
+ public void testVelocity651()
+ {
+ assertEvalEquals("String,List", "$nasty.test651('test',['TEST'])");
+ }
+
+ public void testMax()
+ {
+ assertEvalEquals("4", "$nasty.max(4, 3.5)");
+ }
+
+ public static class NiceTool
+ {
+ public String var(String[] ss)
+ {
+ StringBuilder out = new StringBuilder();
+ for (String s : ss)
+ {
+ out.append(s);
+ }
+ return out.toString();
+ }
+
+ public double add(double[] dd)
+ {
+ double total = 0;
+ for (double aDd : dd)
+ {
+ total += aDd;
+ }
+ return total;
+ }
+
+ public String test(Object[] oo)
+ {
+ return "objects";
+ }
+
+ public String test(String[] oo)
+ {
+ return "strings";
+ }
+
+ }
+
+ public static class NastyTool extends NiceTool
+ {
+ public String var(String s)
+ {
+ return "only"+s;
+ }
+
+ public int add(int[] ii)
+ {
+ int total = 0;
+ for (int anIi : ii)
+ {
+ total += anIi;
+ }
+ return total;
+ }
+
+ public int add(int i)
+ {
+ return i;
+ }
+
+ public String test()
+ {
+ return "noargs";
+ }
+
+ public Object test(Object arg)
+ {
+ return "object";
+ }
+
+ public Object test(String arg)
+ {
+ return "string";
+ }
+
+ @Override
+ public String test(Object[] array)
+ {
+ return "object[]";
+ }
+
+ public String test(Object object, String property)
+ {
+ return "object,string";
+ }
+
+ public String test642(Object[] array)
+ {
+ //JDK5: return Arrays.deepToString(array);
+ if (array == null)
+ {
+ return null;
+ }
+ StringBuilder o = new StringBuilder("[");
+ for (int i=0; i < array.length; i++)
+ {
+ if (i > 0)
+ {
+ o.append(", ");
+ }
+ o.append((array[i]));
+ }
+ o.append("]");
+ return o.toString();
+ }
+
+ public String test649(int[] array)
+ {
+ return "int[]";
+ }
+
+ public String test651(String s, String s2, Object[] args)
+ {
+ return "String,String,Object[]";
+ }
+
+ public String test651(String s, java.util.List l)
+ {
+ return "String,List";
+ }
+
+ public Number max(Number n1, Number n2) { return max(new Number[] { n1, n2 }); }
+
+ public Number max(Number[] numbers)
+ {
+ if (numbers.length == 0) return null;
+ int minindex = -1, i = 0;
+ double val = Double.MIN_VALUE;
+ for (Number n : numbers)
+ {
+ if (n.floatValue() > val)
+ {
+ minindex = i;
+ val = n.floatValue();
+ }
+ ++i;
+ }
+ if (minindex < 0) minindex = 0;
+ return numbers[minindex];
+ }
+
+ }
+
+}