aboutsummaryrefslogtreecommitdiffstats
path: root/src/shflags_test_parsing.sh
diff options
context:
space:
mode:
Diffstat (limited to 'src/shflags_test_parsing.sh')
-rwxr-xr-xsrc/shflags_test_parsing.sh371
1 files changed, 371 insertions, 0 deletions
diff --git a/src/shflags_test_parsing.sh b/src/shflags_test_parsing.sh
new file mode 100755
index 0000000..664db5b
--- /dev/null
+++ b/src/shflags_test_parsing.sh
@@ -0,0 +1,371 @@
+#! /bin/sh
+# $Id$
+# vim:et:ft=sh:sts=2:sw=2
+#
+# Copyright 2008 Kate Ward. All Rights Reserved.
+# Released under the LGPL (GNU Lesser General Public License)
+#
+# Author: kate.ward@forestent.com (Kate Ward)
+#
+# shFlags unit test for the flag definition methods
+#
+# TODO(kward): assert on FLAGS errors
+# TODO(kward): testNonStandardIFS()
+
+# exit immediately if a pipeline or subshell exits with a non-zero status.
+#set -e
+
+# treat unset variables as an error
+set -u
+
+# load test helpers
+. ./shflags_test_helpers
+
+#------------------------------------------------------------------------------
+# suite tests
+#
+
+testGetoptStandard()
+{
+ _flags_getoptStandard '-b' >"${stdoutF}" 2>"${stderrF}"
+ rslt=$?
+ assertTrue "didn't parse valid flag 'b'" ${rslt}
+ th_showOutput ${rslt} "${stdoutF}" "${stderrF}"
+
+ _flags_getoptStandard '-x' >"${stdoutF}" 2>"${stderrF}"
+ assertFalse "parsed invalid flag 'x'" $?
+}
+
+testGetoptEnhanced()
+{
+ flags_getoptIsEnh || return
+
+ _flags_getoptEnhanced '-b' >"${stdoutF}" 2>"${stderrF}"
+ assertTrue "didn't parse valid flag 'b'" $?
+ _flags_getoptEnhanced '--bool' >"${stdoutF}" 2>"${stderrF}"
+ assertTrue "didn't parse valid flag 'bool'" $?
+
+ _flags_getoptEnhanced '-x' >"${stdoutF}" 2>"${stderrF}"
+ assertFalse "parsed invalid flag 'x'" $?
+ _flags_getoptEnhanced '--xyz' >"${stdoutF}" 2>"${stderrF}"
+ assertFalse "parsed invalid flag 'xyz'" $?
+}
+
+testValidBoolsShort()
+{
+ FLAGS -b >"${stdoutF}" 2>"${stderrF}"
+ r3turn=$?
+ assertTrue "-b) FLAGS returned a non-zero result (${r3turn})" ${r3turn}
+ value=${FLAGS_bool:-}
+ assertTrue "-b) boolean was not true (${value})." "${value}"
+ assertFalse '-b) expected no output to STDERR' "[ -s '${stderrF}' ]"
+ test ${r3turn} -eq ${FLAGS_TRUE} -a ! -s "${stderrF}"
+ th_showOutput $? "${stdoutF}" "${stderrF}"
+
+ DEFINE_boolean bool2 true '2nd boolean' B
+ FLAGS >"${stdoutF}" 2>"${stderrF}"
+ r3turn=$?
+ assertTrue "-B) FLAGS returned a non-zero result (${r3turn})" ${r3turn}
+ value=${FLAGS_bool2:-}
+ assertTrue "-B) boolean was not true (${value})" ${value}
+ assertFalse '-B) expected no output to STDERR' "[ -s '${stderrF}' ]"
+ test ${r3turn} -eq ${FLAGS_TRUE} -a ! -s "${stderrF}"
+ th_showOutput $? "${stdoutF}" "${stderrF}"
+
+ FLAGS -B >"${stdoutF}" 2>"${stderrF}"
+ r3turn=$?
+ assertTrue "-B) FLAGS returned a non-zero result (${r3turn})" ${r3turn}
+ value=${FLAGS_bool2:-}
+ assertFalse "-B) boolean was not false (${value})" ${value}
+ assertFalse '-B) expected no output to STDERR' "[ -s '${stderrF}' ]"
+ test ${r3turn} -eq ${FLAGS_TRUE} -a ! -s "${stderrF}"
+ th_showOutput $? "${stdoutF}" "${stderrF}"
+}
+
+# TODO(kate): separate into multiple functions to reflect correct usage
+testValidBoolsLong()
+{
+ flags_getoptIsEnh || return
+
+ # Note: the default value of bool is 'false'.
+
+ # leave flag false
+ FLAGS --nobool >"${stdoutF}" 2>"${stderrF}"
+ r3turn=$?
+ assertTrue "FLAGS returned a non-zero result (${r3turn})" ${r3turn}
+ assertFalse '--noXX flag resulted in true value.' ${FLAGS_bool:-}
+ assertFalse 'expected no output to STDERR' "[ -s '${stderrF}' ]"
+ th_showOutput ${r3turn} "${stdoutF}" "${stderrF}"
+
+ # flip flag true
+ FLAGS --bool >"${stdoutF}" 2>"${stderrF}"
+ r3turn=$?
+ assertTrue "FLAGS returned a non-zero result (${r3turn})" ${r3turn}
+ assertTrue '--XX flag resulted in false value.' ${FLAGS_bool:-}
+ assertFalse 'expected no output to STDERR' "[ -s '${stderrF}' ]"
+ th_showOutput ${r3turn} "${stdoutF}" "${stderrF}"
+
+ # flip flag back false
+ FLAGS --nobool >"${stdoutF}" 2>"${stderrF}"
+ r3turn=$?
+ assertTrue "FLAGS returned a non-zero result (${r3turn})" ${r3turn}
+ assertFalse '--noXX flag resulted in true value.' ${FLAGS_bool:-}
+ assertFalse 'expected no output to STDERR' "[ -s '${stderrF}' ]"
+ th_showOutput ${r3turn} "${stdoutF}" "${stderrF}"
+}
+
+testValidFloats()
+{
+ _testValidFloats '-f'
+ flags_getoptIsEnh || return
+ _testValidFloats '--float'
+}
+
+_testValidFloats()
+{
+ flag=$1
+ for value in ${TH_FLOAT_VALID}; do
+ FLAGS ${flag} ${value} >"${stdoutF}" 2>"${stderrF}"
+ r3turn=$?
+ assertTrue "FLAGS ${flag} ${value} returned non-zero result (${r3turn})" \
+ ${r3turn}
+ assertEquals "float (${flag} ${value}) test failed." ${value} ${FLAGS_float}
+ assertFalse 'expected no output to STDERR' "[ -s '${stderrF}' ]"
+ th_showOutput ${r3turn} "${stdoutF}" "${stderrF}"
+ done
+}
+
+testInvalidFloats()
+{
+ _testInvalidFloats '-f'
+ flags_getoptIsEnh || return
+ _testInvalidFloats '--float'
+}
+
+_testInvalidFloats()
+{
+ flag=$1
+ for value in ${TH_FLOAT_INVALID}; do
+ th_clearReturn
+ (
+ FLAGS ${flag} ${value} >"${stdoutF}" 2>"${stderrF}"
+ echo $? >"${returnF}"
+ )
+ th_queryReturn
+ assertFalse "FLAGS (${value}) returned a zero result" ${th_return}
+ assertFalse 'expected no output to STDOUT' "[ -s '${stdoutF}' ]"
+ assertTrue 'expected output to STDERR' "[ -s '${stderrF}' ]"
+ done
+}
+
+testValidIntegers()
+{
+ _testValidIntegers '-i'
+ flags_getoptIsEnh || return
+ _testValidIntegers '--int'
+}
+
+_testValidIntegers()
+{
+ flag=$1
+ for value in ${TH_INT_VALID}; do
+ FLAGS ${flag} ${value} >"${stdoutF}" 2>"${stderrF}"
+ r3turn=$?
+ assertTrue "FLAGS (${value}) returned a non-zero result (${r3turn})" ${r3turn}
+ assertEquals "integer (${value}) test failed." ${value} ${FLAGS_int}
+ assertFalse 'expected no output to STDERR' "[ -s '${stderrF}' ]"
+ th_showOutput ${r3turn} "${stdoutF}" "${stderrF}"
+ done
+}
+
+testInvalidIntegers()
+{
+ _testInvalidIntegers '-i'
+ flags_getoptIsEnh || return
+ _testInvalidIntegers '--int'
+}
+
+_testInvalidIntegers()
+{
+ flag=$1
+ for value in ${TH_INT_INVALID}; do
+ th_clearReturn
+ (
+ FLAGS ${flag} ${value} >"${stdoutF}" 2>"${stderrF}"
+ echo $? >"${returnF}"
+ )
+ th_queryReturn
+ assertFalse "invalid integer (${value}) test returned success." ${th_return}
+ assertFalse 'expected no output to STDOUT' "[ -s '${stdoutF}' ]"
+ assertTrue 'expected output to STDERR' "[ -s '${stderrF}' ]"
+ done
+}
+
+testValidStrings()
+{
+ _testValidStrings -s single_word
+ if flags_getoptIsEnh; then
+ _testValidStrings --str single_word
+ _testValidStrings --str 'string with spaces'
+ fi
+}
+
+_testValidStrings()
+{
+ flag=$1
+ value=$2
+
+ FLAGS ${flag} "${value}" >"${stdoutF}" 2>"${stderrF}"
+ r3turn=$?
+ assertTrue "'FLAGS ${flag} ${value}' returned a non-zero result (${r3turn})" \
+ ${r3turn}
+ assertEquals "string (${value}) test failed." "${value}" "${FLAGS_str}"
+ if [ ${r3turn} -eq ${FLAGS_TRUE} ]; then
+ assertFalse 'expected no output to STDERR' "[ -s '${stderrF}' ]"
+ else
+ # validate that an error is thrown for unsupported getopt uses
+ assertFatalMsg '.* spaces in options'
+ fi
+ th_showOutput ${r3turn} "${stdoutF}" "${stderrF}"
+}
+
+testMultipleFlags()
+{
+ _testMultipleFlags '-b' '-i' '-f' '-s'
+ flags_getoptIsEnh || return
+ _testMultipleFlags '--bool' '--int' '--float' '--str'
+}
+
+_testMultipleFlags()
+{
+ boolFlag=$1
+ intFlag=$2
+ floatFlag=$3
+ strFlag=$4
+
+ FLAGS \
+ ${boolFlag} \
+ ${intFlag} 567 \
+ ${floatFlag} 123.45678 \
+ ${strFlag} 'some_string' \
+ >"${stdoutF}" 2>"${stderrF}"
+ r3turn=$?
+ assertTrue "use of multple flags returned a non-zero result" ${r3turn}
+ assertTrue 'boolean test failed.' ${FLAGS_bool}
+ assertNotSame 'float test failed.' 0 ${FLAGS_float}
+ assertNotSame 'integer test failed.' 0 ${FLAGS_int}
+ assertNotSame 'string test failed.' '' ${FLAGS_str}
+ assertFalse 'expected no output to STDERR' "[ -s '${stderrF}' ]"
+ th_showOutput ${r3turn} "${stdoutF}" "${stderrF}"
+}
+
+_testNonFlagArgs()
+{
+ argc=$1
+ shift
+
+ FLAGS "$@" >"${stdoutF}" 2>"${stderrF}"
+ r3turn=$?
+ assertTrue 'parse returned non-zero value.' ${r3turn}
+ th_showOutput ${r3turn} "${stdoutF}" "${stderrF}"
+
+ eval set -- "${FLAGS_ARGV}"
+ assertEquals 'wrong count of argv arguments returned.' ${argc} $#
+ assertEquals 'wrong count of argc arguments returned.' 0 ${FLAGS_ARGC}
+}
+
+testSingleNonFlagArg()
+{
+ _testNonFlagArgs 1 argOne
+}
+
+testMultipleNonFlagArgs()
+{
+ _testNonFlagArgs 3 argOne argTwo arg3
+}
+
+testMultipleNonFlagStringArgsWithSpaces()
+{
+ flags_getoptIsEnh || return
+ _testNonFlagArgs 3 argOne 'arg two' arg3
+}
+
+testFlagsWithEquals()
+{
+ flags_getoptIsEnh || return
+
+ FLAGS --str='str_flag' 'non_flag' >"${stdoutF}" 2>"${stderrF}"
+ assertTrue 'FLAGS returned a non-zero result' $?
+ assertEquals 'string flag not set properly' 'str_flag' "${FLAGS_str}"
+ th_showOutput ${r3turn} "${stdoutF}" "${stderrF}"
+
+ eval set -- "${FLAGS_ARGV}"
+ assertEquals 'wrong count of argv arguments returned.' 1 $#
+ assertEquals 'wrong count of argc arguments returned.' 1 ${FLAGS_ARGC}
+}
+
+testComplicatedCommandLineStandard()
+{
+ flags_getoptIsEnh && return
+
+ # Note: standard getopt stops parsing after first non-flag argument, which
+ # results in the remaining flags being treated as arguments instead.
+ FLAGS -i 1 non_flag_1 -s 'two' non_flag_2 -f 3 non_flag_3 \
+ >"${stdoutF}" 2>"${stderrF}"
+ r3turn=$?
+ assertTrue 'FLAGS returned a non-zero result' ${r3turn}
+ assertEquals 'failed int test' 1 ${FLAGS_int}
+ th_showOutput ${r3turn} "${stdoutF}" "${stderrF}"
+
+ eval set -- "${FLAGS_ARGV}"
+ assertEquals 'incorrect number of argv values' 7 $#
+}
+
+testComplicatedCommandLineEnhanced()
+{
+ flags_getoptIsEnh || return
+
+ FLAGS -i 1 non_flag_1 --str='two' non_flag_2 --float 3 'non flag 3' \
+ >"${stdoutF}" 2>"${stderrF}"
+ r3turn=$?
+ assertTrue 'FLAGS returned a non-zero result' ${r3turn}
+ assertEquals 'failed int test' 1 ${FLAGS_int}
+ assertEquals 'failed str test' 'two' "${FLAGS_str}"
+ assertEquals 'failed float test' 3 ${FLAGS_float}
+ th_showOutput ${r3turn} "${stdoutF}" "${stderrF}"
+
+ eval set -- "${FLAGS_ARGV}"
+ assertEquals 'incorrect number of argv values' 3 $#
+}
+
+#------------------------------------------------------------------------------
+# suite functions
+#
+
+oneTimeSetUp()
+{
+ th_oneTimeSetUp
+
+ if flags_getoptIsStd; then
+ th_warn 'Standard version of getopt found. Enhanced tests will be skipped.'
+ else
+ th_warn 'Enhanced version of getopt found. Standard tests will be skipped.'
+ fi
+}
+
+setUp()
+{
+ DEFINE_boolean bool false 'boolean test' 'b'
+ DEFINE_float float 0.0 'float test' 'f'
+ DEFINE_integer int 0 'integer test' 'i'
+ DEFINE_string str '' 'string test' 's'
+}
+
+tearDown()
+{
+ flags_reset
+}
+
+# load and run shUnit2
+[ -n "${ZSH_VERSION:-}" ] && SHUNIT_PARENT=$0
+. ${TH_SHUNIT}