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

460 lines, 238 significant
1
2#### command sub $(echo hi)
3var x = $(echo hi)
4var y = $(echo '')
5# Make sure we can operate on these values
6echo x=${x:-default} y=${y:-default}
7## STDOUT:
8x=hi y=default
9## END
10
11
12#### Set $HOME using 'var' (i.e. YSH string var in word evaluator)
13var HOME = "foo"
14echo $HOME
15echo ~
16## STDOUT:
17foo
18foo
19## END
20
21#### Use shell var in YSH expression
22x='abc'
23var length = len(x) # length in BYTES, unlike ${#x}
24echo $length
25## STDOUT:
263
27## END
28
29#### Length doesn't apply to BashArray
30x=(a b c)
31x[10]=A
32x[20]=B
33
34# shell style: length is 5
35echo shell=${#x[@]}
36
37shopt --set parse_ysh_expr_sub
38
39# Length could be 20, but we may change the representation to Dict[int, str]
40echo ysh=$[len(x)]
41
42## status: 3
43## STDOUT:
44shell=5
45## END
46
47#### $[len(x)] inside strings
48var s = "abc"
49
50shopt --set parse_ysh_expr_sub
51
52echo -$[len(s)]-
53
54# This already has a meaning ...
55#echo "-$len(x)-"
56#echo "-${len}(x)-"
57
58## STDOUT:
59-3-
60## END
61
62#### Func with multiple args in multiple contexts
63shopt --set ysh:upgrade # needed for math.ysh
64
65source $LIB_YSH/math.ysh
66
67var x = max(1+2, 3+4)
68echo $x $[max(1+2, 3+4)]
69
70## STDOUT:
717 7
72## END
73
74
75#### Trailing Comma in Param list
76shopt --set ysh:upgrade # needed for math.ysh
77
78source $LIB_YSH/math.ysh
79
80var x = max(1+2, 3+4,)
81echo $x $[max(1+2, 3+4,)]
82
83## STDOUT:
847 7
85## END
86
87#### nested expr contexts
88var s = "123"
89
90shopt --set parse_ysh_expr_sub
91# lex_mode_e.ShCommand -> Expr -> ShCommand -> Expr
92var x = $(echo $'len\n' $[len(s)])
93echo $x
94## STDOUT:
95len 3
96## END
97
98
99# TODO:
100# - test keyword args
101# - test splatting *args, **kwargs
102# - Multiline parsing
103#
104# var x = max(
105# 1+2,
106# 3+4,
107# )
108# echo $x $max(
109# 1+2,
110# 3+4,
111# )
112
113#### YSH var used with shell arithmetic
114var w = "3"
115echo lt=$(( w < 4 ))
116echo gt=$(( w > 4 ))
117
118var z = 3
119echo lt=$(( z < 4 ))
120echo gt=$(( z > 4 ))
121## STDOUT:
122lt=1
123gt=0
124lt=1
125gt=0
126## END
127
128#### Parse { var x = 42 }
129shopt -s ysh:upgrade
130g() { var x = 42 }
131
132var x = 1
133f() { var x = 42; setvar x = 43 }
134f
135echo x=$x
136## STDOUT:
137x=1
138## END
139
140#### double quoted
141var foo = "bar"
142var x = "-$foo-${foo}-${undef:-default}-"
143echo $x
144## STDOUT:
145-bar-bar-default-
146## END
147
148#### double quoted respects strict_array
149shopt -s strict:all
150declare -a a=(one two three)
151var x = "-${a[@]}-"
152echo $x
153## status: 1
154## stdout-json: ""
155
156#### simple var sub $name $0 $1 $? etc.
157( exit 42 )
158var status = $?
159echo status=$status
160
161set -- a b c
162var one = $1
163var two = $2
164echo $one $two
165
166var named = "$one" # equivalent to 'one'
167echo named=$named
168
169## STDOUT:
170status=42
171a b
172named=a
173## END
174
175#### braced var sub ${x:-default}
176
177# without double quotes
178
179var b = ${foo:-default}
180echo $b
181var c = ${bar:-"-$b-"}
182echo $c
183
184var d = "${bar:-"-$c-"}" # another one
185echo $d
186
187## STDOUT:
188default
189-default-
190--default--
191## END
192
193#### braced var sub respects strict_array
194set -- a b c
195var x = ${undef:-"$@"}
196echo $x
197shopt -s strict_array
198setvar x = ${undef:-"$@"}
199echo $x
200## status: 1
201## STDOUT:
202a b c
203## END
204
205
206#### null / true / false
207shopt -s ysh:upgrade
208var n = null
209if (n) {
210 echo yes
211} else {
212 echo no
213}
214var t = true
215if (t) {
216 echo yes
217} else {
218 echo no
219}
220var f = false
221if (f) {
222 echo yes
223} else {
224 echo no
225}
226## STDOUT:
227no
228yes
229no
230## END
231
232#### multiline dict
233
234# Note: a pair has to be all on one line. We could relax that but there isn't
235# a strong reason to now.
236
237var mydict = { a:1,
238 b: 2,
239}
240
241shopt --set parse_ysh_expr_sub
242
243echo mydict=$[len(mydict)]
244## STDOUT:
245mydict=2
246## END
247
248#### multiline array and command sub (only here docs disallowed)
249var array = %(
250 one
251 two
252 three
253)
254
255shopt --set parse_ysh_expr_sub
256
257echo array=$[len(array)]
258
259var comsub = $(
260echo hi
261echo bye
262)
263echo comsub=$[len(comsub)]
264
265## STDOUT:
266array=3
267comsub=6
268## END
269
270#### obj=>method() - remove?
271var s = 'hi'
272
273# TODO: This does a bound method thing we probably don't want
274var s2 = s=>upper()
275echo $s2
276## STDOUT:
277HI
278## END
279
280#### s->upper does NOT work, should be s.upper() or =>
281var s = 'hi'
282var method = s->upper
283echo $method
284## status: 3
285## stdout-json: ""
286
287#### d.key
288var d = {name: 'andy'}
289var x = d.name
290echo $x
291## STDOUT:
292andy
293## END
294
295#### a ++ b for string/list concatenation
296shopt -s parse_brace parse_ysh_expr_sub
297
298var i = 'abc'
299var j = 'de'
300var k = i ++ j
301echo string $k
302
303
304var a = [1, 2]
305var b = [3]
306var c = a ++ b
307echo list len=$[len(c)]
308
309echo ---
310
311try {
312 = 'ab' ++ 3
313}
314echo Str Int $_status
315
316try {
317 = [1, 2] ++ 3
318}
319echo List Int $_status
320
321try {
322 = 3 ++ 'ab'
323}
324echo Int Str $_status
325
326## STDOUT:
327string abcde
328list len=3
329---
330Str Int 3
331List Int 3
332Int Str 3
333## END
334
335#### s ~~ glob and s !~~ glob
336shopt -s ysh:all
337
338if ('foo.py' ~~ '*.py') {
339 echo yes
340}
341if ('foo.py' !~~ '*.sh') {
342 echo no
343}
344## STDOUT:
345yes
346no
347## END
348
349#### Type Errors
350shopt --set parse_brace
351
352# TODO: It might be nice to get a message
353try {
354 var x = {} + []
355}
356echo $_status
357
358try {
359 setvar x = {} + 3
360}
361echo $_status
362
363try {
364 = 'foo' ++ 3
365}
366echo $_status
367
368try {
369 = 'foo' ++ 3
370}
371echo $_status
372
373## STDOUT:
3743
3753
3763
3773
378## END
379
380
381#### can't use ++ on integers
382var x = 12 ++ 3
383echo $x
384## status: 3
385## STDOUT:
386## END
387
388#### can't do mystr ++ mylist
389= ["s"] + "t"
390## status: 3
391## STDOUT:
392## END
393
394
395#### expression literals
396var e = ^[1 + 2]
397
398shopt --set parse_ysh_expr_sub
399
400echo type=$[type(e)]
401echo $[io->evalExpr(e)]
402
403var e = ^[2 < 1]
404echo $[io->evalExpr(e)]
405
406var x = 42
407var e = ^[42 === x and true]
408echo $[io->evalExpr(e)]
409
410var mylist = ^[3, 4]
411pp test_ (io->evalExpr(mylist))
412
413## STDOUT:
414type=Expr
4153
416false
417true
418(List) [3,4]
419## END
420
421#### No list comprehension in ^[]
422
423var mylist = ^[x for x in y]
424pp test_ (io->evalExpr(mylist))
425
426## status: 2
427## STDOUT:
428## END
429
430
431#### expression literals, evaluation failure
432var e = ^[1 / 0]
433call io->evalExpr(e)
434## status: 3
435## STDOUT:
436## END
437
438#### expression literals, lazy evaluation
439shopt --set parse_ysh_expr_sub
440
441var x = 0
442var e = ^[x]
443
444setvar x = 1
445echo result=$[io->evalExpr(e)]
446## STDOUT:
447result=1
448## END
449
450#### expression literals, sugar for strings
451shopt --set parse_ysh_expr_sub
452
453var x = 0
454var e = ^"x is $x"
455
456setvar x = 1
457echo result=$[io->evalExpr(e)]
458## STDOUT:
459result=x is 1
460## END