aboutsummaryrefslogtreecommitdiffstats
path: root/subprojects/logic/src/test/java/tools/refinery/logic/rewriter/InputParameterResolverTest.java
diff options
context:
space:
mode:
Diffstat (limited to 'subprojects/logic/src/test/java/tools/refinery/logic/rewriter/InputParameterResolverTest.java')
-rw-r--r--subprojects/logic/src/test/java/tools/refinery/logic/rewriter/InputParameterResolverTest.java225
1 files changed, 225 insertions, 0 deletions
diff --git a/subprojects/logic/src/test/java/tools/refinery/logic/rewriter/InputParameterResolverTest.java b/subprojects/logic/src/test/java/tools/refinery/logic/rewriter/InputParameterResolverTest.java
new file mode 100644
index 00000000..5e5fdb64
--- /dev/null
+++ b/subprojects/logic/src/test/java/tools/refinery/logic/rewriter/InputParameterResolverTest.java
@@ -0,0 +1,225 @@
1/*
2 * SPDX-FileCopyrightText: 2023 The Refinery Authors <https://refinery.tools/>
3 *
4 * SPDX-License-Identifier: EPL-2.0
5 */
6package tools.refinery.logic.rewriter;
7
8import org.junit.jupiter.api.BeforeEach;
9import org.junit.jupiter.api.Test;
10import tools.refinery.logic.Constraint;
11import tools.refinery.logic.dnf.Dnf;
12import tools.refinery.logic.dnf.Query;
13import tools.refinery.logic.term.ParameterDirection;
14import tools.refinery.logic.term.Variable;
15import tools.refinery.logic.tests.FakeKeyOnlyView;
16
17import java.util.List;
18
19import static org.hamcrest.MatcherAssert.assertThat;
20import static org.hamcrest.Matchers.is;
21import static tools.refinery.logic.literal.Literals.not;
22import static tools.refinery.logic.tests.QueryMatchers.structurallyEqualTo;
23
24class InputParameterResolverTest {
25 private final static Constraint personView = new FakeKeyOnlyView("Person", 1);
26 private final static Constraint friendView = new FakeKeyOnlyView("friend", 2);
27
28 private InputParameterResolver sut;
29
30 @BeforeEach
31 void beforeEach() {
32 sut = new InputParameterResolver();
33 }
34
35 @Test
36 void inlineSingleClauseTest() {
37 var dnf = Dnf.of("SubQuery", builder -> {
38 var x = builder.parameter("x", ParameterDirection.OUT);
39 builder.clause(friendView.call(x, Variable.of()));
40 });
41 var query = Query.of("Actual", (builder, x) -> builder.clause(
42 dnf.call(x),
43 personView.call(x)
44 ));
45
46 var actual = sut.rewrite(query);
47
48 var expected = Query.of("Expected", (builder, x) -> builder.clause(
49 friendView.call(x, Variable.of()),
50 personView.call(x)
51 ));
52
53 assertThat(actual.getDnf(), structurallyEqualTo(expected.getDnf()));
54 }
55
56 @Test
57 void inlineSingleClauseWIthInputTest() {
58 var dnf = Dnf.of("SubQuery", builder -> {
59 var x = builder.parameter("x", ParameterDirection.IN);
60 builder.clause(not(friendView.call(x, Variable.of())));
61 });
62 var query = Query.of("Actual", (builder, x) -> builder.clause(
63 dnf.call(x),
64 personView.call(x)
65 ));
66
67 var actual = sut.rewrite(query);
68
69 var expected = Query.of("Expected", (builder, x) -> builder.clause(
70 personView.call(x),
71 not(friendView.call(x, Variable.of()))
72 ));
73
74 assertThat(actual.getDnf(), structurallyEqualTo(expected.getDnf()));
75 }
76
77 @Test
78 void singleLiteralDemandSetTest() {
79 var dnf = Dnf.of("SubQuery", builder -> {
80 var x = builder.parameter("x", ParameterDirection.IN);
81 builder.clause(not(friendView.call(x, Variable.of())));
82 builder.clause(not(friendView.call(Variable.of(), x)));
83 });
84 var query = Query.of("Actual", (builder, x) -> builder.clause(
85 dnf.call(x),
86 personView.call(x)
87 ));
88
89 var actual = sut.rewrite(query);
90
91 var expectedSubQuery = Dnf.of("ExpectedSubQuery", builder -> {
92 var x = builder.parameter("x", ParameterDirection.OUT);
93 builder.clause(
94 personView.call(x),
95 not(friendView.call(x, Variable.of()))
96 );
97 builder.clause(
98 personView.call(x),
99 not(friendView.call(Variable.of(), x))
100 );
101 });
102 var expected = Query.of("Expected", (builder, x) -> builder.clause(
103 personView.call(x),
104 expectedSubQuery.call(x)
105 ));
106
107 assertThat(actual.getDnf(), structurallyEqualTo(expected.getDnf()));
108 }
109
110 @Test
111 void multipleLiteralDemandSetTest() {
112 var dnf = Dnf.of("SubQuery", builder -> {
113 var x = builder.parameter("x", ParameterDirection.IN);
114 var y = builder.parameter("y", ParameterDirection.IN);
115 builder.clause(not(friendView.call(x, y)));
116 builder.clause(not(friendView.call(y, x)));
117 });
118 var query = Query.of("Actual", (builder, p1) -> builder.clause(p2 -> List.of(
119 not(dnf.call(p1, p2)),
120 personView.call(p1),
121 personView.call(p2)
122 )));
123
124 var actual = sut.rewrite(query);
125
126 var context = Dnf.of("Context", builder -> {
127 var x = builder.parameter("x", ParameterDirection.OUT);
128 var y = builder.parameter("y", ParameterDirection.OUT);
129 builder.clause(
130 personView.call(x),
131 personView.call(y)
132 );
133 });
134 var expectedSubQuery = Dnf.of("ExpectedSubQuery", builder -> {
135 var x = builder.parameter("x", ParameterDirection.OUT);
136 var y = builder.parameter("x", ParameterDirection.OUT);
137 builder.clause(
138 context.call(x, y),
139 not(friendView.call(x, y))
140 );
141 builder.clause(
142 context.call(x, y),
143 not(friendView.call(y, x))
144 );
145 });
146 var expected = Query.of("Expected", (builder, p1) -> builder.clause(p2 -> List.of(
147 context.call(p1, p2),
148 not(expectedSubQuery.call(p1, p2))
149 )));
150
151 assertThat(actual.getDnf(), structurallyEqualTo(expected.getDnf()));
152 }
153
154 @Test
155 void multipleParameterDemandSetTest() {
156 var dnf = Dnf.of("SubQuery", builder -> {
157 var x = builder.parameter("x", ParameterDirection.IN);
158 var y = builder.parameter("y", ParameterDirection.IN);
159 builder.clause(not(friendView.call(x, y)));
160 builder.clause(not(friendView.call(y, x)));
161 });
162 var query = Query.of("Actual", (builder, p1) -> builder.clause(
163 not(dnf.call(p1, p1)),
164 personView.call(p1)
165 ));
166
167 var actual = sut.rewrite(query);
168
169 var expectedSubQuery = Dnf.of("ExpectedSubQuery", builder -> {
170 var x = builder.parameter("x", ParameterDirection.OUT);
171 var y = builder.parameter("y", ParameterDirection.OUT);
172 builder.clause(
173 y.isEquivalent(x),
174 personView.call(x),
175 not(friendView.call(x, x))
176 );
177 });
178 var expected = Query.of("Expected", (builder, p1) -> builder.clause(
179 personView.call(p1),
180 not(expectedSubQuery.call(p1, p1))
181 ));
182
183 assertThat(actual.getDnf(), structurallyEqualTo(expected.getDnf()));
184 }
185
186 @Test
187 void eliminateDoubleNegationTest() {
188 var dnf = Dnf.of("SubQuery", builder -> {
189 var x = builder.parameter("x", ParameterDirection.IN);
190 builder.clause(not(friendView.call(x, Variable.of())));
191 });
192 var query = Query.of("Actual", (builder, p1) -> builder.clause(
193 personView.call(p1),
194 not(dnf.call(p1))
195 ));
196
197 var actual = sut.rewrite(query);
198
199 var expected = Query.of("Actual", (builder, p1) -> builder.clause(
200 personView.call(p1),
201 friendView.call(p1, Variable.of())
202 ));
203
204 assertThat(actual.getDnf(), structurallyEqualTo(expected.getDnf()));
205 }
206
207 @Test
208 void identityWhenNoWorkToDoTest() {
209 var dnf = Dnf.of("SubQuery", builder -> {
210 var x = builder.parameter("x", ParameterDirection.OUT);
211 builder.clause(
212 personView.call(x),
213 not(friendView.call(x, Variable.of()))
214 );
215 });
216 var query = Query.of("Actual", (builder, p1) -> builder.clause(
217 personView.call(p1),
218 not(dnf.call(p1))
219 ));
220
221 var actual = sut.rewrite(query);
222
223 assertThat(actual, is(query));
224 }
225}