Home | History | Annotate | Line # | Download | only in sh
t_arith.sh revision 1.5.4.1
      1  1.5.4.1    bouyer # $NetBSD: t_arith.sh,v 1.5.4.1 2017/04/21 16:54:09 bouyer Exp $
      2      1.1  christos #
      3      1.1  christos # Copyright (c) 2016 The NetBSD Foundation, Inc.
      4      1.1  christos # All rights reserved.
      5      1.1  christos #
      6      1.1  christos # Redistribution and use in source and binary forms, with or without
      7      1.1  christos # modification, are permitted provided that the following conditions
      8      1.1  christos # are met:
      9      1.1  christos # 1. Redistributions of source code must retain the above copyright
     10      1.1  christos #    notice, this list of conditions and the following disclaimer.
     11      1.1  christos # 2. Redistributions in binary form must reproduce the above copyright
     12      1.1  christos #    notice, this list of conditions and the following disclaimer in the
     13      1.1  christos #    documentation and/or other materials provided with the distribution.
     14      1.1  christos #
     15      1.1  christos # THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
     16      1.1  christos # ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
     17      1.1  christos # TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     18      1.1  christos # PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
     19      1.1  christos # BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     20      1.1  christos # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     21      1.1  christos # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     22      1.1  christos # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     23      1.1  christos # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     24      1.1  christos # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     25      1.1  christos # POSSIBILITY OF SUCH DAMAGE.
     26      1.1  christos #
     27      1.1  christos # the implementation of "sh" to test
     28      1.1  christos : ${TEST_SH:="/bin/sh"}
     29      1.1  christos 
     30      1.1  christos # Requirement is to support at least "signed long" whatever that means
     31      1.2  christos # (number of bits in "long" is not specified - but should be at least 32).
     32      1.1  christos 
     33      1.1  christos # These tests use -o inline:"..." rather than -o match:'...' as we have
     34      1.2  christos # only digits to examine, and it is good to be sure that 1 + 1 really gives 2
     35      1.1  christos # and that 42 or 123 don't look like success because there is a 2 in them.
     36      1.1  christos 
     37      1.1  christos ARITH_BITS='?'
     38      1.1  christos discover_range()
     39      1.1  christos {
     40      1.1  christos 	# cannot use arithmetic "test" operators, range of test in
     41      1.1  christos 	# ATF_SHELL (or even TEST_SH) might not be as big as that
     42      1.1  christos 	# supported by $(( )) in TEST_SH
     43      1.1  christos 
     44      1.1  christos 	if ! ${TEST_SH} -c ': $(( 0x10000 ))' 2>/dev/null
     45      1.1  christos 	then
     46      1.1  christos 		# 16 bits or less, or hex unsupported, just give up...
     47      1.1  christos 		return
     48      1.1  christos 	fi
     49      1.1  christos 	test $( ${TEST_SH} -c 'echo $(( 0x1FFFF ))' ) = 131071 || return
     50      1.1  christos 
     51      1.1  christos 	# when attempting to exceed the number of available bits
     52      1.1  christos 	# the shell may react in any of 3 (rational) ways
     53      1.1  christos 	# 1. syntax error (maybe even core dump...) and fail
     54      1.1  christos 	# 2. represent a positive number input as negative value
     55      1.1  christos 	# 3. keep the number positive, but not the value expected
     56      1.1  christos 	#    (perhaps pegged at the max possible value)
     57      1.1  christos 	# any of those may be accompanied by a message to stderr
     58      1.1  christos 
     59      1.1  christos 	# Must check all 3 possibilities for each plausible size
     60      1.1  christos 	# Tests do not use 0x8000... because that value can have weird
     61      1.1  christos 	# other side effects that are not relevant to discover here.
     62      1.1  christos 	# But we do want to try and force the sign bit set.
     63      1.1  christos 
     64      1.1  christos 	if ! ${TEST_SH} -c ': $(( 0xC0000000 ))' 2>/dev/null
     65      1.1  christos 	then
     66      1.1  christos 		# proobably shell detected overflow and complained
     67      1.1  christos 		ARITH_BITS=32
     68      1.1  christos 		return
     69      1.1  christos 	fi
     70      1.1  christos 	if ${TEST_SH} 2>/dev/null \
     71      1.1  christos 	    -c 'case $(( 0xC0000000 )); in (-*) exit 0;; esac; exit 1'
     72      1.1  christos 	then
     73      1.1  christos 		ARITH_BITS=32
     74      1.1  christos 		return
     75      1.1  christos 	fi
     76      1.1  christos 	if ${TEST_SH} -c '[ $(( 0xC0000000 )) != 3221225472 ]' 2>/dev/null
     77      1.1  christos 	then
     78      1.1  christos 		ARITH_BITS=32
     79      1.1  christos 		return
     80      1.1  christos 	fi
     81      1.1  christos 
     82      1.1  christos 	if ! ${TEST_SH} -c ': $(( 0xC000000000000000 ))' 2>/dev/null
     83      1.1  christos 	then
     84      1.1  christos 		ARITH_BITS=64
     85      1.1  christos 		return
     86      1.1  christos 	fi
     87      1.1  christos 	if ${TEST_SH} 2>/dev/null \
     88      1.1  christos 	    -c 'case $(( 0xC000000000000000 )); in (-*) exit 0;; esac; exit 1'
     89      1.1  christos 	then
     90      1.1  christos 		ARITH_BITS=64
     91      1.1  christos 		return
     92      1.1  christos 	fi
     93      1.1  christos 	if ${TEST_SH} 2>/dev/null \
     94      1.1  christos 	    -c '[ $((0xC000000000000000)) != 13835058055282163712 ]'
     95      1.1  christos 	then
     96      1.1  christos 		ARITH_BITS=64
     97      1.1  christos 		return
     98      1.1  christos 	fi
     99      1.1  christos 
    100      1.1  christos 	if ${TEST_SH} 2>/dev/null -c \
    101      1.1  christos 	   '[ $((0x123456781234567812345678)) = 5634002657842756053938493048 ]'
    102      1.1  christos 	then
    103      1.1  christos 		# just assume... (for now anyway, revisit when it happens...)
    104      1.1  christos 		ARITH_BITS=96
    105      1.1  christos 		return
    106      1.1  christos 	fi
    107      1.1  christos }
    108      1.1  christos 
    109      1.1  christos atf_test_case constants
    110      1.1  christos constants_head()
    111      1.1  christos {
    112      1.1  christos         atf_set "descr" "Tests that arithmetic expansion can handle constants"
    113      1.1  christos }
    114      1.1  christos constants_body()
    115      1.1  christos {
    116      1.1  christos 	atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
    117      1.1  christos 		'echo $(( 1 ))'
    118      1.1  christos 	atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
    119      1.1  christos 		'echo $(( 0 ))'
    120      1.1  christos 	atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
    121      1.1  christos 		'echo $((0x0))'
    122      1.1  christos 
    123      1.1  christos 	# atf_expect_fail "PR bin/50959"
    124      1.1  christos 	atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
    125      1.1  christos 		'echo $((0X0))'
    126      1.1  christos 	# atf_expect_pass
    127      1.1  christos 
    128      1.1  christos 	atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
    129      1.1  christos 		'echo $((000))'
    130      1.1  christos 
    131      1.1  christos 	atf_check -s exit:0 -o inline:'1\n' -e empty \
    132      1.1  christos 		${TEST_SH} -c 'echo $(( 000000001 ))'
    133      1.1  christos 	atf_check -s exit:0 -o inline:'0\n' -e empty \
    134      1.1  christos 		${TEST_SH} -c 'echo $(( 0x000000 ))'
    135      1.1  christos 
    136      1.1  christos 	atf_check -s exit:0 -o inline:'99999\n' -e empty \
    137      1.1  christos 		${TEST_SH} -c 'echo $((99999))'
    138      1.1  christos 
    139      1.1  christos 	[ ${ARITH_BITS} -gt 44 ] &&
    140      1.1  christos 		atf_check -s exit:0 -o inline:'9191919191919\n' -e empty \
    141      1.1  christos 			${TEST_SH} -c 'echo $((9191919191919))'
    142      1.1  christos 
    143      1.1  christos 	atf_check -s exit:0 -o inline:'13\n' -e empty ${TEST_SH} -c \
    144      1.1  christos 		'echo $(( 0xD ))'
    145      1.1  christos 	atf_check -s exit:0 -o inline:'11\n' -e empty ${TEST_SH} -c \
    146      1.1  christos 		'echo $(( 013 ))'
    147      1.1  christos 	atf_check -s exit:0 -o inline:'7\n' -e empty ${TEST_SH} -c \
    148      1.1  christos 		'x=7;echo $(($x))'
    149      1.1  christos 	atf_check -s exit:0 -o inline:'9\n' -e empty ${TEST_SH} -c \
    150      1.1  christos 		'x=9;echo $((x))'
    151      1.1  christos 
    152      1.1  christos 	atf_check -s exit:0 -o inline:'11\n' -e empty \
    153      1.1  christos 		${TEST_SH} -c 'x=0xB; echo $(( $x ))'
    154      1.1  christos 	atf_check -s exit:0 -o inline:'27\n' -e empty \
    155      1.1  christos 		${TEST_SH} -c 'x=0X1B; echo $(( x ))'
    156      1.1  christos 	atf_check -s exit:0 -o inline:'27\n' -e empty \
    157      1.1  christos 		${TEST_SH} -c 'X=033; echo $(( $X ))'
    158      1.1  christos 	atf_check -s exit:0 -o inline:'219\n' -e empty \
    159      1.1  christos 		${TEST_SH} -c 'X=0333; echo $(( X ))'
    160      1.1  christos 	atf_check -s exit:0 -o inline:'0\n' -e empty \
    161      1.1  christos 		${TEST_SH} -c 'NULL=; echo $(( NULL ))'
    162      1.1  christos 
    163      1.1  christos 	# Not clear if this is 0, nothing, or an error, so omit for now
    164      1.1  christos 	# atf_check -s exit:0 -o inline:'0\n' -e empty \
    165      1.1  christos 	# 	${TEST_SH} -c 'echo $(( ))'
    166      1.1  christos 
    167      1.1  christos 	# not clear whether this should return 0 or an error, so omit for now
    168      1.1  christos 	# atf_check -s exit:0 -o inline:'0\n' -e empty \
    169      1.1  christos 	# 	${TEST_SH} -c 'echo $(( UNDEFINED_VAR ))'
    170      1.1  christos }
    171      1.1  christos 
    172      1.1  christos 
    173      1.1  christos atf_test_case do_unary_plus
    174      1.1  christos do_unary_plus_head()
    175      1.1  christos {
    176      1.1  christos         atf_set "descr" "Tests that unary plus works as expected"
    177      1.1  christos }
    178      1.1  christos do_unary_plus_body()
    179      1.1  christos {
    180      1.1  christos 	atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
    181      1.1  christos 		'echo $(( +0 ))'
    182      1.1  christos 	atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
    183      1.1  christos 		'echo $(( +1 ))'
    184      1.1  christos 	atf_check -s exit:0 -o inline:'6\n' -e empty ${TEST_SH} -c \
    185      1.1  christos 		'echo $(( + 6 ))'
    186      1.1  christos 	atf_check -s exit:0 -o inline:'4321\n' -e empty ${TEST_SH} -c \
    187      1.1  christos 		'echo $(( + 4321 ))'
    188      1.1  christos 	atf_check -s exit:0 -o inline:'17185\n' -e empty ${TEST_SH} -c \
    189      1.1  christos 		'echo $(( + 0x4321 ))'
    190      1.1  christos }
    191      1.1  christos 
    192      1.1  christos atf_test_case do_unary_minus
    193      1.1  christos do_unary_minus_head()
    194      1.1  christos {
    195      1.1  christos         atf_set "descr" "Tests that unary minus works as expected"
    196      1.1  christos }
    197      1.1  christos do_unary_minus_body()
    198      1.1  christos {
    199      1.1  christos 	atf_check -s exit:0 -o inline:'-1\n' -e empty ${TEST_SH} -c \
    200      1.1  christos 		'echo $(( -1 ))'
    201      1.1  christos 	atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
    202      1.1  christos 		'echo $(( - 0 ))'
    203      1.1  christos 	atf_check -s exit:0 -o inline:'-1\n' -e empty ${TEST_SH} -c \
    204      1.1  christos 		'echo $(( - 1 ))'
    205      1.1  christos 	atf_check -s exit:0 -o inline:'-6\n' -e empty ${TEST_SH} -c \
    206      1.1  christos 		'echo $(( - 6 ))'
    207      1.1  christos 	atf_check -s exit:0 -o inline:'-4321\n' -e empty ${TEST_SH} -c \
    208      1.1  christos 		'echo $(( - 4321 ))'
    209      1.1  christos 	atf_check -s exit:0 -o inline:'-2257\n' -e empty ${TEST_SH} -c \
    210      1.1  christos 		'echo $(( - 04321 ))'
    211      1.1  christos 	atf_check -s exit:0 -o inline:'-7\n' -e empty ${TEST_SH} -c \
    212      1.1  christos 		'echo $((-7))'
    213      1.1  christos }
    214      1.1  christos 
    215      1.1  christos atf_test_case do_unary_not
    216      1.1  christos do_unary_not_head()
    217      1.1  christos {
    218      1.1  christos         atf_set "descr" "Tests that unary not (boolean) works as expected"
    219      1.1  christos }
    220      1.1  christos do_unary_not_body()
    221      1.1  christos {
    222      1.1  christos 	atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
    223      1.1  christos 		'echo $(( ! 1 ))'
    224      1.1  christos 	atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
    225      1.1  christos 		'echo $(( ! 0 ))'
    226      1.1  christos 
    227      1.1  christos 	atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
    228      1.1  christos 		'echo $(( !1234 ))'
    229      1.1  christos 	atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
    230      1.1  christos 		'echo $(( !0xFFFF ))'
    231      1.1  christos 	atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
    232      1.1  christos 		'echo $(( ! 000000 ))'
    233      1.1  christos }
    234      1.1  christos 
    235      1.1  christos atf_test_case do_unary_tilde
    236      1.1  christos do_unary_tilde_head()
    237      1.1  christos {
    238      1.1  christos         atf_set "descr" "Tests that unary not (bitwise) works as expected"
    239      1.1  christos }
    240      1.1  christos do_unary_tilde_body()
    241      1.1  christos {
    242      1.1  christos 	# definitely 2's complement arithmetic here...
    243      1.1  christos 
    244      1.1  christos 	atf_check -s exit:0 -o inline:'-1\n' -e empty ${TEST_SH} -c \
    245      1.1  christos 		'echo $(( ~ 0 ))'
    246      1.1  christos 	atf_check -s exit:0 -o inline:'-2\n' -e empty ${TEST_SH} -c \
    247      1.1  christos 		'echo $(( ~ 1 ))'
    248      1.1  christos 
    249      1.1  christos 	atf_check -s exit:0 -o inline:'-1235\n' -e empty ${TEST_SH} -c \
    250      1.1  christos 		'echo $(( ~1234 ))'
    251      1.1  christos 	atf_check -s exit:0 -o inline:'-256\n' -e empty ${TEST_SH} -c \
    252      1.1  christos 		'echo $(( ~0xFF ))'
    253      1.1  christos }
    254      1.1  christos 
    255      1.1  christos atf_test_case elementary_add
    256      1.1  christos elementary_add_head()
    257      1.1  christos {
    258      1.1  christos         atf_set "descr" "Tests that simple addition works as expected"
    259      1.1  christos }
    260      1.1  christos elementary_add_body()
    261      1.1  christos {
    262      1.1  christos 	# some of these tests actually test unary ops &  op precedence...
    263      1.1  christos 
    264      1.1  christos 	atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
    265      1.1  christos 		'echo $(( 0 + 0 ))'
    266      1.1  christos 	atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
    267      1.1  christos 		'echo $(( 1 + 0 ))'
    268      1.1  christos 	atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
    269      1.1  christos 		'echo $(( 0 + 1 ))'
    270      1.1  christos 	atf_check -s exit:0 -o inline:'2\n' -e empty ${TEST_SH} -c \
    271      1.1  christos 		'echo $(( 1 + 1 ))'
    272      1.1  christos 	atf_check -s exit:0 -o inline:'10\n' -e empty ${TEST_SH} -c \
    273      1.1  christos 		'echo $(( 4 + 6 ))'
    274      1.1  christos 	atf_check -s exit:0 -o inline:'10\n' -e empty ${TEST_SH} -c \
    275      1.1  christos 		'echo $(( 6 + 4 ))'
    276      1.1  christos 	atf_check -s exit:0 -o inline:'5555\n' -e empty ${TEST_SH} -c \
    277      1.1  christos 		'echo $(( 1234 + 4321 ))'
    278      1.1  christos 	atf_check -s exit:0 -o inline:'3333\n' -e empty ${TEST_SH} -c \
    279      1.1  christos 		'echo $((1111+2222))'
    280      1.1  christos 	atf_check -s exit:0 -o inline:'5555\n' -e empty ${TEST_SH} -c \
    281      1.1  christos 		'echo $((+3333+2222))'
    282      1.1  christos 	atf_check -s exit:0 -o inline:'7777\n' -e empty ${TEST_SH} -c \
    283      1.3  christos 		'echo $((+3333 + +4444))'
    284      1.1  christos 	atf_check -s exit:0 -o inline:'-7777\n' -e empty ${TEST_SH} -c \
    285      1.3  christos 		'echo -$((+4125+ +3652))'
    286      1.1  christos }
    287      1.1  christos 
    288      1.1  christos atf_test_case elementary_sub
    289      1.1  christos elementary_sub_head()
    290      1.1  christos {
    291      1.1  christos         atf_set "descr" "Tests that simple subtraction works as expected"
    292      1.1  christos }
    293      1.1  christos elementary_sub_body()
    294      1.1  christos {
    295      1.1  christos 	atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
    296      1.1  christos 		'echo $(( 0 - 0 ))'
    297      1.1  christos 	atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
    298      1.1  christos 		'echo $(( 1 - 0 ))'
    299      1.1  christos 	atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
    300      1.1  christos 		'echo $(( 1 - 1 ))'
    301      1.1  christos 	atf_check -s exit:0 -o inline:'-1\n' -e empty ${TEST_SH} -c \
    302      1.1  christos 		'echo $(( 0 - 1 ))'
    303      1.1  christos 	atf_check -s exit:0 -o inline:'488\n' -e empty ${TEST_SH} -c \
    304      1.1  christos 		'echo $(( 1066 - 578 ))'
    305      1.1  christos 	atf_check -s exit:0 -o inline:'-3662\n' -e empty ${TEST_SH} -c \
    306      1.1  christos 		'echo $(( 2016-5678 ))'
    307      1.1  christos 	atf_check -s exit:0 -o inline:'-3662\n' -e empty ${TEST_SH} -c \
    308      1.1  christos 		'echo $(( 2016+-5678 ))'
    309      1.1  christos 	atf_check -s exit:0 -o inline:'-3662\n' -e empty ${TEST_SH} -c \
    310      1.1  christos 		'echo $(( 2016-+5678 ))'
    311      1.1  christos 	atf_check -s exit:0 -o inline:'-7694\n' -e empty ${TEST_SH} -c \
    312      1.1  christos 		'echo $(( -2016-5678 ))'
    313      1.1  christos 	atf_check -s exit:0 -o inline:'--1\n' -e empty ${TEST_SH} -c \
    314      1.3  christos 		'echo -$(( -1018 - -1017 ))'
    315      1.1  christos }
    316      1.1  christos 
    317      1.1  christos atf_test_case elementary_mul
    318      1.1  christos elementary_mul_head()
    319      1.1  christos {
    320      1.1  christos         atf_set "descr" "Tests that simple multiplication works as expected"
    321      1.1  christos }
    322      1.1  christos elementary_mul_body()
    323      1.1  christos {
    324      1.1  christos 	atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
    325      1.1  christos 		'echo $(( 0 * 0 ))'
    326      1.1  christos 	atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
    327      1.1  christos 		'echo $(( 1 * 0 ))'
    328      1.1  christos 	atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
    329      1.1  christos 		'echo $(( 0 * 1 ))'
    330      1.1  christos 	atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
    331      1.1  christos 		'echo $(( 1 * 1 ))'
    332      1.1  christos 	atf_check -s exit:0 -o inline:'-1\n' -e empty ${TEST_SH} -c \
    333      1.1  christos 		'echo $(( -1 * 1 ))'
    334      1.1  christos 	atf_check -s exit:0 -o inline:'-1\n' -e empty ${TEST_SH} -c \
    335      1.1  christos 		'echo $(( 1 * -1 ))'
    336      1.1  christos 	atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
    337      1.1  christos 		'echo $(( -1 * -1 ))'
    338      1.1  christos 	atf_check -s exit:0 -o inline:'391\n' -e empty ${TEST_SH} -c \
    339      1.1  christos 		'echo $(( 17 * 23 ))'
    340      1.1  christos 	atf_check -s exit:0 -o inline:'169\n' -e empty ${TEST_SH} -c \
    341      1.1  christos 		'echo $(( 13*13 ))'
    342      1.1  christos 	atf_check -s exit:0 -o inline:'-11264\n' -e empty ${TEST_SH} -c \
    343      1.1  christos 		'echo $(( -11 *1024 ))'
    344      1.1  christos 	atf_check -s exit:0 -o inline:'-16983\n' -e empty ${TEST_SH} -c \
    345      1.1  christos 		'echo $(( 17* -999 ))'
    346      1.1  christos 	atf_check -s exit:0 -o inline:'9309\n' -e empty ${TEST_SH} -c \
    347      1.1  christos 		'echo $(( -29*-321 ))'
    348      1.1  christos }
    349      1.1  christos 
    350      1.1  christos atf_test_case elementary_div
    351      1.1  christos elementary_div_head()
    352      1.1  christos {
    353      1.1  christos         atf_set "descr" "Tests that simple division works as expected"
    354      1.1  christos }
    355      1.1  christos elementary_div_body()
    356      1.1  christos {
    357      1.1  christos 	atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
    358      1.1  christos 		'echo $(( 0 / 1 ))'
    359      1.1  christos 	atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
    360      1.1  christos 		'echo $(( 1 / 1 ))'
    361      1.1  christos 	test ${ARITH_BITS} -ge 38 &&
    362      1.1  christos 	    atf_check -s exit:0 -o inline:'99999999999\n' -e empty \
    363      1.1  christos 		${TEST_SH} -c 'echo $(( 99999999999 / 1 ))'
    364      1.1  christos 	atf_check -s exit:0 -o inline:'2\n' -e empty ${TEST_SH} -c \
    365      1.1  christos 		'echo $(( 2 / 1 ))'
    366      1.1  christos 
    367      1.1  christos 	atf_check -s exit:0 -o inline:'3\n' -e empty ${TEST_SH} -c \
    368      1.1  christos 		'echo $(( 3 / 1 ))'
    369      1.1  christos 	atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
    370      1.1  christos 		'echo $(( 3 / 2 ))'
    371      1.1  christos 	atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
    372      1.1  christos 		'echo $(( 3 / 3 ))'
    373      1.1  christos 	atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
    374      1.1  christos 		'echo $(( 3 / 4 ))'
    375      1.1  christos 
    376      1.1  christos 	atf_check -s exit:0 -o inline:'173\n' -e empty ${TEST_SH} -c \
    377      1.1  christos 		'echo $(( 123456 / 713 ))'
    378      1.1  christos 	atf_check -s exit:0 -o inline:'13\n' -e empty ${TEST_SH} -c \
    379      1.1  christos 		'echo $(( 169 / 13 ))'
    380      1.1  christos }
    381      1.1  christos 
    382      1.1  christos atf_test_case elementary_rem
    383      1.1  christos elementary_rem_head()
    384      1.1  christos {
    385      1.1  christos         atf_set "descr" "Tests that simple modulus works as expected"
    386      1.1  christos }
    387      1.1  christos elementary_rem_body()
    388      1.1  christos {
    389      1.1  christos 	atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
    390      1.1  christos 		'echo $(( 0 % 1 ))'
    391      1.1  christos 	atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
    392      1.1  christos 		'echo $(( 1 % 1 ))'
    393      1.1  christos 	atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
    394      1.1  christos 		'echo $(( 2 % 1 ))'
    395      1.1  christos 	atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
    396      1.1  christos 		'echo $(( 9999 % 1 ))'
    397      1.1  christos 
    398      1.1  christos 	atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
    399      1.1  christos 		'echo $(( 0 % 2 ))'
    400      1.1  christos 	atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
    401      1.1  christos 		'echo $(( 1 % 2 ))'
    402      1.1  christos 	atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
    403      1.1  christos 		'echo $(( 2 % 2 ))'
    404      1.1  christos 	atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
    405      1.1  christos 		'echo $(( 0xFFFF % 2 ))'
    406      1.1  christos 
    407      1.1  christos 	atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
    408      1.1  christos 		'echo $(( 0 % 3 ))'
    409      1.1  christos 	atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
    410      1.1  christos 		'echo $(( 1 % 3 ))'
    411      1.1  christos 	atf_check -s exit:0 -o inline:'2\n' -e empty ${TEST_SH} -c \
    412      1.1  christos 		'echo $(( 2 % 3 ))'
    413      1.1  christos 	atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
    414      1.1  christos 		'echo $(( 3 % 3 ))'
    415      1.1  christos 	atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
    416      1.1  christos 		'echo $(( 3123 % 3 ))'
    417      1.1  christos 
    418      1.1  christos 	atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
    419      1.1  christos 		'echo $(( 9999 % 2 ))'
    420      1.1  christos 
    421      1.1  christos 	atf_check -s exit:0 -o inline:'107\n' -e empty ${TEST_SH} -c \
    422      1.1  christos 		'echo $(( 123456%173 ))'
    423      1.1  christos 	atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
    424      1.1  christos 		'echo $((169%13))'
    425      1.1  christos }
    426      1.1  christos 
    427      1.1  christos atf_test_case elementary_shl
    428      1.1  christos elementary_shl_head()
    429      1.1  christos {
    430      1.2  christos         atf_set "descr" "Tests that simple shift left works as expected"
    431      1.1  christos }
    432      1.1  christos elementary_shl_body()
    433      1.1  christos {
    434      1.1  christos 	atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
    435      1.1  christos 		'echo $(( 0 << 0 ))'
    436      1.1  christos 	atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
    437      1.1  christos 		'echo $(( 0 << 1 ))'
    438      1.1  christos 	atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
    439      1.1  christos 		'echo $(( 0 << 17 ))'
    440      1.1  christos 
    441      1.1  christos 	atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
    442      1.1  christos 		'echo $(( 1 << 0 ))'
    443      1.1  christos 	atf_check -s exit:0 -o inline:'2\n' -e empty ${TEST_SH} -c \
    444      1.1  christos 		'echo $(( 1 << 1 ))'
    445      1.1  christos 	atf_check -s exit:0 -o inline:'131072\n' -e empty ${TEST_SH} -c \
    446      1.1  christos 		'echo $(( 1 << 17 ))'
    447      1.1  christos 
    448      1.1  christos 	atf_check -s exit:0 -o inline:'2021161080\n' -e empty ${TEST_SH} -c \
    449      1.1  christos 		'echo $(( 0x3C3C3C3C << 1 ))'
    450      1.1  christos 
    451      1.1  christos 	test "${ARITH_BITS}" -ge 40 &&
    452      1.1  christos 	    atf_check -s exit:0 -o inline:'129354309120\n' -e empty \
    453      1.1  christos 		${TEST_SH} -c 'echo $(( 0x3C3C3C3C << 7 ))'
    454      1.1  christos 	test "${ARITH_BITS}" -ge 72 &&
    455      1.1  christos 	    atf_check -s exit:0 -o inline:'1111145054534149079040\n' \
    456      1.1  christos 		-e empty ${TEST_SH} -c 'echo $(( 0x3C3C3C3C << 40 ))'
    457      1.1  christos 
    458      1.1  christos 	return 0
    459      1.1  christos }
    460      1.1  christos 
    461      1.1  christos atf_test_case elementary_shr
    462      1.1  christos elementary_shr_head()
    463      1.1  christos {
    464      1.2  christos         atf_set "descr" "Tests that simple shift right works as expected"
    465      1.1  christos }
    466      1.1  christos elementary_shr_body()
    467      1.1  christos {
    468      1.1  christos 	atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
    469      1.1  christos 		'echo $(( 0 >> 0 ))'
    470      1.1  christos 	atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
    471      1.1  christos 		'echo $(( 0 >> 1 ))'
    472      1.1  christos 	atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
    473      1.1  christos 		'echo $(( 0 >> 17 ))'
    474      1.1  christos 
    475      1.1  christos 	atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
    476      1.1  christos 		'echo $(( 1 >> 0 ))'
    477      1.1  christos 	atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
    478      1.1  christos 		'echo $(( 1 >> 1 ))'
    479      1.1  christos 	atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
    480      1.1  christos 		'echo $(( 2 >> 1 ))'
    481      1.1  christos 	atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
    482      1.1  christos 		'echo $(( 3 >> 1 ))'
    483      1.1  christos 
    484      1.1  christos 	atf_check -s exit:0 -o inline:'4\n' -e empty ${TEST_SH} -c \
    485      1.1  christos 		'echo $(( 0x10 >> 2 ))'
    486      1.1  christos 	atf_check -s exit:0 -o inline:'4\n' -e empty ${TEST_SH} -c \
    487      1.1  christos 		'echo $(( 022 >> 2 ))'
    488      1.1  christos 
    489      1.1  christos 	atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
    490      1.1  christos 		'echo $(( 131072 >> 17 ))'
    491      1.1  christos 
    492      1.1  christos 	test ${ARITH_BITS} -ge 40 &&
    493      1.1  christos 		atf_check -s exit:0 -o inline:'8\n' -e empty ${TEST_SH} -c \
    494      1.1  christos 			'echo $(( 0x4000000000 >> 35 ))'
    495      1.1  christos 	test ${ARITH_BITS} -ge 80 &&
    496      1.1  christos 		atf_check -s exit:0 -o inline:'4464\n' -e empty ${TEST_SH} -c \
    497      1.1  christos 			'echo $(( 0x93400FACE005C871000 >> 64 ))'
    498      1.1  christos 
    499      1.1  christos 	return 0
    500      1.1  christos }
    501      1.1  christos 
    502      1.1  christos atf_test_case elementary_eq
    503      1.1  christos elementary_eq_head()
    504      1.1  christos {
    505      1.1  christos         atf_set "descr" "Tests that simple equality test works as expected"
    506      1.1  christos }
    507      1.1  christos elementary_eq_body()
    508      1.1  christos {
    509      1.1  christos 	atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
    510      1.1  christos 		'echo $(( 0 == 0 ))'
    511      1.1  christos 	atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
    512      1.1  christos 		'echo $(( 0 == 0000 ))'
    513      1.1  christos 	atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
    514      1.1  christos 		'echo $(( 0 == 0x00 ))'
    515      1.1  christos 	atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
    516      1.1  christos 		'echo $(( 1 == 1 ))'
    517      1.1  christos 	atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
    518      1.1  christos 		'X=30; Y=0x1E; echo $(( X == Y ))'
    519      1.1  christos 	atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
    520      1.1  christos 		'echo $(( 0x1234 == 4660 ))'
    521      1.1  christos 	atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
    522      1.1  christos 		'echo $(( 0x1234 == 011064 ))'
    523      1.1  christos 
    524      1.1  christos 	atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
    525      1.1  christos 		'echo $(( 0 == 1 ))'
    526      1.1  christos 	atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
    527      1.1  christos 		'echo $(( 0 == 0000000000000001 ))'
    528      1.1  christos 	atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
    529      1.1  christos 		'echo $(( 0 == 0x10000000000000 ))'
    530      1.1  christos 	atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
    531      1.1  christos 		'echo $(( 1 == 2 ))'
    532      1.1  christos 	atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
    533      1.1  christos 		'X=3; Y=7; echo $(( X == Y ))'
    534      1.1  christos 	atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
    535      1.1  christos 		'echo $(( 1234 == 0x4660 ))'
    536      1.1  christos 	atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
    537      1.1  christos 		'echo $(( 01234 == 0x11064 ))'
    538      1.1  christos }
    539      1.1  christos atf_test_case elementary_ne
    540      1.1  christos elementary_ne_head()
    541      1.1  christos {
    542      1.1  christos         atf_set "descr" "Tests that simple inequality test works as expected"
    543      1.1  christos }
    544      1.1  christos elementary_ne_body()
    545      1.1  christos {
    546      1.1  christos 	atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
    547      1.1  christos 		'echo $(( 1 != 0 ))'
    548      1.1  christos 	atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
    549      1.1  christos 		'echo $(( 0x71 != 17 ))'
    550      1.1  christos 	atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
    551      1.1  christos 		'echo $(( 1234 != 01234 ))'
    552      1.1  christos 	atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
    553      1.1  christos 		'echo $(( 0x1234 != 01234 ))'
    554      1.1  christos 	atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
    555      1.1  christos 		'X=3; echo $(( X != 0 ))'
    556      1.1  christos 	atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
    557      1.1  christos 		'X=3; Y=0x11; echo $(( X != Y ))'
    558      1.1  christos 
    559      1.1  christos 	atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
    560      1.1  christos 		'echo $(( 3 != 3 ))'
    561      1.1  christos 	atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
    562      1.1  christos 		'echo $(( 0 != 0x0 ))'
    563      1.1  christos 	atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
    564      1.1  christos 		'echo $(( 0xA != 012 ))'
    565      1.1  christos 	atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
    566      1.1  christos 		'X=1; echo $(( X != 1 ))'
    567      1.1  christos 	atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
    568      1.1  christos 		'X=0xC; Y=014; echo $(( X != Y ))'
    569      1.1  christos }
    570      1.1  christos atf_test_case elementary_lt
    571      1.1  christos elementary_lt_head()
    572      1.1  christos {
    573      1.1  christos         atf_set "descr" "Tests that simple less than test works as expected"
    574      1.1  christos }
    575      1.1  christos elementary_lt_body()
    576      1.1  christos {
    577      1.1  christos 	atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
    578      1.1  christos 		'echo $(( 0 < 1 ))'
    579      1.1  christos 	atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
    580      1.1  christos 		'echo $(( -1 < 0 ))'
    581      1.1  christos 	atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
    582      1.1  christos 		'echo $(( 0 < 10 ))'
    583      1.1  christos 	atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
    584      1.1  christos 		'echo $(( 100 < 101 ))'
    585      1.1  christos 	atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
    586      1.1  christos 		'echo $(( 0xA1 < 200 ))'
    587      1.1  christos 
    588      1.1  christos 	atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
    589      1.1  christos 		'echo $(( 0 < 0 ))'
    590      1.1  christos 	atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
    591      1.1  christos 		'echo $(( 1 < 0 ))'
    592      1.1  christos 
    593      1.1  christos 	test ${ARITH_BITS} -ge 40 &&
    594      1.1  christos 	    atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
    595      1.1  christos 		'echo $(( 0x1BEEFF00D < 0x1FACECAFE ))'
    596      1.1  christos 
    597      1.1  christos 	return 0
    598      1.1  christos }
    599      1.1  christos atf_test_case elementary_le
    600      1.1  christos elementary_le_head()
    601      1.1  christos {
    602      1.1  christos         atf_set "descr" "Tests that simple less or equal test works as expected"
    603      1.1  christos }
    604      1.1  christos elementary_le_body()
    605      1.1  christos {
    606      1.1  christos 	atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
    607      1.1  christos 		'echo $(( 0 <= 1 ))'
    608      1.1  christos 	atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
    609      1.1  christos 		'echo $(( -1 <= 0 ))'
    610      1.1  christos 	atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
    611      1.1  christos 		'echo $(( 0 <= 0 ))'
    612      1.1  christos 	atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
    613      1.1  christos 		'echo $(( 0 <= 10 ))'
    614      1.1  christos 	atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
    615      1.1  christos 		'echo $(( 100 <= 101 ))'
    616      1.1  christos 	atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
    617      1.1  christos 		'echo $(( 0xA1 <= 161 ))'
    618      1.1  christos 
    619      1.1  christos 	atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
    620      1.1  christos 		'echo $(( 1 <= 0 ))'
    621      1.1  christos 	atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
    622      1.1  christos 		'echo $(( -100 <= -200 ))'
    623      1.1  christos 
    624      1.1  christos 	test ${ARITH_BITS} -ge 40 &&
    625      1.1  christos 	    atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
    626      1.1  christos 		'cost=; AUD=; echo $(( $cost 0x2FEEDBABE <= $AUD 12866927294 ))'
    627      1.1  christos 
    628      1.1  christos 	return 0
    629      1.1  christos }
    630      1.1  christos atf_test_case elementary_gt
    631      1.1  christos elementary_gt_head()
    632      1.1  christos {
    633      1.1  christos         atf_set "descr" "Tests that simple greater than works as expected"
    634      1.1  christos }
    635      1.1  christos elementary_gt_body()
    636      1.1  christos {
    637      1.1  christos 	atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
    638      1.1  christos 		'echo $(( 1 > 0 ))'
    639      1.1  christos 	atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
    640      1.1  christos 		'echo $(( 1 > -1 ))'
    641      1.1  christos 	atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
    642      1.1  christos 		'echo $(( 11 > 012 ))'
    643      1.1  christos 
    644      1.1  christos 	# atf_expect_fail "PR bin/50959"
    645      1.1  christos 	atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
    646      1.1  christos 		'echo $(( 2147483647 > 0X7FFFFF0 ))'
    647      1.1  christos 	# atf_expect_pass
    648      1.1  christos 
    649      1.1  christos 	test ${ARITH_BITS} -gt 32 &&
    650      1.1  christos 	    atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
    651      1.1  christos 		'echo $(( 0x80000000 > 0x7FFFFFFF ))'
    652      1.1  christos 
    653      1.1  christos 	atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
    654      1.1  christos 		'echo $(( 0 > 0 ))'
    655      1.1  christos 	atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
    656      1.1  christos 		'echo $(( 0 > 1 ))'
    657      1.1  christos 	atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
    658      1.1  christos 		'echo $(( -1 > 0 ))'
    659      1.1  christos 	atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
    660      1.1  christos 		'echo $(( 0 > 10 ))'
    661      1.1  christos 	atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
    662      1.1  christos 		'echo $(( 2015 > 2016 ))'
    663      1.1  christos 	atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
    664      1.1  christos 		'echo $(( 0xA1 > 200 ))'
    665      1.1  christos 
    666      1.1  christos 	test ${ARITH_BITS} -ge 44 &&
    667      1.1  christos 	    atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
    668      1.1  christos 		'echo $(( 0x7F07F07F0 > 34099628014 ))'
    669      1.1  christos 
    670      1.1  christos 	return 0
    671      1.1  christos }
    672      1.1  christos atf_test_case elementary_ge
    673      1.1  christos elementary_ge_head()
    674      1.1  christos {
    675      1.1  christos         atf_set "descr" "Tests that simple greater or equal works as expected"
    676      1.1  christos }
    677      1.1  christos elementary_ge_body()
    678      1.1  christos {
    679      1.1  christos 	atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
    680      1.1  christos 		'echo $(( 0 >= 0 ))'
    681      1.1  christos 	atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
    682      1.1  christos 		'echo $(( 1 >= 0 ))'
    683      1.1  christos 	atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
    684      1.1  christos 		'echo $(( -100 >= -101 ))'
    685      1.1  christos 
    686      1.1  christos 	atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
    687      1.1  christos 		'echo $(( -1 >= 0 ))'
    688      1.1  christos }
    689      1.1  christos 
    690      1.1  christos atf_test_case fiddle_bits_and
    691      1.1  christos fiddle_bits_and_head()
    692      1.1  christos {
    693      1.1  christos 	atf_set "descr" "Test bitwise and operations in arithmetic expressions"
    694      1.1  christos }
    695      1.1  christos fiddle_bits_and_body()
    696      1.1  christos {
    697      1.1  christos 	atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
    698      1.1  christos 		'echo $(( 0 & 0 ))'
    699      1.1  christos 	atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
    700      1.1  christos 		'echo $(( 1 & 0 ))'
    701      1.1  christos 	atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
    702      1.1  christos 		'echo $(( 0 & 1 ))'
    703      1.1  christos 	atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
    704      1.1  christos 		'echo $(( 1 & 1 ))'
    705      1.1  christos 
    706      1.1  christos 	atf_check -s exit:0 -o inline:'255\n' -e empty ${TEST_SH} -c \
    707      1.1  christos 		'echo $(( 0xFF & 0xFF ))'
    708      1.1  christos 	atf_check -s exit:0 -o inline:'255\n' -e empty ${TEST_SH} -c \
    709      1.1  christos 		'echo $(( 0xFFFF & 0377 ))'
    710      1.1  christos 
    711      1.1  christos 	test "${ARITH_BITS}" -ge 48 &&
    712      1.1  christos 	    atf_check -s exit:0 -o inline:'70377641607203\n' -e empty \
    713      1.1  christos 		${TEST_SH} -c 'echo $(( 0x5432FEDC0123 & 0x42871357BAB3 ))'
    714      1.1  christos 
    715      1.1  christos 	return 0
    716      1.1  christos }
    717      1.1  christos atf_test_case fiddle_bits_or
    718      1.1  christos fiddle_bits_or_head()
    719      1.1  christos {
    720      1.1  christos 	atf_set "descr" "Test bitwise or operations in arithmetic expressions"
    721      1.1  christos }
    722      1.1  christos fiddle_bits_or_body()
    723      1.1  christos {
    724      1.1  christos 	atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
    725      1.1  christos 		'echo $(( 0 | 0 ))'
    726      1.1  christos 	atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
    727      1.1  christos 		'echo $(( 1 | 0 ))'
    728      1.1  christos 	atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
    729      1.1  christos 		'echo $(( 0 | 1 ))'
    730      1.1  christos 	atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
    731      1.1  christos 		'echo $(( 1 | 1 ))'
    732      1.1  christos 
    733      1.1  christos 	atf_check -s exit:0 -o inline:'4369\n' -e empty ${TEST_SH} -c \
    734      1.1  christos 		'echo $(( 0x1111 | 0x1111 ))'
    735      1.1  christos 	atf_check -s exit:0 -o inline:'255\n' -e empty ${TEST_SH} -c \
    736      1.1  christos 		'echo $(( 0xAA | 0125 ))'
    737      1.1  christos 
    738      1.1  christos 	test "${ARITH_BITS}" -ge 48 &&
    739      1.1  christos 	    atf_check -s exit:0 -o inline:'95348271856563\n' -e empty \
    740      1.1  christos 		${TEST_SH} -c 'echo $(( 0x5432FEDC0123 | 0x42871357BAB3 ))'
    741      1.1  christos 
    742      1.1  christos 	return 0
    743      1.1  christos }
    744      1.1  christos atf_test_case fiddle_bits_xor
    745      1.1  christos fiddle_bits_xor_head()
    746      1.1  christos {
    747      1.1  christos 	atf_set "descr" "Test bitwise xor operations in arithmetic expressions"
    748      1.1  christos }
    749      1.1  christos fiddle_bits_xor_body()
    750      1.1  christos {
    751      1.1  christos 	atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
    752      1.1  christos 		'echo $(( 0 ^ 0 ))'
    753      1.1  christos 	atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
    754      1.1  christos 		'echo $(( 1 ^ 0 ))'
    755      1.1  christos 	atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
    756      1.1  christos 		'echo $(( 0 ^ 1 ))'
    757      1.1  christos 	atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
    758      1.1  christos 		'echo $(( 1 ^ 1 ))'
    759      1.1  christos 
    760      1.1  christos 	atf_check -s exit:0 -o inline:'255\n' -e empty ${TEST_SH} -c \
    761      1.1  christos 		'echo $(( 0xF0 ^ 0x0F ))'
    762      1.1  christos 	atf_check -s exit:0 -o inline:'15\n' -e empty ${TEST_SH} -c \
    763      1.1  christos 		'echo $(( 0xF0 ^ 0xFF ))'
    764      1.1  christos 
    765      1.1  christos 	test "${ARITH_BITS}" -ge 48 &&
    766      1.1  christos 	    atf_check -s exit:0 -o inline:'24970630249360\n' -e empty \
    767      1.1  christos 		${TEST_SH} -c 'echo $(( 0x5432FEDC0123 ^ 0x42871357BAB3 ))'
    768      1.1  christos 
    769      1.1  christos 	return 0
    770      1.1  christos }
    771      1.1  christos 
    772      1.1  christos atf_test_case logical_and
    773      1.1  christos logical_and_head()
    774      1.1  christos {
    775      1.2  christos 	atf_set "descr" "Test logical and operations in arithmetic expressions"
    776      1.1  christos }
    777      1.1  christos logical_and_body()
    778      1.1  christos {
    779      1.1  christos 	# cannot test short-circuit eval until sh implements side effects...
    780      1.1  christos 
    781      1.1  christos 	atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
    782      1.1  christos 		'echo $(( 0 && 0 ))'
    783      1.1  christos 	atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
    784      1.1  christos 		'echo $(( 1 && 0 ))'
    785      1.1  christos 	atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
    786      1.1  christos 		'echo $(( 0 && 1 ))'
    787      1.1  christos 	atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
    788      1.1  christos 		'echo $(( 1 && 1 ))'
    789      1.1  christos 
    790      1.1  christos 	# atf_expect_fail "PR bin/50960"
    791      1.1  christos 	atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
    792      1.1  christos 		'echo $(( 0x1111 && 01234 ))'
    793      1.1  christos 	atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
    794      1.1  christos 		'echo $(( 0xFFFF && 0xF0F0 ))'
    795      1.1  christos }
    796      1.1  christos atf_test_case logical_or
    797      1.1  christos logical_or_head()
    798      1.1  christos {
    799      1.2  christos 	atf_set "descr" "Test logical or operations in arithmetic expressions"
    800      1.1  christos }
    801      1.1  christos logical_or_body()
    802      1.1  christos {
    803      1.1  christos 	# cannot test short-circuit eval until sh implements side effects...
    804      1.1  christos 
    805      1.1  christos 	atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
    806      1.1  christos 		'echo $(( 0 || 0 ))'
    807      1.1  christos 	atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
    808      1.1  christos 		'echo $(( 1 || 0 ))'
    809      1.1  christos 	atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
    810      1.1  christos 		'echo $(( 0 || 1 ))'
    811      1.1  christos 	atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
    812      1.1  christos 		'echo $(( 1 || 1 ))'
    813      1.1  christos 
    814      1.1  christos 	# atf_expect_fail "PR bin/50960"
    815      1.1  christos 	atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
    816      1.1  christos 		'echo $(( 0x1111 || 01234 ))'
    817      1.1  christos 	atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
    818      1.1  christos 		'echo $(( 0x33 || 0xF0F0 ))'
    819      1.1  christos }
    820      1.1  christos 
    821      1.1  christos atf_test_case make_selection
    822      1.1  christos make_selection_head()
    823      1.1  christos {
    824      1.1  christos 	atf_set "descr" "Test ?: operator in arithmetic expressions"
    825      1.1  christos }
    826      1.1  christos make_selection_body()
    827      1.1  christos {
    828      1.1  christos 	# atf_expect_fail "PR bin/50958"
    829      1.1  christos 
    830      1.1  christos 	atf_check -s exit:0 -o inline:'3\n' -e empty ${TEST_SH} -c \
    831      1.1  christos 		'echo $(( 0 ? 2 : 3 ))'
    832      1.1  christos 	atf_check -s exit:0 -o inline:'2\n' -e empty ${TEST_SH} -c \
    833      1.1  christos 		'echo $(( 1 ? 2 : 3 ))'
    834      1.1  christos 
    835      1.1  christos 	atf_check -s exit:0 -o inline:'111\n' -e empty ${TEST_SH} -c \
    836      1.1  christos 		'echo $(( 0x1234 ? 111 : 222 ))'
    837      1.4       kre 
    838      1.4       kre 	atf_check -s exit:0 -o inline:'-1\n' -e empty ${TEST_SH} -c \
    839      1.5       kre 		'echo $(( 1 < 2 ? -1 : 1 > 2 ? 1 : 0 ))'
    840      1.4       kre 	atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
    841      1.5       kre 		'echo $(( 1 < 1 ? -1 : 1 > 1 ? 1 : 0 ))'
    842      1.4       kre 	atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
    843      1.4       kre 		'echo $(( 2 < 1 ? -1 : 2 > 1 ? 1 : 0 ))'
    844      1.1  christos }
    845      1.1  christos 
    846      1.1  christos atf_test_case operator_precedence
    847      1.1  christos operator_precedence_head()
    848      1.1  christos {
    849      1.1  christos 	atf_set "descr" "Test operator precedence without parentheses"
    850      1.1  christos }
    851      1.1  christos operator_precedence_body()
    852      1.1  christos {
    853      1.1  christos 	# NB: apart from $(( ))  ** NO ** parentheses in the expressions.
    854      1.1  christos 
    855      1.1  christos 	atf_check -s exit:0 -o inline:'6\n' -e empty ${TEST_SH} -c \
    856      1.1  christos 		'echo $(( 1 + 2 + 3 ))'
    857      1.1  christos 	atf_check -s exit:0 -o inline:'2\n' -e empty ${TEST_SH} -c \
    858      1.1  christos 		'echo $(( 1 - 2 + 3 ))'
    859      1.1  christos 	atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
    860      1.1  christos 		'echo $(( 3 - 2 - 1 ))'
    861      1.1  christos 	atf_check -s exit:0 -o inline:'2\n' -e empty ${TEST_SH} -c \
    862      1.1  christos 		'echo $(( 3 - 2 + 1 ))'
    863      1.1  christos 
    864      1.1  christos 	atf_check -s exit:0 -o inline:'-1\n' -e empty ${TEST_SH} -c \
    865      1.1  christos 		'echo $(( - 2 + 1 ))'
    866      1.1  christos 	atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
    867      1.1  christos 		'echo $(( 2 + -1 ))'
    868      1.1  christos 
    869      1.1  christos 	atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
    870      1.1  christos 		'echo $(( ! 2 + 1 ))'
    871      1.1  christos 	atf_check -s exit:0 -o inline:'2\n' -e empty ${TEST_SH} -c \
    872      1.1  christos 		'echo $(( 2 + !1 ))'
    873      1.1  christos 
    874      1.1  christos 	atf_check -s exit:0 -o inline:'8\n' -e empty ${TEST_SH} -c \
    875      1.1  christos 		'echo $(( 3 * 2 + 2 ))'
    876      1.1  christos 	atf_check -s exit:0 -o inline:'7\n' -e empty ${TEST_SH} -c \
    877      1.1  christos 		'echo $(( 3 + 2 * 2 ))'
    878      1.1  christos 	atf_check -s exit:0 -o inline:'12\n' -e empty ${TEST_SH} -c \
    879      1.1  christos 		'echo $(( 3 * 2 * 2 ))'
    880      1.1  christos 
    881      1.1  christos 	atf_check -s exit:0 -o inline:'5\n' -e empty ${TEST_SH} -c \
    882      1.1  christos 		'echo $(( 9 / 3 + 2 ))'
    883      1.1  christos 	atf_check -s exit:0 -o inline:'10\n' -e empty ${TEST_SH} -c \
    884      1.1  christos 		'echo $(( 9 + 3 / 2 ))'
    885      1.1  christos 	atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
    886      1.1  christos 		'echo $(( 9 / 3 / 2 ))'
    887      1.1  christos 
    888      1.1  christos 	atf_check -s exit:0 -o inline:'72\n' -e empty ${TEST_SH} -c \
    889      1.1  christos 		'echo $(( 9 << 1 + 2 ))'
    890      1.1  christos 	atf_check -s exit:0 -o inline:'48\n' -e empty ${TEST_SH} -c \
    891      1.1  christos 		'echo $(( 9 + 3 << 2 ))'
    892      1.1  christos 	atf_check -s exit:0 -o inline:'288\n' -e empty ${TEST_SH} -c \
    893      1.1  christos 		'echo $(( 9 << 3 << 2 ))'
    894      1.1  christos 
    895      1.1  christos 	atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
    896      1.1  christos 		'echo $(( 9 >> 1 + 2 ))'
    897      1.1  christos 	atf_check -s exit:0 -o inline:'3\n' -e empty ${TEST_SH} -c \
    898      1.1  christos 		'echo $(( 9 + 3 >> 2 ))'
    899      1.1  christos 	atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
    900      1.1  christos 		'echo $(( 19 >> 3 >> 1 ))'
    901      1.1  christos 
    902      1.1  christos 	atf_check -s exit:0 -o inline:'4\n' -e empty ${TEST_SH} -c \
    903      1.1  christos 		'echo $(( 19 >> 3 << 1 ))'
    904      1.1  christos 	atf_check -s exit:0 -o inline:'76\n' -e empty ${TEST_SH} -c \
    905      1.1  christos 		'echo $(( 19 << 3 >> 1 ))'
    906      1.1  christos 
    907      1.1  christos 	atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
    908      1.1  christos 		'echo $(( 2 + 3 < 3 * 2 ))'
    909      1.1  christos 	atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
    910      1.1  christos 		'echo $(( 2 << 3 >= 3 << 2 ))'
    911      1.1  christos 
    912      1.1  christos 	# sh inherits C's crazy operator precedence...
    913      1.1  christos 
    914      1.1  christos 	atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
    915      1.1  christos 		'echo $(( 0xfD & 0xF == 0xF ))'
    916      1.1  christos }
    917      1.1  christos 
    918      1.1  christos parentheses_head()
    919      1.1  christos {
    920      1.1  christos 	atf_set "descr" "Test use of () to group sub-expressions"
    921      1.1  christos }
    922      1.1  christos parentheses_body()
    923      1.1  christos {
    924      1.1  christos 	atf_check -s exit:0 -o inline:'6\n' -e empty ${TEST_SH} -c \
    925      1.1  christos 		'echo $(( (1 + 2) + 3 ))'
    926      1.1  christos 	atf_check -s exit:0 -o inline:'-4\n' -e empty ${TEST_SH} -c \
    927      1.1  christos 		'echo $(( 1 - (2 + 3) ))'
    928      1.1  christos 	atf_check -s exit:0 -o inline:'2\n' -e empty ${TEST_SH} -c \
    929      1.1  christos 		'echo $(( 3 - (2 - 1) ))'
    930      1.1  christos 	atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
    931      1.1  christos 		'echo $(( 3 - ( 2 + 1 ) ))'
    932      1.1  christos 
    933      1.1  christos 	atf_check -s exit:0 -o inline:'-3\n' -e empty ${TEST_SH} -c \
    934      1.1  christos 		'echo $(( - (2 + 1) ))'
    935      1.1  christos 
    936      1.1  christos 	atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
    937      1.1  christos 		'echo $(( ! (2 + 1) ))'
    938      1.1  christos 
    939      1.1  christos 	atf_check -s exit:0 -o inline:'12\n' -e empty ${TEST_SH} -c \
    940      1.1  christos 		'echo $(( 3 * (2 + 2) ))'
    941      1.1  christos 	atf_check -s exit:0 -o inline:'10\n' -e empty ${TEST_SH} -c \
    942      1.1  christos 		'echo $(( (3 + 2) * 2 ))'
    943      1.1  christos 	atf_check -s exit:0 -o inline:'12\n' -e empty ${TEST_SH} -c \
    944      1.1  christos 		'echo $(( 3 * (2 * 2) ))'
    945      1.1  christos 
    946      1.1  christos 	atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
    947      1.1  christos 		'echo $(( 9 / (3 + 2) ))'
    948      1.1  christos 	atf_check -s exit:0 -o inline:'6\n' -e empty ${TEST_SH} -c \
    949      1.1  christos 		'echo $(( ( 9 + 3 ) / 2 ))'
    950      1.1  christos 	atf_check -s exit:0 -o inline:'9\n' -e empty ${TEST_SH} -c \
    951      1.1  christos 		'echo $(( 9 / ( 3 / 2 ) ))'
    952      1.1  christos 
    953      1.1  christos 	atf_check -s exit:0 -o inline:'20\n' -e empty ${TEST_SH} -c \
    954      1.1  christos 		'echo $(( ( 9 << 1 ) + 2 ))'
    955      1.1  christos 	atf_check -s exit:0 -o inline:'21\n' -e empty ${TEST_SH} -c \
    956      1.1  christos 		'echo $(( 9 + (3 << 2) ))'
    957      1.1  christos 	atf_check -s exit:0 -o inline:'36864\n' -e empty ${TEST_SH} -c \
    958      1.1  christos 		'echo $(( 9 << (3 << 2) ))'
    959      1.1  christos 
    960      1.1  christos 	atf_check -s exit:0 -o inline:'6\n' -e empty ${TEST_SH} -c \
    961      1.1  christos 		'echo $(( (9 >> 1) + 2 ))'
    962      1.1  christos 	atf_check -s exit:0 -o inline:'9\n' -e empty ${TEST_SH} -c \
    963      1.1  christos 		'echo $(( 9 + (3 >> 2) ))'
    964      1.1  christos 	atf_check -s exit:0 -o inline:'9\n' -e empty ${TEST_SH} -c \
    965      1.1  christos 		'echo $(( 19 >> (3 >> 1) ))'
    966      1.1  christos 
    967      1.1  christos 	atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
    968      1.1  christos 		'echo $(( 19 >> (3 << 1) ))'
    969      1.1  christos 	atf_check -s exit:0 -o inline:'38\n' -e empty ${TEST_SH} -c \
    970      1.1  christos 		'echo $(( 19 << (3 >> 1) ))'
    971      1.1  christos 
    972      1.1  christos 	atf_check -s exit:0 -o inline:'2\n' -e empty ${TEST_SH} -c \
    973      1.1  christos 		'echo $(( 2 + (3 < 3) * 2 ))'
    974      1.1  christos 	atf_check -s exit:0 -o inline:'32\n' -e empty ${TEST_SH} -c \
    975      1.1  christos 		'echo $(( 2 << ((3 >= 3) << 2) ))'
    976      1.1  christos 
    977      1.1  christos 	# sh inherits C's crazy operator precedence...
    978      1.1  christos 
    979      1.1  christos 	atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
    980      1.1  christos 		'echo $(( (0xfD & 0xF) == 0xF ))'
    981      1.1  christos }
    982      1.1  christos 
    983  1.5.4.1    bouyer atf_test_case var_assign
    984  1.5.4.1    bouyer var_assign_head()
    985  1.5.4.1    bouyer {
    986  1.5.4.1    bouyer 	atf_set "descr" "Test assignment operators in arithmetic expressions"
    987  1.5.4.1    bouyer }
    988  1.5.4.1    bouyer var_assign_body()
    989  1.5.4.1    bouyer {
    990  1.5.4.1    bouyer 	atf_check -s exit:0 -o inline:'3\n3\n' -e empty ${TEST_SH} -c \
    991  1.5.4.1    bouyer 		'unset x; echo $(( x = 3 )); echo $x'
    992  1.5.4.1    bouyer 	atf_check -s exit:0 -o inline:'3\n3\n' -e empty ${TEST_SH} -c \
    993  1.5.4.1    bouyer 		'unset x; echo $((x=3)); echo $x'
    994  1.5.4.1    bouyer 	atf_check -s exit:0 -o inline:'3\n3\n' -e empty ${TEST_SH} -c \
    995  1.5.4.1    bouyer 		'x=5; echo $((x=3)); echo $x'
    996  1.5.4.1    bouyer 
    997  1.5.4.1    bouyer 	atf_check -s exit:0 -o inline:'3\n3\n' -e empty ${TEST_SH} -c \
    998  1.5.4.1    bouyer 		'set +u;unset x; echo $((x+=3)); echo $x'
    999  1.5.4.1    bouyer 	atf_check -s exit:0 -o inline:'3\n3\n' -e empty ${TEST_SH} -c \
   1000  1.5.4.1    bouyer 		'x=2; echo $((x+=1)); echo $x'
   1001  1.5.4.1    bouyer 	atf_check -s exit:0 -o inline:'3\n3\n' -e empty ${TEST_SH} -c \
   1002  1.5.4.1    bouyer 		'x=4; echo $((x-=1)); echo $x'
   1003  1.5.4.1    bouyer 	atf_check -s exit:0 -o inline:'3\n3\n' -e empty ${TEST_SH} -c \
   1004  1.5.4.1    bouyer 		'x=3; echo $((x*=1)); echo $x'
   1005  1.5.4.1    bouyer 	atf_check -s exit:0 -o inline:'3\n3\n' -e empty ${TEST_SH} -c \
   1006  1.5.4.1    bouyer 		'x=3; echo $((x/=1)); echo $x'
   1007  1.5.4.1    bouyer 	atf_check -s exit:0 -o inline:'3\n3\n' -e empty ${TEST_SH} -c \
   1008  1.5.4.1    bouyer 		'x=28; echo $((x%=5)); echo $x'
   1009  1.5.4.1    bouyer 	atf_check -s exit:0 -o inline:'3\n3\n' -e empty ${TEST_SH} -c \
   1010  1.5.4.1    bouyer 		'x=7; echo $((x&=3)); echo $x'
   1011  1.5.4.1    bouyer 	atf_check -s exit:0 -o inline:'3\n3\n' -e empty ${TEST_SH} -c \
   1012  1.5.4.1    bouyer 		'x=2; echo $((x|=1)); echo $x'
   1013  1.5.4.1    bouyer 	atf_check -s exit:0 -o inline:'3\n3\n' -e empty ${TEST_SH} -c \
   1014  1.5.4.1    bouyer 		'x=6; echo $((x^=5)); echo $x'
   1015  1.5.4.1    bouyer 	atf_check -s exit:0 -o inline:'3\n3\n' -e empty ${TEST_SH} -c \
   1016  1.5.4.1    bouyer 		'x=7; echo $((x>>=1)); echo $x'
   1017  1.5.4.1    bouyer 	atf_check -s exit:0 -o inline:'2\n2\n' -e empty ${TEST_SH} -c \
   1018  1.5.4.1    bouyer 		'x=1; echo $((x<<=1)); echo $x'
   1019  1.5.4.1    bouyer 
   1020  1.5.4.1    bouyer 	atf_check -s exit:0 -o inline:'2\n3\n' -e empty ${TEST_SH} -c \
   1021  1.5.4.1    bouyer 		'x=2; echo $(( (x+=1)-1 )); echo $x'
   1022  1.5.4.1    bouyer 	atf_check -s exit:0 -o inline:'4\n3\n' -e empty ${TEST_SH} -c \
   1023  1.5.4.1    bouyer 		'x=4; echo $(( (x-=1)+1 )); echo $x'
   1024  1.5.4.1    bouyer 
   1025  1.5.4.1    bouyer 	atf_check -s exit:0 -o inline:'36\n5 7\n' -e empty ${TEST_SH} -c \
   1026  1.5.4.1    bouyer 		'unset x y; echo $(( (x=5) * (y=7) + 1 )); echo $x $y'
   1027  1.5.4.1    bouyer 	atf_check -s exit:0 -o inline:'36\n5 7\n' -e empty ${TEST_SH} -c \
   1028  1.5.4.1    bouyer 		'x=99; y=17; echo $(( (x=5) * (y=7) + 1 )); echo $x $y'
   1029  1.5.4.1    bouyer 	atf_check -s exit:0 -o inline:'36\n5 7\n' -e empty ${TEST_SH} -c \
   1030  1.5.4.1    bouyer 		'x=4; y=9; echo $(( (x+=1) * (y-=2) + 1 )); echo $x $y'
   1031  1.5.4.1    bouyer 
   1032  1.5.4.1    bouyer 	atf_check -s exit:0 -o inline:'3\n3\n' -e empty ${TEST_SH} -c \
   1033  1.5.4.1    bouyer 		'set -u; unset x; echo $(( x = 3 )); echo $x'
   1034  1.5.4.1    bouyer 	atf_check -s not-exit:0 -o ignore -e not-empty ${TEST_SH} -c \
   1035  1.5.4.1    bouyer 		'set -u; unset x; echo $(( x + 3 )); echo $x'
   1036  1.5.4.1    bouyer 	atf_check -s not-exit:0 -o ignore -e not-empty ${TEST_SH} -c \
   1037  1.5.4.1    bouyer 		'set -u; unset x; echo $(( x+=3 )); echo $x'
   1038  1.5.4.1    bouyer }
   1039  1.5.4.1    bouyer 
   1040      1.1  christos atf_test_case arithmetic_fails
   1041      1.1  christos arithmetic_fails_head()
   1042      1.1  christos {
   1043      1.1  christos 	atf_set "descr" "Dummy test to force failure"
   1044      1.1  christos }
   1045      1.1  christos arithmetic_fails_body()
   1046      1.1  christos {
   1047      1.1  christos 	atf_fail "Cannot estimate number of bits supported by $(( ))"
   1048      1.1  christos }
   1049      1.1  christos 
   1050      1.1  christos atf_init_test_cases() {
   1051      1.1  christos 
   1052      1.1  christos 	discover_range
   1053      1.1  christos 
   1054      1.1  christos 	test "${ARITH_BITS}" = '?' && {
   1055      1.1  christos 		atf_add_test_case arithmetic_fails
   1056      1.1  christos 		return 0
   1057      1.1  christos 	}
   1058      1.1  christos 
   1059      1.1  christos 	# odd names are to get atf's sort order semi-rational
   1060      1.1  christos 
   1061      1.1  christos 	atf_add_test_case constants
   1062      1.1  christos 	atf_add_test_case do_unary_plus
   1063      1.1  christos 	atf_add_test_case do_unary_minus
   1064      1.1  christos 	atf_add_test_case do_unary_not
   1065      1.1  christos 	atf_add_test_case do_unary_tilde
   1066      1.1  christos 	atf_add_test_case elementary_add
   1067      1.1  christos 	atf_add_test_case elementary_sub
   1068      1.1  christos 	atf_add_test_case elementary_mul
   1069      1.1  christos 	atf_add_test_case elementary_div
   1070      1.1  christos 	atf_add_test_case elementary_rem
   1071      1.1  christos 	atf_add_test_case elementary_shl
   1072      1.1  christos 	atf_add_test_case elementary_shr
   1073      1.1  christos 	atf_add_test_case elementary_eq
   1074      1.1  christos 	atf_add_test_case elementary_ne
   1075      1.1  christos 	atf_add_test_case elementary_lt
   1076      1.1  christos 	atf_add_test_case elementary_le
   1077      1.1  christos 	atf_add_test_case elementary_gt
   1078      1.1  christos 	atf_add_test_case elementary_ge
   1079      1.1  christos 	atf_add_test_case fiddle_bits_and
   1080      1.1  christos 	atf_add_test_case fiddle_bits_or
   1081      1.1  christos 	atf_add_test_case fiddle_bits_xor
   1082      1.1  christos 	atf_add_test_case logical_and
   1083      1.1  christos 	atf_add_test_case logical_or
   1084      1.1  christos 	atf_add_test_case make_selection
   1085      1.1  christos 	atf_add_test_case operator_precedence
   1086      1.1  christos 	atf_add_test_case parentheses
   1087      1.1  christos 	# atf_add_test_case progressive			# build up big expr
   1088      1.1  christos 	# atf_add_test_case test_errors			# erroneous input
   1089      1.1  christos 	# atf_add_test_case torture		# hard stuff (if there is any)
   1090  1.5.4.1    bouyer 	atf_add_test_case var_assign			# assignment ops
   1091      1.1  christos 	# atf_add_test_case vulgarity	# truly evil inputs (syntax in vars...)
   1092      1.1  christos }
   1093