fpspreadsheet: Add unit tests for some of the recently fixed formulas.

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@6541 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
wp_xxyyzz
2018-06-26 23:08:01 +00:00
parent d9488921a0
commit 03d8694142
4 changed files with 196 additions and 38 deletions

View File

@ -4445,15 +4445,14 @@ begin
rtInteger : Result := Arg.ResInteger;
rtFloat : Result := Arg.ResFloat;
rtBoolean : if Arg.ResBoolean then Result := 1.0;
rtString,
rtHyperlink : begin
fs := (Arg.Worksheet as TsWorksheet).Workbook.FormatSettings;
rtHyperlink,
rtString : begin
fs := ExprFormatSettings; //(Arg.Worksheet as TsWorksheet).Workbook.FormatSettings;
TryStrToDateTime(ArgToString(Arg), Result, fs);
end;
rtCell : begin
cell := ArgToCell(Arg);
if Assigned(cell) then
if (cell^.ContentType = cctDateTime) then
if Assigned(cell) and (cell^.ContentType = cctDateTime) then
Result := cell^.DateTimeValue;
end;
end;
@ -4712,6 +4711,11 @@ initialization
ExprFormatSettings := DefaultFormatSettings;
ExprFormatSettings.DecimalSeparator := '.';
ExprFormatSettings.ListSeparator := ',';
ExprFormatSettings.DateSeparator := '/';
ExprFormatSettings.TimeSeparator := ':';
ExprFormatSettings.ShortDateFormat := 'yyyy/m/d'; // the parser returns single digits
ExprFormatSettings.LongTimeFormat := 'h:n:s';
ExprFormatSettings.ShortTimeFormat := 'h:n';
RegisterStdBuiltins(BuiltinIdentifiers);

View File

@ -421,13 +421,15 @@ procedure fpsDAY(var Result: TsExpressionResult; const Args: TsExprParameterArra
// date_value can be a serial number or a string
var
y,m,d: Word;
dt: TDateTime;
begin
if (Args[0].ResultType in [rtDateTime, rtFloat, rtInteger, rtString, rtCell])
then begin
DecodeDate(ArgToFloat(Args[0]), y, m, d);
Result := IntegerResult(d);
end else
Result := ErrorResult(errWrongType);
if (Args[0].ResultType in [rtDateTime, rtFloat, rtInteger, rtString, rtCell]) then
begin
dt := ArgToDateTime(Args[0]);
DecodeDate(dt, y, m, d);
Result := IntegerResult(d);
end;
end;
procedure fpsHOUR(var Result: TsExpressionResult; const Args: TsExprParameterArray);
@ -435,28 +437,30 @@ procedure fpsHOUR(var Result: TsExpressionResult; const Args: TsExprParameterArr
// time_value can be a number or a string.
var
h, m, s, ms: Word;
t: double;
dt: TDateTime;
begin
Result := ErrorResult(errWrongType);
if (Args[0].ResultType in [rtDateTime, rtFloat, rtInteger, rtString, rtCell]) then
begin
DecodeTime(trunc(ArgToFloat(Args[0])), h,m,s,ms);
dt := ArgToDateTime(Args[0]);
DecodeTime(dt, h, m, s, ms);
Result := IntegerResult(h);
end else
Result := ErrorResult(errWrongType);
end;
end;
procedure fpsMINUTE(var Result: TsExpressionResult; const Args: TsExprParameterArray);
// MINUTE( serial_number or string )
var
h, m, s, ms: Word;
t: double;
dt: TDateTime;
begin
Result := ErrorResult(errWrongType);
if (Args[0].ResultType in [rtDateTime, rtFloat, rtInteger, rtString, rtCell]) then
begin
DecodeTime(ArgToFloat(Args[0]), h,m,s,ms);
dt := ArgToDateTime(Args[0]);
DecodeTime(dt, h, m, s, ms);
Result := IntegerResult(m);
end else
Result := ErrorResult(errWrongType);
end;
end;
procedure fpsMONTH(var Result: TsExpressionResult; const Args: TsExprParameterArray);
@ -465,12 +469,13 @@ var
y,m,d: Word;
dt: TDateTime;
begin
Result := ErrorResult(errWrongType);
if (Args[0].ResultType in [rtDateTime, rtFloat, rtInteger, rtString, rtCell]) then
begin
DecodeDate(ArgToFloat(Args[0]), y,m,d);
dt := ArgToDateTime(Args[0]);
DecodeDate(dt, y, m, d);
Result := IntegerResult(m);
end else
Result := ErrorResult(errWrongType);
end;
end;
procedure fpsNOW(var Result: TsExpressionResult; const Args: TsExprParameterArray);
@ -486,14 +491,15 @@ procedure fpsSECOND(var Result: TsExpressionResult; const Args: TsExprParameterA
// SECOND( serial_number )
var
h, m, s, ms: Word;
t: Double;
dt: TDateTime;
begin
if (Args[0].ResultType in [rtDateTime, rtFloat, rtInteger, rtString, rtCell])
then begin
DecodeTime(ArgToFloat(Args[0]), h,m,s,ms);
Result := IntegerResult(s);
end else
Result := ErrorResult(errWrongType);
if (Args[0].ResultType in [rtDateTime, rtFloat, rtInteger, rtString, rtCell]) then
begin
dt := ArgToDateTime(Args[0]);
DecodeTime(dt, h, m, s, ms);
Result := IntegerResult(s);
end;
end;
procedure fpsTIME(var Result: TsExpressionResult; const Args: TsExprParameterArray);
@ -563,12 +569,13 @@ var
y,m,d: Word;
dt: TDateTime;
begin
if Args[0].ResultType in [rtDateTime, rtFloat, rtInteger, rtString, rtCell]
then begin
DecodeDate(ArgToFloat(Args[0]), y,m,d);
Result := IntegerResult(y);
end else
Result := ErrorResult(errWrongType);
if (Args[0].ResultType in [rtDateTime, rtFloat, rtInteger, rtString, rtCell]) then
begin
dt := ArgToDateTime(Args[0]);
DecodeDate(dt, y, m, d);
Result := IntegerResult(y);
end;
end;

View File

@ -41,6 +41,25 @@ type
procedure AddCells_OOXML;
procedure AddCells_ODS;
procedure RoundConst1_ODS;
procedure RoundConst2_ODS;
procedure RoundCell1_ODS;
procedure RoundCell2_ODS;
procedure YearConst_BIFF8;
procedure YearCell_BIFF8;
procedure MonthConst_BIFF8;
procedure MonthCell_BIFF8;
procedure DayConst_BIFF8;
procedure DayCell_BIFF8;
procedure HourConst_BIFF8;
procedure HourCell_BIFF8;
procedure MinuteConst_BIFF8;
procedure MinuteCell_BIFF8;
procedure SecondConst_BIFF8;
procedure SecondCell_BIFF8;
procedure SumRange_BIFF2;
procedure SumRange_BIFF5;
procedure SumRange_BIFF8;
@ -63,6 +82,11 @@ type
procedure SumMultiSheetRange_FlippedSheetsAndCells_OOXML;
procedure SumMultiSheetRange_FlippedSheetsAndCells_ODS;
procedure CountIfRange_BIFF8;
procedure CountIfRangeSheet_BIFF8;
procedure SumIfRangeSheetSheet_BIFF8;
procedure NonExistantSheet_BIFF5;
procedure NonExistantSheet_BIFF8;
procedure NonExistantSheet_OOXML;
@ -137,7 +161,7 @@ begin
// Create test workbook and write test formula and needed cells
workbook := TsWorkbook.Create;
try
workbook.FormatSettings.DecimalSeparator := '.';
workbook.FormatSettings := ExprFormatSettings;
workbook.Options := workbook.Options + [boCalcBeforeSaving, boAutoCalc];
workSheet:= workBook.AddWorksheet(SHEET1);
@ -147,6 +171,9 @@ begin
worksheet.WriteNumber(3, 2, -2.0); // C4
worksheet.WriteNumber(4, 2, 1.5); // C5
worksheet.WriteNumber(2, 3, 15.0); // D3
worksheet.WriteDateTime( 9, 1, EncodeDate(2012, 2, 5), nfShortDate); // B10
worksheet.WriteDateTime(10, 1, EncodeTime(14, 20, 41, 0), nfLongTime); // B11
end;
if ATestKind in [ftkCellRangeSheet, ftkCellRangeSheetRange] then begin
@ -185,7 +212,7 @@ begin
// Read file
workbook := TsWorkbook.Create;
try
workbook.FormatSettings.DecimalSeparator := '.';
workbook.FormatSettings := ExprFormatSettings;
workbook.Options := workbook.Options + [boReadFormulas, boAutoCalc];
workbook.ReadFromFile(TempFile, AFormat);
worksheet := workbook.GetFirstWorksheet;
@ -261,6 +288,110 @@ end;
{ ------ }
procedure TSpreadSingleFormulaTests.RoundConst1_ODS;
begin
TestFormula('ROUND(1234.56789,2)', '1234.57', ftkConstants, sfOpenDocument);
end;
procedure TSpreadSingleFormulaTests.RoundConst2_ODS;
begin
TestFormula('ROUND(1234.56789,-2)', '1200', ftkConstants, sfOpenDocument);
end;
procedure TSpreadSingleFormulaTests.RoundCell1_ODS;
begin
TestFormula('ROUND(1234.56789,C3)', '1234.6', ftkCells, sfOpenDocument); // C3 = 1
end;
procedure TSpreadSingleFormulaTests.RoundCell2_ODS;
begin
TestFormula('ROUND(1234.56789,C4)', '1200', ftkCells, sfOpenDocument); // C4 = -2
end;
{ ------ }
procedure TSpreadSingleFormulaTests.YearConst_BIFF8;
var
s: String;
begin
s := FormatDateTime(ExprFormatSettings.ShortDateFormat, EncodeDate(2012,2,5), ExprFormatSettings);
TestFormula(Format('YEAR("%s")', [s]), '2012', ftkConstants, sfExcel8);
end;
procedure TSpreadSingleFormulaTests.YearCell_BIFF8;
begin
TestFormula('YEAR(B10)', '2012', ftkCells, sfExcel8); // B10: 2012/02/05
end;
procedure TSpreadSingleFormulaTests.MonthConst_BIFF8;
var
s: String;
begin
s := FormatDateTime(ExprFormatSettings.ShortDateFormat, EncodeDate(2012,2,5), ExprFormatSettings);
TestFormula(Format('MONTH("%s")', [s]), '2', ftkConstants, sfExcel8);
end;
procedure TSpreadSingleFormulaTests.MonthCell_BIFF8;
begin
TestFormula('MONTH(B10)', '2', ftkCells, sfExcel8); // B10: 2012/02/05
end;
procedure TSpreadSingleFormulaTests.DayConst_BIFF8;
var
s: String;
begin
s := FormatDateTime(ExprFormatSettings.ShortDateFormat, EncodeDate(2012,2,5), ExprFormatSettings);
TestFormula(Format('DAY("%s")', [s]), '5', ftkConstants, sfExcel8);
end;
procedure TSpreadSingleFormulaTests.DayCell_BIFF8;
begin
TestFormula('DAY(B10)', '5', ftkCells, sfExcel8); // B10: 2012/02/05
end;
{ ----- }
procedure TSpreadSingleFormulaTests.HourConst_BIFF8;
var
s: String;
begin
s := FormatDateTime(ExprFormatSettings.LongTimeFormat, EncodeTime(14, 20, 41, 0), ExprFormatSettings);
TestFormula(Format('HOUR("%s")', [s]), '14', ftkConstants, sfExcel8);
end;
procedure TSpreadSingleFormulaTests.HourCell_BIFF8;
begin
TestFormula('HOUR(B11)', '14', ftkCells, sfExcel8); // B11: 14:20:41
end;
procedure TSpreadSingleFormulaTests.MinuteConst_BIFF8;
var
s: String;
begin
s := FormatDateTime(ExprFormatSettings.LongTimeFormat, EncodeTime(14, 20, 41, 0), ExprFormatSettings);
TestFormula(Format('MINUTE("%s")', [s]), '20', ftkConstants, sfExcel8);
end;
procedure TSpreadSingleFormulaTests.MinuteCell_BIFF8;
begin
TestFormula('MINUTE(B11)', '20', ftkCells, sfExcel8); // B11: 14:20:41
end;
procedure TSpreadSingleFormulaTests.SecondConst_BIFF8;
var
s: String;
begin
s := FormatDateTime(ExprFormatSettings.LongTimeFormat, EncodeTime(14, 20, 41, 0), ExprFormatSettings);
TestFormula(Format('SECOND("%s")', [s]), '41', ftkConstants, sfExcel8);
end;
procedure TSpreadSingleFormulaTests.SecondCell_BIFF8;
begin
TestFormula('SECOND(B11)', '41', ftkCells, sfExcel8); // B11: 14:20:41
end;
{ ---- }
procedure TSpreadSingleFormulaTests.SumRange_BIFF2;
begin
TestFormula('SUM(C3:C5)', '0.5', ftkCellRange, sfExcel2);
@ -363,6 +494,23 @@ end;
{ --- }
procedure TSpreadSingleFormulaTests.CountIfRange_BIFF8;
begin
TestFormula('COUNTIF(C3:C5,">1")', '1', ftkCellRange, sfExcel8);
end;
procedure TSpreadSingleFormulaTests.CountIfRangeSheet_BIFF8;
begin
TestFormula('COUNTIF(Sheet2!C3:C5,">10")', '1', ftkCellRangeSheet, sfExcel8);
end;
procedure TSpreadSingleFormulaTests.SumIfRangeSheetSheet_BIFF8;
begin
TestFormula('SUMIF(Sheet2!C3:C5,">10",Sheet3!C3:C5)', '150', ftkCellRangeSheetRange, sfExcel8);
end;
{ ---- }
procedure TSpreadSingleFormulaTests.NonExistantSheet_BIFF5;
begin
TestFormula('Missing!C3', '#REF!', ftkCellRangeSheet, sfExcel5, '#REF!');
@ -703,11 +851,10 @@ begin
end;
initialization
// Register to include these tests in a full run
RegisterTest(TSpreadSingleFormulaTests);
end.

View File

@ -1810,7 +1810,7 @@
RPNFunc('DATE', nil))))))
else
MyWorksheet.WriteFormula(Row, 1, formula);
MyWorksheet.WriteDateTime(Row, 2, EncodeDate(2014,7,1));
MyWorksheet.WriteDateTime(Row, 2, EncodeDate(2014,7,1), nfShortDate);
SetLength(sollValues, Row+1);
sollValues[Row] := DateTimeResult(EncodeDate(2014,7,1));