aboutsummaryrefslogtreecommitdiffstats
path: root/src/scratchpad
diff options
context:
space:
mode:
authorAndreas Beeker <kiwiwings@apache.org>2015-05-24 01:10:12 +0000
committerAndreas Beeker <kiwiwings@apache.org>2015-05-24 01:10:12 +0000
commit86c7025e066ec8986b296f2f5d8f9bb6cd5f6612 (patch)
treec02e92f508ffc319bdbe14f487d81caa252289c5 /src/scratchpad
parentd49b2b6b512fa42fe82fd98eb9e58b5eeec1a94e (diff)
downloadpoi-86c7025e066ec8986b296f2f5d8f9bb6cd5f6612.tar.gz
poi-86c7025e066ec8986b296f2f5d8f9bb6cd5f6612.zip
Fixed some style related corner cases and adapted the tests for it
git-svn-id: https://svn.apache.org/repos/asf/poi/branches/common_sl@1681411 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'src/scratchpad')
-rw-r--r--src/scratchpad/src/org/apache/poi/hslf/model/textproperties/BitMaskTextProp.java73
-rw-r--r--src/scratchpad/src/org/apache/poi/hslf/model/textproperties/CharFlagsTextProp.java35
-rw-r--r--src/scratchpad/src/org/apache/poi/hslf/model/textproperties/ParagraphFlagsTextProp.java10
-rw-r--r--src/scratchpad/src/org/apache/poi/hslf/model/textproperties/TextPropCollection.java19
-rw-r--r--src/scratchpad/src/org/apache/poi/hslf/model/textproperties/WrapFlagsTextProp.java30
-rw-r--r--src/scratchpad/src/org/apache/poi/hslf/record/StyleTextPropAtom.java4
-rw-r--r--src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSlideShow.java8
-rw-r--r--src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextRun.java4
-rw-r--r--src/scratchpad/testcases/org/apache/poi/hslf/record/TestStyleTextPropAtom.java69
9 files changed, 185 insertions, 67 deletions
diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/BitMaskTextProp.java b/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/BitMaskTextProp.java
index 15fdc1991f..c76b05cd25 100644
--- a/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/BitMaskTextProp.java
+++ b/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/BitMaskTextProp.java
@@ -17,6 +17,10 @@
package org.apache.poi.hslf.model.textproperties;
+import org.apache.poi.hslf.record.Record;
+import org.apache.poi.util.POILogFactory;
+import org.apache.poi.util.POILogger;
+
/**
* Definition of a special kind of property of some text, or its
* paragraph. For these properties, a flag in the "contains" header
@@ -25,7 +29,9 @@ package org.apache.poi.hslf.model.textproperties;
* (but related) properties
*/
public abstract class BitMaskTextProp extends TextProp implements Cloneable {
- private String[] subPropNames;
+ protected static final POILogger logger = POILogFactory.getLogger(BitMaskTextProp.class);
+
+ private String[] subPropNames;
private int[] subPropMasks;
private boolean[] subPropMatches;
@@ -34,22 +40,25 @@ public abstract class BitMaskTextProp extends TextProp implements Cloneable {
/** Fetch the list of if the sub properties match or not */
public boolean[] getSubPropMatches() { return subPropMatches; }
- public BitMaskTextProp(int sizeOfDataBlock, int maskInHeader, String overallName, String[] subPropNames) {
+ protected BitMaskTextProp(int sizeOfDataBlock, int maskInHeader, String overallName, String... subPropNames) {
super(sizeOfDataBlock,maskInHeader,"bitmask");
this.subPropNames = subPropNames;
this.propName = overallName;
subPropMasks = new int[subPropNames.length];
subPropMatches = new boolean[subPropNames.length];
+ int LSB = Integer.lowestOneBit(maskInHeader);
+
// Initialise the masks list
for(int i=0; i<subPropMasks.length; i++) {
- subPropMasks[i] = (1 << i);
+ subPropMasks[i] = (LSB << i);
}
}
/**
* Calculate mask from the subPropMatches.
*/
+ @Override
public int getWriteMask() {
/*
* The dataValue can't be taken as a mask, as sometimes certain properties
@@ -63,17 +72,39 @@ public abstract class BitMaskTextProp extends TextProp implements Cloneable {
return mask;
}
- public void setWriteMask(int containsField) {
+ /**
+ * Sets the write mask, i.e. which defines the text properties to be considered
+ *
+ * @param writeMask the mask, bit values outside the property mask range will be ignored
+ */
+ public void setWriteMask(int writeMask) {
int i = 0;
for (int subMask : subPropMasks) {
- if ((containsField & subMask) != 0) subPropMatches[i] = true;
- i++;
+ subPropMatches[i++] = ((writeMask & subMask) != 0);
}
}
+
+ /**
+ * Return the text property value.
+ * Clears all bits of the value, which are marked as unset.
+ *
+ * @return the text property value.
+ */
+ @Override
+ public int getValue() {
+ int val = dataValue, i = 0;;
+ for (int mask : subPropMasks) {
+ if (!subPropMatches[i++]) {
+ val &= ~mask;
+ }
+ }
+ return val;
+ }
+
/**
* Set the value of the text property, and recompute the sub
- * properties based on it, i.e. all unset subvalues won't be saved.
+ * properties based on it, i.e. all unset subvalues will be cleared.
* Use {@link #setSubValue(boolean, int)} to explicitly set subvalues to {@code false}.
*/
@Override
@@ -88,10 +119,36 @@ public abstract class BitMaskTextProp extends TextProp implements Cloneable {
}
/**
+ * Convenience method to set a value with mask, without splitting it into the subvalues
+ *
+ * @param val
+ * @param writeMask
+ */
+ public void setValueWithMask(int val, int writeMask) {
+ setWriteMask(writeMask);
+ dataValue = val;
+ dataValue = getValue();
+ if (val != dataValue) {
+ logger.log(POILogger.WARN, "Style properties of '"+getName()+"' don't match mask - output will be sanitized");
+ if (logger.check(POILogger.DEBUG)) {
+ StringBuilder sb = new StringBuilder("The following style attributes of the '"+getName()+"' property will be ignored:\n");
+ int i=0;
+ for (int mask : subPropMasks) {
+ if (!subPropMatches[i] && (val & mask) != 0) {
+ sb.append(subPropNames[i]+",");
+ }
+ i++;
+ }
+ logger.log(POILogger.DEBUG, sb.toString());
+ }
+ }
+ }
+
+ /**
* Fetch the true/false status of the subproperty with the given index
*/
public boolean getSubValue(int idx) {
- return (dataValue & subPropMasks[idx]) != 0;
+ return subPropMatches[idx] && ((dataValue & subPropMasks[idx]) != 0);
}
/**
diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/CharFlagsTextProp.java b/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/CharFlagsTextProp.java
index 54f1cbf382..f7cd037010 100644
--- a/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/CharFlagsTextProp.java
+++ b/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/CharFlagsTextProp.java
@@ -34,24 +34,23 @@ public class CharFlagsTextProp extends BitMaskTextProp {
public static final String NAME = "char_flags";
public CharFlagsTextProp() {
- super(2, 0xffff, NAME, new String[] {
- "bold", // 0x0001 A bit that specifies whether the characters are bold.
- "italic", // 0x0002 A bit that specifies whether the characters are italicized.
- "underline", // 0x0004 A bit that specifies whether the characters are underlined.
- "unused1", // 0x0008 Undefined and MUST be ignored.
- "shadow", // 0x0010 A bit that specifies whether the characters have a shadow effect.
- "fehint", // 0x0020 A bit that specifies whether characters originated from double-byte input.
- "unused2", // 0x0040 Undefined and MUST be ignored.
- "kumi", // 0x0080 A bit that specifies whether Kumimoji are used for vertical text.
- "strikethrough", // 0x0100 Undefined and MUST be ignored.
- "emboss", // 0x0200 A bit that specifies whether the characters are embossed.
- "pp9rt_1", // 0x0400 An unsigned integer that specifies the run grouping of additional text properties in StyleTextProp9Atom record.
- "pp9rt_2", // 0x0800
- "pp9rt_3", // 0x1000
- "pp9rt_4", // 0x2000
- "unused4_1", // 0x4000 Undefined and MUST be ignored.
- "unused4_2", // 0x8000 Undefined and MUST be ignored.
- }
+ super(2, 0xffff, NAME,
+ "bold", // 0x0001 A bit that specifies whether the characters are bold.
+ "italic", // 0x0002 A bit that specifies whether the characters are italicized.
+ "underline", // 0x0004 A bit that specifies whether the characters are underlined.
+ "unused1", // 0x0008 Undefined and MUST be ignored.
+ "shadow", // 0x0010 A bit that specifies whether the characters have a shadow effect.
+ "fehint", // 0x0020 A bit that specifies whether characters originated from double-byte input.
+ "unused2", // 0x0040 Undefined and MUST be ignored.
+ "kumi", // 0x0080 A bit that specifies whether Kumimoji are used for vertical text.
+ "strikethrough", // 0x0100 Undefined and MUST be ignored.
+ "emboss", // 0x0200 A bit that specifies whether the characters are embossed.
+ "pp9rt_1", // 0x0400 An unsigned integer that specifies the run grouping of additional text properties in StyleTextProp9Atom record.
+ "pp9rt_2", // 0x0800
+ "pp9rt_3", // 0x1000
+ "pp9rt_4", // 0x2000
+ "unused4_1", // 0x4000 Undefined and MUST be ignored.
+ "unused4_2" // 0x8000 Undefined and MUST be ignored.
);
}
} \ No newline at end of file
diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/ParagraphFlagsTextProp.java b/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/ParagraphFlagsTextProp.java
index c0501d2f90..d7c6072eed 100644
--- a/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/ParagraphFlagsTextProp.java
+++ b/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/ParagraphFlagsTextProp.java
@@ -31,11 +31,11 @@ public final class ParagraphFlagsTextProp extends BitMaskTextProp {
public static final String NAME = "paragraph_flags";
public ParagraphFlagsTextProp() {
- super(2, 0xF, NAME, new String[] {
- "bullet",
- "bullet.hardfont",
- "bullet.hardcolor",
- "bullet.hardsize"}
+ super(2, 0xF, NAME,
+ "bullet",
+ "bullet.hardfont",
+ "bullet.hardcolor",
+ "bullet.hardsize"
);
}
}
diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/TextPropCollection.java b/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/TextPropCollection.java
index 2c8fd1dbf1..0e46e6a7f5 100644
--- a/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/TextPropCollection.java
+++ b/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/TextPropCollection.java
@@ -87,7 +87,7 @@ public class TextPropCollection {
new TextProp(2, 0x8000, "defaultTabSize"),
new TabStopPropCollection(), // tabstops size is variable!
new FontAlignmentProp(),
- new TextProp(2, 0xE0000, "wrapFlags"), // charWrap | wordWrap | overflow
+ new WrapFlagsTextProp(),
new TextProp(2, 0x200000, "textDirection"),
// 0x400000 MUST be zero and MUST be ignored
new TextProp(0, 0x800000, "bullet.blip"), // TODO: check size
@@ -266,9 +266,11 @@ public class TextPropCollection {
maskSpecial |= tp.getMask();
continue;
}
- prop.setValue(val);
+
if (prop instanceof BitMaskTextProp) {
- ((BitMaskTextProp)prop).setWriteMask(containsField);
+ ((BitMaskTextProp)prop).setValueWithMask(val, containsField);
+ } else {
+ prop.setValue(val);
}
bytesPassed += prop.getSize();
addProp(prop);
@@ -318,13 +320,7 @@ public class TextPropCollection {
// Then the mask field
int mask = maskSpecial;
for (TextProp textProp : textPropList) {
- // sometimes header indicates that the bitmask is present but its value is 0
- if (textProp instanceof BitMaskTextProp) {
- if (mask == 0) mask |= textProp.getWriteMask();
- }
- else {
- mask |= textProp.getWriteMask();
- }
+ mask |= textProp.getWriteMask();
}
StyleTextPropAtom.writeLittleEndian(mask,o);
@@ -399,6 +395,9 @@ public class TextPropCollection {
StringBuilder out = new StringBuilder();
out.append(" chars covered: " + getCharactersCovered());
out.append(" special mask flags: 0x" + HexDump.toHex(getSpecialMask()) + "\n");
+ if (textPropType == TextPropType.paragraph) {
+ out.append(" indent level: "+getIndentLevel()+"\n");
+ }
for(TextProp p : getTextPropList()) {
out.append(" " + p.getName() + " = " + p.getValue() );
out.append(" (0x" + HexDump.toHex(p.getValue()) + ")\n");
diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/WrapFlagsTextProp.java b/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/WrapFlagsTextProp.java
new file mode 100644
index 0000000000..eaacbff575
--- /dev/null
+++ b/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/WrapFlagsTextProp.java
@@ -0,0 +1,30 @@
+/* ====================================================================
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You 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.textproperties;
+
+public class WrapFlagsTextProp extends BitMaskTextProp {
+ public static final int CHAR_WRAP_IDX = 0;
+ public static final int WORD_WRAO_IDX = 1;
+ public static final int OVERFLOW_IDX = 2;
+
+ public static final String NAME = "wrapFlags";
+
+ public WrapFlagsTextProp() {
+ super(2, 0xE0000, NAME, "charWrap", "wordWrap", "overflow");
+ }
+}
diff --git a/src/scratchpad/src/org/apache/poi/hslf/record/StyleTextPropAtom.java b/src/scratchpad/src/org/apache/poi/hslf/record/StyleTextPropAtom.java
index 7441ae91c0..bfb9d741ab 100644
--- a/src/scratchpad/src/org/apache/poi/hslf/record/StyleTextPropAtom.java
+++ b/src/scratchpad/src/org/apache/poi/hslf/record/StyleTextPropAtom.java
@@ -310,15 +310,11 @@ public final class StyleTextPropAtom extends RecordAtom
// First up, we need to serialise the paragraph properties
for(TextPropCollection tpc : paragraphStyles) {
- // ensure, that the paragraphs flags exist, no matter if anthing is set
- tpc.addWithName(ParagraphFlagsTextProp.NAME);
tpc.writeOut(baos);
}
// Now, we do the character ones
for(TextPropCollection tpc : charStyles) {
- // ditto for the char flags
- // tpc.addWithName(CharFlagsTextProp.NAME);
tpc.writeOut(baos);
}
diff --git a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSlideShow.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSlideShow.java
index 62784f533b..eb8eb48512 100644
--- a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSlideShow.java
+++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSlideShow.java
@@ -398,9 +398,11 @@ public final class HSLFSlideShow implements SlideShow {
// Finally, generate model objects for everything
// Notes first
for (org.apache.poi.hslf.record.Notes n : notesRecords) {
- if (n == null) continue;
- HSLFNotes hn = new HSLFNotes(n);
- hn.setSlideShow(this);
+ HSLFNotes hn = null;
+ if (n != null) {
+ hn = new HSLFNotes(n);
+ hn.setSlideShow(this);
+ }
_notes.add(hn);
}
// Then slides
diff --git a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextRun.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextRun.java
index 9096573c7e..91f327c10b 100644
--- a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextRun.java
+++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextRun.java
@@ -112,9 +112,9 @@ public final class HSLFTextRun implements TextRun {
BitMaskTextProp prop = (BitMaskTextProp)characterStyle.findByName(CharFlagsTextProp.NAME);
if (prop == null){
+ int txtype = parentParagraph.getRunType();
HSLFSheet sheet = parentParagraph.getSheet();
- if(sheet != null){
- int txtype = parentParagraph.getParentShape().getRunType();
+ if (sheet != null) {
HSLFMasterSheet master = sheet.getMasterSheet();
if (master != null){
prop = (BitMaskTextProp)master.getStyleAttribute(txtype, parentParagraph.getIndentLevel(), CharFlagsTextProp.NAME, true);
diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/record/TestStyleTextPropAtom.java b/src/scratchpad/testcases/org/apache/poi/hslf/record/TestStyleTextPropAtom.java
index e0e2de515a..e868aa6768 100644
--- a/src/scratchpad/testcases/org/apache/poi/hslf/record/TestStyleTextPropAtom.java
+++ b/src/scratchpad/testcases/org/apache/poi/hslf/record/TestStyleTextPropAtom.java
@@ -17,23 +17,22 @@
package org.apache.poi.hslf.record;
-import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.*;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.List;
-import junit.framework.TestCase;
-
import org.apache.poi.hslf.model.textproperties.*;
import org.apache.poi.util.HexDump;
+import org.junit.Test;
/**
* Tests that StyleTextPropAtom works properly
*
* @author Nick Burch (nick at torchbox dot com)
*/
-public final class TestStyleTextPropAtom extends TestCase {
+public final class TestStyleTextPropAtom {
/** From a real file: a paragraph with 4 different styles */
private static final byte[] data_a = new byte[] {
0, 0, 0xA1-256, 0x0F, 0x2A, 0, 0, 0,
@@ -138,6 +137,7 @@ public final class TestStyleTextPropAtom extends TestCase {
};
private static final int data_d_text_len = 0xA0-1;
+ @Test
public void testRecordType() {
StyleTextPropAtom stpa = new StyleTextPropAtom(data_a,0,data_a.length);
StyleTextPropAtom stpb = new StyleTextPropAtom(data_b,0,data_b.length);
@@ -148,6 +148,7 @@ public final class TestStyleTextPropAtom extends TestCase {
}
+ @Test
public void testCharacterStyleCounts() {
StyleTextPropAtom stpa = new StyleTextPropAtom(data_a,0,data_a.length);
StyleTextPropAtom stpb = new StyleTextPropAtom(data_b,0,data_b.length);
@@ -162,6 +163,7 @@ public final class TestStyleTextPropAtom extends TestCase {
assertEquals(5, stpb.getCharacterStyles().size());
}
+ @Test
public void testParagraphStyleCounts() {
StyleTextPropAtom stpa = new StyleTextPropAtom(data_a,0,data_a.length);
StyleTextPropAtom stpb = new StyleTextPropAtom(data_b,0,data_b.length);
@@ -177,6 +179,7 @@ public final class TestStyleTextPropAtom extends TestCase {
}
+ @Test
public void testCharacterStyleLengths() {
StyleTextPropAtom stpa = new StyleTextPropAtom(data_a,0,data_a.length);
StyleTextPropAtom stpb = new StyleTextPropAtom(data_b,0,data_b.length);
@@ -207,6 +210,7 @@ public final class TestStyleTextPropAtom extends TestCase {
}
+ @Test
public void testCharacterPropOrdering() {
StyleTextPropAtom stpb = new StyleTextPropAtom(data_b,0,data_b.length);
stpb.setParentTextSize(data_b_text_len);
@@ -254,6 +258,7 @@ public final class TestStyleTextPropAtom extends TestCase {
assertEquals(24, tp_4_3.getValue());
}
+ @Test
public void testParagraphProps() {
StyleTextPropAtom stpb = new StyleTextPropAtom(data_b,0,data_b.length);
stpb.setParentTextSize(data_b_text_len);
@@ -298,6 +303,7 @@ public final class TestStyleTextPropAtom extends TestCase {
assertEquals(80, tp_4_2.getValue());
}
+ @Test
public void testCharacterProps() {
StyleTextPropAtom stpb = new StyleTextPropAtom(data_b,0,data_b.length);
stpb.setParentTextSize(data_b_text_len);
@@ -369,6 +375,8 @@ public final class TestStyleTextPropAtom extends TestCase {
assertEquals(0x0003, cf_4_1.getValue());
}
+ @SuppressWarnings("unused")
+ @Test
public void testFindAddTextProp() {
StyleTextPropAtom stpb = new StyleTextPropAtom(data_b,0,data_b.length);
stpb.setParentTextSize(data_b_text_len);
@@ -423,6 +431,7 @@ public final class TestStyleTextPropAtom extends TestCase {
* Try to recreate an existing StyleTextPropAtom (a) from the empty
* constructor, and setting the required properties
*/
+ @Test
public void testCreateAFromScatch() throws Exception {
// Start with an empty one
StyleTextPropAtom stpa = new StyleTextPropAtom(54);
@@ -460,6 +469,7 @@ public final class TestStyleTextPropAtom extends TestCase {
* Try to recreate an existing StyleTextPropAtom (b) from the empty
* constructor, and setting the required properties
*/
+ @Test
public void testCreateBFromScatch() throws Exception {
// Start with an empty one
StyleTextPropAtom stpa = new StyleTextPropAtom(data_b_text_len);
@@ -603,8 +613,8 @@ public final class TestStyleTextPropAtom extends TestCase {
ByteArrayOutputStream ba = new ByteArrayOutputStream();
ByteArrayOutputStream bb = new ByteArrayOutputStream();
- ca.writeOut(ba, StyleTextPropAtom.characterTextPropTypes);
- cb.writeOut(bb, StyleTextPropAtom.characterTextPropTypes);
+ ca.writeOut(ba);
+ cb.writeOut(bb);
byte[] cab = ba.toByteArray();
byte[] cbb = bb.toByteArray();
@@ -630,32 +640,46 @@ public final class TestStyleTextPropAtom extends TestCase {
}
}
+ @Test
public void testWriteA() {
doReadWrite(data_a, -1);
}
+ @Test
public void testLoadWriteA() {
doReadWrite(data_b, data_b_text_len);
}
+ @Test
public void testWriteB() {
doReadWrite(data_b, -1);
}
+ @Test
public void testLoadWriteB() {
doReadWrite(data_b, data_b_text_len);
}
+ @Test
public void testLoadWriteC() {
- doReadWrite(data_c, data_c_text_len);
+ // BitMaskTextProperties will sanitize the output
+ byte expected[] = data_c.clone();
+ expected[56] = 0;
+ expected[68] = 0;
+ doReadWrite(data_c, expected, data_c_text_len);
}
+ @Test
public void testLoadWriteD() {
doReadWrite(data_d, data_d_text_len);
}
protected void doReadWrite(byte[] data, int textlen) {
+ doReadWrite(data, data, textlen);
+ }
+
+ protected void doReadWrite(byte[] data, byte[] expected, int textlen) {
StyleTextPropAtom stpb = new StyleTextPropAtom(data, 0,data.length);
if(textlen != -1) stpb.setParentTextSize(textlen);
@@ -667,15 +691,16 @@ public final class TestStyleTextPropAtom extends TestCase {
}
byte[] bytes = out.toByteArray();
- assertEquals(data.length, bytes.length);
+ assertEquals(expected.length, bytes.length);
try {
- assertArrayEquals(data, bytes);
+ assertArrayEquals(expected, bytes);
} catch (Throwable e){
//print hex dump if failed
- assertEquals(HexDump.toHex(data), HexDump.toHex(bytes));
+ assertEquals(HexDump.toHex(expected), HexDump.toHex(bytes));
}
}
+ @Test
public void testNotEnoughDataProp() {
// We don't have enough data in the record to cover
// all the properties the mask says we have
@@ -689,7 +714,8 @@ public final class TestStyleTextPropAtom extends TestCase {
/**
* Check the test data for Bug 40143.
*/
- public void testBug40143() {
+ @Test
+ public void testBug40143() {
StyleTextPropAtom atom = new StyleTextPropAtom(data_d, 0, data_d.length);
atom.setParentTextSize(data_d_text_len);
@@ -711,13 +737,15 @@ public final class TestStyleTextPropAtom extends TestCase {
/**
* Check the test data for Bug 42677.
*/
+ @Test
public void test42677() {
int length = 18;
- byte[] data = {0x00, 0x00, (byte)0xA1, 0x0F, 0x28, 0x00, 0x00, 0x00,
- 0x13, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , (byte)0xF1 , 0x20 , 0x00, 0x00 , 0x00 , 0x00 ,
- 0x22 , 0x20 , 0x00 , 0x00 , 0x64 , 0x00 , 0x00 , 0x00 , 0x00 , (byte)0xFF ,
- 0x00 , 0x00 , 0x13 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x63 , 0x00 ,
- 0x00 , 0x00 , 0x01 , 0x00 , 0x00 , 0x00 , 0x0F , 0x00
+ byte[] data = {
+ 0x00, 0x00, (byte)0xA1, 0x0F, 0x28, 0x00, 0x00, 0x00,
+ 0x13, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , (byte)0xF1 , 0x20 , 0x00, 0x00 , 0x00 , 0x00 ,
+ 0x22 , 0x20 , 0x00 , 0x00 , 0x64 , 0x00 , 0x00 , 0x00 , 0x00 , (byte)0xFF ,
+ 0x00 , 0x00 , 0x13 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x63 , 0x00 ,
+ 0x00 , 0x00 , 0x01 , 0x00 , 0x00 , 0x00 , 0x0F , 0x00
};
doReadWrite(data, length);
@@ -735,6 +763,7 @@ public final class TestStyleTextPropAtom extends TestCase {
* 00 00 00 01 18 00 00 01 18 01 00 00 00 01 1C 00 00 01 1C
* </StyleTextPropAtom>
*/
+ @Test
public void test45815() {
int length = 19;
byte[] data = {
@@ -750,7 +779,13 @@ public final class TestStyleTextPropAtom extends TestCase {
0x01, 0x18, 0x01, 0x00, 0x00, 0x00, 0x01, 0x1C, 0x00, 0x00,
0x01, 0x1C
};
- doReadWrite(data, length);
+
+ // changed original data: ... 0x41 and 0x06 don't match
+ // the bitmask text properties will sanitize the bytes and thus the bytes differ
+ byte[] exptected = data.clone();
+ exptected[18] = 0;
+
+ doReadWrite(data, exptected, length);
}
}