]> CyberLeo.Net >> Repos - FreeBSD/stable/10.git/blob - contrib/netbsd-tests/bin/sh/t_arith.sh
MFC r305358,r305449,r305451,r306367,r306397,r309474:
[FreeBSD/stable/10.git] / contrib / netbsd-tests / bin / sh / t_arith.sh
1 # $NetBSD: t_arith.sh,v 1.5 2016/05/12 14:25:11 kre Exp $
2 #
3 # Copyright (c) 2016 The NetBSD Foundation, Inc.
4 # All rights reserved.
5 #
6 # Redistribution and use in source and binary forms, with or without
7 # modification, are permitted provided that the following conditions
8 # are met:
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.
14 #
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.
26 #
27 # the implementation of "sh" to test
28 : ${TEST_SH:="/bin/sh"}
29
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).
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.
36
37 ARITH_BITS='?'
38 discover_range()
39 {
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
43
44         if ! ${TEST_SH} -c ': $(( 0x10000 ))' 2>/dev/null
45         then
46                 # 16 bits or less, or hex unsupported, just give up...
47                 return
48         fi
49         test $( ${TEST_SH} -c 'echo $(( 0x1FFFF ))' ) = 131071 || return
50
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
58
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.
63
64         if ! ${TEST_SH} -c ': $(( 0xC0000000 ))' 2>/dev/null
65         then
66                 # proobably shell detected overflow and complained
67                 ARITH_BITS=32
68                 return
69         fi
70         if ${TEST_SH} 2>/dev/null \
71             -c 'case $(( 0xC0000000 )); in (-*) exit 0;; esac; exit 1'
72         then
73                 ARITH_BITS=32
74                 return
75         fi
76         if ${TEST_SH} -c '[ $(( 0xC0000000 )) != 3221225472 ]' 2>/dev/null
77         then
78                 ARITH_BITS=32
79                 return
80         fi
81
82         if ! ${TEST_SH} -c ': $(( 0xC000000000000000 ))' 2>/dev/null
83         then
84                 ARITH_BITS=64
85                 return
86         fi
87         if ${TEST_SH} 2>/dev/null \
88             -c 'case $(( 0xC000000000000000 )); in (-*) exit 0;; esac; exit 1'
89         then
90                 ARITH_BITS=64
91                 return
92         fi
93         if ${TEST_SH} 2>/dev/null \
94             -c '[ $((0xC000000000000000)) != 13835058055282163712 ]'
95         then
96                 ARITH_BITS=64
97                 return
98         fi
99
100         if ${TEST_SH} 2>/dev/null -c \
101            '[ $((0x123456781234567812345678)) = 5634002657842756053938493048 ]'
102         then
103                 # just assume... (for now anyway, revisit when it happens...)
104                 ARITH_BITS=96
105                 return
106         fi
107 }
108
109 atf_test_case constants
110 constants_head()
111 {
112         atf_set "descr" "Tests that arithmetic expansion can handle constants"
113 }
114 constants_body()
115 {
116         atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
117                 'echo $(( 1 ))'
118         atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
119                 'echo $(( 0 ))'
120         atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
121                 'echo $((0x0))'
122
123         # atf_expect_fail "PR bin/50959"
124         atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
125                 'echo $((0X0))'
126         # atf_expect_pass
127
128         atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
129                 'echo $((000))'
130
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 ))'
135
136         atf_check -s exit:0 -o inline:'99999\n' -e empty \
137                 ${TEST_SH} -c 'echo $((99999))'
138
139         [ ${ARITH_BITS} -gt 44 ] &&
140                 atf_check -s exit:0 -o inline:'9191919191919\n' -e empty \
141                         ${TEST_SH} -c 'echo $((9191919191919))'
142
143         atf_check -s exit:0 -o inline:'13\n' -e empty ${TEST_SH} -c \
144                 'echo $(( 0xD ))'
145         atf_check -s exit:0 -o inline:'11\n' -e empty ${TEST_SH} -c \
146                 'echo $(( 013 ))'
147         atf_check -s exit:0 -o inline:'7\n' -e empty ${TEST_SH} -c \
148                 'x=7;echo $(($x))'
149         atf_check -s exit:0 -o inline:'9\n' -e empty ${TEST_SH} -c \
150                 'x=9;echo $((x))'
151
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 ))'
162
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 $(( ))'
166
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 ))'
170 }
171
172
173 atf_test_case do_unary_plus
174 do_unary_plus_head()
175 {
176         atf_set "descr" "Tests that unary plus works as expected"
177 }
178 do_unary_plus_body()
179 {
180         atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
181                 'echo $(( +0 ))'
182         atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
183                 'echo $(( +1 ))'
184         atf_check -s exit:0 -o inline:'6\n' -e empty ${TEST_SH} -c \
185                 'echo $(( + 6 ))'
186         atf_check -s exit:0 -o inline:'4321\n' -e empty ${TEST_SH} -c \
187                 'echo $(( + 4321 ))'
188         atf_check -s exit:0 -o inline:'17185\n' -e empty ${TEST_SH} -c \
189                 'echo $(( + 0x4321 ))'
190 }
191
192 atf_test_case do_unary_minus
193 do_unary_minus_head()
194 {
195         atf_set "descr" "Tests that unary minus works as expected"
196 }
197 do_unary_minus_body()
198 {
199         atf_check -s exit:0 -o inline:'-1\n' -e empty ${TEST_SH} -c \
200                 'echo $(( -1 ))'
201         atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
202                 'echo $(( - 0 ))'
203         atf_check -s exit:0 -o inline:'-1\n' -e empty ${TEST_SH} -c \
204                 'echo $(( - 1 ))'
205         atf_check -s exit:0 -o inline:'-6\n' -e empty ${TEST_SH} -c \
206                 'echo $(( - 6 ))'
207         atf_check -s exit:0 -o inline:'-4321\n' -e empty ${TEST_SH} -c \
208                 'echo $(( - 4321 ))'
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 \
212                 'echo $((-7))'
213 }
214
215 atf_test_case do_unary_not
216 do_unary_not_head()
217 {
218         atf_set "descr" "Tests that unary not (boolean) works as expected"
219 }
220 do_unary_not_body()
221 {
222         atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
223                 'echo $(( ! 1 ))'
224         atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
225                 'echo $(( ! 0 ))'
226
227         atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
228                 'echo $(( !1234 ))'
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 ))'
233 }
234
235 atf_test_case do_unary_tilde
236 do_unary_tilde_head()
237 {
238         atf_set "descr" "Tests that unary not (bitwise) works as expected"
239 }
240 do_unary_tilde_body()
241 {
242         # definitely 2's complement arithmetic here...
243
244         atf_check -s exit:0 -o inline:'-1\n' -e empty ${TEST_SH} -c \
245                 'echo $(( ~ 0 ))'
246         atf_check -s exit:0 -o inline:'-2\n' -e empty ${TEST_SH} -c \
247                 'echo $(( ~ 1 ))'
248
249         atf_check -s exit:0 -o inline:'-1235\n' -e empty ${TEST_SH} -c \
250                 'echo $(( ~1234 ))'
251         atf_check -s exit:0 -o inline:'-256\n' -e empty ${TEST_SH} -c \
252                 'echo $(( ~0xFF ))'
253 }
254
255 atf_test_case elementary_add
256 elementary_add_head()
257 {
258         atf_set "descr" "Tests that simple addition works as expected"
259 }
260 elementary_add_body()
261 {
262         # some of these tests actually test unary ops &  op precedence...
263
264         atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
265                 'echo $(( 0 + 0 ))'
266         atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
267                 'echo $(( 1 + 0 ))'
268         atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
269                 'echo $(( 0 + 1 ))'
270         atf_check -s exit:0 -o inline:'2\n' -e empty ${TEST_SH} -c \
271                 'echo $(( 1 + 1 ))'
272         atf_check -s exit:0 -o inline:'10\n' -e empty ${TEST_SH} -c \
273                 'echo $(( 4 + 6 ))'
274         atf_check -s exit:0 -o inline:'10\n' -e empty ${TEST_SH} -c \
275                 'echo $(( 6 + 4 ))'
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))'
286 }
287
288 atf_test_case elementary_sub
289 elementary_sub_head()
290 {
291         atf_set "descr" "Tests that simple subtraction works as expected"
292 }
293 elementary_sub_body()
294 {
295         atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
296                 'echo $(( 0 - 0 ))'
297         atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
298                 'echo $(( 1 - 0 ))'
299         atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
300                 'echo $(( 1 - 1 ))'
301         atf_check -s exit:0 -o inline:'-1\n' -e empty ${TEST_SH} -c \
302                 'echo $(( 0 - 1 ))'
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 ))'
315 }
316
317 atf_test_case elementary_mul
318 elementary_mul_head()
319 {
320         atf_set "descr" "Tests that simple multiplication works as expected"
321 }
322 elementary_mul_body()
323 {
324         atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
325                 'echo $(( 0 * 0 ))'
326         atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
327                 'echo $(( 1 * 0 ))'
328         atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
329                 'echo $(( 0 * 1 ))'
330         atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
331                 'echo $(( 1 * 1 ))'
332         atf_check -s exit:0 -o inline:'-1\n' -e empty ${TEST_SH} -c \
333                 'echo $(( -1 * 1 ))'
334         atf_check -s exit:0 -o inline:'-1\n' -e empty ${TEST_SH} -c \
335                 'echo $(( 1 * -1 ))'
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 \
341                 'echo $(( 13*13 ))'
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 ))'
348 }
349
350 atf_test_case elementary_div
351 elementary_div_head()
352 {
353         atf_set "descr" "Tests that simple division works as expected"
354 }
355 elementary_div_body()
356 {
357         atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
358                 'echo $(( 0 / 1 ))'
359         atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
360                 'echo $(( 1 / 1 ))'
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 \
365                 'echo $(( 2 / 1 ))'
366
367         atf_check -s exit:0 -o inline:'3\n' -e empty ${TEST_SH} -c \
368                 'echo $(( 3 / 1 ))'
369         atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
370                 'echo $(( 3 / 2 ))'
371         atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
372                 'echo $(( 3 / 3 ))'
373         atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
374                 'echo $(( 3 / 4 ))'
375
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 ))'
380 }
381
382 atf_test_case elementary_rem
383 elementary_rem_head()
384 {
385         atf_set "descr" "Tests that simple modulus works as expected"
386 }
387 elementary_rem_body()
388 {
389         atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
390                 'echo $(( 0 % 1 ))'
391         atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
392                 'echo $(( 1 % 1 ))'
393         atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
394                 'echo $(( 2 % 1 ))'
395         atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
396                 'echo $(( 9999 % 1 ))'
397
398         atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
399                 'echo $(( 0 % 2 ))'
400         atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
401                 'echo $(( 1 % 2 ))'
402         atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
403                 'echo $(( 2 % 2 ))'
404         atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
405                 'echo $(( 0xFFFF % 2 ))'
406
407         atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
408                 'echo $(( 0 % 3 ))'
409         atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
410                 'echo $(( 1 % 3 ))'
411         atf_check -s exit:0 -o inline:'2\n' -e empty ${TEST_SH} -c \
412                 'echo $(( 2 % 3 ))'
413         atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
414                 'echo $(( 3 % 3 ))'
415         atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
416                 'echo $(( 3123 % 3 ))'
417
418         atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
419                 'echo $(( 9999 % 2 ))'
420
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 \
424                 'echo $((169%13))'
425 }
426
427 atf_test_case elementary_shl
428 elementary_shl_head()
429 {
430         atf_set "descr" "Tests that simple shift left works as expected"
431 }
432 elementary_shl_body()
433 {
434         atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
435                 'echo $(( 0 << 0 ))'
436         atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
437                 'echo $(( 0 << 1 ))'
438         atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
439                 'echo $(( 0 << 17 ))'
440
441         atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
442                 'echo $(( 1 << 0 ))'
443         atf_check -s exit:0 -o inline:'2\n' -e empty ${TEST_SH} -c \
444                 'echo $(( 1 << 1 ))'
445         atf_check -s exit:0 -o inline:'131072\n' -e empty ${TEST_SH} -c \
446                 'echo $(( 1 << 17 ))'
447
448         atf_check -s exit:0 -o inline:'2021161080\n' -e empty ${TEST_SH} -c \
449                 'echo $(( 0x3C3C3C3C << 1 ))'
450
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 ))'
457
458         return 0
459 }
460
461 atf_test_case elementary_shr
462 elementary_shr_head()
463 {
464         atf_set "descr" "Tests that simple shift right works as expected"
465 }
466 elementary_shr_body()
467 {
468         atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
469                 'echo $(( 0 >> 0 ))'
470         atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
471                 'echo $(( 0 >> 1 ))'
472         atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
473                 'echo $(( 0 >> 17 ))'
474
475         atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
476                 'echo $(( 1 >> 0 ))'
477         atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
478                 'echo $(( 1 >> 1 ))'
479         atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
480                 'echo $(( 2 >> 1 ))'
481         atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
482                 'echo $(( 3 >> 1 ))'
483
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 ))'
488
489         atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
490                 'echo $(( 131072 >> 17 ))'
491
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 ))'
498
499         return 0
500 }
501
502 atf_test_case elementary_eq
503 elementary_eq_head()
504 {
505         atf_set "descr" "Tests that simple equality test works as expected"
506 }
507 elementary_eq_body()
508 {
509         atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
510                 'echo $(( 0 == 0 ))'
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 \
516                 'echo $(( 1 == 1 ))'
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 ))'
523
524         atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
525                 'echo $(( 0 == 1 ))'
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 \
531                 'echo $(( 1 == 2 ))'
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 ))'
538 }
539 atf_test_case elementary_ne
540 elementary_ne_head()
541 {
542         atf_set "descr" "Tests that simple inequality test works as expected"
543 }
544 elementary_ne_body()
545 {
546         atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
547                 'echo $(( 1 != 0 ))'
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 ))'
558
559         atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
560                 'echo $(( 3 != 3 ))'
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 ))'
569 }
570 atf_test_case elementary_lt
571 elementary_lt_head()
572 {
573         atf_set "descr" "Tests that simple less than test works as expected"
574 }
575 elementary_lt_body()
576 {
577         atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
578                 'echo $(( 0 < 1 ))'
579         atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
580                 'echo $(( -1 < 0 ))'
581         atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
582                 'echo $(( 0 < 10 ))'
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 ))'
587
588         atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
589                 'echo $(( 0 < 0 ))'
590         atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
591                 'echo $(( 1 < 0 ))'
592
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 ))'
596
597         return 0
598 }
599 atf_test_case elementary_le
600 elementary_le_head()
601 {
602         atf_set "descr" "Tests that simple less or equal test works as expected"
603 }
604 elementary_le_body()
605 {
606         atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
607                 'echo $(( 0 <= 1 ))'
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 \
611                 'echo $(( 0 <= 0 ))'
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 ))'
618
619         atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
620                 'echo $(( 1 <= 0 ))'
621         atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
622                 'echo $(( -100 <= -200 ))'
623
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 ))'
627
628         return 0
629 }
630 atf_test_case elementary_gt
631 elementary_gt_head()
632 {
633         atf_set "descr" "Tests that simple greater than works as expected"
634 }
635 elementary_gt_body()
636 {
637         atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
638                 'echo $(( 1 > 0 ))'
639         atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
640                 'echo $(( 1 > -1 ))'
641         atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
642                 'echo $(( 11 > 012 ))'
643
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 ))'
647         # atf_expect_pass
648
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 ))'
652
653         atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
654                 'echo $(( 0 > 0 ))'
655         atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
656                 'echo $(( 0 > 1 ))'
657         atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
658                 'echo $(( -1 > 0 ))'
659         atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
660                 'echo $(( 0 > 10 ))'
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 ))'
665
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 ))'
669
670         return 0
671 }
672 atf_test_case elementary_ge
673 elementary_ge_head()
674 {
675         atf_set "descr" "Tests that simple greater or equal works as expected"
676 }
677 elementary_ge_body()
678 {
679         atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
680                 'echo $(( 0 >= 0 ))'
681         atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
682                 'echo $(( 1 >= 0 ))'
683         atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
684                 'echo $(( -100 >= -101 ))'
685
686         atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
687                 'echo $(( -1 >= 0 ))'
688 }
689
690 atf_test_case fiddle_bits_and
691 fiddle_bits_and_head()
692 {
693         atf_set "descr" "Test bitwise and operations in arithmetic expressions"
694 }
695 fiddle_bits_and_body()
696 {
697         atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
698                 'echo $(( 0 & 0 ))'
699         atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
700                 'echo $(( 1 & 0 ))'
701         atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
702                 'echo $(( 0 & 1 ))'
703         atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
704                 'echo $(( 1 & 1 ))'
705
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 ))'
710
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 ))'
714
715         return 0
716 }
717 atf_test_case fiddle_bits_or
718 fiddle_bits_or_head()
719 {
720         atf_set "descr" "Test bitwise or operations in arithmetic expressions"
721 }
722 fiddle_bits_or_body()
723 {
724         atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
725                 'echo $(( 0 | 0 ))'
726         atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
727                 'echo $(( 1 | 0 ))'
728         atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
729                 'echo $(( 0 | 1 ))'
730         atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
731                 'echo $(( 1 | 1 ))'
732
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 ))'
737
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 ))'
741
742         return 0
743 }
744 atf_test_case fiddle_bits_xor
745 fiddle_bits_xor_head()
746 {
747         atf_set "descr" "Test bitwise xor operations in arithmetic expressions"
748 }
749 fiddle_bits_xor_body()
750 {
751         atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
752                 'echo $(( 0 ^ 0 ))'
753         atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
754                 'echo $(( 1 ^ 0 ))'
755         atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
756                 'echo $(( 0 ^ 1 ))'
757         atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
758                 'echo $(( 1 ^ 1 ))'
759
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 ))'
764
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 ))'
768
769         return 0
770 }
771
772 atf_test_case logical_and
773 logical_and_head()
774 {
775         atf_set "descr" "Test logical and operations in arithmetic expressions"
776 }
777 logical_and_body()
778 {
779         # cannot test short-circuit eval until sh implements side effects...
780
781         atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
782                 'echo $(( 0 && 0 ))'
783         atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
784                 'echo $(( 1 && 0 ))'
785         atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
786                 'echo $(( 0 && 1 ))'
787         atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
788                 'echo $(( 1 && 1 ))'
789
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 ))'
795 }
796 atf_test_case logical_or
797 logical_or_head()
798 {
799         atf_set "descr" "Test logical or operations in arithmetic expressions"
800 }
801 logical_or_body()
802 {
803         # cannot test short-circuit eval until sh implements side effects...
804
805         atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
806                 'echo $(( 0 || 0 ))'
807         atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
808                 'echo $(( 1 || 0 ))'
809         atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
810                 'echo $(( 0 || 1 ))'
811         atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
812                 'echo $(( 1 || 1 ))'
813
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 ))'
819 }
820
821 atf_test_case make_selection
822 make_selection_head()
823 {
824         atf_set "descr" "Test ?: operator in arithmetic expressions"
825 }
826 make_selection_body()
827 {
828         # atf_expect_fail "PR bin/50958"
829
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 ))'
834
835         atf_check -s exit:0 -o inline:'111\n' -e empty ${TEST_SH} -c \
836                 'echo $(( 0x1234 ? 111 : 222 ))'
837
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 ))'
844 }
845
846 atf_test_case operator_precedence
847 operator_precedence_head()
848 {
849         atf_set "descr" "Test operator precedence without parentheses"
850 }
851 operator_precedence_body()
852 {
853         # NB: apart from $(( ))  ** NO ** parentheses in the expressions.
854
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 ))'
863
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 \
867                 'echo $(( 2 + -1 ))'
868
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 \
872                 'echo $(( 2 + !1 ))'
873
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 ))'
880
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 ))'
887
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 ))'
894
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 ))'
901
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 ))'
906
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 ))'
911
912         # sh inherits C's crazy operator precedence...
913
914         atf_check -s exit:0 -o inline:'1\n' -e empty ${TEST_SH} -c \
915                 'echo $(( 0xfD & 0xF == 0xF ))'
916 }
917
918 parentheses_head()
919 {
920         atf_set "descr" "Test use of () to group sub-expressions"
921 }
922 parentheses_body()
923 {
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 ) ))'
932
933         atf_check -s exit:0 -o inline:'-3\n' -e empty ${TEST_SH} -c \
934                 'echo $(( - (2 + 1) ))'
935
936         atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
937                 'echo $(( ! (2 + 1) ))'
938
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) ))'
945
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 ) ))'
952
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) ))'
959
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) ))'
966
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) ))'
971
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) ))'
976
977         # sh inherits C's crazy operator precedence...
978
979         atf_check -s exit:0 -o inline:'0\n' -e empty ${TEST_SH} -c \
980                 'echo $(( (0xfD & 0xF) == 0xF ))'
981 }
982
983 atf_test_case arithmetic_fails
984 arithmetic_fails_head()
985 {
986         atf_set "descr" "Dummy test to force failure"
987 }
988 arithmetic_fails_body()
989 {
990         atf_fail "Cannot estimate number of bits supported by $(( ))"
991 }
992
993 atf_init_test_cases() {
994
995         discover_range
996
997         test "${ARITH_BITS}" = '?' && {
998                 atf_add_test_case arithmetic_fails
999                 return 0
1000         }
1001
1002         # odd names are to get atf's sort order semi-rational
1003
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...)
1035 }