blob: e93a62f57d8778773d14b6ef32f162b7cacd8661 [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.ward271aece2008-11-13 01:12:35 +000035 flags_getoptIsEnh || startSkipping
36
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.wardf51c6162008-06-17 16:38:35 +000048testValidBooleanShort()
49{
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
71testValidBooleanLong()
72{
kate.ward812aeae2009-04-01 02:49:51 +000073 flags_getoptIsEnh || startSkipping
kate.wardf51c6162008-06-17 16:38:35 +000074
kate.warde556cbf2008-11-13 00:41:59 +000075 # note: the default value of bool is 'false'
kate.wardf51c6162008-06-17 16:38:35 +000076
77 # leave flag false
78 FLAGS --nobool >"${stdoutF}" 2>"${stderrF}"
79 rtrn=$?
kate.warde556cbf2008-11-13 00:41:59 +000080 assertTrue "FLAGS returned a non-zero result (${rtrn})" ${rtrn}
kate.wardf51c6162008-06-17 16:38:35 +000081 assertFalse '--noXX flag resulted in true value.' ${FLAGS_bool:-}
kate.warde556cbf2008-11-13 00:41:59 +000082 assertFalse 'expected no output to STDERR' "[ -s '${stderrF}' ]"
kate.wardf51c6162008-06-17 16:38:35 +000083 th_showOutput ${rtrn} "${stdoutF}" "${stderrF}"
84
85 # flip flag true
86 FLAGS --bool >"${stdoutF}" 2>"${stderrF}"
87 rtrn=$?
kate.warde556cbf2008-11-13 00:41:59 +000088 assertTrue "FLAGS returned a non-zero result (${rtrn})" ${rtrn}
kate.wardf51c6162008-06-17 16:38:35 +000089 assertTrue '--XX flag resulted in false value.' ${FLAGS_bool:-}
kate.warde556cbf2008-11-13 00:41:59 +000090 assertFalse 'expected no output to STDERR' "[ -s '${stderrF}' ]"
kate.wardf51c6162008-06-17 16:38:35 +000091 th_showOutput ${rtrn} "${stdoutF}" "${stderrF}"
92
93 # flip flag back false
94 FLAGS --nobool >"${stdoutF}" 2>"${stderrF}"
95 rtrn=$?
kate.warde556cbf2008-11-13 00:41:59 +000096 assertTrue "FLAGS returned a non-zero result (${rtrn})" ${rtrn}
kate.wardf51c6162008-06-17 16:38:35 +000097 assertFalse '--noXX flag resulted in true value.' ${FLAGS_bool:-}
kate.warde556cbf2008-11-13 00:41:59 +000098 assertFalse 'expected no output to STDERR' "[ -s '${stderrF}' ]"
kate.wardf51c6162008-06-17 16:38:35 +000099 th_showOutput ${rtrn} "${stdoutF}" "${stderrF}"
100}
101
102testValidFloats()
103{
104 _testValidFloats '-f'
kate.ward812aeae2009-04-01 02:49:51 +0000105 flags_getoptIsEnh || startSkipping
kate.wardf51c6162008-06-17 16:38:35 +0000106 _testValidFloats '--float'
107}
108
109_testValidFloats()
110{
111 flag=$1
112 for value in ${TH_FLOAT_VALID}; do
kate.wardf51c6162008-06-17 16:38:35 +0000113 FLAGS ${flag} ${value} >"${stdoutF}" 2>"${stderrF}"
114 rtrn=$?
kate.ward8fe62e62010-03-28 23:07:35 +0000115 assertTrue "FLAGS ${flag} ${value} returned non-zero result (${rtrn})" \
116 ${rtrn}
117 assertEquals "float (${flag} ${value}) test failed." ${value} ${FLAGS_float}
kate.warde556cbf2008-11-13 00:41:59 +0000118 assertFalse 'expected no output to STDERR' "[ -s '${stderrF}' ]"
kate.wardf51c6162008-06-17 16:38:35 +0000119 th_showOutput ${rtrn} "${stdoutF}" "${stderrF}"
120 done
121}
122
123testInvalidFloats()
124{
125 _testInvalidFloats '-f'
kate.ward812aeae2009-04-01 02:49:51 +0000126 flags_getoptIsEnh || startSkipping
kate.wardf51c6162008-06-17 16:38:35 +0000127 _testInvalidFloats '--float'
128}
129
130_testInvalidFloats()
131{
132 flag=$1
133 for value in ${TH_FLOAT_INVALID}; do
kate.wardf51c6162008-06-17 16:38:35 +0000134 FLAGS ${flag} ${value} >"${stdoutF}" 2>"${stderrF}"
135 rtrn=$?
136 assertFalse "FLAGS (${value}) returned a zero result" ${rtrn}
kate.warde556cbf2008-11-13 00:41:59 +0000137 assertTrue 'expected no output to STDERR' "[ -s '${stderrF}' ]"
kate.wardf51c6162008-06-17 16:38:35 +0000138 done
139}
140
141testValidIntegers()
142{
143 _testValidIntegers '-i'
kate.ward812aeae2009-04-01 02:49:51 +0000144 flags_getoptIsEnh || startSkipping
kate.wardf51c6162008-06-17 16:38:35 +0000145 _testValidIntegers '--int'
146}
147
148_testValidIntegers()
149{
150 flag=$1
151 for value in ${TH_INT_VALID}; do
kate.wardf51c6162008-06-17 16:38:35 +0000152 FLAGS ${flag} ${value} >"${stdoutF}" 2>"${stderrF}"
153 rtrn=$?
kate.warde556cbf2008-11-13 00:41:59 +0000154 assertTrue "FLAGS (${value}) returned a non-zero result (${rtrn})" ${rtrn}
kate.wardf51c6162008-06-17 16:38:35 +0000155 assertEquals "integer (${value}) test failed." ${value} ${FLAGS_int}
kate.warde556cbf2008-11-13 00:41:59 +0000156 assertFalse 'expected no output to STDERR' "[ -s '${stderrF}' ]"
kate.wardf51c6162008-06-17 16:38:35 +0000157 th_showOutput ${rtrn} "${stdoutF}" "${stderrF}"
158 done
159}
160
161testInvalidIntegers()
162{
163 _testInvalidIntegers '-i'
kate.ward812aeae2009-04-01 02:49:51 +0000164 flags_getoptIsEnh || startSkipping
kate.wardf51c6162008-06-17 16:38:35 +0000165 _testInvalidIntegers '--int'
166}
167
168_testInvalidIntegers()
169{
170 flag=$1
171 for value in ${TH_INT_INVALID}; do
kate.wardf51c6162008-06-17 16:38:35 +0000172 FLAGS ${flag} ${value} >"${stdoutF}" 2>"${stderrF}"
173 rtrn=$?
174 assertFalse "invalid integer (${value}) test returned success." ${rtrn}
kate.warde556cbf2008-11-13 00:41:59 +0000175 assertTrue 'expected no output to STDERR' "[ -s '${stderrF}' ]"
kate.wardf51c6162008-06-17 16:38:35 +0000176 done
177}
178
179testValidStrings()
180{
kate.ward7a3c9c42009-04-24 00:12:35 +0000181 _testValidStrings -s single_word
kate.ward812aeae2009-04-01 02:49:51 +0000182 flags_getoptIsEnh || startSkipping
kate.ward7a3c9c42009-04-24 00:12:35 +0000183 _testValidStrings --str single_word
184 _testValidStrings --str 'string with spaces'
kate.wardf51c6162008-06-17 16:38:35 +0000185}
186
187_testValidStrings()
188{
189 flag=$1
kate.ward7a3c9c42009-04-24 00:12:35 +0000190 value=$2
191
192 FLAGS ${flag} "${value}" >"${stdoutF}" 2>"${stderrF}"
193 rtrn=$?
194 assertTrue "'FLAGS ${flag} ${value}' returned a non-zero result (${rtrn})" \
195 ${rtrn}
196 assertEquals "string (${value}) test failed." "${value}" "${FLAGS_str}"
197 if [ ${rtrn} -eq ${FLAGS_TRUE} ]; then
198 assertFalse 'expected no output to STDERR' "[ -s '${stderrF}' ]"
199 else
200 # validate that an error is thrown for unsupported getopt uses
201 assertFatalMsg '.* spaces in options'
202 fi
203 th_showOutput ${rtrn} "${stdoutF}" "${stderrF}"
kate.wardf51c6162008-06-17 16:38:35 +0000204}
205
206testMultipleFlags()
207{
208 _testMultipleFlags '-b' '-i' '-f' '-s'
kate.ward812aeae2009-04-01 02:49:51 +0000209 flags_getoptIsEnh || startSkipping
kate.wardf51c6162008-06-17 16:38:35 +0000210 _testMultipleFlags '--bool' '--int' '--float' '--str'
211}
212
213_testMultipleFlags()
214{
215 boolFlag=$1
216 intFlag=$2
217 floatFlag=$3
218 strFlag=$4
219
kate.wardf51c6162008-06-17 16:38:35 +0000220 FLAGS \
221 ${boolFlag} \
222 ${intFlag} 567 \
223 ${floatFlag} 123.45678 \
224 ${strFlag} 'some_string' \
225 >"${stdoutF}" 2>"${stderrF}"
226 rtrn=$?
227 assertTrue "use of multple flags returned a non-zero result" ${rtrn}
228 assertTrue 'boolean test failed.' ${FLAGS_bool}
229 assertNotSame 'float test failed.' 0 ${FLAGS_float}
230 assertNotSame 'integer test failed.' 0 ${FLAGS_int}
231 assertNotSame 'string test failed.' '' ${FLAGS_str}
kate.warde556cbf2008-11-13 00:41:59 +0000232 assertFalse 'expected no output to STDERR' "[ -s '${stderrF}' ]"
kate.wardf51c6162008-06-17 16:38:35 +0000233 th_showOutput ${rtrn} "${stdoutF}" "${stderrF}"
234}
235
236_testNonFlagArgs()
237{
kate.ward7a3c9c42009-04-24 00:12:35 +0000238 argc=$1
kate.wardf51c6162008-06-17 16:38:35 +0000239 shift
240
kate.ward812aeae2009-04-01 02:49:51 +0000241 FLAGS "$@" >"${stdoutF}" 2>"${stderrF}"
242 rtrn=$?
243 assertTrue 'parse returned non-zero value.' ${rtrn}
244 th_showOutput ${rtrn} "${stdoutF}" "${stderrF}"
kate.wardf51c6162008-06-17 16:38:35 +0000245
kate.wardc5210682009-03-30 18:54:36 +0000246 eval set -- "${FLAGS_ARGV}"
kate.ward7a3c9c42009-04-24 00:12:35 +0000247 assertEquals 'wrong count of argv arguments returned.' ${argc} $#
kate.wardc5210682009-03-30 18:54:36 +0000248 assertEquals 'wrong count of argc arguments returned.' 0 ${FLAGS_ARGC}
kate.wardf51c6162008-06-17 16:38:35 +0000249}
250
251testSingleNonFlagArg()
252{
253 _testNonFlagArgs 1 argOne
254}
255
256testMultipleNonFlagArgs()
257{
258 _testNonFlagArgs 3 argOne argTwo arg3
259}
260
261testMultipleNonFlagStringArgsWithSpaces()
262{
kate.ward7a3c9c42009-04-24 00:12:35 +0000263 flags_getoptIsEnh || startSkipping
kate.wardc5210682009-03-30 18:54:36 +0000264 _testNonFlagArgs 3 argOne 'arg two' arg3
kate.wardf51c6162008-06-17 16:38:35 +0000265}
266
kate.wardc5210682009-03-30 18:54:36 +0000267testFlagsWithEquals()
268{
kate.ward812aeae2009-04-01 02:49:51 +0000269 flags_getoptIsEnh || startSkipping
270
kate.wardc5210682009-03-30 18:54:36 +0000271 FLAGS --str='str_flag' 'non_flag' >"${stdoutF}" 2>"${stderrF}"
272 assertTrue 'FLAGS returned a non-zero result' $?
273 assertEquals 'string flag not set properly' 'str_flag' "${FLAGS_str}"
274 th_showOutput ${rtrn} "${stdoutF}" "${stderrF}"
275
276 eval set -- "${FLAGS_ARGV}"
277 assertEquals 'wrong count of argv arguments returned.' 1 $#
278 assertEquals 'wrong count of argc arguments returned.' 1 ${FLAGS_ARGC}
279}
280
kate.ward7a3c9c42009-04-24 00:12:35 +0000281testComplicatedCommandLineStandard()
kate.wardc5210682009-03-30 18:54:36 +0000282{
kate.ward7a3c9c42009-04-24 00:12:35 +0000283 flags_getoptIsStd || startSkipping
284
285 # note: standard getopt stops parsing after first non-flag argument :-(
286 FLAGS -i 1 non_flag_1 -s 'two' non_flag_2 -f 3 non_flag_3 \
287 >"${stdoutF}" 2>"${stderrF}"
kate.ward812aeae2009-04-01 02:49:51 +0000288 rtrn=$?
289 assertTrue 'FLAGS returned a non-zero result' ${rtrn}
kate.ward7a3c9c42009-04-24 00:12:35 +0000290 assertEquals 'failed int test' 1 ${FLAGS_int}
kate.ward812aeae2009-04-01 02:49:51 +0000291 th_showOutput ${rtrn} "${stdoutF}" "${stderrF}"
kate.wardc5210682009-03-30 18:54:36 +0000292
293 eval set -- "${FLAGS_ARGV}"
kate.ward7a3c9c42009-04-24 00:12:35 +0000294 assertEquals 'incorrect number of argv values' 7 $#
kate.ward812aeae2009-04-01 02:49:51 +0000295}
296
kate.ward7a3c9c42009-04-24 00:12:35 +0000297testComplicatedCommandLineEnhanced()
kate.ward812aeae2009-04-01 02:49:51 +0000298{
299 flags_getoptIsEnh || startSkipping
300
kate.ward7a3c9c42009-04-24 00:12:35 +0000301 FLAGS -i 1 non_flag_1 --str='two' non_flag_2 --float 3 'non flag 3' \
302 >"${stdoutF}" 2>"${stderrF}"
303 rtrn=$?
304 assertTrue 'FLAGS returned a non-zero result' ${rtrn}
305 assertEquals 'failed int test' 1 ${FLAGS_int}
306 assertEquals 'failed str test' 'two' "${FLAGS_str}"
307 assertEquals 'failed float test' 3 ${FLAGS_float}
308 th_showOutput ${rtrn} "${stdoutF}" "${stderrF}"
309
310 eval set -- "${FLAGS_ARGV}"
311 assertEquals 'incorrect number of argv values' 3 $#
kate.wardc5210682009-03-30 18:54:36 +0000312}
kate.wardf51c6162008-06-17 16:38:35 +0000313
314#------------------------------------------------------------------------------
315# suite functions
316#
317
318oneTimeSetUp()
319{
kate.ward1b600c52008-11-12 21:26:05 +0000320 th_oneTimeSetUp
kate.wardf51c6162008-06-17 16:38:35 +0000321
kate.ward619806d2008-11-15 19:59:57 +0000322 if flags_getoptIsStd; then
323 th_warn 'Standard version of getopt found. Enhanced tests will be skipped.'
324 else
325 th_warn 'Enhanced version of getopt found. Standard tests will be skipped.'
kate.wardf51c6162008-06-17 16:38:35 +0000326 fi
327}
328
329setUp()
330{
331 flags_reset
kate.ward8fe62e62010-03-28 23:07:35 +0000332 DEFINE_boolean bool false 'boolean test' 'b'
kate.ward9ebdd162008-11-12 20:11:57 +0000333 DEFINE_float float 0.0 'float test' 'f'
334 DEFINE_integer int 0 'integer test' 'i'
335 DEFINE_string str '' 'string test' 's'
kate.wardf51c6162008-06-17 16:38:35 +0000336}
337
338# load and run shUnit2
339[ -n "${ZSH_VERSION:-}" ] && SHUNIT_PARENT=$0
340. ${TH_SHUNIT}