123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175 |
- {
- $Id$
- 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.
|