Tests for fixes associated with Bug 39324

git-svn-id: https://svn.apache.org/repos/asf/jakarta/poi/trunk@395882 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Nick Burch 2006-04-21 13:45:04 +00:00
parent 43d7696efd
commit 55e3a643b6
2 changed files with 314 additions and 28 deletions

View File

@ -0,0 +1,86 @@
/* ====================================================================
Copyright 2002-2004 Apache Software Foundation
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
==================================================================== */
package org.apache.poi.hslf.model;
import junit.framework.TestCase;
import org.apache.poi.hslf.usermodel.SlideShow;
import org.apache.poi.hslf.usermodel.RichTextRun;
import org.apache.poi.hslf.HSLFSlideShow;
import java.awt.*;
import java.awt.Rectangle;
import java.io.ByteArrayOutputStream;
import java.io.ByteArrayInputStream;
import java.io.FileOutputStream;
import java.util.ArrayList;
/**
* Test setting text properties of newly added TextBoxes
*
* @author Yegor Kozlov
*/
public class TestSetBoldItalic extends TestCase {
/**
* Verify that we can add TextBox shapes to a slide
* and set some of the style attributes
*/
public void testTextBoxWrite() throws Exception {
//String dirname = System.getProperty("HSLF.testdata.path");
//String filename = dirname + "/with_textbox.ppt";
//new SlideShow(new HSLFSlideShow(filename));
SlideShow ppt = new SlideShow();
Slide sl = ppt.createSlide();
RichTextRun rt;
String val = "Hello, World!";
// Create a new textbox, and give it lots of properties
TextBox txtbox = new TextBox();
txtbox.setText(val);
txtbox.setFontSize(42);
txtbox.setBold(true);
txtbox.setItalic(true);
txtbox.setUnderline(false);
sl.addShape(txtbox);
// Check it before save
rt = txtbox.getRichTextRuns()[0];
assertEquals(val, rt.getText());
assertEquals(42, rt.getFontSize());
assertTrue(rt.isBold());
assertTrue(rt.isItalic());
// Serialize and read again
ByteArrayOutputStream out = new ByteArrayOutputStream();
ppt.write(out);
out.close();
ppt = new SlideShow(new HSLFSlideShow(new ByteArrayInputStream(out.toByteArray())));
sl = ppt.getSlides()[0];
txtbox = (TextBox)sl.getShapes()[0];
rt = txtbox.getRichTextRuns()[0];
// Check after save
assertEquals(val, rt.getText());
assertEquals(42, rt.getFontSize());
assertTrue(rt.isBold());
assertTrue(rt.isItalic());
assertFalse(rt.isUnderlined());
}
}

View File

@ -52,26 +52,55 @@ public class TestStyleTextPropAtom extends TestCase {
// left aligned+bold (30)
// centre aligned+italic+blue (28)
// right aligned+red (25)
// left aligned+underlined+larger font size (97)
// left aligned+underlined+larger font size (96)
// left aligned+underlined+larger font size+red (1)
private byte[] data_b = new byte[] {
00, 00, 0xA1-256, 0x0F, 0x80-256, 00,
00, 00, 0x1E, 00, 00, 00, 00, 00,
00, 0x18, 00, 00, 00, 00, 0x50, 00,
0x1C, 00, 00, 00, 00, 00, 00, 0x10,
00, 00, 0x50, 00, 0x19, 00, 00, 00,
00, 00, 00, 0x18, 00, 00, 02, 00,
0x50, 00, 0x61, 00, 00, 00, 00, 00,
00, 0x18, 00, 00, 00, 00, 0x50, 00,
0x1E, 00, 00, 00, 01, 00, 02, 00,
01, 00, 0x14, 00, 0x1C, 00, 00, 00,
02, 00, 06, 00, 02, 00, 0x14, 00,
00, 00, 00, 05, 0x19, 00, 00, 00,
00, 00, 06, 00, 0x14, 00, 0xFF-256, 0x33,
00, 0xFE-256, 0x60, 00, 00, 00, 04, 00,
03, 00, 04, 00, 01, 00, 0x18, 00,
01, 00, 00, 00, 04, 00, 07, 00,
04, 00, 01, 00, 0x18, 00, 0xFF-256, 0x33,
00, 0xFE-256
0, 0, 0xA1-256, 0x0F, 0x80-256, 0, 0, 0,
0x1E, 00, 00, 00, // paragraph is 30 long
00, 00, // paragraph reserved field
00, 0x18, 00, 00, // mask is 0x1800
00, 00, // left aligned
0x50, 00, // line spacing 80
0x1C, 00, 00, 00, // paragprah is 28 long
00, 00, // paragraph reserved field
00, 0x10, 00, 00, // mask is 0x1000
0x50, 00, // line spacing 80
0x19, 00, 00, 00, // paragraph is 25 long
00, 00, // paragraph reserved field
00, 0x18, 00, 00, // mask is 0x1800
02, 00, // right aligned
0x50, 00, // line spacing 80
0x61, 00, 00, 00, // paragraph is 97 long
00, 00, // paragraph reserved field
00, 0x18, 00, 00, // mask is 0x1800
00, 00, // left aligned
0x50, 00, // line spacing 80
0x1E, 00, 00, 00, // character run is 30 long
01, 00, 02, 00, // mask is 0x020001
01, 00, // char flags 0x0001 = bold
0x14, 00, // font size 20
0x1C, 00, 00, 00, // character run is 28 long
02, 00, 06, 00, // mask is 0x060002
02, 00, // char flags 0x0002 = italic
0x14, 00, // font size 20
00, 00, 00, 05, // colour blue
0x19, 00, 00, 00, // character run is 25 long
00, 00, 06, 00, // char flags 0x060000
0x14, 00, // font size 20
0xFF-256, 0x33, 00, 0xFE-256, // colour red
0x60, 00, 00, 00, // character run is 96 long
04, 00, 03, 00, // mask is 0x030004
04, 00, // char flags 0x0004 = underlined
01, 00, // font index is 1
0x18, 00, // font size 24
01, 00, 00, 00, // character run is 1 long
04, 00, 07, 00, // mask is 0x070004
04, 00, // char flags 0x0004 = underlined
01, 00, // font index is 1
0x18, 00, // font size 24
0xFF-256, 0x33, 00, 0xFE-256 // colour red
};
private int data_b_text_len = 0xB3;
@ -94,8 +123,8 @@ public class TestStyleTextPropAtom extends TestCase {
// In case A, there is a single styling of the characters
assertEquals(3, stpa.getCharacterStyles().size());
// In case B, there are 4 different stylings
assertEquals(4, stpb.getCharacterStyles().size());
// In case B, there are 5 different stylings
assertEquals(5, stpb.getCharacterStyles().size());
}
public void testParagraphStyleCounts() throws Exception {
@ -371,10 +400,10 @@ public class TestStyleTextPropAtom extends TestCase {
}
/**
* Try to recreate an existing StyleTextPropAtom from the empty
* Try to recreate an existing StyleTextPropAtom (a) from the empty
* constructor, and setting the required properties
*/
public void testCreateFromScatch() throws Exception {
public void testCreateAFromScatch() throws Exception {
// Start with an empty one
StyleTextPropAtom stpa = new StyleTextPropAtom(54);
@ -387,16 +416,14 @@ public class TestStyleTextPropAtom extends TestCase {
tpca.updateTextSize(21);
// Second char style is coloured, 00 00 00 05, and 17 long
TextPropCollection tpcb = new TextPropCollection(17);
TextPropCollection tpcb = stpa.addCharacterTextPropCollection(17);
TextProp tpb = tpcb.addWithName("font.color");
tpb.setValue(0x05000000);
cs.add(tpcb);
// Third char style is coloured, FF 33 00 FE, and 16 long
TextPropCollection tpcc = new TextPropCollection(16);
TextPropCollection tpcc = stpa.addCharacterTextPropCollection(16);
TextProp tpc = tpcc.addWithName("font.color");
tpc.setValue(0xFE0033FF);
cs.add(tpcc);
// Should now be the same as data_a
ByteArrayOutputStream baos = new ByteArrayOutputStream();
@ -409,6 +436,179 @@ public class TestStyleTextPropAtom extends TestCase {
}
}
/**
* Try to recreate an existing StyleTextPropAtom (b) from the empty
* constructor, and setting the required properties
*/
public void testCreateBFromScatch() throws Exception {
// Start with an empty one
StyleTextPropAtom stpa = new StyleTextPropAtom(data_b_text_len);
// Need 4 paragraph styles
LinkedList ps = stpa.getParagraphStyles();
// First is 30 long, left aligned, normal spacing
TextPropCollection tppa = (TextPropCollection)ps.get(0);
tppa.updateTextSize(30);
TextProp tp = tppa.addWithName("alignment");
tp.setValue(0);
tp = tppa.addWithName("linespacing");
tp.setValue(80);
// Second is 28 long, centre aligned and normal spacing
TextPropCollection tppb = stpa.addParagraphTextPropCollection(28);
tp = tppb.addWithName("linespacing");
tp.setValue(80);
// Third is 25 long, right aligned and normal spacing
TextPropCollection tppc = stpa.addParagraphTextPropCollection(25);
tp = tppc.addWithName("alignment");
tp.setValue(2);
tp = tppc.addWithName("linespacing");
tp.setValue(80);
// Forth is left aligned + normal line spacing (despite differing font)
TextPropCollection tppd = stpa.addParagraphTextPropCollection(97);
tp = tppd.addWithName("alignment");
tp.setValue(0);
tp = tppd.addWithName("linespacing");
tp.setValue(80);
// Now do 4 character styles
LinkedList cs = stpa.getCharacterStyles();
// First is 30 long, bold and font size
TextPropCollection tpca = (TextPropCollection)cs.get(0);
tpca.updateTextSize(30);
tp = tpca.addWithName("font.size");
tp.setValue(20);
CharFlagsTextProp cftp = (CharFlagsTextProp)
tpca.addWithName("char_flags");
assertEquals(0, cftp.getValue());
cftp.setSubValue(true, CharFlagsTextProp.BOLD_IDX);
assertEquals(1, cftp.getValue());
// Second is 28 long, blue and italic
TextPropCollection tpcb = stpa.addCharacterTextPropCollection(28);
tp = tpcb.addWithName("font.size");
tp.setValue(20);
tp = tpcb.addWithName("font.color");
tp.setValue(0x05000000);
cftp = (CharFlagsTextProp)tpcb.addWithName("char_flags");
cftp.setSubValue(true, CharFlagsTextProp.ITALIC_IDX);
assertEquals(2, cftp.getValue());
// Third is 25 long and red
TextPropCollection tpcc = stpa.addCharacterTextPropCollection(25);
tp = tpcc.addWithName("font.size");
tp.setValue(20);
tp = tpcc.addWithName("font.color");
tp.setValue(0xfe0033ff);
// Fourth is 96 long, underlined and different+bigger font
TextPropCollection tpcd = stpa.addCharacterTextPropCollection(96);
tp = tpcd.addWithName("font.size");
tp.setValue(24);
tp = tpcd.addWithName("font.index");
tp.setValue(1);
cftp = (CharFlagsTextProp)tpcd.addWithName("char_flags");
cftp.setSubValue(true, CharFlagsTextProp.UNDERLINE_IDX);
assertEquals(4, cftp.getValue());
// Fifth is 1 long, underlined and different+bigger font + red
TextPropCollection tpce = stpa.addCharacterTextPropCollection(1);
tp = tpce.addWithName("font.size");
tp.setValue(24);
tp = tpce.addWithName("font.index");
tp.setValue(1);
tp = tpce.addWithName("font.color");
tp.setValue(0xfe0033ff);
cftp = (CharFlagsTextProp)tpce.addWithName("char_flags");
cftp.setSubValue(true, CharFlagsTextProp.UNDERLINE_IDX);
assertEquals(4, cftp.getValue());
// Check it's as expected
assertEquals(4, stpa.getParagraphStyles().size());
assertEquals(5, stpa.getCharacterStyles().size());
// Compare in detail to b
StyleTextPropAtom stpb = new StyleTextPropAtom(data_b,0,data_b.length);
stpb.setParentTextSize(data_b_text_len);
LinkedList psb = stpb.getParagraphStyles();
LinkedList csb = stpb.getCharacterStyles();
assertEquals(psb.size(), ps.size());
assertEquals(csb.size(), cs.size());
// Ensure Paragraph Character styles match
for(int z=0; z<2; z++) {
LinkedList lla = cs;
LinkedList llb = csb;
int upto = 5;
if(z == 1) {
lla = ps;
llb = psb;
upto = 4;
}
for(int i=0; i<upto; i++) {
TextPropCollection ca = (TextPropCollection)lla.get(i);
TextPropCollection cb = (TextPropCollection)llb.get(i);
assertEquals(ca.getCharactersCovered(), cb.getCharactersCovered());
assertEquals(ca.getTextPropList().size(), cb.getTextPropList().size());
for(int j=0; j<ca.getTextPropList().size(); j++) {
TextProp tpa = (TextProp)ca.getTextPropList().get(j);
TextProp tpb = (TextProp)cb.getTextPropList().get(j);
//System.out.println("TP " + i + " " + j + " " + tpa.getName() + "\t" + tpa.getValue() );
assertEquals(tpa.getName(), tpb.getName());
assertEquals(tpa.getMask(), tpb.getMask());
assertEquals(tpa.getWriteMask(), tpb.getWriteMask());
assertEquals(tpa.getValue(), tpb.getValue());
}
ByteArrayOutputStream ba = new ByteArrayOutputStream();
ByteArrayOutputStream bb = new ByteArrayOutputStream();
ca.writeOut(ba);
cb.writeOut(bb);
byte[] cab = ba.toByteArray();
byte[] cbb = bb.toByteArray();
assertEquals(cbb.length, cab.length);
for(int j=0; j<cab.length; j++) {
//System.out.println("On tp " + z + " " + i + " " + j + "\t" + cab[j] + "\t" + cbb[j]);
assertEquals(cbb[j], cab[j]);
}
}
}
// Check byte level with b
ByteArrayOutputStream baos = new ByteArrayOutputStream();
stpa.writeOut(baos);
byte[] b = baos.toByteArray();
assertEquals(data_b.length, b.length);
for(int i=0; i<data_b.length; i++) {
System.out.println(i + "\t" + b[i] + "\t" + data_b[i] + "\t" + Integer.toHexString(b[i]) );
assertEquals(data_b[i],b[i]);
}
}
public void testWriteA() throws Exception {
StyleTextPropAtom stpa = new StyleTextPropAtom(data_a,0,data_a.length);
@ -459,7 +659,7 @@ public class TestStyleTextPropAtom extends TestCase {
assertEquals(data_b.length, b.length);
for(int i=0; i<data_b.length; i++) {
System.out.println(i + "\t" + b[i] + "\t" + data_b[i] + "\t" + Integer.toHexString(b[i]) );
//System.out.println(i + "\t" + b[i] + "\t" + data_b[i] + "\t" + Integer.toHexString(b[i]) );
assertEquals(data_b[i],b[i]);
}
}