|
@@ -18,6 +18,11 @@ shellfu import termcolors
|
18
|
18
|
# included within the log, see BEHAVIOR EVIDENCE ID section for more
|
19
|
19
|
# details.
|
20
|
20
|
#
|
|
21
|
+# * `-c CASEID` Case ID; together with $JAT__TESTID can be used to
|
|
22
|
+# uniquely identify a particular test case, with granularity up to
|
|
23
|
+# single assert. CASEID set here is joined with any CASEIDs set
|
|
24
|
+# by active phase.
|
|
25
|
+#
|
21
|
26
|
# * `-h HINT` Human-readable description used to describe meaning of
|
22
|
27
|
# the assertion to reader. Note that HINT should be worded in such
|
23
|
28
|
# way that it makes claim about the reality that matches expectation.
|
|
@@ -28,6 +33,10 @@ shellfu import termcolors
|
28
|
33
|
#
|
29
|
34
|
# * `-C DIR` Change to directory DIR for duration of the phase.
|
30
|
35
|
#
|
|
36
|
+# * `-c CASEID` Inherit CASEID as Case ID to all asserts in this
|
|
37
|
+# phase. Individual asserts can extend the final case id for
|
|
38
|
+# extra granularity and profit.
|
|
39
|
+#
|
31
|
40
|
#
|
32
|
41
|
# STRINGS
|
33
|
42
|
# =======
|
|
@@ -149,6 +158,7 @@ jat__cmd() {
|
149
|
158
|
local __jat__o_es=0
|
150
|
159
|
local __jat__hint
|
151
|
160
|
local __jat__beids=()
|
|
161
|
+ local __jat__caseid
|
152
|
162
|
local __jat__etype=TEST_ERROR
|
153
|
163
|
local __jat__r_out
|
154
|
164
|
local __jat__r_err
|
|
@@ -159,6 +169,7 @@ jat__cmd() {
|
159
|
169
|
#
|
160
|
170
|
while true; do case $1 in
|
161
|
171
|
-b) __jat__beids+=("$2"); shift 2 || { __jat__usage "missing BEID"; return 2; } ;;
|
|
172
|
+ -c) __jat__caseid="$2"; shift 2 || { __jat__usage "missing CASEID"; return 2; } ;;
|
162
|
173
|
-h) __jat__hint=$2; shift 2 || { __jat__usage "missing HINT"; return 2; } ;;
|
163
|
174
|
-e) __jat__r_err=$2; shift 2 || { __jat__usage "missing R_ERR"; return 2; } ;;
|
164
|
175
|
-o) __jat__r_out=$2; shift 2 || { __jat__usage "missing R_OUT"; return 2; } ;;
|
|
@@ -188,7 +199,7 @@ jat__cmd() {
|
188
|
199
|
else
|
189
|
200
|
__jat__etype=FAIL
|
190
|
201
|
fi
|
191
|
|
- __jat__assert $__jat__etype "$__jat__hint" "${__jat__beids[@]}" \
|
|
202
|
+ __jat__assert $__jat__etype "$__jat__hint" "$__jat__caseid" "${__jat__beids[@]}" \
|
192
|
203
|
-- "t.cmd=${__jat__cmd[*]}" "o.es_expr=$__jat__o_es" "r.es=$__jat__r_es"
|
193
|
204
|
return "$__jat__r_es"
|
194
|
205
|
}
|
|
@@ -218,10 +229,12 @@ jat__cmp() {
|
218
|
229
|
local Op # operator
|
219
|
230
|
local OVal # "oracle" value
|
220
|
231
|
local hint # log hint
|
|
232
|
+ local caseid # case id
|
221
|
233
|
local beids=() # Behavior Evidence IDs
|
222
|
234
|
local cmpes # comparison exit status
|
223
|
235
|
while true; do case $1 in
|
224
|
236
|
-b) beids+=("$2"); shift 2 || { __jat__usage "missing BEID"; return 2; } ;;
|
|
237
|
+ -c) caseid="$2"; shift 2 || { __jat__usage "missing CASEID"; return 2; } ;;
|
225
|
238
|
-h) hint=$2; shift 2 || { __jat__usage "missing HINT"; return 2; } ;;
|
226
|
239
|
*) break ;;
|
227
|
240
|
esac done
|
|
@@ -234,11 +247,11 @@ jat__cmp() {
|
234
|
247
|
__jat__cmp_match; cmpes=$?
|
235
|
248
|
case $cmpes in
|
236
|
249
|
0)
|
237
|
|
- __jat__assert PASS "$hint" "${beids[@]}" \
|
|
250
|
+ __jat__assert PASS "$hint" "$caseid" "${beids[@]}" \
|
238
|
251
|
-- "r.val=$RVal" "t.op=$Op" "o.val=$OVal"
|
239
|
252
|
;;
|
240
|
253
|
1)
|
241
|
|
- __jat__assert FAIL "$hint" "${beids[@]}" \
|
|
254
|
+ __jat__assert FAIL "$hint" "$caseid" "${beids[@]}" \
|
242
|
255
|
-- "r.val=$RVal" "t.op=$Op" "o.val=$OVal"
|
243
|
256
|
;;
|
244
|
257
|
*)
|
|
@@ -278,6 +291,7 @@ jat__eval() {
|
278
|
291
|
# call is incomplete, the exit status will be 2. If there is syntax error
|
279
|
292
|
# in CODE, the exit status will be 3.
|
280
|
293
|
#
|
|
294
|
+ local __jat__caseid
|
281
|
295
|
local __jat__code=""
|
282
|
296
|
local __jat__r_es
|
283
|
297
|
local __jat__r_esf
|
|
@@ -291,6 +305,7 @@ jat__eval() {
|
291
|
305
|
#
|
292
|
306
|
while true; do case $1 in
|
293
|
307
|
-b) __jat__beids+=("$2"); shift 2 || { __jat__usage "missing BEID"; return 2; } ;;
|
|
308
|
+ -c) __jat__caseid="$2"; shift 2 || { __jat__usage "missing CASEID"; return 2; } ;;
|
294
|
309
|
-h) __jat__hint=$2; shift 2 || { __jat__usage "missing HINT"; return 2; } ;;
|
295
|
310
|
-s) __jat__r_esf=$2; shift 2 || { __jat__usage "missing R_ESF"; return 2; } ;;
|
296
|
311
|
-S) __jat__o_es=$2; shift 2 || { __jat__usage "missing ES_EXPR"; return 2; } ;;
|
|
@@ -318,7 +333,7 @@ jat__eval() {
|
318
|
333
|
else
|
319
|
334
|
__jat__etype=FAIL
|
320
|
335
|
fi
|
321
|
|
- __jat__assert $__jat__etype "$__jat__hint" "${__jat__beids[@]}" \
|
|
336
|
+ __jat__assert $__jat__etype "$__jat__hint" "$__jat__caseid" "${__jat__beids[@]}" \
|
322
|
337
|
-- "t.code=$__jat__code" "o.es_expr=$__jat__o_es" "r.es=$__jat__r_es"
|
323
|
338
|
return "$__jat__r_es"
|
324
|
339
|
}
|
|
@@ -338,15 +353,17 @@ jat__fail() {
|
338
|
353
|
# See COMMON ARGUMENTS section for common assert options.
|
339
|
354
|
#
|
340
|
355
|
local hint # log hint
|
|
356
|
+ local caseid # case ID
|
341
|
357
|
local beids=() # Behavior Evidence IDs
|
342
|
358
|
while true; do case $1 in
|
343
|
359
|
-b) beids+=("$2"); shift 2 || { __jat__usage "missing BEID"; return 2; } ;;
|
|
360
|
+ -c) caseid="$2"; shift 2 || { __jat__usage "missing CASEID"; return 2; } ;;
|
344
|
361
|
-h) hint=$2; shift 2 || { __jat__usage "missing HINT"; return 2; } ;;
|
345
|
362
|
*) break ;;
|
346
|
363
|
esac done
|
347
|
364
|
test -n "$1" && { __jat__usage "extra arguments: $*"; return 2; }
|
348
|
365
|
debug -v hint beids
|
349
|
|
- __jat__assert FAIL "$hint" "${beids[@]}"
|
|
366
|
+ __jat__assert FAIL "$hint" "$caseid" "${beids[@]}"
|
350
|
367
|
}
|
351
|
368
|
|
352
|
369
|
jat__filebackup() {
|
|
@@ -536,14 +553,16 @@ jat__pass() {
|
536
|
553
|
#
|
537
|
554
|
local hint # log hint
|
538
|
555
|
local beids=() # Behavior Evidence IDs
|
|
556
|
+ local caseid # case ID
|
539
|
557
|
while true; do case $1 in
|
540
|
558
|
-b) beids+=("$2"); shift 2 || { __jat__usage "missing BEID"; return 2; } ;;
|
|
559
|
+ -c) caseid="$2"; shift 2 || { __jat__usage "missing CASEID"; return 2; } ;;
|
541
|
560
|
-h) hint=$2; shift 2 || { __jat__usage "missing HINT"; return 2; } ;;
|
542
|
561
|
*) break ;;
|
543
|
562
|
esac done
|
544
|
563
|
test -n "$1" && { __jat__usage "extra arguments: $*"; return 2; }
|
545
|
564
|
debug -v hint beids
|
546
|
|
- __jat__assert PASS "$hint" "${beids[@]}"
|
|
565
|
+ __jat__assert PASS "$hint" "$caseid" "${beids[@]}"
|
547
|
566
|
}
|
548
|
567
|
|
549
|
568
|
jat__promise_asserts() {
|
|
@@ -555,7 +574,7 @@ jat__promise_asserts() {
|
555
|
574
|
__jat__usage "no NUM?"
|
556
|
575
|
return 2
|
557
|
576
|
}
|
558
|
|
- __jat__log_event PROMISE "assert number: $num" \
|
|
577
|
+ __jat__log_event PROMISE "assert number: $num" "" \
|
559
|
578
|
-- "num=$num"
|
560
|
579
|
}
|
561
|
580
|
|
|
@@ -576,7 +595,7 @@ jat__sinit() {
|
576
|
595
|
export JAT__YLOG
|
577
|
596
|
debug -v reload __JAT__SDIR
|
578
|
597
|
if $reload; then
|
579
|
|
- __jat__log_event SINFO "reloaded session" \
|
|
598
|
+ __jat__log_event SINFO "reloaded session" "" \
|
580
|
599
|
-- \
|
581
|
600
|
"JAT__LOG_FMT=$__JAT__LOG_FMT" \
|
582
|
601
|
"JAT__VERSION=$__JAT__SELF_VERSION"
|
|
@@ -790,7 +809,7 @@ __jat__log_event() {
|
790
|
809
|
#
|
791
|
810
|
# Usage:
|
792
|
811
|
#
|
793
|
|
- # __jat__log_event ETYPE HINT [BEID].. -- [KEY=VALUE]..
|
|
812
|
+ # __jat__log_event ETYPE HINT CASEID [BEID].. -- [KEY=VALUE]..
|
794
|
813
|
#
|
795
|
814
|
# ETYPE can be FAIL, PASS, TEST_ERROR or SINFO (the latter two
|
796
|
815
|
# are for events unrelated to SUT, like internal errors or
|
|
@@ -807,13 +826,19 @@ __jat__log_event() {
|
807
|
826
|
# is relevant to test method, result or oracle, respectively.
|
808
|
827
|
local etype=$1; shift
|
809
|
828
|
local hint=$1; shift
|
|
829
|
+ local acaseid=$1; shift
|
810
|
830
|
local arg
|
811
|
831
|
local beids=()
|
812
|
832
|
local pairs=()
|
813
|
833
|
local real_beids=()
|
|
834
|
+ local caseid="$JAT__TESTID"
|
|
835
|
+ local pcaseid
|
814
|
836
|
local reading=beids
|
815
|
837
|
local pair
|
816
|
838
|
local origin=${FUNCNAME[1]}
|
|
839
|
+ pcaseid=$(__jat__sd_keyR P.caseid)
|
|
840
|
+ test -n "$pcaseid" && caseid+=":$pcaseid"
|
|
841
|
+ test -n "$acaseid" && caseid+=":$acaseid"
|
817
|
842
|
case $etype in
|
818
|
843
|
PASS|FAIL|SINFO|TEST_ERROR|TEST_WARNING|PROMISE) : ;;
|
819
|
844
|
*) __jat__show_error "bad ETYPE, changing to TEST_ERROR: $etype"
|
|
@@ -882,6 +907,7 @@ __jat__log_event() {
|
882
|
907
|
echo " origin: $origin"
|
883
|
908
|
echo " etype: $etype"
|
884
|
909
|
echo " stamp: $(__jat__newstamp)"
|
|
910
|
+ echo " caseid: $caseid"
|
885
|
911
|
__jat__yamls hint "$hint"
|
886
|
912
|
__jat__yamla beids "${real_beids[@]}"
|
887
|
913
|
__jat__yamld data "${pairs[@]}"
|
|
@@ -919,9 +945,11 @@ __jat__pstart() {
|
919
|
945
|
local type # phase name
|
920
|
946
|
local name # ^^ name
|
921
|
947
|
local pdir # ^^ directory
|
|
948
|
+ local pcaseid # ^^ case id, if assigned
|
922
|
949
|
local oldphase # current phase id
|
923
|
950
|
while true; do case $1 in
|
924
|
951
|
-t) type="$2"; shift 2 || return 2 ;;
|
|
952
|
+ -c) pcaseid="$2"; shift 2 || return 2 ;;
|
925
|
953
|
-C) pdir="$2"; shift 2 || return 2 ;;
|
926
|
954
|
*) break ;;
|
927
|
955
|
esac done
|
|
@@ -935,6 +963,7 @@ __jat__pstart() {
|
935
|
963
|
__jat__sd_keyw phase "$(__jat__bumpid phasid)"
|
936
|
964
|
__jat__sd_keyw P.type "$type"
|
937
|
965
|
__jat__sd_keyw P.name "$name"
|
|
966
|
+ __jat__sd_keyw P.caseid "$pcaseid"
|
938
|
967
|
__jat__show_pstart "$name"
|
939
|
968
|
__jat__log_event SINFO
|
940
|
969
|
test -n "$pdir" && {
|
|
@@ -1168,7 +1197,7 @@ __jat__usage() {
|
1168
|
1197
|
for patt in "${patts[@]}"; do
|
1169
|
1198
|
__jat__show_error "usage: $parent $patt"
|
1170
|
1199
|
done
|
1171
|
|
- __jat__log_event TEST_ERROR "bad usage: $parent()" \
|
|
1200
|
+ __jat__log_event TEST_ERROR "bad usage: $parent()" "" \
|
1172
|
1201
|
-- "PATTERNS=${patts[*]}"
|
1173
|
1202
|
}
|
1174
|
1203
|
|