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