mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-07 13:08:13 +02:00
174 lines
3.9 KiB
ObjectPascal
174 lines
3.9 KiB
ObjectPascal
{
|
|
|
|
Program to test set functions
|
|
}
|
|
|
|
{$define FPC_HAS_SET_INEQUALITIES}
|
|
|
|
program TestSet;
|
|
|
|
Procedure InitMSTimer;
|
|
begin
|
|
end;
|
|
|
|
|
|
{Get MS Timer}
|
|
Function MSTimer:longint;
|
|
begin
|
|
MSTimer:=0;
|
|
end;
|
|
|
|
|
|
const
|
|
Lval=2000;
|
|
VAR Box1, Box2: ARRAY [0..255] OF BYTE;
|
|
OneWOTwo, TwoWOOne,
|
|
UnionSet, InterSet,
|
|
Set1, Set2, Set3: SET OF BYTE;
|
|
K, MaxNr, L,
|
|
N, Low, Hi: INTEGER;
|
|
Start: LONGINT;
|
|
|
|
begin
|
|
WriteLn ('Set operators functional and speed test');
|
|
WriteLn;
|
|
|
|
RandSeed := 17;
|
|
|
|
for L := 0 TO 255 DO begin
|
|
Box1 [L] := L;
|
|
end;
|
|
MaxNr := 255;
|
|
for L := 0 TO 255 DO begin
|
|
K := Random (MaxNr+1);
|
|
Box2 [L] := Box1 [K];
|
|
Box1 [K] := Box1 [MaxNr];
|
|
Dec (MaxNr);
|
|
end;
|
|
|
|
Start :=MSTimer;
|
|
|
|
Set1 := [];
|
|
Set2 := [];
|
|
for L := 0 TO 255 DO begin
|
|
Set1 := Set1 + [Box2 [L]];
|
|
if NOT (Box2 [L] IN Set1) then begin
|
|
WriteLn ('error in AddElem or InSet functions');
|
|
Halt;
|
|
end;
|
|
Set2 := Set2 + [Box2 [L]] + [];
|
|
end;
|
|
|
|
{$ifdef FPC_HAS_SET_INEQUALITIES }
|
|
if (Set1 <> Set2) OR (NOT (Set1 <= Set2)) OR (NOT (Set1 >= Set2)) then begin
|
|
{$else FPC_HAS_SET_INEQUALITIES }
|
|
if (Set1 <> Set2) then begin
|
|
{$endif FPC_HAS_SET_INEQUALITIES }
|
|
WriteLn ('error in relational operators 1');
|
|
Halt;
|
|
end;
|
|
|
|
for L := 0 TO 255 DO begin
|
|
Set1 := Set1 - [Box2 [L]];
|
|
if Box2 [L] IN Set1 then begin
|
|
WriteLn ('error in set difference 1');
|
|
Halt;
|
|
end;
|
|
end;
|
|
|
|
if Set1 <> [] then begin
|
|
WriteLn ('error in set difference 2');
|
|
Halt;
|
|
end;
|
|
|
|
for L := 1 TO LVal DO begin
|
|
REPEAT
|
|
Low := Random (256);
|
|
Hi := Random (256);
|
|
UNTIL Low <= Hi;
|
|
|
|
Set1 := [];
|
|
Set1 := Set1 + [Low..Hi];
|
|
for K := 0 TO 255 DO begin
|
|
if (K IN Set1) AND ((K < Low) OR (K > Hi)) then begin
|
|
WriteLn ('wrong set inclusion in add range');
|
|
Halt;
|
|
end;
|
|
if (NOT (K IN Set1)) AND ((K >= Low) AND (K <= Hi)) then begin
|
|
WriteLn ('wrong set exclusion in add range');
|
|
Halt;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
for L := 1 TO LVal DO begin
|
|
Set1 := [];
|
|
Set2 := [];
|
|
|
|
for K := 1 TO 10 DO begin
|
|
Low := Random (256);
|
|
Hi := Random (256);
|
|
Set2:= Set1 + [Low..Hi];
|
|
{$ifdef FPC_HAS_SET_INEQUALITIES }
|
|
if (Set1 >= Set2) AND (Set1 <> Set2) then begin
|
|
{$else FPC_HAS_SET_INEQUALITIES }
|
|
if (Set1 <> Set2) then begin
|
|
{$endif FPC_HAS_SET_INEQUALITIES }
|
|
WriteLn ('error in relational operators 2');
|
|
Halt;
|
|
end;
|
|
{$ifdef FPC_HAS_SET_INEQUALITIES }
|
|
if NOT (Set1 <= Set2) then begin
|
|
WriteLn ('error in relational operators 3');
|
|
Halt;
|
|
end;
|
|
{$endif FPC_HAS_SET_INEQUALITIES }
|
|
Set1 := Set2;
|
|
|
|
end;
|
|
end;
|
|
|
|
for L := 1 TO LVal DO begin
|
|
Set1 := [];
|
|
for K := 1 TO 10 DO begin
|
|
Low := Random (256);
|
|
Hi := Random (256);
|
|
Set1:= Set1 + [Low..Hi];
|
|
end;
|
|
Set2 := [];
|
|
for K := 1 TO 10 DO begin
|
|
Low := Random (256);
|
|
Hi := Random (256);
|
|
Set2:= Set2 + [Low..Hi];
|
|
end;
|
|
|
|
OneWOTwo := Set1 - Set2;
|
|
TwoWOOne := Set2 - Set1;
|
|
InterSet := Set1 * Set2;
|
|
UnionSet := Set1 + Set2;
|
|
|
|
if InterSet <> (Set2 * Set1) then begin
|
|
WriteLn ('error in set difference');
|
|
Halt;
|
|
end;
|
|
|
|
if (InterSet + OneWOTwo) <> Set1 then begin
|
|
WriteLn ('error in set difference or intersection');
|
|
Halt;
|
|
end;
|
|
|
|
if (InterSet + TwoWOOne) <> Set2 then begin
|
|
WriteLn ('error in set difference or intersection');
|
|
Halt;
|
|
end;
|
|
|
|
if (OneWOTwo + TwoWOOne + InterSet) <> UnionSet then begin
|
|
WriteLn ('error in set union, intersection or difference');
|
|
Halt;
|
|
end;
|
|
|
|
end;
|
|
Start:=MSTimer-Start;
|
|
WriteLn('Set test completes in ',Start,' ms');
|
|
end.
|