OILS / spec / arith-context.test.sh View on Github | oils.pub

244 lines, 86 significant
1## compare_shells: bash mksh zsh
2## oils_failures_allowed: 0
3
4# Test arithmetic expressions in all their different contexts.
5
6# $(( 1 + 2 ))
7# (( a=1+2 ))
8# ${a[ 1 + 2 ]}
9# ${a : 1+2 : 1+2}
10# a[1 + 2]=foo
11
12#### Multiple right brackets inside expression
13
14a=(1 2 3)
15echo ${a[a[0]]} ${a[a[a[0]]]}
16
17## STDOUT:
182 3
19## END
20
21## N-I zsh status: 0
22## N-I zsh STDOUT:
23
24## END
25
26#### Slicing of string with constants
27s='abcd'
28echo ${s:0} ${s:0:4} ${s:1:1}
29## stdout: abcd abcd b
30
31#### Slicing of string with variables
32s='abcd'
33zero=0
34one=1
35echo ${s:$zero} ${s:$zero:4} ${s:$one:$one}
36## stdout: abcd abcd b
37
38#### Array index on LHS of assignment
39a=(1 2 3)
40zero=0
41a[zero+5-4]=X
42echo ${a[@]}
43## stdout: 1 X 3
44## OK zsh stdout: X 2 3
45
46#### Array index on LHS with indices
47a=(1 2 3)
48a[a[1]]=X
49echo ${a[@]}
50## stdout: 1 2 X
51## OK zsh stdout: X 2 3
52
53#### Slicing of string with expressions
54# mksh accepts ${s:0} and ${s:$zero} but not ${s:zero}
55# zsh says unrecognized modifier 'z'
56s='abcd'
57zero=0
58echo ${s:zero} ${s:zero+0} ${s:zero+1:zero+1}
59## stdout: abcd abcd b
60## BUG mksh stdout-json: ""
61## BUG mksh status: 1
62## BUG zsh stdout-json: ""
63## BUG zsh status: 1
64
65#### Ambiguous colon in slice
66s='abcd'
67echo $(( 0 < 1 ? 2 : 0 )) # evaluates to 2
68echo ${s: 0 < 1 ? 2 : 0 : 1} # 2:1 -- TRICKY THREE COLONS
69## STDOUT:
702
71c
72## END
73## BUG mksh/zsh STDOUT:
742
75## END
76## BUG mksh/zsh status: 1
77
78#### Triple parens should be disambiguated
79# The first paren is part of the math, parens 2 and 3 are a single token ending
80# arith sub.
81((a=1 + (2*3)))
82echo $a $((1 + (2*3)))
83## STDOUT:
847 7
85## END
86
87#### Quadruple parens should be disambiguated
88((a=1 + (2 * (3+4))))
89echo $a $((1 + (2 * (3+4))))
90## STDOUT:
9115 15
92## END
93
94#### $[ is $((
95echo $[1+2]
96
97## STDOUT:
983
99## END
100## BUG dash/mksh STDOUT:
101$[1+2]
102## END
103
104#### $[$var is $(($var (#2426)
105var=1
106echo $[$var+2]
107
108## STDOUT:
1093
110## END
111## BUG dash/mksh STDOUT:
112$[1+2]
113## END
114
115#### $[$undefined] is $(($undefined (#2566)
116a[0]=$[1+3]
117b[0]=$[b[0]]
118c[0]=$[b[0]]
119echo ${c[0]}
120
121## STDOUT:
1220
123## END
124## BUG dash/zsh STDOUT:
125## END
126## BUG mksh STDOUT:
127$[b[0]]
128## END
129## BUG zsh status: 1
130## BUG dash status: 2
131
132#### Empty expression (( )) $(( ))
133
134(( ))
135echo status=$?
136
137echo $(( ))
138
139#echo $[]
140
141## STDOUT:
142status=1
1430
144## END
145
146#### Empty expression for (( ))
147
148for (( ; ; )); do
149 echo one
150 break
151done
152
153## STDOUT:
154one
155## END
156
157## N-I mksh status: 1
158## N-I mksh STDOUT:
159## END
160
161#### Empty expression in ${a[@]: : }
162
163a=(a b c d e f)
164
165# space required here -- see spec/var-op-slice
166echo slice ${a[@]: }
167echo status=$?
168echo
169
170echo slice ${a[@]: : }
171echo status=$?
172echo
173
174# zsh doesn't accept this
175echo slice ${a[@]:: }
176echo status=$?
177
178## STDOUT:
179slice a b c d e f
180status=0
181
182slice
183status=0
184
185slice
186status=0
187## END
188
189## BUG zsh status: 1
190## BUG zsh STDOUT:
191slice a b c d e f
192status=0
193
194slice
195status=0
196
197## END
198
199## BUG mksh status: 1
200## BUG mksh STDOUT:
201## END
202
203
204#### Empty expression a[]
205
206a=(1 2 3)
207
208a[]=42
209echo status=$?
210echo ${a[@]}
211
212echo ${a[]}
213echo status=$?
214
215## status: 2
216## STDOUT:
217## END
218
219## OK zsh status: 1
220
221# runtime failures
222
223## OK bash status: 0
224## OK bash STDOUT:
225status=1
2261 2 3
227status=1
228## END
229
230## BUG mksh status: 0
231## BUG mksh STDOUT:
232status=0
23342 2 3
23442
235status=0
236## END
237
238
239# Others
240# [ 1+2 -eq 3 ]
241# [[ 1+2 -eq 3 ]]
242# unset a[]
243# printf -v a[]
244