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