diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestRichTextRun.java b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestRichTextRun.java
index ecc6aeaf3..fce7e8264 100644
--- a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestRichTextRun.java
+++ b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestRichTextRun.java
@@ -2,10 +2,13 @@ package org.apache.poi.hslf.usermodel;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
+import java.io.FileInputStream;
import org.apache.poi.hslf.HSLFSlideShow;
import org.apache.poi.hslf.model.Slide;
import org.apache.poi.hslf.model.TextRun;
+import org.apache.poi.hslf.record.Record;
+import org.apache.poi.hslf.record.SlideListWithText;
import junit.framework.TestCase;
@@ -25,6 +28,7 @@ public class TestRichTextRun extends TestCase {
private HSLFSlideShow hssRichA;
private HSLFSlideShow hssRichB;
private HSLFSlideShow hssRichC;
+ private String filenameC;
protected void setUp() throws Exception {
String dirname = System.getProperty("HSLF.testdata.path");
@@ -46,8 +50,8 @@ public class TestRichTextRun extends TestCase {
// Rich test file C - has paragraph styles that run out before
// the character ones do
- filename = dirname + "/ParagraphStylesShorterThanCharStyles.ppt";
- hssRichC = new HSLFSlideShow(filename);
+ filenameC = dirname + "/ParagraphStylesShorterThanCharStyles.ppt";
+ hssRichC = new HSLFSlideShow(filenameC);
ssRichC = new SlideShow(hssRichC);
}
@@ -206,9 +210,203 @@ public class TestRichTextRun extends TestCase {
/**
* Test that we can do the right things when the paragraph styles
* run out before the character styles do
- * NOTE: Disabled, as we can't currently do this!
*/
- public void BROKENtestParagraphStylesShorterTheCharStyles() {
- // TODO
+ public void testParagraphStylesShorterTheCharStyles() {
+ // Check we have the right number of sheets
+ Slide[] slides = ssRichC.getSlides();
+ assertEquals(14, slides.length);
+
+ // Check the number of text runs on interesting sheets
+ Slide slideThreeC = ssRichC.getSlides()[2];
+ Slide slideSevenC = ssRichC.getSlides()[6];
+ assertEquals(3, slideThreeC.getTextRuns().length);
+ assertEquals(5, slideSevenC.getTextRuns().length);
+
+ // On slide three, we should have:
+ // TR:
+ // You are an important supplier of various items that I need
+ // .
+ // TR:
+ // Source: Internal focus groups
+ // TR:
+ // Illustrative Example
+ // .
+
+ TextRun[] s3tr = slideThreeC.getTextRuns();
+ RichTextRun[] s3rtr0 = s3tr[0].getRichTextRuns();
+ RichTextRun[] s3rtr1 = s3tr[1].getRichTextRuns();
+ RichTextRun[] s3rtr2 = s3tr[2].getRichTextRuns();
+
+ assertEquals(2, s3rtr0.length);
+ assertEquals(1, s3rtr1.length);
+ assertEquals(2, s3rtr2.length);
+
+ assertEquals("You are an important supplier of various items that I need", s3rtr0[0].getText());
+ assertEquals("", s3rtr0[1].getText());
+ assertEquals("Source: Internal focus groups", s3rtr1[0].getText());
+ assertEquals("Illustrative Example", s3rtr2[0].getText());
+ assertEquals("", s3rtr2[1].getText());
+
+ assertTrue(s3rtr0[0]._isParagraphStyleShared());
+ assertTrue(s3rtr0[1]._isParagraphStyleShared());
+ assertFalse(s3rtr1[0]._isParagraphStyleShared());
+ assertTrue(s3rtr2[0]._isParagraphStyleShared());
+ assertTrue(s3rtr2[1]._isParagraphStyleShared());
+
+ assertFalse(s3rtr0[0]._isCharacterStyleShared());
+ assertFalse(s3rtr0[1]._isCharacterStyleShared());
+ assertFalse(s3rtr1[0]._isCharacterStyleShared());
+ assertFalse(s3rtr2[0]._isCharacterStyleShared());
+ assertFalse(s3rtr2[1]._isCharacterStyleShared());
+
+ // On slide seven, we have:
+ // TR:
+ // (text)
+ // TR:
+ // (text a)(text a)(text b)
+ // TR:
+ // (text)
+ TextRun[] s7tr = slideSevenC.getTextRuns();
+ RichTextRun[] s7rtr0 = s7tr[0].getRichTextRuns();
+ RichTextRun[] s7rtr1 = s7tr[1].getRichTextRuns();
+ RichTextRun[] s7rtr2 = s7tr[2].getRichTextRuns();
+
+ assertEquals(1, s7rtr0.length);
+ assertEquals(3, s7rtr1.length);
+ assertEquals(1, s7rtr2.length);
+
+ assertFalse(s7rtr0[0]._isParagraphStyleShared());
+ assertFalse(s7rtr1[0]._isParagraphStyleShared());
+ assertTrue(s7rtr1[1]._isParagraphStyleShared());
+ assertTrue(s7rtr1[2]._isParagraphStyleShared());
+ assertFalse(s7rtr2[0]._isParagraphStyleShared());
+
+ assertFalse(s7rtr0[0]._isCharacterStyleShared());
+ assertTrue(s7rtr1[0]._isCharacterStyleShared());
+ assertTrue(s7rtr1[1]._isCharacterStyleShared());
+ assertFalse(s7rtr1[2]._isCharacterStyleShared());
+ assertFalse(s7rtr2[0]._isCharacterStyleShared());
+ }
+
+ /**
+ * Test that we can do the right things when the paragraph styles
+ * run out before the character styles do, when we tweak something
+ * and write back out.
+ */
+ public void testParagraphStylesShorterTheCharStylesWrite() throws Exception {
+ assertMatchesSLTWC(ssRichC);
+ assertMatchesFileC(ssRichC);
+
+ Slide slideSevenC = ssRichC.getSlides()[6];
+ TextRun[] s7tr = slideSevenC.getTextRuns();
+ RichTextRun[] s7rtr0 = s7tr[0].getRichTextRuns();
+ RichTextRun[] s7rtr1 = s7tr[1].getRichTextRuns();
+ RichTextRun[] s7rtr2 = s7tr[2].getRichTextRuns();
+
+ String oldText;
+
+ // Reset the text on the last run
+ // Need to ensure it's a run that really has styles!
+ oldText = s7rtr2[0].getRawText();
+ s7rtr2[0].setText( oldText );
+ assertEquals(oldText, s7rtr2[0].getText());
+ assertEquals(oldText, s7tr[2].getText());
+ assertEquals(oldText.length() + 1, s7rtr2[0]._getRawCharacterStyle().getCharactersCovered());
+ assertEquals(oldText.length() + 1, s7rtr2[0]._getRawParagraphStyle().getCharactersCovered());
+ assertMatchesSLTWC(ssRichC);
+ assertMatchesFileC(ssRichC);
+
+ // Reset the text on a shared paragraph
+ oldText = s7rtr1[2].getRawText();
+ s7rtr1[2].setText( oldText );
+ assertEquals(oldText, s7rtr1[2].getText());
+ assertEquals(oldText.length() + 1, s7rtr1[2]._getRawCharacterStyle().getCharactersCovered());
+ assertMatchesSLTWC(ssRichC);
+ assertMatchesFileC(ssRichC);
+
+ // Reset the text on a shared paragraph+character
+ s7rtr1[1].setText( s7rtr1[1].getRawText() );
+ assertMatchesSLTWC(ssRichC);
+ assertMatchesFileC(ssRichC);
+ }
+
+ /**
+ * Opens a new copy of SlideShow C, writes the active
+ * SlideListWithText out, and compares it to the write
+ * out of the supplied SlideShow. Also compares the
+ * contents.
+ * @param s
+ */
+ private void assertMatchesSLTWC(SlideShow s) throws Exception {
+ // Grab a new copy of slideshow C
+ SlideShow refC = new SlideShow(new HSLFSlideShow(filenameC));
+
+ // Write out the 2nd SLWT in the active document
+ SlideListWithText refSLWT = refC.getDocumentRecord().getSlideListWithTexts()[1];
+ byte[] raw_slwt = writeRecord(refSLWT);
+
+ // Write out the same for the supplied slideshow
+ SlideListWithText s_SLWT = s.getDocumentRecord().getSlideListWithTexts()[1];
+ byte[] s_slwt = writeRecord(s_SLWT);
+
+ // Check the records are the same
+ assertEquals(refSLWT.getChildRecords().length, s_SLWT.getChildRecords().length);
+ for(int i=0; i 0) {
+ fb.write(b, 0, read);
+ }
+ }
+ byte[] raw_file = fb.toByteArray();
+
+ // Now write out the slideshow
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ s.write(baos);
+ byte[] raw_ss = baos.toByteArray();
+
+ // Ensure they're the same
+ assertEquals(raw_file.length, raw_ss.length);
+ for(int i=0; i