diff --git a/components/fpspreadsheet/tests/datetests.pas b/components/fpspreadsheet/tests/datetests.pas index a5586e8c6..1dbc6e5cd 100644 --- a/components/fpspreadsheet/tests/datetests.pas +++ b/components/fpspreadsheet/tests/datetests.pas @@ -216,6 +216,11 @@ type implementation +var + TestWorksheet: TsWorksheet = nil; + TestWorkbook: TsWorkbook = nil; + TestFileName: String = ''; + const DatesSheet = 'Dates'; //worksheet name @@ -271,6 +276,7 @@ begin SollDates[37]:=EncodeTime(3,45,12,0) + 1 // formatted as nfTimeDuration end; + { TSpreadWriteReadDateTests } procedure TSpreadWriteReadDateTests.SetUp; @@ -349,38 +355,48 @@ begin TestWriteReadDates(sfExcel8); end; + +{ TSpreadReadDateTests } + procedure TSpreadReadDateTests.TestReadDate(FileName: string; Row: integer); var - MyWorksheet: TsWorksheet; - MyWorkbook: TsWorkbook; ActualDateTime: TDateTime; begin if Row>High(SollDates) then fail('Error in test code: array bounds overflow. Check array size is correct.'); - // Open the spreadsheet - MyWorkbook := TsWorkbook.Create; - case UpperCase(ExtractFileExt(FileName)) of - '.XLSX': MyWorkbook.ReadFromFile(FileName, sfOOXML); - '.ODS': MyWorkbook.ReadFromFile(FileName, sfOpenDocument); - // Excel XLS/BIFF - else MyWorkbook.ReadFromFile(FileName, sfExcel8); + // Load the file only if is the file name changes. + if TestFileName <> FileName then begin + if TestWorkbook <> nil then + TestWorkbook.Free; + + // Open the spreadsheet + TestWorkbook := TsWorkbook.Create; + case UpperCase(ExtractFileExt(FileName)) of + '.XLSX': TestWorkbook.ReadFromFile(FileName, sfOOXML); + '.ODS': TestWorkbook.ReadFromFile(FileName, sfOpenDocument); + // Excel XLS/BIFF + else TestWorkbook.ReadFromFile(FileName, sfExcel8); + end; + TestWorksheet := GetWorksheetByName(TestWorkBook, DatesSheet); + if TestWorksheet=nil then + fail('Error in test code. Failed to get named worksheet'); + + TestFileName := FileName; end; - MyWorksheet:=GetWorksheetByName(MyWorkBook,DatesSheet); - if MyWorksheet=nil then - fail('Error in test code. Failed to get named worksheet'); + // We know these are valid time/date/datetime values.... // Just test for empty string; we'll probably end up in a maze of localized date/time stuff // if we don't. - CheckNotEquals(MyWorkSheet.ReadAsUTF8Text(Row, 0), '','Could not read date time as string for cell '+CellNotation(MyWorkSheet,Row)); + CheckNotEquals(TestWorkSheet.ReadAsUTF8Text(Row, 0), '', + 'Could not read date time as string for cell '+CellNotation(TestWorkSheet,Row)); - if not(MyWorkSheet.ReadAsDateTime(Row, 0, ActualDateTime)) then - Fail('Could not read date time for cell '+CellNotation(MyWorkSheet,Row)); - CheckEquals(SollDates[Row],ActualDateTime,'Test date/time value mismatch ' - +'cell '+CellNotation(MyWorksheet,Row)); + if not(TestWorkSheet.ReadAsDateTime(Row, 0, ActualDateTime)) then + Fail('Could not read date time value for cell '+CellNotation(TestWorkSheet,Row)); + CheckEquals(SollDates[Row],ActualDateTime,'Test date/time value mismatch, ' + +'cell '+CellNotation(TestWorksheet,Row)); - // Finalization - MyWorkbook.Free; + // Don't free the workbook here - it will be reused. It is destroyed at finalization. end; procedure TSpreadReadDateTests.SetUp; @@ -1177,6 +1193,10 @@ initialization RegisterTest(TSpreadReadDateTests); RegisterTest(TSpreadWriteReadDateTests); InitSollDates; //useful to have norm data if other code want to use this unit + +finalization + FreeAndNil(TestWorkbook); + end. diff --git a/components/fpspreadsheet/tests/numberstests.pas b/components/fpspreadsheet/tests/numberstests.pas index 2b3062efc..fc8769b25 100644 --- a/components/fpspreadsheet/tests/numberstests.pas +++ b/components/fpspreadsheet/tests/numberstests.pas @@ -103,6 +103,11 @@ type implementation +var + TestWorksheet: TsWorksheet = nil; + TestWorkbook: TsWorkbook = nil; + TestFileName: String = ''; + const TestFileBIFF8='testbiff8.xls'; //with 1904 numbermode number system TestFileBIFF8_1899='testbiff8_1899.xls'; //with 1899/1900 numbermode number system @@ -216,33 +221,41 @@ begin TestWriteReadNumbers(sfExcel8); end; + +{ TSpreadReadNumberTests } + procedure TSpreadReadNumberTests.TestReadNumber(FileName: string; Row: integer); var - MyWorksheet: TsWorksheet; - MyWorkbook: TsWorkbook; ActualNumber: double; begin if Row>High(SollNumbers) then fail('Error in test code: array bounds overflow. Check array size is correct.'); - // Open the spreadsheet - MyWorkbook := TsWorkbook.Create; - case UpperCase(ExtractFileExt(FileName)) of - '.XLSX': MyWorkbook.ReadFromFile(FileName, sfOOXML); - '.ODS': MyWorkbook.ReadFromFile(FileName, sfOpenDocument); - // Excel XLS/BIFF - else MyWorkbook.ReadFromFile(FileName, sfExcel8); + // Load the file only if is the file name changes. + if (FileName <> TestFileName) then begin + if TestWorkbook <> nil then + TestWorkbook.Free; + + // Open the spreadsheet + TestWorkbook := TsWorkbook.Create; + case UpperCase(ExtractFileExt(FileName)) of + '.XLSX': TestWorkbook.ReadFromFile(FileName, sfOOXML); + '.ODS': TestWorkbook.ReadFromFile(FileName, sfOpenDocument); + // Excel XLS/BIFF + else TestWorkbook.ReadFromFile(FileName, sfExcel8); + end; + TestWorksheet:=GetWorksheetByName(TestWorkBook,NumbersSheet); + if TestWorksheet=nil then + fail('Error in test code. Failed to get named worksheet'); + + TestFileName := FileName; end; - MyWorksheet:=GetWorksheetByName(MyWorkBook,NumbersSheet); - if MyWorksheet=nil then - fail('Error in test code. Failed to get named worksheet'); - ActualNumber:=MyWorkSheet.ReadAsNumber(Row, 0); - CheckEquals(SollNumbers[Row], ActualNumber,'Test value mismatch ' - +'cell '+CellNotation(MyWorkSheet,Row)); + ActualNumber := TestWorkSheet.ReadAsNumber(Row, 0); + CheckEquals(SollNumbers[Row], ActualNumber,'Test value mismatch, ' + +'cell '+CellNotation(TestWorkSheet,Row)); - // Finalization - MyWorkbook.Free; + // Don't free the workbook here - it will be reused. It is destroyed at finalization. end; procedure TSpreadReadNumberTests.SetUp; @@ -462,6 +475,10 @@ initialization RegisterTest(TSpreadReadNumberTests); RegisterTest(TSpreadWriteReadNumberTests); InitSollNumbers; //useful to have norm data if other code want to use this unit + +finalization + FreeAndNil(TestWorkbook); + end. diff --git a/components/fpspreadsheet/tests/stringtests.pas b/components/fpspreadsheet/tests/stringtests.pas index b13d2c51c..a47a5e82b 100644 --- a/components/fpspreadsheet/tests/stringtests.pas +++ b/components/fpspreadsheet/tests/stringtests.pas @@ -96,6 +96,11 @@ type implementation +var + TestWorksheet: TsWorksheet = nil; + TestWorkbook: TsWorkbook = nil; + TestFileName: String = ''; + // Initialize array with variables that represent the values // we expect to be in the test spreadsheet files. // @@ -283,33 +288,39 @@ begin DeleteFile(TempFile); end; + +{ TSpreadReadStringTests } + procedure TSpreadReadStringTests.TestReadString(FileName: string; Row: integer); var - MyWorksheet: TsWorksheet; - MyWorkbook: TsWorkbook; ActualString: string; begin if Row>High(SollStrings) then fail('Error in test code: array bounds overflow. Check array size is correct.'); - // Open the spreadsheet - MyWorkbook := TsWorkbook.Create; - case UpperCase(ExtractFileExt(FileName)) of - '.XLSX': MyWorkbook.ReadFromFile(FileName, sfOOXML); - '.ODS': MyWorkbook.ReadFromFile(FileName, sfOpenDocument); - // Excel XLS/BIFF - else MyWorkbook.ReadFromFile(FileName, sfExcel8); + // Load the file only if is the file name changes. + if (FileName <> TestFileName) then begin + if TestWorkbook <> nil then + TestWorkbook.Free; + + // Open the spreadsheet + TestWorkbook := TsWorkbook.Create; + case UpperCase(ExtractFileExt(FileName)) of + '.XLSX': TestWorkbook.ReadFromFile(FileName, sfOOXML); + '.ODS': TestWorkbook.ReadFromFile(FileName, sfOpenDocument); + // Excel XLS/BIFF + else TestWorkbook.ReadFromFile(FileName, sfExcel8); + end; + TestWorksheet := GetWorksheetByName(TestWorkBook, StringsSheet); + if TestWorksheet=nil then + fail('Error in test code: could not retrieve worksheet.'); end; - MyWorksheet:=GetWorksheetByName(MyWorkBook,StringsSheet); - if MyWorksheet=nil then - fail('Error in test code: could not retrieve worksheet.'); - ActualString:=MyWorkSheet.ReadAsUTF8Text(Row,0); - CheckEquals(SollStrings[Row],ActualString,'Test value mismatch ' - +'cell '+CellNotation(MyWorkSheet,Row)); + ActualString := TestWorkSheet.ReadAsUTF8Text(Row,0); + CheckEquals(SollStrings[Row], ActualString, 'Test value mismatch, ' + +'cell '+CellNotation(TestWorkSheet,Row)); - // Finalization - MyWorkbook.Free; + // Don't free the workbook here - it will be reused. It is destroyed at finalization. end; procedure TSpreadReadStringTests.SetUp; @@ -458,4 +469,8 @@ initialization RegisterTest(TSpreadWriteReadStringTests); // Initialize the norm variables in case other units want to use it: InitSollStrings; + +finalization + FreeAndNil(TestWorkbook); + end.