1rem *************************************************************
2rem
3rem  Licensed to the Apache Software Foundation (ASF) under one
4rem  or more contributor license agreements.  See the NOTICE file
5rem  distributed with this work for additional information
6rem  regarding copyright ownership.  The ASF licenses this file
7rem  to you under the Apache License, Version 2.0 (the
8rem  "License"); you may not use this file except in compliance
9rem  with the License.  You may obtain a copy of the License at
10rem
11rem    http://www.apache.org/licenses/LICENSE-2.0
12rem
13rem  Unless required by applicable law or agreed to in writing,
14rem  software distributed under the License is distributed on an
15rem  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16rem  KIND, either express or implied.  See the License for the
17rem  specific language governing permissions and limitations
18rem  under the License.
19rem
20rem *************************************************************
21REM  *****  BASIC  *****
22
23
24OPTION EXPLICIT
25OPTION COMPATIBLE
26
27Sub Main
28COMPATIBILITYMODE(true)
29
30If runtest = -1 Then
31  MsgBox "Test Failed!!!"
32Else
33  MsgBox "Test Succeeded"
34End If
35
36End Sub
37
38Function runtest() As Integer
39Dim inBool As Boolean, inBool2 As Boolean, outBool As Boolean
40Dim inByte As Integer, inByte2 As Integer
41Dim inShort As Integer, inShort2 As Integer
42Dim inLong As Long, inLong2 As Long, inLong3 As Long, inLong4 As Long
43Dim inString As String, inString2 As String
44Dim inFloat As Single, inFloat2 As Single
45Dim inDouble As Double, inDouble2 As Double
46Dim inVariant, inVariant2
47Dim inAr, inAr2
48Dim inDate As Date,inDate2 As Date, outDate As Date
49Dim inCurrency As Currency, inCurrency2 As Currency, outCurrency As Currency
50Dim inSCode As New com.sun.star.bridge.oleautomation.SCode
51Dim inSCode2 As New com.sun.star.bridge.oleautomation.SCode
52Dim inDecimal As Variant, inDecimal2 As Variant, outDecimal As Variant
53Dim inrefDecimal As Variant, outrefDecimal As Variant
54Dim outSCode As New com.sun.star.bridge.oleautomation.SCode
55Dim outByte As Integer
56Dim outShort As Integer
57Dim outLong, outLong2 As Long
58Dim outString As String
59Dim outFloat As Single
60Dim outDouble As Double
61Dim outVariant
62'bug #109936 causes an errOr when outObject is used As out param
63Dim inObject As Object, inObject2 As Object, outObject As Object
64Dim objNOTHING As Object
65Dim inUnknown As Object, inUnknown2 As Object, outUnknown As Object
66
67Dim inArray, outArray, outArray2
68Dim len1, len2
69Dim arString(1) As String
70arString(0)= "String one"
71arString(1)= "String two"
72
73Dim factory As Object
74factory= createUnoService("com.sun.star.bridge.OleObjectFactory")
75Dim obj As Object
76obj= factory.createInstance("AxTestComponents.Basic")
77
78Dim objFoo As Object
79objFoo = factory.createInstance("AxTestComponents.Foo")
80
81
82'in parameter -------------------------------------------------------------------
83inBool = true
84inByte = 10
85inShort = 11
86inLong = 111
87inString = "Hello World"
88inFloat = 3.14
89inDouble = 3.145
90inVariant = "bla"
91inDate = NOW()
92inCurrency = 12345.6789
93inSCode.Value = &h80020004
94inDecimal = CDec("-9223372036854775808") 'lowest int64
95
96obj.inBool(inBool)
97obj.inByte(inByte)
98obj.inShort(inShort)
99obj.inLong(inLong)
100obj.inString(inString)
101obj.inFloat(inFloat)
102obj.inDouble(inDouble)
103obj.inVariant(inVariant)
104'obj.prpString= "a string property"
105obj.inObject(obj)
106obj.inArray(arString())
107obj.inDate(inDate)
108obj.inCurrency(inCurrency)
109obj.inSCode(inSCode)
110obj.inUnknown(objFoo)
111obj.inDecimal(inDecimal)
112
113'out parameter -------------------------------------------------------------------------
114outBool = false
115obj.outBool(outBool)
116outByte = 0
117obj.outByte(outByte)
118outShort = 0
119obj.outShort(outShort)
120outLong = 0
121obj.outLong(outLong)
122outFloat = 0
123obj.outFloat(outFloat)
124outDouble = 0
125obj.outDouble(outDouble)
126outString = ""
127obj.outString(outString)
128outVariant = 0
129obj.outVariant(outVariant)
130outObject  = NOTHING
131obj.outObject(outObject)
132outArray = 0
133obj.outArray(outArray)
134obj.outDate(outDate)
135obj.outCurrency(outCurrency)
136obj.outSCode(outSCode)
137obj.outUnknown(outUnknown)
138obj.outDecimal(outDecimal)
139
140
141If inBool <> outBool Or inByte <> outByte Or inShort <> outShort Or inLong <> outLong Or _
142   inFloat <> outFloat Or inDouble <> outDouble Or inString <> outString Or _
143   inVariant <> outVariant Or NOT equalUnoObjects(obj, outObject) Or NOT _
144   equalArrays(arString(), outArray()) Or inDate <> outDate Or inCurrency <> outCurrency Or _
145   inSCode.Value <> outSCode.Value Or Not equalUnoObjects(objFoo, outUnknown) Or _
146   inDecimal <> outDecimal Then
147   runtest = -1
148   exit Function
149End If
150
151
152'in-out parameter -------------------------------------------------------------
153'implementation of inout methods returns the previously set value in out param
154inBool = true
155inBool2 = inBool
156obj.inoutBool(inBool2)
157outBool = false
158obj.inoutBool(outBool)
159inByte = 10
160inByte2 = inByte
161obj.inoutByte(inByte2)
162outByte = 0
163obj.inoutByte(outByte)
164inShort =  10
165inShort2 = inShort
166obj.inShort(inShort2)
167outShort = 0
168obj.inoutShort(outShort)
169inLong = 10
170inLong2 = inLong
171obj.inoutLong(inLong2)
172outLong = 0
173obj.inoutLong(outLong)
174inFloat = 3.14
175inFloat2 = inFloat
176obj.inoutFloat(inFloat2)
177outFloat = 0
178obj.inoutFloat(outFloat)
179inDouble= 3.14
180inDouble2 = inDouble
181obj.inoutDouble(inDouble2)
182outDouble = 0
183obj.inoutDouble(outDouble)
184inString = "in"
185inString2 = inString
186obj.inoutString(inString2)
187outString = ""
188obj.inoutString(outString)
189inVariant = "in"
190inVariant2 = inVariant
191obj.inoutVariant(inVariant2)
192outVariant = 0
193obj.inoutVariant(outVariant)
194inObject = factory.createInstance("AxTestComponents.Basic")
195inObject2 = inObject
196obj.inoutObject(inObject2)
197outObject = NOTHING
198obj.inoutObject(outObject)
199inAr = arString()
200inAr2 = inAr
201obj.inoutArray(inAr2)
202outArray = 0
203obj.outArray(outArray())
204inDate = NOW()
205inDate2 = inDate
206obj.inoutDate(inDate2)
207outDate = 0
208obj.inoutDate(outDate)
209inCurrency = 1234.5678
210inCurrency2 = inCurrency
211obj.inoutCurrency(inCurrency2)
212outCurrency = 0
213obj.inoutCurrency(outCurrency)
214inSCode.Value = &h80020004
215inSCode2 = inSCode
216obj.inoutSCode(inSCode2)
217outSCode.Value = 0
218obj.inoutSCode(outSCode)
219inUnknown = objFoo
220inUnknown2 = inUnknown
221obj.inoutUnknown(inUnknown2)
222outUnknown = Nothing
223obj.inoutUnknown(outUnknown)
224inDecimal = CDec("18446744073709551615") 'highest positiv value of unsigne int64
225inDecimal2 = inDecimal
226obj.inoutDecimal(inDecimal2)
227outDecimal = 0
228obj.inoutDecimal(outDecimal)
229
230If inBool <> outBool Or inByte <> outByte Or inShort <> outShort Or inLong <> outLong Or _
231   inFloat <> outFloat Or inDouble <> outDouble Or inString <> outString Or _
232   inVariant <> outVariant Or NOT equalUnoObjects(inObject, outObject) Or _
233   NOT equalArrays(inAr, outArray) Or inDate <> outDate Or inCurrency <> outCurrency Or _
234   inSCode.Value <> outSCode.Value  Or Not equalUnoObjects(inUnknown, outUnknown) Or _
235   inDecimal <> outDecimal Then
236  runtest = -1
237  Exit Function
238End If
239
240'properties -------------------------------------------------------------------------
241inBool = false
242outBool = true
243obj.prpBool = inBool
244outBool = obj.prpBool
245inByte = 11
246outByte = 0
247obj.prpByte = inByte
248outByte= obj.prpByte
249inShort = 127
250outShort = 0
251obj.prpShort= inShort
252outShort= obj.prpShort
253inLong = 1000
254outLong = 0
255obj.prpLong = inLong
256outLong= obj.prpLong
257inFloat = 3.14
258outFloat = 0
259obj.prpFloat = inFloat
260outFloat= obj.prpFloat
261inDouble = 3.123
262outDouble = 0
263obj.prpDouble = inDouble
264outDouble= obj.prpDouble
265inString = "bla"
266outString = ""
267obj.prpString = inString
268outString = obj.prpString
269inObject = obj
270outObject = objNOTHING
271obj.prpObject = inObject
272outObject = obj.prpObject
273inVariant = "bla"
274outVariant = 0
275obj.prpVariant = inVariant
276outVariant= obj.prpVariant
277inArray = arString()
278outArray = 0
279obj.prpArray = inArray()
280outArray= obj.prpArray
281inDate = NOW()
282outDate = 0
283obj.prpDate = inDate
284outDate = obj.prpDate
285inCurrency = 1234.5678
286outCurrency = 0
287obj.prpCurrency = inCurrency
288outCurrency = obj.prpCurrency
289inSCode.Value = &h80020004
290outSCode.Value = 0
291obj.prpSCode = inSCode
292outSCode = obj.prpSCode
293inUnknown = objFoo
294outUnknown= Nothing
295obj.prpUnknown = inUnknown
296outUnknown = obj.prpUnknown
297inDecimal = CDec("18446744073709551615")' highest unsigned int64
298outDecimal = 0
299obj.prpDecimal = inDecimal
300outDecimal = obj.prpDecimal
301
302If inBool <> outBool Or inByte <> outByte Or inShort <> outShort Or inLong <> outLong Or _
303   inFloat <> outFloat Or inDouble <> outDouble Or inString <> outString Or _
304   inVariant <> outVariant Or NOT equalUnoObjects(inObject, outObject) Or _
305   NOT equalArrays(inArray, outArray) Or inDate <> outDate Or inCurrency <> outCurrency Or _
306   inSCode.Value <> outSCode.Value Or Not equalUnoObjects(inUnknown, outUnknown) Or _
307   inDecimal <> outDecimal Then
308  runtest = -1
309  Exit Function
310End If
311
312' ref parameter ------------------------------------------------------------------------
313obj.inLong(0)
314inLong = 123
315outLong = 0
316obj.inLong(0)
317obj.inrefLong(inLong)
318obj.outLong(outLong)
319inVariant = "bla"
320outVariant = 0
321obj.inVariant(0)
322obj.inrefVariant(inVariant)
323obj.outVariant(outVariant)
324If inLong <> outLong Or inVariant <> outVariant Then
325  runtest = -1
326  Exit Function
327End If
328
329outLong = 0
330obj.prprefLong = inLong
331outLong = obj.prprefLong
332outVariant = 0
333obj.prprefVariant = inVariant
334outVariant = obj.prprefVariant
335If inLong <> outLong Or  inVariant <> outVariant Then
336  runtest = -1
337  Exit Function
338End If
339
340
341'vararg --------------------------------------------------------------------------------
342inLong=1
343inLong2 = 2
344inLong3 = 3
345obj.varargfunc1(inLong)
346outArray = 0
347outLong = 0
348obj.varargfunc2(outLong, outArray)
349If inLong <> outLong Then
350  runtest = -1
351  Exit Function
352End If
353len1 = UBound(outArray)  - LBound(outArray) +1
354If len1 <> 0 Then
355  runtest = -1
356  Exit Function
357End If
358outArray = 0
359obj.varargfunc1(inLong, inLong2, inLong3)
360obj.varargfunc2(outLong, outArray)
361len1 = UBound(outArray) - LBound(outArray) +1
362If len1 <> 2 Or outArray(0) <> inLong2 Or outArray(1) <> inLong3 Then
363  runtest = -1
364  Exit Function
365End If
366
367
368'defaultvalue ---------------------------------------------------------------------------
369inLong = 0
370inFloat = 0
371inVariant = 0
372inVariant2 = 0
373'defaults are: 1, 2, 4
374'The third parameter is a VARIANT with a default value of 4. COM gives it the type BSTR
375obj.defaultvalue1()
376obj.defaultvalue2(inLong, inFloat, inVariant)
377If inLong <> 1 Or inFloat <> 2 Or inVariant <> "4" Then
378  runtest = -1
379  Exit Function
380End If
381inLong = 10
382inFloat = 11
383inLong2 = inLong
384inFloat2 = inFloat
385inVariant = 0
386inVariant = 0
387obj.defaultvalue1(inLong, inFloat)
388obj.defaultvalue2(inLong, inFloat, inVariant)
389If inLong <> inLong2 Or inFloat <> inFloat2 Or inVariant <> "4" Then
390  runtest = -1
391  Exit Function
392End If
393
394'optional parameters ----------------------------------------------------------------
395inLong = 100
396outLong = 0
397obj.optional1(inLong)
398obj.optional2(outLong)
399If inLong <> outLong Then
400 runtest = -1
401 Exit Function
402End If
403
404inLong2 = 101
405outLong2 = 0
406obj.optional1(inLong, inLong2)
407obj.optional2(outLong, outLong2)
408If inLong <> outLong AND inLong2 <> outLong2 Then
409 runtest = -1
410 Exit Function
411End If
412
413inLong2 = 101
414outLong2 = 0
415obj.optional1(inLong, inLong2)
416obj.optional1(inLong)
417obj.optional2(outLong, outLong2)
418If inLong <> outLong AND inLong2 <> outLong2 Then
419 runtest = -1
420 Exit Function
421End If
422
423inLong = 10
424inLong2 = 100
425outLong = 5
426outLong2 = 6
427obj.optional3()
428obj.optional3(inLong, inLong2)
429obj.optional4(outLong, outLong2) 'outLong = 10, outLong2 = 100
430If inLong <> outLong AND inLong2 <> outLong2 Then
431 runtest = -1
432 Exit Function
433End If
434inLong = 10
435inLong2 = 100
436inLong3 = inLong
437inLong4 = inLong2
438obj.optional4(inLong, inLong)
439outLong = 0
440outLong2 = 0
441obj.optional5(outLong, outLong2)
442If inLong3 <> outLong AND inLong4 <> outLong2 Then
443  runtest = -1
444  Exit Function
445End If
446
447inLong = 10
448outLong = 5
449obj.optional3(inLong)
450obj.optional4(outLong)
451If inLong <> outLong Then
452 runtest = -1
453 Exit Function
454End If
455inLong = 10
456inLong2 = inLong
457outLong = 0
458obj.optional4(inLong)
459obj.optional5(outLong)
460If inLong2 <> outLong Then
461  runtest = -1
462  Exit Function
463End If
464
465'named arguments-------------------------------------------------------------------------
466'all args As named args, different order
467obj.optional6(0, 0, 0, 0)
468inLong = 1
469inLong2 = 2
470inLong3 = 3
471inLong4 = 4
472obj.optional6(val4:= inLong4, val3:=inLong3, val2:=inLong2, val1:= inLong)
473Dim outLong3 As Long
474Dim outLong4 As Long
475outLong = 0
476outLong2 = 0
477outLong3 = 0
478outLong4 = 0
479obj.optional7(outLong, outLong2, outLong3, outLong4)
480If inLong <> outLong Or inLong2 <> outLong2 _
481	Or inLong3 <> outLong3 Or inLong4 <> outLong4 Then
482	runtest = -1
483	Exit Function
484End If
485
486'mixed positional and named args with omitted args
487Dim scode_paramNotFound As New com.sun.star.bridge.oleautomation.SCode
488scode_paramNotFound.Value = &h80020004
489
490obj.optional6(0, 0, 0, 0)
491'val1 and val3 will be DISP_E_PARAMNOTFOUND
492obj.optional6(, inLong2, val4:=inLong4)
493Dim outSCode1, outSCode2
494obj.optional7(outSCode, outLong2, outSCode2, outLong4)
495If outSCode.Value <> scode_paramNotFound.Value Or inLong2 <> outLong2 _
496	Or outSCode2.Value <> scode_paramNotFound.Value Or inLong4 <> outLong4 Then
497	runtest = -1
498	Exit Function
499End If
500
501'mixed positional and named args with ommitted args as out -args
502inLong = 1
503inLong2 = 2
504inLong3 = 3
505inLong4 = 4
506obj.optional6(inLong, inLong2, inLong3, inLong4)
507outLong2 = 0
508outLong3 = 0
509obj.optional7(,outLong2, val3:= outLong3)
510If inLong2 <> outLong2 Or inLong3 <> outLong3 Then
511	runtest = -1
512	Exit Function
513End If
514
515'test properties with additional arguments ------------------------------------
516inLong = 10
517inLong2 = 20
518inLong3 = 30
519outLong = 0
520outLong2 = 0
521outLong3 = 0
522obj.prpMultiArg1(0,0) = 0
523'obj.prpMultiArg1 = 0
524obj.prpMultiArg1(inLong,inLong2) = inLong3
525outLong3 = obj.prpMultiArg1(outLong, outLong2)
526If outLong <> 10 Or outLong2 <> 02 Or outLong3 <> 30 Then
527	runtest = -1
528	Exit Function
529End If
530
531outLong = 0
532outLong2 = 0
533obj.prpMultiArg1(0,0) = 0
534obj.prpMultiArg1(1) = 3
535outLong2 = obj.prpMultiArg1(outLong)
536If outLong <> 1 Or outLong2 <> 3 Then
537	runtest = -1
538	Exit Function
539End If
540
541outLong = 0
542outLong2 = 0
543obj.prpMultiArg1(0,0) = 0
544obj.prpMultiArg1(val2:= 1) = 3
545outLong2 = obj.prpMultiArg1(val2:=outLong)
546If outLong <> 1 Or outLong2 <> 3 Then
547	runtest = -1
548	Exit Function
549End If
550
551outLong = -1
552outLong2 = -1
553obj.prpMultiArg2(0) = 0
554outLong = obj.prpMultiArg2GetValues(outLong, outLong2)
555If outLong <> 0 Or outLong2 <> 0 Then
556	runtest = -1
557	Exit Function
558End If
559
560
561outLong = 0
562outLong2 = 0
563obj.prpMultiArg2(1) = 2
564obj.prpMultiArg2GetValues(outLong, outLong2)
565If outLong <> 1 Or outLong2 <> 2 Then
566	runtest = -1
567	Exit Function
568End If
569
570
571
572' other tests ------------------------------------------------------------------
573obj.inObject(NOTHING)
574outObject = NOTHING
575'bridge should return an XInterface any with null pointer
576'A basic errOr should occur if this is not the case
577obj.outObject(outObject)
578
579If Not IsNull(outObject) Then
580	runtest = -1
581	Exit Function
582End If
583'Decimal passed by reference
584inrefDecimal = CDec("9223372036854775807") 'highest positiv value of int64
585obj.inrefDecimal(inrefDecimal)
586outrefDecimal = 0
587obj.outDecimal(outrefDecimal)
588If inrefDecimal <> outrefDecimal Then
589	runtest = -1
590	Exit Function
591End If
592
593' Test Automation object with dual interfaces ------------------------------------
594dim dispatcher as object
595dim oExplorer as object
596dispatcher = createUnoService("com.sun.star.bridge.OleObjectFactory")
597oExplorer = dispatcher.createInstance("InternetExplorer.Application")
598If Not IsNull(oExplorer) Then
599	oExplorer.visible = true
600	oExplorer.Navigate2("http://www.openoffice.org")
601Else
602	MsgBox("Could not perform test with Internet Explorer!")
603End If
604
605
606End Function
607
608'One dimensional arrays with simple types.
609'lower bound must be 0
610Function equalArrays(ar1, ar2)
611Dim len1
612Dim len2
613len1 = UBound(ar1) - LBound(ar1) + 1
614len2 = UBound(ar2) - LBound(ar2) + 1
615If len1 <> len2 Then
616  equalArrays = false
617  Exit Function
618End If
619Dim counter
620FOr counter = 0 To len1 - 1
621  If ar1(counter) <> ar2(counter) Then
622    equalArrays = false
623    Exit Function
624  End If
625Next
626equalArrays = true
627End Function
628
629
630