fpspreadsheet: Add unit test for reading rpn formulas

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@3093 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
wp_xxyyzz 2014-05-24 20:28:05 +00:00
parent e2c68dd9d2
commit 08d7ed126e
5 changed files with 223 additions and 83 deletions

View File

@ -0,0 +1,110 @@
unit formulatests;
{$mode objfpc}{$H+}
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;
type
{ TSpreadWriteReadFormula }
//Write to xls/xml file and read back
TSpreadWriteReadFormulaTests = class(TTestCase)
private
protected
// Set up expected values:
procedure SetUp; override;
procedure TearDown; override;
// Test formula strings
procedure TestWriteReadFormulaStrings(AFormat: TsSpreadsheetFormat);
published
// Writes out numbers & reads back.
// If previous read tests are ok, this effectively tests writing.
{ BIFF8 Tests }
procedure TestWriteReadBIFF8_FormulaStrings;
end;
implementation
uses
rpnFormulaUnit;
{ TSpreadWriteReadFormatTests }
procedure TSpreadWriteReadFormulaTests.SetUp;
begin
inherited SetUp;
end;
procedure TSpreadWriteReadFormulaTests.TearDown;
begin
inherited TearDown;
end;
procedure TSpreadWriteReadFormulaTests.TestWriteReadFormulaStrings(AFormat: TsSpreadsheetFormat);
const
SHEET = 'Sheet1';
var
MyWorksheet: TsWorksheet;
MyWorkbook: TsWorkbook;
ActualString: String;
Row, Col: Integer;
TempFile: string; //write xls/xml to this file and read back from it
expected: String;
actual: String;
cell: PCell;
begin
TempFile := GetTempFileName;
// Create test workbook
MyWorkbook := TsWorkbook.Create;
MyWorkSheet:= MyWorkBook.AddWorksheet(SHEET);
// Write out all test formulas
// All formulas are in column B
WriteRPNFormulaSamples(MyWorksheet, AFormat);
MyWorkBook.WriteToFile(TempFile, AFormat, true);
MyWorkbook.Free;
// Open the spreadsheet
MyWorkbook := TsWorkbook.Create;
MyWorkbook.ReadFromFile(TempFile, AFormat);
if AFormat = sfExcel2 then
MyWorksheet := MyWorkbook.GetFirstWorksheet
else
MyWorksheet := GetWorksheetByName(MyWorkBook, SHEET);
if MyWorksheet=nil then
fail('Error in test code. Failed to get named worksheet');
for Row := 0 to MyWorksheet.GetLastRowNumber do begin
cell := MyWorksheet.FindCell(Row, 1);
if (cell <> nil) and (Length(cell^.RPNFormulaValue) > 0) then begin
actual := MyWorksheet.ReadRPNFormulaAsString(cell);
expected := MyWorksheet.ReadAsUTF8Text(Row, 0);
CheckEquals(actual, expected, 'Test read formula mismatch, cell '+CellNotation(MyWorkSheet,Row,Col));
end;
end;
// Finalization
MyWorkbook.Free;
DeleteFile(TempFile);
end;
procedure TSpreadWriteReadFormulaTests.TestWriteReadBIFF8_FormulaStrings;
begin
TestWriteReadFormulaStrings(sfExcel8);
end;
initialization
// Register so these tests are included in a full run
RegisterTest(TSpreadWriteReadFormulaTests);
end.

View File

@ -67,13 +67,12 @@ implementation
uses uses
Math, StrUtils, Math, StrUtils,
fpsUtils; fpsUtils, rpnFormulaUnit;
const const
COLORSHEETNAME='colorsheet'; //for background color tests COLORSHEETNAME='colorsheet'; //for background color tests
RPNSHEETNAME='formula_sheet'; //for rpn formula tests RPNSHEETNAME='formula_sheet'; //for rpn formula tests
OUTPUT_FORMAT = sfExcel8; //change manually if you want to test different formats. To do: automatically output all formats OUTPUT_FORMAT = sfExcel8; //change manually if you want to test different formats. To do: automatically output all formats
FALSE_TRUE: array[Boolean] of String = ('FALSE', 'TRUE');
var var
Workbook: TsWorkbook = nil; Workbook: TsWorkbook = nil;
@ -206,7 +205,15 @@ end;
{$IFDEF FPSPREAD_HAS_NEWRPNSUPPORT} {$IFDEF FPSPREAD_HAS_NEWRPNSUPPORT}
// As described in bug 25718: Feature request & patch: Implementation of writing more functions // As described in bug 25718: Feature request & patch: Implementation of writing more functions
procedure TSpreadManualTests.TestRPNFormula; procedure TSpreadManualTests.TestRPNFormula;
{$I rpntests.inc} var
Worksheet: TsWorksheet;
begin
if Workbook = nil then
Workbook := TsWorkbook.Create;
Worksheet := Workbook.AddWorksheet(RPNSHEETNAME);
WriteRPNFormulaSamples(Worksheet, OUTPUT_FORMAT);
end;
{$ENDIF} {$ENDIF}
initialization initialization

View File

@ -1,7 +1,21 @@
{ include file for manualtests.pas in unit rpnFormulaUnit;
procedure TSpreadManualTests.TestRPNFormula;
}
interface
uses
SysUtils, fpspreadsheet,fpsutils;
procedure WriteRPNFormulaSamples(Worksheet: TsWorksheet; AFormat: TsSpreadsheetFormat);
implementation
uses
Math, StrUtils;
const
FALSE_TRUE: array[Boolean] of String = ('FALSE', 'TRUE');
procedure WriteRPNFormulaSamples(Worksheet: TsWorksheet; AFormat: TsSpreadSheetFormat);
const const
cellB1 = 1.0; cellB1 = 1.0;
cellC1 = 2.0; cellC1 = 2.0;
@ -12,18 +26,15 @@ const
SBaseCells = 'Data cells:'; SBaseCells = 'Data cells:';
SHelloWorld = 'Hello world!'; SHelloWorld = 'Hello world!';
var var
Worksheet: TsWorksheet;
Cell: PCell; Cell: PCell;
RPNFormula: TsRPNFormula;
Row: Integer; Row: Integer;
value: Double; value: Double;
r,c: integer; r,c: integer;
celladdr: String; celladdr: String;
begin begin
if Workbook = nil then if Worksheet = nil then
Workbook := TsWorkbook.Create; exit;
Worksheet := Workbook.AddWorksheet(RPNSHEETNAME);
Worksheet.WriteUTF8Text(0, 0, SBaseCells); Worksheet.WriteUTF8Text(0, 0, SBaseCells);
Worksheet.WriteUsedFormatting(0, 0, [uffBold]); Worksheet.WriteUsedFormatting(0, 0, [uffBold]);
Worksheet.WriteNumber(0,1, cellB1); Worksheet.WriteNumber(0,1, cellB1);
@ -486,7 +497,7 @@ begin
// Logical AND - case false/false // Logical AND - case false/false
inc(Row); inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=AND(1=0;1=2)'); Worksheet.WriteUTF8Text(Row, 0, '=AND(1=0,1=2)');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula( Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNNumber(1, RPNNumber(1,
RPNNumber(0, RPNNumber(0,
@ -500,7 +511,7 @@ begin
// Logical AND - case false/true // Logical AND - case false/true
inc(Row); inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=AND(1=0;2=2)'); Worksheet.WriteUTF8Text(Row, 0, '=AND(1=0,2=2)');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula( Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNNumber(1, RPNNumber(1,
RPNNumber(0, RPNNumber(0,
@ -514,7 +525,7 @@ begin
// Logical AND - case true/true // Logical AND - case true/true
inc(Row); inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=AND(1=1;2=2)'); Worksheet.WriteUTF8Text(Row, 0, '=AND(1=1,2=2)');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula( Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNNumber(1, RPNNumber(1,
RPNNumber(1, RPNNumber(1,
@ -528,7 +539,7 @@ begin
// Logical OR - case false/false // Logical OR - case false/false
inc(Row); inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=OR(1=0;1=2)'); Worksheet.WriteUTF8Text(Row, 0, '=OR(1=0,1=2)');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula( Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNNumber(1, RPNNumber(1,
RPNNumber(0, RPNNumber(0,
@ -542,7 +553,7 @@ begin
// Logical OR - case false/true // Logical OR - case false/true
inc(Row); inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=OR(1=0;2=2)'); Worksheet.WriteUTF8Text(Row, 0, '=OR(1=0,2=2)');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula( Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNNumber(1, RPNNumber(1,
RPNNumber(0, RPNNumber(0,
@ -556,7 +567,7 @@ begin
// Logical OR - case true/true // Logical OR - case true/true
inc(Row); inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=OR(1=1;2=2)'); Worksheet.WriteUTF8Text(Row, 0, '=OR(1=1,2=2)');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula( Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNNumber(1, RPNNumber(1,
RPNNumber(1, RPNNumber(1,
@ -570,7 +581,7 @@ begin
// IF - case true // IF - case true
inc(Row); inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=IF(B1=1; "correct"; "wrong")'); Worksheet.WriteUTF8Text(Row, 0, '=IF(B1=1,"correct","wrong")');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula( Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNCellValue('B1', RPNCellValue('B1',
RPNNumber(1, RPNNumber(1,
@ -583,7 +594,7 @@ begin
// IF - case false // IF - case false
inc(Row); inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=IF(B1<>1; "correct"; "wrong")'); Worksheet.WriteUTF8Text(Row, 0, '=IF(B1<>1,"correct","wrong")');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula( Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNCellValue('B1', RPNCellValue('B1',
RPNNumber(1, RPNNumber(1,
@ -596,7 +607,7 @@ begin
// IF - case true (2 params) // IF - case true (2 params)
inc(Row); inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=IF(B1=1; "correct")'); Worksheet.WriteUTF8Text(Row, 0, '=IF(B1=1,"correct")');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula( Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNCellValue('B1', RPNCellValue('B1',
RPNNumber(1, RPNNumber(1,
@ -608,7 +619,7 @@ begin
// IF - case false (2 params) // IF - case false (2 params)
inc(Row); inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=IF(B1<>1; "correct")'); Worksheet.WriteUTF8Text(Row, 0, '=IF(B1<>1,"correct")');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula( Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNCellValue('B1', RPNCellValue('B1',
RPNNumber(1, RPNNumber(1,
@ -686,7 +697,7 @@ begin
nil))); nil)));
Worksheet.WriteNumber(Row, 2, pi); Worksheet.WriteNumber(Row, 2, pi);
if OUTPUT_FORMAT <> sfExcel2 then begin if AFormat <> sfExcel2 then begin
// Degrees // Degrees
inc(Row); inc(Row);
value := pi/2; value := pi/2;
@ -771,7 +782,7 @@ begin
nil)))); nil))));
Worksheet.WriteNumber(Row, 2, arctan(1.0)); Worksheet.WriteNumber(Row, 2, arctan(1.0));
if OUTPUT_FORMAT <> sfExcel2 then begin if AFormat <> sfExcel2 then begin
// Next functions are not available in BIFF2 // Next functions are not available in BIFF2
// sinh // sinh
@ -866,12 +877,12 @@ begin
Worksheet.WriteNumber(Row, 2, ln(value)); Worksheet.WriteNumber(Row, 2, ln(value));
// log to any basis // log to any basis
if OUTPUT_FORMAT <> sfExcel2 then begin if AFormat <> sfExcel2 then begin
// This test is not working in Excel 2. // This test is not working in Excel 2.
// Not clear if this is correct, need to debug later // Not clear if this is correct, need to debug later
inc(Row); inc(Row);
value := 256; value := 256;
Worksheet.WriteUTF8Text(Row, 0, '=LOG(256;2)'); Worksheet.WriteUTF8Text(Row, 0, '=LOG(256,2)');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula( Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNNumber(value, RPNNumber(value,
RPNNumber(2, RPNNumber(2,
@ -909,7 +920,7 @@ begin
// Round positive number to 1 decimal // Round positive number to 1 decimal
inc(Row); inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=ROUND($F$1;1)'); Worksheet.WriteUTF8Text(Row, 0, '=ROUND($F$1,1)');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula( Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNCellValue('$F$1', RPNCellValue('$F$1',
RPNNumber(1, RPNNumber(1,
@ -919,7 +930,7 @@ begin
// Round negative number to 1 decimal // Round negative number to 1 decimal
inc(Row); inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=ROUND(G1;1)'); Worksheet.WriteUTF8Text(Row, 0, '=ROUND(G1,1)');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula( Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNCellValue('G1', RPNCellValue('G1',
RPNNumber(1, RPNNumber(1,
@ -1151,7 +1162,7 @@ begin
// Cell information // Cell information
inc(Row); inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=CELL("Address", B80)'); Worksheet.WriteUTF8Text(Row, 0, '=CELL("Address",B80)');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula( Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNString('address', RPNString('address',
RPNCellRef('B80', // note: CellRef instead of CellValue! RPNCellRef('B80', // note: CellRef instead of CellValue!
@ -1159,7 +1170,7 @@ begin
nil))))); nil)))));
inc(Row); inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=CELL("Filename", B80)'); Worksheet.WriteUTF8Text(Row, 0, '=CELL("Filename",B80)');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula( Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNString('filename', RPNString('filename',
RPNCellRef('B80', // note: CellRef instead of CellValue! RPNCellRef('B80', // note: CellRef instead of CellValue!
@ -1167,7 +1178,7 @@ begin
nil))))); nil)))));
inc(Row); inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=CELL("Row", B80)'); Worksheet.WriteUTF8Text(Row, 0, '=CELL("Row",B80)');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula( Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNString('row', RPNString('row',
RPNCellRef('B80', // note: CellRef instead of CellValue! RPNCellRef('B80', // note: CellRef instead of CellValue!
@ -1175,7 +1186,7 @@ begin
nil))))); nil)))));
inc(Row); inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=CELL("format", B80)'); Worksheet.WriteUTF8Text(Row, 0, '=CELL("format",B80)');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula( Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNString('format', RPNString('format',
RPNCellRef('B80', // note: CellRef instead of CellValue! RPNCellRef('B80', // note: CellRef instead of CellValue!
@ -1183,7 +1194,7 @@ begin
nil))))); nil)))));
inc(Row); inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=CELL("color", B80)'); Worksheet.WriteUTF8Text(Row, 0, '=CELL("color",B80)');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula( Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNString('color', RPNString('color',
RPNCellRef('B80', // note: CellRef instead of CellValue! RPNCellRef('B80', // note: CellRef instead of CellValue!
@ -1200,7 +1211,7 @@ begin
Worksheet.WriteNumber(Row, 2, cellB1); Worksheet.WriteNumber(Row, 2, cellB1);
// General info // General info
if OUTPUT_FORMAT <> sfExcel2 then begin if AFormat <> sfExcel2 then begin
inc(Row); inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=INFO("osversion")'); Worksheet.WriteUTF8Text(Row, 0, '=INFO("osversion")');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula( Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
@ -1246,7 +1257,7 @@ begin
Worksheet.WriteNumber(Row, 2, now); Worksheet.WriteNumber(Row, 2, now);
// Today // Today
if OUTPUT_FORMAT <> sfExcel2 then begin if AFormat <> sfExcel2 then begin
inc(Row); inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=TODAY()'); Worksheet.WriteUTF8Text(Row, 0, '=TODAY()');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula( Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
@ -1276,9 +1287,9 @@ begin
Worksheet.WriteNumber(Row, 2, EncodeDate(2014,1,25)); Worksheet.WriteNumber(Row, 2, EncodeDate(2014,1,25));
// DateDifference // DateDifference
if OUTPUT_FORMAT <> sfExcel2 then begin if AFormat <> sfExcel2 then begin
inc(Row); inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=DATEDIF("2010-01-01"; DATE(2014;1;25); "M")'); Worksheet.WriteUTF8Text(Row, 0, '=DATEDIF("2010-01-01",DATE(2014;1;25),"M")');
// Note: Dates must be ordered: Date1 < Date2 !!! // Note: Dates must be ordered: Date1 < Date2 !!!
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula( Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNString('2010-01-01', RPNString('2010-01-01',
@ -1413,7 +1424,7 @@ begin
// Count - non-empty cells // Count - non-empty cells
inc(Row); inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=COUNT($B$1;$C$1;$D$1:F1)'); Worksheet.WriteUTF8Text(Row, 0, '=COUNT($B$1,$C$1,$D$1:F1)');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula( Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNCellValue('$B$1', RPNCellValue('$B$1',
RPNCellValue('$C$1', RPNCellValue('$C$1',
@ -1424,7 +1435,7 @@ begin
// Count - with empty cells & alpha-numeric cells // Count - with empty cells & alpha-numeric cells
inc(Row); inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=COUNT($B$1;$C$1;$D$1:$F$2;"ABC")'); Worksheet.WriteUTF8Text(Row, 0, '=COUNT($B$1,$C$1,$D$1:$F$2,"ABC")');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula( Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNCellValue('$B$1', RPNCellValue('$B$1',
RPNCellValue('$C$1', RPNCellValue('$C$1',
@ -1436,7 +1447,7 @@ begin
// CountA - empty cells and constants // CountA - empty cells and constants
inc(Row); inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=COUNTA($B$1;$C$1;$D$1:$F$2;"ABC";"DEF")'); Worksheet.WriteUTF8Text(Row, 0, '=COUNTA($B$1,$C$1,$D$1:$F$2,"ABC","DEF")');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula( Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNCellValue('$B$1', RPNCellValue('$B$1',
RPNCellValue('$C$1', RPNCellValue('$C$1',
@ -1447,10 +1458,10 @@ begin
nil)))))))); nil))))))));
Worksheet.WriteNumber(Row, 2, 7); // 7 non-empty values Worksheet.WriteNumber(Row, 2, 7); // 7 non-empty values
if OUTPUT_FORMAT <> sfExcel2 then begin if AFormat <> sfExcel2 then begin
// CountIF // CountIF
inc(Row); inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=COUNTIF(A1:G1, "<=1")'); Worksheet.WriteUTF8Text(Row, 0, '=COUNTIF(A1:G1,"<=1")');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula( Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNCellRange('A1:G1', RPNCellRange('A1:G1',
RPNString('<=1', RPNString('<=1',
@ -1474,7 +1485,7 @@ begin
// Sum - non-empty cells // Sum - non-empty cells
inc(Row); inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=SUM($B$1;$C$1;D$1:F$1)'); Worksheet.WriteUTF8Text(Row, 0, '=SUM($B$1,$C$1,D$1:F$1)');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula( Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNCellValue('$B$1', RPNCellValue('$B$1',
RPNCellValue('$C$1', RPNCellValue('$C$1',
@ -1483,10 +1494,10 @@ begin
nil)))))); nil))))));
Worksheet.WriteNumber(Row, 2, cellB1+cellC1+cellD1+cellE1+cellF1); Worksheet.WriteNumber(Row, 2, cellB1+cellC1+cellD1+cellE1+cellF1);
if OUTPUT_FORMAT <> sfExcel2 then begin if AFormat <> sfExcel2 then begin
// SumIF // SumIF
inc(Row); inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=SUMIF(A1:G1, "<=1")'); Worksheet.WriteUTF8Text(Row, 0, '=SUMIF(A1:G1,"<=1")');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula( Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNCellRange('A1:G1', RPNCellRange('A1:G1',
RPNString('<=1', RPNString('<=1',
@ -1500,7 +1511,7 @@ begin
// Sum of squares // Sum of squares
inc(Row); inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=SUMSQ($B$1;$C$1;$D$1:$F$1)'); Worksheet.WriteUTF8Text(Row, 0, '=SUMSQ($B$1,$C$1,$D$1:$F$1)');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula( Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNCellValue('$B$1', RPNCellValue('$B$1',
RPNCellValue('$C$1', RPNCellValue('$C$1',
@ -1512,7 +1523,7 @@ begin
// Product // Product
inc(Row); inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=PRODUCT($B$1;$C$1;$D$1:$F$1)'); Worksheet.WriteUTF8Text(Row, 0, '=PRODUCT($B$1,$C$1,$D$1:$F$1)');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula( Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNCellValue('$B$1', RPNCellValue('$B$1',
RPNCellValue('$C$1', RPNCellValue('$C$1',
@ -1523,7 +1534,7 @@ begin
// Average - non-empty cells // Average - non-empty cells
inc(Row); inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=AVERAGE($B$1;$C$1;$D$1:$F$1)'); Worksheet.WriteUTF8Text(Row, 0, '=AVERAGE($B$1,$C$1,$D$1:$F$1)');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula( Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNCellValue('$B$1', RPNCellValue('$B$1',
RPNCellValue('$C$1', RPNCellValue('$C$1',
@ -1534,7 +1545,7 @@ begin
// StdDev // StdDev
inc(Row); inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=STDEV($B$1;$C$1;$D$1:$F$1)'); Worksheet.WriteUTF8Text(Row, 0, '=STDEV($B$1,$C$1,$D$1:$F$1)');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula( Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNCellValue('$B$1', RPNCellValue('$B$1',
RPNCellValue('$C$1', RPNCellValue('$C$1',
@ -1545,7 +1556,7 @@ begin
// Population StdDev // Population StdDev
inc(Row); inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=STDEVP($B$1;$C$1;$D$1:$F$1)'); Worksheet.WriteUTF8Text(Row, 0, '=STDEVP($B$1,$C$1,$D$1:$F$1)');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula( Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNCellValue('$B$1', RPNCellValue('$B$1',
RPNCellValue('$C$1', RPNCellValue('$C$1',
@ -1555,9 +1566,9 @@ begin
Worksheet.WriteNumber(Row, 2, popnstddev([cellB1,cellC1,cellD1,cellE1,cellF1])); Worksheet.WriteNumber(Row, 2, popnstddev([cellB1,cellC1,cellD1,cellE1,cellF1]));
// Average deviation // Average deviation
if OUTPUT_FORMAT <> sfExcel2 then begin if AFormat <> sfExcel2 then begin
inc(Row); inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=AVEDEV($B$1;$C$1;$D$1:$F$1)'); Worksheet.WriteUTF8Text(Row, 0, '=AVEDEV($B$1,$C$1,$D$1:$F$1)');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula( Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNCellValue('$B$1', RPNCellValue('$B$1',
RPNCellValue('$C$1', RPNCellValue('$C$1',
@ -1571,7 +1582,7 @@ begin
// Variance // Variance
inc(Row); inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=VAR($B$1;$C$1;$D$1:$F$1)'); Worksheet.WriteUTF8Text(Row, 0, '=VAR($B$1,$C$1,$D$1:$F$1)');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula( Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNCellValue('$B$1', RPNCellValue('$B$1',
RPNCellValue('$C$1', RPNCellValue('$C$1',
@ -1582,7 +1593,7 @@ begin
// Population variance // Population variance
inc(Row); inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=VARP($B$1;$C$1;$D$1:$F$1)'); Worksheet.WriteUTF8Text(Row, 0, '=VARP($B$1,$C$1,$D$1:$F$1)');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula( Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNCellValue('$B$1', RPNCellValue('$B$1',
RPNCellValue('$C$1', RPNCellValue('$C$1',
@ -1593,7 +1604,7 @@ begin
// Max // Max
inc(Row); inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=MAX($B$1;$C$1;$D$1:$F$1)'); Worksheet.WriteUTF8Text(Row, 0, '=MAX($B$1,$C$1,$D$1:$F$1)');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula( Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNCellValue('$B$1', RPNCellValue('$B$1',
RPNCellValue('$C$1', RPNCellValue('$C$1',
@ -1604,7 +1615,7 @@ begin
// Min // Min
inc(Row); inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=MIN($B$1;$C$1;$D$1:$F$1)'); Worksheet.WriteUTF8Text(Row, 0, '=MIN($B$1,$C$1,$D$1:$F$1)');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula( Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNCellValue('$B$1', RPNCellValue('$B$1',
RPNCellValue('$C$1', RPNCellValue('$C$1',
@ -1614,9 +1625,9 @@ begin
Worksheet.WriteNumber(Row, 2, MinValue([cellB1,cellC1,cellD1,cellE1,cellF1])); Worksheet.WriteNumber(Row, 2, MinValue([cellB1,cellC1,cellD1,cellE1,cellF1]));
// Median // Median
if OUTPUT_FORMAT <> sfExcel2 then begin if AFormat <> sfExcel2 then begin
inc(Row); inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=MEDIAN($B$1;$C$1;$D$1:$F$1)'); Worksheet.WriteUTF8Text(Row, 0, '=MEDIAN($B$1,$C$1,$D$1:$F$1)');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula( Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNCellValue('$B$1', RPNCellValue('$B$1',
RPNCellValue('$C$1', RPNCellValue('$C$1',
@ -1627,9 +1638,9 @@ begin
end; end;
// Beta distribution // Beta distribution
if OUTPUT_FORMAT <> sfExcel2 then begin if AFormat <> sfExcel2 then begin
inc(Row); inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=BETADIST(3, 7.5, 9, 1, 4)'); Worksheet.WriteUTF8Text(Row, 0, '=BETADIST(3,7.5,9,1,4)');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula( Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNNumber(3, RPNNumber(3,
RPNNumber(7.5, RPNNumber(7.5,
@ -1642,9 +1653,9 @@ begin
end; end;
// Inverse beta function // Inverse beta function
if OUTPUT_FORMAT <> sfExcel2 then begin if AFormat <> sfExcel2 then begin
inc(Row); inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=BETAINV(0.3, 7.5, 9, 1, 4)'); Worksheet.WriteUTF8Text(Row, 0, '=BETAINV(0.3,7.5,9,1,4)');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula( Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNNumber(0.3, RPNNumber(0.3,
RPNNumber(7.5, RPNNumber(7.5,
@ -1657,9 +1668,9 @@ begin
end; end;
// Binomial distribution // Binomial distribution
if OUTPUT_FORMAT <> sfExcel2 then begin if AFormat <> sfExcel2 then begin
inc(Row); inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=BINOMDIST(3, 8, 0.35, TRUE)'); Worksheet.WriteUTF8Text(Row, 0, '=BINOMDIST(3,8,0.35,TRUE)');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula( Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNNumber(3, RPNNumber(3,
RPNNumber(8, RPNNumber(8,
@ -1671,9 +1682,9 @@ begin
end; end;
// Chi2 distribution // Chi2 distribution
if OUTPUT_FORMAT <> sfExcel2 then begin if AFormat <> sfExcel2 then begin
inc(Row); inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=CHIDIST(3, 9)'); Worksheet.WriteUTF8Text(Row, 0, '=CHIDIST(3,9)');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula( Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNNumber(3, RPNNumber(3,
RPNNumber(9, RPNNumber(9,
@ -1683,9 +1694,9 @@ begin
end; end;
// Inverse of Chi2 distribution // Inverse of Chi2 distribution
if OUTPUT_FORMAT <> sfExcel2 then begin if AFormat <> sfExcel2 then begin
inc(Row); inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=CHIINV(0.3, 7)'); Worksheet.WriteUTF8Text(Row, 0, '=CHIINV(0.3,7)');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula( Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNNumber(0.3, RPNNumber(0.3,
RPNNumber(7, RPNNumber(7,
@ -1695,9 +1706,9 @@ begin
end; end;
// Permutations // Permutations
if OUTPUT_FORMAT <> sfExcel2 then begin if AFormat <> sfExcel2 then begin
inc(Row); inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=PERMUT(21, 5)'); Worksheet.WriteUTF8Text(Row, 0, '=PERMUT(21,5)');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula( Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNNumber(21, RPNNumber(21,
RPNNumber(5, RPNNumber(5,
@ -1707,9 +1718,9 @@ begin
end; end;
// Poisson distribution // Poisson distribution
if OUTPUT_FORMAT <> sfExcel2 then begin if AFormat <> sfExcel2 then begin
inc(Row); inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=POISSON(1400, 1500, TRUE)'); Worksheet.WriteUTF8Text(Row, 0, '=POISSON(1400,1500,TRUE)');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula( Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNNumber(1400, RPNNumber(1400,
RPNNumber(1500, RPNNumber(1500,
@ -1731,7 +1742,7 @@ begin
// the month, each month, for 2 years. // the month, each month, for 2 years.
// according to: www.techonthenet.com/excel/formulas/fv.php // according to: www.techonthenet.com/excel/formulas/fv.php
inc(Row); inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=FV(3.5%/12; 2*12; -250; -5000; 1)'); Worksheet.WriteUTF8Text(Row, 0, '=FV(3.5%/12,2*12,-250,-5000,1)');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula( Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNNumber(3.5, RPNNumber(3.5,
RPNFunc(fekPERCENT, RPNFunc(fekPERCENT,
@ -1752,7 +1763,7 @@ begin
// according to: www.techonthenet.com/excel/formulas/pv.php // according to: www.techonthenet.com/excel/formulas/pv.php
// Note the missing argument! // Note the missing argument!
inc(Row); inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=PV(3.5%/12, 2*12, 250, , 0)'); Worksheet.WriteUTF8Text(Row, 0, '=PV(3.5%/12,2*12,250,,0)');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula( Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNNumber(3.5, RPNNumber(3.5,
RPNFunc(fekPercent, RPNFunc(fekPercent,
@ -1772,7 +1783,7 @@ begin
// 2 years. All payments are made at the end of the period. // 2 years. All payments are made at the end of the period.
// Adapted from //www.techonthenet.com/excel/formulas/rate.php // Adapted from //www.techonthenet.com/excel/formulas/rate.php
inc(Row); inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=RATE(2*12; -250; 5000)'); Worksheet.WriteUTF8Text(Row, 0, '=RATE(2*12,-250,5000)');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula( Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNNumber(2, RPNNumber(2,
RPNNumber(12, RPNNumber(12,
@ -1791,7 +1802,7 @@ begin
// 3.5% annually. Payments are due at the end of the period. // 3.5% annually. Payments are due at the end of the period.
// Adapted from //www.techonthenet.com/excel/formulas/nper.php // Adapted from //www.techonthenet.com/excel/formulas/nper.php
inc(Row); inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=NPER(3.5%/12; -150; 5000)'); Worksheet.WriteUTF8Text(Row, 0, '=NPER(3.5%/12,-150,5000)');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula( Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNNumber(3.5, RPNNumber(3.5,
RPNFunc(fekPERCENT, RPNFunc(fekPERCENT,
@ -1808,7 +1819,7 @@ begin
// of the period. // of the period.
// Adapted from //www.techonthenet.com/excel/formulas/pmt.php // Adapted from //www.techonthenet.com/excel/formulas/pmt.php
inc(Row); inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=PMT(3.5%/12, 2*12, 5000, 0, 1)'); Worksheet.WriteUTF8Text(Row, 0, '=PMT(3.5%/12,2*12,5000,0,1)');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula( Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNNumber(3.5, RPNNumber(3.5,
RPNFunc(fekPERCENT, RPNFunc(fekPERCENT,
@ -1852,7 +1863,7 @@ begin
// Left part of string // Left part of string
inc(Row); inc(Row);
Worksheet.WriteUTF8Text(Row, 0, Format('=LEFT("%s";3)', [SHelloWorld])); Worksheet.WriteUTF8Text(Row, 0, Format('=LEFT("%s",3)', [SHelloWorld]));
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula( Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNString(SHelloWorld, RPNString(SHelloWorld,
RPNNumber(3, RPNNumber(3,
@ -1862,7 +1873,7 @@ begin
// Mid part of string // Mid part of string
inc(Row); inc(Row);
Worksheet.WriteUTF8Text(Row, 0, Format('=MID("%s";4;5)', [SHelloWorld])); Worksheet.WriteUTF8Text(Row, 0, Format('=MID("%s",4,5)', [SHelloWorld]));
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula( Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNString(SHelloWorld, RPNString(SHelloWorld,
RPNNumber(4, RPNNumber(4,
@ -1873,7 +1884,7 @@ begin
// Right part of string // Right part of string
inc(Row); inc(Row);
Worksheet.WriteUTF8Text(Row, 0, Format('=RIGHT("%s";3)', [SHelloWorld])); Worksheet.WriteUTF8Text(Row, 0, Format('=RIGHT("%s",3)', [SHelloWorld]));
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula( Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNString(SHelloWorld, RPNString(SHelloWorld,
RPNNumber(3, RPNNumber(3,
@ -1919,7 +1930,7 @@ begin
// replace // replace
inc(Row); inc(Row);
Worksheet.WriteUTF8Text(Row, 0, Format('=REPLACE("%s", 7, 5, "Friend")', [SHelloWorld])); Worksheet.WriteUTF8Text(Row, 0, Format('=REPLACE("%s",7,5,"Friend")', [SHelloWorld]));
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula( Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNString(SHelloWorld, RPNString(SHelloWorld,
RPNNumber(7, RPNNumber(7,
@ -1933,7 +1944,7 @@ begin
// Note: the function can have an optional parameter. Therefore, you have // Note: the function can have an optional parameter. Therefore, you have
// to specify the actual parameter count. // to specify the actual parameter count.
inc(Row); inc(Row);
Worksheet.WriteUTF8Text(Row, 0, Format('=SUBSTITUTE("%s", "l", ".")', [SHelloWorld])); Worksheet.WriteUTF8Text(Row, 0, Format('=SUBSTITUTE("%s","l",".")', [SHelloWorld]));
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula( Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNString(SHelloWorld, RPNString(SHelloWorld,
RPNString('l', RPNString('l',
@ -1994,3 +2005,5 @@ begin
Worksheet.WriteUTF8Text(Row, 2, 'Error #N/A'); Worksheet.WriteUTF8Text(Row, 2, 'Error #N/A');
*) *)
end; end;
end.

View File

@ -78,7 +78,7 @@
<PackageName Value="FCL"/> <PackageName Value="FCL"/>
</Item4> </Item4>
</RequiredPackages> </RequiredPackages>
<Units Count="12"> <Units Count="14">
<Unit0> <Unit0>
<Filename Value="spreadtestgui.lpr"/> <Filename Value="spreadtestgui.lpr"/>
<IsPartOfProject Value="True"/> <IsPartOfProject Value="True"/>
@ -139,6 +139,16 @@
<IsPartOfProject Value="True"/> <IsPartOfProject Value="True"/>
<UnitName Value="numformatparsertests"/> <UnitName Value="numformatparsertests"/>
</Unit11> </Unit11>
<Unit12>
<Filename Value="rpnformulaunit.pas"/>
<IsPartOfProject Value="True"/>
<UnitName Value="rpnFormulaUnit"/>
</Unit12>
<Unit13>
<Filename Value="formulatests.pas"/>
<IsPartOfProject Value="True"/>
<UnitName Value="formulatests"/>
</Unit13>
</Units> </Units>
</ProjectOptions> </ProjectOptions>
<CompilerOptions> <CompilerOptions>

View File

@ -5,7 +5,7 @@ program spreadtestgui;
uses uses
Interfaces, Forms, GuiTestRunner, datetests, stringtests, numberstests, Interfaces, Forms, GuiTestRunner, datetests, stringtests, numberstests,
manualtests, testsutility, internaltests, formattests, colortests, fonttests, manualtests, testsutility, internaltests, formattests, colortests, fonttests,
optiontests, numformatparsertests; optiontests, numformatparsertests, formulatests, rpnFormulaUnit;
begin begin
Application.Initialize; Application.Initialize;