1 | ## oils_failures_allowed: 6
|
2 |
|
3 | #### source-guard is an old way of preventing redefinition - could remove it
|
4 | shopt --set ysh:upgrade
|
5 |
|
6 | source-guard 'main' || return 0
|
7 | source $REPO_ROOT/spec/testdata/module/common.ysh
|
8 | source $REPO_ROOT/spec/testdata/module/module1.ysh
|
9 | ## STDOUT:
|
10 | common
|
11 | module1
|
12 | ## END
|
13 |
|
14 | #### is-main
|
15 |
|
16 | # This sources lib.ysh
|
17 | $SH $REPO_ROOT/spec/testdata/module/main.ysh
|
18 |
|
19 | # Run it directly
|
20 | $SH $REPO_ROOT/spec/testdata/module/lib.ysh
|
21 |
|
22 | ## STDOUT:
|
23 | lib.ysh is not the main module
|
24 | hi from main.ysh
|
25 | hi from lib.ysh
|
26 | ## END
|
27 |
|
28 | #### is-main with -c and stdin
|
29 |
|
30 | $SH -c 'echo -c; is-main; echo status=$?'
|
31 |
|
32 | echo 'echo stdin; is-main; echo status=$?' | $SH
|
33 |
|
34 | ## STDOUT:
|
35 | -c
|
36 | status=0
|
37 | stdin
|
38 | status=0
|
39 | ## END
|
40 |
|
41 | #### use builtin usage
|
42 |
|
43 | use
|
44 | echo no-arg=$?
|
45 |
|
46 | use foo
|
47 | echo one-arg=$?
|
48 |
|
49 | use --extern foo
|
50 | echo extern=$?
|
51 |
|
52 | use --bad-flag
|
53 | echo bad-flag=$?
|
54 |
|
55 | use too many
|
56 | echo too-many=$?
|
57 |
|
58 | use ///no-builtin
|
59 | echo no-builtin=$?
|
60 |
|
61 |
|
62 | ## STDOUT:
|
63 | no-arg=2
|
64 | one-arg=1
|
65 | extern=0
|
66 | bad-flag=2
|
67 | too-many=2
|
68 | no-builtin=1
|
69 | ## END
|
70 |
|
71 |
|
72 | #### use --extern is a no-op, for static analysis
|
73 |
|
74 | use --extern grep sed awk
|
75 | echo status=$?
|
76 |
|
77 | use --extern zzz
|
78 | echo status=$?
|
79 |
|
80 | ## STDOUT:
|
81 | status=0
|
82 | status=0
|
83 | ## END
|
84 |
|
85 | #### use foo.ysh creates a value.Obj, and it's cached on later invocations
|
86 |
|
87 | shopt --set ysh:upgrade
|
88 |
|
89 | var caller_no_leak = 42
|
90 |
|
91 | use $REPO_ROOT/spec/testdata/module2/util.ysh
|
92 |
|
93 | # This is a value.Obj
|
94 | pp test_ (['util', util])
|
95 | var id1 = id(util)
|
96 |
|
97 | var saved_util = util
|
98 |
|
99 | use $REPO_ROOT/spec/testdata/module2/util.ysh
|
100 | pp test_ (['repeated', util])
|
101 | var id2 = id(util)
|
102 |
|
103 | # Create a symlink to test normalization
|
104 |
|
105 | ln -s $REPO_ROOT/spec/testdata/module2/util.ysh symlink.ysh
|
106 |
|
107 | use symlink.ysh
|
108 | pp test_ (['symlink', symlink])
|
109 | var id3 = id(symlink)
|
110 |
|
111 | #pp test_ ([id1, id2, id3])
|
112 |
|
113 | # Make sure they are all the same object
|
114 | assert [id1 === id2]
|
115 | assert [id2 === id3]
|
116 |
|
117 | # Doesn't leak from util.ysh
|
118 | echo "setvar_noleak $[getVar('setvar_noleak')]"
|
119 | echo "setglobal_noleak $[getVar('setglobal_noleak')]"
|
120 |
|
121 | ## STDOUT:
|
122 | caller_no_leak = null
|
123 | (List) ["util",{"MY_INTEGER":42,"log":<Proc>,"die":<Proc>,"setvar_noleak":"util.ysh","setglobal_noleak":"util.ysh"}]
|
124 | (List) ["repeated",{"MY_INTEGER":42,"log":<Proc>,"die":<Proc>,"setvar_noleak":"util.ysh","setglobal_noleak":"util.ysh"}]
|
125 | (List) ["symlink",{"MY_INTEGER":42,"log":<Proc>,"die":<Proc>,"setvar_noleak":"util.ysh","setglobal_noleak":"util.ysh"}]
|
126 | setvar_noleak null
|
127 | setglobal_noleak null
|
128 | ## END
|
129 |
|
130 | #### procs in a module can call setglobal on globals in that module
|
131 | shopt --set ysh:upgrade
|
132 |
|
133 | use $REPO_ROOT/spec/testdata/module2/globals.ysh
|
134 |
|
135 | # get() should work on Obj too. Possibly we should get rid of the default
|
136 | var myproc = get(propView(globals), 'mutate-g1', null)
|
137 | call setVar('mutate-g1', myproc)
|
138 |
|
139 | # you can mutate it internally, but the mutation isn't VISIBLE. GAH!
|
140 | # I wonder if you make Cell a value? or something
|
141 | mutate-g1
|
142 | echo
|
143 |
|
144 | # PROBLEM: This is a value.Obj COPY, not the fucking original!!!
|
145 | # immutable objects??
|
146 |
|
147 | #pp test_ ([id(globals.d), globals.d])
|
148 |
|
149 | call globals.mutateG2()
|
150 | echo
|
151 |
|
152 | #= propView(globals)
|
153 |
|
154 | # these are not provided
|
155 | echo "globals.g1 = $[get(globals, 'g1', null)]"
|
156 | echo "globals.g2 = $[get(globals, 'g2', null)]"
|
157 | echo
|
158 |
|
159 | #pp frame_vars_
|
160 | # Shouldn't appear here
|
161 | echo "importer g1 = $[getVar('g1')]"
|
162 | echo "importer g2 = $[getVar('g2')]"
|
163 |
|
164 | ## STDOUT:
|
165 | g1 = g1
|
166 | g1 = proc mutated
|
167 |
|
168 | g2 = g2
|
169 | g2 = func mutated
|
170 |
|
171 | globals.g1 = null
|
172 | globals.g2 = null
|
173 |
|
174 | importer g1 = null
|
175 | importer g2 = null
|
176 | ## END
|
177 |
|
178 | #### no provided names
|
179 | shopt --set ysh:upgrade
|
180 |
|
181 | use $REPO_ROOT/spec/testdata/module2/no-provide.ysh
|
182 |
|
183 | ## status: 1
|
184 | ## STDOUT:
|
185 | ## END
|
186 |
|
187 | #### bad provide type
|
188 | shopt --set ysh:upgrade
|
189 |
|
190 | use $REPO_ROOT/spec/testdata/module2/bad-provide-type.ysh
|
191 |
|
192 | ## status: 1
|
193 | ## STDOUT:
|
194 | ## END
|
195 |
|
196 | #### invalid provide entries
|
197 | shopt --set ysh:upgrade
|
198 |
|
199 | use $REPO_ROOT/spec/testdata/module2/bad-provide.ysh
|
200 |
|
201 | ## status: 1
|
202 | ## STDOUT:
|
203 | ## END
|
204 |
|
205 | #### use foo.ysh creates a value.Obj with __invoke__
|
206 | shopt --set ysh:upgrade
|
207 |
|
208 | use $REPO_ROOT/spec/testdata/module2/util.ysh
|
209 |
|
210 | # This is a value.Obj
|
211 | pp test_ (util)
|
212 |
|
213 | util log 'hello'
|
214 | util die 'hello'
|
215 |
|
216 | ## STDOUT:
|
217 | ## END
|
218 |
|
219 | #### circular import is an error?
|
220 |
|
221 | echo hi
|
222 |
|
223 | ## STDOUT:
|
224 | ## END
|
225 |
|
226 |
|
227 | #### user can inspect __modules__ cache
|
228 |
|
229 | echo 'TODO: Dict view of realpath() string -> Obj instance'
|
230 |
|
231 | ## STDOUT:
|
232 | ## END
|
233 |
|
234 | #### use foo.ysh --pick a b
|
235 |
|
236 | echo TODO
|
237 |
|
238 | ## STDOUT:
|
239 | ## END
|
240 |
|
241 |
|
242 | #### use foo.ysh --all-provided
|
243 |
|
244 | echo TODO
|
245 |
|
246 | ## STDOUT:
|
247 | ## END
|
248 |
|
249 |
|
250 | #### use foo.ysh --all-for-testing
|
251 |
|
252 | echo TODO
|
253 |
|
254 | ## STDOUT:
|
255 | ## END
|