http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/28a276c8/freemarker-core-test/src/test/resources/org/apache/freemarker/test/templatesuite/templates/multimodels.ftl ---------------------------------------------------------------------- diff --git a/freemarker-core-test/src/test/resources/org/apache/freemarker/test/templatesuite/templates/multimodels.ftl b/freemarker-core-test/src/test/resources/org/apache/freemarker/test/templatesuite/templates/multimodels.ftl new file mode 100644 index 0000000..f356386 --- /dev/null +++ b/freemarker-core-test/src/test/resources/org/apache/freemarker/test/templatesuite/templates/multimodels.ftl @@ -0,0 +1,84 @@ +<#-- + 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. +--> +<html> +<head> +<title>FreeMarker: Test of Multiple Model implementations</title> +</head> +<body> + +<p>Let's begin with a simple model:</p> +<p>${message}</p> + +<p>Cool, now get into the first model. This implements a scalar, list, and +hash as a single class. Let's try some tests...</p> + +<p>${data}</p> + +<p>Now as a list...</p> + +<#list data as item>${item}<br /> +</#list> + +<p>Index into a list...</p> +<p>${data[ 1 ]}</p> +<p>List size is: ${data.size}</p> +<p>List size is: ${data["size"]}</p> + +<p>Now, again, as a hash. First using dot notation, then using [] notation:</p> + +<p>${data.selftest}</p> +<p>${data["selftest"]}</p> + +<p>Now for the tricky stuff... use a model to index into another model...</p> +<p>${test}</p> +<p>${data[ test ]}</p> +<p>${self}</p> +<p>${data[ self + "test" ]}</p> + +<p>Same thing, this time a List index...</p> +<p>${zero}</p> +<p>${data[ zero ]}</p> +<p>${data[ zero + 1 ]}</p> + +<p>Now, do the same recursively...</p> +<p>${data}</p> +<p>${data.model2}</p> +<p>${data.model2( "test" )}</p> +<p>${data.model2( data, data.selftest, message )}</p> + +<p>Does this really not work?</p> +<p>${data[ 10 ]}</p> +<p>${data[ 10 ].selftest}</p> +<p>${data[ 10 ].message}</p> + +<p>(Again, with Hashes)</p> +<p>${data.nesting1.nested}</p> +<p>${data.nesting1.nested.selftest}</p> + +<p>${data["nesting1"].nested}</p> +<p>${data["nesting1"].nested["selftest"]}</p> +<p>${data["nesting1"]["nested"]["selftest"]}</p> + +<p>As I suspected! (Manual on Expressions needs updating.)</p> + +<p>Second test on list size</p> +<p>${data.one.size}</p> +<p>${data.one["size"]}</p> +</body> +</html>
http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/28a276c8/freemarker-core-test/src/test/resources/org/apache/freemarker/test/templatesuite/templates/nested.ftl ---------------------------------------------------------------------- diff --git a/freemarker-core-test/src/test/resources/org/apache/freemarker/test/templatesuite/templates/nested.ftl b/freemarker-core-test/src/test/resources/org/apache/freemarker/test/templatesuite/templates/nested.ftl new file mode 100644 index 0000000..46f4492 --- /dev/null +++ b/freemarker-core-test/src/test/resources/org/apache/freemarker/test/templatesuite/templates/nested.ftl @@ -0,0 +1,29 @@ +<#-- + 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. +--> +<#macro repeat count> + <#local y = "test"> + <#list 1..count as x> + ${y} ${count}/${x}: <#nested x, "asdf"> <#-- the second body parameter is not used below --> + </#list> +</#macro> +<@repeat count=3>${y?default("undefined")} ${x?default("undefined")} ${count?default("undefined")}</@repeat> +<#global x = "X"> +<#global y = "Y"> +<#global count = "Count"> +<@repeat count=3 ; param1>${y?default("undefined")} ${x?default("undefined")} ${count?default("undefined")} ${param1}</@repeat> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/28a276c8/freemarker-core-test/src/test/resources/org/apache/freemarker/test/templatesuite/templates/nestedinclude.ftl ---------------------------------------------------------------------- diff --git a/freemarker-core-test/src/test/resources/org/apache/freemarker/test/templatesuite/templates/nestedinclude.ftl b/freemarker-core-test/src/test/resources/org/apache/freemarker/test/templatesuite/templates/nestedinclude.ftl new file mode 100644 index 0000000..c6e7b11 --- /dev/null +++ b/freemarker-core-test/src/test/resources/org/apache/freemarker/test/templatesuite/templates/nestedinclude.ftl @@ -0,0 +1,21 @@ +<#-- + 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. +--> +<#assign nestedMessage = "I'm here, mon!"> +${.main.bar} +<#-- ${.root.message} --> http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/28a276c8/freemarker-core-test/src/test/resources/org/apache/freemarker/test/templatesuite/templates/new-defaultresolver.ftl ---------------------------------------------------------------------- diff --git a/freemarker-core-test/src/test/resources/org/apache/freemarker/test/templatesuite/templates/new-defaultresolver.ftl b/freemarker-core-test/src/test/resources/org/apache/freemarker/test/templatesuite/templates/new-defaultresolver.ftl new file mode 100644 index 0000000..9efcd88 --- /dev/null +++ b/freemarker-core-test/src/test/resources/org/apache/freemarker/test/templatesuite/templates/new-defaultresolver.ftl @@ -0,0 +1,23 @@ +<#-- + 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. +--> +<#attempt> +${"org.apache.freemarker.test.templatesuite.models.NewTestModel"?new("works")} +<#recover> +fails +</#attempt> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/28a276c8/freemarker-core-test/src/test/resources/org/apache/freemarker/test/templatesuite/templates/new-optin.ftl ---------------------------------------------------------------------- diff --git a/freemarker-core-test/src/test/resources/org/apache/freemarker/test/templatesuite/templates/new-optin.ftl b/freemarker-core-test/src/test/resources/org/apache/freemarker/test/templatesuite/templates/new-optin.ftl new file mode 100644 index 0000000..7545b58 --- /dev/null +++ b/freemarker-core-test/src/test/resources/org/apache/freemarker/test/templatesuite/templates/new-optin.ftl @@ -0,0 +1,30 @@ +<#-- + 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. +--> +${"org.apache.freemarker.test.templatesuite.models.NewTestModel"?new("works")} +<#attempt> +${"org.apache.freemarker.test.templatesuite.models.NewTestModel2"?new("works")} +<#recover> +fails +</#attempt> + +<#include "subdir/new-optin.ftl"> + +<#include "subdir/new-optin-2.ftl"> + +<#include "subdir/subsub/new-optin.ftl"> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/28a276c8/freemarker-core-test/src/test/resources/org/apache/freemarker/test/templatesuite/templates/newlines1.ftl ---------------------------------------------------------------------- diff --git a/freemarker-core-test/src/test/resources/org/apache/freemarker/test/templatesuite/templates/newlines1.ftl b/freemarker-core-test/src/test/resources/org/apache/freemarker/test/templatesuite/templates/newlines1.ftl new file mode 100644 index 0000000..18f4b32 --- /dev/null +++ b/freemarker-core-test/src/test/resources/org/apache/freemarker/test/templatesuite/templates/newlines1.ftl @@ -0,0 +1,29 @@ +<#-- + 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. +--> +<html> +<head> +<title>FreeMarker: Newlines Test</title> +</head> +<body> +<p>A simple test follows:</p> + +<p>${message}</p> + +</body> +</html> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/28a276c8/freemarker-core-test/src/test/resources/org/apache/freemarker/test/templatesuite/templates/newlines2.ftl ---------------------------------------------------------------------- diff --git a/freemarker-core-test/src/test/resources/org/apache/freemarker/test/templatesuite/templates/newlines2.ftl b/freemarker-core-test/src/test/resources/org/apache/freemarker/test/templatesuite/templates/newlines2.ftl new file mode 100644 index 0000000..ac8337c --- /dev/null +++ b/freemarker-core-test/src/test/resources/org/apache/freemarker/test/templatesuite/templates/newlines2.ftl @@ -0,0 +1,33 @@ +<#-- + 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. +--> +<#assign message="Hello, world!\n"> +<#assign normalizeNewlines = "org.apache.freemarker.core.util.NormalizeNewlines"?new()> +<@normalizeNewlines> +<html> +<head> +<title>FreeMarker: Newlines the Second Test</title> +</head> +<body> +<p>A simple test follows:</p> + +<p>${message}</p> + +</body> +</html> +</@normalizeNewlines> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/28a276c8/freemarker-core-test/src/test/resources/org/apache/freemarker/test/templatesuite/templates/noparse.ftl ---------------------------------------------------------------------- diff --git a/freemarker-core-test/src/test/resources/org/apache/freemarker/test/templatesuite/templates/noparse.ftl b/freemarker-core-test/src/test/resources/org/apache/freemarker/test/templatesuite/templates/noparse.ftl new file mode 100644 index 0000000..f7f1be3 --- /dev/null +++ b/freemarker-core-test/src/test/resources/org/apache/freemarker/test/templatesuite/templates/noparse.ftl @@ -0,0 +1,62 @@ +<#-- + 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. +--> +<html> +<head> +<title>FreeMarker: NoParse Test</title> +</head> +<body> +<#noparse> + +A simple test follows: + +${message} + +A more rigorous test, showing that we're not faking it: + +${message@#$%&} + +</#noparse> +<#if message?exists> + <p>Message exists! + <#noparse> + ...and even generates output! + <#if message> + Nested statements are ok, too. + </#if> + </#noparse> + </p> +</#if> + +Here's another edge case, this time, trying to output a <noparse> +inside another <noparse> + +<#noparse> + +This is what the noparse instruction looks like: + +<#nop</#noparse><#noparse>arse>This part of the template wont be parsed by the +FreeMarker parser. Instead, it will be treated as verbatim text information, +and output as such.</#nop</#noparse><#noparse>arse> + +The rest of the template appears here. +</#noparse> + +Simple. +</body> +</html> http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/28a276c8/freemarker-core-test/src/test/resources/org/apache/freemarker/test/templatesuite/templates/number-format.ftl ---------------------------------------------------------------------- diff --git a/freemarker-core-test/src/test/resources/org/apache/freemarker/test/templatesuite/templates/number-format.ftl b/freemarker-core-test/src/test/resources/org/apache/freemarker/test/templatesuite/templates/number-format.ftl new file mode 100644 index 0000000..d060a44 --- /dev/null +++ b/freemarker-core-test/src/test/resources/org/apache/freemarker/test/templatesuite/templates/number-format.ftl @@ -0,0 +1,42 @@ +<#-- + 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. +--> +<#setting number_format = ",##0.##"> +<#setting locale = "fr_FR"> +${1} +${1?c} +${1234567.886} +${1234567.886?c} +<#setting number_format = "0.00"> +${1} +${1?c} +${1234567.886} +${1234567.886?c} +${int?c} +${double?c} +${double2?c} +${double3?c} +${double4?c} +${bigDecimal?c} +${bigDecimal2?c} +<@assertEquals expected="INF" actual="INF"?number?c /> +<@assertEquals expected="INF" actual="INF"?number?c /> +<@assertEquals expected="-INF" actual="-INF"?number?c /> +<@assertEquals expected="-INF" actual="-INF"?number?float?c /> +<@assertEquals expected="NaN" actual="NaN"?number?float?c /> +<@assertEquals expected="NaN" actual="NaN"?number?float?c /> http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/28a276c8/freemarker-core-test/src/test/resources/org/apache/freemarker/test/templatesuite/templates/number-literal.ftl ---------------------------------------------------------------------- diff --git a/freemarker-core-test/src/test/resources/org/apache/freemarker/test/templatesuite/templates/number-literal.ftl b/freemarker-core-test/src/test/resources/org/apache/freemarker/test/templatesuite/templates/number-literal.ftl new file mode 100644 index 0000000..6342afe --- /dev/null +++ b/freemarker-core-test/src/test/resources/org/apache/freemarker/test/templatesuite/templates/number-literal.ftl @@ -0,0 +1,133 @@ +<#-- + 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. +--> +<html> +<head> +<title>FreeMarker: Number Literal Test</title> +</head> +<body> +<#assign hash = {"1" : "one", + "12" : "twelve", + "2one" : "two-one", + "one2" : "one-two"} + list = ["zero", + "one", + "two", + "three", + "four", + "five", + "six", + "seven", + "eight", + "nine", + "ten", + "eleven", + "twelve"], + foo = "bar", + one = "one", + "1" = "one", + "12" = "twelve", + "2one" = "two-one", + "one2" = "one-two", + call = "org.apache.freemarker.test.templatesuite.models.SimpleTestMethod"?new() +> + +<p>A simple test follows:</p> + +<p>${message}</p> + +<p>Now perform a number assignment:</p> + +#{1.300000?double} + +<#assign mynumber = 1.8, USA="en_US" /> +<#assign myfloat = mynumber?float /> + +My number is: ${mynumber} +<#setting locale="en_US"> +My float is: #{myfloat ; m6} +The int part is: ${myfloat?int} + +<#assign mymessage = mynumber?string> + +${mymessage + 3} + +<p>Now use numbers in assignment</p> + +<#assign mymessage = 1 + 5> +${mymessage} + +<#assign mymessage = mymessage + 2> +#{mymessage} + +<p>Try numbers in tests</p> + +<#if (mymessage == 152)> +MyMessage is 152 +<#else> +MyMessage is not 152, its: ${mymessage}. +</#if > + +<if (mymessage > 5)> + MyMessage is greater than five. +</if + +<#switch mymessage> + <#case 1> + MyMessage is one + <#break> + + <#case 15> + MyMessage is fifteen + <#break> + + <#case 152> + MyMessage is one-five-two + <#break> + + <#default> + MyMessage is: ${mymessage}. + <#break> + +</#switch> + +<p>Now for numbers in dynamic keys:</p> + +<#assign one = 1> +<#assign two = 2> + +${list[ 1 ]} +${list[ 1 + 2 ]} + +<p>Numbers in hashes:</p> + +${hash[ 1 + "2" ]} +${hash[ "1" + 2 ]} +${hash[ "1" + two ]} + + +<p>Numbers in method calls:</p> + +${call( 1 )} +${call( one )} +${call( one + "2" )} +${call( one + 2 )} +${call( 1 + 2 )} + +</body> +</html> http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/28a276c8/freemarker-core-test/src/test/resources/org/apache/freemarker/test/templatesuite/templates/number-math-builtins.ftl ---------------------------------------------------------------------- diff --git a/freemarker-core-test/src/test/resources/org/apache/freemarker/test/templatesuite/templates/number-math-builtins.ftl b/freemarker-core-test/src/test/resources/org/apache/freemarker/test/templatesuite/templates/number-math-builtins.ftl new file mode 100644 index 0000000..6dab082 --- /dev/null +++ b/freemarker-core-test/src/test/resources/org/apache/freemarker/test/templatesuite/templates/number-math-builtins.ftl @@ -0,0 +1,78 @@ +<#-- + 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=0?abs expected=0 /> +<@assertEquals actual=3?abs expected=3 /> +<@assertEquals actual=(-3)?abs expected=3 /> +<@assertEquals actual=3.5?abs expected=3.5 /> +<@assertEquals actual=(-3.5)?abs expected=3.5 /> + +<@assert test=fNan?abs?is_nan /> +<@assert test=dNan?abs?is_nan /> +<@assert test=fNinf?abs?is_infinite /> +<@assert test=dPinf?abs?is_infinite /> +<@assert test=fNinf lt 0 /> +<@assert test=dPinf gt 0 /> +<@assert test=fNinf?abs gt 0 /> +<@assert test=dPinf?abs gt 0 /> + +<@assertEquals actual=fn?abs expected=0.05 /> +<@assertEquals actual=dn?abs expected=0.05 /> +<@assertEquals actual=ineg?abs expected=5 /> +<@assertEquals actual=ln?abs expected=5 /> +<@assertEquals actual=sn?abs expected=5 /> +<@assertEquals actual=bn?abs expected=5 /> +<@assertEquals actual=bin?abs expected=5 /> +<@assertEquals actual=bdn?abs expected=0.05 /> + +<@assertEquals actual=fp?abs expected=0.05 /> +<@assertEquals actual=dp?abs expected=0.05 /> +<@assertEquals actual=ip?abs expected=5 /> +<@assertEquals actual=lp?abs expected=5 /> +<@assertEquals actual=sp?abs expected=5 /> +<@assertEquals actual=bp?abs expected=5 /> +<@assertEquals actual=bip?abs expected=5 /> +<@assertEquals actual=bdp?abs expected=0.05 /> + +<@assert test=!0?is_infinite /> +<@assert test=!fn?is_infinite /> +<@assert test=!dn?is_infinite /> +<@assert test=!ineg?is_infinite /> +<@assert test=!ln?is_infinite /> +<@assert test=!sn?is_infinite /> +<@assert test=!bn?is_infinite /> +<@assert test=!bin?is_infinite /> +<@assert test=!bdn?is_infinite /> +<@assert test=!fNan?is_infinite /> +<@assert test=!dNan?is_infinite /> +<@assert test=fNinf?is_infinite /> +<@assert test=dPinf?is_infinite /> + +<@assert test=!0?is_nan /> +<@assert test=!fn?is_nan /> +<@assert test=!dn?is_nan /> +<@assert test=!ineg?is_nan /> +<@assert test=!ln?is_nan /> +<@assert test=!sn?is_nan /> +<@assert test=!bn?is_nan /> +<@assert test=!bin?is_nan /> +<@assert test=!bdn?is_nan /> +<@assert test=fNan?is_nan /> +<@assert test=dNan?is_nan /> +<@assert test=!fNinf?is_nan /> +<@assert test=!dPinf?is_nan /> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/28a276c8/freemarker-core-test/src/test/resources/org/apache/freemarker/test/templatesuite/templates/number-to-date.ftl ---------------------------------------------------------------------- diff --git a/freemarker-core-test/src/test/resources/org/apache/freemarker/test/templatesuite/templates/number-to-date.ftl b/freemarker-core-test/src/test/resources/org/apache/freemarker/test/templatesuite/templates/number-to-date.ftl new file mode 100644 index 0000000..403e033 --- /dev/null +++ b/freemarker-core-test/src/test/resources/org/apache/freemarker/test/templatesuite/templates/number-to-date.ftl @@ -0,0 +1,35 @@ +<#-- + 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. +--> +${1305575275540?number_to_datetime?iso_utc_ms} == 2011-05-16T19:47:55.54Z +${1305575275540?number_to_date?iso_utc} == 2011-05-16 +${1305575275540?number_to_time?iso_utc_ms} == 19:47:55.54Z + +${1305575275540?long?number_to_datetime?iso_utc_ms} == 2011-05-16T19:47:55.54Z +${1305575275540?double?number_to_datetime?iso_utc_ms} == 2011-05-16T19:47:55.54Z +${bigInteger?number_to_datetime?iso_utc_ms} == 2011-05-16T19:47:55.54Z +${bigDecimal?number_to_datetime?iso_utc_ms} == 2011-05-16T19:47:55.54Z +${1000?float?number_to_datetime?iso_utc} == 1970-01-01T00:00:01Z +${1000?int?number_to_datetime?iso_utc} == 1970-01-01T00:00:01Z +${0?byte?number_to_datetime?iso_utc} == 1970-01-01T00:00:00Z + +<#attempt> +${9999991305575275540?number_to_datetime?iso_utc} <#-- doesn't fit into long --> +<#recover> +failed +</#attempt> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/28a276c8/freemarker-core-test/src/test/resources/org/apache/freemarker/test/templatesuite/templates/numerical-cast.ftl ---------------------------------------------------------------------- diff --git a/freemarker-core-test/src/test/resources/org/apache/freemarker/test/templatesuite/templates/numerical-cast.ftl b/freemarker-core-test/src/test/resources/org/apache/freemarker/test/templatesuite/templates/numerical-cast.ftl new file mode 100644 index 0000000..221b61b --- /dev/null +++ b/freemarker-core-test/src/test/resources/org/apache/freemarker/test/templatesuite/templates/numerical-cast.ftl @@ -0,0 +1,82 @@ +<#ftl> +<#-- + 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. +--> +<#setting locale="en_US"> +<#setting number_format="0.#########"> + +<#assign testlist= [ 0, 1, -1, 0.5, 1.5, -0.5, + -1.5, 0.25, -0.25, 1.75, -1.75, + 1.01, -1.01, 0.01, -0.01, + 127, 128, -127, -128, + 32767, 32768, -32767, -32768, + 2147483647, 2147483648, -2147483647, -2147483648, + 4294967295, 4294967296, -4294967295, -4294967296, + 2147483647.1, 2147483648.1, -2147483647.1, -2147483648.1, + 4294967295.1, 4294967296.1, -4294967295.1, -4294967296.1 + 2147483647.5, 2147483648.5, -2147483647.5, -2147483648.5, + 4294967295.5, 4294967296.5, -4294967295.5, -4294967296.5 + ] /> + +?int: +<#list testlist as result> + ${result}?int=${result?int} +</#list> + +?double +<#list testlist as result> + ${result}?double=${result?double} +</#list> + +?long +<#list testlist as result> + ${result}?long=${result?long} +</#list> + +?long from date + ${"2011-05-08 18:00:15 GMT"?date("yyyy-MM-dd HH:mm:ss z")?long} = 1304877615000 + +?float +<#list testlist as result> + ${result}?float=${result?float} +</#list> + +?byte +<#list testlist as result> + ${result}?byte=${result?byte} +</#list> + +?short +<#list testlist as result> + ${result}?short=${result?short} +</#list> + +?floor +<#list testlist as result> + ${result}?floor=${result?floor} +</#list> + +?ceiling +<#list testlist as result> + ${result}?ceiling=${result?ceiling} +</#list> + +?round +<#list testlist as result> + ${result}?round=${result?round} +</#list> http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/28a276c8/freemarker-core-test/src/test/resources/org/apache/freemarker/test/templatesuite/templates/output-encoding1.ftl ---------------------------------------------------------------------- diff --git a/freemarker-core-test/src/test/resources/org/apache/freemarker/test/templatesuite/templates/output-encoding1.ftl b/freemarker-core-test/src/test/resources/org/apache/freemarker/test/templatesuite/templates/output-encoding1.ftl new file mode 100644 index 0000000..da1128f --- /dev/null +++ b/freemarker-core-test/src/test/resources/org/apache/freemarker/test/templatesuite/templates/output-encoding1.ftl @@ -0,0 +1,30 @@ +<#-- + 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. +--> +Output charset: ${.output_encoding?default("undefined")} +URL escaping charset: ${.url_escaping_charset?default("undefined")} + +<#assign s="a/%b"> +<#setting url_escaping_charset="UTF-16"> +${s?url} +${s?url} +<#setting url_escaping_charset="ISO-8859-1"> +${s?url} +${s?url} +${s?url('UTF-16')} +${s?url} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/28a276c8/freemarker-core-test/src/test/resources/org/apache/freemarker/test/templatesuite/templates/output-encoding2.ftl ---------------------------------------------------------------------- diff --git a/freemarker-core-test/src/test/resources/org/apache/freemarker/test/templatesuite/templates/output-encoding2.ftl b/freemarker-core-test/src/test/resources/org/apache/freemarker/test/templatesuite/templates/output-encoding2.ftl new file mode 100644 index 0000000..3a4f24d --- /dev/null +++ b/freemarker-core-test/src/test/resources/org/apache/freemarker/test/templatesuite/templates/output-encoding2.ftl @@ -0,0 +1,28 @@ +<#-- + 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. +--> +Output charset: ${.output_encoding?default("undefined")} +URL escaping charset: ${.url_escaping_charset?default("undefined")} + +<#assign s="a/%b"> +UTF-16: ${s?url} +ISO-8859-1: ${s?url('ISO-8859-1')} +UTF-16: ${s?url} +<#setting url_escaping_charset="ISO-8859-1"> +ISO-8859-1: ${s?url} +ISO-8859-1: ${s?url} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/28a276c8/freemarker-core-test/src/test/resources/org/apache/freemarker/test/templatesuite/templates/output-encoding3.ftl ---------------------------------------------------------------------- diff --git a/freemarker-core-test/src/test/resources/org/apache/freemarker/test/templatesuite/templates/output-encoding3.ftl b/freemarker-core-test/src/test/resources/org/apache/freemarker/test/templatesuite/templates/output-encoding3.ftl new file mode 100644 index 0000000..3a4f24d --- /dev/null +++ b/freemarker-core-test/src/test/resources/org/apache/freemarker/test/templatesuite/templates/output-encoding3.ftl @@ -0,0 +1,28 @@ +<#-- + 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. +--> +Output charset: ${.output_encoding?default("undefined")} +URL escaping charset: ${.url_escaping_charset?default("undefined")} + +<#assign s="a/%b"> +UTF-16: ${s?url} +ISO-8859-1: ${s?url('ISO-8859-1')} +UTF-16: ${s?url} +<#setting url_escaping_charset="ISO-8859-1"> +ISO-8859-1: ${s?url} +ISO-8859-1: ${s?url} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/28a276c8/freemarker-core-test/src/test/resources/org/apache/freemarker/test/templatesuite/templates/overloaded-methods.ftl ---------------------------------------------------------------------- diff --git a/freemarker-core-test/src/test/resources/org/apache/freemarker/test/templatesuite/templates/overloaded-methods.ftl b/freemarker-core-test/src/test/resources/org/apache/freemarker/test/templatesuite/templates/overloaded-methods.ftl new file mode 100644 index 0000000..329d041 --- /dev/null +++ b/freemarker-core-test/src/test/resources/org/apache/freemarker/test/templatesuite/templates/overloaded-methods.ftl @@ -0,0 +1,411 @@ +<#-- + 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])" /> +<@assertEquals actual=obj.mStringArrayVsListPreference(obj.javaObjectArray) expected="mStringArrayVsListPreference(List [a, b])" /> + +<#-- 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/28a276c8/freemarker-core-test/src/test/resources/org/apache/freemarker/test/templatesuite/templates/precedence.ftl ---------------------------------------------------------------------- diff --git a/freemarker-core-test/src/test/resources/org/apache/freemarker/test/templatesuite/templates/precedence.ftl b/freemarker-core-test/src/test/resources/org/apache/freemarker/test/templatesuite/templates/precedence.ftl new file mode 100644 index 0000000..472b076 --- /dev/null +++ b/freemarker-core-test/src/test/resources/org/apache/freemarker/test/templatesuite/templates/precedence.ftl @@ -0,0 +1,61 @@ +<#-- + 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. +--> +<html> +<head> +<title>FreeMarker: Operator Precedence Test</title> +</head> +<body> +<#assign patate1 = "test"> +<#assign patate2 = "test"> +<#assign patate3 = "test"> + +<#if patate1 == patate2 && patate2 == patate3> +@@@@@@@@@@@ +</#if> + +<br /> +<br /> + +<#if patate1?exists && patate2 == patate3> +########## +</#if> + +<br /> +<br /> + +<#if patate2 == patate2 && (patate2==patate2)> +&&&&&&&&&&& +</#if> + +<br /> +<br /> + +<#if (patate2 == patate2) && (patate2==patate2)> +!!!!!!!!!!! +</#if> + +<br /> +<br /> + +<#if (patate2 == patate2) && patate2==patate2> +$$$$$$$$$$$ +</#if> + +</body> +</html> http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/28a276c8/freemarker-core-test/src/test/resources/org/apache/freemarker/test/templatesuite/templates/range-common.ftl ---------------------------------------------------------------------- diff --git a/freemarker-core-test/src/test/resources/org/apache/freemarker/test/templatesuite/templates/range-common.ftl b/freemarker-core-test/src/test/resources/org/apache/freemarker/test/templatesuite/templates/range-common.ftl new file mode 100644 index 0000000..142435b --- /dev/null +++ b/freemarker-core-test/src/test/resources/org/apache/freemarker/test/templatesuite/templates/range-common.ftl @@ -0,0 +1,314 @@ +<#-- + 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. +--> +<#-- A version of "?join" that fails at null-s in the sequence: --> +<#function join seq sep=''> + <#local r = ""> + <#list seq as i> + <#local r = r + i> + <#if i_has_next> + <#local r = r + sep> + </#if> + </#list> + <#return r> +</#function> + +<#-----------------------> +<#-- Range expressions --> + +<@assertEquals actual=join(1..2, ' ') expected="1 2" /> +<@assertEquals actual=join(1..1, ' ') expected="1" /> +<@assertEquals actual=join(1..0, ' ') expected="1 0" /> +<@assertEquals actual=join(1..-1, ' ') expected="1 0 -1" /> +<@assertEquals actual=join(-1..-1, ' ') expected="-1" /> +<@assertEquals actual=join(-1..1, ' ') expected="-1 0 1" /> + +<@assertEquals actual=join(1..<3, ' ') expected="1 2" /> +<@assertEquals actual=join(1..<2, ' ') expected="1" /> +<@assertEquals actual=join(1..<1, ' ') expected="" /> +<@assertEquals actual=join(1..<0, ' ') expected="1" /> +<@assertEquals actual=join(1..<-1, ' ') expected="1 0" /> +<@assertEquals actual=join(1..<-2, ' ') expected="1 0 -1" /> +<@assertEquals actual=join(-1..<0, ' ') expected="-1" /> +<@assertEquals actual=join(-1..<2, ' ') expected="-1 0 1" /> + +<@assertEquals actual=join(1..!3, ' ') expected="1 2" /> +<@assertEquals actual=join(1..!2, ' ') expected="1" /> +<@assertEquals actual=join(1..!1, ' ') expected="" /> +<@assertEquals actual=join(1..!0, ' ') expected="1" /> +<@assertEquals actual=join(1..!-1, ' ') expected="1 0" /> +<@assertEquals actual=join(1..!-2, ' ') expected="1 0 -1" /> +<@assertEquals actual=join(-1..!0, ' ') expected="-1" /> +<@assertEquals actual=join(-1..!2, ' ') expected="-1 0 1" /> + +<@assertEquals actual=join(1..*2, ' ') expected="1 2" /> +<@assertEquals actual=join(1..*1, ' ') expected="1" /> +<@assertEquals actual=join(1..*0, ' ') expected="" /> +<@assertEquals actual=join(1..*-1, ' ') expected="1" /> +<@assertEquals actual=join(1..*-2, ' ') expected="1 0" /> +<@assertEquals actual=join(1..*-3, ' ') expected="1 0 -1" /> +<@assertEquals actual=join(-1..*1, ' ') expected="-1" /> +<@assertEquals actual=join(-1..*3, ' ') expected="-1 0 1" /> + +<@assertEquals actual=1 expected=(0..0)?size /> +<@assertEquals actual=1 expected=(1..1)?size /> +<@assertEquals actual=1 expected=(2..2)?size /> +<@assertEquals actual=2 expected=(0..1)?size /> +<@assertEquals actual=2 expected=(1..2)?size /> +<@assertEquals actual=2 expected=(2..3)?size /> +<@assertEquals actual=3 expected=(2..4)?size /> +<@assertEquals actual=2 expected=(1..0)?size /> +<@assertEquals actual=2 expected=(2..1)?size /> +<@assertEquals actual=2 expected=(3..2)?size /> +<@assertEquals actual=3 expected=(4..2)?size /> + +<@assertEquals actual=0 expected=(0..<0)?size /> +<@assertEquals actual=0 expected=(1..<1)?size /> +<@assertEquals actual=0 expected=(2..<2)?size /> +<@assertEquals actual=1 expected=(0..<1)?size /> +<@assertEquals actual=1 expected=(1..<2)?size /> +<@assertEquals actual=1 expected=(2..<3)?size /> +<@assertEquals actual=2 expected=(2..<4)?size /> +<@assertEquals actual=1 expected=(1..<0)?size /> +<@assertEquals actual=1 expected=(2..<1)?size /> +<@assertEquals actual=1 expected=(3..<2)?size /> +<@assertEquals actual=2 expected=(4..<2)?size /> + +<@assertEquals actual=0 expected=(0..*0)?size /> +<@assertEquals actual=0 expected=(1..*0)?size /> +<@assertEquals actual=0 expected=(2..*0)?size /> +<@assertEquals actual=1 expected=(0..*1)?size /> +<@assertEquals actual=1 expected=(1..*1)?size /> +<@assertEquals actual=1 expected=(2..*1)?size /> +<@assertEquals actual=2 expected=(2..*2)?size /> +<@assertEquals actual=1 expected=(0..*-1)?size /> +<@assertEquals actual=1 expected=(1..*-1)?size /> +<@assertEquals actual=1 expected=(2..*-1)?size /> +<@assertEquals actual=2 expected=(0..*-2)?size /> +<@assertEquals actual=2 expected=(1..*-2)?size /> +<@assertEquals actual=2 expected=(2..*-2)?size /> + + +<#---------------------> +<#-- String slicing: --> + +<#assign s = 'abcd'> + +<@assertEquals actual=s[0..] expected="abcd" /> +<@assertEquals actual=s[1..] expected="bcd" /> +<@assertEquals actual=s[2..] expected="cd" /> +<@assertEquals actual=s[3..] expected="d" /> +<@assertEquals actual=s[4..] expected="" /> +<@assertFails message="5 is out of bounds"> + <#assign _ = s[5..] /> +</@assertFails> +<@assertFails message="6 is out of bounds"> + <#assign _ = s[6..] /> +</@assertFails> + +<@assertEquals actual=s[1..2] expected="bc" /> +<@assertEquals actual=s[1..1] expected="b" /> +<@assertEquals actual=s[0..1] expected="ab" /> +<@assertEquals actual=s[0..0] expected="a" /> +<@assertFails message="4 is out of bounds"> + <#assign _ = s[1..4] /> +</@assertFails> +<@assertFails message="5 is out of bounds"> + <#assign _ = s[1..5] /> +</@assertFails> +<@assertFails message="negative"> + <#assign _ = s[-1..1] /> +</@assertFails> +<@assertFails message="negative"> + <#assign _ = s[-2..1] /> +</@assertFails> +<@assertFails message="negative"> + <#assign _ = s[0..-1] /> +</@assertFails> + +<@assertEquals actual=s[1..<3] expected="bc" /> +<@assertEquals actual=s[1..!3] expected="bc" /> +<@assertEquals actual=s[1..<2] expected="b" /> +<@assertEquals actual=s[1..<0] expected="b" /> +<@assertEquals actual=s[1..<1] expected="" /> +<@assertEquals actual=s[0..<0] expected="" /> +<@assertEquals actual=s[5..<5] expected="" /> +<@assertEquals actual=s[6..<6] expected="" /> +<@assertEquals actual=s[-5..<-5] expected="" /> +<@assertFails message="negative"> + <#assign _ = s[-5..<1] /> +</@assertFails> +<@assertFails message="negative"> + <#assign _ = s[2..<-4] /> +</@assertFails> +<@assertFails message="decreasing"> + <#assign _ = s[2..<0] /> +</@assertFails> + +<@assertEquals actual=s[1..*-1] expected="b" /> +<@assertEquals actual=s[1..*0] expected="" /> +<@assertEquals actual=s[1..*1] expected="b" /> +<@assertEquals actual=s[1..*2] expected="bc" /> +<@assertEquals actual=s[1..*3] expected="bcd" /> +<@assertEquals actual=s[1..*4] expected="bcd" /> +<@assertEquals actual=s[1..*5] expected="bcd" /> +<@assertEquals actual=s[4..*1] expected="" /> +<@assertEquals actual=s[5..*0] expected="" /> +<@assertEquals actual=s[6..*0] expected="" /> +<@assertEquals actual=s[-5..*0] expected="" /> +<@assertEquals actual=s[0..*0] expected="" /> +<@assertEquals actual=s[0..*-1] expected="a" /> +<@assertEquals actual=s[0..*-2] expected="a" /> +<@assertEquals actual=s[0..*-3] expected="a" /> +<@assertFails message="5 is out of bounds"> + <#assign _ = s[5..*1] /> +</@assertFails> +<@assertFails message="negative"> + <#assign _ = s[-1..*1] /> +</@assertFails> +<@assertFails message="negative"> + <#assign _ = s[-2..*1] /> +</@assertFails> +<@assertFails message="decreasing"> + <#assign _ = s[1..*-2] /> +</@assertFails> +<@assertFails message="decreasing"> + <#assign _ = s[1..*-3] /> +</@assertFails> +<@assertFails message="4 is out of bounds"> + <#assign _ = s[4..*-1] /> +</@assertFails> + +<#-- Legacy string backward-range bug kept for compatibility: --> +<@assertEquals actual=s[1..0] expected="" /> +<@assertEquals actual=s[2..1] expected="" /> +<@assertFails message="negative"> + <@assertEquals actual=s[0..-1] expected="" /> +</@assertFails> +<@assertFails message="decreasing"> + <@assertEquals actual=s[3..1] expected="" /> +</@assertFails> +<#-- But it isn't emulated for operators introduced after 2.3.20: --> +<@assertFails message="decreasing"> + <@assertEquals actual=s[3..<1] expected="" /> +</@assertFails> +<@assertFails message="decreasing"> + <@assertEquals actual=s[3..*-2] expected="" /> +</@assertFails> + +<#assign r = 1..2> +<@assertEquals actual=s[r] expected="bc" /> +<#assign r = 2..1> +<@assertEquals actual=s[r] expected="" /> +<#assign r = 1..<2> +<@assertEquals actual=s[r] expected="b" /> +<#assign r = 2..<4> +<@assertEquals actual=s[r] expected="cd" /> +<#assign r = 2..> +<@assertEquals actual=s[r] expected="cd" /> +<#assign r = 1..*2> +<@assertEquals actual=s[r] expected="bc" /> + +<#-----------------------> +<#-- Sequence slicing: --> + +<#assign s = ['a', 'b', 'c', 'd']> + +<@assertEquals actual=join(s[0..]) expected="abcd" /> +<@assertEquals actual=join(s[1..]) expected="bcd" /> +<@assertEquals actual=join(s[2..]) expected="cd" /> +<@assertEquals actual=join(s[3..]) expected="d" /> +<@assertEquals actual=join(s[4..]) expected="" /> +<@assertFails message="5 is out of bounds"> + <#assign _ = s[5..] /> +</@assertFails> +<@assertFails message="negative"> + <#assign _ = s[-1..] /> +</@assertFails> + +<@assertEquals actual=join(s[1..2]) expected="bc" /> +<@assertEquals actual=join(s[1..1]) expected="b" /> +<@assertEquals actual=join(s[0..1]) expected="ab" /> +<@assertEquals actual=join(s[0..0]) expected="a" /> +<@assertFails message="5 is out of bounds"> + <#assign _ = s[1..5] /> +</@assertFails> +<@assertFails message="negative"> + <#assign _ = s[-1..0] /> +</@assertFails> +<@assertFails message="negative"> + <#assign _ = s[0..-1] /> +</@assertFails> + +<@assertEquals actual=join(s[1..<3]) expected="bc" /> +<@assertEquals actual=join(s[1..!3]) expected="bc" /> +<@assertEquals actual=join(s[1..<2]) expected="b" /> +<@assertEquals actual=join(s[1..<0]) expected="b" /> +<@assertEquals actual=join(s[1..<1]) expected="" /> +<@assertEquals actual=join(s[0..<0]) expected="" /> + +<@assertEquals actual=join(s[1..0]) expected="ba" /> +<@assertEquals actual=join(s[2..1]) expected="cb" /> +<@assertEquals actual=join(s[2..0]) expected="cba" /> +<@assertEquals actual=join(s[2..<0]) expected="cb" /> +<@assertEquals actual=join(s[1..<0]) expected="b" /> +<@assertEquals actual=join(s[0..<0]) expected="" /> +<@assertEquals actual=join(s[3..<1]) expected="dc" /> +<@assertEquals actual=join(s[2..<1]) expected="c" /> +<@assertEquals actual=join(s[1..<1]) expected="" /> +<@assertEquals actual=join(s[0..<1]) expected="a" /> +<@assertEquals actual=join(s[0..<0]) expected="" /> +<@assertEquals actual=join(s[5..<5]) expected="" /> +<@assertEquals actual=join(s[-5..<-5]) expected="" /> + +<@assertEquals actual=join(s[0..*-4]) expected="a" /> +<@assertEquals actual=join(s[1..*-4]) expected="ba" /> +<@assertEquals actual=join(s[1..*-3]) expected="ba" /> +<@assertEquals actual=join(s[1..*-2]) expected="ba" /> +<@assertEquals actual=join(s[1..*-1]) expected="b" /> +<@assertEquals actual=join(s[1..*0]) expected="" /> +<@assertEquals actual=join(s[1..*1]) expected="b" /> +<@assertEquals actual=join(s[1..*2]) expected="bc" /> +<@assertEquals actual=join(s[1..*3]) expected="bcd" /> +<@assertEquals actual=join(s[1..*4]) expected="bcd" /> +<@assertEquals actual=join(s[1..*5]) expected="bcd" /> +<@assertEquals actual=join(s[0..*3]) expected="abc" /> +<@assertEquals actual=join(s[2..*3]) expected="cd" /> +<@assertEquals actual=join(s[3..*3]) expected="d" /> +<@assertEquals actual=join(s[4..*3]) expected="" /> +<@assertFails message="5 is out of bounds"> + <#assign _ = s[5..*3] /> +</@assertFails> +<@assertFails message="negative"> + <#assign _ = s[-1..*2] /> +</@assertFails> + +<#assign r = 1..2> +<@assertEquals actual=join(s[r]) expected="bc" /> +<#assign r = 2..0> +<@assertEquals actual=join(s[r]) expected="cba" /> +<#assign r = 1..<2> +<@assertEquals actual=join(s[r]) expected="b" /> +<#assign r = 2..<0> +<@assertEquals actual=join(s[r]) expected="cb" /> +<#assign r = 2..> +<@assertEquals actual=join(s[r]) expected="cd" /> +<#assign r = 1..*2> +<@assertEquals actual=join(s[r]) expected="bc" /> +<#assign r = 1..*-9> +<@assertEquals actual=join(s[r]) expected="ba" />
