OILS / spec / ysh-list.test.sh View on Github | oils.pub

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