mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-25 18:49:21 +02:00
+ added test for the sortbase unit
git-svn-id: trunk@41195 -
This commit is contained in:
parent
d86da19570
commit
5c4af27a7a
1
.gitattributes
vendored
1
.gitattributes
vendored
@ -14247,6 +14247,7 @@ tests/test/units/objects/testobj2.pp svneol=native#text/plain
|
|||||||
tests/test/units/sharemem/libtest.pp svneol=native#text/plain
|
tests/test/units/sharemem/libtest.pp svneol=native#text/plain
|
||||||
tests/test/units/sharemem/test1.pp svneol=native#text/plain
|
tests/test/units/sharemem/test1.pp svneol=native#text/plain
|
||||||
tests/test/units/softfpu/sfttst.pp svneol=native#text/plain
|
tests/test/units/softfpu/sfttst.pp svneol=native#text/plain
|
||||||
|
tests/test/units/sortbase/tsortbase.pp svneol=native#text/plain
|
||||||
tests/test/units/strings/tstrcopy.pp svneol=native#text/plain
|
tests/test/units/strings/tstrcopy.pp svneol=native#text/plain
|
||||||
tests/test/units/strings/tstrings1.pp svneol=native#text/plain
|
tests/test/units/strings/tstrings1.pp svneol=native#text/plain
|
||||||
tests/test/units/strutils/taddchar.pp svneol=native#text/plain
|
tests/test/units/strutils/taddchar.pp svneol=native#text/plain
|
||||||
|
@ -2229,7 +2229,7 @@ export LOG:=$(TEST_OUTPUTDIR)/log
|
|||||||
endif
|
endif
|
||||||
LOGFILES=$(TEST_OUTPUTDIR)/log $(TEST_OUTPUTDIR)/longlog $(TEST_OUTPUTDIR)/faillist
|
LOGFILES=$(TEST_OUTPUTDIR)/log $(TEST_OUTPUTDIR)/longlog $(TEST_OUTPUTDIR)/faillist
|
||||||
LOGEXT=.testlog .tbslog .tbflog .webtbslog .webtbflog
|
LOGEXT=.testlog .tbslog .tbflog .webtbslog .webtbflog
|
||||||
TESTUNITDIRS=system dos crt objects strings sysutils math sharemem strutils matrix lineinfo ucomplex fpwidestring cpu fmtbcd windows classes character dateutil fpcunit softfpu variants
|
TESTUNITDIRS=system dos crt objects strings sysutils math sharemem strutils matrix lineinfo ucomplex fpwidestring cpu fmtbcd windows classes character dateutil fpcunit softfpu variants sortbase
|
||||||
TESTDIRECTDIRS=
|
TESTDIRECTDIRS=
|
||||||
TESTSUBDIRS=cg cg/variants cg/cdecl cpu16 cpu16/i8086 library opt $(addprefix units/,$(TESTUNITDIRS))
|
TESTSUBDIRS=cg cg/variants cg/cdecl cpu16 cpu16/i8086 library opt $(addprefix units/,$(TESTUNITDIRS))
|
||||||
TESTPACKAGESDIRS=win-base webtbs hash fcl-registry fcl-process zlib fcl-db fcl-xml cocoaint bzip2
|
TESTPACKAGESDIRS=win-base webtbs hash fcl-registry fcl-process zlib fcl-db fcl-xml cocoaint bzip2
|
||||||
|
@ -154,7 +154,7 @@ LOGFILES=$(TEST_OUTPUTDIR)/log $(TEST_OUTPUTDIR)/longlog $(TEST_OUTPUTDIR)/faill
|
|||||||
LOGEXT=.testlog .tbslog .tbflog .webtbslog .webtbflog
|
LOGEXT=.testlog .tbslog .tbflog .webtbslog .webtbflog
|
||||||
|
|
||||||
# Subdirs available in the test subdir
|
# Subdirs available in the test subdir
|
||||||
TESTUNITDIRS=system dos crt objects strings sysutils math sharemem strutils matrix lineinfo ucomplex fpwidestring cpu fmtbcd windows classes character dateutil fpcunit softfpu variants
|
TESTUNITDIRS=system dos crt objects strings sysutils math sharemem strutils matrix lineinfo ucomplex fpwidestring cpu fmtbcd windows classes character dateutil fpcunit softfpu variants sortbase
|
||||||
TESTDIRECTDIRS=
|
TESTDIRECTDIRS=
|
||||||
TESTSUBDIRS=cg cg/variants cg/cdecl cpu16 cpu16/i8086 library opt $(addprefix units/,$(TESTUNITDIRS))
|
TESTSUBDIRS=cg cg/variants cg/cdecl cpu16 cpu16/i8086 library opt $(addprefix units/,$(TESTUNITDIRS))
|
||||||
TESTPACKAGESDIRS=win-base webtbs hash fcl-registry fcl-process zlib fcl-db fcl-xml cocoaint bzip2
|
TESTPACKAGESDIRS=win-base webtbs hash fcl-registry fcl-process zlib fcl-db fcl-xml cocoaint bzip2
|
||||||
|
167
tests/test/units/sortbase/tsortbase.pp
Normal file
167
tests/test/units/sortbase/tsortbase.pp
Normal file
@ -0,0 +1,167 @@
|
|||||||
|
program tsortbase;
|
||||||
|
|
||||||
|
{$MODE objfpc}
|
||||||
|
|
||||||
|
uses
|
||||||
|
sortbase;
|
||||||
|
|
||||||
|
const
|
||||||
|
Max = 100;
|
||||||
|
|
||||||
|
RelTestMin = 1;
|
||||||
|
RelTestMax = 7;
|
||||||
|
|
||||||
|
type
|
||||||
|
PElement = ^Integer;
|
||||||
|
TElement = Integer;
|
||||||
|
TArray = array [0..Max] of TElement;
|
||||||
|
TPtrArray = array [0..Max] of PElement;
|
||||||
|
|
||||||
|
procedure Fail;
|
||||||
|
begin
|
||||||
|
Writeln('Err!');
|
||||||
|
Halt(1);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure CheckEqual(const Arr1, Arr2: TArray; N: Integer);
|
||||||
|
var
|
||||||
|
I: Integer;
|
||||||
|
begin
|
||||||
|
for I := 0 to N - 1 do
|
||||||
|
if Arr1[I] <> Arr2[I] then
|
||||||
|
Fail;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure CheckPtrArrayDerefEqual(const PtrArr: TPtrArray; const Arr: TArray; N: Integer);
|
||||||
|
var
|
||||||
|
I: Integer;
|
||||||
|
begin
|
||||||
|
for I := 0 to N - 1 do
|
||||||
|
if PtrArr[I]^ <> Arr[I] then
|
||||||
|
Fail;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure InitPtrArr(const Arr: TArray; var PtrArr: TPtrArray; N: Integer);
|
||||||
|
var
|
||||||
|
I: Integer;
|
||||||
|
begin
|
||||||
|
for I := 0 to N - 1 do
|
||||||
|
PtrArr[I] := @Arr[I];
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure Sort(var Arr: TArray; N: Integer);
|
||||||
|
var
|
||||||
|
I, J: Integer;
|
||||||
|
tmp: TElement;
|
||||||
|
begin
|
||||||
|
for J := 1 to N - 1 do
|
||||||
|
begin
|
||||||
|
I := J;
|
||||||
|
tmp := Arr[I];
|
||||||
|
while (I > 0) and (Arr[I - 1] > tmp) do
|
||||||
|
begin
|
||||||
|
Arr[I] := Arr[I - 1];
|
||||||
|
Dec(I);
|
||||||
|
end;
|
||||||
|
Arr[I] := tmp;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function ListSortComparer_NoContext(Item1, Item2: Pointer): Integer;
|
||||||
|
begin
|
||||||
|
if PElement(Item1)^ > PElement(Item2)^ then
|
||||||
|
Result := 1
|
||||||
|
else if PElement(Item1)^ < PElement(Item2)^ then
|
||||||
|
Result := -1
|
||||||
|
else
|
||||||
|
Result := 0;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function ListSortComparer_Context(Item1, Item2, Context: Pointer): Integer;
|
||||||
|
begin
|
||||||
|
if PElement(Item1)^ > PElement(Item2)^ then
|
||||||
|
Result := 1
|
||||||
|
else if PElement(Item1)^ < PElement(Item2)^ then
|
||||||
|
Result := -1
|
||||||
|
else
|
||||||
|
Result := 0;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure ListSortCustomItemExchanger_Context(Item1, Item2, Context: Pointer);
|
||||||
|
var
|
||||||
|
tmp: TElement;
|
||||||
|
begin
|
||||||
|
tmp := PElement(Item1)^;
|
||||||
|
PElement(Item1)^ := PElement(Item2)^;
|
||||||
|
PElement(Item2)^ := tmp;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TestSort(const OrigArr: TArray; N: Integer);
|
||||||
|
var
|
||||||
|
Arr, SortArr: TArray;
|
||||||
|
PtrArr: TPtrArray;
|
||||||
|
begin
|
||||||
|
SortArr := OrigArr;
|
||||||
|
Sort(SortArr, N);
|
||||||
|
|
||||||
|
Arr := OrigArr;
|
||||||
|
DefaultSortingAlgorithm^.ItemListSorter_ContextComparer(@Arr[0], N, SizeOf(TElement), @ListSortComparer_Context, nil);
|
||||||
|
CheckEqual(Arr, SortArr, N);
|
||||||
|
|
||||||
|
Arr := OrigArr;
|
||||||
|
DefaultSortingAlgorithm^.ItemListSorter_CustomItemExchanger_ContextComparer(@Arr[0], N, SizeOf(TElement), @ListSortComparer_Context, @ListSortCustomItemExchanger_Context, nil);
|
||||||
|
CheckEqual(Arr, SortArr, N);
|
||||||
|
|
||||||
|
Arr := OrigArr;
|
||||||
|
InitPtrArr(Arr, PtrArr, N);
|
||||||
|
DefaultSortingAlgorithm^.PtrListSorter_ContextComparer(@PtrArr, N, @ListSortComparer_Context, nil);
|
||||||
|
CheckEqual(Arr, OrigArr, N);
|
||||||
|
CheckPtrArrayDerefEqual(PtrArr, SortArr, N);
|
||||||
|
|
||||||
|
Arr := OrigArr;
|
||||||
|
InitPtrArr(Arr, PtrArr, N);
|
||||||
|
DefaultSortingAlgorithm^.PtrListSorter_NoContextComparer(@PtrArr, N, @ListSortComparer_NoContext);
|
||||||
|
CheckEqual(Arr, OrigArr, N);
|
||||||
|
CheckPtrArrayDerefEqual(PtrArr, SortArr, N);
|
||||||
|
end;
|
||||||
|
|
||||||
|
{ brute force tests the sorting algorithms by generating all variations with
|
||||||
|
repetition of N elements chosen from the numbers [0..N-1]. This grows
|
||||||
|
extremely fast (O(N**N)), so should be used for small values of N only. }
|
||||||
|
procedure TestAllVariations(N: Integer);
|
||||||
|
var
|
||||||
|
Arr: TArray;
|
||||||
|
SortArr: TArray;
|
||||||
|
|
||||||
|
procedure Gen(P: Integer);
|
||||||
|
var
|
||||||
|
I: Integer;
|
||||||
|
begin
|
||||||
|
if P = N then
|
||||||
|
begin
|
||||||
|
TestSort(Arr, N);
|
||||||
|
exit;
|
||||||
|
end;
|
||||||
|
for I := 0 to N - 1 do
|
||||||
|
begin
|
||||||
|
Arr[P] := I;
|
||||||
|
Gen(P + 1);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
begin
|
||||||
|
Gen(0);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TestAllVariations;
|
||||||
|
var
|
||||||
|
I: Integer;
|
||||||
|
begin
|
||||||
|
for I := RelTestMin to RelTestMax do
|
||||||
|
TestAllVariations(I);
|
||||||
|
end;
|
||||||
|
|
||||||
|
begin
|
||||||
|
TestAllVariations;
|
||||||
|
Writeln('Ok!');
|
||||||
|
end.
|
Loading…
Reference in New Issue
Block a user