OILS / spec / ysh-builtin-module.test.sh View on Github | oilshell.org

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