
git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@8126 8e941d3f-bd1b-0410-a28a-d453659cc2b4
457 lines
12 KiB
ObjectPascal
457 lines
12 KiB
ObjectPascal
unit SearchTestUnit;
|
||
|
||
{$mode objfpc}{$H+}
|
||
{$WARN 6058 off : Call to subroutine "$1" marked as inline is not inlined}
|
||
interface
|
||
|
||
uses
|
||
Classes, SysUtils, fpcunit, {%H-}testutils, testregistry,
|
||
DB,
|
||
fpspreadsheet, fpsTypes, fpsDataset;
|
||
|
||
type
|
||
|
||
TSearchTest = class(TTestCase)
|
||
private
|
||
function CreateAndOpenDataset: TsWorksheetDataset;
|
||
procedure LocateTest(SearchInField: String; SearchValue: Variant;
|
||
ExpectedRecNo: Integer; Options: TLocateOptions = []);
|
||
procedure LookupTest(SearchInField: String; SearchValue: Variant;
|
||
ResultFields: String; ExpectedValues: Variant);
|
||
|
||
protected
|
||
procedure SetUp; override;
|
||
procedure TearDown; override;
|
||
|
||
published
|
||
procedure LocateTest_Int_Found;
|
||
procedure LocateTest_Int_NotFound;
|
||
procedure LocateTest_String_Found;
|
||
procedure LocateTest_String_Found_CaseInsensitive;
|
||
procedure LocateTest_String_NotFound;
|
||
procedure LocateTest_NonASCIIString_Found;
|
||
procedure LocateTest_NonASCIIString_Found_CaseInsensitive;
|
||
procedure LocateTest_NonASCIIString_NotFound;
|
||
procedure LocateTest_WideString_Found;
|
||
procedure LocateTest_WideString_Found_CaseInsensitive;
|
||
procedure LocateTest_WideString_NotFound;
|
||
procedure LocateTest_NonASCIIWideString_Found;
|
||
procedure LocateTest_NonASCIIWideString_Found_CaseInsensitive;
|
||
procedure LocateTest_NonASCIIWideString_NotFound;
|
||
|
||
procedure LookupTest_Int_Found;
|
||
procedure LookupTest_Int_NotFound;
|
||
procedure LookupTest_String_Found;
|
||
procedure LookupTest_String_NotFound;
|
||
procedure LookupTest_NonASCIIString_Found;
|
||
procedure LookupTest_NonASCIIString_NotFound;
|
||
procedure LookupTest_WideString_Found;
|
||
procedure LookupTest_WideString_NotFound;
|
||
procedure LookupTest_NonASCIIWideString_Found;
|
||
procedure LookupTest_NonASCIIWideString_NotFound;
|
||
|
||
end;
|
||
|
||
implementation
|
||
|
||
uses
|
||
Variants, LazUTF8;
|
||
|
||
const
|
||
FILE_NAME = 'testfile.xlsx';
|
||
SHEET_NAME = 'Sheet';
|
||
INT_COL = 0;
|
||
STRING_COL = 1;
|
||
WIDESTRING_COL = 2;
|
||
INT_FIELD = 'IntCol';
|
||
STRING_FIELD = 'StringCol';
|
||
WIDESTRING_FIELD = 'WideStringCol';
|
||
|
||
var
|
||
DataFileName: String;
|
||
|
||
const
|
||
NUM_ROWS = 5;
|
||
var
|
||
INT_VALUES: array[1..NUM_ROWS] of Integer = (
|
||
12, 20, -10, 83, 3
|
||
);
|
||
STRING_VALUES: array[1..NUM_ROWS] of String = (
|
||
'abc', 'a', 'Hallo', 'ijk', 'äöüαβγ'
|
||
);
|
||
WIDESTRING_VALUES: array[1..NUM_ROWS] of String = ( // Strings are converted to wide at runtime
|
||
'ABC', 'A', 'Test', 'ÄöüΓ', 'xyz'
|
||
);
|
||
|
||
function TSearchTest.CreateAndOpenDataset: TsWorksheetDataset;
|
||
begin
|
||
Result := TsWorksheetDataset.Create(nil);
|
||
Result.FileName := DataFileName;
|
||
Result.SheetName := SHEET_NAME;
|
||
Result.AutoFieldDefs := false;
|
||
Result.AddFieldDef(INT_FIELD, ftInteger);
|
||
Result.AddFieldDef(STRING_FIELD, ftString, 20);
|
||
Result.AddFieldDef(WIDESTRING_FIELD, ftWideString, 20);
|
||
Result.Open;
|
||
end;
|
||
|
||
procedure TSearchTest.LocateTest(SearchInField: String; SearchValue: Variant;
|
||
ExpectedRecNo: Integer; Options: TLocateOptions = []);
|
||
var
|
||
dataset: TsWorksheetDataset;
|
||
actualRecNo: Integer;
|
||
found: Boolean;
|
||
f: TField;
|
||
begin
|
||
dataset := CreateAndOpenDataset;
|
||
try
|
||
found := dataset.Locate(SearchInField, SearchValue, options);
|
||
|
||
if ExpectedRecNo = -1 then
|
||
CheckEquals(
|
||
false,
|
||
found,
|
||
'Record found unexpectedly.'
|
||
)
|
||
else
|
||
CheckEquals(
|
||
true,
|
||
found,
|
||
'Existing record not found.'
|
||
);
|
||
|
||
if found then
|
||
begin
|
||
actualRecNo := dataset.RecNo;
|
||
CheckEquals(
|
||
ExpectedRecNo,
|
||
actualRecNo,
|
||
'Mismatch of found RecNo.'
|
||
);
|
||
|
||
for f in dataset.Fields do
|
||
case f.FieldName of
|
||
INT_FIELD:
|
||
CheckEquals(
|
||
INT_VALUES[actualRecNo],
|
||
f.AsInteger,
|
||
'Value mismatch in integer field'
|
||
);
|
||
STRING_FIELD:
|
||
CheckEquals(
|
||
STRING_VALUES[actualRecNo],
|
||
f.AsString,
|
||
'Value mismatch in string field'
|
||
);
|
||
WIDESTRING_FIELD:
|
||
CheckEquals(
|
||
UTF8ToUTF16(WIDESTRING_VALUES[actualRecNo]),
|
||
f.AsWideString,
|
||
'Value mismatch in widestring field'
|
||
);
|
||
end;
|
||
end;
|
||
finally
|
||
dataset.Free;
|
||
end;
|
||
end;
|
||
|
||
procedure TSearchTest.LocateTest_Int_Found;
|
||
begin
|
||
LocateTest(INT_FIELD, -10, 3);
|
||
end;
|
||
|
||
procedure TSearchTest.LocateTest_Int_NotFound;
|
||
begin
|
||
LocateTest(INT_FIELD, 1000, -1);
|
||
end;
|
||
|
||
procedure TSearchTest.LocateTest_String_Found;
|
||
begin
|
||
LocateTest(STRING_FIELD, 'a', 2);
|
||
end;
|
||
|
||
procedure TSearchTest.LocateTest_String_Found_CaseInsensitive;
|
||
begin
|
||
LocateTest(STRING_FIELD, 'ABC', 1, [loCaseInsensitive]);
|
||
end;
|
||
|
||
procedure TSearchTest.LocateTest_String_NotFound;
|
||
begin
|
||
LocateTest(STRING_FIELD, 'ttt', -1);
|
||
end;
|
||
|
||
procedure TSearchTest.LocateTest_NonASCIIString_Found;
|
||
begin
|
||
LocateTest(STRING_FIELD, 'äöüαβγ', 5);
|
||
end;
|
||
|
||
procedure TSearchTest.LocateTest_NonASCIIString_Found_CaseInsensitive;
|
||
begin
|
||
LocateTest(STRING_FIELD, 'ÄöÜαβΓ', 5, [loCaseInsensitive]);
|
||
end;
|
||
|
||
procedure TSearchTest.LocateTest_NonASCIIString_NotFound;
|
||
begin
|
||
LocateTest(STRING_FIELD, 'ä', -1);
|
||
end;
|
||
|
||
procedure TSearchTest.LocateTest_WideString_Found;
|
||
begin
|
||
LocateTest(WIDESTRING_FIELD, WideString('ABC'), 1);
|
||
end;
|
||
|
||
procedure TSearchTest.LocateTest_WideString_Found_CaseInsensitive;
|
||
begin
|
||
LocateTest(WIDESTRING_FIELD, WideString('Abc'), 1, [loCaseInsensitive]);
|
||
end;
|
||
|
||
procedure TSearchTest.LocateTest_WideString_NotFound;
|
||
begin
|
||
LocateTest(WIDESTRING_FIELD, WideString('abc'), -1);
|
||
end;
|
||
|
||
procedure TSearchTest.LocateTest_NonASCIIWideString_Found;
|
||
var
|
||
ws: WideString;
|
||
begin
|
||
ws := UTF8ToUTF16('ÄöüΓ');
|
||
LocateTest(WIDESTRING_FIELD, ws, 4);
|
||
end;
|
||
|
||
procedure TSearchTest.LocateTest_NonASCIIWideString_Found_CaseInsensitive;
|
||
var
|
||
ws: Widestring;
|
||
begin
|
||
ws := UTF8ToUTF16('Äöüγ');
|
||
LocateTest(WIDESTRING_FIELD, ws, 4, [loCaseInsensitive]);
|
||
end;
|
||
|
||
procedure TSearchTest.LocateTest_NonASCIIWideString_NotFound;
|
||
var
|
||
ws: WideString;
|
||
begin
|
||
ws := UTF8ToUTF16('ä-α');
|
||
LocateTest(WIDESTRING_FIELD, ws, -1);
|
||
end;
|
||
|
||
// -----------------------------------------------------------------------------
|
||
|
||
procedure TSearchTest.LookupTest(SearchInField: String; SearchValue: Variant;
|
||
ResultFields: String; ExpectedValues: Variant);
|
||
var
|
||
dataset: TsWorksheetDataset;
|
||
savedRecNo: Integer;
|
||
i, j: Integer;
|
||
actualValues: Variant;
|
||
expectedInt, actualInt: Integer;
|
||
expectedStr, actualStr: String;
|
||
expectedWideStr, actualWideStr: WideString;
|
||
L: TStringList;
|
||
begin
|
||
dataset := CreateAndOpenDataset;
|
||
try
|
||
savedRecNo := dataset.RecNo;
|
||
actualValues := dataset.Lookup(SearchInField, SearchValue, ResultFields);
|
||
|
||
// The active record position must not be changed
|
||
CheckEquals(
|
||
savedRecNo,
|
||
dataset.RecNo,
|
||
'Lookup must not move the active record.'
|
||
);
|
||
|
||
// Compare count of elements in value arrays
|
||
CheckEquals(
|
||
VarArrayDimCount(ExpectedValues),
|
||
VarArrayDimCount(actualValues),
|
||
'Mismatch in found field values.'
|
||
);
|
||
|
||
if VarIsNull(ExpectedValues) then
|
||
begin
|
||
CheckEquals(
|
||
true,
|
||
varIsNull(actualValues),
|
||
'Record found but not expected.'
|
||
);
|
||
exit;
|
||
end;
|
||
|
||
if not VarIsNull(ExpectedValues) then
|
||
CheckEquals(
|
||
false,
|
||
varIsNull(actualValues),
|
||
'Record expected but not found.'
|
||
);
|
||
|
||
L := TStringList.Create;
|
||
L.StrictDelimiter := true;
|
||
L.Delimiter := ';';
|
||
L.DelimitedText := ResultFields;
|
||
|
||
// Compare lookup values with expected values
|
||
for i := 0 to dataset.Fields.Count-1 do
|
||
begin
|
||
j := L.IndexOf(dataset.Fields[i].FieldName);
|
||
if j = -1 then
|
||
continue;
|
||
|
||
case dataset.Fields[i].DataType of
|
||
ftInteger:
|
||
begin
|
||
expectedInt := ExpectedValues[j];
|
||
actualInt := actualvalues[j];
|
||
CheckEquals(
|
||
expectedInt,
|
||
actualInt,
|
||
'Integer field lookup value mismatch'
|
||
);
|
||
end;
|
||
ftString:
|
||
begin
|
||
expectedStr := VarToStr(ExpectedValues[j]);
|
||
actualStr := VarToStr(actualValues[j]);
|
||
CheckEquals(
|
||
expectedStr,
|
||
actualStr,
|
||
'String field lookup value mismatch'
|
||
);
|
||
end;
|
||
ftWideString:
|
||
begin
|
||
expectedWideStr := VarToWideStr(ExpectedValues[j]);
|
||
actualWideStr := VarToWideStr(actualValues[j]);
|
||
CheckEquals(
|
||
ExpectedWideStr,
|
||
actualWideStr,
|
||
'Widestring field lookup value mismatch'
|
||
);
|
||
end;
|
||
else
|
||
raise Exception.Create('Unsupported field type in LookupTest');
|
||
end;
|
||
end;
|
||
L.Free;
|
||
finally
|
||
dataset.Free;
|
||
end;
|
||
end;
|
||
|
||
procedure TSearchTest.LookupTest_Int_Found;
|
||
var
|
||
ws: wideString;
|
||
begin
|
||
ws := UTF8ToUTF16(WIDESTRING_VALUES[2]);
|
||
LookupTest(INT_FIELD, 20, STRING_FIELD+';'+WIDESTRING_FIELD, VarArrayOf(['a', ws]));
|
||
end;
|
||
|
||
procedure TSearchTest.LookupTest_Int_NotFound;
|
||
begin
|
||
LookupTest(INT_FIELD, 200, STRING_FIELD+';'+WIDESTRING_FIELD, Null);
|
||
end;
|
||
|
||
procedure TSearchTest.LookupTest_String_Found;
|
||
var
|
||
ws: wideString;
|
||
begin
|
||
ws := UTF8ToUTF16(WIDESTRING_VALUES[3]);
|
||
LookupTest(STRING_FIELD, 'Hallo', INT_FIELD+';'+WIDESTRING_FIELD, VarArrayOf([-10, ws]));
|
||
end;
|
||
|
||
procedure TSearchTest.LookupTest_String_NotFound;
|
||
begin
|
||
LookupTest(STRING_FIELD, 'Halloooo', INT_FIELD+';'+WIDESTRING_FIELD, Null);
|
||
end;
|
||
|
||
procedure TSearchTest.LookupTest_NonASCIIString_Found;
|
||
var
|
||
ws: wideString;
|
||
begin
|
||
ws := UTF8ToUTF16('xyz');
|
||
LookupTest(STRING_FIELD, 'äöüαβγ', INT_FIELD+';'+WIDESTRING_FIELD, VarArrayOf([3, ws]));
|
||
end;
|
||
|
||
procedure TSearchTest.LookupTest_NonASCIIString_NotFound;
|
||
begin
|
||
LookupTest(STRING_FIELD, 'ÄÄÄÄα', INT_FIELD+';'+WIDESTRING_FIELD, Null);
|
||
end;
|
||
|
||
procedure TSearchTest.LookupTest_WideString_Found;
|
||
var
|
||
ws: wideString;
|
||
begin
|
||
ws := UTF8ToUTF16('ABC');
|
||
LookupTest(WIDESTRING_FIELD, ws, INT_FIELD+';'+STRING_FIELD, VarArrayOf([12, 'abc']));
|
||
end;
|
||
|
||
procedure TSearchTest.LookupTest_WideString_NotFound;
|
||
var
|
||
ws: wideString;
|
||
begin
|
||
ws := UTF8ToUTF16('ABCD');
|
||
LookupTest(WIDESTRING_FIELD, ws, INT_FIELD+';'+STRING_FIELD, null);
|
||
end;
|
||
|
||
procedure TSearchTest.LookupTest_NonASCIIWideString_Found;
|
||
var
|
||
ws: wideString;
|
||
begin
|
||
ws := UTF8ToUTF16('ÄöüΓ');
|
||
LookupTest(WIDESTRING_FIELD, ws, INT_FIELD+';'+STRING_FIELD, VarArrayOf([83, 'ijk']));
|
||
end;
|
||
|
||
procedure TSearchTest.LookupTest_NonASCIIWideString_NotFound;
|
||
var
|
||
ws: wideString;
|
||
begin
|
||
ws := UTF8ToUTF16('Äöαβ');
|
||
LookupTest(WIDESTRING_FIELD, ws, INT_FIELD+';'+STRING_FIELD, null);
|
||
end;
|
||
|
||
// -----------------------------------------------------------------------------
|
||
|
||
procedure TSearchTest.SetUp;
|
||
var
|
||
r: Integer;
|
||
workbook: TsWorkbook;
|
||
worksheet: TsWorksheet;
|
||
begin
|
||
// Create test spreadsheet file
|
||
workbook := TsWorkbook.Create;
|
||
try
|
||
// Create worksheet
|
||
worksheet := workbook.AddWorkSheet(SHEET_NAME);
|
||
|
||
// Write headers (= field names)
|
||
worksheet.WriteText(0, INT_COL, INT_FIELD);
|
||
worksheet.WriteText(0, STRING_COL, STRING_FIELD);
|
||
worksheet.WriteText(0, WIDESTRING_COL, WIDESTRING_FIELD);
|
||
|
||
// Write values
|
||
for r := 1 to NUM_ROWS do
|
||
begin
|
||
worksheet.WriteNumber(r, INT_COL, INT_VALUES[r], nfFixed, 0);
|
||
worksheet.WriteText(r, STRING_COL, STRING_VALUES[r]);
|
||
worksheet.WriteText(r, WIDESTRING_COL, WIDESTRING_VALUES[r]);
|
||
end;
|
||
|
||
// Save
|
||
DataFileName := GetTempDir + FILE_NAME;
|
||
workbook.WriteToFile(DataFileName, true);
|
||
finally
|
||
workbook.Free;
|
||
end;
|
||
end;
|
||
|
||
procedure TSearchTest.TearDown;
|
||
begin
|
||
if FileExists(DataFileName) then DeleteFile(DataFileName);
|
||
end;
|
||
|
||
initialization
|
||
RegisterTest(TSearchTest);
|
||
|
||
end.
|
||
|