#! /bin/sh
# vim:et:ft=sh:sts=2:sw=2
#
# shFlags unit test for the flag definition methods
# load test helpers
. ./shflags_test_helpers
#------------------------------------------------------------------------------
# suite tests
#
testFlagsDefine()
{
# no arguments
_flags_define >"${stdoutF}" 2>"${stderrF}"
assertFalse '_flags_define() with no arguments should have failed.' $?
assertErrorMsg '' 'no arguments'
# one argument
_flags_define arg1 >"${stdoutF}" 2>"${stderrF}"
assertFalse '_flags_define() call with one argument should fail' $?
assertErrorMsg '' 'one argument'
# two arguments
_flags_define arg1 arg2 >"${stdoutF}" 2>"${stderrF}"
assertFalse '_flags_define() call with two arguments should fail' $?
assertErrorMsg '' 'two arguments'
# three arguments
_flags_define arg1 arg2 arg3 >"${stdoutF}" 2>"${stderrF}"
assertFalse '_flags_define() call with three arguments should fail' $?
assertErrorMsg '' 'three arguments'
# multiple definition -- assumes working boolean definition (tested elsewhere)
_flags_define ${__FLAGS_TYPE_BOOLEAN} multiDefBool true 'multi def #1' m
_flags_define ${__FLAGS_TYPE_BOOLEAN} multiDefBool false 'multi def #2' m \
>"${stdoutF}" 2>"${stderrF}"
assertFalse '_flags_define() with existing flag name should fail' $?
assertTrue \
'_flags_define() should not overwrite previously defined default.' \
"${FLAGS_multiDefBool:-}"
assertWarnMsg '' 'existing flag'
# duplicate dashed and underscored definition
_flags_define ${__FLAGS_TYPE_STRING} long-name 'foo' 'dashed name' l
_flags_define ${__FLAGS_TYPE_STRING} long_name 'bar' 'underscored name' l \
>"${stdoutF}" 2>"${stderrF}"
assertFalse '_flags_define() with existing flag name should fail' $?
assertEquals \
'_flags_define() should not overwrite previously defined default.' \
"${FLAGS_long_name}" 'foo'
assertWarnMsg '' 'already exists'
# TODO(kward): test requirement of enhanced getopt
# invalid type
_flags_define invalid arg2 arg3 arg4 i >"${stdoutF}" 2>"${stderrF}"
assertFalse '_flags_define() with "invalid" type should have failed.' $?
assertErrorMsg 'unrecognized flag type' 'invalid type'
}
testBoolean()
{
# test true defaults
for default in 'true' 't' 0; do
flags_reset
DEFINE_boolean boolVal "${default}" 'my boolean' b
rtrn=$?
assertTrue \
"DEFINE_boolean() call with default of '${default}' failed." \
"${FLAGS_boolVal:-}"
assertTrue \
"DEFINE_boolean() call with default of '${default}' returned faliure." \
${rtrn}
done
# test false defaults
for default in 'false' 'f' 1; do
flags_reset
DEFINE_boolean boolVal "${default}" 'my boolean' b
rtrn=$?
assertFalse \
"DEFINE_boolean() call with default of '${default}' failed." \
"${FLAGS_boolVal:-}"
assertTrue \
"DEFINE_boolean() call with default of '${default}' returned faliure." \
${rtrn}
done
# test invalid default
flags_reset
DEFINE_boolean boolVal 'invalid' 'my boolean' b >"${stdoutF}" 2>"${stderrF}"
assertFalse 'DEFINE_boolean() call with invalid default did not fail.' $?
assertErrorMsg
}
testFloat()
{
# test valid defaults
for default in ${TH_FLOAT_VALID}; do
flags_reset
DEFINE_float floatVal ${default} "float: ${default}" f
rtrn=$?
assertSame "DEFINE_float() call with valid default failed." \
${default} "${FLAGS_floatVal:-}"
assertTrue \
"DEFINE_float() call with valid default of '${default}' returned faliure." \
${rtrn}
done
# test invalid defaults
flags_reset
DEFINE_float floatVal 'invalid' 'invalid float: string' f \
>"${stdoutF}" 2>"${stderrF}"
assertFalse 'DEFINE_float() call with string value default did not fail.' $?
assertErrorMsg
}
testInteger()
{
# test valid defaults
for default in ${TH_INT_VALID}; do
flags_reset
DEFINE_integer intVal ${default} "integer: ${default}" i
rtrn=$?
assertSame \
"DEFINE_integer() call with valid default failed." \
${default} "${FLAGS_intVal:-}"
assertTrue \
"DEFINE_integer() call with valid default of '${default}' returned failure." \
${rtrn}
done
# test invalid defaults
flags_reset
DEFINE_integer intVal 1.234 'invalid integer: float' i \
>"${stdoutF}" 2>"${stderrF}"
assertFalse 'DEFINE_integer() call with float value default did not fail.' $?
assertErrorMsg 'invalid default' 'float default'
DEFINE_integer intVal -1.234 'invalid integer: negative float' i \
>"${stdoutF}" 2>"${stderrF}"
assertFalse \
'DEFINE_integer() call with negative float value default did not fail.' \
$?
assertErrorMsg 'invalid default' 'negative float default'
DEFINE_integer intVal 'invalid' 'invalid integer: string' i \
>"${stdoutF}" 2>"${stderrF}"
assertFalse \
'DEFINE_integer() call with string value default did not fail.' \
$?
assertErrorMsg 'invalid default' 'string default'
}
testString()
{
# test valid defaults
for default in \
${TH_BOOL_VALID} \
${TH_FLOAT_VALID} \
${TH_INT_VALID} \
'also valid'
do
flags_reset
DEFINE_string strVal "${default}" "string: ${default}" s
rtrn=$?
assertSame \
"DEFINE_string() call with valid default failed." \
"${default}" "${FLAGS_strVal:-}"
assertTrue \
"DEFINE_string() call with valid default of '${default}' returned faliure." \
${rtrn}
done
# test "empty" strings
flags_reset
DEFINE_string str '' "string: empty single quotes" s
rtrn=$?
assertSame \
"DEFINE_string() call with valid default failed." \
'' "${FLAGS_str:-}"
}
testShortNameLength()
{
# make sure short names are no longer than a single character
:
}
testFlagNameIsReserved()
{
( DEFINE_string TRUE '' 'true is a reserved flag name' t \
>"${stdoutF}" 2>"${stderrF}" )
rtrn=$?
assertEquals ${FLAGS_ERROR} ${rtrn}
assertErrorMsg 'flag name (TRUE) is reserved'
}
#------------------------------------------------------------------------------
# suite functions
#
oneTimeSetUp()
{
th_oneTimeSetUp
}
tearDown()
{
flags_reset
}
# load and run shUnit2
[ -n "${ZSH_VERSION:-}" ] && SHUNIT_PARENT=$0
. ${TH_SHUNIT}