lazarus-ccr/components/fpspreadsheet/tests/datetests.pas
bigchimp a98a75327e Tests:
+ added test for GetSheetByName function
+ Added TSpreadInternalTests.ReadDateAsUTF8 to test wp's ReadAsUTF8 forum problem report with date/time cells
* Fixed displaying sheet+column where problems occur (CellNotation function)



git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@2859 8e941d3f-bd1b-0410-a28a-d453659cc2b4
2013-12-10 12:06:12 +00:00

342 lines
10 KiB
ObjectPascal

unit datetests;
{$mode objfpc}{$H+}
{
Adding tests/test data:
1. Add a new value to column A in the relevant worksheet, and save the spreadsheet read-only
(for dates, there are 2 files, with different datemodes. Use them both...)
2. Increase SollDates array size
3. Add value from 1) to InitNormVariables so you can test against it
4. Add your read test(s), read and check read value against SollDates[<added number>]
}
interface
uses
// Not using lazarus package as the user may be working with multiple versions
// Instead, add .. to unit search path
Classes, SysUtils, fpcunit, testutils, testregistry,
fpsallformats, fpspreadsheet, xlsbiff8 {and a project requirement for lclbase for utf8 handling},
testsutility;
var
// Norm to test against - list of dates/times that should occur in spreadsheet
SollDates: array[0..11] of TDateTime; //"Soll" is a German word in Dutch accountancy circles meaning "normative value to check against". There ;)
// Initializes Soll*/normative variables.
// Useful in test setup procedures to make sure the norm is correct.
procedure InitSollDates;
type
{ TSpreadReadDateTests }
// Read from xls/xml file with known values
TSpreadReadDateTests= class(TTestCase)
private
// Tries to read date in column A, specified (0-based) row
procedure TestReadDate(FileName: string; Row: integer);
protected
// Set up expected values:
procedure SetUp; override;
procedure TearDown; override;
published
// Reads dates, date/time and time values from spreadsheet and checks against list
// One cell per test so some tests can fail and those further below may still work
procedure TestReadDate0; //date tests
procedure TestReadDate1; //date and time
procedure TestReadDate2;
procedure TestReadDate3;
procedure TestReadDate4; //time only tests start here
procedure TestReadDate5;
procedure TestReadDate6;
procedure TestReadDate7;
procedure TestReadDate8;
procedure TestReadDate9;
procedure TestReadDate10;
procedure TestReadDate11;
procedure TestReadDate1899_0; //same as above except with the 1899/1900 date system set
procedure TestReadDate1899_1;
procedure TestReadDate1899_2;
procedure TestReadDate1899_3;
procedure TestReadDate1899_4;
procedure TestReadDate1899_5;
procedure TestReadDate1899_6;
procedure TestReadDate1899_7;
procedure TestReadDate1899_8;
procedure TestReadDate1899_9;
procedure TestReadDate1899_10;
procedure TestReadDate1899_11;
end;
{ TSpreadWriteReadDateTests }
//Write to xls/xml file and read back
TSpreadWriteReadDateTests= class(TTestCase)
private
protected
// Set up expected values:
procedure SetUp; override;
procedure TearDown; override;
published
// Reads dates, date/time and time values from spreadsheet and checks against list
// One cell per test so some tests can fail and those further below may still work
procedure TestWriteReadDates;
end;
implementation
const
TestFileBIFF8='testbiff8.xls'; //with 1904 datemode date system
TestFileBIFF8_1899='testbiff8_1899.xls'; //with 1899/1900 datemode date system
DatesSheet = 'Dates'; //worksheet name
// Initialize array with variables that represent the values
// we expect to be in the test spreadsheet files.
//
// When adding tests, add values to this array
// and increase array size in variable declaration
procedure InitSollDates;
begin
// Set up norm - MUST match spreadsheet cells exactly
SollDates[0]:=EncodeDate(1905,09,12); //FPC number 2082
SollDates[1]:=EncodeDate(1908,09,12)+EncodeTime(12,0,0,0); //noon
SollDates[2]:=EncodeDate(2013,11,24);
SollDates[3]:=EncodeDate(2030,12,31);
SollDates[4]:=EncodeTime(0,0,0,0);
SollDates[5]:=EncodeTime(0,0,1,0);
SollDates[6]:=EncodeTime(1,0,0,0);
SollDates[7]:=EncodeTime(3,0,0,0);
SollDates[8]:=EncodeTime(12,0,0,0);
SollDates[9]:=EncodeTime(18,0,0,0);
SollDates[10]:=EncodeTime(23,59,0,0);
SollDates[11]:=EncodeTime(23,59,59,0);
end;
{ TSpreadWriteReadDateTests }
procedure TSpreadWriteReadDateTests.SetUp;
begin
inherited SetUp;
InitSollDates;
end;
procedure TSpreadWriteReadDateTests.TearDown;
begin
inherited TearDown;
end;
procedure TSpreadWriteReadDateTests.TestWriteReadDates;
var
MyWorksheet: TsWorksheet;
MyWorkbook: TsWorkbook;
ActualDateTime: TDateTime;
Row: Cardinal;
TempFile: string; //write xls/xml to this file and read back from it
begin
TempFile:=GetTempFileName;
{// Not needed: use workbook.writetofile with overwrite=true
if fileexists(TempFile) then
DeleteFile(TempFile);
}
// Write out all test values
MyWorkbook := TsWorkbook.Create;
MyWorkSheet:=MyWorkBook.AddWorksheet(DatesSheet);
for Row := Low(SollDates) to High(SollDates) do
begin
MyWorkSheet.WriteDateTime(Row,0,SollDates[Row]);
// Some checks inside worksheet itself
if not(MyWorkSheet.ReadAsDateTime(Row,0,ActualDateTime)) then
Fail('Failed writing date time for cell '+CellNotation(MyWorkSheet,Row));
CheckEquals(SollDates[Row],ActualDateTime,'Test date/time value mismatch cell '+CellNotation(MyWorksheet,Row));
end;
MyWorkBook.WriteToFile(TempFile,sfExcel8,true);
MyWorkbook.Free;
// Open the spreadsheet, as biff8
MyWorkbook := TsWorkbook.Create;
MyWorkbook.ReadFromFile(TempFile, sfExcel8);
MyWorksheet:=GetWorksheetByName(MyWorkBook,DatesSheet);
if MyWorksheet=nil then
fail('Error in test code. Failed to get named worksheet');
// Read test data from A column & compare if written=original
for Row := Low(SollDates) to High(SollDates) do
begin
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));
end;
// Finalization
MyWorkbook.Free;
DeleteFile(TempFile);
end;
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, as biff8
MyWorkbook := TsWorkbook.Create;
MyWorkbook.ReadFromFile(FileName, sfExcel8);
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));
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));
// Finalization
MyWorkbook.Free;
end;
procedure TSpreadReadDateTests.SetUp;
begin
InitSollDates;
end;
procedure TSpreadReadDateTests.TearDown;
begin
end;
procedure TSpreadReadDateTests.TestReadDate0;
begin
TestReadDate(ExtractFilePath(ParamStr(0)) + TestFileBIFF8,0);
end;
procedure TSpreadReadDateTests.TestReadDate1;
begin
TestReadDate(ExtractFilePath(ParamStr(0)) + TestFileBIFF8,1);
end;
procedure TSpreadReadDateTests.TestReadDate2;
begin
TestReadDate(ExtractFilePath(ParamStr(0)) + TestFileBIFF8,2);
end;
procedure TSpreadReadDateTests.TestReadDate3;
begin
TestReadDate(ExtractFilePath(ParamStr(0)) + TestFileBIFF8,3);
end;
procedure TSpreadReadDateTests.TestReadDate4;
begin
TestReadDate(ExtractFilePath(ParamStr(0)) + TestFileBIFF8,4);
end;
procedure TSpreadReadDateTests.TestReadDate5;
begin
TestReadDate(ExtractFilePath(ParamStr(0)) + TestFileBIFF8,5);
end;
procedure TSpreadReadDateTests.TestReadDate6;
begin
TestReadDate(ExtractFilePath(ParamStr(0)) + TestFileBIFF8,6);
end;
procedure TSpreadReadDateTests.TestReadDate7;
begin
TestReadDate(ExtractFilePath(ParamStr(0)) + TestFileBIFF8,7);
end;
procedure TSpreadReadDateTests.TestReadDate8;
begin
TestReadDate(ExtractFilePath(ParamStr(0)) + TestFileBIFF8,8);
end;
procedure TSpreadReadDateTests.TestReadDate9;
begin
TestReadDate(ExtractFilePath(ParamStr(0)) + TestFileBIFF8,9);
end;
procedure TSpreadReadDateTests.TestReadDate10;
begin
TestReadDate(ExtractFilePath(ParamStr(0)) + TestFileBIFF8,10);
end;
procedure TSpreadReadDateTests.TestReadDate11;
begin
TestReadDate(ExtractFilePath(ParamStr(0)) + TestFileBIFF8,11);
end;
procedure TSpreadReadDateTests.TestReadDate1899_0;
begin
TestReadDate(ExtractFilePath(ParamStr(0)) + TestFileBIFF8_1899,0);
end;
procedure TSpreadReadDateTests.TestReadDate1899_1;
begin
TestReadDate(ExtractFilePath(ParamStr(0)) + TestFileBIFF8_1899,1);
end;
procedure TSpreadReadDateTests.TestReadDate1899_2;
begin
TestReadDate(ExtractFilePath(ParamStr(0)) + TestFileBIFF8_1899,2);
end;
procedure TSpreadReadDateTests.TestReadDate1899_3;
begin
TestReadDate(ExtractFilePath(ParamStr(0)) + TestFileBIFF8_1899,3);
end;
procedure TSpreadReadDateTests.TestReadDate1899_4;
begin
TestReadDate(ExtractFilePath(ParamStr(0)) + TestFileBIFF8_1899,4);
end;
procedure TSpreadReadDateTests.TestReadDate1899_5;
begin
TestReadDate(ExtractFilePath(ParamStr(0)) + TestFileBIFF8_1899,5);
end;
procedure TSpreadReadDateTests.TestReadDate1899_6;
begin
TestReadDate(ExtractFilePath(ParamStr(0)) + TestFileBIFF8_1899,6);
end;
procedure TSpreadReadDateTests.TestReadDate1899_7;
begin
TestReadDate(ExtractFilePath(ParamStr(0)) + TestFileBIFF8_1899,7);
end;
procedure TSpreadReadDateTests.TestReadDate1899_8;
begin
TestReadDate(ExtractFilePath(ParamStr(0)) + TestFileBIFF8_1899,8);
end;
procedure TSpreadReadDateTests.TestReadDate1899_9;
begin
TestReadDate(ExtractFilePath(ParamStr(0)) + TestFileBIFF8_1899,9);
end;
procedure TSpreadReadDateTests.TestReadDate1899_10;
begin
TestReadDate(ExtractFilePath(ParamStr(0)) + TestFileBIFF8_1899,10);
end;
procedure TSpreadReadDateTests.TestReadDate1899_11;
begin
TestReadDate(ExtractFilePath(ParamStr(0)) + TestFileBIFF8_1899,11);
end;
initialization
// Register so these tests are included in a full run
RegisterTest(TSpreadReadDateTests);
RegisterTest(TSpreadWriteReadDateTests);
InitSollDates; //useful to have norm data if other code want to use this unit
end.