1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 using System;
29 using System.Diagnostics;
30 using System.Reflection;
31 using uno;
32 using uno.util;
33 using unoidl.com.sun.star.uno;
34 using unoidl.com.sun.star.lang;
35 //using unoidl.com.sun.star.test.bridge;
36 using unoidl.test.testtools.bridgetest;
37 
38 namespace foo
39 {
40     public interface MyInterface
41     {
42     }
43 }
44 
45 namespace cs_testobj
46 {
47     class ORecursiveCall: WeakBase, XRecursiveCall
48     {
49         public void  callRecursivly(XRecursiveCall xCall, int nToCall)
50 		{
51 			lock (this)
52             {
53                 if (nToCall > 0)
54                 {
55                     nToCall --;
56                     xCall.callRecursivly(this, nToCall);
57                 }
58             }
59         }
60     };
61 
62 class Constants
63 {
64    public const string STRING_TEST_CONSTANT = "\" paco\' chorizo\\\' \"\'";
65 }
66 
67 public class BridgeTest : WeakBase, XMain
68 {
69 	static bool compareData(Object val1, Object val2)
70 	{
71 		if (val1 == null && val2 == null || val1 == val2)
72 			return true;
73 		if ((val1 == null && val2 != null) ||
74 			(val1 != null && val2 == null) || val1.GetType() != val2.GetType())
75 			return false;
76 
77 		bool ret = false;
78 		Type t1  = val1.GetType();
79 			//Sequence
80 		if (t1.IsArray)
81 		{
82 			ret = compareSequence((Array) val1, (Array) val2);
83 		}
84 			//String
85 		else if (t1 == typeof(string))
86 		{
87 			ret = (string) val1 == (string) val2;
88 		}
89 			// Interface implementation
90 		else if (t1.GetInterfaces().Length > 0 && ! t1.IsValueType)
91 		{
92 			ret = val1 == val2;
93 		}
94 			// Struct
95 		else if ( ! t1.IsValueType)
96 		{
97 			ret = compareStruct(val1, val2);
98 		}
99 		else if (t1 == typeof(Any))
100 		{
101 			Any a1 = (Any) val1;
102 			Any a2 = (Any) val2;
103 			ret = a1.Type == a2.Type && compareData(a1.Value, a2.Value);
104 		}
105 		else if (t1.IsValueType)
106 		{
107 			//Any, enum, int, bool char, float, double etc.
108 			ret = val1.Equals(val2);
109 		}
110 		else
111 		{
112 			Debug.Assert(false);
113 		}
114 		return ret;
115 	}
116 
117 	// Arrays have only one dimension
118 	static bool compareSequence(Array ar1, Array ar2)
119 	{
120 		Debug.Assert(ar1 != null && ar2 != null);
121 		Type t1 = ar1.GetType();
122 		Type t2 = ar2.GetType();
123 
124 		if (!(ar1.Rank == 1 && ar2.Rank == 1
125 			&& ar1.Length == ar2.Length && t1.GetElementType() == t2.GetElementType()))
126 			return false;
127 
128 		//arrays have same rank and size and element type.
129 		int len  = ar1.Length;
130 		Type elemType = t1.GetElementType();
131 		bool ret = true;
132 		for (int i = 0; i < len; i++)
133 		{
134 			if (compareData(ar1.GetValue(i), ar2.GetValue(i)) == false)
135 			{
136 				ret = false;
137 				break;
138 			}
139 		}
140 		return ret;
141 	}
142 
143 	static bool compareStruct(Object val1, Object val2)
144 	{
145 		Debug.Assert(val1 != null && val2 != null);
146 		Type t1 = val1.GetType();
147 		Type t2 = val2.GetType();
148 		if (t1 != t2)
149 			return false;
150 		FieldInfo[] fields = t1.GetFields();
151 		int cFields = fields.Length;
152 		bool ret = true;
153 		for (int i = 0; i < cFields; i++)
154 		{
155 			Object fieldVal1 = fields[i].GetValue(val1);
156 			Object fieldVal2 = fields[i].GetValue(val2);
157 			if ( ! compareData(fieldVal1, fieldVal2))
158 			{
159 				ret = false;
160 				break;
161 			}
162 		}
163 		return ret;
164 	}
165 
166     static bool check( bool b , string message )
167     {
168         if ( ! b)
169         Console.WriteLine("{0} failed\n" , message);
170         return b;
171     }
172 
173     static bool equals(TestElement rData1, TestElement  rData2)
174     {
175         check( rData1.Bool == rData2.Bool, "### bool does not match!" );
176         check( rData1.Char == rData2.Char, "### char does not match!" );
177         check( rData1.Byte == rData2.Byte, "### byte does not match!" );
178         check( rData1.Short == rData2.Short, "### short does not match!" );
179         check( rData1.UShort == rData2.UShort, "### unsigned short does not match!" );
180         check( rData1.Long == rData2.Long, "### long does not match!" );
181         check( rData1.ULong == rData2.ULong, "### unsigned long does not match!" );
182         check( rData1.Hyper == rData2.Hyper, "### hyper does not match!" );
183         check( rData1.UHyper == rData2.UHyper, "### unsigned hyper does not match!" );
184         check( rData1.Float == rData2.Float, "### float does not match!" );
185         check( rData1.Double == rData2.Double, "### double does not match!" );
186         check( rData1.Enum == rData2.Enum, "### enum does not match!" );
187         check( rData1.String == rData2.String, "### string does not match!" );
188         check( rData1.Interface == rData2.Interface, "### interface does not match!" );
189         check( compareData(rData1.Any, rData2.Any), "### any does not match!" );
190 
191         return (rData1.Bool == rData2.Bool &&
192                 rData1.Char == rData2.Char &&
193                 rData1.Byte == rData2.Byte &&
194                 rData1.Short == rData2.Short &&
195                 rData1.UShort == rData2.UShort &&
196                 rData1.Long == rData2.Long &&
197                 rData1.ULong == rData2.ULong &&
198                 rData1.Hyper == rData2.Hyper &&
199                 rData1.UHyper == rData2.UHyper &&
200                 rData1.Float == rData2.Float &&
201                 rData1.Double == rData2.Double &&
202                 rData1.Enum == rData2.Enum &&
203                 rData1.String == rData2.String &&
204                 rData1.Interface == rData2.Interface &&
205                 compareData(rData1.Any, rData2.Any));
206     }
207 
208 static void assign( TestElement rData,
209 					bool bBool, char cChar, byte nByte,
210 					short nShort, ushort nUShort,
211 					int nLong, uint nULong,
212 					long nHyper, ulong nUHyper,
213 					float fFloat, double fDouble,
214 					TestEnum eEnum, string rStr,
215 					Object xTest,
216 					Any rAny )
217 {
218 	rData.Bool = bBool;
219 	rData.Char = cChar;
220 	rData.Byte = nByte;
221 	rData.Short = nShort;
222 	rData.UShort = nUShort;
223 	rData.Long = nLong;
224 	rData.ULong = nULong;
225 	rData.Hyper = nHyper;
226 	rData.UHyper = nUHyper;
227 	rData.Float = fFloat;
228 	rData.Double = fDouble;
229 	rData.Enum = eEnum;
230 	rData.String = rStr;
231 	rData.Interface = xTest;
232 	rData.Any = rAny;
233 }
234 
235 static void assign( TestDataElements rData,
236 					bool bBool, char cChar, byte nByte,
237 					short nShort, ushort nUShort,
238 					int nLong, uint nULong,
239 					long nHyper, ulong nUHyper,
240 					float fFloat, double fDouble,
241 					TestEnum eEnum, string rStr,
242 					Object xTest,
243 					Any rAny,
244 					TestElement[] rSequence)
245 {
246 	assign( (TestElement) rData,
247 			bBool, cChar, nByte, nShort, nUShort, nLong, nULong, nHyper, nUHyper, fFloat, fDouble,
248 			eEnum, rStr, xTest, rAny );
249 	rData.Sequence = rSequence;
250 }
251 
252 // template < class type >
253 static bool testAny(Type typ, Object  value, XBridgeTest xLBT )
254 {
255 	Any any;
256 	if (typ == null)
257 		any = new Any(value.GetType(), value);
258 	else
259 		any = new Any(typ, value);
260 
261 	Any any2 = xLBT.transportAny(any);
262 	bool ret;
263 	if( ! (ret= compareData(any, any2)))
264     {
265         Console.WriteLine("any is different after roundtrip: in {0}, out {1}\n",
266                           any.Type.FullName, any2.Type.FullName);
267     }
268 	return ret;
269 }
270 
271 
272 
273 static bool performAnyTest(XBridgeTest xLBT,  TestDataElements data)
274 {
275 	bool bReturn = true;
276 	bReturn = testAny( null, data.Byte ,xLBT ) && bReturn;
277 	bReturn = testAny( null, data.Short,xLBT ) && bReturn;
278 	bReturn = testAny(  null, data.UShort,xLBT ) && bReturn;
279 	bReturn = testAny(  null, data.Long,xLBT ) && bReturn;
280 	bReturn = testAny(  null, data.ULong,xLBT ) && bReturn;
281 	bReturn = testAny(  null, data.Hyper,xLBT ) && bReturn;
282 	bReturn = testAny(  null,data.UHyper,xLBT ) && bReturn;
283 	bReturn = testAny( null, data.Float,xLBT ) && bReturn;
284 	bReturn = testAny( null, data.Double,xLBT ) && bReturn;
285 	bReturn = testAny( null, data.Enum,xLBT ) && bReturn;
286 	bReturn = testAny( null, data.String,xLBT ) && bReturn;
287 	bReturn = testAny(typeof(XWeak), data.Interface,xLBT ) && bReturn;
288 	bReturn = testAny(null, data, xLBT ) && bReturn;
289 
290 	{
291         Any a1= new Any(true);
292 		Any a2 = xLBT.transportAny( a1 );
293 		bReturn = compareData(a2, a1) && bReturn;
294 	}
295 
296 	{
297         Any a1= new Any('A');
298 		Any a2 = xLBT.transportAny(a1);
299 		bReturn = compareData(a2, a1) && bReturn;
300 	}
301 	return bReturn;
302 }
303 
304 static bool performSequenceOfCallTest(XBridgeTest xLBT)
305 {
306 	int i,nRounds;
307 	int nGlobalIndex = 0;
308 	const int nWaitTimeSpanMUSec = 10000;
309 	for( nRounds = 0 ; nRounds < 10 ; nRounds ++ )
310 	{
311 		for( i = 0 ; i < nRounds ; i ++ )
312 		{
313 			// fire oneways
314 			xLBT.callOneway(nGlobalIndex, nWaitTimeSpanMUSec);
315 			nGlobalIndex++;
316 		}
317 
318 		// call synchron
319 		xLBT.call(nGlobalIndex, nWaitTimeSpanMUSec);
320 		nGlobalIndex++;
321 	}
322  	return xLBT.sequenceOfCallTestPassed();
323 }
324 
325 
326 
327 
328 static bool performRecursiveCallTest(XBridgeTest  xLBT)
329 {
330 	xLBT.startRecursiveCall(new ORecursiveCall(), 50);
331 	// on failure, the test would lock up or crash
332 	return true;
333 }
334 
335 static bool performQueryForUnknownType(XBridgeTest xLBT)
336 {
337     bool bRet = false;
338     // test queryInterface for an unknown type
339     try
340     {
341         foo.MyInterface a = (foo.MyInterface) xLBT;
342     }
343     catch( System.InvalidCastException)
344     {
345         bRet = true;
346     }
347 
348     return bRet;
349 }
350 
351 // //==================================================================================================
352 bool performTest(XBridgeTest xLBT)
353 {
354 	check( xLBT != null, "### no test interface!" );
355     bool bRet = true;
356 	if (xLBT == null)
357         return false;
358 
359     // this data is never ever granted access to by calls other than equals(), assign()!
360     TestDataElements aData = new TestDataElements(); // test against this data
361 
362     Object xI= new WeakBase();
363 
364     Any aAny = new Any( typeof(Object), xI);
365     assign( (TestElement)aData,
366             true, '@', 17, 0x1234, 0xfedc, 0x12345678, 0xfedcba98,
367             0x123456789abcdef0, 0xfedcba9876543210,
368             17.0815f, 3.1415926359, TestEnum.LOLA,
369             Constants.STRING_TEST_CONSTANT, xI,
370             aAny);
371 
372     bRet = check( aData.Any.Value == xI, "### unexpected any!" ) && bRet;
373     bRet = check( !(aData.Any.Value != xI), "### unexpected any!" ) && bRet;
374 
375     aData.Sequence = new TestElement[2];
376     aData.Sequence[0] = new TestElement(
377         aData.Bool, aData.Char, aData.Byte, aData.Short,
378         aData.UShort, aData.Long, aData.ULong,
379         aData.Hyper, aData.UHyper, aData.Float,
380         aData.Double, aData.Enum, aData.String,
381         aData.Interface, aData.Any); //(TestElement) aData;
382     aData.Sequence[1] = new TestElement(); //is empty
383 
384     // aData complete
385     //
386     // this is a manually copy of aData for first setting...
387     TestDataElements aSetData = new TestDataElements();
388     Any aAnySet= new Any(typeof(Object), xI);
389     assign( (TestElement)aSetData,
390             aData.Bool, aData.Char, aData.Byte, aData.Short, aData.UShort,
391             aData.Long, aData.ULong, aData.Hyper, aData.UHyper, aData.Float, aData.Double,
392             aData.Enum, aData.String, xI,
393             aAnySet);
394 
395     aSetData.Sequence = new TestElement[2];
396     aSetData.Sequence[0] = new TestElement(
397         aSetData.Bool, aSetData.Char, aSetData.Byte, aSetData.Short,
398         aSetData.UShort, aSetData.Long, aSetData.ULong,
399         aSetData.Hyper, aSetData.UHyper, aSetData.Float,
400         aSetData.Double, aSetData.Enum, aSetData.String,
401         aSetData.Interface, aSetData.Any); //TestElement) aSetData;
402     aSetData.Sequence[1] = new TestElement(); // empty struct
403 
404     xLBT.setValues(
405         aSetData.Bool, aSetData.Char, aSetData.Byte, aSetData.Short, aSetData.UShort,
406         aSetData.Long, aSetData.ULong, aSetData.Hyper, aSetData.UHyper, aSetData.Float, aSetData.Double,
407         aSetData.Enum, aSetData.String, aSetData.Interface, aSetData.Any, aSetData.Sequence, aSetData );
408 
409     {
410 		TestDataElements aRet = new TestDataElements();
411         TestDataElements aRet2 = new TestDataElements();
412 		xLBT.getValues(
413 			out aRet.Bool, out aRet.Char, out aRet.Byte, out aRet.Short, out aRet.UShort,
414 			out aRet.Long, out aRet.ULong, out aRet.Hyper, out aRet.UHyper,
415             out aRet.Float, out aRet.Double, out aRet.Enum, out aRet.String,
416             out aRet.Interface, out aRet.Any, out aRet.Sequence, out aRet2 );
417 
418 		bRet = check( compareData( aData, aRet ) && compareData( aData, aRet2 ) , "getValues test") && bRet;
419 
420 		// set last retrieved values
421 		TestDataElements aSV2ret = xLBT.setValues2(
422 			ref aRet.Bool, ref aRet.Char, ref aRet.Byte, ref aRet.Short, ref aRet.UShort,
423 			ref aRet.Long, ref aRet.ULong, ref aRet.Hyper, ref aRet.UHyper, ref aRet.Float,
424             ref aRet.Double, ref aRet.Enum, ref aRet.String, ref aRet.Interface, ref aRet.Any,
425             ref aRet.Sequence, ref aRet2 );
426 
427         // check inout sequence order
428         // => inout sequence parameter was switched by test objects
429 		TestElement temp = aRet.Sequence[ 0 ];
430         aRet.Sequence[ 0 ] = aRet.Sequence[ 1 ];
431         aRet.Sequence[ 1 ] = temp;
432 
433 		bRet = check(
434             compareData( aData, aSV2ret ) && compareData( aData, aRet2 ),
435             "getValues2 test") && bRet;
436     }
437     {
438 		TestDataElements aRet = new TestDataElements();
439         TestDataElements aRet2 = new TestDataElements();
440 		TestDataElements aGVret = xLBT.getValues(
441 			out aRet.Bool, out aRet.Char, out aRet.Byte, out aRet.Short,
442             out aRet.UShort, out aRet.Long, out aRet.ULong, out aRet.Hyper,
443             out aRet.UHyper, out aRet.Float, out aRet.Double, out aRet.Enum,
444             out aRet.String, out aRet.Interface, out aRet.Any, out aRet.Sequence,
445             out aRet2 );
446 
447 		bRet = check( compareData( aData, aRet ) && compareData( aData, aRet2 ) && compareData( aData, aGVret ), "getValues test" ) && bRet;
448 
449 		// set last retrieved values
450 		xLBT.Bool = aRet.Bool;
451 		xLBT.Char = aRet.Char;
452 		xLBT.Byte = aRet.Byte;
453 		xLBT.Short = aRet.Short;
454 		xLBT.UShort = aRet.UShort;
455         xLBT.Long = aRet.Long;
456 		xLBT.ULong = aRet.ULong;
457 		xLBT.Hyper = aRet.Hyper;
458 		xLBT.UHyper = aRet.UHyper;
459 		xLBT.Float = aRet.Float;
460 		xLBT.Double = aRet.Double;
461 		xLBT.Enum = aRet.Enum;
462 		xLBT.String = aRet.String;
463 		xLBT.Interface = aRet.Interface;
464 		xLBT.Any = aRet.Any;
465 		xLBT.Sequence = aRet.Sequence;
466 		xLBT.Struct = aRet2;
467     }
468     {
469 		TestDataElements aRet = new TestDataElements();
470         TestDataElements aRet2 = new TestDataElements();
471 		aRet.Hyper = xLBT.Hyper;
472 		aRet.UHyper = xLBT.UHyper;
473 		aRet.Float = xLBT.Float;
474 		aRet.Double = xLBT.Double;
475 		aRet.Byte = xLBT.Byte;
476 		aRet.Char = xLBT.Char;
477 		aRet.Bool = xLBT.Bool;
478 		aRet.Short = xLBT.Short;
479 		aRet.UShort = xLBT.UShort;
480 		aRet.Long = xLBT.Long;
481 		aRet.ULong = xLBT.ULong;
482 		aRet.Enum = xLBT.Enum;
483 		aRet.String = xLBT.String;
484 		aRet.Interface = xLBT.Interface;
485 		aRet.Any = xLBT.Any;
486 		aRet.Sequence = xLBT.Sequence;
487 		aRet2 = xLBT.Struct;
488 
489 		bRet = check( compareData( aData, aRet ) && compareData( aData, aRet2 ) , "struct comparison test") && bRet;
490 
491 		bRet = check(performSequenceTest(xLBT), "sequence test") && bRet;
492 
493 		// any test
494 		bRet = check( performAnyTest( xLBT , aData ) , "any test" ) && bRet;
495 
496 		// sequence of call test
497 		bRet = check( performSequenceOfCallTest( xLBT ) , "sequence of call test" ) && bRet;
498 
499 		// recursive call test
500 		bRet = check( performRecursiveCallTest( xLBT ) , "recursive test" ) && bRet;
501 
502 		bRet = (compareData( aData, aRet ) && compareData( aData, aRet2 )) && bRet ;
503 
504         // check setting of null reference
505         xLBT.Interface = null;
506         aRet.Interface = xLBT.Interface;
507         bRet = (aRet.Interface == null) && bRet;
508 
509     }
510         // Test extended attributes that raise exceptions:
511     try {
512         int i = xLBT.RaiseAttr1;
513             bRet &= check(false, "getRaiseAttr1 did not throw");
514     } catch (RuntimeException )
515     {
516     }
517     catch (System.Exception) {
518         bRet &= check(false, "getRaiseAttr1 threw wrong type");
519     }
520     try {
521         xLBT.RaiseAttr1 = 0;
522         bRet &= check(false, "setRaiseAttr1 did not throw");
523     } catch (IllegalArgumentException) {
524     } catch (System.Exception) {
525         bRet &= check(false, "setRaiseAttr1 threw wrong type");
526     }
527     try {
528         int i = xLBT.RaiseAttr2;
529         bRet &= check(false, "getRaiseAttr2 did not throw");
530     } catch (IllegalArgumentException ) {
531     } catch (System.Exception) {
532         bRet &= check(false, "getRaiseAttr2 threw wrong type");
533     }
534 
535        // Test instantiated polymorphic struct types:
536     {
537         TestPolyStruct poly = new TestPolyStruct(true);
538         bRet &= check(
539             (bool) xLBT.transportPolyBoolean(poly).member,
540             "transportPolyBoolean");
541         poly = new TestPolyStruct(12345L);
542         xLBT.transportPolyHyper(ref poly);
543         bRet &= check((long)poly.member == 12345L, "transportPolyUnsignedHyper");
544 
545         Any[] seq = {  new Any(33), new Any("ABC")};
546         poly = new TestPolyStruct(seq);
547         TestPolyStruct poly2;
548         xLBT.transportPolySequence(poly, out poly2);
549         try {
550             Any[] ar = (Any[]) poly2.member;
551             bRet &= check(
552             ar.Length == 2, "transportPolySequence, length");
553 
554             int v0;
555             v0 = (int) ar[0].Value;
556             bRet &= check(v0 == 33, "transportPolySequence, element 0");
557 
558             string v1 = (string) ar[1].Value;
559             bRet &= check(
560             v1.Equals("ABC"),
561             "transportPolySequence, element 1");
562         } catch (InvalidCastException )
563         {
564             bRet &= check(false, "transportPolySequence");
565         }
566 
567         try {
568             //When the test object is a cli object then them member is null
569             //otherwise the bridge has provided a default value.
570             TestPolyStruct s =  xLBT.getNullPolyLong();
571             if (s.member != null)
572                 bRet &= check(((int) s.member) == 0, "getNullPolyLong");
573 
574             s = xLBT.getNullPolyString();
575             if (s.member != null)
576                 bRet &= check(((string) s.member).Length == 0,
577                               "getNullPolyString");
578             s = xLBT.getNullPolyType();
579             if (s.member != null)
580                 bRet &= check(((Type) s.member) == typeof(void),
581                               "getNullPolyType");
582             s = xLBT.getNullPolyAny();
583             if (s.member != null)
584             {
585                 Any nullAny = (Any) s.member;
586                 //???
587                 bRet &= check(nullAny.Type == typeof(void),
588                     "getNullPolyAny");
589             }
590             s = xLBT.getNullPolySequence();
591             if (s.member != null)
592                 bRet &= check(((bool[]) s.member).Length == 0,
593                               "getNullPolySequence");
594             s = xLBT.getNullPolyEnum();
595             if (s.member != null)
596                 bRet &= check(((TestEnum) s.member) == TestEnum.TEST,
597                               "getNullPolyEnum");
598             s = xLBT.getNullPolyStruct();
599             if (s.member != null)
600                 bRet &= check(((TestStruct) s.member).member == 0,
601                               "getNullPolyStruct");
602             s = xLBT.getNullPolyInterface();
603                 bRet &= check(s.member == null, "getNullPolyInterface");
604 
605             s = xLBT.getNullPolyBadEnum();
606             bRet &= check(((TestBadEnum)s.member) == TestBadEnum.M, "getNullPolyBadEnum");
607 
608         } catch(InvalidCastException)
609         {
610             bRet &= check(false, "getNullPolyXXX, InvalidCastException");
611         }
612 
613         }
614 
615     XBridgeTest2 xBT2 = xLBT as XBridgeTest2;
616     if (xBT2 != null) {
617         try {
618             xBT2.testConstructorsService(m_xContext);
619         } catch (BadConstructorArguments) {
620             bRet = false;
621         }
622     }
623 
624     return bRet;
625 }
626 static bool performSequenceTest(XBridgeTest xBT)
627 {
628     bool bRet = true;
629     XBridgeTest2  xBT2 = xBT as XBridgeTest2;
630     if ( xBT2 == null)
631         return false;
632 
633     // perform sequence tests (XBridgeTest2)
634     // create the sequence which are compared with the results
635     bool[] arBool = {true, false, true};
636     char[] arChar = {'A','B','C'};
637     byte[] arByte = { 1,  2,  0xff};
638     short[] arShort = {Int16.MinValue, 1,  Int16.MaxValue};
639     UInt16[] arUShort = {UInt16.MinValue , 1, UInt16.MaxValue};
640     int[] arLong = {Int32.MinValue, 1, Int32.MaxValue};
641     UInt32[] arULong = {UInt32.MinValue, 1, UInt32.MaxValue};
642     long[] arHyper = {Int64.MinValue, 1, Int64.MaxValue};
643     UInt64[] arUHyper = {UInt64.MinValue, 1, UInt64.MaxValue};
644     float[] arFloat = {1.1f, 2.2f, 3.3f};
645     double[] arDouble = {1.11, 2.22, 3.33};
646     string[] arString = {"String 1", "String 2", "String 3"};
647 
648     Any[] arAny = {new Any(true), new Any(11111), new Any(3.14)};
649     Object[] arObject = {new WeakBase(), new WeakBase(), new WeakBase()};
650     TestEnum[] arEnum = {TestEnum.ONE, TestEnum.TWO, TestEnum.CHECK};
651 
652     TestElement[] arStruct = {new TestElement(), new TestElement(),
653                                new TestElement()};
654     assign( arStruct[0], true, '@', 17, 0x1234, 0xfedc, 0x12345678, 0xfedcba98,
655  			0x123456789abcdef0, 0xfedcba9876543210, 17.0815f, 3.1415926359,
656             TestEnum.LOLA, Constants.STRING_TEST_CONSTANT, arObject[0],
657             new Any( typeof(Object),  arObject[0]) );
658     assign( arStruct[1], true, 'A', 17, 0x1234, 0xfedc, 0x12345678, 0xfedcba98,
659 			0x123456789abcdef0, 0xfedcba9876543210, 17.0815f, 3.1415926359,
660             TestEnum.TWO, Constants.STRING_TEST_CONSTANT, arObject[1],
661             new Any( typeof(Object), arObject[1]) );
662     assign( arStruct[2], true, 'B', 17, 0x1234, 0xfedc, 0x12345678, 0xfedcba98,
663 			0x123456789abcdef0, 0xfedcba9876543210, 17.0815f, 3.1415926359,
664             TestEnum.CHECK, Constants.STRING_TEST_CONSTANT, arObject[2],
665             new Any( typeof(Object), arObject[2] ) );
666 
667 
668     int[][][] arLong3 = new int[][][]{
669         new int[][]{new int[]{1,2,3},new int[]{4,5,6}, new int[]{7,8,9} },
670         new int [][]{new int[]{1,2,3},new int[]{4,5,6}, new int[]{7,8,9}},
671         new int[][]{new int[]{1,2,3},new int[]{4,5,6}, new int[]{7,8,9}}};
672 
673     {
674     int[][] seqSeqRet = xBT2.setDim2(arLong3[0]);
675     bRet = check( compareData(seqSeqRet, arLong3[0]), "sequence test") && bRet;
676     int[][][] seqSeqRet2 = xBT2.setDim3(arLong3);
677     bRet = check( compareData(seqSeqRet2, arLong3), "sequence test") && bRet;
678     Any[] seqAnyRet = xBT2.setSequenceAny(arAny);
679     bRet = check( compareData(seqAnyRet, arAny), "sequence test") && bRet;
680     bool[] seqBoolRet = xBT2.setSequenceBool(arBool);
681     bRet = check( compareData(seqBoolRet, arBool), "sequence test") && bRet;
682     byte[] seqByteRet = xBT2.setSequenceByte(arByte);
683     bRet = check( compareData(seqByteRet, arByte), "sequence test") && bRet;
684     char[] seqCharRet = xBT2.setSequenceChar(arChar);
685     bRet = check( compareData(seqCharRet, arChar), "sequence test") && bRet;
686     short[] seqShortRet = xBT2.setSequenceShort(arShort);
687     bRet = check( compareData(seqShortRet, arShort), "sequence test") && bRet;
688     int[] seqLongRet = xBT2.setSequenceLong(arLong);
689     bRet = check( compareData(seqLongRet, arLong), "sequence test") && bRet;
690     long[] seqHyperRet = xBT2.setSequenceHyper(arHyper);
691     bRet = check( compareData(seqHyperRet,arHyper), "sequence test") && bRet;
692     float[] seqFloatRet = xBT2.setSequenceFloat(arFloat);
693     bRet = check( compareData(seqFloatRet, arFloat), "sequence test") && bRet;
694     double[] seqDoubleRet = xBT2.setSequenceDouble(arDouble);
695     bRet = check( compareData(seqDoubleRet, arDouble), "sequence test") && bRet;
696     TestEnum[] seqEnumRet = xBT2.setSequenceEnum(arEnum);
697     bRet = check( compareData(seqEnumRet, arEnum), "sequence test") && bRet;
698     UInt16[] seqUShortRet = xBT2.setSequenceUShort(arUShort);
699     bRet = check( compareData(seqUShortRet, arUShort), "sequence test") && bRet;
700     UInt32[] seqULongRet = xBT2.setSequenceULong(arULong);
701     bRet = check( compareData(seqULongRet, arULong), "sequence test") && bRet;
702     UInt64[] seqUHyperRet = xBT2.setSequenceUHyper(arUHyper);
703     bRet = check( compareData(seqUHyperRet, arUHyper), "sequence test") && bRet;
704     Object[] seqObjectRet = xBT2.setSequenceXInterface(arObject);
705     bRet = check( compareData(seqObjectRet, arObject), "sequence test") && bRet;
706     string[] seqStringRet = xBT2.setSequenceString(arString);
707     bRet = check( compareData(seqStringRet, arString), "sequence test") && bRet;
708     TestElement[] seqStructRet = xBT2.setSequenceStruct(arStruct);
709     bRet = check( compareData(seqStructRet, arStruct), "sequence test") && bRet;
710     }
711     {
712     bool[] arBoolTemp = (bool[]) arBool.Clone();
713     char[] arCharTemp = (char[]) arChar.Clone();
714     byte[] arByteTemp = (byte[]) arByte.Clone();
715     short[] arShortTemp = (short[]) arShort.Clone();
716     UInt16[] arUShortTemp = (UInt16[]) arUShort.Clone();
717     int[] arLongTemp = (int[]) arLong.Clone();
718     UInt32[] arULongTemp = (UInt32[]) arULong.Clone();
719     long[] arHyperTemp = (long[]) arHyper.Clone();
720     UInt64[] arUHyperTemp = (UInt64[]) arUHyper.Clone();
721     float[] arFloatTemp = (float[]) arFloat.Clone();
722     double[] arDoubleTemp = (double[]) arDouble.Clone();
723     TestEnum[] arEnumTemp = (TestEnum[]) arEnum.Clone();
724     string[] arStringTemp = (string[]) arString.Clone();
725     Object[] arObjectTemp = (Object[]) arObject.Clone();
726     Any[] arAnyTemp = (Any[]) arAny.Clone();
727     // make sure this are has the same contents as arLong3[0]
728     int[][] arLong2Temp = new int[][]{new int[]{1,2,3},new int[]{4,5,6}, new int[]{7,8,9} };
729     // make sure this are has the same contents as arLong3
730     int[][][] arLong3Temp = new int[][][]{
731         new int[][]{new int[]{1,2,3},new int[]{4,5,6}, new int[]{7,8,9} },
732         new int [][]{new int[]{1,2,3},new int[]{4,5,6}, new int[]{7,8,9}},
733         new int[][]{new int[]{1,2,3},new int[]{4,5,6}, new int[]{7,8,9}}};
734 
735     xBT2.setSequencesInOut(ref arBoolTemp, ref arCharTemp, ref arByteTemp,
736                            ref arShortTemp, ref arUShortTemp, ref arLongTemp,
737                            ref arULongTemp,ref arHyperTemp, ref arUHyperTemp,
738                            ref arFloatTemp,ref arDoubleTemp, ref arEnumTemp,
739                            ref arStringTemp, ref  arObjectTemp,
740                            ref arAnyTemp, ref arLong2Temp, ref arLong3Temp);
741     bRet = check(
742         compareData(arBoolTemp, arBool) &&
743         compareData(arCharTemp , arChar) &&
744         compareData(arByteTemp , arByte) &&
745         compareData(arShortTemp , arShort) &&
746         compareData(arUShortTemp , arUShort) &&
747         compareData(arLongTemp , arLong) &&
748         compareData(arULongTemp , arULong) &&
749         compareData(arHyperTemp , arHyper) &&
750         compareData(arUHyperTemp , arUHyper) &&
751         compareData(arFloatTemp , arFloat) &&
752         compareData(arDoubleTemp , arDouble) &&
753         compareData(arEnumTemp , arEnum) &&
754         compareData(arStringTemp , arString) &&
755         compareData(arObjectTemp , arObject) &&
756         compareData(arAnyTemp , arAny) &&
757         compareData(arLong2Temp , arLong3[0]) &&
758         compareData(arLong3Temp , arLong3), "sequence test") && bRet;
759 
760     bool[] arBoolOut;
761     char[] arCharOut;
762     byte[] arByteOut;
763     short[] arShortOut;
764     UInt16[] arUShortOut;
765     int[] arLongOut;
766     UInt32[] arULongOut;
767     long[] arHyperOut;
768     UInt64[] arUHyperOut;
769     float[] arFloatOut;
770     double[] arDoubleOut;
771     TestEnum[] arEnumOut;
772     string[] arStringOut;
773     Object[] arObjectOut;
774     Any[] arAnyOut;
775     int[][] arLong2Out;
776     int[][][] arLong3Out;
777 
778     xBT2.setSequencesOut(out arBoolOut, out arCharOut, out arByteOut,
779                          out arShortOut, out arUShortOut, out arLongOut,
780                          out arULongOut, out arHyperOut, out arUHyperOut,
781                          out arFloatOut, out arDoubleOut, out arEnumOut,
782                          out arStringOut, out arObjectOut, out arAnyOut,
783                          out arLong2Out, out arLong3Out);
784     bRet = check(
785         compareData(arBoolOut, arBool) &&
786         compareData(arCharOut, arChar) &&
787         compareData(arByteOut, arByte) &&
788         compareData(arShortOut, arShort) &&
789         compareData(arUShortOut, arUShort) &&
790         compareData(arLongOut, arLong) &&
791         compareData(arULongOut, arULong) &&
792         compareData(arHyperOut, arHyper) &&
793         compareData(arUHyperOut, arUHyper) &&
794         compareData(arFloatOut, arFloat) &&
795         compareData(arDoubleOut, arDouble) &&
796         compareData(arEnumOut, arEnum) &&
797         compareData(arStringOut, arString) &&
798         compareData(arObjectOut, arObject) &&
799         compareData(arAnyOut, arAny) &&
800         compareData(arLong2Out, arLong3[0]) &&
801         compareData(arLong3Out, arLong3), "sequence test") && bRet;
802     }
803     {
804     //test with empty sequences
805     int[][] _arLong2 = new int[0][];
806     int[][] seqSeqRet = xBT2.setDim2(_arLong2);
807     bRet = check( compareData(seqSeqRet, _arLong2), "sequence test") && bRet;
808     int[][][] _arLong3 = new int[0][][];
809     int[][][] seqSeqRet2 = xBT2.setDim3(_arLong3);
810     bRet = check( compareData(seqSeqRet2, _arLong3), "sequence test") && bRet;
811     Any[] _arAny = new Any[0];
812     Any[] seqAnyRet = xBT2.setSequenceAny(_arAny);
813     bRet = check( compareData(seqAnyRet, _arAny), "sequence test") && bRet;
814     bool[] _arBool = new bool[0];
815     bool[] seqBoolRet = xBT2.setSequenceBool(_arBool);
816     bRet = check( compareData(seqBoolRet, _arBool), "sequence test") && bRet;
817     byte[] _arByte = new byte[0];
818     byte[] seqByteRet = xBT2.setSequenceByte(_arByte);
819     bRet = check( compareData(seqByteRet, _arByte), "sequence test") && bRet;
820     char[] _arChar = new char[0];
821     char[] seqCharRet = xBT2.setSequenceChar(_arChar);
822     bRet = check( compareData(seqCharRet, _arChar), "sequence test") && bRet;
823     short[] _arShort = new short[0];
824     short[] seqShortRet = xBT2.setSequenceShort(_arShort);
825     bRet = check( compareData(seqShortRet, _arShort), "sequence test") && bRet;
826     int[] _arLong = new int[0];
827     int[] seqLongRet = xBT2.setSequenceLong(_arLong);
828     bRet = check( compareData(seqLongRet, _arLong), "sequence test") && bRet;
829     long[] _arHyper = new long[0];
830     long[] seqHyperRet = xBT2.setSequenceHyper(_arHyper);
831     bRet = check( compareData(seqHyperRet, _arHyper), "sequence test") && bRet;
832     float[] _arFloat = new float[0];
833     float[] seqFloatRet = xBT2.setSequenceFloat(_arFloat);
834     bRet = check( compareData(seqFloatRet, _arFloat), "sequence test") && bRet;
835     double[] _arDouble = new double[0];
836     double[] seqDoubleRet = xBT2.setSequenceDouble(_arDouble);
837     bRet = check( compareData(seqDoubleRet, _arDouble), "sequence test") && bRet;
838     TestEnum[] _arEnum = new TestEnum[0];
839     TestEnum[] seqEnumRet = xBT2.setSequenceEnum(_arEnum);
840     bRet = check( compareData(seqEnumRet, _arEnum), "sequence test") && bRet;
841     UInt16[] _arUShort = new UInt16[0];
842     UInt16[] seqUShortRet = xBT2.setSequenceUShort(_arUShort);
843     bRet = check( compareData(seqUShortRet, _arUShort), "sequence test") && bRet;
844     UInt32[] _arULong = new UInt32[0];
845     UInt32[] seqULongRet = xBT2.setSequenceULong(_arULong);
846     bRet = check( compareData(seqULongRet, _arULong), "sequence test") && bRet;
847     UInt64[] _arUHyper = new UInt64[0];
848     UInt64[] seqUHyperRet = xBT2.setSequenceUHyper(_arUHyper);
849     bRet = check( compareData(seqUHyperRet, _arUHyper), "sequence test") && bRet;
850     Object[] _arObject = new Object[0];
851     Object[] seqObjectRet = xBT2.setSequenceXInterface(_arObject);
852     bRet = check( compareData(seqObjectRet, _arObject), "sequence test") && bRet;
853     string[] _arString = new string[0];
854     string[] seqStringRet = xBT2.setSequenceString(_arString);
855     bRet = check( compareData(seqStringRet, _arString), "sequence test") && bRet;
856     TestElement[] _arStruct = new TestElement[0];
857     TestElement[] seqStructRet = xBT2.setSequenceStruct(_arStruct);
858     bRet = check( compareData(seqStructRet, _arStruct), "sequence test") && bRet;
859 
860     }
861 
862 
863     return bRet;
864 }
865 /** Test the System::Object method on the proxy object
866  */
867 static bool testObjectMethodsImplemention(XBridgeTest xLBT)
868 {
869     bool ret = false;
870     Object obj = new Object();
871 	Object xInt = (Object) xLBT;
872 	XBridgeTestBase xBase = xLBT as XBridgeTestBase;
873 	if (xBase == null)
874 		return false;
875 	// Object.Equals
876 	ret = xLBT.Equals(obj) == false;
877 	ret = xLBT.Equals(xLBT) && ret;
878 	ret = Object.Equals(obj, obj) && ret;
879 	ret = Object.Equals(xLBT, xBase) && ret;
880 	//Object.GetHashCode
881 	// Don't know how to verify this. Currently it is not possible to get the object id from a proxy
882 	int nHash = xLBT.GetHashCode();
883 	ret = nHash == xBase.GetHashCode() && ret;
884 
885 	//Object.ToString
886     // Don't know how to verify this automatically.
887 	string s = xLBT.ToString();
888     ret = (s.Length > 0) && ret;
889     return ret;
890 }
891 
892 
893 static bool raiseOnewayException(XBridgeTest xLBT)
894 {
895     bool bReturn = true;
896 	string sCompare = Constants.STRING_TEST_CONSTANT;
897 	try
898 	{
899 		// Note : the exception may fly or not (e.g. remote scenario).
900 		//        When it flies, it must contain the correct elements.
901 		xLBT.raiseRuntimeExceptionOneway(sCompare, xLBT.Interface );
902 	}
903 	catch (RuntimeException  e )
904 	{
905 		bReturn = ( xLBT.Interface == e.Context );
906 	}
907     return bReturn;
908 }
909 
910 // //==================================================================================================
911 static bool raiseException(XBridgeTest xLBT )
912 {
913 	int nCount = 0;
914 	try
915 	{
916 		try
917 		{
918 			try
919 			{
920 				TestDataElements aRet = new TestDataElements();
921                 TestDataElements aRet2 = new TestDataElements();
922 				xLBT.raiseException(
923 					5, Constants.STRING_TEST_CONSTANT, xLBT.Interface );
924 			}
925 			catch (unoidl.com.sun.star.lang.IllegalArgumentException aExc)
926 			{
927 				if (aExc.ArgumentPosition == 5 &&
928                     aExc.Context == xLBT.Interface)
929 				{
930 					++nCount;
931 				}
932 				else
933 				{
934 					check( false, "### unexpected exception content!" );
935 				}
936 
937 				/** it is certain, that the RuntimeException testing will fail,
938                     if no */
939 				xLBT.RuntimeException = 0;
940 			}
941 		}
942 		catch (unoidl.com.sun.star.uno.RuntimeException rExc)
943 		{
944 			if (rExc.Context == xLBT.Interface )
945 			{
946 				++nCount;
947 			}
948 			else
949 			{
950 				check( false, "### unexpected exception content!" );
951 			}
952 
953 			/** it is certain, that the RuntimeException testing will fail, if no */
954             unchecked
955              {
956                  xLBT.RuntimeException = (int) 0xcafebabe;
957              }
958 		}
959 	}
960 	catch (unoidl.com.sun.star.uno.Exception  rExc)
961 	{
962 		if (rExc.Context == xLBT.Interface)
963 		{
964 			++nCount;
965 		}
966 		else
967 
968 		{
969 			check( false, "### unexpected exception content!" );
970 		}
971 		return (nCount == 3);
972 	}
973     return false;
974 }
975 
976     private void perform_test( XBridgeTest xLBT )
977     {
978         bool bRet= true;;
979        bRet = check( performTest( xLBT ), "standard test" ) && bRet;
980        bRet = check( raiseException( xLBT ) , "exception test" )&& bRet;
981        bRet = check( raiseOnewayException( xLBT ), "oneway exception test" ) && bRet;
982        bRet = check( testObjectMethodsImplemention(xLBT), "object methods test") && bRet;
983        bRet = performQueryForUnknownType( xLBT ) && bRet;
984         if ( ! bRet)
985         {
986             throw new unoidl.com.sun.star.uno.RuntimeException( "error (cli_cs_bridgetest.cs): test failed!", null);
987         }
988     }
989 
990     public BridgeTest( XComponentContext xContext )
991     {
992         m_xContext = xContext;
993     }
994 
995     private XComponentContext m_xContext;
996 
997 	public int run( String [] args )
998 	{
999 		Debug.AutoFlush = true;
1000 //		System.Diagnostics.Debugger.Launch();
1001 		try
1002 		{
1003 			if (args.Length < 1)
1004 			{
1005 				throw new RuntimeException(
1006 					"missing argument for bridgetest!", this );
1007 			}
1008 			Object test_obj =
1009 				m_xContext.getServiceManager().createInstanceWithContext(
1010 				args[ 0 ], m_xContext );
1011 
1012 			Debug.WriteLine(
1013 				"Calling object: {0}", test_obj.ToString() );
1014 
1015 			XBridgeTest xTest = (XBridgeTest) test_obj ;
1016 			perform_test( xTest );
1017 			Console.WriteLine( "\n### cli_uno C# bridgetest succeeded." );
1018 			return 0;
1019 		}
1020 		catch (unoidl.com.sun.star.uno.RuntimeException)
1021 		{
1022 			throw;
1023 		}
1024 		catch (System.Exception exc)
1025 		{
1026 			throw new unoidl.com.sun.star.uno.RuntimeException(
1027 				"cli_cs_bridgetest.cs: unexpected exception occured in XMain::run. Original exception: " +
1028 				exc.GetType().Name + "\n Message: " + exc.Message , null);
1029 		}
1030     }
1031 }
1032 
1033 }
1034