blob: 2d75b2756fcad77a1f77cfdb112962b683b841ac [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_testtools.hxx"
#using <mscorlib.dll>
#using <System.dll>
#using <cli_basetypes.dll>
#using <cli_uretypes.dll>
#using <cli_ure.dll>
#using <cli_types_bridgetest.dll>
using namespace System;
using namespace System::Diagnostics;
using namespace System::Reflection;
using namespace System::Threading;
using namespace uno;
using namespace uno::util;
using namespace unoidl::com::sun::star::uno;
using namespace unoidl::com::sun::star::lang;
//using namespace unoidl::com::sun::star::test::bridge;
using namespace unoidl::test::testtools::bridgetest;
namespace foo
{
public __gc __interface MyInterface
{
};
}
namespace cpp_bridgetest
{
__gc class ORecursiveCall: public WeakBase, public XRecursiveCall
{
public:
void callRecursivly(XRecursiveCall * xCall, int nToCall)
{
Monitor::Enter(this);
try
{
{
if (nToCall > 0)
{
nToCall --;
xCall->callRecursivly(this, nToCall);
}
}
}
__finally
{
Monitor::Exit(this);
}
}
};
public __gc class Constants
{
public:
static String* STRING_TEST_CONSTANT = new String(S"\" paco\' chorizo\\\' \"\'");
};
public __gc class BridgeTest : public WeakBase, public XMain
{
static bool compareData(Object* val1, Object* val2)
{
if (val1 == 0 && val2 == 0 || val1 == val2)
return true;
if ((val1 == 0 && val2 != 0) ||
(val1 != 0 && val2 == 0) || val1->GetType() != val2->GetType())
return false;
bool ret = false;
Type* t1 = val1->GetType();
//Sequence
if (t1->IsArray)
{
ret = compareSequence(static_cast<Array*>(val1),
static_cast<Array*>(val2));
}
//String
else if (t1 == __typeof(String))
{
ret = val1->Equals(val2);
}
// Interface implementation
else if (t1->GetInterfaces()->Length > 0 && ! t1->IsValueType)
{
ret = val1 == val2;
}
// Struct
else if ( ! t1->IsValueType)
{
ret = compareStruct(val1, val2);
}
else if (t1 == __typeof(Any))
{
Any a1 = (Any) val1;
Any a2 = (Any) val2;
ret = a1.Type == a2.Type && compareData(a1.Value, a2.Value);
}
else if (t1->IsValueType)
{
//Any, enum, int, bool char, float, double etc.
ret = val1->Equals(val2);
}
else
{
Debug::Assert(false);
}
return ret;
}
// Arrays have only one dimension
static bool compareSequence(Array* ar1, Array* ar2)
{
Debug::Assert(ar1 != 0 && ar2 != 0);
Type* t1 = ar1->GetType();
Type* t2 = ar2->GetType();
if (!(ar1->Rank == 1 && ar2->Rank == 1
&& ar1->Length == ar2->Length && t1->GetElementType() == t2->GetElementType()))
return false;
//arrays have same rank and size and element type.
int len = ar1->Length;
bool ret = true;
for (int i = 0; i < len; i++)
{
if (compareData(ar1->GetValue(i), ar2->GetValue(i)) == false)
{
ret = false;
break;
}
}
return ret;
}
static bool compareStruct(Object* val1, Object* val2)
{
Debug::Assert(val1 != 0 && val2 != 0);
Type* t1 = val1->GetType();
Type* t2 = val2->GetType();
if (t1 != t2)
return false;
FieldInfo* fields[] = t1->GetFields();
int cFields = fields->Length;
bool ret = true;
for (int i = 0; i < cFields; i++)
{
Object* fieldVal1 = fields[i]->GetValue(val1);
Object* fieldVal2 = fields[i]->GetValue(val2);
if ( ! compareData(fieldVal1, fieldVal2))
{
ret = false;
break;
}
}
return ret;
}
static bool check( bool b , String* message )
{
if ( ! b)
Console::WriteLine("{0} failed\n" , message);
return b;
}
static bool equals(TestElement* rData1, TestElement* rData2)
{
check( rData1->Bool == rData2->Bool, "### bool does not match!" );
check( rData1->Char == rData2->Char, "### char does not match!" );
check( rData1->Byte == rData2->Byte, "### byte does not match!" );
check( rData1->Short == rData2->Short, "### short does not match!" );
check( rData1->UShort == rData2->UShort, "### unsigned short does not match!" );
check( rData1->Long == rData2->Long, "### long does not match!" );
check( rData1->ULong == rData2->ULong, "### unsigned long does not match!" );
check( rData1->Hyper == rData2->Hyper, "### hyper does not match!" );
check( rData1->UHyper == rData2->UHyper, "### unsigned hyper does not match!" );
check( rData1->Float == rData2->Float, "### float does not match!" );
check( rData1->Double == rData2->Double, "### double does not match!" );
check( rData1->Enum == rData2->Enum, "### enum does not match!" );
check( rData1->String == rData2->String, "### string does not match!" );
check( rData1->Interface == rData2->Interface, "### interface does not match!" );
check( compareData(__box(rData1->Any), __box(rData2->Any)), "### any does not match!" );
return (rData1->Bool == rData2->Bool &&
rData1->Char == rData2->Char &&
rData1->Byte == rData2->Byte &&
rData1->Short == rData2->Short &&
rData1->UShort == rData2->UShort &&
rData1->Long == rData2->Long &&
rData1->ULong == rData2->ULong &&
rData1->Hyper == rData2->Hyper &&
rData1->UHyper == rData2->UHyper &&
rData1->Float == rData2->Float &&
rData1->Double == rData2->Double &&
rData1->Enum == rData2->Enum &&
rData1->String == rData2->String &&
rData1->Interface == rData2->Interface &&
compareData(__box(rData1->Any), __box(rData2->Any)));
}
static void assign( TestElement* rData,
bool bBool, Char cChar, Byte nByte,
Int16 nShort, UInt16 nUShort,
Int32 nLong, UInt32 nULong,
Int64 nHyper, UInt64 nUHyper,
float fFloat, double fDouble,
TestEnum eEnum, String* rStr,
Object* xTest,
uno::Any rAny )
{
rData->Bool = bBool;
rData->Char = cChar;
rData->Byte = nByte;
rData->Short = nShort;
rData->UShort = nUShort;
rData->Long = nLong;
rData->ULong = nULong;
rData->Hyper = nHyper;
rData->UHyper = nUHyper;
rData->Float = fFloat;
rData->Double = fDouble;
rData->Enum = eEnum;
rData->String = rStr;
rData->Interface = xTest;
rData->Any = rAny;
}
static void assign( TestDataElements* rData,
bool bBool, Char cChar, Byte nByte,
Int16 nShort, UInt16 nUShort,
Int32 nLong, UInt32 nULong,
Int64 nHyper, UInt64 nUHyper,
float fFloat, double fDouble,
TestEnum eEnum, String* rStr,
Object* xTest,
Any rAny,
TestElement* rSequence[])
{
assign( static_cast<TestElement*>(rData),
bBool, cChar, nByte, nShort, nUShort, nLong, nULong, nHyper, nUHyper, fFloat, fDouble,
eEnum, rStr, xTest, rAny );
rData->Sequence = rSequence;
}
static bool testAny(Type* typ, Object* value, XBridgeTest* xLBT )
{
Any any;
if (typ == 0)
any = Any(value->GetType(), value);
else
any = Any(typ, value);
Any any2 = xLBT->transportAny(any);
bool ret = compareData(__box(any), __box(any2));
if (!ret)
{
Console::WriteLine("any is different after roundtrip: in {0}, out {1}\n",
any.Type->FullName, any2.Type->FullName);
}
return ret;
}
static bool performAnyTest(XBridgeTest* xLBT, TestDataElements* data)
{
bool bReturn = true;
bReturn = testAny( 0, __box(data->Byte), xLBT ) && bReturn;
bReturn = testAny( 0, __box(data->Short), xLBT ) && bReturn;
bReturn = testAny( 0, __box(data->UShort), xLBT ) && bReturn;
bReturn = testAny( 0, __box(data->Long), xLBT ) && bReturn;
bReturn = testAny( 0, __box(data->ULong), xLBT ) && bReturn;
bReturn = testAny( 0, __box(data->Hyper), xLBT ) && bReturn;
bReturn = testAny( 0, __box(data->UHyper), xLBT ) && bReturn;
bReturn = testAny( 0, __box(data->Float), xLBT ) && bReturn;
bReturn = testAny( 0, __box(data->Double),xLBT ) && bReturn;
bReturn = testAny( 0, __box(data->Enum), xLBT ) && bReturn;
bReturn = testAny( 0, data->String,xLBT ) && bReturn;
bReturn = testAny(__typeof(XWeak), data->Interface,xLBT ) && bReturn;
bReturn = testAny(0, data, xLBT ) && bReturn;
{
Any a1(true);
Any a2 = xLBT->transportAny( a1 );
bReturn = compareData(__box(a2), __box(a1)) && bReturn;
}
{
Any a1('A');
Any a2 = xLBT->transportAny(a1);
bReturn = compareData( __box(a2), __box(a1)) && bReturn;
}
return bReturn;
}
static bool performSequenceOfCallTest(XBridgeTest* xLBT)
{
int i,nRounds;
int nGlobalIndex = 0;
const int nWaitTimeSpanMUSec = 10000;
for( nRounds = 0 ; nRounds < 10 ; nRounds ++ )
{
for( i = 0 ; i < nRounds ; i ++ )
{
// fire oneways
xLBT->callOneway(nGlobalIndex, nWaitTimeSpanMUSec);
nGlobalIndex++;
}
// call synchron
xLBT->call(nGlobalIndex, nWaitTimeSpanMUSec);
nGlobalIndex++;
}
return xLBT->sequenceOfCallTestPassed();
}
static bool performRecursiveCallTest(XBridgeTest* xLBT)
{
xLBT->startRecursiveCall(new ORecursiveCall(), 50);
// on failure, the test would lock up or crash
return true;
}
static bool performQueryForUnknownType(XBridgeTest* xLBT)
{
bool bRet = false;
// test queryInterface for an unknown type
try
{
__try_cast<foo::MyInterface*>(xLBT);
}
catch( System::InvalidCastException*)
{
bRet = true;
}
return bRet;
}
// //==================================================================================================
static bool performTest(XBridgeTest* xLBT)
{
check( xLBT != 0, "### no test interface!" );
bool bRet = true;
if (xLBT != 0)
{
// this data is never ever granted access to by calls other than equals(), assign()!
TestDataElements* aData = new TestDataElements(); // test against this data
Object* xI= new WeakBase();
Any aAny( __typeof(Object), xI);
assign( static_cast<TestElement*>(aData),
true, '@', 17, 0x1234, 0xfedc, 0x12345678, 0xfedcba98,
0x123456789abcdef0, 0xfedcba9876543210,
17.0815f, 3.1415926359, TestEnum::LOLA,
Constants::STRING_TEST_CONSTANT, xI,
aAny);
bRet = check( aData->Any.Value == xI, "### unexpected any!" ) && bRet;
bRet = check( !(aData->Any.Value != xI), "### unexpected any!" ) && bRet;
aData->Sequence = new TestElement*[2];
aData->Sequence[0] = new TestElement(
aData->Bool, aData->Char, aData->Byte, aData->Short,
aData->UShort, aData->Long, aData->ULong,
aData->Hyper, aData->UHyper, aData->Float,
aData->Double, aData->Enum, aData->String,
aData->Interface, aData->Any); //(TestElement) aData;
aData->Sequence[1] = new TestElement(); //is empty
// aData complete
//
// this is a manually copy of aData for first setting...
TestDataElements* aSetData = new TestDataElements;
Any aAnySet(__typeof(Object), xI);
assign( static_cast<TestElement*>(aSetData),
aData->Bool,
aData->Char,
aData->Byte,
aData->Short,
aData->UShort,
aData->Long, aData->ULong, aData->Hyper, aData->UHyper, aData->Float, aData->Double,
aData->Enum,
aData->String,
xI,
aAnySet);
aSetData->Sequence = new TestElement*[2];
aSetData->Sequence[0] = new TestElement(
aSetData->Bool, aSetData->Char, aSetData->Byte, aSetData->Short,
aSetData->UShort, aSetData->Long, aSetData->ULong,
aSetData->Hyper, aSetData->UHyper, aSetData->Float,
aSetData->Double, aSetData->Enum, aSetData->String,
aSetData->Interface, aSetData->Any); //TestElement) aSetData;
aSetData->Sequence[1] = new TestElement(); // empty struct
xLBT->setValues(
aSetData->Bool, aSetData->Char, aSetData->Byte, aSetData->Short, aSetData->UShort,
aSetData->Long, aSetData->ULong, aSetData->Hyper, aSetData->UHyper, aSetData->Float, aSetData->Double,
aSetData->Enum, aSetData->String, aSetData->Interface, aSetData->Any, aSetData->Sequence, aSetData );
{
TestDataElements* aRet = new TestDataElements();
TestDataElements* aRet2 = new TestDataElements();
xLBT->getValues(
& aRet->Bool, & aRet->Char, & aRet->Byte, & aRet->Short, & aRet->UShort,
& aRet->Long, & aRet->ULong, & aRet->Hyper, & aRet->UHyper,
& aRet->Float, & aRet->Double, & aRet->Enum, & aRet->String,
& aRet->Interface, & aRet->Any, & aRet->Sequence, & aRet2 );
bRet = check( compareData( aData, aRet ) && compareData( aData, aRet2 ) , "getValues test") && bRet;
// set last retrieved values
TestDataElements* aSV2ret = xLBT->setValues2(
& aRet->Bool, & aRet->Char, & aRet->Byte, & aRet->Short, & aRet->UShort,
& aRet->Long, & aRet->ULong, & aRet->Hyper, & aRet->UHyper, & aRet->Float,
& aRet->Double, & aRet->Enum, & aRet->String, & aRet->Interface, & aRet->Any,
& aRet->Sequence, & aRet2 );
// check inout sequence order
// => inout sequence parameter was switched by test objects
TestElement* temp = aRet->Sequence[ 0 ];
aRet->Sequence[ 0 ] = aRet->Sequence[ 1 ];
aRet->Sequence[ 1 ] = temp;
bRet = check(
compareData( aData, aSV2ret ) && compareData( aData, aRet2 ),
"getValues2 test") && bRet;
}
{
TestDataElements* aRet = new TestDataElements();
TestDataElements* aRet2 = new TestDataElements();
TestDataElements* aGVret = xLBT->getValues(
& aRet->Bool, & aRet->Char, & aRet->Byte, & aRet->Short,
& aRet->UShort, & aRet->Long, & aRet->ULong, & aRet->Hyper,
& aRet->UHyper, & aRet->Float, & aRet->Double, & aRet->Enum,
& aRet->String, & aRet->Interface, & aRet->Any, & aRet->Sequence,
& aRet2 );
bRet = check( compareData( aData, aRet ) && compareData( aData, aRet2 ) && compareData( aData, aGVret ), "getValues test" ) && bRet;
// set last retrieved values
xLBT->Bool = aRet->Bool;
xLBT->Char = aRet->Char;
xLBT->Byte = aRet->Byte;
xLBT->Short = aRet->Short;
xLBT->UShort = aRet->UShort;
xLBT->Long = aRet->Long;
xLBT->ULong = aRet->ULong;
xLBT->Hyper = aRet->Hyper;
xLBT->UHyper = aRet->UHyper;
xLBT->Float = aRet->Float;
xLBT->Double = aRet->Double;
xLBT->Enum = aRet->Enum;
xLBT->String = aRet->String;
xLBT->Interface = aRet->Interface;
xLBT->Any = aRet->Any;
xLBT->Sequence = aRet->Sequence;
xLBT->Struct = aRet2;
}
{
TestDataElements* aRet = new TestDataElements();
TestDataElements* aRet2 = new TestDataElements();
aRet->Hyper = xLBT->Hyper;
aRet->UHyper = xLBT->UHyper;
aRet->Float = xLBT->Float;
aRet->Double = xLBT->Double;
aRet->Byte = xLBT->Byte;
aRet->Char = xLBT->Char;
aRet->Bool = xLBT->Bool;
aRet->Short = xLBT->Short;
aRet->UShort = xLBT->UShort;
aRet->Long = xLBT->Long;
aRet->ULong = xLBT->ULong;
aRet->Enum = xLBT->Enum;
aRet->String = xLBT->String;
aRet->Interface = xLBT->Interface;
aRet->Any = xLBT->Any;
aRet->Sequence = xLBT->Sequence;
aRet2 = xLBT->Struct;
bRet = check( compareData( aData, aRet ) && compareData( aData, aRet2 ) , "struct comparison test") && bRet;
bRet = check(performSequenceTest(xLBT), "sequence test") && bRet;
// any test
bRet = check( performAnyTest( xLBT , aData ) , "any test" ) && bRet;
// sequence of call test
bRet = check( performSequenceOfCallTest( xLBT ) , "sequence of call test" ) && bRet;
// recursive call test
bRet = check( performRecursiveCallTest( xLBT ) , "recursive test" ) && bRet;
bRet = (compareData( aData, aRet ) && compareData( aData, aRet2 )) && bRet ;
// check setting of null reference
xLBT->Interface = 0;
aRet->Interface = xLBT->Interface;
bRet = (aRet->Interface == 0) && bRet;
}
}
return bRet;
}
static bool performSequenceTest(XBridgeTest* xBT)
{
bool bRet = true;
XBridgeTest2* xBT2 = dynamic_cast<XBridgeTest2*>(xBT);
if ( xBT2 == 0)
return false;
// perform sequence tests (XBridgeTest2)
// create the sequence which are compared with the results
bool arBool __gc[] = new bool __gc [3];
arBool[0] = true; arBool[1] = false; arBool[2] = true;
Char arChar[] = new Char[3];
arChar[0] = 'A'; arChar[1] = 'B'; arChar[2] = 'C';
Byte arByte[] = new Byte[3];
arByte[0] = 1; arByte[1] = 2; arByte[2] = 0xff;
Int16 arShort[] = new Int16[3];
arShort[0] = Int16::MinValue; arShort[1] = 1; arShort[2] = Int16::MaxValue;
UInt16 arUShort[] = new UInt16[3];
arUShort[0] = UInt16::MinValue; arUShort[1] = 1; arUShort[2] = UInt16::MaxValue;
Int32 arLong[] = new Int32[3];
arLong[0] = Int32::MinValue; arLong[1] = 1; arLong[2] = Int32::MaxValue;
UInt32 arULong[] = new UInt32[3];
arULong[0] = UInt32::MinValue; arULong[1] = 1; arULong[2] = UInt32::MaxValue;
Int64 arHyper[] = new Int64[3];
arHyper[0] = Int64::MinValue; arHyper[1] = 1; arHyper[2] = Int64::MaxValue;
UInt64 arUHyper[] = new UInt64[3];
arUHyper[0] = UInt64::MinValue; arUHyper[1] = 1;
arUHyper[2] = UInt64::MaxValue;
Single arFloat[] = new Single[3];
arFloat[0] = 1.1f; arFloat[1] = 2.2f; arFloat[2] = 3.3f;
Double arDouble[] = new Double[3];
arDouble[0] = 1.11; arDouble[1] = 2.22; arDouble[2] = 3.33;
String* arString[] = new String*[3];
arString[0] = new String("String 1");
arString[1] = new String("String 2");
arString[2] = new String("String 3");
Any arAny[] = new Any[3];
arAny[0] = Any(true); arAny[1] = Any(11111); arAny[2] = Any(3.14);
Object* arObject[] = new Object*[3];
arObject[0] = new WeakBase(); arObject[1] = new WeakBase();
arObject[1] = new WeakBase();
//TestEnum arEnum[] = new TestEnum[3];
//arEnum[0] = TestEnum::ONE; arEnum[1] = TestEnum::TWO;
//arEnum[2] = TestEnum::CHECK;
Console::WriteLine(new String("cli_cpp_bridgetest: Workaround for C++ compiler bug:"
" using Array of Int32 instead of Array of enums w"));
Int32 arEnum[] = new Int32[3];
arEnum[0] = static_cast<Int32>(TestEnum::ONE);
arEnum[1] = static_cast<Int32>(TestEnum::TWO);
arEnum[2] = static_cast<Int32>(TestEnum::CHECK);
TestElement* arStruct[] = new TestElement*[3];
arStruct[0] = new TestElement(); arStruct[1] = new TestElement();
arStruct[2] = new TestElement();
assign( arStruct[0], true, '@', 17, 0x1234, 0xfedc, 0x12345678, 0xfedcba98,
0x123456789abcdef0, 0xfedcba9876543210, 17.0815f, 3.1415926359,
TestEnum::LOLA, Constants::STRING_TEST_CONSTANT, arObject[0],
Any( __typeof(Object), arObject[0]) );
assign( arStruct[1], true, 'A', 17, 0x1234, 0xfedc, 0x12345678, 0xfedcba98,
0x123456789abcdef0, 0xfedcba9876543210, 17.0815f, 3.1415926359,
TestEnum::TWO, Constants::STRING_TEST_CONSTANT, arObject[1],
Any( __typeof(Object), arObject[1]) );
assign( arStruct[2], true, 'B', 17, 0x1234, 0xfedc, 0x12345678, 0xfedcba98,
0x123456789abcdef0, 0xfedcba9876543210, 17.0815f, 3.1415926359,
TestEnum::CHECK, Constants::STRING_TEST_CONSTANT, arObject[2],
Any( __typeof(Object), arObject[2] ) );
// int[][][] arLong3 = new int[][][]{
// new int[][]{new int[]{1,2,3},new int[]{4,5,6}, new int[]{7,8,9} },
// new int [][]{new int[]{1,2,3},new int[]{4,5,6}, new int[]{7,8,9}},
// new int[][]{new int[]{1,2,3},new int[]{4,5,6}, new int[]{7,8,9}}};
{
// Console::WriteLine(new String("cli_cpp_bridgetest:
// int[][] seqSeqRet = xBT2->setDim2(arLong3[0]);
// bRet = check( compareData(seqSeqRet, arLong3[0]), "sequence test") && bRet;
// int[][][] seqSeqRet2 = xBT2->setDim3(arLong3);
// bRet = check( compareData(seqSeqRet2, arLong3), "sequence test") && bRet;
Any seqAnyRet[] = xBT2->setSequenceAny(arAny);
bRet = check( compareData(seqAnyRet, arAny), "sequence test") && bRet;
Boolean seqBoolRet[] = xBT2->setSequenceBool(arBool);
bRet = check( compareData(seqBoolRet, arBool), "sequence test") && bRet;
Byte seqByteRet[] = xBT2->setSequenceByte(arByte);
bRet = check( compareData(seqByteRet, arByte), "sequence test") && bRet;
Char seqCharRet[] = xBT2->setSequenceChar(arChar);
bRet = check( compareData(seqCharRet, arChar), "sequence test") && bRet;
Int16 seqShortRet[] = xBT2->setSequenceShort(arShort);
bRet = check( compareData(seqShortRet, arShort), "sequence test") && bRet;
Int32 seqLongRet[] = xBT2->setSequenceLong(arLong);
bRet = check( compareData(seqLongRet, arLong), "sequence test") && bRet;
Int64 seqHyperRet[] = xBT2->setSequenceHyper(arHyper);
bRet = check( compareData(seqHyperRet,arHyper), "sequence test") && bRet;
Single seqFloatRet[] = xBT2->setSequenceFloat(arFloat);
bRet = check( compareData(seqFloatRet, arFloat), "sequence test") && bRet;
Double seqDoubleRet[] = xBT2->setSequenceDouble(arDouble);
bRet = check( compareData(seqDoubleRet, arDouble), "sequence test") && bRet;
xBT2->setSequenceEnum(arEnum);
//comparing seqEnumRet with arEnum will fail since they are of different
//types because of workaround. arEnum is Int32[].
Console::WriteLine(new String("cli_cpp_bridgetest: Test omitted because "
"of C++ compiler bug. XBridgeTest2::setSequenceEnum(sequence<TestEnum>)"));
// bRet = check( compareData(seqEnumRet, arEnum), "sequence test") && bRet;
UInt16 seqUShortRet[] = xBT2->setSequenceUShort(arUShort);
bRet = check( compareData(seqUShortRet, arUShort), "sequence test") && bRet;
UInt32 seqULongRet[] = xBT2->setSequenceULong(arULong);
bRet = check( compareData(seqULongRet, arULong), "sequence test") && bRet;
UInt64 seqUHyperRet[] = xBT2->setSequenceUHyper(arUHyper);
bRet = check( compareData(seqUHyperRet, arUHyper), "sequence test") && bRet;
Object* seqObjectRet[] = xBT2->setSequenceXInterface(arObject);
bRet = check( compareData(seqObjectRet, arObject), "sequence test") && bRet;
String* seqStringRet[] = xBT2->setSequenceString(arString);
bRet = check( compareData(seqStringRet, arString), "sequence test") && bRet;
TestElement* seqStructRet[] = xBT2->setSequenceStruct(arStruct);
bRet = check( compareData(seqStructRet, arStruct), "sequence test") && bRet;
}
{
// Boolean arBoolTemp[] = static_cast<Boolean[]>( arBool->Clone());
// Char arCharTemp[] = static_cast<Char[]>(arChar->Clone());
// Byte arByteTemp[] = static_cast<Byte[]>(arByte->Clone());
// Int16 arShortTemp[] = static_cast<Int16[]>(arShort->Clone());
// UInt16 arUShortTemp[] = static_cast<UInt16[]>(arUShort->Clone());
// Int32 arLongTemp[] = static_cast<Int32[]>(arLong->Clone());
// UInt32 arULongTemp[] = static_cast<UInt32[]>(arULong->Clone());
// Int64 arHyperTemp[] = static_cast<Int64[]>(arHyper->Clone());
// UInt64 arUHyperTemp[] = static_cast<UInt64[]>(arUHyper->Clone());
// Single arFloatTemp[] = static_cast<Single[]>(arFloat->Clone());
// Double arDoubleTemp[] = static_cast<Double[]>(arDouble->Clone());
// TestEnum arEnumTemp[] = static_cast<TestEnum[]>(arEnum->Clone());
// String* arStringTemp[] = static_cast<String*[]>(arString->Clone());
// Object* arObjectTemp = static_cast<Object*[]>(arObject->Clone());
// Any arAnyTemp[] = static_cast<Any[]>(arAny->Clone());
// // make sure this are has the same contents as arLong3[0]
// int[][] arLong2Temp = new int[][]{new int[]{1,2,3},new int[]{4,5,6}, new int[]{7,8,9} };
// // make sure this are has the same contents as arLong3
// int[][][] arLong3Temp = new int[][][]{
// new int[][]{new int[]{1,2,3},new int[]{4,5,6}, new int[]{7,8,9} },
// new int [][]{new int[]{1,2,3},new int[]{4,5,6}, new int[]{7,8,9}},
// new int[][]{new int[]{1,2,3},new int[]{4,5,6}, new int[]{7,8,9}}};
Console::WriteLine(new String("cli_cpp_bridgetest: no test of "
"XBridgeTest2::setSequencesInOut and XBridgeTest2.setSequencesOut "
"because jagged arrays are not supported by C++ compiler"));
// xBT2->setSequencesInOut(& arBoolTemp, & arCharTemp, & arByteTemp,
// & arShortTemp, & arUShortTemp, & arLongTemp,
// & arULongTemp,& arHyperTemp, & arUHyperTemp,
// & arFloatTemp,& arDoubleTemp, & arEnumTemp,
// & arStringTemp, & arObjectTemp,
// & arAnyTemp, & arLong2Temp, & arLong3Temp);
// bRet = check(
// compareData(arBoolTemp, arBool) &&
// compareData(arCharTemp , arChar) &&
// compareData(arByteTemp , arByte) &&
// compareData(arShortTemp , arShort) &&
// compareData(arUShortTemp , arUShort) &&
// compareData(arLongTemp , arLong) &&
// compareData(arULongTemp , arULong) &&
// compareData(arHyperTemp , arHyper) &&
// compareData(arUHyperTemp , arUHyper) &&
// compareData(arFloatTemp , arFloat) &&
// compareData(arDoubleTemp , arDouble) &&
// compareData(arEnumTemp , arEnum) &&
// compareData(arStringTemp , arString) &&
// compareData(arObjectTemp , arObject) &&
// compareData(arAnyTemp , arAny) &&
// compareData(arLong2Temp , arLong3[0]) &&
// compareData(arLong3Temp , arLong3), "sequence test") && bRet;
//Boolean arBoolOut[];
//Char arCharOut[];
//Byte arByteOut[];
//Int16 arShortOut[];
//UInt16 arUShortOut[];
//Int32 arLongOut[];
//UInt32 arULongOut[];
//Int64 arHyperOut[];
//UInt64 arUHyperOut[];
//Single arFloatOut[];
//Double arDoubleOut[];
//TestEnum arEnumOut[];
//String* arStringOut[];
//Object* arObjectOut[];
//Any arAnyOut[];
// int[][] arLong2Out;
// int[][][] arLong3Out;
// xBT2->setSequencesOut(out arBoolOut, out arCharOut, out arByteOut,
// out arShortOut, out arUShortOut, out arLongOut,
// out arULongOut, out arHyperOut, out arUHyperOut,
// out arFloatOut, out arDoubleOut, out arEnumOut,
// out arStringOut, out arObjectOut, out arAnyOut,
// out arLong2Out, out arLong3Out);
// bRet = check(
// compareData(arBoolOut, arBool) &&
// compareData(arCharOut, arChar) &&
// compareData(arByteOut, arByte) &&
// compareData(arShortOut, arShort) &&
// compareData(arUShortOut, arUShort) &&
// compareData(arLongOut, arLong) &&
// compareData(arULongOut, arULong) &&
// compareData(arHyperOut, arHyper) &&
// compareData(arUHyperOut, arUHyper) &&
// compareData(arFloatOut, arFloat) &&
// compareData(arDoubleOut, arDouble) &&
// compareData(arEnumOut, arEnum) &&
// compareData(arStringOut, arString) &&
// compareData(arObjectOut, arObject) &&
// compareData(arAnyOut, arAny) &&
// compareData(arLong2Out, arLong3[0]) &&
// compareData(arLong3Out, arLong3), "sequence test") && bRet;
}
{
//test with empty sequences
// int[][] _arLong2 = new int[0][];
// int[][] seqSeqRet = xBT2->setDim2(_arLong2);
// bRet = check( compareData(seqSeqRet, _arLong2), "sequence test") && bRet;
// int[][][] _arLong3 = new int[0][][];
// int[][][] seqSeqRet2 = xBT2->setDim3(_arLong3);
// bRet = check( compareData(seqSeqRet2, _arLong3), "sequence test") && bRet;
Any _arAny[] = new Any[0];
Any seqAnyRet[] = xBT2->setSequenceAny(_arAny);
bRet = check( compareData(seqAnyRet, _arAny), "sequence test") && bRet;
Boolean _arBool[] = new Boolean[0];
Boolean seqBoolRet[] = xBT2->setSequenceBool(_arBool);
bRet = check( compareData(seqBoolRet, _arBool), "sequence test") && bRet;
Byte _arByte[] = new Byte[0];
Byte seqByteRet[] = xBT2->setSequenceByte(_arByte);
bRet = check( compareData(seqByteRet, _arByte), "sequence test") && bRet;
Char _arChar[] = new Char[0];
Char seqCharRet[] = xBT2->setSequenceChar(_arChar);
bRet = check( compareData(seqCharRet, _arChar), "sequence test") && bRet;
Int16 _arShort[] = new Int16[0];
Int16 seqShortRet[] = xBT2->setSequenceShort(_arShort);
bRet = check( compareData(seqShortRet, _arShort), "sequence test") && bRet;
Int32 _arLong[] = new Int32[0];
Int32 seqLongRet[] = xBT2->setSequenceLong(_arLong);
bRet = check( compareData(seqLongRet, _arLong), "sequence test") && bRet;
Int64 _arHyper[] = new Int64[0];
Int64 seqHyperRet[] = xBT2->setSequenceHyper(_arHyper);
bRet = check( compareData(seqHyperRet, _arHyper), "sequence test") && bRet;
Single _arFloat[] = new Single[0];
Single seqFloatRet[] = xBT2->setSequenceFloat(_arFloat);
bRet = check( compareData(seqFloatRet, _arFloat), "sequence test") && bRet;
Double _arDouble[] = new Double[0];
Double seqDoubleRet[] = xBT2->setSequenceDouble(_arDouble);
bRet = check( compareData(seqDoubleRet, _arDouble), "sequence test") && bRet;
TestEnum _arEnum[] = new TestEnum[0];
xBT2->setSequenceEnum(_arEnum);
// compiler bug: _arEnum has type System.Enum and not TestEnum
// bRet = check( compareData(seqEnumRet, _arEnum), "sequence test") && bRet;
UInt16 _arUShort[] = new UInt16[0];
UInt16 seqUShortRet[] = xBT2->setSequenceUShort(_arUShort);
bRet = check( compareData(seqUShortRet, _arUShort), "sequence test") && bRet;
UInt32 _arULong[] = new UInt32[0];
UInt32 seqULongRet[] = xBT2->setSequenceULong(_arULong);
bRet = check( compareData(seqULongRet, _arULong), "sequence test") && bRet;
UInt64 _arUHyper[] = new UInt64[0];
UInt64 seqUHyperRet[] = xBT2->setSequenceUHyper(_arUHyper);
bRet = check( compareData(seqUHyperRet, _arUHyper), "sequence test") && bRet;
Object* _arObject[] = new Object*[0];
Object* seqObjectRet[] = xBT2->setSequenceXInterface(_arObject);
bRet = check( compareData(seqObjectRet, _arObject), "sequence test") && bRet;
String* _arString[] = new String*[0];
String* seqStringRet[] = xBT2->setSequenceString(_arString);
bRet = check( compareData(seqStringRet, _arString), "sequence test") && bRet;
TestElement* _arStruct[] = new TestElement*[0];
TestElement* seqStructRet[] = xBT2->setSequenceStruct(_arStruct);
bRet = check( compareData(seqStructRet, _arStruct), "sequence test") && bRet;
}
return bRet;
}
/** Test the System::Object method on the proxy object
*/
static bool testObjectMethodsImplemention(XBridgeTest* xLBT)
{
bool ret = false;
Object* obj = new Object();
XBridgeTestBase* xBase = dynamic_cast<XBridgeTestBase*>(xLBT);
if (xBase == 0)
return false;
// Object.Equals
ret = xLBT->Equals(obj) == false;
ret = xLBT->Equals(xLBT) && ret;
ret = Object::Equals(obj, obj) && ret;
ret = Object::Equals(xLBT, xBase) && ret;
//Object.GetHashCode
// Don't know how to verify this. Currently it is not possible to get the object id from a proxy
int nHash = xLBT->GetHashCode();
ret = nHash == xBase->GetHashCode() && ret;
//Object.ToString
// Don't know how to verify this automatically.
String* s = xLBT->ToString();
ret = (s->Length > 0) && ret;
return ret;
}
static bool raiseOnewayException(XBridgeTest* xLBT)
{
bool bReturn = true;
String* sCompare = Constants::STRING_TEST_CONSTANT;
try
{
// Note : the exception may fly or not (e.g. remote scenario).
// When it flies, it must contain the correct elements.
xLBT->raiseRuntimeExceptionOneway(sCompare, xLBT->Interface );
}
catch (RuntimeException* e )
{
bReturn = ( xLBT->Interface == e->Context );
}
return bReturn;
}
// //==================================================================================================
static bool raiseException(XBridgeTest* xLBT )
{
int nCount = 0;
try
{
try
{
try
{
xLBT->raiseException(
5, Constants::STRING_TEST_CONSTANT, xLBT->Interface );
}
catch (unoidl::com::sun::star::lang::IllegalArgumentException* aExc)
{
if (aExc->ArgumentPosition == 5 &&
aExc->Context == xLBT->Interface)
{
++nCount;
}
else
{
check( false, "### unexpected exception content!" );
}
/** it is certain, that the RuntimeException testing will fail,
if no */
xLBT->RuntimeException = 0;
}
}
catch (unoidl::com::sun::star::uno::RuntimeException* rExc)
{
if (rExc->Context == xLBT->Interface )
{
++nCount;
}
else
{
check( false, "### unexpected exception content!" );
}
/** it is certain, that the RuntimeException testing will fail, if no */
xLBT->RuntimeException = (int) 0xcafebabe;
}
}
catch (unoidl::com::sun::star::uno::Exception* rExc)
{
if (rExc->Context == xLBT->Interface)
{
++nCount;
}
else
{
check( false, "### unexpected exception content!" );
}
return (nCount == 3);
}
return false;
}
static private void perform_test( XBridgeTest* xLBT )
{
bool bRet= true;;
bRet = check( performTest( xLBT ), "standard test" ) && bRet;
bRet = check( raiseException( xLBT ) , "exception test" )&& bRet;
bRet = check( raiseOnewayException( xLBT ), "oneway exception test" ) && bRet;
bRet = check( testObjectMethodsImplemention(xLBT), "object methods test") && bRet;
bRet = performQueryForUnknownType( xLBT ) && bRet;
if (! bRet)
{
throw new unoidl::com::sun::star::uno::RuntimeException(
new String("error: test failed!"), 0);
}
}
XComponentContext* m_xContext;
public:
BridgeTest( XComponentContext* xContext )
{
m_xContext = xContext;
}
int run( String* args[] )
{
try
{
if (args->Length < 1)
{
throw new RuntimeException(
"missing argument for bridgetest!", this );
}
Object* test_obj =
m_xContext->getServiceManager()->createInstanceWithContext(
args[ 0 ], m_xContext );
if (test_obj == 0)
test_obj = m_xContext->getValueByName( args[ 0 ] ).Value;
Console::WriteLine(
"cli target bridgetest obj: {0}", test_obj->ToString() );
XBridgeTest* xTest = __try_cast<XBridgeTest*>(test_obj) ;
perform_test( xTest );
Console::WriteLine( "\n### cli_uno C++ bridgetest succeeded." );
return 0;
}
catch (unoidl::com::sun::star::uno::RuntimeException* )
{
throw;
}
catch (System::Exception* exc)
{
System::Text::StringBuilder* s = new System::Text::StringBuilder();
s->Append(S"cli_cpp_bridgetest: unexpected exception occured in XMain::run. Original exception: ");
s->Append(exc->GetType()->Name);
s->Append(S"\n Message: ");
s->Append(exc->Message);
throw new unoidl::com::sun::star::uno::RuntimeException(
s->ToString(), 0);
}
}
};
}