diff options
Diffstat (limited to 'subprojects/logic/src/test/java/tools/refinery/logic/dnf/TopologicalSortTest.java')
-rw-r--r-- | subprojects/logic/src/test/java/tools/refinery/logic/dnf/TopologicalSortTest.java | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/subprojects/logic/src/test/java/tools/refinery/logic/dnf/TopologicalSortTest.java b/subprojects/logic/src/test/java/tools/refinery/logic/dnf/TopologicalSortTest.java new file mode 100644 index 00000000..8ea27cc9 --- /dev/null +++ b/subprojects/logic/src/test/java/tools/refinery/logic/dnf/TopologicalSortTest.java | |||
@@ -0,0 +1,111 @@ | |||
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.dnf; | ||
7 | |||
8 | import org.junit.jupiter.api.Test; | ||
9 | import tools.refinery.logic.Constraint; | ||
10 | import tools.refinery.logic.InvalidQueryException; | ||
11 | import tools.refinery.logic.term.NodeVariable; | ||
12 | import tools.refinery.logic.term.ParameterDirection; | ||
13 | import tools.refinery.logic.term.Variable; | ||
14 | import tools.refinery.logic.tests.FakeKeyOnlyView; | ||
15 | |||
16 | import java.util.List; | ||
17 | |||
18 | import static org.hamcrest.MatcherAssert.assertThat; | ||
19 | import static org.junit.jupiter.api.Assertions.assertThrows; | ||
20 | import static tools.refinery.logic.literal.Literals.not; | ||
21 | import static tools.refinery.logic.tests.QueryMatchers.structurallyEqualTo; | ||
22 | |||
23 | class TopologicalSortTest { | ||
24 | private static final Constraint friendView = new FakeKeyOnlyView("friend", 2); | ||
25 | private static final Dnf example = Dnf.of("example", builder -> { | ||
26 | var a = builder.parameter("a", ParameterDirection.IN); | ||
27 | var b = builder.parameter("b", ParameterDirection.IN); | ||
28 | var c = builder.parameter("c", ParameterDirection.OUT); | ||
29 | var d = builder.parameter("d", ParameterDirection.OUT); | ||
30 | builder.clause( | ||
31 | friendView.call(a, b), | ||
32 | friendView.call(b, c), | ||
33 | friendView.call(c, d) | ||
34 | ); | ||
35 | }); | ||
36 | private static final NodeVariable p = Variable.of("p"); | ||
37 | private static final NodeVariable q = Variable.of("q"); | ||
38 | private static final NodeVariable r = Variable.of("r"); | ||
39 | private static final NodeVariable s = Variable.of("s"); | ||
40 | private static final NodeVariable t = Variable.of("t"); | ||
41 | |||
42 | @Test | ||
43 | void topologicalSortTest() { | ||
44 | var actual = Dnf.builder("Actual") | ||
45 | .parameter(p, ParameterDirection.IN) | ||
46 | .parameter(q, ParameterDirection.OUT) | ||
47 | .clause( | ||
48 | not(friendView.call(p, q)), | ||
49 | example.call(p, q, r, s), | ||
50 | example.call(r, t, q, s), | ||
51 | friendView.call(r, t) | ||
52 | ) | ||
53 | .build(); | ||
54 | |||
55 | assertThat(actual, structurallyEqualTo( | ||
56 | List.of( | ||
57 | new SymbolicParameter(p, ParameterDirection.IN), | ||
58 | new SymbolicParameter(q, ParameterDirection.OUT) | ||
59 | ), | ||
60 | List.of( | ||
61 | List.of( | ||
62 | friendView.call(r, t), | ||
63 | example.call(r, t, q, s), | ||
64 | not(friendView.call(p, q)), | ||
65 | example.call(p, q, r, s) | ||
66 | ) | ||
67 | ) | ||
68 | )); | ||
69 | } | ||
70 | |||
71 | @Test | ||
72 | void missingInputTest() { | ||
73 | var builder = Dnf.builder("Actual") | ||
74 | .parameter(p, ParameterDirection.OUT) | ||
75 | .parameter(q, ParameterDirection.OUT) | ||
76 | .clause( | ||
77 | not(friendView.call(p, q)), | ||
78 | example.call(p, q, r, s), | ||
79 | example.call(r, t, q, s), | ||
80 | friendView.call(r, t) | ||
81 | ); | ||
82 | assertThrows(InvalidQueryException.class, builder::build); | ||
83 | } | ||
84 | |||
85 | @Test | ||
86 | void missingVariableTest() { | ||
87 | var builder = Dnf.builder("Actual") | ||
88 | .parameter(p, ParameterDirection.IN) | ||
89 | .parameter(q, ParameterDirection.OUT) | ||
90 | .clause( | ||
91 | not(friendView.call(p, q)), | ||
92 | example.call(p, q, r, s), | ||
93 | example.call(r, t, q, s) | ||
94 | ); | ||
95 | assertThrows(InvalidQueryException.class, builder::build); | ||
96 | } | ||
97 | |||
98 | @Test | ||
99 | void circularDependencyTest() { | ||
100 | var builder = Dnf.builder("Actual") | ||
101 | .parameter(p, ParameterDirection.IN) | ||
102 | .parameter(q, ParameterDirection.OUT) | ||
103 | .clause( | ||
104 | not(friendView.call(p, q)), | ||
105 | example.call(p, q, r, s), | ||
106 | example.call(r, t, q, s), | ||
107 | example.call(p, q, r, t) | ||
108 | ); | ||
109 | assertThrows(InvalidQueryException.class, builder::build); | ||
110 | } | ||
111 | } | ||