/
ChirpScopeProvider.java
118 lines (87 loc) · 3.67 KB
/
ChirpScopeProvider.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
/*
* generated by Xtext 2.21.0
*/
package org.eclipse.efbt.chirp.scoping;
import org.eclipse.efbt.chirp.scoping.AbstractChirpScopeProvider;
import org.eclipse.efbt.testing.common.model.test_definition.Clause;
import org.eclipse.efbt.testing.common.model.test_definition.Given;
import org.eclipse.efbt.testing.common.model.test_definition.Param;
import org.eclipse.efbt.testing.common.model.test_definition.TestContraints;
import org.eclipse.efbt.testing.common.model.test_definition.TestDefinition;
import org.eclipse.efbt.testing.common.model.test_definition.TestTemplate;
import org.eclipse.efbt.testing.common.model.test_definition.Then;
import org.eclipse.efbt.testing.common.model.test_definition.When;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.xtext.scoping.IScope;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.xtext.EcoreUtil2;
import org.eclipse.xtext.scoping.Scopes;
import java.util.List;
import org.apache.log4j.LogManager;
/**
* This class contains custom scoping description.
*
* See
* https://www.eclipse.org/Xtext/documentation/303_runtime_concepts.html#scoping
* on how and when to use it.
*
* @author Neil Mackenzie
*/
public class ChirpScopeProvider extends AbstractChirpScopeProvider {
/**
* We hae specialized the getScope method so that it gives special scoping rules
* for how we may choose the parameters for Given, When and Then clauses.
*
* The parameters must be of the correct type defined by the test definition
* and must exist under the root defined in the test template.
*
*
* @param context
* @param reference
* @return
*/
public IScope getScope(EObject context, EReference reference) {
Object LOGGER = LogManager.getLogger(ChirpScopeProvider.class);
if ((context.eContainer()) instanceof Clause) {
if (context instanceof Param) {
Clause bddclauseElement = (Clause) (context.eContainer());
TestDefinition bddElement = (TestDefinition) (bddclauseElement.eContainer());
TestContraints coverageTestSet = bddElement.getTestContraints();
TestTemplate coverageTestType = coverageTestSet.getTemplate();
// find out index of containing bddclauseElement
int index = bddclauseElement.getParams().indexOf(context);
if (bddclauseElement instanceof Given) {
int size = coverageTestSet.getGivenParams().size();
if (index < size) {
EObject templateObject = coverageTestSet.getGivenParams().get(index).getParam();
EObject templateType = coverageTestType.getGivenParams().get(index).getParam();
List<? extends EObject> candidates = EcoreUtil2.getAllContentsOfType(templateObject,
templateType.getClass());
return Scopes.scopeFor(candidates);
}
}
if (bddclauseElement instanceof When) {
int size = coverageTestSet.getWhenParams().size();
if (index < size) {
EObject templateObject = coverageTestSet.getWhenParams().get(index).getParam();
EObject templateType = coverageTestType.getWhenParams().get(index).getParam();
List<? extends EObject> candidates = EcoreUtil2.getAllContentsOfType(templateObject,
templateType.getClass());
return Scopes.scopeFor(candidates);
}
}
if (bddclauseElement instanceof Then) {
int size = coverageTestSet.getThenParams().size();
if (index < size) {
EObject templateObject = coverageTestSet.getThenParams().get(index).getParam();
EObject templateType = coverageTestType.getThenParams().get(index).getParam();
List<? extends EObject> candidates = EcoreUtil2.getAllContentsOfType(templateObject,
templateType.getClass());
return Scopes.scopeFor(candidates);
}
}
}
}
return super.getScope(context, reference);
}
}