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

245 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 a synonym for $((
95echo $[1+2] $[3 * 4]
96
97## STDOUT:
983 12
99## END
100## N-I mksh STDOUT:
101$[1+2] $[3 * 4]
102## END
103
104#### $[$var is a synonym for $(($var (#2426)
105var=1
106echo $[$var+2]
107
108## STDOUT:
1093
110## END
111## N-I mksh STDOUT:
112$[1+2]
113## END
114
115#### $[$undefined] is a synonym for $(($undefined (#2566)
116a[0]=$[1+3]
117b[0]=$[b[0]]
118c[0]=$[b[0]]
119echo ${c[0]}
120
121## STDOUT:
1220
123## END
124
125## BUG zsh status: 1
126## BUG zsh STDOUT:
127## END
128
129## N-I mksh STDOUT:
130$[b[0]]
131## END
132
133#### Empty expression (( )) $(( ))
134
135(( ))
136echo status=$?
137
138echo $(( ))
139
140#echo $[]
141
142## STDOUT:
143status=1
1440
145## END
146
147#### Empty expression for (( ))
148
149for (( ; ; )); do
150 echo one
151 break
152done
153
154## STDOUT:
155one
156## END
157
158## N-I mksh status: 1
159## N-I mksh STDOUT:
160## END
161
162#### Empty expression in ${a[@]: : }
163
164a=(a b c d e f)
165
166# space required here -- see spec/var-op-slice
167echo slice ${a[@]: }
168echo status=$?
169echo
170
171echo slice ${a[@]: : }
172echo status=$?
173echo
174
175# zsh doesn't accept this
176echo slice ${a[@]:: }
177echo status=$?
178
179## STDOUT:
180slice a b c d e f
181status=0
182
183slice
184status=0
185
186slice
187status=0
188## END
189
190## BUG zsh status: 1
191## BUG zsh STDOUT:
192slice a b c d e f
193status=0
194
195slice
196status=0
197
198## END
199
200## BUG mksh status: 1
201## BUG mksh STDOUT:
202## END
203
204
205#### Empty expression a[]
206
207a=(1 2 3)
208
209a[]=42
210echo status=$?
211echo ${a[@]}
212
213echo ${a[]}
214echo status=$?
215
216## status: 2
217## STDOUT:
218## END
219
220## OK zsh status: 1
221
222# runtime failures
223
224## OK bash status: 0
225## OK bash STDOUT:
226status=1
2271 2 3
228status=1
229## END
230
231## BUG mksh status: 0
232## BUG mksh STDOUT:
233status=0
23442 2 3
23542
236status=0
237## END
238
239
240# Others
241# [ 1+2 -eq 3 ]
242# [[ 1+2 -eq 3 ]]
243# unset a[]
244# printf -v a[]
245