150 lines
5.6 KiB
Java
150 lines
5.6 KiB
Java
/* ====================================================================
|
|
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.hssf.record;
|
|
|
|
|
|
import junit.framework.AssertionFailedError;
|
|
import junit.framework.TestCase;
|
|
|
|
import org.apache.poi.util.HexRead;
|
|
|
|
/**
|
|
* Tests the serialization and deserialization of the {@link FontRecord}
|
|
* class works correctly. Test data taken directly from a real Excel file.
|
|
*/
|
|
public final class TestFontRecord extends TestCase {
|
|
|
|
private static final int SID = 0x31;
|
|
private static final byte[] data = {
|
|
0xC8-256, 00, // font height = xc8
|
|
00, 00, // attrs = 0
|
|
0xFF-256, 0x7F, // colour palette = x7fff
|
|
0x90-256, 0x01, // bold weight = x190
|
|
00, 00, // supersubscript
|
|
00, 00, // underline, family
|
|
00, 00, // charset, padding
|
|
05, 00, // name length, unicode flag
|
|
0x41, 0x72, 0x69, 0x61, 0x6C, // Arial, as unicode
|
|
|
|
};
|
|
|
|
public void testLoad() {
|
|
|
|
FontRecord record = new FontRecord(TestcaseRecordInputStream.create(0x31, data));
|
|
assertEquals(0xc8, record.getFontHeight());
|
|
assertEquals(0x00, record.getAttributes());
|
|
assertFalse(record.isItalic());
|
|
assertFalse(record.isStruckout());
|
|
assertFalse(record.isMacoutlined());
|
|
assertFalse(record.isMacshadowed());
|
|
assertEquals(0x7fff, record.getColorPaletteIndex());
|
|
assertEquals(0x190, record.getBoldWeight());
|
|
assertEquals(0x00, record.getSuperSubScript());
|
|
assertEquals(0x00, record.getUnderline());
|
|
assertEquals(0x00, record.getFamily());
|
|
assertEquals(0x00, record.getCharset());
|
|
assertEquals("Arial", record.getFontName());
|
|
|
|
assertEquals(21 + 4, record.getRecordSize());
|
|
}
|
|
|
|
public void testStore() {
|
|
// .fontheight = c8
|
|
// .attributes = 0
|
|
// .italic = false
|
|
// .strikout = false
|
|
// .macoutlined= false
|
|
// .macshadowed= false
|
|
// .colorpalette = 7fff
|
|
// .boldweight = 190
|
|
// .supersubscript = 0
|
|
// .underline = 0
|
|
// .family = 0
|
|
// .charset = 0
|
|
// .namelength = 5
|
|
// .fontname = Arial
|
|
|
|
FontRecord record = new FontRecord();
|
|
record.setFontHeight((short)0xc8);
|
|
record.setAttributes((short)0);
|
|
record.setColorPaletteIndex((short)0x7fff);
|
|
record.setBoldWeight((short)0x190);
|
|
record.setSuperSubScript((short)0);
|
|
record.setUnderline((byte)0);
|
|
record.setFamily((byte)0);
|
|
record.setCharset((byte)0);
|
|
record.setFontName("Arial");
|
|
|
|
byte [] recordBytes = record.serialize();
|
|
TestcaseRecordInputStream.confirmRecordEncoding(0x31, data, recordBytes);
|
|
}
|
|
|
|
public void testCloneOnto() {
|
|
FontRecord base = new FontRecord(TestcaseRecordInputStream.create(0x31, data));
|
|
|
|
FontRecord other = new FontRecord();
|
|
other.cloneStyleFrom(base);
|
|
|
|
byte [] recordBytes = other.serialize();
|
|
assertEquals(recordBytes.length - 4, data.length);
|
|
for (int i = 0; i < data.length; i++)
|
|
assertEquals("At offset " + i, data[i], recordBytes[i+4]);
|
|
}
|
|
|
|
public void testSameProperties() {
|
|
FontRecord f1 = new FontRecord(TestcaseRecordInputStream.create(0x31, data));
|
|
FontRecord f2 = new FontRecord(TestcaseRecordInputStream.create(0x31, data));
|
|
|
|
assertTrue(f1.sameProperties(f2));
|
|
|
|
f2.setFontName("Arial2");
|
|
assertFalse(f1.sameProperties(f2));
|
|
f2.setFontName("Arial");
|
|
assertTrue(f1.sameProperties(f2));
|
|
|
|
f2.setFontHeight((short)11);
|
|
assertFalse(f1.sameProperties(f2));
|
|
f2.setFontHeight((short)0xc8);
|
|
assertTrue(f1.sameProperties(f2));
|
|
}
|
|
|
|
/**
|
|
* Bugzilla 47250 suggests that the unicode options byte should be present even when the name
|
|
* length is zero. The OOO documentation seems to agree with this and POI had no test data
|
|
* samples to say otherwise.
|
|
*/
|
|
public void testEmptyName_bug47250() {
|
|
byte[] emptyNameData = HexRead.readFromString(
|
|
"C8 00 00 00 FF 7F 90 01 00 00 00 00 00 00 "
|
|
+ "00" // zero length
|
|
+ "00" // unicode options byte
|
|
);
|
|
|
|
RecordInputStream in = TestcaseRecordInputStream.create(SID, emptyNameData);
|
|
FontRecord fr = new FontRecord(in);
|
|
if (in.available() == 1) {
|
|
throw new AssertionFailedError("Identified bug 47250");
|
|
}
|
|
assertEquals(0, in.available());
|
|
|
|
assertEquals(0, fr.getFontName().length());
|
|
byte[] recordBytes = fr.serialize();
|
|
TestcaseRecordInputStream.confirmRecordEncoding(SID, emptyNameData, recordBytes);
|
|
}
|
|
}
|