blob: ad6eab15b9edda99f276195dea0817d04d8755f9 [file] [log] [blame]
kate.ward2fb41e32008-07-10 18:42:46 +00001#! /bin/sh
2# vim:et:ft=sh:sts=2:sw=2
3#
Kate Warddc385d52017-08-04 20:47:11 +02004# shFlags unit test for the public functions.
Kate Wardef7daa52017-10-18 00:16:36 +02005#
Kate Ward4c286832020-03-29 18:20:07 +02006# Copyright 2008-2020 Kate Ward. All Rights Reserved.
Kate Wardef7daa52017-10-18 00:16:36 +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 Ward3908d0f2018-01-18 01:05:45 +010015# $() are not fully portable (POSIX != portable).
16# shellcheck disable=SC2006
kate.ward2fb41e32008-07-10 18:42:46 +000017
Kate Wardef7daa52017-10-18 00:16:36 +020018# 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.
kate.ward2fb41e32008-07-10 18:42:46 +000025. ./shflags_test_helpers
26
Kate Wardef7daa52017-10-18 00:16:36 +020027testHelp() {
kate.warda2adce12013-01-15 00:00:39 +000028 _testHelp '-h'
kate.warda2adce12013-01-15 00:00:39 +000029 _testHelp '--help'
30}
kate.ward2fb41e32008-07-10 18:42:46 +000031
Kate Wardef7daa52017-10-18 00:16:36 +020032_testHelp() {
Kate Ward4bfa9832020-04-12 00:52:31 +020033 if ! flags_getoptIsEnh; then
34 return
35 fi
Kate Ward9cfea862020-03-29 23:59:46 +020036
kate.warda2adce12013-01-15 00:00:39 +000037 flag=$1
38
Kate Wardef7daa52017-10-18 00:16:36 +020039 # Test default help output.
kate.warda2adce12013-01-15 00:00:39 +000040 th_clearReturn
41 (
Kate Wardef7daa52017-10-18 00:16:36 +020042 FLAGS "${flag}" >"${stdoutF}" 2>"${stderrF}"
kate.warda2adce12013-01-15 00:00:39 +000043 echo $? >"${returnF}"
44 )
Kate Ward16e8d0d2017-10-21 19:45:29 +020045 assertFalse \
Kate Ward4c286832020-03-29 18:20:07 +020046 'short help request should have returned a false exit code.' \
Kate Warde46d6322017-10-18 00:02:22 +020047 "$(th_queryReturn)"
Kate Ward4c286832020-03-29 18:20:07 +020048 (grep 'show this help' "${stderrF}" >/dev/null)
49 r3turn=$?
kate.ward2fb41e32008-07-10 18:42:46 +000050 assertTrue \
51 'short request for help should have produced some help output.' \
Kate Ward4c286832020-03-29 18:20:07 +020052 ${r3turn}
Kate Wardfb36b542020-03-30 00:14:39 +020053 [ ${r3turn} -ne "${FLAGS_TRUE}" ] && th_showOutput
kate.ward2fb41e32008-07-10 18:42:46 +000054
Kate Wardef7daa52017-10-18 00:16:36 +020055 # Test proper output when FLAGS_HELP set.
kate.warda2adce12013-01-15 00:00:39 +000056 (
57 FLAGS_HELP='this is a test'
Kate Wardef7daa52017-10-18 00:16:36 +020058 FLAGS "${flag}" >"${stdoutF}" 2>"${stderrF}"
kate.warda2adce12013-01-15 00:00:39 +000059 )
Kate Ward4c286832020-03-29 18:20:07 +020060 (grep 'this is a test' "${stderrF}" >/dev/null)
61 r3turn=$?
62 assertTrue 'setting FLAGS_HELP did not produce expected result' ${r3turn}
Kate Wardfb36b542020-03-30 00:14:39 +020063 [ ${r3turn} -ne "${FLAGS_TRUE}" ] && th_showOutput
kate.ward2fb41e32008-07-10 18:42:46 +000064
Kate Ward8c168e52020-02-11 04:18:45 +010065 # Test that "'" chars work in help string.
kate.warda2adce12013-01-15 00:00:39 +000066 (
Kate Ward8c168e52020-02-11 04:18:45 +010067 # shellcheck disable=SC2034
kate.warda2adce12013-01-15 00:00:39 +000068 DEFINE_boolean b false "help string containing a ' char" b
Kate Wardef7daa52017-10-18 00:16:36 +020069 FLAGS "${flag}" >"${stdoutF}" 2>"${stderrF}"
kate.warda2adce12013-01-15 00:00:39 +000070 )
Kate Ward4c286832020-03-29 18:20:07 +020071 (grep "help string containing a ' char" "${stderrF}" >/dev/null)
72 r3turn=$?
73 assertTrue "help strings containing apostrophes don't work" ${r3turn}
Kate Wardfb36b542020-03-30 00:14:39 +020074 [ ${r3turn} -ne "${FLAGS_TRUE}" ] && th_showOutput
Kate Ward9cfea862020-03-29 23:59:46 +020075
Kate Ward16a3af22020-03-30 00:09:16 +020076 return "${SHUNIT_TRUE}"
kate.ward2fb41e32008-07-10 18:42:46 +000077}
78
Kate Ward874a56a2018-12-09 16:32:57 +010079mock_flags_columns() {
kate.ward1ee88562013-01-01 22:08:05 +000080 echo 80
81}
82
Kate Wardef7daa52017-10-18 00:16:36 +020083testStandardHelpOutput() {
Kate Ward4bfa9832020-04-12 00:52:31 +020084 if ! flags_getoptIsStd; then
85 startSkipping
86 fi
kate.ward2fb41e32008-07-10 18:42:46 +000087
kate.warddc10fe92008-07-10 19:37:16 +000088 DEFINE_boolean test_bool false 'test boolean' b
kate.ward437639d2008-10-19 17:21:41 +000089 DEFINE_integer test_int 0 'test integer' i
kate.warddc10fe92008-07-10 19:37:16 +000090 DEFINE_string test_str '' 'test string' s
kate.ward437639d2008-10-19 17:21:41 +000091 DEFINE_string long_desc 'blah' \
kate.ward64099612008-11-17 17:36:14 +000092 'testing of a long description to force wrap of default value' D
93 DEFINE_string long_default \
kate.ward90681c32008-11-17 17:39:14 +000094 'this_is_a_long_default_value_to_force_alternate_indentation' \
kate.ward64099612008-11-17 17:36:14 +000095 'testing of long default value' F
Kate Ward4c286832020-03-29 18:20:07 +020096
97 # Test for https://github.com/kward/shflags/issues/28.
98 DEFINE_boolean 'force' false '' f
99
kate.wardf08c5b62008-07-11 20:32:11 +0000100 help='USAGE: standard [flags] args'
kate.ward2fb41e32008-07-10 18:42:46 +0000101
102 cat >"${expectedF}" <<EOF
kate.ward3a674972009-04-01 03:44:44 +0000103${help}
kate.ward2fb41e32008-07-10 18:42:46 +0000104flags:
kate.ward437639d2008-10-19 17:21:41 +0000105 -b test boolean (default: false)
106 -i test integer (default: 0)
107 -s test string (default: '')
kate.ward64099612008-11-17 17:36:14 +0000108 -D testing of a long description to force wrap of default value
kate.ward437639d2008-10-19 17:21:41 +0000109 (default: 'blah')
kate.ward64099612008-11-17 17:36:14 +0000110 -F testing of long default value
kate.ward90681c32008-11-17 17:39:14 +0000111 (default: 'this_is_a_long_default_value_to_force_alternate_indentation')
Kate Ward4c286832020-03-29 18:20:07 +0200112 -f (default: false)
kate.ward437639d2008-10-19 17:21:41 +0000113 -h show this help (default: false)
kate.warddc10fe92008-07-10 19:37:16 +0000114EOF
kate.ward1ee88562013-01-01 22:08:05 +0000115 (
kate.warda2adce12013-01-15 00:00:39 +0000116 _flags_columns() { mock_flags_columns; }
kate.ward1ee88562013-01-01 22:08:05 +0000117 FLAGS_HELP=${help};
Kate Ward4bfa9832020-04-12 00:52:31 +0200118 # 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}"
kate.ward1ee88562013-01-01 22:08:05 +0000125 )
Kate Ward4bfa9832020-04-12 00:52:31 +0200126 assertFalse 'a call for help should return a non-zero exit code.' "$(th_queryReturn)"
kate.warde10dd532013-01-04 21:52:23 +0000127
Kate Ward4bfa9832020-04-12 00:52:31 +0200128 if ! diff "${expectedF}" "${stderrF}" >/dev/null; then
129 fail 'unexpected help output'
130 th_showOutput
131 fi
kate.warddc10fe92008-07-10 19:37:16 +0000132}
133
Kate Wardef7daa52017-10-18 00:16:36 +0200134testEnhancedHelpOutput() {
Kate Ward4bfa9832020-04-12 00:52:31 +0200135 if ! flags_getoptIsEnh; then
136 startSkipping
137 fi
kate.warddc10fe92008-07-10 19:37:16 +0000138
Kate Ward8c168e52020-02-11 04:18:45 +0100139 # shellcheck disable=SC2034
kate.warddc10fe92008-07-10 19:37:16 +0000140 DEFINE_boolean test_bool false 'test boolean' b
Kate Ward8c168e52020-02-11 04:18:45 +0100141 # shellcheck disable=SC2034
kate.ward437639d2008-10-19 17:21:41 +0000142 DEFINE_integer test_int 0 'test integer' i
Kate Ward8c168e52020-02-11 04:18:45 +0100143 # shellcheck disable=SC2034
kate.warddc10fe92008-07-10 19:37:16 +0000144 DEFINE_string test_str '' 'test string' s
Kate Ward8c168e52020-02-11 04:18:45 +0100145 # shellcheck disable=SC2034
kate.ward437639d2008-10-19 17:21:41 +0000146 DEFINE_string long_desc 'blah' \
kate.wardde77c872008-11-17 17:40:04 +0000147 'testing of a long description to force wrap of default value' D
Kate Ward8c168e52020-02-11 04:18:45 +0100148 # shellcheck disable=SC2034
kate.ward64099612008-11-17 17:36:14 +0000149 DEFINE_string long_default \
kate.ward90681c32008-11-17 17:39:14 +0000150 'this_is_a_long_default_value_to_force_alternate_indentation' \
kate.ward64099612008-11-17 17:36:14 +0000151 'testing of long default value' F
Kate Ward4c286832020-03-29 18:20:07 +0200152
153 # Test for https://github.com/kward/shflags/issues/28.
154 DEFINE_boolean 'force' false '' f
155
kate.ward42cb23b2008-07-11 20:42:58 +0000156 help='USAGE: enhanced [flags] args'
kate.warddc10fe92008-07-10 19:37:16 +0000157
158 cat >"${expectedF}" <<EOF
kate.ward3a674972009-04-01 03:44:44 +0000159${help}
kate.warddc10fe92008-07-10 19:37:16 +0000160flags:
kate.ward437639d2008-10-19 17:21:41 +0000161 -b,--[no]test_bool: test boolean (default: false)
162 -i,--test_int: test integer (default: 0)
163 -s,--test_str: test string (default: '')
kate.ward64099612008-11-17 17:36:14 +0000164 -D,--long_desc: testing of a long description to force wrap of default value
kate.ward437639d2008-10-19 17:21:41 +0000165 (default: 'blah')
kate.ward64099612008-11-17 17:36:14 +0000166 -F,--long_default: testing of long default value
kate.ward90681c32008-11-17 17:39:14 +0000167 (default: 'this_is_a_long_default_value_to_force_alternate_indentation')
Kate Ward4c286832020-03-29 18:20:07 +0200168 -f,--[no]force: (default: false)
kate.ward1cb79602011-06-10 11:15:49 +0000169 -h,--help: show this help (default: false)
kate.ward2fb41e32008-07-10 18:42:46 +0000170EOF
kate.warde10dd532013-01-04 21:52:23 +0000171 (
kate.warda2adce12013-01-15 00:00:39 +0000172 _flags_columns() { mock_flags_columns; }
Kate Wardef7daa52017-10-18 00:16:36 +0200173 # shellcheck disable=SC2034
Kate Ward4bfa9832020-04-12 00:52:31 +0200174 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}"
kate.warde10dd532013-01-04 21:52:23 +0000182 )
Kate Ward4bfa9832020-04-12 00:52:31 +0200183 assertFalse 'a call for help should return a non-zero exit code.' "$(th_queryReturn)"
kate.warde10dd532013-01-04 21:52:23 +0000184
Kate Ward4bfa9832020-04-12 00:52:31 +0200185 if ! diff "${expectedF}" "${stderrF}" >/dev/null; then
186 fail 'unexpected help output'
187 th_showOutput
188 fi
kate.ward2fb41e32008-07-10 18:42:46 +0000189}
190
Kate Wardef7daa52017-10-18 00:16:36 +0200191testNoHelp() {
Kate Ward4bfa9832020-04-12 00:52:31 +0200192 if ! flags_getoptIsEnh; then
193 startSkipping
194 fi
kate.ward5b48fc12008-11-13 00:42:43 +0000195
196 ( FLAGS --nohelp >"${stdoutF}" 2>"${stderrF}" )
kate.ward1cb79602011-06-10 11:15:49 +0000197 r3turn=$?
198 assertTrue "FLAGS returned a non-zero result (${r3turn})" ${r3turn}
kate.ward5b48fc12008-11-13 00:42:43 +0000199 assertFalse 'expected no output to STDOUT' "[ -s '${stdoutF}' ]"
200 assertFalse 'expected no output to STDERR' "[ -s '${stderrF}' ]"
201}
202
Kate Warddc385d52017-08-04 20:47:11 +0200203testLoggingLevel() {
204 # Check that the default logging level is set properly.
Kate Ward5704f922018-01-18 00:20:48 +0100205 got=`flags_loggingLevel` want=${__FLAGS_LEVEL_DEFAULT}
Kate Warddc385d52017-08-04 20:47:11 +0200206 assertTrue "Unexpected default logging level = ${got}, want ${want}" "[ ${got} -eq ${want} ]"
207
208 # Override the logging level, and check again.
Kate Wardef7daa52017-10-18 00:16:36 +0200209 flags_setLoggingLevel "${FLAGS_LEVEL_FATAL}"
210 flags_setLoggingLevel "${FLAGS_LEVEL_INFO}"
Kate Ward5704f922018-01-18 00:20:48 +0100211 got=`flags_loggingLevel` want=${FLAGS_LEVEL_INFO}
Kate Warddc385d52017-08-04 20:47:11 +0200212 assertTrue "Unexpected configured logging level = ${got}, want ${want}" "[ ${got} -eq ${want} ]"
213}
214
Kate Ward4c286832020-03-29 18:20:07 +0200215# 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
Kate Ward4bfa9832020-04-12 00:52:31 +0200222 testHelp && return
Kate Ward4c286832020-03-29 18:20:07 +0200223}
224
Kate Warddc385d52017-08-04 20:47:11 +0200225oneTimeSetUp() {
kate.ward1b600c52008-11-12 21:26:05 +0000226 th_oneTimeSetUp
kate.ward709c1342008-11-14 18:23:03 +0000227
kate.wardb0aaccf2008-11-15 17:16:55 +0000228 if flags_getoptIsStd; then
229 th_warn 'Standard version of getopt found. Enhanced tests will be skipped.'
Kate Warddc385d52017-08-04 20:47:11 +0200230 return
kate.ward709c1342008-11-14 18:23:03 +0000231 fi
Kate Warddc385d52017-08-04 20:47:11 +0200232 th_warn 'Enhanced version of getopt found. Standard tests will be skipped.'
kate.ward2fb41e32008-07-10 18:42:46 +0000233}
234
Kate Warddc385d52017-08-04 20:47:11 +0200235setUp() {
kate.ward2fb41e32008-07-10 18:42:46 +0000236 flags_reset
237}
238
Kate Warddc385d52017-08-04 20:47:11 +0200239# Load and run shUnit2.
Kate Wardef7daa52017-10-18 00:16:36 +0200240# shellcheck disable=SC2034
kate.ward2fb41e32008-07-10 18:42:46 +0000241[ -n "${ZSH_VERSION:-}" ] && SHUNIT_PARENT=$0
Kate Wardef7daa52017-10-18 00:16:36 +0200242. "${TH_SHUNIT}"