diff options
author | Nick Burch <nick@apache.org> | 2008-01-08 10:36:36 +0000 |
---|---|---|
committer | Nick Burch <nick@apache.org> | 2008-01-08 10:36:36 +0000 |
commit | 4ec6675df9eda56c23169271e5eb96d573f802a7 (patch) | |
tree | bce4eaebf4eb08514225694b936fde7a96ed8959 /src/testcases/org/apache/poi/hssf/util | |
parent | e3a93edfb02a6318782f9d10803322d20497f644 (diff) | |
download | poi-4ec6675df9eda56c23169271e5eb96d573f802a7.tar.gz poi-4ec6675df9eda56c23169271e5eb96d573f802a7.zip |
Fix for bug #44167 - patch from Paolo Mottadelli
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@609924 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'src/testcases/org/apache/poi/hssf/util')
-rw-r--r-- | src/testcases/org/apache/poi/hssf/util/TestAreaReference.java | 158 |
1 files changed, 154 insertions, 4 deletions
diff --git a/src/testcases/org/apache/poi/hssf/util/TestAreaReference.java b/src/testcases/org/apache/poi/hssf/util/TestAreaReference.java index 0663920461..b58e498bf0 100644 --- a/src/testcases/org/apache/poi/hssf/util/TestAreaReference.java +++ b/src/testcases/org/apache/poi/hssf/util/TestAreaReference.java @@ -21,9 +21,16 @@ package org.apache.poi.hssf.util; import junit.framework.TestCase; -import org.apache.poi.hssf.usermodel.HSSFCell; -import org.apache.poi.hssf.usermodel.HSSFRow; -import org.apache.poi.hssf.usermodel.HSSFSheet; +import org.apache.poi.hssf.usermodel.*; +import org.apache.poi.hssf.model.Workbook; +import org.apache.poi.hssf.record.NameRecord; +import org.apache.poi.hssf.record.formula.MemFuncPtg; +import org.apache.poi.hssf.record.formula.Area3DPtg; +import org.apache.poi.hssf.record.formula.UnionPtg; + +import java.io.FileInputStream; +import java.io.InputStream; +import java.util.List; public class TestAreaReference extends TestCase { public TestAreaReference(String s) { @@ -60,8 +67,151 @@ public class TestAreaReference extends TestCase { assertEquals("Not Column B", (short)1,myCellReference[0].getCol()); assertEquals("Not Row 5", 4,myCellReference[0].getRow()); } + + private static class HSSFWB extends HSSFWorkbook { + private HSSFWB(InputStream in) throws Exception { + super(in); + } + public Workbook getWorkbook() { + return super.getWorkbook(); + } + } + + public void testContiguousReferences() throws Exception { + String refSimple = "$C$10"; + String ref2D = "$C$10:$D$11"; + String refDCSimple = "$C$10,$D$12,$E$14"; + String refDC2D = "$C$10:$C$11,$D$12,$E$14:$E$20"; + String refDC3D = "Tabelle1!$C$10:$C$14,Tabelle1!$D$10:$D$12"; + + // Check that we detect as contiguous properly + assertTrue(AreaReference.isContiguous(refSimple)); + assertTrue(AreaReference.isContiguous(ref2D)); + assertFalse(AreaReference.isContiguous(refDCSimple)); + assertFalse(AreaReference.isContiguous(refDC2D)); + assertFalse(AreaReference.isContiguous(refDC3D)); + + // Check we can only create contiguous entries + new AreaReference(refSimple); + new AreaReference(ref2D); + try { + new AreaReference(refDCSimple); + fail(); + } catch(IllegalArgumentException e) {} + try { + new AreaReference(refDC2D); + fail(); + } catch(IllegalArgumentException e) {} + try { + new AreaReference(refDC3D); + fail(); + } catch(IllegalArgumentException e) {} + + // Test that we split as expected + AreaReference[] refs; + + refs = AreaReference.generateContiguous(refSimple); + assertEquals(1, refs.length); + assertEquals(1, refs[0].getDim()); + assertEquals("$C$10", refs[0].toString()); + + refs = AreaReference.generateContiguous(ref2D); + assertEquals(1, refs.length); + assertEquals(2, refs[0].getDim()); + assertEquals("$C$10:$D$11", refs[0].toString()); + + refs = AreaReference.generateContiguous(refDCSimple); + assertEquals(3, refs.length); + assertEquals(1, refs[0].getDim()); + assertEquals(1, refs[1].getDim()); + assertEquals(1, refs[2].getDim()); + assertEquals("$C$10", refs[0].toString()); + assertEquals("$D$12", refs[1].toString()); + assertEquals("$E$14", refs[2].toString()); + + refs = AreaReference.generateContiguous(refDC2D); + assertEquals(3, refs.length); + assertEquals(2, refs[0].getDim()); + assertEquals(1, refs[1].getDim()); + assertEquals(2, refs[2].getDim()); + assertEquals("$C$10:$C$11", refs[0].toString()); + assertEquals("$D$12", refs[1].toString()); + assertEquals("$E$14:$E$20", refs[2].toString()); + + refs = AreaReference.generateContiguous(refDC3D); + assertEquals(2, refs.length); + assertEquals(2, refs[0].getDim()); + assertEquals(2, refs[1].getDim()); + assertEquals("$C$10:$C$14", refs[0].toString()); + assertEquals("$D$10:$D$12", refs[1].toString()); + assertEquals("Tabelle1", refs[0].getCells()[0].getSheetName()); + assertEquals("Tabelle1", refs[0].getCells()[1].getSheetName()); + assertEquals("Tabelle1", refs[1].getCells()[0].getSheetName()); + assertEquals("Tabelle1", refs[1].getCells()[1].getSheetName()); + } + + public void testDiscontinousReference() throws Exception { + String filename = System.getProperty( "HSSF.testdata.path" ); + filename = filename + "/44167.xls"; + FileInputStream fin = new FileInputStream( filename ); + HSSFWB wb = new HSSFWB( fin ); + Workbook workbook = wb.getWorkbook(); + fin.close(); + + assertEquals(1, wb.getNumberOfNames()); + String sheetName = "Tabelle1"; + String rawRefA = "$C$10:$C$14"; + String rawRefB = "$C$16:$C$18"; + String refA = sheetName + "!" + rawRefA; + String refB = sheetName + "!" + rawRefB; + String ref = refA + "," + refB; + + // Check the low level record + NameRecord nr = workbook.getNameRecord(0); + assertNotNull(nr); + assertEquals("test", nr.getNameText()); + + List def =nr.getNameDefinition(); + assertEquals(4, def.size()); + + MemFuncPtg ptgA = (MemFuncPtg)def.get(0); + Area3DPtg ptgB = (Area3DPtg)def.get(1); + Area3DPtg ptgC = (Area3DPtg)def.get(2); + UnionPtg ptgD = (UnionPtg)def.get(3); + assertEquals("", ptgA.toFormulaString(workbook)); + assertEquals(refA, ptgB.toFormulaString(workbook)); + assertEquals(refB, ptgC.toFormulaString(workbook)); + assertEquals(",", ptgD.toFormulaString(workbook)); + + assertEquals(ref, nr.getAreaReference(workbook)); + + // Check the high level definition + int idx = wb.getNameIndex("test"); + assertEquals(0, idx); + HSSFName aNamedCell = wb.getNameAt(idx); + + // Should have 2 references + assertEquals(ref, aNamedCell.getReference()); + + // Check the parsing of the reference into cells + assertFalse(AreaReference.isContiguous(aNamedCell.getReference())); + AreaReference[] arefs = AreaReference.generateContiguous(aNamedCell.getReference()); + assertEquals(2, arefs.length); + assertEquals(rawRefA, arefs[0].toString()); + assertEquals(rawRefB, arefs[1].toString()); + + for(int i=0; i<arefs.length; i++) { + CellReference[] crefs = arefs[i].getCells(); + for (int j=0; j<crefs.length; j++) { + // Check it turns into real stuff + HSSFSheet s = wb.getSheet(crefs[j].getSheetName()); + HSSFRow r = s.getRow(crefs[j].getRow()); + HSSFCell c = r.getCell(crefs[j].getCol()); + } + } + } - public static void main(java.lang.String[] args) { + public static void main(java.lang.String[] args) { junit.textui.TestRunner.run(TestAreaReference.class); } |