Bug #44733 - DPRODUCT function should be index 189, not 191
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@643625 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
a3af5d5ddc
commit
e6fb5e7d7b
|
@ -143,8 +143,8 @@
|
||||||
169 COUNTA 0 30 V R
|
169 COUNTA 0 30 V R
|
||||||
183 PRODUCT 0 30 V R
|
183 PRODUCT 0 30 V R
|
||||||
184 FACT 1 1 V V
|
184 FACT 1 1 V V
|
||||||
|
189 DPRODUCT 3 3 V R R R
|
||||||
190 ISNONTEXT 1 1 V V
|
190 ISNONTEXT 1 1 V V
|
||||||
191 DPRODUCT 3 3 V R R R
|
|
||||||
193 STDEVP 1 30 V R
|
193 STDEVP 1 30 V R
|
||||||
194 VARP 1 30 V R
|
194 VARP 1 30 V R
|
||||||
195 DSTDEVP 3 3 V R R R
|
195 DSTDEVP 3 3 V R R R
|
||||||
|
|
Binary file not shown.
|
@ -29,7 +29,7 @@ import junit.framework.TestSuite;
|
||||||
*
|
*
|
||||||
* @author Josh Micich
|
* @author Josh Micich
|
||||||
*/
|
*/
|
||||||
public class AllFormulaTests {
|
public final class AllFormulaTests {
|
||||||
|
|
||||||
public static Test suite() {
|
public static Test suite() {
|
||||||
TestSuite result = new TestSuite(AllFormulaTests.class.getName());
|
TestSuite result = new TestSuite(AllFormulaTests.class.getName());
|
||||||
|
@ -50,7 +50,6 @@ public class AllFormulaTests {
|
||||||
result.addTestSuite(TestReferencePtg.class);
|
result.addTestSuite(TestReferencePtg.class);
|
||||||
result.addTestSuite(TestSheetNameFormatter.class);
|
result.addTestSuite(TestSheetNameFormatter.class);
|
||||||
result.addTestSuite(TestUnionPtg.class);
|
result.addTestSuite(TestUnionPtg.class);
|
||||||
result.addTest(AllFormulaFunctionTests.suite());
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,6 +27,9 @@ import org.apache.poi.hssf.record.formula.FuncPtg;
|
||||||
import org.apache.poi.hssf.record.formula.FuncVarPtg;
|
import org.apache.poi.hssf.record.formula.FuncVarPtg;
|
||||||
import org.apache.poi.hssf.record.formula.Ptg;
|
import org.apache.poi.hssf.record.formula.Ptg;
|
||||||
/**
|
/**
|
||||||
|
* Tests parsing of some built-in functions that were not properly
|
||||||
|
* registered in POI as bug #44675, #44733 (March/April 2008).
|
||||||
|
*
|
||||||
* @author Josh Micich
|
* @author Josh Micich
|
||||||
*/
|
*/
|
||||||
public final class TestParseMissingBuiltInFuncs extends TestCase {
|
public final class TestParseMissingBuiltInFuncs extends TestCase {
|
||||||
|
@ -39,6 +42,7 @@ public final class TestParseMissingBuiltInFuncs extends TestCase {
|
||||||
Ptg[] ptgs = parse(formula);
|
Ptg[] ptgs = parse(formula);
|
||||||
Ptg ptgF = ptgs[ptgs.length-1]; // func is last RPN token in all these formulas
|
Ptg ptgF = ptgs[ptgs.length-1]; // func is last RPN token in all these formulas
|
||||||
|
|
||||||
|
// Check critical things in the Ptg array encoding.
|
||||||
if(!(ptgF instanceof AbstractFunctionPtg)) {
|
if(!(ptgF instanceof AbstractFunctionPtg)) {
|
||||||
throw new RuntimeException("function token missing");
|
throw new RuntimeException("function token missing");
|
||||||
}
|
}
|
||||||
|
@ -47,11 +51,15 @@ public final class TestParseMissingBuiltInFuncs extends TestCase {
|
||||||
throw new AssertionFailedError("Failed to recognise built-in function in formula '"
|
throw new AssertionFailedError("Failed to recognise built-in function in formula '"
|
||||||
+ formula + "'");
|
+ formula + "'");
|
||||||
}
|
}
|
||||||
|
|
||||||
assertEquals(expPtgArraySize, ptgs.length);
|
assertEquals(expPtgArraySize, ptgs.length);
|
||||||
assertEquals(funcIx, func.getFunctionIndex());
|
assertEquals(funcIx, func.getFunctionIndex());
|
||||||
Class expCls = isVarArgFunc ? FuncVarPtg.class : FuncPtg.class;
|
Class expCls = isVarArgFunc ? FuncVarPtg.class : FuncPtg.class;
|
||||||
assertEquals(expCls, ptgF.getClass());
|
assertEquals(expCls, ptgF.getClass());
|
||||||
|
|
||||||
|
// check that parsed Ptg array converts back to formula text OK
|
||||||
|
Workbook book = Workbook.createWorkbook();
|
||||||
|
String reRenderedFormula = FormulaParser.toFormulaString(book, ptgs);
|
||||||
|
assertEquals(formula, reRenderedFormula);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testDatedif() {
|
public void testDatedif() {
|
||||||
|
@ -76,4 +84,7 @@ public final class TestParseMissingBuiltInFuncs extends TestCase {
|
||||||
public void testIsnontext() {
|
public void testIsnontext() {
|
||||||
confirmFunc("ISNONTEXT(\"abc\")", 2, false, 190);
|
confirmFunc("ISNONTEXT(\"abc\")", 2, false, 190);
|
||||||
}
|
}
|
||||||
|
public void testDproduct() {
|
||||||
|
confirmFunc("DPRODUCT(C1:E5,\"HarvestYield\",G1:H2)", 4, false, 189);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,7 +21,9 @@ import java.io.File;
|
||||||
import java.io.FileInputStream;
|
import java.io.FileInputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
|
import java.lang.reflect.InvocationTargetException;
|
||||||
|
|
||||||
|
import org.apache.poi.hssf.record.RecordFormatException;
|
||||||
import org.apache.poi.hssf.usermodel.HSSFSheet;
|
import org.apache.poi.hssf.usermodel.HSSFSheet;
|
||||||
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
|
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
|
||||||
|
|
||||||
|
@ -29,24 +31,31 @@ import junit.framework.AssertionFailedError;
|
||||||
import junit.framework.TestCase;
|
import junit.framework.TestCase;
|
||||||
/**
|
/**
|
||||||
* Tests reading from a sample spreadsheet some built-in functions that were not properly
|
* Tests reading from a sample spreadsheet some built-in functions that were not properly
|
||||||
* registered in POI as bug #44675 (March 2008).
|
* registered in POI as bug #44675, #44733 (March/April 2008).
|
||||||
*
|
*
|
||||||
* @author Josh Micich
|
* @author Josh Micich
|
||||||
*/
|
*/
|
||||||
public final class TestReadMissingBuiltInFuncs extends TestCase {
|
public final class TestReadMissingBuiltInFuncs extends TestCase {
|
||||||
|
|
||||||
private HSSFSheet sht;
|
/**
|
||||||
|
* This spreadsheet has examples of calls to the interesting built-in functions in cells A1:A7
|
||||||
|
*/
|
||||||
|
private static final String SAMPLE_SPREADSHEET_FILE_NAME = "missingFuncs44675.xls";
|
||||||
|
private static HSSFSheet _sheet;
|
||||||
|
|
||||||
protected void setUp() {
|
private static HSSFSheet getSheet() {
|
||||||
String cwd = System.getProperty("HSSF.testdata.path");
|
if (_sheet == null) {
|
||||||
HSSFWorkbook wb;
|
String cwd = System.getProperty("HSSF.testdata.path");
|
||||||
try {
|
HSSFWorkbook wb;
|
||||||
InputStream is = new FileInputStream(new File(cwd, "missingFuncs44675.xls"));
|
try {
|
||||||
wb = new HSSFWorkbook(is);
|
InputStream is = new FileInputStream(new File(cwd, SAMPLE_SPREADSHEET_FILE_NAME));
|
||||||
} catch (IOException e) {
|
wb = new HSSFWorkbook(is);
|
||||||
throw new RuntimeException(e);
|
} catch (IOException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
_sheet = wb.getSheetAt(0);
|
||||||
}
|
}
|
||||||
sht = wb.getSheetAt(0);
|
return _sheet;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testDatedif() {
|
public void testDatedif() {
|
||||||
|
@ -128,9 +137,30 @@ public final class TestReadMissingBuiltInFuncs extends TestCase {
|
||||||
}
|
}
|
||||||
assertEquals("ISNONTEXT(\"abc\")", formula);
|
assertEquals("ISNONTEXT(\"abc\")", formula);
|
||||||
}
|
}
|
||||||
|
public void testDproduct() {
|
||||||
|
|
||||||
|
String formula = getCellFormula(6);
|
||||||
|
assertEquals("DPRODUCT(C1:E5,\"HarvestYield\",G1:H2)", formula);
|
||||||
|
}
|
||||||
|
|
||||||
private String getCellFormula(int rowIx) {
|
private String getCellFormula(int rowIx) {
|
||||||
String result = sht.getRow(rowIx).getCell((short)0).getCellFormula();
|
HSSFSheet sheet;
|
||||||
|
try {
|
||||||
|
sheet = getSheet();
|
||||||
|
} catch (RecordFormatException e) {
|
||||||
|
if(e.getCause() instanceof InvocationTargetException) {
|
||||||
|
InvocationTargetException ite = (InvocationTargetException) e.getCause();
|
||||||
|
if(ite.getTargetException() instanceof RuntimeException) {
|
||||||
|
RuntimeException re = (RuntimeException) ite.getTargetException();
|
||||||
|
if(re.getMessage().equals("Invalid built-in function index (189)")) {
|
||||||
|
throw afe("DPRODUCT() registered with wrong index");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// some other unexpected error
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
String result = sheet.getRow(rowIx).getCell((short)0).getCellFormula();
|
||||||
if (false) {
|
if (false) {
|
||||||
System.err.println(result);
|
System.err.println(result);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue