|
@@ -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.
|