1#! /bin/sh
2#
3# @(#)arith.sh	1.26 18/01/02 Copyright 2016-2017 J. Schilling
4#
5
6# Read test core functions
7. ../../common/test-common
8
9#
10# Basic tests to check whether the supported operators work
11#
12expect_fail_save=$expect_fail
13expect_fail=true
14#
15# Unspecified by POSIX
16#
17docommand a00 "$SHELL -c 'echo \$(())'" 0 "0\n" ""
18expect_fail=$expect_fail_save
19if [ "$failed" = true ]; then
20	echo
21	echo "Test $cmd_label is unspecified behavior by POSIX."
22	echo
23fi
24
25docommand a01 "$SHELL -c 'echo \$((/))'" "!=0" "" IGNORE
26
27docommand a02 "$SHELL -c 'echo \$((1))'" 0 "1\n" ""
28docommand a03 "$SHELL -c 'echo \$((1+2))'" 0 "3\n" ""
29docommand a04 "$SHELL -c 'echo \$((1-2))'" 0 "-1\n" ""
30docommand a05 "$SHELL -c 'echo \$((2*3))'" 0 "6\n" ""
31docommand a06 "$SHELL -c 'echo \$((2*-3))'" 0 "-6\n" ""
32docommand a07 "$SHELL -c 'echo \$((10/2))'" 0 "5\n" ""
33
34docommand a08 "$SHELL -c 'echo \$((18%3))'" 0 "0\n" ""
35docommand a09 "$SHELL -c 'echo \$((17%3))'" 0 "2\n" ""
36docommand a10 "$SHELL -c 'echo \$((-17%3))'" 0 "-2\n" ""
37
38docommand a11 "$SHELL -c 'echo \$((1 << 1))'" 0 "2\n" ""
39expect_fail_save=$expect_fail
40expect_fail=true
41docommand a12 "$SHELL -c 'echo \$((1 << 31))'" 0 "2147483648\n" ""
42expect_fail=$expect_fail_save
43if [ "$failed" = true ]; then
44	have_longlong=false
45	echo
46	echo "Test $cmd_label is unspecified behavior by POSIX."
47	echo "Test $cmd_label needs more than 'signed long'."
48	echo "Skipping long long tests."
49	echo
50else
51	have_longlong=true
52fi
53if [ $have_longlong = true ]; then
54docommand a13 "$SHELL -c 'echo \$((1 << 33))'" 0 "8589934592\n" ""
55fi
56docommand a14 "$SHELL -c 'echo \$((2 >> 1))'" 0 "1\n" ""
57docommand a15 "$SHELL -c 'echo \$((64 >> 5))'" 0 "2\n" ""
58if [ $have_longlong = true ]; then
59docommand a16 "$SHELL -c 'echo \$((2147483648 >> 31))'" 0 "1\n" ""
60docommand a17 "$SHELL -c 'echo \$((8589934592 >> 33))'" 0 "1\n" ""
61fi
62
63docommand a18 "$SHELL -c 'echo \$((5 > 4))'" 0 "1\n" ""
64docommand a19 "$SHELL -c 'echo \$((4 > 4))'" 0 "0\n" ""
65docommand a20 "$SHELL -c 'echo \$((3 < 4))'" 0 "1\n" ""
66docommand a21 "$SHELL -c 'echo \$((4 < 4))'" 0 "0\n" ""
67docommand a22 "$SHELL -c 'echo \$((4 <= 4))'" 0 "1\n" ""
68docommand a23 "$SHELL -c 'echo \$((5 <= 4))'" 0 "0\n" ""
69docommand a24 "$SHELL -c 'echo \$((4 >= 4))'" 0 "1\n" ""
70docommand a25 "$SHELL -c 'echo \$((3 >= 4))'" 0 "0\n" ""
71docommand a26 "$SHELL -c 'echo \$((4 == 4))'" 0 "1\n" ""
72docommand a27 "$SHELL -c 'echo \$((3 == 4))'" 0 "0\n" ""
73docommand a28 "$SHELL -c 'echo \$((3 != 4))'" 0 "1\n" ""
74docommand a29 "$SHELL -c 'echo \$((4 != 4))'" 0 "0\n" ""
75
76docommand a30 "$SHELL -c 'echo \$((123 & 7))'" 0 "3\n" ""
77docommand a31 "$SHELL -c 'echo \$((123 ^ 7))'" 0 "124\n" ""
78docommand a32 "$SHELL -c 'echo \$((123 | 7))'" 0 "127\n" ""
79
80docommand a33 "$SHELL -c 'echo \$((1 && 2))'" 0 "1\n" ""
81docommand a34 "$SHELL -c 'echo \$((1 && 0))'" 0 "0\n" ""
82docommand a35 "$SHELL -c 'echo \$((0 && 2))'" 0 "0\n" ""
83docommand a36 "$SHELL -c 'echo \$((0 && 0))'" 0 "0\n" ""
84
85docommand a37 "$SHELL -c 'echo \$((1 || 2))'" 0 "1\n" ""
86docommand a38 "$SHELL -c 'echo \$((1 || 0))'" 0 "1\n" ""
87docommand a39 "$SHELL -c 'echo \$((0 || 2))'" 0 "1\n" ""
88docommand a40 "$SHELL -c 'echo \$((0 || 0))'" 0 "0\n" ""
89
90docommand a41 "$SHELL -c 'echo \$((+1))'" 0 "1\n" ""
91docommand a42 "$SHELL -c 'echo \$((+ 1))'" 0 "1\n" ""
92docommand a43 "$SHELL -c 'echo \$((-1))'" 0 "-1\n" ""
93docommand a44 "$SHELL -c 'echo \$((- 1))'" 0 "-1\n" ""
94
95docommand a45 "$SHELL -c 'echo \$((~1))'" 0 "-2\n" ""
96docommand a46 "$SHELL -c 'echo \$((~63))'" 0 "-64\n" ""
97docommand a47 "$SHELL -c 'echo \$((~1023))'" 0 "-1024\n" ""
98
99docommand a48 "$SHELL -c 'echo \$((!0))'" 0 "1\n" ""
100docommand a49 "$SHELL -c 'echo \$((!1))'" 0 "0\n" ""
101docommand a50 "$SHELL -c 'echo \$((!2))'" 0 "0\n" ""
102docommand a51 "$SHELL -c 'echo \$((!!999))'" 0 "1\n" ""
103
104docommand a52 "$SHELL -c 'echo \$((+-~!1))'" 0 "1\n" ""
105docommand a53 "$SHELL -c 'echo \$((+-~!(1)))'" 0 "1\n" ""
106
107docommand a54 "$SHELL -c 'unset a; echo \$((a))'" 0 "0\n" ""
108
109expect_fail_save=$expect_fail
110expect_fail=true
111docommand a55 "$SHELL -c 'unset a; echo \$((a++))'" 0 "0\n" ""
112expect_fail=$expect_fail_save
113if [ "$failed" = true ]; then
114	var_incr=false
115	echo
116	echo "The shell $SHELL does not support variable increment like a++."
117	echo "This is not required by POSIX."
118	echo
119else
120	var_incr=true
121	docommand a56 "$SHELL -c 'unset a; echo \$((a--))'" 0 "0\n" ""
122	docommand a57 "$SHELL -c 'unset a; echo \$((++a))'" 0 "1\n" ""
123	docommand a58 "$SHELL -c 'unset a; echo \$((--a))'" 0 "-1\n" ""
124
125	docommand a59 "$SHELL -c 'unset a; echo \$((a++)); echo \$a'" 0 "0\n1\n" ""
126	docommand a60 "$SHELL -c 'unset a; echo \$((a--)); echo \$a'" 0 "0\n-1\n" ""
127	docommand a61 "$SHELL -c 'unset a; echo \$((++a)); echo \$a'" 0 "1\n1\n" ""
128	docommand a62 "$SHELL -c 'unset a; echo \$((--a)); echo \$a'" 0 "-1\n-1\n" ""
129
130	docommand a63 "$SHELL -c 'unset a; echo \$((++a++)); echo \$a'" "!=0" "" IGNORE
131	docommand a64 "$SHELL -c 'unset a; echo \$((--a--)); echo \$a'" "!=0" "" IGNORE
132
133	docommand a56 "$SHELL -c 'echo \$((\$((A=2))++--++--++--A))'" "!=0" "" IGNORE
134	docommand a57 "$SHELL -c 'echo \$((++--++--++--A))'" "!=0" "" IGNORE
135fi
136docommand a58 "$SHELL -c 'echo \$((
1371+2+3))'" 0 "6\n" ""
138docommand a59 "$SHELL -c 'echo \$((1
139+2+3))'" 0 "6\n" ""
140docommand a60 "$SHELL -c 'echo \$((1+
1412+3))'" 0 "6\n" ""
142docommand a61 "$SHELL -c 'echo \$((1+2
143+3))'" 0 "6\n" ""
144docommand a62 "$SHELL -c 'echo \$((1+2+
1453))'" 0 "6\n" ""
146docommand a63 "$SHELL -c 'echo \$((1+2+3
147))'" 0 "6\n" ""
148docommand a64 "$SHELL -c 'echo \$((1+
149(2+3)))'" 0 "6\n" ""
150docommand a65 "$SHELL -c 'echo \$((1+(
1512+3)))'" 0 "6\n" ""
152docommand a66 "$SHELL -c 'echo \$((1+(2
153+3)))'" 0 "6\n" ""
154docommand a67 "$SHELL -c 'echo \$((1+(2+3
155)))'" 0 "6\n" ""
156docommand a68 "$SHELL -c 'echo \$((1+(2+3)
157))'" 0 "6\n" ""
158
159#
160# Tests for number base
161#
162docommand a100 "$SHELL -c 'echo \$((0x1))'" 0 "1\n" ""
163docommand a101 "$SHELL -c 'echo \$((0x01))'" 0 "1\n" ""
164docommand a102 "$SHELL -c 'echo \$((01))'" 0 "1\n" ""
165docommand a103 "$SHELL -c 'echo \$((0x10))'" 0 "16\n" ""
166
167expect_fail_save=$expect_fail
168expect_fail=true
169docommand a104 "$SHELL -c 'echo \$((0100))'" 0 "64\n" ""
170expect_fail=$expect_fail_save
171if [ "$failed" = true ]; then
172	octal_numbers=false
173	echo
174	echo "The shell $SHELL does not correctly convert octal numbers."
175	echo "This is required by POSIX, so this shell is not POSIX compliant."
176	echo "Skipping more octal tests."
177	echo
178else
179	octal_numbers=true
180fi
181if [ $octal_numbers = true ] ; then
182docommand a105 "$SHELL -c 'echo \$((010+10))'" 0 "18\n" ""
183expect_fail_save=$expect_fail
184expect_fail=true
185docommand a106 "$SHELL -c 'echo \$((019))'" "!=0" "" IGNORE
186expect_fail=$expect_fail_save
187if [ "$failed" = true ]; then
188	echo
189	echo "The shell $SHELL does not correctly flag illegal octal numbers."
190	echo "This is required by POSIX, so this shell is not POSIX compliant."
191	echo
192fi
193fi
194
195#
196# Tests for precedence and chained operators
197#
198docommand a120 "$SHELL -c 'echo \$((1+2*3))'" 0 "7\n" ""
199docommand a121 "$SHELL -c 'echo \$((1+(2*3)))'" 0 "7\n" ""
200docommand a122 "$SHELL -c 'echo \$((2*5+2*3))'" 0 "16\n" ""
201docommand a123 "$SHELL -c 'echo \$((2*5+2*3+1))'" 0 "17\n" ""
202docommand a124 "$SHELL -c 'echo \$((2*5+2*3+1+2+3))'" 0 "22\n" ""
203docommand a125 "$SHELL -c 'echo \$(((1)+(2)))'" 0 "3\n" ""
204docommand a126 "$SHELL -c 'echo \$(((2/3)!=(5/3)==(3/3)))'" 0 "1\n" ""
205docommand a127 "$SHELL -c 'echo \$((0!=1==1))'" 0 "1\n" ""
206docommand a128 "$SHELL -c 'echo \$((0!=3==3))'" 0 "0\n" ""
207docommand a129 "$SHELL -c 'echo \$((2*5+2*3*2+1))'" 0 "23\n" ""
208docommand a130 "$SHELL -c 'echo \$((20 / 2 / 2))'" 0 "5\n" ""
209
210#
211# Tests for the assignment operators
212#
213docommand a150 "$SHELL -c 'unset a; echo \$((a += 3))'" 0 "3\n" ""
214docommand a151 "$SHELL -c 'a=0; echo \$((a += 3))'" 0 "3\n" ""
215docommand a152 "$SHELL -c 'a=0; echo \$((a -= 3))'" 0 "-3\n" ""
216docommand a153 "$SHELL -c 'a=2; echo \$((a *= 3))'" 0 "6\n" ""
217docommand a154 "$SHELL -c 'a=2; echo \$((a /= 2))'" 0 "1\n" ""
218docommand a155 "$SHELL -c 'a=17; echo \$((a %= 5))'" 0 "2\n" ""
219docommand a156 "$SHELL -c 'a=1; echo \$((a <<= 3))'" 0 "8\n" ""
220docommand a157 "$SHELL -c 'a=8; echo \$((a >>= 3))'" 0 "1\n" ""
221docommand a158 "$SHELL -c 'a=123; echo \$((a &= 7))'" 0 "3\n" ""
222docommand a159 "$SHELL -c 'a=123; echo \$((a ^= 7))'" 0 "124\n" ""
223docommand a160 "$SHELL -c 'a=123; echo \$((a |= 7))'" 0 "127\n" ""
224docommand a161 "$SHELL -c 'a=0;b=9; echo \$((a = b = 2)); echo \$a; echo \$b'" 0 "2\n2\n2\n" ""
225docommand a162 "$SHELL -c 'a=0;b=9;c=6; echo \$((a = b = c = 2)); echo \$a; echo \$b; echo \$c'" 0 "2\n2\n2\n2\n" ""
226docommand a162 "$SHELL -c 'i=1 j=2 k=3; echo \$((i += j += k)); echo \$i,\$j,\$k'" 0 "6\n6,5,3\n" ""
227
228#
229# Tests for command expansion inside arithmetic expansion
230#
231docommand a180 "$SHELL -c 'echo \$(($(true)==$(true)))'" "!=0" "" IGNORE
232docommand a181 "$SHELL -c 'echo \$((`true`==`true`))'" "!=0" "" IGNORE
233docommand a182 "$SHELL -c 'echo \$(($(echo 1)==$(echo 1)))'" 0 "1\n" ""
234docommand a183 "$SHELL -c 'echo \$((`echo 1`==`echo 1`))'" 0 "1\n" ""
235
236#
237# Tests to check whether 0 && x or 1 || x correctly do not
238# evaluate x
239#
240docommand a200 "$SHELL -c 'echo \$((0 && 1))'" 0 "0\n" ""
241docommand a201 "$SHELL -c 'echo \$((0 && 1/0))'" 0 "0\n" ""
242docommand a202 "$SHELL -c 'echo \$((0 && (1/0)))'" 0 "0\n" ""
243docommand a203 "$SHELL -c 'echo \$((1 && (1/0)))'" "!=0" "" IGNORE
244
245docommand a204 "$SHELL -c 'echo \$((1 || 1))'" 0 "1\n" ""
246docommand a205 "$SHELL -c 'echo \$((1 || 1/0))'" 0 "1\n" ""
247docommand a206 "$SHELL -c 'echo \$((1 || (1/0)))'" 0 "1\n" ""
248docommand a207 "$SHELL -c 'echo \$((0 || (1/0)))'" "!=0" "" IGNORE
249
250if [ "$var_incr" = true ]; then
251docommand a208 "$SHELL -c 'unset a; echo \$((1 && a++)); echo \$a'" 0 "0\n1\n" ""
252docommand a209 "$SHELL -c 'unset a; echo \$((0 && a++)); echo \$a'" 0 "0\n\n" ""
253docommand a210 "$SHELL -c 'unset a; echo \$((0 && (a++))); echo \$a'" 0 "0\n\n" ""
254
255docommand a211 "$SHELL -c 'unset a; echo \$((0 || a++)); echo \$a'" 0 "0\n1\n" ""
256docommand a212 "$SHELL -c 'unset a; echo \$((1 || a++)); echo \$a'" 0 "1\n\n" ""
257docommand a213 "$SHELL -c 'unset a; echo \$((1 || (a++))); echo \$a'" 0 "1\n\n" ""
258
259docommand a214 "$SHELL -c 'unset a; echo \$((1 && --a)); echo \$a'" 0 "1\n-1\n" ""
260docommand a215 "$SHELL -c 'unset a; echo \$((0 && --a)); echo \$a'" 0 "0\n\n" ""
261docommand a216 "$SHELL -c 'unset a; echo \$((0 && (--a))); echo \$a'" 0 "0\n\n" ""
262
263docommand a217 "$SHELL -c 'unset a; echo \$((0 || --a)); echo \$a'" 0 "1\n-1\n" ""
264docommand a218 "$SHELL -c 'unset a; echo \$((1 || --a)); echo \$a'" 0 "1\n\n" ""
265docommand a219 "$SHELL -c 'unset a; echo \$((1 || (--a))); echo \$a'" 0 "1\n\n" ""
266else
267	echo
268	echo "Skipping more variable pre/post increment/decrement tests..."
269	echo
270fi
271
272#
273# Tests for conditional expressions
274#
275docommand a250 "$SHELL -c 'echo \$((1 ? 15 : 12))'" 0 "15\n" ""
276docommand a251 "$SHELL -c 'echo \$((0 ? 15 : 12))'" 0 "12\n" ""
277docommand a252 "$SHELL -c 'echo \$((1 ? (15) : (12)))'" 0 "15\n" ""
278docommand a253 "$SHELL -c 'echo \$((0 ? (15) : (12)))'" 0 "12\n" ""
279docommand a254 "$SHELL -c 'echo \$((1 ? 1+2+3 : 4+5+6))'" 0 "6\n" ""
280docommand a255 "$SHELL -c 'echo \$((0 ? 1+2+3 : 4+5+6))'" 0 "15\n" ""
281docommand a256 "$SHELL -c 'echo \$((1 ? (1+2+3) : (4+5+6)))'" 0 "6\n" ""
282docommand a257 "$SHELL -c 'echo \$((0 ? (1+2+3) : (4+5+6)))'" 0 "15\n" ""
283
284if [ "$var_incr" = true ]; then
285docommand a258 "$SHELL -c 'unset a; unset b; echo \$((1 ? a++ : b--)); echo \$a; echo \$b'" 0 "0\n1\n\n" ""
286docommand a259 "$SHELL -c 'unset a; unset b; echo \$((0 ? a++ : b--)); echo \$a; echo \$b'" 0 "0\n\n-1\n" ""
287docommand a260 "$SHELL -c 'unset a; b=-1; echo \$((0 ? a++ : b--)); echo \$a; echo \$b'" 0 "-1\n\n-2\n" ""
288docommand a261 "$SHELL -c 'unset a; unset b; echo \$((1 ? (a++) : (b--))); echo \$a; echo \$b'" 0 "0\n1\n\n" ""
289docommand a262 "$SHELL -c 'unset a; unset b; echo \$((0 ? (a++) : (b--))); echo \$a; echo \$b'" 0 "0\n\n-1\n" ""
290docommand a263 "$SHELL -c 'unset a; b=-1; echo \$((0 ? (a++) : (b--))); echo \$a; echo \$b'" 0 "-1\n\n-2\n" ""
291fi
292
293docommand a264 "$SHELL -c 'echo \$((0?(9+4<1):12))'" 0 "12\n" ""
294docommand a265 "$SHELL -c 'echo \$((1?(9+4<1):12))'" 0 "0\n" ""
295docommand a266 "$SHELL -c 'echo \$((0?9+4<1:12))'" 0 "12\n" ""
296docommand a267 "$SHELL -c 'echo \$((1?9+4<1:12))'" 0 "0\n" ""
297docommand a268 "$SHELL -c 'echo \$((0?A=9+4<1:12))'" 0 "12\n" ""
298docommand a269 "$SHELL -c 'echo \$((1?A=9+4<1:12))'" 0 "0\n" ""
299
300docommand a270 "$SHELL -c 'echo \$((!!(-02<=-04)^1 ?+9+(+4):+3+(+12)))'" 0 "13\n" ""
301docommand a271 "$SHELL -c 'echo \$((!(-02<=-04)^1 ?+9+(+4):+3+(+12)))'" 0 "15\n" ""
302docommand a272 "$SHELL -c 'echo \$((!!(-02<=-04)^1 ?+9+(+4) <<1:+3+(+12)<<2))'" 0 "26\n" ""
303docommand a273 "$SHELL -c 'echo \$((!(-02<=-04)^1 ?+9+(+4) <<1:+3+(+12)<<2))'" 0 "60\n" ""
304docommand a274 "$SHELL -c 'echo \$((!(!(-02<=-04))^1 ?+9+(+4) <<1:+3+(+12)<<2))'" 0 "26\n" ""
305docommand a275 "$SHELL -c 'echo \$(((!(-02<=-04))^1 ?+9+(+4) <<1:+3+(+12)<<2))'" 0 "60\n" ""
306
307docommand a276 "$SHELL -c 'echo \$((1?0?-2:2:3))'" 0 "2\n" ""
308docommand a277 "$SHELL -c 'echo \$((0?2?-2:2:3))'" 0 "3\n" ""
309docommand a278 "$SHELL -c 'echo \$((1?2?-2:2:3))'" 0 "-2\n" ""
310docommand a279 "$SHELL -c 'echo \$((0?0?-2:2:3))'" 0 "3\n" ""
311
312docommand a280 "$SHELL -c 'echo \$((1?3:0?-2:2))'" 0 "3\n" ""
313docommand a281 "$SHELL -c 'echo \$((0?3:2?-2:2))'" 0 "-2\n" ""
314docommand a282 "$SHELL -c 'echo \$((1?3:2?-2:2))'" 0 "3\n" ""
315docommand a283 "$SHELL -c 'echo \$((0?3:0?-2:2))'" 0 "2\n" ""
316
317docommand a284 "$SHELL -c 'echo \$((1?(0?-2:2):3))'" 0 "2\n" ""
318docommand a285 "$SHELL -c 'echo \$((0?(2?-2:2):3))'" 0 "3\n" ""
319docommand a286 "$SHELL -c 'echo \$((1?(2?-2:2):3))'" 0 "-2\n" ""
320docommand a287 "$SHELL -c 'echo \$((0?(0?-2:2):3))'" 0 "3\n" ""
321
322docommand a288 "$SHELL -c 'echo \$((1?3:(0?-2:2)))'" 0 "3\n" ""
323docommand a289 "$SHELL -c 'echo \$((0?3:(2?-2:2)))'" 0 "-2\n" ""
324docommand a290 "$SHELL -c 'echo \$((1?3:(2?-2:2)))'" 0 "3\n" ""
325docommand a291 "$SHELL -c 'echo \$((0?3:(0?-2:2)))'" 0 "2\n" ""
326
327docommand a292 "$SHELL -c 'echo \$((1?0^0:1?-2:3))'" 0 "0\n" ""
328docommand a293 "$SHELL -c 'echo \$((0?0^0:1?-2:3))'" 0 "-2\n" ""
329docommand a294 "$SHELL -c 'echo \$((1?0^0:0?-2:3))'" 0 "0\n" ""
330docommand a295 "$SHELL -c 'echo \$((0?0^0:0?-2:3))'" 0 "3\n" ""
331
332docommand a296 "$SHELL -c 'echo \$(( 0 ? 2 : 3 , 0 ? 7 : 4 ))'" 0 "4\n" ""
333docommand a297 "$SHELL -c 'echo \$(( 1 ? 2 : 3 , 0 ? 7 : 4 ))'" 0 "4\n" ""
334docommand a298 "$SHELL -c 'echo \$(( 0 ? 2 : 3 , 1 ? 7 : 4 ))'" 0 "7\n" ""
335docommand a299 "$SHELL -c 'echo \$(( 1 ? 2 : 3 , 1 ? 7 : 4 ))'" 0 "7\n" ""
336docommand a300 "$SHELL -c 'echo \$(( 1 ? 2 : 3 , 1 ? 7 : 4 , 9 ))'" 0 "9\n" ""
337
338if [ "$var_incr" = true ]; then
339docommand a301 "$SHELL -c 'echo \$((QQ_*=XCd<<=Y++^O++?Y>>=H++:T++!=C++))'" 0 "0\n" ""
340docommand a302 "$SHELL -c 'echo \$((YHz-=M++|Z++<<X++>N++==(M|=P_+=L+++T++)))'" 0 "0\n" ""
341#
342# The next may fail nor not, C does not permit it as a parenthesis is missing.
343# So we do not run it.
344#
345#docommand a302b "$SHELL -c 'echo \$((YHz-=M++|Z++<<X++>N++==M|=P_+=L+++T++))'" "!=0" "" IGNORE
346else
347	echo
348	echo "Skipping more variable pre/post increment/decrement tests..."
349	echo
350fi
351
352docommand a303 "$SHELL -c 'echo \$((N>>=U+=F&=J!=(H*=S-P<=K<<I-X!=G<<V>=(Z|=R<I<<O))))'" 0 "0\n" ""
353#
354# The next may fail nor not, C does not permit it as a parenthesis is missing.
355# So we do not run it.
356#
357#docommand a303b "$SHELL -c 'echo \$((N>>=U+=F&=J!=H*=S-P<=K<<I-X!=G<<V>=Z|=R<I<<O))'" "!=0" "" IGNORE
358
359#
360# lvalue and division by zero - so this must fail
361#
362docommand a310 "$SHELL -c 'echo \$((F-=B>>=D|D<=E*=Q|S!=W!=R|B&=M+O?Y?A:Q<G>>P:M*=N%=Q>>Q))'" "!=0" "" IGNORE
363docommand a312 "$SHELL -c 'echo \$((t%=r&=U-O*U+=J))'" "!=0" "" IGNORE
364
365#
366# Tests for the comma operator
367#
368expect_fail_save=$expect_fail
369expect_fail=true
370docommand a400 "$SHELL -c 'echo \$((1 , 15))'" 0 "15\n" ""
371expect_fail=$expect_fail_save
372if [ "$failed" = true ]; then
373	comma_operator=false
374	echo
375	echo "Test $cmd_label checks requires POSIX syntax (comma operator)."
376	echo
377else
378	comma_operator=true
379fi
380if [ "$comma_operator" = true ]; then
381docommand a401 "$SHELL -c 'echo \$((a=2 , 15)); echo \$a'" 0 "15\n2\n" ""
382docommand a402 "$SHELL -c 'echo \$((a=2*3 , 15)); echo \$a'" 0 "15\n6\n" ""
383docommand a403 "$SHELL -c 'echo \$((a=2*3*4 , 15)); echo \$a'" 0 "15\n24\n" ""
384docommand a404 "$SHELL -c 'echo \$(((1) , (15)))'" 0 "15\n" ""
385docommand a405 "$SHELL -c 'echo \$(((a=2) , (15))); echo \$a'" 0 "15\n2\n" ""
386docommand a406 "$SHELL -c 'echo \$(((a=2*3) , (15))); echo \$a'" 0 "15\n6\n" ""
387docommand a407 "$SHELL -c 'echo \$((a=(2*3) , (15))); echo \$a'" 0 "15\n6\n" ""
388docommand a408 "$SHELL -c 'echo \$(((a=2*3*4) , (15))); echo \$a'" 0 "15\n24\n" ""
389docommand a409 "$SHELL -c 'unset a; echo \$((a++ , 15)); echo \$a'" 0 "15\n1\n" ""
390docommand a410 "$SHELL -c 'unset a; echo \$((a++ , ++a)); echo \$a'" 0 "2\n2\n" ""
391docommand a411 "$SHELL -c 'unset a; echo \$((a++ , a++)); echo \$a'" 0 "1\n2\n" ""
392else
393	echo
394	echo "Skipping comma operator tests."
395	echo
396fi
397
398docommand a500 "$SHELL -c 'set -u; unset x; echo \$(( x+=3 )); echo \$x'" !=0 "" NONEMPTY
399docommand a501 "$SHELL -c 'set -u; unset a; echo \$((a++ , a++)); echo \$a'" !=0 "" NONEMPTY
400docommand a502 "$SHELL -c 'set -u; unset x; echo \$(( x = 3 )); echo \$x'" 0 "3\n3\n" ""
401
402docommand a600 "$SHELL -c 'echo \$(( `echo 77` `printf %s -` `echo 44` ))'" 0 "33\n" ""
403docommand a601 "$SHELL -c 'echo \$(( \$(echo 77) \$(printf %s -) \$(echo 44) ))'" 0 "33\n" ""
404
405docommand a900 "$SHELL -c 'echo \$(( 3 ))'" 0 "3\n" ""
406docommand a901 "$SHELL -c 'echo \$(( 3 )'" !=0 "" NONEMPTY
407docommand a902 "$SHELL -c 'echo \$(( 3 '" !=0 "" NONEMPTY
408docommand a903 "$SHELL -c 'echo \$(( 1 + 3 + ))'" !=0 "" NONEMPTY
409docommand a904 "$SHELL -c 'echo \$(( 1 + 3 = ))'" !=0 "" NONEMPTY
410docommand a905 "$SHELL -c 'echo \$(( 1 + 3 ? ))'" !=0 "" NONEMPTY
411
412#
413# Test whether strange state causes problems
414#
415docommand a1000 "$SHELL -c 'x=foo; : \$((x=1)); echo \$x'" 0 "1\n" ""
416docommand a1001 "$SHELL -c 'x=foo; : \$((x += 1)); echo \$x'" "!=0" IGNORE NONEMPTY
417
418#
419# Test cases that are similar to the tests from ksh93
420#
421docommand ak01a "$SHELL -c 'x=1 y=2 z=3; echo \$((2+2))'" 0 "4\n" ""
422docommand ak01b "$SHELL -c 'x=1 y=2 z=3; echo \$((2+2 != 4))'" 0 "0\n" ""
423docommand ak02a "$SHELL -c 'x=1 y=2 z=3; echo \$((x+y))'" 0 "3\n" ""
424docommand ak02b "$SHELL -c 'x=1 y=2 z=3; echo \$((x+y!=z))'" 0 "0\n" ""
425docommand ak03a "$SHELL -c 'x=1 y=2 z=3; echo \$((\$x+\$y))'" 0 "3\n" ""
426docommand ak03b "$SHELL -c 'x=1 y=2 z=3; echo \$((\$x+\$y!=\$z))'" 0 "0\n" ""
427docommand ak04a "$SHELL -c 'x=1 y=2 z=3; echo \$(((x|y)))'" 0 "3\n" ""
428docommand ak04b "$SHELL -c 'x=1 y=2 z=3; echo \$(((x|y)!=z))'" 0 "0\n" ""
429docommand ak05  "$SHELL -c 'x=1 y=2 z=3; echo \$((x >= z))'" 0 "0\n" ""
430docommand ak06  "$SHELL -c 'x=1 y=2 z=3; echo \$((y+3 != z+2))'" 0 "0\n" ""
431docommand ak07  "$SHELL -c 'x=1 y=2 z=3; echo \$((y<<2 != 1<<3))'" 0 "0\n" ""
432docommand ak08  "$SHELL -c 'x=1 y=2 z=3; echo \$((133%10 != 3))'" 0 "0\n" ""
433docommand ak09  "$SHELL -c 'd=0; echo \$((d || 1))'" 0 "1\n" ""
434if [ "$var_incr" = true ]; then
435docommand ak10  "$SHELL -c 'd=0; echo \$((d++ != 0))'" 0 "0\n" ""
436docommand ak11  "$SHELL -c 'd=1; echo \$((--d != 0))'" 0 "0\n" ""
437fi
438if [ "$comma_operator" = true ]; then
439docommand ak12  "$SHELL -c 'd=0; echo \$(( (d++,6)!=6 && d!=1))'" 0 "0\n" ""
440fi
441if [ "$var_incr" = true ]; then
442docommand ak13  "$SHELL -c 'd=0; echo \$(( (1?2+1:3*4+d++)!=3 || d!=0))'" 0 "0\n" ""
443fi
444docommand ak14  "$SHELL -c 'i=1; echo \$(( (i?0:1)))'" 0 "0\n" ""
445docommand ak15  "$SHELL -c 'i=1; echo \$(( (1 || 1 && 0) != 1))'" 0 "0\n" ""
446docommand ak16  "$SHELL -c 'x=1; echo \$(( (x=-x) != -1 ))'" 0 "0\n" ""
447docommand ak17  "$SHELL -c 'x=2; echo \$(( 1\$((\$x))3 != 123 ))'" 0 "0\n" ""
448
449
450success
451