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

594 lines, 330 significant
1## compare_shells: bash
2## oils_failures_allowed: 1
3
4#### invoke usage
5case $SH in bash) exit ;; esac
6
7invoke
8echo status=$?
9
10invoke --
11echo status=$?
12
13echo
14
15invoke sleep 0
16echo status=$?
17
18invoke -- sleep 0
19echo status=$?
20
21invoke --builtin -- sleep 0
22echo status=$?
23
24## STDOUT:
25status=2
26status=2
27
28status=2
29status=2
30status=0
31## END
32## N-I bash STDOUT:
33## END
34
35#### invoke nonexistent name
36case $SH in bash) exit ;; esac
37
38invoke zz
39echo status=$?
40
41invoke --builtin zz
42echo status=$?
43
44invoke --builtin -- zz
45echo status=$?
46
47## STDOUT:
48status=2
49status=127
50status=127
51## END
52## N-I bash STDOUT:
53## END
54
55#### invoke fails to find tools
56case $SH in bash) exit ;; esac
57
58invoke --builtin ls
59echo status=$?
60
61invoke --sh-func ls
62echo status=$?
63
64invoke --proc ls
65echo status=$?
66
67invoke --extern zzz
68echo status=$?
69
70## STDOUT:
71status=127
72status=127
73status=127
74status=127
75## END
76## N-I bash STDOUT:
77## END
78
79#### invoke --proc --sh-func --builtin --extern
80case $SH in bash) exit ;; esac
81
82true() {
83 echo 'sh-func true'
84}
85
86shopt --set ysh:all
87
88proc true {
89 echo 'proc true'
90}
91
92# Now INVOKE each one
93
94echo --sh-func
95invoke --sh-func true
96echo status=$?
97echo
98
99echo --proc
100invoke --proc true
101echo status=$?
102echo
103
104echo --builtin
105invoke --builtin true --help || true
106echo status=$?
107echo
108
109echo --extern
110invoke --extern true
111echo status=$?
112echo
113
114## STDOUT:
115--sh-func
116sh-func true
117status=0
118
119--proc
120proc true
121status=0
122
123--builtin
124status=0
125
126--extern
127status=0
128
129## END
130## N-I bash STDOUT:
131## END
132
133#### invoke --proc doesn't run shell functions
134case $SH in bash) exit ;; esac
135
136true() {
137 echo sh-func true
138}
139
140invoke --proc true
141echo status=$?
142
143## STDOUT:
144status=127
145## END
146## N-I bash STDOUT:
147## END
148
149#### type and command builtin don't find private sleep
150
151remove-path() { sed 's;/.*/;;'; }
152
153type -t sleep
154type sleep | remove-path
155echo
156
157# this is meant to find the "first word"
158type -a sleep | remove-path | uniq
159echo
160
161command -v sleep | remove-path
162
163## STDOUT:
164file
165sleep is sleep
166
167sleep is sleep
168
169sleep
170## END
171
172#### but invoke --show finds the private builtin
173case $SH in bash) exit ;; esac
174
175invoke --show sleep | grep builtin
176
177## STDOUT:
178 sleep builtin private
179## END
180
181## N-I bash STDOUT:
182## END
183
184#### invoke --show with many types
185case $SH in bash) exit ;; esac
186
187# TODO: CRASH bug!
188# use ///osh/bash-strict.sh
189
190my-name() { echo sh-func; }
191
192alias my-name=$'echo my \u03bc \xff alias'
193
194mkdir -p dir
195echo 'echo hi' > dir/my-name
196chmod +x dir/my-name
197
198# BUG:
199# 1. we start with OSH, and initialize $PATH
200# 2. then we mutate $PATH
201# 3. shopt --set ysh:all
202# 4. now we look at ENV.PATH, which isn't changed
203PATH=$PWD/dir:$PATH
204#echo $PATH
205
206if false; then
207 command -v my-name
208 echo
209 type -a my-name #bash-strict
210 echo
211fi
212
213shopt --set ysh:all
214
215proc my-name { echo proc }
216
217proc myInvoke { echo hi }
218var methods = Obj.new({__invoke__: myInvoke})
219var myobj = Obj.new({}, methods)
220
221if false {
222 type -a my-name #bash-strict
223 echo
224}
225
226invoke --show my-name myobj eval cd zzz | sed 's/#.qtt8/%.qtt8/'
227
228## STDOUT:
229%.qtt8 name kind detail
230 my-name alias b'echo my μ \yff alias'
231 my-name proc -
232 my-name sh-func -
233 myobj proc invokable
234 eval builtin special
235 cd builtin -
236 zzz - -
237## END
238
239## N-I bash STDOUT:
240## END
241
242
243#### invoke --show does proper quoting
244case $SH in bash) exit ;; esac
245
246alias $'bad-alias=echo \xff\necho z'
247
248bad-alias | od -A n -t x1
249
250# sed hack for test framework bug
251invoke --show bad-alias | sed 's/#.qtt8/%.qtt8/'
252
253#alias $'bad=hi\xffname=echo hi'
254#$'bad\xffname'
255
256## STDOUT:
257 ff 0a 7a 0a
258%.qtt8 name kind detail
259 bad-alias alias b'echo \yff\necho z'
260## END
261
262## N-I bash STDOUT:
263## END
264
265#### builtin sleep behaves like external sleep
266case $SH in
267 *osh) prefix='builtin' ;;
268 *) prefix='' ;;
269esac
270
271$prefix sleep
272if test "$?" != 0; then
273 echo ok
274fi
275
276# This is different! OSH is stricter
277if false; then
278$prefix sleep --
279if test "$?" != 0; then
280 echo ok
281fi
282fi
283
284$prefix sleep -2
285if test "$?" != 0; then
286 echo ok
287fi
288
289$prefix sleep -- -2
290if test "$?" != 0; then
291 echo ok
292fi
293
294$prefix sleep zz
295if test "$?" != 0; then
296 echo ok
297fi
298
299$prefix sleep 0
300echo status=$?
301
302$prefix sleep -- 0
303echo status=$?
304
305$prefix sleep '0.0005'
306echo status=$?
307
308$prefix sleep '+0.0005'
309echo status=$?
310
311## STDOUT:
312ok
313ok
314ok
315ok
316status=0
317status=0
318status=0
319status=0
320## END
321
322#### builtin sleep usage errors
323case $SH in bash) exit ;; esac
324
325builtin sleep 0.5s
326echo status=$?
327
328builtin sleep 0.1 extra
329echo status=$?
330
331## STDOUT:
332status=2
333status=2
334## END
335## N-I bash STDOUT:
336## END
337
338#### sleep without prefix is still external
339
340# should not work
341builtin sleep --version
342if test "$?" != '0'; then
343 echo ok
344fi
345
346sleep --version | head -n 1 >& 2
347echo status=$?
348
349## STDOUT:
350ok
351status=0
352## END
353
354#### builtin cat
355
356case $SH in
357 *osh) prefix='builtin' ;;
358 *) prefix='' ;;
359esac
360
361seq 2 3 | $prefix cat
362echo ---
363
364# from file
365#echo FOO > foo
366#$prefix cat foo foo
367
368## STDOUT:
3692
3703
371---
372## END
373
374#### builtin cat usage
375case $SH in
376 *osh) prefix='builtin' ;;
377 *) prefix='' ;;
378esac
379
380$prefix cat --bad >/dev/null
381if test "$?" != 0; then
382 echo ok
383fi
384
385$prefix cat -z
386if test "$?" != 0; then
387 echo ok
388fi
389
390seq 3 4 | $prefix cat --
391echo status=$?
392
393## STDOUT:
394ok
395ok
3963
3974
398status=0
399## END
400
401#### builtin cat non nonexistent file
402case $SH in
403 *osh) prefix='builtin' ;;
404 *) prefix='' ;;
405esac
406
407echo FOO > foo
408
409$prefix cat foo nonexistent foo
410echo status=$?
411
412## STDOUT:
413FOO
414FOO
415status=1
416## END
417
418#### builtin cat accept - for stdin
419case $SH in
420 *osh) prefix='builtin' ;;
421 *) prefix='' ;;
422esac
423
424echo FOO > foo
425seq 3 4 | $prefix cat foo - foo foo
426
427echo ---
428
429# second - is a no-op
430seq 5 6 | $prefix cat - -
431
432## STDOUT:
433FOO
4343
4354
436FOO
437FOO
438---
4395
4406
441## END
442
443#### builtin rm: usage, removing files
444case $SH in
445 *osh) prefix='builtin' ;;
446 *) prefix='' ;;
447esac
448
449$prefix rm
450if test "$?" != 0; then echo ok; fi
451
452$prefix rm --
453if test "$?" != 0; then echo ok; fi
454
455$prefix rm -- nonexistent
456echo status=$?
457
458touch foo bar
459$prefix rm -- foo bar
460echo status=$?
461
462if test -f foo; then echo fail; fi
463if test -f bar; then echo fail; fi
464
465## STDOUT:
466ok
467ok
468status=1
469status=0
470## END
471
472#### builtin rm -f - ignores arguments that don't exist
473case $SH in
474 *osh) prefix='builtin' ;;
475 *) prefix='' ;;
476esac
477
478touch foo bar
479$prefix rm -- foo OOPS bar
480echo status=$?
481
482if test -f foo; then echo fail; fi
483if test -f bar; then echo fail; fi
484
485touch foo bar
486$prefix rm -f -- foo OOPS bar
487echo status=$?
488
489if test -f foo; then echo fail; fi
490if test -f bar; then echo fail; fi
491
492## STDOUT:
493status=1
494status=0
495## END
496
497#### builtin rm -f - still fails when file can't be removed
498
499mkdir read-only
500touch read-only/stuck
501chmod -w read-only
502ls -l stuck
503
504touch foo bar
505$prefix rm -- read-only/stuck foo bar
506echo status=$?
507
508if test -f foo; then echo fail; fi
509if test -f bar; then echo fail; fi
510
511ls read-only/stuck
512
513touch foo bar
514$prefix rm -- read-only/stuck foo bar
515echo status=$?
516
517# Clean up for real
518chmod +w read-only
519$prefix rm -- read-only/stuck
520echo status=$?
521
522if test -f read-only/stuck; then echo fail; fi
523
524## STDOUT:
525status=1
526read-only/stuck
527status=1
528status=0
529## END
530
531#### builtin rm -f allows empty arg list
532case $SH in
533 *osh) prefix='builtin' ;;
534 *) prefix='' ;;
535esac
536
537$prefix rm -f
538echo status=$?
539
540## STDOUT:
541status=0
542## END
543
544#### builtin rm always fails on directories (regardless of -f)
545case $SH in
546 *osh) prefix='builtin' ;;
547 *) prefix='' ;;
548esac
549
550touch foo bar
551mkdir -p tmp
552$prefix rm -- foo tmp bar
553echo status=$?
554
555if test -f foo; then echo fail; fi
556if test -f bar; then echo fail; fi
557
558touch foo bar
559mkdir -p tmp
560$prefix rm -f -- foo tmp bar
561echo status=$?
562
563if test -f foo; then echo fail; fi
564if test -f bar; then echo fail; fi
565
566## STDOUT:
567status=1
568status=1
569## END
570
571#### builtin readlink
572case $SH in bash) exit ;; esac
573
574echo TODO
575
576# turn this into a builtin
577# does that mean any builtin can be externalized?
578# - [ aka test is a good candiate
579# - we have stubs from true/false
580
581## STDOUT:
582## END
583
584## N-I bash STDOUT:
585## END
586
587#### compgen -A builtin doesn't find private builtins
588
589compgen -A builtin slee
590echo status=$?
591
592## STDOUT:
593status=1
594## END