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