diff options
Diffstat (limited to 'subprojects/store-query-viatra/src/test/java')
10 files changed, 585 insertions, 12 deletions
diff --git a/subprojects/store-query-viatra/src/test/java/tools/refinery/store/query/viatra/DiagonalQueryTest.java b/subprojects/store-query-viatra/src/test/java/tools/refinery/store/query/viatra/DiagonalQueryTest.java index 6aae2ebe..85bdc204 100644 --- a/subprojects/store-query-viatra/src/test/java/tools/refinery/store/query/viatra/DiagonalQueryTest.java +++ b/subprojects/store-query-viatra/src/test/java/tools/refinery/store/query/viatra/DiagonalQueryTest.java | |||
@@ -5,7 +5,7 @@ | |||
5 | */ | 5 | */ |
6 | package tools.refinery.store.query.viatra; | 6 | package tools.refinery.store.query.viatra; |
7 | 7 | ||
8 | import org.eclipse.viatra.query.runtime.matchers.backend.QueryEvaluationHint; | 8 | import tools.refinery.viatra.runtime.matchers.backend.QueryEvaluationHint; |
9 | import tools.refinery.store.model.ModelStore; | 9 | import tools.refinery.store.model.ModelStore; |
10 | import tools.refinery.store.query.ModelQueryAdapter; | 10 | import tools.refinery.store.query.ModelQueryAdapter; |
11 | import tools.refinery.store.query.dnf.Dnf; | 11 | import tools.refinery.store.query.dnf.Dnf; |
@@ -98,6 +98,7 @@ class DiagonalQueryTest { | |||
98 | .build(); | 98 | .build(); |
99 | 99 | ||
100 | var model = store.createEmptyModel(); | 100 | var model = store.createEmptyModel(); |
101 | |||
101 | var personInterpretation = model.getInterpretation(person); | 102 | var personInterpretation = model.getInterpretation(person); |
102 | var symbolInterpretation = model.getInterpretation(symbol); | 103 | var symbolInterpretation = model.getInterpretation(symbol); |
103 | var queryEngine = model.getAdapter(ModelQueryAdapter.class); | 104 | var queryEngine = model.getAdapter(ModelQueryAdapter.class); |
diff --git a/subprojects/store-query-viatra/src/test/java/tools/refinery/store/query/viatra/FunctionalQueryTest.java b/subprojects/store-query-viatra/src/test/java/tools/refinery/store/query/viatra/FunctionalQueryTest.java index 258127e7..7190d8f1 100644 --- a/subprojects/store-query-viatra/src/test/java/tools/refinery/store/query/viatra/FunctionalQueryTest.java +++ b/subprojects/store-query-viatra/src/test/java/tools/refinery/store/query/viatra/FunctionalQueryTest.java | |||
@@ -5,7 +5,7 @@ | |||
5 | */ | 5 | */ |
6 | package tools.refinery.store.query.viatra; | 6 | package tools.refinery.store.query.viatra; |
7 | 7 | ||
8 | import org.eclipse.viatra.query.runtime.matchers.backend.QueryEvaluationHint; | 8 | import tools.refinery.viatra.runtime.matchers.backend.QueryEvaluationHint; |
9 | import tools.refinery.store.map.Cursor; | 9 | import tools.refinery.store.map.Cursor; |
10 | import tools.refinery.store.model.ModelStore; | 10 | import tools.refinery.store.model.ModelStore; |
11 | import tools.refinery.store.query.ModelQueryAdapter; | 11 | import tools.refinery.store.query.ModelQueryAdapter; |
@@ -29,7 +29,7 @@ import static org.hamcrest.Matchers.is; | |||
29 | import static org.hamcrest.Matchers.nullValue; | 29 | import static org.hamcrest.Matchers.nullValue; |
30 | import static org.junit.jupiter.api.Assertions.assertAll; | 30 | import static org.junit.jupiter.api.Assertions.assertAll; |
31 | import static org.junit.jupiter.api.Assertions.assertThrows; | 31 | import static org.junit.jupiter.api.Assertions.assertThrows; |
32 | import static tools.refinery.store.query.literal.Literals.assume; | 32 | import static tools.refinery.store.query.literal.Literals.check; |
33 | import static tools.refinery.store.query.term.int_.IntTerms.*; | 33 | import static tools.refinery.store.query.term.int_.IntTerms.*; |
34 | import static tools.refinery.store.query.viatra.tests.QueryAssertions.assertNullableResults; | 34 | import static tools.refinery.store.query.viatra.tests.QueryAssertions.assertNullableResults; |
35 | import static tools.refinery.store.query.viatra.tests.QueryAssertions.assertResults; | 35 | import static tools.refinery.store.query.viatra.tests.QueryAssertions.assertResults; |
@@ -390,7 +390,7 @@ class FunctionalQueryTest { | |||
390 | var query = Query.of("InvalidAssume", (builder, p1) -> builder.clause(Integer.class, (x) -> List.of( | 390 | var query = Query.of("InvalidAssume", (builder, p1) -> builder.clause(Integer.class, (x) -> List.of( |
391 | personView.call(p1), | 391 | personView.call(p1), |
392 | ageView.call(p1, x), | 392 | ageView.call(p1, x), |
393 | assume(lessEq(div(constant(120), x), constant(5))) | 393 | check(lessEq(div(constant(120), x), constant(5))) |
394 | ))); | 394 | ))); |
395 | 395 | ||
396 | var store = ModelStore.builder() | 396 | var store = ModelStore.builder() |
@@ -424,6 +424,42 @@ class FunctionalQueryTest { | |||
424 | } | 424 | } |
425 | 425 | ||
426 | @QueryEngineTest | 426 | @QueryEngineTest |
427 | void multipleAssignmentTest(QueryEvaluationHint hint) { | ||
428 | var query = Query.of("MultipleAssignment", Integer.class, (builder, p1, p2, output) -> builder | ||
429 | .clause(Integer.class, Integer.class, (x1, x2) -> List.of( | ||
430 | ageView.call(p1, x1), | ||
431 | ageView.call(p2, x2), | ||
432 | output.assign(mul(x1, constant(2))), | ||
433 | output.assign(mul(x2, constant(3))) | ||
434 | ))); | ||
435 | |||
436 | var store = ModelStore.builder() | ||
437 | .symbols(age) | ||
438 | .with(ViatraModelQueryAdapter.builder() | ||
439 | .defaultHint(hint) | ||
440 | .queries(query)) | ||
441 | .build(); | ||
442 | |||
443 | var model = store.createEmptyModel(); | ||
444 | var ageInterpretation = model.getInterpretation(age); | ||
445 | var queryEngine = model.getAdapter(ModelQueryAdapter.class); | ||
446 | var queryResultSet = queryEngine.getResultSet(query); | ||
447 | |||
448 | ageInterpretation.put(Tuple.of(0), 3); | ||
449 | ageInterpretation.put(Tuple.of(1), 2); | ||
450 | ageInterpretation.put(Tuple.of(2), 15); | ||
451 | ageInterpretation.put(Tuple.of(3), 10); | ||
452 | |||
453 | queryEngine.flushChanges(); | ||
454 | assertNullableResults(Map.of( | ||
455 | Tuple.of(0, 1), Optional.of(6), | ||
456 | Tuple.of(1, 0), Optional.empty(), | ||
457 | Tuple.of(2, 3), Optional.of(30), | ||
458 | Tuple.of(3, 2), Optional.empty() | ||
459 | ), queryResultSet); | ||
460 | } | ||
461 | |||
462 | @QueryEngineTest | ||
427 | void notFunctionalTest(QueryEvaluationHint hint) { | 463 | void notFunctionalTest(QueryEvaluationHint hint) { |
428 | var query = Query.of("NotFunctional", Integer.class, (builder, p1, output) -> builder.clause((p2) -> List.of( | 464 | var query = Query.of("NotFunctional", Integer.class, (builder, p1, output) -> builder.clause((p2) -> List.of( |
429 | personView.call(p1), | 465 | personView.call(p1), |
diff --git a/subprojects/store-query-viatra/src/test/java/tools/refinery/store/query/viatra/QueryTest.java b/subprojects/store-query-viatra/src/test/java/tools/refinery/store/query/viatra/QueryTest.java index 25bcb0dc..ce403e3a 100644 --- a/subprojects/store-query-viatra/src/test/java/tools/refinery/store/query/viatra/QueryTest.java +++ b/subprojects/store-query-viatra/src/test/java/tools/refinery/store/query/viatra/QueryTest.java | |||
@@ -5,11 +5,13 @@ | |||
5 | */ | 5 | */ |
6 | package tools.refinery.store.query.viatra; | 6 | package tools.refinery.store.query.viatra; |
7 | 7 | ||
8 | import org.eclipse.viatra.query.runtime.matchers.backend.QueryEvaluationHint; | 8 | import tools.refinery.viatra.runtime.matchers.backend.QueryEvaluationHint; |
9 | import org.junit.jupiter.api.Test; | 9 | import org.junit.jupiter.api.Test; |
10 | import tools.refinery.store.model.ModelStore; | 10 | import tools.refinery.store.model.ModelStore; |
11 | import tools.refinery.store.query.ModelQueryAdapter; | 11 | import tools.refinery.store.query.ModelQueryAdapter; |
12 | import tools.refinery.store.query.dnf.Dnf; | ||
12 | import tools.refinery.store.query.dnf.Query; | 13 | import tools.refinery.store.query.dnf.Query; |
14 | import tools.refinery.store.query.term.ParameterDirection; | ||
13 | import tools.refinery.store.query.term.Variable; | 15 | import tools.refinery.store.query.term.Variable; |
14 | import tools.refinery.store.query.viatra.tests.QueryEngineTest; | 16 | import tools.refinery.store.query.viatra.tests.QueryEngineTest; |
15 | import tools.refinery.store.query.view.AnySymbolView; | 17 | import tools.refinery.store.query.view.AnySymbolView; |
@@ -23,7 +25,7 @@ import tools.refinery.store.tuple.Tuple; | |||
23 | import java.util.List; | 25 | import java.util.List; |
24 | import java.util.Map; | 26 | import java.util.Map; |
25 | 27 | ||
26 | import static tools.refinery.store.query.literal.Literals.assume; | 28 | import static tools.refinery.store.query.literal.Literals.check; |
27 | import static tools.refinery.store.query.literal.Literals.not; | 29 | import static tools.refinery.store.query.literal.Literals.not; |
28 | import static tools.refinery.store.query.term.int_.IntTerms.constant; | 30 | import static tools.refinery.store.query.term.int_.IntTerms.constant; |
29 | import static tools.refinery.store.query.term.int_.IntTerms.greaterEq; | 31 | import static tools.refinery.store.query.term.int_.IntTerms.greaterEq; |
@@ -108,6 +110,44 @@ class QueryTest { | |||
108 | } | 110 | } |
109 | 111 | ||
110 | @QueryEngineTest | 112 | @QueryEngineTest |
113 | void isConstantTest(QueryEvaluationHint hint) { | ||
114 | var predicate = Query.of("RelationConstraint", (builder, p1, p2) -> builder.clause( | ||
115 | personView.call(p1), | ||
116 | p1.isConstant(1), | ||
117 | friendMustView.call(p1, p2) | ||
118 | )); | ||
119 | |||
120 | var store = ModelStore.builder() | ||
121 | .symbols(person, friend) | ||
122 | .with(ViatraModelQueryAdapter.builder() | ||
123 | .defaultHint(hint) | ||
124 | .queries(predicate)) | ||
125 | .build(); | ||
126 | |||
127 | var model = store.createEmptyModel(); | ||
128 | var personInterpretation = model.getInterpretation(person); | ||
129 | var friendInterpretation = model.getInterpretation(friend); | ||
130 | var queryEngine = model.getAdapter(ModelQueryAdapter.class); | ||
131 | var predicateResultSet = queryEngine.getResultSet(predicate); | ||
132 | |||
133 | personInterpretation.put(Tuple.of(0), true); | ||
134 | personInterpretation.put(Tuple.of(1), true); | ||
135 | personInterpretation.put(Tuple.of(2), true); | ||
136 | |||
137 | friendInterpretation.put(Tuple.of(0, 1), TruthValue.TRUE); | ||
138 | friendInterpretation.put(Tuple.of(1, 0), TruthValue.TRUE); | ||
139 | friendInterpretation.put(Tuple.of(1, 2), TruthValue.TRUE); | ||
140 | |||
141 | queryEngine.flushChanges(); | ||
142 | assertResults(Map.of( | ||
143 | Tuple.of(0, 1), false, | ||
144 | Tuple.of(1, 0), true, | ||
145 | Tuple.of(1, 2), true, | ||
146 | Tuple.of(2, 1), false | ||
147 | ), predicateResultSet); | ||
148 | } | ||
149 | |||
150 | @QueryEngineTest | ||
111 | void existTest(QueryEvaluationHint hint) { | 151 | void existTest(QueryEvaluationHint hint) { |
112 | var predicate = Query.of("Exists", (builder, p1) -> builder.clause((p2) -> List.of( | 152 | var predicate = Query.of("Exists", (builder, p1) -> builder.clause((p2) -> List.of( |
113 | personView.call(p1), | 153 | personView.call(p1), |
@@ -312,6 +352,53 @@ class QueryTest { | |||
312 | } | 352 | } |
313 | 353 | ||
314 | @QueryEngineTest | 354 | @QueryEngineTest |
355 | void patternCallInputArgumentTest(QueryEvaluationHint hint) { | ||
356 | var friendPredicate = Dnf.of("Friend", builder -> { | ||
357 | var p1 = builder.parameter("p1", ParameterDirection.IN); | ||
358 | var p2 = builder.parameter("p2", ParameterDirection.IN); | ||
359 | builder.clause( | ||
360 | personView.call(p1), | ||
361 | personView.call(p2), | ||
362 | friendMustView.call(p1, p2) | ||
363 | ); | ||
364 | }); | ||
365 | var predicate = Query.of("PositivePatternCall", (builder, p3, p4) -> builder.clause( | ||
366 | personView.call(p3), | ||
367 | personView.call(p4), | ||
368 | friendPredicate.call(p3, p4) | ||
369 | )); | ||
370 | |||
371 | var store = ModelStore.builder() | ||
372 | .symbols(person, friend) | ||
373 | .with(ViatraModelQueryAdapter.builder() | ||
374 | .defaultHint(hint) | ||
375 | .queries(predicate)) | ||
376 | .build(); | ||
377 | |||
378 | var model = store.createEmptyModel(); | ||
379 | var personInterpretation = model.getInterpretation(person); | ||
380 | var friendInterpretation = model.getInterpretation(friend); | ||
381 | var queryEngine = model.getAdapter(ModelQueryAdapter.class); | ||
382 | var predicateResultSet = queryEngine.getResultSet(predicate); | ||
383 | |||
384 | personInterpretation.put(Tuple.of(0), true); | ||
385 | personInterpretation.put(Tuple.of(1), true); | ||
386 | personInterpretation.put(Tuple.of(2), true); | ||
387 | |||
388 | friendInterpretation.put(Tuple.of(0, 1), TruthValue.TRUE); | ||
389 | friendInterpretation.put(Tuple.of(1, 0), TruthValue.TRUE); | ||
390 | friendInterpretation.put(Tuple.of(1, 2), TruthValue.TRUE); | ||
391 | |||
392 | queryEngine.flushChanges(); | ||
393 | assertResults(Map.of( | ||
394 | Tuple.of(0, 1), true, | ||
395 | Tuple.of(1, 0), true, | ||
396 | Tuple.of(1, 2), true, | ||
397 | Tuple.of(2, 1), false | ||
398 | ), predicateResultSet); | ||
399 | } | ||
400 | |||
401 | @QueryEngineTest | ||
315 | void negativeRelationViewTest(QueryEvaluationHint hint) { | 402 | void negativeRelationViewTest(QueryEvaluationHint hint) { |
316 | var predicate = Query.of("NegativePatternCall", (builder, p1, p2) -> builder.clause( | 403 | var predicate = Query.of("NegativePatternCall", (builder, p1, p2) -> builder.clause( |
317 | personView.call(p1), | 404 | personView.call(p1), |
@@ -652,7 +739,7 @@ class QueryTest { | |||
652 | var query = Query.of("Constraint", (builder, p1) -> builder.clause(Integer.class, (x) -> List.of( | 739 | var query = Query.of("Constraint", (builder, p1) -> builder.clause(Integer.class, (x) -> List.of( |
653 | personView.call(p1), | 740 | personView.call(p1), |
654 | ageView.call(p1, x), | 741 | ageView.call(p1, x), |
655 | assume(greaterEq(x, constant(18))) | 742 | check(greaterEq(x, constant(18))) |
656 | ))); | 743 | ))); |
657 | 744 | ||
658 | var store = ModelStore.builder() | 745 | var store = ModelStore.builder() |
diff --git a/subprojects/store-query-viatra/src/test/java/tools/refinery/store/query/viatra/QueryTransactionTest.java b/subprojects/store-query-viatra/src/test/java/tools/refinery/store/query/viatra/QueryTransactionTest.java index 32f51cf0..3f8c060a 100644 --- a/subprojects/store-query-viatra/src/test/java/tools/refinery/store/query/viatra/QueryTransactionTest.java +++ b/subprojects/store-query-viatra/src/test/java/tools/refinery/store/query/viatra/QueryTransactionTest.java | |||
@@ -5,7 +5,7 @@ | |||
5 | */ | 5 | */ |
6 | package tools.refinery.store.query.viatra; | 6 | package tools.refinery.store.query.viatra; |
7 | 7 | ||
8 | import org.eclipse.viatra.query.runtime.matchers.backend.QueryEvaluationHint; | 8 | import tools.refinery.viatra.runtime.matchers.backend.QueryEvaluationHint; |
9 | import org.junit.jupiter.api.Test; | 9 | import org.junit.jupiter.api.Test; |
10 | import tools.refinery.store.model.ModelStore; | 10 | import tools.refinery.store.model.ModelStore; |
11 | import tools.refinery.store.query.ModelQueryAdapter; | 11 | import tools.refinery.store.query.ModelQueryAdapter; |
diff --git a/subprojects/store-query-viatra/src/test/java/tools/refinery/store/query/viatra/StronglyConnectedComponentsTest.java b/subprojects/store-query-viatra/src/test/java/tools/refinery/store/query/viatra/StronglyConnectedComponentsTest.java new file mode 100644 index 00000000..37795ff3 --- /dev/null +++ b/subprojects/store-query-viatra/src/test/java/tools/refinery/store/query/viatra/StronglyConnectedComponentsTest.java | |||
@@ -0,0 +1,261 @@ | |||
1 | /* | ||
2 | * SPDX-FileCopyrightText: 2023 The Refinery Authors <https://refinery.tools/> | ||
3 | * | ||
4 | * SPDX-License-Identifier: EPL-2.0 | ||
5 | */ | ||
6 | package tools.refinery.store.query.viatra; | ||
7 | |||
8 | import org.junit.jupiter.api.Test; | ||
9 | import tools.refinery.store.model.ModelStore; | ||
10 | import tools.refinery.store.query.ModelQueryAdapter; | ||
11 | import tools.refinery.store.query.dnf.Query; | ||
12 | import tools.refinery.store.query.literal.Connectivity; | ||
13 | import tools.refinery.store.query.literal.RepresentativeElectionLiteral; | ||
14 | import tools.refinery.store.query.view.AnySymbolView; | ||
15 | import tools.refinery.store.query.view.KeyOnlyView; | ||
16 | import tools.refinery.store.representation.Symbol; | ||
17 | import tools.refinery.store.tuple.Tuple; | ||
18 | |||
19 | import java.util.List; | ||
20 | import java.util.Map; | ||
21 | |||
22 | import static org.hamcrest.MatcherAssert.assertThat; | ||
23 | import static org.hamcrest.Matchers.is; | ||
24 | import static tools.refinery.store.query.viatra.tests.QueryAssertions.assertResults; | ||
25 | |||
26 | class StronglyConnectedComponentsTest { | ||
27 | private static final Symbol<Boolean> friend = Symbol.of("friend", 2); | ||
28 | private static final AnySymbolView friendView = new KeyOnlyView<>(friend); | ||
29 | |||
30 | @Test | ||
31 | void symbolViewTest() { | ||
32 | var query = Query.of("SymbolViewRepresentative", (builder, p1, p2) -> builder | ||
33 | .clause(v1 -> List.of( | ||
34 | new RepresentativeElectionLiteral(Connectivity.STRONG, friendView, p1, v1), | ||
35 | new RepresentativeElectionLiteral(Connectivity.STRONG, friendView, p2, v1) | ||
36 | ))); | ||
37 | |||
38 | var store = ModelStore.builder() | ||
39 | .symbols(friend) | ||
40 | .with(ViatraModelQueryAdapter.builder() | ||
41 | .queries(query)) | ||
42 | .build(); | ||
43 | |||
44 | var model = store.createEmptyModel(); | ||
45 | var friendInterpretation = model.getInterpretation(friend); | ||
46 | var queryEngine = model.getAdapter(ModelQueryAdapter.class); | ||
47 | var resultSet = queryEngine.getResultSet(query); | ||
48 | |||
49 | friendInterpretation.put(Tuple.of(0, 1), true); | ||
50 | friendInterpretation.put(Tuple.of(1, 0), true); | ||
51 | friendInterpretation.put(Tuple.of(1, 2), true); | ||
52 | queryEngine.flushChanges(); | ||
53 | |||
54 | assertResults(Map.of( | ||
55 | Tuple.of(0, 0), true, | ||
56 | Tuple.of(0, 1), true, | ||
57 | Tuple.of(1, 0), true, | ||
58 | Tuple.of(1, 1), true, | ||
59 | Tuple.of(2, 2), true | ||
60 | ), resultSet); | ||
61 | } | ||
62 | |||
63 | @Test | ||
64 | void symbolViewInsertTest() { | ||
65 | var query = Query.of("SymbolViewRepresentative", (builder, p1, p2) -> builder | ||
66 | .clause(v1 -> List.of( | ||
67 | new RepresentativeElectionLiteral(Connectivity.STRONG, friendView, p1, v1), | ||
68 | new RepresentativeElectionLiteral(Connectivity.STRONG, friendView, p2, v1) | ||
69 | ))); | ||
70 | |||
71 | var store = ModelStore.builder() | ||
72 | .symbols(friend) | ||
73 | .with(ViatraModelQueryAdapter.builder() | ||
74 | .queries(query)) | ||
75 | .build(); | ||
76 | |||
77 | var model = store.createEmptyModel(); | ||
78 | var friendInterpretation = model.getInterpretation(friend); | ||
79 | var queryEngine = model.getAdapter(ModelQueryAdapter.class); | ||
80 | var resultSet = queryEngine.getResultSet(query); | ||
81 | |||
82 | friendInterpretation.put(Tuple.of(0, 1), true); | ||
83 | friendInterpretation.put(Tuple.of(1, 0), true); | ||
84 | friendInterpretation.put(Tuple.of(1, 2), true); | ||
85 | queryEngine.flushChanges(); | ||
86 | |||
87 | friendInterpretation.put(Tuple.of(2, 0), true); | ||
88 | friendInterpretation.put(Tuple.of(0, 3), true); | ||
89 | queryEngine.flushChanges(); | ||
90 | |||
91 | assertResults(Map.of( | ||
92 | Tuple.of(0, 0), true, | ||
93 | Tuple.of(0, 1), true, | ||
94 | Tuple.of(0, 2), true, | ||
95 | Tuple.of(1, 1), true, | ||
96 | Tuple.of(1, 0), true, | ||
97 | Tuple.of(1, 2), true, | ||
98 | Tuple.of(2, 0), true, | ||
99 | Tuple.of(2, 1), true, | ||
100 | Tuple.of(2, 2), true, | ||
101 | Tuple.of(3, 3), true | ||
102 | ), resultSet); | ||
103 | } | ||
104 | |||
105 | @Test | ||
106 | void symbolViewDeleteTest() { | ||
107 | var query = Query.of("SymbolViewRepresentative", (builder, p1, p2) -> builder | ||
108 | .clause(v1 -> List.of( | ||
109 | new RepresentativeElectionLiteral(Connectivity.STRONG, friendView, p1, v1), | ||
110 | new RepresentativeElectionLiteral(Connectivity.STRONG, friendView, p2, v1) | ||
111 | ))); | ||
112 | |||
113 | var store = ModelStore.builder() | ||
114 | .symbols(friend) | ||
115 | .with(ViatraModelQueryAdapter.builder() | ||
116 | .queries(query)) | ||
117 | .build(); | ||
118 | |||
119 | var model = store.createEmptyModel(); | ||
120 | var friendInterpretation = model.getInterpretation(friend); | ||
121 | var queryEngine = model.getAdapter(ModelQueryAdapter.class); | ||
122 | var resultSet = queryEngine.getResultSet(query); | ||
123 | |||
124 | friendInterpretation.put(Tuple.of(0, 1), true); | ||
125 | friendInterpretation.put(Tuple.of(1, 0), true); | ||
126 | friendInterpretation.put(Tuple.of(1, 2), true); | ||
127 | queryEngine.flushChanges(); | ||
128 | |||
129 | friendInterpretation.put(Tuple.of(1, 0), false); | ||
130 | friendInterpretation.put(Tuple.of(1, 2), false); | ||
131 | queryEngine.flushChanges(); | ||
132 | |||
133 | assertResults(Map.of( | ||
134 | Tuple.of(0, 0), true, | ||
135 | Tuple.of(1, 1), true | ||
136 | ), resultSet); | ||
137 | } | ||
138 | |||
139 | @Test | ||
140 | void diagonalSymbolViewTest() { | ||
141 | var person = Symbol.of("Person", 1); | ||
142 | var personView = new KeyOnlyView<>(person); | ||
143 | |||
144 | var query = Query.of("SymbolViewRepresentative", (builder, p1) -> builder | ||
145 | .clause( | ||
146 | personView.call(p1), | ||
147 | new RepresentativeElectionLiteral(Connectivity.STRONG, friendView, p1, p1) | ||
148 | )); | ||
149 | |||
150 | var store = ModelStore.builder() | ||
151 | .symbols(person, friend) | ||
152 | .with(ViatraModelQueryAdapter.builder() | ||
153 | .queries(query)) | ||
154 | .build(); | ||
155 | |||
156 | var model = store.createEmptyModel(); | ||
157 | var personInterpretation = model.getInterpretation(person); | ||
158 | var friendInterpretation = model.getInterpretation(friend); | ||
159 | var queryEngine = model.getAdapter(ModelQueryAdapter.class); | ||
160 | var resultSet = queryEngine.getResultSet(query); | ||
161 | |||
162 | personInterpretation.put(Tuple.of(0), true); | ||
163 | personInterpretation.put(Tuple.of(1), true); | ||
164 | personInterpretation.put(Tuple.of(2), true); | ||
165 | |||
166 | friendInterpretation.put(Tuple.of(0, 1), true); | ||
167 | friendInterpretation.put(Tuple.of(1, 0), true); | ||
168 | friendInterpretation.put(Tuple.of(1, 2), true); | ||
169 | queryEngine.flushChanges(); | ||
170 | |||
171 | assertThat(resultSet.size(), is(2)); | ||
172 | assertThat(resultSet.get(Tuple.of(2)), is(true)); | ||
173 | } | ||
174 | |||
175 | @Test | ||
176 | void diagonalDnfTest() { | ||
177 | var person = Symbol.of("Person", 1); | ||
178 | var personView = new KeyOnlyView<>(person); | ||
179 | |||
180 | var subQuery = Query.of("SubQuery", (builder, p1, p2) -> builder | ||
181 | .clause( | ||
182 | personView.call(p1), | ||
183 | personView.call(p2), | ||
184 | friendView.call(p1, p2) | ||
185 | )) | ||
186 | .getDnf(); | ||
187 | var query = Query.of("SymbolViewRepresentative", (builder, p1) -> builder | ||
188 | .clause( | ||
189 | personView.call(p1), | ||
190 | new RepresentativeElectionLiteral(Connectivity.STRONG, subQuery, p1, p1) | ||
191 | )); | ||
192 | |||
193 | var store = ModelStore.builder() | ||
194 | .symbols(person, friend) | ||
195 | .with(ViatraModelQueryAdapter.builder() | ||
196 | .queries(query)) | ||
197 | .build(); | ||
198 | |||
199 | var model = store.createEmptyModel(); | ||
200 | var personInterpretation = model.getInterpretation(person); | ||
201 | var friendInterpretation = model.getInterpretation(friend); | ||
202 | var queryEngine = model.getAdapter(ModelQueryAdapter.class); | ||
203 | var resultSet = queryEngine.getResultSet(query); | ||
204 | |||
205 | personInterpretation.put(Tuple.of(0), true); | ||
206 | personInterpretation.put(Tuple.of(1), true); | ||
207 | personInterpretation.put(Tuple.of(2), true); | ||
208 | |||
209 | friendInterpretation.put(Tuple.of(0, 1), true); | ||
210 | friendInterpretation.put(Tuple.of(1, 0), true); | ||
211 | friendInterpretation.put(Tuple.of(1, 2), true); | ||
212 | queryEngine.flushChanges(); | ||
213 | |||
214 | assertThat(resultSet.size(), is(2)); | ||
215 | assertThat(resultSet.get(Tuple.of(2)), is(true)); | ||
216 | } | ||
217 | |||
218 | @Test | ||
219 | void loopTest() { | ||
220 | var query = Query.of("SymbolViewRepresentative", (builder, p1, p2) -> builder | ||
221 | .clause(v1 -> List.of( | ||
222 | new RepresentativeElectionLiteral(Connectivity.STRONG, friendView, p1, v1), | ||
223 | new RepresentativeElectionLiteral(Connectivity.STRONG, friendView, p2, v1) | ||
224 | ))); | ||
225 | |||
226 | var store = ModelStore.builder() | ||
227 | .symbols(friend) | ||
228 | .with(ViatraModelQueryAdapter.builder() | ||
229 | .queries(query)) | ||
230 | .build(); | ||
231 | |||
232 | var model = store.createEmptyModel(); | ||
233 | var friendInterpretation = model.getInterpretation(friend); | ||
234 | var queryEngine = model.getAdapter(ModelQueryAdapter.class); | ||
235 | var resultSet = queryEngine.getResultSet(query); | ||
236 | |||
237 | friendInterpretation.put(Tuple.of(0, 1), true); | ||
238 | friendInterpretation.put(Tuple.of(1, 2), true); | ||
239 | friendInterpretation.put(Tuple.of(2, 3), true); | ||
240 | friendInterpretation.put(Tuple.of(3, 0), true); | ||
241 | friendInterpretation.put(Tuple.of(3, 4), true); | ||
242 | queryEngine.flushChanges(); | ||
243 | |||
244 | assertThat(resultSet.get(Tuple.of(0, 1)), is(true)); | ||
245 | assertThat(resultSet.get(Tuple.of(1, 2)), is(true)); | ||
246 | assertThat(resultSet.get(Tuple.of(2, 3)), is(true)); | ||
247 | assertThat(resultSet.get(Tuple.of(3, 0)), is(true)); | ||
248 | assertThat(resultSet.get(Tuple.of(3, 4)), is(false)); | ||
249 | |||
250 | friendInterpretation.put(Tuple.of(2, 3), false); | ||
251 | queryEngine.flushChanges(); | ||
252 | |||
253 | assertThat(resultSet.get(Tuple.of(0, 1)), is(false)); | ||
254 | assertThat(resultSet.get(Tuple.of(0, 2)), is(false)); | ||
255 | assertThat(resultSet.get(Tuple.of(0, 3)), is(false)); | ||
256 | assertThat(resultSet.get(Tuple.of(1, 2)), is(false)); | ||
257 | assertThat(resultSet.get(Tuple.of(2, 3)), is(false)); | ||
258 | assertThat(resultSet.get(Tuple.of(3, 0)), is(false)); | ||
259 | assertThat(resultSet.get(Tuple.of(3, 4)), is(false)); | ||
260 | } | ||
261 | } | ||
diff --git a/subprojects/store-query-viatra/src/test/java/tools/refinery/store/query/viatra/WeaklyConnectedComponentsTest.java b/subprojects/store-query-viatra/src/test/java/tools/refinery/store/query/viatra/WeaklyConnectedComponentsTest.java new file mode 100644 index 00000000..613d4284 --- /dev/null +++ b/subprojects/store-query-viatra/src/test/java/tools/refinery/store/query/viatra/WeaklyConnectedComponentsTest.java | |||
@@ -0,0 +1,188 @@ | |||
1 | /* | ||
2 | * SPDX-FileCopyrightText: 2023 The Refinery Authors <https://refinery.tools/> | ||
3 | * | ||
4 | * SPDX-License-Identifier: EPL-2.0 | ||
5 | */ | ||
6 | package tools.refinery.store.query.viatra; | ||
7 | |||
8 | import org.junit.jupiter.api.Test; | ||
9 | import tools.refinery.store.model.ModelStore; | ||
10 | import tools.refinery.store.query.ModelQueryAdapter; | ||
11 | import tools.refinery.store.query.dnf.Query; | ||
12 | import tools.refinery.store.query.literal.Connectivity; | ||
13 | import tools.refinery.store.query.literal.RepresentativeElectionLiteral; | ||
14 | import tools.refinery.store.query.view.AnySymbolView; | ||
15 | import tools.refinery.store.query.view.KeyOnlyView; | ||
16 | import tools.refinery.store.representation.Symbol; | ||
17 | import tools.refinery.store.tuple.Tuple; | ||
18 | |||
19 | import java.util.List; | ||
20 | import java.util.Map; | ||
21 | |||
22 | import static org.hamcrest.MatcherAssert.assertThat; | ||
23 | import static org.hamcrest.Matchers.is; | ||
24 | import static tools.refinery.store.query.viatra.tests.QueryAssertions.assertResults; | ||
25 | |||
26 | class WeaklyConnectedComponentsTest { | ||
27 | private static final Symbol<Boolean> friend = Symbol.of("friend", 2); | ||
28 | private static final AnySymbolView friendView = new KeyOnlyView<>(friend); | ||
29 | |||
30 | @Test | ||
31 | void symbolViewTest() { | ||
32 | var query = Query.of("SymbolViewRepresentative", (builder, p1, p2) -> builder | ||
33 | .clause(v1 -> List.of( | ||
34 | new RepresentativeElectionLiteral(Connectivity.WEAK, friendView, p1, v1), | ||
35 | new RepresentativeElectionLiteral(Connectivity.WEAK, friendView, p2, v1) | ||
36 | ))); | ||
37 | |||
38 | var store = ModelStore.builder() | ||
39 | .symbols(friend) | ||
40 | .with(ViatraModelQueryAdapter.builder() | ||
41 | .queries(query)) | ||
42 | .build(); | ||
43 | |||
44 | var model = store.createEmptyModel(); | ||
45 | var friendInterpretation = model.getInterpretation(friend); | ||
46 | var queryEngine = model.getAdapter(ModelQueryAdapter.class); | ||
47 | var resultSet = queryEngine.getResultSet(query); | ||
48 | |||
49 | friendInterpretation.put(Tuple.of(0, 1), true); | ||
50 | friendInterpretation.put(Tuple.of(1, 0), true); | ||
51 | friendInterpretation.put(Tuple.of(2, 3), true); | ||
52 | queryEngine.flushChanges(); | ||
53 | |||
54 | assertResults(Map.of( | ||
55 | Tuple.of(0, 0), true, | ||
56 | Tuple.of(0, 1), true, | ||
57 | Tuple.of(1, 0), true, | ||
58 | Tuple.of(1, 1), true, | ||
59 | Tuple.of(2, 2), true, | ||
60 | Tuple.of(2, 3), true, | ||
61 | Tuple.of(3, 2), true, | ||
62 | Tuple.of(3, 3), true | ||
63 | ), resultSet); | ||
64 | } | ||
65 | |||
66 | @Test | ||
67 | void symbolViewUpdateTest() { | ||
68 | var query = Query.of("SymbolViewRepresentative", (builder, p1, p2) -> builder | ||
69 | .clause(v1 -> List.of( | ||
70 | new RepresentativeElectionLiteral(Connectivity.WEAK, friendView, p1, v1), | ||
71 | new RepresentativeElectionLiteral(Connectivity.WEAK, friendView, p2, v1) | ||
72 | ))); | ||
73 | |||
74 | var store = ModelStore.builder() | ||
75 | .symbols(friend) | ||
76 | .with(ViatraModelQueryAdapter.builder() | ||
77 | .queries(query)) | ||
78 | .build(); | ||
79 | |||
80 | var model = store.createEmptyModel(); | ||
81 | var friendInterpretation = model.getInterpretation(friend); | ||
82 | var queryEngine = model.getAdapter(ModelQueryAdapter.class); | ||
83 | var resultSet = queryEngine.getResultSet(query); | ||
84 | |||
85 | friendInterpretation.put(Tuple.of(0, 1), true); | ||
86 | friendInterpretation.put(Tuple.of(1, 0), true); | ||
87 | friendInterpretation.put(Tuple.of(2, 3), true); | ||
88 | queryEngine.flushChanges(); | ||
89 | |||
90 | friendInterpretation.put(Tuple.of(2, 3), false); | ||
91 | friendInterpretation.put(Tuple.of(1, 0), false); | ||
92 | friendInterpretation.put(Tuple.of(1, 2), true); | ||
93 | queryEngine.flushChanges(); | ||
94 | |||
95 | assertResults(Map.of( | ||
96 | Tuple.of(0, 0), true, | ||
97 | Tuple.of(0, 1), true, | ||
98 | Tuple.of(0, 2), true, | ||
99 | Tuple.of(1, 0), true, | ||
100 | Tuple.of(1, 1), true, | ||
101 | Tuple.of(1, 2), true, | ||
102 | Tuple.of(2, 0), true, | ||
103 | Tuple.of(2, 1), true, | ||
104 | Tuple.of(2, 2), true | ||
105 | ), resultSet); | ||
106 | } | ||
107 | |||
108 | @Test | ||
109 | void diagonalSymbolViewTest() { | ||
110 | var person = Symbol.of("Person", 1); | ||
111 | var personView = new KeyOnlyView<>(person); | ||
112 | |||
113 | var query = Query.of("SymbolViewRepresentative", (builder, p1) -> builder | ||
114 | .clause( | ||
115 | personView.call(p1), | ||
116 | new RepresentativeElectionLiteral(Connectivity.WEAK, friendView, p1, p1) | ||
117 | )); | ||
118 | |||
119 | var store = ModelStore.builder() | ||
120 | .symbols(person, friend) | ||
121 | .with(ViatraModelQueryAdapter.builder() | ||
122 | .queries(query)) | ||
123 | .build(); | ||
124 | |||
125 | var model = store.createEmptyModel(); | ||
126 | var personInterpretation = model.getInterpretation(person); | ||
127 | var friendInterpretation = model.getInterpretation(friend); | ||
128 | var queryEngine = model.getAdapter(ModelQueryAdapter.class); | ||
129 | var resultSet = queryEngine.getResultSet(query); | ||
130 | |||
131 | personInterpretation.put(Tuple.of(0), true); | ||
132 | personInterpretation.put(Tuple.of(1), true); | ||
133 | personInterpretation.put(Tuple.of(2), true); | ||
134 | personInterpretation.put(Tuple.of(3), true); | ||
135 | |||
136 | friendInterpretation.put(Tuple.of(0, 1), true); | ||
137 | friendInterpretation.put(Tuple.of(1, 0), true); | ||
138 | friendInterpretation.put(Tuple.of(2, 3), true); | ||
139 | queryEngine.flushChanges(); | ||
140 | |||
141 | assertThat(resultSet.size(), is(2)); | ||
142 | assertThat(resultSet.get(Tuple.of(2)), is(true)); | ||
143 | } | ||
144 | |||
145 | @Test | ||
146 | void diagonalDnfTest() { | ||
147 | var person = Symbol.of("Person", 1); | ||
148 | var personView = new KeyOnlyView<>(person); | ||
149 | |||
150 | var subQuery = Query.of("SubQuery", (builder, p1, p2) -> builder | ||
151 | .clause( | ||
152 | personView.call(p1), | ||
153 | personView.call(p2), | ||
154 | friendView.call(p1, p2) | ||
155 | )) | ||
156 | .getDnf(); | ||
157 | var query = Query.of("SymbolViewRepresentative", (builder, p1) -> builder | ||
158 | .clause( | ||
159 | personView.call(p1), | ||
160 | new RepresentativeElectionLiteral(Connectivity.WEAK, subQuery, p1, p1) | ||
161 | )); | ||
162 | |||
163 | var store = ModelStore.builder() | ||
164 | .symbols(person, friend) | ||
165 | .with(ViatraModelQueryAdapter.builder() | ||
166 | .queries(query)) | ||
167 | .build(); | ||
168 | |||
169 | var model = store.createEmptyModel(); | ||
170 | var personInterpretation = model.getInterpretation(person); | ||
171 | var friendInterpretation = model.getInterpretation(friend); | ||
172 | var queryEngine = model.getAdapter(ModelQueryAdapter.class); | ||
173 | var resultSet = queryEngine.getResultSet(query); | ||
174 | |||
175 | personInterpretation.put(Tuple.of(0), true); | ||
176 | personInterpretation.put(Tuple.of(1), true); | ||
177 | personInterpretation.put(Tuple.of(2), true); | ||
178 | personInterpretation.put(Tuple.of(3), true); | ||
179 | |||
180 | friendInterpretation.put(Tuple.of(0, 1), true); | ||
181 | friendInterpretation.put(Tuple.of(1, 0), true); | ||
182 | friendInterpretation.put(Tuple.of(2, 3), true); | ||
183 | queryEngine.flushChanges(); | ||
184 | |||
185 | assertThat(resultSet.size(), is(2)); | ||
186 | assertThat(resultSet.get(Tuple.of(2)), is(true)); | ||
187 | } | ||
188 | } | ||
diff --git a/subprojects/store-query-viatra/src/test/java/tools/refinery/store/query/viatra/internal/matcher/MatcherUtilsTest.java b/subprojects/store-query-viatra/src/test/java/tools/refinery/store/query/viatra/internal/matcher/MatcherUtilsTest.java index 968c6c5e..319797a0 100644 --- a/subprojects/store-query-viatra/src/test/java/tools/refinery/store/query/viatra/internal/matcher/MatcherUtilsTest.java +++ b/subprojects/store-query-viatra/src/test/java/tools/refinery/store/query/viatra/internal/matcher/MatcherUtilsTest.java | |||
@@ -5,7 +5,7 @@ | |||
5 | */ | 5 | */ |
6 | package tools.refinery.store.query.viatra.internal.matcher; | 6 | package tools.refinery.store.query.viatra.internal.matcher; |
7 | 7 | ||
8 | import org.eclipse.viatra.query.runtime.matchers.tuple.*; | 8 | import tools.refinery.viatra.runtime.matchers.tuple.*; |
9 | import org.junit.jupiter.api.Test; | 9 | import org.junit.jupiter.api.Test; |
10 | import tools.refinery.store.tuple.Tuple; | 10 | import tools.refinery.store.tuple.Tuple; |
11 | import tools.refinery.store.tuple.*; | 11 | import tools.refinery.store.tuple.*; |
diff --git a/subprojects/store-query-viatra/src/test/java/tools/refinery/store/query/viatra/tests/QueryAssertions.java b/subprojects/store-query-viatra/src/test/java/tools/refinery/store/query/viatra/tests/QueryAssertions.java index ca089a9d..5c1c4fc1 100644 --- a/subprojects/store-query-viatra/src/test/java/tools/refinery/store/query/viatra/tests/QueryAssertions.java +++ b/subprojects/store-query-viatra/src/test/java/tools/refinery/store/query/viatra/tests/QueryAssertions.java | |||
@@ -30,7 +30,7 @@ public final class QueryAssertions { | |||
30 | } | 30 | } |
31 | 31 | ||
32 | public static <T> void assertResults(Map<Tuple, T> expected, ResultSet<T> resultSet) { | 32 | public static <T> void assertResults(Map<Tuple, T> expected, ResultSet<T> resultSet) { |
33 | var defaultValue = resultSet.getQuery().defaultValue(); | 33 | var defaultValue = resultSet.getCanonicalQuery().defaultValue(); |
34 | var filteredExpected = new LinkedHashMap<Tuple, T>(); | 34 | var filteredExpected = new LinkedHashMap<Tuple, T>(); |
35 | var executables = new ArrayList<Executable>(); | 35 | var executables = new ArrayList<Executable>(); |
36 | for (var entry : expected.entrySet()) { | 36 | for (var entry : expected.entrySet()) { |
diff --git a/subprojects/store-query-viatra/src/test/java/tools/refinery/store/query/viatra/tests/QueryBackendHint.java b/subprojects/store-query-viatra/src/test/java/tools/refinery/store/query/viatra/tests/QueryBackendHint.java index dc0e92c8..5f88e04b 100644 --- a/subprojects/store-query-viatra/src/test/java/tools/refinery/store/query/viatra/tests/QueryBackendHint.java +++ b/subprojects/store-query-viatra/src/test/java/tools/refinery/store/query/viatra/tests/QueryBackendHint.java | |||
@@ -5,7 +5,7 @@ | |||
5 | */ | 5 | */ |
6 | package tools.refinery.store.query.viatra.tests; | 6 | package tools.refinery.store.query.viatra.tests; |
7 | 7 | ||
8 | import org.eclipse.viatra.query.runtime.matchers.backend.QueryEvaluationHint; | 8 | import tools.refinery.viatra.runtime.matchers.backend.QueryEvaluationHint; |
9 | 9 | ||
10 | /** | 10 | /** |
11 | * Overrides {@link QueryEvaluationHint#toString()} for pretty names in parametric test names. | 11 | * Overrides {@link QueryEvaluationHint#toString()} for pretty names in parametric test names. |
diff --git a/subprojects/store-query-viatra/src/test/java/tools/refinery/store/query/viatra/tests/QueryEvaluationHintSource.java b/subprojects/store-query-viatra/src/test/java/tools/refinery/store/query/viatra/tests/QueryEvaluationHintSource.java index 9e75d5f3..ed356eeb 100644 --- a/subprojects/store-query-viatra/src/test/java/tools/refinery/store/query/viatra/tests/QueryEvaluationHintSource.java +++ b/subprojects/store-query-viatra/src/test/java/tools/refinery/store/query/viatra/tests/QueryEvaluationHintSource.java | |||
@@ -5,7 +5,7 @@ | |||
5 | */ | 5 | */ |
6 | package tools.refinery.store.query.viatra.tests; | 6 | package tools.refinery.store.query.viatra.tests; |
7 | 7 | ||
8 | import org.eclipse.viatra.query.runtime.matchers.backend.QueryEvaluationHint; | 8 | import tools.refinery.viatra.runtime.matchers.backend.QueryEvaluationHint; |
9 | import org.junit.jupiter.api.extension.ExtensionContext; | 9 | import org.junit.jupiter.api.extension.ExtensionContext; |
10 | import org.junit.jupiter.params.provider.Arguments; | 10 | import org.junit.jupiter.params.provider.Arguments; |
11 | import org.junit.jupiter.params.provider.ArgumentsProvider; | 11 | import org.junit.jupiter.params.provider.ArgumentsProvider; |