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:
parent
053951da78
commit
59ff1beb2b
@ -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();
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user