You've already forked lazarus-ccr
fpspreadsheet: Mode test cases on sorting (two-column sort test not yet working correctly)
git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@3677 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
@@ -24,35 +24,47 @@ type
|
||||
{ TSpreadSortingTests }
|
||||
TSpreadSortingTests = class(TTestCase)
|
||||
private
|
||||
|
||||
protected
|
||||
// Set up expected values:
|
||||
procedure SetUp; override;
|
||||
procedure TearDown; override;
|
||||
procedure Test_Sorting(
|
||||
|
||||
procedure Test_Sorting_1( // one column or row
|
||||
ASortByCols: Boolean;
|
||||
AMode: Integer // AMode = 0: number, 1: strings, 2: mixed
|
||||
);
|
||||
procedure Test_Sorting_2( // two columns/rows, primary keys equal
|
||||
ASortByCols: Boolean
|
||||
);
|
||||
|
||||
published
|
||||
procedure Test_SortingByCols_Numbers;
|
||||
procedure Test_SortingByCols_Strings;
|
||||
procedure Test_SortingByCols_Mixed;
|
||||
{
|
||||
procedure Test_SortingByRows_Numbers;
|
||||
procedure Test_SortingByRows_Strings;
|
||||
procedure Test_SortingByRows_Mixed;
|
||||
}
|
||||
procedure Test_SortingByCols1_Numbers;
|
||||
procedure Test_SortingByCols1_Strings;
|
||||
procedure Test_SortingByCols1_NumbersStrings;
|
||||
|
||||
procedure Test_SortingByRows1_Numbers;
|
||||
procedure Test_SortingByRows1_Strings;
|
||||
procedure Test_SortingByRows1_NumbersStrings;
|
||||
|
||||
procedure Test_SortingByCols2;
|
||||
procedure Test_SortingByRows2;
|
||||
|
||||
end;
|
||||
|
||||
implementation
|
||||
|
||||
uses
|
||||
fpsutils;
|
||||
|
||||
const
|
||||
SortingTestSheet = 'Sorting';
|
||||
|
||||
procedure InitUnsortedData;
|
||||
// When sorted the value is equal to the index
|
||||
// The logics of the detection requires equal count of numbers and strings.
|
||||
begin
|
||||
SollSortNumbers[0] := 9; // Equal count of numbers and strings needed
|
||||
// When sorted the value is equal to the index
|
||||
SollSortNumbers[0] := 9;
|
||||
SollSortNumbers[1] := 8;
|
||||
SollSortNumbers[2] := 5;
|
||||
SollSortNumbers[3] := 2;
|
||||
@@ -63,6 +75,7 @@ begin
|
||||
SollSortNumbers[8] := 4;
|
||||
SollSortNumbers[9] := 0;
|
||||
|
||||
// When sorted the value is equal to 'A' + index
|
||||
SollSortStrings[0] := 'C';
|
||||
SollSortStrings[1] := 'G';
|
||||
SollSortStrings[2] := 'F';
|
||||
@@ -89,14 +102,14 @@ begin
|
||||
inherited TearDown;
|
||||
end;
|
||||
|
||||
procedure TSpreadSortingTests.Test_Sorting(ASortByCols: Boolean;
|
||||
procedure TSpreadSortingTests.Test_Sorting_1(ASortByCols: Boolean;
|
||||
AMode: Integer);
|
||||
const
|
||||
AFormat = sfExcel8;
|
||||
var
|
||||
MyWorksheet: TsWorksheet;
|
||||
MyWorkbook: TsWorkbook;
|
||||
i, row, col: Integer;
|
||||
i, ilast, n, row, col: Integer;
|
||||
MyCell: PCell;
|
||||
TempFile: string; //write xls/xml to this file and read back from it
|
||||
L: TStringList;
|
||||
@@ -110,6 +123,8 @@ var
|
||||
expectedString: String;
|
||||
|
||||
begin
|
||||
sortParams := InitSortParams(ASortByCols, 1);
|
||||
|
||||
TempFile := GetTempFileName;
|
||||
|
||||
MyWorkbook := TsWorkbook.Create;
|
||||
@@ -118,14 +133,7 @@ begin
|
||||
|
||||
col := 0;
|
||||
row := 0;
|
||||
SetLength(sortParams.Keys, 1);
|
||||
sortparams.Keys[0].ColRowIndex := 0;
|
||||
if ASortByCols then begin
|
||||
sortParams.SortByCols := true;
|
||||
r1 := 0;
|
||||
r2 := High(SollSortNumbers);
|
||||
c1 := 0;
|
||||
c2 := 0;
|
||||
case AMode of
|
||||
0: for i :=0 to High(SollSortNumbers) do
|
||||
MyWorksheet.WriteNumber(i, col, SollSortNumbers[i]);
|
||||
@@ -140,11 +148,6 @@ begin
|
||||
end
|
||||
end
|
||||
else begin
|
||||
sortParams.SortByCols := false;
|
||||
r1 := 0;
|
||||
r2 := 0;
|
||||
c1 := 0;
|
||||
c2 := High(SollSortNumbers);
|
||||
case AMode of
|
||||
0: for i := 0 to High(SollSortNumbers) do
|
||||
MyWorksheet.WriteNumber(row, i, SollSortNumbers[i]);
|
||||
@@ -168,6 +171,7 @@ begin
|
||||
begin
|
||||
MyWorkbook := TsWorkbook.Create;
|
||||
try
|
||||
// Read spreadsheet file...
|
||||
MyWorkbook.ReadFromFile(TempFile, AFormat);
|
||||
if AFormat = sfExcel2 then
|
||||
MyWorksheet := MyWorkbook.GetFirstWorksheet
|
||||
@@ -176,82 +180,68 @@ begin
|
||||
if MyWorksheet = nil then
|
||||
fail('Error in test code. Failed to get named worksheet');
|
||||
|
||||
// ... and sort it.
|
||||
case AMode of
|
||||
0: iLast:= High(SollSortNumbers);
|
||||
1: iLast := High(SollSortStrings);
|
||||
2: iLast := Length(SollSortNumbers) + Length(SollSortStrings) - 1;
|
||||
end;
|
||||
r1 := 0;
|
||||
r2 := 0;
|
||||
c1 := 0;
|
||||
c2 := 0;
|
||||
if ASortByCols then
|
||||
r2 := iLast
|
||||
else
|
||||
c2 := iLast;
|
||||
sortParams.Keys[0].Order := sortDir;
|
||||
MyWorksheet.Sort(sortParams, r1,c1, r2, c2);
|
||||
|
||||
if ASortByCols then
|
||||
// for debugging, to see the sorted data
|
||||
// MyWorkbook.WriteToFile('sorted.xls', AFormat, true);
|
||||
|
||||
row := 0;
|
||||
col := 0;
|
||||
for i:=0 to iLast do
|
||||
begin
|
||||
if ASortByCols then
|
||||
case sortDir of
|
||||
ssoAscending : row := i;
|
||||
ssoDescending: row := iLast - i;
|
||||
end
|
||||
else
|
||||
case sortDir of
|
||||
ssoAscending : col := i;
|
||||
ssoDescending: col := iLast - i;
|
||||
end;
|
||||
case AMode of
|
||||
0: for i:=0 to MyWorksheet.GetLastColIndex do
|
||||
begin
|
||||
actualNumber := MyWorksheet.ReadAsNumber(i, col);
|
||||
if sortDir = ssoAscending then expectedNumber := i
|
||||
else expectedNumber := High(SollSortNumbers)-i;
|
||||
CheckEquals(actualnumber, expectedNumber,
|
||||
'Sorted number cells mismatch, cell '+CellNotation(MyWorksheet, i, col));
|
||||
0: begin
|
||||
actualNumber := MyWorksheet.ReadAsNumber(row, col);
|
||||
expectedNumber := i;
|
||||
CheckEquals(expectednumber, actualnumber,
|
||||
'Sorted cell number mismatch, cell '+CellNotation(MyWorksheet, row, col));
|
||||
end;
|
||||
1: for i:=0 to Myworksheet.GetLastColIndex do
|
||||
begin
|
||||
actualString := MyWorksheet.ReadAsUTF8Text(i, col);
|
||||
if sortDir = ssoAscending then expectedString := char(ord('A') + i)
|
||||
else expectedString := char(ord('A') + High(SollSortStrings)-i);
|
||||
CheckEquals(actualString, expectedString,
|
||||
'Sorted string cells mismatch, cell '+CellNotation(MyWorksheet, i, col));
|
||||
1: begin
|
||||
actualString := MyWorksheet.ReadAsUTF8Text(row, col);
|
||||
expectedString := char(ord('A') + i);
|
||||
CheckEquals(expectedstring, actualstring,
|
||||
'Sorted cell string mismatch, cell '+CellNotation(MyWorksheet, row, col));
|
||||
end;
|
||||
2: begin (* to be done...
|
||||
for i:=0 to High(SollNumbers) do
|
||||
begin
|
||||
actualNumber := MyWorkbook.ReadAsNumber(i*2, col);
|
||||
if sortdir =ssoAscending then
|
||||
expectedNumber := i
|
||||
CheckEquals(actualnumber, expectedNumber,
|
||||
'Sorted number cells mismatch, cell '+CellNotation(MyWorksheet, i*2, col));
|
||||
2: begin // with increasing i, we see first the numbers, then the strings
|
||||
if i <= High(SollSortNumbers) then begin
|
||||
actualnumber := MyWorksheet.ReadAsNumber(row, col);
|
||||
expectedNumber := i;
|
||||
CheckEquals(expectednumber, actualnumber,
|
||||
'Sorted cell number mismatch, cell '+CellNotation(MyWorksheet, row, col));
|
||||
end else begin
|
||||
actualstring := MyWorksheet.ReadAsUTF8Text(row, col);
|
||||
expectedstring := char(ord('A') + i - Length(SollSortNumbers));
|
||||
CheckEquals(expectedstring, actualstring,
|
||||
'Sorted cell string mismatch, cell '+CellNotation(MyWorksheet, row, col));
|
||||
end;
|
||||
for i:=0 to High(SollStrings) do
|
||||
begin
|
||||
actualString := MyWorkbook.ReadAsUTF8String(i*2+1, col);
|
||||
expectedString := SollStrings[i];
|
||||
CheckEquals(actualString, expectedString,
|
||||
'Sorted string cells mismatch, cell '+CellNotation(MyWorksheet, i*2+1, col));
|
||||
end;
|
||||
*)
|
||||
end;
|
||||
end // case
|
||||
else
|
||||
case AMode of
|
||||
0: for i:=0 to MyWorksheet.GetLastColIndex do
|
||||
begin
|
||||
actualNumber := MyWorksheet.ReadAsNumber(row, i);
|
||||
if sortDir = ssoAscending then expectedNumber := i
|
||||
else expectedNumber := High(SollSortNumbers)-i;
|
||||
CheckEquals(actualnumber, expectedNumber,
|
||||
'Sorted number cells mismatch, cell '+CellNotation(MyWorksheet, row, i));
|
||||
end;
|
||||
1: for i:=0 to MyWorksheet.GetLastColIndex do
|
||||
begin
|
||||
actualString := MyWorksheet.ReadAsUTF8Text(row, i);
|
||||
if sortDir = ssoAscending then expectedString := char(ord('A')+i)
|
||||
else expectedString := char(ord('A') + High(SollSortStrings)-i);
|
||||
CheckEquals(actualString, expectedString,
|
||||
'Sorted string cells mismatch, cell '+CellNotation(MyWorksheet, row, i));
|
||||
end;
|
||||
2: begin{
|
||||
for i:=0 to High(SollNumbers) do
|
||||
begin
|
||||
actualNumber := MyWorkbook.ReadAsNumber(row, i*2);
|
||||
expectedNumber := SollNumbers[i];
|
||||
CheckEquals(actualnumber, expectedNumber,
|
||||
'Sorted number cells mismatch, cell '+CellNotation(MyWorksheet, row, i*2));
|
||||
end;
|
||||
for i:=0 to High(SollStrings) do
|
||||
begin
|
||||
actualString := MyWorkbook.ReadAsUTF8String(row, i*2+1);
|
||||
expectedString := SollStrings[i];
|
||||
CheckEquals(actualString, expectedString,
|
||||
'Sorted string cells mismatch, cell '+CellNotation(MyWorksheet, row, i*2+1));
|
||||
end;
|
||||
}
|
||||
end;
|
||||
end; // case
|
||||
end;
|
||||
end;
|
||||
|
||||
finally
|
||||
MyWorkbook.Free;
|
||||
@@ -261,20 +251,166 @@ begin
|
||||
DeleteFile(TempFile);
|
||||
end;
|
||||
|
||||
procedure TSpreadSortingTests.Test_Sorting_2(ASortByCols: Boolean);
|
||||
const
|
||||
AFormat = sfExcel8;
|
||||
var
|
||||
MyWorksheet: TsWorksheet;
|
||||
MyWorkbook: TsWorkbook;
|
||||
i, ilast, n, row, col: Integer;
|
||||
MyCell: PCell;
|
||||
TempFile: string; //write xls/xml to this file and read back from it
|
||||
L: TStringList;
|
||||
s: String;
|
||||
sortParams: TsSortParams;
|
||||
sortDir: TsSortOrder;
|
||||
r1,r2,c1,c2: Cardinal;
|
||||
actualNumber: Double;
|
||||
actualString: String;
|
||||
expectedNumber: Double;
|
||||
expectedString: String;
|
||||
|
||||
procedure TSpreadSortingTests.Test_SortingByCols_Numbers;
|
||||
begin
|
||||
Test_Sorting(true, 0);
|
||||
sortParams := InitSortParams(ASortByCols, 2);
|
||||
sortParams.Keys[0].ColRowIndex := 0;
|
||||
sortParams.Keys[1].ColRowIndex := 1;
|
||||
|
||||
TempFile := GetTempFileName;
|
||||
|
||||
MyWorkbook := TsWorkbook.Create;
|
||||
try
|
||||
MyWorkSheet:= MyWorkBook.AddWorksheet(SortingTestSheet);
|
||||
|
||||
col := 0;
|
||||
row := 0;
|
||||
if ASortByCols then
|
||||
begin
|
||||
// Always 2 numbers in the first column are equal
|
||||
for i:=0 to High(SollSortNumbers) do
|
||||
MyWorksheet.WriteNumber(i, col, SollSortNumbers[(i mod 2)*2]);
|
||||
// All strings in the second column are distinct
|
||||
for i:=0 to High(SollSortStrings) do
|
||||
MyWorksheet.WriteUTF8Text(i, col+1, SollSortStrings[i]);
|
||||
end else
|
||||
begin
|
||||
for i:=0 to High(SollSortNumbers) do
|
||||
MyWorksheet.WriteNumber(row, i, SollSortNumbers[(i mod 2)*2]);
|
||||
for i:=0 to High(SollSortStrings) do
|
||||
MyWorksheet.WriteUTF8Text(row+1, i, SollSortStrings[i]);
|
||||
end;
|
||||
|
||||
MyWorkBook.WriteToFile(TempFile, AFormat, true);
|
||||
finally
|
||||
MyWorkbook.Free;
|
||||
end;
|
||||
|
||||
// Test ascending and descending sort orders
|
||||
for sortDir in TsSortOrder do
|
||||
begin
|
||||
MyWorkbook := TsWorkbook.Create;
|
||||
try
|
||||
// Read spreadsheet file...
|
||||
MyWorkbook.ReadFromFile(TempFile, AFormat);
|
||||
if AFormat = sfExcel2 then
|
||||
MyWorksheet := MyWorkbook.GetFirstWorksheet
|
||||
else
|
||||
MyWorksheet := GetWorksheetByName(MyWorkBook, SortingTestSheet);
|
||||
if MyWorksheet = nil then
|
||||
fail('Error in test code. Failed to get named worksheet');
|
||||
|
||||
// ... and sort it.
|
||||
iLast := High(SollSortNumbers); //must be the same as for SollSortStrings
|
||||
r1 := 0; c1 := 0;
|
||||
if ASortByCols then begin
|
||||
c2 := 1;
|
||||
r2 := iLast;
|
||||
end else
|
||||
begin
|
||||
c2 := iLast;
|
||||
r2 := 1;
|
||||
end;
|
||||
sortParams.Keys[0].Order := sortDir;
|
||||
sortParams.Keys[1].Order := sortDir;
|
||||
MyWorksheet.Sort(sortParams, r1,c1, r2, c2);
|
||||
|
||||
// for debugging, to see the sorted data
|
||||
MyWorkbook.WriteToFile('sorted.xls', AFormat, true);
|
||||
|
||||
for i:=0 to iLast do
|
||||
begin
|
||||
row := 0;
|
||||
col := 0;
|
||||
if ASortByCols then
|
||||
case sortDir of
|
||||
ssoAscending : row := i;
|
||||
ssoDescending: row := iLast - i;
|
||||
end
|
||||
else
|
||||
case sortDir of
|
||||
ssoAscending : col := i;
|
||||
ssoDescending: col := iLast - i;
|
||||
end;
|
||||
actualNumber := MyWorksheet.ReadAsNumber(row, col);
|
||||
expectedNumber := (i mod 2) * 2;
|
||||
CheckEquals(expectednumber, actualnumber,
|
||||
'Sorted cell number mismatch, cell '+CellNotation(MyWorksheet, row, col));
|
||||
|
||||
if ASortByCols then
|
||||
inc(col)
|
||||
else
|
||||
inc(row);
|
||||
actualString := MyWorksheet.ReadAsUTF8Text(row, col);
|
||||
expectedString := char(ord('A') + i);
|
||||
CheckEquals(expectedstring, actualstring,
|
||||
'Sorted cell string mismatch, cell '+CellNotation(MyWorksheet, row, col));
|
||||
end;
|
||||
finally
|
||||
MyWorkbook.Free;
|
||||
end;
|
||||
end; // for sortDir
|
||||
|
||||
DeleteFile(TempFile);
|
||||
end;
|
||||
|
||||
procedure TSpreadSortingTests.Test_SortingByCols_Strings;
|
||||
|
||||
procedure TSpreadSortingTests.Test_SortingByCols1_Numbers;
|
||||
begin
|
||||
Test_Sorting(true, 1);
|
||||
Test_Sorting_1(true, 0);
|
||||
end;
|
||||
|
||||
procedure TSpreadSortingTests.Test_SortingByCols_Mixed;
|
||||
procedure TSpreadSortingTests.Test_SortingByCols1_Strings;
|
||||
begin
|
||||
//Test_Sorting(true, 2);
|
||||
Test_Sorting_1(true, 1);
|
||||
end;
|
||||
|
||||
procedure TSpreadSortingTests.Test_SortingByCols1_NumbersStrings;
|
||||
begin
|
||||
Test_Sorting_1(true, 2);
|
||||
end;
|
||||
|
||||
procedure TSpreadSortingTests.Test_SortingByRows1_Numbers;
|
||||
begin
|
||||
Test_Sorting_1(false, 0);
|
||||
end;
|
||||
|
||||
procedure TSpreadSortingTests.Test_SortingByRows1_Strings;
|
||||
begin
|
||||
Test_Sorting_1(false, 1);
|
||||
end;
|
||||
|
||||
procedure TSpreadSortingTests.Test_SortingByRows1_NumbersStrings;
|
||||
begin
|
||||
Test_Sorting_1(false, 2);
|
||||
end;
|
||||
|
||||
procedure TSpreadSortingTests.Test_SortingByCols2;
|
||||
begin
|
||||
Test_Sorting_2(true);
|
||||
end;
|
||||
|
||||
procedure TSpreadSortingTests.Test_SortingByRows2;
|
||||
begin
|
||||
Test_Sorting_2(false);
|
||||
end;
|
||||
|
||||
initialization
|
||||
|
Reference in New Issue
Block a user