diff options
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.java | 225 |
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 | */ | ||
6 | package tools.refinery.logic.rewriter; | ||
7 | |||
8 | import org.junit.jupiter.api.BeforeEach; | ||
9 | import org.junit.jupiter.api.Test; | ||
10 | import tools.refinery.logic.Constraint; | ||
11 | import tools.refinery.logic.dnf.Dnf; | ||
12 | import tools.refinery.logic.dnf.Query; | ||
13 | import tools.refinery.logic.term.ParameterDirection; | ||
14 | import tools.refinery.logic.term.Variable; | ||
15 | import tools.refinery.logic.tests.FakeKeyOnlyView; | ||
16 | |||
17 | import java.util.List; | ||
18 | |||
19 | import static org.hamcrest.MatcherAssert.assertThat; | ||
20 | import static org.hamcrest.Matchers.is; | ||
21 | import static tools.refinery.logic.literal.Literals.not; | ||
22 | import static tools.refinery.logic.tests.QueryMatchers.structurallyEqualTo; | ||
23 | |||
24 | class 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 | } | ||