1 ## our_shell: ysh
2 ## oils_failures_allowed: 0
3
4 #### shell array :| a 'b c' |
5 shopt -s parse_at
6 var x = :| a 'b c' |
7 var empty = :||
8 argv.py / @x @empty /
9
10 ## STDOUT:
11 ['/', 'a', 'b c', '/']
12 ## END
13
14 #### empty array and simple_word_eval (regression test)
15 shopt -s parse_at simple_word_eval
16 var empty = :| |
17 echo len=$[len(empty)]
18 argv.py / @empty /
19
20 ## STDOUT:
21 len=0
22 ['/', '/']
23 ## END
24
25 #### Shell arrays support tilde detection, static globbing, brace detection
26 shopt -s parse_at simple_word_eval
27 touch {foo,bar}.py
28
29 # could this also be __defaults__.HOME or DEF.HOME?
30 setglobal ENV.HOME = '/home/bob'
31 no_dynamic_glob='*.py'
32
33 var x = :| ~/src *.py {andy,bob}@example.com $no_dynamic_glob |
34 argv.py @x
35 ## STDOUT:
36 ['/home/bob/src', 'bar.py', 'foo.py', 'andy@example.com', 'bob@example.com', '*.py']
37 ## END
38
39 #### Basic List, a[42] a['42'] allowed
40
41 var x = :| 1 2 3 |
42 write len=$[len(x)]
43
44 pp test_ (x[1])
45
46 # Can be int-looking string
47 pp test_ (x['2'])
48
49 # Not allowed
50 pp test_ (x['zz'])
51
52 ## status: 3
53 ## STDOUT:
54 len=3
55 (Str) "2"
56 (Str) "3"
57 ## END
58
59 #### Mutate List entries, a[42] a['42'] allowed
60
61 var a = :| 2 3 4 |
62
63 setvar a[1] = 1
64 pp test_ (a)
65
66 setvar a['2'] += 5
67 pp test_ (a)
68
69 # Can be int-looking string
70 setvar a['2'] = 99
71 pp test_ (a)
72
73 # Not allowed
74 setvar a['zz'] = 101
75
76 ## status: 3
77 ## STDOUT:
78 (List) ["2",1,"4"]
79 (List) ["2",1,9]
80 (List) ["2",1,99]
81 ## END
82
83
84 #### string array with command sub, varsub, etc.
85 shopt -s ysh:all
86
87 var x = 1
88 var a = :| $x $(write hi) 'sq' "dq $x" |
89 write len=$[len(a)]
90 write @a
91 ## STDOUT:
92 len=4
93 1
94 hi
95 sq
96 dq 1
97 ## END
98
99 #### Can print type of List with pp
100
101 var b = :|true| # this is a string
102 pp test_ (b)
103
104 # = b
105
106 var empty = :||
107 pp test_ (empty)
108
109 # = empty
110
111 ## STDOUT:
112 (List) ["true"]
113 (List) []
114 ## END
115
116 #### splice and stringify array
117 shopt --set parse_at
118 shopt --unset no_osh_builtins
119
120 var x = :| 'a b' c |
121
122 declare -a array=( @x )
123
124 argv.py "${array[@]}" # should work
125
126 echo -$array- # fails because of strict_arraywith type error
127
128 echo -$x- # fails with type error
129
130 ## status: 1
131 ## STDOUT:
132 ['a b', 'c']
133 ## END
134
135 #### List->extend()
136 var l = list(1..<3)
137 echo $[len(l)]
138 call l->extend(list(3..<6))
139 echo $[len(l)]
140 ## STDOUT:
141 2
142 5
143 ## END
144
145 #### List append()/extend() should return null
146 shopt -s ysh:all
147 var l = list(1..<3)
148
149 var result = l->extend(list(3..<6))
150 assert [null === result]
151
152 setvar result = l->append(6)
153 assert [null === result]
154
155 echo pass
156 ## STDOUT:
157 pass
158 ## END
159
160 #### List pop()
161 shopt -s ysh:all
162 var l = list(1..<5)
163 assert [4 === l->pop()]
164 assert [3 === l->pop()]
165 assert [2 === l->pop()]
166 assert [1 === l->pop()]
167 echo pass
168 ## STDOUT:
169 pass
170 ## END
171
172 #### List remove() removes elements
173 shopt -s ysh:all
174
175 var l = list(1..=3)
176 call l->remove(2)
177 assert [ [1, 3] === l ]
178
179 # first instance only
180 var l = :|foo bar baz foo foo|
181 call l->remove("foo")
182 assert [ :|bar baz foo foo| === l ]
183
184 echo pass
185 ## STDOUT:
186 pass
187 ## END
188
189 #### List remove() does nothing if element does not exist
190 shopt -s ysh:all
191
192 var l = :| a b c |
193 call l->remove("d")
194 assert [ :| a b c | === l ]
195
196 echo pass
197 ## STDOUT:
198 pass
199 ## END
200
201 #### List insert()
202 shopt -s ysh:all
203
204 var l = :| foo bar |
205 call l->insert(0, "baz")
206 assert [ :| baz foo bar | === l ]
207
208 call l->insert(2, "zzz")
209 assert [ :| baz foo zzz bar | === l ]
210
211 echo pass
212
213 ## STDOUT:
214 pass
215 ## END
216
217 #### List insert() overflow
218 shopt -s ysh:all
219
220 var l = :| foo bar baz |
221 call l->insert(123, "yyy")
222 call l->insert(123, "zzz")
223
224 assert [ :| foo bar baz yyy zzz | === l ]
225
226 echo pass
227 ## STDOUT:
228 pass
229 ## END
230
231 #### List insert() negative
232 shopt -s ysh:all
233
234 var l = :| foo bar |
235 call l->insert(-1, "yyy")
236 assert [ :| foo yyy bar | === l ]
237
238 call l->insert(-3, "zzz")
239 assert [ :| zzz foo yyy bar | === l ]
240
241 echo pass
242 ## STDOUT:
243 pass
244 ## END
245
246 #### List insert() negative overflow
247 shopt -s ysh:all
248
249 var l = :| foo bar |
250
251 for pos in ([-2, -3, -4]) {
252 call l->insert(pos, str(pos))
253 }
254 assert [ :| -4 -3 -2 foo bar | === l ]
255
256 call l->insert(-100, "zzz")
257 assert [ :| zzz -4 -3 -2 foo bar | === l ]
258
259 echo pass
260 ## STDOUT:
261 pass
262 ## END