diff --git a/components/fpspreadsheet/tests/formulatests.pas b/components/fpspreadsheet/tests/formulatests.pas new file mode 100644 index 000000000..9e17dc706 --- /dev/null +++ b/components/fpspreadsheet/tests/formulatests.pas @@ -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. + diff --git a/components/fpspreadsheet/tests/manualtests.pas b/components/fpspreadsheet/tests/manualtests.pas index d79adec15..4c749e749 100644 --- a/components/fpspreadsheet/tests/manualtests.pas +++ b/components/fpspreadsheet/tests/manualtests.pas @@ -67,13 +67,12 @@ implementation uses Math, StrUtils, - fpsUtils; + fpsUtils, rpnFormulaUnit; const COLORSHEETNAME='colorsheet'; //for background color 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 - FALSE_TRUE: array[Boolean] of String = ('FALSE', 'TRUE'); var Workbook: TsWorkbook = nil; @@ -206,7 +205,15 @@ end; {$IFDEF FPSPREAD_HAS_NEWRPNSUPPORT} // As described in bug 25718: Feature request & patch: Implementation of writing more functions 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} initialization diff --git a/components/fpspreadsheet/tests/rpntests.inc b/components/fpspreadsheet/tests/rpnformulaunit.pas similarity index 92% rename from components/fpspreadsheet/tests/rpntests.inc rename to components/fpspreadsheet/tests/rpnformulaunit.pas index 304f48404..ea525dd8d 100644 --- a/components/fpspreadsheet/tests/rpntests.inc +++ b/components/fpspreadsheet/tests/rpnformulaunit.pas @@ -1,7 +1,21 @@ -{ include file for manualtests.pas in -procedure TSpreadManualTests.TestRPNFormula; -} +unit rpnFormulaUnit; +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 cellB1 = 1.0; cellC1 = 2.0; @@ -12,18 +26,15 @@ const SBaseCells = 'Data cells:'; SHelloWorld = 'Hello world!'; var - Worksheet: TsWorksheet; Cell: PCell; - RPNFormula: TsRPNFormula; Row: Integer; value: Double; r,c: integer; celladdr: String; begin - if Workbook = nil then - Workbook := TsWorkbook.Create; + if Worksheet = nil then + exit; - Worksheet := Workbook.AddWorksheet(RPNSHEETNAME); Worksheet.WriteUTF8Text(0, 0, SBaseCells); Worksheet.WriteUsedFormatting(0, 0, [uffBold]); Worksheet.WriteNumber(0,1, cellB1); @@ -486,7 +497,7 @@ begin // Logical AND - case false/false 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( RPNNumber(1, RPNNumber(0, @@ -500,7 +511,7 @@ begin // Logical AND - case false/true 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( RPNNumber(1, RPNNumber(0, @@ -514,7 +525,7 @@ begin // Logical AND - case true/true 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( RPNNumber(1, RPNNumber(1, @@ -528,7 +539,7 @@ begin // Logical OR - case false/false 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( RPNNumber(1, RPNNumber(0, @@ -542,7 +553,7 @@ begin // Logical OR - case false/true 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( RPNNumber(1, RPNNumber(0, @@ -556,7 +567,7 @@ begin // Logical OR - case true/true 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( RPNNumber(1, RPNNumber(1, @@ -570,7 +581,7 @@ begin // IF - case true 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( RPNCellValue('B1', RPNNumber(1, @@ -583,7 +594,7 @@ begin // IF - case false 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( RPNCellValue('B1', RPNNumber(1, @@ -596,7 +607,7 @@ begin // IF - case true (2 params) inc(Row); - Worksheet.WriteUTF8Text(Row, 0, '=IF(B1=1; "correct")'); + Worksheet.WriteUTF8Text(Row, 0, '=IF(B1=1,"correct")'); Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula( RPNCellValue('B1', RPNNumber(1, @@ -608,7 +619,7 @@ begin // IF - case false (2 params) inc(Row); - Worksheet.WriteUTF8Text(Row, 0, '=IF(B1<>1; "correct")'); + Worksheet.WriteUTF8Text(Row, 0, '=IF(B1<>1,"correct")'); Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula( RPNCellValue('B1', RPNNumber(1, @@ -686,7 +697,7 @@ begin nil))); Worksheet.WriteNumber(Row, 2, pi); - if OUTPUT_FORMAT <> sfExcel2 then begin + if AFormat <> sfExcel2 then begin // Degrees inc(Row); value := pi/2; @@ -771,7 +782,7 @@ begin nil)))); 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 // sinh @@ -866,12 +877,12 @@ begin Worksheet.WriteNumber(Row, 2, ln(value)); // log to any basis - if OUTPUT_FORMAT <> sfExcel2 then begin + if AFormat <> sfExcel2 then begin // This test is not working in Excel 2. // Not clear if this is correct, need to debug later inc(Row); value := 256; - Worksheet.WriteUTF8Text(Row, 0, '=LOG(256;2)'); + Worksheet.WriteUTF8Text(Row, 0, '=LOG(256,2)'); Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula( RPNNumber(value, RPNNumber(2, @@ -909,7 +920,7 @@ begin // Round positive number to 1 decimal inc(Row); - Worksheet.WriteUTF8Text(Row, 0, '=ROUND($F$1;1)'); + Worksheet.WriteUTF8Text(Row, 0, '=ROUND($F$1,1)'); Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula( RPNCellValue('$F$1', RPNNumber(1, @@ -919,7 +930,7 @@ begin // Round negative number to 1 decimal inc(Row); - Worksheet.WriteUTF8Text(Row, 0, '=ROUND(G1;1)'); + Worksheet.WriteUTF8Text(Row, 0, '=ROUND(G1,1)'); Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula( RPNCellValue('G1', RPNNumber(1, @@ -1151,7 +1162,7 @@ begin // Cell information inc(Row); - Worksheet.WriteUTF8Text(Row, 0, '=CELL("Address", B80)'); + Worksheet.WriteUTF8Text(Row, 0, '=CELL("Address",B80)'); Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula( RPNString('address', RPNCellRef('B80', // note: CellRef instead of CellValue! @@ -1159,7 +1170,7 @@ begin nil))))); inc(Row); - Worksheet.WriteUTF8Text(Row, 0, '=CELL("Filename", B80)'); + Worksheet.WriteUTF8Text(Row, 0, '=CELL("Filename",B80)'); Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula( RPNString('filename', RPNCellRef('B80', // note: CellRef instead of CellValue! @@ -1167,7 +1178,7 @@ begin nil))))); inc(Row); - Worksheet.WriteUTF8Text(Row, 0, '=CELL("Row", B80)'); + Worksheet.WriteUTF8Text(Row, 0, '=CELL("Row",B80)'); Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula( RPNString('row', RPNCellRef('B80', // note: CellRef instead of CellValue! @@ -1175,7 +1186,7 @@ begin nil))))); inc(Row); - Worksheet.WriteUTF8Text(Row, 0, '=CELL("format", B80)'); + Worksheet.WriteUTF8Text(Row, 0, '=CELL("format",B80)'); Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula( RPNString('format', RPNCellRef('B80', // note: CellRef instead of CellValue! @@ -1183,7 +1194,7 @@ begin nil))))); inc(Row); - Worksheet.WriteUTF8Text(Row, 0, '=CELL("color", B80)'); + Worksheet.WriteUTF8Text(Row, 0, '=CELL("color",B80)'); Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula( RPNString('color', RPNCellRef('B80', // note: CellRef instead of CellValue! @@ -1200,7 +1211,7 @@ begin Worksheet.WriteNumber(Row, 2, cellB1); // General info - if OUTPUT_FORMAT <> sfExcel2 then begin + if AFormat <> sfExcel2 then begin inc(Row); Worksheet.WriteUTF8Text(Row, 0, '=INFO("osversion")'); Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula( @@ -1246,7 +1257,7 @@ begin Worksheet.WriteNumber(Row, 2, now); // Today - if OUTPUT_FORMAT <> sfExcel2 then begin + if AFormat <> sfExcel2 then begin inc(Row); Worksheet.WriteUTF8Text(Row, 0, '=TODAY()'); Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula( @@ -1276,9 +1287,9 @@ begin Worksheet.WriteNumber(Row, 2, EncodeDate(2014,1,25)); // DateDifference - if OUTPUT_FORMAT <> sfExcel2 then begin + if AFormat <> sfExcel2 then begin 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 !!! Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula( RPNString('2010-01-01', @@ -1413,7 +1424,7 @@ begin // Count - non-empty cells 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( RPNCellValue('$B$1', RPNCellValue('$C$1', @@ -1424,7 +1435,7 @@ begin // Count - with empty cells & alpha-numeric cells 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( RPNCellValue('$B$1', RPNCellValue('$C$1', @@ -1436,7 +1447,7 @@ begin // CountA - empty cells and constants 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( RPNCellValue('$B$1', RPNCellValue('$C$1', @@ -1447,10 +1458,10 @@ begin nil)))))))); Worksheet.WriteNumber(Row, 2, 7); // 7 non-empty values - if OUTPUT_FORMAT <> sfExcel2 then begin + if AFormat <> sfExcel2 then begin // CountIF inc(Row); - Worksheet.WriteUTF8Text(Row, 0, '=COUNTIF(A1:G1, "<=1")'); + Worksheet.WriteUTF8Text(Row, 0, '=COUNTIF(A1:G1,"<=1")'); Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula( RPNCellRange('A1:G1', RPNString('<=1', @@ -1474,7 +1485,7 @@ begin // Sum - non-empty cells 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( RPNCellValue('$B$1', RPNCellValue('$C$1', @@ -1483,10 +1494,10 @@ begin nil)))))); Worksheet.WriteNumber(Row, 2, cellB1+cellC1+cellD1+cellE1+cellF1); - if OUTPUT_FORMAT <> sfExcel2 then begin + if AFormat <> sfExcel2 then begin // SumIF inc(Row); - Worksheet.WriteUTF8Text(Row, 0, '=SUMIF(A1:G1, "<=1")'); + Worksheet.WriteUTF8Text(Row, 0, '=SUMIF(A1:G1,"<=1")'); Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula( RPNCellRange('A1:G1', RPNString('<=1', @@ -1500,7 +1511,7 @@ begin // Sum of squares 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( RPNCellValue('$B$1', RPNCellValue('$C$1', @@ -1512,7 +1523,7 @@ begin // Product 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( RPNCellValue('$B$1', RPNCellValue('$C$1', @@ -1523,7 +1534,7 @@ begin // Average - non-empty cells 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( RPNCellValue('$B$1', RPNCellValue('$C$1', @@ -1534,7 +1545,7 @@ begin // StdDev 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( RPNCellValue('$B$1', RPNCellValue('$C$1', @@ -1545,7 +1556,7 @@ begin // Population StdDev 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( RPNCellValue('$B$1', RPNCellValue('$C$1', @@ -1555,9 +1566,9 @@ begin Worksheet.WriteNumber(Row, 2, popnstddev([cellB1,cellC1,cellD1,cellE1,cellF1])); // Average deviation - if OUTPUT_FORMAT <> sfExcel2 then begin + if AFormat <> sfExcel2 then begin 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( RPNCellValue('$B$1', RPNCellValue('$C$1', @@ -1571,7 +1582,7 @@ begin // Variance 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( RPNCellValue('$B$1', RPNCellValue('$C$1', @@ -1582,7 +1593,7 @@ begin // Population variance 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( RPNCellValue('$B$1', RPNCellValue('$C$1', @@ -1593,7 +1604,7 @@ begin // Max 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( RPNCellValue('$B$1', RPNCellValue('$C$1', @@ -1604,7 +1615,7 @@ begin // Min 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( RPNCellValue('$B$1', RPNCellValue('$C$1', @@ -1614,9 +1625,9 @@ begin Worksheet.WriteNumber(Row, 2, MinValue([cellB1,cellC1,cellD1,cellE1,cellF1])); // Median - if OUTPUT_FORMAT <> sfExcel2 then begin + if AFormat <> sfExcel2 then begin 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( RPNCellValue('$B$1', RPNCellValue('$C$1', @@ -1627,9 +1638,9 @@ begin end; // Beta distribution - if OUTPUT_FORMAT <> sfExcel2 then begin + if AFormat <> sfExcel2 then begin 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( RPNNumber(3, RPNNumber(7.5, @@ -1642,9 +1653,9 @@ begin end; // Inverse beta function - if OUTPUT_FORMAT <> sfExcel2 then begin + if AFormat <> sfExcel2 then begin 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( RPNNumber(0.3, RPNNumber(7.5, @@ -1657,9 +1668,9 @@ begin end; // Binomial distribution - if OUTPUT_FORMAT <> sfExcel2 then begin + if AFormat <> sfExcel2 then begin 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( RPNNumber(3, RPNNumber(8, @@ -1671,9 +1682,9 @@ begin end; // Chi2 distribution - if OUTPUT_FORMAT <> sfExcel2 then begin + if AFormat <> sfExcel2 then begin inc(Row); - Worksheet.WriteUTF8Text(Row, 0, '=CHIDIST(3, 9)'); + Worksheet.WriteUTF8Text(Row, 0, '=CHIDIST(3,9)'); Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula( RPNNumber(3, RPNNumber(9, @@ -1683,9 +1694,9 @@ begin end; // Inverse of Chi2 distribution - if OUTPUT_FORMAT <> sfExcel2 then begin + if AFormat <> sfExcel2 then begin inc(Row); - Worksheet.WriteUTF8Text(Row, 0, '=CHIINV(0.3, 7)'); + Worksheet.WriteUTF8Text(Row, 0, '=CHIINV(0.3,7)'); Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula( RPNNumber(0.3, RPNNumber(7, @@ -1695,9 +1706,9 @@ begin end; // Permutations - if OUTPUT_FORMAT <> sfExcel2 then begin + if AFormat <> sfExcel2 then begin inc(Row); - Worksheet.WriteUTF8Text(Row, 0, '=PERMUT(21, 5)'); + Worksheet.WriteUTF8Text(Row, 0, '=PERMUT(21,5)'); Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula( RPNNumber(21, RPNNumber(5, @@ -1707,9 +1718,9 @@ begin end; // Poisson distribution - if OUTPUT_FORMAT <> sfExcel2 then begin + if AFormat <> sfExcel2 then begin inc(Row); - Worksheet.WriteUTF8Text(Row, 0, '=POISSON(1400, 1500, TRUE)'); + Worksheet.WriteUTF8Text(Row, 0, '=POISSON(1400,1500,TRUE)'); Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula( RPNNumber(1400, RPNNumber(1500, @@ -1731,7 +1742,7 @@ begin // the month, each month, for 2 years. // according to: www.techonthenet.com/excel/formulas/fv.php 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( RPNNumber(3.5, RPNFunc(fekPERCENT, @@ -1752,7 +1763,7 @@ begin // according to: www.techonthenet.com/excel/formulas/pv.php // Note the missing argument! 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( RPNNumber(3.5, RPNFunc(fekPercent, @@ -1772,7 +1783,7 @@ begin // 2 years. All payments are made at the end of the period. // Adapted from //www.techonthenet.com/excel/formulas/rate.php 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( RPNNumber(2, RPNNumber(12, @@ -1791,7 +1802,7 @@ begin // 3.5% annually. Payments are due at the end of the period. // Adapted from //www.techonthenet.com/excel/formulas/nper.php 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( RPNNumber(3.5, RPNFunc(fekPERCENT, @@ -1808,7 +1819,7 @@ begin // of the period. // Adapted from //www.techonthenet.com/excel/formulas/pmt.php 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( RPNNumber(3.5, RPNFunc(fekPERCENT, @@ -1852,7 +1863,7 @@ begin // Left part of string 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( RPNString(SHelloWorld, RPNNumber(3, @@ -1862,7 +1873,7 @@ begin // Mid part of string 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( RPNString(SHelloWorld, RPNNumber(4, @@ -1873,7 +1884,7 @@ begin // Right part of string 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( RPNString(SHelloWorld, RPNNumber(3, @@ -1919,7 +1930,7 @@ begin // replace 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( RPNString(SHelloWorld, RPNNumber(7, @@ -1933,7 +1944,7 @@ begin // Note: the function can have an optional parameter. Therefore, you have // to specify the actual parameter count. 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( RPNString(SHelloWorld, RPNString('l', @@ -1994,3 +2005,5 @@ begin Worksheet.WriteUTF8Text(Row, 2, 'Error #N/A'); *) end; + +end. diff --git a/components/fpspreadsheet/tests/spreadtestgui.lpi b/components/fpspreadsheet/tests/spreadtestgui.lpi index f3f990a08..f8a97486a 100644 --- a/components/fpspreadsheet/tests/spreadtestgui.lpi +++ b/components/fpspreadsheet/tests/spreadtestgui.lpi @@ -78,7 +78,7 @@ - + @@ -139,6 +139,16 @@ + + + + + + + + + + diff --git a/components/fpspreadsheet/tests/spreadtestgui.lpr b/components/fpspreadsheet/tests/spreadtestgui.lpr index ae6ee071e..495bbf073 100644 --- a/components/fpspreadsheet/tests/spreadtestgui.lpr +++ b/components/fpspreadsheet/tests/spreadtestgui.lpr @@ -5,7 +5,7 @@ program spreadtestgui; uses Interfaces, Forms, GuiTestRunner, datetests, stringtests, numberstests, manualtests, testsutility, internaltests, formattests, colortests, fonttests, - optiontests, numformatparsertests; + optiontests, numformatparsertests, formulatests, rpnFormulaUnit; begin Application.Initialize;