blob: d79a042913bab76f6d0cc096f8a00ed03562fee9 [file] [log] [blame]
kate.wardf51c6162008-06-17 16:38:35 +00001#! /bin/sh
2# vim:et:ft=sh:sts=2:sw=2
3#
kate.wardf51c6162008-06-17 16:38:35 +00004# shFlags unit test for the flag definition methods
5#
6# TODO(kward): assert on FLAGS errors
kate.wardc5210682009-03-30 18:54:36 +00007# TODO(kward): testNonStandardIFS()
kate.wardf51c6162008-06-17 16:38:35 +00008
kate.wardc66a5fc2013-01-12 23:10:15 +00009# exit immediately if a pipeline or subshell exits with a non-zero status.
10#set -e
11
12# treat unset variables as an error
13set -u
14
kate.wardf51c6162008-06-17 16:38:35 +000015# load test helpers
16. ./shflags_test_helpers
17
18#------------------------------------------------------------------------------
19# suite tests
20#
21
kate.ward7a3c9c42009-04-24 00:12:35 +000022testGetoptStandard()
kate.ward9ebdd162008-11-12 20:11:57 +000023{
kate.wardc5210682009-03-30 18:54:36 +000024 _flags_getoptStandard '-b' >"${stdoutF}" 2>"${stderrF}"
kate.ward619806d2008-11-15 19:59:57 +000025 rslt=$?
26 assertTrue "didn't parse valid flag 'b'" ${rslt}
27 th_showOutput ${rslt} "${stdoutF}" "${stderrF}"
kate.ward9ebdd162008-11-12 20:11:57 +000028
kate.wardc5210682009-03-30 18:54:36 +000029 _flags_getoptStandard '-x' >"${stdoutF}" 2>"${stderrF}"
kate.ward9ebdd162008-11-12 20:11:57 +000030 assertFalse "parsed invalid flag 'x'" $?
31}
32
kate.ward7a3c9c42009-04-24 00:12:35 +000033testGetoptEnhanced()
kate.ward9ebdd162008-11-12 20:11:57 +000034{
kate.ward20d9ef52013-01-06 15:56:46 +000035 flags_getoptIsEnh || return
kate.ward271aece2008-11-13 01:12:35 +000036
kate.wardc5210682009-03-30 18:54:36 +000037 _flags_getoptEnhanced '-b' >"${stdoutF}" 2>"${stderrF}"
kate.ward9ebdd162008-11-12 20:11:57 +000038 assertTrue "didn't parse valid flag 'b'" $?
kate.wardc5210682009-03-30 18:54:36 +000039 _flags_getoptEnhanced '--bool' >"${stdoutF}" 2>"${stderrF}"
kate.ward9ebdd162008-11-12 20:11:57 +000040 assertTrue "didn't parse valid flag 'bool'" $?
41
kate.wardc5210682009-03-30 18:54:36 +000042 _flags_getoptEnhanced '-x' >"${stdoutF}" 2>"${stderrF}"
kate.ward9ebdd162008-11-12 20:11:57 +000043 assertFalse "parsed invalid flag 'x'" $?
kate.wardc5210682009-03-30 18:54:36 +000044 _flags_getoptEnhanced '--xyz' >"${stdoutF}" 2>"${stderrF}"
kate.ward9ebdd162008-11-12 20:11:57 +000045 assertFalse "parsed invalid flag 'xyz'" $?
46}
47
kate.warde10dd532013-01-04 21:52:23 +000048testValidBoolsShort()
kate.wardf51c6162008-06-17 16:38:35 +000049{
kate.wardf51c6162008-06-17 16:38:35 +000050 FLAGS -b >"${stdoutF}" 2>"${stderrF}"
kate.warda2adce12013-01-15 00:00:39 +000051 r3turn=$?
52 assertTrue "-b) FLAGS returned a non-zero result (${r3turn})" ${r3turn}
kate.ward9ebdd162008-11-12 20:11:57 +000053 value=${FLAGS_bool:-}
kate.ward0a4f16f2013-01-07 22:10:49 +000054 assertTrue "-b) boolean was not true (${value})." "${value}"
55 assertFalse '-b) expected no output to STDERR' "[ -s '${stderrF}' ]"
kate.warda2adce12013-01-15 00:00:39 +000056 test ${r3turn} -eq ${FLAGS_TRUE} -a ! -s "${stderrF}"
kate.wardabae05d2008-11-12 22:37:05 +000057 th_showOutput $? "${stdoutF}" "${stderrF}"
kate.wardf51c6162008-06-17 16:38:35 +000058
kate.ward0a4f16f2013-01-07 22:10:49 +000059 DEFINE_boolean bool2 true '2nd boolean' B
60 FLAGS >"${stdoutF}" 2>"${stderrF}"
kate.warda2adce12013-01-15 00:00:39 +000061 r3turn=$?
62 assertTrue "-B) FLAGS returned a non-zero result (${r3turn})" ${r3turn}
kate.ward0a4f16f2013-01-07 22:10:49 +000063 value=${FLAGS_bool2:-}
64 assertTrue "-B) boolean was not true (${value})" ${value}
65 assertFalse '-B) expected no output to STDERR' "[ -s '${stderrF}' ]"
kate.warda2adce12013-01-15 00:00:39 +000066 test ${r3turn} -eq ${FLAGS_TRUE} -a ! -s "${stderrF}"
kate.ward0a4f16f2013-01-07 22:10:49 +000067 th_showOutput $? "${stdoutF}" "${stderrF}"
68
69 FLAGS -B >"${stdoutF}" 2>"${stderrF}"
kate.warda2adce12013-01-15 00:00:39 +000070 r3turn=$?
71 assertTrue "-B) FLAGS returned a non-zero result (${r3turn})" ${r3turn}
kate.ward0a4f16f2013-01-07 22:10:49 +000072 value=${FLAGS_bool2:-}
73 assertFalse "-B) boolean was not false (${value})" ${value}
74 assertFalse '-B) expected no output to STDERR' "[ -s '${stderrF}' ]"
kate.warda2adce12013-01-15 00:00:39 +000075 test ${r3turn} -eq ${FLAGS_TRUE} -a ! -s "${stderrF}"
kate.wardabae05d2008-11-12 22:37:05 +000076 th_showOutput $? "${stdoutF}" "${stderrF}"
kate.wardf51c6162008-06-17 16:38:35 +000077}
78
kate.warde10dd532013-01-04 21:52:23 +000079# TODO(kate): separate into multiple functions to reflect correct usage
80testValidBoolsLong()
kate.wardf51c6162008-06-17 16:38:35 +000081{
kate.ward20d9ef52013-01-06 15:56:46 +000082 flags_getoptIsEnh || return
kate.wardf51c6162008-06-17 16:38:35 +000083
kate.warde10dd532013-01-04 21:52:23 +000084 # Note: the default value of bool is 'false'.
kate.wardf51c6162008-06-17 16:38:35 +000085
86 # leave flag false
87 FLAGS --nobool >"${stdoutF}" 2>"${stderrF}"
kate.warda2adce12013-01-15 00:00:39 +000088 r3turn=$?
89 assertTrue "FLAGS returned a non-zero result (${r3turn})" ${r3turn}
kate.wardf51c6162008-06-17 16:38:35 +000090 assertFalse '--noXX flag resulted in true value.' ${FLAGS_bool:-}
kate.warde556cbf2008-11-13 00:41:59 +000091 assertFalse 'expected no output to STDERR' "[ -s '${stderrF}' ]"
kate.warda2adce12013-01-15 00:00:39 +000092 th_showOutput ${r3turn} "${stdoutF}" "${stderrF}"
kate.wardf51c6162008-06-17 16:38:35 +000093
94 # flip flag true
95 FLAGS --bool >"${stdoutF}" 2>"${stderrF}"
kate.warda2adce12013-01-15 00:00:39 +000096 r3turn=$?
97 assertTrue "FLAGS returned a non-zero result (${r3turn})" ${r3turn}
kate.wardf51c6162008-06-17 16:38:35 +000098 assertTrue '--XX flag resulted in false value.' ${FLAGS_bool:-}
kate.warde556cbf2008-11-13 00:41:59 +000099 assertFalse 'expected no output to STDERR' "[ -s '${stderrF}' ]"
kate.warda2adce12013-01-15 00:00:39 +0000100 th_showOutput ${r3turn} "${stdoutF}" "${stderrF}"
kate.wardf51c6162008-06-17 16:38:35 +0000101
102 # flip flag back false
103 FLAGS --nobool >"${stdoutF}" 2>"${stderrF}"
kate.warda2adce12013-01-15 00:00:39 +0000104 r3turn=$?
105 assertTrue "FLAGS returned a non-zero result (${r3turn})" ${r3turn}
kate.wardf51c6162008-06-17 16:38:35 +0000106 assertFalse '--noXX flag resulted in true value.' ${FLAGS_bool:-}
kate.warde556cbf2008-11-13 00:41:59 +0000107 assertFalse 'expected no output to STDERR' "[ -s '${stderrF}' ]"
kate.warda2adce12013-01-15 00:00:39 +0000108 th_showOutput ${r3turn} "${stdoutF}" "${stderrF}"
kate.wardf51c6162008-06-17 16:38:35 +0000109}
110
111testValidFloats()
112{
113 _testValidFloats '-f'
kate.ward20d9ef52013-01-06 15:56:46 +0000114 flags_getoptIsEnh || return
kate.wardf51c6162008-06-17 16:38:35 +0000115 _testValidFloats '--float'
116}
117
118_testValidFloats()
119{
120 flag=$1
121 for value in ${TH_FLOAT_VALID}; do
kate.wardf51c6162008-06-17 16:38:35 +0000122 FLAGS ${flag} ${value} >"${stdoutF}" 2>"${stderrF}"
kate.warda2adce12013-01-15 00:00:39 +0000123 r3turn=$?
124 assertTrue "FLAGS ${flag} ${value} returned non-zero result (${r3turn})" \
125 ${r3turn}
kate.ward8fe62e62010-03-28 23:07:35 +0000126 assertEquals "float (${flag} ${value}) test failed." ${value} ${FLAGS_float}
kate.warde556cbf2008-11-13 00:41:59 +0000127 assertFalse 'expected no output to STDERR' "[ -s '${stderrF}' ]"
kate.warda2adce12013-01-15 00:00:39 +0000128 th_showOutput ${r3turn} "${stdoutF}" "${stderrF}"
kate.wardf51c6162008-06-17 16:38:35 +0000129 done
130}
131
132testInvalidFloats()
133{
134 _testInvalidFloats '-f'
kate.ward20d9ef52013-01-06 15:56:46 +0000135 flags_getoptIsEnh || return
kate.wardf51c6162008-06-17 16:38:35 +0000136 _testInvalidFloats '--float'
137}
138
139_testInvalidFloats()
140{
141 flag=$1
142 for value in ${TH_FLOAT_INVALID}; do
kate.warda2adce12013-01-15 00:00:39 +0000143 th_clearReturn
144 (
145 FLAGS ${flag} ${value} >"${stdoutF}" 2>"${stderrF}"
146 echo $? >"${returnF}"
147 )
148 th_queryReturn
149 assertFalse "FLAGS (${value}) returned a zero result" ${th_return}
kate.warde10dd532013-01-04 21:52:23 +0000150 assertFalse 'expected no output to STDOUT' "[ -s '${stdoutF}' ]"
151 assertTrue 'expected output to STDERR' "[ -s '${stderrF}' ]"
kate.wardf51c6162008-06-17 16:38:35 +0000152 done
153}
154
155testValidIntegers()
156{
157 _testValidIntegers '-i'
kate.ward20d9ef52013-01-06 15:56:46 +0000158 flags_getoptIsEnh || return
kate.wardf51c6162008-06-17 16:38:35 +0000159 _testValidIntegers '--int'
160}
161
162_testValidIntegers()
163{
164 flag=$1
165 for value in ${TH_INT_VALID}; do
kate.wardf51c6162008-06-17 16:38:35 +0000166 FLAGS ${flag} ${value} >"${stdoutF}" 2>"${stderrF}"
kate.warda2adce12013-01-15 00:00:39 +0000167 r3turn=$?
168 assertTrue "FLAGS (${value}) returned a non-zero result (${r3turn})" ${r3turn}
kate.wardf51c6162008-06-17 16:38:35 +0000169 assertEquals "integer (${value}) test failed." ${value} ${FLAGS_int}
kate.warde556cbf2008-11-13 00:41:59 +0000170 assertFalse 'expected no output to STDERR' "[ -s '${stderrF}' ]"
kate.warda2adce12013-01-15 00:00:39 +0000171 th_showOutput ${r3turn} "${stdoutF}" "${stderrF}"
kate.wardf51c6162008-06-17 16:38:35 +0000172 done
173}
174
175testInvalidIntegers()
176{
177 _testInvalidIntegers '-i'
kate.ward20d9ef52013-01-06 15:56:46 +0000178 flags_getoptIsEnh || return
kate.wardf51c6162008-06-17 16:38:35 +0000179 _testInvalidIntegers '--int'
180}
181
182_testInvalidIntegers()
183{
184 flag=$1
185 for value in ${TH_INT_INVALID}; do
kate.warda2adce12013-01-15 00:00:39 +0000186 th_clearReturn
187 (
188 FLAGS ${flag} ${value} >"${stdoutF}" 2>"${stderrF}"
189 echo $? >"${returnF}"
190 )
191 th_queryReturn
192 assertFalse "invalid integer (${value}) test returned success." ${th_return}
kate.warde10dd532013-01-04 21:52:23 +0000193 assertFalse 'expected no output to STDOUT' "[ -s '${stdoutF}' ]"
194 assertTrue 'expected output to STDERR' "[ -s '${stderrF}' ]"
kate.wardf51c6162008-06-17 16:38:35 +0000195 done
196}
197
198testValidStrings()
199{
kate.ward7a3c9c42009-04-24 00:12:35 +0000200 _testValidStrings -s single_word
kate.ward20d9ef52013-01-06 15:56:46 +0000201 if flags_getoptIsEnh; then
202 _testValidStrings --str single_word
203 _testValidStrings --str 'string with spaces'
204 fi
kate.wardf51c6162008-06-17 16:38:35 +0000205}
206
207_testValidStrings()
208{
209 flag=$1
kate.ward7a3c9c42009-04-24 00:12:35 +0000210 value=$2
211
212 FLAGS ${flag} "${value}" >"${stdoutF}" 2>"${stderrF}"
kate.warda2adce12013-01-15 00:00:39 +0000213 r3turn=$?
214 assertTrue "'FLAGS ${flag} ${value}' returned a non-zero result (${r3turn})" \
215 ${r3turn}
kate.ward7a3c9c42009-04-24 00:12:35 +0000216 assertEquals "string (${value}) test failed." "${value}" "${FLAGS_str}"
kate.warda2adce12013-01-15 00:00:39 +0000217 if [ ${r3turn} -eq ${FLAGS_TRUE} ]; then
kate.ward7a3c9c42009-04-24 00:12:35 +0000218 assertFalse 'expected no output to STDERR' "[ -s '${stderrF}' ]"
219 else
220 # validate that an error is thrown for unsupported getopt uses
221 assertFatalMsg '.* spaces in options'
222 fi
kate.warda2adce12013-01-15 00:00:39 +0000223 th_showOutput ${r3turn} "${stdoutF}" "${stderrF}"
kate.wardf51c6162008-06-17 16:38:35 +0000224}
225
226testMultipleFlags()
227{
228 _testMultipleFlags '-b' '-i' '-f' '-s'
kate.ward20d9ef52013-01-06 15:56:46 +0000229 flags_getoptIsEnh || return
kate.wardf51c6162008-06-17 16:38:35 +0000230 _testMultipleFlags '--bool' '--int' '--float' '--str'
231}
232
233_testMultipleFlags()
234{
235 boolFlag=$1
236 intFlag=$2
237 floatFlag=$3
238 strFlag=$4
239
kate.wardf51c6162008-06-17 16:38:35 +0000240 FLAGS \
241 ${boolFlag} \
242 ${intFlag} 567 \
243 ${floatFlag} 123.45678 \
244 ${strFlag} 'some_string' \
245 >"${stdoutF}" 2>"${stderrF}"
kate.warda2adce12013-01-15 00:00:39 +0000246 r3turn=$?
247 assertTrue "use of multple flags returned a non-zero result" ${r3turn}
kate.wardf51c6162008-06-17 16:38:35 +0000248 assertTrue 'boolean test failed.' ${FLAGS_bool}
249 assertNotSame 'float test failed.' 0 ${FLAGS_float}
250 assertNotSame 'integer test failed.' 0 ${FLAGS_int}
251 assertNotSame 'string test failed.' '' ${FLAGS_str}
kate.warde556cbf2008-11-13 00:41:59 +0000252 assertFalse 'expected no output to STDERR' "[ -s '${stderrF}' ]"
kate.warda2adce12013-01-15 00:00:39 +0000253 th_showOutput ${r3turn} "${stdoutF}" "${stderrF}"
kate.wardf51c6162008-06-17 16:38:35 +0000254}
255
256_testNonFlagArgs()
257{
kate.ward7a3c9c42009-04-24 00:12:35 +0000258 argc=$1
kate.wardf51c6162008-06-17 16:38:35 +0000259 shift
260
kate.ward812aeae2009-04-01 02:49:51 +0000261 FLAGS "$@" >"${stdoutF}" 2>"${stderrF}"
kate.warda2adce12013-01-15 00:00:39 +0000262 r3turn=$?
263 assertTrue 'parse returned non-zero value.' ${r3turn}
264 th_showOutput ${r3turn} "${stdoutF}" "${stderrF}"
kate.wardf51c6162008-06-17 16:38:35 +0000265
kate.wardc5210682009-03-30 18:54:36 +0000266 eval set -- "${FLAGS_ARGV}"
kate.ward7a3c9c42009-04-24 00:12:35 +0000267 assertEquals 'wrong count of argv arguments returned.' ${argc} $#
kate.wardc5210682009-03-30 18:54:36 +0000268 assertEquals 'wrong count of argc arguments returned.' 0 ${FLAGS_ARGC}
kate.wardf51c6162008-06-17 16:38:35 +0000269}
270
271testSingleNonFlagArg()
272{
273 _testNonFlagArgs 1 argOne
274}
275
276testMultipleNonFlagArgs()
277{
278 _testNonFlagArgs 3 argOne argTwo arg3
279}
280
281testMultipleNonFlagStringArgsWithSpaces()
282{
kate.ward20d9ef52013-01-06 15:56:46 +0000283 flags_getoptIsEnh || return
kate.wardc5210682009-03-30 18:54:36 +0000284 _testNonFlagArgs 3 argOne 'arg two' arg3
kate.wardf51c6162008-06-17 16:38:35 +0000285}
286
kate.wardc5210682009-03-30 18:54:36 +0000287testFlagsWithEquals()
288{
kate.ward20d9ef52013-01-06 15:56:46 +0000289 flags_getoptIsEnh || return
kate.ward812aeae2009-04-01 02:49:51 +0000290
kate.wardc5210682009-03-30 18:54:36 +0000291 FLAGS --str='str_flag' 'non_flag' >"${stdoutF}" 2>"${stderrF}"
292 assertTrue 'FLAGS returned a non-zero result' $?
293 assertEquals 'string flag not set properly' 'str_flag' "${FLAGS_str}"
kate.warda2adce12013-01-15 00:00:39 +0000294 th_showOutput ${r3turn} "${stdoutF}" "${stderrF}"
kate.wardc5210682009-03-30 18:54:36 +0000295
296 eval set -- "${FLAGS_ARGV}"
297 assertEquals 'wrong count of argv arguments returned.' 1 $#
298 assertEquals 'wrong count of argc arguments returned.' 1 ${FLAGS_ARGC}
299}
300
kate.ward7a3c9c42009-04-24 00:12:35 +0000301testComplicatedCommandLineStandard()
kate.wardc5210682009-03-30 18:54:36 +0000302{
kate.ward32d97fb2013-01-06 16:05:26 +0000303 flags_getoptIsEnh && return
304
305 # Note: standard getopt stops parsing after first non-flag argument, which
306 # results in the remaining flags being treated as arguments instead.
kate.ward7a3c9c42009-04-24 00:12:35 +0000307 FLAGS -i 1 non_flag_1 -s 'two' non_flag_2 -f 3 non_flag_3 \
308 >"${stdoutF}" 2>"${stderrF}"
kate.warda2adce12013-01-15 00:00:39 +0000309 r3turn=$?
310 assertTrue 'FLAGS returned a non-zero result' ${r3turn}
kate.ward7a3c9c42009-04-24 00:12:35 +0000311 assertEquals 'failed int test' 1 ${FLAGS_int}
kate.warda2adce12013-01-15 00:00:39 +0000312 th_showOutput ${r3turn} "${stdoutF}" "${stderrF}"
kate.wardc5210682009-03-30 18:54:36 +0000313
314 eval set -- "${FLAGS_ARGV}"
kate.ward32d97fb2013-01-06 16:05:26 +0000315 assertEquals 'incorrect number of argv values' 7 $#
kate.ward812aeae2009-04-01 02:49:51 +0000316}
317
kate.ward7a3c9c42009-04-24 00:12:35 +0000318testComplicatedCommandLineEnhanced()
kate.ward812aeae2009-04-01 02:49:51 +0000319{
kate.ward20d9ef52013-01-06 15:56:46 +0000320 flags_getoptIsEnh || return
kate.ward812aeae2009-04-01 02:49:51 +0000321
kate.ward7a3c9c42009-04-24 00:12:35 +0000322 FLAGS -i 1 non_flag_1 --str='two' non_flag_2 --float 3 'non flag 3' \
323 >"${stdoutF}" 2>"${stderrF}"
kate.warda2adce12013-01-15 00:00:39 +0000324 r3turn=$?
325 assertTrue 'FLAGS returned a non-zero result' ${r3turn}
kate.ward7a3c9c42009-04-24 00:12:35 +0000326 assertEquals 'failed int test' 1 ${FLAGS_int}
327 assertEquals 'failed str test' 'two' "${FLAGS_str}"
328 assertEquals 'failed float test' 3 ${FLAGS_float}
kate.warda2adce12013-01-15 00:00:39 +0000329 th_showOutput ${r3turn} "${stdoutF}" "${stderrF}"
kate.ward7a3c9c42009-04-24 00:12:35 +0000330
331 eval set -- "${FLAGS_ARGV}"
332 assertEquals 'incorrect number of argv values' 3 $#
kate.wardc5210682009-03-30 18:54:36 +0000333}
kate.wardf51c6162008-06-17 16:38:35 +0000334
335#------------------------------------------------------------------------------
336# suite functions
337#
338
339oneTimeSetUp()
340{
kate.ward1b600c52008-11-12 21:26:05 +0000341 th_oneTimeSetUp
kate.wardf51c6162008-06-17 16:38:35 +0000342
kate.ward619806d2008-11-15 19:59:57 +0000343 if flags_getoptIsStd; then
344 th_warn 'Standard version of getopt found. Enhanced tests will be skipped.'
345 else
346 th_warn 'Enhanced version of getopt found. Standard tests will be skipped.'
kate.wardf51c6162008-06-17 16:38:35 +0000347 fi
348}
349
350setUp()
351{
kate.ward8fe62e62010-03-28 23:07:35 +0000352 DEFINE_boolean bool false 'boolean test' 'b'
kate.ward9ebdd162008-11-12 20:11:57 +0000353 DEFINE_float float 0.0 'float test' 'f'
354 DEFINE_integer int 0 'integer test' 'i'
355 DEFINE_string str '' 'string test' 's'
kate.wardf51c6162008-06-17 16:38:35 +0000356}
357
kate.warde10dd532013-01-04 21:52:23 +0000358tearDown()
359{
360 flags_reset
361}
362
kate.wardf51c6162008-06-17 16:38:35 +0000363# load and run shUnit2
364[ -n "${ZSH_VERSION:-}" ] && SHUNIT_PARENT=$0
365. ${TH_SHUNIT}