Tests for new RichText code

git-svn-id: https://svn.apache.org/repos/asf/jakarta/poi/trunk@413914 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Nick Burch 2006-06-13 14:58:46 +00:00
parent 053951da78
commit 59ff1beb2b

View File

@ -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:
// <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();
}
}