mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-14 10:20:21 +02:00
+ more tests
This commit is contained in:
parent
8e363906e2
commit
13282fa6c7
@ -34,3 +34,9 @@ tf000001.pp stupid example that creates a GPF sometimes
|
||||
tf000002.pp tests that use of a type as a member of an expression is not possible
|
||||
|
||||
to000000.pp shows when uncertain optimizations can cause wrong code
|
||||
|
||||
testcrt.pp test crt unit functions
|
||||
testdos.pp test dos unit functions
|
||||
testset.pp test set functions
|
||||
testheap.pp test heap functions
|
||||
teststr.pp test string functions and speed
|
||||
|
105
tests/testcrt.pp
Normal file
105
tests/testcrt.pp
Normal file
@ -0,0 +1,105 @@
|
||||
{
|
||||
$Id$
|
||||
|
||||
Program to test CRT unit by Mark May.
|
||||
Only standard TP functions are tested (except WhereX, WhereY).
|
||||
}
|
||||
program testcrt;
|
||||
|
||||
uses crt;
|
||||
var
|
||||
i,j : longint;
|
||||
fil : text;
|
||||
c : char;
|
||||
begin
|
||||
{Window/AssignCrt/GotoXY}
|
||||
clrscr;
|
||||
writeln ('This should be on a clear screen...');
|
||||
gotoxy (10,10);
|
||||
writeln ('(10,10) is the coordinate of this sentence');
|
||||
window (10,11,70,22);
|
||||
writeln ('Window (10,11,70,22) executed.');
|
||||
writeln ('Sending some output to a file, assigned to crt.');
|
||||
assigncrt ( fil);
|
||||
rewrite (fil);
|
||||
writeln (fil,'This was written to the file, assigned to the crt.');
|
||||
writeln (fil,'01234567890123456789012345678901234567890123456789012345678901234567890');
|
||||
close (fil);
|
||||
writeln ('The above too, but this not any more');
|
||||
write ('Press any key to continue');
|
||||
c:=readkey;
|
||||
clrscr;
|
||||
writeln ('the small window should have been cleared.');
|
||||
write ('Press any key to continue');
|
||||
c:=readkey;
|
||||
|
||||
{Colors/KeyPressed}
|
||||
window (1,1,80,25);
|
||||
clrscr;
|
||||
writeln ('Color testing :');
|
||||
writeln;
|
||||
highvideo;
|
||||
write ('highlighted text');
|
||||
normvideo;
|
||||
write (' normal text ');
|
||||
lowvideo;
|
||||
writeln ('And low text.');
|
||||
writeln;
|
||||
writeln ('Color chart :');
|
||||
for i:=black to lightgray do
|
||||
begin
|
||||
textbackground (i);
|
||||
textcolor (0);
|
||||
write ('backgr. : ',i:2,' ');
|
||||
for j:= black to white do
|
||||
begin
|
||||
textcolor (j);
|
||||
write (' ',j:2,' ');
|
||||
end;
|
||||
writeln;
|
||||
end;
|
||||
normvideo;
|
||||
writeln ('The same, with blinking foreground.');
|
||||
for i:=black to lightgray do
|
||||
begin
|
||||
textbackground (i);
|
||||
textcolor (0);
|
||||
write ('backgr. : ',i:2,' ');
|
||||
for j:= black to white do
|
||||
begin
|
||||
textcolor (j+128);
|
||||
write (' ',j:2,' ');
|
||||
end;
|
||||
writeln;
|
||||
end;
|
||||
textcolor (white);
|
||||
textbackground (black);
|
||||
writeln;
|
||||
writeln ('press any key to continue');
|
||||
repeat until keypressed;
|
||||
c:=readkey;
|
||||
|
||||
{ClrEol/DelLine/InsLine}
|
||||
clrscr;
|
||||
writeln ('Testing some line functions :');
|
||||
writeln ;
|
||||
writeln ('This line should become blank after you press enter');
|
||||
writeln;
|
||||
writeln ('The following line should then become blank from column 10');
|
||||
writeln ('12345678901234567890');
|
||||
writeln;
|
||||
writeln ('This line should dissapear.');
|
||||
writeln;
|
||||
writeln ('Between this line and the next, an empty line should appear.');
|
||||
writeln ('This is the next line, above which the empty one should appear');
|
||||
writeln;
|
||||
write ('Press any key to observe the predicted effects.');
|
||||
readkey;
|
||||
gotoxy(1,3);clreol;
|
||||
gotoxy (10,6);clreol;
|
||||
gotoxy (1,8);delline;
|
||||
gotoxy (1,10); insline;
|
||||
gotoxy (17,13); clreol;
|
||||
writeln ('end.');
|
||||
readkey;
|
||||
end.
|
140
tests/testdos.pp
Normal file
140
tests/testdos.pp
Normal file
@ -0,0 +1,140 @@
|
||||
{
|
||||
$Id$
|
||||
|
||||
Program to test DOS unit by Peter Vreman.
|
||||
Only main TP functions are tested (nothing with Interrupts/Break/Verify).
|
||||
}
|
||||
program testdos;
|
||||
uses dos;
|
||||
|
||||
procedure TestInfo;
|
||||
var
|
||||
dt : DateTime;
|
||||
ptime : longint;
|
||||
wday,
|
||||
HSecs : integer;
|
||||
begin
|
||||
writeln;
|
||||
writeln('Info Functions');
|
||||
writeln('**************');
|
||||
writeln('Dosversion : ',lo(DosVersion),'.',hi(DosVersion));
|
||||
GetDate(Dt.Year,Dt.Month,Dt.Day,wday);
|
||||
writeln('Current Date : ',Dt.Month,'-',Dt.Day,'-',Dt.Year,' weekday ',wday);
|
||||
GetTime(Dt.Hour,Dt.Min,Dt.Sec,HSecs);
|
||||
writeln('Current Time : ',Dt.Hour,':',Dt.Min,':',Dt.Sec,' hsecs ',HSecs);
|
||||
PackTime(Dt,ptime);
|
||||
writeln('Packed like dos: ',ptime);
|
||||
UnpackTime(ptime,DT);
|
||||
writeln('Unpacked again : ',Dt.Month,'-',Dt.Day,'-',Dt.Year,' ',Dt.Hour,':',Dt.Min,':',Dt.Sec);
|
||||
writeln;
|
||||
write('Press Enter');
|
||||
Readln;
|
||||
end;
|
||||
|
||||
|
||||
procedure TestEnvironment;
|
||||
var
|
||||
i : longint;
|
||||
begin
|
||||
writeln;
|
||||
writeln('Environment Functions');
|
||||
writeln('*********************');
|
||||
writeln('Amount of environment strings : ',EnvCount);
|
||||
writeln('GetEnv TERM : ',GetEnv('TERM'));
|
||||
writeln('GetEnv HOST : ',GetEnv('HOST'));
|
||||
writeln('GetEnv SHELL: ',GetEnv('SHELL'));
|
||||
write('Press Enter for all Environment Strings using EnvStr()');
|
||||
Readln;
|
||||
for i:=1to EnvCount do
|
||||
writeln(EnvStr(i));
|
||||
write('Press Enter');
|
||||
Readln;
|
||||
end;
|
||||
|
||||
|
||||
procedure TestExec;
|
||||
begin
|
||||
writeln;
|
||||
writeln('Exec Functions');
|
||||
writeln('**************');
|
||||
write('Press Enter for an Exec of ''ls -la''');
|
||||
Readln;
|
||||
Exec('pine','');
|
||||
write('Press Enter');
|
||||
Readln;
|
||||
end;
|
||||
|
||||
|
||||
|
||||
procedure TestDisk;
|
||||
var
|
||||
Dir : SearchRec;
|
||||
begin
|
||||
writeln;
|
||||
writeln('Disk Functions');
|
||||
writeln('**************');
|
||||
writeln('DiskFree 0 : ',DiskFree(0));
|
||||
writeln('DiskSize 0 : ',DiskSize(0));
|
||||
writeln('DiskSize 1 : ',DiskSize(1));
|
||||
{$IFDEF LINUX}
|
||||
AddDisk('/fd0');
|
||||
writeln('DiskSize 4 : ',DiskSize(4));
|
||||
{$ENDIF}
|
||||
write('Press Enter for FindFirst/FindNext Test');
|
||||
Readln;
|
||||
|
||||
FindFirst('*.*',$20,Dir);
|
||||
while (DosError=0) do
|
||||
begin
|
||||
Writeln(dir.Name,' ',dir.Size);
|
||||
FindNext(Dir);
|
||||
end;
|
||||
write('Press Enter');
|
||||
Readln;
|
||||
end;
|
||||
|
||||
|
||||
|
||||
procedure TestFile;
|
||||
var
|
||||
test,
|
||||
name,dir,ext : string;
|
||||
begin
|
||||
writeln;
|
||||
writeln('File(name) Functions');
|
||||
writeln('********************');
|
||||
test:='/usr/local/bin/ppc.so';
|
||||
writeln('FSplit(',test,')');
|
||||
FSplit(test,dir,name,ext);
|
||||
writeln('dir: ',dir,' name: ',name,' ext: ',ext);
|
||||
test:='/usr/bin.1/ppc';
|
||||
writeln('FSplit(',test,')');
|
||||
FSplit(test,dir,name,ext);
|
||||
writeln('dir: ',dir,' name: ',name,' ext: ',ext);
|
||||
test:='mtools.tar.gz';
|
||||
writeln('FSplit(',test,')');
|
||||
FSplit(test,dir,name,ext);
|
||||
writeln('dir: ',dir,' name: ',name,' ext: ',ext);
|
||||
|
||||
Writeln('Expanded dos.pp : ',FExpand('dos.pp'));
|
||||
Writeln('Expanded ../dos.pp : ',FExpand('../dos.pp'));
|
||||
Writeln('Expanded /usr/local/dos.pp : ',FExpand('/usr/local/dos.pp'));
|
||||
Writeln('Expanded ../dos/./../././dos.pp : ',FExpand('../dos/./../././dos.pp'));
|
||||
|
||||
test:='../;/usr/;/usr/bin/;/usr/bin;/bin/';
|
||||
Writeln('FSearch ls: ',FSearch('ls',test));
|
||||
|
||||
write('Press Enter');
|
||||
Readln;
|
||||
end;
|
||||
|
||||
|
||||
|
||||
begin
|
||||
TestInfo;
|
||||
TestEnvironment;
|
||||
TestExec;
|
||||
TestDisk;
|
||||
TestFile;
|
||||
end.
|
||||
|
170
tests/testheap.pp
Normal file
170
tests/testheap.pp
Normal file
@ -0,0 +1,170 @@
|
||||
{
|
||||
$Id$
|
||||
|
||||
Program to test heap functions, timing doesn't work
|
||||
}
|
||||
PROGRAM TestHeap;
|
||||
|
||||
Procedure InitMSTimer;
|
||||
begin
|
||||
end;
|
||||
|
||||
|
||||
|
||||
{Get MS Timer}
|
||||
Function MSTimer:longint;
|
||||
begin
|
||||
MSTimer:=0;
|
||||
end;
|
||||
|
||||
|
||||
VAR Dummy,Start, LoopTime,LoopTime2: LONGINT;
|
||||
Delta, TotalTime: LONGINT;
|
||||
L,Choice,K,T: WORD;
|
||||
BlkPtr: ARRAY [1..1000] OF POINTER;
|
||||
BlkSize: ARRAY [1..1000] OF WORD;
|
||||
Permutation: ARRAY [1..1000] OF WORD;
|
||||
|
||||
BEGIN
|
||||
INitMSTimer;
|
||||
WriteLn ('Test of TP heap functions');
|
||||
WriteLn;
|
||||
TotalTime := 0;
|
||||
RandSeed := 997;
|
||||
WriteLn ('MaxAvail: ', MaxAvail, ' MemAvail: ', MemAvail);
|
||||
Start :=MSTimer;
|
||||
FOR L := 1 TO 1000 DO BEGIN
|
||||
END;
|
||||
LoopTime := MSTimer-Start;
|
||||
FOR L := 1 TO 1000 DO BEGIN
|
||||
BlkSize [L] := Random (512) + 1;
|
||||
END;
|
||||
Write ('Allocating 1000 blocks at the end of the heap: ');
|
||||
Start := MSTImer;
|
||||
FOR L := 1 TO 1000 DO BEGIN
|
||||
GetMem (BlkPtr [L], BlkSize [L]);
|
||||
END;
|
||||
Delta := MSTimer-Start-LoopTime;
|
||||
Inc (TotalTime, Delta);
|
||||
WriteLn (Delta:5, ' ms');
|
||||
WriteLn ('MaxAvail: ', MaxAvail, ' MemAvail: ', MemAvail);
|
||||
Write ('Deallocating same 1000 blocks in reverse order:');
|
||||
Start := MSTimer;
|
||||
FOR L := 1 TO 1000 DO BEGIN
|
||||
FreeMem (BlkPtr [L], BlkSize [L]);
|
||||
END;
|
||||
Delta := MSTimer-Start-LoopTime;
|
||||
Inc (TotalTime, Delta);
|
||||
WriteLn (Delta:5, ' ms');
|
||||
WriteLn ('MaxAvail: ', MaxAvail, ' MemAvail: ', MemAvail);
|
||||
Write ('Allocating 1000 blocks at the end of the heap: ');
|
||||
Start := MSTimer;
|
||||
FOR L := 1 TO 1000 DO BEGIN
|
||||
GetMem (BlkPtr [L], BlkSize [L]);
|
||||
END;
|
||||
Delta := MSTimer-Start-LoopTime;
|
||||
Inc (TotalTime, Delta);
|
||||
WriteLn (Delta:5, ' ms');
|
||||
WriteLn ('MaxAvail: ', MaxAvail, ' MemAvail: ', MemAvail);
|
||||
FOR L := 1 TO 1000 DO BEGIN
|
||||
Permutation [L] := L;
|
||||
END;
|
||||
Start := MSTimer;
|
||||
FOR L := 1000 DOWNTO 1 DO BEGIN
|
||||
Choice := Random (L)+1;
|
||||
K := Permutation [Choice];
|
||||
Permutation [Choice] := Permutation [L];
|
||||
END;
|
||||
LoopTime2 := MSTimer - Start;
|
||||
FOR L := 1 TO 1000 DO BEGIN
|
||||
Permutation [L] := L;
|
||||
END;
|
||||
Write ('Deallocating same 1000 blocks at random: ');
|
||||
Start := MSTimer;
|
||||
FOR L := 1000 DOWNTO 1 DO BEGIN
|
||||
Choice := Random (L)+1;
|
||||
K := Permutation [Choice];
|
||||
Permutation [Choice] := Permutation [L];
|
||||
FreeMem (BlkPtr [K], BlkSize [K]);
|
||||
END;
|
||||
Delta := MSTimer - Start - LoopTime2;
|
||||
Inc (TotalTime, Delta);
|
||||
WriteLn (Delta:5, ' ms');
|
||||
WriteLn ('MaxAvail: ', MaxAvail, ' MemAvail: ', MemAvail);
|
||||
Write ('Allocating 1000 blocks at the end of the heap: ');
|
||||
Start := MSTimer;
|
||||
FOR L := 1 TO 1000 DO BEGIN
|
||||
GetMem (BlkPtr [L], BlkSize [L]);
|
||||
END;
|
||||
Delta := MSTimer-Start-LoopTime;
|
||||
Inc (TotalTime, Delta);
|
||||
WriteLn (Delta:5, ' ms');
|
||||
WriteLn ('MaxAvail: ', MaxAvail, ' MemAvail: ', MemAvail);
|
||||
FOR L := 1 TO 1000 DO BEGIN
|
||||
Permutation [L] := L;
|
||||
END;
|
||||
Start := MSTimer;
|
||||
FOR L := 1000 DOWNTO 1 DO BEGIN
|
||||
Choice := Random (L)+1;
|
||||
K := Permutation [Choice];
|
||||
T:= Permutation [L];
|
||||
Permutation [L] := Permutation [Choice];
|
||||
Permutation [Choice] := T;
|
||||
END;
|
||||
LoopTime2 := MSTimer - Start;
|
||||
FOR L := 1 TO 1000 DO BEGIN
|
||||
Permutation [L] := L;
|
||||
END;
|
||||
Write ('Deallocating 500 blocks at random: ');
|
||||
Start := MSTimer;
|
||||
FOR L := 1000 DOWNTO 501 DO BEGIN
|
||||
Choice := Random (L)+1;
|
||||
K := Permutation [Choice];
|
||||
T:= Permutation [L];
|
||||
Permutation [L] := Permutation [Choice];
|
||||
Permutation [Choice] := T;
|
||||
SYSTEM.FreeMem (BlkPtr [K], BlkSize [K]);
|
||||
END;
|
||||
Delta := MSTimer-Start-LoopTime2;
|
||||
Inc (TotalTime, Delta);
|
||||
WriteLn (Delta:5, ' ms');
|
||||
WriteLn ('MaxAvail: ', MaxAvail, ' MemAvail: ', MemAvail);
|
||||
Start := MSTimer;
|
||||
FOR L := 1 TO 1000 DO BEGIN
|
||||
Dummy := MaxAvail;
|
||||
END;
|
||||
Delta := MSTimer-Start;
|
||||
Inc (TotalTime, (Delta + 5) DIV 10);
|
||||
WriteLn ('1000 calls to MaxAvail: ', Delta:5, ' ms');
|
||||
Start := MSTimer;
|
||||
FOR L := 1 TO 1000 DO BEGIN
|
||||
Dummy := MemAvail;
|
||||
END;
|
||||
Delta := MSTimer - Start;
|
||||
Inc (TotalTime, (Delta + 5) DIV 10);
|
||||
WriteLn ('1000 calls to MemAvail: ', Delta:5, ' ms');
|
||||
WriteLn ('MaxAvail: ', MaxAvail, ' MemAvail: ', MemAvail);
|
||||
Write ('Reallocating deallocated 500 blocks at random: ');
|
||||
Start := MSTimer;
|
||||
FOR L := 501 TO 1000 DO BEGIN
|
||||
GetMem (BlkPtr [Permutation [L]], BlkSize [Permutation [L]]);
|
||||
END;
|
||||
Delta := MSTimer-Start-LoopTime;
|
||||
Inc (TotalTime, Delta);
|
||||
WriteLn (Delta:5, ' ms');
|
||||
WriteLn ('MaxAvail: ', MaxAvail, ' MemAvail: ', MemAvail);
|
||||
Write ('Deallocating all 1000 blocks at random: ');
|
||||
Start := MSTimer;
|
||||
FOR L := 1000 DOWNTO 1 DO BEGIN
|
||||
FreeMem (BlkPtr [L], BlkSize [L]);
|
||||
END;
|
||||
Delta := MSTimer-Start-LoopTime;
|
||||
Inc (TotalTime, Delta);
|
||||
WriteLn (Delta:5, ' ms');
|
||||
WriteLn ('MaxAvail: ', MaxAvail, ' MemAvail: ', MemAvail);
|
||||
WriteLn;
|
||||
WriteLn ('Total time for benchmark: ', TotalTime, ' ms');
|
||||
END.
|
||||
|
||||
|
||||
|
162
tests/testset.pp
Normal file
162
tests/testset.pp
Normal file
@ -0,0 +1,162 @@
|
||||
{
|
||||
$Id$
|
||||
|
||||
Program to test set functions
|
||||
}
|
||||
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;
|
||||
|
||||
if (Set1 <> Set2) OR (NOT (Set1 <= Set2)) OR (NOT (Set1 >= Set2)) then begin
|
||||
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];
|
||||
if (Set1 >= Set2) AND (Set1 <> Set2) then begin
|
||||
WriteLn ('error in relational operators 2');
|
||||
Halt;
|
||||
end;
|
||||
if NOT (Set1 <= Set2) then begin
|
||||
WriteLn ('error in relational operators 3');
|
||||
Halt;
|
||||
end;
|
||||
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.
|
||||
|
235
tests/teststr.pp
Normal file
235
tests/teststr.pp
Normal file
@ -0,0 +1,235 @@
|
||||
{
|
||||
$Id$
|
||||
|
||||
Program to test string functions and speed of the functions
|
||||
}
|
||||
program TestStr;
|
||||
uses Timer;
|
||||
|
||||
const
|
||||
TestSize=10; {Use at least 10 for reasonable results}
|
||||
type
|
||||
BenType=array[1..8] of longint;
|
||||
var
|
||||
Total : longint;
|
||||
headBen,
|
||||
LoadBen,
|
||||
ConcatBen,
|
||||
DelBen,
|
||||
InsBen,
|
||||
CopyBen,
|
||||
CmpBen,
|
||||
MixBen : BenType;
|
||||
t : TTimer;
|
||||
|
||||
|
||||
function TestOK:boolean;
|
||||
Const
|
||||
TestStr: string[22]='HELLO, THIS IS A TEST ';
|
||||
var
|
||||
I : INTEGER;
|
||||
U : STRING[1];
|
||||
Q : STRING[100];
|
||||
S : STRING[55];
|
||||
T : STRING[60];
|
||||
V : STRING;
|
||||
begin
|
||||
TestOk:=false;
|
||||
T:='THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG 1234567890';
|
||||
Insert (T, T, 1);
|
||||
{Writeln(T);}
|
||||
Delete (T, 55, 54);
|
||||
S:=Copy (T, -5, 2); {'TH'}
|
||||
U:=Copy (T, 7, 4); {'I'}
|
||||
S:=S + U; {'THI'}
|
||||
Q:=Copy (T, 32, 70); {'THE LAZY DOG 1234567890'}
|
||||
Delete (Q, 2, 1); {'TE LAZY DOG 1234567890'}
|
||||
Delete (Q, 100, 2); {'TE LAZY DOG 1234567890'}
|
||||
Delete (Q, 3, -4); {'TE LAZY DOG 1234567890'}
|
||||
Delete (Q, 3, 10); {'TE1234567890'}
|
||||
{ writeln('TE1234567890 - ',Q);}
|
||||
I:=Pos ('S', T); {25}
|
||||
Insert(Copy(T,I,200),Q,3);{'TES OVER THE LAZY DOG 12345678901234567890'}
|
||||
Delete (Q, 4, 6); {'TESTHE LAZY DOG 12345678901234567890}
|
||||
S:=S + T [25]; {'THIS'}
|
||||
S:=S + Copy (S, 3, -5) + Copy (S, 3, 2); {'THISIS'}
|
||||
V:=T; {'THE QUICK BROWN FOX JUMPS OVER THE LAZY ..'}
|
||||
Delete (V, -10, 47); {'AZY DOG 1234567890'}
|
||||
if (Copy (V, -7, -1)='') and (Pos ('DOG', V)=5) then {TRUE}
|
||||
Insert (V, S, 200); {'THISISAZY DOG 1234567890'}
|
||||
U:=Copy (T, 44, 40); {' '}
|
||||
Insert (U, S, 5); {'THIS ISAZY DOG 1234567890'}
|
||||
I:=Pos ('ZY', S); {9}
|
||||
Delete (S, I, -5); {'THIS ISAZY DOG 1234567890'}
|
||||
Insert (Copy(S,5,1),S,8); {'THIS IS AZY DOG 1234567890'}
|
||||
Delete (S, 10, 16); {'THIS IS A0'}
|
||||
if S [Length (S)]='0' then {TRUE}
|
||||
S:=S + Q; {'THIS IS A0TESTHE LAZY DOG 123456789012345...'}
|
||||
V:=Copy (S, Length (S) - 19, 10); {'1234567890'}
|
||||
if V=Copy (S, Length (S) - 9, 10) then {TRUE}
|
||||
Delete (S, 15, 3 * Length (V)+2); {'THIS IS A0TEST'}
|
||||
Insert ('', S, 0); {'THIS IS A0TEST'}
|
||||
Insert(Copy(S,5,1),S,11); {'THIS IS A0 TEST'}
|
||||
Insert ('HELLO', S, -4); {'HELLOTHIS IS A0 TEST'}
|
||||
Insert (',', S, 6); {'HELLO,THIS IS A0 TEST'}
|
||||
Delete (S, Pos ('TEST', S) - 2, 1); {'HELLO,THIS IS A TEST'}
|
||||
Delete (Q, 0, 32767); {''}
|
||||
Q:=Q + ' '; {' '}
|
||||
Insert (Q, S, 7); {'HELLO, THIS IS A TEST'}
|
||||
Insert (Q, S, 255); {'HELLO, THIS IS A TEST '}
|
||||
if (S=TestStr) and (Q=' ') and (V='1234567890') and
|
||||
(T='THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG 1234567890') then
|
||||
TestOK:=true;
|
||||
end;
|
||||
|
||||
|
||||
procedure TestSpeed(Row,Len:byte);
|
||||
var
|
||||
l : longint;
|
||||
hstr,
|
||||
OrgStr : string;
|
||||
begin
|
||||
HeadBen[Row]:=Len;
|
||||
OrgStr:='';
|
||||
while Length(OrgStr)<Len do
|
||||
OrgStr:=OrgStr+'aaaaaaaaaa';
|
||||
OrgStr:=Copy(OrgStr,1,Len);
|
||||
OrgStr[Len]:='b';
|
||||
{Load/Store}
|
||||
t.Reset;
|
||||
t.Start;
|
||||
for l:=1to 5000*TestSize do
|
||||
HSTr:=OrgStr;
|
||||
t.Stop;
|
||||
inc(Total,t.MSec);
|
||||
LoadBen[Row]:=t.MSec;
|
||||
{Concat}
|
||||
t.Reset;
|
||||
t.Start;
|
||||
for l:=1to 2000*TestSize do
|
||||
begin
|
||||
Hstr:='aaa';
|
||||
Hstr:=Hstr+OrgStr;
|
||||
end;
|
||||
t.Stop;
|
||||
inc(Total,t.MSec);
|
||||
ConcatBen[Row]:=t.MSec;
|
||||
{Copy}
|
||||
t.Reset;
|
||||
t.Start;
|
||||
for l:=1to 2000*TestSize do
|
||||
HSTr:=Copy(OrgStr,1,Len);
|
||||
t.Stop;
|
||||
inc(Total,t.MSec);
|
||||
CopyBen[Row]:=t.MSec;
|
||||
{Delete}
|
||||
t.Reset;
|
||||
t.Start;
|
||||
for l:=1to 2000*TestSize do
|
||||
begin
|
||||
Hstr:=OrgStr;
|
||||
Delete(HStr,1,9);
|
||||
end;
|
||||
t.Stop;
|
||||
inc(Total,t.MSec);
|
||||
DelBen[Row]:=t.MSec;
|
||||
{Insert}
|
||||
t.Reset;
|
||||
t.Start;
|
||||
for l:=1to 1000*TestSize do
|
||||
begin
|
||||
Hstr:='aaa';
|
||||
Insert(OrgStr,hstr,2);
|
||||
Hstr:=OrgStr;
|
||||
Insert('aaaaaaaaaaaaa',hstr,9);
|
||||
end;
|
||||
t.Stop;
|
||||
inc(Total,t.MSec);
|
||||
InsBen[Row]:=t.MSec;
|
||||
{Compare}
|
||||
t.Reset;
|
||||
t.Start;
|
||||
Hstr:='aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'+
|
||||
'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'+
|
||||
'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa';
|
||||
for l:=1to 5000*TestSize do
|
||||
if OrgStr=Hstr then;
|
||||
t.Stop;
|
||||
inc(Total,t.MSec);
|
||||
CmpBen[Row]:=t.MSec;
|
||||
{Mixed}
|
||||
t.Reset;
|
||||
t.Start;
|
||||
for l:=1 to 400*TestSize do
|
||||
begin
|
||||
hstr:=OrgStr;
|
||||
hstr:=Copy(hstr,1,30);
|
||||
Delete(hstr,5,40);
|
||||
hstr:=Copy(hstr,1,length(hstr));
|
||||
hstr:=hstr+' ';
|
||||
Delete(hstr,length(hstr)-2,2);
|
||||
Insert('aaaaaaaaaaaaaaaaaaaaaaaaaaaa',hstr,10);
|
||||
Insert('aaaaaaaaaaaaaaaaaaaaaaaaaaaa',hstr,20);
|
||||
hstr:=Copy(hstr,1,length(hstr));
|
||||
hstr:=Copy(hstr,1,80)+'aaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb';
|
||||
hstr:=hstr+OrgStr;
|
||||
end;
|
||||
t.Stop;
|
||||
inc(Total,t.MSec);
|
||||
MixBen[Row]:=t.MSec;
|
||||
end;
|
||||
|
||||
|
||||
procedure PutBen(const r:BenType);
|
||||
var
|
||||
i : byte;
|
||||
begin
|
||||
for i:=1to 8 do
|
||||
Write(r[i]:6);
|
||||
Writeln;
|
||||
end;
|
||||
|
||||
|
||||
|
||||
begin
|
||||
t.Init;
|
||||
WriteLn ('String Function Compatibility and Speed Test');
|
||||
WriteLn;
|
||||
|
||||
if TestOK then
|
||||
WriteLn('Test OK')
|
||||
else
|
||||
WriteLn('Test Failure!');
|
||||
|
||||
if paramstr(1)='t' then
|
||||
halt;
|
||||
|
||||
WriteLn;
|
||||
TestSpeed(1,10);
|
||||
TestSpeed(2,30);
|
||||
TestSpeed(3,50);
|
||||
TestSpeed(4,70);
|
||||
TestSpeed(5,100);
|
||||
TestSpeed(6,150);
|
||||
TestSpeed(7,200);
|
||||
TestSpeed(8,250);
|
||||
|
||||
Write('Length ');
|
||||
PutBen(HeadBen);
|
||||
WriteLn('------------------------------------------------------------------------------');
|
||||
Write('Load/Store ');
|
||||
PutBen(LoadBen);
|
||||
Write('Concat ');
|
||||
PutBen(ConcatBen);
|
||||
Write('Copy ');
|
||||
PutBen(CopyBen);
|
||||
Write('Delete ');
|
||||
PutBen(DelBen);
|
||||
Write('Insert ');
|
||||
PutBen(InsBen);
|
||||
Write('Compare ');
|
||||
PutBen(CmpBen);
|
||||
Write('Mixed ');
|
||||
PutBen(MixBen);
|
||||
WriteLn('String-Benchmark avarage ',Total div 8,' ms');
|
||||
end.
|
Loading…
Reference in New Issue
Block a user