1#! /bin/sh 2# vim:et:ft=sh:sts=2:sw=2 3# 4# shFlags unit test for the public functions. 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# $() are not fully portable (POSIX != portable). 16# shellcheck disable=SC2006 17 18# These variables will be overridden by the test helpers. 19expectedF="${TMPDIR:-/tmp}/expected" 20returnF="${TMPDIR:-/tmp}/return" 21stdoutF="${TMPDIR:-/tmp}/STDOUT" 22stderrF="${TMPDIR:-/tmp}/STDERR" 23 24# Load test helpers. 25. ./shflags_test_helpers 26 27testHelp() { 28 _testHelp '-h' 29 _testHelp '--help' 30} 31 32_testHelp() { 33 if ! flags_getoptIsEnh; then 34 return 35 fi 36 37 flag=$1 38 39 # Test default help output. 40 th_clearReturn 41 ( 42 FLAGS "${flag}" >"${stdoutF}" 2>"${stderrF}" 43 echo $? >"${returnF}" 44 ) 45 assertFalse \ 46 'short help request should have returned a false exit code.' \ 47 "$(th_queryReturn)" 48 (grep 'show this help' "${stderrF}" >/dev/null) 49 r3turn=$? 50 assertTrue \ 51 'short request for help should have produced some help output.' \ 52 ${r3turn} 53 [ ${r3turn} -ne "${FLAGS_TRUE}" ] && th_showOutput 54 55 # Test proper output when FLAGS_HELP set. 56 ( 57 FLAGS_HELP='this is a test' 58 FLAGS "${flag}" >"${stdoutF}" 2>"${stderrF}" 59 ) 60 (grep 'this is a test' "${stderrF}" >/dev/null) 61 r3turn=$? 62 assertTrue 'setting FLAGS_HELP did not produce expected result' ${r3turn} 63 [ ${r3turn} -ne "${FLAGS_TRUE}" ] && th_showOutput 64 65 # Test that "'" chars work in help string. 66 ( 67 # shellcheck disable=SC2034 68 DEFINE_boolean b false "help string containing a ' char" b 69 FLAGS "${flag}" >"${stdoutF}" 2>"${stderrF}" 70 ) 71 (grep "help string containing a ' char" "${stderrF}" >/dev/null) 72 r3turn=$? 73 assertTrue "help strings containing apostrophes don't work" ${r3turn} 74 [ ${r3turn} -ne "${FLAGS_TRUE}" ] && th_showOutput 75 76 return "${SHUNIT_TRUE}" 77} 78 79mock_flags_columns() { 80 echo 80 81} 82 83testStandardHelpOutput() { 84 if ! flags_getoptIsStd; then 85 startSkipping 86 fi 87 88 DEFINE_boolean test_bool false 'test boolean' b 89 DEFINE_integer test_int 0 'test integer' i 90 DEFINE_string test_str '' 'test string' s 91 DEFINE_string long_desc 'blah' \ 92 'testing of a long description to force wrap of default value' D 93 DEFINE_string long_default \ 94 'this_is_a_long_default_value_to_force_alternate_indentation' \ 95 'testing of long default value' F 96 97 # Test for https://github.com/kward/shflags/issues/28. 98 DEFINE_boolean 'force' false '' f 99 100 help='USAGE: standard [flags] args' 101 102 cat >"${expectedF}" <<EOF 103${help} 104flags: 105 -b test boolean (default: false) 106 -i test integer (default: 0) 107 -s test string (default: '') 108 -D testing of a long description to force wrap of default value 109 (default: 'blah') 110 -F testing of long default value 111 (default: 'this_is_a_long_default_value_to_force_alternate_indentation') 112 -f (default: false) 113 -h show this help (default: false) 114EOF 115 ( 116 _flags_columns() { mock_flags_columns; } 117 FLAGS_HELP=${help}; 118 # Wrap FLAGS call in if/then/else so 'set -e' works properly. 119 if FLAGS -h >"${stdoutF}" 2>"${stderrF}"; then 120 rtrn=$? 121 else 122 rtrn=$? 123 fi 124 echo "${rtrn}" >"${returnF}" 125 ) 126 assertFalse 'a call for help should return a non-zero exit code.' "$(th_queryReturn)" 127 128 if ! diff "${expectedF}" "${stderrF}" >/dev/null; then 129 fail 'unexpected help output' 130 th_showOutput 131 fi 132} 133 134testEnhancedHelpOutput() { 135 if ! flags_getoptIsEnh; then 136 startSkipping 137 fi 138 139 # shellcheck disable=SC2034 140 DEFINE_boolean test_bool false 'test boolean' b 141 # shellcheck disable=SC2034 142 DEFINE_integer test_int 0 'test integer' i 143 # shellcheck disable=SC2034 144 DEFINE_string test_str '' 'test string' s 145 # shellcheck disable=SC2034 146 DEFINE_string long_desc 'blah' \ 147 'testing of a long description to force wrap of default value' D 148 # shellcheck disable=SC2034 149 DEFINE_string long_default \ 150 'this_is_a_long_default_value_to_force_alternate_indentation' \ 151 'testing of long default value' F 152 153 # Test for https://github.com/kward/shflags/issues/28. 154 DEFINE_boolean 'force' false '' f 155 156 help='USAGE: enhanced [flags] args' 157 158 cat >"${expectedF}" <<EOF 159${help} 160flags: 161 -b,--[no]test_bool: test boolean (default: false) 162 -i,--test_int: test integer (default: 0) 163 -s,--test_str: test string (default: '') 164 -D,--long_desc: testing of a long description to force wrap of default value 165 (default: 'blah') 166 -F,--long_default: testing of long default value 167 (default: 'this_is_a_long_default_value_to_force_alternate_indentation') 168 -f,--[no]force: (default: false) 169 -h,--help: show this help (default: false) 170EOF 171 ( 172 _flags_columns() { mock_flags_columns; } 173 # shellcheck disable=SC2034 174 FLAGS_HELP=${help} 175 # Wrap FLAGS call in if/then/else so 'set -e' works properly. 176 if FLAGS -h >"${stdoutF}" 2>"${stderrF}"; then 177 rtrn=$? 178 else 179 rtrn=$? 180 fi 181 echo "${rtrn}" >"${returnF}" 182 ) 183 assertFalse 'a call for help should return a non-zero exit code.' "$(th_queryReturn)" 184 185 if ! diff "${expectedF}" "${stderrF}" >/dev/null; then 186 fail 'unexpected help output' 187 th_showOutput 188 fi 189} 190 191testNoHelp() { 192 if ! flags_getoptIsEnh; then 193 startSkipping 194 fi 195 196 ( FLAGS --nohelp >"${stdoutF}" 2>"${stderrF}" ) 197 r3turn=$? 198 assertTrue "FLAGS returned a non-zero result (${r3turn})" ${r3turn} 199 assertFalse 'expected no output to STDOUT' "[ -s '${stdoutF}' ]" 200 assertFalse 'expected no output to STDERR' "[ -s '${stderrF}' ]" 201} 202 203testLoggingLevel() { 204 # Check that the default logging level is set properly. 205 got=`flags_loggingLevel` want=${__FLAGS_LEVEL_DEFAULT} 206 assertTrue "Unexpected default logging level = ${got}, want ${want}" "[ ${got} -eq ${want} ]" 207 208 # Override the logging level, and check again. 209 flags_setLoggingLevel "${FLAGS_LEVEL_FATAL}" 210 flags_setLoggingLevel "${FLAGS_LEVEL_INFO}" 211 got=`flags_loggingLevel` want=${FLAGS_LEVEL_INFO} 212 assertTrue "Unexpected configured logging level = ${got}, want ${want}" "[ ${got} -eq ${want} ]" 213} 214 215# According to https://github.com/kward/shflags/issues/28 216# 217# DEFINE_boolean misbehaves when help-string is empty 218testIssue28() { 219 # shellcheck disable=SC2034 220 DEFINE_boolean 'force' false '' f 221 222 testHelp && return 223} 224 225oneTimeSetUp() { 226 th_oneTimeSetUp 227 228 if flags_getoptIsStd; then 229 th_warn 'Standard version of getopt found. Enhanced tests will be skipped.' 230 return 231 fi 232 th_warn 'Enhanced version of getopt found. Standard tests will be skipped.' 233} 234 235setUp() { 236 flags_reset 237} 238 239# Load and run shUnit2. 240# shellcheck disable=SC2034 241[ -n "${ZSH_VERSION:-}" ] && SHUNIT_PARENT=$0 242. "${TH_SHUNIT}" 243