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

596 lines, 331 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
187shopt --unset no_osh_builtins # for alias
188
189# TODO: CRASH bug!
190# use ///osh/bash-strict.sh
191
192my-name() { echo sh-func; }
193
194alias my-name=$'echo my \u03bc \xff alias'
195
196mkdir -p dir
197echo 'echo hi' > dir/my-name
198chmod +x dir/my-name
199
200# BUG:
201# 1. we start with OSH, and initialize $PATH
202# 2. then we mutate $PATH
203# 3. shopt --set ysh:all
204# 4. now we look at ENV.PATH, which isn't changed
205PATH=$PWD/dir:$PATH
206#echo $PATH
207
208if false; then
209 command -v my-name
210 echo
211 type -a my-name #bash-strict
212 echo
213fi
214
215shopt --set ysh:all
216
217proc my-name { echo proc }
218
219proc myInvoke { echo hi }
220var methods = Obj.new({__invoke__: myInvoke})
221var myobj = Obj.new({}, methods)
222
223if false {
224 type -a my-name #bash-strict
225 echo
226}
227
228invoke --show my-name myobj eval cd zzz | sed 's/#.qtt8/%.qtt8/'
229
230## STDOUT:
231%.qtt8 name kind detail
232 my-name alias b'echo my μ \yff alias'
233 my-name proc -
234 my-name sh-func -
235 myobj proc invokable
236 eval builtin special
237 cd builtin -
238 zzz - -
239## END
240
241## N-I bash STDOUT:
242## END
243
244
245#### invoke --show does proper quoting
246case $SH in bash) exit ;; esac
247
248alias $'bad-alias=echo \xff\necho z'
249
250bad-alias | od -A n -t x1
251
252# sed hack for test framework bug
253invoke --show bad-alias | sed 's/#.qtt8/%.qtt8/'
254
255#alias $'bad=hi\xffname=echo hi'
256#$'bad\xffname'
257
258## STDOUT:
259 ff 0a 7a 0a
260%.qtt8 name kind detail
261 bad-alias alias b'echo \yff\necho z'
262## END
263
264## N-I bash STDOUT:
265## END
266
267#### builtin sleep behaves like external sleep
268case $SH in
269 *osh) prefix='builtin' ;;
270 *) prefix='' ;;
271esac
272
273$prefix sleep
274if test "$?" != 0; then
275 echo ok
276fi
277
278# This is different! OSH is stricter
279if false; then
280$prefix sleep --
281if test "$?" != 0; then
282 echo ok
283fi
284fi
285
286$prefix sleep -2
287if test "$?" != 0; then
288 echo ok
289fi
290
291$prefix sleep -- -2
292if test "$?" != 0; then
293 echo ok
294fi
295
296$prefix sleep zz
297if test "$?" != 0; then
298 echo ok
299fi
300
301$prefix sleep 0
302echo status=$?
303
304$prefix sleep -- 0
305echo status=$?
306
307$prefix sleep '0.0005'
308echo status=$?
309
310$prefix sleep '+0.0005'
311echo status=$?
312
313## STDOUT:
314ok
315ok
316ok
317ok
318status=0
319status=0
320status=0
321status=0
322## END
323
324#### builtin sleep usage errors
325case $SH in bash) exit ;; esac
326
327builtin sleep 0.5s
328echo status=$?
329
330builtin sleep 0.1 extra
331echo status=$?
332
333## STDOUT:
334status=2
335status=2
336## END
337## N-I bash STDOUT:
338## END
339
340#### sleep without prefix is still external
341
342# should not work
343builtin sleep --version
344if test "$?" != '0'; then
345 echo ok
346fi
347
348sleep --version | head -n 1 >& 2
349echo status=$?
350
351## STDOUT:
352ok
353status=0
354## END
355
356#### builtin cat
357
358case $SH in
359 *osh) prefix='builtin' ;;
360 *) prefix='' ;;
361esac
362
363seq 2 3 | $prefix cat
364echo ---
365
366# from file
367#echo FOO > foo
368#$prefix cat foo foo
369
370## STDOUT:
3712
3723
373---
374## END
375
376#### builtin cat usage
377case $SH in
378 *osh) prefix='builtin' ;;
379 *) prefix='' ;;
380esac
381
382$prefix cat --bad >/dev/null
383if test "$?" != 0; then
384 echo ok
385fi
386
387$prefix cat -z
388if test "$?" != 0; then
389 echo ok
390fi
391
392seq 3 4 | $prefix cat --
393echo status=$?
394
395## STDOUT:
396ok
397ok
3983
3994
400status=0
401## END
402
403#### builtin cat non nonexistent file
404case $SH in
405 *osh) prefix='builtin' ;;
406 *) prefix='' ;;
407esac
408
409echo FOO > foo
410
411$prefix cat foo nonexistent foo
412echo status=$?
413
414## STDOUT:
415FOO
416FOO
417status=1
418## END
419
420#### builtin cat accept - for stdin
421case $SH in
422 *osh) prefix='builtin' ;;
423 *) prefix='' ;;
424esac
425
426echo FOO > foo
427seq 3 4 | $prefix cat foo - foo foo
428
429echo ---
430
431# second - is a no-op
432seq 5 6 | $prefix cat - -
433
434## STDOUT:
435FOO
4363
4374
438FOO
439FOO
440---
4415
4426
443## END
444
445#### builtin rm: usage, removing files
446case $SH in
447 *osh) prefix='builtin' ;;
448 *) prefix='' ;;
449esac
450
451$prefix rm
452if test "$?" != 0; then echo ok; fi
453
454$prefix rm --
455if test "$?" != 0; then echo ok; fi
456
457$prefix rm -- nonexistent
458echo status=$?
459
460touch foo bar
461$prefix rm -- foo bar
462echo status=$?
463
464if test -f foo; then echo fail; fi
465if test -f bar; then echo fail; fi
466
467## STDOUT:
468ok
469ok
470status=1
471status=0
472## END
473
474#### builtin rm -f - ignores arguments that don't exist
475case $SH in
476 *osh) prefix='builtin' ;;
477 *) prefix='' ;;
478esac
479
480touch foo bar
481$prefix rm -- foo OOPS bar
482echo status=$?
483
484if test -f foo; then echo fail; fi
485if test -f bar; then echo fail; fi
486
487touch foo bar
488$prefix rm -f -- foo OOPS bar
489echo status=$?
490
491if test -f foo; then echo fail; fi
492if test -f bar; then echo fail; fi
493
494## STDOUT:
495status=1
496status=0
497## END
498
499#### builtin rm -f - still fails when file can't be removed
500
501mkdir read-only
502touch read-only/stuck
503chmod -w read-only
504ls -l stuck
505
506touch foo bar
507$prefix rm -- read-only/stuck foo bar
508echo status=$?
509
510if test -f foo; then echo fail; fi
511if test -f bar; then echo fail; fi
512
513ls read-only/stuck
514
515touch foo bar
516$prefix rm -- read-only/stuck foo bar
517echo status=$?
518
519# Clean up for real
520chmod +w read-only
521$prefix rm -- read-only/stuck
522echo status=$?
523
524if test -f read-only/stuck; then echo fail; fi
525
526## STDOUT:
527status=1
528read-only/stuck
529status=1
530status=0
531## END
532
533#### builtin rm -f allows empty arg list
534case $SH in
535 *osh) prefix='builtin' ;;
536 *) prefix='' ;;
537esac
538
539$prefix rm -f
540echo status=$?
541
542## STDOUT:
543status=0
544## END
545
546#### builtin rm always fails on directories (regardless of -f)
547case $SH in
548 *osh) prefix='builtin' ;;
549 *) prefix='' ;;
550esac
551
552touch foo bar
553mkdir -p tmp
554$prefix rm -- foo tmp bar
555echo status=$?
556
557if test -f foo; then echo fail; fi
558if test -f bar; then echo fail; fi
559
560touch foo bar
561mkdir -p tmp
562$prefix rm -f -- foo tmp bar
563echo status=$?
564
565if test -f foo; then echo fail; fi
566if test -f bar; then echo fail; fi
567
568## STDOUT:
569status=1
570status=1
571## END
572
573#### builtin readlink
574case $SH in bash) exit ;; esac
575
576echo TODO
577
578# turn this into a builtin
579# does that mean any builtin can be externalized?
580# - [ aka test is a good candiate
581# - we have stubs from true/false
582
583## STDOUT:
584## END
585
586## N-I bash STDOUT:
587## END
588
589#### compgen -A builtin doesn't find private builtins
590
591compgen -A builtin slee
592echo status=$?
593
594## STDOUT:
595status=1
596## END