aboutsummaryrefslogtreecommitdiffstats
path: root/src/testcases/org
diff options
context:
space:
mode:
authorYegor Kozlov <yegor@apache.org>2008-12-23 16:19:07 +0000
committerYegor Kozlov <yegor@apache.org>2008-12-23 16:19:07 +0000
commita2d45f64543e394a82399e3dc4533e89b5c8663b (patch)
tree0b41a2d22954cc0acad69cf090dd2b4ffa67688a /src/testcases/org
parent27f601e40e6bc2a5ac3eb759580106a569cbc0dc (diff)
downloadpoi-a2d45f64543e394a82399e3dc4533e89b5c8663b.tar.gz
poi-a2d45f64543e394a82399e3dc4533e89b5c8663b.zip
fixed formula parser to correctly resolve sheet-level names
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@729028 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'src/testcases/org')
-rw-r--r--src/testcases/org/apache/poi/hssf/model/TestFormulaParser.java16
-rw-r--r--src/testcases/org/apache/poi/hssf/record/TestCFRuleRecord.java14
-rw-r--r--src/testcases/org/apache/poi/hssf/record/aggregates/TestCFRecordsAggregate.java16
-rw-r--r--src/testcases/org/apache/poi/hssf/usermodel/TestFormulas.java61
-rw-r--r--src/testcases/org/apache/poi/hssf/usermodel/TestNamedRange.java2
5 files changed, 84 insertions, 25 deletions
diff --git a/src/testcases/org/apache/poi/hssf/model/TestFormulaParser.java b/src/testcases/org/apache/poi/hssf/model/TestFormulaParser.java
index c8a46a8dde..b951ae3b62 100644
--- a/src/testcases/org/apache/poi/hssf/model/TestFormulaParser.java
+++ b/src/testcases/org/apache/poi/hssf/model/TestFormulaParser.java
@@ -899,11 +899,11 @@ public final class TestFormulaParser extends TestCase {
wb.setSheetName(0, "Sheet1");
cell.setCellFormula("Sheet1!B$4:Sheet1!$C1"); // explicit range ':' operator
- assertEquals("Sheet1!B$4:Sheet1!$C1", cell.getCellFormula());
+ assertEquals("Sheet1!B$4:Sheet1!$C1", cell.getCellFormula());
cell.setCellFormula("Sheet1!B$4:$C1"); // plain area ref
assertEquals("Sheet1!B1:$C$4", cell.getCellFormula()); // note - area ref is normalised
-
+
cell.setCellFormula("Sheet1!$C1...B$4"); // different syntax for plain area ref
assertEquals("Sheet1!B1:$C$4", cell.getCellFormula());
@@ -922,7 +922,7 @@ public final class TestFormulaParser extends TestCase {
assertEquals("'true'!B2", cell.getCellFormula());
}
-
+
public void testParseExternalWorkbookReference() {
HSSFWorkbook wbA = HSSFTestDataSamples.openSampleWorkbook("multibookFormulaA.xls");
HSSFCell cell = wbA.getSheetAt(0).getRow(0).getCell(0);
@@ -931,15 +931,15 @@ public final class TestFormulaParser extends TestCase {
assertEquals("[multibookFormulaB.xls]BSheet1!B1", cell.getCellFormula());
Ptg[] expectedPtgs = FormulaExtractor.getPtgs(cell);
confirmSingle3DRef(expectedPtgs, 1);
-
+
// now try (re-)parsing the formula
Ptg[] actualPtgs = HSSFFormulaParser.parse("[multibookFormulaB.xls]BSheet1!B1", wbA);
confirmSingle3DRef(actualPtgs, 1); // externalSheetIndex 1 -> BSheet1
-
+
// try parsing a formula pointing to a different external sheet
Ptg[] otherPtgs = HSSFFormulaParser.parse("[multibookFormulaB.xls]AnotherSheet!B1", wbA);
confirmSingle3DRef(otherPtgs, 0); // externalSheetIndex 0 -> AnotherSheet
-
+
// try setting the same formula in a cell
cell.setCellFormula("[multibookFormulaB.xls]AnotherSheet!B1");
assertEquals("[multibookFormulaB.xls]AnotherSheet!B1", cell.getCellFormula());
@@ -950,13 +950,13 @@ public final class TestFormulaParser extends TestCase {
assertEquals(Ref3DPtg.class, ptg0.getClass());
assertEquals(expectedExternSheetIndex, ((Ref3DPtg)ptg0).getExternSheetIndex());
}
-
+
public void testUnion() {
String formula = "Sheet1!$B$2:$C$3,OFFSET(Sheet1!$E$2:$E$4,1,Sheet1!$A$1),Sheet1!$D$6";
HSSFWorkbook wb = new HSSFWorkbook();
wb.createSheet("Sheet1");
Ptg[] ptgs = FormulaParser.parse(formula, HSSFEvaluationWorkbook.create(wb));
-
+
Class[] expectedClasses = {
// TODO - AttrPtg.class, // Excel prepends this
MemFuncPtg.class,
diff --git a/src/testcases/org/apache/poi/hssf/record/TestCFRuleRecord.java b/src/testcases/org/apache/poi/hssf/record/TestCFRuleRecord.java
index 1e54031f91..744c692f02 100644
--- a/src/testcases/org/apache/poi/hssf/record/TestCFRuleRecord.java
+++ b/src/testcases/org/apache/poi/hssf/record/TestCFRuleRecord.java
@@ -28,6 +28,7 @@ import org.apache.poi.hssf.record.formula.Ptg;
import org.apache.poi.hssf.record.formula.RefNPtg;
import org.apache.poi.hssf.record.formula.RefPtg;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
+import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.util.LittleEndian;
import org.apache.poi.ss.formula.Formula;
@@ -43,20 +44,21 @@ public final class TestCFRuleRecord extends TestCase
public void testConstructors ()
{
HSSFWorkbook workbook = new HSSFWorkbook();
+ HSSFSheet sheet = workbook.createSheet();
- CFRuleRecord rule1 = CFRuleRecord.create(workbook, "7");
+ CFRuleRecord rule1 = CFRuleRecord.create(sheet, "7");
assertEquals(CFRuleRecord.CONDITION_TYPE_FORMULA, rule1.getConditionType());
assertEquals(ComparisonOperator.NO_COMPARISON, rule1.getComparisonOperation());
assertNotNull(rule1.getParsedExpression1());
assertSame(Ptg.EMPTY_PTG_ARRAY, rule1.getParsedExpression2());
- CFRuleRecord rule2 = CFRuleRecord.create(workbook, ComparisonOperator.BETWEEN, "2", "5");
+ CFRuleRecord rule2 = CFRuleRecord.create(sheet, ComparisonOperator.BETWEEN, "2", "5");
assertEquals(CFRuleRecord.CONDITION_TYPE_CELL_VALUE_IS, rule2.getConditionType());
assertEquals(ComparisonOperator.BETWEEN, rule2.getComparisonOperation());
assertNotNull(rule2.getParsedExpression1());
assertNotNull(rule2.getParsedExpression2());
- CFRuleRecord rule3 = CFRuleRecord.create(workbook, ComparisonOperator.EQUAL, null, null);
+ CFRuleRecord rule3 = CFRuleRecord.create(sheet, ComparisonOperator.EQUAL, null, null);
assertEquals(CFRuleRecord.CONDITION_TYPE_CELL_VALUE_IS, rule3.getConditionType());
assertEquals(ComparisonOperator.EQUAL, rule3.getComparisonOperation());
assertSame(Ptg.EMPTY_PTG_ARRAY, rule3.getParsedExpression2());
@@ -66,7 +68,8 @@ public final class TestCFRuleRecord extends TestCase
public void testCreateCFRuleRecord ()
{
HSSFWorkbook workbook = new HSSFWorkbook();
- CFRuleRecord record = CFRuleRecord.create(workbook, "7");
+ HSSFSheet sheet = workbook.createSheet();
+ CFRuleRecord record = CFRuleRecord.create(sheet, "7");
testCFRuleRecord(record);
// Serialize
@@ -306,7 +309,8 @@ public final class TestCFRuleRecord extends TestCase
public void testWrite() {
HSSFWorkbook workbook = new HSSFWorkbook();
- CFRuleRecord rr = CFRuleRecord.create(workbook, ComparisonOperator.BETWEEN, "5", "10");
+ HSSFSheet sheet = workbook.createSheet();
+ CFRuleRecord rr = CFRuleRecord.create(sheet, ComparisonOperator.BETWEEN, "5", "10");
PatternFormatting patternFormatting = new PatternFormatting();
patternFormatting.setFillPattern(PatternFormatting.BRICKS);
diff --git a/src/testcases/org/apache/poi/hssf/record/aggregates/TestCFRecordsAggregate.java b/src/testcases/org/apache/poi/hssf/record/aggregates/TestCFRecordsAggregate.java
index b3c864cdb8..1e153bc45f 100644
--- a/src/testcases/org/apache/poi/hssf/record/aggregates/TestCFRecordsAggregate.java
+++ b/src/testcases/org/apache/poi/hssf/record/aggregates/TestCFRecordsAggregate.java
@@ -31,6 +31,7 @@ import org.apache.poi.hssf.record.CFRuleRecord;
import org.apache.poi.hssf.record.RecordFactory;
import org.apache.poi.hssf.record.CFRuleRecord.ComparisonOperator;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
+import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.util.LittleEndian;
@@ -46,11 +47,13 @@ public final class TestCFRecordsAggregate extends TestCase
public void testCFRecordsAggregate()
{
HSSFWorkbook workbook = new HSSFWorkbook();
- List recs = new ArrayList();
+ HSSFSheet sheet = workbook.createSheet();
+
+ List recs = new ArrayList();
CFHeaderRecord header = new CFHeaderRecord();
- CFRuleRecord rule1 = CFRuleRecord.create(workbook, "7");
- CFRuleRecord rule2 = CFRuleRecord.create(workbook, ComparisonOperator.BETWEEN, "2", "5");
- CFRuleRecord rule3 = CFRuleRecord.create(workbook, ComparisonOperator.GE, "100", null);
+ CFRuleRecord rule1 = CFRuleRecord.create(sheet, "7");
+ CFRuleRecord rule2 = CFRuleRecord.create(sheet, ComparisonOperator.BETWEEN, "2", "5");
+ CFRuleRecord rule3 = CFRuleRecord.create(sheet, ComparisonOperator.GE, "100", null);
header.setNumberOfConditionalFormats(3);
CellRangeAddress[] cellRanges = {
new CellRangeAddress(0,1,0,0),
@@ -107,13 +110,14 @@ public final class TestCFRecordsAggregate extends TestCase
*/
public void testNRules() {
HSSFWorkbook workbook = new HSSFWorkbook();
+ HSSFSheet sheet = workbook.createSheet();
CellRangeAddress[] cellRanges = {
new CellRangeAddress(0,1,0,0),
new CellRangeAddress(0,1,2,2),
};
CFRuleRecord[] rules = {
- CFRuleRecord.create(workbook, "7"),
- CFRuleRecord.create(workbook, ComparisonOperator.BETWEEN, "2", "5"),
+ CFRuleRecord.create(sheet, "7"),
+ CFRuleRecord.create(sheet, ComparisonOperator.BETWEEN, "2", "5"),
};
CFRecordsAggregate agg = new CFRecordsAggregate(cellRanges, rules);
byte[] serializedRecord = new byte[agg.getRecordSize()];
diff --git a/src/testcases/org/apache/poi/hssf/usermodel/TestFormulas.java b/src/testcases/org/apache/poi/hssf/usermodel/TestFormulas.java
index 03f47d6811..c38a555edd 100644
--- a/src/testcases/org/apache/poi/hssf/usermodel/TestFormulas.java
+++ b/src/testcases/org/apache/poi/hssf/usermodel/TestFormulas.java
@@ -25,8 +25,12 @@ import java.util.Date;
import junit.framework.TestCase;
import org.apache.poi.hssf.HSSFTestDataSamples;
+import org.apache.poi.hssf.model.HSSFFormulaParser;
+import org.apache.poi.hssf.record.formula.Ptg;
+import org.apache.poi.hssf.record.formula.NamePtg;
import org.apache.poi.hssf.util.CellReference;
import org.apache.poi.util.TempFile;
+import org.apache.poi.ss.formula.FormulaType;
/**
* @author Andrew C. Oliver (acoliver at apache dot org)
@@ -182,11 +186,11 @@ public final class TestFormulas extends TestCase {
// don't know how to check correct result .. for the moment, we just verify that the file can be read.
for (int x = 1; x < Short.MAX_VALUE && x > 0; x=(short)(x*2)) {
- HSSFRow r = s.getRow(x);
+ HSSFRow r = s.getRow(x);
for (int y = 1; y < 256 && y > 0; y=(short)(y+2)) {
- HSSFCell c = r.getCell(y);
+ HSSFCell c = r.getCell(y);
assertTrue("got a formula",c.getCellFormula()!=null);
assertTrue("loop Formula is as expected "+x+"."+y+operator+y+"."+x+"!="+c.getCellFormula(),(
@@ -535,9 +539,9 @@ public final class TestFormulas extends TestCase {
public void testAbsRefs() {
HSSFWorkbook wb = new HSSFWorkbook();
- HSSFSheet s = wb.createSheet();
- HSSFRow r;
- HSSFCell c;
+ HSSFSheet s = wb.createSheet();
+ HSSFRow r;
+ HSSFCell c;
r = s.createRow(0);
c = r.createCell(0);
@@ -884,4 +888,51 @@ public final class TestFormulas extends TestCase {
assertEquals("DZ2*2", wb.getSheetAt(0).getRow(1).getCell(128).toString());
assertEquals("B32770*2", wb.getSheetAt(0).getRow(32768).getCell(1).toString());
}
+
+ /**
+ * Test creation / evaluation of formulas with sheet-level names
+ */
+ public void testSheetLevelFormulas(){
+ HSSFWorkbook wb = new HSSFWorkbook();
+
+ HSSFRow row;
+ HSSFSheet sh1 = wb.createSheet("Sheet1");
+ HSSFName nm1 = wb.createName();
+ nm1.setNameName("sales_1");
+ nm1.setSheetIndex(0);
+ nm1.setRefersToFormula("Sheet1!$A$1");
+ row = sh1.createRow(0);
+ row.createCell(0).setCellValue(3);
+ row.createCell(1).setCellFormula("sales_1");
+ row.createCell(2).setCellFormula("sales_1*2");
+
+
+ HSSFSheet sh2 = wb.createSheet("Sheet2");
+ HSSFName nm2 = wb.createName();
+ nm2.setNameName("sales_1");
+ nm2.setSheetIndex(1);
+ nm2.setRefersToFormula("Sheet2!$A$1");
+
+ row = sh2.createRow(0);
+ row.createCell(0).setCellValue(5);
+ row.createCell(1).setCellFormula("sales_1");
+ row.createCell(2).setCellFormula("sales_1*3");
+
+ //check that NamePtg refers to the correct NameRecord
+ Ptg[] ptgs1 = HSSFFormulaParser.parse("sales_1", wb, FormulaType.CELL, 0);
+ NamePtg nPtg1 = (NamePtg)ptgs1[0];
+ assertSame(nm1, wb.getNameAt(nPtg1.getIndex()));
+
+ Ptg[] ptgs2 = HSSFFormulaParser.parse("sales_1", wb, FormulaType.CELL, 1);
+ NamePtg nPtg2 = (NamePtg)ptgs2[0];
+ assertSame(nm2, wb.getNameAt(nPtg2.getIndex()));
+
+ //check that the formula evaluator returns the correct result
+ HSSFFormulaEvaluator evaluator = new HSSFFormulaEvaluator(wb);
+ assertEquals(3.0, evaluator.evaluate(sh1.getRow(0).getCell(1)).getNumberValue());
+ assertEquals(6.0, evaluator.evaluate(sh1.getRow(0).getCell(2)).getNumberValue());
+
+ assertEquals(5.0, evaluator.evaluate(sh2.getRow(0).getCell(1)).getNumberValue());
+ assertEquals(15.0, evaluator.evaluate(sh2.getRow(0).getCell(2)).getNumberValue());
+ }
}
diff --git a/src/testcases/org/apache/poi/hssf/usermodel/TestNamedRange.java b/src/testcases/org/apache/poi/hssf/usermodel/TestNamedRange.java
index 4ad6b57932..a0ef4fabc9 100644
--- a/src/testcases/org/apache/poi/hssf/usermodel/TestNamedRange.java
+++ b/src/testcases/org/apache/poi/hssf/usermodel/TestNamedRange.java
@@ -543,7 +543,7 @@ public final class TestNamedRange extends TestCase {
HSSFWorkbook wb = new HSSFWorkbook();
wb.createSheet("CSCO");
- Ptg[] ptgs = HSSFFormulaParser.parse("CSCO!$E$71", wb, FormulaType.NAMEDRANGE);
+ Ptg[] ptgs = HSSFFormulaParser.parse("CSCO!$E$71", wb, FormulaType.NAMEDRANGE, 0);
for (int i = 0; i < ptgs.length; i++) {
assertEquals('R', ptgs[i].getRVAType());
}