diff options
author | Kristóf Marussy <marussy@mit.bme.hu> | 2021-06-28 02:45:33 +0200 |
---|---|---|
committer | Kristóf Marussy <marussy@mit.bme.hu> | 2021-06-28 02:47:34 +0200 |
commit | b7db563dc425dbf90e42b1c69fb4d52c41a18503 (patch) | |
tree | 99bf06a66e6d63b9afda017f6f23266cac46def2 /language/src/test/java/org/eclipse/viatra | |
parent | Add data constant support (diff) | |
download | refinery-b7db563dc425dbf90e42b1c69fb4d52c41a18503.tar.gz refinery-b7db563dc425dbf90e42b1c69fb4d52c41a18503.tar.zst refinery-b7db563dc425dbf90e42b1c69fb4d52c41a18503.zip |
Add scoping tests and simplify implicit nodes
* Do not export implicit nodes to the global scope
* Enum literals must not be quoted
* Plan for the future: unify quoted nodes from the global scope in
post-processing
Diffstat (limited to 'language/src/test/java/org/eclipse/viatra')
3 files changed, 259 insertions, 1 deletions
diff --git a/language/src/test/java/org/eclipse/viatra/solver/language/tests/ProblemParsingTest.xtend b/language/src/test/java/org/eclipse/viatra/solver/language/tests/ProblemParsingTest.xtend index b007cf8b..9b1bb698 100644 --- a/language/src/test/java/org/eclipse/viatra/solver/language/tests/ProblemParsingTest.xtend +++ b/language/src/test/java/org/eclipse/viatra/solver/language/tests/ProblemParsingTest.xtend | |||
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | * generated by Xtext 2.25.0 | 2 | * generated by Xtext 2.26.0.M1 |
3 | */ | 3 | */ |
4 | package org.eclipse.viatra.solver.language.tests | 4 | package org.eclipse.viatra.solver.language.tests |
5 | 5 | ||
diff --git a/language/src/test/java/org/eclipse/viatra/solver/language/tests/ProblemScopingTest.xtend b/language/src/test/java/org/eclipse/viatra/solver/language/tests/ProblemScopingTest.xtend new file mode 100644 index 00000000..7872b0f7 --- /dev/null +++ b/language/src/test/java/org/eclipse/viatra/solver/language/tests/ProblemScopingTest.xtend | |||
@@ -0,0 +1,148 @@ | |||
1 | /* | ||
2 | * generated by Xtext 2.25.0 | ||
3 | */ | ||
4 | package org.eclipse.viatra.solver.language.tests | ||
5 | |||
6 | import com.google.inject.Inject | ||
7 | import org.eclipse.viatra.solver.language.model.problem.Problem | ||
8 | import org.eclipse.xtext.testing.InjectWith | ||
9 | import org.eclipse.xtext.testing.extensions.InjectionExtension | ||
10 | import org.eclipse.xtext.testing.util.ParseHelper | ||
11 | import org.junit.jupiter.api.Test | ||
12 | import org.junit.jupiter.api.^extension.ExtendWith | ||
13 | |||
14 | import static org.hamcrest.MatcherAssert.assertThat | ||
15 | import static org.hamcrest.Matchers.* | ||
16 | |||
17 | @ExtendWith(InjectionExtension) | ||
18 | @InjectWith(ProblemInjectorProvider) | ||
19 | class ProblemScopingTest { | ||
20 | @Inject | ||
21 | ParseHelper<Problem> parseHelper | ||
22 | |||
23 | @Inject | ||
24 | extension ProblemTestUtil | ||
25 | |||
26 | @Test | ||
27 | def void builtInArgumentTypeTest() { | ||
28 | val it = parseHelper.parse(''' | ||
29 | pred predicate(node a, data b, int c). | ||
30 | ''').assertNoErrors | ||
31 | assertThat(pred('predicate').param(0).parameterType, equalTo(builtin.findClass('node'))) | ||
32 | assertThat(pred('predicate').param(1).parameterType, equalTo(builtin.findClass('data'))) | ||
33 | assertThat(pred('predicate').param(2).parameterType, equalTo(builtin.findClass('int'))) | ||
34 | } | ||
35 | |||
36 | @Test | ||
37 | def void builtiQualifiedArgumentTypeTest() { | ||
38 | val it = parseHelper.parse(''' | ||
39 | pred predicate(builtin::node a, builtin::data b, builtin::int c). | ||
40 | ''').assertNoErrors | ||
41 | assertThat(pred('predicate').param(0).parameterType, equalTo(builtin.findClass('node'))) | ||
42 | assertThat(pred('predicate').param(1).parameterType, equalTo(builtin.findClass('data'))) | ||
43 | assertThat(pred('predicate').param(2).parameterType, equalTo(builtin.findClass('int'))) | ||
44 | } | ||
45 | |||
46 | @Test | ||
47 | def void implicitNodeInAssertionTest() { | ||
48 | val it = parseHelper.parse(''' | ||
49 | pred predicate(node a, node b). | ||
50 | predicate(a, a). | ||
51 | ?predicate(a, b). | ||
52 | ''').assertNoErrors | ||
53 | assertThat(nodeNames, hasItems('a', 'b')) | ||
54 | assertThat(assertion(0).arg(0).node, equalTo(node('a'))) | ||
55 | assertThat(assertion(0).arg(1).node, equalTo(node('a'))) | ||
56 | assertThat(assertion(1).arg(0).node, equalTo(node('a'))) | ||
57 | assertThat(assertion(1).arg(1).node, equalTo(node('b'))) | ||
58 | } | ||
59 | |||
60 | @Test | ||
61 | def void quotedNodeInAssertionTest() { | ||
62 | val it = parseHelper.parse(''' | ||
63 | pred predicate(node a, node b). | ||
64 | predicate('a', 'a'). | ||
65 | ?predicate('a', 'b'). | ||
66 | ''').assertNoErrors | ||
67 | assertThat(nodeNames, hasItems("'a'", "'b'")) | ||
68 | assertThat(assertion(0).arg(0).node, equalTo(node("'a'"))) | ||
69 | assertThat(assertion(0).arg(1).node, equalTo(node("'a'"))) | ||
70 | assertThat(assertion(1).arg(0).node, equalTo(node("'a'"))) | ||
71 | assertThat(assertion(1).arg(1).node, equalTo(node("'b'"))) | ||
72 | } | ||
73 | |||
74 | @Test | ||
75 | def void builtInNodeInAssertionTest() { | ||
76 | val it = parseHelper.parse(''' | ||
77 | pred predicate(node a). | ||
78 | predicate(int::new). | ||
79 | ''').assertNoErrors | ||
80 | assertThat(nodes, empty) | ||
81 | assertThat(assertion(0).arg(0).node, equalTo(builtin.findClass('int').newNode)) | ||
82 | } | ||
83 | |||
84 | @Test | ||
85 | def void qualifiedBuiltInNodeInAssertionTest() { | ||
86 | val it = parseHelper.parse(''' | ||
87 | pred predicate(node a). | ||
88 | predicate(builtin::int::new). | ||
89 | ''').assertNoErrors | ||
90 | assertThat(nodes, empty) | ||
91 | assertThat(assertion(0).arg(0).node, equalTo(builtin.findClass('int').newNode)) | ||
92 | } | ||
93 | |||
94 | @Test | ||
95 | def void classNewNodeTest() { | ||
96 | val it = parseHelper.parse(''' | ||
97 | class Foo. | ||
98 | pred predicate(node a). | ||
99 | predicate(Foo::new). | ||
100 | ''').assertNoErrors | ||
101 | assertThat(nodes, empty) | ||
102 | assertThat(assertion(0).arg(0).node, equalTo(findClass('Foo').newNode)) | ||
103 | } | ||
104 | |||
105 | |||
106 | @Test | ||
107 | def void qualifiedClassNewNodeTest() { | ||
108 | val it = parseHelper.parse(''' | ||
109 | problem test. | ||
110 | class Foo. | ||
111 | pred predicate(node a). | ||
112 | predicate(test::Foo::new). | ||
113 | ''').assertNoErrors | ||
114 | assertThat(nodes, empty) | ||
115 | assertThat(assertion(0).arg(0).node, equalTo(findClass('Foo').newNode)) | ||
116 | } | ||
117 | |||
118 | @Test | ||
119 | def void newNodeIsNotSpecial() { | ||
120 | val it = parseHelper.parse(''' | ||
121 | class Foo. | ||
122 | pred predicate(node a). | ||
123 | predicate(new). | ||
124 | ''').assertNoErrors | ||
125 | assertThat(nodeNames, hasItem('new')) | ||
126 | assertThat(assertion(0).arg(0).node, not(equalTo(findClass('Foo').newNode))) | ||
127 | } | ||
128 | |||
129 | @Test | ||
130 | def void implicitNodeInPredicateTest() { | ||
131 | val it = parseHelper.parse(''' | ||
132 | pred predicate(node a) :- node(b). | ||
133 | predicate(b). | ||
134 | ''').assertNoErrors | ||
135 | assertThat(nodeNames, hasItem("b")) | ||
136 | assertThat(pred("predicate").conj(0).lit(0).arg(0).node, equalTo(node("b"))) | ||
137 | assertThat(assertion(0).arg(0).node, equalTo(node("b"))) | ||
138 | } | ||
139 | |||
140 | @Test | ||
141 | def void quotedNodeInPredicateTest() { | ||
142 | val it = parseHelper.parse(''' | ||
143 | pred predicate(node a) :- node('b'). | ||
144 | ''').assertNoErrors | ||
145 | assertThat(nodeNames, hasItem("'b'")) | ||
146 | assertThat(pred("predicate").conj(0).lit(0).arg(0).node, equalTo(node("'b'"))) | ||
147 | } | ||
148 | } | ||
diff --git a/language/src/test/java/org/eclipse/viatra/solver/language/tests/ProblemTestUtil.xtend b/language/src/test/java/org/eclipse/viatra/solver/language/tests/ProblemTestUtil.xtend new file mode 100644 index 00000000..98b53675 --- /dev/null +++ b/language/src/test/java/org/eclipse/viatra/solver/language/tests/ProblemTestUtil.xtend | |||
@@ -0,0 +1,110 @@ | |||
1 | package org.eclipse.viatra.solver.language.tests | ||
2 | |||
3 | import org.eclipse.emf.ecore.util.EcoreUtil | ||
4 | import org.eclipse.viatra.solver.language.ProblemUtil | ||
5 | import org.eclipse.viatra.solver.language.model.problem.Argument | ||
6 | import org.eclipse.viatra.solver.language.model.problem.Assertion | ||
7 | import org.eclipse.viatra.solver.language.model.problem.AssertionArgument | ||
8 | import org.eclipse.viatra.solver.language.model.problem.Atom | ||
9 | import org.eclipse.viatra.solver.language.model.problem.ClassDeclaration | ||
10 | import org.eclipse.viatra.solver.language.model.problem.Conjunction | ||
11 | import org.eclipse.viatra.solver.language.model.problem.EnumDeclaration | ||
12 | import org.eclipse.viatra.solver.language.model.problem.Literal | ||
13 | import org.eclipse.viatra.solver.language.model.problem.NegativeLiteral | ||
14 | import org.eclipse.viatra.solver.language.model.problem.Node | ||
15 | import org.eclipse.viatra.solver.language.model.problem.NodeAssertionArgument | ||
16 | import org.eclipse.viatra.solver.language.model.problem.PredicateDefinition | ||
17 | import org.eclipse.viatra.solver.language.model.problem.Problem | ||
18 | import org.eclipse.viatra.solver.language.model.problem.Variable | ||
19 | import org.eclipse.viatra.solver.language.model.problem.VariableOrNodeArgument | ||
20 | import org.junit.jupiter.api.Assertions | ||
21 | |||
22 | class ProblemTestUtil { | ||
23 | def builtin(Problem it) { | ||
24 | ProblemUtil.getBuiltInLibrary(it).get | ||
25 | } | ||
26 | |||
27 | def assertNoErrors(Problem it) { | ||
28 | Assertions.assertNotNull(it) | ||
29 | EcoreUtil.resolveAll(it) | ||
30 | val errors = eResource.errors | ||
31 | Assertions.assertTrue(errors.isEmpty, '''Unexpected errors: «errors.join(", ")»''') | ||
32 | it | ||
33 | } | ||
34 | |||
35 | def nodeNames(Problem it) { | ||
36 | nodes.map[name] | ||
37 | } | ||
38 | |||
39 | def pred(Problem it, String name) { | ||
40 | statements.filter(PredicateDefinition).findFirst[it.name == name] | ||
41 | } | ||
42 | |||
43 | def param(PredicateDefinition it, int i) { | ||
44 | parameters.get(i) | ||
45 | } | ||
46 | |||
47 | def conj(PredicateDefinition it, int i) { | ||
48 | bodies.get(i) | ||
49 | } | ||
50 | |||
51 | def lit(Conjunction it, int i) { | ||
52 | literals.get(i) | ||
53 | } | ||
54 | |||
55 | def negated(Literal it) { | ||
56 | (it as NegativeLiteral).atom | ||
57 | } | ||
58 | |||
59 | def relation(Literal it) { | ||
60 | (it as Atom).relation | ||
61 | } | ||
62 | |||
63 | def arg(Atom it, int i) { | ||
64 | it.arguments.get(i) | ||
65 | } | ||
66 | |||
67 | def arg(Literal it, int i) { | ||
68 | (it as Atom).arg(i) | ||
69 | } | ||
70 | |||
71 | def variable(Argument it) { | ||
72 | (it as VariableOrNodeArgument).variableOrNode as Variable | ||
73 | } | ||
74 | |||
75 | def node(Argument it) { | ||
76 | (it as VariableOrNodeArgument).variableOrNode as Node | ||
77 | } | ||
78 | |||
79 | def assertion(Problem it, int i) { | ||
80 | statements.filter(Assertion).get(i) | ||
81 | } | ||
82 | |||
83 | def arg(Assertion it, int i) { | ||
84 | arguments.get(i) | ||
85 | } | ||
86 | |||
87 | def node(AssertionArgument it) { | ||
88 | (it as NodeAssertionArgument).node | ||
89 | } | ||
90 | |||
91 | def node(Problem it, String name) { | ||
92 | nodes.findFirst[it.name == name] | ||
93 | } | ||
94 | |||
95 | def findClass(Problem it, String name) { | ||
96 | statements.filter(ClassDeclaration).findFirst[it.name == name] | ||
97 | } | ||
98 | |||
99 | def reference(ClassDeclaration it, String name) { | ||
100 | it.referenceDeclarations.findFirst[it.name == name] | ||
101 | } | ||
102 | |||
103 | def findEnum(Problem it, String name) { | ||
104 | statements.filter(EnumDeclaration).findFirst[it.name == name] | ||
105 | } | ||
106 | |||
107 | def literal(EnumDeclaration it, String name) { | ||
108 | literals.findFirst[it.name == name] | ||
109 | } | ||
110 | } | ||