fpspreadsheet: Add unit test for formula SUMIFS

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@9390 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
wp_xxyyzz 2024-07-17 14:34:51 +00:00
parent 07acd0c37b
commit f496fe9a62
2 changed files with 76 additions and 2 deletions

View File

@ -120,7 +120,6 @@ type
procedure Test_OverwriteFormula_Error_OOXML;
procedure Test_OverwriteFormula_Error_XML;
procedure Test_OverwriteFormula_Error_ODS;
end;
implementation

View File

@ -7,7 +7,7 @@ interface
uses
// Not using Lazarus package as the user may be working with multiple versions
// Instead, add .. to unit search path
Classes, SysUtils, fpcunit, testregistry,
Classes, SysUtils, fpcunit, testregistry, testsutility,
fpstypes, fpspreadsheet, fpsexprparser,
xlsbiff8;
@ -29,6 +29,7 @@ type
procedure TestWorksheet(ATestKind: TWorksheetTestKind; ATestCase: Integer);
procedure TestFormulaErrors(ATest: Integer);
procedure TestInsDelRowCol(ATestIndex: Integer);
procedure TestSumIFS_Microsoft(AFormat: TsSpreadsheetFormat);
published
procedure AddConst_BIFF2;
@ -92,6 +93,9 @@ type
procedure SumMultiSheetRange_FlippedSheetsAndCells_XML;
procedure SumMultiSheetRange_FlippedSheetsAndCells_ODS;
procedure SumIFS_Microsoft_OOXML;
procedure SumIFS_Microsoft_ODS;
procedure IfConst_BIFF8;
procedure IfConst_OOXML;
procedure IfConst_XML;
@ -618,6 +622,77 @@ end;
{ --- }
{ Example from Microsoft site for SUMIFS:
https://support.microsoft.com/en-us/office/sumifs-function-c9e748f5-7ea7-455d-9406-611cebce642b }
procedure TSpreadSingleFormulaTests.TestSumIFS_Microsoft(AFormat: TsSpreadsheetFormat);
const
ROW1 = 10;
ROW2 = 11;
var
book: TsWorkbook;
sheet: TsWorksheet;
value: Double;
tempFile: String;
begin
tempFile := GetTempFileName;
book := TsWorkbook.Create;
try
sheet := book.AddWorksheet('Test');
sheet.WriteText(0, 0, 'Quantity Sold'); sheet.WriteText(0, 1, 'Product'); sheet.WriteText(0, 2, 'SalesPerson');
sheet.WriteNumber(1, 0, 5); sheet.WriteText(1, 1, 'Apples'); sheet.WriteText(1, 2, 'Tom');
sheet.WriteNumber(2, 0, 4); sheet.WriteText(2, 1, 'Apples'); sheet.WriteText(2, 2, 'Sarah');
sheet.WriteNumber(3, 0, 15); sheet.WriteText(3, 1, 'Artichokes'); sheet.WriteText(3, 2, 'Tom');
sheet.WriteNumber(4, 0, 3); sheet.WriteText(4, 1, 'Artichokes'); sheet.WriteText(4, 2, 'Sarah');
sheet.WriteNumber(5, 0, 22); sheet.WriteText(5, 1, 'Bananas'); sheet.WriteText(5, 2, 'Tom');
sheet.WriteNumber(6, 0, 12); sheet.WriteText(6, 1, 'Bananas'); sheet.WriteText(6, 2, 'Sarah');
sheet.WriteNumber(7, 0, 10); sheet.WriteText(7, 1, 'Carrots'); sheet.WriteText(7, 2, 'Tom');
sheet.WriteNumber(8, 0, 33); sheet.WriteText(8, 1, 'Carrots'); sheet.WriteText(8, 2, 'Sarah');
sheet.WriteFormula(ROW1, 0, 'SUMIFS(A2:A9, B2:B9, "=A*", C2:C9, "Tom")'); // expected: 20
sheet.WriteFormula(ROW2, 0, 'SUMIFS(A2:A9, B2:B9, "<>Bananas", C2:C9, "Tom")'); // expected: 30
sheet.CalcFormulas;
value := sheet.ReadAsNumber(ROW1, 0);
CheckEquals(20, value, 'Unsaved value mismatch in cell ' + CellNotation(sheet, ROW1, 0));
value := sheet.ReadAsNumber(ROW2, 0);
CheckEquals(30, value, 'Unsaved value mismatch in cell ' + CellNotation(sheet, ROW2, 0));
book.WriteToFile(tempFile, AFormat, true);
finally
book.Free;
end;
book := TsWorkbook.Create;
try
book.Options := [boReadFormulas, boAutoCalc];
book.ReadFromFile(tempFile, AFormat);
sheet := book.GetFirstWorksheet;
value := sheet.ReadAsNumber(10, 0);
CheckEquals(20, value, 'Saved value mismatch #2 in cell ' + CellNotation(sheet, 10, 0));
value := sheet.ReadAsNumber(11, 0);
CheckEquals(30, value, 'Saved value mismatch #2 in cell ' + CellNotation(sheet, 11, 0));
finally
book.Free;
end;
end;
procedure TSpreadSingleFormulaTests.SumIFS_Microsoft_OOXML;
begin
TestSumIFS_Microsoft(sfOOXML);
end;
procedure TSpreadSingleFormulaTests.SumIFS_Microsoft_ODS;
begin
TestSumIFS_Microsoft(sfOpenDocument);
end;
{ --- }
procedure TSpreadSingleFormulaTests.IfConst_BIFF8;
begin
TestFormula('IF(C3="A","is A","not A")', 'not A', ftkCellConstant, sfExcel8);