From 0fc1e4c93319cb2615ee0d33eab97ddbf2819f13 Mon Sep 17 00:00:00 2001 From: wp_xxyyzz Date: Tue, 8 Mar 2016 13:38:04 +0000 Subject: [PATCH] fpspreadsheet: Add tests for Excel being able to read files containing commens, images, header/footer images, and hyperlinks. git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@4533 8e941d3f-bd1b-0410-a28a-d453659cc2b4 --- components/fpspreadsheet/tests/exceltests.pas | 391 ++++++++++++++++++ .../fpspreadsheet/tests/lazarus32x32.png | Bin 0 -> 2088 bytes .../fpspreadsheet/tests/spreadtestgui.lpi | 6 +- .../fpspreadsheet/tests/spreadtestgui.lpr | 2 +- 4 files changed, 397 insertions(+), 2 deletions(-) create mode 100644 components/fpspreadsheet/tests/exceltests.pas create mode 100644 components/fpspreadsheet/tests/lazarus32x32.png diff --git a/components/fpspreadsheet/tests/exceltests.pas b/components/fpspreadsheet/tests/exceltests.pas new file mode 100644 index 000000000..4d51c2f06 --- /dev/null +++ b/components/fpspreadsheet/tests/exceltests.pas @@ -0,0 +1,391 @@ +unit exceltests; + +{$mode objfpc}{$H+} + +interface + +{ Tests which require Excel. + Will be skipped if Excel is not available. +} + +uses + // Not using Lazarus package as the user may be working with multiple versions + // Instead, add .. to unit search path + Classes, SysUtils, fpcunit, testregistry, + fpstypes, fpspreadsheet, xlsbiff2, xlsbiff5, xlsbiff8 {and a project requirement for lclbase for utf8 handling}, + testsutility; + +type + { TSpreadExcelTests } + // Write "something" to Excel file and open it in Excel + TSpreadExcelTests = class(TTestCase) + private + FExcelApp: OleVariant; + FExcelAvail: Boolean; + + protected + // Set up expected values: + procedure SetUp; override; + procedure TearDown; override; + + // Comments in several sheets (index of sheets specified) + procedure Test_Comments(const ASheets: array of Integer; AFormat: TsSpreadsheetFormat); + // Header/footer images in several sheets + procedure Test_HeaderFooterImages(const ASheets: array of Integer; + AddToFooter: Boolean; AFormat: TsSpreadsheetFormat); + // Images in several sheets + procedure Test_Images(const ASheets: array of Integer; + AFormat: TsSpreadsheetFormat); + // Comments, images, header/footer images, and hyperlinks + procedure Test_All(const ASheets: array of Integer; + AFormat: TsSpreadsheetFormat); + + published + // OOXML test cases + procedure Test_Comments0_OOXML; + procedure Test_Comments01_OOXML; + procedure Test_Comments02_OOXML; + procedure Test_HeaderImages0_OOXML; + procedure Test_HeaderImages01_OOXML; + procedure Test_HeaderImages12_OOXML; + procedure Test_FooterImages0_OOXML; + procedure Test_FooterImages01_OOXML; + procedure Test_FooterImages12_OOXML; + procedure Test_Images0_OOXML; + procedure Test_Images01_OOXML; + procedure Test_Images12_OOXML; + + procedure Test_All0_OOXML; + procedure Test_All01_OOXML; + procedure Test_All12_OOXML; + + end; + +implementation + +uses + TypInfo, comobj; + +const + SheetName = 'Excel-Test'; + + +{ TSpreadExcelTexts } + +procedure TSpreadExcelTests.SetUp; +begin + inherited SetUp; + try + FExcelApp := CreateOleObject('Excel.Application'); // creates an Excel Object + FExcelApp.Visible := False; // hides Excel window + FExcelApp.ScreenUpdating := False; // turns off screen updating of Excel + FExcelApp.DisplayAlerts := False; // no excel warnings and error messages + FExcelAvail := true; + except + FExcelAvail := false; + end; +end; + +procedure TSpreadExcelTests.TearDown; +begin + FExcelApp.Quit; + FExcelApp := UnAssigned; + inherited TearDown; +end; + +procedure TSpreadExcelTests.Test_Comments( + const ASheets: array of Integer; AFormat: TsSpreadsheetFormat); +var + MyWorksheet: TsWorksheet; + MyWorkbook: TsWorkbook; + TempFile: string; //write xls/xml to this file and read back from it + varFile: variant; // filename as variant for Excel + i, j: Integer; + book: OleVariant; +begin + if not FExcelAvail then + begin + exit; + end; + + TempFile := NewTempFile; + + MyWorkbook := TsWorkbook.Create; + try + MyWorkbook.Options := MyWorkbook.Options + [boCalcBeforeSaving]; + + for i:=0 to ASheets[High(ASheets)] do + begin + MyWorkSheet:= MyWorkBook.AddWorksheet(SheetName + IntToStr(i+1)); + for j:=0 to High(ASheets) do + if ASheets[j] = i then + begin + MyWorksheet.WriteText(0, 0, 'This is a text'); + MyWorksheet.WriteComment(0, 0, 'This is a comment'); + end; + end; + + MyWorkBook.WriteToFile(TempFile, AFormat, true); + finally + MyWorkbook.Free; + end; + + // Open the spreadsheet in Excel + + try + varFile := TempFile; + book := FExcelApp.Workbooks.Open(varFile); + book.Close; + except + Fail('Excel fails to open the file.'); + end; + + DeleteFile(TempFile); +end; + +procedure TSpreadExcelTests.Test_HeaderFooterImages( + const ASheets: array of Integer; AddToFooter: Boolean; + AFormat: TsSpreadsheetFormat); +var + MyWorksheet: TsWorksheet; + MyWorkbook: TsWorkbook; + TempFile: string; // write xls/xml to this file and read back from it + varFile: variant; // filename as variants for Excel + i, j: Integer; + book: OleVariant; +begin + if not FExcelAvail then + begin + exit; + end; + + TempFile := NewTempFile; + + MyWorkbook := TsWorkbook.Create; + try + MyWorkbook.Options := MyWorkbook.Options + [boCalcBeforeSaving]; + + for i:=0 to ASheets[High(ASheets)] do + begin + MyWorkSheet:= MyWorkBook.AddWorksheet(SheetName + IntToStr(i+1)); + for j:=0 to High(ASheets) do + if ASheets[j] = i then + begin + MyWorksheet.WriteText(0, 0, 'This is a text'); + if AddToFooter then + MyWorksheet.PageLayout.AddFooterImage(1, hfsCenter, 'lazarus32x32.png') + else + MyWorksheet.PageLayout.AddHeaderImage(1, hfsCenter, 'lazarus32x32.png'); + end; + end; + + MyWorkBook.WriteToFile(TempFile, AFormat, true); + finally + MyWorkbook.Free; + end; + + // Open the spreadsheet in Excel + + try + varFile := TempFile; + book := FExcelApp.Workbooks.Open(varFile); + book.Close; + except + Fail(Format('Excel fails to open file "%s".', [TempFile])); + end; + + DeleteFile(TempFile); +end; + +procedure TSpreadExcelTests.Test_Images(const ASheets: array of Integer; + AFormat: TsSpreadsheetFormat); +var + MyWorksheet: TsWorksheet; + MyWorkbook: TsWorkbook; + TempFile: string; // write xls/xml to this file and read back from it + varFile: variant; // filename as variants for Excel + i, j: Integer; + book: OleVariant; +begin + if not FExcelAvail then + begin + exit; + end; + + TempFile := NewTempFile; + + MyWorkbook := TsWorkbook.Create; + try + MyWorkbook.Options := MyWorkbook.Options + [boCalcBeforeSaving]; + + for i:=0 to ASheets[High(ASheets)] do + begin + MyWorkSheet:= MyWorkBook.AddWorksheet(SheetName + IntToStr(i+1)); + for j:=0 to High(ASheets) do + if ASheets[j] = i then + begin + MyWorksheet.WriteText(0, 0, 'This is a text'); + MyWorksheet.WriteImage(0, 1, 'lazarus32x32.png') + end; + end; + + MyWorkBook.WriteToFile(TempFile, AFormat, true); + finally + MyWorkbook.Free; + end; + + // Open the spreadsheet in Excel + + try + varFile := TempFile; + book := FExcelApp.Workbooks.Open(varFile); + book.Close; + except + Fail(Format('Excel fails to open file "%s".', [TempFile])); + end; + + DeleteFile(TempFile); +end; + +procedure TSpreadExcelTests.Test_All(const ASheets: array of Integer; + AFormat: TsSpreadsheetFormat); +var + MyWorksheet: TsWorksheet; + MyWorkbook: TsWorkbook; + TempFile: string; // write xls/xml to this file and read back from it + varFile: variant; // filename as variants for Excel + i, j: Integer; + book: OleVariant; +begin + if not FExcelAvail then + begin + exit; + end; + + TempFile := NewTempFile; + + MyWorkbook := TsWorkbook.Create; + try + MyWorkbook.Options := MyWorkbook.Options + [boCalcBeforeSaving]; + + for i:=0 to ASheets[High(ASheets)] do + begin + MyWorkSheet:= MyWorkBook.AddWorksheet(SheetName + IntToStr(i+1)); + for j:=0 to High(ASheets) do + if ASheets[j] = i then + begin + MyWorksheet.WriteText(0, 0, 'This is a text'); + MyWorksheet.WriteComment(0, 0, 'This is a comment'); + MyWorksheet.WriteHyperlink(0, 0, 'http://www.lazarus-ide.org/'); + MyWorksheet.WriteImage(0, 1, 'lazarus32x32.png'); + MyWorksheet.PageLayout.AddFooterImage(1, hfsCenter, 'lazarus32x32.png'); + MyWorksheet.PageLayout.AddHeaderImage(1, hfsCenter, 'lazarus32x32.png'); + end; + end; + + MyWorkBook.WriteToFile(TempFile, AFormat, true); + finally + MyWorkbook.Free; + end; + + // Open the spreadsheet in Excel + + try + varFile := TempFile; + book := FExcelApp.Workbooks.Open(varFile); + book.Close; + except + Fail(Format('Excel fails to open file "%s".', [TempFile])); + end; + + DeleteFile(TempFile); +end; + + +{ OOXML } + +procedure TSpreadExcelTests.Test_Comments0_OOXML; +begin + Test_Comments([0], sfOOXML); +end; + +procedure TSpreadExcelTests.Test_Comments01_OOXML; +begin + Test_Comments([0,1], sfOOXML); +end; + +procedure TSpreadExcelTests.Test_Comments02_OOXML; +begin + Test_Comments([0,2], sfOOXML); +end; + + +procedure TSpreadExcelTests.Test_HeaderImages0_OOXML; +begin + Test_HeaderFooterImages([0], false, sfOOXML); +end; + +procedure TSpreadExcelTests.Test_HeaderImages01_OOXML; +begin + Test_HeaderFooterImages([0,1], false, sfOOXML); +end; + +procedure TSpreadExcelTests.Test_HeaderImages12_OOXML; +begin + Test_HeaderFooterImages([1,2], false, sfOOXML); +end; + + +procedure TSpreadExcelTests.Test_FooterImages0_OOXML; +begin + Test_HeaderFooterImages([0], true, sfOOXML); +end; + +procedure TSpreadExcelTests.Test_FooterImages01_OOXML; +begin + Test_HeaderFooterImages([0,1], true, sfOOXML); +end; + +procedure TSpreadExcelTests.Test_FooterImages12_OOXML; +begin + Test_HeaderFooterImages([1,2], true, sfOOXML); +end; + + +procedure TSpreadExcelTests.Test_Images0_OOXML; +begin + Test_Images([0], sfOOXML); +end; + +procedure TSpreadExcelTests.Test_Images01_OOXML; +begin + Test_Images([0,1], sfOOXML); +end; + +procedure TSpreadExcelTests.Test_Images12_OOXML; +begin + Test_Images([1,2], sfOOXML); +end; + + +procedure TSpreadExcelTests.Test_All0_OOXML; +begin + Test_All([0], sfOOXML); +end; + +procedure TSpreadExcelTests.Test_All01_OOXML; +begin + Test_All([0,1], sfOOXML); +end; + +procedure TSpreadExcelTests.Test_All12_OOXML; +begin + Test_All([1,2], sfOOXML); +end; + + +initialization + RegisterTest(TSpreadExcelTests); + +end. + diff --git a/components/fpspreadsheet/tests/lazarus32x32.png b/components/fpspreadsheet/tests/lazarus32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..51cb13e68843b52f7848521a826586261b56ef7b GIT binary patch literal 2088 zcmV+@2-o+CP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iyh} z4<8S&su!*R00*c^L_t(o!?l-xj1|=t$3OSZ%zJO&{(g(>E-eTaN-L$iNTHN~NJ}dz zi$yFe{QOt!tVOk z{rTRTnR{>lnB8?@mo(5i$t07>J@G6b7ij z_#yF}d=djnkV4Sh2IXJ6RW!G!J*YOj_8*tjY&N|D4E@z?4*D=qv839pUN|EdJz|iZ z$_P5sh7J#WW$*$+dm4g3p^QQ4kowwl?{K;PJYShO9i-?=gChY|!D zAq7H!(SpWSftM0;^@HLiJ;Kfk7!n5NP7L1F-CDfYbOgm2N7hL%oEeq2y8ps@c_&<)~= zyuln!5j=1b>#K_A z#$TH{3n3+eQ_Rq^Z}jn>C>_bjad+X^l3PYi2EdXM%eJwFVA*|@6bzrdw5#3s0#LJA z0Yof;CBc?qZ;x0YEDLl-N1TTj%%oyUneMj+S~}81BsdmC9EjM^mV);iLjbQIJct))BDPIdEW)?% zdy>&p=TSPmoVy=-p4{Agq7fU%vN-mSrvY#r8^@B^wnPfZ$sfr4yC&=2W1HPIblePF zc<$F#IF5xKXp{<22Bc-NYU^>Et36CM4$QQ@`Yn=9bWzO?@#0RFYf7CuyF33WaLe}Rda^K zpwHv`0YR5KDy=|BWS9O+DX@e=`JLqDC2%5=?5HFWwUh}z%xqq9 zICk2^F-PWo??<$!z}KdyKMYP7&YV8VYlq(^UcdJ=upW5Db=~AWbM76J88r1RfO!4h zSAp5C>!z;Bz<;}tJhHfoWIK3Dp*0vFPd2jYh26yK_pSq0cSm;>voS!quIv9#7n1?G z;o#{h8?6ml4y<`OlZbq%GNd^|?0imi&5e5{M=C3z$!@4d2 zyY?S1K7aQ3b3;dzP4E3beg1V7kFxzn0Eings;sOW3CsXK2V4S9x~_Xe4EzT-%X~b_ SVOmN60000)oyZ literal 0 HcmV?d00001 diff --git a/components/fpspreadsheet/tests/spreadtestgui.lpi b/components/fpspreadsheet/tests/spreadtestgui.lpi index 96a83295e..64a77e915 100644 --- a/components/fpspreadsheet/tests/spreadtestgui.lpi +++ b/components/fpspreadsheet/tests/spreadtestgui.lpi @@ -40,7 +40,7 @@ - + @@ -142,6 +142,10 @@ + + + + diff --git a/components/fpspreadsheet/tests/spreadtestgui.lpr b/components/fpspreadsheet/tests/spreadtestgui.lpr index 0d6c7d347..ecdce40d0 100644 --- a/components/fpspreadsheet/tests/spreadtestgui.lpr +++ b/components/fpspreadsheet/tests/spreadtestgui.lpr @@ -10,7 +10,7 @@ uses {$ENDIF} Interfaces, Forms, GuiTestRunner, datetests, stringtests, numberstests, manualtests, testsutility, internaltests, formattests, colortests, fonttests, - optiontests, numformatparsertests, formulatests, rpnFormulaUnit, + optiontests, numformatparsertests, formulatests, rpnFormulaUnit, exceltests, emptycelltests, errortests, virtualmodetests, insertdeletetests, celltypetests, sortingtests, copytests, enumeratortests, commenttests, hyperlinktests, pagelayouttests;