Bläddra i källkod

+ add test for the DynArray* functions (currently only DynArraySize() and DynArrayIndex() are tested)

git-svn-id: trunk@36943 -
svenbarth 8 år sedan
förälder
incheckning
50f3479f64
2 ändrade filer med 156 tillägg och 0 borttagningar
  1. 1 0
      .gitattributes
  2. 155 0
      tests/test/tarray13.pp

+ 1 - 0
.gitattributes

@@ -12223,6 +12223,7 @@ tests/test/tarray1.pp svneol=native#text/plain
 tests/test/tarray10.pp svneol=native#text/plain
 tests/test/tarray11.pp svneol=native#text/pascal
 tests/test/tarray12.pp svneol=native#text/pascal
+tests/test/tarray13.pp svneol=native#text/pascal
 tests/test/tarray2.pp svneol=native#text/plain
 tests/test/tarray3.pp svneol=native#text/plain
 tests/test/tarray4.pp svneol=native#text/plain

+ 155 - 0
tests/test/tarray13.pp

@@ -0,0 +1,155 @@
+{ test for the various DynArray* functions }
+
+program tarray13;
+
+{$mode objfpc}
+
+function TestDynArraySize: LongInt;
+type
+  TTest = record
+    value1: QWord;
+    value2: LongInt;
+  end;
+
+var
+  arr1: array of LongInt;
+  arr2: array of QWord;
+  arr3: array of TTest;
+begin
+  SetLength(arr1, 5);
+  SetLength(arr2, 8);
+  SetLength(arr3, 6);
+
+  if DynArraySize(Pointer(arr1)) <> 5 then
+    Halt(1);
+  if DynArraySize(@arr1[0]) <> 5 then
+    Halt(2);
+  if DynArraySize(Pointer(arr2)) <> 8 then
+    Halt(3);
+  if DynArraySize(@arr2[0]) <> 8 then
+    Halt(4);
+  if DynArraySize(Pointer(arr3)) <> 6 then
+    Halt(5);
+  if DynArraySize(@arr3[0]) <> 6 then
+    Halt(6);
+
+  Result := 7;
+end;
+
+function TestDynArrayIndexSingle(aBaseCode: LongInt): LongInt;
+type
+  TTest1 = record
+    value1: QWord;
+    value2: LongInt;
+  end;
+
+  TTest2 = packed record
+    value1: LongInt;
+    value2: QWord;
+  end;
+
+var
+  arr1: array of Byte;
+  arr2: array of LongInt;
+  arr3: array of QWord;
+  arr4: array of TTest1;
+  arr5: array of TTest2;
+  i, basecode: LongInt;
+begin
+  SetLength(arr1, 5);
+  SetLength(arr2, 3);
+  SetLength(arr3, 8);
+  SetLength(arr4, 6);
+  SetLength(arr5, 7);
+
+  basecode := aBaseCode;
+  for i := Low(arr1) to High(arr1) do begin
+    if @arr1[i] <> DynArrayIndex(Pointer(arr1), [i], TypeInfo(arr1)) then
+      Halt(basecode + i * 2);
+    if @arr1[i] <> DynArrayIndex(@arr1[0], [i], TypeInfo(arr1)) then
+      Halt(basecode + i * 2 + 1);
+  end;
+
+  basecode := basecode + 2 * Length(arr1);
+  for i := Low(arr2) to High(arr2) do begin
+    if @arr2[i] <> DynArrayIndex(Pointer(arr2), [i], TypeInfo(arr2)) then
+      Halt(basecode + i * 2);
+    if @arr2[i] <> DynArrayIndex(@arr2[0], [i], TypeInfo(arr2)) then
+      Halt(basecode + i * 2 + 1);
+  end;
+
+  basecode := basecode + 2 * Length(arr2);
+  for i := Low(arr3) to High(arr3) do begin
+    if @arr3[i] <> DynArrayIndex(Pointer(arr3), [i], TypeInfo(arr3)) then
+      Halt(basecode + i * 2);
+    if @arr3[i] <> DynArrayIndex(@arr3[0], [i], TypeInfo(arr3)) then
+      Halt(basecode + i * 2 + 1);
+  end;
+
+  basecode := basecode + 2 * Length(arr3);
+  for i := Low(arr4) to High(arr4) do begin
+    if @arr4[i] <> DynArrayIndex(Pointer(arr4), [i], TypeInfo(arr4)) then
+      Halt(basecode + i * 2);
+    if @arr4[i] <> DynArrayIndex(@arr4[0], [i], TypeInfo(arr4)) then
+      Halt(basecode + i * 2 + 1);
+  end;
+
+  basecode := basecode + 2 * Length(arr4);
+  for i := Low(arr5) to High(arr5) do begin
+    if @arr5[i] <> DynArrayIndex(Pointer(arr5), [i], TypeInfo(arr5)) then
+      Halt(basecode + i * 2);
+    if @arr5[i] <> DynArrayIndex(@arr5[0], [i], TypeInfo(arr5)) then
+      Halt(basecode + i * 2 + 1);
+  end;
+
+  Result := basecode + 2 * Length(arr5);
+end;
+
+function TestDynArrayIndexMulti(aBaseCode: LongInt): LongInt;
+var
+  arr1: array of array of LongInt;
+  arr2: array of array of array of QWord;
+  i, j, k, basecode: LongInt;
+begin
+  SetLength(arr1, 4, 8);
+  SetLength(arr2, 3, 5, 9);
+
+  basecode := aBaseCode;
+  for i := Low(arr1) to High(arr1) do begin
+    for j := Low(arr1[i]) to High(arr1[i]) do begin
+      if @arr1[i, j] <> DynArrayIndex(Pointer(arr1), [i, j], TypeInfo(arr1)) then
+        Halt(basecode + j * 2);
+      if @arr1[i, j] <> DynArrayIndex(@arr1[0], [i, j], TypeInfo(arr1)) then
+        Halt(basecode + j * 2 + 1);
+      { Note: @arr1[0, 0] would be different from @arr1[0] or arr1! }
+    end;
+    basecode := basecode + Length(arr1[i]) * 3;
+  end;
+
+  for i := Low(arr2) to High(arr2) do begin
+    for j := Low(arr2[i]) to High(arr2[i]) do begin
+      for k := Low(arr2[i, j]) to High(arr2[i, j]) do begin
+        if @arr2[i, j, k] <> DynArrayIndex(Pointer(arr2), [i, j, k], TypeInfo(arr2)) then
+          Halt(basecode + k * 2);
+        if @arr2[i, j, k] <> DynArrayIndex(@arr2[0], [i, j, k], TypeInfo(arr2)) then
+          Halt(basecode + k * 2 + 1);
+        { Note: @arr2[0, 0] and @arr2[0, 0, 0] would be different from @arr2[0] or arr2! }
+      end;
+      basecode := basecode + Length(arr2[i, j]) * 2;
+    end;
+  end;
+
+  Result := basecode;
+end;
+
+var
+  basecode: LongInt;
+begin
+  Writeln('TestDynArraySize errors starting at 1');
+  basecode := TestDynArraySize;
+  Writeln('TestDynArrayIndexSingle errors starting at ', basecode);
+  basecode := TestDynArrayIndexSingle(basecode);
+  Writeln('TestDynArrayIndexMulti errors starting at ', basecode);
+  basecode := TestDynArrayIndexMulti(basecode);
+  Writeln('ok');
+end.