OILS / spec / ysh-blocks.test.sh View on Github | oilshell.org

367 lines, 207 significant
1#### cd with block
2shopt -s oil:all
3
4const saved = "$PWD"
5
6# OLDPWD is NOT defined
7cd / { echo $PWD; echo OLDPWD=${OLDPWD:-} }; echo done
8
9if ! test "$saved" = $PWD; then
10 echo FAIL
11fi
12
13cd /tmp {
14 write PWD=$PWD
15 write --sep ' ' pwd builtin: $(pwd)
16}
17
18if ! test "$saved" = $PWD; then
19 echo FAIL
20fi
21
22## STDOUT:
23/
24OLDPWD=
25done
26PWD=/tmp
27pwd builtin: /tmp
28## END
29
30#### cd with block: fatal error in block
31shopt -s oil:all
32cd / {
33 echo one
34 false
35 echo two
36}
37## status: 1
38## STDOUT:
39one
40## END
41
42
43#### cd with block: return in block
44shopt -s oil:all
45f() {
46 cd / {
47 echo one
48 return
49 echo two
50 }
51 echo 'end func'
52}
53f
54## STDOUT:
55one
56end func
57## END
58
59#### cd with block: break in block
60shopt -s oil:all
61f() {
62 cd / {
63 echo one
64 for i in 1 2; do
65 echo $i
66 break # break out of loop
67 done
68
69 break # break out of block isn't valid
70 echo two
71 }
72 echo end func
73}
74f
75## status: 1
76## STDOUT:
77one
781
79## END
80
81#### cd with block exits with status 0
82shopt -s oil:all
83cd / {
84 echo block
85
86 # This return value is ignored.
87 # Or maybe this should be a runtime error?
88 return 1
89}
90echo status=$?
91## STDOUT:
92block
93status=0
94## END
95
96#### block doesn't have its own scope
97shopt -s oil:all
98var x = 1
99echo "x=$x"
100cd / {
101 #set y = 5 # This would be an error because set doesn't do dynamic lookup
102 var x = 42
103 echo "x=$x"
104}
105echo "x=$x"
106## STDOUT:
107x=1
108x=42
109x=42
110## END
111
112#### block literal in expression mode: ^(echo $PWD)
113shopt -s oil:all
114
115const myblock = ^(echo $PWD | wc -l)
116eval (myblock)
117
118const b2 = ^(echo one; echo two)
119eval (b2)
120
121## STDOUT:
1221
123one
124two
125## END
126
127#### block arg as typed expression
128
129shopt -s oil:all
130
131# literal
132cd /tmp (^(echo $PWD))
133
134const myblock = ^(echo $PWD)
135cd /tmp (myblock)
136
137## STDOUT:
138/tmp
139/tmp
140## END
141
142#### Pass invalid typed args
143
144cd /tmp (42) # should be a block
145## status: 3
146
147#### Pass too many typed args
148
149cd /tmp (1, 2)
150## status: 3
151
152#### 'builtin' and 'command' with block
153shopt --set oil:upgrade
154builtin cd / {
155 echo "builtin $PWD"
156}
157command cd / {
158 echo "command $PWD"
159}
160## STDOUT:
161builtin /
162command /
163## END
164
165
166#### Consistency: Control Flow and Blocks
167shopt --set parse_brace
168
169# "Invalid control flow at top level"
170eval '
171 cd / {
172 echo cd
173 break
174 }
175'
176echo cd no loop $?
177
178# warning: "Unexpected control flow in block" (strict_control_flow)
179eval '
180while true {
181 cd / {
182 echo cd
183 break
184 }
185}
186'
187echo cd loop $?
188
189eval '
190while true {
191 shopt --unset errexit {
192 echo shopt
193 continue
194 }
195}
196'
197echo shopt continue $?
198
199eval '
200while true {
201 shvar FOO=foo {
202 echo shvar
203 continue
204 }
205}
206'
207echo shvar continue $?
208
209
210eval '
211while true {
212 try {
213 echo try
214 break
215 }
216}
217'
218echo try break $?
219
220## STDOUT:
221cd
222cd no loop 0
223cd
224cd loop 1
225shopt
226shopt continue 1
227shvar
228shvar continue 1
229try
230try break 1
231## END
232
233#### Consistency: Exit Status and Blocks
234shopt --set parse_brace
235
236cd / {
237 false
238}
239echo cd=$?
240
241shopt --unset errexit {
242 false
243}
244echo shopt=$?
245
246shvar FOO=foo {
247 echo " FOO=$FOO"
248 false
249}
250echo shvar=$?
251
252try {
253 false
254}
255echo try=$?
256
257## STDOUT:
258cd=0
259shopt=0
260 FOO=foo
261shvar=0
262try=0
263## END
264
265#### Consistency: Unwanted Blocks Are Errors
266shopt --set parse_brace
267
268true { echo BAD }
269echo true $?
270
271false ( 42, 43 )
272echo false $?
273
274echo { echo BAD }
275echo echo block $?
276
277echo ( 42, 43 )
278echo echo args $?
279
280command echo 'command block' { echo BAD }
281echo command echo $?
282
283builtin echo 'builtin block' { echo BAD }
284echo builtin echo $?
285
286pushd $TMP { echo BAD }
287echo pushd $?
288
289## STDOUT:
290true 2
291false 2
292echo block 2
293echo args 2
294command echo 2
295builtin echo 2
296pushd 2
297## END
298
299#### Block with Bare Assignments
300
301# oil:all has parse_equals
302# is there any way to turn on parse_equals only in config blocks?
303# but we don't know what's a block ahead of time
304# I think we would have to check at runtime. Look at VarChecker
305
306shopt --set oil:all
307
308proc Rule(s ; ; ; b) {
309 echo "rule $s"
310}
311
312proc myrules(name) {
313 Rule $name-python {
314 kind = 'python'
315 }
316
317 Rule $name-cc {
318 kind = 'cc' # should NOT conflict
319 }
320}
321
322myrules foo
323myrules bar
324
325## STDOUT:
326rule foo-python
327rule foo-cc
328rule bar-python
329rule bar-cc
330## END
331
332#### Proc that doesn't take a block
333shopt --set parse_brace parse_proc parse_paren
334
335proc task(name ; ; ; b = null) {
336 echo "task name=$name"
337 if (b) {
338 eval (b)
339 return 33
340 } else {
341 echo 'no block'
342 return 44
343 }
344}
345
346task spam
347echo status=$?
348
349echo
350
351task foo {
352 echo 'running'
353 echo 'block'
354}
355echo status=$?
356
357## STDOUT:
358task name=spam
359no block
360status=44
361
362task name=foo
363running
364block
365status=33
366## END
367