Imported from ../bash-3.0.tar.gz.
[platform/upstream/bash.git] / tests / arith.tests
1 set +o posix
2 declare -i iv jv
3
4 iv=$(( 3 + 5 * 32 ))
5 echo $iv
6 iv=iv+3
7 echo $iv
8 iv=2
9 jv=iv
10
11 let "jv *= 2"
12 echo $jv
13 jv=$(( $jv << 2 ))
14 echo $jv
15
16 let jv="$jv / 2"
17 echo $jv
18 jv="jv >> 2"
19 echo $jv
20
21 iv=$((iv+ $jv))
22 echo $iv
23 echo $((iv -= jv))
24 echo $iv
25 echo $(( iv == jv ))
26 echo $(( iv != $jv ))
27 echo $(( iv < jv ))
28 echo $(( $iv > $jv ))
29 echo $(( iv <= $jv ))
30 echo $(( $iv >= jv ))
31
32 echo $jv
33 echo $(( ~$jv ))
34 echo $(( ~1 ))
35 echo $(( ! 0 ))
36
37 echo $(( jv % 2 ))
38 echo $(( $iv % 4 ))
39
40 echo $(( iv <<= 16 ))
41 echo $(( iv %= 33 ))
42
43 echo $(( 33 & 55 ))
44 echo $(( 33 | 17 ))
45
46 echo $(( iv && $jv ))
47 echo $(( $iv || jv ))
48
49 echo $(( iv && 0 ))
50 echo $(( iv & 0 ))
51 echo $(( iv && 1 ))
52 echo $(( iv & 1 ))
53
54 echo $(( $jv || 0 ))
55 echo $(( jv | 0 ))
56 echo $(( jv | 1 ))
57 echo $(( $jv || 1 ))
58
59 let 'iv *= jv'
60 echo $iv
61 echo $jv
62 let "jv += $iv"
63 echo $jv
64
65 echo $(( jv /= iv ))
66 echo $(( jv <<= 8 ))
67 echo $(( jv >>= 4 ))
68
69 echo $(( iv |= 4 ))
70 echo $(( iv &= 4 ))
71
72 echo $(( iv += (jv + 9)))
73 echo $(( (iv + 4) % 7 ))
74
75 # unary plus, minus
76 echo $(( +4 - 8 ))
77 echo $(( -4 + 8 ))
78
79 # conditional expressions
80 echo $(( 4<5 ? 1 : 32))
81 echo $(( 4>5 ? 1 : 32))
82 echo $(( 4>(2+3) ? 1 : 32))
83 echo $(( 4<(2+3) ? 1 : 32))
84 echo $(( (2+2)<(2+3) ? 1 : 32))
85 echo $(( (2+2)>(2+3) ? 1 : 32))
86
87 # check that the unevaluated part of the ternary operator does not do
88 # evaluation or assignment
89 x=i+=2
90 y=j+=2
91 declare -i i=1 j=1
92 echo $((1 ? 20 : (x+=2)))
93 echo $i,$x
94 echo $((0 ? (y+=2) : 30))
95 echo $j,$y
96
97 x=i+=2
98 y=j+=2
99 declare -i i=1 j=1
100 echo $((1 ? 20 : (x+=2)))
101 echo $i,$x
102 echo $((0 ? (y+=2) : 30))
103 echo $i,$y
104
105 # check precedence of assignment vs. conditional operator
106 # should be an error
107 declare -i x=2
108 y=$((1 ? 20 : x+=2))
109
110 # check precedence of assignment vs. conditional operator
111 declare -i x=2
112 echo $((0 ? x+=2 : 20))
113
114 # associativity of assignment-operator operator
115 declare -i i=1 j=2 k=3
116 echo $((i += j += k))
117 echo $i,$j,$k
118
119 # octal, hex
120 echo $(( 0x100 | 007 ))
121 echo $(( 0xff ))
122 echo $(( 16#ff ))
123 echo $(( 16#FF/2 ))
124 echo $(( 8#44 ))
125
126 echo $(( 8 ^ 32 ))
127
128 # other bases
129 echo $(( 16#a ))
130 echo $(( 32#a ))
131 echo $(( 56#a ))
132 echo $(( 64#a ))
133
134 echo $(( 16#A ))
135 echo $(( 32#A ))
136 echo $(( 56#A ))
137 echo $(( 64#A ))
138
139 echo $(( 64#@ ))
140 echo $(( 64#_ ))
141
142 # weird bases
143 echo $(( 3425#56 ))
144
145 # missing number after base
146 echo $(( 2# ))
147
148 # these should generate errors
149 echo $(( 7 = 43 ))
150 echo $(( 2#44 ))
151 echo $(( 44 / 0 ))
152 let 'jv += $iv'
153 echo $(( jv += \$iv ))
154 let 'rv = 7 + (43 * 6'
155
156 # more errors
157 declare -i i
158 i=0#4
159 i=2#110#11
160
161 ((echo abc; echo def;); echo ghi)
162
163 if (((4+4) + (4 + 7))); then
164         echo ok
165 fi
166
167 (())    # make sure the null expression works OK
168
169 a=(0 2 4 6)
170 echo $(( a[1] + a[2] ))
171 echo $(( (a[1] + a[2]) == a[3] ))
172 (( (a[1] + a[2]) == a[3] )) ; echo $?
173
174 # test pushing and popping the expression stack
175 unset A
176 A="4 + "
177 echo $(( ( 4 + A ) + 4 ))
178 A="3 + 5"
179 echo $(( ( 4 + A ) + 4 ))
180
181 # badly-formed conditional expressions
182 echo $(( 4 ? : $A ))
183 echo $(( 1 ? 20 ))
184 echo $(( 4 ? 20 : ))
185
186 # precedence and short-circuit evaluation
187 B=9
188 echo $B
189
190 echo $(( 0 && B=42 ))
191 echo $B
192
193 echo $(( 1 || B=88 ))
194 echo $B
195
196 echo $(( 0 && (B=42) ))
197 echo $B
198
199 echo $(( (${$} - $$) && (B=42) ))
200 echo $B
201
202 echo $(( 1 || (B=88) ))
203 echo $B
204
205 # until command with (( )) command
206 x=7
207
208 echo $x
209 until (( x == 4 ))
210 do
211         echo $x
212         x=4
213 done
214
215 echo $x
216
217 # exponentiation
218 echo $(( 2**15 - 1))
219 echo $(( 2**(16-1)))
220 echo $(( 2**16*2 ))
221 echo $(( 2**31-1))
222 echo $(( 2**0 ))
223
224 # {pre,post}-{inc,dec}rement and associated errors
225
226 x=4
227
228 echo $x
229 echo $(( x++ ))
230 echo $x
231 echo $(( x-- ))
232 echo $x
233
234 echo $(( --x ))
235 echo $x
236
237 echo $(( ++x ))
238 echo $x
239
240 echo $(( ++7 ))
241 echo $(( 7-- ))
242
243 echo $(( --x=7 ))
244 echo $(( ++x=7 ))
245
246 echo $(( x++=7 ))
247 echo $(( x--=7 ))
248
249 echo $x
250
251 echo $(( +7 ))
252 echo $(( -7 ))
253
254 echo $(( ++7 ))
255 echo $(( --7 ))
256
257 ${THIS_SH} ./arith1.sub
258 ${THIS_SH} ./arith2.sub
259
260 x=4
261 y=7
262
263 (( x=8 , y=12 ))
264
265 echo $x $y
266
267 # should be an error
268 (( x=9 y=41 ))
269
270 # These are errors
271 unset b
272 echo $((a b))
273 ((a b))
274
275 n=42
276 printf "%d\n" $n
277 printf "%i\n" $n
278 echo $(( 8#$(printf "%o\n" $n) ))
279 printf "%u\n" $n
280 echo $(( 16#$(printf "%x\n" $n) ))
281 echo $(( 16#$(printf "%X\n" $n) ))
282
283 # causes longjmp botches through bash-2.05b
284 a[b[c]d]=e