1 ## our_shell: ysh
2 ## oils_failures_allowed: 2
3
4 #### fastlex: NUL byte not allowed inside char literal #' '
5
6 echo $'var x = #\'\x00\'; echo x=$x' > tmp.oil
7 $[ENV.SH] tmp.oil
8
9 echo $'var x = #\' ' > incomplete.oil
10 $[ENV.SH] incomplete.oil
11
12 ## status: 2
13 ## STDOUT:
14 ## END
15
16 #### fastlex: NUL byte inside shebang line
17
18 # Hm this test doesn't really tickle the bug
19
20 echo $'#! /usr/bin/env \x00 sh \necho hi' > tmp.oil
21 env OILS_HIJACK_SHEBANG=1 $[ENV.SH] tmp.oil
22
23 ## STDOUT:
24 hi
25 ## END
26
27 #### Tea keywords don't interfere with YSH expressions
28
29 var d = {data: 'foo'}
30
31 echo $[d.data]
32
33 var e = {enum: 1, class: 2, import: 3, const: 4, var: 5, set: 6}
34 echo $[len(e)]
35
36 ## STDOUT:
37 foo
38 6
39 ## END
40
41 #### Catch AttributeError
42
43 var s = 'foo'
44 echo s=$s
45 var t = s.bad()
46 echo 'should not get here'
47
48 ## status: 3
49 ## STDOUT:
50 s=foo
51 ## END
52
53
54 #### Command sub paren parsing bug (#1387)
55
56 write $(if (true) { write true })
57
58 const a = $(write $[len('foo')])
59 echo $a
60
61 const b = $(write $[5 ** 3])
62 echo $b
63
64 const c = $(
65 write $[6 + 7]
66 )
67 echo $c
68
69 ## STDOUT:
70 true
71 3
72 125
73 13
74 ## END
75
76
77 #### More Command sub paren parsing
78
79 write $( var mylist = ['for']; for x in (mylist) { echo $x } )
80
81 write $( echo while; while (false) { write hi } )
82
83 write $( if (true) { write 'if' } )
84
85 write $( if (false) { write 'if' } elif (true) { write 'elif' } )
86
87 ## STDOUT:
88 for
89 while
90 if
91 elif
92 ## END
93
94 #### don't execute empty command
95
96 shopt --set ysh:all
97
98 set -x
99
100 try {
101 type -a ''
102 }
103 echo "type -a returned $_status"
104
105 $(true)
106 echo nope
107
108 ## status: 127
109 ## STDOUT:
110 type -a returned 1
111 ## END
112
113
114 #### Do && || with YSH constructs make sense/
115
116 # I guess there's nothing wrong with this?
117 #
118 # But I generally feel && || are only for
119 #
120 # test --file x && test --file y
121
122 var x = []
123 true && call x->append(42)
124 false && call x->append(43)
125 pp test_ (x)
126
127 func amp() {
128 true && return (42)
129 }
130
131 func pipe() {
132 false || return (42)
133 }
134
135 pp test_ (amp())
136 pp test_ (pipe())
137
138 ## STDOUT:
139 ## END
140
141
142 #### shvar then replace - bug #1986 context manager crash
143
144 shvar FOO=bar {
145 for x in (1 ..< 500) {
146 var Q = "hello"
147 setvar Q = Q=>replace("hello","world")
148 }
149 }
150 echo $Q
151
152 ## STDOUT:
153 world
154 ## END
155
156
157 #### Parsing crash - bug #2003
158
159 set +o errexit
160
161 $[ENV.SH] -c 'proc y (;x) { return = x }'
162 echo status=$?
163
164 $[ENV.SH] -c 'func y (;x) { return = x }'
165 echo status=$?
166
167 ## STDOUT:
168 status=2
169 status=2
170 ## END
171
172
173 #### proc with IFS= read -r line - dynamic scope - issue #2012
174
175 # 2024-10 - FIXED by the new Env Obj! Because in YSH, 'line' is NOT created in
176 # TEMP stack frame - we use the ENCLOSED frame, and it fixes it.
177
178 proc p {
179 read -r line
180 write $line
181 }
182
183 proc p-ifs {
184 IFS= read -r line
185 write $line
186 }
187
188 #set -x
189
190 echo zz | p
191
192 echo yy | p-ifs
193
194 ## STDOUT:
195 zz
196 yy
197 ## END
198
199 #### func call inside proc call - error message attribution
200
201 try 2> foo {
202 $[ENV.SH] -c '
203 func ident(x) {
204 return (x)
205 }
206
207 proc p (; x) {
208 echo $x
209 }
210
211 # BUG: it points to ( in ident(
212 # should point to ( in eval (
213
214 eval (ident([1,2,3]))
215 '
216 }
217
218 cat foo
219
220 ## STDOUT:
221 ## END
222
223
224 #### Crash in parsing case on EOF condition - issue #2037
225
226 var WEIGHT = ${1:-}
227 case (WEIGHT) {
228 "-" { echo "got nothing" }
229 (else) { echo $WEIGHT
230 }
231
232 ## status: 2
233 ## STDOUT:
234 ## END
235
236 #### Crash due to incorrect of context manager rooting - issue #1986
237
238 proc p {
239 var s = "hi"
240 for q in (1..<50) {
241 shvar Q="whatever" {
242 setvar s = "." ++ s
243 }
244 }
245 }
246
247 for i in (1..<10) {
248 p
249 }
250
251 if false {
252 echo 'testing for longer'
253 for i in (1 ..< 1000) {
254 p
255 }
256 }
257
258 ## STDOUT:
259 ## END
260
261
262 #### crash due to arbitrary PNode limit - issue #2078
263
264 #!/usr/bin/env ysh
265 var DelegatedCompName = {
266 "llvm" : "x_project",
267 "rocprofiler_register" : "x_rocprofiler_register",
268 "roct_thunk_interface" : "x_roct",
269 "rocr_runtime" : "x_rocr",
270 "openmp" : "x_openmp",
271 "offload" : "x_offload",
272 "aomp_extras" : "x_extras",
273 "comgr" : "x_comgr",
274 "rocminfo" : "x_rocminfo",
275 "rocsmilib" : "x_rocm_smi_lib",
276 "amdsmi" : "x_amdsmi",
277 "flang_legacy" : "x_flang_legacy",
278 "pgmath" : "x_pgmath",
279 "flang" : "x_flang",
280 "flang_runtime" : "x_flang_runtime",
281 "hipcc" : "x_hipcc",
282 "hipamd" : "x_hipamd",
283 "rocm_dbgapi" : "x_rocdbgapi",
284 "rocgdb" : "x_rocgdb",
285 "roctracer" : "x_roctracer",
286 "rocprofiler" : "x_rocprofiler"
287 }
288
289 echo $[len(DelegatedCompName)]
290
291 ## STDOUT:
292 21
293 ## END
294
295 #### bad assertion when pretty printing
296
297 pp value (__builtins__) > /dev/null
298 echo status=$?
299
300 ## STDOUT:
301 status=0
302 ## END