Browse Source

* expand test cases

git-svn-id: trunk@36987 -
svenbarth 8 years ago
parent
commit
c74afe6824
1 changed files with 167 additions and 1 deletions
  1. 167 1
      packages/rtl-objpas/tests/tests.rtti.pas

+ 167 - 1
packages/rtl-objpas/tests/tests.rtti.pas

@@ -44,10 +44,16 @@ type
     procedure TestPropSetValueShortString;
     procedure TestPropSetValueShortString;
 
 
     procedure TestGetValueStringCastError;
     procedure TestGetValueStringCastError;
-    procedure TestMakeObject;
     procedure TestGetIsReadable;
     procedure TestGetIsReadable;
     procedure TestIsWritable;
     procedure TestIsWritable;
 
 
+    procedure TestMakeNil;
+    procedure TestMakeObject;
+    procedure TestMakeArrayDynamic;
+    procedure TestMakeArrayStatic;
+
+    procedure TestReferenceRawData;
+
     procedure TestIsManaged;
     procedure TestIsManaged;
   end;
   end;
 
 
@@ -226,6 +232,50 @@ begin
   end;
   end;
 end;
 end;
 
 
+procedure TTestCase1.TestMakeNil;
+var
+  value: TValue;
+begin
+  TValue.Make(Nil, TypeInfo(TObject), value);
+  CheckTrue(value.IsEmpty);
+  CheckTrue(value.IsObject);
+  CheckTrue(value.IsClass);
+  CheckTrue(value.IsOrdinal);
+  CheckFalse(value.IsArray);
+  CheckTrue(value.AsObject=Nil);
+  CheckTrue(value.AsClass=Nil);
+  CheckTrue(value.AsInterface=Nil);
+  CheckEquals(0, value.AsOrdinal);
+
+  TValue.Make(Nil, TypeInfo(TClass), value);
+  CheckTrue(value.IsEmpty);
+  CheckTrue(value.IsClass);
+  CheckTrue(value.IsOrdinal);
+  CheckFalse(value.IsArray);
+  CheckTrue(value.AsObject=Nil);
+  CheckTrue(value.AsClass=Nil);
+  CheckTrue(value.AsInterface=Nil);
+  CheckEquals(0, value.AsOrdinal);
+
+  TValue.Make(Nil, TypeInfo(LongInt), value);
+  CheckTrue(value.IsOrdinal);
+  CheckFalse(value.IsEmpty);
+  CheckFalse(value.IsClass);
+  CheckFalse(value.IsObject);
+  CheckFalse(value.IsArray);
+  CheckEquals(0, value.AsOrdinal);
+  CheckEquals(0, value.AsInteger);
+  CheckEquals(0, value.AsInt64);
+  CheckEquals(0, value.AsUInt64);
+
+  TValue.Make(Nil, TypeInfo(String), value);
+  CheckFalse(value.IsEmpty);
+  CheckFalse(value.IsObject);
+  CheckFalse(value.IsClass);
+  CheckFalse(value.IsArray);
+  CheckEquals('', value.AsString);
+end;
+
 procedure TTestCase1.TestMakeObject;
 procedure TTestCase1.TestMakeObject;
 var
 var
   AValue: TValue;
   AValue: TValue;
@@ -241,6 +291,65 @@ begin
   ATestClass.Free;
   ATestClass.Free;
 end;
 end;
 
 
+procedure TTestCase1.TestMakeArrayDynamic;
+type
+  TArrDyn = array of LongInt;
+var
+  arr: TArrDyn;
+  value: TValue;
+begin
+  SetLength(arr, 2);
+  arr[0] := 42;
+  arr[1] := 21;
+  TValue.Make(@arr, TypeInfo(TArrDyn), value);
+  CheckEquals(value.IsArray, True);
+  CheckEquals(value.IsObject, False);
+  CheckEquals(value.IsOrdinal, False);
+  CheckEquals(value.IsClass, False);
+  CheckEquals(value.GetArrayLength, 2);
+  CheckEquals(value.GetArrayElement(0).AsInteger, 42);
+  CheckEquals(value.GetArrayElement(1).AsInteger, 21);
+  value.SetArrayElement(0, 84);
+  CheckEquals(arr[0], 84);
+end;
+
+procedure TTestCase1.TestMakeArrayStatic;
+type
+  TArrStat = array[0..1] of LongInt;
+  TArrStat2D = array[0..1, 0..1] of LongInt;
+var
+  arr: TArrStat;
+  arr2D: TArrStat2D;
+  value: TValue;
+begin
+  arr[0] := 42;
+  arr[1] := 21;
+  TValue.Make(@arr, TypeInfo(TArrStat), value);
+  CheckEquals(value.IsArray, True);
+  CheckEquals(value.IsObject, False);
+  CheckEquals(value.IsOrdinal, False);
+  CheckEquals(value.IsClass, False);
+  CheckEquals(value.GetArrayLength, 2);
+  CheckEquals(value.GetArrayElement(0).AsInteger, 42);
+  CheckEquals(value.GetArrayElement(1).AsInteger, 21);
+  value.SetArrayElement(0, 84);
+  { since this is a static array the original array isn't touched! }
+  CheckEquals(arr[0], 42);
+
+  arr2D[0, 0] := 42;
+  arr2D[0, 1] := 21;
+  arr2D[1, 0] := 84;
+  arr2D[1, 1] := 63;
+
+  TValue.Make(@arr2D, TypeInfo(TArrStat2D), value);
+  CheckEquals(value.IsArray, True);
+  CheckEquals(value.GetArrayLength, 4);
+  CheckEquals(value.GetArrayElement(0).AsInteger, 42);
+  CheckEquals(value.GetArrayElement(1).AsInteger, 21);
+  CheckEquals(value.GetArrayElement(2).AsInteger, 84);
+  CheckEquals(value.GetArrayElement(3).AsInteger, 63);
+end;
+
 procedure TTestCase1.TestGetIsReadable;
 procedure TTestCase1.TestGetIsReadable;
 var
 var
   c: TRttiContext;
   c: TRttiContext;
@@ -749,6 +858,63 @@ begin
   LContext.Free;
   LContext.Free;
 end;
 end;
 
 
+procedure TTestCase1.TestReferenceRawData;
+type
+  TTest = record
+    a: LongInt;
+    b: String;
+  end;
+  PTest = ^TTest;
+
+  TArrDyn = array of LongInt;
+
+  TArrStat = array[0..2] of LongInt;
+
+var
+  value: TValue;
+  str: String;
+  intf: IInterface;
+  i: LongInt;
+  test: TTest;
+  arrdyn: TArrDyn;
+  arrstat: TArrStat;
+begin
+  str := 'Hello World';
+  UniqueString(str);
+  TValue.Make(@str, TypeInfo(String), value);
+  Check(PPointer(value.GetReferenceToRawData)^ = Pointer(str), 'Reference to string data differs');
+
+  intf := TInterfacedObject.Create;
+  TValue.Make(@intf, TypeInfo(IInterface), value);
+  Check(PPointer(value.GetReferenceToRawData)^ = Pointer(intf), 'Reference to interface data differs');
+
+  i := 42;
+  TValue.Make(@i, TypeInfo(LongInt), value);
+  Check(value.GetReferenceToRawData <> @i, 'Reference to longint is equal');
+  Check(PLongInt(value.GetReferenceToRawData)^ = PLongInt(@i)^, 'Reference to longint data differs');
+
+  test.a := 42;
+  test.b := 'Hello World';
+  TValue.Make(@test, TypeInfo(TTest), value);
+  Check(value.GetReferenceToRawData <> @test, 'Reference to record is equal');
+  Check(PTest(value.GetReferenceToRawData)^.a = PTest(@test)^.a, 'Reference to record data a differs');
+  Check(PTest(value.GetReferenceToRawData)^.b = PTest(@test)^.b, 'Reference to record data b differs');
+
+  SetLength(arrdyn, 3);
+  arrdyn[0] := 42;
+  arrdyn[1] := 23;
+  arrdyn[2] := 49;
+  TValue.Make(@arrdyn, TypeInfo(TArrDyn), value);
+  Check(PPointer(value.GetReferenceToRawData)^ = Pointer(arrdyn), 'Reference to dynamic array data differs');
+
+  arrstat[0] := 42;
+  arrstat[1] := 23;
+  arrstat[2] := 49;
+  TValue.Make(@arrstat, TypeInfo(TArrStat), value);
+  Check(value.GetReferenceToRawData <> @arrstat, 'Reference to static array is equal');
+  Check(PLongInt(value.GetReferenceToRawData)^ = PLongInt(@arrstat)^, 'Reference to static array data differs');
+end;
+
 procedure TTestCase1.TestIsManaged;
 procedure TTestCase1.TestIsManaged;
 begin
 begin
   CheckEquals(true, IsManaged(TypeInfo(ansistring)), 'IsManaged for tkAString');
   CheckEquals(true, IsManaged(TypeInfo(ansistring)), 'IsManaged for tkAString');