kate.ward | f51c616 | 2008-06-17 16:38:35 +0000 | [diff] [blame] | 1 | #! /bin/sh |
| 2 | # vim:et:ft=sh:sts=2:sw=2 |
| 3 | # |
kate.ward | f51c616 | 2008-06-17 16:38:35 +0000 | [diff] [blame] | 4 | # shFlags unit test for the flag definition methods |
Kate Ward | 08f81ed | 2017-10-17 23:41:42 +0200 | [diff] [blame] | 5 | # |
Kate Ward | 77a6d9e | 2020-04-10 14:30:13 +0200 | [diff] [blame] | 6 | # Copyright 2008-2020 Kate Ward. All Rights Reserved. |
Kate Ward | 08f81ed | 2017-10-17 23:41:42 +0200 | [diff] [blame] | 7 | # Released under the Apache 2.0 license. |
| 8 | # |
| 9 | # Author: kate.ward@forestent.com (Kate Ward) |
| 10 | # https://github.com/kward/shflags |
| 11 | # |
| 12 | ### ShellCheck (http://www.shellcheck.net/) |
| 13 | # Disable source following. |
| 14 | # shellcheck disable=SC1090,SC1091 |
kate.ward | f51c616 | 2008-06-17 16:38:35 +0000 | [diff] [blame] | 15 | |
Kate Ward | ffe0a6b | 2020-03-29 18:28:56 +0200 | [diff] [blame] | 16 | # Exit immediately if a simple command exits with a non-zero status. |
Kate Ward | 77a6d9e | 2020-04-10 14:30:13 +0200 | [diff] [blame] | 17 | set -e |
| 18 | |
| 19 | # Treat unset variables as an error when performing parameter expansion. |
| 20 | set -u |
Kate Ward | ffe0a6b | 2020-03-29 18:28:56 +0200 | [diff] [blame] | 21 | |
Kate Ward | 08f81ed | 2017-10-17 23:41:42 +0200 | [diff] [blame] | 22 | # These variables will be overridden by the test helpers. |
| 23 | stdoutF="${TMPDIR:-/tmp}/STDOUT" |
| 24 | stderrF="${TMPDIR:-/tmp}/STDERR" |
| 25 | |
| 26 | # Load test helpers. |
kate.ward | f51c616 | 2008-06-17 16:38:35 +0000 | [diff] [blame] | 27 | . ./shflags_test_helpers |
| 28 | |
Kate Ward | 08f81ed | 2017-10-17 23:41:42 +0200 | [diff] [blame] | 29 | testFlagsDefine() { |
| 30 | # No arguments. |
Kate Ward | 77a6d9e | 2020-04-10 14:30:13 +0200 | [diff] [blame] | 31 | if _flags_define >"${stdoutF}" 2>"${stderrF}" |
| 32 | then :; else |
Kate Ward | 1e62c87 | 2020-04-10 15:27:52 +0200 | [diff] [blame] | 33 | assertEquals '_flags_define() with no arguments should error' "${FLAGS_ERROR}" $? |
Kate Ward | 77a6d9e | 2020-04-10 14:30:13 +0200 | [diff] [blame] | 34 | fi |
kate.ward | f99f485 | 2008-11-12 20:14:45 +0000 | [diff] [blame] | 35 | assertErrorMsg '' 'no arguments' |
kate.ward | f51c616 | 2008-06-17 16:38:35 +0000 | [diff] [blame] | 36 | |
Kate Ward | 08f81ed | 2017-10-17 23:41:42 +0200 | [diff] [blame] | 37 | # One argument. |
Kate Ward | 77a6d9e | 2020-04-10 14:30:13 +0200 | [diff] [blame] | 38 | if _flags_define arg1 >"${stdoutF}" 2>"${stderrF}" |
| 39 | then :; else |
Kate Ward | 1e62c87 | 2020-04-10 15:27:52 +0200 | [diff] [blame] | 40 | assertEquals '_flags_define() call with one argument should error' "${FLAGS_ERROR}" $? |
Kate Ward | 77a6d9e | 2020-04-10 14:30:13 +0200 | [diff] [blame] | 41 | fi |
kate.ward | f99f485 | 2008-11-12 20:14:45 +0000 | [diff] [blame] | 42 | assertErrorMsg '' 'one argument' |
kate.ward | f51c616 | 2008-06-17 16:38:35 +0000 | [diff] [blame] | 43 | |
Kate Ward | 08f81ed | 2017-10-17 23:41:42 +0200 | [diff] [blame] | 44 | # Two arguments. |
Kate Ward | 77a6d9e | 2020-04-10 14:30:13 +0200 | [diff] [blame] | 45 | if _flags_define arg1 arg2 >"${stdoutF}" 2>"${stderrF}" |
| 46 | then :; else |
Kate Ward | 1e62c87 | 2020-04-10 15:27:52 +0200 | [diff] [blame] | 47 | assertEquals '_flags_define() call with two arguments should error' "${FLAGS_ERROR}" $? |
Kate Ward | 77a6d9e | 2020-04-10 14:30:13 +0200 | [diff] [blame] | 48 | fi |
kate.ward | f99f485 | 2008-11-12 20:14:45 +0000 | [diff] [blame] | 49 | assertErrorMsg '' 'two arguments' |
kate.ward | f51c616 | 2008-06-17 16:38:35 +0000 | [diff] [blame] | 50 | |
Kate Ward | 08f81ed | 2017-10-17 23:41:42 +0200 | [diff] [blame] | 51 | # Three arguments. |
Kate Ward | 77a6d9e | 2020-04-10 14:30:13 +0200 | [diff] [blame] | 52 | if _flags_define arg1 arg2 arg3 >"${stdoutF}" 2>"${stderrF}" |
| 53 | then :; else |
Kate Ward | 1e62c87 | 2020-04-10 15:27:52 +0200 | [diff] [blame] | 54 | assertEquals '_flags_define() call with three arguments should error' "${FLAGS_ERROR}" $? |
Kate Ward | 77a6d9e | 2020-04-10 14:30:13 +0200 | [diff] [blame] | 55 | fi |
kate.ward | f99f485 | 2008-11-12 20:14:45 +0000 | [diff] [blame] | 56 | assertErrorMsg '' 'three arguments' |
kate.ward | f51c616 | 2008-06-17 16:38:35 +0000 | [diff] [blame] | 57 | |
Kate Ward | 08f81ed | 2017-10-17 23:41:42 +0200 | [diff] [blame] | 58 | # Multiple definition. Assumes working boolean definition (tested elsewhere). |
Kate Ward | 77a6d9e | 2020-04-10 14:30:13 +0200 | [diff] [blame] | 59 | if ! _flags_define "${__FLAGS_TYPE_BOOLEAN}" multiDefBool true 'multi def #1' m; then |
| 60 | fail "didn't expect _flags_define for 'multi def #1' to fail" |
| 61 | fi |
| 62 | if _flags_define "${__FLAGS_TYPE_BOOLEAN}" multiDefBool false 'multi def #2' m >"${stdoutF}" 2>"${stderrF}" |
| 63 | then :; else |
Kate Ward | 1e62c87 | 2020-04-10 15:27:52 +0200 | [diff] [blame] | 64 | assertEquals '_flags_define() with existing flag name should fail' "${FLAGS_FALSE}" $? |
Kate Ward | 77a6d9e | 2020-04-10 14:30:13 +0200 | [diff] [blame] | 65 | fi |
| 66 | assertTrue '_flags_define() should not overwrite previously defined default.' "${FLAGS_multiDefBool:-}" |
kate.ward | f99f485 | 2008-11-12 20:14:45 +0000 | [diff] [blame] | 67 | assertWarnMsg '' 'existing flag' |
kate.ward | f51c616 | 2008-06-17 16:38:35 +0000 | [diff] [blame] | 68 | |
Kate Ward | 08f81ed | 2017-10-17 23:41:42 +0200 | [diff] [blame] | 69 | # Duplicate dashed and underscored definition. |
Kate Ward | 77a6d9e | 2020-04-10 14:30:13 +0200 | [diff] [blame] | 70 | if ! _flags_define "${__FLAGS_TYPE_STRING}" long-name 'foo' 'dashed name' l; then |
| 71 | fail "didn't expect _flags_define() for 'dashed name' to fail" |
| 72 | fi |
| 73 | if _flags_define "${__FLAGS_TYPE_STRING}" long_name 'bar' 'underscored name' l >"${stdoutF}" 2>"${stderrF}" |
| 74 | then :; else |
Kate Ward | 1e62c87 | 2020-04-10 15:27:52 +0200 | [diff] [blame] | 75 | assertEquals '_flags_define() with duplicate dashed and underscored definition should fail' "${FLAGS_FALSE}" $? |
Kate Ward | 77a6d9e | 2020-04-10 14:30:13 +0200 | [diff] [blame] | 76 | fi |
Kate Ward | 08f81ed | 2017-10-17 23:41:42 +0200 | [diff] [blame] | 77 | # shellcheck disable=SC2154 |
Kate Ward | 77a6d9e | 2020-04-10 14:30:13 +0200 | [diff] [blame] | 78 | assertEquals '_flags_define() should not overwrite previously defined default.' "${FLAGS_long_name}" 'foo' |
kate.ward | da8d2c0 | 2011-06-28 13:26:02 +0000 | [diff] [blame] | 79 | assertWarnMsg '' 'already exists' |
| 80 | |
Kate Ward | 08f81ed | 2017-10-17 23:41:42 +0200 | [diff] [blame] | 81 | # TODO(kward): test requirement of enhanced getopt. |
kate.ward | f51c616 | 2008-06-17 16:38:35 +0000 | [diff] [blame] | 82 | |
Kate Ward | 08f81ed | 2017-10-17 23:41:42 +0200 | [diff] [blame] | 83 | # Invalid type. |
Kate Ward | 77a6d9e | 2020-04-10 14:30:13 +0200 | [diff] [blame] | 84 | if _flags_define invalid arg2 arg3 arg4 i >"${stdoutF}" 2>"${stderrF}" |
| 85 | then :; else |
Kate Ward | 1e62c87 | 2020-04-10 15:27:52 +0200 | [diff] [blame] | 86 | assertEquals '_flags_define() with "invalid" type should have failed.' "${FLAGS_ERROR}" $? |
Kate Ward | 77a6d9e | 2020-04-10 14:30:13 +0200 | [diff] [blame] | 87 | fi |
kate.ward | f99f485 | 2008-11-12 20:14:45 +0000 | [diff] [blame] | 88 | assertErrorMsg 'unrecognized flag type' 'invalid type' |
kate.ward | f51c616 | 2008-06-17 16:38:35 +0000 | [diff] [blame] | 89 | } |
| 90 | |
Kate Ward | 08f81ed | 2017-10-17 23:41:42 +0200 | [diff] [blame] | 91 | testBoolean() { |
Kate Ward | 77a6d9e | 2020-04-10 14:30:13 +0200 | [diff] [blame] | 92 | while read -r desc ok default want; do |
kate.ward | f51c616 | 2008-06-17 16:38:35 +0000 | [diff] [blame] | 93 | flags_reset |
kate.ward | f51c616 | 2008-06-17 16:38:35 +0000 | [diff] [blame] | 94 | |
Kate Ward | 77a6d9e | 2020-04-10 14:30:13 +0200 | [diff] [blame] | 95 | if DEFINE_boolean boolVal "${default}" 'my boolean' b >"${stdoutF}" 2>"${stderrF}" |
| 96 | then |
| 97 | assertEquals "${desc}: incorrect FLAGS_boolVal value" "${FLAGS_boolVal:-}" "${want}" |
| 98 | else |
| 99 | got=$? |
Kate Ward | 1e62c87 | 2020-04-10 15:27:52 +0200 | [diff] [blame] | 100 | if [ "${ok}" -eq "${FLAGS_TRUE}" ]; then |
Kate Ward | 77a6d9e | 2020-04-10 14:30:13 +0200 | [diff] [blame] | 101 | assertEquals "${desc}: DEFINE_boolean() failed unexpectedly" "${want}" "${got}" |
| 102 | else |
| 103 | assertEquals "${desc}: DEFINE_boolean() expected different return value" "${want}" "${got}" |
| 104 | assertErrorMsg |
| 105 | fi |
| 106 | fi |
| 107 | done <<EOF |
| 108 | true_long ${FLAGS_TRUE} true ${FLAGS_TRUE} |
| 109 | true_short ${FLAGS_TRUE} t ${FLAGS_TRUE} |
| 110 | true_int ${FLAGS_TRUE} 0 ${FLAGS_TRUE} |
| 111 | false_long ${FLAGS_TRUE} false ${FLAGS_FALSE} |
| 112 | false_short ${FLAGS_TRUE} f ${FLAGS_FALSE} |
| 113 | false_int ${FLAGS_TRUE} 1 ${FLAGS_FALSE} |
| 114 | invalid ${FLAGS_FALSE} invalid ${FLAGS_ERROR} |
| 115 | EOF |
kate.ward | f51c616 | 2008-06-17 16:38:35 +0000 | [diff] [blame] | 116 | } |
| 117 | |
Kate Ward | 08f81ed | 2017-10-17 23:41:42 +0200 | [diff] [blame] | 118 | testFloat() { |
Kate Ward | 77a6d9e | 2020-04-10 14:30:13 +0200 | [diff] [blame] | 119 | # Valid defaults. |
kate.ward | 60095fa | 2013-01-05 13:55:29 +0000 | [diff] [blame] | 120 | for default in ${TH_FLOAT_VALID}; do |
kate.ward | f51c616 | 2008-06-17 16:38:35 +0000 | [diff] [blame] | 121 | flags_reset |
Kate Ward | 77a6d9e | 2020-04-10 14:30:13 +0200 | [diff] [blame] | 122 | desc="valid_float_val='${default}'" |
| 123 | if DEFINE_float floatVal "${default}" 'valid float' f |
| 124 | then |
| 125 | got="${FLAGS_floatVal:-}" want="${default}" |
| 126 | assertEquals "${desc}: incorrect FLAGS_floatVal value" "${want}" "${got}" |
| 127 | else |
Kate Ward | 1e62c87 | 2020-04-10 15:27:52 +0200 | [diff] [blame] | 128 | assertEquals "${desc}: DEFINE_float() failed unexpectedly." "${FLAGS_TRUE}" $? |
Kate Ward | 77a6d9e | 2020-04-10 14:30:13 +0200 | [diff] [blame] | 129 | fi |
kate.ward | f51c616 | 2008-06-17 16:38:35 +0000 | [diff] [blame] | 130 | done |
| 131 | |
Kate Ward | 77a6d9e | 2020-04-10 14:30:13 +0200 | [diff] [blame] | 132 | # Invalid defaults. |
| 133 | for default in ${TH_FLOAT_INVALID}; do |
| 134 | flags_reset |
| 135 | desc="invalid_float_val='${default}'" |
| 136 | if DEFINE_float floatVal "${default}" 'invalid float' f >"${stdoutF}" 2>"${stderrF}" |
| 137 | then |
| 138 | fail "${desc}: expected DEFINE_float() to fail" |
| 139 | else |
Kate Ward | 1e62c87 | 2020-04-10 15:27:52 +0200 | [diff] [blame] | 140 | assertEquals "${desc}: DEFINE_float() expected error" "${FLAGS_ERROR}" $? |
Kate Ward | 77a6d9e | 2020-04-10 14:30:13 +0200 | [diff] [blame] | 141 | assertErrorMsg |
| 142 | fi |
| 143 | done |
kate.ward | f51c616 | 2008-06-17 16:38:35 +0000 | [diff] [blame] | 144 | } |
| 145 | |
Kate Ward | 08f81ed | 2017-10-17 23:41:42 +0200 | [diff] [blame] | 146 | testInteger() { |
Kate Ward | 77a6d9e | 2020-04-10 14:30:13 +0200 | [diff] [blame] | 147 | # Valid defaults. |
kate.ward | 60095fa | 2013-01-05 13:55:29 +0000 | [diff] [blame] | 148 | for default in ${TH_INT_VALID}; do |
kate.ward | f51c616 | 2008-06-17 16:38:35 +0000 | [diff] [blame] | 149 | flags_reset |
Kate Ward | 77a6d9e | 2020-04-10 14:30:13 +0200 | [diff] [blame] | 150 | desc="valid_int_val='${default}'" |
| 151 | if DEFINE_integer intVal "${default}" 'valid integer' i |
| 152 | then |
| 153 | got="${FLAGS_intVal:-}" want="${default}" |
| 154 | assertEquals "${desc}: incorrect FLAGS_intVal value" "${want}" "${got}" |
| 155 | else |
Kate Ward | 1e62c87 | 2020-04-10 15:27:52 +0200 | [diff] [blame] | 156 | assertEquals "${desc}: DEFINE_integer() failed unexpectedly." "${FLAGS_TRUE}" $? |
Kate Ward | 77a6d9e | 2020-04-10 14:30:13 +0200 | [diff] [blame] | 157 | fi |
kate.ward | f51c616 | 2008-06-17 16:38:35 +0000 | [diff] [blame] | 158 | done |
| 159 | |
Kate Ward | 77a6d9e | 2020-04-10 14:30:13 +0200 | [diff] [blame] | 160 | # Invalid defaults. |
| 161 | for default in ${TH_INT_INVALID}; do |
| 162 | flags_reset |
| 163 | desc="invalid_int_val='${default}'" |
| 164 | if DEFINE_integer intVal "${default}" 'invalid integer' i >"${stdoutF}" 2>"${stderrF}" |
| 165 | then |
| 166 | fail "${desc}: expected DEFINE_integer() to fail" |
| 167 | else |
Kate Ward | 1e62c87 | 2020-04-10 15:27:52 +0200 | [diff] [blame] | 168 | assertEquals "${desc}: DEFINE_integer() expected error." "${FLAGS_ERROR}" $? |
Kate Ward | 77a6d9e | 2020-04-10 14:30:13 +0200 | [diff] [blame] | 169 | assertErrorMsg |
| 170 | fi |
| 171 | done |
kate.ward | f51c616 | 2008-06-17 16:38:35 +0000 | [diff] [blame] | 172 | } |
| 173 | |
Kate Ward | 77a6d9e | 2020-04-10 14:30:13 +0200 | [diff] [blame] | 174 | testString() { |
| 175 | # Valid defaults. |
| 176 | for default in ${TH_BOOL_VALID} ${TH_FLOAT_VALID} ${TH_INT_VALID} 'also valid' '' |
kate.ward | 60095fa | 2013-01-05 13:55:29 +0000 | [diff] [blame] | 177 | do |
kate.ward | f51c616 | 2008-06-17 16:38:35 +0000 | [diff] [blame] | 178 | flags_reset |
Kate Ward | 77a6d9e | 2020-04-10 14:30:13 +0200 | [diff] [blame] | 179 | desc="valid_string_val='${default}'" |
| 180 | if DEFINE_string strVal "${default}" "string: ${default}" s |
| 181 | then |
| 182 | got="${FLAGS_strVal:-}" want="${default}" |
| 183 | assertEquals "${desc}: incorrect FLAGS_strVal value" "${want}" "${got}" |
| 184 | else |
Kate Ward | 1e62c87 | 2020-04-10 15:27:52 +0200 | [diff] [blame] | 185 | assertEquals "${desc}: DEFINE_string() failed unexpectedly." "${FLAGS_TRUE}" $? |
Kate Ward | 77a6d9e | 2020-04-10 14:30:13 +0200 | [diff] [blame] | 186 | fi |
kate.ward | f51c616 | 2008-06-17 16:38:35 +0000 | [diff] [blame] | 187 | done |
| 188 | |
Kate Ward | 77a6d9e | 2020-04-10 14:30:13 +0200 | [diff] [blame] | 189 | # There are no known invalid defaults. |
kate.ward | f51c616 | 2008-06-17 16:38:35 +0000 | [diff] [blame] | 190 | } |
| 191 | |
Kate Ward | 08f81ed | 2017-10-17 23:41:42 +0200 | [diff] [blame] | 192 | testShortNameLength() { |
| 193 | # Make sure short names are no longer than a single character. |
kate.ward | f51c616 | 2008-06-17 16:38:35 +0000 | [diff] [blame] | 194 | : |
| 195 | } |
| 196 | |
Kate Ward | 08f81ed | 2017-10-17 23:41:42 +0200 | [diff] [blame] | 197 | testFlagNameIsReserved() { |
Kate Ward | 77a6d9e | 2020-04-10 14:30:13 +0200 | [diff] [blame] | 198 | if DEFINE_string TRUE '' 'true is a reserved flag name' t >"${stdoutF}" 2>"${stderrF}" |
| 199 | then |
| 200 | fail "expected DEFINE with reserved flag name to fail" |
| 201 | else |
Kate Ward | 1e62c87 | 2020-04-10 15:27:52 +0200 | [diff] [blame] | 202 | assertEquals "expected error from DEFINE with reserved flag" "${FLAGS_ERROR}" $? |
Kate Ward | 77a6d9e | 2020-04-10 14:30:13 +0200 | [diff] [blame] | 203 | assertErrorMsg 'flag name (TRUE) is reserved' |
| 204 | fi |
kate.ward | 39913d1 | 2009-04-01 14:09:23 +0000 | [diff] [blame] | 205 | } |
| 206 | |
Kate Ward | 08f81ed | 2017-10-17 23:41:42 +0200 | [diff] [blame] | 207 | oneTimeSetUp() { |
kate.ward | 1b600c5 | 2008-11-12 21:26:05 +0000 | [diff] [blame] | 208 | th_oneTimeSetUp |
kate.ward | f51c616 | 2008-06-17 16:38:35 +0000 | [diff] [blame] | 209 | } |
| 210 | |
Kate Ward | 08f81ed | 2017-10-17 23:41:42 +0200 | [diff] [blame] | 211 | tearDown() { |
kate.ward | f51c616 | 2008-06-17 16:38:35 +0000 | [diff] [blame] | 212 | flags_reset |
| 213 | } |
| 214 | |
Kate Ward | 08f81ed | 2017-10-17 23:41:42 +0200 | [diff] [blame] | 215 | # Load and run shUnit2. |
| 216 | # shellcheck disable=SC2034 |
kate.ward | f51c616 | 2008-06-17 16:38:35 +0000 | [diff] [blame] | 217 | [ -n "${ZSH_VERSION:-}" ] && SHUNIT_PARENT=$0 |
Kate Ward | 08f81ed | 2017-10-17 23:41:42 +0200 | [diff] [blame] | 218 | . "${TH_SHUNIT}" |