diff --git a/components/fpspreadsheet/tests/internaltests.pas b/components/fpspreadsheet/tests/internaltests.pas index d28c998d6..33994e031 100644 --- a/components/fpspreadsheet/tests/internaltests.pas +++ b/components/fpspreadsheet/tests/internaltests.pas @@ -34,7 +34,7 @@ type // Set up expected values: procedure SetUp; override; procedure TearDown; override; - procedure TestVirtualMode(AFormat: TsSpreadsheetFormat); + procedure TestVirtualMode(AFormat: TsSpreadsheetFormat; SaveMemoryMode: Boolean); published // Tests getting Excel style A1 cell locations from row/column based locations. // Bug 26447 @@ -55,12 +55,17 @@ type procedure TestVirtualMode_BIFF5; procedure TestVirtualMode_BIFF8; procedure TestVirtualMode_OOXML; + + procedure TestVirtualMode_BIFF2_SaveMemory; + procedure TestVirtualMode_BIFF5_SaveMemory; + procedure TestVirtualMode_BIFF8_SaveMemory; + procedure TestVirtualMode_OOXML_SaveMemory; end; implementation uses - numberstests; + numberstests, stringtests; const InternalSheet = 'Internal'; //worksheet name @@ -178,7 +183,9 @@ begin CheckEquals('$AA$2',GetCellString(1,26,[])); //just past the last letter CheckEquals('$GW$5',GetCellString(4,204,[])); //some big value CheckEquals('$IV$1',GetCellString(0,255,[])); //the last column of xls + CheckEquals('$IW$1',GetCellString(0,256,[])); //the first column beyond xls CheckEquals('$XFD$1',GetCellString(0,16383,[])); // the last column of xlsx + CheckEquals('$XFE$1',GetCellString(0,16384,[])); // the first column beyond xlsx // Something VERY big, beyond xlsx s := 'ZZZZ1'; @@ -199,18 +206,25 @@ end; procedure TSpreadInternalTests.NeedVirtualCellData(Sender: TObject; ARow, ACol: Cardinal; var AValue:Variant; var AStyleCell: PCell); begin - AValue := SollNumbers[ARow]; + // First read the SollNumbers, then the first 4 SollStrings + // See comment in TestVirtualMode(). + if ARow < Length(SollNumbers) then + AValue := SollNumbers[ARow] + else + AValue := SollStrings[ARow - Length(SollNumbers)]; end; -procedure TSpreadInternalTests.TestVirtualMode(AFormat: TsSpreadsheetFormat); +procedure TSpreadInternalTests.TestVirtualMode(AFormat: TsSpreadsheetFormat; + SaveMemoryMode: Boolean); var tempFile: String; workbook: TsWorkbook; worksheet: TsWorksheet; row, col: Integer; value: Double; + s: String; begin - TempFile:=GetTempFileName; + TempFile := GetTempFileName; if FileExists(TempFile) then DeleteFile(TempFile); @@ -218,10 +232,13 @@ begin try worksheet := workbook.AddWorksheet('VirtualMode'); workbook.WritingOptions := workbook.WritingOptions + [woVirtualMode]; - workbook.VirtualRowCount := Length(SollNumbers); + if SaveMemoryMode then + workbook.WritingOptions := workbook.WritingOptions + [woSaveMemory]; workbook.VirtualColCount := 1; + workbook.VirtualRowCount := Length(SollNumbers) + 4; + // We'll use only the first 4 SollStrings, the others cause trouble due to utf8 and formatting. workbook.OnNeedCellData := @NeedVirtualCellData; - workbook.WriteToFile(tempfile, AFormat); + workbook.WriteToFile(tempfile, AFormat, true); finally workbook.Free; end; @@ -232,13 +249,18 @@ begin workbook.ReadFromFile(tempFile, AFormat); worksheet := workbook.GetWorksheetByIndex(0); col := 0; - CheckEquals(Length(SollNumbers), worksheet.GetLastRowIndex+1, + CheckEquals(Length(SollNumbers) + 4, worksheet.GetLastRowIndex+1, 'Row count mismatch'); - for row := 0 to worksheet.GetLastRowIndex do begin + for row := 0 to Length(SollNumbers)-1 do begin value := worksheet.ReadAsNumber(row, col); CheckEquals(SollNumbers[row], value, 'Test number value mismatch, cell '+CellNotation(workSheet, row, col)) end; + for row := Length(SollNumbers) to worksheet.GetLastRowIndex do begin + s := worksheet.ReadAsUTF8Text(row, col); + CheckEquals(SollStrings[row - Length(SollNumbers)], s, + 'Test string value mismatch, cell '+CellNotation(workSheet, row, col)); + end; finally workbook.Free; end; @@ -249,22 +271,42 @@ end; procedure TSpreadInternalTests.TestVirtualMode_BIFF2; begin - TestVirtualMode(sfExcel2); + TestVirtualMode(sfExcel2, false); end; procedure TSpreadInternalTests.TestVirtualMode_BIFF5; begin - TestVirtualMode(sfExcel5); + TestVirtualMode(sfExcel5, false); end; procedure TSpreadInternalTests.TestVirtualMode_BIFF8; begin - TestVirtualMode(sfExcel8); + TestVirtualMode(sfExcel8, false); end; procedure TSpreadInternalTests.TestVirtualMode_OOXML; begin - TestVirtualMode(sfOOXML); + TestVirtualMode(sfOOXML, false); +end; + +procedure TSpreadInternalTests.TestVirtualMode_BIFF2_SaveMemory; +begin + TestVirtualMode(sfExcel2, True); +end; + +procedure TSpreadInternalTests.TestVirtualMode_BIFF5_SaveMemory; +begin + TestVirtualMode(sfExcel5, true); +end; + +procedure TSpreadInternalTests.TestVirtualMode_BIFF8_SaveMemory; +begin + TestVirtualMode(sfExcel8, true); +end; + +procedure TSpreadInternalTests.TestVirtualMode_OOXML_SaveMemory; +begin + TestVirtualMode(sfOOXML, true); end; initialization diff --git a/components/fpspreadsheet/tests/spreadtestgui.lpi b/components/fpspreadsheet/tests/spreadtestgui.lpi index 1166ff9e0..cbbbad4a0 100644 --- a/components/fpspreadsheet/tests/spreadtestgui.lpi +++ b/components/fpspreadsheet/tests/spreadtestgui.lpi @@ -84,16 +84,15 @@ + - - @@ -107,7 +106,6 @@ - @@ -128,7 +126,6 @@ - @@ -138,7 +135,6 @@ - diff --git a/components/fpspreadsheet/xlsbiff8.pas b/components/fpspreadsheet/xlsbiff8.pas index bbf02277f..11f0b87af 100755 --- a/components/fpspreadsheet/xlsbiff8.pas +++ b/components/fpspreadsheet/xlsbiff8.pas @@ -364,7 +364,8 @@ var fn: String; begin if (woSaveMemory in Workbook.WritingOptions) then begin - fn := GetTempFileName; + fn := GetTempFileName('', 'fpsB8'); + if FileExists(fn) then DeleteFile(fn); Stream := TFileStream.Create(fn, fmCreate + fmOpenRead) end else Stream := TMemoryStream.Create; @@ -378,6 +379,8 @@ begin OutputStorage.WriteOLEFile(AFileName, OLEDocument, AOverwriteExisting, 'Workbook'); finally + if (woSaveMemory in Workbook.WritingOptions) then + DeleteFile(fn); Stream.Free; OutputStorage.Free; end;