1 1.8 kre # $NetBSD: t_arith.sh,v 1.8 2017/07/15 18:50:42 kre 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.7 kre atf_test_case nested_arith 822 1.7 kre nested_arith_head() 823 1.7 kre { 824 1.7 kre atf_set "descr" 'Test nested arithmetic $(( $(( )) ))' 825 1.7 kre } 826 1.7 kre nested_arith_body() 827 1.7 kre { 828 1.7 kre atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \ 829 1.7 kre 'echo $(( $(( 0 )) ))' 830 1.7 kre atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \ 831 1.7 kre 'echo $(( 1 + $(( 2 - 2 )) ))' 832 1.7 kre atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \ 833 1.7 kre 'echo $(( $(( 3 / 3 )) + $((1*1*1)) - $(( 7 % 6 ))))' 834 1.7 kre atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \ 835 1.7 kre 'echo $(($(($(($(($((1))))))))))' 836 1.7 kre 837 1.7 kre atf_check -s exit:0 -o inline:'246\n' -e empty ${TEST_SH} -c \ 838 1.7 kre 'echo $(( 2$((2 * 2))6 ))' 839 1.7 kre atf_check -s exit:0 -o inline:'291117\n' -e empty ${TEST_SH} -c \ 840 1.7 kre 'echo $(( $((1 + 1))$((3 * 3))$(( 99-88 ))$(( 17))))' 841 1.7 kre atf_check -s exit:0 -o inline:'123456789\n' -e empty ${TEST_SH} -c \ 842 1.7 kre 'echo $(( 1$((2$((1+2))4$((2 + 2 + 1))6))7$((4 * 2))$(($((81/9))))))' 843 1.7 kre } 844 1.7 kre 845 1.1 christos atf_test_case make_selection 846 1.1 christos make_selection_head() 847 1.1 christos { 848 1.1 christos atf_set "descr" "Test ?: operator in arithmetic expressions" 849 1.1 christos } 850 1.1 christos make_selection_body() 851 1.1 christos { 852 1.1 christos # atf_expect_fail "PR bin/50958" 853 1.1 christos 854 1.1 christos atf_check -s exit:0 -o inline:'3\n' -e empty ${TEST_SH} -c \ 855 1.1 christos 'echo $(( 0 ? 2 : 3 ))' 856 1.1 christos atf_check -s exit:0 -o inline:'2\n' -e empty ${TEST_SH} -c \ 857 1.1 christos 'echo $(( 1 ? 2 : 3 ))' 858 1.1 christos 859 1.1 christos atf_check -s exit:0 -o inline:'111\n' -e empty ${TEST_SH} -c \ 860 1.1 christos 'echo $(( 0x1234 ? 111 : 222 ))' 861 1.4 kre 862 1.4 kre atf_check -s exit:0 -o inline:'-1\n' -e empty ${TEST_SH} -c \ 863 1.5 kre 'echo $(( 1 < 2 ? -1 : 1 > 2 ? 1 : 0 ))' 864 1.4 kre atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \ 865 1.5 kre 'echo $(( 1 < 1 ? -1 : 1 > 1 ? 1 : 0 ))' 866 1.4 kre atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \ 867 1.4 kre 'echo $(( 2 < 1 ? -1 : 2 > 1 ? 1 : 0 ))' 868 1.1 christos } 869 1.1 christos 870 1.1 christos atf_test_case operator_precedence 871 1.1 christos operator_precedence_head() 872 1.1 christos { 873 1.1 christos atf_set "descr" "Test operator precedence without parentheses" 874 1.1 christos } 875 1.1 christos operator_precedence_body() 876 1.1 christos { 877 1.1 christos # NB: apart from $(( )) ** NO ** parentheses in the expressions. 878 1.1 christos 879 1.1 christos atf_check -s exit:0 -o inline:'6\n' -e empty ${TEST_SH} -c \ 880 1.1 christos 'echo $(( 1 + 2 + 3 ))' 881 1.1 christos atf_check -s exit:0 -o inline:'2\n' -e empty ${TEST_SH} -c \ 882 1.1 christos 'echo $(( 1 - 2 + 3 ))' 883 1.1 christos atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \ 884 1.1 christos 'echo $(( 3 - 2 - 1 ))' 885 1.1 christos atf_check -s exit:0 -o inline:'2\n' -e empty ${TEST_SH} -c \ 886 1.1 christos 'echo $(( 3 - 2 + 1 ))' 887 1.1 christos 888 1.1 christos atf_check -s exit:0 -o inline:'-1\n' -e empty ${TEST_SH} -c \ 889 1.1 christos 'echo $(( - 2 + 1 ))' 890 1.1 christos atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \ 891 1.1 christos 'echo $(( 2 + -1 ))' 892 1.1 christos 893 1.1 christos atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \ 894 1.1 christos 'echo $(( ! 2 + 1 ))' 895 1.1 christos atf_check -s exit:0 -o inline:'2\n' -e empty ${TEST_SH} -c \ 896 1.1 christos 'echo $(( 2 + !1 ))' 897 1.1 christos 898 1.1 christos atf_check -s exit:0 -o inline:'8\n' -e empty ${TEST_SH} -c \ 899 1.1 christos 'echo $(( 3 * 2 + 2 ))' 900 1.1 christos atf_check -s exit:0 -o inline:'7\n' -e empty ${TEST_SH} -c \ 901 1.1 christos 'echo $(( 3 + 2 * 2 ))' 902 1.1 christos atf_check -s exit:0 -o inline:'12\n' -e empty ${TEST_SH} -c \ 903 1.1 christos 'echo $(( 3 * 2 * 2 ))' 904 1.1 christos 905 1.1 christos atf_check -s exit:0 -o inline:'5\n' -e empty ${TEST_SH} -c \ 906 1.1 christos 'echo $(( 9 / 3 + 2 ))' 907 1.1 christos atf_check -s exit:0 -o inline:'10\n' -e empty ${TEST_SH} -c \ 908 1.1 christos 'echo $(( 9 + 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 $(( 9 / 3 / 2 ))' 911 1.1 christos 912 1.1 christos atf_check -s exit:0 -o inline:'72\n' -e empty ${TEST_SH} -c \ 913 1.1 christos 'echo $(( 9 << 1 + 2 ))' 914 1.1 christos atf_check -s exit:0 -o inline:'48\n' -e empty ${TEST_SH} -c \ 915 1.1 christos 'echo $(( 9 + 3 << 2 ))' 916 1.1 christos atf_check -s exit:0 -o inline:'288\n' -e empty ${TEST_SH} -c \ 917 1.1 christos 'echo $(( 9 << 3 << 2 ))' 918 1.1 christos 919 1.1 christos atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \ 920 1.1 christos 'echo $(( 9 >> 1 + 2 ))' 921 1.1 christos atf_check -s exit:0 -o inline:'3\n' -e empty ${TEST_SH} -c \ 922 1.1 christos 'echo $(( 9 + 3 >> 2 ))' 923 1.1 christos atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \ 924 1.1 christos 'echo $(( 19 >> 3 >> 1 ))' 925 1.1 christos 926 1.1 christos atf_check -s exit:0 -o inline:'4\n' -e empty ${TEST_SH} -c \ 927 1.1 christos 'echo $(( 19 >> 3 << 1 ))' 928 1.1 christos atf_check -s exit:0 -o inline:'76\n' -e empty ${TEST_SH} -c \ 929 1.1 christos 'echo $(( 19 << 3 >> 1 ))' 930 1.1 christos 931 1.1 christos atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \ 932 1.1 christos 'echo $(( 2 + 3 < 3 * 2 ))' 933 1.1 christos atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \ 934 1.1 christos 'echo $(( 2 << 3 >= 3 << 2 ))' 935 1.1 christos 936 1.1 christos # sh inherits C's crazy operator precedence... 937 1.1 christos 938 1.1 christos atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \ 939 1.1 christos 'echo $(( 0xfD & 0xF == 0xF ))' 940 1.8 kre 941 1.8 kre ${TEST_SH} -c ': $(( 1 , 2 , 3 ))' 2>/dev/null && { 942 1.8 kre atf_check -s exit:0 -o inline:'2\n' -e empty ${TEST_SH} -c \ 943 1.8 kre 'echo $(( 3 * 7 , 2 << 8 , 9 - 7 ))' 944 1.8 kre atf_check -s exit:0 -o inline:'4\n' -e empty ${TEST_SH} -c \ 945 1.8 kre 'echo $(( 1 ? 2 : 3 , 0 ? 1 : 4 ))' 946 1.8 kre } 947 1.8 kre 948 1.8 kre return 0 949 1.8 kre } 950 1.8 kre 951 1.8 kre atf_test_case optional_comma 952 1.8 kre optional_comma_head() 953 1.8 kre { 954 1.8 kre atf_set "descr" "Test the optional comma operator" 955 1.8 kre } 956 1.8 kre optional_comma_body() 957 1.8 kre { 958 1.8 kre # First, see if it is supported or not. 959 1.8 kre ${TEST_SH} -c ': $(( 1 , 2 , 3 ))' 2>/dev/null || atf_skip \ 960 1.8 kre "${TEST_SH} does not implement the ',' operator in"' $(( ))' 961 1.8 kre 962 1.8 kre 963 1.8 kre # Note ',' should be set off from numbers by spaces, as in some 964 1.8 kre # locales it is a valid chacacter in a number, and we want to 965 1.8 kre # avoid any possibility of confusing the parser. 966 1.8 kre 967 1.8 kre atf_check -s exit:0 -o inline:'2\n' -e empty ${TEST_SH} -c \ 968 1.8 kre 'echo $(( 1 , 2 ))' 969 1.8 kre atf_check -s exit:0 -o inline:'3\n' -e empty ${TEST_SH} -c \ 970 1.8 kre 'echo $(( 1 , 2 , 3 ))' 971 1.8 kre atf_check -s exit:0 -o inline:'4\n' -e empty ${TEST_SH} -c \ 972 1.8 kre 'echo $(( 1 , 2 , 3 , 4 ))' 973 1.8 kre 974 1.8 kre atf_check -s not-exit:0 -o empty -e not-empty ${TEST_SH} -c \ 975 1.8 kre 'echo $(( , 2 ))' 976 1.8 kre atf_check -s not-exit:0 -o empty -e not-empty ${TEST_SH} -c \ 977 1.8 kre 'echo $(( 2 , ))' 978 1.8 kre atf_check -s not-exit:0 -o empty -e not-empty ${TEST_SH} -c \ 979 1.8 kre 'echo $(( 1 , , 2 ))' 980 1.1 christos } 981 1.1 christos 982 1.1 christos parentheses_head() 983 1.1 christos { 984 1.1 christos atf_set "descr" "Test use of () to group sub-expressions" 985 1.1 christos } 986 1.1 christos parentheses_body() 987 1.1 christos { 988 1.1 christos atf_check -s exit:0 -o inline:'6\n' -e empty ${TEST_SH} -c \ 989 1.1 christos 'echo $(( (1 + 2) + 3 ))' 990 1.1 christos atf_check -s exit:0 -o inline:'-4\n' -e empty ${TEST_SH} -c \ 991 1.1 christos 'echo $(( 1 - (2 + 3) ))' 992 1.1 christos atf_check -s exit:0 -o inline:'2\n' -e empty ${TEST_SH} -c \ 993 1.1 christos 'echo $(( 3 - (2 - 1) ))' 994 1.1 christos atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \ 995 1.1 christos 'echo $(( 3 - ( 2 + 1 ) ))' 996 1.1 christos 997 1.1 christos atf_check -s exit:0 -o inline:'-3\n' -e empty ${TEST_SH} -c \ 998 1.1 christos 'echo $(( - (2 + 1) ))' 999 1.1 christos 1000 1.1 christos atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \ 1001 1.1 christos 'echo $(( ! (2 + 1) ))' 1002 1.1 christos 1003 1.1 christos atf_check -s exit:0 -o inline:'12\n' -e empty ${TEST_SH} -c \ 1004 1.1 christos 'echo $(( 3 * (2 + 2) ))' 1005 1.1 christos atf_check -s exit:0 -o inline:'10\n' -e empty ${TEST_SH} -c \ 1006 1.1 christos 'echo $(( (3 + 2) * 2 ))' 1007 1.1 christos atf_check -s exit:0 -o inline:'12\n' -e empty ${TEST_SH} -c \ 1008 1.1 christos 'echo $(( 3 * (2 * 2) ))' 1009 1.1 christos 1010 1.1 christos atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \ 1011 1.1 christos 'echo $(( 9 / (3 + 2) ))' 1012 1.1 christos atf_check -s exit:0 -o inline:'6\n' -e empty ${TEST_SH} -c \ 1013 1.1 christos 'echo $(( ( 9 + 3 ) / 2 ))' 1014 1.1 christos atf_check -s exit:0 -o inline:'9\n' -e empty ${TEST_SH} -c \ 1015 1.1 christos 'echo $(( 9 / ( 3 / 2 ) ))' 1016 1.1 christos 1017 1.1 christos atf_check -s exit:0 -o inline:'20\n' -e empty ${TEST_SH} -c \ 1018 1.1 christos 'echo $(( ( 9 << 1 ) + 2 ))' 1019 1.1 christos atf_check -s exit:0 -o inline:'21\n' -e empty ${TEST_SH} -c \ 1020 1.1 christos 'echo $(( 9 + (3 << 2) ))' 1021 1.1 christos atf_check -s exit:0 -o inline:'36864\n' -e empty ${TEST_SH} -c \ 1022 1.1 christos 'echo $(( 9 << (3 << 2) ))' 1023 1.1 christos 1024 1.1 christos atf_check -s exit:0 -o inline:'6\n' -e empty ${TEST_SH} -c \ 1025 1.1 christos 'echo $(( (9 >> 1) + 2 ))' 1026 1.1 christos atf_check -s exit:0 -o inline:'9\n' -e empty ${TEST_SH} -c \ 1027 1.1 christos 'echo $(( 9 + (3 >> 2) ))' 1028 1.1 christos atf_check -s exit:0 -o inline:'9\n' -e empty ${TEST_SH} -c \ 1029 1.1 christos 'echo $(( 19 >> (3 >> 1) ))' 1030 1.1 christos 1031 1.1 christos atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \ 1032 1.1 christos 'echo $(( 19 >> (3 << 1) ))' 1033 1.1 christos atf_check -s exit:0 -o inline:'38\n' -e empty ${TEST_SH} -c \ 1034 1.1 christos 'echo $(( 19 << (3 >> 1) ))' 1035 1.1 christos 1036 1.1 christos atf_check -s exit:0 -o inline:'2\n' -e empty ${TEST_SH} -c \ 1037 1.1 christos 'echo $(( 2 + (3 < 3) * 2 ))' 1038 1.1 christos atf_check -s exit:0 -o inline:'32\n' -e empty ${TEST_SH} -c \ 1039 1.1 christos 'echo $(( 2 << ((3 >= 3) << 2) ))' 1040 1.1 christos 1041 1.1 christos # sh inherits C's crazy operator precedence... 1042 1.1 christos atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \ 1043 1.1 christos 'echo $(( (0xfD & 0xF) == 0xF ))' 1044 1.8 kre 1045 1.8 kre ${TEST_SH} -c ': $(( 1 , 2 , 3 ))' 2>/dev/null && { 1046 1.8 kre atf_check -s exit:0 -o inline:'24\n' -e empty ${TEST_SH} -c \ 1047 1.8 kre 'echo $(( 3 * (7 , 2) << (8 , 9 - 7) ))' 1048 1.8 kre atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \ 1049 1.8 kre 'echo $(( 0 ? 2 : ( ( 0 , 3 ) ? 1 : 4) ))' 1050 1.8 kre } 1051 1.8 kre return 0 1052 1.1 christos } 1053 1.1 christos 1054 1.6 kre atf_test_case var_assign 1055 1.6 kre var_assign_head() 1056 1.6 kre { 1057 1.6 kre atf_set "descr" "Test assignment operators in arithmetic expressions" 1058 1.6 kre } 1059 1.6 kre var_assign_body() 1060 1.6 kre { 1061 1.6 kre atf_check -s exit:0 -o inline:'3\n3\n' -e empty ${TEST_SH} -c \ 1062 1.6 kre 'unset x; echo $(( x = 3 )); echo $x' 1063 1.6 kre atf_check -s exit:0 -o inline:'3\n3\n' -e empty ${TEST_SH} -c \ 1064 1.6 kre 'unset x; echo $((x=3)); echo $x' 1065 1.6 kre atf_check -s exit:0 -o inline:'3\n3\n' -e empty ${TEST_SH} -c \ 1066 1.6 kre 'x=5; echo $((x=3)); echo $x' 1067 1.6 kre 1068 1.6 kre atf_check -s exit:0 -o inline:'3\n3\n' -e empty ${TEST_SH} -c \ 1069 1.6 kre 'set +u;unset x; echo $((x+=3)); echo $x' 1070 1.6 kre atf_check -s exit:0 -o inline:'3\n3\n' -e empty ${TEST_SH} -c \ 1071 1.6 kre 'x=2; echo $((x+=1)); echo $x' 1072 1.6 kre atf_check -s exit:0 -o inline:'3\n3\n' -e empty ${TEST_SH} -c \ 1073 1.6 kre 'x=4; echo $((x-=1)); echo $x' 1074 1.6 kre atf_check -s exit:0 -o inline:'3\n3\n' -e empty ${TEST_SH} -c \ 1075 1.6 kre 'x=3; echo $((x*=1)); echo $x' 1076 1.6 kre atf_check -s exit:0 -o inline:'3\n3\n' -e empty ${TEST_SH} -c \ 1077 1.6 kre 'x=3; echo $((x/=1)); echo $x' 1078 1.6 kre atf_check -s exit:0 -o inline:'3\n3\n' -e empty ${TEST_SH} -c \ 1079 1.6 kre 'x=28; echo $((x%=5)); echo $x' 1080 1.6 kre atf_check -s exit:0 -o inline:'3\n3\n' -e empty ${TEST_SH} -c \ 1081 1.6 kre 'x=7; echo $((x&=3)); echo $x' 1082 1.6 kre atf_check -s exit:0 -o inline:'3\n3\n' -e empty ${TEST_SH} -c \ 1083 1.6 kre 'x=2; echo $((x|=1)); echo $x' 1084 1.6 kre atf_check -s exit:0 -o inline:'3\n3\n' -e empty ${TEST_SH} -c \ 1085 1.6 kre 'x=6; echo $((x^=5)); echo $x' 1086 1.6 kre atf_check -s exit:0 -o inline:'3\n3\n' -e empty ${TEST_SH} -c \ 1087 1.6 kre 'x=7; echo $((x>>=1)); echo $x' 1088 1.6 kre atf_check -s exit:0 -o inline:'2\n2\n' -e empty ${TEST_SH} -c \ 1089 1.6 kre 'x=1; echo $((x<<=1)); echo $x' 1090 1.6 kre 1091 1.6 kre atf_check -s exit:0 -o inline:'2\n3\n' -e empty ${TEST_SH} -c \ 1092 1.6 kre 'x=2; echo $(( (x+=1)-1 )); echo $x' 1093 1.6 kre atf_check -s exit:0 -o inline:'4\n3\n' -e empty ${TEST_SH} -c \ 1094 1.6 kre 'x=4; echo $(( (x-=1)+1 )); echo $x' 1095 1.6 kre 1096 1.6 kre atf_check -s exit:0 -o inline:'36\n5 7\n' -e empty ${TEST_SH} -c \ 1097 1.6 kre 'unset x y; echo $(( (x=5) * (y=7) + 1 )); echo $x $y' 1098 1.6 kre atf_check -s exit:0 -o inline:'36\n5 7\n' -e empty ${TEST_SH} -c \ 1099 1.6 kre 'x=99; y=17; echo $(( (x=5) * (y=7) + 1 )); echo $x $y' 1100 1.6 kre atf_check -s exit:0 -o inline:'36\n5 7\n' -e empty ${TEST_SH} -c \ 1101 1.6 kre 'x=4; y=9; echo $(( (x+=1) * (y-=2) + 1 )); echo $x $y' 1102 1.6 kre 1103 1.6 kre atf_check -s exit:0 -o inline:'3\n3\n' -e empty ${TEST_SH} -c \ 1104 1.6 kre 'set -u; unset x; echo $(( x = 3 )); echo $x' 1105 1.6 kre atf_check -s not-exit:0 -o ignore -e not-empty ${TEST_SH} -c \ 1106 1.6 kre 'set -u; unset x; echo $(( x + 3 )); echo $x' 1107 1.6 kre atf_check -s not-exit:0 -o ignore -e not-empty ${TEST_SH} -c \ 1108 1.6 kre 'set -u; unset x; echo $(( x+=3 )); echo $x' 1109 1.8 kre 1110 1.8 kre ${TEST_SH} -c ': $(( 1 , 2 , 3 ))' 2>/dev/null && { 1111 1.8 kre atf_check -s exit:0 -o inline:'3\n3\n' -e empty ${TEST_SH} -c \ 1112 1.8 kre 'echo $((x=2 , x|=1)); echo $x' 1113 1.8 kre atf_check -s exit:0 -o inline:'3\n3\n' -e empty ${TEST_SH} -c \ 1114 1.8 kre 'set -u; echo $((x = 2 ,x |= 1)); echo $x' 1115 1.8 kre atf_check -s exit:0 -o inline:'6\n1:2:3:6\n' -e empty \ 1116 1.8 kre ${TEST_SH} -c \ 1117 1.8 kre 'echo $((a=1 , b=2 , c = 3 , x=a+b + c)); echo $a:$b:$c:$x' 1118 1.8 kre atf_check -s exit:0 -o inline:'6\n1:2:3:6\n' -e empty \ 1119 1.8 kre ${TEST_SH} -c \ 1120 1.8 kre 'set -u;echo $((a=1 ,b=2 ,c=3 ,x=a+b+c)); echo $a:$b:$c:$x' 1121 1.8 kre } 1122 1.8 kre return 0 1123 1.8 kre } 1124 1.8 kre 1125 1.8 kre atf_test_case var_postinc 1126 1.8 kre var_postinc_head() 1127 1.8 kre { 1128 1.8 kre atf_set "descr" "Test suffix ++ operator" 1129 1.8 kre } 1130 1.8 kre var_postinc_body() 1131 1.8 kre { 1132 1.8 kre ${TEST_SH} -c 'X=1; : $(( X++ ))' 2>/dev/null || 1133 1.8 kre atf_skip "${TEST_SH} does not support the suffix ++ operator" 1134 1.8 kre 1135 1.8 kre unset X ; # just in case ... 1136 1.8 kre 1137 1.8 kre atf_check -s exit:0 -o inline:'1\n2\n' -e empty ${TEST_SH} -c \ 1138 1.8 kre 'X=1; echo $(( X++ )); echo $X' 1139 1.8 kre atf_check -s exit:0 -o inline:'0\n1\n' -e empty ${TEST_SH} -c \ 1140 1.8 kre 'echo $(( X++ )); echo $X' 1141 1.8 kre 1142 1.8 kre atf_check -s exit:0 -o inline:'0\n1:0\n' -e empty ${TEST_SH} -c \ 1143 1.8 kre 'unset Y; echo $(( Y = X++ )); echo $X:$Y' 1144 1.8 kre atf_check -s exit:0 -o inline:'12\n4:5\n' -e empty ${TEST_SH} -c \ 1145 1.8 kre 'X=3 Y=4; echo $(( Y++*X++ )); echo $X:$Y' 1146 1.8 kre 1147 1.8 kre atf_check -s exit:0 -o inline:'1\n2\n' -e empty ${TEST_SH} -c \ 1148 1.8 kre 'set -u; X=1; echo $(( X++ )); echo $X' 1149 1.8 kre atf_check -s exit:0 -o inline:'0\n1:0\n' -e empty ${TEST_SH} -c \ 1150 1.8 kre 'set -u; X=0; unset Y; echo $(( Y = X++ )); echo $X:$Y' 1151 1.8 kre atf_check -s exit:0 -o inline:'12\n4:5\n' -e empty ${TEST_SH} -c \ 1152 1.8 kre 'set -u; X=3 Y=4; echo $(( Y++*X++ )); echo $X:$Y' 1153 1.8 kre 1154 1.8 kre atf_check -s not-exit:0 -o empty -e not-empty ${TEST_SH} -c \ 1155 1.8 kre 'set -u; echo $(( X++ ))' 1156 1.8 kre atf_check -s not-exit:0 -o empty -e not-empty ${TEST_SH} -c \ 1157 1.8 kre 'set -u; unset Y; echo $(( X = Y++ ))' 1158 1.8 kre 1159 1.8 kre atf_check -s not-exit:0 -o empty -e not-empty ${TEST_SH} -c \ 1160 1.8 kre 'X=3; readonly X; echo $(( X++ ))' 1161 1.8 kre 1162 1.8 kre } 1163 1.8 kre atf_test_case var_postdec 1164 1.8 kre var_postdec_head() 1165 1.8 kre { 1166 1.8 kre atf_set "descr" "Test suffix -- operator" 1167 1.8 kre } 1168 1.8 kre var_postdec_body() 1169 1.8 kre { 1170 1.8 kre ${TEST_SH} -c 'X=1; : $(( X-- ))' 2>/dev/null || 1171 1.8 kre atf_skip "${TEST_SH} does not support the suffix -- operator" 1172 1.8 kre 1173 1.8 kre unset X ; # just in case ... 1174 1.8 kre 1175 1.8 kre atf_check -s exit:0 -o inline:'1\n0\n' -e empty ${TEST_SH} -c \ 1176 1.8 kre 'X=1; echo $(( X-- )); echo $X' 1177 1.8 kre atf_check -s exit:0 -o inline:'0\n-1\n' -e empty ${TEST_SH} -c \ 1178 1.8 kre 'echo $(( X-- )); echo $X' 1179 1.8 kre 1180 1.8 kre atf_check -s exit:0 -o inline:'0\n-1:0\n' -e empty ${TEST_SH} -c \ 1181 1.8 kre 'unset Y; echo $(( Y = X-- )); echo $X:$Y' 1182 1.8 kre atf_check -s exit:0 -o inline:'12\n2:3\n' -e empty ${TEST_SH} -c \ 1183 1.8 kre 'X=3 Y=4; echo $(( Y--*X-- )); echo $X:$Y' 1184 1.8 kre 1185 1.8 kre atf_check -s exit:0 -o inline:'1\n0\n' -e empty ${TEST_SH} -c \ 1186 1.8 kre 'set -u; X=1; echo $(( X-- )); echo $X' 1187 1.8 kre atf_check -s exit:0 -o inline:'0\n-1:0\n' -e empty ${TEST_SH} -c \ 1188 1.8 kre 'set -u; X=0; unset Y; echo $(( Y = X-- )); echo $X:$Y' 1189 1.8 kre atf_check -s exit:0 -o inline:'12\n2:3\n' -e empty ${TEST_SH} -c \ 1190 1.8 kre 'set -u; X=3 Y=4; echo $(( Y--*X-- )); echo $X:$Y' 1191 1.8 kre 1192 1.8 kre atf_check -s not-exit:0 -o empty -e not-empty ${TEST_SH} -c \ 1193 1.8 kre 'set -u; echo $(( X-- ))' 1194 1.8 kre atf_check -s not-exit:0 -o empty -e not-empty ${TEST_SH} -c \ 1195 1.8 kre 'set -u; unset Y; echo $(( X = Y-- ))' 1196 1.8 kre 1197 1.8 kre atf_check -s not-exit:0 -o empty -e not-empty ${TEST_SH} -c \ 1198 1.8 kre 'X=3; readonly X; echo $(( X-- ))' 1199 1.8 kre 1200 1.8 kre } 1201 1.8 kre atf_test_case var_preinc 1202 1.8 kre var_preinc_head() 1203 1.8 kre { 1204 1.8 kre atf_set "descr" "Test prefix ++ operator" 1205 1.8 kre } 1206 1.8 kre var_preinc_body() 1207 1.8 kre { 1208 1.8 kre ${TEST_SH} -c 'X=1; : $(( ++X ))' 2>/dev/null || 1209 1.8 kre atf_skip "${TEST_SH} does not support the prefix ++ operator" 1210 1.8 kre 1211 1.8 kre unset X ; # just in case ... 1212 1.8 kre 1213 1.8 kre atf_check -s exit:0 -o inline:'2\n2\n' -e empty ${TEST_SH} -c \ 1214 1.8 kre 'X=1; echo $(( ++X )); echo $X' 1215 1.8 kre atf_check -s exit:0 -o inline:'1\n1\n' -e empty ${TEST_SH} -c \ 1216 1.8 kre 'echo $(( ++X )); echo $X' 1217 1.8 kre 1218 1.8 kre atf_check -s exit:0 -o inline:'1\n1:1\n' -e empty ${TEST_SH} -c \ 1219 1.8 kre 'unset Y; echo $(( Y = ++X )); echo $X:$Y' 1220 1.8 kre atf_check -s exit:0 -o inline:'20\n4:5\n' -e empty ${TEST_SH} -c \ 1221 1.8 kre 'X=3 Y=4; echo $(( ++Y*++X )); echo $X:$Y' 1222 1.8 kre 1223 1.8 kre atf_check -s exit:0 -o inline:'2\n2\n' -e empty ${TEST_SH} -c \ 1224 1.8 kre 'set -u; X=1; echo $(( ++X )); echo $X' 1225 1.8 kre atf_check -s exit:0 -o inline:'1\n1:1\n' -e empty ${TEST_SH} -c \ 1226 1.8 kre 'set -u; X=0; unset Y; echo $(( Y = ++X )); echo $X:$Y' 1227 1.8 kre atf_check -s exit:0 -o inline:'20\n4:5\n' -e empty ${TEST_SH} -c \ 1228 1.8 kre 'set -u; X=3 Y=4; echo $(( ++Y*++X )); echo $X:$Y' 1229 1.8 kre 1230 1.8 kre atf_check -s not-exit:0 -o empty -e not-empty ${TEST_SH} -c \ 1231 1.8 kre 'set -u; echo $(( ++X ))' 1232 1.8 kre atf_check -s not-exit:0 -o empty -e not-empty ${TEST_SH} -c \ 1233 1.8 kre 'set -u; unset Y; echo $(( X = ++Y ))' 1234 1.8 kre 1235 1.8 kre atf_check -s not-exit:0 -o empty -e not-empty ${TEST_SH} -c \ 1236 1.8 kre 'X=3; readonly X; echo $(( ++X ))' 1237 1.8 kre 1238 1.8 kre } 1239 1.8 kre atf_test_case var_predec 1240 1.8 kre var_predec_head() 1241 1.8 kre { 1242 1.8 kre atf_set "descr" "Test prefix -- operator" 1243 1.8 kre } 1244 1.8 kre var_predec_body() 1245 1.8 kre { 1246 1.8 kre ${TEST_SH} -c 'X=1; : $(( --X ))' 2>/dev/null || 1247 1.8 kre atf_skip "${TEST_SH} does not support the prefix -- operator" 1248 1.8 kre 1249 1.8 kre unset X ; # just in case ... 1250 1.8 kre 1251 1.8 kre atf_check -s exit:0 -o inline:'0\n0\n' -e empty ${TEST_SH} -c \ 1252 1.8 kre 'X=1; echo $(( --X )); echo $X' 1253 1.8 kre atf_check -s exit:0 -o inline:'-1\n-1\n' -e empty ${TEST_SH} -c \ 1254 1.8 kre 'echo $(( --X )); echo $X' 1255 1.8 kre 1256 1.8 kre atf_check -s exit:0 -o inline:'-1\n-1:-1\n' -e empty ${TEST_SH} -c \ 1257 1.8 kre 'unset Y; echo $(( Y = --X )); echo $X:$Y' 1258 1.8 kre atf_check -s exit:0 -o inline:'6\n2:3\n' -e empty ${TEST_SH} -c \ 1259 1.8 kre 'X=3 Y=4; echo $(( --Y*--X )); echo $X:$Y' 1260 1.8 kre 1261 1.8 kre atf_check -s exit:0 -o inline:'0\n0\n' -e empty ${TEST_SH} -c \ 1262 1.8 kre 'set -u; X=1; echo $(( --X )); echo $X' 1263 1.8 kre atf_check -s exit:0 -o inline:'-1\n-1:-1\n' -e empty ${TEST_SH} -c \ 1264 1.8 kre 'set -u; X=0; unset Y; echo $(( Y = --X )); echo $X:$Y' 1265 1.8 kre atf_check -s exit:0 -o inline:'6\n2:3\n' -e empty ${TEST_SH} -c \ 1266 1.8 kre 'set -u; X=3 Y=4; echo $(( --Y*--X )); echo $X:$Y' 1267 1.8 kre 1268 1.8 kre atf_check -s not-exit:0 -o empty -e not-empty ${TEST_SH} -c \ 1269 1.8 kre 'set -u; echo $(( --X ))' 1270 1.8 kre atf_check -s not-exit:0 -o empty -e not-empty ${TEST_SH} -c \ 1271 1.8 kre 'set -u; unset Y; echo $(( X = --Y ))' 1272 1.8 kre 1273 1.8 kre atf_check -s not-exit:0 -o empty -e not-empty ${TEST_SH} -c \ 1274 1.8 kre 'X=3; readonly X; echo $(( --X ))' 1275 1.8 kre 1276 1.6 kre } 1277 1.6 kre 1278 1.1 christos atf_test_case arithmetic_fails 1279 1.1 christos arithmetic_fails_head() 1280 1.1 christos { 1281 1.1 christos atf_set "descr" "Dummy test to force failure" 1282 1.1 christos } 1283 1.1 christos arithmetic_fails_body() 1284 1.1 christos { 1285 1.1 christos atf_fail "Cannot estimate number of bits supported by $(( ))" 1286 1.1 christos } 1287 1.1 christos 1288 1.1 christos atf_init_test_cases() { 1289 1.1 christos 1290 1.1 christos discover_range 1291 1.1 christos 1292 1.1 christos test "${ARITH_BITS}" = '?' && { 1293 1.1 christos atf_add_test_case arithmetic_fails 1294 1.1 christos return 0 1295 1.1 christos } 1296 1.1 christos 1297 1.1 christos # odd names are to get atf's sort order semi-rational 1298 1.1 christos 1299 1.1 christos atf_add_test_case constants 1300 1.1 christos atf_add_test_case do_unary_plus 1301 1.1 christos atf_add_test_case do_unary_minus 1302 1.1 christos atf_add_test_case do_unary_not 1303 1.1 christos atf_add_test_case do_unary_tilde 1304 1.1 christos atf_add_test_case elementary_add 1305 1.1 christos atf_add_test_case elementary_sub 1306 1.1 christos atf_add_test_case elementary_mul 1307 1.1 christos atf_add_test_case elementary_div 1308 1.1 christos atf_add_test_case elementary_rem 1309 1.1 christos atf_add_test_case elementary_shl 1310 1.1 christos atf_add_test_case elementary_shr 1311 1.1 christos atf_add_test_case elementary_eq 1312 1.1 christos atf_add_test_case elementary_ne 1313 1.1 christos atf_add_test_case elementary_lt 1314 1.1 christos atf_add_test_case elementary_le 1315 1.1 christos atf_add_test_case elementary_gt 1316 1.1 christos atf_add_test_case elementary_ge 1317 1.1 christos atf_add_test_case fiddle_bits_and 1318 1.1 christos atf_add_test_case fiddle_bits_or 1319 1.1 christos atf_add_test_case fiddle_bits_xor 1320 1.1 christos atf_add_test_case logical_and 1321 1.1 christos atf_add_test_case logical_or 1322 1.1 christos atf_add_test_case make_selection 1323 1.7 kre atf_add_test_case nested_arith 1324 1.1 christos atf_add_test_case operator_precedence 1325 1.8 kre atf_add_test_case optional_comma 1326 1.1 christos atf_add_test_case parentheses 1327 1.1 christos # atf_add_test_case progressive # build up big expr 1328 1.1 christos # atf_add_test_case test_errors # erroneous input 1329 1.1 christos # atf_add_test_case torture # hard stuff (if there is any) 1330 1.6 kre atf_add_test_case var_assign # assignment ops 1331 1.8 kre atf_add_test_case var_postinc # var++ 1332 1.8 kre atf_add_test_case var_postdec # var-- 1333 1.8 kre atf_add_test_case var_preinc # ++var 1334 1.8 kre atf_add_test_case var_predec # --var 1335 1.1 christos # atf_add_test_case vulgarity # truly evil inputs (syntax in vars...) 1336 1.1 christos } 1337