#! /bin/sh # vim:et:ft=sh:sts=2:sw=2 # # shFlags unit test for the flag definition methods # # 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 # These variables will be overridden by the test helpers. setglobal stdoutF = ""$(TMPDIR:-/tmp)/STDOUT"" setglobal stderrF = ""$(TMPDIR:-/tmp)/STDERR"" # Load test helpers. source ./shflags_test_helpers proc testFlagsDefine { # No arguments. _flags_define >$(stdoutF) !2 >$(stderrF) assertFalse '_flags_define() with no arguments should have failed.' $Status assertErrorMsg '' 'no arguments' # One argument. _flags_define arg1 >$(stdoutF) !2 >$(stderrF) assertFalse '_flags_define() call with one argument should fail' $Status assertErrorMsg '' 'one argument' # Two arguments. _flags_define arg1 arg2 >$(stdoutF) !2 >$(stderrF) assertFalse '_flags_define() call with two arguments should fail' $Status assertErrorMsg '' 'two arguments' # Three arguments. _flags_define arg1 arg2 arg3 >$(stdoutF) !2 >$(stderrF) assertFalse '_flags_define() call with three arguments should fail' $Status assertErrorMsg '' 'three arguments' # Multiple definition. Assumes working boolean definition (tested elsewhere). _flags_define $(__FLAGS_TYPE_BOOLEAN) multiDefBool true 'multi def #1' m _flags_define $(__FLAGS_TYPE_BOOLEAN) multiDefBool false 'multi def #2' m \ >$(stdoutF) !2 >$(stderrF) assertFalse '_flags_define() with existing flag name should fail' $Status assertTrue \ '_flags_define() should not overwrite previously defined default.' \ $(FLAGS_multiDefBool:-) assertWarnMsg '' 'existing flag' # Duplicate dashed and underscored definition. _flags_define $(__FLAGS_TYPE_STRING) long-name 'foo' 'dashed name' l _flags_define $(__FLAGS_TYPE_STRING) long_name 'bar' 'underscored name' l \ >$(stdoutF) !2 >$(stderrF) assertFalse '_flags_define() with existing flag name should fail' $Status # shellcheck disable=SC2154 assertEquals \ '_flags_define() should not overwrite previously defined default.' \ $(FLAGS_long_name) 'foo' assertWarnMsg '' 'already exists' # TODO(kward): test requirement of enhanced getopt. # Invalid type. _flags_define invalid arg2 arg3 arg4 i >$(stdoutF) !2 >$(stderrF) assertFalse '_flags_define() with "invalid" type should have failed.' $Status assertErrorMsg 'unrecognized flag type' 'invalid type' } proc testBoolean { # Test true defaults. for default in ['true' 't' 0] { flags_reset DEFINE_boolean boolVal $(default) 'my boolean' b setglobal rtrn = $Status assertTrue \ "DEFINE_boolean() call with default of '$(default)' failed." \ $(FLAGS_boolVal:-) assertTrue \ "DEFINE_boolean() call with default of '$(default)' returned failure." \ $(rtrn) } # test false defaults for default in ['false' 'f' 1] { flags_reset DEFINE_boolean boolVal $(default) 'my boolean' b setglobal rtrn = $Status assertFalse \ "DEFINE_boolean() call with default of '$(default)' failed." \ $(FLAGS_boolVal:-) assertTrue \ "DEFINE_boolean() call with default of '$(default)' returned failure." \ $(rtrn) } # Test invalid default. flags_reset DEFINE_boolean boolVal 'invalid' 'my boolean' b >$(stdoutF) !2 >$(stderrF) assertFalse 'DEFINE_boolean() call with invalid default did not fail.' $Status assertErrorMsg } proc testFloat { # Test valid defaults. for default in [$(TH_FLOAT_VALID)] { flags_reset DEFINE_float floatVal $(default) "float: $(default)" f setglobal rtrn = $Status assertSame "DEFINE_float() call with valid default failed." \ $(default) $(FLAGS_floatVal:-) assertTrue \ "DEFINE_float() call with valid default of '$(default)' returned failure." \ $(rtrn) } # Test invalid defaults. flags_reset DEFINE_float floatVal 'invalid' 'invalid float: string' f \ >$(stdoutF) !2 >$(stderrF) assertFalse 'DEFINE_float() call with string value default did not fail.' $Status assertErrorMsg } proc testInteger { # Test valid defaults. for default in [$(TH_INT_VALID)] { flags_reset DEFINE_integer intVal $(default) "integer: $(default)" i setglobal rtrn = $Status assertSame \ "DEFINE_integer() call with valid default failed." \ $(default) $(FLAGS_intVal:-) assertTrue \ "DEFINE_integer() call with valid default of '$(default)' returned failure." \ $(rtrn) } # Test invalid defaults. flags_reset DEFINE_integer intVal 1.234 'invalid integer: float' i \ >$(stdoutF) !2 >$(stderrF) assertFalse 'DEFINE_integer() call with float value default did not fail.' $Status assertErrorMsg 'invalid default' 'float default' DEFINE_integer intVal -1.234 'invalid integer: negative float' i \ >$(stdoutF) !2 >$(stderrF) assertFalse \ 'DEFINE_integer() call with negative float value default did not fail.' \ $Status assertErrorMsg 'invalid default' 'negative float default' DEFINE_integer intVal 'invalid' 'invalid integer: string' i \ >$(stdoutF) !2 >$(stderrF) assertFalse \ 'DEFINE_integer() call with string value default did not fail.' \ $Status assertErrorMsg 'invalid default' 'string default' } proc testString { # test valid defaults for default in [\ $(TH_BOOL_VALID) \ $(TH_FLOAT_VALID) \ $(TH_INT_VALID) \ 'also valid]' { flags_reset DEFINE_string strVal $(default) "string: $(default)" s setglobal rtrn = $Status assertSame \ "DEFINE_string() call with valid default failed." \ $(default) $(FLAGS_strVal:-) assertTrue \ "DEFINE_string() call with valid default of '$(default)' returned failure." \ $(rtrn) } # test "empty" strings flags_reset DEFINE_string str '' "string: empty single quotes" s setglobal rtrn = $Status assertSame \ "DEFINE_string() call with valid default failed." \ '' $(FLAGS_str:-) } proc testShortNameLength { # Make sure short names are no longer than a single character. : } proc testFlagNameIsReserved { shell { DEFINE_string TRUE '' 'true is a reserved flag name' t \ >$(stdoutF) !2 >$(stderrF) } setglobal rtrn = $Status assertEquals $(FLAGS_ERROR) $(rtrn) assertErrorMsg 'flag name (TRUE) is reserved' } proc oneTimeSetUp { th_oneTimeSetUp } proc tearDown { flags_reset } # Load and run shUnit2. # shellcheck disable=SC2034 test -n $(ZSH_VERSION:-) && setglobal SHUNIT_PARENT = $0 source "${TH_SHUNIT}"