{ This file is part of the Web Service Toolkit Copyright (c) 2006, 2007 by Inoussa OUEDRAOGO This file is provide under modified LGPL licence ( the files COPYING.modifiedLGPL and COPYING.LGPL). This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. } {$INCLUDE wst_global.inc} unit test_support; interface uses Classes, SysUtils, {$IFDEF FPC} fpcunit, testregistry, {$ELSE} TestFrameWork, {$ENDIF} TypInfo, wst_types, base_service_intf; type TTestEnum = ( teOne, teTwo, teThree, teFour ); { TClass_B } TClass_B = class(TBaseComplexRemotable) private FVal_32S: LongInt; FVal_32U: LongWord; FVal_64S: Int64; FVal_64U: QWord; FVal_8S: ShortInt; FVal_8U: Byte; FVal_16S: SmallInt; FVal_16U: Word; FVal_Bool: Boolean; FVal_Enum: TTestEnum; FVal_String: string; Published property Val_Enum : TTestEnum Read FVal_Enum Write FVal_Enum; property Val_Bool : Boolean Read FVal_Bool Write FVal_Bool; property Val_String : string Read FVal_String Write FVal_String; property Val_8U : Byte Read FVal_8U Write FVal_8U; property Val_8S : ShortInt Read FVal_8S Write FVal_8S; property Val_16U : Word Read FVal_16U Write FVal_16U; property Val_16S : SmallInt Read FVal_16S Write FVal_16S; property Val_32U : LongWord Read FVal_32U Write FVal_32U; property Val_32S : LongInt Read FVal_32S Write FVal_32S; property Val_64U : QWord Read FVal_64U Write FVal_64U; property Val_64S : Int64 Read FVal_64S Write FVal_64S; End; { TClass_A } TClass_A = class(TBaseComplexRemotable) private FVal_32S: LongInt; FVal_32U: LongWord; FVal_64S: Int64; FVal_64U: QWord; FVal_8S: ShortInt; FVal_8U: Byte; FVal_16S: SmallInt; FVal_16U: Word; FVal_Bool: Boolean; FVal_Enum: TTestEnum; FVal_Obj: TClass_B; FVal_String: string; FVal_StringArray: TArrayOfStringRemotable; public constructor Create();override; destructor Destroy();override; Published property Val_Enum : TTestEnum Read FVal_Enum Write FVal_Enum; property Val_Bool : Boolean Read FVal_Bool Write FVal_Bool; property Val_String : string Read FVal_String Write FVal_String; property Val_8U : Byte Read FVal_8U Write FVal_8U; property Val_8S : ShortInt Read FVal_8S Write FVal_8S; property Val_16U : Word Read FVal_16U Write FVal_16U; property Val_16S : SmallInt Read FVal_16S Write FVal_16S; property Val_32U : LongWord Read FVal_32U Write FVal_32U; property Val_32S : LongInt Read FVal_32S Write FVal_32S; property Val_64U : QWord Read FVal_64U Write FVal_64U; property Val_64S : Int64 Read FVal_64S Write FVal_64S; property Val_Obj : TClass_B read FVal_Obj write FVal_Obj; property Val_StringArray : TArrayOfStringRemotable read FVal_StringArray write FVal_StringArray; End; TArrayOfClass_A = class(TBaseObjectArrayRemotable) private function GetItem(AIndex: Integer): TClass_A; public class function GetItemClass():TBaseRemotableClass;override; property Item[AIndex:Integer] : TClass_A Read GetItem;Default; end; { TTest_TBaseComplexRemotable } TTest_TBaseComplexRemotable = class(TTestCase) protected procedure Compare(const a,b : TClass_A);overload; procedure Compare(const a,b : TClass_B);overload; published procedure test_Assign(); procedure Equal(); end; { TTest_TBaseArrayRemotable } TTest_TBaseArrayRemotable = class(TTestCase) protected class function CreateArray() : TBaseArrayRemotable;virtual;abstract; class function GetTypeInfo() : PTypeInfo;virtual;abstract; published procedure Length_procs(); procedure GetItemTypeInfo(); end; { TTest_TArrayOfStringRemotable } TTest_TArrayOfStringRemotable = class(TTest_TBaseArrayRemotable) protected class function CreateArray() : TBaseArrayRemotable;override; class function GetTypeInfo() : PTypeInfo;override; published procedure test_Assign(); procedure GetItemAndSetItem(); procedure Equal(); end; { TTest_TArrayOfBooleanRemotable } TTest_TArrayOfBooleanRemotable = class(TTest_TBaseArrayRemotable) protected class function CreateArray() : TBaseArrayRemotable;override; class function GetTypeInfo() : PTypeInfo;override; published procedure test_Assign(); procedure GetItemAndSetItem(); end; { TTest_TArrayOfInt8URemotable } TTest_TArrayOfInt8URemotable = class(TTest_TBaseArrayRemotable) protected class function CreateArray() : TBaseArrayRemotable;override; class function GetTypeInfo() : PTypeInfo;override; published procedure test_Assign(); procedure GetItemAndSetItem(); end; { TTest_TArrayOfInt8SRemotable } TTest_TArrayOfInt8SRemotable = class(TTest_TBaseArrayRemotable) protected class function CreateArray() : TBaseArrayRemotable;override; class function GetTypeInfo() : PTypeInfo;override; published procedure test_Assign(); procedure GetItemAndSetItem(); end; { TTest_TArrayOfInt16SRemotable } TTest_TArrayOfInt16SRemotable = class(TTest_TBaseArrayRemotable) protected class function CreateArray() : TBaseArrayRemotable;override; class function GetTypeInfo() : PTypeInfo;override; published procedure test_Assign(); procedure GetItemAndSetItem(); end; { TTest_TArrayOfInt16URemotable } TTest_TArrayOfInt16URemotable = class(TTest_TBaseArrayRemotable) protected class function CreateArray() : TBaseArrayRemotable;override; class function GetTypeInfo() : PTypeInfo;override; published procedure test_Assign(); procedure GetItemAndSetItem(); end; { TTest_TArrayOfInt32URemotable } TTest_TArrayOfInt32URemotable = class(TTest_TBaseArrayRemotable) protected class function CreateArray() : TBaseArrayRemotable;override; class function GetTypeInfo() : PTypeInfo;override; published procedure test_Assign(); procedure GetItemAndSetItem(); end; { TTest_TArrayOfInt32SRemotable } TTest_TArrayOfInt32SRemotable = class(TTest_TBaseArrayRemotable) protected class function CreateArray() : TBaseArrayRemotable;override; class function GetTypeInfo() : PTypeInfo;override; published procedure test_Assign(); procedure GetItemAndSetItem(); end; { TTest_TArrayOfInt64SRemotable } TTest_TArrayOfInt64SRemotable = class(TTest_TBaseArrayRemotable) protected class function CreateArray() : TBaseArrayRemotable;override; class function GetTypeInfo() : PTypeInfo;override; published procedure test_Assign(); procedure GetItemAndSetItem(); end; { TTest_TArrayOfInt64URemotable } TTest_TArrayOfInt64URemotable = class(TTest_TBaseArrayRemotable) protected class function CreateArray() : TBaseArrayRemotable;override; class function GetTypeInfo() : PTypeInfo;override; published procedure test_Assign(); procedure GetItemAndSetItem(); end; { TTest_TArrayOfFloatSingleRemotable } TTest_TArrayOfFloatSingleRemotable = class(TTest_TBaseArrayRemotable) protected class function CreateArray() : TBaseArrayRemotable;override; class function GetTypeInfo() : PTypeInfo;override; published procedure test_Assign(); procedure GetItemAndSetItem(); end; { TTest_TArrayOfFloatDoubleRemotable } TTest_TArrayOfFloatDoubleRemotable = class(TTest_TBaseArrayRemotable) protected class function CreateArray() : TBaseArrayRemotable;override; class function GetTypeInfo() : PTypeInfo;override; published procedure test_Assign(); procedure GetItemAndSetItem(); end; { TTest_TArrayOfFloatExtendedRemotable } TTest_TArrayOfFloatExtendedRemotable = class(TTest_TBaseArrayRemotable) protected class function CreateArray() : TBaseArrayRemotable;override; class function GetTypeInfo() : PTypeInfo;override; published procedure test_Assign(); procedure GetItemAndSetItem(); end; { TTest_TArrayOfFloatCurrencyRemotable } TTest_TArrayOfFloatCurrencyRemotable = class(TTest_TBaseArrayRemotable) protected class function CreateArray() : TBaseArrayRemotable;override; class function GetTypeInfo() : PTypeInfo;override; published procedure test_Assign(); procedure GetItemAndSetItem(); end; { TTest_TBaseObjectArrayRemotable } TTest_TBaseObjectArrayRemotable = class(TTest_TBaseArrayRemotable) protected class function CreateArray() : TBaseArrayRemotable;override; class function GetTypeInfo() : PTypeInfo;override; class procedure FillRandomItem(const AItem : TBaseRemotable); procedure CompareItem(const A,B : TBaseRemotable); procedure Compare(const a,b : TClass_A);overload; procedure Compare(const a,b : TClass_B);overload; published procedure test_Assign(); procedure Equal(); end; { TTest_TDateRemotable } TTest_TDateRemotable = class(TTestCase) published procedure FormatDate(); procedure FormatDate_ZERO(); procedure ParseDate(); procedure Assign(); procedure Equal(); end; { TTest_TDurationRemotable } TTest_TDurationRemotable = class(TTestCase) published procedure FormatDate(); procedure ParseDate(); end; { TTest_TTimeRemotable } TTest_TTimeRemotable = class(TTestCase) published procedure FormatDate(); procedure ParseDate(); end; { TTest_TStringBufferRemotable } TTest_TStringBufferRemotable = class(TTestCase) published procedure test_Assign(); procedure Equal(); end; { TTest_TBase64StringRemotable } TTest_TBase64StringRemotable = class(TTestCase) published procedure test_Assign(); procedure Equal(); procedure SetBinaryData(); procedure SetEncodedString(); end; { TTest_TBase64StringExtRemotable } TTest_TBase64StringExtRemotable = class(TTestCase) published procedure Equal(); procedure SetBinaryData(); procedure SetEncodedString(); end; implementation uses Math, basex_encode; function RandomValue(const AMaxlen: Integer): ansistring; var k : Integer; begin SetLength(Result,AMaxlen); for k := 1 to AMaxlen do begin Result[k] := Char((Random(Ord(High(Char))))); end; end; { TArrayOfClass_A } function TArrayOfClass_A.GetItem(AIndex: Integer): TClass_A; begin Result := Inherited GetItem(AIndex) As TClass_A; end; class function TArrayOfClass_A.GetItemClass(): TBaseRemotableClass; begin Result:= TClass_A; end; { TTest_TBaseArrayRemotable } procedure TTest_TBaseArrayRemotable.Length_procs(); const ITER : Integer = 1000; var localObj : TBaseArrayRemotable; i : Integer; ok : Boolean; begin localObj := CreateArray(); try CheckEquals(0,localObj.Length); CheckEquals(0,localObj.Length); localObj.SetLength(0); CheckEquals(0,localObj.Length); ok := False; try localObj.SetLength(-10); except on e : EBaseRemoteException do ok := True; end; CheckEquals(True,ok); localObj.SetLength(ITER); CheckEquals(ITER,localObj.Length); for i := 0 to ITER do begin localObj.SetLength(i); CheckEquals(i,localObj.Length); end; finally FreeAndNil(localObj); end; end; procedure TTest_TBaseArrayRemotable.GetItemTypeInfo(); var localObj : TBaseArrayRemotable; a, b : PTypeInfo; begin localObj := CreateArray(); try a := GetTypeInfo(); b := localObj.GetItemTypeInfo(); CheckEquals(a^.Name,b^.Name); CheckEquals(Ord(a^.Kind),Ord(b^.Kind)); finally FreeAndNil(localObj); end; end; { TTest_TArrayOfStringRemotable } class function TTest_TArrayOfStringRemotable.CreateArray(): TBaseArrayRemotable; begin Result := TArrayOfStringRemotable.Create(); end; class function TTest_TArrayOfStringRemotable.GetTypeInfo(): PTypeInfo; begin Result := TypeInfo(ansistring); end; procedure TTest_TArrayOfStringRemotable.test_Assign(); const ITER : Integer = 100; var a, b : TArrayOfStringRemotable; i, j, k : Integer; begin Randomize(); a := TArrayOfStringRemotable.Create(); try b := TArrayOfStringRemotable.Create(); a.Assign(nil); for i := 1 to ITER do begin j := Random(ITER); a.SetLength(j); if ( j > 0 ) then begin for k := 0 to Pred(j) do begin a[k] := RandomValue(Random(500)); end; end; b.Assign(a); CheckEquals(a.Length,b.Length, 'Length'); if ( j > 0 ) then begin for k := 0 to Pred(j) do begin CheckEquals(a[k],b[k]); end; end; a.SetLength(0); a.Assign(b); CheckEquals(b.Length,a.Length, 'Length'); if ( j > 0 ) then begin for k := 0 to Pred(j) do begin CheckEquals(b[k],a[k]); end; end; end; finally FreeAndNil(a); FreeAndNil(b); end; end; procedure TTest_TArrayOfStringRemotable.GetItemAndSetItem(); const ITER : Integer = 100; var localObj : TArrayOfStringRemotable; i, j, k : Integer; a : array of ansistring; begin localObj := TArrayOfStringRemotable.Create() ; try for i := 1 to ITER do begin j := Random(ITER); SetLength(a,j); if ( j > 0 ) then begin for k := 0 to Pred(j) do begin a[k] := RandomValue(Random(500)); end; localObj.SetLength(j); for k := 0 to Pred(j) do begin localObj[k] := a[k]; end; for k := 0 to Pred(j) do begin CheckEquals(a[k],localObj[k]); end; end; end; finally FreeAndNil(localObj); end; end; procedure TTest_TArrayOfStringRemotable.Equal(); const ITER : Integer = 100; var a, b : TArrayOfStringRemotable; i, j, k : Integer; begin Randomize(); a := TArrayOfStringRemotable.Create(); try b := TArrayOfStringRemotable.Create(); CheckEquals(True,a.Equal(b)); CheckEquals(True,b.Equal(a)); for i := 1 to ITER do begin j := Random(ITER); a.SetLength(j); b.SetLength(j); if ( j > 0 ) then begin for k := 0 to Pred(j) do begin a[k] := RandomValue(1 + Random(500)); CheckEquals(False,a.Equal(b)); CheckEquals(False,b.Equal(a)); b[k] := a[k]; CheckEquals(True,a.Equal(b)); CheckEquals(True,b.Equal(a)); end; end; end; finally FreeAndNil(a); FreeAndNil(b); end; end; { TTest_TBaseComplexRemotable } procedure TTest_TBaseComplexRemotable.Compare(const a, b: TClass_A); var i, c : Integer; begin CheckEquals(True, a.Val_64S = b.Val_64S); CheckEquals(True, a.Val_64U = b.Val_64U); CheckEquals(a.Val_32S,b.Val_32S); CheckEquals(a.Val_32U,b.Val_32U); CheckEquals(a.Val_16S,b.Val_16S); CheckEquals(a.Val_16U,b.Val_16U); CheckEquals(a.Val_8S,b.Val_8S); CheckEquals(a.Val_8U,b.Val_8U); CheckEquals(a.Val_String,b.Val_String); CheckEquals(a.Val_Bool,b.Val_Bool); CheckEquals(Ord(a.Val_Enum),Ord(b.Val_Enum)); Compare(a.Val_Obj,b.Val_Obj); Check( ( ( a.Val_StringArray <> nil ) and ( b.Val_StringArray <> nil ) ) or ( ( a.Val_StringArray = nil ) and ( b.Val_StringArray = nil ) ) ); if ( a.Val_StringArray <> nil ) then begin c := a.Val_StringArray.Length; for i := 0 to Pred(c) do begin CheckEquals(a.Val_StringArray[i],b.Val_StringArray[i]); end; end; end; procedure TTest_TBaseComplexRemotable.Compare(const a, b: TClass_B); begin CheckEquals(a.Val_64S,b.Val_64S); CheckEquals(a.Val_64U,b.Val_64U); CheckEquals(a.Val_32S,b.Val_32S); CheckEquals(a.Val_32U,b.Val_32U); CheckEquals(a.Val_16S,b.Val_16S); CheckEquals(a.Val_16U,b.Val_16U); CheckEquals(a.Val_8S,b.Val_8S); CheckEquals(a.Val_8U,b.Val_8U); CheckEquals(a.Val_String,b.Val_String); CheckEquals(a.Val_Bool,b.Val_Bool); CheckEquals(Ord(a.Val_Enum),Ord(b.Val_Enum)); end; procedure TTest_TBaseComplexRemotable.test_Assign(); const ITER = 100; var a, b : TClass_A; i : Integer; begin a := TClass_A.Create(); try b := TClass_A.Create(); b.Assign(a); Compare(a,b); a.Val_64S := Random(1210); a.Val_64U := Random(1210); a.Val_32S := Random(1210); a.Val_32U := Random(1210); a.Val_16S := Random(1210); a.Val_16U := Random(1210); a.Val_8S := Random(123); a.Val_8U := Random(123); a.Val_Enum := teThree; a.Val_Bool := True; a.Val_String := RandomValue(100); a.Val_Obj.Val_64S := Random(1210); a.Val_Obj.Val_64U := Random(1210); a.Val_Obj.Val_32S := Random(1210); a.Val_Obj.Val_32U := Random(1210); a.Val_Obj.Val_16S := Random(1210); a.Val_Obj.Val_16U := Random(1210); a.Val_Obj.Val_8S := Random(123); a.Val_Obj.Val_8U := Random(123); a.Val_Obj.Val_Enum := teTwo; a.Val_Obj.Val_Bool := True; a.Val_Obj.Val_String := RandomValue(250); a.Val_StringArray.SetLength(ITER); for i := 0 to Pred(ITER) do begin a.Val_StringArray[i] := RandomValue(Random(123)); end; b.Assign(a); Compare(a,b); finally FreeAndNil(b); FreeAndNil(a); end; end; procedure TTest_TBaseComplexRemotable.Equal(); const ITER = 100; var a, b : TClass_A; cc : TClass_B; i : Integer; begin b:= nil; cc := nil; a := TClass_A.Create(); try b := TClass_A.Create(); CheckEquals(True,a.Equal(b)); CheckEquals(True,b.Equal(a)); CheckEquals(False,a.Equal(nil)); cc := TClass_B.Create(); CheckEquals(False,a.Equal(cc)); CheckEquals(False,cc.Equal(a)); a.Val_64S := Random(1210); a.Val_64U := Random(1210); b.Val_64S := a.Val_64S; b.Val_64U := a.Val_64U; CheckEquals(True,a.Equal(b)); CheckEquals(True,b.Equal(a)); a.Val_32S := Random(1210); a.Val_32U := Random(1210); a.Val_16S := Random(1210); a.Val_16U := Random(1210); a.Val_8S := Random(123); a.Val_8U := Random(123); a.Val_Enum := teThree; a.Val_Bool := True; a.Val_String := RandomValue(100); a.Val_Obj.Val_64S := Random(1210); a.Val_Obj.Val_64U := Random(1210); a.Val_Obj.Val_32S := Random(1210); a.Val_Obj.Val_32U := Random(1210); a.Val_Obj.Val_16S := Random(1210); a.Val_Obj.Val_16U := Random(1210); a.Val_Obj.Val_8S := Random(123); a.Val_Obj.Val_8U := Random(123); a.Val_Obj.Val_Enum := teTwo; a.Val_Obj.Val_Bool := True; a.Val_Obj.Val_String := RandomValue(250); a.Val_StringArray.SetLength(ITER); for i := 0 to Pred(ITER) do begin a.Val_StringArray[i] := RandomValue(Random(123)); end; CheckEquals(False,a.Equal(b)); CheckEquals(False,b.Equal(a)); b.Assign(a); CheckEquals(True,a.Equal(b)); CheckEquals(True,b.Equal(a)); finally FreeAndNil(cc); FreeAndNil(b); FreeAndNil(a); end; end; { TClass_A } constructor TClass_A.Create(); begin inherited; FVal_Obj := TClass_B.Create(); FVal_StringArray := TArrayOfStringRemotable.Create(); end; destructor TClass_A.Destroy(); begin FreeAndNil(FVal_StringArray); FreeAndNil(FVal_Obj); inherited Destroy(); end; { TTest_TBaseObjectArrayRemotable } class function TTest_TBaseObjectArrayRemotable.CreateArray(): TBaseArrayRemotable; begin Result := TArrayOfClass_A.Create(); end; class function TTest_TBaseObjectArrayRemotable.GetTypeInfo(): PTypeInfo; begin Result := TypeInfo(TClass_A); end; class procedure TTest_TBaseObjectArrayRemotable.FillRandomItem(const AItem: TBaseRemotable); var a : TClass_A; i, c : Integer; begin Randomize(); a := AItem as TClass_A; a.Val_64S := Random(1210); a.Val_64U := Random(1210); a.Val_32S := Random(1210); a.Val_32U := Random(1210); a.Val_16S := Random(1210); a.Val_16U := Random(1210); a.Val_8S := Random(123); a.Val_8U := Random(123); a.Val_Enum := teThree; a.Val_Bool := True; a.Val_String := RandomValue(100); a.Val_Obj.Val_64S := Random(1210); a.Val_Obj.Val_64U := Random(1210); a.Val_Obj.Val_32S := Random(1210); a.Val_Obj.Val_32U := Random(1210); a.Val_Obj.Val_16S := Random(1210); a.Val_Obj.Val_16U := Random(1210); a.Val_Obj.Val_8S := Random(123); a.Val_Obj.Val_8U := Random(123); a.Val_Obj.Val_Enum := teTwo; a.Val_Obj.Val_Bool := True; a.Val_Obj.Val_String := RandomValue(250); c := Random(200); a.Val_StringArray.SetLength(c); if ( c > 0 ) then begin for i := 0 to Pred(c) do begin a.Val_StringArray[i] := RandomValue(Random(500)); end; end; end; procedure TTest_TBaseObjectArrayRemotable.CompareItem(const A, B: TBaseRemotable); begin Compare(A as TClass_A, B as TClass_A); end; procedure TTest_TBaseObjectArrayRemotable.Compare(const a, b: TClass_A); var i, c : Integer; begin CheckEquals(a.Val_64S,b.Val_64S); CheckEquals(a.Val_64U,b.Val_64U); CheckEquals(a.Val_32S,b.Val_32S); CheckEquals(a.Val_32U,b.Val_32U); CheckEquals(a.Val_16S,b.Val_16S); CheckEquals(a.Val_16U,b.Val_16U); CheckEquals(a.Val_8S,b.Val_8S); CheckEquals(a.Val_8U,b.Val_8U); CheckEquals(a.Val_String,b.Val_String); CheckEquals(a.Val_Bool,b.Val_Bool); CheckEquals(Ord(a.Val_Enum),Ord(b.Val_Enum)); Compare(a.Val_Obj,b.Val_Obj); Check( ( ( a.Val_StringArray <> nil ) and ( b.Val_StringArray <> nil ) ) or ( ( a.Val_StringArray = nil ) and ( b.Val_StringArray = nil ) ) ); if ( a.Val_StringArray <> nil ) then begin c := a.Val_StringArray.Length; for i := 0 to Pred(c) do begin CheckEquals(a.Val_StringArray[i],b.Val_StringArray[i]); end; end; end; procedure TTest_TBaseObjectArrayRemotable.Compare(const a, b: TClass_B); begin CheckEquals(a.Val_64S,b.Val_64S); CheckEquals(a.Val_64U,b.Val_64U); CheckEquals(a.Val_32S,b.Val_32S); CheckEquals(a.Val_32U,b.Val_32U); CheckEquals(a.Val_16S,b.Val_16S); CheckEquals(a.Val_16U,b.Val_16U); CheckEquals(a.Val_8S,b.Val_8S); CheckEquals(a.Val_8U,b.Val_8U); CheckEquals(a.Val_String,b.Val_String); CheckEquals(a.Val_Bool,b.Val_Bool); CheckEquals(Ord(a.Val_Enum),Ord(b.Val_Enum)); end; procedure TTest_TBaseObjectArrayRemotable.test_Assign(); const ITER : Integer = 100; var a, b : TBaseObjectArrayRemotable; i, j, k : Integer; begin Randomize(); a := CreateArray() as TBaseObjectArrayRemotable; try b := CreateArray() as TBaseObjectArrayRemotable; a.Assign(nil); for i := 1 to ITER do begin j := Random(20); a.SetLength(j); if ( j > 0 ) then begin for k := 0 to Pred(j) do begin FillRandomItem(a.Item[k]); end; end; b.Assign(a); CheckEquals(a.Length,b.Length, 'Length'); if ( j > 0 ) then begin for k := 0 to Pred(j) do begin CompareItem(a[k],b[k]); end; end; a.SetLength(0); a.Assign(b); CheckEquals(b.Length,a.Length, 'Length'); if ( j > 0 ) then begin for k := 0 to Pred(j) do begin CompareItem(b[k],a[k]); end; end; end; finally FreeAndNil(a); FreeAndNil(b); end; end; procedure TTest_TBaseObjectArrayRemotable.Equal(); const ITER : Integer = 100; var a, b : TBaseObjectArrayRemotable; aa : TClass_A; i, j, k : Integer; begin Randomize(); aa := nil; a := CreateArray() as TBaseObjectArrayRemotable; try b := CreateArray() as TBaseObjectArrayRemotable; aa := TClass_A.Create(); CheckEquals(True,a.Equal(b)); CheckEquals(True,b.Equal(a)); CheckEquals(False,a.Equal(nil)); CheckEquals(False,a.Equal(aa)); CheckEquals(False,aa.Equal(a)); for i := 1 to ITER do begin Randomize(); j := Random(20); FreeAndNil(a); FreeAndNil(b); a := CreateArray() as TBaseObjectArrayRemotable; b := CreateArray() as TBaseObjectArrayRemotable; a.SetLength(j); b.SetLength(j); if ( j > 0 ) then begin TClass_A(b.Item[0]).Val_String := 'azertyqwerty'; for k := 0 to Pred(j) do begin //FillRandomItem(a.Item[k]); //FillRandomItem(b.Item[k]); //CheckEquals(False,b.Equal(a), '1111'); //CheckEquals(False,a.Equal(b), '2222'); b.Item[k].Assign(a.Item[k]); CheckEquals(True,a.Equal(b)); CheckEquals(True,b.Equal(a)); end; end; end; finally FreeAndNil(aa); FreeAndNil(a); FreeAndNil(b); end; end; { TTest_TArrayOfBooleanRemotable } class function TTest_TArrayOfBooleanRemotable.CreateArray(): TBaseArrayRemotable; begin Result:= TArrayOfBooleanRemotable.Create(); end; class function TTest_TArrayOfBooleanRemotable.GetTypeInfo(): PTypeInfo; begin Result := TypeInfo(Boolean); end; procedure TTest_TArrayOfBooleanRemotable.test_Assign(); const ITER : Integer = 100; var a, b : TArrayOfBooleanRemotable; i, j, k : Integer; begin Randomize(); a := TArrayOfBooleanRemotable.Create(); try b := TArrayOfBooleanRemotable.Create(); a.Assign(nil); for i := 1 to ITER do begin j := Random(ITER); a.SetLength(j); if ( j > 0 ) then begin for k := 0 to Pred(j) do begin a[k] := ( ( k mod 3 ) = 0 ); end; end; b.Assign(a); CheckEquals(a.Length,b.Length, 'Length'); if ( j > 0 ) then begin for k := 0 to Pred(j) do begin CheckEquals(a[k],b[k]); end; end; a.SetLength(0); a.Assign(b); CheckEquals(b.Length,a.Length, 'Length'); if ( j > 0 ) then begin for k := 0 to Pred(j) do begin CheckEquals(b[k],a[k]); end; end; end; finally FreeAndNil(a); FreeAndNil(b); end; end; procedure TTest_TArrayOfBooleanRemotable.GetItemAndSetItem(); const ITER : Integer = 100; var localObj : TArrayOfBooleanRemotable; i, j, k : Integer; a : array of Boolean; begin localObj := TArrayOfBooleanRemotable.Create() ; try for i := 1 to ITER do begin j := Random(ITER); SetLength(a,j); if ( j > 0 ) then begin for k := 0 to Pred(j) do begin a[k] := ( ( k mod 5 ) = 1 ); end; localObj.SetLength(j); for k := 0 to Pred(j) do begin localObj[k] := a[k]; end; for k := 0 to Pred(j) do begin CheckEquals(a[k],localObj[k]); end; end; end; finally FreeAndNil(localObj); end; end; { TTest_TArrayOfInt8URemotable } class function TTest_TArrayOfInt8URemotable.CreateArray(): TBaseArrayRemotable; begin Result := TArrayOfInt8URemotable.Create(); end; class function TTest_TArrayOfInt8URemotable.GetTypeInfo(): PTypeInfo; begin Result := TypeInfo(Byte); end; procedure TTest_TArrayOfInt8URemotable.test_Assign(); const ITER : Integer = 100; var a, b : TArrayOfInt8URemotable; i, j, k : Integer; begin Randomize(); a := TArrayOfInt8URemotable.Create(); try b := TArrayOfInt8URemotable.Create(); a.Assign(nil); for i := 1 to ITER do begin j := Random(ITER); a.SetLength(j); if ( j > 0 ) then begin for k := 0 to Pred(j) do begin a[k] := Random(High(Byte) - 1); end; end; b.Assign(a); CheckEquals(a.Length,b.Length, 'Length'); if ( j > 0 ) then begin for k := 0 to Pred(j) do begin CheckEquals(a[k],b[k]); end; end; a.SetLength(0); a.Assign(b); CheckEquals(b.Length,a.Length, 'Length'); if ( j > 0 ) then begin for k := 0 to Pred(j) do begin CheckEquals(b[k],a[k]); end; end; end; finally FreeAndNil(a); FreeAndNil(b); end; end; procedure TTest_TArrayOfInt8URemotable.GetItemAndSetItem(); const ITER : Integer = 100; var localObj : TArrayOfInt8URemotable; i, j, k : Integer; a : array of Byte; begin Randomize(); localObj := TArrayOfInt8URemotable.Create() ; try for i := 1 to ITER do begin j := Random(ITER); SetLength(a,j); if ( j > 0 ) then begin for k := 0 to Pred(j) do begin a[k] := Random(High(Byte) - 1 ); end; localObj.SetLength(j); for k := 0 to Pred(j) do begin localObj[k] := a[k]; end; for k := 0 to Pred(j) do begin CheckEquals(a[k],localObj[k]); end; end; end; finally FreeAndNil(localObj); end; end; { TTest_TArrayOfInt8SRemotable } class function TTest_TArrayOfInt8SRemotable.CreateArray(): TBaseArrayRemotable; begin Result := TArrayOfInt8SRemotable.Create(); end; class function TTest_TArrayOfInt8SRemotable.GetTypeInfo(): PTypeInfo; begin Result := TypeInfo(ShortInt); end; procedure TTest_TArrayOfInt8SRemotable.test_Assign(); const ITER : Integer = 100; var a, b : TArrayOfInt8SRemotable; i, j, k : Integer; begin Randomize(); a := TArrayOfInt8SRemotable.Create(); try b := TArrayOfInt8SRemotable.Create(); a.Assign(nil); for i := 1 to ITER do begin j := Random(ITER); a.SetLength(j); if ( j > 0 ) then begin for k := 0 to Pred(j) do begin if ( ( k mod 2 ) = 0 ) then a[k] := Random(High(ShortInt) - 1) else a[k] := -Random(High(ShortInt) - 2); end; end; b.Assign(a); CheckEquals(a.Length,b.Length, 'Length'); if ( j > 0 ) then begin for k := 0 to Pred(j) do begin CheckEquals(a[k],b[k]); end; end; a.SetLength(0); a.Assign(b); CheckEquals(b.Length,a.Length, 'Length'); if ( j > 0 ) then begin for k := 0 to Pred(j) do begin CheckEquals(b[k],a[k]); end; end; end; finally FreeAndNil(a); FreeAndNil(b); end; end; procedure TTest_TArrayOfInt8SRemotable.GetItemAndSetItem(); const ITER : Integer = 100; var localObj : TArrayOfInt8SRemotable; i, j, k : Integer; a : array of ShortInt; begin Randomize(); localObj := TArrayOfInt8SRemotable.Create() ; try for i := 1 to ITER do begin j := Random(ITER); SetLength(a,j); if ( j > 0 ) then begin for k := 0 to Pred(j) do begin a[k] := Random(High(ShortInt) -1); end; localObj.SetLength(j); for k := 0 to Pred(j) do begin localObj[k] := a[k]; end; for k := 0 to Pred(j) do begin CheckEquals(a[k],localObj[k]); end; end; end; finally FreeAndNil(localObj); end; end; { TTest_TArrayOfInt16SRemotable } class function TTest_TArrayOfInt16SRemotable.CreateArray(): TBaseArrayRemotable; begin Result := TArrayOfInt16SRemotable.Create(); end; class function TTest_TArrayOfInt16SRemotable.GetTypeInfo(): PTypeInfo; begin Result := TypeInfo(SmallInt); end; procedure TTest_TArrayOfInt16SRemotable.test_Assign(); const ITER : Integer = 100; var a, b : TArrayOfInt16SRemotable; i, j, k : Integer; begin Randomize(); a := TArrayOfInt16SRemotable.Create(); try b := TArrayOfInt16SRemotable.Create(); a.Assign(nil); for i := 1 to ITER do begin j := Random(ITER); a.SetLength(j); if ( j > 0 ) then begin for k := 0 to Pred(j) do begin if ( ( k mod 2 ) = 0 ) then a[k] := Random(High(SmallInt) -1) else a[k] := -Random(High(SmallInt) - 2); end; end; b.Assign(a); CheckEquals(a.Length,b.Length, 'Length'); if ( j > 0 ) then begin for k := 0 to Pred(j) do begin CheckEquals(a[k],b[k]); end; end; a.SetLength(0); a.Assign(b); CheckEquals(b.Length,a.Length, 'Length'); if ( j > 0 ) then begin for k := 0 to Pred(j) do begin CheckEquals(b[k],a[k]); end; end; end; finally FreeAndNil(a); FreeAndNil(b); end; end; procedure TTest_TArrayOfInt16SRemotable.GetItemAndSetItem(); const ITER : Integer = 100; var localObj : TArrayOfInt16SRemotable; i, j, k : Integer; a : array of SmallInt; begin Randomize(); localObj := TArrayOfInt16SRemotable.Create() ; try for i := 1 to ITER do begin j := Random(ITER); SetLength(a,j); if ( j > 0 ) then begin for k := 0 to Pred(j) do begin if ( ( k mod 2 ) = 0 ) then a[k] := Random(High(SmallInt) -1 ) else a[k] := -Random(High(SmallInt) -2); end; localObj.SetLength(j); for k := 0 to Pred(j) do begin localObj[k] := a[k]; end; for k := 0 to Pred(j) do begin CheckEquals(a[k],localObj[k]); end; end; end; finally FreeAndNil(localObj); end; end; { TTest_TArrayOfInt16URemotable } class function TTest_TArrayOfInt16URemotable.CreateArray(): TBaseArrayRemotable; begin Result := TArrayOfInt16URemotable.Create(); end; class function TTest_TArrayOfInt16URemotable.GetTypeInfo(): PTypeInfo; begin Result := TypeInfo(Word); end; procedure TTest_TArrayOfInt16URemotable.test_Assign(); const ITER : Integer = 100; var localObj : TArrayOfInt16URemotable; i, j, k : Integer; a : array of Word; begin Randomize(); localObj := TArrayOfInt16URemotable.Create() ; try for i := 1 to ITER do begin j := Random(ITER); SetLength(a,j); if ( j > 0 ) then begin for k := 0 to Pred(j) do begin a[k] := Random(High(Word)-1); end; localObj.SetLength(j); for k := 0 to Pred(j) do begin localObj[k] := a[k]; end; for k := 0 to Pred(j) do begin CheckEquals(a[k],localObj[k]); end; end; end; finally FreeAndNil(localObj); end; end; procedure TTest_TArrayOfInt16URemotable.GetItemAndSetItem(); const ITER : Integer = 100; var localObj : TArrayOfInt16URemotable; i, j, k : Integer; a : array of Word; begin Randomize(); localObj := TArrayOfInt16URemotable.Create() ; try for i := 1 to ITER do begin j := Random(ITER); SetLength(a,j); if ( j > 0 ) then begin for k := 0 to Pred(j) do begin a[k] := Random(High(Word)-1); end; localObj.SetLength(j); for k := 0 to Pred(j) do begin localObj[k] := a[k]; end; for k := 0 to Pred(j) do begin CheckEquals(a[k],localObj[k]); end; end; end; finally FreeAndNil(localObj); end; end; { TTest_TArrayOfInt32URemotable } class function TTest_TArrayOfInt32URemotable.CreateArray(): TBaseArrayRemotable; begin Result := TArrayOfInt32URemotable.Create(); end; class function TTest_TArrayOfInt32URemotable.GetTypeInfo(): PTypeInfo; begin Result := TypeInfo(LongWord); end; procedure TTest_TArrayOfInt32URemotable.test_Assign(); const ITER : Integer = 100; var localObj : TArrayOfInt32URemotable; i, j, k : Integer; a : array of LongWord; begin Randomize(); localObj := TArrayOfInt32URemotable.Create() ; try for i := 1 to ITER do begin j := Random(ITER); SetLength(a,j); if ( j > 0 ) then begin for k := 0 to Pred(j) do begin a[k] := Random(High(LongWord)-2); end; localObj.SetLength(j); for k := 0 to Pred(j) do begin localObj[k] := a[k]; end; for k := 0 to Pred(j) do begin CheckEquals(a[k],localObj[k]); end; end; end; finally FreeAndNil(localObj); end; end; procedure TTest_TArrayOfInt32URemotable.GetItemAndSetItem(); const ITER : Integer = 100; var localObj : TArrayOfInt32URemotable; i, j, k : Integer; a : array of LongWord; begin Randomize(); localObj := TArrayOfInt32URemotable.Create() ; try for i := 1 to ITER do begin j := Random(ITER); SetLength(a,j); if ( j > 0 ) then begin for k := 0 to Pred(j) do begin a[k] := Random(High(LongWord)-1); end; localObj.SetLength(j); for k := 0 to Pred(j) do begin localObj[k] := a[k]; end; for k := 0 to Pred(j) do begin CheckEquals(a[k],localObj[k]); end; end; end; finally FreeAndNil(localObj); end; end; { TTest_TArrayOfInt32SRemotable } class function TTest_TArrayOfInt32SRemotable.CreateArray(): TBaseArrayRemotable; begin Result := TArrayOfInt32SRemotable.Create(); end; class function TTest_TArrayOfInt32SRemotable.GetTypeInfo(): PTypeInfo; begin Result := TypeInfo(LongInt); end; procedure TTest_TArrayOfInt32SRemotable.test_Assign(); const ITER : Integer = 100; var a, b : TArrayOfInt32SRemotable; i, j, k : Integer; begin Randomize(); a := TArrayOfInt32SRemotable.Create(); try b := TArrayOfInt32SRemotable.Create(); a.Assign(nil); for i := 1 to ITER do begin j := Random(ITER); a.SetLength(j); if ( j > 0 ) then begin for k := 0 to Pred(j) do begin if ( ( k mod 2 ) = 0 ) then a[k] := Random(High(LongInt) -1) else a[k] := -Random(High(LongInt) - 2); end; end; b.Assign(a); CheckEquals(a.Length,b.Length, 'Length'); if ( j > 0 ) then begin for k := 0 to Pred(j) do begin CheckEquals(a[k],b[k]); end; end; a.SetLength(0); a.Assign(b); CheckEquals(b.Length,a.Length, 'Length'); if ( j > 0 ) then begin for k := 0 to Pred(j) do begin CheckEquals(b[k],a[k]); end; end; end; finally FreeAndNil(a); FreeAndNil(b); end; end; procedure TTest_TArrayOfInt32SRemotable.GetItemAndSetItem(); const ITER : Integer = 100; var localObj : TArrayOfInt32SRemotable; i, j, k : Integer; a : array of LongInt; begin Randomize(); localObj := TArrayOfInt32SRemotable.Create() ; try for i := 1 to ITER do begin j := Random(ITER); SetLength(a,j); if ( j > 0 ) then begin for k := 0 to Pred(j) do begin if ( ( k mod 2 ) = 0 ) then a[k] := Random(High(LongInt) -1 ) else a[k] := -Random(High(LongInt) -2); end; localObj.SetLength(j); for k := 0 to Pred(j) do begin localObj[k] := a[k]; end; for k := 0 to Pred(j) do begin CheckEquals(a[k],localObj[k]); end; end; end; finally FreeAndNil(localObj); end; end; { TTest_TArrayOfInt64SRemotable } class function TTest_TArrayOfInt64SRemotable.CreateArray(): TBaseArrayRemotable; begin Result := TArrayOfInt64SRemotable.Create(); end; class function TTest_TArrayOfInt64SRemotable.GetTypeInfo(): PTypeInfo; begin Result := TypeInfo(Int64); end; procedure TTest_TArrayOfInt64SRemotable.test_Assign(); const ITER : Integer = 100; var a, b : TArrayOfInt64SRemotable; i, j, k : Integer; begin Randomize(); a := TArrayOfInt64SRemotable.Create(); try b := TArrayOfInt64SRemotable.Create(); a.Assign(nil); for i := 1 to ITER do begin j := Random(ITER); a.SetLength(j); if ( j > 0 ) then begin for k := 0 to Pred(j) do begin if ( ( k mod 2 ) = 0 ) then a[k] := Random(High(Int64) -1) else a[k] := -Random(High(Int64) - 2); end; end; b.Assign(a); CheckEquals(a.Length,b.Length, 'Length'); if ( j > 0 ) then begin for k := 0 to Pred(j) do begin Check(a[k] = b[k]); end; end; a.SetLength(0); a.Assign(b); CheckEquals(b.Length,a.Length, 'Length'); if ( j > 0 ) then begin for k := 0 to Pred(j) do begin Check(b[k] = a[k]); end; end; end; finally FreeAndNil(a); FreeAndNil(b); end; end; procedure TTest_TArrayOfInt64SRemotable.GetItemAndSetItem(); const ITER : Integer = 100; var localObj : TArrayOfInt64SRemotable; i, j, k : Integer; a : array of Int64; begin Randomize(); localObj := TArrayOfInt64SRemotable.Create() ; try for i := 1 to ITER do begin j := Random(ITER); SetLength(a,j); if ( j > 0 ) then begin for k := 0 to Pred(j) do begin if ( ( k mod 2 ) = 0 ) then a[k] := Random(High(Int64) -1 ) else a[k] := -Random(High(Int64) -2); end; localObj.SetLength(j); for k := 0 to Pred(j) do begin localObj[k] := a[k]; end; for k := 0 to Pred(j) do begin Check(a[k] = localObj[k]); end; end; end; finally FreeAndNil(localObj); end; end; { TTest_TArrayOfInt64URemotable } class function TTest_TArrayOfInt64URemotable.CreateArray(): TBaseArrayRemotable; begin Result := TArrayOfInt64URemotable.Create(); end; class function TTest_TArrayOfInt64URemotable.GetTypeInfo(): PTypeInfo; begin Result := TypeInfo(QWord); end; procedure TTest_TArrayOfInt64URemotable.test_Assign(); const ITER : Integer = 100; var a, b : TArrayOfInt64URemotable; i, j, k : Integer; begin Randomize(); a := TArrayOfInt64URemotable.Create(); try b := TArrayOfInt64URemotable.Create(); a.Assign(nil); for i := 1 to ITER do begin j := Random(ITER); a.SetLength(j); if ( j > 0 ) then begin for k := 0 to Pred(j) do begin a[k] := Random(High(Integer) -1); end; end; b.Assign(a); CheckEquals(a.Length,b.Length, 'Length'); if ( j > 0 ) then begin for k := 0 to Pred(j) do begin Check(a[k] = b[k]); end; end; a.SetLength(0); a.Assign(b); CheckEquals(b.Length,a.Length, 'Length'); if ( j > 0 ) then begin for k := 0 to Pred(j) do begin Check(b[k] = a[k]); end; end; end; finally FreeAndNil(a); FreeAndNil(b); end; end; procedure TTest_TArrayOfInt64URemotable.GetItemAndSetItem(); const ITER : Integer = 100; var localObj : TArrayOfInt64URemotable; i, j, k : Integer; a : array of QWord; begin Randomize(); localObj := TArrayOfInt64URemotable.Create() ; try for i := 1 to ITER do begin j := Random(ITER); SetLength(a,j); if ( j > 0 ) then begin for k := 0 to Pred(j) do begin a[k] := Random(High(Integer) -1 ); end; localObj.SetLength(j); for k := 0 to Pred(j) do begin localObj[k] := a[k]; end; for k := 0 to Pred(j) do begin Check(a[k] = localObj[k]); end; end; end; finally FreeAndNil(localObj); end; end; { TTest_TArrayOfFloatSingleRemotable } class function TTest_TArrayOfFloatSingleRemotable.CreateArray(): TBaseArrayRemotable; begin Result := TArrayOfFloatSingleRemotable.Create(); end; class function TTest_TArrayOfFloatSingleRemotable.GetTypeInfo(): PTypeInfo; begin Result := TypeInfo(Single); end; procedure TTest_TArrayOfFloatSingleRemotable.test_Assign(); const ITER : Integer = 100; var a, b : TArrayOfFloatSingleRemotable; i, j, k : Integer; begin Randomize(); a := TArrayOfFloatSingleRemotable.Create(); try b := TArrayOfFloatSingleRemotable.Create(); a.Assign(nil); for i := 1 to ITER do begin j := Random(ITER); a.SetLength(j); if ( j > 0 ) then begin for k := 0 to Pred(j) do begin if ( ( k mod 2 ) = 0 ) then a[k] := Random(High(Int64) -1) else a[k] := -Random(High(Int64) - 2); end; end; b.Assign(a); CheckEquals(a.Length,b.Length, 'Length'); if ( j > 0 ) then begin for k := 0 to Pred(j) do begin Check(SameValue(a[k],b[k])); end; end; a.SetLength(0); a.Assign(b); CheckEquals(b.Length,a.Length, 'Length'); if ( j > 0 ) then begin for k := 0 to Pred(j) do begin Check(SameValue(b[k],a[k])); end; end; end; finally FreeAndNil(a); FreeAndNil(b); end; end; procedure TTest_TArrayOfFloatSingleRemotable.GetItemAndSetItem(); const ITER : Integer = 100; var localObj : TArrayOfFloatSingleRemotable; i, j, k : Integer; a : array of Single; begin Randomize(); localObj := TArrayOfFloatSingleRemotable.Create() ; try for i := 1 to ITER do begin j := Random(ITER); SetLength(a,j); if ( j > 0 ) then begin for k := 0 to Pred(j) do begin if ( ( k mod 2 ) = 0 ) then a[k] := Random(High(Int64) -1 ) else a[k] := -Random(High(Int64) -2); end; localObj.SetLength(j); for k := 0 to Pred(j) do begin localObj[k] := a[k]; end; for k := 0 to Pred(j) do begin Check(SameValue(a[k], localObj[k])); end; end; end; finally FreeAndNil(localObj); end; end; { TTest_TArrayOfFloatDoubleRemotable } class function TTest_TArrayOfFloatDoubleRemotable.CreateArray(): TBaseArrayRemotable; begin Result := TArrayOfFloatDoubleRemotable.Create(); end; class function TTest_TArrayOfFloatDoubleRemotable.GetTypeInfo(): PTypeInfo; begin Result := TypeInfo(Double); end; procedure TTest_TArrayOfFloatDoubleRemotable.test_Assign(); const ITER : Integer = 100; var a, b : TArrayOfFloatDoubleRemotable; i, j, k : Integer; begin Randomize(); a := TArrayOfFloatDoubleRemotable.Create(); try b := TArrayOfFloatDoubleRemotable.Create(); a.Assign(nil); for i := 1 to ITER do begin j := Random(ITER); a.SetLength(j); if ( j > 0 ) then begin for k := 0 to Pred(j) do begin if ( ( k mod 2 ) = 0 ) then a[k] := Random(High(Int64) -1) else a[k] := -Random(High(Int64) - 2); end; end; b.Assign(a); CheckEquals(a.Length,b.Length, 'Length'); if ( j > 0 ) then begin for k := 0 to Pred(j) do begin Check(SameValue(a[k],b[k])); end; end; a.SetLength(0); a.Assign(b); CheckEquals(b.Length,a.Length, 'Length'); if ( j > 0 ) then begin for k := 0 to Pred(j) do begin Check(SameValue(b[k],a[k])); end; end; end; finally FreeAndNil(a); FreeAndNil(b); end; end; procedure TTest_TArrayOfFloatDoubleRemotable.GetItemAndSetItem(); const ITER : Integer = 100; var localObj : TArrayOfFloatDoubleRemotable; i, j, k : Integer; a : array of Double; begin Randomize(); localObj := TArrayOfFloatDoubleRemotable.Create() ; try for i := 1 to ITER do begin j := Random(ITER); SetLength(a,j); if ( j > 0 ) then begin for k := 0 to Pred(j) do begin if ( ( k mod 2 ) = 0 ) then a[k] := Random(High(Int64) -1 ) else a[k] := -Random(High(Int64) -2); end; localObj.SetLength(j); for k := 0 to Pred(j) do begin localObj[k] := a[k]; end; for k := 0 to Pred(j) do begin Check(SameValue(a[k], localObj[k])); end; end; end; finally FreeAndNil(localObj); end; end; { TTest_TArrayOfFloatExtendedRemotable } class function TTest_TArrayOfFloatExtendedRemotable.CreateArray(): TBaseArrayRemotable; begin Result := TArrayOfFloatExtendedRemotable.Create(); end; class function TTest_TArrayOfFloatExtendedRemotable.GetTypeInfo(): PTypeInfo; begin Result := TypeInfo(Extended); end; procedure TTest_TArrayOfFloatExtendedRemotable.test_Assign(); const ITER : Integer = 100; var a, b : TArrayOfFloatExtendedRemotable; i, j, k : Integer; begin Randomize(); a := TArrayOfFloatExtendedRemotable.Create(); try b := TArrayOfFloatExtendedRemotable.Create(); a.Assign(nil); for i := 1 to ITER do begin j := Random(ITER); a.SetLength(j); if ( j > 0 ) then begin for k := 0 to Pred(j) do begin if ( ( k mod 2 ) = 0 ) then a[k] := Random(High(Int64) -1) else a[k] := -Random(High(Int64) - 2); end; end; b.Assign(a); CheckEquals(a.Length,b.Length, 'Length'); if ( j > 0 ) then begin for k := 0 to Pred(j) do begin Check(SameValue(a[k],b[k])); end; end; a.SetLength(0); a.Assign(b); CheckEquals(b.Length,a.Length, 'Length'); if ( j > 0 ) then begin for k := 0 to Pred(j) do begin Check(SameValue(b[k],a[k])); end; end; end; finally FreeAndNil(a); FreeAndNil(b); end; end; procedure TTest_TArrayOfFloatExtendedRemotable.GetItemAndSetItem(); const ITER : Integer = 100; var localObj : TArrayOfFloatExtendedRemotable; i, j, k : Integer; a : array of Extended; begin Randomize(); localObj := TArrayOfFloatExtendedRemotable.Create() ; try for i := 1 to ITER do begin j := Random(ITER); SetLength(a,j); if ( j > 0 ) then begin for k := 0 to Pred(j) do begin if ( ( k mod 2 ) = 0 ) then a[k] := Random(High(Int64) -1 ) else a[k] := -Random(High(Int64) -2); end; localObj.SetLength(j); for k := 0 to Pred(j) do begin localObj[k] := a[k]; end; for k := 0 to Pred(j) do begin Check(SameValue(a[k], localObj[k])); end; end; end; finally FreeAndNil(localObj); end; end; { TTest_TArrayOfFloatCurrencyRemotable } class function TTest_TArrayOfFloatCurrencyRemotable.CreateArray( ): TBaseArrayRemotable; begin Result := TArrayOfFloatCurrencyRemotable.Create(); end; class function TTest_TArrayOfFloatCurrencyRemotable.GetTypeInfo(): PTypeInfo; begin Result := TypeInfo(Currency); end; procedure TTest_TArrayOfFloatCurrencyRemotable.test_Assign(); const ITER : Integer = 100; var a, b : TArrayOfFloatCurrencyRemotable; i, j, k : Integer; begin Randomize(); a := TArrayOfFloatCurrencyRemotable.Create(); try b := TArrayOfFloatCurrencyRemotable.Create(); a.Assign(nil); for i := 1 to ITER do begin j := Random(ITER); a.SetLength(j); if ( j > 0 ) then begin for k := 0 to Pred(j) do begin if ( ( k mod 2 ) = 0 ) then a[k] := Random(High(Integer) -1) else a[k] := -Random(High(Integer) - 2); end; end; b.Assign(a); CheckEquals(a.Length,b.Length, 'Length'); if ( j > 0 ) then begin for k := 0 to Pred(j) do begin Check(SameValue(a[k],b[k],0.0001)); end; end; a.SetLength(0); a.Assign(b); CheckEquals(b.Length,a.Length, 'Length'); if ( j > 0 ) then begin for k := 0 to Pred(j) do begin Check(SameValue(b[k],a[k],0.0001)); end; end; end; finally FreeAndNil(a); FreeAndNil(b); end; end; procedure TTest_TArrayOfFloatCurrencyRemotable.GetItemAndSetItem(); const ITER : Integer = 100; var localObj : TArrayOfFloatCurrencyRemotable; i, j, k : Integer; a : array of Currency; begin Randomize(); localObj := TArrayOfFloatCurrencyRemotable.Create() ; try for i := 1 to ITER do begin j := Random(ITER); SetLength(a,j); if ( j > 0 ) then begin for k := 0 to Pred(j) do begin if ( ( k mod 2 ) = 0 ) then a[k] := Random(High(Integer) -1 ) else a[k] := -Random(High(Integer) -2); end; localObj.SetLength(j); for k := 0 to Pred(j) do begin localObj[k] := a[k]; end; for k := 0 to Pred(j) do begin Check(SameValue(a[k], localObj[k], 0.0001)); end; end; end; finally FreeAndNil(localObj); end; end; { TTest_TDateRemotable } procedure TTest_TDateRemotable.FormatDate(); const sDATE_1 = '1976-10-12T23:34:56'; sDATE_2 = '0987-06-12T20:34:56'; var d : TDateTime; begin //'-'? yyyy '-' mm '-' dd 'T' hh ':' mm ':' ss ('.' s+)? (zzzzzz)? d := EncodeDate(1976,10,12) + EncodeTime(23,34,56,0); CheckEquals(sDATE_1, Copy(TDateRemotable.FormatDate(d),1,Length(sDATE_1))); d := EncodeDate(987,06,12) - EncodeTime(20,34,56,0); CheckEquals(sDATE_2, Copy(TDateRemotable.FormatDate(d),1,Length(sDATE_2))); end; procedure TTest_TDateRemotable.ParseDate(); const sDATE = '1976-10-12T23:34:56'; var s : string; objd : TDateRemotable; d : TDateTime; y,m,dy : Word; hh,mn,ss, ssss : Word; begin //'-'? yyyy '-' mm '-' dd 'T' hh ':' mm ':' ss ('.' s+)? (zzzzzz)? s := '1976-10-12T23:34:56'; d := TDateRemotable.ParseDate(s); DecodeDate(d,y,m,dy); CheckEquals(y,1976,'Year'); CheckEquals(m,10,'Month'); CheckEquals(dy,12,'Day'); DecodeTime(d,hh,mn,ss,ssss); CheckEquals(hh,23,'Hour'); CheckEquals(mn,34,'Minute'); CheckEquals(ss,56,'Second'); objd := TDateRemotable.Create(); try objd.AsDate := d; CheckEquals(objd.Year,1976,'Year'); CheckEquals(objd.Month,10,'Month'); CheckEquals(objd.Day,12,'Day'); CheckEquals(objd.Hour,23,'Hour'); CheckEquals(objd.Minute,34,'Minute'); CheckEquals(objd.Second,56,'Second'); finally FreeAndNil(objd); end; end; procedure TTest_TDateRemotable.Assign(); var a, b : TDateRemotable; begin b := nil; a := TDateRemotable.Create(); try b := TDateRemotable.Create(); Check(IsZero(a.AsDate - b.AsDate)); a.AsDate := Now(); b.Assign(a); Check(IsZero(a.AsDate - b.AsDate)); a.AsDate := Now() + 1; a.Assign(b); Check(IsZero(a.AsDate - b.AsDate)); finally b.Free(); a.Free(); end; end; procedure TTest_TDateRemotable.Equal(); var a, b : TDateRemotable; c : TClass_A; begin c := nil; b := nil; a := TDateRemotable.Create(); try b := TDateRemotable.Create(); c := TClass_A.Create(); CheckEquals(False,a.Equal(nil)); CheckEquals(False,a.Equal(c)); a.AsDate := Now(); b.AsDate := a.AsDate; CheckEquals(True,a.Equal(b)); CheckEquals(True,b.Equal(a)); a.AsDate := a.AsDate + 1; CheckEquals(False,a.Equal(b)); CheckEquals(False,b.Equal(a)); finally c.Free(); b.Free(); a.Free(); end; end; procedure TTest_TDateRemotable.FormatDate_ZERO(); const sDATE = '1899-12-30T00:00:00'; var d : TDateTime; begin //'-'? yyyy '-' mm '-' dd 'T' hh ':' mm ':' ss ('.' s+)? (zzzzzz)? d := 0; CheckEquals(sDATE, Copy(TDateRemotable.FormatDate(d),1,Length(sDATE))); end; { TTest_TDurationRemotable } procedure TTest_TDurationRemotable.FormatDate(); begin Fail('Write me!'); end; procedure TTest_TDurationRemotable.ParseDate(); begin Fail('Write me!'); end; { TTest_TTimeRemotable } procedure TTest_TTimeRemotable.FormatDate(); begin Fail('Write me!'); end; procedure TTest_TTimeRemotable.ParseDate(); begin Fail('Write me!'); end; { TTest_TStringBufferRemotable } procedure TTest_TStringBufferRemotable.test_Assign(); const ITER = 100; var i : Integer; a, b : TStringBufferRemotable; begin b := nil; a := TStringBufferRemotable.Create(); try b := TStringBufferRemotable.Create(); for i := 1 to ITER do begin a.Data := RandomValue(Random(500)); b.Assign(a); CheckEquals(a.Data, b.Data); end; finally FreeAndNil(b); FreeAndNil(a); end; end; procedure TTest_TStringBufferRemotable.Equal(); const ITER = 100; var i : Integer; a, b : TStringBufferRemotable; c : TClass_A; begin c := nil; b := nil; a := TStringBufferRemotable.Create(); try b := TStringBufferRemotable.Create(); CheckEquals(False, a.Equal(nil)); c := TClass_A.Create(); CheckEquals(False, a.Equal(c)); a.Data := 'wst'; b.Data := 'azerty'; CheckEquals(False, a.Equal(b)); CheckEquals(False, b.Equal(a)); for i := 1 to ITER do begin a.Data := RandomValue(Random(500)); b.Data := a.Data; CheckEquals(True, a.Equal(b)); CheckEquals(True, b.Equal(a)); end; finally FreeAndNil(c); FreeAndNil(b); FreeAndNil(a); end; end; { TTest_TBase64StringRemotable } procedure TTest_TBase64StringRemotable.test_Assign(); const ITER = 100; var i : Integer; a, b : TBase64StringRemotable; begin b := nil; a := TBase64StringRemotable.Create(); try b := TBase64StringRemotable.Create(); for i := 1 to ITER do begin a.BinaryData := RandomValue(Random(500)); b.Assign(a); CheckEquals(a.BinaryData, b.BinaryData); CheckEquals(a.EncodedString, b.EncodedString); end; finally FreeAndNil(b); FreeAndNil(a); end; end; procedure TTest_TBase64StringRemotable.Equal(); const ITER = 100; var i : Integer; a, b : TBase64StringRemotable; c : TClass_A; begin c := nil; b := nil; a := TBase64StringRemotable.Create(); try b := TBase64StringRemotable.Create(); CheckEquals(False, a.Equal(nil)); c := TClass_A.Create(); CheckEquals(False, a.Equal(c)); a.BinaryData := 'wst'; b.BinaryData := 'azerty'; CheckEquals(False, a.Equal(b)); CheckEquals(False, b.Equal(a)); for i := 1 to ITER do begin a.BinaryData := RandomValue(Random(500)); b.BinaryData := a.BinaryData; CheckEquals(True, a.Equal(b)); CheckEquals(True, b.Equal(a)); end; finally FreeAndNil(c); FreeAndNil(b); FreeAndNil(a); end; end; procedure TTest_TBase64StringRemotable.SetBinaryData(); const ITER = 100; var i : Integer; a : TBase64StringRemotable; s, es : string; begin a := TBase64StringRemotable.Create(); try s := ''; es := Base64Encode(s); a.BinaryData := s; CheckEquals(s,a.BinaryData); CheckEquals(es,a.EncodedString); CheckEquals(s,a.BinaryData); CheckEquals(es,a.EncodedString); for i := 1 to ITER do begin s := RandomValue(Random(500)); es := Base64Encode(s); a.BinaryData := s; CheckEquals(s,a.BinaryData); CheckEquals(es,a.EncodedString); CheckEquals(s,a.BinaryData); CheckEquals(es,a.EncodedString); end; finally FreeAndNil(a); end; end; procedure TTest_TBase64StringRemotable.SetEncodedString(); const ITER = 100; var i : Integer; a : TBase64StringRemotable; s, es : string; begin a := TBase64StringRemotable.Create(); try s := ''; es := Base64Encode(s); a.EncodedString := es; CheckEquals(s,a.BinaryData); CheckEquals(es,a.EncodedString); CheckEquals(s,a.BinaryData); CheckEquals(es,a.EncodedString); for i := 1 to ITER do begin s := RandomValue(Random(500)); es := Base64Encode(s); a.EncodedString := es; CheckEquals(s,a.BinaryData); CheckEquals(es,a.EncodedString); CheckEquals(s,a.BinaryData); CheckEquals(es,a.EncodedString); end; finally FreeAndNil(a); end; end; { TTest_TBase64StringExtRemotable } procedure TTest_TBase64StringExtRemotable.Equal(); const ITER = 100; var i : Integer; a, b : TBase64StringExtRemotable; c : TClass_A; begin c := nil; b := nil; a := TBase64StringExtRemotable.Create(); try b := TBase64StringExtRemotable.Create(); CheckEquals(False, a.Equal(nil)); c := TClass_A.Create(); CheckEquals(False, a.Equal(c)); a.BinaryData := 'wst'; b.BinaryData := 'azerty'; CheckEquals(False, a.Equal(b)); CheckEquals(False, b.Equal(a)); for i := 1 to ITER do begin a.BinaryData := RandomValue(Random(500)); b.BinaryData := a.BinaryData; CheckEquals(True, a.Equal(b)); CheckEquals(True, b.Equal(a)); end; finally FreeAndNil(c); FreeAndNil(b); FreeAndNil(a); end; end; procedure TTest_TBase64StringExtRemotable.SetBinaryData(); const ITER = 100; var i : Integer; a : TBase64StringExtRemotable; s, es : string; begin a := TBase64StringExtRemotable.Create(); try s := ''; es := Base64Encode(s); a.BinaryData := s; CheckEquals(s,a.BinaryData); CheckEquals(es,a.EncodedString); CheckEquals(s,a.BinaryData); CheckEquals(es,a.EncodedString); for i := 1 to ITER do begin s := RandomValue(Random(500)); es := Base64Encode(s); a.BinaryData := s; CheckEquals(s,a.BinaryData); CheckEquals(es,a.EncodedString); CheckEquals(s,a.BinaryData); CheckEquals(es,a.EncodedString); end; finally FreeAndNil(a); end; end; procedure TTest_TBase64StringExtRemotable.SetEncodedString(); const ITER = 100; var i : Integer; a : TBase64StringExtRemotable; s, es : string; begin a := TBase64StringExtRemotable.Create(); try s := ''; es := Base64Encode(s); a.EncodedString := es; CheckEquals(s,a.BinaryData); CheckEquals(es,a.EncodedString); CheckEquals(s,a.BinaryData); CheckEquals(es,a.EncodedString); for i := 1 to ITER do begin s := RandomValue(Random(500)); es := Base64Encode(s); a.EncodedString := es; CheckEquals(s,a.BinaryData); CheckEquals(es,a.EncodedString); CheckEquals(s,a.BinaryData); CheckEquals(es,a.EncodedString); end; finally FreeAndNil(a); end; end; initialization RegisterTest('Support',TTest_TBaseComplexRemotable.Suite); RegisterTest('Support',TTest_TStringBufferRemotable.Suite); RegisterTest('Support-Date',TTest_TDateRemotable.Suite); RegisterTest('Support-Date',TTest_TDurationRemotable.Suite); RegisterTest('Support-Date',TTest_TTimeRemotable.Suite); RegisterTest('Support',TTest_TArrayOfStringRemotable.Suite); RegisterTest('Support',TTest_TArrayOfBooleanRemotable.Suite); RegisterTest('Support',TTest_TArrayOfInt8URemotable.Suite); RegisterTest('Support',TTest_TArrayOfInt8SRemotable.Suite); RegisterTest('Support',TTest_TArrayOfInt16SRemotable.Suite); RegisterTest('Support',TTest_TArrayOfInt16URemotable.Suite); RegisterTest('Support',TTest_TArrayOfInt32URemotable.Suite); RegisterTest('Support',TTest_TArrayOfInt32SRemotable.Suite); RegisterTest('Support',TTest_TArrayOfInt64SRemotable.Suite); RegisterTest('Support',TTest_TArrayOfInt64URemotable.Suite); RegisterTest('Support',TTest_TArrayOfFloatSingleRemotable.Suite); RegisterTest('Support',TTest_TArrayOfFloatDoubleRemotable.Suite); RegisterTest('Support',TTest_TArrayOfFloatExtendedRemotable.Suite); RegisterTest('Support',TTest_TArrayOfFloatCurrencyRemotable.Suite); RegisterTest('Support',TTest_TBaseObjectArrayRemotable.Suite); RegisterTest('Support',TTest_TBase64StringRemotable.Suite); RegisterTest('Support',TTest_TBase64StringExtRemotable.Suite); end.