Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
Menu
Open sidebar
TASTE
OpenGEODE
Commits
ff7fd00e
Commit
ff7fd00e
authored
Jan 15, 2016
by
Maxime Perrotin
Browse files
Check branch coverage for Real values in decision answers
parent
af066ffb
Changes
3
Hide whitespace changes
Inline
Side-by-side
opengeode/ogParser.py
View file @
ff7fd00e
...
...
@@ -3495,33 +3495,38 @@ def decision(root, parent, context):
continue
covered_ranges
[
ans
].
append
(
ans
.
inputString
)
is_enum
=
True
if
not
q_basic
.
kind
.
startswith
(
'Integer'
):
if
not
q_basic
.
kind
.
startswith
((
'Integer'
,
'Real'
)):
# Check numeric questions - ignore others
continue
# numeric type -> find the range covered by this answer
if
a_basic
.
Min
!=
a_basic
.
Max
:
# Not a constant or a raw number, range is not fix
need_else
=
True
continue
val_a
=
int
(
float
(
a_basic
.
Min
)
)
qmin
,
qmax
=
int
(
float
(
q_basic
.
Min
)
)
,
int
(
float
(
q_basic
.
Max
)
)
val_a
=
float
(
a_basic
.
Min
)
qmin
,
qmax
=
float
(
q_basic
.
Min
),
float
(
q_basic
.
Max
)
# Check the operator to compute the range
reachable
=
True
if
ans
.
openRangeOp
==
ogAST
.
ExprLe
:
# answer <= X means covered range is [min; X]
if
qmin
<=
val_a
:
covered_ranges
[
ans
].
append
((
qmin
,
val_a
))
else
:
reachable
=
False
elif
ans
.
openRangeOp
==
ogAST
.
ExprLt
:
# answer < X means covered range is [min; X[
if
qmin
<
val_a
:
covered_ranges
[
ans
].
append
((
qmin
,
val_a
-
1
))
covered_ranges
[
ans
].
append
((
qmin
,
val_a
-
1
e-10
))
else
:
reachable
=
False
elif
ans
.
openRangeOp
==
ogAST
.
ExprGt
:
# answer > X means covered range is ]X; max]
if
qmax
>
val_a
:
covered_ranges
[
ans
].
append
((
val_a
+
1
,
qmax
))
covered_ranges
[
ans
].
append
((
val_a
+
1
e-10
,
qmax
))
else
:
reachable
=
False
elif
ans
.
openRangeOp
==
ogAST
.
ExprGe
:
# answer >= X means covered range is [X; max]
if
qmax
>=
val_a
:
covered_ranges
[
ans
].
append
((
val_a
,
qmax
))
else
:
...
...
@@ -3532,13 +3537,14 @@ def decision(root, parent, context):
else
:
reachable
=
False
elif
ans
.
openRangeOp
==
ogAST
.
ExprNeq
:
# answer != X means covered range is [min; X[;]X; max]
if
qmin
==
val_a
:
covered_ranges
[
ans
].
append
((
qmin
+
1
,
qmax
))
covered_ranges
[
ans
].
append
((
qmin
+
1
e-10
,
qmax
))
elif
qmax
==
val_a
:
covered_ranges
[
ans
].
append
((
qmin
,
qmax
-
1
))
covered_ranges
[
ans
].
append
((
qmin
,
qmax
-
1
e-10
))
elif
qmin
<
val_a
<
qmax
:
covered_ranges
[
ans
].
append
((
qmin
,
val_a
-
1
))
covered_ranges
[
ans
].
append
((
val_a
+
1
,
qmax
))
covered_ranges
[
ans
].
append
((
qmin
,
val_a
-
1
e-10
))
covered_ranges
[
ans
].
append
((
val_a
+
1
e-10
,
qmax
))
else
:
warnings
.
append
([
'Condition is always true: {} /= {}'
.
format
(
dec
.
inputString
,
...
...
@@ -3582,7 +3588,7 @@ def decision(root, parent, context):
type_name
(
expr
.
right
.
exprType
)
+
') '
+
str
(
err
),
[
ans_x
,
ans_y
],
[]])
q_basic
=
find_basic_type
(
dec
.
question
.
exprType
)
if
not
q_basic
.
kind
.
startswith
(
'Integer'
):
if
not
q_basic
.
kind
.
startswith
(
(
'Integer'
,
'Real'
)
):
continue
# numeric type -> find the range covered by this answer
a0_basic
=
find_basic_type
(
ans
.
closedRange
[
0
].
exprType
)
...
...
@@ -3593,18 +3599,18 @@ def decision(root, parent, context):
# Not a constant or a raw number, range is not fix
need_else
=
True
continue
qmin
,
qmax
=
int
(
float
(
q_basic
.
Min
)
)
,
int
(
float
(
q_basic
.
Max
)
)
a0_val
=
int
(
float
(
a0_basic
.
Min
)
)
a1_val
=
int
(
float
(
a1_basic
.
Max
)
)
qmin
,
qmax
=
float
(
q_basic
.
Min
),
float
(
q_basic
.
Max
)
a0_val
=
float
(
a0_basic
.
Min
)
a1_val
=
float
(
a1_basic
.
Max
)
if
a0_val
<
qmin
:
qwarn
.
append
(
'Decision "{dec}": '
'Range
[
{a0} .. {qmin}
]
is unreachable'
.
format
(
a0
=
a0_val
,
qmin
=
qmin
-
1
,
'Range {a0} .. {qmin} is unreachable'
.
format
(
a0
=
a0_val
,
qmin
=
round
(
qmin
-
1
e-10
,
9
)
,
dec
=
dec
.
inputString
))
if
a1_val
>
qmax
:
qwarn
.
append
(
'Decision "{dec}": '
'Range
[
{qmax} .. {a1}
]
is unreachable'
.
format
(
qmax
=
qmax
+
1
,
a1
=
a1_val
,
'Range {qmax} .. {a1} is unreachable'
.
format
(
qmax
=
round
(
qmax
+
1
e-10
)
,
a1
=
a1_val
,
dec
=
dec
.
inputString
))
if
(
a0_val
<
qmin
and
a1_val
<
qmin
)
or
(
a0_val
>
qmax
and
a1_val
>
qmax
):
...
...
@@ -3612,8 +3618,8 @@ def decision(root, parent, context):
.
format
(
dec
=
dec
.
inputString
,
l
=
a0_val
,
h
=
a1_val
),
[
ans_x
,
ans_y
],
[]])
covered_ranges
[
ans
].
append
((
int
(
float
(
a0_basic
.
Min
)
)
,
int
(
float
(
a1_basic
.
Max
)))
)
covered_ranges
[
ans
].
append
((
float
(
a0_basic
.
Min
),
float
(
a1_basic
.
Max
)))
# Check the following
# (1) no overlap between covered ranges in decision answers
# (2) no gap in the coverage of the decision possible values
...
...
@@ -3633,7 +3639,7 @@ def decision(root, parent, context):
if
comb_overlap
[
0
]
<=
comb_overlap
[
1
]:
# (1) - check for overlaps
qerr
.
append
(
'Decision "{d}": answers {a1} and {a2} '
'are overlapping in range
[
{o1} .. {o2}
]
'
'are overlapping in range {o1} .. {o2}'
.
format
(
d
=
dec
.
inputString
,
a1
=
each
[
0
][
0
].
inputString
,
a2
=
each
[
1
][
0
].
inputString
,
...
...
@@ -3646,8 +3652,8 @@ def decision(root, parent, context):
continue
for
mina
,
maxa
in
ranges
:
for
minq
,
maxq
in
q_ranges
:
left
=
(
minq
,
min
(
maxq
,
mina
-
1
))
right
=
(
max
(
minq
,
maxa
+
1
),
maxq
)
left
=
(
minq
,
min
(
maxq
,
mina
-
1
e-10
))
right
=
(
max
(
minq
,
maxa
+
1
e-10
),
maxq
)
if
mina
>
minq
and
maxa
<
maxq
:
new_q_ranges
.
extend
([
left
,
right
])
elif
mina
<=
minq
and
maxa
>=
maxq
:
...
...
@@ -3659,8 +3665,13 @@ def decision(root, parent, context):
q_ranges
,
new_q_ranges
=
new_q_ranges
,
[]
if
not
has_else
:
for
minq
,
maxq
in
q_ranges
:
qerr
.
append
(
'Decision "{}": No answer to cover range [{} .. {}]'
.
format
(
dec
.
inputString
,
minq
,
maxq
))
low
,
high
=
round
(
minq
,
9
),
round
(
maxq
,
9
)
if
low
==
high
:
txt
=
"value {}"
.
format
(
low
)
else
:
txt
=
"range {} .. {}"
.
format
(
low
,
high
)
qerr
.
append
(
'Decision "{}": No answer to cover {}'
.
format
(
dec
.
inputString
,
txt
))
elif
has_else
and
is_numeric
(
dec
.
question
.
exprType
)
and
not
q_ranges
:
# (3) Check that ELSE branch is reachable
qwarn
.
append
(
'Decision "{}": ELSE branch is unreachable'
...
...
@@ -3684,8 +3695,6 @@ def decision(root, parent, context):
for
en
in
q_basic
.
EnumValues
.
keys
()]
# check for missing answers
if
set
(
answers
)
!=
set
(
enumerants
)
and
not
has_else
:
#print set(answers)
#print set(enumerants)
qerr
.
append
(
'Decision "{}": Missing branches for answer(s) "{}"'
.
format
(
dec
.
inputString
,
'", "'
.
join
(
set
(
enumerants
)
-
set
(
answers
))))
...
...
tests/regression/test-branchcoverage/dataview-uniq.asn
View file @
ff7fd00e
...
...
@@ -13,6 +13,8 @@ T-UInt8 ::= INTEGER (0 .. 255)
T-Boolean ::= BOOLEAN
T-Real ::= REAL (-5.0 .. 100.0)
END
TASTE-Dataview DEFINITIONS ::=
...
...
tests/regression/test-branchcoverage/myfunction.pr
View file @
ff7fd00e
/* CIF PROCESS (200, 143), (150, 75) */
PROCESS myfunction;
/* CIF TEXT (0, 43), (
360
, 41) */
/* CIF TEXT (0, 43), (
449
, 41) */
-- Test the branch coverage checker in decision answers
/* CIF ENDTEXT */
/* CIF TEXT (78, 142), (282,
184
) */
/* CIF TEXT (78, 142), (282,
268
) */
dcl var1 t_Int32 := 0;
dcl var2 t_uint8 := 0;
...
...
@@ -15,114 +15,125 @@ dcl var4 mychoice := a: false;
dcl var5 myenum := hello;
dcl VAR5 mychoice;
dcl var6 T_Real := 5.0;
/* CIF ENDTEXT */
/* CIF START (525, 71), (70, 35) */
START;
/* CIF DECISION (52
5
, 121), (7
0
, 50) */
/* CIF DECISION (52
3
, 121), (7
3
, 50) */
DECISION var1
/* CIF COMMENT (615, 128), (
191
, 35) */
/* CIF COMMENT (615, 128), (
234
, 35) */
COMMENT 'Check range overlapping';
/* CIF ANSWER (366, 191), (
90
, 2
4
) */
/* CIF ANSWER (366, 191), (
108
, 2
8
) */
(-500:500):
/* CIF ANSWER (480, 191), (70, 2
4
) */
/* CIF ANSWER (480, 191), (70, 2
8
) */
(=0):
/* CIF ANSWER (570, 191), (70, 2
4
) */
/* CIF ANSWER (570, 191), (70, 2
8
) */
(/=1):
/* CIF ANSWER (660, 191), (70, 2
4
) */
/* CIF ANSWER (660, 191), (70, 2
8
) */
(>0):
ENDDECISION;
/* CIF DECISION (52
5
, 23
0
), (7
0
, 50) */
/* CIF DECISION (52
3
, 23
4
), (7
3
, 50) */
DECISION var2
/* CIF COMMENT (615, 23
7
), (
241
, 35) */
/* CIF COMMENT (615, 23
5
), (
300
, 35) */
COMMENT 'Check unreachable branch check';
/* CIF ANSWER (385, 30
0
), (5
3
, 33) */
/* CIF ANSWER (385, 30
4
), (5
8
, 33) */
(<0):
/* CIF ANSWER (467, 30
0
), (
6
8, 33) */
/* CIF ANSWER (467, 30
4
), (
7
8, 33) */
(>300):
/* CIF ANSWER (557, 30
0
), (
72
, 33) */
/* CIF ANSWER (557, 30
4
), (
84
, 33) */
(-10:-5):
/* CIF ANSWER (638, 30
0
), (
86
, 2
4
) */
/* CIF ANSWER (638, 30
4
), (
102
, 2
8
) */
(256:300):
ENDDECISION;
/* CIF DECISION (52
4
, 3
48
), (7
1
, 50) */
/* CIF DECISION (52
3
, 3
52
), (7
3
, 50) */
DECISION var3;
/* CIF ANSWER (466, 4
18
), (
71
, 2
4
) */
/* CIF ANSWER (466, 4
22
), (
82
, 2
8
) */
(10:20):
/* CIF ANSWER (570, 4
18
), (7
0
, 2
4
) */
/* CIF ANSWER (570, 4
22
), (7
5
, 2
8
) */
(/=50):
ENDDECISION;
/* CIF DECISION (4
9
8, 45
7
), (1
23
, 50) */
/* CIF DECISION (48
6
, 4
6
5), (1
48
, 50) */
DECISION present(var4)
/* CIF COMMENT (643, 46
4
), (
252
, 35) */
/* CIF COMMENT (643, 46
0
), (
324
, 35) */
COMMENT 'Check coverage of CHOICE answers';
/* CIF ANSWER (527, 5
27
), (66, 34) */
/* CIF ANSWER (527, 5
35
), (66, 34) */
(a):
ENDDECISION;
/* CIF DECISION (523, 5
76
), (74, 50) */
/* CIF DECISION (523, 5
84
), (74, 50) */
DECISION var5
/* CIF COMMENT (611, 57
4
), (
241
, 50) */
/* CIF COMMENT (611, 57
0
), (
302
, 50) */
COMMENT 'Check duplicates and
coverage of ENUMERATED values';
/* CIF ANSWER (390, 64
6
), (7
0
, 2
4
) */
/* CIF ANSWER (390, 6
5
4), (7
6
, 2
8
) */
(hello):
/* CIF ANSWER (466, 64
6
), (
7
2, 2
4
) */
/* CIF ANSWER (466, 6
5
4), (
8
2, 2
8
) */
(world):
/* CIF ANSWER (558, 64
6
), (
7
2, 2
4
) */
/* CIF ANSWER (558, 6
5
4), (
8
2, 2
8
) */
(world):
/* CIF ANSWER (661, 64
6
), (7
0
, 2
4
) */
/* CIF ANSWER (661, 6
5
4), (7
6
, 2
8
) */
(hello):
ENDDECISION;
/* CIF DECISION (52
5
, 6
86
), (7
0
, 50) */
/* CIF DECISION (52
3
, 6
97
), (7
3
, 50) */
DECISION var5
/* CIF COMMENT (615, 6
93
), (2
24
, 35) */
/* CIF COMMENT (615, 6
87
), (2
80
, 35) */
COMMENT 'should be no error due to ELSE';
/* CIF ANSWER (408, 7
5
6), (1
05
, 2
4
) */
/* CIF ANSWER (408, 76
7
), (1
26
, 2
8
) */
(howareyou):
/* CIF ANSWER (608, 7
5
6), (7
0
, 2
4
) */
/* CIF ANSWER (608, 76
7
), (7
1
, 2
8
) */
else:
ENDDECISION;
/* CIF TASK (496, 795), (127, 35) */
/* CIF DECISION (523, 810), (73, 50) */
DECISION var6
/* CIF COMMENT (616, 817), (217, 35) */
COMMENT 'check there is no error';
/* CIF ANSWER (590, 880), (82, 28) */
(<10.0):
/* CIF ANSWER (440, 880), (92, 28) */
(>=10.0):
ENDDECISION;
/* CIF TASK (483, 923), (153, 35) */
TASK var4!uia:= true
/* CIF COMMENT (
630, 79
5), (1
60
, 4
0
) */
/* CIF COMMENT (
839, 91
5), (1
99
, 4
8
) */
COMMENT 'incorrect syntax and
non-existent field';
/* CIF TASK (
500, 845
), (1
20
, 35) */
/* CIF TASK (
488, 973
), (1
44
, 35) */
TASK var4!a := true
/* CIF COMMENT (640,
842
), (1
35
, 40) */
/* CIF COMMENT (640,
947
), (1
66
, 40) */
COMMENT 'incorrect syntax';
/* CIF TASK (4
6
9,
895
), (
180
, 35) */
/* CIF TASK (4
4
9,
1023
), (
222
, 35) */
TASK var5 := howareyou:true;
/* CIF TASK (
50
7,
945
), (1
05
, 35) */
/* CIF TASK (
49
7,
1073
), (1
26
, 35) */
TASK tutu!i!y := 5;
/* CIF NEXTSTATE (525,
995
), (70, 35) */
/* CIF NEXTSTATE (525,
1123
), (70, 35) */
NEXTSTATE wait;
/* CIF STATE (1
320, 193
), (
80
, 35) */
STATE
*(
wait
)
;
/* CIF INPUT (1
273, 248
), (
173
, 35) */
INPUT start_something(var2);
/* CIF NEXTSTATE (1
329, 298
), (70, 35) */
/* CIF STATE (1
125, 294
), (
112
, 35) */
STATE wait
, toto
;
/* CIF INPUT (1
089, 349
), (
218
, 35) */
INPUT start_something
(var2);
/* CIF NEXTSTATE (1
163, 399
), (70, 35) */
NEXTSTATE -;
ENDSTATE;
/* CIF STATE (958, 325), (70, 35) */
STATE *;
/* CIF INPUT (901, 380), (214, 35) */
INPUT start_something(var2);
/* CIF NEXTSTATE (973, 430), (70, 35) */
NEXTSTATE wait;
ENDSTATE;
/* CIF STATE (1215, 52), (70, 35) */
STATE wait;
/* CIF INPUT (1162, 107), (1
3
7, 4
0
) */
/* CIF INPUT (1162, 107), (1
6
7, 4
8
) */
INPUT start_something
(var2);
/* CIF NEXTSTATE (120
3
, 1
62
), (70, 35) */
/* CIF NEXTSTATE (12
1
0, 1
70
), (70, 35) */
NEXTSTATE -;
ENDSTATE;
/* CIF STATE (
958, 325
), (
7
0, 35) */
STATE *;
/* CIF INPUT (
901, 380
), (
173
, 35) */
/* CIF STATE (
1320, 193
), (
9
0, 35) */
STATE *
(wait)
;
/* CIF INPUT (
1273, 248
), (
214
, 35) */
INPUT start_something(var2);
/* CIF NEXTSTATE (958, 430), (70, 35) */
NEXTSTATE wait;
ENDSTATE;
/* CIF STATE (1125, 294), (97, 35) */
STATE wait, toto;
/* CIF INPUT (1089, 349), (178, 35) */
INPUT start_something (var2);
/* CIF NEXTSTATE (1144, 399), (70, 35) */
/* CIF NEXTSTATE (1345, 298), (70, 35) */
NEXTSTATE -;
ENDSTATE;
ENDPROCESS myfunction;
\ No newline at end of file
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment