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