/* * Copyright 2016 Red Hat, Inc. and/or its affiliates. * * Licensed 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. */ package org.kie.dmn.feel.runtime; import java.math.BigDecimal; import java.time.ZonedDateTime; import java.util.Arrays; import java.util.Collection; import org.junit.runners.Parameterized; public class FEELFunctionsTest extends BaseFEELTest { @Parameterized.Parameters(name = "{index}: {0} ({1}) = {2}") public static Collection<Object[]> data() { final Object[][] cases = new Object[][] { // constants { "string(1.1)", "1.1" }, { "string(null)", null }, { "string(date(\"2016-08-14\"))", "2016-08-14" }, { "string(\"Happy %.0fth birthday, Mr %s!\", 38, \"Doe\")", "Happy 38th birthday, Mr Doe!"}, { "number(null, \",\", \".\")", null }, { "number(\"1,000.05\", \",\", \".\")", new BigDecimal( "1000.05" ) }, { "number(\"1.000,05\", \".\", \",\")", new BigDecimal( "1000.05" ) }, { "number(\"1000,05\", null, \",\")", new BigDecimal( "1000.05" ) }, { "substring(\"foobar\", 3)", "obar" }, { "substring(\"foobar\", 3, 3)", "oba" }, { "substring(\"foobar\", -2, 1)", "a" }, { "substring(\"foobar\", -2, 5)", "ar" }, { "substring(\"foobar\", 15, 5)", null }, { "string length(\"foobar\")", BigDecimal.valueOf( 6 ) }, { "string length(null)", null }, { "upper case(\"aBc4\")", "ABC4" }, { "upper case(null)", null }, { "lower case(\"aBc4\")", "abc4" }, { "lower case(null)", null }, { "substring before( \"foobar\", \"bar\")", "foo" }, { "substring before( \"foobar\", \"xyz\")", "" }, { "substring before( \"foobar\", \"foo\")", "" }, { "substring after( \"foobar\", \"foo\")", "bar" }, { "substring after( \"foobar\", \"xyz\")", "foobar" }, { "substring after( \"foobar\", \"bar\")", "" }, { "contains(\"foobar\", \"ob\")", Boolean.TRUE }, { "contains(\"foobar\", \"of\")", Boolean.FALSE }, { "starts with(\"foobar\", \"of\")", Boolean.FALSE }, { "starts with(\"foobar\", \"fo\")", Boolean.TRUE }, { "ends with(\"foobar\", \"of\")", Boolean.FALSE }, { "ends with(\"foobar\", \"bar\")", Boolean.TRUE }, { "matches(\"foo\", \"[a-z]{3}\")", Boolean.TRUE }, { "matches(\"banana\", \"[a-z]{3}\")", Boolean.TRUE }, { "matches(\"two \\n lines\", \"two.*lines\")", Boolean.FALSE }, { "matches(\"two \\n lines\", \"two.*lines\", \"s\")", Boolean.TRUE }, // DOT_ALL flag set by "s" { "matches(\"one\\ntwo\\nthree\", \"^two$\")", Boolean.FALSE }, { "matches(\"one\\ntwo\\nthree\", \"^two$\", \"m\")", Boolean.TRUE }, // MULTILINE flag set by "m" { "matches(\"FoO\", \"foo\")", Boolean.FALSE }, { "matches(\"FoO\", \"foo\", \"i\")", Boolean.TRUE }, // CASE_INSENSITIVE flag set by "i" { "replace(\"banana\",\"a\",\"o\")", "bonono" }, { "replace(\"banana\",\"(an)+\", \"**\")", "b**a" }, { "replace(\"banana\",\"[aeiouy]\",\"[$0]\")", "b[a]n[a]n[a]" }, { "list contains([1, 2, 3], 2)", Boolean.TRUE }, { "list contains([1, 2, 3], 5)", Boolean.FALSE }, { "count([1, 2, 3])", BigDecimal.valueOf( 3 ) }, { "count( 1, 2, 3 )", BigDecimal.valueOf( 3 ) }, { "min( \"a\", \"b\", \"c\" )", "a" }, { "min([ \"a\", \"b\", \"c\" ])", "a" }, { "max( 1, 2, 3 )", BigDecimal.valueOf( 3 ) }, { "max([ 1, 2, 3 ])", BigDecimal.valueOf( 3 ) }, { "sum( 1, 2, 3 )", BigDecimal.valueOf( 6 ) }, { "sum([ 1, 2, 3 ])", BigDecimal.valueOf( 6 ) }, { "mean( 1, 2, 3 )", BigDecimal.valueOf( 2 ) }, { "mean([ 1, 2, 3 ])", BigDecimal.valueOf( 2 ) }, { "all( true, true, true )", Boolean.TRUE }, { "all([ true, true, true ])", Boolean.TRUE }, { "all( true, true, false )", Boolean.FALSE }, { "all([ false ])", Boolean.FALSE }, { "any( false, true, false )", Boolean.TRUE }, { "any([ false, true, false ])", Boolean.TRUE }, { "any( false )", Boolean.FALSE }, { "any([ false, false, false ])", Boolean.FALSE }, { "sublist( [1, 2, 3, 4, 5 ], 3, 2 )", Arrays.asList( BigDecimal.valueOf( 3 ), BigDecimal.valueOf( 4 ) )}, { "sublist( [1, 2, 3, 4, 5 ], -2, 1 )", Arrays.asList( BigDecimal.valueOf( 4 ) )}, { "sublist( [1, 2, 3, 4, 5 ], 4, 3 )", null }, { "sublist( [1, 2, 3, 4, 5 ], 6, 3 )", null }, { "sublist( [1, 2, 3, 4, 5 ], -6, 3 )", null }, { "sublist( [1, 2, 3, 4, 5 ], -5, 3 )", Arrays.asList( BigDecimal.valueOf( 1 ), BigDecimal.valueOf( 2 ), BigDecimal.valueOf( 3 ) ) }, { "sublist( [1, 2, 3, 4, 5 ], 1, 3 )", Arrays.asList( BigDecimal.valueOf( 1 ), BigDecimal.valueOf( 2 ), BigDecimal.valueOf( 3 ) ) }, { "append( [1, 2], 3, 4 )", Arrays.asList( BigDecimal.valueOf( 1 ), BigDecimal.valueOf( 2 ), BigDecimal.valueOf( 3 ), BigDecimal.valueOf( 4 ) ) }, { "append( [], 3, 4 )", Arrays.asList( BigDecimal.valueOf( 3 ), BigDecimal.valueOf( 4 ) ) }, { "append( [1, 2] )", Arrays.asList( BigDecimal.valueOf( 1 ), BigDecimal.valueOf( 2 ) ) }, { "append( [1, 2], null, 4 )", Arrays.asList( BigDecimal.valueOf( 1 ), BigDecimal.valueOf( 2 ), null, BigDecimal.valueOf( 4 ) ) }, { "append( null, 1, 2 )", null }, { "concatenate( [1, 2], [3] )", Arrays.asList( BigDecimal.valueOf( 1 ), BigDecimal.valueOf( 2 ), BigDecimal.valueOf( 3 ) ) }, { "concatenate( [1, 2], 3, [4] )", Arrays.asList( BigDecimal.valueOf( 1 ), BigDecimal.valueOf( 2 ), BigDecimal.valueOf( 3 ), BigDecimal.valueOf( 4 ) ) }, { "concatenate( [1, 2], null )", null }, { "insert before( [1, 2, 3], 1, 4 )", Arrays.asList( BigDecimal.valueOf( 4 ), BigDecimal.valueOf( 1 ), BigDecimal.valueOf( 2 ), BigDecimal.valueOf( 3 ) ) }, { "insert before( [1, 2, 3], 3, 4 )", Arrays.asList( BigDecimal.valueOf( 1 ), BigDecimal.valueOf( 2 ), BigDecimal.valueOf( 4 ), BigDecimal.valueOf( 3 ) ) }, { "insert before( [1, 2, 3], 3, null )", Arrays.asList( BigDecimal.valueOf( 1 ), BigDecimal.valueOf( 2 ), null, BigDecimal.valueOf( 3 ) ) }, { "insert before( null, 3, 4 )", null }, { "insert before( [1, 2, 3], 4, 4 )", null }, { "insert before( [1, 2, 3], -3, 4 )", Arrays.asList( BigDecimal.valueOf( 4 ), BigDecimal.valueOf( 1 ), BigDecimal.valueOf( 2 ), BigDecimal.valueOf( 3 ) ) }, { "insert before( [1, 2, 3], -1, 4 )", Arrays.asList( BigDecimal.valueOf( 1 ), BigDecimal.valueOf( 2 ), BigDecimal.valueOf( 4 ), BigDecimal.valueOf( 3 ) ) }, { "insert before( [1, 2, 3], 0, 4 )", null }, { "insert before( [1, 2, 3], -4, 4 )", null }, { "remove( [1, 2, 3], 1 )", Arrays.asList( BigDecimal.valueOf( 2 ), BigDecimal.valueOf( 3 ) ) }, { "remove( [1, 2, 3], 3 )", Arrays.asList( BigDecimal.valueOf( 1 ), BigDecimal.valueOf( 2 ) ) }, { "remove( [1, 2, 3], -1 )", Arrays.asList( BigDecimal.valueOf( 1 ), BigDecimal.valueOf( 2 ) ) }, { "remove( [1, 2, 3], -3 )", Arrays.asList( BigDecimal.valueOf( 2 ), BigDecimal.valueOf( 3 ) ) }, { "remove( [1, 2, 3], 4 )", null }, { "remove( [1, 2, 3], -4 )", null }, { "remove( [1, 2, 3], 0 )", null }, { "reverse( [1, 2, 3] )", Arrays.asList( BigDecimal.valueOf( 3 ), BigDecimal.valueOf( 2 ), BigDecimal.valueOf( 1 ) ) }, { "reverse( null )", null }, { "index of( [1, 2, 3, 2], 2 )", Arrays.asList( BigDecimal.valueOf( 2 ), BigDecimal.valueOf( 4 ) ) }, { "index of( [1, 2, null, null], null )", Arrays.asList( BigDecimal.valueOf( 3 ), BigDecimal.valueOf( 4 ) ) }, { "index of( [1, 2, null, null], 1 )", Arrays.asList( BigDecimal.valueOf( 1 ) ) }, { "index of( null, 1 )", null }, { "union( [1, 2, 1], [2, 3], 2, 4 )", Arrays.asList( BigDecimal.valueOf( 1 ), BigDecimal.valueOf( 2 ), BigDecimal.valueOf( 3 ), BigDecimal.valueOf( 4 ) ) }, { "union( [1, 2, null], 4 )", Arrays.asList( BigDecimal.valueOf( 1 ), BigDecimal.valueOf( 2 ), null, BigDecimal.valueOf( 4 ) ) }, { "union( null, 4 )", null }, { "distinct values( [1, 2, 3, 2, 4] )", Arrays.asList( BigDecimal.valueOf( 1 ), BigDecimal.valueOf( 2 ), BigDecimal.valueOf( 3 ), BigDecimal.valueOf( 4 ) ) }, { "distinct values( [1, 2, null, 2, 4] )", Arrays.asList( BigDecimal.valueOf( 1 ), BigDecimal.valueOf( 2 ), null, BigDecimal.valueOf( 4 ) ) }, { "distinct values( 1 )", Arrays.asList( BigDecimal.valueOf( 1 ) ) }, { "distinct values( null )", null }, { "decimal( 1/3, 2 )", new BigDecimal("0.33") }, { "decimal( 1.5, 0 )", new BigDecimal("2") }, { "decimal( 2.5, 0 )", new BigDecimal("2") }, { "decimal( null, 0 )", null }, { "floor( 1.5 )", new BigDecimal("1") }, { "floor( -1.5 )", new BigDecimal("-2") }, { "floor( null )", null }, { "ceiling( 1.5 )", new BigDecimal("2") }, { "ceiling( -1.5 )", new BigDecimal("-1") }, { "ceiling( null )", null }, { "ceiling( n : 1.5 )", new BigDecimal("2") }, { "now()", ZonedDateTime.class }, { "sort( [3, 1, 4, 5, 2], function(x,y) x < y )", Arrays.asList( BigDecimal.valueOf( 1 ), BigDecimal.valueOf( 2 ), BigDecimal.valueOf( 3 ), BigDecimal.valueOf( 4 ), BigDecimal.valueOf( 5 ) ) }, { "sort( [3, 1, 4, 5, 2] )", Arrays.asList( BigDecimal.valueOf( 1 ), BigDecimal.valueOf( 2 ), BigDecimal.valueOf( 3 ), BigDecimal.valueOf( 4 ), BigDecimal.valueOf( 5 ) ) }, { "sort( list : [3, 1, 4, 5, 2] )", Arrays.asList( BigDecimal.valueOf( 1 ), BigDecimal.valueOf( 2 ), BigDecimal.valueOf( 3 ), BigDecimal.valueOf( 4 ), BigDecimal.valueOf( 5 ) ) }, { "sort( [\"c\", \"e\", \"d\", \"a\", \"b\"], function(x,y) x < y )", Arrays.asList( "a", "b", "c", "d", "e" ) }, { "sort( list : [\"c\", \"e\", \"d\", \"a\", \"b\"], precedes : function(x,y) x < y )", Arrays.asList( "a", "b", "c", "d", "e" ) }, { "sort( precedes : function(x,y) x < y, list : [\"c\", \"e\", \"d\", \"a\", \"b\"] )", Arrays.asList( "a", "b", "c", "d", "e" ) } }; return Arrays.asList( cases ); } }