Module Name: src Committed By: kre Date: Sat Jul 15 18:50:42 UTC 2017
Modified Files: src/tests/bin/sh: t_arith.sh Log Message: Add basic tests for the forthcoming ',' '++' and '--' operators. Until the support for those is committed to /bin/sh (and when testing any other sh that does not support them) the new tests will be skipped. To generate a diff of this commit: cvs rdiff -u -r1.7 -r1.8 src/tests/bin/sh/t_arith.sh Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/tests/bin/sh/t_arith.sh diff -u src/tests/bin/sh/t_arith.sh:1.7 src/tests/bin/sh/t_arith.sh:1.8 --- src/tests/bin/sh/t_arith.sh:1.7 Fri Jun 2 01:50:48 2017 +++ src/tests/bin/sh/t_arith.sh Sat Jul 15 18:50:42 2017 @@ -1,4 +1,4 @@ -# $NetBSD: t_arith.sh,v 1.7 2017/06/02 01:50:48 kre Exp $ +# $NetBSD: t_arith.sh,v 1.8 2017/07/15 18:50:42 kre Exp $ # # Copyright (c) 2016 The NetBSD Foundation, Inc. # All rights reserved. @@ -937,6 +937,46 @@ operator_precedence_body() atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \ 'echo $(( 0xfD & 0xF == 0xF ))' + + ${TEST_SH} -c ': $(( 1 , 2 , 3 ))' 2>/dev/null && { + atf_check -s exit:0 -o inline:'2\n' -e empty ${TEST_SH} -c \ + 'echo $(( 3 * 7 , 2 << 8 , 9 - 7 ))' + atf_check -s exit:0 -o inline:'4\n' -e empty ${TEST_SH} -c \ + 'echo $(( 1 ? 2 : 3 , 0 ? 1 : 4 ))' + } + + return 0 +} + +atf_test_case optional_comma +optional_comma_head() +{ + atf_set "descr" "Test the optional comma operator" +} +optional_comma_body() +{ + # First, see if it is supported or not. + ${TEST_SH} -c ': $(( 1 , 2 , 3 ))' 2>/dev/null || atf_skip \ + "${TEST_SH} does not implement the ',' operator in"' $(( ))' + + + # Note ',' should be set off from numbers by spaces, as in some + # locales it is a valid chacacter in a number, and we want to + # avoid any possibility of confusing the parser. + + atf_check -s exit:0 -o inline:'2\n' -e empty ${TEST_SH} -c \ + 'echo $(( 1 , 2 ))' + atf_check -s exit:0 -o inline:'3\n' -e empty ${TEST_SH} -c \ + 'echo $(( 1 , 2 , 3 ))' + atf_check -s exit:0 -o inline:'4\n' -e empty ${TEST_SH} -c \ + 'echo $(( 1 , 2 , 3 , 4 ))' + + atf_check -s not-exit:0 -o empty -e not-empty ${TEST_SH} -c \ + 'echo $(( , 2 ))' + atf_check -s not-exit:0 -o empty -e not-empty ${TEST_SH} -c \ + 'echo $(( 2 , ))' + atf_check -s not-exit:0 -o empty -e not-empty ${TEST_SH} -c \ + 'echo $(( 1 , , 2 ))' } parentheses_head() @@ -999,9 +1039,16 @@ parentheses_body() 'echo $(( 2 << ((3 >= 3) << 2) ))' # sh inherits C's crazy operator precedence... - atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \ 'echo $(( (0xfD & 0xF) == 0xF ))' + + ${TEST_SH} -c ': $(( 1 , 2 , 3 ))' 2>/dev/null && { + atf_check -s exit:0 -o inline:'24\n' -e empty ${TEST_SH} -c \ + 'echo $(( 3 * (7 , 2) << (8 , 9 - 7) ))' + atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \ + 'echo $(( 0 ? 2 : ( ( 0 , 3 ) ? 1 : 4) ))' + } + return 0 } atf_test_case var_assign @@ -1059,6 +1106,173 @@ var_assign_body() 'set -u; unset x; echo $(( x + 3 )); echo $x' atf_check -s not-exit:0 -o ignore -e not-empty ${TEST_SH} -c \ 'set -u; unset x; echo $(( x+=3 )); echo $x' + + ${TEST_SH} -c ': $(( 1 , 2 , 3 ))' 2>/dev/null && { + atf_check -s exit:0 -o inline:'3\n3\n' -e empty ${TEST_SH} -c \ + 'echo $((x=2 , x|=1)); echo $x' + atf_check -s exit:0 -o inline:'3\n3\n' -e empty ${TEST_SH} -c \ + 'set -u; echo $((x = 2 ,x |= 1)); echo $x' + atf_check -s exit:0 -o inline:'6\n1:2:3:6\n' -e empty \ + ${TEST_SH} -c \ + 'echo $((a=1 , b=2 , c = 3 , x=a+b + c)); echo $a:$b:$c:$x' + atf_check -s exit:0 -o inline:'6\n1:2:3:6\n' -e empty \ + ${TEST_SH} -c \ + 'set -u;echo $((a=1 ,b=2 ,c=3 ,x=a+b+c)); echo $a:$b:$c:$x' + } + return 0 +} + +atf_test_case var_postinc +var_postinc_head() +{ + atf_set "descr" "Test suffix ++ operator" +} +var_postinc_body() +{ + ${TEST_SH} -c 'X=1; : $(( X++ ))' 2>/dev/null || + atf_skip "${TEST_SH} does not support the suffix ++ operator" + + unset X ; # just in case ... + + atf_check -s exit:0 -o inline:'1\n2\n' -e empty ${TEST_SH} -c \ + 'X=1; echo $(( X++ )); echo $X' + atf_check -s exit:0 -o inline:'0\n1\n' -e empty ${TEST_SH} -c \ + 'echo $(( X++ )); echo $X' + + atf_check -s exit:0 -o inline:'0\n1:0\n' -e empty ${TEST_SH} -c \ + 'unset Y; echo $(( Y = X++ )); echo $X:$Y' + atf_check -s exit:0 -o inline:'12\n4:5\n' -e empty ${TEST_SH} -c \ + 'X=3 Y=4; echo $(( Y++*X++ )); echo $X:$Y' + + atf_check -s exit:0 -o inline:'1\n2\n' -e empty ${TEST_SH} -c \ + 'set -u; X=1; echo $(( X++ )); echo $X' + atf_check -s exit:0 -o inline:'0\n1:0\n' -e empty ${TEST_SH} -c \ + 'set -u; X=0; unset Y; echo $(( Y = X++ )); echo $X:$Y' + atf_check -s exit:0 -o inline:'12\n4:5\n' -e empty ${TEST_SH} -c \ + 'set -u; X=3 Y=4; echo $(( Y++*X++ )); echo $X:$Y' + + atf_check -s not-exit:0 -o empty -e not-empty ${TEST_SH} -c \ + 'set -u; echo $(( X++ ))' + atf_check -s not-exit:0 -o empty -e not-empty ${TEST_SH} -c \ + 'set -u; unset Y; echo $(( X = Y++ ))' + + atf_check -s not-exit:0 -o empty -e not-empty ${TEST_SH} -c \ + 'X=3; readonly X; echo $(( X++ ))' + +} +atf_test_case var_postdec +var_postdec_head() +{ + atf_set "descr" "Test suffix -- operator" +} +var_postdec_body() +{ + ${TEST_SH} -c 'X=1; : $(( X-- ))' 2>/dev/null || + atf_skip "${TEST_SH} does not support the suffix -- operator" + + unset X ; # just in case ... + + atf_check -s exit:0 -o inline:'1\n0\n' -e empty ${TEST_SH} -c \ + 'X=1; echo $(( X-- )); echo $X' + atf_check -s exit:0 -o inline:'0\n-1\n' -e empty ${TEST_SH} -c \ + 'echo $(( X-- )); echo $X' + + atf_check -s exit:0 -o inline:'0\n-1:0\n' -e empty ${TEST_SH} -c \ + 'unset Y; echo $(( Y = X-- )); echo $X:$Y' + atf_check -s exit:0 -o inline:'12\n2:3\n' -e empty ${TEST_SH} -c \ + 'X=3 Y=4; echo $(( Y--*X-- )); echo $X:$Y' + + atf_check -s exit:0 -o inline:'1\n0\n' -e empty ${TEST_SH} -c \ + 'set -u; X=1; echo $(( X-- )); echo $X' + atf_check -s exit:0 -o inline:'0\n-1:0\n' -e empty ${TEST_SH} -c \ + 'set -u; X=0; unset Y; echo $(( Y = X-- )); echo $X:$Y' + atf_check -s exit:0 -o inline:'12\n2:3\n' -e empty ${TEST_SH} -c \ + 'set -u; X=3 Y=4; echo $(( Y--*X-- )); echo $X:$Y' + + atf_check -s not-exit:0 -o empty -e not-empty ${TEST_SH} -c \ + 'set -u; echo $(( X-- ))' + atf_check -s not-exit:0 -o empty -e not-empty ${TEST_SH} -c \ + 'set -u; unset Y; echo $(( X = Y-- ))' + + atf_check -s not-exit:0 -o empty -e not-empty ${TEST_SH} -c \ + 'X=3; readonly X; echo $(( X-- ))' + +} +atf_test_case var_preinc +var_preinc_head() +{ + atf_set "descr" "Test prefix ++ operator" +} +var_preinc_body() +{ + ${TEST_SH} -c 'X=1; : $(( ++X ))' 2>/dev/null || + atf_skip "${TEST_SH} does not support the prefix ++ operator" + + unset X ; # just in case ... + + atf_check -s exit:0 -o inline:'2\n2\n' -e empty ${TEST_SH} -c \ + 'X=1; echo $(( ++X )); echo $X' + atf_check -s exit:0 -o inline:'1\n1\n' -e empty ${TEST_SH} -c \ + 'echo $(( ++X )); echo $X' + + atf_check -s exit:0 -o inline:'1\n1:1\n' -e empty ${TEST_SH} -c \ + 'unset Y; echo $(( Y = ++X )); echo $X:$Y' + atf_check -s exit:0 -o inline:'20\n4:5\n' -e empty ${TEST_SH} -c \ + 'X=3 Y=4; echo $(( ++Y*++X )); echo $X:$Y' + + atf_check -s exit:0 -o inline:'2\n2\n' -e empty ${TEST_SH} -c \ + 'set -u; X=1; echo $(( ++X )); echo $X' + atf_check -s exit:0 -o inline:'1\n1:1\n' -e empty ${TEST_SH} -c \ + 'set -u; X=0; unset Y; echo $(( Y = ++X )); echo $X:$Y' + atf_check -s exit:0 -o inline:'20\n4:5\n' -e empty ${TEST_SH} -c \ + 'set -u; X=3 Y=4; echo $(( ++Y*++X )); echo $X:$Y' + + atf_check -s not-exit:0 -o empty -e not-empty ${TEST_SH} -c \ + 'set -u; echo $(( ++X ))' + atf_check -s not-exit:0 -o empty -e not-empty ${TEST_SH} -c \ + 'set -u; unset Y; echo $(( X = ++Y ))' + + atf_check -s not-exit:0 -o empty -e not-empty ${TEST_SH} -c \ + 'X=3; readonly X; echo $(( ++X ))' + +} +atf_test_case var_predec +var_predec_head() +{ + atf_set "descr" "Test prefix -- operator" +} +var_predec_body() +{ + ${TEST_SH} -c 'X=1; : $(( --X ))' 2>/dev/null || + atf_skip "${TEST_SH} does not support the prefix -- operator" + + unset X ; # just in case ... + + atf_check -s exit:0 -o inline:'0\n0\n' -e empty ${TEST_SH} -c \ + 'X=1; echo $(( --X )); echo $X' + atf_check -s exit:0 -o inline:'-1\n-1\n' -e empty ${TEST_SH} -c \ + 'echo $(( --X )); echo $X' + + atf_check -s exit:0 -o inline:'-1\n-1:-1\n' -e empty ${TEST_SH} -c \ + 'unset Y; echo $(( Y = --X )); echo $X:$Y' + atf_check -s exit:0 -o inline:'6\n2:3\n' -e empty ${TEST_SH} -c \ + 'X=3 Y=4; echo $(( --Y*--X )); echo $X:$Y' + + atf_check -s exit:0 -o inline:'0\n0\n' -e empty ${TEST_SH} -c \ + 'set -u; X=1; echo $(( --X )); echo $X' + atf_check -s exit:0 -o inline:'-1\n-1:-1\n' -e empty ${TEST_SH} -c \ + 'set -u; X=0; unset Y; echo $(( Y = --X )); echo $X:$Y' + atf_check -s exit:0 -o inline:'6\n2:3\n' -e empty ${TEST_SH} -c \ + 'set -u; X=3 Y=4; echo $(( --Y*--X )); echo $X:$Y' + + atf_check -s not-exit:0 -o empty -e not-empty ${TEST_SH} -c \ + 'set -u; echo $(( --X ))' + atf_check -s not-exit:0 -o empty -e not-empty ${TEST_SH} -c \ + 'set -u; unset Y; echo $(( X = --Y ))' + + atf_check -s not-exit:0 -o empty -e not-empty ${TEST_SH} -c \ + 'X=3; readonly X; echo $(( --X ))' + } atf_test_case arithmetic_fails @@ -1108,10 +1322,15 @@ atf_init_test_cases() { atf_add_test_case make_selection atf_add_test_case nested_arith atf_add_test_case operator_precedence + atf_add_test_case optional_comma atf_add_test_case parentheses # atf_add_test_case progressive # build up big expr # atf_add_test_case test_errors # erroneous input # atf_add_test_case torture # hard stuff (if there is any) atf_add_test_case var_assign # assignment ops + atf_add_test_case var_postinc # var++ + atf_add_test_case var_postdec # var-- + atf_add_test_case var_preinc # ++var + atf_add_test_case var_predec # --var # atf_add_test_case vulgarity # truly evil inputs (syntax in vars...) }