1 #### Augmented assignment doesn't work on List
2
3 # I suppose the logic is that string and array concat is ++
4 #
5 # I wonder if a ++= operator makes sense?
6
7 shopt -s parse_at simple_word_eval
8 var x = :| a 'b c' |
9 argv.py @x
10
11 setvar x += :| d e | # fatal error
12 argv.py @x
13 ## status: 3
14 ## STDOUT:
15 ['a', 'b c']
16 ## END
17
18 #### Augmented assignment respects command_sub_errexit
19
20
21 var x = '42'
22 setvar x += $(echo 3)
23 echo x=$x
24
25 setvar x += $(echo 3; false)
26 echo x=$x
27
28 ## status: 1
29 ## STDOUT:
30 x=45
31 ## END
32
33
34 #### Augmented assignment with integers
35 var x = 1 + 2 * 3
36 echo x=$x
37
38 setvar x += 4 * 1
39 echo x=$x
40 ## STDOUT:
41 x=7
42 x=11
43 ## END
44
45 #### Augmented assignment on string changes to Int Float
46
47 var x = '42'
48 pp test_ (x)
49
50 setvar x += 4 * 1
51 pp test_ (x)
52
53 setvar x += '9'
54 pp test_ (x)
55
56 setvar x = '42'
57 setvar x /= 4
58 pp test_ (x)
59
60 ## STDOUT:
61 (Str) "42"
62 (Int) 46
63 (Int) 55
64 (Float) 10.5
65 ## END
66
67 #### Augmented assignment with floats
68
69 var x = 42
70
71 setvar x += 1.5
72 echo $x
73
74 setvar x += '1.5'
75 echo $x
76
77 setvar x += '3'
78 echo $x
79 ## STDOUT:
80 43.5
81 45.0
82 48.0
83 ## END
84
85 #### Int/Float augmented += -= *= /=
86
87 var x = 0
88
89 setvar x = 10
90 setvar x -= 3
91 echo x=$x
92
93 setvar x = 10
94 setvar x *= 3
95 echo x=$x
96
97 var x = 0
98 setvar x = 10
99 setvar x /= 2
100 echo x=$x
101
102 ## STDOUT:
103 x=7
104 x=30
105 x=5.0
106 ## END
107
108 #### Int Augmented //= %= **= and bitwise ops
109
110 var x = 0
111
112 setvar x = 10
113 setvar x //= 3
114 echo x=$x
115
116 setvar x = 10
117 setvar x %= 3
118 echo x=$x
119
120 setvar x = 10
121 setvar x **= 3
122 echo x=$x
123
124 echo
125 echo bitwise
126
127 setvar x = 0b1111
128 setvar x &= 0b0101
129 echo x=$x
130
131 setvar x = 0b1000
132 setvar x |= 0b0111
133 echo x=$x
134
135 setvar x = 0b1010
136 setvar x ^= 0b1001
137 echo x=$x
138
139 echo
140 echo shift
141
142 setvar x = 0b1000
143 setvar x <<= 1
144 echo x=$x
145
146 setvar x = 0b1000
147 setvar x >>= 1
148 echo x=$x
149
150 ## STDOUT:
151 x=3
152 x=1
153 x=1000
154
155 bitwise
156 x=5
157 x=15
158 x=3
159
160 shift
161 x=16
162 x=4
163 ## END
164
165 #### Augmented assignment of Dict
166
167 shopt -s parse_ysh_expr_sub
168
169 var d = {x: 42}
170
171 setvar d['x'] += 1.5
172 echo $[d.x]
173
174 setvar d.x += '1.5'
175 echo $[d.x]
176
177 setvar d.x += '3'
178 echo $[d.x]
179
180 # default value of 0
181 setvar d['y'] += 1.5
182 echo $[d.y]
183
184 setvar d.z += '1.5'
185 echo $[d.z]
186
187 setvar d.w += 5
188 echo $[d.w]
189
190 ## STDOUT:
191 43.5
192 45.0
193 48.0
194 1.5
195 1.5
196 5
197 ## END
198
199 #### Augmented assignment of List
200
201 shopt -s parse_at
202
203 var mylist = :| 32 42 |
204
205 setvar mylist[0] -= 1
206 echo @mylist
207
208 setvar mylist[1] //= 2
209 echo @mylist
210
211 setvar mylist[1] /= 2
212 echo @mylist
213
214
215 ## STDOUT:
216 31 42
217 31 21
218 31 10.5
219 ## END
220
221 #### Dict with nonexistent key (bug fix)
222
223 shopt -s parse_ysh_expr_sub
224
225 var d = {x: 42}
226
227 setvar d.x += 1
228 setglobal d.x += 1
229 echo $[d.x]
230
231 setvar d.missing -= 1
232 setglobal d.missing -= 1
233 echo $[d.missing]
234
235 ## STDOUT:
236 44
237 -2
238 ## END
239
240
241 #### List with nonexistent elemnt
242 var L = [42]
243 setvar L[99] += 1
244
245 ## status: 3
246 ## STDOUT:
247 ## END
248
249
250 #### Augmented assignment doesn't work with multiple LHS
251
252 var x = 3
253 var y = 4
254 setvar x, y += 2
255 echo $x $y
256
257 ## status: 2
258 ## STDOUT:
259 ## END
260
261
262