From e4b9e734f7e99b8ab41334141e38cde8f08f61b5 Mon Sep 17 00:00:00 2001 From: Nick Burch Date: Fri, 25 Jan 2008 16:15:49 +0000 Subject: [PATCH] Don't swap AreaPtg references from relative to absolute, by correctly processing the fields. Patch from bug #44293 git-svn-id: https://svn.eu.apache.org/repos/asf/poi/trunk@615255 13f79535-47bb-0310-9956-ffa450edef68 --- src/documentation/content/xdocs/changes.xml | 1 + src/documentation/content/xdocs/status.xml | 1 + .../apache/poi/hssf/record/formula/AreaPtg.java | 14 +-- .../poi/hssf/record/formula/TestAreaPtg.java | 114 +++++++++++++++++++++ 4 files changed, 123 insertions(+), 7 deletions(-) create mode 100644 src/testcases/org/apache/poi/hssf/record/formula/TestAreaPtg.java diff --git a/src/documentation/content/xdocs/changes.xml b/src/documentation/content/xdocs/changes.xml index f11d64a..b1d8184 100644 --- a/src/documentation/content/xdocs/changes.xml +++ b/src/documentation/content/xdocs/changes.xml @@ -36,6 +36,7 @@ + 44293 - Avoid swapping AreaPtgs from relative to absolute 44292 - Correctly process the last paragraph in a word file 44254 - Avoid some unread byte warnings, and properly understand DVALRecord Add another formula evaluation method, evaluateFormulaCell(cell), which will re-calculate the value for a formula, without affecting the formula itself. diff --git a/src/documentation/content/xdocs/status.xml b/src/documentation/content/xdocs/status.xml index 73375a3..8221954 100644 --- a/src/documentation/content/xdocs/status.xml +++ b/src/documentation/content/xdocs/status.xml @@ -33,6 +33,7 @@ + 44293 - Avoid swapping AreaPtgs from relative to absolute 44292 - Correctly process the last paragraph in a word file 44254 - Avoid some unread byte warnings, and properly understand DVALRecord Add another formula evaluation method, evaluateFormulaCell(cell), which will re-calculate the value for a formula, without affecting the formula itself. diff --git a/src/java/org/apache/poi/hssf/record/formula/AreaPtg.java b/src/java/org/apache/poi/hssf/record/formula/AreaPtg.java index 32579a6..908c8d5 100644 --- a/src/java/org/apache/poi/hssf/record/formula/AreaPtg.java +++ b/src/java/org/apache/poi/hssf/record/formula/AreaPtg.java @@ -43,9 +43,9 @@ public class AreaPtg private short field_3_first_column; private short field_4_last_column; - private BitField rowRelative = BitFieldFactory.getInstance(0x8000); - private BitField colRelative = BitFieldFactory.getInstance(0x4000); - private BitField column = BitFieldFactory.getInstance(0x3FFF); + private final static BitField rowRelative = BitFieldFactory.getInstance(0x8000); + private final static BitField colRelative = BitFieldFactory.getInstance(0x4000); + private final static BitField columnMask = BitFieldFactory.getInstance(0x3FFF); protected AreaPtg() { //Required for clone methods @@ -157,7 +157,7 @@ public class AreaPtg */ public short getFirstColumn() { - return column.getShortValue(field_3_first_column); + return columnMask.getShortValue(field_3_first_column); } /** @@ -204,7 +204,7 @@ public class AreaPtg */ public void setFirstColumn(short column) { - field_3_first_column = column; // fixme + field_3_first_column=columnMask.setShortValue(field_3_first_column, column); } /** @@ -220,7 +220,7 @@ public class AreaPtg */ public short getLastColumn() { - return column.getShortValue(field_4_last_column); + return columnMask.getShortValue(field_4_last_column); } /** @@ -269,7 +269,7 @@ public class AreaPtg */ public void setLastColumn(short column) { - field_4_last_column = column; // fixme + field_4_last_column=columnMask.setShortValue(field_4_last_column, column); } /** diff --git a/src/testcases/org/apache/poi/hssf/record/formula/TestAreaPtg.java b/src/testcases/org/apache/poi/hssf/record/formula/TestAreaPtg.java new file mode 100644 index 0000000..522a5bc --- /dev/null +++ b/src/testcases/org/apache/poi/hssf/record/formula/TestAreaPtg.java @@ -0,0 +1,114 @@ + +/* ==================================================================== + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +==================================================================== */ + +package org.apache.poi.hssf.record.formula; + +import junit.framework.TestCase; + +import org.apache.poi.hssf.model.FormulaParser; + +/** + * Tests for {@link AreaPtg}. + * + * @author Dmitriy Kumshayev + */ +public class TestAreaPtg extends TestCase +{ + + AreaPtg relative; + AreaPtg absolute; + + protected void setUp() throws Exception + { + super.setUp(); + short firstRow=5; + short lastRow=13; + short firstCol=7; + short lastCol=17; + relative = new AreaPtg(firstRow,lastRow,firstCol,lastCol,true,true,true,true); + absolute = new AreaPtg(firstRow,lastRow,firstCol,lastCol,false,false,false,false); + } + + public void testSetColumnsAbsolute() + { + resetColumns(absolute); + validateReference(true, absolute); + } + public void testSetColumnsRelative() + { + resetColumns(relative); + validateReference(false, relative); + } + + private void validateReference(boolean abs, AreaPtg ref) + { + assertEquals("First column reference is not "+(abs?"absolute":"relative"),abs,!ref.isFirstColRelative()); + assertEquals("Last column reference is not "+(abs?"absolute":"relative"),abs,!ref.isLastColRelative()); + assertEquals("First row reference is not "+(abs?"absolute":"relative"),abs,!ref.isFirstRowRelative()); + assertEquals("Last row reference is not "+(abs?"absolute":"relative"),abs,!ref.isLastRowRelative()); + } + + + public void resetColumns(AreaPtg aptg) + { + short fc = aptg.getFirstColumn(); + short lc = aptg.getLastColumn(); + aptg.setFirstColumn(fc); + aptg.setLastColumn(lc); + assertEquals(fc , aptg.getFirstColumn() ); + assertEquals(lc , aptg.getLastColumn() ); + } + + public void testFormulaParser() + { + String formula1="SUM($E$5:$E$6)"; + String expectedFormula1="SUM($F$5:$F$6)"; + String newFormula1 = shiftAllColumnsBy1(formula1); + assertEquals("Absolute references changed", expectedFormula1, newFormula1); + + String formula2="SUM(E5:E6)"; + String expectedFormula2="SUM(F5:F6)"; + String newFormula2 = shiftAllColumnsBy1(formula2); + assertEquals("Relative references changed", expectedFormula2, newFormula2); + } + + private String shiftAllColumnsBy1(String formula) + { + int letUsShiftColumn1By1Column=1; + + FormulaParser parser = new FormulaParser(formula,null); + parser.parse(); + + final Ptg[] ptgs = parser.getRPNPtg(); + for(int i=0; i