Repository: incubator-freemarker
Updated Branches:
  refs/heads/3 410fd0d8c -> 8ba7883e5


http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/8ba7883e/src/test/resources/org/apache/freemarker/test/templatesuite/templates/overloaded-methods.ftl
----------------------------------------------------------------------
diff --git 
a/src/test/resources/org/apache/freemarker/test/templatesuite/templates/overloaded-methods.ftl
 
b/src/test/resources/org/apache/freemarker/test/templatesuite/templates/overloaded-methods.ftl
new file mode 100644
index 0000000..2d85dcc
--- /dev/null
+++ 
b/src/test/resources/org/apache/freemarker/test/templatesuite/templates/overloaded-methods.ftl
@@ -0,0 +1,413 @@
+<#--
+  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.
+-->
+
+<@assertEquals actual=obj.mStringArrayVsListPreference(obj.javaStringList) 
expected="mStringArrayVsListPreference(List [a, b])" />
+<@assertEquals actual=obj.mStringArrayVsListPreference(obj.javaStringArray) 
expected="mStringArrayVsListPreference(String[] [a, b])" />
+<#if dow>
+  <@assertEquals actual=obj.mStringArrayVsListPreference(obj.javaObjectArray) 
expected="mStringArrayVsListPreference(List [a, b])" />
+</#if>
+
+<#-- Check if non-overloaded calls still work; they share some code with 
overloaded methods: -->
+<@assertEquals actual=obj.mIntArrayNonOverloaded([1, 2, 3]) 
expected="mIntArrayNonOverloaded(int[] [1, 2, 3])" />
+<@assertEquals actual=obj.mIntegerArrayNonOverloaded([1, 2, 3]) 
expected="mIntegerArrayNonOverloaded(Integer[] [1, 2, 3])" />
+<@assertEquals actual=obj.mIntegerListNonOverloaded([1, 2, 3]) 
expected="mIntegerListNonOverloaded(List<Integer> [1, 2, 3])" />
+<@assertEquals actual=obj.mStringListNonOverloaded(['a', 'b', 'c']) 
expected="mStringListNonOverloaded(List<String> [a, b, c])" />
+<@assertEquals actual=obj.mStringListNonOverloaded(obj.javaStringList) 
expected="mStringListNonOverloaded(List<String> [a, b])" />
+<@assertEquals actual=obj.mStringListNonOverloaded(obj.javaStringArray) 
expected="mStringListNonOverloaded(List<String> [a, b])" />
+<@assertEquals actual=obj.mStringArrayNonOverloaded(['a', 'b', 'c']) 
expected="mStringArrayNonOverloaded(String[] [a, b, c])" />
+<@assertEquals actual=obj.mStringArrayNonOverloaded(obj.javaStringList) 
expected="mStringArrayNonOverloaded(String[] [a, b])" />
+<@assertEquals actual=obj.mStringArrayNonOverloaded(obj.javaStringArray) 
expected="mStringArrayNonOverloaded(String[] [a, b])" />
+<@assertEquals actual=obj.mObjectListNonOverloaded(['a', 'b', 3]) 
expected="mObjectListNonOverloaded(List<Object> [a, b, 3])" />
+<@assertEquals actual=obj.mObjectListNonOverloaded(obj.javaStringList) 
expected="mObjectListNonOverloaded(List<Object> [a, b])" />
+<@assertEquals actual=obj.mObjectListNonOverloaded(obj.javaStringArray) 
expected="mObjectListNonOverloaded(List<Object> [a, b])" />
+<@assertEquals actual=obj.mObjectArrayNonOverloaded(['a', 'b', 3]) 
expected="mObjectArrayNonOverloaded(Object[] [a, b, 3])" />
+<@assertEquals actual=obj.mObjectArrayNonOverloaded(obj.javaStringList) 
expected="mObjectArrayNonOverloaded(Object[] [a, b])" />
+<@assertEquals actual=obj.mObjectArrayNonOverloaded(obj.javaStringArray) 
expected="mObjectArrayNonOverloaded(Object[] [a, b])" />
+
+<@assertEquals actual=obj.mStringArrayVsListPreference(obj.javaStringArray) 
expected="mStringArrayVsListPreference(String[] [a, b])" />
+
+<@assertEquals actual=obj.mStringArrayVarargsNonOverloaded('a', 'b') 
expected="mStringArrayVarargsNonOverloaded(String[] [a, b])" />
+<@assertEquals actual=obj.mStringArrayVarargsNonOverloaded(['a', 'b']) 
expected="mStringArrayVarargsNonOverloaded(String[] [a, b])" />
+<@assertEquals actual=obj.mStringArrayVarargsNonOverloaded(obj.javaStringList) 
expected="mStringArrayVarargsNonOverloaded(String[] [a, b])" />
+<@assertEquals 
actual=obj.mStringArrayVarargsNonOverloaded(obj.javaStringArray) 
expected="mStringArrayVarargsNonOverloaded(String[] [a, b])" />
+
+<@assertEquals actual=obj.mStringArrayVarargsOverloaded1('a', 'b') 
expected="mStringArrayVarargsOverloaded1(String[] [a, b])" />
+<@assertEquals actual=obj.mStringArrayVarargsOverloaded1(['a', 'b']) 
expected="mStringArrayVarargsOverloaded1(List [a, b])" />
+<@assertEquals actual=obj.mStringArrayVarargsOverloaded1(obj.javaStringList) 
expected="mStringArrayVarargsOverloaded1(List [a, b])" />
+<@assertEquals actual=obj.mStringArrayVarargsOverloaded1(obj.javaStringArray) 
expected="mStringArrayVarargsOverloaded1(String[] [a, b])" />
+
+<@assertEquals actual=obj.mStringArrayVarargsOverloaded2('a', 'b') 
expected="mStringArrayVarargsOverloaded2(String[] [a, b])" />
+<@assertEquals actual=obj.mStringArrayVarargsOverloaded2('a') 
expected="mStringArrayVarargsOverloaded2(String a)" />
+
+<@assertEquals actual=obj.mStringArrayVarargsOverloaded3(['a']) 
expected="mStringArrayVarargsOverloaded3(String[] [a])" />
+<@assertEquals actual=obj.mStringArrayVarargsOverloaded3(['a', 'b']) 
expected="mStringArrayVarargsOverloaded3(String[] [a, b])" />
+<@assertEquals actual=obj.mStringArrayVarargsOverloaded3(['a', 'b', 'c']) 
expected="mStringArrayVarargsOverloaded3(String[] [a, b, c])" />
+<@assertEquals actual=obj.mStringArrayVarargsOverloaded3('a') 
expected="mStringArrayVarargsOverloaded3(String[] [a])" />
+<@assertEquals actual=obj.mStringArrayVarargsOverloaded3('a', 'b') 
expected="mStringArrayVarargsOverloaded3(String a, String b)" />
+<@assertEquals actual=obj.mStringArrayVarargsOverloaded3('a', 'b', 'c') 
expected="mStringArrayVarargsOverloaded3(String[] [a, b, c])" />
+
+<@assertEquals actual=obj.mListOrString(['a', 'b']) 
expected="mListOrString(List [a, b])" />
+<@assertEquals actual=obj.mListOrString('a') expected="mListOrString(String 
a)" />
+<@assertEquals actual=obj.mListListOrString([['a'], 'b', 3]) 
expected="mListListOrString(List [[a], b, 3])" />
+<@assertEquals actual=obj.mListListOrString('s') 
expected="mListListOrString(String s)" />
+
+<#-- Because the fixed arg interpretations are ambiguous, it only considers 
the vararg interpretations:  -->
+<@assertEquals actual=obj.mStringArrayVarargsOverloaded4(['a', 'b', 'c']) 
expected="mStringArrayVarargsOverloaded4(List[] [[a, b, c]])" />
+<@assertEquals actual=obj.mStringArrayVarargsOverloaded4('a', 'b', 'c') 
expected="mStringArrayVarargsOverloaded4(String[] [a, b, c])" />
+
+<#-- Fixed arg solutions have priority: -->
+<@assertEquals actual=obj.mStringArrayVarargsOverloaded4(obj.javaStringList) 
expected="mStringArrayVarargsOverloaded4(List[] [[a, b]])" />
+<@assertEquals actual=obj.mStringArrayVarargsOverloaded4(obj.javaStringArray) 
expected="mStringArrayVarargsOverloaded4(String[] [a, b])" />
+
+<#-- Choses between the vararg solutions: -->
+<@assertEquals actual=obj.mStringArrayVarargsOverloaded4(obj.javaStringList, 
obj.javaStringList) expected="mStringArrayVarargsOverloaded4(List[] [[a, b], 
[a, b]])" />
+
+<#-- Until there's no overloading String->Character conversion work: -->
+<@assertEquals actual=obj.mCharNonOverloaded('c') 
expected="mCharNonOverloaded(char c)" />
+<@assertEquals actual=obj.mCharNonOverloaded(obj.javaString) 
expected="mCharNonOverloaded(char s)" />
+<@assertEquals actual=obj.mCharacterNonOverloaded('c') 
expected="mCharacterNonOverloaded(Character c)" />
+<@assertEquals actual=obj.mCharacterNonOverloaded(obj.javaString) 
expected="mCharacterNonOverloaded(Character s)" />
+
+<@assertEquals actual=obj.mCharOrStringOverloaded('s', 1) 
expected="mCharOrStringOverloaded(String s, int 1)" />
+<@assertEquals actual=obj.mCharacterOrStringOverloaded('s', 1) 
expected="mCharacterOrStringOverloaded(String s, int 1)" />
+<@assertEquals actual=obj.mCharOrStringOverloaded2('ss') 
expected="mCharOrStringOverloaded2(String ss)" />
+<@assertEquals actual=obj.mCharacterOrStringOverloaded2('ss') 
expected="mCharacterOrStringOverloaded2(String ss)" />
+
+<@assertEquals actual=obj.mVarargs('a', obj.getNnS('b'), obj.getNnS('c')) 
expected='mVarargs(String... a1 = abc)' />
+
+<@assertEquals actual=obj.mNull1(null) expected="mNull1(String a1 = null)" />
+<@assertEquals actual=obj.mNull1(123) expected="mNull1(int a1 = 123)" />
+<@assertEquals actual=obj.mNull2(null) expected="mNull2(String a1 = null)" />
+<@assertEquals actual=obj.mVarargs('a', null) expected="mVarargs(String... a1 
= anull)" />
+<@assertEquals actual=obj.mVarargs(null, 'a') expected="mVarargs(File a1, 
String... a2)" />
+<@assertEquals actual=obj.mSpecificity('a', 'b') expected="mSpecificity(String 
a1, Object a2)" />
+
+<@assertEquals actual=obj.mChar('a') expected='mChar(char a1 = a)' />
+<@assertEquals actual=obj.mBoolean(true) expected="mBoolean(boolean a1 = 
true)" />
+<@assertEquals actual=obj.mBoolean(null) expected="mBoolean(Boolean a1 = 
null)" />
+
+<@assertEquals actual=obj.mIntNonOverloaded(123?long) expected=123 />
+<@assertEquals actual=obj.mIntNonOverloaded(123) expected=123 />
+<@assertEquals actual=obj.mIntNonOverloaded(123.5) expected=123 />
+<@assertEquals actual=obj.mIntNonOverloaded(2147483648) expected=-2147483648 
/> <#-- overflow -->
+<@assertEquals actual=obj.mNumBoxedVSBoxed(123.5) 
expected='mNumBoxedVSBoxed(Long a1 = 123)' />
+<@assertEquals actual=obj.mNumBoxedVSBoxed(123?int) 
expected='mNumBoxedVSBoxed(Long a1 = 123)' />
+<@assertEquals actual=obj.mNumBoxedVSBoxed(123?long) 
expected="mNumBoxedVSBoxed(Long a1 = 123)" />
+<@assertEquals actual=obj.mNumBoxedVSBoxed(123?short) 
expected="mNumBoxedVSBoxed(Short a1 = 123)" />
+<@assertEquals 
+    actual=obj.mNumUnambigous(2147483648) expected="mNumUnambigous(Integer a1 
= -2147483648)" /> <#-- overflow -->
+
+<@assertEquals actual=obj.mIntPrimVSBoxed(123?int) 
expected="mIntPrimVSBoxed(int a1 = 123)" />
+<@assertEquals actual=obj.mIntPrimVSBoxed(123?short) 
expected="mIntPrimVSBoxed(int a1 = 123)" />
+<@assertEquals actual=obj.mIntPrimVSBoxed(123) expected="mIntPrimVSBoxed(int 
a1 = 123)" />
+<#-- This doesn't fail as 123L can be converted to int without loss: -->
+<@assertEquals actual=obj.mIntPrimVSBoxed(123?long) 
expected="mIntPrimVSBoxed(int a1 = 123)" />
+
+<@assertEquals actual=obj.mNumPrimVSPrim(123?short) 
expected="mNumPrimVSPrim(short a1 = 123)" />
+<@assertEquals actual=obj.mNumPrimVSPrim(123?int) 
expected="mNumPrimVSPrim(long a1 = 123)" />
+<@assertEquals actual=obj.mNumPrimVSPrim(123?long) 
expected="mNumPrimVSPrim(long a1 = 123)" />
+<@assertEquals actual=obj.mNumPrimVSPrim(123?double) 
expected="mNumPrimVSPrim(long a1 = 123)" />
+<@assertEquals actual=obj.mNumPrimVSPrim(123456) expected="mNumPrimVSPrim(long 
a1 = 123456)" />
+
+<@assertEquals actual=obj.mNumPrimAll(123?byte) expected="mNumPrimAll(byte a1 
= 123)" />
+<@assertEquals actual=obj.mNumPrimAll(123?short) expected="mNumPrimAll(short 
a1 = 123)" />
+<@assertEquals actual=obj.mNumPrimAll(123?int) expected="mNumPrimAll(int a1 = 
123)" />
+<@assertEquals actual=obj.mNumPrimAll(123?long) expected="mNumPrimAll(long a1 
= 123)" />
+<@assertEquals actual=obj.mNumPrimAll(123?float) expected="mNumPrimAll(float 
a1 = 123.0)" />
+<@assertEquals actual=obj.mNumPrimAll(123?double) expected="mNumPrimAll(double 
a1 = 123.0)" />
+<@assertEquals actual=obj.mNumPrimAll(123) expected="mNumPrimAll(BigDecimal a1 
= 123)" />
+<@assertEquals actual=obj.mNumPrimAll(obj.bigInteger(123)) 
expected="mNumPrimAll(BigInteger a1 = 123)" />
+
+<@assertEquals actual=obj.mNumBoxedAll(123?byte) expected="mNumBoxedAll(Byte 
a1 = 123)" />
+<@assertEquals actual=obj.mNumBoxedAll(123?short) expected="mNumBoxedAll(Short 
a1 = 123)" />
+<@assertEquals actual=obj.mNumBoxedAll(123?int) expected="mNumBoxedAll(Integer 
a1 = 123)" />
+<@assertEquals actual=obj.mNumBoxedAll(123?long) expected="mNumBoxedAll(Long 
a1 = 123)" />
+<@assertEquals actual=obj.mNumBoxedAll(123?float) expected="mNumBoxedAll(Float 
a1 = 123.0)" />
+<@assertEquals actual=obj.mNumBoxedAll(123?double) 
expected="mNumBoxedAll(Double a1 = 123.0)" />
+<@assertEquals actual=obj.mNumBoxedAll(123) expected="mNumBoxedAll(BigDecimal 
a1 = 123)" />
+<@assertEquals actual=obj.mNumBoxedAll(obj.bigInteger(123)) 
expected="mNumBoxedAll(BigInteger a1 = 123)" />
+
+<@assertEquals actual=obj.mNumPrimAll2nd(123?byte) 
expected="mNumPrimAll2nd(short a1 = 123)" />
+<@assertEquals actual=obj.mNumPrimAll2nd(123?short) 
expected="mNumPrimAll2nd(short a1 = 123)" />
+<@assertEquals actual=obj.mNumPrimAll2nd(123?int) 
expected="mNumPrimAll2nd(long a1 = 123)" />
+<@assertEquals actual=obj.mNumPrimAll2nd(123?long) 
expected="mNumPrimAll2nd(long a1 = 123)" />
+<@assertEquals actual=obj.mNumPrimAll2nd(123?float) 
expected="mNumPrimAll2nd(double a1 = 123.0)" />
+<@assertEquals actual=obj.mNumPrimAll2nd(123?double) 
expected="mNumPrimAll2nd(double a1 = 123.0)" />
+
+<@assertEquals actual=obj.mNumBoxedAll2nd(123?byte) 
expected="mNumBoxedAll2nd(Short a1 = 123)" />
+<@assertEquals actual=obj.mNumBoxedAll2nd(123?short) 
expected="mNumBoxedAll2nd(Short a1 = 123)" />
+<@assertEquals actual=obj.mNumBoxedAll2nd(123?int) 
expected="mNumBoxedAll2nd(Long a1 = 123)" />
+<@assertEquals actual=obj.mNumBoxedAll2nd(123?long) 
expected="mNumBoxedAll2nd(Long a1 = 123)" />
+<@assertEquals actual=obj.mNumBoxedAll2nd(123?float) 
expected="mNumBoxedAll2nd(Double a1 = 123.0)" />
+<@assertEquals actual=obj.mNumBoxedAll2nd(123?double) 
expected="mNumBoxedAll2nd(Double a1 = 123.0)" />
+ 
+<@assertEquals actual=obj.mNumPrimFallbackToNumber(123?int) 
expected="mNumPrimFallbackToNumber(long a1 = 123)" />
+<@assertEquals actual=obj.mNumPrimFallbackToNumber(123?long) 
expected="mNumPrimFallbackToNumber(long a1 = 123)" />
+<@assertEquals actual=obj.mNumPrimFallbackToNumber(123?double) 
expected="mNumPrimFallbackToNumber(long a1 = 123)" />
+<@assertEquals actual=obj.mNumPrimFallbackToNumber(123.5?double) 
expected="mNumPrimFallbackToNumber(Number a1 = 123.5)" />
+<@assertEquals actual=obj.mNumPrimFallbackToNumber(123) 
expected="mNumPrimFallbackToNumber(long a1 = 123)" />
+<@assertEquals actual=obj.mNumPrimFallbackToNumber(obj.bigInteger(123)) 
expected="mNumPrimFallbackToNumber(long a1 = 123)" />
+<@assertEquals 
actual=obj.mNumPrimFallbackToNumber(obj.bigInteger(9223372036854775808))
+    expected="mNumPrimFallbackToNumber(Number a1 = 9223372036854775808)" />
+<@assertEquals actual=obj.mNumPrimFallbackToNumber(obj.rational(246, 2)) 
expected="mNumPrimFallbackToNumber(Number a1 = 246/2)" />
+<@assertEquals actual=obj.mNumPrimFallbackToNumber('x') 
expected="mNumPrimFallbackToNumber(Object a1 = x)" />
+
+<@assertEquals actual=obj.mNumBoxedFallbackToNumber(123?int) 
expected="mNumBoxedFallbackToNumber(Long a1 = 123)" />
+<@assertEquals actual=obj.mNumBoxedFallbackToNumber(123?long) 
expected="mNumBoxedFallbackToNumber(Long a1 = 123)" />
+<@assertEquals actual=obj.mNumBoxedFallbackToNumber(123?double) 
expected="mNumBoxedFallbackToNumber(Long a1 = 123)" />
+<@assertEquals actual=obj.mNumBoxedFallbackToNumber(123.5?double) 
expected="mNumBoxedFallbackToNumber(Number a1 = 123.5)" />
+<@assertEquals actual=obj.mNumBoxedFallbackToNumber(123) 
expected="mNumBoxedFallbackToNumber(Long a1 = 123)" />
+<@assertEquals actual=obj.mNumBoxedFallbackToNumber(obj.bigInteger(123)) 
expected="mNumBoxedFallbackToNumber(Long a1 = 123)" />
+<@assertEquals 
actual=obj.mNumBoxedFallbackToNumber(obj.bigInteger(9223372036854775808))
+    expected="mNumBoxedFallbackToNumber(Number a1 = 9223372036854775808)" />
+<@assertEquals actual=obj.mNumBoxedFallbackToNumber(obj.rational(246, 2)) 
expected="mNumBoxedFallbackToNumber(Number a1 = 246/2)" />
+<@assertEquals actual=obj.mNumBoxedFallbackToNumber('x') 
expected="mNumBoxedFallbackToNumber(Object a1 = x)" />
+
+<@assertEquals actual=obj.mDecimalLoss(1.5) expected="mDecimalLoss(double a1 = 
1.5)" />
+<@assertEquals actual=obj.mDecimalLoss(1.5?double) 
expected="mDecimalLoss(double a1 = 1.5)" />
+
+<@assertEquals actual=obj.mNumConversionLoses1(1?double, '', '') 
expected="Number 1.0 java.lang.Double" />
+<@assertEquals actual=obj.mNumConversionLoses1(1?short, '', '') 
expected="Number 1 java.lang.Short" />
+<@assertEquals actual=obj.mNumConversionLoses1(1?long, '', '') 
expected="Number 1 java.lang.Long" />
+<@assertEquals actual=obj.mNumConversionLoses2(1?double, '', '') 
expected="Number 1.0 java.lang.Double" />
+<@assertEquals actual=obj.mNumConversionLoses2(1?short, '', '') 
expected="Number 1 java.lang.Short" />
+<@assertEquals actual=obj.mNumConversionLoses2(1?long, '', '') 
expected="Number 1 java.lang.Long" />
+<@assertEquals actual=obj.mNumConversionLoses3(1?double, '', '') 
expected="Serializable 1.0 java.lang.Double" />
+<@assertEquals actual=obj.mNumConversionLoses3(1?int, '', '') 
expected="Serializable 1 java.lang.Integer" />
+<@assertEquals actual=obj.mNumConversionLoses3(1?short, '', '') 
expected="Serializable 1 java.lang.Short" />
+<@assertEquals actual=obj.mNumConversionLoses3(1?long, '', '') 
expected="Serializable 1 java.lang.Long" />
+
+<#-- BigDecimal-to-int is preferred over to-long for BC and user expectations: 
-->
+<@assertEquals actual=obj.nIntAndLong(1) expected="nIntAndLong(int 1)" />
+<@assertEquals actual=obj.nIntAndLong(1?long) expected="nIntAndLong(long 1)" />
+<#-- BigDecimal-to-short is, however unfavored due to the higher chance of 
overflow: -->
+<@assertEquals actual=obj.nIntAndShort(1) expected="nIntAndShort(int 1)" />
+<@assertEquals actual=obj.nIntAndShort(1?short) expected="nIntAndShort(short 
1)" />
+<@assertEquals actual=obj.nLongAndShort(1) expected="nLongAndShort(long 1)" />
+<@assertEquals actual=obj.nLongAndShort(1?short) expected="nLongAndShort(short 
1)" />
+
+<@assertEquals actual=obj.varargs1(null, 1, 2, 3.5) expected='varargs1(String 
s = null, double... xs = [1.0, 2.0, 3.5])' />
+<@assertEquals actual=obj.varargs1(null, 1, 2.5, 3) expected='varargs1(String 
s = null, double... xs = [1.0, 2.5, 3.0])' />
+<@assertEquals actual=obj.varargs1(null, 1.5, 2, 3) expected='varargs1(String 
s = null, double... xs = [1.5, 2.0, 3.0])' />
+<@assertEquals actual=obj.varargs1(null, 1, 2, 'c') expected='varargs1(String 
s = null, Object... xs = [1, 2, c])' />
+<@assertEquals actual=obj.varargs1(null, 1, 'b', 3) expected='varargs1(String 
s = null, Object... xs = [1, b, 3])' />
+<@assertEquals actual=obj.varargs1(null, 'a', 2, 3) expected='varargs1(String 
s = null, Object... xs = [a, 2, 3])' />
+<@assertEquals actual=obj.varargs1('s', 1, 2, 3) expected='varargs1(String s = 
"s", int... xs = [1, 2, 3])' />
+<@assertEquals actual=obj.varargs1('s', 1.1, 2.1, 3.1) 
expected='varargs1(String s = "s", double... xs = [1.1, 2.1, 3.1])' />
+<@assertEquals actual=obj.varargs1('s', 'a', 'b', 'c') 
expected='varargs1(String s = "s", Object... xs = [a, b, c])' />
+<@assertEquals actual=obj.varargs1(null, 1, 2, 3) expected='varargs1(String s 
= null, int... xs = [1, 2, 3])' />
+<@assertEquals actual=obj.varargs1(null, 1.1, 2.1, 3.1) 
expected='varargs1(String s = null, double... xs = [1.1, 2.1, 3.1])' />
+<@assertEquals actual=obj.varargs1(null, 'a', 'b', 'c') 
expected='varargs1(String s = null, Object... xs = [a, b, c])' />
+<@assertEquals actual=obj.varargs1(null, 1, 2, 3?double) 
expected='varargs1(String s = null, int... xs = [1, 2, 3])' />
+<@assertEquals actual=obj.varargs1(null, 1, 2?double, 3?double) 
expected='varargs1(String s = null, double... xs = [1.0, 2.0, 3.0])' />
+<@assertEquals actual=obj.varargs1(null, 1, 2?float, 3?float) 
expected='varargs1(String s = null, double... xs = [1.0, 2.0, 3.0])' />
+<@assertEquals actual=obj.varargs1(null, 1?double, 2?byte, 3?byte) 
expected='varargs1(String s = null, int... xs = [1, 2, 3])' />
+<@assertEquals actual=obj.varargs1(0, 1, 2, 3) expected='varargs1(Object s = 
0, Object... xs = [1, 2, 3])' />
+<@assertEquals actual=obj.varargs1('s') expected='varargs1(String s = "s", 
int... xs = [])' />
+
+<@assertEquals actual=obj.varargs2(1, 2.5, 3) expected='varargs2(double... xs 
= [1.0, 2.5, 3.0])' />
+<@assertEquals actual=obj.varargs2(1, 2.5?double, 3) 
expected='varargs2(double... xs = [1.0, 2.5, 3.0])' />
+<@assertEquals actual=obj.varargs2(1?int, 2.5?double, 3) 
expected='varargs2(double... xs = [1.0, 2.5, 3.0])' />
+<@assertEquals actual=obj.varargs2(1?long, 2.5?double, 3) 
expected='varargs2(double... xs = [1.0, 2.5, 3.0])' />
+<@assertEquals actual=obj.varargs2(1?long, 2?double, 3) 
expected='varargs2(int... xs = [1, 2, 3])' />
+
+<@assertEquals actual=obj.varargs3(1, 2, 3) expected='varargs3(Comparable... 
xs = [1, 2, 3])' />
+<@assertEquals actual=obj.varargs3('a', 'b', 'c') expected='varargs3(String... 
xs = [a, b, c])' />
+<@assertEquals actual=obj.varargs3(1, 'b', 'c') 
expected='varargs3(Comparable... xs = [1, b, c])' />
+<@assertEquals actual=obj.varargs3('a', 'b', 3) 
expected='varargs3(Comparable... xs = [a, b, 3])' />
+<@assertEquals actual=obj.varargs3('a', [], 3) expected='varargs3(Object... xs 
= [a, [], 3])' />
+<@assertEquals actual=obj.varargs3(null, 'b', null) 
expected='varargs3(String... xs = [null, b, null])' />
+<@assertEquals actual=obj.varargs3(null, 2, null) 
expected='varargs3(Comparable... xs = [null, 2, null])' />
+<@assertEquals actual=obj.varargs3(null, [], null) 
expected='varargs3(Object... xs = [null, [], null])' />
+<@assertEquals actual=obj.varargs3(null, null, null) 
expected='varargs3(String... xs = [null, null, null])' />
+<@assertEquals actual=obj.varargs3() expected='varargs3(String... xs = [])' />
+
+<@assertEquals actual=obj.varargs4(null) expected='varargs4(Integer... xs = 
[null])' />
+<@assertEquals actual=obj.varargs4(null, null, null) 
expected='varargs4(Integer... xs = [null, null, null])' />
+<@assertEquals actual=obj.varargs4(1, null, 2) expected='varargs4(Integer... 
xs = [1, null, 2])' />
+<@assertEquals actual=obj.varargs4(1) expected='varargs4(int... xs = [1])' />
+<@assertEquals actual=obj.varargs4(1, 2, 3) expected='varargs4(int... xs = [1, 
2, 3])' />
+
+<@assertEquals actual=obj.varargs5(1, 2, 3, 4, 5) expected='varargs5(int a1 = 
1, int a2 = 2, int a3 = 3, int... xs = [4, 5])' />
+<@assertEquals actual=obj.varargs5(1, 2, 3, 4) expected='varargs5(int a1 = 1, 
int a2 = 2, int a3 = 3, int... xs = [4])' />
+<@assertEquals actual=obj.varargs5(1, 2, 3) expected='varargs5(int a1 = 1, int 
a2 = 2, int a3 = 3, int... xs = [])' />
+<@assertEquals actual=obj.varargs5(1, 2) expected='varargs5(int a1 = 1, int a2 
= 2, int... xs = [])' />
+<@assertEquals actual=obj.varargs5(1) expected='varargs5(int a1 = 1, int... xs 
= [])' />
+<@assertEquals actual=obj.varargs5() expected='varargs5(int... xs = [])' />
+
+<@assertEquals actual=obj.varargs6('s', 2) expected='varargs6(String a1 = s, 
int... xs = [2])' />
+<@assertEquals actual=obj.varargs6('s') expected='varargs6(String a1 = s, 
int... xs = [])' />
+<@assertEquals actual=obj.varargs6(1, 2) expected='varargs6(Object a1 = 1, int 
a2 = 2, int... xs = [])' />
+<@assertFails message="no compatible overloaded">${obj.varargs6(1)}</@>
+
+<@assertEquals actual=obj.varargs7(1?int, 2?int) expected='varargs7(int... xs 
= [1, 2])' />
+<@assertEquals actual=obj.varargs7(1?short, 2?int) expected='varargs7(short a1 
= 1, int... xs = [2])' />
+
+<#-- Tests that a pre-2.3.21 bug is fixed now: -->
+<@assertEquals actual=obj.mVarargsIgnoredTail(1, 2, 3) 
expected='mVarargsIgnoredTail(int... is = [1, 2, 3])' />
+<@assertEquals actual=obj.mVarargsIgnoredTail(1, 2, 3.5) 
expected='mVarargsIgnoredTail(int i = 1, double... ds = [2.0, 3.5])' />
+
+<@assertEquals actual=obj.mNullAmbiguous('a') expected='mNullAmbiguous(String 
s = a)' />
+<@assertEquals actual=obj.mNullAmbiguous(123) expected='mNullAmbiguous(int i = 
123)' />
+<@assertEquals actual=obj.mNullAmbiguous(1.9) expected='mNullAmbiguous(int i = 
1)' />
+<@assertEquals actual=obj.mNullAmbiguous(1?double) 
expected='mNullAmbiguous(int i = 1)' />
+<@assertFails message="no compatible 
overloaded">${obj.mNullAmbiguous(1.9?double)}</@>
+<@assertFails message="multiple compatible 
overloaded">${obj.mNullAmbiguous(null)}</@>
+
+<@assertFails message="multiple compatible 
overloaded">${obj.mNullAmbiguous2(null)}</@>
+
+<@assertEquals actual=obj.mNullNonAmbiguous(null) 
expected='mNullNonAmbiguous(String s = null)' />
+
+<#-- The primitive int-s will win twice, but then String wins over Object, 
which is stronger: -->
+<@assertEquals actual=obj.mLowRankWins(1, 2, 'a') 
expected='mLowRankWins(Integer x = 1, Integer y = 2, String s = a)' />
+
+<@assertEquals actual=obj.mRareWrappings(obj.file, obj.adaptedNumber, 
obj.adaptedNumber, obj.adaptedNumber, obj.stringWrappedAsBoolean)
+               expected='mRareWrappings(File f = file, double d1 = 123.0002, 
Double d2 = 123.0002, double d3 = 123.0002, b = true)' />
+<@assertEquals actual=obj.mRareWrappings(obj.stringWrappedAsBoolean, 
obj.adaptedNumber, obj.adaptedNumber, obj.adaptedNumber, 
obj.stringAdaptedToBoolean)
+               expected='mRareWrappings(String s = yes, double d1 = 123.0002, 
Double d2 = 123.0002, double d3 = 123.0002, b = true)' />
+<@assertEquals actual=obj.mRareWrappings(obj.stringAdaptedToBoolean2, 
obj.wrapperNumber, obj.wrapperNumber, obj.wrapperNumber, 
obj.stringAdaptedToBoolean2)
+               expected='mRareWrappings(String s = yes, double d1 = 123.0001, 
Double d2 = 123.0001, double d3 = 123.0001, b = true)' />
+<@assertEquals actual=obj.mRareWrappings(obj.booleanWrappedAsAnotherBoolean, 
0, 0, 0, obj.booleanWrappedAsAnotherBoolean)
+               expected='mRareWrappings(Object o = true, double d1 = 0.0, 
Double d2 = 0.0, double d3 = 0.0, b = true)' />
+<@assertEquals actual=obj.mRareWrappings(obj.adaptedNumber, 0, 0, 0, 
!obj.booleanWrappedAsAnotherBoolean)
+               expected='mRareWrappings(Object o = 124, double d1 = 0.0, 
Double d2 = 0.0, double d3 = 0.0, b = true)' />
+<@assertEquals actual=obj.mRareWrappings(obj.booleanWrappedAsAnotherBoolean, 
0, 0, 0, !obj.stringAdaptedToBoolean)
+               expected='mRareWrappings(Object o = true, double d1 = 0.0, 
Double d2 = 0.0, double d3 = 0.0, b = true)' />
+               
+<@assertEquals actual=obj.mRareWrappings2(obj.adaptedNumber) 
expected='mRareWrappings2(byte b = 124)' />
+
+<#-- Test for List VS array problems due to too vague hinting: -->
+
+<@assertEquals actual=obj.mSeqToArrayNonOverloaded(['a', 'b'], 'c') 
expected='mSeqToArrayNonOverloaded(String[] [a, b], String c)' />
+
+<@assertEquals actual=obj.mSeqToArrayGoodHint(['a', 'b'], 'c') 
expected='mSeqToArrayGoodHint(String[] [a, b], String c)' />
+<@assertEquals actual=obj.mSeqToArrayGoodHint(['a', 'b'], 3) 
expected='mSeqToArrayGoodHint(String[] [a, b], int 3)' />
+
+<@assertEquals actual=obj.mSeqToArrayGoodHint2(['a', 'b'], 'c') 
expected='mSeqToArrayGoodHint2(String[] [a, b], String c)' />
+<@assertEquals actual=obj.mSeqToArrayGoodHint2('a') 
expected='mSeqToArrayGoodHint2(String a)' />
+
+<@assertEquals actual=obj.mSeqToArrayPoorHint(['a', 'b'], 'c') 
expected='mSeqToArrayPoorHint(String[] [a, b], String c)' />
+<@assertEquals actual=obj.mSeqToArrayPoorHint('a', 2) 
expected='mSeqToArrayPoorHint(String a, int 2)' />
+
+<@assertEquals actual=obj.mSeqToArrayPoorHint2(['a', 'b']) 
expected='mSeqToArrayPoorHint2(String[] [a, b])' />
+<@assertEquals actual=obj.mSeqToArrayPoorHint2('a') 
expected='mSeqToArrayPoorHint2(String a)' />
+
+<@assertFails message="multiple compatible overloaded"><@assertEquals 
actual=obj.mSeqToArrayPoorHint3(['a', 'b']) 
expected='mSeqToArrayPoorHint3(String[] [a, b])' /></@>
+<@assertFails message="multiple compatible overloaded"><@assertEquals 
actual=obj.mSeqToArrayPoorHint3([1, 2]) expected='mSeqToArrayPoorHint3(int[] 
[a, b])' /></@>
+
+<@assertEquals actual=obj.mStringArrayVsListPreference(['a', 'b']) 
expected="mStringArrayVsListPreference(List [a, b])" />
+<@assertEquals actual=obj.mStringArrayVsListPreference(obj.javaObjectArray) 
expected="mStringArrayVsListPreference(List [a, b])" />
+<@assertEquals actual=obj.mStringArrayVsObjectArrayPreference(['a', 'b']) 
expected="mStringArrayVsObjectArrayPreference(Object[] [a, b])" />
+<@assertEquals actual=obj.mIntArrayVsIntegerArrayPreference([1, 2]) 
expected="mIntArrayVsIntegerArrayPreference(Integer[] [1, 2])" />
+
+<@assertEquals 
actual=obj.mStringArrayVsObjectArrayPreference(obj.javaStringArray) 
expected="mStringArrayVsObjectArrayPreference(String[] [a, b])" />
+<@assertFails message="no compatible 
overloaded">${obj.mStringArrayVsObjectArrayPreference(obj.javaIntArray)}</@>
+<@assertEquals 
actual=obj.mStringArrayVsObjectArrayPreference(obj.javaIntegerArray) 
expected="mStringArrayVsObjectArrayPreference(Object[] [11, 22])" />
+
+<@assertEquals actual=obj.mIntegerArrayOverloaded([1, 2], 3) 
expected="mIntegerArrayOverloaded(Integer[] [1, 2], int 3)" />
+<@assertEquals actual=obj.mIntegerArrayOverloaded([1?byte, 2?byte], 3) 
expected="mIntegerArrayOverloaded(Integer[] [1, 2], int 3)" />
+<@assertEquals actual=obj.mIntegerArrayOverloaded(obj.javaIntegerList, 3) 
expected="mIntegerArrayOverloaded(Integer[] [1, 2], int 3)" />
+<@assertEquals actual=obj.mIntegerArrayOverloaded(obj.javaByteList, 3) 
expected="mIntegerArrayOverloaded(Integer[] [1, 2], int 3)" />
+
+<@assertEquals actual=obj.mStringArrayOverloaded(['a', 'b'], 3) 
expected="mStringArrayOverloaded(String[] [a, b], int 3)" />
+<@assertEquals actual=obj.mStringArrayOverloaded(obj.javaStringList, 3) 
expected="mStringArrayOverloaded(String[] [a, b], int 3)" />
+<@assertEquals actual=obj.mStringArrayOverloaded(obj.javaCharacterList, 3) 
expected="mStringArrayOverloaded(String[] [c, C], int 3)" />
+<@assertFails message="Failed to convert 
sequence">${obj.mStringArrayOverloaded([1, 2], 3)}</@>
+<@assertFails message="Failed to 
convert">${obj.mStringArrayOverloaded(obj.javaIntegerList, 3)}</@>
+
+<@assertEquals actual=obj.mCharArrayOverloaded(['a', 'b'], 3) 
expected="mCharArrayOverloaded(char[] [a, b], int 3)" />
+<@assertEquals actual=obj.mCharArrayOverloaded(obj.javaCharacterList, 3) 
expected="mCharArrayOverloaded(char[] [c, C], int 3)" />
+<@assertEquals actual=obj.mCharArrayOverloaded(obj.javaStringList, 3) 
expected="mCharArrayOverloaded(char[] [a, b], int 3)" />
+<@assertFails message="Failed to convert 
sequence">${obj.mCharArrayOverloaded(['aa', 'bb'], 3)}</@>
+<@assertFails message="Failed to 
convert">${obj.mCharArrayOverloaded(obj.javaString2List, 3)}</@>
+<@assertEquals actual=obj.mCharArrayOverloaded(['a', 'b'], 's') 
expected="mCharArrayOverloaded(Character[] [a, b], String s)" />
+<@assertEquals actual=obj.mCharArrayOverloaded(obj.javaCharacterList, 's') 
expected="mCharArrayOverloaded(Character[] [c, C], String s)" />
+<@assertEquals actual=obj.mCharArrayOverloaded(obj.javaStringList, 's') 
expected="mCharArrayOverloaded(Character[] [a, b], String s)" />
+<@assertFails message="Failed to convert 
sequence">${obj.mCharArrayOverloaded(['aa', 'bb'], 's')}</@>
+<@assertFails message="Failed to 
convert">${obj.mCharArrayOverloaded(obj.javaString2List, 's')}</@>
+
+<@assertEquals actual=obj.mStringArrayArrayOverloaded([['a', 'b'], ['c']], 3) 
expected="mStringArrayArrayOverloaded(String[][] [[a, b], [c]], int 3)" />
+<@assertEquals actual=obj.mStringArrayArrayOverloaded(obj.javaStringListList, 
3) expected="mStringArrayArrayOverloaded(String[][] [[a, b], [c]], int 3)" />
+<@assertEquals 
actual=obj.mStringArrayArrayOverloaded(obj.javaStringSequenceList, 3) 
expected="mStringArrayArrayOverloaded(String[][] [[a, b], [c]], int 3)" />
+<@assertFails message="Failed to 
convert">${obj.mStringArrayArrayOverloaded(obj.javaStringList, 3)}</@>
+<@assertFails message="Failed to 
convert">${obj.mStringArrayArrayOverloaded(obj.javaIntegerListList, 3)}</@>
+<@assertEquals actual=obj.mIntArrayArrayOverloaded(obj.javaListOfIntArrays) 
expected="mIntArrayArrayOverloaded([[1, 2, 3], [], [4]])" />
+<@assertEquals actual=obj.mArrayOfListsOverloaded(obj.javaListOfIntArrays) 
expected="mArrayOfListsOverloaded([[1, 2, 3], [], [4]])" />
+<@assertEquals actual=obj.mIntArrayArrayNonOverloaded(obj.javaListOfIntArrays) 
expected="mIntArrayArrayNonOverloaded([[1, 2, 3], [], [4]])" />
+<@assertEquals actual=obj.mArrayOfListsNonOverloaded(obj.javaListOfIntArrays) 
expected="mArrayOfListsNonOverloaded([[1, 2, 3], [], [4]])" />
+
+<@assertEquals actual=obj.mStringArrayVarargsOverloaded2(['a', 'b']) 
expected="mStringArrayVarargsOverloaded2(String[] [a, b])" />
+<@assertEquals actual=obj.mStringArrayVarargsOverloaded2(obj.javaStringList) 
expected="mStringArrayVarargsOverloaded2(String[] [a, b])" />
+<@assertEquals actual=obj.mStringArrayVarargsOverloaded2(obj.javaStringArray) 
expected="mStringArrayVarargsOverloaded2(String[] [a, b])" />
+<@assertEquals actual=obj.mStringArrayVarargsOverloaded2(['a']) 
expected="mStringArrayVarargsOverloaded2(String[] [a])" />
+
+<#-- Situations that lead to array-to-List conversion: -->
+<@assertEquals actual=obj.mListOrString(obj.javaStringArray) 
expected="mListOrString(List [a, b])" />
+<@assertEquals actual=obj.mListOrString(obj.javaEmptyStringArray) 
expected="mListOrString(List [])" />
+<@assertEquals actual=obj.mListOrString(obj.javaIntArray) 
expected="mListOrString(List [11, 22])" />
+<@assertEquals actual=obj.mListListOrString(obj.javaStringArrayArray) 
expected="mListListOrString(List [[a, b], [], [c]])" />
+<@assertEquals actual=obj.mStringArrayVarargsOverloaded4(obj.javaStringArray, 
obj.javaStringArray) expected="mStringArrayVarargsOverloaded4(List[] [[a, b], 
[a, b]])" />
+<@assertEquals actual=obj.mStringArrayVarargsOverloaded4(obj.javaStringList, 
obj.javaStringArray) expected="mStringArrayVarargsOverloaded4(List[] [[a, b], 
[a, b]])" />
+<@assertEquals actual=obj.mStringArrayVarargsOverloaded4(obj.javaStringArray, 
obj.javaStringList) expected="mStringArrayVarargsOverloaded4(List[] [[a, b], 
[a, b]])" />
+
+<@assertEquals actual=obj.mMapOrBoolean(obj.hashAndScalarModel) 
expected="mMapOrBoolean(Map {})" />
+<@assertEquals actual=obj.mMapOrBoolean(obj.booleanAndScalarModel) 
expected="mMapOrBoolean(boolean true)" />
+<@assertEquals actual=obj.mMapOrBoolean(obj.allModels) 
expected="mMapOrBoolean(boolean true)" />
+
+<@assertEquals actual=obj.mMapOrBooleanVarargs(obj.hashAndScalarModel) 
expected="mMapOrBooleanVarargs(Map... [{}])" />
+<@assertEquals actual=obj.mMapOrBooleanVarargs(obj.hashAndScalarModel, 
obj.hashAndScalarModel) expected="mMapOrBooleanVarargs(Map... [{}, {}])" />
+<@assertEquals actual=obj.mMapOrBooleanVarargs(obj.allModels) 
expected="mMapOrBooleanVarargs(boolean... [true])" />
+<@assertEquals actual=obj.mMapOrBooleanVarargs(obj.allModels, obj.allModels) 
expected="mMapOrBooleanVarargs(boolean... [true, true])" />
+
+<@assertEquals actual=obj.mMapOrBooleanFixedAndVarargs(obj.hashAndScalarModel) 
expected="mMapOrBooleanFixedAndVarargs(Map {})" />
+<@assertEquals actual=obj.mMapOrBooleanFixedAndVarargs(obj.hashAndScalarModel, 
obj.hashAndScalarModel) expected="mMapOrBooleanFixedAndVarargs(Map... [{}, 
{}])" />
+<@assertEquals actual=obj.mMapOrBooleanFixedAndVarargs(obj.hashAndScalarModel, 
obj.hashAndScalarModel, obj.hashAndScalarModel) 
expected="mMapOrBooleanFixedAndVarargs(Map... [{}, {}, {}])" />
+<@assertEquals actual=obj.mMapOrBooleanFixedAndVarargs(obj.allModels) 
expected="mMapOrBooleanFixedAndVarargs(boolean true)" />
+<@assertEquals actual=obj.mMapOrBooleanFixedAndVarargs(obj.allModels, 
obj.allModels) expected="mMapOrBooleanFixedAndVarargs(boolean... [true, true])" 
/>
+<@assertEquals actual=obj.mMapOrBooleanFixedAndVarargs(obj.allModels, 
obj.allModels, obj.allModels) expected="mMapOrBooleanFixedAndVarargs(boolean... 
[true, true, true])" />
+
+<@assertEquals actual=obj.mNumberOrArray(obj.allModels) 
expected="mNumberOrArray(Number 1)" />
+<@assertEquals actual=obj.mNumberOrArray([obj.allModels]) 
expected="mNumberOrArray(Object[] [1])" />
+<@assertEquals actual=obj.mIntOrArray(obj.allModels) expected="mIntOrArray(int 
1)" />
+<@assertEquals actual=obj.mDateOrArray(obj.allModels) 
expected="mDateOrArray(Date 0)" />
+<@assertEquals actual=obj.mStringOrArray(obj.allModels) 
expected="mStringOrArray(String s)" />
+<@assertEquals actual=obj.mBooleanOrArray(obj.allModels) 
expected="mBooleanOrArray(boolean true)" />
+<@assertEquals actual=obj.mMapOrArray(obj.allModels) expected="mMapOrArray(Map 
{})" />
+<@assertEquals actual=obj.mListOrArray(obj.allModels) 
expected="mListOrArray(List [])" />
+<@assertEquals actual=obj.mSetOrArray(obj.allModels) expected="mSetOrArray(Set 
[])" />
+
+<@assertEquals actual=obj.mCharOrCharacterOverloaded('c') 
expected="mCharOrCharacterOverloaded(char c)" />
+<@assertEquals actual=obj.mCharOrCharacterOverloaded(obj.javaString) 
expected="mCharOrCharacterOverloaded(char s)" />
+<@assertEquals actual=obj.mCharOrCharacterOverloaded(null) 
expected="mCharOrCharacterOverloaded(Character null)" />
+
+<@assertEquals actual=obj.mCharOrBooleanOverloaded('c') 
expected="mCharOrBooleanOverloaded(char c)" />
+<@assertEquals actual=obj.mCharOrBooleanOverloaded(true) 
expected="mCharOrBooleanOverloaded(boolean true)" />
+
+<@assertEquals actual=obj.mCharOrStringOverloaded('c', true) 
expected="mCharOrStringOverloaded(char c, boolean true)" />
+<@assertEquals actual=obj.mCharacterOrStringOverloaded('c', true) 
expected="mCharacterOrStringOverloaded(Character c, boolean true)" />
+
+<@assertEquals actual=obj.mCharOrStringOverloaded2('c') 
expected="mCharOrStringOverloaded2(char c)" />
+<@assertEquals actual=obj.mCharacterOrStringOverloaded2('c') 
expected="mCharacterOrStringOverloaded2(Character c)" />
+<@assertEquals actual=obj.mCharOrStringOverloaded2('ss') 
expected="mCharOrStringOverloaded2(String ss)" />
+<@assertEquals actual=obj.mCharacterOrStringOverloaded2('ss') 
expected="mCharacterOrStringOverloaded2(String ss)" />
+
+<#-- The exmple given in bug report 363 -->
+<#assign theMap = {'name':'Billy', 'lastName', 'Pilgrim'} />
+<@assertEquals actual=obj.bugReport363(theMap, []) expected="Executed: 
testMethod(Map fields, List listField) on input: fields={name=Billy, 
lastName=Pilgrim} and listField=[]" />
+<@assertEquals actual=obj.bugReport363(theMap, null) expected="Executed: 
testMethod(Map fields, List listField) on input: fields={name=Billy, 
lastName=Pilgrim} and listField=null" />

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/8ba7883e/src/test/resources/org/apache/freemarker/test/templatesuite/templates/range-ici-2.3.20.ftl
----------------------------------------------------------------------
diff --git 
a/src/test/resources/org/apache/freemarker/test/templatesuite/templates/range-ici-2.3.20.ftl
 
b/src/test/resources/org/apache/freemarker/test/templatesuite/templates/range-ici-2.3.20.ftl
deleted file mode 100644
index 1dbd5b7..0000000
--- 
a/src/test/resources/org/apache/freemarker/test/templatesuite/templates/range-ici-2.3.20.ftl
+++ /dev/null
@@ -1,37 +0,0 @@
-<#--
-  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.
--->
-<#include 'range-common.ftl'>
-
-<#-- Legacy quirk: right-unbounded ranges are apparently empty: -->
-<@assertEquals actual=(4..)?size expected=0 />
-<@assertEquals actual=join(1.., ' ') expected="" />
-
-<#list 4.. as i>
-  <#stop "Shouldn't be reached">
-</#list>
-
-<@assertFails message="missing">
-       <@assertEquals actual=(4..)[0] expected=4 />
-</@>
-<@assertFails message="missing">
-       <@assertEquals actual=(4..)[1] expected=5 />
-</@>
-<@assertFails message="out of bounds">
-       <@assertEquals actual=(4..)[-1] expected=5 />
-</@>

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/8ba7883e/src/test/resources/org/apache/freemarker/test/templatesuite/templates/range-ici-2.3.21.ftl
----------------------------------------------------------------------
diff --git 
a/src/test/resources/org/apache/freemarker/test/templatesuite/templates/range-ici-2.3.21.ftl
 
b/src/test/resources/org/apache/freemarker/test/templatesuite/templates/range-ici-2.3.21.ftl
deleted file mode 100644
index 33f7c7f..0000000
--- 
a/src/test/resources/org/apache/freemarker/test/templatesuite/templates/range-ici-2.3.21.ftl
+++ /dev/null
@@ -1,50 +0,0 @@
-<#--
-  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.
--->
-<#include 'range-common.ftl'>
-
-<@assertEquals actual=(4..)?size expected=2147483647 />
-<@assertEquals actual=limitedJoin(4.., 3) expected="4, 5, 6, ..." />
-
-<@assertEquals actual=(4..)[0] expected=4 />
-<@assertEquals actual=(4..)[1] expected=5 />
-<@assertEquals actual=(4..)[1000000] expected=1000004 />
-<@assertFails message="out of bounds">
-       <@assertEquals actual=(4..)[-1] expected=5 />
-</@>
-
-<#assign r = 2147483646..>
-<@assertEquals actual=r?size expected=2147483647 />
-<@assertEquals actual=limitedJoin(r, 3) expected="2147483646, 2147483647, 
2147483648, ..." />
-<@assertEquals actual=r[100] expected=2147483746 />
-
-<#assign r = -2..>
-<@assertEquals actual=limitedJoin(r, 5) expected="-2, -1, 0, 1, 2, ..." />
-<@assertEquals actual=r[0] expected=-2 />
-<@assertEquals actual=r[1] expected=-1 />
-
-<#function limitedJoin range limit>
-       <#assign joined="">
-       <#list range as i>
-               <#assign joined = joined + i?c>
-               <#if i_has_next><#assign joined = joined + ', '></#if>
-               <#local limit = limit - 1>
-               <#if limit == 0><#assign joined = joined + "..."><#break></#if>
-       </#list>
-       <#return joined>
-</#function>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/8ba7883e/src/test/resources/org/apache/freemarker/test/templatesuite/templates/range.ftl
----------------------------------------------------------------------
diff --git 
a/src/test/resources/org/apache/freemarker/test/templatesuite/templates/range.ftl
 
b/src/test/resources/org/apache/freemarker/test/templatesuite/templates/range.ftl
new file mode 100644
index 0000000..33f7c7f
--- /dev/null
+++ 
b/src/test/resources/org/apache/freemarker/test/templatesuite/templates/range.ftl
@@ -0,0 +1,50 @@
+<#--
+  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.
+-->
+<#include 'range-common.ftl'>
+
+<@assertEquals actual=(4..)?size expected=2147483647 />
+<@assertEquals actual=limitedJoin(4.., 3) expected="4, 5, 6, ..." />
+
+<@assertEquals actual=(4..)[0] expected=4 />
+<@assertEquals actual=(4..)[1] expected=5 />
+<@assertEquals actual=(4..)[1000000] expected=1000004 />
+<@assertFails message="out of bounds">
+       <@assertEquals actual=(4..)[-1] expected=5 />
+</@>
+
+<#assign r = 2147483646..>
+<@assertEquals actual=r?size expected=2147483647 />
+<@assertEquals actual=limitedJoin(r, 3) expected="2147483646, 2147483647, 
2147483648, ..." />
+<@assertEquals actual=r[100] expected=2147483746 />
+
+<#assign r = -2..>
+<@assertEquals actual=limitedJoin(r, 5) expected="-2, -1, 0, 1, 2, ..." />
+<@assertEquals actual=r[0] expected=-2 />
+<@assertEquals actual=r[1] expected=-1 />
+
+<#function limitedJoin range limit>
+       <#assign joined="">
+       <#list range as i>
+               <#assign joined = joined + i?c>
+               <#if i_has_next><#assign joined = joined + ', '></#if>
+               <#local limit = limit - 1>
+               <#if limit == 0><#assign joined = joined + "..."><#break></#if>
+       </#list>
+       <#return joined>
+</#function>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/8ba7883e/src/test/resources/org/apache/freemarker/test/templatesuite/templates/string-builtins-ici-2.3.19.ftl
----------------------------------------------------------------------
diff --git 
a/src/test/resources/org/apache/freemarker/test/templatesuite/templates/string-builtins-ici-2.3.19.ftl
 
b/src/test/resources/org/apache/freemarker/test/templatesuite/templates/string-builtins-ici-2.3.19.ftl
deleted file mode 100644
index 033920d..0000000
--- 
a/src/test/resources/org/apache/freemarker/test/templatesuite/templates/string-builtins-ici-2.3.19.ftl
+++ /dev/null
@@ -1,22 +0,0 @@
-<#--
-  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.
--->
-<#-- Same as before... just checking against one-off bugs for 2.3.20 -->
-<@assertEquals actual="'"?html expected="'" />
-<@assertEquals actual="'"?xhtml expected="&#39;" />
-<@assertEquals actual="'"?xml expected="&apos;" />

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/8ba7883e/src/test/resources/org/apache/freemarker/test/templatesuite/templates/string-builtins-ici-2.3.20.ftl
----------------------------------------------------------------------
diff --git 
a/src/test/resources/org/apache/freemarker/test/templatesuite/templates/string-builtins-ici-2.3.20.ftl
 
b/src/test/resources/org/apache/freemarker/test/templatesuite/templates/string-builtins-ici-2.3.20.ftl
deleted file mode 100644
index 62cbb68..0000000
--- 
a/src/test/resources/org/apache/freemarker/test/templatesuite/templates/string-builtins-ici-2.3.20.ftl
+++ /dev/null
@@ -1,21 +0,0 @@
-<#--
-  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.
--->
-<@assertEquals actual="'"?html expected="&#39;" />
-<@assertEquals actual="'"?xhtml expected="&#39;" />
-<@assertEquals actual="'"?xml expected="&apos;" />

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/8ba7883e/src/test/resources/org/apache/freemarker/test/templatesuite/templates/string-builtins1.ftl
----------------------------------------------------------------------
diff --git 
a/src/test/resources/org/apache/freemarker/test/templatesuite/templates/string-builtins1.ftl
 
b/src/test/resources/org/apache/freemarker/test/templatesuite/templates/string-builtins1.ftl
index 93dc88d..40c00bb 100644
--- 
a/src/test/resources/org/apache/freemarker/test/templatesuite/templates/string-builtins1.ftl
+++ 
b/src/test/resources/org/apache/freemarker/test/templatesuite/templates/string-builtins1.ftl
@@ -35,7 +35,7 @@ trim4:      ${"foo bar "?trim}
 upper_case: ${x?upper_case}
 xml:        ${x?xml}
 xhtml:      ${"\"Blah's is > 1 & < 2\""?xhtml}
-<@assertEquals actual="'"?html expected=(iciIntValue gte 
2003020)?string("&#39;", "'") />
+<@assertEquals actual="'"?html expected="&#39;" />
 <@assertEquals actual="'"?xhtml expected="&#39;" />
 <@assertEquals actual="'"?xml expected="&apos;" />
 <#-- ?substring: -->

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/8ba7883e/src/test/resources/org/apache/freemarker/test/templatesuite/testcases.xml
----------------------------------------------------------------------
diff --git 
a/src/test/resources/org/apache/freemarker/test/templatesuite/testcases.xml 
b/src/test/resources/org/apache/freemarker/test/templatesuite/testcases.xml
index 288adae..afd7a84 100644
--- a/src/test/resources/org/apache/freemarker/test/templatesuite/testcases.xml
+++ b/src/test/resources/org/apache/freemarker/test/templatesuite/testcases.xml
@@ -47,19 +47,23 @@
             api_builtin_enabled CDATA #IMPLIED
       >
 ]>
+<!--
+Note that for the incompatible_improvements setting you can specify a list of 
versions, for example:
+<setting incompatible_improvements="min, 3.0.5, max" /> 
+-->
 
 <testCases>
    <setting input_encoding="UTF-8" output_encoding="UTF-8" />
    
    <testCase name="api-builtins" noOutput="true">
       <setting
-            object_wrapper="DefaultObjectWrapper(2.3.22, 
forceLegacyNonListCollections=false)"
+            object_wrapper="DefaultObjectWrapper(3.0.0, 
forceLegacyNonListCollections=false)"
             api_builtin_enabled="true"
       />
    </testCase>
    <testCase name="api-builtins[#endTN]-bw" noOutput="true">
       <setting
-            object_wrapper="BeansWrapper(2.3.0)"
+            object_wrapper="BeansWrapper(3.0.0)"
             api_builtin_enabled="true"
       />
    </testCase>
@@ -67,7 +71,7 @@
    <testCase name="assignments" noOutput="true" />
    <testCase name="bean-maps"/>
    <testCase name="beans">
-      <setting 
object_wrapper="org.apache.freemarker.core.model.impl.beans.BeansWrapper"/>
+      <setting object_wrapper="beans"/>
    </testCase>
    <testCase name="boolean" />
    <testCase name="charset-in-header">
@@ -79,27 +83,15 @@
    <testCase name="then-builtin" noOutput="true" />
    <testCase name="dateformat-java" />
    <testCase name="dateformat-iso-like" noOutput="true" />
-   <testCase name="dateformat-iso-bi" noOutput="true">
-      <setting incompatible_improvements="min, 2.3.20" /> 
-   </testCase>
-   <testCase name="dateformat-iso-bi-ici-2.3.21" noOutput="true">
-      <setting incompatible_improvements="2.3.21, max" /> 
-   </testCase>   
+   <testCase name="dateformat-iso-bi" noOutput="true" />
    <testCase name="dateparsing" noOutput="true" />
    <testCase name="default"/>
    <testCase name="default-xmlns">
-      <setting 
object_wrapper="org.apache.freemarker.core.model.impl.beans.BeansWrapper"/>
-   </testCase>
-   <testCase name="encoding-builtins">
-      <setting incompatible_improvements="min, 2.3.19" /> 
-   </testCase>
-   <testCase name="encoding-builtins[#endTN]-ici-2.3.20">
-      <setting incompatible_improvements="2.3.20, max" /> 
+      <setting object_wrapper="beans"/>
    </testCase>
+   <testCase name="encoding-builtins" />
    <testCase name="escapes" />
-   <testCase name="hashliteral">
-      <setting incompatible_improvements="min, 2.3.20, 2.3.21, max" /> 
-   </testCase>
+   <testCase name="hashliteral" />
    <testCase name="identifier-non-ascii" />
    <testCase name="identifier-escaping" />
    <testCase name="import">
@@ -112,29 +104,30 @@
    <testCase name="interpret"/>
    <testCase name="iterators"/>
    <testCase name="lastcharacter"/>
-   <testCase name="list" />
+   <testCase name="list[#endTN]-simpleTemplateModels" expected="list.txt">
+      <setting 
object_wrapper="org.apache.freemarker.test.util.SimpleMapAndCollectionObjectWrapper(3.0.0)"
 />
+   </testCase>
    <testCase name="list[#endTN]-collectionAdapter" expected="list.txt">
-      <setting object_wrapper="DefaultObjectWrapper(2.3.22, 
forceLegacyNonListCollections=false)" />
+      <setting object_wrapper="DefaultObjectWrapper(3.0.0, 
forceLegacyNonListCollections=false)" />
+   </testCase>
+   <testCase name="list2[#endTN]-simpleTemplateModels" expected="list2.txt">
+      <setting 
object_wrapper="org.apache.freemarker.test.util.SimpleMapAndCollectionObjectWrapper(3.0.0)"
 />
    </testCase>
-   <testCase name="list2" />
    <testCase name="list2[#endTN]-collectionAdapter" expected="list2.txt">
-      <setting object_wrapper="DefaultObjectWrapper(2.3.22, 
forceLegacyNonListCollections=false)" />
+      <setting object_wrapper="DefaultObjectWrapper(3.0.0, 
forceLegacyNonListCollections=false)" />
+   </testCase>
+   <testCase name="list3[#endTN]-simpleTemplateModels" expected="list3.txt">
+      <setting 
object_wrapper="org.apache.freemarker.test.util.SimpleMapAndCollectionObjectWrapper(3.0.0)"
 />
    </testCase>
-   <testCase name="list3" />
    <testCase name="list3[#endTN]-collectionAdapter" expected="list3.txt">
-      <setting object_wrapper="DefaultObjectWrapper(2.3.22, 
forceLegacyNonListCollections=false)" />
+      <setting object_wrapper="DefaultObjectWrapper(3.0.0, 
forceLegacyNonListCollections=false)" />
    </testCase>
    <testCase name="list-bis" />
    <testCase name="list-bis[#endTN]-collectionAdapter" expected="list-bis.txt">
-      <setting object_wrapper="DefaultObjectWrapper(2.3.22, 
forceLegacyNonListCollections=false)" />
+      <setting object_wrapper="DefaultObjectWrapper(3.0.0, 
forceLegacyNonListCollections=false)" />
    </testCase>
    <testCase name="listhash" />
-   <testCase name="listhashliteral[#endTN]-ici-2.3.20">
-      <setting incompatible_improvements="min, 2.3.20" /> 
-   </testCase>
-   <testCase name="listhashliteral[#endTN]-ici-2.3.21">
-      <setting incompatible_improvements="2.3.21, max" /> 
-   </testCase>
+   <testCase name="listhashliteral" />
    <testCase name="listliteral" />
    <testCase name="localization" >
       <setting locale="en_AU"/>
@@ -148,9 +141,7 @@
    <testCase name="newlines1" />
    <testCase name="newlines2" />
    <testCase name="noparse" />
-   <testCase name="number-format">
-      <setting incompatible_improvements="min, 2.3.21, max" /> 
-   </testCase>
+   <testCase name="number-format" />
    <testCase name="number-literal" >
       <setting locale="fr_FR"/>
    </testCase>
@@ -163,32 +154,25 @@
        <setting output_encoding="ISO-8859-1" url_escaping_charset="UTF-16" />
    </testCase>
    <testCase name="precedence"/>
-   <testCase name="range-ici-2.3.20" noOutput="true">
-         <setting incompatible_improvements="min, 2.3.20"/>
-   </testCase>
-   <testCase name="range-ici-2.3.21" noOutput="true">
-      <setting incompatible_improvements="2.3.21, max"/>
-   </testCase>
+   <testCase name="range" noOutput="true" />
    <testCase name="recover" />
    <testCase name="root" />
    <testCase name="setting" noOutput="true" />
    <testCase name="sequence-builtins[#endTN]-with-BeansWrapper" 
expected="sequence-builtins.txt">
-      <setting 
object_wrapper="org.apache.freemarker.core.model.impl.beans.BeansWrapper"/> 
+      <setting object_wrapper="beans"/> 
+   </testCase>
+   <testCase name="sequence-builtins[#endTN]-with-SimpleTemplateModel" 
expected="sequence-builtins.txt">
+      <setting 
object_wrapper="org.apache.freemarker.test.util.SimpleMapAndCollectionObjectWrapper(3.0.0)"
 />
    </testCase>
    <testCase name="sequence-builtins[#endTN]-with-DefaultObjectWrapper" 
expected="sequence-builtins.txt">
-      <setting 
object_wrapper="org.apache.freemarker.core.model.impl.DefaultObjectWrapper"/> 
+      <setting object_wrapper="default"/> 
    </testCase>
    <testCase 
name="sequence-builtins[#endTN]-with-DefaultObjectWrapper-collAdapters" 
expected="sequence-builtins.txt">
-      <setting object_wrapper="DefaultObjectWrapper(2.3.22, 
forceLegacyNonListCollections=false)"/> 
-   </testCase>
-   <testCase name="sequence-builtins[#endTN]-with-SimpleObjectWrapper" 
expected="sequence-builtins.txt">
-      <setting 
object_wrapper="org.apache.freemarker.core.model.impl.SimpleObjectWrapper(2.3.25)"/>
 
+      <setting object_wrapper="DefaultObjectWrapper(3.0.0, 
forceLegacyNonListCollections=false)"/> 
    </testCase>
    <testCase name="simplehash-char-key" noOutput="true" />
    <testCase name="existence-operators" noOutput="true" />
-   <testCase name="string-builtins1">
-      <setting incompatible_improvements="min, 2.3.20, max"/>
-   </testCase>
+   <testCase name="string-builtins1" />
    <testCase name="string-builtins2" />
    <testCase name="string-builtins3" noOutput="true" />
    <testCase name="string-builtins-regexps" />
@@ -199,15 +183,7 @@
    <testCase name="switch" />
    <testCase name="switch-builtin" noOutput="true" />
    <testCase name="transforms"/>
-   <testCase name="type-builtins">
-      <setting incompatible_improvements="min, 2.3.20"/>
-   </testCase>
-   <testCase name="type-builtins[#endTN]-ici-2.3.21">
-         <setting incompatible_improvements="2.3.21, 2.3.23"/>
-   </testCase>
-   <testCase name="type-builtins[#endTN]-ici-2.3.24">
-      <setting incompatible_improvements="2.3.24, max"/>
-   </testCase>
+   <testCase name="type-builtins" />
    <testCase name="date-type-builtins" noOutput="true" />
    <testCase name="url" noOutput="true" />
    <testCase name="var-layers"/>
@@ -215,20 +191,20 @@
    <testCase name="whitespace-trim"/>
    <testCase name="wstrip-in-header"/>
    <testCase name="xml-fragment">
-      <setting 
object_wrapper="org.apache.freemarker.core.model.impl.beans.BeansWrapper"/> 
+      <setting object_wrapper="beans"/> 
    </testCase>
    <testCase name="xmlns1">
-      <setting 
object_wrapper="org.apache.freemarker.core.model.impl.beans.BeansWrapper"/>
+      <setting object_wrapper="beans"/>
    </testCase>
    <testCase name="xmlns2" template="xmlns1.ftl"  expected="xmlns1.txt" />
    <testCase name="xmlns3">
-      <setting 
object_wrapper="org.apache.freemarker.core.model.impl.beans.BeansWrapper"/>
+      <setting object_wrapper="beans"/>
    </testCase>   
    <testCase name="xmlns4">
-      <setting 
object_wrapper="org.apache.freemarker.core.model.impl.beans.BeansWrapper"/>
+      <setting object_wrapper="beans"/>
    </testCase>   
    <testCase name="xmlns5">
-      <setting 
object_wrapper="org.apache.freemarker.core.model.impl.beans.BeansWrapper"/>
+      <setting object_wrapper="beans"/>
    </testCase>   
    <testCase name="xml-ns_prefix-scope" 
template="xml-ns_prefix-scope-main.ftl" />
    <testCase name="hashconcat"/>
@@ -253,44 +229,17 @@
    <testCase name="boolean-formatting"  />
    <testCase name="number-math-builtins" noOutput="true" />
    <testCase name="string-builtin-coercion" noOutput="true" />
-   <testCase name="string-builtins-ici-2.3.20" noOutput="true">
-      <setting incompatible_improvements="2.3.20"/>
-   </testCase>
-   <testCase name="string-builtins-ici-2.3.19" noOutput="true">
-      <setting incompatible_improvements="2.3.19"/>
-   </testCase>
    
-   <testCase name="overloaded-methods-23bc" noOutput="true">
-      <setting incompatible_improvements="2.3.0, 2.3.19"/>
-   </testCase>
-   <testCase name="overloaded-methods-2-inc-bwici-2.3.20" noOutput="true">
-      <setting 
object_wrapper="org.apache.freemarker.core.model.impl.beans.BeansWrapperInc2003020"/>
-   </testCase>
-   <testCase name="overloaded-methods-2-desc-bwici-2.3.20" noOutput="true">
-      <setting 
object_wrapper="org.apache.freemarker.core.model.impl.beans.BeansWrapperDesc2003020"/>
-   </testCase>
-   <testCase name="overloaded-methods-2-bwici-2.3.21[#endTN]-inc" 
noOutput="true">
-      <setting 
object_wrapper="org.apache.freemarker.core.model.impl.beans.BeansWrapperInc2003021"/>
-   </testCase>
-   <testCase name="overloaded-methods-2-bwici-2.3.21[#endTN]-desc" 
noOutput="true">
-      <setting 
object_wrapper="org.apache.freemarker.core.model.impl.beans.BeansWrapperDesc2003021"/>
-   </testCase>
-   <testCase name="overloaded-methods-2-inc-bwici-2.3.20[#endTN]-dow" 
noOutput="true">
-      <setting 
object_wrapper="org.apache.freemarker.core.model.impl.beans.DefaultObjectWrapperInc2003020"/>
-   </testCase>
-   <testCase name="overloaded-methods-2-desc-bwici-2.3.20[#endTN]-dow" 
noOutput="true">
-      <setting 
object_wrapper="org.apache.freemarker.core.model.impl.beans.DefaultObjectWrapperDesc2003020"/>
-   </testCase>
-   <testCase name="overloaded-methods-2-bwici-2.3.21[#endTN]-inc-dow" 
noOutput="true">
-      <setting 
object_wrapper="org.apache.freemarker.core.model.impl.beans.DefaultObjectWrapperInc2003021"/>
+   <testCase name="overloaded-methods[#endTN]-inc-bw" noOutput="true">
+      <setting 
object_wrapper="org.apache.freemarker.core.model.impl.beans.BeansWrapperInc"/>
    </testCase>
-   <testCase name="overloaded-methods-2-bwici-2.3.21[#endTN]-desc-dow" 
noOutput="true">
-      <setting 
object_wrapper="org.apache.freemarker.core.model.impl.beans.DefaultObjectWrapperDesc2003021"/>
+   <testCase name="overloaded-methods[#endTN]-desc-bw" noOutput="true">
+      <setting 
object_wrapper="org.apache.freemarker.core.model.impl.beans.BeansWrapperDesc"/>
    </testCase>
-   <testCase name="overloaded-methods-2-bwici-2.3.21[#endTN]-inc-dow-2.3.22" 
noOutput="true">
-      <setting 
object_wrapper="org.apache.freemarker.core.model.impl.beans.DefaultObjectWrapperInc2003022"/>
+   <testCase name="overloaded-methods[#endTN]-inc-dow" noOutput="true">
+      <setting 
object_wrapper="org.apache.freemarker.core.model.impl.beans.DefaultObjectWrapperInc"/>
    </testCase>
-   <testCase name="overloaded-methods-2-bwici-2.3.21[#endTN]-desc-dow-2.3.22" 
noOutput="true">
-      <setting 
object_wrapper="org.apache.freemarker.core.model.impl.beans.DefaultObjectWrapperDesc2003022"/>
+   <testCase name="overloaded-methods[#endTN]-desc-dow" noOutput="true">
+      <setting 
object_wrapper="org.apache.freemarker.core.model.impl.beans.DefaultObjectWrapperDesc"/>
    </testCase>
 </testCases>

Reply via email to