vbscript: Added Exit Function statement implementation.
[wine] / dlls / vbscript / tests / lang.vbs
1 '
2 ' Copyright 2011 Jacek Caban for CodeWeavers
3 '
4 ' This library is free software; you can redistribute it and/or
5 ' modify it under the terms of the GNU Lesser General Public
6 ' License as published by the Free Software Foundation; either
7 ' version 2.1 of the License, or (at your option) any later version.
8 '
9 ' This library is distributed in the hope that it will be useful,
10 ' but WITHOUT ANY WARRANTY; without even the implied warranty of
11 ' MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12 ' Lesser General Public License for more details.
13 '
14 ' You should have received a copy of the GNU Lesser General Public
15 ' License along with this library; if not, write to the Free Software
16 ' Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
17 '
18
19 Option Explicit
20
21 dim x, y
22
23 call ok(true, "true is not true?")
24 ok true, "true is not true?"
25 call ok((true), "true is not true?")
26
27 ok not false, "not false but not true?"
28 ok not not true, "not not true but not true?"
29
30 Call ok(true = true, "true = true is false")
31 Call ok(false = false, "false = false is false")
32 Call ok(not (true = false), "true = false is true")
33 Call ok("x" = "x", """x"" = ""x"" is false")
34 Call ok(empty = empty, "empty = empty is false")
35 Call ok(empty = "", "empty = """" is false")
36 Call ok(0 = 0.0, "0 <> 0.0")
37 Call ok(16 = &h10&, "16 <> &h10&")
38 Call ok(010 = 10, "010 <> 10")
39 Call ok(10. = 10, "10. <> 10")
40 Call ok(&hffFFffFF& = -1, "&hffFFffFF& <> -1")
41 Call ok(&hffFFffFF& = -1, "&hffFFffFF& <> -1")
42 Call ok(--1 = 1, "--1 = " & --1)
43 Call ok(-empty = 0, "-empty = " & (-empty))
44
45 x = "xx"
46 Call ok(x = "xx", "x = " & x & " expected ""xx""")
47
48 Call ok(true <> false, "true <> false is false")
49 Call ok(not (true <> true), "true <> true is true")
50 Call ok(not ("x" <> "x"), """x"" <> ""x"" is true")
51 Call ok(not (empty <> empty), "empty <> empty is true")
52 Call ok(x <> "x", "x = ""x""")
53
54 Call ok(getVT(false) = "VT_BOOL", "getVT(false) is not VT_BOOL")
55 Call ok(getVT(true) = "VT_BOOL", "getVT(true) is not VT_BOOL")
56 Call ok(getVT("") = "VT_BSTR", "getVT("""") is not VT_BSTR")
57 Call ok(getVT("test") = "VT_BSTR", "getVT(""test"") is not VT_BSTR")
58 Call ok(getVT(Empty) = "VT_EMPTY", "getVT(Empty) is not VT_EMPTY")
59 Call ok(getVT(null) = "VT_NULL", "getVT(null) is not VT_NULL")
60 Call ok(getVT(0) = "VT_I2", "getVT(0) is not VT_I2")
61 Call ok(getVT(1) = "VT_I2", "getVT(1) is not VT_I2")
62 Call ok(getVT(0.5) = "VT_R8", "getVT(0.5) is not VT_R8")
63 Call ok(getVT(0.0) = "VT_R8", "getVT(0.0) is not VT_R8")
64 Call ok(getVT(2147483647) = "VT_I4", "getVT(2147483647) is not VT_I4")
65 Call ok(getVT(2147483648) = "VT_R8", "getVT(2147483648) is not VT_R8")
66 Call ok(getVT(&h10&) = "VT_I2", "getVT(&h10&) is not VT_I2")
67 Call ok(getVT(&h10000&) = "VT_I4", "getVT(&h10000&) is not VT_I4")
68 Call ok(getVT(&H10000&) = "VT_I4", "getVT(&H10000&) is not VT_I4")
69 Call ok(getVT(&hffFFffFF&) = "VT_I2", "getVT(&hffFFffFF&) is not VT_I2")
70 Call ok(getVT(1 & 100000) = "VT_BSTR", "getVT(1 & 100000) is not VT_BSTR")
71 Call ok(getVT(-empty) = "VT_I2", "getVT(-empty) = " & getVT(-empty))
72 Call ok(getVT(-null) = "VT_NULL", "getVT(-null) = " & getVT(-null))
73 Call ok(getVT(y) = "VT_EMPTY*", "getVT(y) = " & getVT(y))
74 x = true
75 Call ok(getVT(x) = "VT_BOOL*", "getVT(x) = " & getVT(x))
76
77 x = "xx"
78 Call ok("ab" & "cd" = "abcd", """ab"" & ""cd"" <> ""abcd""")
79 Call ok("ab " & null = "ab ", """ab"" & null = " & ("ab " & null))
80 Call ok("ab " & empty = "ab ", """ab"" & empty = " & ("ab " & empty))
81 Call ok(1 & 100000 = "1100000", "1 & 100000 = " & (1 & 100000))
82 Call ok("ab" & x = "abxx", """ab"" & x = " & ("ab"&x))
83
84 if(isEnglishLocale) then
85     Call ok("" & true = "True", """"" & true = " & true)
86     Call ok(true & false = "TrueFalse", "true & false = " & (true & false))
87 end if
88
89 x = 3
90 Call ok(2+2 = 4, "2+2 = " & (2+2))
91 Call ok(false + 6 + true = 5, "false + 6 + true <> 5")
92 Call ok(getVT(2+null) = "VT_NULL", "getVT(2+null) = " & getVT(2+null))
93 Call ok(2+empty = 2, "2+empty = " & (2+empty))
94 Call ok(x+x = 6, "x+x = " & (x+x))
95
96 Call ok(5-1 = 4, "5-1 = " & (5-1))
97 Call ok(3+5-true = 9, "3+5-true <> 9")
98 Call ok(getVT(2-null) = "VT_NULL", "getVT(2-null) = " & getVT(2-null))
99 Call ok(2-empty = 2, "2-empty = " & (2-empty))
100 Call ok(2-x = -1, "2-x = " & (2-x))
101
102 Call ok(9 Mod 6 = 3, "9 Mod 6 = " & (9 Mod 6))
103 Call ok(11.6 Mod 5.5 = False, "11.6 Mod 5.5 = " & (11.6 Mod 5.5 = 0.6))
104 Call ok(7 Mod 4+2 = 5, "7 Mod 4+2 <> 5")
105 Call ok(getVT(2 mod null) = "VT_NULL", "getVT(2 mod null) = " & getVT(2 mod null))
106 Call ok(getVT(null mod 2) = "VT_NULL", "getVT(null mod 2) = " & getVT(null mod 2))
107 'FIXME: Call ok(empty mod 2 = 0, "empty mod 2 = " & (empty mod 2))
108
109 Call ok(5 \ 2 = 2, "5 \ 2 = " & (5\2))
110 Call ok(4.6 \ 1.5 = 2, "4.6 \ 1.5 = " & (4.6\1.5))
111 Call ok(4.6 \ 1.49 = 5, "4.6 \ 1.49 = " & (4.6\1.49))
112 Call ok(2+3\4 = 2, "2+3\4 = " & (2+3\4))
113
114 Call ok(2*3 = 6, "2*3 = " & (2*3))
115 Call ok(3/2 = 1.5, "3/2 = " & (3/2))
116 Call ok(5\4/2 = 2, "5\4/2 = " & (5\2/1))
117 Call ok(12/3\2 = 2, "12/3\2 = " & (12/3\2))
118
119 Call ok(2^3 = 8, "2^3 = " & (2^3))
120 Call ok(2^3^2 = 64, "2^3^2 = " & (2^3^2))
121 Call ok(-3^2 = 9, "-3^2 = " & (-3^2))
122 Call ok(2*3^2 = 18, "2*3^2 = " & (2*3^2))
123
124 if false then
125     ok false, "if false called"
126 end if
127
128 x = true
129 if x then
130     x = false
131 end if
132 Call ok(not x, "x is false, if not evaluated?")
133
134 x = false
135 If false Then
136    Call ok(false, "inside if false")
137 Else
138    x = true
139 End If
140 Call ok(x, "else not called?")
141
142 x = false
143 If false Then
144    Call ok(false, "inside if false")
145 ElseIf not True Then
146    Call ok(false, "inside elseif not true")
147 Else
148    x = true
149 End If
150 Call ok(x, "else not called?")
151
152 x = false
153 If false Then
154    Call ok(false, "inside if false")
155    x = 1
156    y = 10+x
157 ElseIf not False Then
158    x = true
159 Else
160    Call ok(false, "inside else not true")
161 End If
162 Call ok(x, "elseif not called?")
163
164 x = false
165 If false Then
166    Call ok(false, "inside if false")
167 ElseIf not False Then
168    x = true
169 End If
170 Call ok(x, "elseif not called?")
171
172 if false then
173 Sub testsub
174     x = true
175 End Sub
176 end if
177
178 x = false
179 Call testsub
180 Call ok(x, "x is false, testsub not called?")
181
182 Sub SubSetTrue(v)
183     Call ok(not v, "v is not true")
184     v = true
185 End Sub
186
187 x = false
188 SubSetTrue x
189 Call ok(x, "x was not set by SubSetTrue")
190
191 SubSetTrue false
192 Call ok(not false, "false is no longer false?")
193
194 Sub SubSetTrue2(ByRef v)
195     Call ok(not v, "v is not true")
196     v = true
197 End Sub
198
199 x = false
200 SubSetTrue2 x
201 Call ok(x, "x was not set by SubSetTrue")
202
203 Sub TestSubArgVal(ByVal v)
204     Call ok(not v, "v is not false")
205     v = true
206     Call ok(v, "v is not true?")
207 End Sub
208
209 x = false
210 Call TestSubArgVal(x)
211 Call ok(not x, "x is true after TestSubArgVal call?")
212
213 Sub TestSubMultiArgs(a,b,c,d,e)
214     Call ok(a=1, "a = " & a)
215     Call ok(b=2, "b = " & b)
216     Call ok(c=3, "c = " & c)
217     Call ok(d=4, "d = " & d)
218     Call ok(e=5, "e = " & e)
219 End Sub
220
221 Sub TestSubExit(ByRef a)
222     If a Then
223         Exit Sub
224     End If
225     Call ok(false, "Exit Sub not called?")
226 End Sub
227
228 Call TestSubExit(true)
229
230 TestSubMultiArgs 1, 2, 3, 4, 5
231 Call TestSubMultiArgs(1, 2, 3, 4, 5)
232
233 Sub TestSubLocalVal
234     x = false
235     Call ok(not x, "local x is not false?")
236     Dim x
237 End Sub
238
239 x = true
240 y = true
241 Call TestSubLocalVal
242 Call ok(x, "global x is not true?")
243
244 if false then
245 Function testfunc
246     x = true
247 End Function
248 end if
249
250 x = false
251 Call TestFunc
252 Call ok(x, "x is false, testfunc not called?")
253
254 Function FuncSetTrue(v)
255     Call ok(not v, "v is not true")
256     v = true
257 End Function
258
259 x = false
260 FuncSetTrue x
261 Call ok(x, "x was not set by FuncSetTrue")
262
263 FuncSetTrue false
264 Call ok(not false, "false is no longer false?")
265
266 Function FuncSetTrue2(ByRef v)
267     Call ok(not v, "v is not true")
268     v = true
269 End Function
270
271 x = false
272 FuncSetTrue2 x
273 Call ok(x, "x was not set by FuncSetTrue")
274
275 Function TestFuncArgVal(ByVal v)
276     Call ok(not v, "v is not false")
277     v = true
278     Call ok(v, "v is not true?")
279 End Function
280
281 x = false
282 Call TestFuncArgVal(x)
283 Call ok(not x, "x is true after TestFuncArgVal call?")
284
285 Function TestFuncMultiArgs(a,b,c,d,e)
286     Call ok(a=1, "a = " & a)
287     Call ok(b=2, "b = " & b)
288     Call ok(c=3, "c = " & c)
289     Call ok(d=4, "d = " & d)
290     Call ok(e=5, "e = " & e)
291 End Function
292
293 TestFuncMultiArgs 1, 2, 3, 4, 5
294 Call TestFuncMultiArgs(1, 2, 3, 4, 5)
295
296 Function TestFuncLocalVal
297     x = false
298     Call ok(not x, "local x is not false?")
299     Dim x
300 End Function
301
302 x = true
303 y = true
304 Call TestFuncLocalVal
305 Call ok(x, "global x is not true?")
306
307 Function TestFuncExit(ByRef a)
308     If a Then
309         Exit Function
310     End If
311     Call ok(false, "Exit Function not called?")
312 End Function
313
314 Call TestFuncExit(true)
315
316 reportSuccess()