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

151 lines, 80 significant
1## our_shell: ysh
2## oils_failures_allowed: 1
3
4#### Command.sourceCode() on literal block: p { echo hi }
5
6proc p ( ; ; ; block) {
7 var src = block.sourceCode()
8 echo $[src.code_str] > out.ysh
9
10 # don't assert this yet, because whitespace can change
11 call src->erase('code_str')
12
13 json write (src)
14
15 # New location is out.ysh:4
16 $[ENV.SH] out.ysh || true
17
18 echo ---
19
20 #echo 'zz (' > bad.ysh
21
22 # Original location is [ stdin ]:20
23 ... $[ENV.SH]
24 --location-str $[src.location_str]
25 --location-start-line $[src.location_start_line]
26 out.ysh
27 || true
28 ;
29}
30
31p {
32 echo 1
33 echo 2
34 false
35 echo 3
36}
37
38## STDOUT:
39{
40 "location_str": "[ stdin ]",
41 "location_start_line": 22
42}
431
442
45---
461
472
48## END
49
50
51#### Command.sourceCode() on Expr: ^(echo 1; echo 2)
52
53var cmd = ^(echo 1; echo 2; false)
54
55var src = cmd.sourceCode()
56
57assert [null === src]
58
59# Test passing it
60proc p ( ; ; ; block) {
61 pp test_ (block)
62 assert [null === block.sourceCode()]
63}
64
65p ( ; ; cmd)
66
67## STDOUT:
68<Command>
69## END
70
71
72#### Command.sourceCode() works with reparsing, e.g. backticks
73
74# TODO: fix this bug - same as Hay bug
75
76proc p ( ; ; ; block) {
77 var src = block.sourceCode()
78
79 pp test_ (src.code_str)
80
81 # Re-parsing messes this up
82 #echo $[src.code_str]
83 #echo
84}
85
86shopt --set parse_backticks
87
88p {
89 echo "greeting `echo backticks`"
90}
91
92shopt --set parse_sh_arith
93
94p {
95 array_lhs[i++]=y
96}
97
98shopt --set expand_aliases
99
100alias e='echo alias'
101
102p {
103 e foo
104}
105
106# alias that combines the problematic features
107alias e2='a[0+2+3]=x; echo `echo bacticks`'
108
109p {
110 e2 zzz
111 #e2 e2 zzz
112}
113
114## STDOUT:
115(Str) " \n echo \"greeting `echo backticks`\"\n"
116(Str) " \n array_lhs[i++]=y\n"
117(Str) " \n e foo\n"
118(Str) " \n e2 zzz\n"
119## END
120
121
122#### Command.sourceCode() works in nested blocks
123
124proc p ( ; ; ; block) {
125 var src = block.sourceCode()
126
127 pp test_ (src.code_str)
128
129 call io->eval(block)
130}
131
132
133shopt --set parse_backticks
134shopt --set parse_sh_arith
135shopt --set expand_aliases
136
137p {
138 echo foo
139}
140
141p {
142 #a[0]=`echo foo`
143 echo foo
144 p {
145 #a[inner]=`echo foo`
146 echo inner
147 }
148}
149
150## STDOUT:
151## END