From 2780bf3be3b878fdd37a201bc99646182122ea76 Mon Sep 17 00:00:00 2001 From: Nick Burch Date: Fri, 4 Nov 2016 10:55:31 +0000 Subject: [PATCH] More unit testing for XWPF list numbering complex cases, and some TODOs on improving it, inspired by users@ discussions git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1768005 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/poi/xwpf/usermodel/XWPFNum.java | 4 +- .../poi/xwpf/usermodel/TestXWPFParagraph.java | 84 ++++++++++++++++++ test-data/document/ComplexNumberedLists.docx | Bin 0 -> 14458 bytes 3 files changed, 86 insertions(+), 2 deletions(-) create mode 100644 test-data/document/ComplexNumberedLists.docx diff --git a/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFNum.java b/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFNum.java index b1ae7ed8cf..7674510c1f 100644 --- a/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFNum.java +++ b/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFNum.java @@ -19,8 +19,8 @@ package org.apache.poi.xwpf.usermodel; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTNum; -/** - * @author Philipp Epp +/** + * TODO Bring more of the logic over from XWPFParagraph */ public class XWPFNum { protected XWPFNumbering numbering; diff --git a/src/ooxml/testcases/org/apache/poi/xwpf/usermodel/TestXWPFParagraph.java b/src/ooxml/testcases/org/apache/poi/xwpf/usermodel/TestXWPFParagraph.java index 6cd3171f3c..756aeef554 100644 --- a/src/ooxml/testcases/org/apache/poi/xwpf/usermodel/TestXWPFParagraph.java +++ b/src/ooxml/testcases/org/apache/poi/xwpf/usermodel/TestXWPFParagraph.java @@ -592,4 +592,88 @@ public final class TestXWPFParagraph { } assertEquals("This is a test.\n\n\n\n3\n4\n5\n\n\n\nThis is a whole paragraph where one word is deleted.\n", str.toString()); } + + @Test + public void testNumberedLists() throws Exception { + XWPFDocument doc = XWPFTestDataSamples.openSampleDocument("ComplexNumberedLists.docx"); + XWPFParagraph p; + + p = doc.getParagraphArray(0); + assertEquals("This is a document with numbered lists", p.getText()); + assertEquals(null, p.getNumID()); + assertEquals(null, p.getNumIlvl()); + assertEquals(null, p.getNumStartOverride()); + + p = doc.getParagraphArray(1); + assertEquals("Entry #1", p.getText()); + assertEquals(BigInteger.valueOf(1), p.getNumID()); + assertEquals(BigInteger.valueOf(0), p.getNumIlvl()); + assertEquals(null, p.getNumStartOverride()); + + p = doc.getParagraphArray(2); + assertEquals("Entry #2, with children", p.getText()); + assertEquals(BigInteger.valueOf(1), p.getNumID()); + assertEquals(BigInteger.valueOf(0), p.getNumIlvl()); + assertEquals(null, p.getNumStartOverride()); + + p = doc.getParagraphArray(3); + assertEquals("2-a", p.getText()); + assertEquals(BigInteger.valueOf(1), p.getNumID()); + assertEquals(BigInteger.valueOf(1), p.getNumIlvl()); + assertEquals(null, p.getNumStartOverride()); + + p = doc.getParagraphArray(4); + assertEquals("2-b", p.getText()); + assertEquals(BigInteger.valueOf(1), p.getNumID()); + assertEquals(BigInteger.valueOf(1), p.getNumIlvl()); + assertEquals(null, p.getNumStartOverride()); + + p = doc.getParagraphArray(5); + assertEquals("2-c", p.getText()); + assertEquals(BigInteger.valueOf(1), p.getNumID()); + assertEquals(BigInteger.valueOf(1), p.getNumIlvl()); + assertEquals(null, p.getNumStartOverride()); + + p = doc.getParagraphArray(6); + assertEquals("Entry #3", p.getText()); + assertEquals(BigInteger.valueOf(1), p.getNumID()); + assertEquals(BigInteger.valueOf(0), p.getNumIlvl()); + assertEquals(null, p.getNumStartOverride()); + + p = doc.getParagraphArray(7); + assertEquals("Entry #4", p.getText()); + assertEquals(BigInteger.valueOf(1), p.getNumID()); + assertEquals(BigInteger.valueOf(0), p.getNumIlvl()); + assertEquals(null, p.getNumStartOverride()); + + // New list + p = doc.getParagraphArray(8); + assertEquals("Restarted to 1 from 5", p.getText()); + assertEquals(BigInteger.valueOf(2), p.getNumID()); + assertEquals(BigInteger.valueOf(0), p.getNumIlvl()); + assertEquals(null, p.getNumStartOverride()); + + p = doc.getParagraphArray(9); + assertEquals("Restarted @ 2", p.getText()); + assertEquals(BigInteger.valueOf(2), p.getNumID()); + assertEquals(BigInteger.valueOf(0), p.getNumIlvl()); + assertEquals(null, p.getNumStartOverride()); + + p = doc.getParagraphArray(10); + assertEquals("Restarted @ 3", p.getText()); + assertEquals(BigInteger.valueOf(2), p.getNumID()); + assertEquals(BigInteger.valueOf(0), p.getNumIlvl()); + assertEquals(null, p.getNumStartOverride()); + + // New list starting at 10 + p = doc.getParagraphArray(11); + assertEquals("Jump to new list at 10", p.getText()); + assertEquals(BigInteger.valueOf(6), p.getNumID()); + assertEquals(BigInteger.valueOf(0), p.getNumIlvl()); + // TODO Why isn't this seen as 10? + assertEquals(null, p.getNumStartOverride()); + + // TODO Shouldn't we use XWPFNumbering or similar here? + // TODO Make it easier to change + } } diff --git a/test-data/document/ComplexNumberedLists.docx b/test-data/document/ComplexNumberedLists.docx new file mode 100644 index 0000000000000000000000000000000000000000..b4409c9d1595df7001e18a5bccf783fb20d73611 GIT binary patch literal 14458 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 literal 0 HcmV?d00001 -- 2.39.5