From 58dd97257a7586c0aaed074995be99f54a2d2119 Mon Sep 17 00:00:00 2001 From: Josh Micich Date: Mon, 27 Oct 2008 19:24:42 +0000 Subject: [PATCH] Preparation for fix for bug 46009. (Bug visible on ooxml branch, but this change will expose the problem) git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@708286 13f79535-47bb-0310-9956-ffa450edef68 --- .../record/aggregates/MergedCellsTable.java | 7 +- .../poi/hssf/record/TestMergeCellsRecord.java | 67 +++++++++++++------ 2 files changed, 51 insertions(+), 23 deletions(-) diff --git a/src/java/org/apache/poi/hssf/record/aggregates/MergedCellsTable.java b/src/java/org/apache/poi/hssf/record/aggregates/MergedCellsTable.java index bbf5c4d0a0..b11aee7d9f 100644 --- a/src/java/org/apache/poi/hssf/record/aggregates/MergedCellsTable.java +++ b/src/java/org/apache/poi/hssf/record/aggregates/MergedCellsTable.java @@ -51,7 +51,8 @@ public final class MergedCellsTable extends RecordAggregate { MergeCellsRecord mcr = (MergeCellsRecord) rs.getNext(); int nRegions = mcr.getNumAreas(); for (int i = 0; i < nRegions; i++) { - temp.add(mcr.getAreaAt(i)); + CellRangeAddress cra = mcr.getAreaAt(i); + temp.add(cra); } } } @@ -102,7 +103,8 @@ public final class MergedCellsTable extends RecordAggregate { private void addMergeCellsRecord(MergeCellsRecord mcr) { int nRegions = mcr.getNumAreas(); for (int i = 0; i < nRegions; i++) { - _mergedRegions.add(mcr.getAreaAt(i)); + CellRangeAddress cra = mcr.getAreaAt(i); + _mergedRegions.add(cra); } } @@ -130,5 +132,4 @@ public final class MergedCellsTable extends RecordAggregate { public int getNumberOfMergedRegions() { return _mergedRegions.size(); } - } diff --git a/src/testcases/org/apache/poi/hssf/record/TestMergeCellsRecord.java b/src/testcases/org/apache/poi/hssf/record/TestMergeCellsRecord.java index bbbe29ea51..9fe084388c 100644 --- a/src/testcases/org/apache/poi/hssf/record/TestMergeCellsRecord.java +++ b/src/testcases/org/apache/poi/hssf/record/TestMergeCellsRecord.java @@ -17,8 +17,15 @@ package org.apache.poi.hssf.record; +import java.util.ArrayList; +import java.util.List; + +import junit.framework.AssertionFailedError; import junit.framework.TestCase; +import org.apache.poi.hssf.model.RecordStream; +import org.apache.poi.hssf.record.aggregates.MergedCellsTable; +import org.apache.poi.hssf.record.aggregates.RecordAggregate.RecordVisitor; import org.apache.poi.hssf.util.CellRangeAddress; /** @@ -28,25 +35,45 @@ import org.apache.poi.hssf.util.CellRangeAddress; */ public final class TestMergeCellsRecord extends TestCase { - /** - * Make sure when a clone is called, we actually clone it. - * @throws Exception - */ - public void testCloneReferences() throws Exception { - CellRangeAddress[] cras = { new CellRangeAddress(0, 1, 0, 2), }; - MergeCellsRecord merge = new MergeCellsRecord(cras, 0, cras.length); - MergeCellsRecord clone = (MergeCellsRecord)merge.clone(); - - assertNotSame("Merged and cloned objects are the same", merge, clone); - - CellRangeAddress mergeRegion = merge.getAreaAt(0); - CellRangeAddress cloneRegion = clone.getAreaAt(0); - assertNotSame("Should not point to same objects when cloning", mergeRegion, cloneRegion); - assertEquals("New Clone Row From doesnt match", mergeRegion.getFirstRow(), cloneRegion.getFirstRow()); - assertEquals("New Clone Row To doesnt match", mergeRegion.getLastRow(), cloneRegion.getLastRow()); - assertEquals("New Clone Col From doesnt match", mergeRegion.getFirstColumn(), cloneRegion.getFirstColumn()); - assertEquals("New Clone Col To doesnt match", mergeRegion.getLastColumn(), cloneRegion.getLastColumn()); + /** + * Make sure when a clone is called, we actually clone it. + */ + public void testCloneReferences() { + CellRangeAddress[] cras = { new CellRangeAddress(0, 1, 0, 2), }; + MergeCellsRecord merge = new MergeCellsRecord(cras, 0, cras.length); + MergeCellsRecord clone = (MergeCellsRecord)merge.clone(); + + assertNotSame("Merged and cloned objects are the same", merge, clone); + + CellRangeAddress mergeRegion = merge.getAreaAt(0); + CellRangeAddress cloneRegion = clone.getAreaAt(0); + assertNotSame("Should not point to same objects when cloning", mergeRegion, cloneRegion); + assertEquals("New Clone Row From doesnt match", mergeRegion.getFirstRow(), cloneRegion.getFirstRow()); + assertEquals("New Clone Row To doesnt match", mergeRegion.getLastRow(), cloneRegion.getLastRow()); + assertEquals("New Clone Col From doesnt match", mergeRegion.getFirstColumn(), cloneRegion.getFirstColumn()); + assertEquals("New Clone Col To doesnt match", mergeRegion.getLastColumn(), cloneRegion.getLastColumn()); - assertFalse(merge.getAreaAt(0) == clone.getAreaAt(0)); - } + assertFalse(merge.getAreaAt(0) == clone.getAreaAt(0)); + } + + private static final RecordVisitor dummyRecordVisitor = new RecordVisitor() { + public void visitRecord(Record r) { + // do nothing + } + }; + public void testMCTable_bug46009() { + MergedCellsTable mct = new MergedCellsTable(); + List recList = new ArrayList(); + CellRangeAddress[] cras = new CellRangeAddress[] { + new CellRangeAddress(0, 0, 0, 3), + }; + recList.add(new MergeCellsRecord(cras, 0, 1)); + RecordStream rs = new RecordStream(recList, 0); + mct.read(rs); + try { + mct.visitContainedRecords(dummyRecordVisitor); + } catch (ArrayStoreException e) { + throw new AssertionFailedError("Identified bug 46009"); + } + } } -- 2.39.5