aboutsummaryrefslogtreecommitdiffstats
path: root/subprojects/logic/src/test/java/tools/refinery/logic/dnf/TopologicalSortTest.java
diff options
context:
space:
mode:
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.java111
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 */
6package tools.refinery.logic.dnf;
7
8import org.junit.jupiter.api.Test;
9import tools.refinery.logic.Constraint;
10import tools.refinery.logic.InvalidQueryException;
11import tools.refinery.logic.term.NodeVariable;
12import tools.refinery.logic.term.ParameterDirection;
13import tools.refinery.logic.term.Variable;
14import tools.refinery.logic.tests.FakeKeyOnlyView;
15
16import java.util.List;
17
18import static org.hamcrest.MatcherAssert.assertThat;
19import static org.junit.jupiter.api.Assertions.assertThrows;
20import static tools.refinery.logic.literal.Literals.not;
21import static tools.refinery.logic.tests.QueryMatchers.structurallyEqualTo;
22
23class 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}