1 ## oils_failures_allowed: 1
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 #### use foo.ysh creates a value.Obj with __invoke__
131 shopt --set ysh:upgrade
132
133 use $REPO_ROOT/spec/testdata/module2/util.ysh
134
135 # This is a value.Obj
136 pp test_ (util)
137
138 util log 'hello'
139 util die 'hello'
140
141 ## STDOUT:
142 ## END
143