diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/bicreater/BiCreaterStringBetween.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/bicreater/BiCreaterStringBetween.java index 3b6f10a5d2e84ad44110dada1df648f5dbb8c175..295615f5e00d0d2705940e33a8cbdf799dbb719c 100644 --- a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/bicreater/BiCreaterStringBetween.java +++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/bicreater/BiCreaterStringBetween.java @@ -1,7 +1,10 @@ package de.unikoblenz.fgbks.base.utils.boundary.bicreater; import de.unikoblenz.fgbks.base.utils.boundary.impl.StringBoundary; +import java.util.Arrays; +import java.util.HashSet; import java.util.Optional; +import java.util.Set; public class BiCreaterStringBetween extends AbstractBoundaryBiCreater<StringBoundary> { @@ -22,6 +25,43 @@ public class BiCreaterStringBetween extends AbstractBoundaryBiCreater<StringBoun @Override public Optional<StringBoundary> create(StringBoundary b1, StringBoundary b2) { - return Optional.empty(); + if (b1.matchesAny() || b2.matchesAny()) { + return Optional.empty(); + } + if (b1.matchesNoneOfValues() && b2.matchesNoneOfValues()) { + Set<String> vals1 = new HashSet<>(Arrays.asList(b1.getValues())); + Set<String> vals2 = new HashSet<>(Arrays.asList(b2.getValues())); + Set<String> values = new HashSet<>(); + for (String v1 : vals1) { + if (vals2.contains(v1)) { + values.add(v1); + } + } + if (values.size() == 0) { + return Optional.empty(); + } + return Optional.of(StringBoundary.getBuilder().addValues(values).build()); + } + if (b1.matchesNoneOfValues()) { + return getOneIsNoneOfValues(b1, b2); + } + if (b2.matchesNoneOfValues()) { + return getOneIsNoneOfValues(b2, b1); + } + return Optional.of( + StringBoundary.getBuilder() + .matchesNoneOfValues(true) + .addValues(b1.getValues()) + .addValues(b2.getValues()) + .build()); + } + + private Optional<StringBoundary> getOneIsNoneOfValues(StringBoundary b1, StringBoundary b2) { + Set<String> values = new HashSet<>(Arrays.asList(b1.getValues())); + values.removeAll(Arrays.asList(b2.getValues())); + if (values.size() == 0) { + return Optional.empty(); + } + return Optional.of(StringBoundary.getBuilder().addValues(values).build()); } } diff --git a/dmnverifierapi/src/test/java/de/unikoblenz/fgbks/base/utils/boundary/bicreater/BiCreaterStringBetweenTest.java b/dmnverifierapi/src/test/java/de/unikoblenz/fgbks/base/utils/boundary/bicreater/BiCreaterStringBetweenTest.java new file mode 100644 index 0000000000000000000000000000000000000000..8f706a23980eecf4875e2aa79d3a955c51e7d831 --- /dev/null +++ b/dmnverifierapi/src/test/java/de/unikoblenz/fgbks/base/utils/boundary/bicreater/BiCreaterStringBetweenTest.java @@ -0,0 +1,72 @@ +package de.unikoblenz.fgbks.base.utils.boundary.bicreater; + +import static de.unikoblenz.fgbks.base.utils.boundary.bicreater.BoundaryBiCreaterType.BETWEEN; +import static org.junit.jupiter.api.Assertions.assertArrayEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import de.unikoblenz.fgbks.base.utils.boundary.impl.StringBoundary; +import io.quarkus.test.junit.QuarkusTest; +import org.junit.jupiter.api.Test; + +@QuarkusTest +class BiCreaterStringBetweenTest { + + StringBoundary sb1; + StringBoundary sb2; + StringBoundary sbR; + + @Test + void testCreater() { + sb1 = StringBoundary.getBuilder().addValue("a").build(); + sb2 = StringBoundary.getBuilder().addValue("b").build(); + sbR = (StringBoundary) sb1.createBi(BETWEEN, sb2).get(); + assertArrayEquals(new String[]{"a", "b"}, sbR.getValues()); + assertTrue(sbR.matchesNoneOfValues()); + assertFalse(sbR.matchesAny()); + + sb1 = StringBoundary.getBuilder().addValue("a").matchesNoneOfValues(true).build(); + sb2 = StringBoundary.getBuilder().addValue("b").build(); + sbR = (StringBoundary) sb1.createBi(BETWEEN, sb2).get(); + assertArrayEquals(new String[]{"a"}, sbR.getValues()); + assertFalse(sbR.matchesNoneOfValues()); + assertFalse(sbR.matchesAny()); + + sb1 = StringBoundary.getBuilder().addValue("a").matchesNoneOfValues(true).build(); + sb2 = StringBoundary.getBuilder().addValue("a").build(); + assertFalse(sb1.createBi(BETWEEN, sb2).isPresent()); + assertFalse(sb2.createBi(BETWEEN, sb1).isPresent()); + + sb1 = StringBoundary.getBuilder().addValue("a").matchesNoneOfValues(true).build(); + sb2 = StringBoundary.getBuilder().addValue("b").matchesNoneOfValues(true).build(); + assertFalse(sb1.createBi(BETWEEN, sb2).isPresent()); + assertFalse(sb2.createBi(BETWEEN, sb1).isPresent()); + + sb1 = StringBoundary.getBuilder().addValue("a").matchesNoneOfValues(true).build(); + sb2 = StringBoundary.getBuilder().addValue("a").matchesNoneOfValues(true).build(); + sbR = (StringBoundary) sb1.createBi(BETWEEN, sb2).get(); + assertArrayEquals(new String[]{"a"}, sbR.getValues()); + assertFalse(sbR.matchesNoneOfValues()); + assertFalse(sbR.matchesAny()); + + sb1 = + StringBoundary.getBuilder() + .addValue("a") + .addValue("b") + .addValue("c") + .matchesNoneOfValues(true) + .build(); + sb2 = StringBoundary.getBuilder().addValue("a").matchesNoneOfValues(true).build(); + sbR = (StringBoundary) sb1.createBi(BETWEEN, sb2).get(); + assertArrayEquals(new String[]{"a"}, sbR.getValues()); + assertFalse(sbR.matchesNoneOfValues()); + assertFalse(sbR.matchesAny()); + + sb1 = StringBoundary.getBuilder().addValue("a").build(); + sb2 = StringBoundary.getBuilder().addValue("a").build(); + sbR = (StringBoundary) sb1.createBi(BETWEEN, sb2).get(); + assertArrayEquals(new String[]{"a"}, sbR.getValues()); + assertTrue(sbR.matchesNoneOfValues()); + assertFalse(sbR.matchesAny()); + } +}