lazarus-ccr/components/fpspreadsheet/unit-tests/common/definednames_tests.pas
2024-08-01 13:11:19 +00:00

198 lines
5.6 KiB
ObjectPascal

{ Defined names tests
These unit tests are writing out to and reading back from file.
}
unit definednames_tests;
{$mode objfpc}{$H+}
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,
fpstypes, fpspreadsheet, xlsbiff2, xlsbiff5, xlsbiff8 {and a project requirement for lclbase for utf8 handling},
testsutility;
type
TDefinedNamesTestType = (dnNamedCellIsConst, dnNamedCellIsFormula, dnNamedRangeIsFormula);
type
{ TSpreadWriteReadDefinedNamesTests }
//Write to xlsx/ods file and read back
TSpreadWriteReadDefinedNamesTests = class(TTestCase)
private
protected
// Set up expected values:
procedure SetUp; override;
procedure TearDown; override;
procedure TestWriteRead_DefinedNames(AFormat: TsSpreadsheetFormat;
const ATestType: TDefinedNamesTestType);
published
// Writes out defined names & reads back.
{ OpenDocument defined tests }
procedure TestWriteRead_ODS_Cell_Comment;
procedure TestWriteRead_ODS_Cell_Formula;
procedure TestWriteRead_ODS_Range_Formula;
{ OOXML comment tests }
procedure TestWriteRead_XLSX_Cell_Comment;
procedure TestWriteRead_XLSX_Cell_Formula;
procedure TestWriteRead_XLSX_Range_Formula;
end;
implementation
{ TSpreadWriteReadDefinedNamesTests }
procedure TSpreadWriteReadDefinedNamesTests.SetUp;
begin
inherited SetUp;
end;
procedure TSpreadWriteReadDefinedNamesTests.TearDown;
begin
inherited TearDown;
end;
procedure TSpreadWriteReadDefinedNamesTests.TestWriteRead_DefinedNames(
AFormat: TsSpreadsheetFormat; const ATestType: TDefinedNamesTestType);
var
MyWorksheet: TsWorksheet;
MyWorkbook: TsWorkbook;
expected, actual: Double;
formula: String;
col, row: Integer;
cell: PCell;
TempFile: string; //write xls/xml to this file and read back from it
begin
TempFile := GetTempFileName;
MyWorkbook := TsWorkbook.Create;
try
MyWorkSheet:= MyWorkBook.AddWorksheet('Data');
// Prepare the test cells: numbers 0, 10, 20, 30, 40 in cells A1..A5
col := 0;
for row := 0 to 4 do
MyWorksheet.WriteNumber(row, col, row*10);
// Add test cases
case ATestType of
dnNamedCellIsConst:
MyWorksheet.DefinedNames.Add('const', 0, 0, 2, 0, 2, 0); // expected: 20
dnNamedCellIsFormula:
begin
MyWorksheet.DefinedNames.Add('formula', 0,0, 3,0, 3,0);
MyWorksheet.WriteFormula(2, 1, '=formula'); // expected: 30
end;
dnNamedRangeIsFormula:
begin
MyWorksheet.DefinedNames.Add('values', 0, 0, 0, 0, 4, 0); // expected: 100
MyWorksheet.WriteFormula(2, 1, 'SUM(values)');
end;
end;
MyWorkBook.WriteToFile(TempFile, AFormat, true);
finally
MyWorkbook.Free;
end;
// Open the spreadsheet
MyWorkbook := TsWorkbook.Create;
try
MyWorkbook.Options := [boAutoCalc, boReadFormulas];
MyWorkbook.ReadFromFile(TempFile, AFormat);
MyWorksheet := GetWorksheetByName(MyWorkBook, 'Data');
if MyWorksheet=nil then
fail('Error in test code. Failed to get named worksheet');
case ATestType of
dnNamedCellIsConst:
begin
row := 2;
col := 0;
actual := MyWorksheet.ReadAsNumber(row, col);
expected := 20;
CheckEquals(expected, actual,
'Test saved named cell mismatch, cell '+CellNotation(MyWorksheet, row, col));
end;
dnNamedCellIsFormula:
begin
row := 2;
col := 1;
cell := MyWorksheet.FindCell(row, col);
formula := MyWorksheet.ReadFormulaAsString(cell);
CheckEquals('formula', formula,
'Test saved formula mismatch, cell ' + CellNotation(MyWorksheet, row, col));
actual := MyWorksheet.ReadAsNumber(cell);
expected := 30;
CheckEquals(expected, actual,
'Test saved named cell mismatch, cell '+CellNotation(MyWorksheet, row, col));
end;
dnNamedRangeIsFormula:
begin
row := 2;
col := 1;
cell := MyWorksheet.Findcell(row, col);
formula := MyWorksheet.ReadFormulaAsString(cell);
CheckEquals('SUM(values)', formula,
'Test saved formula mismatch, cell ' + CellNotation(MyWorksheet, row, col));
actual := MyWorksheet.ReadAsNumber(cell);
expected := 100;
CheckEquals(expected, actual,
'Test saved named range mismatch, cell '+CellNotation(MyWorksheet, row, col));
end;
end;
finally
MyWorkbook.Free;
DeleteFile(TempFile);
end;
end;
{ Tests for Open Document file format }
procedure TSpreadWriteReadDefinedNamesTests.TestWriteRead_ODS_Cell_Comment;
begin
TestWriteRead_DefinedNames(sfOpenDocument, dnNamedCellIsConst);
end;
procedure TSpreadWriteReadDefinedNamesTests.TestWriteRead_ODS_Cell_Formula;
begin
TestWriteRead_DefinedNames(sfOpenDocument, dnNamedCellIsFormula);
end;
procedure TSpreadWriteReadDefinedNamesTests.TestWriteRead_ODS_Range_Formula;
begin
TestWriteRead_DefinedNames(sfOpenDocument, dnNamedRangeIsFormula);
end;
{ Tests for XLSX file format }
procedure TSpreadWriteReadDefinedNamesTests.TestWriteRead_XLSX_Cell_Comment;
begin
TestWriteRead_DefinedNames(sfOOXML, dnNamedCellIsConst);
end;
procedure TSpreadWriteReadDefinedNamesTests.TestWriteRead_XLSX_Cell_Formula;
begin
TestWriteRead_DefinedNames(sfOOXML, dnNamedCellIsFormula);
end;
procedure TSpreadWriteReadDefinedNamesTests.TestWriteRead_XLSX_Range_Formula;
begin
TestWriteRead_DefinedNames(sfOOXML, dnNamedRangeIsFormula);
end;
initialization
RegisterTest(TSpreadWriteReadDefinedNamesTests);
end.