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 5c430aaaa3 [incubator-kie-issues#1100] Fix oas-generation. Add tests
(#5858)
5c430aaaa3 is described below
commit 5c430aaaa36f973d3573477962aee26943ed947a
Author: Gabriele Cardosi <[email protected]>
AuthorDate: Mon Apr 22 17:05:06 2024 +0200
[incubator-kie-issues#1100] Fix oas-generation. Add tests (#5858)
Co-authored-by: Gabriele-Cardosi <[email protected]>
---
.../org/kie/dmn/openapi/impl/DMNTypeSchemas.java | 13 +-
.../org/kie/dmn/openapi/impl/FEELSchemaEnum.java | 73 ++++++--
.../org/kie/dmn/openapi/FEELSchemaEnumTest.java | 60 ------
.../kie/dmn/openapi/impl/FEELSchemaEnumTest.java | 206 +++++++++++++++++++++
4 files changed, 269 insertions(+), 83 deletions(-)
diff --git
a/kie-dmn/kie-dmn-openapi/src/main/java/org/kie/dmn/openapi/impl/DMNTypeSchemas.java
b/kie-dmn/kie-dmn-openapi/src/main/java/org/kie/dmn/openapi/impl/DMNTypeSchemas.java
index 9470626605..92a04692a8 100644
---
a/kie-dmn/kie-dmn-openapi/src/main/java/org/kie/dmn/openapi/impl/DMNTypeSchemas.java
+++
b/kie-dmn/kie-dmn-openapi/src/main/java/org/kie/dmn/openapi/impl/DMNTypeSchemas.java
@@ -18,8 +18,10 @@
*/
package org.kie.dmn.openapi.impl;
+import java.time.LocalDate;
import java.util.ArrayList;
import java.util.Collections;
+import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -72,8 +74,7 @@ public class DMNTypeSchemas {
return FEELBuiltinTypeSchemas.from(t);
}
if (typesIndex.contains(t)) {
- Schema schema =
OASFactory.createObject(Schema.class).ref(namingPolicy.getRef(t));
- return schema;
+ return
OASFactory.createObject(Schema.class).ref(namingPolicy.getRef(t));
}
throw new UnsupportedOperationException();
}
@@ -131,7 +132,7 @@ public class DMNTypeSchemas {
parseSimpleType(DMNOASConstants.X_DMN_ALLOWED_VALUES, t, schema,
t.getAllowedValuesFEEL(), t.getAllowedValues());
}
if (t.getTypeConstraint() != null && !t.getTypeConstraint().isEmpty())
{
- parseSimpleType(DMNOASConstants.X_DMN_TYPE_CONSTRAINTS, t, schema,
t.getTypeConstraintFEEL(), t.getAllowedValues());
+ parseSimpleType(DMNOASConstants.X_DMN_TYPE_CONSTRAINTS, t, schema,
t.getTypeConstraintFEEL(), t.getTypeConstraint());
}
schema = nestAsItemIfCollection(schema, t);
schema.addExtension(X_DMN_TYPE, getDMNTypeSchemaXDMNTYPEdescr(t));
@@ -142,7 +143,9 @@ public class DMNTypeSchemas {
private void parseSimpleType(String schemaString, SimpleTypeImpl t, Schema
schema, List<UnaryTest> feelUnaryTests, List<DMNUnaryTest> dmnUnaryTests) {
schema.addExtension(schemaString,
feelUnaryTests.stream().map(UnaryTest::toString).collect(Collectors.joining(",
")));
if (DMNTypeUtils.getFEELBuiltInType(ancestor(t)) ==
BuiltInType.NUMBER) {
- FEELSchemaEnum.parseNumbersIntoSchema(schema, dmnUnaryTests);
+ FEELSchemaEnum.parseRangeableValuesIntoSchema(schema,
dmnUnaryTests, Number.class);
+ } else if (DMNTypeUtils.getFEELBuiltInType(ancestor(t)) ==
BuiltInType.DATE) {
+ FEELSchemaEnum.parseRangeableValuesIntoSchema(schema,
dmnUnaryTests, LocalDate.class);
} else {
FEELSchemaEnum.parseValuesIntoSchema(schema, dmnUnaryTests);
}
@@ -154,7 +157,7 @@ public class DMNTypeSchemas {
for (Entry<String, DMNType> fkv : ct.getFields().entrySet()) {
schema.addProperty(fkv.getKey(),
refOrBuiltinSchema(fkv.getValue()));
}
- if (isIOSetForInputScope(ct) && ct.getFields().size() > 0) {
+ if (isIOSetForInputScope(ct) && !ct.getFields().isEmpty()) {
schema.required(new ArrayList<>(ct.getFields().keySet()));
}
} else {
diff --git
a/kie-dmn/kie-dmn-openapi/src/main/java/org/kie/dmn/openapi/impl/FEELSchemaEnum.java
b/kie-dmn/kie-dmn-openapi/src/main/java/org/kie/dmn/openapi/impl/FEELSchemaEnum.java
index 30e2cb5813..ccdb377508 100644
---
a/kie-dmn/kie-dmn-openapi/src/main/java/org/kie/dmn/openapi/impl/FEELSchemaEnum.java
+++
b/kie-dmn/kie-dmn-openapi/src/main/java/org/kie/dmn/openapi/impl/FEELSchemaEnum.java
@@ -18,10 +18,6 @@
*/
package org.kie.dmn.openapi.impl;
-import java.math.BigDecimal;
-import java.util.List;
-import java.util.stream.Collectors;
-
import org.eclipse.microprofile.openapi.models.media.Schema;
import org.kie.dmn.api.core.DMNUnaryTest;
import org.kie.dmn.feel.FEEL;
@@ -32,24 +28,35 @@ import org.kie.dmn.feel.runtime.impl.RangeImpl;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
public class FEELSchemaEnum {
private static final Logger LOG =
LoggerFactory.getLogger(FEELSchemaEnum.class);
- public static void parseValuesIntoSchema(Schema schema, List<DMNUnaryTest>
list) {
- List<Object> expectLiterals = evaluateUnaryTests(list);
+ public static void parseValuesIntoSchema(Schema schema, List<DMNUnaryTest>
unaryTests) {
+ List<Object> expectLiterals = evaluateUnaryTests(unaryTests);
+ try {
+ checkEvaluatedUnaryTestsForTypeConsistency(expectLiterals);
+ } catch (IllegalArgumentException e) {
+ LOG.warn("Unable to parse generic value into the JSON Schema for
enumeration");
+ return;
+ }
if (expectLiterals.contains(null)) {
schema.setNullable(true);
}
- boolean allLiterals = expectLiterals.stream().allMatch(o -> o == null
|| o instanceof String || o instanceof Number || o instanceof Boolean);
+ boolean allLiterals = !expectLiterals.isEmpty() &&
expectLiterals.stream().allMatch(o -> o == null || o instanceof String || o
instanceof Number || o instanceof Boolean);
if (allLiterals) {
schema.enumeration(expectLiterals);
} else {
LOG.warn("Unable to parse generic value into the JSON Schema for
enumeration");
}
}
-
- public static void parseNumbersIntoSchema(Schema schema,
List<DMNUnaryTest> list) {
+
+ public static void parseRangeableValuesIntoSchema(Schema schema,
List<DMNUnaryTest> list, Class<?> expectedType) {
List<Object> uts = evaluateUnaryTests(list); // we leverage the
property of the *base* FEEL grammar(non visited by ASTVisitor, only the
ParseTree->AST Visitor) that `>x` is a Range
boolean allowNull = uts.remove(null);
if (allowNull) {
@@ -67,13 +74,13 @@ public class FEELSchemaEnum {
schema.exclusiveMaximum(range.getHighBoundary() ==
RangeBoundary.OPEN);
}
}
- } else if (uts.stream().allMatch(o -> o instanceof Number)) {
+ } else if (uts.stream().allMatch(expectedType::isInstance)) {
if (allowNull) {
uts.add(null);
}
schema.enumeration(uts);
} else {
- LOG.warn("Unable to parse number value into the JSON Schema for
enumeration");
+ LOG.warn("Unable to parse {} value into the JSON Schema for
enumeration", expectedType);
}
}
@@ -99,13 +106,43 @@ public class FEELSchemaEnum {
return consistent ? result : null;
}
- private static List<Object> evaluateUnaryTests(List<DMNUnaryTest> list) {
- FEEL SimpleFEEL = FEEL.newInstance();
- List<Object> utEvaluated = list.stream().map(UnaryTestImpl.class::cast)
- .map(UnaryTestImpl::toString)
- .map(SimpleFEEL::evaluate)
- .collect(Collectors.toList());
- return utEvaluated;
+ static List<Object> evaluateUnaryTests(List<DMNUnaryTest> list) {
+ FEEL feelInstance = FEEL.newInstance();
+ List<Object> toReturn = list.stream()
+ .map(UnaryTestImpl.class::cast)
+ .map(UnaryTestImpl::toString)
+ .filter(str -> !str.contains("?")) // We have to exclude
"TEST" expressions, because they can't be evaluated without a context and their
return is meaningless
+ .map(feelInstance::evaluate)
+ .collect(Collectors.toList());
+ checkEvaluatedUnaryTestsForNull(toReturn);
+ return toReturn;
+ }
+
+ /**
+ * Method used to verify if the given <code>List</code> contains at most
one <code>null</code>,
+ * since those should be put in the "enum" attribute
+ *
+ * @param toCheck
+ */
+ static void checkEvaluatedUnaryTestsForNull(List<Object> toCheck) {
+ if (toCheck.stream().filter(Objects::isNull).toList().size() > 1) {
+ throw new IllegalArgumentException("More then one object is null,
only one allowed at maximum");
+ }
+ }
+
+ /**
+ * Method used to verify if the given <code>List</code> contains the same
type of <code>Object</code>s,
+ * since those should be put in the "enum" attribute
+ *
+ * @param toCheck
+ */
+ static void checkEvaluatedUnaryTestsForTypeConsistency(List<Object>
toCheck) {
+ if (toCheck.stream().filter(Objects::nonNull)
+ .map(Object::getClass)
+ .collect(Collectors.toUnmodifiableSet())
+ .size() > 1) {
+ throw new IllegalArgumentException("Different types of objects,
only one allowed");
+ }
}
private FEELSchemaEnum() {
diff --git
a/kie-dmn/kie-dmn-openapi/src/test/java/org/kie/dmn/openapi/FEELSchemaEnumTest.java
b/kie-dmn/kie-dmn-openapi/src/test/java/org/kie/dmn/openapi/FEELSchemaEnumTest.java
deleted file mode 100644
index 6cfc24287b..0000000000
---
a/kie-dmn/kie-dmn-openapi/src/test/java/org/kie/dmn/openapi/FEELSchemaEnumTest.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.kie.dmn.openapi;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.junit.Test;
-import org.kie.dmn.feel.runtime.Range;
-import org.kie.dmn.feel.runtime.Range.RangeBoundary;
-import org.kie.dmn.feel.runtime.impl.RangeImpl;
-import org.kie.dmn.openapi.impl.FEELSchemaEnum;
-
-import static org.assertj.core.api.Assertions.assertThat;
-
-public class FEELSchemaEnumTest extends BaseDMNOASTest {
-
- @Test
- public void testBasic() {
- List<Range> list = new ArrayList<>();
- list.add(new RangeImpl(RangeBoundary.CLOSED, 0, null,
RangeBoundary.CLOSED));
- list.add(new RangeImpl(RangeBoundary.CLOSED, null, 100,
RangeBoundary.CLOSED));
- Range result = FEELSchemaEnum.consolidateRanges(list);
- assertThat(result).isNotNull().isEqualTo(new
RangeImpl(RangeBoundary.CLOSED, 0, 100, RangeBoundary.CLOSED));
- }
-
- @Test
- public void testInvalidRepeatedLB() {
- List<Range> list = new ArrayList<>();
- list.add(new RangeImpl(RangeBoundary.CLOSED, 0, null,
RangeBoundary.CLOSED));
- list.add(new RangeImpl(RangeBoundary.CLOSED, 0, 100,
RangeBoundary.CLOSED));
- Range result = FEELSchemaEnum.consolidateRanges(list);
- assertThat(result).isNull();
- }
-
- @Test
- public void testInvalidRepeatedUB() {
- List<Range> list = new ArrayList<>();
- list.add(new RangeImpl(RangeBoundary.CLOSED, null, 50,
RangeBoundary.CLOSED));
- list.add(new RangeImpl(RangeBoundary.CLOSED, null, 100,
RangeBoundary.CLOSED));
- Range result = FEELSchemaEnum.consolidateRanges(list);
- assertThat(result).isNull();
- }
-}
diff --git
a/kie-dmn/kie-dmn-openapi/src/test/java/org/kie/dmn/openapi/impl/FEELSchemaEnumTest.java
b/kie-dmn/kie-dmn-openapi/src/test/java/org/kie/dmn/openapi/impl/FEELSchemaEnumTest.java
new file mode 100644
index 0000000000..70704d4452
--- /dev/null
+++
b/kie-dmn/kie-dmn-openapi/src/test/java/org/kie/dmn/openapi/impl/FEELSchemaEnumTest.java
@@ -0,0 +1,206 @@
+package org.kie.dmn.openapi.impl;
+
+
+import org.eclipse.microprofile.openapi.OASFactory;
+import org.eclipse.microprofile.openapi.models.media.Schema;
+import org.junit.Test;
+import org.kie.dmn.api.core.DMNUnaryTest;
+import org.kie.dmn.feel.FEEL;
+import org.kie.dmn.feel.runtime.Range;
+import org.kie.dmn.feel.runtime.impl.RangeImpl;
+
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+import static
org.kie.dmn.openapi.impl.FEELSchemaEnum.checkEvaluatedUnaryTestsForNull;
+import static
org.kie.dmn.openapi.impl.FEELSchemaEnum.checkEvaluatedUnaryTestsForTypeConsistency;
+import static org.kie.dmn.openapi.impl.FEELSchemaEnum.evaluateUnaryTests;
+import static
org.kie.dmn.openapi.impl.FEELSchemaEnum.parseRangeableValuesIntoSchema;
+import static org.kie.dmn.openapi.impl.FEELSchemaEnum.parseValuesIntoSchema;
+
+public class FEELSchemaEnumTest {
+
+ private static final FEEL feel = FEEL.newInstance();
+
+ @Test
+ public void testParseValuesIntoSchemaWithoutNull() {
+ Schema toPopulate = OASFactory.createObject(Schema.class);
+ List<String> expectedStrings = Arrays.asList("ONE", "TWO");
+ List<Object> toEnum = expectedStrings.stream().map(toMap ->
String.format("\"%s\"", toMap)).collect(Collectors.toUnmodifiableList());
+ String expression = String.join(",", toEnum.stream().map(toMap ->
String.format("%s", toMap.toString())).toList());
+ expression += ", count (?) > 1";
+ List<DMNUnaryTest> unaryTests =
feel.evaluateUnaryTests(expression).stream().map(DMNUnaryTest.class::cast).toList();
+ parseValuesIntoSchema(toPopulate, unaryTests);
+ assertNull(toPopulate.getNullable());
+ assertNotNull(toPopulate.getEnumeration());
+ assertEquals(expectedStrings.size(),
toPopulate.getEnumeration().size());
+ expectedStrings.forEach(expectedString ->
assertTrue(toPopulate.getEnumeration().contains(expectedString)));
+ }
+
+ @Test
+ public void testParseValuesIntoSchemaWithNull() {
+ Schema toPopulate = OASFactory.createObject(Schema.class);
+ List<String> expectedStrings = Arrays.asList(null, "ONE", "TWO");
+ List<Object> toEnum = expectedStrings.stream().map(toFormat ->
toFormat == null ? "null": String.format("\"%s\"",
toFormat)).collect(Collectors.toUnmodifiableList());
+ String expression = String.join(",", toEnum.stream().map(toMap ->
String.format("%s", toMap.toString())).toList());
+ List<DMNUnaryTest> unaryTests =
feel.evaluateUnaryTests(expression).stream().map(DMNUnaryTest.class::cast).toList();
+ parseValuesIntoSchema(toPopulate, unaryTests);
+ assertTrue(toPopulate.getNullable());
+ assertNotNull(toPopulate.getEnumeration());
+ assertEquals(expectedStrings.size(),
toPopulate.getEnumeration().size());
+
expectedStrings.stream().filter(Objects::nonNull).forEach(expectedString ->
assertTrue(toPopulate.getEnumeration().contains(expectedString)));
+ }
+
+ @Test
+ public void testParseRangeableValuesIntoSchemaNumberWithoutNull() {
+ Schema toPopulate = OASFactory.createObject(Schema.class);
+ List<Number> expectedNumbers = Arrays.asList(1, 2);
+ String expression = String.join(",",
expectedNumbers.stream().map(toMap -> String.format("%s", toMap)).toList());
+ List<DMNUnaryTest> unaryTests =
feel.evaluateUnaryTests(expression).stream().map(DMNUnaryTest.class::cast).toList();
+ parseRangeableValuesIntoSchema(toPopulate, unaryTests, Number.class);
+ assertNull(toPopulate.getNullable());
+ assertNotNull(toPopulate.getEnumeration());
+ assertEquals(expectedNumbers.size(),
toPopulate.getEnumeration().size());
+ List<Object> expected = Arrays.asList(BigDecimal.valueOf(1),
BigDecimal.valueOf(2));
+ expected.forEach(expectedNumber ->
assertTrue(toPopulate.getEnumeration().contains(expectedNumber)));
+ }
+
+ @Test
+ public void testParseRangeableValuesNumberIntoSchemaWithNull() {
+ Schema toPopulate = OASFactory.createObject(Schema.class);
+ List<Number> expectedNumbers = Arrays.asList(null, 1, 2);
+ String expression = String.join(",",
expectedNumbers.stream().map(toMap -> String.format("%s", toMap)).toList());
+ List<DMNUnaryTest> unaryTests =
feel.evaluateUnaryTests(expression).stream().map(DMNUnaryTest.class::cast).toList();
+ parseRangeableValuesIntoSchema(toPopulate, unaryTests, Number.class);
+ assertTrue(toPopulate.getNullable());
+ assertNotNull(toPopulate.getEnumeration());
+ assertEquals(expectedNumbers.size(),
toPopulate.getEnumeration().size());
+ List<Object> expected = Arrays.asList(null, BigDecimal.valueOf(1),
BigDecimal.valueOf(2));
+ expected.stream().forEach(expectedNumber ->
assertTrue(toPopulate.getEnumeration().contains(expectedNumber)));
+ }
+
+ @Test
+ public void testParseRangeableValuesIntoSchemaLocalDateWithoutNull() {
+ Schema toPopulate = OASFactory.createObject(Schema.class);
+ List<LocalDate> expectedDates = Arrays.asList(LocalDate.of(2022, 1,
1), LocalDate.of(2024, 1, 1));
+ List<String> formattedDates = expectedDates.stream()
+ .map(toFormat -> String.format("@\"%s-0%s-0%s\"",
toFormat.getYear(), toFormat.getMonthValue(), toFormat.getDayOfMonth()))
+ .toList();
+ String expression = String.join(",", formattedDates.stream().map(toMap
-> String.format("%s", toMap)).toList());
+ List<DMNUnaryTest> unaryTests =
feel.evaluateUnaryTests(expression).stream().map(DMNUnaryTest.class::cast).toList();
+ parseRangeableValuesIntoSchema(toPopulate, unaryTests,
LocalDate.class);
+ assertNull(toPopulate.getNullable());
+ assertNotNull(toPopulate.getEnumeration());
+ assertEquals(expectedDates.size(), toPopulate.getEnumeration().size());
+ expectedDates.forEach(expectedDate ->
assertTrue(toPopulate.getEnumeration().contains(expectedDate)));
+ }
+
+ @Test
+ public void testParseRangeableValuesDateIntoSchemaWithNull() {
+ Schema toPopulate = OASFactory.createObject(Schema.class);
+ List<LocalDate> expectedDates = Arrays.asList(null, LocalDate.of(2022,
1, 1), LocalDate.of(2024, 1, 1));
+ List<String> formattedDates = expectedDates.stream()
+ .map(toFormat -> toFormat == null ? "null" :
String.format("@\"%s-0%s-0%s\"", toFormat.getYear(), toFormat.getMonthValue(),
toFormat.getDayOfMonth()))
+ .toList();
+ String expression = String.join(",", formattedDates.stream().map(toMap
-> String.format("%s", toMap)).toList());
+ List<DMNUnaryTest> unaryTests =
feel.evaluateUnaryTests(expression).stream().map(DMNUnaryTest.class::cast).toList();
+ parseRangeableValuesIntoSchema(toPopulate, unaryTests,
LocalDate.class);
+ assertTrue(toPopulate.getNullable());
+ assertNotNull(toPopulate.getEnumeration());
+ assertEquals(expectedDates.size(), toPopulate.getEnumeration().size());
+ expectedDates.forEach(expectedDate ->
assertTrue(toPopulate.getEnumeration().contains(expectedDate)));
+ }
+
+ @Test
+ public void testConsolidateRangesSucceed() {
+ Range lowRange = new RangeImpl(Range.RangeBoundary.CLOSED, 0, null,
Range.RangeBoundary.CLOSED);
+ Range highRange = new RangeImpl(Range.RangeBoundary.CLOSED, null, 100,
Range.RangeBoundary.CLOSED);
+ List<Range> list = Arrays.asList(lowRange, highRange);
+ Range result = FEELSchemaEnum.consolidateRanges(list);
+ assertThat(result).isNotNull().isEqualTo(new
RangeImpl(lowRange.getLowBoundary(), lowRange.getLowEndPoint(),
highRange.getHighEndPoint(), highRange.getHighBoundary()));
+ //
+ lowRange = new RangeImpl(Range.RangeBoundary.CLOSED,
LocalDate.of(2022, 1, 1), null, Range.RangeBoundary.CLOSED);
+ highRange = new RangeImpl(Range.RangeBoundary.CLOSED, null,
LocalDate.of(2024, 1, 1), Range.RangeBoundary.CLOSED);
+ list = Arrays.asList(lowRange, highRange);
+ result = FEELSchemaEnum.consolidateRanges(list);
+ assertThat(result).isNotNull().isEqualTo(new
RangeImpl(lowRange.getLowBoundary(), lowRange.getLowEndPoint(),
highRange.getHighEndPoint(), highRange.getHighBoundary()));
+ }
+
+ @Test
+ public void testConsolidateRangesInvalidRepeatedLB() {
+ List<Range> list = new ArrayList<>();
+ list.add(new RangeImpl(Range.RangeBoundary.CLOSED, 0, null,
Range.RangeBoundary.CLOSED));
+ list.add(new RangeImpl(Range.RangeBoundary.CLOSED, 0, 100,
Range.RangeBoundary.CLOSED));
+ Range result = FEELSchemaEnum.consolidateRanges(list);
+ assertThat(result).isNull();
+ }
+
+ @Test
+ public void testConsolidateRangesInvalidRepeatedUB() {
+ List<Range> list = new ArrayList<>();
+ list.add(new RangeImpl(Range.RangeBoundary.CLOSED, null, 50,
Range.RangeBoundary.CLOSED));
+ list.add(new RangeImpl(Range.RangeBoundary.CLOSED, null, 100,
Range.RangeBoundary.CLOSED));
+ Range result = FEELSchemaEnum.consolidateRanges(list);
+ assertThat(result).isNull();
+ }
+
+ @Test
+ public void testEvaluateUnaryTestsSucceed() {
+ List<Object> toEnum = Arrays.asList("\"a string\"", 3,
"@\"2024-01-01\"");
+ String expression = String.join(",", toEnum.stream().map(toMap ->
String.format("%s", toMap.toString())).toList());
+ expression += ", count (?) > 1";
+ List<DMNUnaryTest> toCheck =
feel.evaluateUnaryTests(expression).stream().map(DMNUnaryTest.class::cast).toList();
+ assertEquals(toEnum.size() + 1, toCheck.size());
+ List<Object> retrieved = evaluateUnaryTests(toCheck);
+ List<Object> expected = Arrays.asList("a string",
BigDecimal.valueOf(3), LocalDate.of(2024, 1, 1));
+ assertEquals(expected.size(), retrieved.size());
+ expected.forEach(expectedEntry -> assertTrue("Failing asserts for " +
expectedEntry, retrieved.stream().anyMatch(ret -> Objects.equals(expectedEntry,
ret))));
+ }
+
+ @Test(expected = IllegalArgumentException.class)
+ public void testEvaluateUnaryTestsFails() {
+ List<Object> toEnum = Arrays.asList(null, null, "@\"2024-01-01\"");
+ String expression = String.join(",", toEnum.stream().map(toMap ->
String.format("%s", toMap)).toList());
+ List<DMNUnaryTest> toCheck =
feel.evaluateUnaryTests(expression).stream().map(DMNUnaryTest.class::cast).toList();
+ assertEquals(toEnum.size(), toCheck.size());
+ evaluateUnaryTests(toCheck);
+ }
+
+ @Test
+ public void testCheckEvaluatedUnaryTestsForNullSucceed() {
+ List<Object> toCheck = new ArrayList<>(Arrays.asList("1", "2", "3"));
+ checkEvaluatedUnaryTestsForNull(toCheck);
+ toCheck.add(null);
+ checkEvaluatedUnaryTestsForNull(toCheck);
+ }
+
+ @Test(expected = IllegalArgumentException.class)
+ public void testCheckEvaluatedUnaryTestsForNullFails() {
+ List<Object> toCheck = new ArrayList<>(Arrays.asList("1", "2", "3"));
+ toCheck.add(null);
+ toCheck.add(null);
+ checkEvaluatedUnaryTestsForNull(toCheck);
+ }
+
+ @Test
+ public void testCheckEvaluatedUnaryTestsForTypeConsistencySucceed() {
+ List<Object> toCheck = Arrays.asList("1", "2", "3");
+ checkEvaluatedUnaryTestsForTypeConsistency(toCheck);
+ }
+
+ @Test(expected = IllegalArgumentException.class)
+ public void testCheckEvaluatedUnaryTestsForTypeConsistencyFails() {
+ List<Object> toCheck = Arrays.asList("1", "2", 3);
+ checkEvaluatedUnaryTestsForTypeConsistency(toCheck);
+ }
+}
\ No newline at end of file
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]