fpspreadsheet: Add a few test cases for conditional formatting

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@7531 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
wp_xxyyzz
2020-07-08 22:01:09 +00:00
parent 178e0e9214
commit b4154727a1
3 changed files with 219 additions and 1 deletions

View File

@@ -0,0 +1,213 @@
{ Tests for conditional formatting
These unit tests write out to and read back from files.
}
unit conditionalformattests;
{$mode objfpc}{$H+}
{$modeswitch advancedrecords}
interface
uses
// Not using Lazarus package as the user may be working with multiple versions
// Instead, add .. to unit search path
Classes, SysUtils, fpcunit, testutils, testregistry, testsutility,
fpsTypes, fpsUtils, fpsAllFormats, fpSpreadsheet, fpsConditionalFormat;
type
{ TSpreadWriteReadCFTests }
//Write to xls/xml file and read back
TSpreadWriteReadCFTests = class(TTestCase)
private
protected
// Set up expected values:
procedure SetUp; override;
procedure TearDown; override;
// Test conditional cell format
procedure TestWriteRead_CF_Number(AFormat: TsSpreadsheetFormat;
ACondition: TsCFCondition; AValue1: Integer = MaxInt; AValue2: Integer = MaxInt);
published
procedure TestWriteRead_CF_Number_XLSX_Equal_Const;
procedure TestWriteRead_CF_Number_XLSX_NotEqual_Const;
procedure TestWriteRead_CF_Number_XLSX_GreaterThan_Const;
procedure TestWriteRead_CF_Number_XLSX_LessThan_Const;
procedure TestWriteRead_CF_Number_XLSX_GreaterEqual_Const;
procedure TestWriteRead_CF_Number_XLSX_LessEqual_Const;
procedure TestWriteRead_CF_Number_XLSX_Between_Const;
procedure TestWriteRead_CF_Number_XLSX_NotBetween_Const;
end;
implementation
uses
Math, TypInfo;
{ TSpreadWriteReadCFTests }
procedure TSpreadWriteReadCFTests.SetUp;
begin
inherited SetUp;
end;
procedure TSpreadWriteReadCFTests.TearDown;
begin
inherited TearDown;
end;
{ CFCellFormat tests. Detected cells get a red background. }
procedure TSpreadWriteReadCFTests.TestWriteRead_CF_Number(
AFormat: TsSpreadsheetFormat; ACondition: TsCFCondition;
AValue1: Integer = MaxInt; AValue2: Integer = MaxInt);
var
worksheet: TsWorksheet;
workbook: TsWorkbook;
row, col: Cardinal;
tempFile: string;
sollFMT: TsCellFormat;
sollFmtIdx: Integer;
sollRange: TsCellRange;
actFMT: TsCellFormat;
actFmtIdx: Integer;
actRange: TsCellRange;
actCondition: TsCFCondition;
actValue1, actValue2: Variant;
cf: TsConditionalFormat;
begin
// Write out all test values
workbook := TsWorkbook.Create;
try
workSheet:= workBook.AddWorksheet('CF');
// Write test data: two rows with numbers 1..10
for Row := 0 to 1 do
for Col := 0 to 9 do
worksheet.WriteNumber(row, col, col+1);
// Write format used by the cells detected by conditional formatting
InitFormatRecord(sollFmt);
sollFmt.SetBackgroundColor(scRed);
sollFmtIdx := workbook.AddCellFormat(sollFmt);
// Write instruction for conditional formatting
sollRange := Range(0, 0, 0, 8);
if (AValue1 = MaxInt) and (AValue2 = MaxInt) then
worksheet.WriteConditionalCellFormat(sollRange, ACondition, sollFmtIdx)
else
if (AValue2 = MaxInt) then
worksheet.WriteConditionalCellFormat(sollRange, ACondition, AValue1, sollFmtIdx)
else
worksheet.WriteConditionalCellFormat(sollRange, ACondition, AValue1, AValue2, sollFmtIdx);
// Save to file
tempFile := NewTempFile;
workBook.WriteToFile(tempFile, AFormat, true);
finally
workbook.Free;
end;
// Open the spreadsheet
workbook := TsWorkbook.Create;
try
workbook.ReadFromFile(TempFile, AFormat);
worksheet := GetWorksheetByName(workBook, 'CF');
if worksheet=nil then
fail('Error in test code. Failed to get named worksheet');
// Check count of conditional formats
CheckEquals(1, workbook.GetNumConditionalFormats, 'ConditionalFormat count mismatch.');
// Read conditional format
cf := Workbook.GetConditionalFormat(0);
//Check range
actRange := cf.CellRange;
CheckEquals(sollRange.Row1, actRange.Row1, 'Conditional format range mismatch (Row1)');
checkEquals(sollRange.Col1, actRange.Col1, 'Conditional format range mismatch (Col1)');
CheckEquals(sollRange.Row2, actRange.Row2, 'Conditional format range mismatch (Row2)');
checkEquals(sollRange.Col2, actRange.Col2, 'Conditional format range mismatch (Col2)');
// Check rules count
CheckEquals(1, cf.RulesCount, 'Conditional format rules count mismatch');
// Check rules class
CheckEquals(TsCFCellRule, cf.Rules[0].ClassType, 'Conditional format rule class mismatch');
// Check condition
actCondition := TsCFCellRule(cf.Rules[0]).Condition;
CheckEquals(
GetEnumName(TypeInfo(TsCFCondition), integer(ACondition)),
GetEnumName(typeInfo(TsCFCondition), integer(actCondition)),
'Conditional format condition mismatch.'
);
// Check 1st parameter
actValue1 := TsCFCellRule(cf.Rules[0]).Operand1;
if AValue1 <> MaxInt then
CheckEquals(AValue1, Integer(actValue1), 'Conditional format parameter 1 mismatch')
else
CheckEquals(Integer(varEmpty), Integer(actValue1), 'Omitted parameter 1 detected.');
// Check 2nd parameter
actValue2 := TsCFCellRule(cf.Rules[0]).Operand2;
if AValue2 <> MaxInt then
CheckEquals(AValue2, actValue2, 'Conditional format parameter 2 mismatch')
else
CheckEquals(Integer(varEmpty), Integer(actValue2), 'Omitted parameter 2 detected.');
finally
workbook.Free;
end;
end;
procedure TSpreadWriteReadCFTests.TestWriteRead_CF_Number_XLSX_Equal_Const;
begin
TestWriteRead_CF_Number(sfOOXML, cfcEqual, 5);
end;
procedure TSpreadWriteReadCFTests.TestWriteRead_CF_Number_XLSX_NotEqual_Const;
begin
TestWriteRead_CF_Number(sfOOXML, cfcNotEqual, 5);
end;
procedure TSpreadWriteReadCFTests.TestWriteRead_CF_Number_XLSX_GreaterThan_Const;
begin
TestWriteRead_CF_Number(sfOOXML, cfcGreaterThan, 5);
end;
procedure TSpreadWriteReadCFTests.TestWriteRead_CF_Number_XLSX_LessThan_Const;
begin
TestWriteRead_CF_Number(sfOOXML, cfcLessThan, 5);
end;
procedure TSpreadWriteReadCFTests.TestWriteRead_CF_Number_XLSX_GreaterEqual_Const;
begin
TestWriteRead_CF_Number(sfOOXML, cfcGreaterEqual, 5);
end;
procedure TSpreadWriteReadCFTests.TestWriteRead_CF_Number_XLSX_LessEqual_Const;
begin
TestWriteRead_CF_Number(sfOOXML, cfcLessEqual, 5);
end;
procedure TSpreadWriteReadCFTests.TestWriteRead_CF_Number_XLSX_Between_Const;
begin
TestWriteRead_CF_Number(sfOOXML, cfcBetween, 3, 7);
end;
procedure TSpreadWriteReadCFTests.TestWriteRead_CF_Number_XLSX_NotBetween_Const;
begin
TestWriteRead_CF_Number(sfOOXML, cfcNotBetween, 3, 7);
end;
initialization
RegisterTest(TSpreadWriteReadCFTests);
end.

View File

@@ -40,7 +40,7 @@
<PackageName Value="FCL"/> <PackageName Value="FCL"/>
</Item4> </Item4>
</RequiredPackages> </RequiredPackages>
<Units Count="32"> <Units Count="33">
<Unit0> <Unit0>
<Filename Value="spreadtestgui.lpr"/> <Filename Value="spreadtestgui.lpr"/>
<IsPartOfProject Value="True"/> <IsPartOfProject Value="True"/>
@@ -171,6 +171,10 @@
<Filename Value="mathtests.pas"/> <Filename Value="mathtests.pas"/>
<IsPartOfProject Value="True"/> <IsPartOfProject Value="True"/>
</Unit31> </Unit31>
<Unit32>
<Filename Value="conditionalformattests.pas"/>
<IsPartOfProject Value="True"/>
</Unit32>
</Units> </Units>
</ProjectOptions> </ProjectOptions>
<CompilerOptions> <CompilerOptions>

View File

@@ -11,6 +11,7 @@ uses
Interfaces, Forms, GuiTestRunner, testsutility, Interfaces, Forms, GuiTestRunner, testsutility,
datetests, stringtests, numberstests, manualtests, internaltests, mathtests, datetests, stringtests, numberstests, manualtests, internaltests, mathtests,
fileformattests, formattests, colortests, fonttests, optiontests, fileformattests, formattests, colortests, fonttests, optiontests,
conditionalformattests,
numformatparsertests, formulatests, rpnFormulaUnit, singleformulatests, numformatparsertests, formulatests, rpnFormulaUnit, singleformulatests,
exceltests, emptycelltests, errortests, virtualmodetests, exceltests, emptycelltests, errortests, virtualmodetests,
colrowtests, ssttests, celltypetests, sortingtests, copytests, colrowtests, ssttests, celltypetests, sortingtests, copytests,