blob: c52ce712ab7c0d7b966df18002bc42929415a8f6 [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
15# 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 # flip flag to true
51 FLAGS -b >"${stdoutF}" 2>"${stderrF}"
52 rtrn=$?
kate.ward9ebdd162008-11-12 20:11:57 +000053 assertTrue "FLAGS returned a non-zero result (${rtrn})" ${rtrn}
54 value=${FLAGS_bool:-}
55 assertTrue "boolean was not true (${value})." "${value}"
56 assertFalse 'expected no output to STDERR' "[ -s '${stderrF}' ]"
kate.wardabae05d2008-11-12 22:37:05 +000057 test ${rtrn} -eq ${FLAGS_TRUE} -a ! -s "${stderrF}"
58 th_showOutput $? "${stdoutF}" "${stderrF}"
kate.wardf51c6162008-06-17 16:38:35 +000059
60 # verify that passing the option a second time leaves the flag true
61 FLAGS -b >"${stdoutF}" 2>"${stderrF}"
62 rtrn=$?
kate.ward9ebdd162008-11-12 20:11:57 +000063 assertTrue "repeat: FLAGS returned a non-zero result (${rtrn})" ${rtrn}
64 value=${FLAGS_bool:-}
65 assertTrue "repeat: boolean was not true (${value})" ${value}
66 assertFalse 'repeat: expected no output to STDERR' "[ -s '${stderrF}' ]"
kate.wardabae05d2008-11-12 22:37:05 +000067 test ${rtrn} -eq ${FLAGS_TRUE} -a ! -s "${stderrF}"
68 th_showOutput $? "${stdoutF}" "${stderrF}"
kate.wardf51c6162008-06-17 16:38:35 +000069}
70
kate.warde10dd532013-01-04 21:52:23 +000071# TODO(kate): separate into multiple functions to reflect correct usage
72testValidBoolsLong()
kate.wardf51c6162008-06-17 16:38:35 +000073{
kate.ward20d9ef52013-01-06 15:56:46 +000074 flags_getoptIsEnh || return
kate.wardf51c6162008-06-17 16:38:35 +000075
kate.warde10dd532013-01-04 21:52:23 +000076 # Note: the default value of bool is 'false'.
kate.wardf51c6162008-06-17 16:38:35 +000077
78 # leave flag false
79 FLAGS --nobool >"${stdoutF}" 2>"${stderrF}"
80 rtrn=$?
kate.warde556cbf2008-11-13 00:41:59 +000081 assertTrue "FLAGS returned a non-zero result (${rtrn})" ${rtrn}
kate.wardf51c6162008-06-17 16:38:35 +000082 assertFalse '--noXX flag resulted in true value.' ${FLAGS_bool:-}
kate.warde556cbf2008-11-13 00:41:59 +000083 assertFalse 'expected no output to STDERR' "[ -s '${stderrF}' ]"
kate.wardf51c6162008-06-17 16:38:35 +000084 th_showOutput ${rtrn} "${stdoutF}" "${stderrF}"
85
86 # flip flag true
87 FLAGS --bool >"${stdoutF}" 2>"${stderrF}"
88 rtrn=$?
kate.warde556cbf2008-11-13 00:41:59 +000089 assertTrue "FLAGS returned a non-zero result (${rtrn})" ${rtrn}
kate.wardf51c6162008-06-17 16:38:35 +000090 assertTrue '--XX flag resulted in false value.' ${FLAGS_bool:-}
kate.warde556cbf2008-11-13 00:41:59 +000091 assertFalse 'expected no output to STDERR' "[ -s '${stderrF}' ]"
kate.wardf51c6162008-06-17 16:38:35 +000092 th_showOutput ${rtrn} "${stdoutF}" "${stderrF}"
93
94 # flip flag back false
95 FLAGS --nobool >"${stdoutF}" 2>"${stderrF}"
96 rtrn=$?
kate.warde556cbf2008-11-13 00:41:59 +000097 assertTrue "FLAGS returned a non-zero result (${rtrn})" ${rtrn}
kate.wardf51c6162008-06-17 16:38:35 +000098 assertFalse '--noXX flag resulted in true value.' ${FLAGS_bool:-}
kate.warde556cbf2008-11-13 00:41:59 +000099 assertFalse 'expected no output to STDERR' "[ -s '${stderrF}' ]"
kate.wardf51c6162008-06-17 16:38:35 +0000100 th_showOutput ${rtrn} "${stdoutF}" "${stderrF}"
101}
102
103testValidFloats()
104{
105 _testValidFloats '-f'
kate.ward20d9ef52013-01-06 15:56:46 +0000106 flags_getoptIsEnh || return
kate.wardf51c6162008-06-17 16:38:35 +0000107 _testValidFloats '--float'
108}
109
110_testValidFloats()
111{
112 flag=$1
113 for value in ${TH_FLOAT_VALID}; do
kate.wardf51c6162008-06-17 16:38:35 +0000114 FLAGS ${flag} ${value} >"${stdoutF}" 2>"${stderrF}"
115 rtrn=$?
kate.ward8fe62e62010-03-28 23:07:35 +0000116 assertTrue "FLAGS ${flag} ${value} returned non-zero result (${rtrn})" \
117 ${rtrn}
118 assertEquals "float (${flag} ${value}) test failed." ${value} ${FLAGS_float}
kate.warde556cbf2008-11-13 00:41:59 +0000119 assertFalse 'expected no output to STDERR' "[ -s '${stderrF}' ]"
kate.wardf51c6162008-06-17 16:38:35 +0000120 th_showOutput ${rtrn} "${stdoutF}" "${stderrF}"
121 done
122}
123
124testInvalidFloats()
125{
126 _testInvalidFloats '-f'
kate.ward20d9ef52013-01-06 15:56:46 +0000127 flags_getoptIsEnh || return
kate.wardf51c6162008-06-17 16:38:35 +0000128 _testInvalidFloats '--float'
129}
130
131_testInvalidFloats()
132{
133 flag=$1
134 for value in ${TH_FLOAT_INVALID}; do
kate.warde10dd532013-01-04 21:52:23 +0000135 ( FLAGS ${flag} ${value} >"${stdoutF}" 2>"${stderrF}"; )
kate.wardf51c6162008-06-17 16:38:35 +0000136 rtrn=$?
137 assertFalse "FLAGS (${value}) returned a zero result" ${rtrn}
kate.warde10dd532013-01-04 21:52:23 +0000138 assertFalse 'expected no output to STDOUT' "[ -s '${stdoutF}' ]"
139 assertTrue 'expected output to STDERR' "[ -s '${stderrF}' ]"
kate.wardf51c6162008-06-17 16:38:35 +0000140 done
141}
142
143testValidIntegers()
144{
145 _testValidIntegers '-i'
kate.ward20d9ef52013-01-06 15:56:46 +0000146 flags_getoptIsEnh || return
kate.wardf51c6162008-06-17 16:38:35 +0000147 _testValidIntegers '--int'
148}
149
150_testValidIntegers()
151{
152 flag=$1
153 for value in ${TH_INT_VALID}; do
kate.wardf51c6162008-06-17 16:38:35 +0000154 FLAGS ${flag} ${value} >"${stdoutF}" 2>"${stderrF}"
155 rtrn=$?
kate.warde556cbf2008-11-13 00:41:59 +0000156 assertTrue "FLAGS (${value}) returned a non-zero result (${rtrn})" ${rtrn}
kate.wardf51c6162008-06-17 16:38:35 +0000157 assertEquals "integer (${value}) test failed." ${value} ${FLAGS_int}
kate.warde556cbf2008-11-13 00:41:59 +0000158 assertFalse 'expected no output to STDERR' "[ -s '${stderrF}' ]"
kate.wardf51c6162008-06-17 16:38:35 +0000159 th_showOutput ${rtrn} "${stdoutF}" "${stderrF}"
160 done
161}
162
163testInvalidIntegers()
164{
165 _testInvalidIntegers '-i'
kate.ward20d9ef52013-01-06 15:56:46 +0000166 flags_getoptIsEnh || return
kate.wardf51c6162008-06-17 16:38:35 +0000167 _testInvalidIntegers '--int'
168}
169
170_testInvalidIntegers()
171{
172 flag=$1
173 for value in ${TH_INT_INVALID}; do
kate.warde10dd532013-01-04 21:52:23 +0000174 ( FLAGS ${flag} ${value} >"${stdoutF}" 2>"${stderrF}"; )
kate.wardf51c6162008-06-17 16:38:35 +0000175 rtrn=$?
176 assertFalse "invalid integer (${value}) test returned success." ${rtrn}
kate.warde10dd532013-01-04 21:52:23 +0000177 assertFalse 'expected no output to STDOUT' "[ -s '${stdoutF}' ]"
178 assertTrue 'expected output to STDERR' "[ -s '${stderrF}' ]"
kate.wardf51c6162008-06-17 16:38:35 +0000179 done
180}
181
182testValidStrings()
183{
kate.ward7a3c9c42009-04-24 00:12:35 +0000184 _testValidStrings -s single_word
kate.ward20d9ef52013-01-06 15:56:46 +0000185 if flags_getoptIsEnh; then
186 _testValidStrings --str single_word
187 _testValidStrings --str 'string with spaces'
188 fi
kate.wardf51c6162008-06-17 16:38:35 +0000189}
190
191_testValidStrings()
192{
193 flag=$1
kate.ward7a3c9c42009-04-24 00:12:35 +0000194 value=$2
195
196 FLAGS ${flag} "${value}" >"${stdoutF}" 2>"${stderrF}"
197 rtrn=$?
198 assertTrue "'FLAGS ${flag} ${value}' returned a non-zero result (${rtrn})" \
199 ${rtrn}
200 assertEquals "string (${value}) test failed." "${value}" "${FLAGS_str}"
201 if [ ${rtrn} -eq ${FLAGS_TRUE} ]; then
202 assertFalse 'expected no output to STDERR' "[ -s '${stderrF}' ]"
203 else
204 # validate that an error is thrown for unsupported getopt uses
205 assertFatalMsg '.* spaces in options'
206 fi
207 th_showOutput ${rtrn} "${stdoutF}" "${stderrF}"
kate.wardf51c6162008-06-17 16:38:35 +0000208}
209
210testMultipleFlags()
211{
212 _testMultipleFlags '-b' '-i' '-f' '-s'
kate.ward20d9ef52013-01-06 15:56:46 +0000213 flags_getoptIsEnh || return
kate.wardf51c6162008-06-17 16:38:35 +0000214 _testMultipleFlags '--bool' '--int' '--float' '--str'
215}
216
217_testMultipleFlags()
218{
219 boolFlag=$1
220 intFlag=$2
221 floatFlag=$3
222 strFlag=$4
223
kate.wardf51c6162008-06-17 16:38:35 +0000224 FLAGS \
225 ${boolFlag} \
226 ${intFlag} 567 \
227 ${floatFlag} 123.45678 \
228 ${strFlag} 'some_string' \
229 >"${stdoutF}" 2>"${stderrF}"
230 rtrn=$?
231 assertTrue "use of multple flags returned a non-zero result" ${rtrn}
232 assertTrue 'boolean test failed.' ${FLAGS_bool}
233 assertNotSame 'float test failed.' 0 ${FLAGS_float}
234 assertNotSame 'integer test failed.' 0 ${FLAGS_int}
235 assertNotSame 'string test failed.' '' ${FLAGS_str}
kate.warde556cbf2008-11-13 00:41:59 +0000236 assertFalse 'expected no output to STDERR' "[ -s '${stderrF}' ]"
kate.wardf51c6162008-06-17 16:38:35 +0000237 th_showOutput ${rtrn} "${stdoutF}" "${stderrF}"
238}
239
240_testNonFlagArgs()
241{
kate.ward7a3c9c42009-04-24 00:12:35 +0000242 argc=$1
kate.wardf51c6162008-06-17 16:38:35 +0000243 shift
244
kate.ward812aeae2009-04-01 02:49:51 +0000245 FLAGS "$@" >"${stdoutF}" 2>"${stderrF}"
246 rtrn=$?
247 assertTrue 'parse returned non-zero value.' ${rtrn}
248 th_showOutput ${rtrn} "${stdoutF}" "${stderrF}"
kate.wardf51c6162008-06-17 16:38:35 +0000249
kate.wardc5210682009-03-30 18:54:36 +0000250 eval set -- "${FLAGS_ARGV}"
kate.ward7a3c9c42009-04-24 00:12:35 +0000251 assertEquals 'wrong count of argv arguments returned.' ${argc} $#
kate.wardc5210682009-03-30 18:54:36 +0000252 assertEquals 'wrong count of argc arguments returned.' 0 ${FLAGS_ARGC}
kate.wardf51c6162008-06-17 16:38:35 +0000253}
254
255testSingleNonFlagArg()
256{
257 _testNonFlagArgs 1 argOne
258}
259
260testMultipleNonFlagArgs()
261{
262 _testNonFlagArgs 3 argOne argTwo arg3
263}
264
265testMultipleNonFlagStringArgsWithSpaces()
266{
kate.ward20d9ef52013-01-06 15:56:46 +0000267 flags_getoptIsEnh || return
kate.wardc5210682009-03-30 18:54:36 +0000268 _testNonFlagArgs 3 argOne 'arg two' arg3
kate.wardf51c6162008-06-17 16:38:35 +0000269}
270
kate.wardc5210682009-03-30 18:54:36 +0000271testFlagsWithEquals()
272{
kate.ward20d9ef52013-01-06 15:56:46 +0000273 flags_getoptIsEnh || return
kate.ward812aeae2009-04-01 02:49:51 +0000274
kate.wardc5210682009-03-30 18:54:36 +0000275 FLAGS --str='str_flag' 'non_flag' >"${stdoutF}" 2>"${stderrF}"
276 assertTrue 'FLAGS returned a non-zero result' $?
277 assertEquals 'string flag not set properly' 'str_flag' "${FLAGS_str}"
278 th_showOutput ${rtrn} "${stdoutF}" "${stderrF}"
279
280 eval set -- "${FLAGS_ARGV}"
281 assertEquals 'wrong count of argv arguments returned.' 1 $#
282 assertEquals 'wrong count of argc arguments returned.' 1 ${FLAGS_ARGC}
283}
284
kate.ward7a3c9c42009-04-24 00:12:35 +0000285testComplicatedCommandLineStandard()
kate.wardc5210682009-03-30 18:54:36 +0000286{
kate.ward7a3c9c42009-04-24 00:12:35 +0000287 # note: standard getopt stops parsing after first non-flag argument :-(
288 FLAGS -i 1 non_flag_1 -s 'two' non_flag_2 -f 3 non_flag_3 \
289 >"${stdoutF}" 2>"${stderrF}"
kate.ward812aeae2009-04-01 02:49:51 +0000290 rtrn=$?
291 assertTrue 'FLAGS returned a non-zero result' ${rtrn}
kate.ward7a3c9c42009-04-24 00:12:35 +0000292 assertEquals 'failed int test' 1 ${FLAGS_int}
kate.ward20d9ef52013-01-06 15:56:46 +0000293 assertEquals 'failed str test' 'two' "${FLAGS_str}"
294 assertEquals 'failed float test' 3 ${FLAGS_float}
kate.ward812aeae2009-04-01 02:49:51 +0000295 th_showOutput ${rtrn} "${stdoutF}" "${stderrF}"
kate.wardc5210682009-03-30 18:54:36 +0000296
297 eval set -- "${FLAGS_ARGV}"
kate.ward20d9ef52013-01-06 15:56:46 +0000298 assertEquals 'incorrect number of argv values' 3 $#
kate.ward812aeae2009-04-01 02:49:51 +0000299}
300
kate.ward7a3c9c42009-04-24 00:12:35 +0000301testComplicatedCommandLineEnhanced()
kate.ward812aeae2009-04-01 02:49:51 +0000302{
kate.ward20d9ef52013-01-06 15:56:46 +0000303 flags_getoptIsEnh || return
kate.ward812aeae2009-04-01 02:49:51 +0000304
kate.ward7a3c9c42009-04-24 00:12:35 +0000305 FLAGS -i 1 non_flag_1 --str='two' non_flag_2 --float 3 'non flag 3' \
306 >"${stdoutF}" 2>"${stderrF}"
307 rtrn=$?
308 assertTrue 'FLAGS returned a non-zero result' ${rtrn}
309 assertEquals 'failed int test' 1 ${FLAGS_int}
310 assertEquals 'failed str test' 'two' "${FLAGS_str}"
311 assertEquals 'failed float test' 3 ${FLAGS_float}
312 th_showOutput ${rtrn} "${stdoutF}" "${stderrF}"
313
314 eval set -- "${FLAGS_ARGV}"
315 assertEquals 'incorrect number of argv values' 3 $#
kate.wardc5210682009-03-30 18:54:36 +0000316}
kate.wardf51c6162008-06-17 16:38:35 +0000317
318#------------------------------------------------------------------------------
319# suite functions
320#
321
322oneTimeSetUp()
323{
kate.ward1b600c52008-11-12 21:26:05 +0000324 th_oneTimeSetUp
kate.wardf51c6162008-06-17 16:38:35 +0000325
kate.ward619806d2008-11-15 19:59:57 +0000326 if flags_getoptIsStd; then
327 th_warn 'Standard version of getopt found. Enhanced tests will be skipped.'
328 else
329 th_warn 'Enhanced version of getopt found. Standard tests will be skipped.'
kate.wardf51c6162008-06-17 16:38:35 +0000330 fi
331}
332
333setUp()
334{
kate.ward8fe62e62010-03-28 23:07:35 +0000335 DEFINE_boolean bool false 'boolean test' 'b'
kate.ward9ebdd162008-11-12 20:11:57 +0000336 DEFINE_float float 0.0 'float test' 'f'
337 DEFINE_integer int 0 'integer test' 'i'
338 DEFINE_string str '' 'string test' 's'
kate.wardf51c6162008-06-17 16:38:35 +0000339}
340
kate.warde10dd532013-01-04 21:52:23 +0000341tearDown()
342{
343 flags_reset
344}
345
kate.wardf51c6162008-06-17 16:38:35 +0000346# load and run shUnit2
347[ -n "${ZSH_VERSION:-}" ] && SHUNIT_PARENT=$0
348. ${TH_SHUNIT}