Skip to content

Commit 1e526e8

Browse files
committed
Run IF branch also if there are parsing errors.
1 parent 2639d80 commit 1e526e8

5 files changed

Lines changed: 75 additions & 56 deletions

File tree

‎atest/robot/running/if/if.resource‎

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@ Resource atest_resource.robot
33

44
*** Keywords ***
55
Check IF/ELSE Status
6-
[Arguments] @{statuses} ${root}=${None} ${index}=0 ${else}=${True} ${run}=${True}
6+
[Arguments] @{statuses} ${types}=${None} ${root}=${None} ${test}=${TEST NAME} ${index}=0 ${else}=${True} ${run}=${True}
77
IF not $root
8-
${tc} = Check Test Case ${TESTNAME}
8+
${tc} = Check Test Case ${test}
99
${root} = Set Variable ${tc.body}[${index}]
1010
END
1111
Should Be Equal ${root.type} IF/ELSE ROOT
@@ -16,14 +16,18 @@ Check IF/ELSE Status
1616
ELSE
1717
Should Be Equal ${root.status} NOT RUN
1818
END
19-
Check Branch Statuses ${root.body} ${statuses} ${else}
19+
Check Branch Statuses ${root.body} ${statuses} ${types} ${else}
2020

2121
Check Branch Statuses
22-
[Arguments] ${branches} ${statuses} ${else}=${True}
23-
IF ${else} and len($branches) > 1
24-
${types} = Evaluate ['IF'] + ['ELSE IF'] * (len($branches) - 2) + ['ELSE']
22+
[Arguments] ${branches} ${statuses} ${types}=${None} ${else}=${True}
23+
IF $types
24+
${types} = Evaluate ${types}
2525
ELSE
26-
${types} = Evaluate ['IF'] + ['ELSE IF'] * (len($branches) - 1)
26+
IF ${else} and len($branches) > 1
27+
${types} = Evaluate ['IF'] + ['ELSE IF'] * (len($branches) - 2) + ['ELSE']
28+
ELSE
29+
${types} = Evaluate ['IF'] + ['ELSE IF'] * (len($branches) - 1)
30+
END
2731
END
2832
Should Be Equal ${{len($branches)}} ${{len($statuses)}}
2933
Should Be Equal ${{len($branches)}} ${{len($types)}}
Lines changed: 44 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,91 +1,98 @@
11
*** Settings ***
22
Suite Setup Run Tests ${EMPTY} running/if/invalid_inline_if.robot
3-
Resource atest_resource.robot
3+
Test Template Check IF/ELSE Status
4+
Resource if.resource
45

56
*** Test Cases ***
67
Invalid condition
7-
Check Test Case ${TESTNAME}
8+
FAIL NOT RUN
9+
10+
Invalid condition with other error
11+
FAIL NOT RUN
812

913
Empty IF
10-
Check Test Case ${TESTNAME}
14+
FAIL
1115

1216
IF without branch
13-
Check Test Case ${TESTNAME}
17+
FAIL
1418

1519
IF without branch with ELSE IF
16-
Check Test Case ${TESTNAME}
20+
FAIL NOT RUN else=False
1721

1822
IF without branch with ELSE
19-
Check Test Case ${TESTNAME}
23+
FAIL NOT RUN
2024

21-
IF follewed by ELSE IF
22-
Check Test Case ${TESTNAME}
25+
IF followed by ELSE IF
26+
FAIL
2327

24-
IF follewed by ELSE
25-
Check Test Case ${TESTNAME}
28+
IF followed by ELSE
29+
FAIL
2630

2731
Empty ELSE IF
28-
Check Test Case ${TESTNAME} 1
29-
Check Test Case ${TESTNAME} 2
32+
FAIL NOT RUN test=${TESTNAME} 1 else=False
33+
NOT RUN FAIL test=${TESTNAME} 2 else=False
3034

3135
ELSE IF without branch
32-
Check Test Case ${TESTNAME} 1
33-
Check Test Case ${TESTNAME} 2
36+
FAIL NOT RUN test=${TESTNAME} 1 else=False
37+
FAIL NOT RUN NOT RUN test=${TESTNAME} 2
3438

3539
Empty ELSE
36-
Check Test Case ${TESTNAME}
40+
FAIL NOT RUN NOT RUN
3741

3842
ELSE IF after ELSE
39-
Check Test Case ${TESTNAME} 1
40-
Check Test Case ${TESTNAME} 2
43+
FAIL NOT RUN NOT RUN types=['IF', 'ELSE', 'ELSE IF'] test=${TESTNAME} 1
44+
FAIL NOT RUN NOT RUN NOT RUN types=['IF', 'ELSE', 'ELSE IF', 'ELSE IF'] test=${TESTNAME} 2
4145

4246
Multiple ELSEs
43-
Check Test Case ${TESTNAME} 1
44-
Check Test Case ${TESTNAME} 2
47+
FAIL NOT RUN NOT RUN types=['IF', 'ELSE', 'ELSE'] test=${TESTNAME} 1
48+
FAIL NOT RUN NOT RUN NOT RUN types=['IF', 'ELSE', 'ELSE', 'ELSE'] test=${TESTNAME} 2
4549

4650
Nested IF
47-
Check Test Case ${TESTNAME} 1
48-
Check Test Case ${TESTNAME} 2
49-
Check Test Case ${TESTNAME} 3
51+
FAIL test=${TESTNAME} 1
52+
FAIL NOT RUN test=${TESTNAME} 2
53+
FAIL test=${TESTNAME} 3
5054

5155
Nested FOR
52-
Check Test Case ${TESTNAME}
56+
FAIL
5357

5458
Unnecessary END
55-
Check Test Case ${TESTNAME}
59+
PASS NOT RUN index=0
60+
NOT RUN FAIL index=1
5661

5762
Assign in IF branch
58-
Check Test Case ${TESTNAME}
63+
FAIL
5964

6065
Assign in ELSE IF branch
61-
Check Test Case ${TESTNAME}
66+
FAIL NOT RUN else=False
6267

6368
Assign in ELSE branch
64-
Check Test Case ${TESTNAME}
69+
FAIL NOT RUN
6570

66-
Invalid assing mark usage
67-
Check Test Case ${TESTNAME}
71+
Invalid assign mark usage
72+
FAIL
6873

6974
Too many list variables in assign
70-
Check Test Case ${TESTNAME}
75+
FAIL NOT RUN
7176

7277
Invalid number of variables in assign
73-
Check Test Case ${TESTNAME}
78+
NOT RUN FAIL
7479

7580
Invalid value for list assign
76-
Check Test Case ${TESTNAME}
81+
FAIL
7782

7883
Invalid value for dict assign
79-
Check Test Case ${TESTNAME}
84+
NOT RUN FAIL
8085

8186
Assign when IF branch is empty
82-
Check Test Case ${TESTNAME}
87+
FAIL
8388

8489
Assign when ELSE IF branch is empty
85-
Check Test Case ${TESTNAME}
90+
FAIL NOT RUN else=False
8691

8792
Assign when ELSE branch is empty
88-
Check Test Case ${TESTNAME}
93+
FAIL NOT RUN
8994

9095
Assign with RETURN
91-
Check Test Case ${TESTNAME}
96+
[Template] NONE
97+
${tc} = Check Test Case ${TESTNAME}
98+
Check IF/ELSE Status FAIL NOT RUN root=${tc.body[0].body[0]}

‎atest/testdata/cli/dryrun/reserved.robot‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ End after valid FOR header
5353
End
5454

5555
End after valid If header
56-
[Documentation] FAIL IF has no closing END.
56+
[Documentation] FAIL 'End' is a reserved keyword. It must be an upper case 'END' and follow an opening 'FOR' or 'IF' when used as a marker.
5757
IF True
5858
No operation
5959
End

‎atest/testdata/running/if/invalid_inline_if.robot‎

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,10 @@ Invalid condition
33
[Documentation] FAIL Evaluating expression 'ooops' failed: NameError: name 'ooops' is not defined nor importable as module
44
IF ooops Not run ELSE Not run either
55

6+
Invalid condition with other error
7+
[Documentation] FAIL ELSE branch cannot be empty.
8+
IF bad Not run ELSE
9+
610
Empty IF
711
[Documentation] FAIL Multiple errors:
812
... - IF has no condition.
@@ -24,11 +28,11 @@ IF without branch with ELSE
2428
[Documentation] FAIL IF branch cannot be empty.
2529
IF True ELSE Not run
2630

27-
IF follewed by ELSE IF
31+
IF followed by ELSE IF
2832
[Documentation] FAIL STARTS: Evaluating expression 'ELSE IF' failed:
2933
IF ELSE IF False Not run
3034

31-
IF follewed by ELSE
35+
IF followed by ELSE
3236
[Documentation] FAIL Evaluating expression 'ELSE' failed: NameError: name 'ELSE' is not defined nor importable as module
3337
IF ELSE Not run
3438

@@ -90,7 +94,8 @@ Nested FOR
9094

9195
Unnecessary END
9296
[Documentation] FAIL Keyword 'BuiltIn.No Operation' expected 0 arguments, got 1.
93-
IF False Not run ELSE No operation END
97+
IF True No operation ELSE Log END
98+
IF False Not run ELSE No operation END
9499

95100
Assign in IF branch
96101
[Documentation] FAIL Inline IF branches cannot contain assignments.
@@ -104,13 +109,13 @@ Assign in ELSE branch
104109
[Documentation] FAIL Inline IF branches cannot contain assignments.
105110
IF False Keyword ELSE ${x} = Whatever
106111

107-
Invalid assing mark usage
112+
Invalid assign mark usage
108113
[Documentation] FAIL Assign mark '=' can be used only with the last variable.
109114
${x} = ${y} IF True Create list x y
110115

111116
Too many list variables in assign
112117
[Documentation] FAIL Assignment can contain only one list variable.
113-
@{x} @{y} = IF True Create list x y
118+
@{x} @{y} = IF True Create list x y ELSE Not run
114119

115120
Invalid number of variables in assign
116121
[Documentation] FAIL Cannot set variables: Expected 2 return values, got 3.

‎src/robot/running/bodyrunner.py‎

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -106,17 +106,20 @@ def _dry_run_recursion_detection(self, data):
106106

107107
def _run_if_branch(self, branch, recursive_dry_run=False, error=None):
108108
result = IfBranchResult(branch.type, branch.condition)
109-
try:
110-
run_branch = self._should_run_branch(branch.condition, recursive_dry_run)
111-
except:
112-
error = get_error_message()
109+
if error:
113110
run_branch = False
111+
else:
112+
try:
113+
run_branch = self._should_run_branch(branch.condition, recursive_dry_run)
114+
except:
115+
error = get_error_message()
116+
run_branch = False
114117
with StatusReporter(branch, result, self._context, run_branch):
115-
if error and self._run:
116-
raise DataError(error)
117118
runner = BodyRunner(self._context, run_branch, self._templated)
118119
if not recursive_dry_run:
119120
runner.run(branch.body)
121+
if error and self._run:
122+
raise DataError(error)
120123
return run_branch
121124

122125
def _should_run_branch(self, condition, recursive_dry_run=False):

0 commit comments

Comments
 (0)