1#! /bin/sh 2# vim:et:ft=sh:sts=2:sw=2 3# 4# shFlags unit test for the flag definition methods 5# 6# Copyright 2008-2020 Kate Ward. All Rights Reserved. 7# Released under the Apache 2.0 license. 8# 9# Author: [email protected] (Kate Ward) 10# https://github.com/kward/shflags 11# 12### ShellCheck (http://www.shellcheck.net/) 13# Disable source following. 14# shellcheck disable=SC1090,SC1091 15 16# Exit immediately if a simple command exits with a non-zero status. 17set -e 18 19# Treat unset variables as an error when performing parameter expansion. 20set -u 21 22# These variables will be overridden by the test helpers. 23stdoutF="${TMPDIR:-/tmp}/STDOUT" 24stderrF="${TMPDIR:-/tmp}/STDERR" 25 26# Load test helpers. 27. ./shflags_test_helpers 28 29testFlagsDefine() { 30 # No arguments. 31 if _flags_define >"${stdoutF}" 2>"${stderrF}" 32 then :; else 33 assertEquals '_flags_define() with no arguments should error' "${FLAGS_ERROR}" $? 34 fi 35 assertErrorMsg '' 'no arguments' 36 37 # One argument. 38 if _flags_define arg1 >"${stdoutF}" 2>"${stderrF}" 39 then :; else 40 assertEquals '_flags_define() call with one argument should error' "${FLAGS_ERROR}" $? 41 fi 42 assertErrorMsg '' 'one argument' 43 44 # Two arguments. 45 if _flags_define arg1 arg2 >"${stdoutF}" 2>"${stderrF}" 46 then :; else 47 assertEquals '_flags_define() call with two arguments should error' "${FLAGS_ERROR}" $? 48 fi 49 assertErrorMsg '' 'two arguments' 50 51 # Three arguments. 52 if _flags_define arg1 arg2 arg3 >"${stdoutF}" 2>"${stderrF}" 53 then :; else 54 assertEquals '_flags_define() call with three arguments should error' "${FLAGS_ERROR}" $? 55 fi 56 assertErrorMsg '' 'three arguments' 57 58 # Multiple definition. Assumes working boolean definition (tested elsewhere). 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 64 assertEquals '_flags_define() with existing flag name should fail' "${FLAGS_FALSE}" $? 65 fi 66 assertTrue '_flags_define() should not overwrite previously defined default.' "${FLAGS_multiDefBool:-}" 67 assertWarnMsg '' 'existing flag' 68 69 # Duplicate dashed and underscored definition. 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 75 assertEquals '_flags_define() with duplicate dashed and underscored definition should fail' "${FLAGS_FALSE}" $? 76 fi 77 # shellcheck disable=SC2154 78 assertEquals '_flags_define() should not overwrite previously defined default.' "${FLAGS_long_name}" 'foo' 79 assertWarnMsg '' 'already exists' 80 81 # TODO(kward): test requirement of enhanced getopt. 82 83 # Invalid type. 84 if _flags_define invalid arg2 arg3 arg4 i >"${stdoutF}" 2>"${stderrF}" 85 then :; else 86 assertEquals '_flags_define() with "invalid" type should have failed.' "${FLAGS_ERROR}" $? 87 fi 88 assertErrorMsg 'unrecognized flag type' 'invalid type' 89} 90 91testBoolean() { 92 while read -r desc ok default want; do 93 flags_reset 94 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=$? 100 if [ "${ok}" -eq "${FLAGS_TRUE}" ]; then 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 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 116} 117 118testFloat() { 119 # Valid defaults. 120 for default in ${TH_FLOAT_VALID}; do 121 flags_reset 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 128 assertEquals "${desc}: DEFINE_float() failed unexpectedly." "${FLAGS_TRUE}" $? 129 fi 130 done 131 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 140 assertEquals "${desc}: DEFINE_float() expected error" "${FLAGS_ERROR}" $? 141 assertErrorMsg 142 fi 143 done 144} 145 146testInteger() { 147 # Valid defaults. 148 for default in ${TH_INT_VALID}; do 149 flags_reset 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 156 assertEquals "${desc}: DEFINE_integer() failed unexpectedly." "${FLAGS_TRUE}" $? 157 fi 158 done 159 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 168 assertEquals "${desc}: DEFINE_integer() expected error." "${FLAGS_ERROR}" $? 169 assertErrorMsg 170 fi 171 done 172} 173 174testString() { 175 # Valid defaults. 176 for default in ${TH_BOOL_VALID} ${TH_FLOAT_VALID} ${TH_INT_VALID} 'also valid' '' 177 do 178 flags_reset 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 185 assertEquals "${desc}: DEFINE_string() failed unexpectedly." "${FLAGS_TRUE}" $? 186 fi 187 done 188 189 # There are no known invalid defaults. 190} 191 192testShortNameLength() { 193 # Make sure short names are no longer than a single character. 194 : 195} 196 197testFlagNameIsReserved() { 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 202 assertEquals "expected error from DEFINE with reserved flag" "${FLAGS_ERROR}" $? 203 assertErrorMsg 'flag name (TRUE) is reserved' 204 fi 205} 206 207oneTimeSetUp() { 208 th_oneTimeSetUp 209} 210 211tearDown() { 212 flags_reset 213} 214 215# Load and run shUnit2. 216# shellcheck disable=SC2034 217[ -n "${ZSH_VERSION:-}" ] && SHUNIT_PARENT=$0 218. "${TH_SHUNIT}" 219