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.
This commit is contained in:
kre 2017-07-15 18:50:42 +00:00
parent 43072a1442
commit 8d48762db3

View File

@ -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...)
}