diff options
Diffstat (limited to 'subprojects/language-semantics/src/test/java/tools/refinery/language/semantics/model/tests/DecisionTreeTests.java')
-rw-r--r-- | subprojects/language-semantics/src/test/java/tools/refinery/language/semantics/model/tests/DecisionTreeTests.java | 187 |
1 files changed, 187 insertions, 0 deletions
diff --git a/subprojects/language-semantics/src/test/java/tools/refinery/language/semantics/model/tests/DecisionTreeTests.java b/subprojects/language-semantics/src/test/java/tools/refinery/language/semantics/model/tests/DecisionTreeTests.java new file mode 100644 index 00000000..8fe866af --- /dev/null +++ b/subprojects/language-semantics/src/test/java/tools/refinery/language/semantics/model/tests/DecisionTreeTests.java | |||
@@ -0,0 +1,187 @@ | |||
1 | package tools.refinery.language.semantics.model.tests; | ||
2 | |||
3 | import org.junit.jupiter.api.Test; | ||
4 | import tools.refinery.language.semantics.model.internal.DecisionTree; | ||
5 | import tools.refinery.store.model.Tuple; | ||
6 | import tools.refinery.store.model.representation.TruthValue; | ||
7 | |||
8 | import java.util.LinkedHashMap; | ||
9 | import java.util.Map; | ||
10 | |||
11 | import static org.hamcrest.MatcherAssert.assertThat; | ||
12 | import static org.hamcrest.Matchers.*; | ||
13 | |||
14 | class DecisionTreeTests { | ||
15 | @Test | ||
16 | void initialValueTest() { | ||
17 | var sut = new DecisionTree(3, TruthValue.UNKNOWN); | ||
18 | assertThat(sut.get(Tuple.of(3, 4, 5)), is(TruthValue.UNKNOWN)); | ||
19 | } | ||
20 | |||
21 | @Test | ||
22 | void mergeValueTest() { | ||
23 | var sut = new DecisionTree(3, TruthValue.FALSE); | ||
24 | sut.mergeValue(Tuple.of(3, 4, 5), TruthValue.TRUE); | ||
25 | assertThat(sut.get(Tuple.of(3, 4, 5)), is(TruthValue.ERROR)); | ||
26 | assertThat(sut.get(Tuple.of(3, 4, 6)), is(TruthValue.FALSE)); | ||
27 | } | ||
28 | |||
29 | @Test | ||
30 | void mergeUnknownValueTest() { | ||
31 | var sut = new DecisionTree(3, TruthValue.FALSE); | ||
32 | sut.mergeValue(Tuple.of(3, 4, 5), TruthValue.UNKNOWN); | ||
33 | assertThat(sut.get(Tuple.of(3, 4, 5)), is(TruthValue.FALSE)); | ||
34 | } | ||
35 | |||
36 | @Test | ||
37 | void mergeWildcardTest() { | ||
38 | var sut = new DecisionTree(3, TruthValue.UNKNOWN); | ||
39 | sut.mergeValue(Tuple.of(3, -1, 5), TruthValue.TRUE); | ||
40 | sut.mergeValue(Tuple.of(-1, 4, 5), TruthValue.FALSE); | ||
41 | assertThat(sut.get(Tuple.of(2, 4, 5)), is(TruthValue.FALSE)); | ||
42 | assertThat(sut.get(Tuple.of(3, 4, 5)), is(TruthValue.ERROR)); | ||
43 | assertThat(sut.get(Tuple.of(3, 6, 5)), is(TruthValue.TRUE)); | ||
44 | assertThat(sut.get(Tuple.of(3, 4, 6)), is(TruthValue.UNKNOWN)); | ||
45 | } | ||
46 | |||
47 | @Test | ||
48 | void mergeWildcardTest2() { | ||
49 | var sut = new DecisionTree(3, TruthValue.UNKNOWN); | ||
50 | sut.mergeValue(Tuple.of(-1, 4, -1), TruthValue.FALSE); | ||
51 | sut.mergeValue(Tuple.of(3, -1, 5), TruthValue.TRUE); | ||
52 | assertThat(sut.get(Tuple.of(2, 4, 5)), is(TruthValue.FALSE)); | ||
53 | assertThat(sut.get(Tuple.of(3, 4, 5)), is(TruthValue.ERROR)); | ||
54 | assertThat(sut.get(Tuple.of(3, 6, 5)), is(TruthValue.TRUE)); | ||
55 | assertThat(sut.get(Tuple.of(3, 4, 6)), is(TruthValue.FALSE)); | ||
56 | assertThat(sut.get(Tuple.of(3, 5, 6)), is(TruthValue.UNKNOWN)); | ||
57 | } | ||
58 | |||
59 | @Test | ||
60 | void mergeWildcardTest3() { | ||
61 | var sut = new DecisionTree(3, TruthValue.UNKNOWN); | ||
62 | sut.mergeValue(Tuple.of(-1, 4, -1), TruthValue.FALSE); | ||
63 | sut.mergeValue(Tuple.of(3, -1, 5), TruthValue.TRUE); | ||
64 | sut.mergeValue(Tuple.of(-1, -1, -1), TruthValue.ERROR); | ||
65 | assertThat(sut.get(Tuple.of(2, 4, 5)), is(TruthValue.ERROR)); | ||
66 | assertThat(sut.get(Tuple.of(3, 4, 5)), is(TruthValue.ERROR)); | ||
67 | assertThat(sut.get(Tuple.of(3, 6, 5)), is(TruthValue.ERROR)); | ||
68 | assertThat(sut.get(Tuple.of(3, 4, 6)), is(TruthValue.ERROR)); | ||
69 | assertThat(sut.get(Tuple.of(3, 5, 6)), is(TruthValue.ERROR)); | ||
70 | } | ||
71 | |||
72 | @Test | ||
73 | void mergeOverUnsetTest() { | ||
74 | var sut = new DecisionTree(3, null); | ||
75 | sut.mergeValue(Tuple.of(-1, 4, 5), TruthValue.UNKNOWN); | ||
76 | sut.mergeValue(Tuple.of(3, -1, 5), TruthValue.FALSE); | ||
77 | assertThat(sut.get(Tuple.of(2, 4, 5)), is(TruthValue.UNKNOWN)); | ||
78 | assertThat(sut.get(Tuple.of(3, 4, 5)), is(TruthValue.FALSE)); | ||
79 | assertThat(sut.get(Tuple.of(3, 6, 5)), is(TruthValue.FALSE)); | ||
80 | assertThat(sut.get(Tuple.of(3, 4, 6)), is(nullValue())); | ||
81 | } | ||
82 | |||
83 | @Test | ||
84 | void emptyIterationTest() { | ||
85 | var sut = new DecisionTree(3, TruthValue.UNKNOWN); | ||
86 | var map = iterateAll(sut, TruthValue.UNKNOWN, 2); | ||
87 | assertThat(map.keySet(), hasSize(0)); | ||
88 | } | ||
89 | |||
90 | @Test | ||
91 | void completeIterationTest() { | ||
92 | var sut = new DecisionTree(3, TruthValue.UNKNOWN); | ||
93 | var map = iterateAll(sut, TruthValue.FALSE, 2); | ||
94 | assertThat(map.keySet(), hasSize(8)); | ||
95 | assertThat(map, hasEntry(Tuple.of(0, 0, 0), TruthValue.UNKNOWN)); | ||
96 | assertThat(map, hasEntry(Tuple.of(0, 0, 1), TruthValue.UNKNOWN)); | ||
97 | assertThat(map, hasEntry(Tuple.of(0, 1, 0), TruthValue.UNKNOWN)); | ||
98 | assertThat(map, hasEntry(Tuple.of(0, 1, 1), TruthValue.UNKNOWN)); | ||
99 | assertThat(map, hasEntry(Tuple.of(1, 0, 0), TruthValue.UNKNOWN)); | ||
100 | assertThat(map, hasEntry(Tuple.of(1, 0, 1), TruthValue.UNKNOWN)); | ||
101 | assertThat(map, hasEntry(Tuple.of(1, 1, 0), TruthValue.UNKNOWN)); | ||
102 | assertThat(map, hasEntry(Tuple.of(1, 1, 1), TruthValue.UNKNOWN)); | ||
103 | } | ||
104 | |||
105 | @Test | ||
106 | void mergedIterationTest() { | ||
107 | var sut = new DecisionTree(2, TruthValue.UNKNOWN); | ||
108 | sut.mergeValue(Tuple.of(1, -1), TruthValue.TRUE); | ||
109 | sut.mergeValue(Tuple.of(-1, 2), TruthValue.FALSE); | ||
110 | var map = iterateAll(sut, TruthValue.UNKNOWN, 3); | ||
111 | assertThat(map.keySet(), hasSize(5)); | ||
112 | assertThat(map, hasEntry(Tuple.of(0, 2), TruthValue.FALSE)); | ||
113 | assertThat(map, hasEntry(Tuple.of(1, 0), TruthValue.TRUE)); | ||
114 | assertThat(map, hasEntry(Tuple.of(1, 1), TruthValue.TRUE)); | ||
115 | assertThat(map, hasEntry(Tuple.of(1, 2), TruthValue.ERROR)); | ||
116 | assertThat(map, hasEntry(Tuple.of(2, 2), TruthValue.FALSE)); | ||
117 | } | ||
118 | |||
119 | @Test | ||
120 | void sparseIterationTest() { | ||
121 | var sut = new DecisionTree(2, null); | ||
122 | sut.mergeValue(Tuple.of(0, 0), TruthValue.TRUE); | ||
123 | sut.mergeValue(Tuple.of(1, 1), TruthValue.FALSE); | ||
124 | var map = iterateAll(sut, null, 10); | ||
125 | assertThat(map.keySet(), hasSize(2)); | ||
126 | assertThat(map, hasEntry(Tuple.of(0, 0), TruthValue.TRUE)); | ||
127 | assertThat(map, hasEntry(Tuple.of(1, 1), TruthValue.FALSE)); | ||
128 | } | ||
129 | |||
130 | @Test | ||
131 | void overwriteNothingTest() { | ||
132 | var sut = new DecisionTree(2, TruthValue.UNKNOWN); | ||
133 | var values = new DecisionTree(2, null); | ||
134 | sut.overwriteValues(values); | ||
135 | assertThat(sut.get(Tuple.of(0, 0)), is(TruthValue.UNKNOWN)); | ||
136 | } | ||
137 | |||
138 | @Test | ||
139 | void overwriteEverythingTest() { | ||
140 | var sut = new DecisionTree(2, TruthValue.FALSE); | ||
141 | sut.mergeValue(Tuple.of(0, 0), TruthValue.ERROR); | ||
142 | var values = new DecisionTree(2, TruthValue.TRUE); | ||
143 | sut.overwriteValues(values); | ||
144 | assertThat(sut.get(Tuple.of(0, 0)), is(TruthValue.TRUE)); | ||
145 | assertThat(sut.get(Tuple.of(0, 1)), is(TruthValue.TRUE)); | ||
146 | } | ||
147 | |||
148 | @Test | ||
149 | void overwriteWildcardTest() { | ||
150 | var sut = new DecisionTree(3, TruthValue.UNKNOWN); | ||
151 | sut.mergeValue(Tuple.of(1, 1, 1), TruthValue.FALSE); | ||
152 | sut.mergeValue(Tuple.of(-1, 4, 5), TruthValue.FALSE); | ||
153 | sut.mergeValue(Tuple.of(3, -1, 5), TruthValue.TRUE); | ||
154 | var values = new DecisionTree(3, null); | ||
155 | values.mergeValue(Tuple.of(2, 2, 2), TruthValue.TRUE); | ||
156 | values.mergeValue(Tuple.of(-1, 4, 5), TruthValue.UNKNOWN); | ||
157 | values.mergeValue(Tuple.of(3, -1, 5), TruthValue.FALSE); | ||
158 | sut.overwriteValues(values); | ||
159 | assertThat(sut.get(Tuple.of(1, 1, 1)), is(TruthValue.FALSE)); | ||
160 | assertThat(sut.get(Tuple.of(2, 2, 2)), is(TruthValue.TRUE)); | ||
161 | assertThat(sut.get(Tuple.of(2, 4, 5)), is(TruthValue.UNKNOWN)); | ||
162 | assertThat(sut.get(Tuple.of(3, 4, 5)), is(TruthValue.FALSE)); | ||
163 | assertThat(sut.get(Tuple.of(3, 6, 5)), is(TruthValue.FALSE)); | ||
164 | assertThat(sut.get(Tuple.of(3, 4, 6)), is(TruthValue.UNKNOWN)); | ||
165 | } | ||
166 | |||
167 | @Test | ||
168 | void removeIntermediateChildTest() { | ||
169 | var sut = new DecisionTree(3, TruthValue.TRUE); | ||
170 | var values = new DecisionTree(3, null); | ||
171 | values.mergeValue(Tuple.of(1, 1, 1), TruthValue.UNKNOWN); | ||
172 | sut.overwriteValues(values); | ||
173 | sut.mergeValue(Tuple.of(1, 1, 1), TruthValue.TRUE); | ||
174 | assertThat(sut.get(Tuple.of(1, 1, 1)), is(TruthValue.TRUE)); | ||
175 | } | ||
176 | |||
177 | private Map<Tuple, TruthValue> iterateAll(DecisionTree sut, TruthValue defaultValue, int nodeCount) { | ||
178 | var cursor = sut.getCursor(defaultValue, nodeCount); | ||
179 | var map = new LinkedHashMap<Tuple, TruthValue>(); | ||
180 | while (cursor.move()) { | ||
181 | map.put(cursor.getKey(), cursor.getValue()); | ||
182 | } | ||
183 | assertThat(cursor.isDirty(), is(false)); | ||
184 | assertThat(cursor.isTerminated(), is(true)); | ||
185 | return map; | ||
186 | } | ||
187 | } | ||