diff options
author | Andreas Beeker <kiwiwings@apache.org> | 2021-11-22 00:01:31 +0000 |
---|---|---|
committer | Andreas Beeker <kiwiwings@apache.org> | 2021-11-22 00:01:31 +0000 |
commit | d3ff953cf71edfdbb409ab1110ef9976d88368c0 (patch) | |
tree | ce3699801533a6e51d2df1f6fc445b5f6eef5e19 /poi-scratchpad/src/test | |
parent | 84957d7bc4d1b6e774c0b306af023f64d94f6736 (diff) | |
download | poi-d3ff953cf71edfdbb409ab1110ef9976d88368c0.tar.gz poi-d3ff953cf71edfdbb409ab1110ef9976d88368c0.zip |
#65694 - HSLF - handle date/time fields and formats
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1895248 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'poi-scratchpad/src/test')
-rw-r--r-- | poi-scratchpad/src/test/java/org/apache/poi/hslf/usermodel/TestTextRun.java | 867 |
1 files changed, 451 insertions, 416 deletions
diff --git a/poi-scratchpad/src/test/java/org/apache/poi/hslf/usermodel/TestTextRun.java b/poi-scratchpad/src/test/java/org/apache/poi/hslf/usermodel/TestTextRun.java index 0079c348dc..3e51fb8f5d 100644 --- a/poi-scratchpad/src/test/java/org/apache/poi/hslf/usermodel/TestTextRun.java +++ b/poi-scratchpad/src/test/java/org/apache/poi/hslf/usermodel/TestTextRun.java @@ -17,8 +17,10 @@ package org.apache.poi.hslf.usermodel; -import static org.apache.poi.sl.usermodel.BaseTestSlideShow.getColor; +import static org.apache.poi.hslf.HSLFTestDataSamples.getSlideShow; +import static org.junit.jupiter.api.Assertions.assertArrayEquals; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNotEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertNull; @@ -27,15 +29,22 @@ import static org.junit.jupiter.api.Assertions.assertTrue; import java.awt.Color; import java.io.IOException; +import java.time.LocalDateTime; +import java.util.HashMap; import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.stream.Collectors; +import java.util.stream.Stream; import org.apache.poi.hslf.HSLFTestDataSamples; import org.apache.poi.hslf.model.textproperties.TextPropCollection; +import org.apache.poi.hslf.record.DateTimeMCAtom; import org.apache.poi.hslf.record.TextBytesAtom; import org.apache.poi.hslf.record.TextCharsAtom; -import org.apache.poi.hslf.record.TextHeaderAtom; -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeEach; +import org.apache.poi.sl.usermodel.BaseTestSlideShow; +import org.apache.poi.sl.usermodel.PlaceholderDetails; +import org.apache.poi.util.LocaleUtil; import org.junit.jupiter.api.Test; /** @@ -43,76 +52,62 @@ import org.junit.jupiter.api.Test; */ @SuppressWarnings("UnusedAssignment") public final class TestTextRun { - // SlideShow primed on the test data - private HSLFSlideShow ss; - private HSLFSlideShow ssRich; - - @BeforeEach - void setUp() throws IOException { - // Basic (non rich) test file - ss = HSLFTestDataSamples.getSlideShow("basic_test_ppt_file.ppt"); - - // Rich test file - ssRich = HSLFTestDataSamples.getSlideShow("Single_Coloured_Page.ppt"); - } - - @AfterEach - void tearDown() throws IOException { - ssRich.close(); - ss.close(); - } - /** * Test to ensure that getting the text works correctly */ @Test - void testGetText() { - HSLFSlide slideOne = ss.getSlides().get(0); - List<List<HSLFTextParagraph>> textParas = slideOne.getTextParagraphs(); - - assertEquals(2, textParas.size()); - - // Get text works with \n - assertEquals("This is a test title", HSLFTextParagraph.getText(textParas.get(0))); - assertEquals("This is a test subtitle\nThis is on page 1", HSLFTextParagraph.getText(textParas.get(1))); + void testGetText() throws IOException { + try (HSLFSlideShow ppt = getSlideShow("basic_test_ppt_file.ppt")) { + HSLFSlide slideOne = ppt.getSlides().get(0); + List<List<HSLFTextParagraph>> textParas = slideOne.getTextParagraphs(); + + // Get text works with \n + String[] exp1 = { "This is a test title", "This is a test subtitle\nThis is on page 1" }; + String[] act1 = textParas.stream().map(HSLFTextParagraph::getText).toArray(String[]::new); + assertArrayEquals(exp1, act1); + + // Raw text has \r instead + String[] exp2 = { "This is a test title", "This is a test subtitle\rThis is on page 1" }; + String[] act2 = textParas.stream().map(HSLFTextParagraph::getRawText).toArray(String[]::new); + assertArrayEquals(exp2, act2); + } - // Raw text has \r instead - assertEquals("This is a test title", HSLFTextParagraph.getRawText(textParas.get(0))); - assertEquals("This is a test subtitle\rThis is on page 1", HSLFTextParagraph.getRawText(textParas.get(1))); + // Now check on a rich text run + try (HSLFSlideShow ppt = getSlideShow("Single_Coloured_Page.ppt")) { + List<List<HSLFTextParagraph>> textParas = ppt.getSlides().get(0).getTextParagraphs(); + String[] exp1 = { "This is a title, it\u2019s in black", "This is the subtitle, in bold\nThis bit is blue and italic\nThis bit is red (normal)" }; + String[] act1 = textParas.stream().map(HSLFTextParagraph::getText).toArray(String[]::new); + assertArrayEquals(exp1, act1); - // Now check on a rich text run - HSLFSlide slideOneR = ssRich.getSlides().get(0); - textParas = slideOneR.getTextParagraphs(); - - assertEquals(2, textParas.size()); - assertEquals("This is a title, it\u2019s in black", HSLFTextParagraph.getText(textParas.get(0))); - assertEquals("This is the subtitle, in bold\nThis bit is blue and italic\nThis bit is red (normal)", HSLFTextParagraph.getText(textParas.get(1))); - assertEquals("This is a title, it\u2019s in black", HSLFTextParagraph.getRawText(textParas.get(0))); - assertEquals("This is the subtitle, in bold\rThis bit is blue and italic\rThis bit is red (normal)", HSLFTextParagraph.getRawText(textParas.get(1))); + String[] exp2 = { "This is a title, it\u2019s in black", "This is the subtitle, in bold\rThis bit is blue and italic\rThis bit is red (normal)" }; + String[] act2 = textParas.stream().map(HSLFTextParagraph::getRawText).toArray(String[]::new); + assertArrayEquals(exp2, act2); + } } /** * Test to ensure changing non rich text bytes->bytes works correctly */ @Test - void testSetText() { - HSLFSlide slideOne = ss.getSlides().get(0); - List<List<HSLFTextParagraph>> textRuns = slideOne.getTextParagraphs(); - HSLFTextParagraph run = textRuns.get(0).get(0); - HSLFTextRun tr = run.getTextRuns().get(0); - - // Check current text - assertEquals("This is a test title", tr.getRawText()); - - // Change - String changeTo = "New test title"; - tr.setText(changeTo); - assertEquals(changeTo, tr.getRawText()); - - // Ensure trailing \n's are NOT stripped, it is legal to set a text with a trailing '\r' - tr.setText(changeTo + "\n"); - assertEquals(changeTo + "\r", tr.getRawText()); + void testSetText() throws IOException { + try (HSLFSlideShow ppt = getSlideShow("basic_test_ppt_file.ppt")) { + List<List<HSLFTextParagraph>> textRuns = ppt.getSlides().get(0).getTextParagraphs(); + HSLFTextParagraph run = textRuns.get(0).get(0); + HSLFTextRun tr = run.getTextRuns().get(0); + + // Check current text + assertEquals("This is a test title", tr.getRawText()); + + // Change + String changeTo = "New test title"; + tr.setText(changeTo); + assertEquals(changeTo, tr.getRawText()); + + // Ensure trailing \n's are NOT stripped, it is legal to set a text with a trailing '\r' + tr.setText(changeTo + "\n"); + assertEquals(changeTo + "\r", tr.getRawText()); + } } /** @@ -121,74 +116,53 @@ public final class TestTextRun { */ @SuppressWarnings("unused") @Test - void testAdvancedSetText() { - HSLFSlide slideOne = ss.getSlides().get(0); - List<HSLFTextParagraph> paras = slideOne.getTextParagraphs().get(0); - HSLFTextParagraph para = paras.get(0); - - TextHeaderAtom tha = null; - TextBytesAtom tba = null; - TextCharsAtom tca = null; - for ( org.apache.poi.hslf.record.Record r : para.getRecords()) { - if (r instanceof TextHeaderAtom) tha = (TextHeaderAtom)r; - else if (r instanceof TextBytesAtom) tba = (TextBytesAtom)r; - else if (r instanceof TextCharsAtom) tca = (TextCharsAtom)r; - } - - // Bytes -> Bytes - assertNull(tca); - assertNotNull(tba); - // assertFalse(run._isUnicode); - assertEquals("This is a test title", para.getTextRuns().get(0).getRawText()); - - String changeBytesOnly = "New Test Title"; - HSLFTextParagraph.setText(paras, changeBytesOnly); - para = paras.get(0); - tha = null; tba = null; tca = null; - for ( org.apache.poi.hslf.record.Record r : para.getRecords()) { - if (r instanceof TextHeaderAtom) tha = (TextHeaderAtom)r; - else if (r instanceof TextBytesAtom) tba = (TextBytesAtom)r; - else if (r instanceof TextCharsAtom) tca = (TextCharsAtom)r; - } - - assertEquals(changeBytesOnly, HSLFTextParagraph.getRawText(paras)); - assertNull(tca); - assertNotNull(tba); - - // Bytes -> Chars - assertEquals(changeBytesOnly, HSLFTextParagraph.getRawText(paras)); - - String changeByteChar = "This is a test title with a '\u0121' g with a dot"; - HSLFTextParagraph.setText(paras, changeByteChar); - para = paras.get(0); - tha = null; tba = null; tca = null; - for ( org.apache.poi.hslf.record.Record r : para.getRecords()) { - if (r instanceof TextHeaderAtom) tha = (TextHeaderAtom)r; - else if (r instanceof TextBytesAtom) tba = (TextBytesAtom)r; - else if (r instanceof TextCharsAtom) tca = (TextCharsAtom)r; - } - - assertEquals(changeByteChar, HSLFTextParagraph.getRawText(paras)); - assertNotNull(tca); - assertNull(tba); - - // Chars -> Chars - assertNotNull(tca); - assertEquals(changeByteChar, HSLFTextParagraph.getRawText(paras)); - - String changeCharChar = "This is a test title with a '\u0147' N with a hat"; - HSLFTextParagraph.setText(paras, changeCharChar); - para = paras.get(0); - tha = null; tba = null; tca = null; - for ( org.apache.poi.hslf.record.Record r : para.getRecords()) { - if (r instanceof TextHeaderAtom) tha = (TextHeaderAtom)r; - else if (r instanceof TextBytesAtom) tba = (TextBytesAtom)r; - else if (r instanceof TextCharsAtom) tca = (TextCharsAtom)r; + void testAdvancedSetText() throws IOException { + try (HSLFSlideShow ppt = getSlideShow("basic_test_ppt_file.ppt")) { + List<HSLFTextParagraph> paras = ppt.getSlides().get(0).getTextParagraphs().get(0); + final HSLFTextParagraph para = paras.get(0); + + final TextBytesAtom[] tba = { null }; + final TextCharsAtom[] tca = { null }; + Runnable extract = () -> { + tba[0] = null; + tca[0] = null; + Stream.of(para.getRecords()).forEach(r -> { + if (r instanceof TextBytesAtom) tba[0] = (TextBytesAtom) r; + else if (r instanceof TextCharsAtom) tca[0] = (TextCharsAtom) r; + }); + }; + + // Bytes -> Bytes + extract.run(); + assertNull(tca[0]); + assertNotNull(tba); + // assertFalse(run._isUnicode); + assertEquals("This is a test title", para.getTextRuns().get(0).getRawText()); + + String changeBytesOnly = "New Test Title"; + HSLFTextParagraph.setText(paras, changeBytesOnly); + extract.run(); + assertEquals(changeBytesOnly, HSLFTextParagraph.getRawText(paras)); + assertNull(tca[0]); + assertNotNull(tba); + + // Bytes -> Chars + String changeByteChar = "This is a test title with a '\u0121' g with a dot"; + HSLFTextParagraph.setText(paras, changeByteChar); + extract.run(); + assertEquals(changeByteChar, HSLFTextParagraph.getRawText(paras)); + assertNotNull(tca[0]); + assertNull(tba[0]); + + // Chars -> Chars + String changeCharChar = "This is a test title with a '\u0147' N with a hat"; + HSLFTextParagraph.setText(paras, changeCharChar); + extract.run(); + + assertEquals(changeCharChar, HSLFTextParagraph.getRawText(paras)); + assertNotNull(tca[0]); + assertNull(tba[0]); } - - assertEquals(changeCharChar, HSLFTextParagraph.getRawText(paras)); - assertNotNull(tca); - assertNull(tba); } /** @@ -196,61 +170,63 @@ public final class TestTextRun { * set up for it */ @Test - void testGetRichTextNonRich() { - HSLFSlide slideOne = ss.getSlides().get(0); - List<List<HSLFTextParagraph>> textParass = slideOne.getTextParagraphs(); + void testGetRichTextNonRich() throws IOException { + try (HSLFSlideShow ppt = getSlideShow("basic_test_ppt_file.ppt")) { + List<List<HSLFTextParagraph>> textParass = ppt.getSlides().get(0).getTextParagraphs(); - assertEquals(2, textParass.size()); + assertEquals(2, textParass.size()); - List<HSLFTextParagraph> trA = textParass.get(0); - List<HSLFTextParagraph> trB = textParass.get(1); + List<HSLFTextParagraph> trA = textParass.get(0); + List<HSLFTextParagraph> trB = textParass.get(1); - assertEquals(1, trA.size()); - assertEquals(2, trB.size()); + assertEquals(1, trA.size()); + assertEquals(2, trB.size()); - HSLFTextRun rtrA = trA.get(0).getTextRuns().get(0); - HSLFTextRun rtrB = trB.get(0).getTextRuns().get(0); + HSLFTextRun rtrA = trA.get(0).getTextRuns().get(0); + HSLFTextRun rtrB = trB.get(0).getTextRuns().get(0); - assertEquals(HSLFTextParagraph.getRawText(trA), rtrA.getRawText()); - assertEquals(HSLFTextParagraph.getRawText(trB.subList(0, 1)), rtrB.getRawText()); + assertEquals(HSLFTextParagraph.getRawText(trA), rtrA.getRawText()); + assertEquals(HSLFTextParagraph.getRawText(trB.subList(0, 1)), rtrB.getRawText()); + } } /** * Tests to ensure that the rich text runs are built up correctly */ @Test - void testGetRichText() { - HSLFSlide slideOne = ssRich.getSlides().get(0); - List<List<HSLFTextParagraph>> textParass = slideOne.getTextParagraphs(); + void testGetRichText() throws IOException { + try (HSLFSlideShow ppt = getSlideShow("Single_Coloured_Page.ppt")) { + List<List<HSLFTextParagraph>> textParass = ppt.getSlides().get(0).getTextParagraphs(); - assertEquals(2, textParass.size()); + assertEquals(2, textParass.size()); - List<HSLFTextParagraph> trA = textParass.get(0); - List<HSLFTextParagraph> trB = textParass.get(1); + List<HSLFTextParagraph> trA = textParass.get(0); + List<HSLFTextParagraph> trB = textParass.get(1); - assertEquals(1, trA.size()); - assertEquals(3, trB.size()); + assertEquals(1, trA.size()); + assertEquals(3, trB.size()); - HSLFTextRun rtrA = trA.get(0).getTextRuns().get(0); - HSLFTextRun rtrB = trB.get(0).getTextRuns().get(0); - HSLFTextRun rtrC = trB.get(1).getTextRuns().get(0); - HSLFTextRun rtrD = trB.get(2).getTextRuns().get(0); + HSLFTextRun rtrA = trA.get(0).getTextRuns().get(0); + HSLFTextRun rtrB = trB.get(0).getTextRuns().get(0); + HSLFTextRun rtrC = trB.get(1).getTextRuns().get(0); + HSLFTextRun rtrD = trB.get(2).getTextRuns().get(0); - assertEquals(HSLFTextParagraph.getRawText(trA), rtrA.getRawText()); + assertEquals(HSLFTextParagraph.getRawText(trA), rtrA.getRawText()); - String trBstr = HSLFTextParagraph.getRawText(trB); - assertEquals(trBstr.substring(0, 30), rtrB.getRawText()); - assertEquals(trBstr.substring(30,58), rtrC.getRawText()); - assertEquals(trBstr.substring(58,82), rtrD.getRawText()); + String trBstr = HSLFTextParagraph.getRawText(trB); + assertEquals(trBstr.substring(0, 30), rtrB.getRawText()); + assertEquals(trBstr.substring(30, 58), rtrC.getRawText()); + assertEquals(trBstr.substring(58, 82), rtrD.getRawText()); - // Same paragraph styles - assertEquals(trB.get(0).getParagraphStyle(), trB.get(1).getParagraphStyle()); - assertEquals(trB.get(0).getParagraphStyle(), trB.get(2).getParagraphStyle()); + // Same paragraph styles + assertEquals(trB.get(0).getParagraphStyle(), trB.get(1).getParagraphStyle()); + assertEquals(trB.get(0).getParagraphStyle(), trB.get(2).getParagraphStyle()); - // Different char styles - assertNotEquals(rtrB.getCharacterStyle(), rtrC.getCharacterStyle()); - assertNotEquals(rtrB.getCharacterStyle(), rtrD.getCharacterStyle()); - assertNotEquals(rtrC.getCharacterStyle(), rtrD.getCharacterStyle()); + // Different char styles + assertNotEquals(rtrB.getCharacterStyle(), rtrC.getCharacterStyle()); + assertNotEquals(rtrB.getCharacterStyle(), rtrD.getCharacterStyle()); + assertNotEquals(rtrC.getCharacterStyle(), rtrD.getCharacterStyle()); + } } /** @@ -258,20 +234,20 @@ public final class TestTextRun { * ensuring that everything stays with the same default styling */ @Test - void testSetTextWhereNotRich() { - HSLFSlide slideOne = ss.getSlides().get(0); - List<List<HSLFTextParagraph>> textParass = slideOne.getTextParagraphs(); - List<HSLFTextParagraph> trB = textParass.get(0); - assertEquals(1, trB.size()); - - HSLFTextRun rtrB = trB.get(0).getTextRuns().get(0); - assertEquals(HSLFTextParagraph.getText(trB), rtrB.getRawText()); - - // Change text via normal - HSLFTextParagraph.setText(trB, "Test Foo Test"); - rtrB = trB.get(0).getTextRuns().get(0); - assertEquals("Test Foo Test", HSLFTextParagraph.getRawText(trB)); - assertEquals("Test Foo Test", rtrB.getRawText()); + void testSetTextWhereNotRich() throws IOException { + try (HSLFSlideShow ppt = getSlideShow("basic_test_ppt_file.ppt")) { + List<HSLFTextParagraph> trB = ppt.getSlides().get(0).getTextParagraphs().get(0); + assertEquals(1, trB.size()); + + HSLFTextRun rtrB = trB.get(0).getTextRuns().get(0); + assertEquals(HSLFTextParagraph.getText(trB), rtrB.getRawText()); + + // Change text via normal + HSLFTextParagraph.setText(trB, "Test Foo Test"); + rtrB = trB.get(0).getTextRuns().get(0); + assertEquals("Test Foo Test", HSLFTextParagraph.getRawText(trB)); + assertEquals("Test Foo Test", rtrB.getRawText()); + } } /** @@ -279,48 +255,48 @@ public final class TestTextRun { * sets everything to the same styling */ @Test - void testSetTextWhereRich() { - HSLFSlide slideOne = ssRich.getSlides().get(0); - List<List<HSLFTextParagraph>> textParass = slideOne.getTextParagraphs(); - List<HSLFTextParagraph> trB = textParass.get(1); - assertEquals(3, trB.size()); - - HSLFTextRun rtrB = trB.get(0).getTextRuns().get(0); - HSLFTextRun rtrC = trB.get(1).getTextRuns().get(0); - HSLFTextRun rtrD = trB.get(2).getTextRuns().get(0); - TextPropCollection tpBP = rtrB.getTextParagraph().getParagraphStyle(); - TextPropCollection tpBC = rtrB.getCharacterStyle(); - TextPropCollection tpCP = rtrC.getTextParagraph().getParagraphStyle(); - TextPropCollection tpCC = rtrC.getCharacterStyle(); - TextPropCollection tpDP = rtrD.getTextParagraph().getParagraphStyle(); - TextPropCollection tpDC = rtrD.getCharacterStyle(); + void testSetTextWhereRich() throws IOException { + try (HSLFSlideShow ppt = getSlideShow("Single_Coloured_Page.ppt")) { + List<HSLFTextParagraph> trB = ppt.getSlides().get(0).getTextParagraphs().get(1); + assertEquals(3, trB.size()); + + HSLFTextRun rtrB = trB.get(0).getTextRuns().get(0); + HSLFTextRun rtrC = trB.get(1).getTextRuns().get(0); + HSLFTextRun rtrD = trB.get(2).getTextRuns().get(0); + TextPropCollection tpBP = rtrB.getTextParagraph().getParagraphStyle(); + TextPropCollection tpBC = rtrB.getCharacterStyle(); + TextPropCollection tpCP = rtrC.getTextParagraph().getParagraphStyle(); + TextPropCollection tpCC = rtrC.getCharacterStyle(); + TextPropCollection tpDP = rtrD.getTextParagraph().getParagraphStyle(); + TextPropCollection tpDC = rtrD.getCharacterStyle(); // assertEquals(trB.getRawText().substring(0, 30), rtrB.getRawText()); - assertNotNull(tpBP); - assertNotNull(tpBC); - assertNotNull(tpCP); - assertNotNull(tpCC); - assertNotNull(tpDP); - assertNotNull(tpDC); - assertEquals(tpBP,tpCP); - assertEquals(tpBP,tpDP); - assertEquals(tpCP,tpDP); - assertNotEquals(tpBC,tpCC); - assertNotEquals(tpBC,tpDC); - assertNotEquals(tpCC,tpDC); - - // Change text via normal - HSLFTextParagraph.setText(trB, "Test Foo Test"); - - // Ensure now have first style - assertEquals(1, trB.get(0).getTextRuns().size()); - rtrB = trB.get(0).getTextRuns().get(0); - assertEquals("Test Foo Test", HSLFTextParagraph.getRawText(trB)); - assertEquals("Test Foo Test", rtrB.getRawText()); - assertNotNull(rtrB.getCharacterStyle()); - assertNotNull(rtrB.getTextParagraph().getParagraphStyle()); - assertEquals( tpBP, rtrB.getTextParagraph().getParagraphStyle() ); - assertEquals( tpBC, rtrB.getCharacterStyle() ); + assertNotNull(tpBP); + assertNotNull(tpBC); + assertNotNull(tpCP); + assertNotNull(tpCC); + assertNotNull(tpDP); + assertNotNull(tpDC); + assertEquals(tpBP, tpCP); + assertEquals(tpBP, tpDP); + assertEquals(tpCP, tpDP); + assertNotEquals(tpBC, tpCC); + assertNotEquals(tpBC, tpDC); + assertNotEquals(tpCC, tpDC); + + // Change text via normal + HSLFTextParagraph.setText(trB, "Test Foo Test"); + + // Ensure now have first style + assertEquals(1, trB.get(0).getTextRuns().size()); + rtrB = trB.get(0).getTextRuns().get(0); + assertEquals("Test Foo Test", HSLFTextParagraph.getRawText(trB)); + assertEquals("Test Foo Test", rtrB.getRawText()); + assertNotNull(rtrB.getCharacterStyle()); + assertNotNull(rtrB.getTextParagraph().getParagraphStyle()); + assertEquals(tpBP, rtrB.getTextParagraph().getParagraphStyle()); + assertEquals(tpBC, rtrB.getCharacterStyle()); + } } /** @@ -328,25 +304,26 @@ public final class TestTextRun { * in a rich text run, that doesn't happen to actually be rich */ @Test - void testChangeTextInRichTextRunNonRich() { - HSLFSlide slideOne = ss.getSlides().get(0); - List<List<HSLFTextParagraph>> textRuns = slideOne.getTextParagraphs(); - List<HSLFTextParagraph> trB = textRuns.get(1); - assertEquals(1, trB.get(0).getTextRuns().size()); - - HSLFTextRun rtrB = trB.get(0).getTextRuns().get(0); - assertEquals(HSLFTextParagraph.getRawText(trB.subList(0, 1)), rtrB.getRawText()); - assertNotNull(rtrB.getCharacterStyle()); - assertNotNull(rtrB.getTextParagraph().getParagraphStyle()); - - // Change text via rich - rtrB.setText("Test Test Test"); - assertEquals("Test Test Test", HSLFTextParagraph.getRawText(trB.subList(0, 1))); - assertEquals("Test Test Test", rtrB.getRawText()); - - // Will now have dummy props - assertNotNull(rtrB.getCharacterStyle()); - assertNotNull(rtrB.getTextParagraph().getParagraphStyle()); + void testChangeTextInRichTextRunNonRich() throws IOException { + try (HSLFSlideShow ppt = getSlideShow("basic_test_ppt_file.ppt")) { + List<List<HSLFTextParagraph>> textRuns = ppt.getSlides().get(0).getTextParagraphs(); + List<HSLFTextParagraph> trB = textRuns.get(1); + assertEquals(1, trB.get(0).getTextRuns().size()); + + HSLFTextRun rtrB = trB.get(0).getTextRuns().get(0); + assertEquals(HSLFTextParagraph.getRawText(trB.subList(0, 1)), rtrB.getRawText()); + assertNotNull(rtrB.getCharacterStyle()); + assertNotNull(rtrB.getTextParagraph().getParagraphStyle()); + + // Change text via rich + rtrB.setText("Test Test Test"); + assertEquals("Test Test Test", HSLFTextParagraph.getRawText(trB.subList(0, 1))); + assertEquals("Test Test Test", rtrB.getRawText()); + + // Will now have dummy props + assertNotNull(rtrB.getCharacterStyle()); + assertNotNull(rtrB.getTextParagraph().getParagraphStyle()); + } } /** @@ -354,76 +331,78 @@ public final class TestTextRun { * correctly */ @Test - void testChangeTextInRichTextRun() { - HSLFSlide slideOne = ssRich.getSlides().get(0); - List<List<HSLFTextParagraph>> textParass = slideOne.getTextParagraphs(); - List<HSLFTextParagraph> trB = textParass.get(1); - assertEquals(3, trB.size()); - - // We start with 3 text runs, each with their own set of styles, - // but all sharing the same paragraph styles - HSLFTextRun rtrB = trB.get(0).getTextRuns().get(0); - HSLFTextRun rtrC = trB.get(1).getTextRuns().get(0); - HSLFTextRun rtrD = trB.get(2).getTextRuns().get(0); - TextPropCollection tpBP = rtrB.getTextParagraph().getParagraphStyle(); - TextPropCollection tpBC = rtrB.getCharacterStyle(); - TextPropCollection tpCP = rtrC.getTextParagraph().getParagraphStyle(); - TextPropCollection tpCC = rtrC.getCharacterStyle(); - TextPropCollection tpDP = rtrD.getTextParagraph().getParagraphStyle(); - TextPropCollection tpDC = rtrD.getCharacterStyle(); - - // Check text and stylings - assertEquals(HSLFTextParagraph.getRawText(trB).substring(0, 30), rtrB.getRawText()); - assertNotNull(tpBP); - assertNotNull(tpBC); - assertNotNull(tpCP); - assertNotNull(tpCC); - assertNotNull(tpDP); - assertNotNull(tpDC); - assertEquals(tpBP, tpCP); - assertEquals(tpBP, tpDP); - assertEquals(tpCP, tpDP); - assertNotEquals(tpBC, tpCC); - assertNotEquals(tpBC, tpDC); - assertNotEquals(tpCC, tpDC); - - // Check text in the rich runs - assertEquals("This is the subtitle, in bold\r", rtrB.getRawText()); - assertEquals("This bit is blue and italic\r", rtrC.getRawText()); - assertEquals("This bit is red (normal)", rtrD.getRawText()); - - String newBText = "New Subtitle, will still be bold\n"; - String newCText = "New blue and italic text\n"; - String newDText = "Funky new normal red text"; - rtrB.setText(newBText); - rtrC.setText(newCText); - rtrD.setText(newDText); - HSLFTextParagraph.storeText(trB); - - assertEquals(newBText.replace('\n','\r'), rtrB.getRawText()); - assertEquals(newCText.replace('\n','\r'), rtrC.getRawText()); - assertEquals(newDText.replace('\n','\r'), rtrD.getRawText()); - - assertEquals(newBText.replace('\n','\r') + newCText.replace('\n','\r') + newDText.replace('\n','\r'), HSLFTextParagraph.getRawText(trB)); - - // The styles should have been updated for the new sizes - assertEquals(newBText.length(), tpBC.getCharactersCovered()); - assertEquals(newCText.length(), tpCC.getCharactersCovered()); - assertEquals(newDText.length()+1, tpDC.getCharactersCovered()); // Last one is always one larger - - // Paragraph style should be sum of text length - assertEquals( - newBText.length() + newCText.length() + newDText.length() +1, - tpBP.getCharactersCovered() + tpCP.getCharactersCovered() + tpDP.getCharactersCovered() - ); - - // Check stylings still as expected - TextPropCollection ntpBC = rtrB.getCharacterStyle(); - TextPropCollection ntpCC = rtrC.getCharacterStyle(); - TextPropCollection ntpDC = rtrD.getCharacterStyle(); - assertEquals(tpBC.getTextPropList(), ntpBC.getTextPropList()); - assertEquals(tpCC.getTextPropList(), ntpCC.getTextPropList()); - assertEquals(tpDC.getTextPropList(), ntpDC.getTextPropList()); + void testChangeTextInRichTextRun() throws IOException { + try (HSLFSlideShow ppt = getSlideShow("Single_Coloured_Page.ppt")) { + HSLFSlide slideOne = ppt.getSlides().get(0); + List<List<HSLFTextParagraph>> textParass = slideOne.getTextParagraphs(); + List<HSLFTextParagraph> trB = textParass.get(1); + assertEquals(3, trB.size()); + + // We start with 3 text runs, each with their own set of styles, + // but all sharing the same paragraph styles + HSLFTextRun rtrB = trB.get(0).getTextRuns().get(0); + HSLFTextRun rtrC = trB.get(1).getTextRuns().get(0); + HSLFTextRun rtrD = trB.get(2).getTextRuns().get(0); + TextPropCollection tpBP = rtrB.getTextParagraph().getParagraphStyle(); + TextPropCollection tpBC = rtrB.getCharacterStyle(); + TextPropCollection tpCP = rtrC.getTextParagraph().getParagraphStyle(); + TextPropCollection tpCC = rtrC.getCharacterStyle(); + TextPropCollection tpDP = rtrD.getTextParagraph().getParagraphStyle(); + TextPropCollection tpDC = rtrD.getCharacterStyle(); + + // Check text and stylings + assertEquals(HSLFTextParagraph.getRawText(trB).substring(0, 30), rtrB.getRawText()); + assertNotNull(tpBP); + assertNotNull(tpBC); + assertNotNull(tpCP); + assertNotNull(tpCC); + assertNotNull(tpDP); + assertNotNull(tpDC); + assertEquals(tpBP, tpCP); + assertEquals(tpBP, tpDP); + assertEquals(tpCP, tpDP); + assertNotEquals(tpBC, tpCC); + assertNotEquals(tpBC, tpDC); + assertNotEquals(tpCC, tpDC); + + // Check text in the rich runs + assertEquals("This is the subtitle, in bold\r", rtrB.getRawText()); + assertEquals("This bit is blue and italic\r", rtrC.getRawText()); + assertEquals("This bit is red (normal)", rtrD.getRawText()); + + String newBText = "New Subtitle, will still be bold\n"; + String newCText = "New blue and italic text\n"; + String newDText = "Funky new normal red text"; + rtrB.setText(newBText); + rtrC.setText(newCText); + rtrD.setText(newDText); + HSLFTextParagraph.storeText(trB); + + assertEquals(newBText.replace('\n', '\r'), rtrB.getRawText()); + assertEquals(newCText.replace('\n', '\r'), rtrC.getRawText()); + assertEquals(newDText.replace('\n', '\r'), rtrD.getRawText()); + + assertEquals(newBText.replace('\n', '\r') + newCText.replace('\n', '\r') + newDText.replace('\n', '\r'), HSLFTextParagraph.getRawText(trB)); + + // The styles should have been updated for the new sizes + assertEquals(newBText.length(), tpBC.getCharactersCovered()); + assertEquals(newCText.length(), tpCC.getCharactersCovered()); + assertEquals(newDText.length() + 1, tpDC.getCharactersCovered()); // Last one is always one larger + + // Paragraph style should be sum of text length + assertEquals( + newBText.length() + newCText.length() + newDText.length() + 1, + tpBP.getCharactersCovered() + tpCP.getCharactersCovered() + tpDP.getCharactersCovered() + ); + + // Check stylings still as expected + TextPropCollection ntpBC = rtrB.getCharacterStyle(); + TextPropCollection ntpCC = rtrC.getCharacterStyle(); + TextPropCollection ntpDC = rtrD.getCharacterStyle(); + assertEquals(tpBC.getTextPropList(), ntpBC.getTextPropList()); + assertEquals(tpCC.getTextPropList(), ntpCC.getTextPropList()); + assertEquals(tpDC.getTextPropList(), ntpDC.getTextPropList()); + } } @@ -436,29 +415,27 @@ public final class TestTextRun { */ @Test void testBug41015() throws IOException { - List<HSLFTextRun> rt; - - HSLFSlideShow ppt = HSLFTestDataSamples.getSlideShow("bug-41015.ppt"); - HSLFSlide sl = ppt.getSlides().get(0); - List<List<HSLFTextParagraph>> textParass = sl.getTextParagraphs(); - assertEquals(2, textParass.size()); - - List<HSLFTextParagraph> textParas = textParass.get(0); - rt = textParass.get(0).get(0).getTextRuns(); - assertEquals(1, rt.size()); - assertEquals(0, textParass.get(0).get(0).getIndentLevel()); - assertEquals("sdfsdfsdf", rt.get(0).getRawText()); - - textParas = textParass.get(1); - String[] texts = {"Sdfsdfsdf\r", "Dfgdfg\r", "Dfgdfgdfg\r", "Sdfsdfs\r", "Sdfsdf\r"}; - int[] indents = {0, 0, 0, 1, 1}; - int i=0; - for (HSLFTextParagraph p : textParas) { - assertEquals(texts[i], p.getTextRuns().get(0).getRawText()); - assertEquals(indents[i], p.getIndentLevel()); - i++; + try (HSLFSlideShow ppt = getSlideShow("bug-41015.ppt")) { + HSLFSlide sl = ppt.getSlides().get(0); + List<List<HSLFTextParagraph>> textParass = sl.getTextParagraphs(); + assertEquals(2, textParass.size()); + + List<HSLFTextParagraph> textParas = textParass.get(0); + List<HSLFTextRun> rt = textParass.get(0).get(0).getTextRuns(); + assertEquals(1, rt.size()); + assertEquals(0, textParass.get(0).get(0).getIndentLevel()); + assertEquals("sdfsdfsdf", rt.get(0).getRawText()); + + textParas = textParass.get(1); + String[] texts = {"Sdfsdfsdf\r", "Dfgdfg\r", "Dfgdfgdfg\r", "Sdfsdfs\r", "Sdfsdf\r"}; + int[] indents = {0, 0, 0, 1, 1}; + int i = 0; + for (HSLFTextParagraph p : textParas) { + assertEquals(texts[i], p.getTextRuns().get(0).getRawText()); + assertEquals(indents[i], p.getIndentLevel()); + i++; + } } - ppt.close(); } /** @@ -466,110 +443,106 @@ public final class TestTextRun { */ @Test void testAddTextRun() throws IOException { - HSLFSlideShow ppt = new HSLFSlideShow(); - HSLFSlide slide = ppt.createSlide(); - - assertEquals(0, slide.getTextParagraphs().size()); - - HSLFTextBox shape1 = new HSLFTextBox(); - List<HSLFTextParagraph> run1 = shape1.getTextParagraphs(); - shape1.setText("Text 1"); - slide.addShape(shape1); - - //The array of Slide's text runs must be updated when new text shapes are added. - List<List<HSLFTextParagraph>> runs = slide.getTextParagraphs(); - assertNotNull(runs); - assertSame(run1, runs.get(0)); - - HSLFTextBox shape2 = new HSLFTextBox(); - List<HSLFTextParagraph> run2 = shape2.getTextParagraphs(); - shape2.setText("Text 2"); - slide.addShape(shape2); - - runs = slide.getTextParagraphs(); - assertEquals(2, runs.size()); - - assertSame(run1, runs.get(0)); - assertSame(run2, runs.get(1)); - - // as getShapes() - List<HSLFShape> sh = slide.getShapes(); - assertEquals(2, sh.size()); - assertTrue(sh.get(0) instanceof HSLFTextBox); - HSLFTextBox box1 = (HSLFTextBox)sh.get(0); - assertSame(run1, box1.getTextParagraphs()); - HSLFTextBox box2 = (HSLFTextBox)sh.get(1); - assertSame(run2, box2.getTextParagraphs()); - - // test Table - a complex group of shapes containing text objects - HSLFSlide slide2 = ppt.createSlide(); - assertTrue(slide2.getTextParagraphs().isEmpty()); - HSLFTable table = new HSLFTable(2, 2); - slide2.addShape(table); - runs = slide2.getTextParagraphs(); - assertNotNull(runs); - assertEquals(4, runs.size()); - ppt.close(); + try (HSLFSlideShow ppt = new HSLFSlideShow()) { + HSLFSlide slide = ppt.createSlide(); + + assertEquals(0, slide.getTextParagraphs().size()); + + HSLFTextBox shape1 = new HSLFTextBox(); + List<HSLFTextParagraph> run1 = shape1.getTextParagraphs(); + shape1.setText("Text 1"); + slide.addShape(shape1); + + //The array of Slide's text runs must be updated when new text shapes are added. + List<List<HSLFTextParagraph>> runs = slide.getTextParagraphs(); + assertNotNull(runs); + assertSame(run1, runs.get(0)); + + HSLFTextBox shape2 = new HSLFTextBox(); + List<HSLFTextParagraph> run2 = shape2.getTextParagraphs(); + shape2.setText("Text 2"); + slide.addShape(shape2); + + runs = slide.getTextParagraphs(); + assertEquals(2, runs.size()); + + assertSame(run1, runs.get(0)); + assertSame(run2, runs.get(1)); + + // as getShapes() + List<HSLFShape> sh = slide.getShapes(); + assertEquals(2, sh.size()); + assertTrue(sh.get(0) instanceof HSLFTextBox); + HSLFTextBox box1 = (HSLFTextBox) sh.get(0); + assertSame(run1, box1.getTextParagraphs()); + HSLFTextBox box2 = (HSLFTextBox) sh.get(1); + assertSame(run2, box2.getTextParagraphs()); + + // test Table - a complex group of shapes containing text objects + HSLFSlide slide2 = ppt.createSlide(); + assertTrue(slide2.getTextParagraphs().isEmpty()); + HSLFTable table = new HSLFTable(2, 2); + slide2.addShape(table); + runs = slide2.getTextParagraphs(); + assertNotNull(runs); + assertEquals(4, runs.size()); + } } @Test void test48916() throws IOException { - HSLFSlideShow ppt1 = HSLFTestDataSamples.getSlideShow("SampleShow.ppt"); - List<HSLFSlide> slides = ppt1.getSlides(); - for(HSLFSlide slide : slides){ - for(HSLFShape sh : slide.getShapes()){ - if (!(sh instanceof HSLFTextShape)) continue; - HSLFTextShape tx = (HSLFTextShape)sh; - List<HSLFTextParagraph> paras = tx.getTextParagraphs(); - //verify that records cached in TextRun and EscherTextboxWrapper are the same - org.apache.poi.hslf.record.Record[] runChildren = paras.get(0).getRecords(); - org.apache.poi.hslf.record.Record[] txboxChildren = tx.getEscherTextboxWrapper().getChildRecords(); - assertEquals(runChildren.length, txboxChildren.length); - for(int i=0; i < txboxChildren.length; i++){ - assertSame(txboxChildren[i], runChildren[i]); - } - // caused NPE prior to fix of Bugzilla #48916 - for (HSLFTextParagraph p : paras) { - for (HSLFTextRun rt : p.getTextRuns()) { - rt.setBold(true); - rt.setFontColor(Color.RED); + try (HSLFSlideShow ppt1 = getSlideShow("SampleShow.ppt")) { + List<HSLFSlide> slides = ppt1.getSlides(); + for (HSLFSlide slide : slides) { + for (HSLFShape sh : slide.getShapes()) { + if (!(sh instanceof HSLFTextShape)) continue; + HSLFTextShape tx = (HSLFTextShape) sh; + List<HSLFTextParagraph> paras = tx.getTextParagraphs(); + //verify that records cached in TextRun and EscherTextboxWrapper are the same + org.apache.poi.hslf.record.Record[] runChildren = paras.get(0).getRecords(); + org.apache.poi.hslf.record.Record[] txboxChildren = tx.getEscherTextboxWrapper().getChildRecords(); + assertEquals(runChildren.length, txboxChildren.length); + for (int i = 0; i < txboxChildren.length; i++) { + assertSame(txboxChildren[i], runChildren[i]); + } + // caused NPE prior to fix of Bugzilla #48916 + for (HSLFTextParagraph p : paras) { + for (HSLFTextRun rt : p.getTextRuns()) { + rt.setBold(true); + rt.setFontColor(Color.RED); + } } + // tx.storeText(); } - // tx.storeText(); } - } - HSLFSlideShow ppt2 = HSLFTestDataSamples.writeOutAndReadBack(ppt1); - for(HSLFSlide slide : ppt2.getSlides()){ - for(HSLFShape sh : slide.getShapes()){ - if(sh instanceof HSLFTextShape){ - HSLFTextShape tx = (HSLFTextShape)sh; - List<HSLFTextParagraph> run = tx.getTextParagraphs(); - HSLFTextRun rt = run.get(0).getTextRuns().get(0); - assertTrue(rt.isBold()); - assertEquals(Color.RED, getColor(rt.getFontColor())); - } + try (HSLFSlideShow ppt2 = HSLFTestDataSamples.writeOutAndReadBack(ppt1)) { + List<HSLFTextRun> runs = ppt2.getSlides().stream() + .flatMap(s -> s.getShapes().stream()) + .filter(s -> s instanceof HSLFTextShape) + .map(s -> ((HSLFTextShape) s).getTextParagraphs().get(0).getTextRuns().get(0)) + .collect(Collectors.toList()); + + assertFalse(runs.isEmpty()); + assertTrue(runs.stream().allMatch(HSLFTextRun::isBold)); + assertTrue(runs.stream().map(HSLFTextRun::getFontColor) + .map(BaseTestSlideShow::getColor).allMatch(Color.RED::equals)); } } - ppt2.close(); - ppt1.close(); } @Test void test52244() throws IOException { - HSLFSlideShow ppt = HSLFTestDataSamples.getSlideShow("52244.ppt"); - HSLFSlide slide = ppt.getSlides().get(0); + try (HSLFSlideShow ppt = getSlideShow("52244.ppt")) { + HSLFSlide slide = ppt.getSlides().get(0); - int[] sizes = {36, 24, 12, 32, 12, 12}; + List<HSLFTextRun> runs = slide.getTextParagraphs().stream().map(tp -> tp.get(0).getTextRuns().get(0)).collect(Collectors.toList()); + assertTrue(runs.stream().map(HSLFTextRun::getFontFamily).allMatch("Arial"::equals)); - int i=0; - for (List<HSLFTextParagraph> textParas : slide.getTextParagraphs()) { - HSLFTextRun first = textParas.get(0).getTextRuns().get(0); - assertEquals("Arial", first.getFontFamily()); - assertNotNull(first.getFontSize()); - assertEquals(sizes[i++], first.getFontSize().intValue()); + int[] exp = {36, 24, 12, 32, 12, 12}; + int[] act = runs.stream().map(HSLFTextRun::getFontSize).mapToInt(Double::intValue).toArray(); + assertArrayEquals(exp, act); } - ppt.close(); } @Test @@ -583,4 +556,66 @@ public final class TestTextRun { assertEquals("\npara", title.getText()); } } + + @Test + void datetimeFormats() throws IOException { + LocalDateTime ldt = LocalDateTime.of(2012, 3, 4, 23, 45, 26); + final Map<Locale, String[]> formats = new HashMap<>(); + formats.put(Locale.GERMANY, new String[]{ + "04.03.2012", + "Sonntag, 4. M\u00e4rz 2012", + "04/03/12", + "4. M\u00e4rz 2012", + "12-03-04", + "M\u00e4rz 12", + "M\u00e4r-12", + "04.03.12 23:45", + "04.03.12 23:45:26", + "23:45", + "23:45:26", + "11:45", + "11:45:26" + }); + formats.put(Locale.US, new String[]{ + "03/04/2012", + "Sunday, March 4, 2012", + "4 March 2012", + "March 04, 2012", + "4-Mar-12", + "March 12", + "Mar-12", + "3/4/12 11:45 PM", + "3/4/12 11:45:26 PM", + "23:45", + "23:45:26", + "11:45 PM", + "11:45:26 PM" + }); + + + try (HSLFSlideShow ppt = getSlideShow("datetime.ppt")) { + List<HSLFTextShape> shapes = ppt.getSlides().get(0).getShapes() + .stream().map(HSLFTextShape.class::cast).collect(Collectors.toList()); + + int[] expFormatId = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 }; + int[] actFormatId = shapes.stream().flatMap(tp -> Stream.of(tp.getTextParagraphs().get(0).getRecords())) + .filter(r -> r instanceof DateTimeMCAtom) + .mapToInt(r -> ((DateTimeMCAtom)r).getIndex()).toArray(); + assertArrayEquals(expFormatId, actFormatId); + + List<HSLFShapePlaceholderDetails> phs = shapes.stream().map(HSLFSimpleShape::getPlaceholderDetails).collect(Collectors.toList()); + + for (Map.Entry<Locale,String[]> me : formats.entrySet()) { + LocaleUtil.setUserLocale(me.getKey()); + + // refresh internal members + phs.forEach(PlaceholderDetails::getPlaceholder); + + String[] actDate = phs.stream().map(PlaceholderDetails::getDateFormat).map(ldt::format).toArray(String[]::new); + assertArrayEquals(me.getValue(), actDate); + } + } finally { + LocaleUtil.resetUserLocale(); + } + } } |