Author: nick Date: Tue Jun 13 07:58:46 2006 New Revision: 413914 URL: http://svn.apache.org/viewvc?rev=413914&view=rev Log: Tests for new RichText code
Modified: jakarta/poi/trunk/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestRichTextRun.java Modified: jakarta/poi/trunk/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestRichTextRun.java URL: http://svn.apache.org/viewvc/jakarta/poi/trunk/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestRichTextRun.java?rev=413914&r1=413913&r2=413914&view=diff ============================================================================== --- jakarta/poi/trunk/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestRichTextRun.java (original) +++ jakarta/poi/trunk/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestRichTextRun.java Tue Jun 13 07:58:46 2006 @@ -2,10 +2,13 @@ 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 @@ 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 @@ // 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 @@ /** * 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: + // <ps>(text a)</ps><ps>(text a)(text b)</ps> + // 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<refSLWT.getChildRecords().length; i++) { + Record ref_r = refSLWT.getChildRecords()[i]; + Record s_r = s_SLWT.getChildRecords()[i]; + + byte[] r_rb = writeRecord(ref_r); + byte[] s_rb = writeRecord(s_r); + assertEquals(r_rb.length, s_rb.length); + for(int j=0; j<r_rb.length; j++) { + assertEquals(r_rb[j],s_rb[j]); + } + } + + // Check the bytes are the same + assertEquals(raw_slwt.length, s_slwt.length); + for(int i=0; i<raw_slwt.length; i++) { + assertEquals(raw_slwt[i], s_slwt[i]); + } + } + + /** + * Checks that the supplied slideshow still matches the bytes + * of slideshow c + */ + private void assertMatchesFileC(SlideShow s) throws Exception { + // Disabled, pending fix of bug #39800 + System.err.println("Skipping test, as would be marked as failed due to bug #39800"); +if(false) { + // Grab the bytes of the file + FileInputStream fin = new FileInputStream(filenameC); + ByteArrayOutputStream fb = new ByteArrayOutputStream(); + byte[] b = new byte[4096]; + int read = 0; + while(read != -1) { + read = fin.read(b); + if(read > 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<raw_file.length; i++) { + assertEquals(raw_file[i], raw_ss[i]); + } +} + } + + private byte[] writeRecord(Record r) throws Exception { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + r.writeOut(baos); + return baos.toByteArray(); } } --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] Mailing List: http://jakarta.apache.org/site/mail2.html#poi The Apache Jakarta POI Project: http://jakarta.apache.org/poi/