Skip to content

Commit 2e4afc4

Browse files
committed
Fixed rules overriding and added more informative error message in case there was error inside rule
1 parent b6d37ff commit 2e4afc4

File tree

5 files changed

+61
-18
lines changed

5 files changed

+61
-18
lines changed

galen-core/src/main/java/com/galenframework/speclang2/pagespec/PageSectionProcessor.java

Lines changed: 18 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,7 @@
3030
import org.apache.commons.lang3.tuple.Pair;
3131

3232
import java.io.IOException;
33-
import java.util.Collections;
34-
import java.util.HashMap;
35-
import java.util.List;
36-
import java.util.Map;
33+
import java.util.*;
3734
import java.util.regex.Matcher;
3835

3936
public class PageSectionProcessor {
@@ -94,21 +91,21 @@ private void processSectionRule(PageSection section, StructNode ruleNode) throws
9491
List<StructNode> resultingNodes;
9592
try {
9693
resultingNodes = rule.getKey().apply(pageSpecHandler, ruleText, NO_OBJECT_NAME, rule.getValue(), ruleNode.getChildNodes());
94+
processSection(ruleSection, resultingNodes);
9795
} catch (Exception ex) {
98-
throw new SyntaxException(ruleNode, "Error processing custom rule", ex);
96+
throw new SyntaxException(ruleNode, "Error processing rule: " + ruleText, ex);
9997
}
100-
processSection(ruleSection, resultingNodes);
10198
}
10299

103100
private Pair<PageRule, Map<String, String>> findAndProcessRule(String ruleText, StructNode ruleNode) {
104-
List<Pair<Rule, PageRule>> rulePairs = pageSpecHandler.getPageRules();
101+
ListIterator<Pair<Rule, PageRule>> iterator = pageSpecHandler.getPageRules().listIterator(pageSpecHandler.getPageRules().size());
105102
/*
106-
It is important to reverse the rules list so that
103+
It is important to make a reversed iteration over all rules so that
107104
it is possible for the end user to override previously defined rules
108105
*/
109-
Collections.reverse(rulePairs);
110106

111-
for (Pair<Rule, PageRule> rulePair : rulePairs) {
107+
while (iterator.hasPrevious()) {
108+
Pair<Rule, PageRule> rulePair = iterator.previous();
112109
Matcher matcher = rulePair.getKey().getPattern().matcher(ruleText);
113110
if (matcher.matches()) {
114111
int index = 1;
@@ -133,17 +130,21 @@ private void processObjectLevelRule(ObjectSpecs objectSpecs, StructNode sourceNo
133130
String ruleText = sourceNode.getName().substring(1).trim();
134131
Pair<PageRule, Map<String, String>> rule = findAndProcessRule(ruleText, sourceNode);
135132

136-
pageSpecHandler.setGlobalVariable("objectName", objectSpecs.getObjectName(), sourceNode);
133+
try {
134+
pageSpecHandler.setGlobalVariable("objectName", objectSpecs.getObjectName(), sourceNode);
137135

138-
List<StructNode> specNodes = rule.getKey().apply(pageSpecHandler, ruleText, objectSpecs.getObjectName(), rule.getValue(), sourceNode.getChildNodes());
136+
List<StructNode> specNodes = rule.getKey().apply(pageSpecHandler, ruleText, objectSpecs.getObjectName(), rule.getValue(), sourceNode.getChildNodes());
139137

140138

141-
SpecGroup specGroup = new SpecGroup();
142-
specGroup.setName(ruleText);
143-
objectSpecs.addSpecGroup(specGroup);
139+
SpecGroup specGroup = new SpecGroup();
140+
specGroup.setName(ruleText);
141+
objectSpecs.addSpecGroup(specGroup);
144142

145-
for (StructNode specNode : specNodes) {
146-
specGroup.addSpec(pageSpecHandler.getSpecReader().read(specNode.getName(), pageSpecHandler.getContextPath()));
143+
for (StructNode specNode : specNodes) {
144+
specGroup.addSpec(pageSpecHandler.getSpecReader().read(specNode.getName(), pageSpecHandler.getContextPath()));
145+
}
146+
} catch (Exception ex) {
147+
throw new SyntaxException(sourceNode, "Error processing rule: " + ruleText, ex);
147148
}
148149
}
149150

galen-core/src/test/java/com/galenframework/tests/speclang2/pagespec/PageSpecReaderTest.java

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -909,7 +909,13 @@ public void ruleShouldHave_priorityOverRules_thatWereDeclaredFirst() throws IOEx
909909
PageSpec pageSpec = readPageSpec("speclang2/rule-priority.gspec");
910910

911911
assertThat(pageSpec.getSections().size(), is(1));
912-
assertThat(pageSpec.getSections().get(0).getObjects().size(), is(0));
912+
assertThat(pageSpec.getSections().get(0).getObjects().size(), is(1));
913+
assertThat(pageSpec.getSections().get(0).getObjects().get(0).getObjectName(), is("cancel_button"));
914+
assertThat(pageSpec.getSections().get(0).getObjects().get(0).getSpecGroups().size(), is(1));
915+
assertThat(pageSpec.getSections().get(0).getObjects().get(0).getSpecGroups().get(0).getSpecs().size(), is(1));
916+
assertThat(pageSpec.getSections().get(0).getObjects().get(0).getSpecGroups().get(0).getSpecs().get(0).getOriginalText(), is("width 30px"));
917+
918+
913919
assertThat(pageSpec.getSections().get(0).getSections().size(), is(1));
914920
assertThat(pageSpec.getSections().get(0).getSections().get(0).getObjects().size(), is(1));
915921

@@ -919,6 +925,18 @@ public void ruleShouldHave_priorityOverRules_thatWereDeclaredFirst() throws IOEx
919925
assertThat(object.getSpecs().get(0).getOriginalText(), is("width 300px"));
920926
}
921927

928+
@Test(expectedExceptions = FileSyntaxException.class,
929+
expectedExceptionsMessageRegExp = "\\QError processing rule: button is located at the left side inside main_container with 10px margin\\E\\s+\\Qin speclang2/rule-error.gspec:7\\E")
930+
public void shouldThrownInformativeError_whenThereIsProblemParsingTheRule() throws IOException {
931+
readPageSpec("speclang2/rule-error.gspec");
932+
}
933+
934+
@Test(expectedExceptions = FileSyntaxException.class,
935+
expectedExceptionsMessageRegExp = "\\QError processing rule: is located at the left side inside main_container with 10px margin\\E\\s+\\Qin speclang2/rule-error-object-level.gspec:7\\E")
936+
public void shouldThrownInformativeError_whenThereIsProblemParsingTheRule_inObjectLevel() throws IOException {
937+
readPageSpec("speclang2/rule-error-object-level.gspec");
938+
}
939+
922940
@Test(expectedExceptions = FileSyntaxException.class,
923941
expectedExceptionsMessageRegExp = "\\QSpecs cannot have inner blocks\\E\\s+\\Qin speclang2/incorrect/nested-spec.gspec:7\\E")
924942
public void shouldGiveError_whenSpecIsNested_belowAnotherSpec() throws IOException {
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
2+
@rule is located at the %{side} side inside %{parentObject}
3+
inside ${parentObject} 0px ${side}
4+
5+
= Main =
6+
button:
7+
|is located at the left side inside main_container with 10px margin
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
2+
@rule %{item} is located at the %{side} side inside %{parentObject}
3+
${item}:
4+
inside ${parentObject} 0px ${side}
5+
6+
= Main =
7+
|button is located at the left side inside main_container with 10px margin

galen-core/src/test/resources/speclang2/rule-priority.gspec

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,5 +11,15 @@
1111
width 300px
1212

1313

14+
@rule should be small
15+
width 10px
16+
17+
18+
@rule should be small
19+
width 30px
20+
1421
= Main =
1522
|login_button should be big
23+
24+
cancel_button:
25+
|should be small

0 commit comments

Comments
 (0)