This is an automated email from the ASF dual-hosted git repository.

yamer pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/incubator-kie-drools.git


The following commit(s) were added to refs/heads/main by this push:
     new 09c1505933 [kie-issues#1330] FEEL functions that expect List 
parameters, should coerce single item to a List (#5997)
09c1505933 is described below

commit 09c1505933c5410133e5f86989dd57c2d6f2ad1d
Author: Yeser Amer <[email protected]>
AuthorDate: Wed Jul 17 14:19:53 2024 +0200

    [kie-issues#1330] FEEL functions that expect List parameters, should coerce 
single item to a List (#5997)
    
    * Fix + Tests
    
    * Fix + Tests
    
    * Fix + Tests
    
    * Tests fixed
    
    * Fix + Tests
    
    * Fix + Tests
    
    * Fix
    
    * Revert
    
    * Fix
    
    * Fix
    
    * Improving scoring
    
    * BaseFEELFunction updated
    
    * BaseFEELFunction updated
    
    * Revert context function
    
    * context function
    
    * Revert some changes + Tests
    
    * Change
---
 .../dmn/feel/runtime/functions/AllFunction.java    |  4 --
 .../dmn/feel/runtime/functions/AnyFunction.java    |  4 --
 .../dmn/feel/runtime/functions/MeanFunction.java   | 21 +-------
 .../feel/runtime/functions/ProductFunction.java    | 17 -------
 .../dmn/feel/runtime/functions/StddevFunction.java | 12 -----
 .../dmn/feel/runtime/functions/SumFunction.java    | 17 -------
 .../feel/runtime/FEEL12ExtendedFunctionsTest.java  |  5 +-
 .../kie/dmn/feel/runtime/FEELFunctionsTest.java    | 31 ++++++++++++
 .../feel/runtime/KieFEELExtendedFunctionsTest.java | 15 ++++--
 .../feel/runtime/functions/AllFunctionTest.java    | 15 ------
 .../feel/runtime/functions/AnyFunctionTest.java    | 15 ------
 .../feel/runtime/functions/MeanFunctionTest.java   | 29 +++--------
 .../runtime/functions/StringJoinFunctionTest.java  | 56 ++++++++++++++++++++++
 .../feel/runtime/functions/SumFunctionTest.java    | 20 +-------
 14 files changed, 111 insertions(+), 150 deletions(-)

diff --git 
a/kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/runtime/functions/AllFunction.java
 
b/kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/runtime/functions/AllFunction.java
index 1ae19f9ceb..fc640d5e5a 100644
--- 
a/kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/runtime/functions/AllFunction.java
+++ 
b/kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/runtime/functions/AllFunction.java
@@ -58,10 +58,6 @@ public class AllFunction
         }
     }
 
-    public FEELFnResult<Boolean> invoke(@ParameterName( "list" ) Boolean 
single) {
-        return FEELFnResult.ofResult( single );
-    }
-
     public FEELFnResult<Boolean> invoke(@ParameterName( "b" ) Object[] list) {
         if ( list == null ) { 
             // Arrays.asList does not accept null as parameter
diff --git 
a/kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/runtime/functions/AnyFunction.java
 
b/kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/runtime/functions/AnyFunction.java
index 17e8d33063..9243758d73 100644
--- 
a/kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/runtime/functions/AnyFunction.java
+++ 
b/kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/runtime/functions/AnyFunction.java
@@ -58,10 +58,6 @@ public class AnyFunction
         }
     }
 
-    public FEELFnResult<Boolean> invoke(@ParameterName( "list" ) Boolean 
single) {
-        return FEELFnResult.ofResult( single );
-    }
-
     public FEELFnResult<Boolean> invoke(@ParameterName( "b" ) Object[] list) {
         if ( list == null ) { 
             // Arrays.asList does not accept null as parameter
diff --git 
a/kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/runtime/functions/MeanFunction.java
 
b/kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/runtime/functions/MeanFunction.java
index 0d940380ba..cdb78dd924 100644
--- 
a/kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/runtime/functions/MeanFunction.java
+++ 
b/kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/runtime/functions/MeanFunction.java
@@ -47,9 +47,8 @@ public class MeanFunction
 
         FEELFnResult<BigDecimal> s = sum.invoke( list );
         
-        Function<FEELEvent, FEELFnResult<BigDecimal>> ifLeft = (event) -> {
-            return FEELFnResult.ofError(new 
InvalidParametersEvent(Severity.ERROR, "list", "unable to sum the elements 
which is required to calculate the mean"));
-        };
+        Function<FEELEvent, FEELFnResult<BigDecimal>> ifLeft = event ->
+                FEELFnResult.ofError(new 
InvalidParametersEvent(Severity.ERROR, "list", "unable to sum the elements 
which is required to calculate the mean"));
         
         Function<BigDecimal, FEELFnResult<BigDecimal>> ifRight = (sum) -> {
             try {
@@ -62,22 +61,6 @@ public class MeanFunction
         return s.cata(ifLeft, ifRight);
     }
 
-    public FEELFnResult<BigDecimal> invoke(@ParameterName( "list" ) Number 
single) {
-        if ( single == null ) {
-            return FEELFnResult.ofError(new 
InvalidParametersEvent(Severity.ERROR, "single", "the single value list cannot 
be null"));
-        }
-
-        if( single instanceof BigDecimal ) {
-            return FEELFnResult.ofResult((BigDecimal) single );
-        } 
-        BigDecimal result = NumberEvalHelper.getBigDecimalOrNull(single );
-        if ( result != null ) {
-            return FEELFnResult.ofResult( result );
-        } else {
-            return FEELFnResult.ofError(new 
InvalidParametersEvent(Severity.ERROR, "list", "single element in list is not a 
number"));
-        }
-    }
-
     public FEELFnResult<BigDecimal> invoke(@ParameterName( "n" ) Object[] 
list) {
         if ( list == null ) { 
             // Arrays.asList does not accept null as parameter
diff --git 
a/kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/runtime/functions/ProductFunction.java
 
b/kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/runtime/functions/ProductFunction.java
index 11462667c8..42922bb82f 100644
--- 
a/kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/runtime/functions/ProductFunction.java
+++ 
b/kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/runtime/functions/ProductFunction.java
@@ -54,23 +54,6 @@ public class ProductFunction
         return FEELFnResult.ofResult( product );
     }
 
-    public FEELFnResult<BigDecimal> invoke(@ParameterName("list") Number 
single) {
-        if ( single == null ) { 
-            // Arrays.asList does not accept null as parameter
-            return FEELFnResult.ofError(new 
InvalidParametersEvent(Severity.ERROR, "list", "the single value list cannot be 
null"));
-        }
-        
-        if( single instanceof BigDecimal ) {
-            return FEELFnResult.ofResult((BigDecimal) single );
-        } 
-        BigDecimal result = NumberEvalHelper.getBigDecimalOrNull( single );
-        if ( result != null ) {
-            return FEELFnResult.ofResult( result );
-        } else {
-            return FEELFnResult.ofError(new 
InvalidParametersEvent(Severity.ERROR, "list", "single element in list not a 
number"));
-        }
-    }
-
     public FEELFnResult<BigDecimal> invoke(@ParameterName("n") Object[] list) {
         if ( list == null ) { 
             // Arrays.asList does not accept null as parameter
diff --git 
a/kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/runtime/functions/StddevFunction.java
 
b/kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/runtime/functions/StddevFunction.java
index de7451bb13..8fae1477ce 100644
--- 
a/kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/runtime/functions/StddevFunction.java
+++ 
b/kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/runtime/functions/StddevFunction.java
@@ -69,18 +69,6 @@ public class StddevFunction
         return FEELFnResult.ofResult( SqrtFunction.sqrt( mean ) );
     }
 
-    public FEELFnResult<BigDecimal> invoke(@ParameterName("list") Object sole) 
{
-        if ( sole == null ) {
-            // Arrays.asList does not accept null as parameter
-            return FEELFnResult.ofError(new 
InvalidParametersEvent(FEELEvent.Severity.ERROR, "list", "the single value list 
cannot be null"));
-        } else if (NumberEvalHelper.getBigDecimalOrNull(sole) == null) {
-            return FEELFnResult.ofError(new 
InvalidParametersEvent(FEELEvent.Severity.ERROR, "list",
-                                                                   "the value 
can not be converted to a number"));
-        }
-        return FEELFnResult.ofError(new 
InvalidParametersEvent(FEELEvent.Severity.ERROR, "list",
-                                                               "sample 
standard deviation of a single sample is undefined"));
-        }
-
     public FEELFnResult<BigDecimal> invoke(@ParameterName("n") Object[] list) {
         if ( list == null ) {
             // Arrays.asList does not accept null as parameter
diff --git 
a/kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/runtime/functions/SumFunction.java
 
b/kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/runtime/functions/SumFunction.java
index 86d3a0310c..8cb0086c21 100644
--- 
a/kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/runtime/functions/SumFunction.java
+++ 
b/kie-dmn/kie-dmn-feel/src/main/java/org/kie/dmn/feel/runtime/functions/SumFunction.java
@@ -60,23 +60,6 @@ public class SumFunction
         return FEELFnResult.ofResult( sum );
     }
 
-    public FEELFnResult<BigDecimal> invoke(@ParameterName("list") Number 
single) {
-        if ( single == null ) { 
-            // Arrays.asList does not accept null as parameter
-            return FEELFnResult.ofError(new 
InvalidParametersEvent(Severity.ERROR, "list", "the single value list cannot be 
null"));
-        }
-        
-        if( single instanceof BigDecimal ) {
-            return FEELFnResult.ofResult((BigDecimal) single );
-        } 
-        BigDecimal result = NumberEvalHelper.getBigDecimalOrNull( single );
-        if ( result != null ) {
-            return FEELFnResult.ofResult( result );
-        } else {
-            return FEELFnResult.ofError(new 
InvalidParametersEvent(Severity.ERROR, "list", "single element in list not a 
number"));
-        }
-    }
-
     public FEELFnResult<BigDecimal> invoke(@ParameterName("n") Object[] list) {
         if ( list == null ) { 
             // Arrays.asList does not accept null as parameter
diff --git 
a/kie-dmn/kie-dmn-feel/src/test/java/org/kie/dmn/feel/runtime/FEEL12ExtendedFunctionsTest.java
 
b/kie-dmn/kie-dmn-feel/src/test/java/org/kie/dmn/feel/runtime/FEEL12ExtendedFunctionsTest.java
index 6eb2515489..7f2c9b67f1 100644
--- 
a/kie-dmn/kie-dmn-feel/src/test/java/org/kie/dmn/feel/runtime/FEEL12ExtendedFunctionsTest.java
+++ 
b/kie-dmn/kie-dmn-feel/src/test/java/org/kie/dmn/feel/runtime/FEEL12ExtendedFunctionsTest.java
@@ -59,9 +59,10 @@ public class FEEL12ExtendedFunctionsTest extends 
BaseFEELTest {
                 { "stddev( [ 47 ] )", null, FEELEvent.Severity.ERROR },
                 { "stddev( 47 )", null, FEELEvent.Severity.ERROR },
                 { "stddev( [ ] )", null, FEELEvent.Severity.ERROR },
-                {"mode( 6, 3, 9, 6, 6 )", List.of(BigDecimal.valueOf(6)), null 
},
+                { "mode( 6 )", List.of(BigDecimal.valueOf(6)), null },
+                { "mode( 6, 3, 9, 6, 6 )", List.of(BigDecimal.valueOf(6)), 
null },
                 { "mode( [6, 1, 9, 6, 1] )",  
Arrays.asList(BigDecimal.valueOf( 1 ),  BigDecimal.valueOf( 6 ) ), null },
-                {"mode( [ ] )", List.of(), null },
+                { "mode( [ ] )", List.of(), null },
         };
         return addAdditionalParameters(cases, false);
     }
diff --git 
a/kie-dmn/kie-dmn-feel/src/test/java/org/kie/dmn/feel/runtime/FEELFunctionsTest.java
 
b/kie-dmn/kie-dmn-feel/src/test/java/org/kie/dmn/feel/runtime/FEELFunctionsTest.java
index 4ec562e84f..3707929e3b 100644
--- 
a/kie-dmn/kie-dmn-feel/src/test/java/org/kie/dmn/feel/runtime/FEELFunctionsTest.java
+++ 
b/kie-dmn/kie-dmn-feel/src/test/java/org/kie/dmn/feel/runtime/FEELFunctionsTest.java
@@ -91,21 +91,37 @@ public class FEELFunctionsTest extends BaseFEELTest {
                 { "replace(\"0123456789\",\"(\\d{3})(\\d{3})(\\d{4})\",\"($1) 
$2-$3\")", "(012) 345-6789" , null},
                 { "list contains([1, 2, 3], 2)", Boolean.TRUE , null},
                 { "list contains([1, 2, 3], 5)", Boolean.FALSE , null},
+                { "list contains(1, 1)", Boolean.TRUE , null},
+                { "list contains(2, 1)", Boolean.FALSE , null},
+                { "count( 1 )", BigDecimal.valueOf( 1 ) , null},
                 { "count([1, 2, 3])", BigDecimal.valueOf( 3 ) , null},
                 { "count( 1, 2, 3 )", BigDecimal.valueOf( 3 ) , null},
+                { "min( \"a\" )", "a" , null},
                 { "min( \"a\", \"b\", \"c\" )", "a" , null},
                 { "min([ \"a\", \"b\", \"c\" ])", "a" , null},
+                { "max( 1 )", BigDecimal.valueOf( 1 ) , null},
                 { "max( 1, 2, 3 )", BigDecimal.valueOf( 3 ) , null},
                 { "max([ 1, 2, 3 ])", BigDecimal.valueOf( 3 ) , null},
                 { "max(duration(\"PT1H6M\"), duration(\"PT1H5M\"))", 
Duration.parse("PT1H6M"), null},
                 { "max(duration(\"P6Y\"), duration(\"P5Y\"))", 
ComparablePeriod.parse("P6Y"), null},
+                { "sum( 1 )", BigDecimal.valueOf( 1 ) , null},
+                { "sum( [null] )", null , FEELEvent.Severity.ERROR},
+                { "sum( null )", null , FEELEvent.Severity.ERROR},
                 { "sum( 1, 2, 3 )", BigDecimal.valueOf( 6 ) , null},
                 { "sum([ 1, 2, 3 ])", BigDecimal.valueOf( 6 ) , null},
                 { "sum([])", null, null},
+                { "product( [2, 3, 4] )", BigDecimal.valueOf( 24 ) , null},
                 { "product( 2, 3, 4 )", BigDecimal.valueOf( 24 ) , null},
+                { "product( 1 )", BigDecimal.valueOf( 1 ) , null},
+                { "product( [null] )", null , FEELEvent.Severity.ERROR},
+                { "product( null )", null , FEELEvent.Severity.ERROR},
                 { "product([ 2, 3, 4 ])", BigDecimal.valueOf( 24 ) , null},
                 { "product([])", null, FEELEvent.Severity.ERROR},
+                { "mean( [1, 2, 3] )", BigDecimal.valueOf( 2 ) , null},
                 { "mean( 1, 2, 3 )", BigDecimal.valueOf( 2 ) , null},
+                { "mean( 2 )", BigDecimal.valueOf( 2 ) , null},
+                { "mean( [null] )", null , FEELEvent.Severity.ERROR},
+                { "mean( null )", null , FEELEvent.Severity.ERROR},
                 { "mean([ 1, 2, 3 ])", BigDecimal.valueOf( 2 ) , null},
                 { "sublist( [1, 2, 3, 4, 5 ], 3, 2 )", Arrays.asList( 
BigDecimal.valueOf( 3 ), BigDecimal.valueOf( 4 ) ), null},
                 { "sublist( [1, 2, 3, 4, 5 ], -2, 1 )", 
Collections.singletonList(BigDecimal.valueOf(4)), null},
@@ -114,16 +130,21 @@ public class FEELFunctionsTest extends BaseFEELTest {
                 { "sublist( [1, 2, 3, 4, 5 ], -6, 3 )", null , 
FEELEvent.Severity.ERROR},
                 { "sublist( [1, 2, 3, 4, 5 ], -5, 3 )", Arrays.asList( 
BigDecimal.valueOf( 1 ), BigDecimal.valueOf( 2 ), BigDecimal.valueOf( 3 ) ) , 
null},
                 { "sublist( [1, 2, 3, 4, 5 ], 1, 3 )", Arrays.asList( 
BigDecimal.valueOf( 1 ), BigDecimal.valueOf( 2 ), BigDecimal.valueOf( 3 ) ) , 
null},
+                { "sublist( 1, 1, 1 )", Arrays.asList( BigDecimal.valueOf( 1 ) 
) , null},
+                { "sublist( 1, 1 )", Arrays.asList( BigDecimal.valueOf( 1 ) ) 
, null},
                 { "append( [1, 2], 3, 4 )", Arrays.asList( BigDecimal.valueOf( 
1 ), BigDecimal.valueOf( 2 ), BigDecimal.valueOf( 3 ), BigDecimal.valueOf( 4 ) 
) , null},
                 { "append( [], 3, 4 )", Arrays.asList( BigDecimal.valueOf( 3 
), BigDecimal.valueOf( 4 ) ) , null},
+                { "append( 1, 3, 4 )", Arrays.asList( BigDecimal.valueOf( 1 ), 
BigDecimal.valueOf( 3 ), BigDecimal.valueOf( 4 ) ) , null},
                 { "append( [1, 2] )", Arrays.asList( BigDecimal.valueOf( 1 ), 
BigDecimal.valueOf( 2 ) ) , null},
                 { "append( [1, 2], null, 4 )", Arrays.asList( 
BigDecimal.valueOf( 1 ), BigDecimal.valueOf( 2 ), null, BigDecimal.valueOf( 4 ) 
) , null},
                 { "append( null, 1, 2 )", null , FEELEvent.Severity.ERROR},
                 { "append( 0, 1, 2 )",  Arrays.asList( BigDecimal.valueOf( 0 
), BigDecimal.valueOf( 1 ), BigDecimal.valueOf( 2 ) ), null},
                 { "concatenate( [1, 2], [3] )", Arrays.asList( 
BigDecimal.valueOf( 1 ), BigDecimal.valueOf( 2 ), BigDecimal.valueOf( 3 ) ) , 
null},
+                { "concatenate( 1, [3] )", Arrays.asList( BigDecimal.valueOf( 
1 ), BigDecimal.valueOf( 3 ) ) , null},
                 { "concatenate( [1, 2], 3, [4] )", Arrays.asList( 
BigDecimal.valueOf( 1 ), BigDecimal.valueOf( 2 ), BigDecimal.valueOf( 3 ), 
BigDecimal.valueOf( 4 ) ) , null},
                 { "concatenate( [1, 2], null )", null , 
FEELEvent.Severity.ERROR},
                 { "insert before( [1, 2, 3], 1, 4 )", Arrays.asList( 
BigDecimal.valueOf( 4 ), BigDecimal.valueOf( 1 ), BigDecimal.valueOf( 2 ), 
BigDecimal.valueOf( 3 ) ) , null},
+                { "insert before( 1, 1, 4 )", Arrays.asList( 
BigDecimal.valueOf( 4 ), BigDecimal.valueOf( 1 ) ) , null},
                 { "insert before( [1, 2, 3], 3, 4 )", Arrays.asList( 
BigDecimal.valueOf( 1 ), BigDecimal.valueOf( 2 ), BigDecimal.valueOf( 4 ), 
BigDecimal.valueOf( 3 ) ) , null},
                 { "insert before( [1, 2, 3], 3, null )", Arrays.asList( 
BigDecimal.valueOf( 1 ), BigDecimal.valueOf( 2 ), null, BigDecimal.valueOf( 3 ) 
) , null},
                 { "insert before( null, 3, 4 )", null , 
FEELEvent.Severity.ERROR},
@@ -133,6 +154,7 @@ public class FEELFunctionsTest extends BaseFEELTest {
                 { "insert before( [1, 2, 3], 0, 4 )", null , 
FEELEvent.Severity.ERROR},
                 { "insert before( [1, 2, 3], -4, 4 )", null , 
FEELEvent.Severity.ERROR},
                 { "remove( [1, 2, 3], 1 )", Arrays.asList( BigDecimal.valueOf( 
2 ), BigDecimal.valueOf( 3 ) ) , null},
+                { "remove( 1, 1 )", Arrays.asList() , null},
                 { "remove( [1, 2, 3], 3 )", Arrays.asList( BigDecimal.valueOf( 
1 ), BigDecimal.valueOf( 2 ) ) , null},
                 { "remove( [1, 2, 3], -1 )", Arrays.asList( 
BigDecimal.valueOf( 1 ), BigDecimal.valueOf( 2 ) ) , null},
                 { "remove( [1, 2, 3], -3 )", Arrays.asList( 
BigDecimal.valueOf( 2 ), BigDecimal.valueOf( 3 ) ) , null},
@@ -140,14 +162,20 @@ public class FEELFunctionsTest extends BaseFEELTest {
                 { "remove( [1, 2, 3], -4 )", null , FEELEvent.Severity.ERROR},
                 { "remove( [1, 2, 3], 0 )", null , FEELEvent.Severity.ERROR},
                 { "reverse( [1, 2, 3] )", Arrays.asList( BigDecimal.valueOf( 3 
), BigDecimal.valueOf( 2 ), BigDecimal.valueOf( 1 ) ) , null},
+                { "reverse( 1 )", Arrays.asList( BigDecimal.valueOf( 1 ) ) , 
null},
                 { "reverse( null )", null , FEELEvent.Severity.ERROR},
+                { "index of( 1, 1 )", Arrays.asList( BigDecimal.valueOf( 1 ) ) 
, null},
                 { "index of( [1, 2, 3, 2], 2 )", Arrays.asList( 
BigDecimal.valueOf( 2 ), BigDecimal.valueOf( 4 ) ) , null},
                 { "index of( [1, 2, null, null], null )", Arrays.asList( 
BigDecimal.valueOf( 3 ), BigDecimal.valueOf( 4 ) ) , null},
                 { "index of( [1, 2, null, null], 1 )", 
Collections.singletonList(BigDecimal.valueOf(1)), null},
                 { "index of( null, 1 )", null , FEELEvent.Severity.ERROR},
+                { "union( 1, [2, 3], 2, 4 )", Arrays.asList( 
BigDecimal.valueOf( 1 ), BigDecimal.valueOf( 2 ), BigDecimal.valueOf( 3 ), 
BigDecimal.valueOf( 4 ) ) , null},
+                { "union( 1 )", Arrays.asList( BigDecimal.valueOf( 1 ) ) , 
null},
                 { "union( [1, 2, 1], [2, 3], 2, 4 )", Arrays.asList( 
BigDecimal.valueOf( 1 ), BigDecimal.valueOf( 2 ), BigDecimal.valueOf( 3 ), 
BigDecimal.valueOf( 4 ) ) , null},
                 { "union( [1, 2, null], 4 )", Arrays.asList( 
BigDecimal.valueOf( 1 ), BigDecimal.valueOf( 2 ), null, BigDecimal.valueOf( 4 ) 
) , null},
                 { "union( null, 4 )", Arrays.asList( null, 
BigDecimal.valueOf(4) ), null},
+                { "flatten( [[1,2],[[3]], 4] )", Arrays.asList( 
BigDecimal.valueOf( 1 ), BigDecimal.valueOf( 2 ), BigDecimal.valueOf( 3 ), 
BigDecimal.valueOf( 4 ) ), null},
+                { "flatten( 1 )", Arrays.asList( BigDecimal.valueOf( 1 ) ), 
null},
                 { "distinct values( [1, 2, 3, 2, 4] )", Arrays.asList( 
BigDecimal.valueOf( 1 ), BigDecimal.valueOf( 2 ), BigDecimal.valueOf( 3 ), 
BigDecimal.valueOf( 4 ) ) , null},
                 { "distinct values( [1, 2, null, 2, 4] )", Arrays.asList( 
BigDecimal.valueOf( 1 ), BigDecimal.valueOf( 2 ), null, BigDecimal.valueOf( 4 ) 
) , null},
                 { "distinct values( 1 )", 
Collections.singletonList(BigDecimal.valueOf(1)), null},
@@ -240,6 +268,7 @@ public class FEELFunctionsTest extends BaseFEELTest {
                 { "week of year( date(2005, 1, 1) )", BigDecimal.valueOf( 53 
), null},
                 { "median( 8, 2, 5, 3, 4 )", new BigDecimal("4") , null},
                 { "median( [6, 1, 2, 3] )", new BigDecimal("2.5") , null},
+                { "median( 1 )", new BigDecimal("1") , null},
                 { "median( [ ] ) ", null, null}, // DMN spec, Table 69: 
Semantics of list functions
 
                 { "0-max( 1, 2, 3 )", BigDecimal.valueOf( -3 ) , null},
@@ -264,6 +293,8 @@ public class FEELFunctionsTest extends BaseFEELTest {
                 { "if list contains ([2.2, 3, 4], 3.000) then \"OK\" else 
\"NOT_OK\"", "OK" , null},
                 {"list replace ( null, 3, 6)", null , 
FEELEvent.Severity.ERROR},
                 {"list replace ( [2, 4, 7, 8], null, 6)", null , 
FEELEvent.Severity.ERROR},
+                {"list replace ( [1], 1, 7)", 
Arrays.asList(BigDecimal.valueOf(7)), null},
+                {"list replace ( 1, 1, 7)", 
Arrays.asList(BigDecimal.valueOf(7)), null},
                 {"list replace ( [2, 4, 7, 8], 3, 6)", 
Arrays.asList(BigDecimal.valueOf(2), BigDecimal.valueOf(4), 
BigDecimal.valueOf(6), BigDecimal.valueOf(8)), null},
                 {"list replace ( [2, 4, 7, 8], -3, 6)", 
Arrays.asList(BigDecimal.valueOf(2), BigDecimal.valueOf(6), 
BigDecimal.valueOf(7), BigDecimal.valueOf(8)), null},
                 {"list replace ( [2, 4, 7, 8], function(item, newItem) item + 
newItem, 6)", null , FEELEvent.Severity.ERROR},
diff --git 
a/kie-dmn/kie-dmn-feel/src/test/java/org/kie/dmn/feel/runtime/KieFEELExtendedFunctionsTest.java
 
b/kie-dmn/kie-dmn-feel/src/test/java/org/kie/dmn/feel/runtime/KieFEELExtendedFunctionsTest.java
index 8e5b0ed40b..e3d508d165 100644
--- 
a/kie-dmn/kie-dmn-feel/src/test/java/org/kie/dmn/feel/runtime/KieFEELExtendedFunctionsTest.java
+++ 
b/kie-dmn/kie-dmn-feel/src/test/java/org/kie/dmn/feel/runtime/KieFEELExtendedFunctionsTest.java
@@ -50,10 +50,12 @@ public class KieFEELExtendedFunctionsTest extends 
BaseFEELTest {
                 { "string join([\"a\",\"b\",\"c\"], \"\")", "abc", null},
                 { "string join([\"a\",\"b\",\"c\"], null)", "abc", null},
                 { "string join([\"a\"], \"X\")", "a", null},
+                { "string join(\"a\", \"X\")", "a", null},
                 { "string join([\"a\",null,\"c\"], \"X\")", "aXc", null},
                 { "string join([], \"X\")", "", null},
                 { "string join([\"a\",\"b\",\"c\"])", "abc", null},
                 { "string join([\"a\",null,\"c\"])", "ac", null},
+                { "string join(\"a\")", "a", null},
                 { "string join([])", "", null},
                 { "string join([\"a\",123,\"c\"], null)", null, 
FEELEvent.Severity.ERROR},
                 { "string join(null, null)", null, FEELEvent.Severity.ERROR},
@@ -123,11 +125,16 @@ public class KieFEELExtendedFunctionsTest extends 
BaseFEELTest {
                 { "context put({name: \"John Doe\", address: { street: 
\"St.\", country:\"US\"}}, [\"address\", \"country\"], \"IT\")", 
mapOf(entry("name", "John Doe"),entry("address",mapOf(entry("street","St."), 
entry("country","IT")))), null },
                 { "context put({name: \"John Doe\", age: 0}, \"age\", 47)", 
mapOf(entry("name", "John Doe"),entry("age", new BigDecimal(47))), null },
                 { "context put({name: \"John Doe\", age: 0, z:999}, \"age\", 
47)", mapOf(entry("name", "John Doe"),entry("age", new 
BigDecimal(47)),entry("z", new BigDecimal(999))), null },
-                { "context merge([{name: \"John Doe\"}, {age: 47}])", 
mapOf(entry("name", "John Doe"),entry("age", new BigDecimal(47))), null },
+                { "context merge([{name: \"John Doe\"}, {age: 47}])", 
mapOf(entry("name", "John Doe") ,entry("age", new BigDecimal(47))), null },
+                { "context merge({name: \"John Doe\"})", mapOf(entry("name", 
"John Doe")), null },
                 { "context merge([{name: \"John Doe\", age: 0}, {age: 47}])", 
mapOf(entry("name", "John Doe"),entry("age", new BigDecimal(47))), null },
-                { "context([{key: \"name\", value: \"John 
Doe\"},{\"key\":\"age\", \"value\":47}])", mapOf(entry("name", "John 
Doe"),entry("age", new BigDecimal(47))), null },
-                { "context([{key: \"name\", value: \"John 
Doe\"},{\"key\":\"age\", \"value\":47, \"something\":\"else\"}])", 
mapOf(entry("name", "John Doe"),entry("age", new BigDecimal(47))), null },
-                { "context([{key: \"name\", value: \"John 
Doe\"},{\"key\":\"age\"}])", null, FEELEvent.Severity.ERROR },
+                { "context([{key: null, value: \"John Doe\"},{\"key\": 
\"age\", \"value\": 47}])", null, FEELEvent.Severity.ERROR },
+                { "context([{key: \"name\", value: \"John Doe\"},{\"value\": 
47}])", null, FEELEvent.Severity.ERROR },
+                { "context([{key: \"name\", value: \"John Doe\"},{\"key\": 
\"age\"}])", null, FEELEvent.Severity.ERROR },
+                { "context([{key: \"name\", value: \"John Doe\"},{\"key\": 
\"age\", \"value\": 47}])", mapOf(entry("name", "John Doe"), entry("age", new 
BigDecimal(47))), null },
+                { "context([{key: \"name\", value: \"John Doe\"},{\"key\": 
\"age\", \"value\": 47, \"something\": \"else\"}])", mapOf(entry("name", "John 
Doe"), entry("age", new BigDecimal(47))), null },
+                { "context([{key: \"name\", value: \"John Doe\"},{\"key\": 
\"age\", \"value\": 47, \"something\": \"else\"}])", mapOf(entry("name", "John 
Doe"), entry("age", new BigDecimal(47))), null },
+                { "context({key: \"name\", value: \"John Doe\"})", 
mapOf(entry("name", "John Doe")), null },
                 { "context([{key: \"name\", value: \"John Doe\"},{key: 
\"name\", value: \"Doe John\"}])", null, FEELEvent.Severity.ERROR },
                 { "time(10, 20, 30)", LocalTime.of(10, 20, 30), null },
                 { "date( 2020, 2, 31 )", null, FEELEvent.Severity.ERROR},
diff --git 
a/kie-dmn/kie-dmn-feel/src/test/java/org/kie/dmn/feel/runtime/functions/AllFunctionTest.java
 
b/kie-dmn/kie-dmn-feel/src/test/java/org/kie/dmn/feel/runtime/functions/AllFunctionTest.java
index b4d9eaa8d7..5438fc32d9 100644
--- 
a/kie-dmn/kie-dmn-feel/src/test/java/org/kie/dmn/feel/runtime/functions/AllFunctionTest.java
+++ 
b/kie-dmn/kie-dmn-feel/src/test/java/org/kie/dmn/feel/runtime/functions/AllFunctionTest.java
@@ -29,21 +29,6 @@ class AllFunctionTest {
 
     private static final AllFunction allFunction = AllFunction.INSTANCE;
 
-    @Test
-    void invokeBooleanParamNull() {
-        FunctionTestUtil.assertResultNull(allFunction.invoke((Boolean) null));
-    }
-
-    @Test
-    void invokeBooleanParamTrue() {
-        FunctionTestUtil.assertResult(allFunction.invoke(true), true);
-    }
-
-    @Test
-    void invokeBooleanParamFalse() {
-        FunctionTestUtil.assertResult(allFunction.invoke(false), false);
-    }
-
     @Test
     void invokeArrayParamNull() {
         FunctionTestUtil.assertResultError(allFunction.invoke((Object[]) 
null), InvalidParametersEvent.class);
diff --git 
a/kie-dmn/kie-dmn-feel/src/test/java/org/kie/dmn/feel/runtime/functions/AnyFunctionTest.java
 
b/kie-dmn/kie-dmn-feel/src/test/java/org/kie/dmn/feel/runtime/functions/AnyFunctionTest.java
index 45aa9d6061..3dfd400651 100644
--- 
a/kie-dmn/kie-dmn-feel/src/test/java/org/kie/dmn/feel/runtime/functions/AnyFunctionTest.java
+++ 
b/kie-dmn/kie-dmn-feel/src/test/java/org/kie/dmn/feel/runtime/functions/AnyFunctionTest.java
@@ -29,21 +29,6 @@ class AnyFunctionTest {
 
     private static final AnyFunction anyFunction = AnyFunction.INSTANCE;
 
-    @Test
-    void invokeBooleanParamNull() {
-        FunctionTestUtil.assertResultNull(anyFunction.invoke((Boolean) null));
-    }
-
-    @Test
-    void invokeBooleanParamTrue() {
-        FunctionTestUtil.assertResult(anyFunction.invoke(true), true);
-    }
-
-    @Test
-    void invokeBooleanParamFalse() {
-        FunctionTestUtil.assertResult(anyFunction.invoke(false), false);
-    }
-
     @Test
     void invokeArrayParamNull() {
         FunctionTestUtil.assertResultError(anyFunction.invoke((Object[]) 
null), InvalidParametersEvent.class);
diff --git 
a/kie-dmn/kie-dmn-feel/src/test/java/org/kie/dmn/feel/runtime/functions/MeanFunctionTest.java
 
b/kie-dmn/kie-dmn-feel/src/test/java/org/kie/dmn/feel/runtime/functions/MeanFunctionTest.java
index 598e037160..6513c445af 100644
--- 
a/kie-dmn/kie-dmn-feel/src/test/java/org/kie/dmn/feel/runtime/functions/MeanFunctionTest.java
+++ 
b/kie-dmn/kie-dmn-feel/src/test/java/org/kie/dmn/feel/runtime/functions/MeanFunctionTest.java
@@ -32,44 +32,29 @@ class MeanFunctionTest {
 
     @Test
     void invokeNumberNull() {
-        FunctionTestUtil.assertResultError(meanFunction.invoke((Number) null), 
InvalidParametersEvent.class);
+        
FunctionTestUtil.assertResultError(meanFunction.invoke(Arrays.asList(10, null, 
30)), InvalidParametersEvent.class);
     }
 
     @Test
     void invokeNumberBigDecimal() {
-        FunctionTestUtil.assertResult(meanFunction.invoke(BigDecimal.TEN), 
BigDecimal.TEN);
-    }
-
-    @Test
-    void invokeNumberInteger() {
-        FunctionTestUtil.assertResult(meanFunction.invoke(10), BigDecimal.TEN);
-    }
-
-    @Test
-    void invokeNumberDoubleWithoutDecimalPart() {
-        FunctionTestUtil.assertResult(meanFunction.invoke(10d), 
BigDecimal.valueOf(10));
-    }
-
-    @Test
-    void invokeNumberDoubleWithDecimalPart() {
-        FunctionTestUtil.assertResult(meanFunction.invoke(10.1d), 
BigDecimal.valueOf(10.1));
+        
FunctionTestUtil.assertResult(meanFunction.invoke(Arrays.asList(BigDecimal.TEN)),
 BigDecimal.TEN);
     }
 
     @Test
     void invokeNumberFloat() {
-        FunctionTestUtil.assertResult(meanFunction.invoke(10.1f), 
BigDecimal.valueOf(10.1));
+        
FunctionTestUtil.assertResult(meanFunction.invoke(Arrays.asList(10.1f)), 
BigDecimal.valueOf(10.1));
     }
 
     @Test
     void invokeUnconvertableNumber() {
-        
FunctionTestUtil.assertResultError(meanFunction.invoke(Double.POSITIVE_INFINITY),
 InvalidParametersEvent.class);
-        
FunctionTestUtil.assertResultError(meanFunction.invoke(Double.NEGATIVE_INFINITY),
 InvalidParametersEvent.class);
-        FunctionTestUtil.assertResultError(meanFunction.invoke(Double.NaN), 
InvalidParametersEvent.class);
+        
FunctionTestUtil.assertResultError(meanFunction.invoke(Arrays.asList(Double.POSITIVE_INFINITY)),
 InvalidParametersEvent.class);
+        
FunctionTestUtil.assertResultError(meanFunction.invoke(Arrays.asList(Double.NEGATIVE_INFINITY)),
 InvalidParametersEvent.class);
+        
FunctionTestUtil.assertResultError(meanFunction.invoke(Arrays.asList(Double.NaN)),
 InvalidParametersEvent.class);
     }
 
     @Test
     void invokeListNull() {
-        FunctionTestUtil.assertResultError(meanFunction.invoke((List) null), 
InvalidParametersEvent.class);
+        FunctionTestUtil.assertResultError(meanFunction.invoke((List<?>) 
null), InvalidParametersEvent.class);
     }
 
     @Test
diff --git 
a/kie-dmn/kie-dmn-feel/src/test/java/org/kie/dmn/feel/runtime/functions/StringJoinFunctionTest.java
 
b/kie-dmn/kie-dmn-feel/src/test/java/org/kie/dmn/feel/runtime/functions/StringJoinFunctionTest.java
new file mode 100644
index 0000000000..37243c8405
--- /dev/null
+++ 
b/kie-dmn/kie-dmn-feel/src/test/java/org/kie/dmn/feel/runtime/functions/StringJoinFunctionTest.java
@@ -0,0 +1,56 @@
+/**
+ * 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.
+ */
+
+package org.kie.dmn.feel.runtime.functions;
+
+import org.junit.jupiter.api.Test;
+import org.kie.dmn.feel.runtime.events.InvalidParametersEvent;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+class StringJoinFunctionTest {
+
+    private static final StringJoinFunction stringJoinFunction = 
StringJoinFunction.INSTANCE;
+
+    @Test
+    void setStringJoinFunctionNullValues() {
+        FunctionTestUtil.assertResultError(stringJoinFunction.invoke( null), 
InvalidParametersEvent.class);
+        FunctionTestUtil.assertResultError(stringJoinFunction.invoke((List<?>) 
null , null), InvalidParametersEvent.class);
+    }
+
+    @Test
+    void stringJoinFunctionEmptyList() {
+        
FunctionTestUtil.assertResult(stringJoinFunction.invoke(Collections.emptyList()),
 "");
+        
FunctionTestUtil.assertResult(stringJoinFunction.invoke(Collections.emptyList(),
 "X"), "");
+    }
+
+    @Test
+    void stringJoinFunction() {
+        
FunctionTestUtil.assertResult(stringJoinFunction.invoke(Arrays.asList("a", "b", 
"c"), "_and_"), "a_and_b_and_c");
+        
FunctionTestUtil.assertResult(stringJoinFunction.invoke(Arrays.asList("a", "b", 
"c"), ""), "abc");
+        
FunctionTestUtil.assertResult(stringJoinFunction.invoke(Arrays.asList("a", "b", 
"c"), null), "abc");
+        
FunctionTestUtil.assertResult(stringJoinFunction.invoke(Arrays.asList("a"), 
"X"), "a");
+        
FunctionTestUtil.assertResult(stringJoinFunction.invoke(Arrays.asList("a", 
null, "c"), "X"), "aXc");
+        
FunctionTestUtil.assertResult(stringJoinFunction.invoke(Arrays.asList("a", "b", 
"c")), "abc");
+        
FunctionTestUtil.assertResult(stringJoinFunction.invoke(Arrays.asList("a", 
null, "c")), "ac");
+    }
+
+}
diff --git 
a/kie-dmn/kie-dmn-feel/src/test/java/org/kie/dmn/feel/runtime/functions/SumFunctionTest.java
 
b/kie-dmn/kie-dmn-feel/src/test/java/org/kie/dmn/feel/runtime/functions/SumFunctionTest.java
index 50d15bf8e6..84895deb7f 100644
--- 
a/kie-dmn/kie-dmn-feel/src/test/java/org/kie/dmn/feel/runtime/functions/SumFunctionTest.java
+++ 
b/kie-dmn/kie-dmn-feel/src/test/java/org/kie/dmn/feel/runtime/functions/SumFunctionTest.java
@@ -29,27 +29,9 @@ class SumFunctionTest {
 
     private static final SumFunction sumFunction = SumFunction.INSTANCE;
 
-    @Test
-    void invokeNumberParamNull() {
-        FunctionTestUtil.assertResultError(sumFunction.invoke((Number) null), 
InvalidParametersEvent.class);
-    }
-
-    @Test
-    void invokeNumberParamUnsupportedNumber() {
-        FunctionTestUtil.assertResultError(sumFunction.invoke(Double.NaN), 
InvalidParametersEvent.class);
-    }
-
-    @Test
-    void invokeNumberParamSupportedNumber() {
-        FunctionTestUtil.assertResult(sumFunction.invoke(BigDecimal.TEN), 
BigDecimal.TEN);
-        FunctionTestUtil.assertResult(sumFunction.invoke(10), BigDecimal.TEN);
-        FunctionTestUtil.assertResult(sumFunction.invoke(-10), 
BigDecimal.valueOf(-10));
-        FunctionTestUtil.assertResult(sumFunction.invoke(10.12), 
BigDecimal.valueOf(10.12));
-    }
-
     @Test
     void invokeListParam() {
-        FunctionTestUtil.assertResultError(sumFunction.invoke((List) null), 
InvalidParametersEvent.class);
+        FunctionTestUtil.assertResultError(sumFunction.invoke((List<?>) null), 
InvalidParametersEvent.class);
     }
 
     @Test


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]


Reply via email to