Skip to content

Commit ccc256e

Browse files
committed
! improve/cleanup unit test of parseOpts
1 parent 513a869 commit ccc256e

File tree

3 files changed

+134
-88
lines changed

3 files changed

+134
-88
lines changed

docs/shell.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,7 @@ B.java
197197
# 把参数按行输出方便查看 或是 grep
198198
$ a2l **/*.sh
199199
lib/console-text-color-themes.sh
200-
test-cases/parseOpts-test.sh
200+
test-cases/parseOpts_test.sh
201201
test-cases/self-installer.sh
202202
...
203203
```

test-cases/my_unit_test_lib.sh

Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
#!/bin/bash
2+
# unit test lib
3+
4+
#################################################
5+
# commons functions
6+
#################################################
7+
8+
# NOTE: $'foo' is the escape sequence syntax of bash
9+
readonly __ut_ec=$'\033' # escape char
10+
readonly __ut_eend=$'\033[0m' # escape end
11+
12+
__ut_colorEcho() {
13+
local color=$1
14+
shift
15+
# if stdout is console, turn on color output.
16+
[ -t 1 ] && echo "${__ut_ec}[1;${color}m$*$__ut_eend" || echo "$*"
17+
}
18+
19+
redEcho() {
20+
__ut_colorEcho 31 "$@"
21+
}
22+
23+
greenEcho() {
24+
__ut_colorEcho 32 "$@"
25+
}
26+
27+
yellowEcho() {
28+
__ut_colorEcho 33 "$@"
29+
}
30+
31+
blueEcho() {
32+
__ut_colorEcho 34 "$@"
33+
}
34+
35+
fail() {
36+
redEcho "TEST FAIL: $*"
37+
exit 1
38+
}
39+
40+
die() {
41+
redEcho "Error: $*" 1>&2
42+
exit 1
43+
}
44+
45+
#################################################
46+
# assertion functions
47+
#################################################
48+
49+
assertArrayEquals() {
50+
(($# == 2 || $# == 3)) || die "assertArrayEquals must 2 or 3 arguments!"
51+
local failMsg=""
52+
(($# == 3)) && {
53+
failMsg=$1
54+
shift
55+
}
56+
57+
local a1PlaceHolder="$1[@]"
58+
local a2PlaceHolder="$2[@]"
59+
local a1=("${!a1PlaceHolder}")
60+
local a2=("${!a2PlaceHolder}")
61+
62+
[ ${#a1[@]} -eq ${#a2[@]} ] || fail "assertArrayEquals array length [${#a1[@]}] != [${#a2[@]}]${failMsg:+: $failMsg}"
63+
64+
local i
65+
for ((i = 0; i < ${#a1[@]}; i++)); do
66+
[ "${a1[$i]}" = "${a2[$i]}" ] || fail "assertArrayEquals fail element $i: [${a1[$i]}] != [${a2[$i]}]${failMsg:+: $failMsg}"
67+
done
68+
}
69+
70+
assertEquals() {
71+
(($# == 2 || $# == 3)) || die "assertEqual must 2 or 3 arguments!"
72+
local failMsg=""
73+
(($# == 3)) && {
74+
failMsg=$1
75+
shift
76+
}
77+
[ "$1" = "$2" ] || fail "assertEqual fail [$1] != [$2]${failMsg:+: $failMsg}"
78+
}
79+
80+
assertAllVarsSame() {
81+
local test_afterVars
82+
test_afterVars=$(declare)
83+
84+
diff \
85+
<(echo "$test_beforeVars" | grep -v '^BASH_\|^_=') \
86+
<(echo "$test_afterVars" | grep -v '^BASH_\|^_=\|^FUNCNAME=\|^test_') ||
87+
fail "assertAllVarsSame: Unexpected extra global vars!"
88+
}
89+
90+
assertAllVarsExcludeOptVarsSame() {
91+
local test_afterVars
92+
test_afterVars=$(declare)
93+
94+
diff \
95+
<(echo "$test_beforeVars" | grep -v '^BASH_\|^_=') \
96+
<(echo "$test_afterVars" | grep -v '^BASH_\|^_=\|^FUNCNAME=\|^test_\|^_OPT_\|^_opts_index_name_') ||
97+
fail "assertAllVarsExcludeOptVarsSame: Unexpected extra global vars!"
98+
}
99+
100+
test_beforeVars=$(declare)
Lines changed: 33 additions & 87 deletions
Original file line numberDiff line numberDiff line change
@@ -1,76 +1,15 @@
11
#!/bin/bash
22

3-
BASE=`dirname $0`
3+
BASE="$(dirname "${BASH_SOURCE[0]}")"
44

5-
. $BASE/../lib/parseOpts.sh
5+
source "$BASE/../lib/parseOpts.sh"
66

7-
8-
#################################################
9-
# Util Functions
10-
#################################################
11-
12-
# NOTE: $'foo' is the escape sequence syntax of bash
13-
readonly ec=$'\033' # escape char
14-
readonly eend=$'\033[0m' # escape end
15-
16-
colorEcho() {
17-
local color=$1
18-
shift
19-
# if stdout is console, turn on color output.
20-
[ -t 1 ] && echo "${ec}[1;${color}m$*$eend" || echo "$*"
21-
}
22-
23-
redEcho() {
24-
colorEcho 31 "$@"
25-
}
26-
27-
greenEcho() {
28-
colorEcho 32 "$@"
29-
}
30-
31-
yellowEcho() {
32-
colorEcho 33 "$@"
33-
}
34-
35-
blueEcho() {
36-
colorEcho 34 "$@"
37-
}
38-
39-
arrayEquals() {
40-
local a1PlaceHolder="$1[@]"
41-
local a2PlaceHolder="$2[@]"
42-
local a1=("${!a1PlaceHolder}")
43-
local a2=("${!a2PlaceHolder}")
44-
45-
[ ${#a1[@]} -eq ${#a2[@]} ] || return 1
46-
47-
local i
48-
for((i=0; i<${#a1[@]}; i++)); do
49-
[ "${a1[$i]}" = "${a2[$i]}" ] || return 1
50-
done
51-
}
52-
53-
compareAllVars() {
54-
local test_afterVars=`declare`
55-
diff <(echo "$test_beforeVars" | grep -v '^BASH_\|^_=') <(echo "$test_afterVars" | grep -v '^BASH_\|^_=\|^FUNCNAME=\|^test_')
56-
}
57-
58-
compareAllVarsExcludeOptVars() {
59-
local test_afterVars=`declare`
60-
diff <(echo "$test_beforeVars" | grep -v '^BASH_\|^_=') <(echo "$test_afterVars" | grep -v '^BASH_\|^_=\|^FUNCNAME=\|^test_\|^_OPT_\|^_opts_index_name_')
61-
}
62-
63-
fail() {
64-
redEcho "TEST FAIL: $*"
65-
exit 1
66-
}
7+
source "$BASE/my_unit_test_lib.sh"
678

689
#################################################
6910
# Test
7011
#################################################
7112

72-
test_beforeVars=`declare`
73-
7413
# ========================================
7514
blueEcho "Test case: success parse"
7615
# ========================================
@@ -82,18 +21,25 @@ _opts_showOptValueInfoList
8221

8322
[ $test_exitCode -eq 0 ] || fail "Wrong exit code!"
8423
[ ${#_OPT_INFO_LIST_INDEX[@]} -eq 4 ] || fail "Wrong _OPT_INFO_LIST_INDEX!"
85-
[ $_OPT_VALUE_a = "true" ] && [ $_OPT_VALUE_a_long = "true" ] || fail "Wrong option value of a!"
24+
25+
[ $_OPT_VALUE_a = "true" ] && [ $_OPT_VALUE_a_long = "true" ] || fail "Wrong option value of a!"
8626
[ $_OPT_VALUE_b = "bb" ] && [ $_OPT_VALUE_b_long = "bb" ] || fail "Wrong option value of b!"
27+
8728
test_cArray=(c.sh -p pv -q qv cc)
88-
arrayEquals test_cArray _OPT_VALUE_c && arrayEquals test_cArray _OPT_VALUE_c_long || fail "Wrong option value of c!"
89-
test_dArray=(d.sh -x xv d1 d2 d3 )
90-
arrayEquals test_dArray _OPT_VALUE_d && arrayEquals test_dArray _OPT_VALUE_d_long || fail "Wrong option value of d!"
29+
assertArrayEquals "Wrong option value of c!" test_cArray _OPT_VALUE_c
30+
assertArrayEquals "Wrong option value of c!" test_cArray _OPT_VALUE_c_long
31+
32+
test_dArray=(d.sh -x xv d1 d2 d3)
33+
assertArrayEquals "Wrong option value of d!" test_dArray _OPT_VALUE_d
34+
assertArrayEquals "Wrong option value of d!" test_dArray _OPT_VALUE_d_long
35+
9136
test_argArray=(aa bb cc dd ee)
92-
arrayEquals test_argArray _OPT_ARGS || fail "Wrong args!"
37+
assertArrayEquals "Wrong args!" test_argArray _OPT_ARGS
38+
39+
assertAllVarsExcludeOptVarsSame
9340

94-
compareAllVarsExcludeOptVars || fail "Unpected extra glable vars!"
9541
_opts_cleanOptValueInfoList
96-
compareAllVars || fail "Unpected extra glable vars!"
42+
assertAllVarsSame
9743

9844
# ========================================
9945
blueEcho "Test case: success parse with -- "
@@ -106,18 +52,23 @@ _opts_showOptValueInfoList
10652

10753
[ $test_exitCode -eq 0 ] || fail "Wrong exit code!"
10854
[ ${#_OPT_INFO_LIST_INDEX[@]} -eq 4 ] || fail "Wrong _OPT_INFO_LIST_INDEX!"
109-
[ $_OPT_VALUE_a = "true" ] && [ $_OPT_VALUE_a_long = "true" ] || fail "Wrong option value of a!"
55+
56+
[ $_OPT_VALUE_a = "true" ] && [ $_OPT_VALUE_a_long = "true" ] || fail "Wrong option value of a!"
11057
[ $_OPT_VALUE_b = "bb" ] && [ $_OPT_VALUE_b_long = "bb" ] || fail "Wrong option value of b!"
58+
11159
test_cArray=(c.sh -p pv -q qv cc)
112-
arrayEquals test_cArray _OPT_VALUE_c && arrayEquals test_cArray _OPT_VALUE_c_long || fail "Wrong option value of c!"
60+
assertArrayEquals "Wrong option value of c!" test_cArray _OPT_VALUE_c
61+
assertArrayEquals "Wrong option value of c!" test_cArray _OPT_VALUE_c_long
62+
11363
[ "$_OPT_VALUE_d" = "" ] && [ "$_OPT_VALUE_d_long" = "" ] || fail "Wrong option value of d!"
64+
11465
test_argArray=(aa bb --d-long d.sh -x xv d1 d2 d3 \; cc dd ee)
115-
arrayEquals test_argArray _OPT_ARGS || fail "Wrong args!"
66+
assertArrayEquals "Wrong args!" test_argArray _OPT_ARGS
11667

117-
compareAllVarsExcludeOptVars || fail "Unpected extra glable vars!"
118-
_opts_cleanOptValueInfoList
119-
compareAllVars || fail "Unpected extra glable vars!"
68+
assertAllVarsExcludeOptVarsSame
12069

70+
_opts_cleanOptValueInfoList
71+
assertAllVarsSame
12172

12273
# ========================================
12374
blueEcho "Test case: illegal option x"
@@ -130,14 +81,12 @@ _opts_showOptValueInfoList
13081

13182
[ $test_exitCode -eq 232 ] || fail "Wrong exit code!"
13283
[ ${#_OPT_INFO_LIST_INDEX[@]} -eq 0 ] || fail "Wrong _OPT_INFO_LIST_INDEX!"
133-
[ "$_OPT_VALUE_a" = "" ] && [ "$_OPT_VALUE_a_long" = "" ] || fail "Wrong option value of a!"
84+
[ "$_OPT_VALUE_a" = "" ] && [ "$_OPT_VALUE_a_long" = "" ] || fail "Wrong option value of a!"
13485
[ "$_OPT_VALUE_b" = "" ] && [ "$_OPT_VALUE_b_long" = "" ] || fail "Wrong option value of b!"
13586
[ "$_OPT_VALUE_c" = "" ] && [ "$_OPT_VALUE_c_long" = "" ] || fail "Wrong option value of c!"
13687
[ "$_OPT_VALUE_d" = "" ] && [ "$_OPT_VALUE_d_long" = "" ] || fail "Wrong option value of d!"
13788
[ "$_OPT_ARGS" = "" ] || fail "Wrong args!"
13889

139-
140-
14190
# ========================================
14291
blueEcho "Test case: empty options"
14392
# ========================================
@@ -149,14 +98,12 @@ _opts_showOptValueInfoList
14998

15099
[ $test_exitCode -eq 0 ] || fail "Wrong exit code!"
151100
[ ${#_OPT_INFO_LIST_INDEX[@]} -eq 4 ] || fail "Wrong _OPT_INFO_LIST_INDEX!"
152-
[ "$_OPT_VALUE_a" = "" ] && [ "$_OPT_VALUE_a_long" = "" ] || fail "Wrong option value of a!"
101+
[ "$_OPT_VALUE_a" = "" ] && [ "$_OPT_VALUE_a_long" = "" ] || fail "Wrong option value of a!"
153102
[ "$_OPT_VALUE_b" = "" ] && [ "$_OPT_VALUE_b_long" = "" ] || fail "Wrong option value of b!"
154103
[ "$_OPT_VALUE_c" = "" ] && [ "$_OPT_VALUE_c_long" = "" ] || fail "Wrong option value of c!"
155104
[ "$_OPT_VALUE_d" = "" ] && [ "$_OPT_VALUE_d_long" = "" ] || fail "Wrong option value of d!"
156105
[ "$_OPT_ARGS" = "" ] || fail "Wrong args!"
157106

158-
159-
160107
# ========================================
161108
blueEcho "Test case: illegal option name"
162109
# ========================================
@@ -168,26 +115,25 @@ _opts_showOptValueInfoList
168115

169116
[ $test_exitCode -eq 221 ] || fail "Wrong exit code!"
170117
[ ${#_OPT_INFO_LIST_INDEX[@]} -eq 0 ] || fail "Wrong _OPT_INFO_LIST_INDEX!"
171-
[ "$_OPT_VALUE_a" = "" ] && [ "$_OPT_VALUE_a_long" = "" ] || fail "Wrong option value of a!"
118+
[ "$_OPT_VALUE_a" = "" ] && [ "$_OPT_VALUE_a_long" = "" ] || fail "Wrong option value of a!"
172119
[ "$_OPT_VALUE_b" = "" ] && [ "$_OPT_VALUE_b_long" = "" ] || fail "Wrong option value of b!"
173120
[ "$_OPT_VALUE_c" = "" ] && [ "$_OPT_VALUE_c_long" = "" ] || fail "Wrong option value of c!"
174121
[ "$_OPT_VALUE_d" = "" ] && [ "$_OPT_VALUE_d_long" = "" ] || fail "Wrong option value of d!"
175122
[ "$_OPT_ARGS" = "" ] || fail "Wrong args!"
176123

177-
178124
parseOpts "a,a-long|b,b-long:|c,c-long+|d,d-long+|z,z-#long" aa -a -b bb -x -c c.sh -p pv -q qv cc \; bb -d d.sh -x xv d1 d2 d3 \; cc -- dd ee
179125
test_exitCode=$?
180126
_opts_showOptDescInfoList
181127
_opts_showOptValueInfoList
182128

183129
[ $test_exitCode -eq 222 ] || fail "Wrong exit code!"
184130
[ ${#_OPT_INFO_LIST_INDEX[@]} -eq 0 ] || fail "Wrong _OPT_INFO_LIST_INDEX!"
185-
[ "$_OPT_VALUE_a" = "" ] && [ "$_OPT_VALUE_a_long" = "" ] || fail "Wrong option value of a!"
131+
[ "$_OPT_VALUE_a" = "" ] && [ "$_OPT_VALUE_a_long" = "" ] || fail "Wrong option value of a!"
186132
[ "$_OPT_VALUE_b" = "" ] && [ "$_OPT_VALUE_b_long" = "" ] || fail "Wrong option value of b!"
187133
[ "$_OPT_VALUE_c" = "" ] && [ "$_OPT_VALUE_c_long" = "" ] || fail "Wrong option value of c!"
188134
[ "$_OPT_VALUE_d" = "" ] && [ "$_OPT_VALUE_d_long" = "" ] || fail "Wrong option value of d!"
189135
[ "$_OPT_ARGS" = "" ] || fail "Wrong args!"
190136

191-
compareAllVars || fail "Unpected extra glable vars!"
137+
assertAllVarsSame
192138

193139
greenEcho "TEST SUCCESS!!!"

0 commit comments

Comments
 (0)