aboutsummaryrefslogtreecommitdiffstats
path: root/language/src/test/java/org/eclipse/viatra
diff options
context:
space:
mode:
authorLibravatar Kristóf Marussy <marussy@mit.bme.hu>2021-06-28 02:45:33 +0200
committerLibravatar Kristóf Marussy <marussy@mit.bme.hu>2021-06-28 02:47:34 +0200
commitb7db563dc425dbf90e42b1c69fb4d52c41a18503 (patch)
tree99bf06a66e6d63b9afda017f6f23266cac46def2 /language/src/test/java/org/eclipse/viatra
parentAdd data constant support (diff)
downloadrefinery-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')
-rw-r--r--language/src/test/java/org/eclipse/viatra/solver/language/tests/ProblemParsingTest.xtend2
-rw-r--r--language/src/test/java/org/eclipse/viatra/solver/language/tests/ProblemScopingTest.xtend148
-rw-r--r--language/src/test/java/org/eclipse/viatra/solver/language/tests/ProblemTestUtil.xtend110
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 */
4package org.eclipse.viatra.solver.language.tests 4package 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 */
4package org.eclipse.viatra.solver.language.tests
5
6import com.google.inject.Inject
7import org.eclipse.viatra.solver.language.model.problem.Problem
8import org.eclipse.xtext.testing.InjectWith
9import org.eclipse.xtext.testing.extensions.InjectionExtension
10import org.eclipse.xtext.testing.util.ParseHelper
11import org.junit.jupiter.api.Test
12import org.junit.jupiter.api.^extension.ExtendWith
13
14import static org.hamcrest.MatcherAssert.assertThat
15import static org.hamcrest.Matchers.*
16
17@ExtendWith(InjectionExtension)
18@InjectWith(ProblemInjectorProvider)
19class 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 @@
1package org.eclipse.viatra.solver.language.tests
2
3import org.eclipse.emf.ecore.util.EcoreUtil
4import org.eclipse.viatra.solver.language.ProblemUtil
5import org.eclipse.viatra.solver.language.model.problem.Argument
6import org.eclipse.viatra.solver.language.model.problem.Assertion
7import org.eclipse.viatra.solver.language.model.problem.AssertionArgument
8import org.eclipse.viatra.solver.language.model.problem.Atom
9import org.eclipse.viatra.solver.language.model.problem.ClassDeclaration
10import org.eclipse.viatra.solver.language.model.problem.Conjunction
11import org.eclipse.viatra.solver.language.model.problem.EnumDeclaration
12import org.eclipse.viatra.solver.language.model.problem.Literal
13import org.eclipse.viatra.solver.language.model.problem.NegativeLiteral
14import org.eclipse.viatra.solver.language.model.problem.Node
15import org.eclipse.viatra.solver.language.model.problem.NodeAssertionArgument
16import org.eclipse.viatra.solver.language.model.problem.PredicateDefinition
17import org.eclipse.viatra.solver.language.model.problem.Problem
18import org.eclipse.viatra.solver.language.model.problem.Variable
19import org.eclipse.viatra.solver.language.model.problem.VariableOrNodeArgument
20import org.junit.jupiter.api.Assertions
21
22class 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}