mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-12 19:09:35 +02:00
156 lines
4.3 KiB
ObjectPascal
156 lines
4.3 KiB
ObjectPascal
{ 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.
|