lazarus-ccr/components/fpspreadsheet/unit-tests/common/colrowtests.pas
wp_xxyyzz 1626e8ab2f fpspreadsheet: Less hints and warnings
git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@8126 8e941d3f-bd1b-0410-a28a-d453659cc2b4
2021-10-27 16:14:40 +00:00

2927 lines
98 KiB
ObjectPascal

{ Tests for insertion and deletion of columns and rows
This unit test is writing out to and reading back from files.
}
unit colrowtests;
{$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, xlsbiff8, {and a project requirement for lclbase for utf8 handling}
testsutility;
type
TInsDelTestDataItem = record
Layout: string;
InsertCol: Integer;
InsertRow: Integer;
DeleteCol: Integer;
DeleteRow: Integer;
Formula: String;
SollFormula: String;
{
SharedFormulaRowCount: Integer; // Size of shared formula block before insert/delete
SharedFormulaColCount: Integer;
SharedFormulaBaseCol_After: Integer; // Position of shared formula base after insert/delete
SharedFormulaBaseRow_After: Integer;
SharedFormulaRowCount_After: Integer; // Size of shared formula block after insert/delete
SharedFormulaColCount_After: Integer;
}
MergedColCount: Integer; // size of merged block before insert/delete
MergedRowCount: Integer;
MergedColCount_After: Integer; // size of merged block after insert/delete
MergedRowCount_After: Integer;
SollLayout: String;
end;
var
InsDelTestData: array[0..34] of TInsDelTestDataItem;
procedure InitTestData;
type
{ TSpreadWriteReadInsertColRowTests }
TSpreadWriteRead_ColRow_Tests = class(TTestCase)
private
protected
// Set up expected values:
procedure SetUp; override;
procedure TearDown; override;
procedure TestWriteRead_InsDelColRow(ATestIndex: Integer;
AFormat: TsSpreadsheetFormat);
procedure TestWriteRead_InsDelColRow_FormulaSameSheet(ATestIndex: Integer);
procedure TestWriteRead_InsDelColRow_FormulaOtherSheet(ATestIndex: Integer);
procedure TestWriteRead_HideShowColRow(IsCol: Boolean;
IsHide: boolean; IsDefaultColRow: Boolean; AFormat: TsSpreadsheetFormat);
procedure TestWriteRead_AddPageBreak_Col(Hidden: Boolean; AFormat: TsSpreadsheetFormat);
procedure TestWriteRead_AddPageBreak_Row(Hidden: Boolean; AFormat: TsSpreadsheetFormat);
procedure TestWriteRead_RemovePageBreak_Col(Hidden: Boolean; AFormat: TsSpreadsheetFormat);
procedure TestWriteRead_RemovePageBreak_Row(Hidden: Boolean; AFormat: TsSpreadsheetFormat);
published
// *** Excel 8 tests ***
// Writes out simple cell layout and inserts columns
procedure TestWriteRead_InsDelColRow_0_BIFF8; // before first
procedure TestWriteRead_InsDelColRow_1_BIFF8; // middle
procedure TestWriteRead_InsDelColRow_2_BIFF8; // before last
// Writes out simple cell layout and deletes columns
procedure TestWriteRead_InsDelColRow_3_BIFF8; // first
procedure TestWriteRead_InsDelColRow_4_BIFF8; // middle
procedure TestWriteRead_InsDelColRow_5_BIFF8; // last
// Writes out simple cell layout and inserts rows
procedure TestWriteRead_InsDelColRow_6_BIFF8; // before first
procedure TestWriteRead_InsDelColRow_7_BIFF8; // middle
procedure TestWriteRead_InsDelColRow_8_BIFF8; // before last
// Writes out simple cell layout and deletes rows
procedure TestWriteRead_InsDelColRow_9_BIFF8; // first
procedure TestWriteRead_InsDelColRow_10_BIFF8; // middle
procedure TestWriteRead_InsDelColRow_11_BIFF8; // last
// Writes out cell layout with formula and inserts columns
procedure TestWriteRead_InsDelColRow_12_BIFF8; // before formula cell
procedure TestWriteRead_InsDelColRow_13_BIFF8; // after formula cell
// Writes out cell layout with formula and inserts rows
procedure TestWriteRead_InsDelColRow_14_BIFF8; // before formula cell
procedure TestWriteRead_InsDelColRow_15_BIFF8; // after formula cell
// Writes out cell layout with formula and deletes columns
procedure TestWriteRead_InsDelColRow_16_BIFF8; // before formula cell
procedure TestWriteRead_InsDelColRow_17_BIFF8; // after formula cell
procedure TestWriteRead_InsDelColRow_18_BIFF8; // cell in formula
// Writes out cell layout with formula and deletes rows
procedure TestWriteRead_InsDelColRow_19_BIFF8; // before formula cell
procedure TestWriteRead_InsDelColRow_20_BIFF8; // after formula cell
procedure TestWriteRead_InsDelColRow_21_BIFF8; // cell in formula
// Writes out cell layout with merged cells
procedure TestWriteRead_InsDelColRow_22_BIFF8; // no insert/delete; just test merged block
// ... and inserts columns
procedure TestWriteRead_InsDelColRow_23_BIFF8; // column before merged block
procedure TestWriteRead_InsDelColRow_24_BIFF8; // column through merged block
procedure TestWriteRead_InsDelColRow_25_BIFF8; // column after merged block
// ... and inserts rows
procedure TestWriteRead_InsDelColRow_26_BIFF8; // row before merged block
procedure TestWriteRead_InsDelColRow_27_BIFF8; // row through merged block
procedure TestWriteRead_InsDelColRow_28_BIFF8; // row after merged block
// ... and deletes columns
procedure TestWriteRead_DelColBeforeMerge_BIFF8; // column before merged block
procedure TestWriteRead_DelColInMerge_BIFF8; // column through merged block
procedure TestWriteRead_DelColAfterMerge_BIFF8; // column after merged block
// ... and deletes rows
procedure TestWriteRead_InsDelColRow_32_BIFF8; // row before merged block
procedure TestWriteRead_InsDelColRow_33_BIFF8; // row through merged block
procedure TestWriteRead_InsDelColRow_34_BIFF8; // row after merged block
// *** OOXML tests ***
// Writes out simple cell layout and inserts columns
procedure TestWriteRead_InsDelColRow_0_OOXML; // before first
procedure TestWriteRead_InsDelColRow_1_OOXML; // middle
procedure TestWriteRead_InsDelColRow_2_OOXML; // before last
// Writes out simple cell layout and deletes columns
procedure TestWriteRead_InsDelColRow_3_OOXML; // first
procedure TestWriteRead_InsDelColRow_4_OOXML; // middle
procedure TestWriteRead_InsDelColRow_5_OOXML; // last
// Writes out simple cell layout and inserts rows
procedure TestWriteRead_InsDelColRow_6_OOXML; // before first
procedure TestWriteRead_InsDelColRow_7_OOXML; // middle
procedure TestWriteRead_InsDelColRow_8_OOXML; // before last
// Writes out simple cell layout and deletes rows
procedure TestWriteRead_InsDelColRow_9_OOXML; // first
procedure TestWriteRead_InsDelColRow_10_OOXML; // middle
procedure TestWriteRead_InsDelColRow_11_OOXML; // last
// Writes out cell layout with formula and inserts columns
procedure TestWriteRead_InsDelColRow_12_OOXML; // before formula cell
procedure TestWriteRead_InsDelColRow_13_OOXML; // after formula cell
// Writes out cell layout with formula and inserts rows
procedure TestWriteRead_InsDelColRow_14_OOXML; // before formula cell
procedure TestWriteRead_InsDelColRow_15_OOXML; // after formula cell
// Writes out cell layout with formula and deletes columns
procedure TestWriteRead_InsDelColRow_16_OOXML; // before formula cell
procedure TestWriteRead_InsDelColRow_17_OOXML; // after formula cell
procedure TestWriteRead_InsDelColRow_18_OOXML; // cell in formula
// Writes out cell layout with formula and deletes rows
procedure TestWriteRead_InsDelColRow_19_OOXML; // before formula cell
procedure TestWriteRead_InsDelColRow_20_OOXML; // after formula cell
procedure TestWriteRead_InsDelColRow_21_OOXML; // cell in formula
// Writes out cell layout with merged cells
procedure TestWriteRead_InsDelColRow_22_OOXML; // no insert/delete; just test merged block
// ... and inserts columns
procedure TestWriteRead_InsDelColRow_23_OOXML; // column before merged block
procedure TestWriteRead_InsDelColRow_24_OOXML; // column through merged block
procedure TestWriteRead_InsDelColRow_25_OOXML; // column after merged block
// ... and inserts rows
procedure TestWriteRead_InsDelColRow_26_OOXML; // row before merged block
procedure TestWriteRead_InsDelColRow_27_OOXML; // row through merged block
procedure TestWriteRead_InsDelColRow_28_OOXML; // row after merged block
// ... and deletes columns
procedure TestWriteRead_DelColBeforeMerge_OOXML; // column before merged block
procedure TestWriteRead_DelColInMerge_OOXML; // column through merged block
procedure TestWriteRead_DelColAfterMerge_OOXML; // column after merged block
// ... and deletes rows
procedure TestWriteRead_InsDelColRow_32_OOXML; // row before merged block
procedure TestWriteRead_InsDelColRow_33_OOXML; // row through merged block
procedure TestWriteRead_InsDelColRow_34_OOXML; // row after merged block
// *** OpenDocument tests ***
// Writes out simple cell layout and inserts columns
procedure TestWriteRead_InsDelColRow_0_ODS; // before first
procedure TestWriteRead_InsDelColRow_1_ODS; // middle
procedure TestWriteRead_InsDelColRow_2_ODS; // before last
// Writes out simple cell layout and deletes columns
procedure TestWriteRead_InsDelColRow_3_ODS; // first
procedure TestWriteRead_InsDelColRow_4_ODS; // middle
procedure TestWriteRead_InsDelColRow_5_ODS; // last
// Writes out simple cell layout and inserts rows
procedure TestWriteRead_InsDelColRow_6_ODS; // before first
procedure TestWriteRead_InsDelColRow_7_ODS; // middle
procedure TestWriteRead_InsDelColRow_8_ODS; // before last
// Writes out simple cell layout and deletes rows
procedure TestWriteRead_InsDelColRow_9_ODS; // first
procedure TestWriteRead_InsDelColRow_10_ODS; // middle
procedure TestWriteRead_InsDelColRow_11_ODS; // last
// Writes out cell layout with formula and inserts columns
procedure TestWriteRead_InsDelColRow_12_ODS; // before formula cell
procedure TestWriteRead_InsDelColRow_13_ODS; // after formula cell
// Writes out cell layout with formula and inserts rows
procedure TestWriteRead_InsDelColRow_14_ODS; // before formula cell
procedure TestWriteRead_InsDelColRow_15_ODS; // after formula cell
// Writes out cell layout with formula and deletes columns
procedure TestWriteRead_InsDelColRow_16_ODS; // before formula cell
procedure TestWriteRead_InsDelColRow_17_ODS; // after formula cell
procedure TestWriteRead_InsDelColRow_18_ODS; // cell in formula
// Writes out cell layout with formula and deletes rows
procedure TestWriteRead_InsDelColRow_19_ODS; // before formula cell
procedure TestWriteRead_InsDelColRow_20_ODS; // after formula cell
procedure TestWriteRead_InsDelColRow_21_ODS; // cell in formula
// Writes out cell layout with merged cells
procedure TestWriteRead_InsDelColRow_22_ODS; // no insert/delete; just test merged block
// ... and inserts columns
procedure TestWriteRead_InsDelColRow_23_ODS; // column before merged block
procedure TestWriteRead_InsDelColRow_24_ODS; // column through merged block
procedure TestWriteRead_InsDelColRow_25_ODS; // column after merged block
// ... and inserts rows
procedure TestWriteRead_InsDelColRow_26_ODS; // row before merged block
procedure TestWriteRead_InsDelColRow_27_ODS; // row through merged block
procedure TestWriteRead_InsDelColRow_28_ODS; // row after merged block
// ... and deletes columns
procedure TestWriteRead_DelColBeforeMerge_ODS; // column before merged block
procedure TestWriteRead_DelColInMerge_ODS; // column through merged block
procedure TestWriteRead_DelColAfterMerge_ODS; // column after merged block
// ... and deletes rows
procedure TestWriteRead_InsDelColRow_32_ODS; // row before merged block
procedure TestWriteRead_InsDelColRow_33_ODS; // row through merged block
procedure TestWriteRead_InsDelColRow_34_ODS; // row after merged block
// Hide a column having default col width
procedure TestWriteRead_HideColDef_BIFF5;
procedure TestWriteRead_HideColDef_BIFF8;
procedure TestWriteRead_HideColDef_OOXML;
procedure TestWriteRead_HideColDef_XML;
procedure TestWriteRead_HideColDef_ODS;
// Hide a row having default row height
procedure TestWriteRead_HideRowDef_BIFF5;
procedure TestWriteRead_HideRowDef_BIFF8;
procedure TestWriteRead_HideRowDef_OOXML;
procedure TestWriteRead_HideRowDef_XML;
procedure TestWriteRead_HideRowDef_ODS;
// Show a hidden column having default col width
procedure TestWriteRead_ShowColDef_BIFF5;
procedure TestWriteRead_ShowColDef_BIFF8;
procedure TestWriteRead_ShowColDef_OOXML;
procedure TestWriteRead_ShowColDef_XML;
procedure TestWriteRead_ShowColDef_ODS;
// Show a hidden row having default row height
procedure TestWriteRead_ShowRowDef_BIFF5;
procedure TestWriteRead_ShowRowDef_BIFF8;
procedure TestWriteRead_ShowRowDef_OOXML;
procedure TestWriteRead_ShowRowDef_XML;
procedure TestWriteRead_ShowRowDef_ODS;
// Hide a column
procedure TestWriteRead_HideCol_BIFF5;
procedure TestWriteRead_HideCol_BIFF8;
procedure TestWriteRead_HideCol_OOXML;
procedure TestWriteRead_HideCol_XML;
procedure TestWriteRead_HideCol_ODS;
// Hide a row
procedure TestWriteRead_HideRow_BIFF5;
procedure TestWriteRead_HideRow_BIFF8;
procedure TestWriteRead_HideRow_OOXML;
procedure TestWriteRead_HideRow_XML;
procedure TestWriteRead_HideRow_ODS;
// Show a hidden column
procedure TestWriteRead_ShowCol_BIFF5;
procedure TestWriteRead_ShowCol_BIFF8;
procedure TestWriteRead_ShowCol_OOXML;
procedure TestWriteRead_ShowCol_XML;
procedure TestWriteRead_ShowCol_ODS;
// Show a hidden row
procedure TestWriteRead_ShowRow_BIFF5;
procedure TestWriteRead_ShowRow_BIFF8;
procedure TestWriteRead_ShowRow_OOXML;
procedure TestWriteRead_ShowRow_XML;
procedure TestWriteRead_ShowRow_ODS;
// Add a page break column
procedure TestWriteRead_AddPageBreak_Col_BIFF2;
procedure TestWriteRead_AddPageBreak_Row_BIFF2;
procedure TestWriteRead_AddPageBreak_Col_BIFF5;
procedure TestWriteRead_AddPageBreak_ColHidden_BIFF5;
procedure TestWriteRead_AddPageBreak_Row_BIFF5;
procedure TestWriteRead_AddPageBreak_RowHidden_BIFF5;
procedure TestWriteRead_AddPageBreak_Col_BIFF8;
procedure TestWriteRead_AddPageBreak_ColHidden_BIFF8;
procedure TestWriteRead_AddPageBreak_Row_BIFF8;
procedure TestWriteRead_AddPageBreak_RowHidden_BIFF8;
procedure TestWriteRead_AddPageBreak_Col_OOXML;
procedure TestWriteRead_AddPageBreak_ColHidden_OOXML;
procedure TestWriteRead_AddPageBreak_Row_OOXML;
procedure TestWriteRead_AddPageBreak_RowHidden_OOXML;
procedure TestWriteRead_AddPageBreak_Col_XML;
procedure TestWriteRead_AddPageBreak_ColHidden_XML;
procedure TestWriteRead_AddPageBreak_Row_XML;
procedure TestWriteRead_AddPageBreak_RowHidden_XML;
procedure TestWriteRead_AddPageBreak_Col_ODS;
procedure TestWriteRead_AddPageBreak_ColHidden_ODS;
procedure TestWriteRead_AddPageBreak_Row_ODS;
procedure TestWriteRead_AddPageBreak_RowHidden_ODS;
// Remove a page break column
procedure TestWriteRead_RemovePageBreak_Col_BIFF2;
procedure TestWriteRead_RemovePageBreak_Row_BIFF2;
procedure TestWriteRead_RemovePageBreak_Col_BIFF5;
procedure TestWriteRead_RemovePageBreak_ColHidden_BIFF5;
procedure TestWriteRead_RemovePageBreak_Row_BIFF5;
procedure TestWriteRead_RemovePageBreak_RowHidden_BIFF5;
procedure TestWriteRead_RemovePageBreak_Col_BIFF8;
procedure TestWriteRead_RemovePageBreak_ColHidden_BIFF8;
procedure TestWriteRead_RemovePageBreak_Row_BIFF8;
procedure TestWriteRead_RemovePageBreak_RowHidden_BIFF8;
procedure TestWriteRead_RemovePageBreak_Col_OOXML;
procedure TestWriteRead_RemovePageBreak_ColHidden_OOXML;
procedure TestWriteRead_RemovePageBreak_Row_OOXML;
procedure TestWriteRead_RemovePageBreak_RowHidden_OOXML;
procedure TestWriteRead_RemovePageBreak_Col_XML;
procedure TestWriteRead_RemovePageBreak_ColHidden_XML;
procedure TestWriteRead_RemovePageBreak_Row_XML;
procedure TestWriteRead_RemovePageBreak_RowHidden_XML;
procedure TestWriteRead_RemovePageBreak_Col_ODS;
procedure TestWriteRead_RemovePageBreak_ColHidden_ODS;
procedure TestWriteRead_RemovePageBreak_Row_ODS;
procedure TestWriteRead_RemovePageBreak_RowHidden_ODS;
procedure TestWriteRead_InsCol_FormulaSameSheet;
procedure TestWriteRead_DelCol_FormulaSameSheet;
procedure TestWriteRead_InsRow_FormulaSameSheet;
procedure TestWriteRead_DelRow_FormulaSameSheet;
procedure TestWriteRead_InsCol_FormulaOtherSheet;
procedure TestWriteRead_DelCol_FormulaOtherSheet;
procedure TestWriteRead_InsRow_FormulaOtherSheet;
procedure TestWriteRead_DelRow_FormulaOtherSheet;
procedure TestWriteRead_InsCol_FormulaOtherSheet_Outside3D;
procedure TestWriteRead_DelCol_FormulaOtherSheet_Outside3D;
procedure TestWriteRead_InsRow_FormulaOtherSheet_Outside3D;
procedure TestWriteRead_DelRow_FormulaOtherSheet_Outside3D;
// procedure TestWriteRead_InsCol_FormulaOtherSheet_Inside3D;
end;
implementation
uses
fpsUtils;
const
InsertColRowSheet = 'InsertDelete_ColumnsRows';
HideShowSheet = 'HideShow_ColumnsRows';
procedure InitTestData;
var
i: Integer;
begin
for i := 0 to High(InsDelTestData) do
with InsDelTestData[i] do
begin
Layout := '';
InsertCol := -1;
InsertRow := -1;
DeleteCol := -1;
DeleteRow := -1;
Formula := '';
SollFormula := '';
{
SharedFormulaColCount := 0;
SharedFormulaRowCount := 0;
SharedFormulaBaseCol_After := -1;
SharedFormulaBaseRow_After := -1;
SharedFormulaColCount_After := 0;
SharedFormulaRowCount_After := 0;
}
MergedColCount := 0;
MergedRowCount := 0;
end;
{ ---------------------------------------------------------------------------}
{ Simple layouts }
{ ---------------------------------------------------------------------------}
// Insert a column before col 0
with InsDelTestData[0] do begin
Layout := '12345678|'+
'23456789|'+
'34567890|'+
'45678901';
InsertCol := 0;
SollLayout := ' 12345678|'+
' 23456789|'+
' 34567890|'+
' 45678901';
end;
// Insert a column before col 2
with InsDelTestData[1] do begin
Layout := '12345678|'+
'23456789|'+
'34567890|'+
'45678901';
InsertCol := 2;
SollLayout := '12 345678|'+
'23 456789|'+
'34 567890|'+
'45 678901';
end;
// Insert a column before last col
with InsDelTestData[2] do begin
Layout := '12345678|'+
'23456789|'+
'34567890|'+
'45678901';
InsertCol := 7;
SollLayout := '1234567 8|'+
'2345678 9|'+
'3456789 0|'+
'4567890 1';
end;
// Delete column 0
with InsDelTestData[3] do begin
Layout := '12345678|'+
'23456789|'+
'34567890|'+
'45678901';
DeleteCol := 0;
SollLayout := '2345678|'+
'3456789|'+
'4567890|'+
'5678901';
end;
// Delete column 2
with InsDelTestData[4] do begin
Layout := '12345678|'+
'23456789|'+
'34567890|'+
'45678901';
DeleteCol := 2;
SollLayout := '1245678|'+
'2356789|'+
'3467890|'+
'4578901';
end;
// Delete last column
with InsDelTestData[5] do begin
Layout := '12345678|'+
'23456789|'+
'34567890|'+
'45678901';
DeleteCol := 7;
SollLayout := '1234567|'+
'2345678|'+
'3456789|'+
'4567890';
end;
// Insert a ROW before row 0
with InsDelTestData[6] do begin
Layout := '12345|'+
'23456|'+
'34567|'+
'45678|'+
'56789|'+
'67890|';
InsertRow := 0;
SollLayout := ' |'+
'12345|'+
'23456|'+
'34567|'+
'45678|'+
'56789|'+
'67890|';
end;
// Insert a ROW before row 2
with InsDelTestData[7] do begin
Layout := '12345|'+
'23456|'+
'34567|'+
'45678|'+
'56789|'+
'67890|';
InsertRow := 2;
SollLayout := '12345|'+
'23456|'+
' |'+
'34567|'+
'45678|'+
'56789|'+
'67890|';
end;
// Insert a ROW before last row
with InsDelTestData[8] do begin
Layout := '12345|'+
'23456|'+
'34567|'+
'45678|'+
'56789|'+
'67890|';
InsertRow := 5;
SollLayout := '12345|'+
'23456|'+
'34567|'+
'45678|'+
'56789|'+
' |'+
'67890|';
end;
// Delete the first row
with InsDelTestData[9] do begin
Layout := '12345|'+
'23456|'+
'34567|'+
'45678|'+
'56789|'+
'67890|';
DeleteRow := 0;
SollLayout := '23456|'+
'34567|'+
'45678|'+
'56789|'+
'67890|';
end;
// Delete row #2
with InsDelTestData[10] do begin
Layout := '12345|'+
'23456|'+
'34567|'+
'45678|'+
'56789|'+
'67890|';
DeleteRow := 2;
SollLayout := '12345|'+
'23456|'+
'45678|'+
'56789|'+
'67890|';
end;
// Delete last row
with InsDelTestData[11] do begin
Layout := '12345|'+
'23456|'+
'34567|'+
'45678|'+
'56789|'+
'67890|';
DeleteRow := 5;
SollLayout := '12345|'+
'23456|'+
'34567|'+
'45678|'+
'56789';
end;
{ ---------------------------------------------------------------------------}
{ Layouts with formula }
{ ---------------------------------------------------------------------------}
// Insert a column before #1, i.e. before formula cell
with InsDelTestData[12] do begin
Layout := '12345678|'+
'23456789|'+
'3456F890|'+ // "F" = Formula in row 2, col 4
'45678901|'+
'56789012|'+
'67890123';
InsertCol := 1;
Formula := 'C3';
SollFormula := 'D3'; // col index increases due to inserted col
SollLayout := '1 2345678|'+
'2 3456789|'+
'3 4565890|'+
'4 5678901|'+
'5 6789012|'+
'6 7890123';
end;
// Insert a column before #3, i.e. after formula cell
with InsDelTestData[13] do begin
Layout := '12345678|'+
'23456789|'+
'3456F890|'+ // "F" = Formula in row 2, col 4
'45678901|'+
'56789012|'+
'67890123';
InsertCol := 3;
Formula := 'C3';
SollFormula := 'C3'; // no change of cell because insertion is behind
SollLayout := '123 45678|'+
'234 56789|'+
'345 65890|'+
'456 78901|'+
'567 89012|'+
'678 90123';
end;
// Insert a row before #1, i.e. before formula cell
with InsDelTestData[14] do begin
Layout := '12345678|'+
'23456789|'+
'3456F890|'+ // "F" = Formula in row 2, col 4
'45678901|'+
'56789012|'+
'67890123';
InsertRow := 1;
Formula := 'E4';
SollFormula := 'E5'; // row index increaes due to inserted row
SollLayout := '12345678|'+
' |'+
'23456789|'+
'34568890|'+
'45678901|'+
'56789012|'+
'67890123';
end;
// Insert a row before #4, i.e. after formula cell
with InsDelTestData[15] do begin
Layout := '12345678|'+
'23456789|'+
'3456F890|'+ // "F" = Formula in row 2, col 4
'45678901|'+
'56789012|'+
'67890123';
InsertRow := 5;
Formula := 'E4';
SollFormula := 'E4'; // row index not changed dur to insert after cell
SollLayout := '12345678|'+
'23456789|'+
'34568890|'+
'45678901|'+
'56789012|'+
' |'+
'67890123';
end;
// Deletes column #1, i.e. before formula cell
with InsDelTestData[16] do begin
Layout := '12345678|'+
'23456789|'+
'3456F890|'+ // "F" = Formula in row 2, col 4
'45678901|'+
'56789012|'+
'67890123';
DeleteCol := 1;
Formula := 'C3';
SollFormula := 'B3'; // col index decreases due to delete before cell
SollLayout := '1345678|'+
'2456789|'+
'3565890|'+
'4678901|'+
'5789012|'+
'6890123';
end;
// Deletes column #5, i.e. after formula cell
with InsDelTestData[17] do begin
Layout := '12345678|'+
'23456789|'+
'3456F890|'+ // "F" = Formula in row 2, col 4
'45678901|'+
'56789012|'+
'67890123';
DeleteCol := 5;
Formula := 'C3';
SollFormula := 'C3'; // col index unchanged due to deleted after cell
SollLayout := '1234578|'+
'2345689|'+
'3456590|'+
'4567801|'+
'5678912|'+
'6789023';
end;
// Deletes column #2, i.e. cell appearing in formula is gone --> #REF! error
with InsDelTestData[18] do begin
Layout := '12345678|'+
'23456789|'+
'3456F890|'+ // "F" = Formula in row 2, col 4
'45678901|'+
'56789012|'+
'67890123';
DeleteCol := 2;
Formula := 'C3';
SollFormula := '#REF!'; // cell needec by formula does not exist any more
SollLayout := '1245678|'+
'2356789|'+
'346E890|'+ // "E" = error
'4578901|'+
'5689012|'+
'6790123';
end;
// Deletes row #1, i.e. before formula cell
with InsDelTestData[19] do begin
Layout := '12345678|'+
'23456789|'+
'3456F890|'+ // "F" = Formula in row 2, col 4
'45678901|'+
'56789012|'+
'67890123';
DeleteRow := 1;
Formula := 'E4';
SollFormula := 'E3'; // row index decreases due to delete before cell
SollLayout := '12345678|'+
// '23456789|'+
'34568890|'+
'45678901|'+
'56789012|'+
'67890123';
end;
// Deletes row #4, i.e. after formula cell
with InsDelTestData[20] do begin
Layout := '12345678|'+
'23456789|'+
'3456F890|'+ // "F" = Formula in row 2, col 4
'45678901|'+
'56789012|'+
'67890123';
DeleteRow := 4;
Formula := 'E4';
SollFormula := 'E4'; // row index unchanged (delete is after cell)
SollLayout := '12345678|'+
'23456789|'+
'34568890|'+
'45678901|'+
// '56789012|'+
'67890123';
end;
// Deletes row #2, i.e. row containing cell used in formula --> #REF! error!
with InsDelTestData[21] do begin
Layout := '12345678|'+
'23456789|'+
'3456F890|'+ // "F" = Formula in row 2, col 4
'45678901|'+ // delete this row
'56789012|'+
'67890123';
DeleteRow := 3;
Formula := 'E4';
SollFormula := '#REF!';
SollLayout := '12345678|'+
'23456789|'+
'3456E890|'+ // "E" = error
// '45678901|'+
'56789012|'+
'67890123';
end;
{ ---------------------------------------------------------------------------}
{ Layouts with merged cells }
{ ---------------------------------------------------------------------------}
// No insert/delete, just to test the merged block
with InsDelTestData[22] do begin
Layout := '12345678|'+
'23456789|'+
'345M 890|'+ // "M" = merged block (2 cols x 3 rows)
'456 901|'+
'567 012|'+
'67890123';
MergedRowCount := 3;
MergedColCount := 2;
MergedRowCount_After := 3;
MergedColCount_After := 2;
SollLayout := '12345678|'+
'23456789|'+
'345M 890|'+
'456 901|'+
'567 012|'+
'67890123';
end;
// Insert column before merged block
with InsDelTestData[23] do begin
Layout := '12345678|'+
'23456789|'+
'345M 890|'+ // "M" = merged block (2 cols x 3 rows)
'456 901|'+
'567 012|'+
'67890123';
InsertCol := 1;
MergedRowCount := 3;
MergedColCount := 2;
MergedRowCount_After := 3;
MergedColCount_After := 2;
SollLayout := '1 2345678|'+
'2 3456789|'+
'3 45M 890|'+
'4 56 901|'+
'5 67 012|'+
'6 7890123';
end;
// Insert column through merged block
with InsDelTestData[24] do begin
Layout := '12345678|'+
'23456789|'+
'345M 890|'+ // "M" = merged block (2 cols x 3 rows)
'456 901|'+
'567 012|'+
'67890123';
InsertCol := 4;
MergedRowCount := 3;
MergedColCount := 2;
MergedRowCount_After := 3;
MergedColCount_After := 3;
SollLayout := '1234 5678|'+
'2345 6789|'+
'345M 890|'+
'456 901|'+
'567 012|'+
'6789 0123';
end;
// Insert column behind merged block
with InsDelTestData[25] do begin
Layout := '12345678|'+
'23456789|'+
'345M 890|'+ // "M" = merged block (2 cols x 3 rows)
'456 901|'+
'567 012|'+
'67890123';
InsertCol := 7;
MergedRowCount := 3;
MergedColCount := 2;
MergedRowCount_After := 3;
MergedColCount_After := 2;
SollLayout := '1234567 8|'+
'2345678 9|'+
'345M 89 0|'+
'456 90 1|'+
'567 01 2|'+
'6789012 3';
end;
// Insert row above merged block
with InsDelTestData[26] do begin
Layout := '12345678|'+
'23456789|'+
'345M 890|'+ // "M" = merged block (2 cols x 3 rows)
'456 901|'+
'567 012|'+
'67890123';
InsertRow := 0;
MergedRowCount := 3;
MergedColCount := 2;
MergedRowCount_After := 3;
MergedColCount_After := 2;
SollLayout := ' |'+
'12345678|'+
'23456789|'+
'345M 890|'+
'456 901|'+
'567 012|'+
'67890123';
end;
// Insert row through merged block
with InsDelTestData[27] do begin
Layout := '12345678|'+
'23456789|'+
'345M 890|'+ // "M" = merged block (2 cols x 3 rows)
'456 901|'+
'567 012|'+
'67890123';
InsertRow := 3;
MergedRowCount := 3;
MergedColCount := 2;
MergedRowCount_After := 4;
MergedColCount_After := 2;
SollLayout := '12345678|'+
'23456789|'+
'345M 890|'+
' |'+
'456 901|'+
'567 012|'+
'67890123';
end;
// Insert row below merged block
with InsDelTestData[28] do begin
Layout := '12345678|'+
'23456789|'+
'345M 890|'+ // "M" = merged block (2 cols x 3 rows)
'456 901|'+
'567 012|'+
'67890123';
InsertRow := 5;
MergedRowCount := 3;
MergedColCount := 2;
MergedRowCount_After := 3;
MergedColCount_After := 2;
SollLayout := '12345678|'+
'23456789|'+
'345M 890|'+
'456 901|'+
'567 012|'+
' |'+
'67890123';
end;
// Delete column before merged block
with InsDelTestData[29] do begin
Layout := '12345678|'+
'23456789|'+
'345M 890|'+ // "M" = merged block (2 cols x 3 rows)
'456 901|'+
'567 012|'+
'67890123';
DeleteCol := 1;
MergedRowCount := 3;
MergedColCount := 2;
MergedRowCount_After := 3;
MergedColCount_After := 2;
SollLayout := '1345678|'+
'2456789|'+
'35M 890|'+
'46 901|'+
'57 012|'+
'6890123';
end;
// Delete column through merged block
with InsDelTestData[30] do begin
Layout := '12345678|'+
'23456789|'+
'345M 890|'+ // "M" = merged block (2 cols x 3 rows)
'456 901|'+
'567 012|'+
'67890123';
DeleteCol := 4;
MergedRowCount := 3;
MergedColCount := 2;
MergedRowCount_After := 3;
MergedColCount_After := 1;
SollLayout := '1234678|'+
'2345789|'+
'345M890|'+
'456 901|'+
'567 012|'+
'6789123';
end;
// Delete column behind merged block
with InsDelTestData[31] do begin
Layout := '12345678|'+
'23456789|'+
'345M 890|'+ // "M" = merged block (2 cols x 3 rows)
'456 901|'+
'567 012|'+
'67890123';
DeleteCol := 7;
MergedRowCount := 3;
MergedColCount := 2;
MergedRowCount_After := 3;
MergedColCount_After := 2;
SollLayout := '1234567|'+
'2345678|'+
'345M 89|'+
'456 90|'+
'567 01|'+
'6789012';
end;
// Delete row above merged block
with InsDelTestData[32] do begin
Layout := '12345678|'+
'23456789|'+
'345M 890|'+ // "M" = merged block (2 cols x 3 rows)
'456 901|'+
'567 012|'+
'67890123';
DeleteRow := 1;
MergedRowCount := 3;
MergedColCount := 2;
MergedRowCount_After := 3;
MergedColCount_After := 2;
SollLayout := '12345678|'+
// '23456789|'+
'345M 890|'+
'456 901|'+
'567 012|'+
'67890123';
end;
// Delete row through merged block
with InsDelTestData[33] do begin
Layout := '12345678|'+
'23456789|'+
'345M 890|'+ // "M" = merged block (2 cols x 3 rows)
'456 901|'+
'567 012|'+
'67890123';
DeleteRow := 4;
MergedRowCount := 3;
MergedColCount := 2;
MergedRowCount_After := 2;
MergedColCount_After := 2;
SollLayout := '12345678|'+
'23456789|'+
'345M 890|'+
'456 901|'+
// '567 012|'+
'67890123';
end;
// Delete row behind merged block
with InsDelTestData[34] do begin
Layout := '12345678|'+
'23456789|'+
'345M 890|'+ // "M" = merged block (2 cols x 3 rows)
'456 901|'+
'567 012|'+
'67890123';
DeleteRow := 5;
MergedRowCount := 3;
MergedColCount := 2;
MergedRowCount_After := 3;
MergedColCount_After := 2;
SollLayout := '12345678|'+
'23456789|'+
'345M 890|'+
'456 901|'+
'567 012';
end;
end;
{ TSpreadWriteRead_InsDelColRowTests }
procedure TSpreadWriteRead_ColRow_Tests.SetUp;
begin
inherited SetUp;
InitTestData;
end;
procedure TSpreadWriteRead_ColRow_Tests.TearDown;
begin
inherited TearDown;
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_InsDelColRow(
ATestIndex: Integer; AFormat: TsSpreadsheetFormat);
var
MyWorksheet: TsWorksheet;
MyWorkbook: TsWorkbook;
row, col: Integer;
lastCol, lastRow: Cardinal;
r1,c1,r2,c2: Cardinal;
MyCell: PCell;
TempFile: string; //write xls/xml to this file and read back from it
L: TStringList;
s: String;
expected: String;
actual: String;
// expectedFormulas: array of array of String;
begin
TempFile := GetTempFileName;
L := TStringList.Create;
try
{
// Extract soll formulas into a 2D array in case of shared formulas
if (InsDelTestData[ATestIndex].SharedFormulaRowCount_After > 0) or
(InsDelTestData[ATestIndex].SharedFormulaColCount_After > 0) then
begin
with InsDelTestData[ATestIndex] do
SetLength(expectedFormulas, SharedFormulaRowCount_After, SharedFormulaColCount_After);
L.Delimiter := ';';
L.DelimitedText := InsDelTestData[ATestIndex].SollFormula;
LL := TStringList.Create;
try
LL.Delimiter := ',';
for row := 0 to InsDelTestData[ATestIndex].SharedFormulaRowCount_After-1 do
begin
s := L[row];
LL.DelimitedText := L[row];
for col := 0 to InsDelTestData[ATestIndex].SharedFormulaColCount_After-1 do
expectedFormulas[row, col] := trim(LL[col]);
end;
finally
LL.Free;
end;
end;
}
L.Delimiter := '|';
L.StrictDelimiter := true;
L.DelimitedText := InsDelTestData[ATestIndex].Layout;
MyWorkbook := TsWorkbook.Create;
try
MyWorkSheet:= MyWorkBook.AddWorksheet(InsertColRowSheet);
// Write out cells
for row := 0 to L.Count-1 do
begin
s := L[row];
for col := 0 to Length(s)-1 do
case s[col+1] of
' ' : ; // Leave cell empty
'0'..'9': MyWorksheet.WriteNumber(row, col, StrToInt(s[col+1]));
'F' : MyWorksheet.WriteFormula(row, col, InsDelTestData[ATestIndex].Formula);
'M' : begin
MyWorksheet.WriteText(row, col, 'M');
MyWorksheet.MergeCells(
row,
col,
row + InsDelTestData[ATestIndex].MergedRowCount - 1,
col + InsDelTestData[ATestIndex].MergedColCount - 1
);
end;
end;
end;
if InsDelTestData[ATestIndex].InsertCol >= 0 then
MyWorksheet.InsertCol(InsDelTestData[ATestIndex].InsertCol);
if InsDelTestData[ATestIndex].InsertRow >= 0 then
MyWorksheet.InsertRow(InsDelTestData[ATestIndex].InsertRow);
if InsDelTestData[ATestIndex].DeleteCol >= 0 then
MyWorksheet.DeleteCol(InsDelTestData[ATestIndex].DeleteCol);
if InsDelTestData[ATestIndex].DeleteRow >= 0 then
MyWorksheet.DeleteRow(InsDelTestData[ATestIndex].DeleteRow);
MyWorkbook.CalcFormulas;
MyWorkBook.WriteToFile(TempFile, AFormat, true);
finally
MyWorkbook.Free;
end;
L.DelimitedText := InsDelTestData[ATestIndex].SollLayout;
// Open the spreadsheet
MyWorkbook := TsWorkbook.Create;
try
MyWorkbook.Options := MyWorkbook.Options + [boReadFormulas, boAutoCalc];
MyWorkbook.ReadFromFile(TempFile, AFormat);
if AFormat = sfExcel2 then
MyWorksheet := MyWorkbook.GetFirstWorksheet
else
MyWorksheet := GetWorksheetByName(MyWorkBook, InsertColRowSheet);
if MyWorksheet=nil then
fail('Error in test code. Failed to get named worksheet');
lastRow := MyWorksheet.GetLastOccupiedRowIndex;
lastCol := MyWorksheet.GetLastOccupiedColIndex;
for row := 0 to lastRow do
begin
expected := L[row];
actual := '';
for col := 0 to lastcol do
begin
MyCell := MyWorksheet.FindCell(row, col);
if MyCell = nil then
actual := actual + ' '
else
case MyCell^.ContentType of
cctEmpty : actual := actual + ' ';
cctNumber : actual := actual + IntToStr(Round(Mycell^.NumberValue));
cctUTF8String: actual := actual + MyCell^.UTF8StringValue;
cctError : actual := actual + 'E';
end;
if HasFormula(MyCell) then
begin
{
if (InsDelTestData[ATestIndex].SharedFormulaRowCount_After > 0) or
(InsDelTestData[ATestIndex].SharedFormulaColCount_After > 0)
then
CheckEquals(
expectedFormulas[row-InsDelTestData[ATestIndex].SharedFormulaBaseRow_After,
col-InsDelTestData[ATestIndex].SharedFormulaBaseCol_After],
MyWorksheet.ReadFormulaAsString(MyCell),
'Shared formula mismatch, cell ' + CellNotation(MyWorksheet, Row, Col)
)
else
}
CheckEquals(
InsDelTestData[ATestIndex].SollFormula,
MyWorksheet.ReadFormulaAsString(MyCell),
'Formula mismatch, cell '+CellNotation(MyWorksheet, Row, Col)
);
end;
if MyWorksheet.IsMerged(MyCell) then
begin
MyWorksheet.FindMergedRange(MyCell, r1, c1, r2, c2);
CheckEquals(
InsDelTestData[ATestIndex].MergedRowCount_After,
r2 - r1 + 1,
'Merged row count mismatch, cell ' + CellNotation(MyWorksheet, Row, Col)
);
CheckEquals(
InsDelTestData[ATestIndex].MergedColCount_After,
c2 - c1 + 1,
'Merged column count mismatch, cell '+CellNotation(MyWorksheet, Row, Col)
);
end;
end;
CheckEquals(expected, actual,
'Test empty cell layout mismatch, cell '+CellNotation(MyWorksheet, Row, Col));
end;
finally
MyWorkbook.Free;
DeleteFile(TempFile);
end;
finally
L.Free;
end;
end;
{------------------------------------------------------------------------------}
{ BIFF8 tests }
{------------------------------------------------------------------------------}
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_InsDelColRow_0_BIFF8;
// insert a column before the first one
begin
TestWriteRead_InsDelColRow(0, sfExcel8);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_InsDelColRow_1_BIFF8;
// insert a column before column 2
begin
TestWriteRead_InsDelColRow(1, sfExcel8);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_InsDelColRow_2_BIFF8;
// insert a column before the last one
begin
TestWriteRead_InsDelColRow(2, sfExcel8);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_InsDelColRow_3_BIFF8;
// delete column 0
begin
TestWriteRead_InsDelColRow(3, sfExcel8);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_InsDelColRow_4_BIFF8;
// delete column 2
begin
TestWriteRead_InsDelColRow(4, sfExcel8);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_InsDelColRow_5_BIFF8;
// delete last column
begin
TestWriteRead_InsDelColRow(5, sfExcel8);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_InsDelColRow_6_BIFF8;
// insert row before first one
begin
TestWriteRead_InsDelColRow(6, sfExcel8);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_InsDelColRow_7_BIFF8;
// insert row before #2
begin
TestWriteRead_InsDelColRow(7, sfExcel8);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_InsDelColRow_8_BIFF8;
// insert row before last one
begin
TestWriteRead_InsDelColRow(8, sfExcel8);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_InsDelColRow_9_BIFF8;
// delete first row
begin
TestWriteRead_InsDelColRow(9, sfExcel8);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_InsDelColRow_10_BIFF8;
// delete row #2
begin
TestWriteRead_InsDelColRow(10, sfExcel8);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_InsDelColRow_11_BIFF8;
// delete last row
begin
TestWriteRead_InsDelColRow(11, sfExcel8);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_InsDelColRow_12_BIFF8;
// insert column before formula cell
begin
TestWriteRead_InsDelColRow(12, sfExcel8);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_InsDelColRow_13_BIFF8;
// insert column after formula cell
begin
TestWriteRead_InsDelColRow(13, sfExcel8);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_InsDelColRow_14_BIFF8;
// insert row before formula cell
begin
TestWriteRead_InsDelColRow(14, sfExcel8);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_InsDelColRow_15_BIFF8;
// insert row after formula cell
begin
TestWriteRead_InsDelColRow(15, sfExcel8);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_InsDelColRow_16_BIFF8;
// delete column before formula cell
begin
TestWriteRead_InsDelColRow(16, sfExcel8);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_InsDelColRow_17_BIFF8;
// delete column after formula cell
begin
TestWriteRead_InsDelColRow(17, sfExcel8);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_InsDelColRow_18_BIFF8;
// delete column containing a cell used in formula
begin
TestWriteRead_InsDelColRow(18, sfExcel8);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_InsDelColRow_19_BIFF8;
// delete row before formula cell
begin
TestWriteRead_InsDelColRow(19, sfExcel8);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_InsDelColRow_20_BIFF8;
// delete row after formula cell
begin
TestWriteRead_InsDelColRow(20, sfExcel8);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_InsDelColRow_21_BIFF8;
// delete row containing a cell used in formula
begin
TestWriteRead_InsDelColRow(21, sfExcel8);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_InsDelColRow_22_BIFF8;
// no insert/delete, just test merged cell block
begin
TestWriteRead_InsDelColRow(22, sfExcel8);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_InsDelColRow_23_BIFF8;
// insert column before merged block
begin
TestWriteRead_InsDelColRow(23, sfExcel8);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_InsDelColRow_24_BIFF8;
// insert column through merged block
begin
TestWriteRead_InsDelColRow(24, sfExcel8);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_InsDelColRow_25_BIFF8;
// insert column behind merged block
begin
TestWriteRead_InsDelColRow(25, sfExcel8);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_InsDelColRow_26_BIFF8;
// insert row above merged block
begin
TestWriteRead_InsDelColRow(26, sfExcel8);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_InsDelColRow_27_BIFF8;
// insert row through merged block
begin
TestWriteRead_InsDelColRow(27, sfExcel8);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_InsDelColRow_28_BIFF8;
// insert row below merged block
begin
TestWriteRead_InsDelColRow(28, sfExcel8);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_DelColBeforeMerge_BIFF8;
// delete column before merged block
begin
TestWriteRead_InsDelColRow(29, sfExcel8);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_DelColInMerge_BIFF8;
// delete column through merged block
begin
TestWriteRead_InsDelColRow(30, sfExcel8);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_DelColAfterMerge_BIFF8;
// delete column behind merged block
begin
TestWriteRead_InsDelColRow(31, sfExcel8);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_InsDelColRow_32_BIFF8;
// delete row above merged block
begin
TestWriteRead_InsDelColRow(32, sfExcel8);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_InsDelColRow_33_BIFF8;
// delete row through merged block
begin
TestWriteRead_InsDelColRow(33, sfExcel8);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_InsDelColRow_34_BIFF8;
// delete row below merged block
begin
TestWriteRead_InsDelColRow(34, sfExcel8);
end;
{ -----------------------------------------------------------------------------}
{ OOXML Tests }
{ -----------------------------------------------------------------------------}
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_InsDelColRow_0_OOXML;
// insert a column before the first one
begin
TestWriteRead_InsDelColRow(0, sfOOXML);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_InsDelColRow_1_OOXML;
// insert a column before column 2
begin
TestWriteRead_InsDelColRow(1, sfOOXML);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_InsDelColRow_2_OOXML;
// insert a column before the last one
begin
TestWriteRead_InsDelColRow(2, sfOOXML);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_InsDelColRow_3_OOXML;
// delete column 0
begin
TestWriteRead_InsDelColRow(3, sfOOXML);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_InsDelColRow_4_OOXML;
// delete column 2
begin
TestWriteRead_InsDelColRow(4, sfOOXML);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_InsDelColRow_5_OOXML;
// delete last column
begin
TestWriteRead_InsDelColRow(5, sfOOXML);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_InsDelColRow_6_OOXML;
// insert row before first one
begin
TestWriteRead_InsDelColRow(6, sfOOXML);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_InsDelColRow_7_OOXML;
// insert row before #2
begin
TestWriteRead_InsDelColRow(7, sfOOXML);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_InsDelColRow_8_OOXML;
// insert row before last one
begin
TestWriteRead_InsDelColRow(8, sfOOXML);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_InsDelColRow_9_OOXML;
// delete first row
begin
TestWriteRead_InsDelColRow(9, sfOOXML);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_InsDelColRow_10_OOXML;
// delete row #2
begin
TestWriteRead_InsDelColRow(10, sfOOXML);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_InsDelColRow_11_OOXML;
// delete last row
begin
TestWriteRead_InsDelColRow(11, sfOOXML);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_InsDelColRow_12_OOXML;
// insert column before formula cell
begin
TestWriteRead_InsDelColRow(12, sfOOXML);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_InsDelColRow_13_OOXML;
// insert column after formula cell
begin
TestWriteRead_InsDelColRow(13, sfOOXML);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_InsDelColRow_14_OOXML;
// insert row before formula cell
begin
TestWriteRead_InsDelColRow(14, sfOOXML);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_InsDelColRow_15_OOXML;
// insert row after formula cell
begin
TestWriteRead_InsDelColRow(15, sfOOXML);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_InsDelColRow_16_OOXML;
// delete column before formula cell
begin
TestWriteRead_InsDelColRow(16, sfOOXML);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_InsDelColRow_17_OOXML;
// delete column after formula cell
begin
TestWriteRead_InsDelColRow(17, sfOOXML);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_InsDelColRow_18_OOXML;
// delete column containing a cell used in formula
begin
TestWriteRead_InsDelColRow(18, sfOOXML);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_InsDelColRow_19_OOXML;
// delete row before formula cell
begin
TestWriteRead_InsDelColRow(19, sfOOXML);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_InsDelColRow_20_OOXML;
// delete row after formula cell
begin
TestWriteRead_InsDelColRow(20, sfOOXML);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_InsDelColRow_21_OOXML;
// delete row containing a cell used in formula
begin
TestWriteRead_InsDelColRow(21, sfOOXML);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_InsDelColRow_22_OOXML;
// no insert/delete, just test merged cell block
begin
TestWriteRead_InsDelColRow(22, sfOOXML);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_InsDelColRow_23_OOXML;
// insert column before merged block
begin
TestWriteRead_InsDelColRow(23, sfOOXML);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_InsDelColRow_24_OOXML;
// insert column through merged block
begin
TestWriteRead_InsDelColRow(24, sfOOXML);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_InsDelColRow_25_OOXML;
// insert column behind merged block
begin
TestWriteRead_InsDelColRow(25, sfOOXML);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_InsDelColRow_26_OOXML;
// insert row above merged block
begin
TestWriteRead_InsDelColRow(26, sfOOXML);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_InsDelColRow_27_OOXML;
// insert row through merged block
begin
TestWriteRead_InsDelColRow(27, sfOOXML);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_InsDelColRow_28_OOXML;
// insert row below merged block
begin
TestWriteRead_InsDelColRow(28, sfOOXML);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_DelColBeforeMerge_OOXML;
// delete column before merged block
begin
TestWriteRead_InsDelColRow(29, sfOOXML);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_DelColInMerge_OOXML;
// delete column through merged block
begin
TestWriteRead_InsDelColRow(30, sfOOXML);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_DelColAfterMerge_OOXML;
// delete column behind merged block
begin
TestWriteRead_InsDelColRow(31, sfOOXML);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_InsDelColRow_32_OOXML;
// delete row above merged block
begin
TestWriteRead_InsDelColRow(32, sfOOXML);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_InsDelColRow_33_OOXML;
// delete row through merged block
begin
TestWriteRead_InsDelColRow(33, sfOOXML);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_InsDelColRow_34_OOXML;
// delete row below merged block
begin
TestWriteRead_InsDelColRow(34, sfOOXML);
end;
{ -----------------------------------------------------------------------------}
{ OpenDocument Tests }
{ -----------------------------------------------------------------------------}
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_InsDelColRow_0_ODS;
// insert a column before the first one
begin
TestWriteRead_InsDelColRow(0, sfOpenDocument);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_InsDelColRow_1_ODS;
// insert a column before column 2
begin
TestWriteRead_InsDelColRow(1, sfOpenDocument);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_InsDelColRow_2_ODS;
// insert a column before the last one
begin
TestWriteRead_InsDelColRow(2, sfOpenDocument);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_InsDelColRow_3_ODS;
// delete column 0
begin
TestWriteRead_InsDelColRow(3, sfOpenDocument);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_InsDelColRow_4_ODS;
// delete column 2
begin
TestWriteRead_InsDelColRow(4, sfOpenDocument);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_InsDelColRow_5_ODS;
// delete last column
begin
TestWriteRead_InsDelColRow(5, sfOpenDocument);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_InsDelColRow_6_ODS;
// insert row before first one
begin
TestWriteRead_InsDelColRow(6, sfOpenDocument);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_InsDelColRow_7_ODS;
// insert row before #2
begin
TestWriteRead_InsDelColRow(7, sfOpenDocument);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_InsDelColRow_8_ODS;
// insert row before last one
begin
TestWriteRead_InsDelColRow(8, sfOpenDocument);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_InsDelColRow_9_ODS;
// delete first row
begin
TestWriteRead_InsDelColRow(9, sfOpenDocument);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_InsDelColRow_10_ODS;
// delete row #2
begin
TestWriteRead_InsDelColRow(10, sfOpenDocument);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_InsDelColRow_11_ODS;
// delete last row
begin
TestWriteRead_InsDelColRow(11, sfOpenDocument);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_InsDelColRow_12_ODS;
// insert column before formula cell
begin
TestWriteRead_InsDelColRow(12, sfOpenDocument);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_InsDelColRow_13_ODS;
// insert column after formula cell
begin
TestWriteRead_InsDelColRow(13, sfOpenDocument);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_InsDelColRow_14_ODS;
// insert row before formula cell
begin
TestWriteRead_InsDelColRow(14, sfOpenDocument);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_InsDelColRow_15_ODS;
// insert row after formula cell
begin
TestWriteRead_InsDelColRow(15, sfOpenDocument);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_InsDelColRow_16_ODS;
// delete column before formula cell
begin
TestWriteRead_InsDelColRow(16, sfOpenDocument);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_InsDelColRow_17_ODS;
// delete column after formula cell
begin
TestWriteRead_InsDelColRow(17, sfOpenDocument);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_InsDelColRow_18_ODS;
// delete column containing a cell used in formula
begin
TestWriteRead_InsDelColRow(18, sfOpenDocument);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_InsDelColRow_19_ODS;
// delete row before formula cell
begin
TestWriteRead_InsDelColRow(19, sfOpenDocument);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_InsDelColRow_20_ODS;
// delete row after formula cell
begin
TestWriteRead_InsDelColRow(20, sfOpenDocument);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_InsDelColRow_21_ODS;
// delete row containing a cell used in formula
begin
TestWriteRead_InsDelColRow(21, sfOpenDocument);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_InsDelColRow_22_ODS;
// no insert/delete, just test merged cell block
begin
TestWriteRead_InsDelColRow(22, sfOpenDocument);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_InsDelColRow_23_ODS;
// insert column before merged block
begin
TestWriteRead_InsDelColRow(23, sfOpenDocument);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_InsDelColRow_24_ODS;
// insert column through merged block
begin
TestWriteRead_InsDelColRow(24, sfOpenDocument);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_InsDelColRow_25_ODS;
// insert column behind merged block
begin
TestWriteRead_InsDelColRow(25, sfOpenDocument);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_InsDelColRow_26_ODS;
// insert row above merged block
begin
TestWriteRead_InsDelColRow(26, sfOpenDocument);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_InsDelColRow_27_ODS;
// insert row through merged block
begin
TestWriteRead_InsDelColRow(27, sfOpenDocument);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_InsDelColRow_28_ODS;
// insert row below merged block
begin
TestWriteRead_InsDelColRow(28, sfOpenDocument);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_DelColBeforeMerge_ODS;
// delete column before merged block
begin
TestWriteRead_InsDelColRow(29, sfOpenDocument);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_DelColInMerge_ODS;
begin
TestWriteRead_InsDelColRow(30, sfOpenDocument);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_DelColAfterMerge_ODS;
// delete column behind merged block
begin
TestWriteRead_InsDelColRow(31, sfOpenDocument);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_InsDelColRow_32_ODS;
// delete row above merged block
begin
TestWriteRead_InsDelColRow(32, sfOpenDocument);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_InsDelColRow_33_ODS;
// delete row through merged block
begin
TestWriteRead_InsDelColRow(33, sfOpenDocument);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_InsDelColRow_34_ODS;
// delete row below merged block
begin
TestWriteRead_InsDelColRow(34, sfOpenDocument);
end;
{------------------------------------------------------------------------------}
{ Insert/Delete columns/rows in same sheet of formula }
{------------------------------------------------------------------------------}
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_InsDelColRow_FormulaSameSheet(
ATestIndex: Integer);
var
workbook: TsWorkbook;
worksheet: TsWorksheet;
expected: Double;
actual: Double;
expectedformula: String;
actualFormula: String;
begin
workbook := TsWorkbook.Create;
try
workbook.Options := workbook.Options + [boAutoCalc];
worksheet := workbook.AddWorksheet('Sheet 1');
case ATestIndex of
0: begin // Insert a column in same sheet within range of formula
worksheet.WriteNumber(0, 0, 1.0);
worksheet.WriteNumber(0, 1, 2.0);
worksheet.WriteNumber(0, 2, 4.0);
worksheet.WriteFormula(0, 3, 'SUM(A1:C1)'); // formula in D1
expected := worksheet.ReadAsNumber(0, 3);
worksheet.InsertCol(1); // Insert a col into formula range --> formula moves to E1 and becomes SUM(A1:D1)
actual := worksheet.ReadAsNumber(0, 4);
CheckEquals(expected, actual, 'Test 0: Wrong formula result after inserting column into formula''s cell range.');
expectedformula := 'SUM(A1:D1)';
actualFormula := worksheet.ReadFormula(0, 4);
CheckEquals(expectedformula, actualFormula,
'Test 0: Wrong formula after inserting column into formula''s cell range.');
end;
1: begin // Delete a column from same sheet within range of formula
worksheet.WriteNumber(0, 0, 1.0);
worksheet.WriteNumber(0, 1, 2.0); // <--- to be delete --> result will be 1+5=5
worksheet.WriteNumber(0, 2, 4.0);
worksheet.WriteFormula(0, 3, 'SUM(A1:C1)'); // formula in D1
expected := 1.0 + 4.0;
worksheet.DeleteCol(1); // Delete a col from formula range --> formula moves to C1 and becomes SUM(A1:B1)
actual := worksheet.ReadAsNumber(0, 2);
CheckEquals(expected, actual, 'Test 1: Wrong formula result after deleting column from formula'' cell range');
expectedformula := 'SUM(A1:B1)';
actualFormula := worksheet.ReadFormula(0, 2);
CheckEquals(expectedformula, actualFormula,
'Test 1: Wrong formula after deleting column from formula''s cell range.');
end;
2: begin // Insert a row into same sheet within range of formula
worksheet.WriteNumber(0, 0, 1.0);
worksheet.WriteNumber(1, 0, 2.0);
worksheet.WriteNumber(2, 0, 4.0);
worksheet.WriteFormula(3, 0, 'SUM(A1:A3)'); // formula in A4
expected := worksheet.ReadAsNumber(3, 0);
worksheet.InsertRow(1); // Insert a row into formula's range --> formula moves to A5 and becomes SUM(A1:A4)
actual := worksheet.ReadAsNumber(4, 0);
CheckEquals(expected, actual, 'Test 2: Wrong formula result after inserting row into formula''s cell range');
expectedFormula := 'SUM(A1:A4)';
actualFormula := worksheet.ReadFormula(4, 0);
CheckEquals(expectedformula, actualFormula,
'Test 2: Wrong formula after inserting row into formula''s cell range.');
end;
3: begin // Delete a row from same sheet within range of formula
worksheet.WriteNumber(0, 0, 1.0);
worksheet.WriteNumber(1, 0, 2.0); // delet this row --> result will be 1+4
worksheet.WriteNumber(2, 0, 4.0);
worksheet.WriteFormula(3, 0, 'SUM(A1:A3)'); // formula in A4
expected := 1.0 + 4.0;
worksheet.DeleteRow(1); // Delete a row from formula's range --> formulamoves to A3 and becomes SUM(A1:A2)
actual := worksheet.ReadAsNumber(2, 0);
CheckEquals(expected, actual, 'Test 3: Deleting row from other sheet affects formula');
expectedformula := 'SUM(A1:A2)';
actualformula := worksheet.ReadFormula(2, 0);
CheckEquals(expectedformula, actualFormula,
'Test 3: Wrong formula after deleting row from formula''s cell range.');
end;
end;
finally
workbook.Free;
end;
end;
{------------------------------------------------------------------------------}
{ Insert/Delete columns/rows in other sheet of formula }
{------------------------------------------------------------------------------}
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_InsDelColRow_FormulaOtherSheet(
ATestIndex: Integer);
var
workbook: TsWorkbook;
worksheet1: TsWorksheet;
worksheet2: TsWorksheet;
worksheet3: TsWorksheet;
expected: Double;
actual: Double;
begin
workbook := TsWorkbook.Create;
try
workbook.Options := workbook.Options + [boAutoCalc];
worksheet1 := workbook.AddWorksheet('Sheet1');
worksheet2 := workbook.AddWorksheet('Sheet2');
worksheet3 := workbook.AddWorksheet('Sheet3');
case ATestIndex of
// 2D formulas
0: begin // Insert a column in unaffected sheet. Formula must be unchanged.
worksheet1.WriteNumber(0, 0, 1.0);
worksheet1.WriteNumber(0, 1, 2.0);
worksheet1.WriteNumber(0, 2, 4.0);
worksheet1.WriteFormula(0, 3, 'SUM(A1:C1)');
expected := worksheet1.ReadAsNumber(0, 3);
worksheet2.InsertCol(1);
actual := worksheet1.ReadAsNumber(0, 3);
CheckEquals(expected, actual, 'Test 0: Inserting column in other sheet affects formula');
end;
1: begin // Delete a column from unaffected sheet. Formula must be unchanged.
worksheet1.WriteNumber(0, 0, 1.0);
worksheet1.WriteNumber(0, 1, 2.0);
worksheet1.WriteNumber(0, 2, 4.0);
worksheet1.WriteFormula(0, 3, 'SUM(A1:C1)');
expected := worksheet1.ReadAsNumber(0, 3);
worksheet2.DeleteCol(1);
actual := worksheet1.ReadAsNumber(0, 3);
CheckEquals(expected, actual, 'Test 1: Deleting column from other sheet affects formula');
end;
2: begin // Insert a row in unaffected sheet. Formula must be unchanged.
worksheet1.WriteNumber(0, 0, 1.0);
worksheet1.WriteNumber(1, 0, 2.0);
worksheet1.WriteNumber(2, 0, 4.0);
worksheet1.WriteFormula(3, 0, 'SUM(A1:A3)');
expected := worksheet1.ReadAsNumber(3, 0);
worksheet2.InsertRow(1);
actual := worksheet1.ReadAsNumber(3, 0);
CheckEquals(expected, actual, 'Test 2: Inserting row in other sheet affects formula');
end;
3: begin // Delete a row from unaffected sheet. Formula must be unchanged.
worksheet1.WriteNumber(0, 0, 1.0);
worksheet1.WriteNumber(1, 0, 2.0);
worksheet1.WriteNumber(2, 0, 4.0);
worksheet1.WriteFormula(3, 0, 'SUM(A1:A3)');
expected := worksheet1.ReadAsNumber(3, 0);
worksheet2.DeleteRow(1);
actual := worksheet1.ReadAsNumber(3, 0);
CheckEquals(expected, actual, 'Test 3: Deleting row from other sheet affects formula');
end;
// 3D formulas
4: begin // Insert a column in unaffected sheet. 3D-Formula must be unchanged.
worksheet1.WriteNumber(0, 0, 1.0);
worksheet1.WriteNumber(0, 1, 2.0);
worksheet1.WriteNumber(0, 2, 4.0);
worksheet2.WriteNumber(0, 0, 10.0);
worksheet2.WriteNumber(0, 1, 20.0);
worksheet2.WriteNumber(0, 2, 40.0);
worksheet1.WriteFormula(0, 3, 'SUM(Sheet1:Sheet2!A1:C1)');
expected := 1 + 2 + 4 + 10 + 20 + 40;
actual := worksheet1.ReadAsNumber(0, 3);
CheckEquals(expected, actual, 'Test 4: Wrong formula result');
worksheet3.InsertCol(1);
actual := worksheet1.ReadAsNumber(0, 3);
CheckEquals(expected, actual, 'Test 4: Inserting column in sheet outside 3D range affects formula');
end;
5: begin // Delete a column in unaffected sheet. 3D-Formula must be unchanged.
worksheet1.WriteNumber(0, 0, 1.0);
worksheet1.WriteNumber(0, 1, 2.0);
worksheet1.WriteNumber(0, 2, 4.0);
worksheet2.WriteNumber(0, 0, 10.0);
worksheet2.WriteNumber(0, 1, 20.0);
worksheet2.WriteNumber(0, 2, 40.0);
worksheet1.WriteFormula(0, 3, 'SUM(Sheet1:Sheet2!A1:C1)');
expected := 1 + 2 + 4 + 10 + 20 + 40;
actual := worksheet1.ReadAsNumber(0, 3);
CheckEquals(expected, actual, 'Test 5: Wrong formula result');
worksheet3.DeleteCol(1);
actual := worksheet1.ReadAsNumber(0, 3);
CheckEquals(expected, actual, 'Test 5: Deleting column from sheet outside 3D range affects formula');
end;
6: begin // Insert a row in unaffected sheet. 3D-Formula must be unchanged.
worksheet1.WriteNumber(0, 0, 1.0);
worksheet1.WriteNumber(1, 0, 2.0);
worksheet1.WriteNumber(2, 0, 4.0);
worksheet2.WriteNumber(0, 0, 10.0);
worksheet2.WriteNumber(1, 0, 20.0);
worksheet2.WriteNumber(2, 0, 40.0);
worksheet1.WriteFormula(3, 0, 'SUM(Sheet1:Sheet2!A1:A3)');
expected := 1 + 2 + 4 + 10 + 20 + 40;
actual := worksheet1.ReadAsNumber(3, 0);
CheckEquals(expected, actual, 'Test 6: Wrong formula result');
worksheet3.InsertRow(1);
actual := worksheet1.ReadAsNumber(3, 0);
CheckEquals(expected, actual, 'Test 6: Inserting row in sheet outside 3D range affects formula');
end;
7: begin // Delete a row from unaffected sheet. 3D-Formula must be unchanged.
worksheet1.WriteNumber(0, 0, 1.0);
worksheet1.WriteNumber(1, 0, 2.0);
worksheet1.WriteNumber(2, 0, 4.0);
worksheet2.WriteNumber(0, 0, 10.0);
worksheet2.WriteNumber(1, 0, 20.0);
worksheet2.WriteNumber(2, 0, 40.0);
worksheet1.WriteFormula(3, 0, 'SUM(Sheet1:Sheet2!A1:A3)');
expected := 1 + 2 + 4 + 10 + 20 + 40;
actual := worksheet1.ReadAsNumber(3, 0);
CheckEquals(expected, actual, 'Test 7: Wrong formula result');
worksheet3.DeleteRow(1);
actual := worksheet1.ReadAsNumber(3, 0);
CheckEquals(expected, actual, 'Test 7: Inserting row in sheet outside 3D range affects formula');
end;
(*
8: begin
// Insert a column in unaffected sheet, but within 3d range of 3d formula.
// In Excel, the 3D formula is unchanged, but the location of the
// formula changes.
worksheet1.WriteNumber(0, 0, 1.0);
worksheet1.WriteNumber(0, 1, 2.0);
worksheet1.WriteNumber(0, 2, 4.0); // <-- insert column before this one.
worksheet2.WriteNumber(0, 0, 10.0);
worksheet2.WriteNumber(0, 1, 20.0);
worksheet2.WriteNumber(0, 2, 40.0);
worksheet1.WriteFormula(0, 3, 'SUM(Sheet1:Sheet2!A1:C1)'); // formula in C1
worksheet1.InsertCol(1);
expectedformula := 'SUM(Sheet1:Sheet2!A1:C1)'; // unchanged
actualformula := worksheet1.ReadFormula(0, 4); // the formula is in E1 now
CheckEquals(expectedformula, actualformula, 'Test 8: Wrong formula for case "Insert column in sheet with formula in 3D block');
expected := 1 + 2 + 10 + 20 + 40; // the "4" is moved out of the formula range
actual := worksheet1.ReadAsNumber(0, 4);
CheckEquals(expected, actual, 'Test 8: Wrong formula for case "Insert column in sheet with formula in 3D block');
end;
*)
end;
finally
workbook.Free;
end;
end;
{------------------------------------------------------------------------------}
{ Hide/show columns/rows }
{------------------------------------------------------------------------------}
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_HideShowColRow(
IsCol, IsHide, IsDefaultColRow: Boolean; AFormat: TsSpreadsheetFormat);
const
HIDDEN_COL = 2;
HIDDEN_ROW = 1;
var
workbook: TsWorkbook;
worksheet: TsWorksheet;
TempFile: String;
col: PCol;
row: PRow;
begin
TempFile := GetTempFileName;
workbook := TsWorkbook.Create;
try
workSheet:= workBook.AddWorksheet(HideShowSheet);
worksheet.WriteNumber(0, 0, 1.0);
worksheet.WriteNumber(1, 0, 2.0);
worksheet.WriteNumber(2, 0, 2.0);
worksheet.WriteNumber(3, 0, 3.0);
worksheet.WriteNumber(0, 1, 11.0);
worksheet.WriteNumber(1, 1, 12.0);
worksheet.WriteNumber(2, 1, 12.0);
worksheet.WriteNumber(3, 1, 13.0);
worksheet.WriteNumber(0, 2, 21.0);
worksheet.WriteNumber(1, 2, 22.0);
worksheet.WriteNumber(2, 2, 22.0);
worksheet.WriteNumber(3, 2, 23.0);
worksheet.WriteNumber(0, 3, 31.0);
worksheet.WriteNumber(1, 3, 32.0);
worksheet.WriteNumber(2, 3, 32.0);
worksheet.WriteNumber(3, 3, 33.0);
if IsCol then begin
if not IsDefaultColRow then
worksheet.WriteColWidth(HIDDEN_COL, 10, suCentimeters);
worksheet.HideCol(HIDDEN_COL);
CheckEquals(true, worksheet.ColHidden(HIDDEN_COL),
'Unsaved hidden state mismatch, col '+IntToStr(HIDDEN_COL));
if not IsHide then begin
worksheet.ShowCol(HIDDEN_COL);
CheckEquals(false, worksheet.ColHidden(HIDDEN_COL),
'Unsaved re-show state mismatch, col '+IntToStr(HIDDEN_COL));
end;
end else begin
if not IsDefaultColRow then
worksheet.WriteRowHeight(HIDDEN_ROW, 1, suCentimeters);
worksheet.HideRow(HIDDEN_ROW);
CheckEquals(true, worksheet.RowHidden(HIDDEN_ROW),
'Unsaved hidden state mismatch, row '+IntToStr(HIDDEN_ROW));
if not IsHide then begin
worksheet.ShowRow(HIDDEN_ROW);
CheckEquals(false, worksheet.RowHidden(HIDDEN_ROW),
'Unsaved re-show state mismatch, row ' + IntToStr(HIDDEN_ROW));
end;
end;
workBook.WriteToFile(TempFile, AFormat, true);
finally
workbook.Free;
end;
workbook := TsWorkbook.Create;
try
workbook.ReadFromFile(TempFile, AFormat);
worksheet := workbook.GetFirstWorksheet;
if IsCol then begin
if isHide then begin
col := worksheet.FindCol(HIDDEN_COL);
CheckTRUE(col <> nil, 'Saved column record not found');
CheckTRUE(worksheet.ColHidden(HIDDEN_COL),
'Saved hidden state mismatch, col ' + IntToStr(HIDDEN_COL))
end else begin
CheckFALSE(worksheet.ColHidden(HIDDEN_COL),
'Saved non-hidden state mismatch, col ' + IntToStr(HIDDEN_COL));
worksheet.HideCol(HIDDEN_COL);
CheckTRUE(worksheet.ColHidden(HIDDEN_COL),
'Save hidden state mismatch, col ' + IntToStr(HIDDEN_COL));
end
end else begin
if isHide then begin
row := worksheet.FindRow(HIDDEN_ROW);
CheckTRUE(row <> nil, 'Saved row record not found');
CheckTRUE(worksheet.RowHidden(HIDDEN_ROW),
'Saved hidden state mismatch, row ' + IntToStr(HIDDEN_ROW));
end else begin
CheckFALSE(worksheet.RowHidden(HIDDEN_ROW),
'Saved non-hidden state mismatch, row ' + IntToStr(HIDDEN_ROW));
worksheet.HideRow(HIDDEN_ROW);
CheckTRUE(worksheet.RowHidden(HIDDEN_ROW),
'Saved hidden state mismatch, row ' + IntToStr(HIDDEN_ROW));
end;
end;
finally
workbook.Free;
DeleteFile(TempFile);
end;
end;
{ *** Hide/show tests with DEFAULT col width / row height *** }
{ Hide column with default col width }
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_HideColDef_BIFF5;
begin
TestWriteRead_HideShowColRow(true, true, true, sfExcel5);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_HideColDef_BIFF8;
begin
TestWriteRead_HideShowColRow(true, true, true, sfExcel8);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_HideColDef_OOXML;
begin
TestWriteRead_HideShowColRow(true, true, true, sfOOXML);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_HideColDef_XML;
begin
TestWriteRead_HideShowColRow(true, true, true, sfExcelXML);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_HideColDef_ODS;
begin
TestWriteRead_HideShowColRow(true, true, true, sfOpenDocument);
end;
{ Hide row with default row height }
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_HideRowDef_BIFF5;
begin
TestWriteRead_HideShowColRow(false, true, true, sfExcel5);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_HideRowDef_BIFF8;
begin
TestWriteRead_HideShowColRow(false, true, true, sfExcel8);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_HideRowDef_OOXML;
begin
TestWriteRead_HideShowColRow(false, true, true, sfOOXML);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_HideRowDef_XML;
begin
TestWriteRead_HideShowColRow(false, true, true, sfExcelXML);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_HideRowDef_ODS;
begin
TestWriteRead_HideShowColRow(false, true, true, sfOpenDocument);
end;
{ Show column with default col width }
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_ShowColDef_BIFF5;
begin
TestWriteRead_HideShowColRow(true, false, true, sfExcel5);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_ShowColDef_BIFF8;
begin
TestWriteRead_HideShowColRow(true, false, true, sfExcel8);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_ShowColDef_OOXML;
begin
TestWriteRead_HideShowColRow(true, false, true, sfOOXML);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_ShowColDef_XML;
begin
TestWriteRead_HideShowColRow(true, false, true, sfExcelXML);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_ShowColDef_ODS;
begin
TestWriteRead_HideShowColRow(true, false, true, sfOpenDocument);
end;
{ Show row with default row height }
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_ShowRowDef_BIFF5;
begin
TestWriteRead_HideShowColRow(false, false, true, sfExcel5);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_ShowRowDef_BIFF8;
begin
TestWriteRead_HideShowColRow(false, false, true, sfExcel8);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_ShowRowDef_OOXML;
begin
TestWriteRead_HideShowColRow(false, false, true, sfOOXML);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_ShowRowDef_XML;
begin
TestWriteRead_HideShowColRow(false, false, true, sfExcelXML);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_ShowRowDef_ODS;
begin
TestWriteRead_HideShowColRow(false, false, true, sfOpenDocument);
end;
{ *** Hide/show tests with CHANGED col width / row height *** }
{ Hide col with CHANGED col width }
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_HideCol_BIFF5;
begin
TestWriteRead_HideShowColRow(true, true, false, sfExcel5);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_HideCol_BIFF8;
begin
TestWriteRead_HideShowColRow(true, true, false, sfExcel8);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_HideCol_OOXML;
begin
TestWriteRead_HideShowColRow(true, true, false, sfOOXML);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_HideCol_XML;
begin
TestWriteRead_HideShowColRow(true, true, false, sfExcelXML);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_HideCol_ODS;
begin
TestWriteRead_HideShowColRow(true, true, false, sfOpenDocument);
end;
{ Hide row with CHANGED row height }
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_HideRow_BIFF5;
begin
TestWriteRead_HideShowColRow(false, true, false, sfExcel5);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_HideRow_BIFF8;
begin
TestWriteRead_HideShowColRow(false, true, false, sfExcel8);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_HideRow_OOXML;
begin
TestWriteRead_HideShowColRow(false, true, false, sfOOXML);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_HideRow_XML;
begin
TestWriteRead_HideShowColRow(false, true, false, sfExcelXML);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_HideRow_ODS;
begin
TestWriteRead_HideShowColRow(false, true, false, sfOpenDocument);
end;
{ Show col with CHANGED col width }
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_ShowCol_BIFF5;
begin
TestWriteRead_HideShowColRow(true, false, false, sfExcel5);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_ShowCol_BIFF8;
begin
TestWriteRead_HideShowColRow(true, false, false, sfExcel8);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_ShowCol_OOXML;
begin
TestWriteRead_HideShowColRow(true, false, false, sfOOXML);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_ShowCol_XML;
begin
TestWriteRead_HideShowColRow(true, false, false, sfExcelXML);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_ShowCol_ODS;
begin
TestWriteRead_HideShowColRow(true, false, false, sfOpenDocument);
end;
{ Show row with CHANGED row height }
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_ShowRow_BIFF5;
begin
TestWriteRead_HideShowColRow(false, false, false, sfExcel5);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_ShowRow_BIFF8;
begin
TestWriteRead_HideShowColRow(false, false, false, sfExcel8);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_ShowRow_OOXML;
begin
TestWriteRead_HideShowColRow(false, false, false, sfOOXML);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_ShowRow_XML;
begin
TestWriteRead_HideShowColRow(false, false, false, sfExcelXML);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_ShowRow_ODS;
begin
TestWriteRead_HideShowColRow(false, false, false, sfOpenDocument);
end;
{ *** Add/remove page breaks *** }
{ Add page break to column
- Hidden: set the Hidden flag in the options to test whether it is damaged }
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_AddPageBreak_Col(
Hidden: Boolean; AFormat: TsSpreadsheetFormat);
const
COL_INDEX = 5;
var
book: TsWorkbook;
sheet: TsWorksheet;
tempFile: String;
col: PCol;
begin
TempFile := GetTempFileName;
// Create dummy workbook with forced page break and save to temp file
book := TsWorkbook.Create;
try
sheet := book.AddWorksheet('Test');
sheet.WriteNumber(0, 0, 1.0);
sheet.AddPageBreakToCol(COL_INDEX);
if Hidden then
sheet.HideCol(COL_INDEX);
col := sheet.FindCol(COL_INDEX);
CheckEquals(true, col <> nil,
'Col record not found, col ' + IntToStr(COL_INDEX));
CheckEquals(true, croPageBreak in col^.Options,
'Unsaved PageBreak flag mismatch, col ' + IntToStr(COL_INDEX));
if Hidden then
CheckEquals(true, croHidden in col^.Options,
'Unsaved Hidden flag mismatch, col ' + IntToStr(COL_INDEX));
book.WriteToFile(tempFile, AFormat, true);
finally
book.Free;
end;
// Read test file
book := TsWorkbook.Create;
try
book.ReadFromFile(tempFile, AFormat);
sheet := book.GetFirstWorksheet;
col := sheet.FindCol(COL_INDEX);
CheckEquals(true, col <> nil,
'Saved col record not found, col ' + IntToStr(COL_INDEX));
CheckEquals(true, croPageBreak in col^.Options,
'Saved PageBreak flag mismatch, col ' + IntToStr(COL_INDEX));
finally
book.Free;
DeleteFile(TempFile);
end;
end;
{ Add page break to row
- Hidden: set the Hidden flag in the options to test whether it is damaged }
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_AddPageBreak_Row(
Hidden: Boolean; AFormat: TsSpreadsheetFormat);
const
ROW_INDEX = 5;
var
book: TsWorkbook;
sheet: TsWorksheet;
tempFile: String;
row: PRow;
begin
TempFile := GetTempFileName;
// Create dummy workbook with forced page break and save to temp file
book := TsWorkbook.Create;
try
sheet := book.AddWorksheet('Test');
sheet.AddPageBreakToRow(ROW_INDEX);
if Hidden then
sheet.HideRow(ROW_INDEX);
row := sheet.FindRow(ROW_INDEX);
CheckEquals(true, row <> nil,
'Row record not found, row ' + IntToStr(ROW_INDEX));
CheckEquals(true, croPageBreak in row^.Options,
'Unsaved PageBreak flag mismatch, row ' + IntToStr(ROW_INDEX));
if Hidden then
CheckEquals(true, croHidden in row^.Options,
'Unsaved Hidden flag mismatch, row ' + IntToStr(ROW_INDEX));
book.WriteToFile(tempFile, AFormat, true);
finally
book.Free;
end;
// Read test file
book := TsWorkbook.Create;
try
book.ReadFromFile(tempFile, AFormat);
sheet := book.GetFirstWorksheet;
row := sheet.FindRow(ROW_INDEX);
CheckEquals(true, row <> nil,
'Saved row record not found, row ' + IntToStr(ROW_INDEX));
CheckEquals(true, croPageBreak in row^.Options,
'Saved PageBreak flag mismatch, row ' + IntToStr(ROW_INDEX));
finally
book.Free;
DeleteFile(TempFile);
end;
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_AddPageBreak_Col_BIFF2;
begin
TestWriteRead_AddPageBreak_Col(false, sfExcel2);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_AddPageBreak_Row_BIFF2;
begin
TestWriteRead_AddPageBreak_Row(false, sfExcel2);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_AddPageBreak_Col_BIFF5;
begin
TestWriteRead_AddPageBreak_Col(false, sfExcel5);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_AddPageBreak_Row_BIFF5;
begin
TestWriteRead_AddPageBreak_Row(false, sfExcel5);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_AddPageBreak_ColHidden_BIFF5;
begin
TestWriteRead_AddPageBreak_Col(true, sfExcel5);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_AddPageBreak_RowHidden_BIFF5;
begin
TestWriteRead_AddPageBreak_Row(true, sfExcel5);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_AddPageBreak_Col_BIFF8;
begin
TestWriteRead_AddPageBreak_Col(false, sfExcel8);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_AddPageBreak_Row_BIFF8;
begin
TestWriteRead_AddPageBreak_Row(false, sfExcel8);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_AddPageBreak_ColHidden_BIFF8;
begin
TestWriteRead_AddPageBreak_Col(true, sfExcel8);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_AddPageBreak_RowHidden_BIFF8;
begin
TestWriteRead_AddPageBreak_Row(true, sfExcel8);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_AddPageBreak_Col_OOXML;
begin
TestWriteRead_AddPageBreak_Col(false, sfOOXML);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_AddPageBreak_Row_OOXML;
begin
TestWriteRead_AddPageBreak_Row(false, sfOOXML);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_AddPageBreak_ColHidden_OOXML;
begin
TestWriteRead_AddPageBreak_Col(true, sfOOXML);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_AddPageBreak_RowHidden_OOXML;
begin
TestWriteRead_AddPageBreak_Row(true, sfOOXML);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_AddPageBreak_Col_XML;
begin
TestWriteRead_AddPageBreak_Col(false, sfExcelXML);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_AddPageBreak_Row_XML;
begin
TestWriteRead_AddPageBreak_Row(false, sfExcelXML);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_AddPageBreak_ColHidden_XML;
begin
TestWriteRead_AddPageBreak_Col(true, sfExcelXML);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_AddPageBreak_RowHidden_XML;
begin
TestWriteRead_AddPageBreak_Row(true, sfExcelXML);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_AddPageBreak_Col_ODS;
begin
TestWriteRead_AddPageBreak_Col(false, sfOpenDocument);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_AddPageBreak_Row_ODS;
begin
TestWriteRead_AddPageBreak_Row(false, sfOpenDocument);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_AddPageBreak_ColHidden_ODS;
begin
TestWriteRead_AddPageBreak_Col(true, sfOpenDocument);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_AddPageBreak_RowHidden_ODS;
begin
TestWriteRead_AddPageBreak_Row(true, sfOpenDocument);
end;
{ Remove page break
- Hidden: set the Hidden flag in the options to test whether it is damaged
In the test, the entire row/col record is removed when Hidden is false. }
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_RemovePageBreak_Col(
Hidden: Boolean; AFormat: TsSpreadsheetFormat);
const
COL_INDEX = 5;
var
book: TsWorkbook;
sheet: TsWorksheet;
tempFile: String;
col: PCol;
begin
TempFile := GetTempFileName;
// Create dummy workbook with forced page break and save to temp file
book := TsWorkbook.Create;
try
sheet := book.AddWorksheet('Test');
sheet.AddPageBreakToCol(COL_INDEX);
if Hidden then
sheet.HideCol(COL_INDEX);
col := sheet.FindCol(COL_INDEX);
CheckEquals(true, col <> nil,
'Col record not found, col ' + IntToStr(COL_INDEX));
CheckEquals(true, croPageBreak in col^.Options,
'Unsaved PageBreak flag mismatch, col ' + IntToStr(COL_INDEX));
if Hidden then
CheckEquals(true, croHidden in col^.Options,
'Unsaved Hidden flag mismatch, col ' + IntToStr(COL_INDEX));
sheet.RemovePageBreakFromCol(COL_INDEX);
col := sheet.FindCol(COL_INDEX);
if Hidden then begin
CheckEquals(true, col <> nil,
'Col record not found, col ' + IntToStr(COL_INDEX));
CheckEquals(false, croPageBreak in col^.Options,
'Unsaved PageBreak flag mismatch, col ' + IntToStr(COL_INDEX));
CheckEquals(true, croHidden in col^.Options,
'Unsaved Hidden flag mismatch, col ' + IntToStr(COL_INDEX));
end else begin
CheckEquals(true, col = nil,
'Unsaved col record still found, col ' + IntToStr(COL_INDEX));
end;
book.WriteToFile(tempFile, AFormat, true);
finally
book.Free;
end;
// Read test file
book := TsWorkbook.Create;
try
book.ReadFromFile(tempFile, AFormat);
sheet := book.GetFirstWorksheet;
col := sheet.FindCol(COL_INDEX);
if Hidden then begin
CheckEquals(true, col <> nil,
'Col record not found, col ' + IntToStr(COL_INDEX));
CheckEquals(false, croPageBreak in col^.Options,
'Saved PageBreak flag mismatch, col ' + IntToStr(COL_INDEX));
CheckEquals(true, croHidden in col^.Options,
'Saved Hidden flag mismatch, col ' + IntToStr(COL_INDEX));
end else begin
CheckEquals(true, col = nil,
'Saved col record still found, col ' + IntToStr(COL_INDEX));
end;
finally
book.Free;
DeleteFile(tempFile);
end;
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_RemovePageBreak_Row(
Hidden: Boolean; AFormat: TsSpreadsheetFormat);
const
ROW_INDEX = 5;
var
book: TsWorkbook;
sheet: TsWorksheet;
tempFile: String;
row: PRow;
begin
TempFile := GetTempFileName;
// Create dummy workbook with forced page break and save to temp file
book := TsWorkbook.Create;
try
sheet := book.AddWorksheet('Test');
sheet.AddPageBreakToRow(ROW_INDEX);
if Hidden then
sheet.HideRow(ROW_INDEX);
row := sheet.FindRow(ROW_INDEX);
CheckEquals(true, row <> nil,
'Row record not found, row ' + IntToStr(ROW_INDEX));
CheckEquals(true, croPageBreak in row^.Options,
'Unsaved PageBreak flag mismatch, row ' + IntToStr(ROW_INDEX));
if Hidden then
CheckEquals(true, croHidden in row^.Options,
'Unsaved Hidden flag mismatch, row ' + IntToStr(ROW_INDEX));
sheet.RemovePageBreakFromRow(ROW_INDEX);
row := sheet.FindRow(ROW_INDEX);
if Hidden then begin
CheckEquals(true, row <> nil,
'Row record not found, row ' + IntToStr(ROW_INDEX));
CheckEquals(false, croPageBreak in row^.Options,
'Unsaved PageBreak flag mismatch, row ' + IntToStr(ROW_INDEX));
CheckEquals(true, croHidden in row^.Options,
'Unsaved Hidden flag mismatch, row ' + IntToStr(ROW_INDEX));
end else begin
CheckEquals(true, row = nil,
'Unsaved row record still found, row ' + IntToStr(ROW_INDEX));
end;
book.WriteToFile(tempFile, AFormat, true);
finally
book.Free;
end;
// Read test file
book := TsWorkbook.Create;
try
book.ReadFromFile(tempFile, AFormat);
sheet := book.GetFirstWorksheet;
row := sheet.FindRow(ROW_INDEX);
if Hidden then begin
CheckEquals(true, row <> nil,
'Row record not found, col ' + IntToStr(ROW_INDEX));
CheckEquals(false, croPageBreak in row^.Options,
'Saved PageBreak flag mismatch, row ' + IntToStr(ROW_INDEX));
CheckEquals(true, croHidden in row^.Options,
'Saved Hidden flag mismatch, row ' + IntToStr(ROW_INDEX));
end else begin
CheckEquals(true, row = nil,
'Saved row record still found, row ' + IntToStr(ROW_INDEX));
end;
finally
book.Free;
DeleteFile(tempFile);
end;
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_RemovePageBreak_Col_BIFF2;
begin
TestWriteRead_RemovePageBreak_Col(false, sfExcel2);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_RemovePageBreak_Row_BIFF2;
begin
TestWriteRead_RemovePageBreak_Row(false, sfExcel2);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_RemovePageBreak_Col_BIFF5;
begin
TestWriteRead_RemovePageBreak_Col(false, sfExcel5);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_RemovePageBreak_Row_BIFF5;
begin
TestWriteRead_RemovePageBreak_Row(false, sfExcel5);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_RemovePageBreak_ColHidden_BIFF5;
begin
TestWriteRead_RemovePageBreak_Col(true, sfExcel5);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_RemovePageBreak_RowHidden_BIFF5;
begin
TestWriteRead_RemovePageBreak_Row(true, sfExcel5);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_RemovePageBreak_Col_BIFF8;
begin
TestWriteRead_RemovePageBreak_Col(false, sfExcel8);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_RemovePageBreak_Row_BIFF8;
begin
TestWriteRead_RemovePageBreak_Row(false, sfExcel8);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_RemovePageBreak_ColHidden_BIFF8;
begin
TestWriteRead_RemovePageBreak_Col(true, sfExcel8);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_RemovePageBreak_RowHidden_BIFF8;
begin
TestWriteRead_RemovePageBreak_Row(true, sfExcel8);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_RemovePageBreak_Col_OOXML;
begin
TestWriteRead_RemovePageBreak_Col(false, sfOOXML);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_RemovePageBreak_Row_OOXML;
begin
TestWriteRead_RemovePageBreak_Row(false, sfOOXML);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_RemovePageBreak_ColHidden_OOXML;
begin
TestWriteRead_RemovePageBreak_Col(true, sfOOXML);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_RemovePageBreak_RowHidden_OOXML;
begin
TestWriteRead_RemovePageBreak_Row(true, sfOOXML);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_RemovePageBreak_Col_XML;
begin
TestWriteRead_RemovePageBreak_Col(false, sfExcelXML);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_RemovePageBreak_Row_XML;
begin
TestWriteRead_RemovePageBreak_Row(false, sfExcelXML);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_RemovePageBreak_ColHidden_XML;
begin
TestWriteRead_RemovePageBreak_Col(true, sfExcelXML);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_RemovePageBreak_RowHidden_XML;
begin
TestWriteRead_RemovePageBreak_Row(true, sfExcelXML);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_RemovePageBreak_Col_ODS;
begin
TestWriteRead_RemovePageBreak_Col(false, sfOpenDocument);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_RemovePageBreak_Row_ODS;
begin
TestWriteRead_RemovePageBreak_Row(false, sfOpenDocument);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_RemovePageBreak_ColHidden_ODS;
begin
TestWriteRead_RemovePageBreak_Col(true, sfOpenDocument);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_RemovePageBreak_RowHidden_ODS;
begin
TestWriteRead_RemovePageBreak_Row(true, sfOpenDocument);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_InsCol_FormulaSameSheet;
begin
TestWriteRead_InsDelColRow_FormulaSameSheet(0);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_DelCol_FormulaSameSheet;
begin
TestWriteRead_InsDelColRow_FormulaSameSheet(1);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_InsRow_FormulaSameSheet;
begin
TestWriteRead_InsDelColRow_FormulaSameSheet(2);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_DelRow_FormulaSameSheet;
begin
TestWriteRead_InsDelColRow_FormulaSameSheet(3);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_InsCol_FormulaOtherSheet;
begin
TestWriteRead_InsDelColRow_FormulaOtherSheet(0);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_DelCol_FormulaOtherSheet;
begin
TestWriteRead_InsDelColRow_FormulaOtherSheet(1);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_InsRow_FormulaOtherSheet;
begin
TestWriteRead_InsDelColRow_FormulaOtherSheet(2);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_DelRow_FormulaOtherSheet;
begin
TestWriteRead_InsDelColRow_FormulaOtherSheet(3);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_InsCol_FormulaOtherSheet_Outside3D;
begin
TestWriteRead_InsDelColRow_FormulaOtherSheet(4);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_DelCol_FormulaOtherSheet_Outside3D;
begin
TestWriteRead_InsDelColRow_FormulaOtherSheet(5);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_InsRow_FormulaOtherSheet_Outside3D;
begin
TestWriteRead_InsDelColRow_FormulaOtherSheet(6);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_DelRow_FormulaOtherSheet_Outside3D;
begin
TestWriteRead_InsDelColRow_FormulaOtherSheet(7);
end;
(*
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_InsCol_FormulaOtherSheet_Inside3D;
begin
TestWriteRead_InsDelColRow_FormulaOtherSheet(8);
end;
*)
initialization
RegisterTest(TSpreadWriteRead_ColRow_Tests);
InitTestData;
end.