diff options
author | 2022-11-27 21:11:39 +0100 | |
---|---|---|
committer | 2022-12-09 00:07:38 +0100 | |
commit | 3c1e93b7cb50d20abe08f1b95b8dc8d62ed4c38c (patch) | |
tree | 21f4c04e750614d9f60484a08ee5402452acaf01 /subprojects/store/src/test | |
parent | refactor: be more conservative w/preview features (diff) | |
download | refinery-3c1e93b7cb50d20abe08f1b95b8dc8d62ed4c38c.tar.gz refinery-3c1e93b7cb50d20abe08f1b95b8dc8d62ed4c38c.tar.zst refinery-3c1e93b7cb50d20abe08f1b95b8dc8d62ed4c38c.zip |
feat: add cardinality interval abstraction
Diffstat (limited to 'subprojects/store/src/test')
7 files changed, 324 insertions, 0 deletions
diff --git a/subprojects/store/src/test/java/tools/refinery/store/model/representation/cardinality/CardinalityIntervalTest.java b/subprojects/store/src/test/java/tools/refinery/store/model/representation/cardinality/CardinalityIntervalTest.java new file mode 100644 index 00000000..8a39b9b5 --- /dev/null +++ b/subprojects/store/src/test/java/tools/refinery/store/model/representation/cardinality/CardinalityIntervalTest.java | |||
@@ -0,0 +1,122 @@ | |||
1 | package tools.refinery.store.model.representation.cardinality; | ||
2 | |||
3 | import org.junit.jupiter.params.ParameterizedTest; | ||
4 | import org.junit.jupiter.params.provider.Arguments; | ||
5 | import org.junit.jupiter.params.provider.MethodSource; | ||
6 | |||
7 | import java.util.stream.Stream; | ||
8 | |||
9 | import static org.hamcrest.MatcherAssert.assertThat; | ||
10 | import static org.hamcrest.Matchers.equalTo; | ||
11 | import static tools.refinery.store.model.representation.cardinality.CardinalityIntervals.*; | ||
12 | |||
13 | class CardinalityIntervalTest { | ||
14 | @ParameterizedTest(name = "min({0}, {1}) == {2}") | ||
15 | @MethodSource | ||
16 | void minTest(CardinalityInterval a, CardinalityInterval b, CardinalityInterval expected) { | ||
17 | assertThat(a.min(b), equalTo(expected)); | ||
18 | } | ||
19 | |||
20 | static Stream<Arguments> minTest() { | ||
21 | return Stream.of( | ||
22 | Arguments.of(atMost(1), atMost(1), atMost(1)), | ||
23 | Arguments.of(atMost(1), between(2, 3), atMost(1)), | ||
24 | Arguments.of(atMost(1), atLeast(2), atMost(1)), | ||
25 | Arguments.of(atMost(1), ERROR, ERROR), | ||
26 | Arguments.of(atLeast(1), atLeast(2), atLeast(1)), | ||
27 | Arguments.of(atLeast(1), ERROR, ERROR), | ||
28 | Arguments.of(ERROR, atLeast(2), ERROR), | ||
29 | Arguments.of(ERROR, ERROR, ERROR) | ||
30 | ); | ||
31 | } | ||
32 | |||
33 | @ParameterizedTest(name = "max({0}, {1}) == {2}") | ||
34 | @MethodSource | ||
35 | void maxTest(CardinalityInterval a, CardinalityInterval b, CardinalityInterval expected) { | ||
36 | assertThat(a.max(b), equalTo(expected)); | ||
37 | } | ||
38 | |||
39 | static Stream<Arguments> maxTest() { | ||
40 | return Stream.of( | ||
41 | Arguments.of(atMost(1), atMost(1), atMost(1)), | ||
42 | Arguments.of(atMost(1), between(2, 3), between(2, 3)), | ||
43 | Arguments.of(atMost(1), atLeast(2), atLeast(2)), | ||
44 | Arguments.of(atMost(1), ERROR, ERROR), | ||
45 | Arguments.of(atLeast(1), atLeast(2), atLeast(2)), | ||
46 | Arguments.of(atLeast(1), ERROR, ERROR), | ||
47 | Arguments.of(ERROR, atLeast(2), ERROR), | ||
48 | Arguments.of(ERROR, ERROR, ERROR) | ||
49 | ); | ||
50 | } | ||
51 | |||
52 | @ParameterizedTest(name = "{0} + {1} == {2}") | ||
53 | @MethodSource | ||
54 | void addTest(CardinalityInterval a, CardinalityInterval b, CardinalityInterval expected) { | ||
55 | assertThat(a.add(b), equalTo(expected)); | ||
56 | } | ||
57 | |||
58 | static Stream<Arguments> addTest() { | ||
59 | return Stream.of( | ||
60 | Arguments.of(atMost(1), atMost(1), atMost(2)), | ||
61 | Arguments.of(atMost(1), between(2, 3), between(2, 4)), | ||
62 | Arguments.of(atMost(1), atLeast(2), atLeast(2)), | ||
63 | Arguments.of(atMost(1), ERROR, ERROR), | ||
64 | Arguments.of(atLeast(1), atLeast(2), atLeast(3)), | ||
65 | Arguments.of(atLeast(1), ERROR, ERROR), | ||
66 | Arguments.of(ERROR, atLeast(2), ERROR), | ||
67 | Arguments.of(ERROR, ERROR, ERROR) | ||
68 | ); | ||
69 | } | ||
70 | |||
71 | @ParameterizedTest(name = "{0} * {1} == {2}") | ||
72 | @MethodSource | ||
73 | void multiplyTest(CardinalityInterval a, CardinalityInterval b, CardinalityInterval expected) { | ||
74 | assertThat(a.multiply(b), equalTo(expected)); | ||
75 | } | ||
76 | |||
77 | static Stream<Arguments> multiplyTest() { | ||
78 | return Stream.of( | ||
79 | Arguments.of(between(2, 3), between(4, 5), between(8, 15)), | ||
80 | Arguments.of(atLeast(2), between(4, 5), atLeast(8)), | ||
81 | Arguments.of(between(2, 3), atLeast(4), atLeast(8)), | ||
82 | Arguments.of(between(2, 3), ERROR, ERROR), | ||
83 | Arguments.of(ERROR, between(4, 5), ERROR), | ||
84 | Arguments.of(ERROR, ERROR, ERROR) | ||
85 | ); | ||
86 | } | ||
87 | |||
88 | @ParameterizedTest(name = "{0} /\\ {1} == {2}") | ||
89 | @MethodSource | ||
90 | void meetTest(CardinalityInterval a, CardinalityInterval b, CardinalityInterval expected) { | ||
91 | assertThat(a.meet(b), equalTo(expected)); | ||
92 | } | ||
93 | |||
94 | static Stream<Arguments> meetTest() { | ||
95 | return Stream.of( | ||
96 | Arguments.of(atMost(1), atMost(2), atMost(1)), | ||
97 | Arguments.of(atMost(2), between(1, 3), between(1, 2)), | ||
98 | Arguments.of(atMost(1), between(1, 3), exactly(1)), | ||
99 | Arguments.of(atMost(1), between(2, 3), ERROR), | ||
100 | Arguments.of(atMost(1), ERROR, ERROR), | ||
101 | Arguments.of(ERROR, atMost(1), ERROR), | ||
102 | Arguments.of(ERROR, ERROR, ERROR) | ||
103 | ); | ||
104 | } | ||
105 | |||
106 | @ParameterizedTest(name = "{0} \\/ {1} == {2}") | ||
107 | @MethodSource | ||
108 | void joinTest(CardinalityInterval a, CardinalityInterval b, CardinalityInterval expected) { | ||
109 | assertThat(a.join(b), equalTo(expected)); | ||
110 | } | ||
111 | |||
112 | static Stream<Arguments> joinTest() { | ||
113 | return Stream.of( | ||
114 | Arguments.of(atMost(1), atMost(2), atMost(2)), | ||
115 | Arguments.of(atMost(2), between(1, 3), atMost(3)), | ||
116 | Arguments.of(atMost(1), between(2, 3), atMost(3)), | ||
117 | Arguments.of(atMost(1), ERROR, atMost(1)), | ||
118 | Arguments.of(ERROR, atMost(1), atMost(1)), | ||
119 | Arguments.of(ERROR, ERROR, ERROR) | ||
120 | ); | ||
121 | } | ||
122 | } | ||
diff --git a/subprojects/store/src/test/java/tools/refinery/store/model/representation/cardinality/CardinalityIntervalsTest.java b/subprojects/store/src/test/java/tools/refinery/store/model/representation/cardinality/CardinalityIntervalsTest.java new file mode 100644 index 00000000..ef68a607 --- /dev/null +++ b/subprojects/store/src/test/java/tools/refinery/store/model/representation/cardinality/CardinalityIntervalsTest.java | |||
@@ -0,0 +1,21 @@ | |||
1 | package tools.refinery.store.model.representation.cardinality; | ||
2 | |||
3 | import org.junit.jupiter.api.Test; | ||
4 | |||
5 | import static org.hamcrest.MatcherAssert.assertThat; | ||
6 | import static org.hamcrest.Matchers.*; | ||
7 | |||
8 | class CardinalityIntervalsTest { | ||
9 | @Test | ||
10 | void betweenEmptyTest() { | ||
11 | var interval = CardinalityIntervals.between(2, 1); | ||
12 | assertThat(interval.isEmpty(), equalTo(true)); | ||
13 | } | ||
14 | |||
15 | @Test | ||
16 | void betweenNegativeUpperBoundTest() { | ||
17 | var interval = CardinalityIntervals.between(0, -1); | ||
18 | assertThat(interval.upperBound(), equalTo(UpperCardinalities.UNBOUNDED)); | ||
19 | assertThat(interval.isEmpty(), equalTo(false)); | ||
20 | } | ||
21 | } | ||
diff --git a/subprojects/store/src/test/java/tools/refinery/store/model/representation/cardinality/EmptyCardinalityIntervalTest.java b/subprojects/store/src/test/java/tools/refinery/store/model/representation/cardinality/EmptyCardinalityIntervalTest.java new file mode 100644 index 00000000..41c884ec --- /dev/null +++ b/subprojects/store/src/test/java/tools/refinery/store/model/representation/cardinality/EmptyCardinalityIntervalTest.java | |||
@@ -0,0 +1,14 @@ | |||
1 | package tools.refinery.store.model.representation.cardinality; | ||
2 | |||
3 | import org.junit.jupiter.api.Test; | ||
4 | |||
5 | import static org.hamcrest.MatcherAssert.assertThat; | ||
6 | import static org.hamcrest.Matchers.lessThan; | ||
7 | |||
8 | class EmptyCardinalityIntervalTest { | ||
9 | @Test | ||
10 | void inconsistentBoundsTest() { | ||
11 | assertThat(CardinalityIntervals.ERROR.upperBound().compareToInt(CardinalityIntervals.ERROR.lowerBound()), | ||
12 | lessThan(0)); | ||
13 | } | ||
14 | } | ||
diff --git a/subprojects/store/src/test/java/tools/refinery/store/model/representation/cardinality/FiniteCardinalityIntervalTest.java b/subprojects/store/src/test/java/tools/refinery/store/model/representation/cardinality/FiniteCardinalityIntervalTest.java new file mode 100644 index 00000000..dfb37786 --- /dev/null +++ b/subprojects/store/src/test/java/tools/refinery/store/model/representation/cardinality/FiniteCardinalityIntervalTest.java | |||
@@ -0,0 +1,20 @@ | |||
1 | package tools.refinery.store.model.representation.cardinality; | ||
2 | |||
3 | import org.junit.jupiter.api.Test; | ||
4 | |||
5 | import static org.junit.jupiter.api.Assertions.assertThrows; | ||
6 | |||
7 | class FiniteCardinalityIntervalTest { | ||
8 | @Test | ||
9 | void invalidLowerBoundConstructorTest() { | ||
10 | assertThrows(IllegalArgumentException.class, () -> new NonEmptyCardinalityInterval(-1, | ||
11 | UpperCardinalities.UNBOUNDED)); | ||
12 | } | ||
13 | |||
14 | @Test | ||
15 | void invalidUpperBoundConstructorTest() { | ||
16 | var upperCardinality = UpperCardinality.of(1); | ||
17 | assertThrows(IllegalArgumentException.class, () -> new NonEmptyCardinalityInterval(2, | ||
18 | upperCardinality)); | ||
19 | } | ||
20 | } | ||
diff --git a/subprojects/store/src/test/java/tools/refinery/store/model/representation/cardinality/FiniteUpperCardinalityTest.java b/subprojects/store/src/test/java/tools/refinery/store/model/representation/cardinality/FiniteUpperCardinalityTest.java new file mode 100644 index 00000000..3f0f7a4a --- /dev/null +++ b/subprojects/store/src/test/java/tools/refinery/store/model/representation/cardinality/FiniteUpperCardinalityTest.java | |||
@@ -0,0 +1,12 @@ | |||
1 | package tools.refinery.store.model.representation.cardinality; | ||
2 | |||
3 | import org.junit.jupiter.api.Test; | ||
4 | |||
5 | import static org.junit.jupiter.api.Assertions.assertThrows; | ||
6 | |||
7 | class FiniteUpperCardinalityTest { | ||
8 | @Test | ||
9 | void invalidConstructorTest() { | ||
10 | assertThrows(IllegalArgumentException.class, () -> new FiniteUpperCardinality(-1)); | ||
11 | } | ||
12 | } | ||
diff --git a/subprojects/store/src/test/java/tools/refinery/store/model/representation/cardinality/UpperCardinalitiesTest.java b/subprojects/store/src/test/java/tools/refinery/store/model/representation/cardinality/UpperCardinalitiesTest.java new file mode 100644 index 00000000..13171ae5 --- /dev/null +++ b/subprojects/store/src/test/java/tools/refinery/store/model/representation/cardinality/UpperCardinalitiesTest.java | |||
@@ -0,0 +1,25 @@ | |||
1 | package tools.refinery.store.model.representation.cardinality; | ||
2 | |||
3 | import org.junit.jupiter.api.Test; | ||
4 | import org.junit.jupiter.params.ParameterizedTest; | ||
5 | import org.junit.jupiter.params.provider.ValueSource; | ||
6 | |||
7 | import static org.hamcrest.MatcherAssert.assertThat; | ||
8 | import static org.hamcrest.Matchers.equalTo; | ||
9 | import static org.hamcrest.Matchers.instanceOf; | ||
10 | |||
11 | class UpperCardinalitiesTest { | ||
12 | @ParameterizedTest | ||
13 | @ValueSource(ints = {0, 1, 255, 256, 1000, Integer.MAX_VALUE}) | ||
14 | void valueOfBoundedTest(int value) { | ||
15 | var upperCardinality = UpperCardinalities.valueOf(value); | ||
16 | assertThat(upperCardinality, instanceOf(FiniteUpperCardinality.class)); | ||
17 | assertThat(((FiniteUpperCardinality) upperCardinality).finiteUpperBound(), equalTo(value)); | ||
18 | } | ||
19 | |||
20 | @Test | ||
21 | void valueOfUnboundedTest() { | ||
22 | var upperCardinality = UpperCardinalities.valueOf(-1); | ||
23 | assertThat(upperCardinality, instanceOf(UnboundedUpperCardinality.class)); | ||
24 | } | ||
25 | } | ||
diff --git a/subprojects/store/src/test/java/tools/refinery/store/model/representation/cardinality/UpperCardinalityTest.java b/subprojects/store/src/test/java/tools/refinery/store/model/representation/cardinality/UpperCardinalityTest.java new file mode 100644 index 00000000..f5763c2d --- /dev/null +++ b/subprojects/store/src/test/java/tools/refinery/store/model/representation/cardinality/UpperCardinalityTest.java | |||
@@ -0,0 +1,110 @@ | |||
1 | package tools.refinery.store.model.representation.cardinality; | ||
2 | |||
3 | import org.junit.jupiter.params.ParameterizedTest; | ||
4 | import org.junit.jupiter.params.provider.Arguments; | ||
5 | import org.junit.jupiter.params.provider.MethodSource; | ||
6 | |||
7 | import java.util.stream.Stream; | ||
8 | |||
9 | import static org.hamcrest.MatcherAssert.assertThat; | ||
10 | import static org.hamcrest.Matchers.equalTo; | ||
11 | |||
12 | class UpperCardinalityTest { | ||
13 | @ParameterizedTest(name = "min({0}, {1}) == {2}") | ||
14 | @MethodSource | ||
15 | void minTest(UpperCardinality a, UpperCardinality b, UpperCardinality expected) { | ||
16 | assertThat(a.min(b), equalTo(expected)); | ||
17 | } | ||
18 | |||
19 | static Stream<Arguments> minTest() { | ||
20 | return Stream.of( | ||
21 | Arguments.of(UpperCardinality.of(0), UpperCardinality.of(0), UpperCardinality.of(0)), | ||
22 | Arguments.of(UpperCardinality.of(0), UpperCardinality.of(1), UpperCardinality.of(0)), | ||
23 | Arguments.of(UpperCardinality.of(1), UpperCardinality.of(0), UpperCardinality.of(0)), | ||
24 | Arguments.of(UpperCardinality.of(0), UpperCardinalities.UNBOUNDED, UpperCardinality.of(0)), | ||
25 | Arguments.of(UpperCardinalities.UNBOUNDED, UpperCardinality.of(0), UpperCardinality.of(0)), | ||
26 | Arguments.of(UpperCardinalities.UNBOUNDED, UpperCardinalities.UNBOUNDED, UpperCardinalities.UNBOUNDED) | ||
27 | ); | ||
28 | } | ||
29 | |||
30 | @ParameterizedTest(name = "max({0}, {1}) == {2}") | ||
31 | @MethodSource | ||
32 | void maxTest(UpperCardinality a, UpperCardinality b, UpperCardinality expected) { | ||
33 | assertThat(a.max(b), equalTo(expected)); | ||
34 | } | ||
35 | |||
36 | static Stream<Arguments> maxTest() { | ||
37 | return Stream.of( | ||
38 | Arguments.of(UpperCardinality.of(0), UpperCardinality.of(0), UpperCardinality.of(0)), | ||
39 | Arguments.of(UpperCardinality.of(0), UpperCardinality.of(1), UpperCardinality.of(1)), | ||
40 | Arguments.of(UpperCardinality.of(1), UpperCardinality.of(0), UpperCardinality.of(1)), | ||
41 | Arguments.of(UpperCardinality.of(0), UpperCardinalities.UNBOUNDED, UpperCardinalities.UNBOUNDED), | ||
42 | Arguments.of(UpperCardinalities.UNBOUNDED, UpperCardinality.of(0), UpperCardinalities.UNBOUNDED), | ||
43 | Arguments.of(UpperCardinalities.UNBOUNDED, UpperCardinalities.UNBOUNDED, UpperCardinalities.UNBOUNDED) | ||
44 | ); | ||
45 | } | ||
46 | |||
47 | @ParameterizedTest(name = "{0} + {1} == {2}") | ||
48 | @MethodSource | ||
49 | void addTest(UpperCardinality a, UpperCardinality b, UpperCardinality expected) { | ||
50 | assertThat(a.add(b), equalTo(expected)); | ||
51 | } | ||
52 | |||
53 | static Stream<Arguments> addTest() { | ||
54 | return Stream.of( | ||
55 | Arguments.of(UpperCardinality.of(2), UpperCardinality.of(3), UpperCardinality.of(5)), | ||
56 | Arguments.of(UpperCardinality.of(2), UpperCardinalities.UNBOUNDED, UpperCardinalities.UNBOUNDED), | ||
57 | Arguments.of(UpperCardinalities.UNBOUNDED, UpperCardinality.of(2), UpperCardinalities.UNBOUNDED), | ||
58 | Arguments.of(UpperCardinalities.UNBOUNDED, UpperCardinalities.UNBOUNDED, UpperCardinalities.UNBOUNDED) | ||
59 | ); | ||
60 | } | ||
61 | |||
62 | @ParameterizedTest(name = "{0} * {1} == {2}") | ||
63 | @MethodSource | ||
64 | void multiplyTest(UpperCardinality a, UpperCardinality b, UpperCardinality expected) { | ||
65 | assertThat(a.multiply(b), equalTo(expected)); | ||
66 | } | ||
67 | |||
68 | static Stream<Arguments> multiplyTest() { | ||
69 | return Stream.of( | ||
70 | Arguments.of(UpperCardinality.of(2), UpperCardinality.of(3), UpperCardinality.of(6)), | ||
71 | Arguments.of(UpperCardinality.of(2), UpperCardinalities.UNBOUNDED, UpperCardinalities.UNBOUNDED), | ||
72 | Arguments.of(UpperCardinalities.UNBOUNDED, UpperCardinality.of(2), UpperCardinalities.UNBOUNDED), | ||
73 | Arguments.of(UpperCardinalities.UNBOUNDED, UpperCardinalities.UNBOUNDED, UpperCardinalities.UNBOUNDED) | ||
74 | ); | ||
75 | } | ||
76 | |||
77 | @ParameterizedTest(name = "{0}.compareTo({1}) == {2}") | ||
78 | @MethodSource | ||
79 | void compareToTest(UpperCardinality a, UpperCardinality b, int expected) { | ||
80 | assertThat(a.compareTo(b), equalTo(expected)); | ||
81 | } | ||
82 | |||
83 | static Stream<Arguments> compareToTest() { | ||
84 | return Stream.of( | ||
85 | Arguments.of(UpperCardinality.of(0), UpperCardinality.of(0), 0), | ||
86 | Arguments.of(UpperCardinality.of(0), UpperCardinality.of(1), -1), | ||
87 | Arguments.of(UpperCardinality.of(1), UpperCardinality.of(0), 1), | ||
88 | Arguments.of(UpperCardinality.of(0), UpperCardinalities.UNBOUNDED, -1), | ||
89 | Arguments.of(UpperCardinalities.UNBOUNDED, UpperCardinality.of(0), 1), | ||
90 | Arguments.of(UpperCardinalities.UNBOUNDED, UpperCardinalities.UNBOUNDED, 0) | ||
91 | ); | ||
92 | } | ||
93 | |||
94 | @ParameterizedTest(name = "{0}.compareToInt({1}) == {2}") | ||
95 | @MethodSource | ||
96 | void compareToIntTest(UpperCardinality a, int b, int expected) { | ||
97 | assertThat(a.compareToInt(b), equalTo(expected)); | ||
98 | } | ||
99 | |||
100 | static Stream<Arguments> compareToIntTest() { | ||
101 | return Stream.of( | ||
102 | Arguments.of(UpperCardinality.of(3), -1, 1), | ||
103 | Arguments.of(UpperCardinality.of(3), 2, 1), | ||
104 | Arguments.of(UpperCardinality.of(3), 3, 0), | ||
105 | Arguments.of(UpperCardinality.of(3), 4, -1), | ||
106 | Arguments.of(UpperCardinalities.UNBOUNDED, -1, 1), | ||
107 | Arguments.of(UpperCardinalities.UNBOUNDED, 3, 1) | ||
108 | ); | ||
109 | } | ||
110 | } | ||