diff options
Diffstat (limited to 'subprojects/store-query/src/test/java/tools/refinery/store/query/DnfBuilderTest.java')
-rw-r--r-- | subprojects/store-query/src/test/java/tools/refinery/store/query/DnfBuilderTest.java | 220 |
1 files changed, 220 insertions, 0 deletions
diff --git a/subprojects/store-query/src/test/java/tools/refinery/store/query/DnfBuilderTest.java b/subprojects/store-query/src/test/java/tools/refinery/store/query/DnfBuilderTest.java new file mode 100644 index 00000000..ceb46d6f --- /dev/null +++ b/subprojects/store-query/src/test/java/tools/refinery/store/query/DnfBuilderTest.java | |||
@@ -0,0 +1,220 @@ | |||
1 | package tools.refinery.store.query; | ||
2 | |||
3 | import org.junit.jupiter.api.Test; | ||
4 | import tools.refinery.store.query.dnf.Dnf; | ||
5 | import tools.refinery.store.query.literal.BooleanLiteral; | ||
6 | import tools.refinery.store.query.term.Variable; | ||
7 | import tools.refinery.store.query.view.KeyOnlyRelationView; | ||
8 | import tools.refinery.store.representation.Symbol; | ||
9 | |||
10 | import static org.hamcrest.MatcherAssert.assertThat; | ||
11 | import static tools.refinery.store.query.literal.Literals.not; | ||
12 | import static tools.refinery.store.query.tests.QueryMatchers.structurallyEqualTo; | ||
13 | |||
14 | class DnfBuilderTest { | ||
15 | @Test | ||
16 | void eliminateTrueTest() { | ||
17 | var p = Variable.of("p"); | ||
18 | var q = Variable.of("q"); | ||
19 | var friend = new Symbol<>("friend", 2, Boolean.class, false); | ||
20 | var friendView = new KeyOnlyRelationView<>(friend); | ||
21 | |||
22 | var actual = Dnf.builder() | ||
23 | .parameters(p, q) | ||
24 | .clause(BooleanLiteral.TRUE, friendView.call(p, q)) | ||
25 | .build(); | ||
26 | var expected = Dnf.builder().parameters(p, q).clause(friendView.call(p, q)).build(); | ||
27 | |||
28 | assertThat(actual, structurallyEqualTo(expected)); | ||
29 | } | ||
30 | |||
31 | @Test | ||
32 | void eliminateFalseTest() { | ||
33 | var p = Variable.of("p"); | ||
34 | var q = Variable.of("q"); | ||
35 | var friend = new Symbol<>("friend", 2, Boolean.class, false); | ||
36 | var friendView = new KeyOnlyRelationView<>(friend); | ||
37 | |||
38 | var actual = Dnf.builder() | ||
39 | .parameters(p, q) | ||
40 | .clause(friendView.call(p, q)) | ||
41 | .clause(friendView.call(q, p), BooleanLiteral.FALSE) | ||
42 | .build(); | ||
43 | var expected = Dnf.builder().parameters(p, q).clause(friendView.call(p, q)).build(); | ||
44 | |||
45 | assertThat(actual, structurallyEqualTo(expected)); | ||
46 | } | ||
47 | |||
48 | @Test | ||
49 | void alwaysTrueTest() { | ||
50 | var p = Variable.of("p"); | ||
51 | var q = Variable.of("q"); | ||
52 | var friend = new Symbol<>("friend", 2, Boolean.class, false); | ||
53 | var friendView = new KeyOnlyRelationView<>(friend); | ||
54 | |||
55 | var actual = Dnf.builder() | ||
56 | .parameters(p, q) | ||
57 | .clause(friendView.call(p, q)) | ||
58 | .clause(BooleanLiteral.TRUE) | ||
59 | .build(); | ||
60 | var expected = Dnf.builder().parameters(p, q).clause().build(); | ||
61 | |||
62 | assertThat(actual, structurallyEqualTo(expected)); | ||
63 | } | ||
64 | |||
65 | @Test | ||
66 | void alwaysFalseTest() { | ||
67 | var p = Variable.of("p"); | ||
68 | var q = Variable.of("q"); | ||
69 | var friend = new Symbol<>("friend", 2, Boolean.class, false); | ||
70 | var friendView = new KeyOnlyRelationView<>(friend); | ||
71 | |||
72 | var actual = Dnf.builder() | ||
73 | .parameters(p, q) | ||
74 | .clause(friendView.call(p, q), BooleanLiteral.FALSE) | ||
75 | .build(); | ||
76 | var expected = Dnf.builder().parameters(p, q).build(); | ||
77 | |||
78 | assertThat(actual, structurallyEqualTo(expected)); | ||
79 | } | ||
80 | |||
81 | @Test | ||
82 | void eliminateTrueDnfTest() { | ||
83 | var p = Variable.of("p"); | ||
84 | var q = Variable.of("q"); | ||
85 | var friend = new Symbol<>("friend", 2, Boolean.class, false); | ||
86 | var friendView = new KeyOnlyRelationView<>(friend); | ||
87 | var trueDnf = Dnf.builder().parameter(p).clause().build(); | ||
88 | |||
89 | var actual = Dnf.builder() | ||
90 | .parameters(p, q) | ||
91 | .clause(trueDnf.call(q), friendView.call(p, q)) | ||
92 | .build(); | ||
93 | var expected = Dnf.builder().parameters(p, q).clause(friendView.call(p, q)).build(); | ||
94 | |||
95 | assertThat(actual, structurallyEqualTo(expected)); | ||
96 | } | ||
97 | |||
98 | @Test | ||
99 | void eliminateFalseDnfTest() { | ||
100 | var p = Variable.of("p"); | ||
101 | var q = Variable.of("q"); | ||
102 | var friend = new Symbol<>("friend", 2, Boolean.class, false); | ||
103 | var friendView = new KeyOnlyRelationView<>(friend); | ||
104 | var falseDnf = Dnf.builder().parameter(p).build(); | ||
105 | |||
106 | var actual = Dnf.builder() | ||
107 | .parameters(p, q) | ||
108 | .clause(friendView.call(p, q)) | ||
109 | .clause(friendView.call(q, p), falseDnf.call(q)) | ||
110 | .build(); | ||
111 | var expected = Dnf.builder().parameters(p, q).clause(friendView.call(p, q)).build(); | ||
112 | |||
113 | assertThat(actual, structurallyEqualTo(expected)); | ||
114 | } | ||
115 | |||
116 | @Test | ||
117 | void alwaysTrueDnfTest() { | ||
118 | var p = Variable.of("p"); | ||
119 | var q = Variable.of("q"); | ||
120 | var friend = new Symbol<>("friend", 2, Boolean.class, false); | ||
121 | var friendView = new KeyOnlyRelationView<>(friend); | ||
122 | var trueDnf = Dnf.builder().parameter(p).clause().build(); | ||
123 | |||
124 | var actual = Dnf.builder() | ||
125 | .parameters(p, q) | ||
126 | .clause(friendView.call(p, q)) | ||
127 | .clause(trueDnf.call(q)) | ||
128 | .build(); | ||
129 | var expected = Dnf.builder().parameters(p, q).clause().build(); | ||
130 | |||
131 | assertThat(actual, structurallyEqualTo(expected)); | ||
132 | } | ||
133 | |||
134 | @Test | ||
135 | void alwaysFalseDnfTest() { | ||
136 | var p = Variable.of("p"); | ||
137 | var q = Variable.of("q"); | ||
138 | var friend = new Symbol<>("friend", 2, Boolean.class, false); | ||
139 | var friendView = new KeyOnlyRelationView<>(friend); | ||
140 | var falseDnf = Dnf.builder().parameter(p).build(); | ||
141 | |||
142 | var actual = Dnf.builder() | ||
143 | .parameters(p, q) | ||
144 | .clause(friendView.call(p, q), falseDnf.call(q)) | ||
145 | .build(); | ||
146 | var expected = Dnf.builder().parameters(p, q).build(); | ||
147 | |||
148 | assertThat(actual, structurallyEqualTo(expected)); | ||
149 | } | ||
150 | |||
151 | @Test | ||
152 | void eliminateNotFalseDnfTest() { | ||
153 | var p = Variable.of("p"); | ||
154 | var q = Variable.of("q"); | ||
155 | var friend = new Symbol<>("friend", 2, Boolean.class, false); | ||
156 | var friendView = new KeyOnlyRelationView<>(friend); | ||
157 | var falseDnf = Dnf.builder().parameter(p).build(); | ||
158 | |||
159 | var actual = Dnf.builder() | ||
160 | .parameters(p, q) | ||
161 | .clause(not(falseDnf.call(q)), friendView.call(p, q)) | ||
162 | .build(); | ||
163 | var expected = Dnf.builder().parameters(p, q).clause(friendView.call(p, q)).build(); | ||
164 | |||
165 | assertThat(actual, structurallyEqualTo(expected)); | ||
166 | } | ||
167 | |||
168 | @Test | ||
169 | void eliminateNotTrueDnfTest() { | ||
170 | var p = Variable.of("p"); | ||
171 | var q = Variable.of("q"); | ||
172 | var friend = new Symbol<>("friend", 2, Boolean.class, false); | ||
173 | var friendView = new KeyOnlyRelationView<>(friend); | ||
174 | var trueDnf = Dnf.builder().parameter(p).clause().build(); | ||
175 | |||
176 | var actual = Dnf.builder() | ||
177 | .parameters(p, q) | ||
178 | .clause(friendView.call(p, q)) | ||
179 | .clause(friendView.call(q, p), not(trueDnf.call(q))) | ||
180 | .build(); | ||
181 | var expected = Dnf.builder().parameters(p, q).clause(friendView.call(p, q)).build(); | ||
182 | |||
183 | assertThat(actual, structurallyEqualTo(expected)); | ||
184 | } | ||
185 | |||
186 | @Test | ||
187 | void alwaysNotFalseDnfTest() { | ||
188 | var p = Variable.of("p"); | ||
189 | var q = Variable.of("q"); | ||
190 | var friend = new Symbol<>("friend", 2, Boolean.class, false); | ||
191 | var friendView = new KeyOnlyRelationView<>(friend); | ||
192 | var falseDnf = Dnf.builder().parameter(p).build(); | ||
193 | |||
194 | var actual = Dnf.builder() | ||
195 | .parameters(p, q) | ||
196 | .clause(friendView.call(p, q)) | ||
197 | .clause(not(falseDnf.call(q))) | ||
198 | .build(); | ||
199 | var expected = Dnf.builder().parameters(p, q).clause().build(); | ||
200 | |||
201 | assertThat(actual, structurallyEqualTo(expected)); | ||
202 | } | ||
203 | |||
204 | @Test | ||
205 | void alwaysNotTrueDnfTest() { | ||
206 | var p = Variable.of("p"); | ||
207 | var q = Variable.of("q"); | ||
208 | var friend = new Symbol<>("friend", 2, Boolean.class, false); | ||
209 | var friendView = new KeyOnlyRelationView<>(friend); | ||
210 | var trueDnf = Dnf.builder().parameter(p).clause().build(); | ||
211 | |||
212 | var actual = Dnf.builder() | ||
213 | .parameters(p, q) | ||
214 | .clause(friendView.call(p, q), not(trueDnf.call(q))) | ||
215 | .build(); | ||
216 | var expected = Dnf.builder().parameters(p, q).build(); | ||
217 | |||
218 | assertThat(actual, structurallyEqualTo(expected)); | ||
219 | } | ||
220 | } | ||