blob: 7f5baf762e4076d6d8b66974f434fe7d39aaf403 [file] [log] [blame]
kate.wardf51c6162008-06-17 16:38:35 +00001#! /bin/sh
2# vim:et:ft=sh:sts=2:sw=2
3#
kate.wardf51c6162008-06-17 16:38:35 +00004# shFlags unit test for the flag definition methods
Kate Ward08f81ed2017-10-17 23:41:42 +02005#
Kate Ward77a6d9e2020-04-10 14:30:13 +02006# Copyright 2008-2020 Kate Ward. All Rights Reserved.
Kate Ward08f81ed2017-10-17 23:41:42 +02007# 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.wardf51c6162008-06-17 16:38:35 +000015
Kate Wardffe0a6b2020-03-29 18:28:56 +020016# Exit immediately if a simple command exits with a non-zero status.
Kate Ward77a6d9e2020-04-10 14:30:13 +020017set -e
18
19# Treat unset variables as an error when performing parameter expansion.
20set -u
Kate Wardffe0a6b2020-03-29 18:28:56 +020021
Kate Ward08f81ed2017-10-17 23:41:42 +020022# These variables will be overridden by the test helpers.
23stdoutF="${TMPDIR:-/tmp}/STDOUT"
24stderrF="${TMPDIR:-/tmp}/STDERR"
25
26# Load test helpers.
kate.wardf51c6162008-06-17 16:38:35 +000027. ./shflags_test_helpers
28
Kate Ward08f81ed2017-10-17 23:41:42 +020029testFlagsDefine() {
30 # No arguments.
Kate Ward77a6d9e2020-04-10 14:30:13 +020031 if _flags_define >"${stdoutF}" 2>"${stderrF}"
32 then :; else
Kate Ward1e62c872020-04-10 15:27:52 +020033 assertEquals '_flags_define() with no arguments should error' "${FLAGS_ERROR}" $?
Kate Ward77a6d9e2020-04-10 14:30:13 +020034 fi
kate.wardf99f4852008-11-12 20:14:45 +000035 assertErrorMsg '' 'no arguments'
kate.wardf51c6162008-06-17 16:38:35 +000036
Kate Ward08f81ed2017-10-17 23:41:42 +020037 # One argument.
Kate Ward77a6d9e2020-04-10 14:30:13 +020038 if _flags_define arg1 >"${stdoutF}" 2>"${stderrF}"
39 then :; else
Kate Ward1e62c872020-04-10 15:27:52 +020040 assertEquals '_flags_define() call with one argument should error' "${FLAGS_ERROR}" $?
Kate Ward77a6d9e2020-04-10 14:30:13 +020041 fi
kate.wardf99f4852008-11-12 20:14:45 +000042 assertErrorMsg '' 'one argument'
kate.wardf51c6162008-06-17 16:38:35 +000043
Kate Ward08f81ed2017-10-17 23:41:42 +020044 # Two arguments.
Kate Ward77a6d9e2020-04-10 14:30:13 +020045 if _flags_define arg1 arg2 >"${stdoutF}" 2>"${stderrF}"
46 then :; else
Kate Ward1e62c872020-04-10 15:27:52 +020047 assertEquals '_flags_define() call with two arguments should error' "${FLAGS_ERROR}" $?
Kate Ward77a6d9e2020-04-10 14:30:13 +020048 fi
kate.wardf99f4852008-11-12 20:14:45 +000049 assertErrorMsg '' 'two arguments'
kate.wardf51c6162008-06-17 16:38:35 +000050
Kate Ward08f81ed2017-10-17 23:41:42 +020051 # Three arguments.
Kate Ward77a6d9e2020-04-10 14:30:13 +020052 if _flags_define arg1 arg2 arg3 >"${stdoutF}" 2>"${stderrF}"
53 then :; else
Kate Ward1e62c872020-04-10 15:27:52 +020054 assertEquals '_flags_define() call with three arguments should error' "${FLAGS_ERROR}" $?
Kate Ward77a6d9e2020-04-10 14:30:13 +020055 fi
kate.wardf99f4852008-11-12 20:14:45 +000056 assertErrorMsg '' 'three arguments'
kate.wardf51c6162008-06-17 16:38:35 +000057
Kate Ward08f81ed2017-10-17 23:41:42 +020058 # Multiple definition. Assumes working boolean definition (tested elsewhere).
Kate Ward77a6d9e2020-04-10 14:30:13 +020059 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 Ward1e62c872020-04-10 15:27:52 +020064 assertEquals '_flags_define() with existing flag name should fail' "${FLAGS_FALSE}" $?
Kate Ward77a6d9e2020-04-10 14:30:13 +020065 fi
66 assertTrue '_flags_define() should not overwrite previously defined default.' "${FLAGS_multiDefBool:-}"
kate.wardf99f4852008-11-12 20:14:45 +000067 assertWarnMsg '' 'existing flag'
kate.wardf51c6162008-06-17 16:38:35 +000068
Kate Ward08f81ed2017-10-17 23:41:42 +020069 # Duplicate dashed and underscored definition.
Kate Ward77a6d9e2020-04-10 14:30:13 +020070 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 Ward1e62c872020-04-10 15:27:52 +020075 assertEquals '_flags_define() with duplicate dashed and underscored definition should fail' "${FLAGS_FALSE}" $?
Kate Ward77a6d9e2020-04-10 14:30:13 +020076 fi
Kate Ward08f81ed2017-10-17 23:41:42 +020077 # shellcheck disable=SC2154
Kate Ward77a6d9e2020-04-10 14:30:13 +020078 assertEquals '_flags_define() should not overwrite previously defined default.' "${FLAGS_long_name}" 'foo'
kate.wardda8d2c02011-06-28 13:26:02 +000079 assertWarnMsg '' 'already exists'
80
Kate Ward08f81ed2017-10-17 23:41:42 +020081 # TODO(kward): test requirement of enhanced getopt.
kate.wardf51c6162008-06-17 16:38:35 +000082
Kate Ward08f81ed2017-10-17 23:41:42 +020083 # Invalid type.
Kate Ward77a6d9e2020-04-10 14:30:13 +020084 if _flags_define invalid arg2 arg3 arg4 i >"${stdoutF}" 2>"${stderrF}"
85 then :; else
Kate Ward1e62c872020-04-10 15:27:52 +020086 assertEquals '_flags_define() with "invalid" type should have failed.' "${FLAGS_ERROR}" $?
Kate Ward77a6d9e2020-04-10 14:30:13 +020087 fi
kate.wardf99f4852008-11-12 20:14:45 +000088 assertErrorMsg 'unrecognized flag type' 'invalid type'
kate.wardf51c6162008-06-17 16:38:35 +000089}
90
Kate Ward08f81ed2017-10-17 23:41:42 +020091testBoolean() {
Kate Ward77a6d9e2020-04-10 14:30:13 +020092 while read -r desc ok default want; do
kate.wardf51c6162008-06-17 16:38:35 +000093 flags_reset
kate.wardf51c6162008-06-17 16:38:35 +000094
Kate Ward77a6d9e2020-04-10 14:30:13 +020095 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 Ward1e62c872020-04-10 15:27:52 +0200100 if [ "${ok}" -eq "${FLAGS_TRUE}" ]; then
Kate Ward77a6d9e2020-04-10 14:30:13 +0200101 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
108true_long ${FLAGS_TRUE} true ${FLAGS_TRUE}
109true_short ${FLAGS_TRUE} t ${FLAGS_TRUE}
110true_int ${FLAGS_TRUE} 0 ${FLAGS_TRUE}
111false_long ${FLAGS_TRUE} false ${FLAGS_FALSE}
112false_short ${FLAGS_TRUE} f ${FLAGS_FALSE}
113false_int ${FLAGS_TRUE} 1 ${FLAGS_FALSE}
114invalid ${FLAGS_FALSE} invalid ${FLAGS_ERROR}
115EOF
kate.wardf51c6162008-06-17 16:38:35 +0000116}
117
Kate Ward08f81ed2017-10-17 23:41:42 +0200118testFloat() {
Kate Ward77a6d9e2020-04-10 14:30:13 +0200119 # Valid defaults.
kate.ward60095fa2013-01-05 13:55:29 +0000120 for default in ${TH_FLOAT_VALID}; do
kate.wardf51c6162008-06-17 16:38:35 +0000121 flags_reset
Kate Ward77a6d9e2020-04-10 14:30:13 +0200122 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 Ward1e62c872020-04-10 15:27:52 +0200128 assertEquals "${desc}: DEFINE_float() failed unexpectedly." "${FLAGS_TRUE}" $?
Kate Ward77a6d9e2020-04-10 14:30:13 +0200129 fi
kate.wardf51c6162008-06-17 16:38:35 +0000130 done
131
Kate Ward77a6d9e2020-04-10 14:30:13 +0200132 # 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 Ward1e62c872020-04-10 15:27:52 +0200140 assertEquals "${desc}: DEFINE_float() expected error" "${FLAGS_ERROR}" $?
Kate Ward77a6d9e2020-04-10 14:30:13 +0200141 assertErrorMsg
142 fi
143 done
kate.wardf51c6162008-06-17 16:38:35 +0000144}
145
Kate Ward08f81ed2017-10-17 23:41:42 +0200146testInteger() {
Kate Ward77a6d9e2020-04-10 14:30:13 +0200147 # Valid defaults.
kate.ward60095fa2013-01-05 13:55:29 +0000148 for default in ${TH_INT_VALID}; do
kate.wardf51c6162008-06-17 16:38:35 +0000149 flags_reset
Kate Ward77a6d9e2020-04-10 14:30:13 +0200150 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 Ward1e62c872020-04-10 15:27:52 +0200156 assertEquals "${desc}: DEFINE_integer() failed unexpectedly." "${FLAGS_TRUE}" $?
Kate Ward77a6d9e2020-04-10 14:30:13 +0200157 fi
kate.wardf51c6162008-06-17 16:38:35 +0000158 done
159
Kate Ward77a6d9e2020-04-10 14:30:13 +0200160 # 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 Ward1e62c872020-04-10 15:27:52 +0200168 assertEquals "${desc}: DEFINE_integer() expected error." "${FLAGS_ERROR}" $?
Kate Ward77a6d9e2020-04-10 14:30:13 +0200169 assertErrorMsg
170 fi
171 done
kate.wardf51c6162008-06-17 16:38:35 +0000172}
173
Kate Ward77a6d9e2020-04-10 14:30:13 +0200174testString() {
175 # Valid defaults.
176 for default in ${TH_BOOL_VALID} ${TH_FLOAT_VALID} ${TH_INT_VALID} 'also valid' ''
kate.ward60095fa2013-01-05 13:55:29 +0000177 do
kate.wardf51c6162008-06-17 16:38:35 +0000178 flags_reset
Kate Ward77a6d9e2020-04-10 14:30:13 +0200179 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 Ward1e62c872020-04-10 15:27:52 +0200185 assertEquals "${desc}: DEFINE_string() failed unexpectedly." "${FLAGS_TRUE}" $?
Kate Ward77a6d9e2020-04-10 14:30:13 +0200186 fi
kate.wardf51c6162008-06-17 16:38:35 +0000187 done
188
Kate Ward77a6d9e2020-04-10 14:30:13 +0200189 # There are no known invalid defaults.
kate.wardf51c6162008-06-17 16:38:35 +0000190}
191
Kate Ward08f81ed2017-10-17 23:41:42 +0200192testShortNameLength() {
193 # Make sure short names are no longer than a single character.
kate.wardf51c6162008-06-17 16:38:35 +0000194 :
195}
196
Kate Ward08f81ed2017-10-17 23:41:42 +0200197testFlagNameIsReserved() {
Kate Ward77a6d9e2020-04-10 14:30:13 +0200198 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 Ward1e62c872020-04-10 15:27:52 +0200202 assertEquals "expected error from DEFINE with reserved flag" "${FLAGS_ERROR}" $?
Kate Ward77a6d9e2020-04-10 14:30:13 +0200203 assertErrorMsg 'flag name (TRUE) is reserved'
204 fi
kate.ward39913d12009-04-01 14:09:23 +0000205}
206
Kate Ward08f81ed2017-10-17 23:41:42 +0200207oneTimeSetUp() {
kate.ward1b600c52008-11-12 21:26:05 +0000208 th_oneTimeSetUp
kate.wardf51c6162008-06-17 16:38:35 +0000209}
210
Kate Ward08f81ed2017-10-17 23:41:42 +0200211tearDown() {
kate.wardf51c6162008-06-17 16:38:35 +0000212 flags_reset
213}
214
Kate Ward08f81ed2017-10-17 23:41:42 +0200215# Load and run shUnit2.
216# shellcheck disable=SC2034
kate.wardf51c6162008-06-17 16:38:35 +0000217[ -n "${ZSH_VERSION:-}" ] && SHUNIT_PARENT=$0
Kate Ward08f81ed2017-10-17 23:41:42 +0200218. "${TH_SHUNIT}"