1 # $NetBSD: t_arith.sh,v 1.5 2016/05/12 14:25:11 kre Exp $
3 # Copyright (c) 2016 The NetBSD Foundation, Inc.
6 # Redistribution and use in source and binary forms, with or without
7 # modification, are permitted provided that the following conditions
9 # 1. Redistributions of source code must retain the above copyright
10 # notice, this list of conditions and the following disclaimer.
11 # 2. Redistributions in binary form must reproduce the above copyright
12 # notice, this list of conditions and the following disclaimer in the
13 # documentation and/or other materials provided with the distribution.
15 # THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
16 # ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
17 # TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
18 # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
19 # BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
20 # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
21 # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
22 # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23 # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
24 # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25 # POSSIBILITY OF SUCH DAMAGE.
27 # the implementation of "sh" to test
28 : ${TEST_SH:="/bin/sh"}
30 # Requirement is to support at least "signed long" whatever that means
31 # (number of bits in "long" is not specified - but should be at least 32).
33 # These tests use -o inline:"..." rather than -o match:'...' as we have
34 # only digits to examine, and it is good to be sure that 1 + 1 really gives 2
35 # and that 42 or 123 don't look like success because there is a 2 in them.
40 # cannot use arithmetic "test" operators, range of test in
41 # ATF_SHELL (or even TEST_SH) might not be as big as that
42 # supported by $(( )) in TEST_SH
44 if ! ${TEST_SH} -c ': $(( 0x10000 ))' 2>/dev/null
46 # 16 bits or less, or hex unsupported, just give up...
49 test $( ${TEST_SH} -c 'echo $(( 0x1FFFF ))' ) = 131071 || return
51 # when attempting to exceed the number of available bits
52 # the shell may react in any of 3 (rational) ways
53 # 1. syntax error (maybe even core dump...) and fail
54 # 2. represent a positive number input as negative value
55 # 3. keep the number positive, but not the value expected
56 # (perhaps pegged at the max possible value)
57 # any of those may be accompanied by a message to stderr
59 # Must check all 3 possibilities for each plausible size
60 # Tests do not use 0x8000... because that value can have weird
61 # other side effects that are not relevant to discover here.
62 # But we do want to try and force the sign bit set.
64 if ! ${TEST_SH} -c ': $(( 0xC0000000 ))' 2>/dev/null
66 # proobably shell detected overflow and complained
70 if ${TEST_SH} 2>/dev/null \
71 -c 'case $(( 0xC0000000 )); in (-*) exit 0;; esac; exit 1'
76 if ${TEST_SH} -c '[ $(( 0xC0000000 )) != 3221225472 ]' 2>/dev/null
82 if ! ${TEST_SH} -c ': $(( 0xC000000000000000 ))' 2>/dev/null
87 if ${TEST_SH} 2>/dev/null \
88 -c 'case $(( 0xC000000000000000 )); in (-*) exit 0;; esac; exit 1'
93 if ${TEST_SH} 2>/dev/null \
94 -c '[ $((0xC000000000000000)) != 13835058055282163712 ]'
100 if ${TEST_SH} 2>/dev/null -c \
101 '[ $((0x123456781234567812345678)) = 5634002657842756053938493048 ]'
103 # just assume... (for now anyway, revisit when it happens...)
109 atf_test_case constants
112 atf_set "descr" "Tests that arithmetic expansion can handle constants"
116 atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
118 atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
120 atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
123 # atf_expect_fail "PR bin/50959"
124 atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
128 atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
131 atf_check -s exit:0 -o inline:'1\n' -e empty \
132 ${TEST_SH} -c 'echo $(( 000000001 ))'
133 atf_check -s exit:0 -o inline:'0\n' -e empty \
134 ${TEST_SH} -c 'echo $(( 0x000000 ))'
136 atf_check -s exit:0 -o inline:'99999\n' -e empty \
137 ${TEST_SH} -c 'echo $((99999))'
139 [ ${ARITH_BITS} -gt 44 ] &&
140 atf_check -s exit:0 -o inline:'9191919191919\n' -e empty \
141 ${TEST_SH} -c 'echo $((9191919191919))'
143 atf_check -s exit:0 -o inline:'13\n' -e empty ${TEST_SH} -c \
145 atf_check -s exit:0 -o inline:'11\n' -e empty ${TEST_SH} -c \
147 atf_check -s exit:0 -o inline:'7\n' -e empty ${TEST_SH} -c \
149 atf_check -s exit:0 -o inline:'9\n' -e empty ${TEST_SH} -c \
152 atf_check -s exit:0 -o inline:'11\n' -e empty \
153 ${TEST_SH} -c 'x=0xB; echo $(( $x ))'
154 atf_check -s exit:0 -o inline:'27\n' -e empty \
155 ${TEST_SH} -c 'x=0X1B; echo $(( x ))'
156 atf_check -s exit:0 -o inline:'27\n' -e empty \
157 ${TEST_SH} -c 'X=033; echo $(( $X ))'
158 atf_check -s exit:0 -o inline:'219\n' -e empty \
159 ${TEST_SH} -c 'X=0333; echo $(( X ))'
160 atf_check -s exit:0 -o inline:'0\n' -e empty \
161 ${TEST_SH} -c 'NULL=; echo $(( NULL ))'
163 # Not clear if this is 0, nothing, or an error, so omit for now
164 # atf_check -s exit:0 -o inline:'0\n' -e empty \
165 # ${TEST_SH} -c 'echo $(( ))'
167 # not clear whether this should return 0 or an error, so omit for now
168 # atf_check -s exit:0 -o inline:'0\n' -e empty \
169 # ${TEST_SH} -c 'echo $(( UNDEFINED_VAR ))'
173 atf_test_case do_unary_plus
176 atf_set "descr" "Tests that unary plus works as expected"
180 atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
182 atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
184 atf_check -s exit:0 -o inline:'6\n' -e empty ${TEST_SH} -c \
186 atf_check -s exit:0 -o inline:'4321\n' -e empty ${TEST_SH} -c \
188 atf_check -s exit:0 -o inline:'17185\n' -e empty ${TEST_SH} -c \
189 'echo $(( + 0x4321 ))'
192 atf_test_case do_unary_minus
193 do_unary_minus_head()
195 atf_set "descr" "Tests that unary minus works as expected"
197 do_unary_minus_body()
199 atf_check -s exit:0 -o inline:'-1\n' -e empty ${TEST_SH} -c \
201 atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
203 atf_check -s exit:0 -o inline:'-1\n' -e empty ${TEST_SH} -c \
205 atf_check -s exit:0 -o inline:'-6\n' -e empty ${TEST_SH} -c \
207 atf_check -s exit:0 -o inline:'-4321\n' -e empty ${TEST_SH} -c \
209 atf_check -s exit:0 -o inline:'-2257\n' -e empty ${TEST_SH} -c \
210 'echo $(( - 04321 ))'
211 atf_check -s exit:0 -o inline:'-7\n' -e empty ${TEST_SH} -c \
215 atf_test_case do_unary_not
218 atf_set "descr" "Tests that unary not (boolean) works as expected"
222 atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
224 atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
227 atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
229 atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
230 'echo $(( !0xFFFF ))'
231 atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
232 'echo $(( ! 000000 ))'
235 atf_test_case do_unary_tilde
236 do_unary_tilde_head()
238 atf_set "descr" "Tests that unary not (bitwise) works as expected"
240 do_unary_tilde_body()
242 # definitely 2's complement arithmetic here...
244 atf_check -s exit:0 -o inline:'-1\n' -e empty ${TEST_SH} -c \
246 atf_check -s exit:0 -o inline:'-2\n' -e empty ${TEST_SH} -c \
249 atf_check -s exit:0 -o inline:'-1235\n' -e empty ${TEST_SH} -c \
251 atf_check -s exit:0 -o inline:'-256\n' -e empty ${TEST_SH} -c \
255 atf_test_case elementary_add
256 elementary_add_head()
258 atf_set "descr" "Tests that simple addition works as expected"
260 elementary_add_body()
262 # some of these tests actually test unary ops & op precedence...
264 atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
266 atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
268 atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
270 atf_check -s exit:0 -o inline:'2\n' -e empty ${TEST_SH} -c \
272 atf_check -s exit:0 -o inline:'10\n' -e empty ${TEST_SH} -c \
274 atf_check -s exit:0 -o inline:'10\n' -e empty ${TEST_SH} -c \
276 atf_check -s exit:0 -o inline:'5555\n' -e empty ${TEST_SH} -c \
277 'echo $(( 1234 + 4321 ))'
278 atf_check -s exit:0 -o inline:'3333\n' -e empty ${TEST_SH} -c \
279 'echo $((1111+2222))'
280 atf_check -s exit:0 -o inline:'5555\n' -e empty ${TEST_SH} -c \
281 'echo $((+3333+2222))'
282 atf_check -s exit:0 -o inline:'7777\n' -e empty ${TEST_SH} -c \
283 'echo $((+3333 + +4444))'
284 atf_check -s exit:0 -o inline:'-7777\n' -e empty ${TEST_SH} -c \
285 'echo -$((+4125+ +3652))'
288 atf_test_case elementary_sub
289 elementary_sub_head()
291 atf_set "descr" "Tests that simple subtraction works as expected"
293 elementary_sub_body()
295 atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
297 atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
299 atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
301 atf_check -s exit:0 -o inline:'-1\n' -e empty ${TEST_SH} -c \
303 atf_check -s exit:0 -o inline:'488\n' -e empty ${TEST_SH} -c \
304 'echo $(( 1066 - 578 ))'
305 atf_check -s exit:0 -o inline:'-3662\n' -e empty ${TEST_SH} -c \
306 'echo $(( 2016-5678 ))'
307 atf_check -s exit:0 -o inline:'-3662\n' -e empty ${TEST_SH} -c \
308 'echo $(( 2016+-5678 ))'
309 atf_check -s exit:0 -o inline:'-3662\n' -e empty ${TEST_SH} -c \
310 'echo $(( 2016-+5678 ))'
311 atf_check -s exit:0 -o inline:'-7694\n' -e empty ${TEST_SH} -c \
312 'echo $(( -2016-5678 ))'
313 atf_check -s exit:0 -o inline:'--1\n' -e empty ${TEST_SH} -c \
314 'echo -$(( -1018 - -1017 ))'
317 atf_test_case elementary_mul
318 elementary_mul_head()
320 atf_set "descr" "Tests that simple multiplication works as expected"
322 elementary_mul_body()
324 atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
326 atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
328 atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
330 atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
332 atf_check -s exit:0 -o inline:'-1\n' -e empty ${TEST_SH} -c \
334 atf_check -s exit:0 -o inline:'-1\n' -e empty ${TEST_SH} -c \
336 atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
337 'echo $(( -1 * -1 ))'
338 atf_check -s exit:0 -o inline:'391\n' -e empty ${TEST_SH} -c \
339 'echo $(( 17 * 23 ))'
340 atf_check -s exit:0 -o inline:'169\n' -e empty ${TEST_SH} -c \
342 atf_check -s exit:0 -o inline:'-11264\n' -e empty ${TEST_SH} -c \
343 'echo $(( -11 *1024 ))'
344 atf_check -s exit:0 -o inline:'-16983\n' -e empty ${TEST_SH} -c \
345 'echo $(( 17* -999 ))'
346 atf_check -s exit:0 -o inline:'9309\n' -e empty ${TEST_SH} -c \
347 'echo $(( -29*-321 ))'
350 atf_test_case elementary_div
351 elementary_div_head()
353 atf_set "descr" "Tests that simple division works as expected"
355 elementary_div_body()
357 atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
359 atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
361 test ${ARITH_BITS} -ge 38 &&
362 atf_check -s exit:0 -o inline:'99999999999\n' -e empty \
363 ${TEST_SH} -c 'echo $(( 99999999999 / 1 ))'
364 atf_check -s exit:0 -o inline:'2\n' -e empty ${TEST_SH} -c \
367 atf_check -s exit:0 -o inline:'3\n' -e empty ${TEST_SH} -c \
369 atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
371 atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
373 atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
376 atf_check -s exit:0 -o inline:'173\n' -e empty ${TEST_SH} -c \
377 'echo $(( 123456 / 713 ))'
378 atf_check -s exit:0 -o inline:'13\n' -e empty ${TEST_SH} -c \
379 'echo $(( 169 / 13 ))'
382 atf_test_case elementary_rem
383 elementary_rem_head()
385 atf_set "descr" "Tests that simple modulus works as expected"
387 elementary_rem_body()
389 atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
391 atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
393 atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
395 atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
396 'echo $(( 9999 % 1 ))'
398 atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
400 atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
402 atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
404 atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
405 'echo $(( 0xFFFF % 2 ))'
407 atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
409 atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
411 atf_check -s exit:0 -o inline:'2\n' -e empty ${TEST_SH} -c \
413 atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
415 atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
416 'echo $(( 3123 % 3 ))'
418 atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
419 'echo $(( 9999 % 2 ))'
421 atf_check -s exit:0 -o inline:'107\n' -e empty ${TEST_SH} -c \
422 'echo $(( 123456%173 ))'
423 atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
427 atf_test_case elementary_shl
428 elementary_shl_head()
430 atf_set "descr" "Tests that simple shift left works as expected"
432 elementary_shl_body()
434 atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
436 atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
438 atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
439 'echo $(( 0 << 17 ))'
441 atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
443 atf_check -s exit:0 -o inline:'2\n' -e empty ${TEST_SH} -c \
445 atf_check -s exit:0 -o inline:'131072\n' -e empty ${TEST_SH} -c \
446 'echo $(( 1 << 17 ))'
448 atf_check -s exit:0 -o inline:'2021161080\n' -e empty ${TEST_SH} -c \
449 'echo $(( 0x3C3C3C3C << 1 ))'
451 test "${ARITH_BITS}" -ge 40 &&
452 atf_check -s exit:0 -o inline:'129354309120\n' -e empty \
453 ${TEST_SH} -c 'echo $(( 0x3C3C3C3C << 7 ))'
454 test "${ARITH_BITS}" -ge 72 &&
455 atf_check -s exit:0 -o inline:'1111145054534149079040\n' \
456 -e empty ${TEST_SH} -c 'echo $(( 0x3C3C3C3C << 40 ))'
461 atf_test_case elementary_shr
462 elementary_shr_head()
464 atf_set "descr" "Tests that simple shift right works as expected"
466 elementary_shr_body()
468 atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
470 atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
472 atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
473 'echo $(( 0 >> 17 ))'
475 atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
477 atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
479 atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
481 atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
484 atf_check -s exit:0 -o inline:'4\n' -e empty ${TEST_SH} -c \
485 'echo $(( 0x10 >> 2 ))'
486 atf_check -s exit:0 -o inline:'4\n' -e empty ${TEST_SH} -c \
487 'echo $(( 022 >> 2 ))'
489 atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
490 'echo $(( 131072 >> 17 ))'
492 test ${ARITH_BITS} -ge 40 &&
493 atf_check -s exit:0 -o inline:'8\n' -e empty ${TEST_SH} -c \
494 'echo $(( 0x4000000000 >> 35 ))'
495 test ${ARITH_BITS} -ge 80 &&
496 atf_check -s exit:0 -o inline:'4464\n' -e empty ${TEST_SH} -c \
497 'echo $(( 0x93400FACE005C871000 >> 64 ))'
502 atf_test_case elementary_eq
505 atf_set "descr" "Tests that simple equality test works as expected"
509 atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
511 atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
512 'echo $(( 0 == 0000 ))'
513 atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
514 'echo $(( 0 == 0x00 ))'
515 atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
517 atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
518 'X=30; Y=0x1E; echo $(( X == Y ))'
519 atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
520 'echo $(( 0x1234 == 4660 ))'
521 atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
522 'echo $(( 0x1234 == 011064 ))'
524 atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
526 atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
527 'echo $(( 0 == 0000000000000001 ))'
528 atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
529 'echo $(( 0 == 0x10000000000000 ))'
530 atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
532 atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
533 'X=3; Y=7; echo $(( X == Y ))'
534 atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
535 'echo $(( 1234 == 0x4660 ))'
536 atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
537 'echo $(( 01234 == 0x11064 ))'
539 atf_test_case elementary_ne
542 atf_set "descr" "Tests that simple inequality test works as expected"
546 atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
548 atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
549 'echo $(( 0x71 != 17 ))'
550 atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
551 'echo $(( 1234 != 01234 ))'
552 atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
553 'echo $(( 0x1234 != 01234 ))'
554 atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
555 'X=3; echo $(( X != 0 ))'
556 atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
557 'X=3; Y=0x11; echo $(( X != Y ))'
559 atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
561 atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
562 'echo $(( 0 != 0x0 ))'
563 atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
564 'echo $(( 0xA != 012 ))'
565 atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
566 'X=1; echo $(( X != 1 ))'
567 atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
568 'X=0xC; Y=014; echo $(( X != Y ))'
570 atf_test_case elementary_lt
573 atf_set "descr" "Tests that simple less than test works as expected"
577 atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
579 atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
581 atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
583 atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
584 'echo $(( 100 < 101 ))'
585 atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
586 'echo $(( 0xA1 < 200 ))'
588 atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
590 atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
593 test ${ARITH_BITS} -ge 40 &&
594 atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
595 'echo $(( 0x1BEEFF00D < 0x1FACECAFE ))'
599 atf_test_case elementary_le
602 atf_set "descr" "Tests that simple less or equal test works as expected"
606 atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
608 atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
609 'echo $(( -1 <= 0 ))'
610 atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
612 atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
613 'echo $(( 0 <= 10 ))'
614 atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
615 'echo $(( 100 <= 101 ))'
616 atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
617 'echo $(( 0xA1 <= 161 ))'
619 atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
621 atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
622 'echo $(( -100 <= -200 ))'
624 test ${ARITH_BITS} -ge 40 &&
625 atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
626 'cost=; AUD=; echo $(( $cost 0x2FEEDBABE <= $AUD 12866927294 ))'
630 atf_test_case elementary_gt
633 atf_set "descr" "Tests that simple greater than works as expected"
637 atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
639 atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
641 atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
642 'echo $(( 11 > 012 ))'
644 # atf_expect_fail "PR bin/50959"
645 atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
646 'echo $(( 2147483647 > 0X7FFFFF0 ))'
649 test ${ARITH_BITS} -gt 32 &&
650 atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
651 'echo $(( 0x80000000 > 0x7FFFFFFF ))'
653 atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
655 atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
657 atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
659 atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
661 atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
662 'echo $(( 2015 > 2016 ))'
663 atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
664 'echo $(( 0xA1 > 200 ))'
666 test ${ARITH_BITS} -ge 44 &&
667 atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
668 'echo $(( 0x7F07F07F0 > 34099628014 ))'
672 atf_test_case elementary_ge
675 atf_set "descr" "Tests that simple greater or equal works as expected"
679 atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
681 atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
683 atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
684 'echo $(( -100 >= -101 ))'
686 atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
687 'echo $(( -1 >= 0 ))'
690 atf_test_case fiddle_bits_and
691 fiddle_bits_and_head()
693 atf_set "descr" "Test bitwise and operations in arithmetic expressions"
695 fiddle_bits_and_body()
697 atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
699 atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
701 atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
703 atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
706 atf_check -s exit:0 -o inline:'255\n' -e empty ${TEST_SH} -c \
707 'echo $(( 0xFF & 0xFF ))'
708 atf_check -s exit:0 -o inline:'255\n' -e empty ${TEST_SH} -c \
709 'echo $(( 0xFFFF & 0377 ))'
711 test "${ARITH_BITS}" -ge 48 &&
712 atf_check -s exit:0 -o inline:'70377641607203\n' -e empty \
713 ${TEST_SH} -c 'echo $(( 0x5432FEDC0123 & 0x42871357BAB3 ))'
717 atf_test_case fiddle_bits_or
718 fiddle_bits_or_head()
720 atf_set "descr" "Test bitwise or operations in arithmetic expressions"
722 fiddle_bits_or_body()
724 atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
726 atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
728 atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
730 atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
733 atf_check -s exit:0 -o inline:'4369\n' -e empty ${TEST_SH} -c \
734 'echo $(( 0x1111 | 0x1111 ))'
735 atf_check -s exit:0 -o inline:'255\n' -e empty ${TEST_SH} -c \
736 'echo $(( 0xAA | 0125 ))'
738 test "${ARITH_BITS}" -ge 48 &&
739 atf_check -s exit:0 -o inline:'95348271856563\n' -e empty \
740 ${TEST_SH} -c 'echo $(( 0x5432FEDC0123 | 0x42871357BAB3 ))'
744 atf_test_case fiddle_bits_xor
745 fiddle_bits_xor_head()
747 atf_set "descr" "Test bitwise xor operations in arithmetic expressions"
749 fiddle_bits_xor_body()
751 atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
753 atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
755 atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
757 atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
760 atf_check -s exit:0 -o inline:'255\n' -e empty ${TEST_SH} -c \
761 'echo $(( 0xF0 ^ 0x0F ))'
762 atf_check -s exit:0 -o inline:'15\n' -e empty ${TEST_SH} -c \
763 'echo $(( 0xF0 ^ 0xFF ))'
765 test "${ARITH_BITS}" -ge 48 &&
766 atf_check -s exit:0 -o inline:'24970630249360\n' -e empty \
767 ${TEST_SH} -c 'echo $(( 0x5432FEDC0123 ^ 0x42871357BAB3 ))'
772 atf_test_case logical_and
775 atf_set "descr" "Test logical and operations in arithmetic expressions"
779 # cannot test short-circuit eval until sh implements side effects...
781 atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
783 atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
785 atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
787 atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
790 # atf_expect_fail "PR bin/50960"
791 atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
792 'echo $(( 0x1111 && 01234 ))'
793 atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
794 'echo $(( 0xFFFF && 0xF0F0 ))'
796 atf_test_case logical_or
799 atf_set "descr" "Test logical or operations in arithmetic expressions"
803 # cannot test short-circuit eval until sh implements side effects...
805 atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
807 atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
809 atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
811 atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
814 # atf_expect_fail "PR bin/50960"
815 atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
816 'echo $(( 0x1111 || 01234 ))'
817 atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
818 'echo $(( 0x33 || 0xF0F0 ))'
821 atf_test_case make_selection
822 make_selection_head()
824 atf_set "descr" "Test ?: operator in arithmetic expressions"
826 make_selection_body()
828 # atf_expect_fail "PR bin/50958"
830 atf_check -s exit:0 -o inline:'3\n' -e empty ${TEST_SH} -c \
831 'echo $(( 0 ? 2 : 3 ))'
832 atf_check -s exit:0 -o inline:'2\n' -e empty ${TEST_SH} -c \
833 'echo $(( 1 ? 2 : 3 ))'
835 atf_check -s exit:0 -o inline:'111\n' -e empty ${TEST_SH} -c \
836 'echo $(( 0x1234 ? 111 : 222 ))'
838 atf_check -s exit:0 -o inline:'-1\n' -e empty ${TEST_SH} -c \
839 'echo $(( 1 < 2 ? -1 : 1 > 2 ? 1 : 0 ))'
840 atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
841 'echo $(( 1 < 1 ? -1 : 1 > 1 ? 1 : 0 ))'
842 atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
843 'echo $(( 2 < 1 ? -1 : 2 > 1 ? 1 : 0 ))'
846 atf_test_case operator_precedence
847 operator_precedence_head()
849 atf_set "descr" "Test operator precedence without parentheses"
851 operator_precedence_body()
853 # NB: apart from $(( )) ** NO ** parentheses in the expressions.
855 atf_check -s exit:0 -o inline:'6\n' -e empty ${TEST_SH} -c \
856 'echo $(( 1 + 2 + 3 ))'
857 atf_check -s exit:0 -o inline:'2\n' -e empty ${TEST_SH} -c \
858 'echo $(( 1 - 2 + 3 ))'
859 atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
860 'echo $(( 3 - 2 - 1 ))'
861 atf_check -s exit:0 -o inline:'2\n' -e empty ${TEST_SH} -c \
862 'echo $(( 3 - 2 + 1 ))'
864 atf_check -s exit:0 -o inline:'-1\n' -e empty ${TEST_SH} -c \
865 'echo $(( - 2 + 1 ))'
866 atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
869 atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
870 'echo $(( ! 2 + 1 ))'
871 atf_check -s exit:0 -o inline:'2\n' -e empty ${TEST_SH} -c \
874 atf_check -s exit:0 -o inline:'8\n' -e empty ${TEST_SH} -c \
875 'echo $(( 3 * 2 + 2 ))'
876 atf_check -s exit:0 -o inline:'7\n' -e empty ${TEST_SH} -c \
877 'echo $(( 3 + 2 * 2 ))'
878 atf_check -s exit:0 -o inline:'12\n' -e empty ${TEST_SH} -c \
879 'echo $(( 3 * 2 * 2 ))'
881 atf_check -s exit:0 -o inline:'5\n' -e empty ${TEST_SH} -c \
882 'echo $(( 9 / 3 + 2 ))'
883 atf_check -s exit:0 -o inline:'10\n' -e empty ${TEST_SH} -c \
884 'echo $(( 9 + 3 / 2 ))'
885 atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
886 'echo $(( 9 / 3 / 2 ))'
888 atf_check -s exit:0 -o inline:'72\n' -e empty ${TEST_SH} -c \
889 'echo $(( 9 << 1 + 2 ))'
890 atf_check -s exit:0 -o inline:'48\n' -e empty ${TEST_SH} -c \
891 'echo $(( 9 + 3 << 2 ))'
892 atf_check -s exit:0 -o inline:'288\n' -e empty ${TEST_SH} -c \
893 'echo $(( 9 << 3 << 2 ))'
895 atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
896 'echo $(( 9 >> 1 + 2 ))'
897 atf_check -s exit:0 -o inline:'3\n' -e empty ${TEST_SH} -c \
898 'echo $(( 9 + 3 >> 2 ))'
899 atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
900 'echo $(( 19 >> 3 >> 1 ))'
902 atf_check -s exit:0 -o inline:'4\n' -e empty ${TEST_SH} -c \
903 'echo $(( 19 >> 3 << 1 ))'
904 atf_check -s exit:0 -o inline:'76\n' -e empty ${TEST_SH} -c \
905 'echo $(( 19 << 3 >> 1 ))'
907 atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
908 'echo $(( 2 + 3 < 3 * 2 ))'
909 atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
910 'echo $(( 2 << 3 >= 3 << 2 ))'
912 # sh inherits C's crazy operator precedence...
914 atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
915 'echo $(( 0xfD & 0xF == 0xF ))'
920 atf_set "descr" "Test use of () to group sub-expressions"
924 atf_check -s exit:0 -o inline:'6\n' -e empty ${TEST_SH} -c \
925 'echo $(( (1 + 2) + 3 ))'
926 atf_check -s exit:0 -o inline:'-4\n' -e empty ${TEST_SH} -c \
927 'echo $(( 1 - (2 + 3) ))'
928 atf_check -s exit:0 -o inline:'2\n' -e empty ${TEST_SH} -c \
929 'echo $(( 3 - (2 - 1) ))'
930 atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
931 'echo $(( 3 - ( 2 + 1 ) ))'
933 atf_check -s exit:0 -o inline:'-3\n' -e empty ${TEST_SH} -c \
934 'echo $(( - (2 + 1) ))'
936 atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
937 'echo $(( ! (2 + 1) ))'
939 atf_check -s exit:0 -o inline:'12\n' -e empty ${TEST_SH} -c \
940 'echo $(( 3 * (2 + 2) ))'
941 atf_check -s exit:0 -o inline:'10\n' -e empty ${TEST_SH} -c \
942 'echo $(( (3 + 2) * 2 ))'
943 atf_check -s exit:0 -o inline:'12\n' -e empty ${TEST_SH} -c \
944 'echo $(( 3 * (2 * 2) ))'
946 atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
947 'echo $(( 9 / (3 + 2) ))'
948 atf_check -s exit:0 -o inline:'6\n' -e empty ${TEST_SH} -c \
949 'echo $(( ( 9 + 3 ) / 2 ))'
950 atf_check -s exit:0 -o inline:'9\n' -e empty ${TEST_SH} -c \
951 'echo $(( 9 / ( 3 / 2 ) ))'
953 atf_check -s exit:0 -o inline:'20\n' -e empty ${TEST_SH} -c \
954 'echo $(( ( 9 << 1 ) + 2 ))'
955 atf_check -s exit:0 -o inline:'21\n' -e empty ${TEST_SH} -c \
956 'echo $(( 9 + (3 << 2) ))'
957 atf_check -s exit:0 -o inline:'36864\n' -e empty ${TEST_SH} -c \
958 'echo $(( 9 << (3 << 2) ))'
960 atf_check -s exit:0 -o inline:'6\n' -e empty ${TEST_SH} -c \
961 'echo $(( (9 >> 1) + 2 ))'
962 atf_check -s exit:0 -o inline:'9\n' -e empty ${TEST_SH} -c \
963 'echo $(( 9 + (3 >> 2) ))'
964 atf_check -s exit:0 -o inline:'9\n' -e empty ${TEST_SH} -c \
965 'echo $(( 19 >> (3 >> 1) ))'
967 atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
968 'echo $(( 19 >> (3 << 1) ))'
969 atf_check -s exit:0 -o inline:'38\n' -e empty ${TEST_SH} -c \
970 'echo $(( 19 << (3 >> 1) ))'
972 atf_check -s exit:0 -o inline:'2\n' -e empty ${TEST_SH} -c \
973 'echo $(( 2 + (3 < 3) * 2 ))'
974 atf_check -s exit:0 -o inline:'32\n' -e empty ${TEST_SH} -c \
975 'echo $(( 2 << ((3 >= 3) << 2) ))'
977 # sh inherits C's crazy operator precedence...
979 atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
980 'echo $(( (0xfD & 0xF) == 0xF ))'
983 atf_test_case arithmetic_fails
984 arithmetic_fails_head()
986 atf_set "descr" "Dummy test to force failure"
988 arithmetic_fails_body()
990 atf_fail "Cannot estimate number of bits supported by $(( ))"
993 atf_init_test_cases() {
997 test "${ARITH_BITS}" = '?' && {
998 atf_add_test_case arithmetic_fails
1002 # odd names are to get atf's sort order semi-rational
1004 atf_add_test_case constants
1005 atf_add_test_case do_unary_plus
1006 atf_add_test_case do_unary_minus
1007 atf_add_test_case do_unary_not
1008 atf_add_test_case do_unary_tilde
1009 atf_add_test_case elementary_add
1010 atf_add_test_case elementary_sub
1011 atf_add_test_case elementary_mul
1012 atf_add_test_case elementary_div
1013 atf_add_test_case elementary_rem
1014 atf_add_test_case elementary_shl
1015 atf_add_test_case elementary_shr
1016 atf_add_test_case elementary_eq
1017 atf_add_test_case elementary_ne
1018 atf_add_test_case elementary_lt
1019 atf_add_test_case elementary_le
1020 atf_add_test_case elementary_gt
1021 atf_add_test_case elementary_ge
1022 atf_add_test_case fiddle_bits_and
1023 atf_add_test_case fiddle_bits_or
1024 atf_add_test_case fiddle_bits_xor
1025 atf_add_test_case logical_and
1026 atf_add_test_case logical_or
1027 atf_add_test_case make_selection
1028 atf_add_test_case operator_precedence
1029 atf_add_test_case parentheses
1030 # atf_add_test_case progressive # build up big expr
1031 # atf_add_test_case test_errors # erroneous input
1032 # atf_add_test_case torture # hard stuff (if there is any)
1033 # atf_add_test_case var_assign # assignment ops
1034 # atf_add_test_case vulgarity # truly evil inputs (syntax in vars...)