blob: 664db5b2cc452a89c2cf2ee8ecdee285c4f0ee31 [file] [log] [blame]
kate.wardf51c6162008-06-17 16:38:35 +00001#! /bin/sh
kate.ward9ebdd162008-11-12 20:11:57 +00002# $Id$
kate.wardf51c6162008-06-17 16:38:35 +00003# vim:et:ft=sh:sts=2:sw=2
4#
5# Copyright 2008 Kate Ward. All Rights Reserved.
6# Released under the LGPL (GNU Lesser General Public License)
7#
8# Author: kate.ward@forestent.com (Kate Ward)
9#
10# shFlags unit test for the flag definition methods
11#
12# TODO(kward): assert on FLAGS errors
kate.wardc5210682009-03-30 18:54:36 +000013# TODO(kward): testNonStandardIFS()
kate.wardf51c6162008-06-17 16:38:35 +000014
kate.wardc66a5fc2013-01-12 23:10:15 +000015# exit immediately if a pipeline or subshell exits with a non-zero status.
16#set -e
17
18# treat unset variables as an error
19set -u
20
kate.wardf51c6162008-06-17 16:38:35 +000021# load test helpers
22. ./shflags_test_helpers
23
24#------------------------------------------------------------------------------
25# suite tests
26#
27
kate.ward7a3c9c42009-04-24 00:12:35 +000028testGetoptStandard()
kate.ward9ebdd162008-11-12 20:11:57 +000029{
kate.wardc5210682009-03-30 18:54:36 +000030 _flags_getoptStandard '-b' >"${stdoutF}" 2>"${stderrF}"
kate.ward619806d2008-11-15 19:59:57 +000031 rslt=$?
32 assertTrue "didn't parse valid flag 'b'" ${rslt}
33 th_showOutput ${rslt} "${stdoutF}" "${stderrF}"
kate.ward9ebdd162008-11-12 20:11:57 +000034
kate.wardc5210682009-03-30 18:54:36 +000035 _flags_getoptStandard '-x' >"${stdoutF}" 2>"${stderrF}"
kate.ward9ebdd162008-11-12 20:11:57 +000036 assertFalse "parsed invalid flag 'x'" $?
37}
38
kate.ward7a3c9c42009-04-24 00:12:35 +000039testGetoptEnhanced()
kate.ward9ebdd162008-11-12 20:11:57 +000040{
kate.ward20d9ef52013-01-06 15:56:46 +000041 flags_getoptIsEnh || return
kate.ward271aece2008-11-13 01:12:35 +000042
kate.wardc5210682009-03-30 18:54:36 +000043 _flags_getoptEnhanced '-b' >"${stdoutF}" 2>"${stderrF}"
kate.ward9ebdd162008-11-12 20:11:57 +000044 assertTrue "didn't parse valid flag 'b'" $?
kate.wardc5210682009-03-30 18:54:36 +000045 _flags_getoptEnhanced '--bool' >"${stdoutF}" 2>"${stderrF}"
kate.ward9ebdd162008-11-12 20:11:57 +000046 assertTrue "didn't parse valid flag 'bool'" $?
47
kate.wardc5210682009-03-30 18:54:36 +000048 _flags_getoptEnhanced '-x' >"${stdoutF}" 2>"${stderrF}"
kate.ward9ebdd162008-11-12 20:11:57 +000049 assertFalse "parsed invalid flag 'x'" $?
kate.wardc5210682009-03-30 18:54:36 +000050 _flags_getoptEnhanced '--xyz' >"${stdoutF}" 2>"${stderrF}"
kate.ward9ebdd162008-11-12 20:11:57 +000051 assertFalse "parsed invalid flag 'xyz'" $?
52}
53
kate.warde10dd532013-01-04 21:52:23 +000054testValidBoolsShort()
kate.wardf51c6162008-06-17 16:38:35 +000055{
kate.wardf51c6162008-06-17 16:38:35 +000056 FLAGS -b >"${stdoutF}" 2>"${stderrF}"
kate.warda2adce12013-01-15 00:00:39 +000057 r3turn=$?
58 assertTrue "-b) FLAGS returned a non-zero result (${r3turn})" ${r3turn}
kate.ward9ebdd162008-11-12 20:11:57 +000059 value=${FLAGS_bool:-}
kate.ward0a4f16f2013-01-07 22:10:49 +000060 assertTrue "-b) boolean was not true (${value})." "${value}"
61 assertFalse '-b) expected no output to STDERR' "[ -s '${stderrF}' ]"
kate.warda2adce12013-01-15 00:00:39 +000062 test ${r3turn} -eq ${FLAGS_TRUE} -a ! -s "${stderrF}"
kate.wardabae05d2008-11-12 22:37:05 +000063 th_showOutput $? "${stdoutF}" "${stderrF}"
kate.wardf51c6162008-06-17 16:38:35 +000064
kate.ward0a4f16f2013-01-07 22:10:49 +000065 DEFINE_boolean bool2 true '2nd boolean' B
66 FLAGS >"${stdoutF}" 2>"${stderrF}"
kate.warda2adce12013-01-15 00:00:39 +000067 r3turn=$?
68 assertTrue "-B) FLAGS returned a non-zero result (${r3turn})" ${r3turn}
kate.ward0a4f16f2013-01-07 22:10:49 +000069 value=${FLAGS_bool2:-}
70 assertTrue "-B) boolean was not true (${value})" ${value}
71 assertFalse '-B) expected no output to STDERR' "[ -s '${stderrF}' ]"
kate.warda2adce12013-01-15 00:00:39 +000072 test ${r3turn} -eq ${FLAGS_TRUE} -a ! -s "${stderrF}"
kate.ward0a4f16f2013-01-07 22:10:49 +000073 th_showOutput $? "${stdoutF}" "${stderrF}"
74
75 FLAGS -B >"${stdoutF}" 2>"${stderrF}"
kate.warda2adce12013-01-15 00:00:39 +000076 r3turn=$?
77 assertTrue "-B) FLAGS returned a non-zero result (${r3turn})" ${r3turn}
kate.ward0a4f16f2013-01-07 22:10:49 +000078 value=${FLAGS_bool2:-}
79 assertFalse "-B) boolean was not false (${value})" ${value}
80 assertFalse '-B) expected no output to STDERR' "[ -s '${stderrF}' ]"
kate.warda2adce12013-01-15 00:00:39 +000081 test ${r3turn} -eq ${FLAGS_TRUE} -a ! -s "${stderrF}"
kate.wardabae05d2008-11-12 22:37:05 +000082 th_showOutput $? "${stdoutF}" "${stderrF}"
kate.wardf51c6162008-06-17 16:38:35 +000083}
84
kate.warde10dd532013-01-04 21:52:23 +000085# TODO(kate): separate into multiple functions to reflect correct usage
86testValidBoolsLong()
kate.wardf51c6162008-06-17 16:38:35 +000087{
kate.ward20d9ef52013-01-06 15:56:46 +000088 flags_getoptIsEnh || return
kate.wardf51c6162008-06-17 16:38:35 +000089
kate.warde10dd532013-01-04 21:52:23 +000090 # Note: the default value of bool is 'false'.
kate.wardf51c6162008-06-17 16:38:35 +000091
92 # leave flag false
93 FLAGS --nobool >"${stdoutF}" 2>"${stderrF}"
kate.warda2adce12013-01-15 00:00:39 +000094 r3turn=$?
95 assertTrue "FLAGS returned a non-zero result (${r3turn})" ${r3turn}
kate.wardf51c6162008-06-17 16:38:35 +000096 assertFalse '--noXX flag resulted in true value.' ${FLAGS_bool:-}
kate.warde556cbf2008-11-13 00:41:59 +000097 assertFalse 'expected no output to STDERR' "[ -s '${stderrF}' ]"
kate.warda2adce12013-01-15 00:00:39 +000098 th_showOutput ${r3turn} "${stdoutF}" "${stderrF}"
kate.wardf51c6162008-06-17 16:38:35 +000099
100 # flip flag true
101 FLAGS --bool >"${stdoutF}" 2>"${stderrF}"
kate.warda2adce12013-01-15 00:00:39 +0000102 r3turn=$?
103 assertTrue "FLAGS returned a non-zero result (${r3turn})" ${r3turn}
kate.wardf51c6162008-06-17 16:38:35 +0000104 assertTrue '--XX flag resulted in false value.' ${FLAGS_bool:-}
kate.warde556cbf2008-11-13 00:41:59 +0000105 assertFalse 'expected no output to STDERR' "[ -s '${stderrF}' ]"
kate.warda2adce12013-01-15 00:00:39 +0000106 th_showOutput ${r3turn} "${stdoutF}" "${stderrF}"
kate.wardf51c6162008-06-17 16:38:35 +0000107
108 # flip flag back false
109 FLAGS --nobool >"${stdoutF}" 2>"${stderrF}"
kate.warda2adce12013-01-15 00:00:39 +0000110 r3turn=$?
111 assertTrue "FLAGS returned a non-zero result (${r3turn})" ${r3turn}
kate.wardf51c6162008-06-17 16:38:35 +0000112 assertFalse '--noXX flag resulted in true value.' ${FLAGS_bool:-}
kate.warde556cbf2008-11-13 00:41:59 +0000113 assertFalse 'expected no output to STDERR' "[ -s '${stderrF}' ]"
kate.warda2adce12013-01-15 00:00:39 +0000114 th_showOutput ${r3turn} "${stdoutF}" "${stderrF}"
kate.wardf51c6162008-06-17 16:38:35 +0000115}
116
117testValidFloats()
118{
119 _testValidFloats '-f'
kate.ward20d9ef52013-01-06 15:56:46 +0000120 flags_getoptIsEnh || return
kate.wardf51c6162008-06-17 16:38:35 +0000121 _testValidFloats '--float'
122}
123
124_testValidFloats()
125{
126 flag=$1
127 for value in ${TH_FLOAT_VALID}; do
kate.wardf51c6162008-06-17 16:38:35 +0000128 FLAGS ${flag} ${value} >"${stdoutF}" 2>"${stderrF}"
kate.warda2adce12013-01-15 00:00:39 +0000129 r3turn=$?
130 assertTrue "FLAGS ${flag} ${value} returned non-zero result (${r3turn})" \
131 ${r3turn}
kate.ward8fe62e62010-03-28 23:07:35 +0000132 assertEquals "float (${flag} ${value}) test failed." ${value} ${FLAGS_float}
kate.warde556cbf2008-11-13 00:41:59 +0000133 assertFalse 'expected no output to STDERR' "[ -s '${stderrF}' ]"
kate.warda2adce12013-01-15 00:00:39 +0000134 th_showOutput ${r3turn} "${stdoutF}" "${stderrF}"
kate.wardf51c6162008-06-17 16:38:35 +0000135 done
136}
137
138testInvalidFloats()
139{
140 _testInvalidFloats '-f'
kate.ward20d9ef52013-01-06 15:56:46 +0000141 flags_getoptIsEnh || return
kate.wardf51c6162008-06-17 16:38:35 +0000142 _testInvalidFloats '--float'
143}
144
145_testInvalidFloats()
146{
147 flag=$1
148 for value in ${TH_FLOAT_INVALID}; do
kate.warda2adce12013-01-15 00:00:39 +0000149 th_clearReturn
150 (
151 FLAGS ${flag} ${value} >"${stdoutF}" 2>"${stderrF}"
152 echo $? >"${returnF}"
153 )
154 th_queryReturn
155 assertFalse "FLAGS (${value}) returned a zero result" ${th_return}
kate.warde10dd532013-01-04 21:52:23 +0000156 assertFalse 'expected no output to STDOUT' "[ -s '${stdoutF}' ]"
157 assertTrue 'expected output to STDERR' "[ -s '${stderrF}' ]"
kate.wardf51c6162008-06-17 16:38:35 +0000158 done
159}
160
161testValidIntegers()
162{
163 _testValidIntegers '-i'
kate.ward20d9ef52013-01-06 15:56:46 +0000164 flags_getoptIsEnh || return
kate.wardf51c6162008-06-17 16:38:35 +0000165 _testValidIntegers '--int'
166}
167
168_testValidIntegers()
169{
170 flag=$1
171 for value in ${TH_INT_VALID}; do
kate.wardf51c6162008-06-17 16:38:35 +0000172 FLAGS ${flag} ${value} >"${stdoutF}" 2>"${stderrF}"
kate.warda2adce12013-01-15 00:00:39 +0000173 r3turn=$?
174 assertTrue "FLAGS (${value}) returned a non-zero result (${r3turn})" ${r3turn}
kate.wardf51c6162008-06-17 16:38:35 +0000175 assertEquals "integer (${value}) test failed." ${value} ${FLAGS_int}
kate.warde556cbf2008-11-13 00:41:59 +0000176 assertFalse 'expected no output to STDERR' "[ -s '${stderrF}' ]"
kate.warda2adce12013-01-15 00:00:39 +0000177 th_showOutput ${r3turn} "${stdoutF}" "${stderrF}"
kate.wardf51c6162008-06-17 16:38:35 +0000178 done
179}
180
181testInvalidIntegers()
182{
183 _testInvalidIntegers '-i'
kate.ward20d9ef52013-01-06 15:56:46 +0000184 flags_getoptIsEnh || return
kate.wardf51c6162008-06-17 16:38:35 +0000185 _testInvalidIntegers '--int'
186}
187
188_testInvalidIntegers()
189{
190 flag=$1
191 for value in ${TH_INT_INVALID}; do
kate.warda2adce12013-01-15 00:00:39 +0000192 th_clearReturn
193 (
194 FLAGS ${flag} ${value} >"${stdoutF}" 2>"${stderrF}"
195 echo $? >"${returnF}"
196 )
197 th_queryReturn
198 assertFalse "invalid integer (${value}) test returned success." ${th_return}
kate.warde10dd532013-01-04 21:52:23 +0000199 assertFalse 'expected no output to STDOUT' "[ -s '${stdoutF}' ]"
200 assertTrue 'expected output to STDERR' "[ -s '${stderrF}' ]"
kate.wardf51c6162008-06-17 16:38:35 +0000201 done
202}
203
204testValidStrings()
205{
kate.ward7a3c9c42009-04-24 00:12:35 +0000206 _testValidStrings -s single_word
kate.ward20d9ef52013-01-06 15:56:46 +0000207 if flags_getoptIsEnh; then
208 _testValidStrings --str single_word
209 _testValidStrings --str 'string with spaces'
210 fi
kate.wardf51c6162008-06-17 16:38:35 +0000211}
212
213_testValidStrings()
214{
215 flag=$1
kate.ward7a3c9c42009-04-24 00:12:35 +0000216 value=$2
217
218 FLAGS ${flag} "${value}" >"${stdoutF}" 2>"${stderrF}"
kate.warda2adce12013-01-15 00:00:39 +0000219 r3turn=$?
220 assertTrue "'FLAGS ${flag} ${value}' returned a non-zero result (${r3turn})" \
221 ${r3turn}
kate.ward7a3c9c42009-04-24 00:12:35 +0000222 assertEquals "string (${value}) test failed." "${value}" "${FLAGS_str}"
kate.warda2adce12013-01-15 00:00:39 +0000223 if [ ${r3turn} -eq ${FLAGS_TRUE} ]; then
kate.ward7a3c9c42009-04-24 00:12:35 +0000224 assertFalse 'expected no output to STDERR' "[ -s '${stderrF}' ]"
225 else
226 # validate that an error is thrown for unsupported getopt uses
227 assertFatalMsg '.* spaces in options'
228 fi
kate.warda2adce12013-01-15 00:00:39 +0000229 th_showOutput ${r3turn} "${stdoutF}" "${stderrF}"
kate.wardf51c6162008-06-17 16:38:35 +0000230}
231
232testMultipleFlags()
233{
234 _testMultipleFlags '-b' '-i' '-f' '-s'
kate.ward20d9ef52013-01-06 15:56:46 +0000235 flags_getoptIsEnh || return
kate.wardf51c6162008-06-17 16:38:35 +0000236 _testMultipleFlags '--bool' '--int' '--float' '--str'
237}
238
239_testMultipleFlags()
240{
241 boolFlag=$1
242 intFlag=$2
243 floatFlag=$3
244 strFlag=$4
245
kate.wardf51c6162008-06-17 16:38:35 +0000246 FLAGS \
247 ${boolFlag} \
248 ${intFlag} 567 \
249 ${floatFlag} 123.45678 \
250 ${strFlag} 'some_string' \
251 >"${stdoutF}" 2>"${stderrF}"
kate.warda2adce12013-01-15 00:00:39 +0000252 r3turn=$?
253 assertTrue "use of multple flags returned a non-zero result" ${r3turn}
kate.wardf51c6162008-06-17 16:38:35 +0000254 assertTrue 'boolean test failed.' ${FLAGS_bool}
255 assertNotSame 'float test failed.' 0 ${FLAGS_float}
256 assertNotSame 'integer test failed.' 0 ${FLAGS_int}
257 assertNotSame 'string test failed.' '' ${FLAGS_str}
kate.warde556cbf2008-11-13 00:41:59 +0000258 assertFalse 'expected no output to STDERR' "[ -s '${stderrF}' ]"
kate.warda2adce12013-01-15 00:00:39 +0000259 th_showOutput ${r3turn} "${stdoutF}" "${stderrF}"
kate.wardf51c6162008-06-17 16:38:35 +0000260}
261
262_testNonFlagArgs()
263{
kate.ward7a3c9c42009-04-24 00:12:35 +0000264 argc=$1
kate.wardf51c6162008-06-17 16:38:35 +0000265 shift
266
kate.ward812aeae2009-04-01 02:49:51 +0000267 FLAGS "$@" >"${stdoutF}" 2>"${stderrF}"
kate.warda2adce12013-01-15 00:00:39 +0000268 r3turn=$?
269 assertTrue 'parse returned non-zero value.' ${r3turn}
270 th_showOutput ${r3turn} "${stdoutF}" "${stderrF}"
kate.wardf51c6162008-06-17 16:38:35 +0000271
kate.wardc5210682009-03-30 18:54:36 +0000272 eval set -- "${FLAGS_ARGV}"
kate.ward7a3c9c42009-04-24 00:12:35 +0000273 assertEquals 'wrong count of argv arguments returned.' ${argc} $#
kate.wardc5210682009-03-30 18:54:36 +0000274 assertEquals 'wrong count of argc arguments returned.' 0 ${FLAGS_ARGC}
kate.wardf51c6162008-06-17 16:38:35 +0000275}
276
277testSingleNonFlagArg()
278{
279 _testNonFlagArgs 1 argOne
280}
281
282testMultipleNonFlagArgs()
283{
284 _testNonFlagArgs 3 argOne argTwo arg3
285}
286
287testMultipleNonFlagStringArgsWithSpaces()
288{
kate.ward20d9ef52013-01-06 15:56:46 +0000289 flags_getoptIsEnh || return
kate.wardc5210682009-03-30 18:54:36 +0000290 _testNonFlagArgs 3 argOne 'arg two' arg3
kate.wardf51c6162008-06-17 16:38:35 +0000291}
292
kate.wardc5210682009-03-30 18:54:36 +0000293testFlagsWithEquals()
294{
kate.ward20d9ef52013-01-06 15:56:46 +0000295 flags_getoptIsEnh || return
kate.ward812aeae2009-04-01 02:49:51 +0000296
kate.wardc5210682009-03-30 18:54:36 +0000297 FLAGS --str='str_flag' 'non_flag' >"${stdoutF}" 2>"${stderrF}"
298 assertTrue 'FLAGS returned a non-zero result' $?
299 assertEquals 'string flag not set properly' 'str_flag' "${FLAGS_str}"
kate.warda2adce12013-01-15 00:00:39 +0000300 th_showOutput ${r3turn} "${stdoutF}" "${stderrF}"
kate.wardc5210682009-03-30 18:54:36 +0000301
302 eval set -- "${FLAGS_ARGV}"
303 assertEquals 'wrong count of argv arguments returned.' 1 $#
304 assertEquals 'wrong count of argc arguments returned.' 1 ${FLAGS_ARGC}
305}
306
kate.ward7a3c9c42009-04-24 00:12:35 +0000307testComplicatedCommandLineStandard()
kate.wardc5210682009-03-30 18:54:36 +0000308{
kate.ward32d97fb2013-01-06 16:05:26 +0000309 flags_getoptIsEnh && return
310
311 # Note: standard getopt stops parsing after first non-flag argument, which
312 # results in the remaining flags being treated as arguments instead.
kate.ward7a3c9c42009-04-24 00:12:35 +0000313 FLAGS -i 1 non_flag_1 -s 'two' non_flag_2 -f 3 non_flag_3 \
314 >"${stdoutF}" 2>"${stderrF}"
kate.warda2adce12013-01-15 00:00:39 +0000315 r3turn=$?
316 assertTrue 'FLAGS returned a non-zero result' ${r3turn}
kate.ward7a3c9c42009-04-24 00:12:35 +0000317 assertEquals 'failed int test' 1 ${FLAGS_int}
kate.warda2adce12013-01-15 00:00:39 +0000318 th_showOutput ${r3turn} "${stdoutF}" "${stderrF}"
kate.wardc5210682009-03-30 18:54:36 +0000319
320 eval set -- "${FLAGS_ARGV}"
kate.ward32d97fb2013-01-06 16:05:26 +0000321 assertEquals 'incorrect number of argv values' 7 $#
kate.ward812aeae2009-04-01 02:49:51 +0000322}
323
kate.ward7a3c9c42009-04-24 00:12:35 +0000324testComplicatedCommandLineEnhanced()
kate.ward812aeae2009-04-01 02:49:51 +0000325{
kate.ward20d9ef52013-01-06 15:56:46 +0000326 flags_getoptIsEnh || return
kate.ward812aeae2009-04-01 02:49:51 +0000327
kate.ward7a3c9c42009-04-24 00:12:35 +0000328 FLAGS -i 1 non_flag_1 --str='two' non_flag_2 --float 3 'non flag 3' \
329 >"${stdoutF}" 2>"${stderrF}"
kate.warda2adce12013-01-15 00:00:39 +0000330 r3turn=$?
331 assertTrue 'FLAGS returned a non-zero result' ${r3turn}
kate.ward7a3c9c42009-04-24 00:12:35 +0000332 assertEquals 'failed int test' 1 ${FLAGS_int}
333 assertEquals 'failed str test' 'two' "${FLAGS_str}"
334 assertEquals 'failed float test' 3 ${FLAGS_float}
kate.warda2adce12013-01-15 00:00:39 +0000335 th_showOutput ${r3turn} "${stdoutF}" "${stderrF}"
kate.ward7a3c9c42009-04-24 00:12:35 +0000336
337 eval set -- "${FLAGS_ARGV}"
338 assertEquals 'incorrect number of argv values' 3 $#
kate.wardc5210682009-03-30 18:54:36 +0000339}
kate.wardf51c6162008-06-17 16:38:35 +0000340
341#------------------------------------------------------------------------------
342# suite functions
343#
344
345oneTimeSetUp()
346{
kate.ward1b600c52008-11-12 21:26:05 +0000347 th_oneTimeSetUp
kate.wardf51c6162008-06-17 16:38:35 +0000348
kate.ward619806d2008-11-15 19:59:57 +0000349 if flags_getoptIsStd; then
350 th_warn 'Standard version of getopt found. Enhanced tests will be skipped.'
351 else
352 th_warn 'Enhanced version of getopt found. Standard tests will be skipped.'
kate.wardf51c6162008-06-17 16:38:35 +0000353 fi
354}
355
356setUp()
357{
kate.ward8fe62e62010-03-28 23:07:35 +0000358 DEFINE_boolean bool false 'boolean test' 'b'
kate.ward9ebdd162008-11-12 20:11:57 +0000359 DEFINE_float float 0.0 'float test' 'f'
360 DEFINE_integer int 0 'integer test' 'i'
361 DEFINE_string str '' 'string test' 's'
kate.wardf51c6162008-06-17 16:38:35 +0000362}
363
kate.warde10dd532013-01-04 21:52:23 +0000364tearDown()
365{
366 flags_reset
367}
368
kate.wardf51c6162008-06-17 16:38:35 +0000369# load and run shUnit2
370[ -n "${ZSH_VERSION:-}" ] && SHUNIT_PARENT=$0
371. ${TH_SHUNIT}