blob: 5a2b44204bdd0cd5afcb05691160aee968071559 [file] [log] [blame]
#! /bin/sh
# vim:et:ft=sh:sts=2:sw=2
#
# shFlags unit tests for the internal functions.
#
#
# Copyright 2008-2017 Kate Ward. All Rights Reserved.
# Released under the Apache 2.0 license.
#
# Author: kate.ward@forestent.com (Kate Ward)
# https://github.com/kward/shflags
#
### ShellCheck (http://www.shellcheck.net/)
# Disable source following.
# shellcheck disable=SC1090,SC1091
# expr may be antiquated, but it is the only solution in some cases.
# shellcheck disable=SC2003
# $() are not fully portable (POSIX != portable).
# shellcheck disable=SC2006
# These variables will be overridden by the test helpers.
stdoutF="${TMPDIR:-/tmp}/STDOUT"
stderrF="${TMPDIR:-/tmp}/STDERR"
# Load test helpers.
. ./shflags_test_helpers
testColumns() {
cols=`_flags_columns`
value=`expr "${cols}" : '\([0-9]*\)'`
assertNotNull "unexpected screen width (${cols})" "${value}"
}
testGetoptVers() {
# shellcheck disable=SC2162
while read desc mock want; do
assertEquals "${desc}" "$(_flags_getopt_vers "${mock}")" "${want}"
done <<EOF
standard mock_getopt_std ${__FLAGS_GETOPT_VERS_STD}
enhanced mock_getopt_enh ${__FLAGS_GETOPT_VERS_ENH}
EOF
}
### The mock_getopt_* commands behave like "getopt -lfoo '' --foo" was called.
# macOS 10.13.0.
mock_getopt_std() { echo ' -- --foo'; return 0; }
# Ubuntu 16.04.3
mock_getopt_enh() { echo ' --foo --'; return 0; }
testGenOptStr() {
_testGenOptStr '' ''
DEFINE_boolean bool false 'boolean value' b
_testGenOptStr 'b' 'bool'
DEFINE_float float 0.0 'float value' f
_testGenOptStr 'bf:' 'bool,float:'
DEFINE_integer int 0 'integer value' i
_testGenOptStr 'bf:i:' 'bool,float:,int:'
DEFINE_string str 0 'string value' s
_testGenOptStr 'bf:i:s:' 'bool,float:,int:,str:'
DEFINE_boolean help false 'show help' h
_testGenOptStr 'bf:i:s:h' 'bool,float:,int:,str:,help'
}
_testGenOptStr() {
short=$1
long=$2
result=$(_flags_genOptStr "${__FLAGS_OPTSTR_SHORT}")
assertTrue 'short option string generation failed' $?
assertEquals "${short}" "${result}"
result=`_flags_genOptStr "${__FLAGS_OPTSTR_LONG}"`
assertTrue 'long option string generation failed' $?
assertEquals "${long}" "${result}"
}
testGetFlagInfo() {
__flags_blah_foobar='1234'
rslt=`_flags_getFlagInfo 'blah' 'foobar'`
assertTrue 'request for valid flag info failed' $?
assertEquals 'invalid flag info returned' "${__flags_blah_foobar}" "${rslt}"
rslt=`_flags_getFlagInfo 'blah' 'hubbabubba' >"${stdoutF}" 2>"${stderrF}"`
assertEquals 'invalid flag did not result in an error' "${FLAGS_ERROR}" $?
assertErrorMsg 'missing flag info variable'
}
testItemInList() {
list='this is a test'
# shellcheck disable=SC2162
while read desc item want; do
_flags_itemInList "${item}" "${list}"
got=$?
assertEquals "${desc}: itemInList(${item})" "${got}" "${want}"
done <<EOF
lead_item this ${FLAGS_TRUE}
middle_item is ${FLAGS_TRUE}
last_item test ${FLAGS_TRUE}
missing_item asdf ${FLAGS_FALSE}
test_partial_te te ${FLAGS_FALSE}
test_partial_es es ${FLAGS_FALSE}
test_partial_st st ${FLAGS_FALSE}
empty_item '' ${FLAGS_FALSE}
EOF
_flags_itemInList 'item' ''
assertFalse 'empty lists should not match' $?
}
testValidBool() {
# Valid values.
for value in ${TH_BOOL_VALID}; do
_flags_validBool "${value}"
assertTrue "valid value (${value}) did not validate" $?
done
# Invalid values.
for value in ${TH_BOOL_INVALID}; do
_flags_validBool "${value}"
assertFalse "invalid value (${value}) validated" $?
done
}
_testValidFloat() {
# Valid values.
for value in ${TH_INT_VALID} ${TH_FLOAT_VALID}; do
_flags_validFloat "${value}"
assertTrue "valid value (${value}) did not validate" $?
done
# Invalid values.
for value in ${TH_FLOAT_INVALID}; do
_flags_validFloat "${value}"
assertFalse "invalid value (${value}) validated" $?
done
}
testValidFloatBuiltin() {
_flags_useBuiltin || startSkipping
_testValidFloat
}
testValidFloatExpr() {
(
_flags_useBuiltin() { return "${FLAGS_FALSE}"; }
_testValidFloat
)
}
_testValidInt() {
# Valid values.
for value in ${TH_INT_VALID}; do
_flags_validInt "${value}"
assertTrue "valid value (${value}) did not validate" $?
done
# Invalid values.
for value in ${TH_INT_INVALID}; do
_flags_validInt "${value}"
assertFalse "invalid value (${value}) should not validate" $?
done
}
testValidIntBuiltin() {
_flags_useBuiltin || startSkipping
_testValidInt
}
testValidIntExpr() {
(
_flags_useBuiltin() { return "${FLAGS_FALSE}"; }
_testValidInt
)
}
_testMath() {
result=`_flags_math 1`
assertTrue '1 failed' $?
assertEquals '1' 1 "${result}"
result=`_flags_math '1 + 2'`
assertTrue '1+2 failed' $?
assertEquals '1+2' 3 "${result}"
result=`_flags_math '1 + 2 + 3'`
assertTrue '1+2+3 failed' $?
assertEquals '1+2+3' 6 "${result}"
result=`_flags_math`
assertFalse 'missing math succeeded' $?
}
testMathBuiltin() {
_flags_useBuiltin || startSkipping
_testMath
}
testMathExpr() {
(
_flags_useBuiltin() { return "${FLAGS_FALSE}"; }
_testMath
)
}
_testStrlen() {
len=`_flags_strlen`
assertTrue 'missing argument failed' $?
assertEquals 'missing argument' 0 "${len}"
len=`_flags_strlen ''`
assertTrue 'empty argument failed' $?
assertEquals 'empty argument' 0 "${len}"
len=`_flags_strlen abc123`
assertTrue 'single-word failed' $?
assertEquals 'single-word' 6 "${len}"
len=`_flags_strlen 'This is a test'`
assertTrue 'multi-word failed' $?
assertEquals 'multi-word' 14 "${len}"
}
testStrlenBuiltin() {
_flags_useBuiltin || startSkipping
_testStrlen
}
testStrlenExpr() {
(
_flags_useBuiltin() { return "${FLAGS_FALSE}"; }
_testStrlen
)
}
oneTimeSetUp() {
th_oneTimeSetUp
_flags_useBuiltin || \
th_warn 'Shell built-ins not supported. Some tests will be skipped.'
}
tearDown() {
flags_reset
}
# Load and run shUnit2.
# shellcheck disable=SC2034
[ -n "${ZSH_VERSION:-}" ] && SHUNIT_PARENT=$0
. "${TH_SHUNIT}"