1 | ## our_shell: ysh
|
2 | ## oils_failures_allowed: 3
|
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
|
303 |
|
304 | #### Another "stealing stdin" issue with spec tests
|
305 |
|
306 | proc where2(; pred) {
|
307 | for line in (io.stdin) {
|
308 | pp test_ (line)
|
309 | }
|
310 | }
|
311 |
|
312 | seq 5 | where2 [_line ~== 2 or _line ~== 4]
|
313 |
|
314 | #{ echo 1; echo 2; } | where2 [_line ~== 2 or _line ~== 4]
|
315 |
|
316 | # empty lines here get put on stdin
|
317 |
|
318 | ## STDOUT:
|
319 | (Str) "1"
|
320 | (Str) "2"
|
321 | (Str) "3"
|
322 | (Str) "4"
|
323 | (Str) "5"
|
324 | ## END
|