xref: /aosp_15_r20/external/shflags/shflags_public_test.sh (revision 63d4e48fb639f6414be0db9d718e3be2667e4fed)
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