blob: 93443a0d905ca87c4257119b782f76f2e6a80ff3 [file] [log] [blame]
/*
* 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.
*/
/* $Id$ */
package org.apache.fop.fonts.type1;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import java.awt.Rectangle;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import org.junit.Test;
/**
* Test case for {@link AFMParser}.
*/
public class AFMParserTestCase {
private AFMParser sut = new AFMParser();
/**
* We're testing with two identical files except one has:
* EncodingScheme AdobeStandardEncoding
* the other has:
* EncodingScheme ExpectedEncoding
* Both files have the correct character metrics data, and we're checking that both are handled
* consistently with both encoding settings.
*
* @throws IOException if an I/O error occurs
*/
@Test
public void testMappingAgainstAdobeStandardEncoding() throws IOException {
InputStream expectedStream = getClass().getResourceAsStream(
"adobe-charset_unknown-encoding.afm");
InputStream adobeStandardStream = getClass().getResourceAsStream(
"adobe-charset_adobe-encoding.afm");
AFMFile expectedParser = sut.parse(expectedStream, null);
AFMFile adobeStandard = sut.parse(adobeStandardStream, null);
List<AFMCharMetrics> adobeMetrics = adobeStandard.getCharMetrics();
checkCharMtrxList(true, expectedParser.getCharMetrics(), adobeMetrics);
compareMetrics(adobeMetrics);
nonAdobeCharsetUnknownEncoding(adobeMetrics);
nonAdobeCharsetAdobeEncoding(adobeMetrics);
}
private void compareMetrics(List<AFMCharMetrics> charMetrics) {
// in order to ensure that every character is parsed properly, we're going to check them
// against the AFM file (bboxes were created with a counter)
AdobeStandardEncoding[] standardEncoding = AdobeStandardEncoding.values();
for (int i = 0; i < charMetrics.size(); i++) {
Rectangle expectedBbox = new Rectangle(i + 1, i + 1, 0, 0);
AFMCharMetrics thisMetric = charMetrics.get(i);
assertTrue(thisMetric.getBBox().equals(expectedBbox));
assertEquals(thisMetric.getCharName(), standardEncoding[i].getAdobeName());
}
}
/**
* A non-adobe encoded file is tested, all the character codes are not AdobeStandardEncoding and
* the encoding is not AdobeStandardEncoding, we are checking a failure case here. Checking that
* the AdobeStandardEncoding isn't forced on other encodings.
*
* @param expected the AdobeStandardEncoding encoded character metrics list
* @throws IOException if an IO error occurs
*/
private void nonAdobeCharsetUnknownEncoding(List<AFMCharMetrics> expected)
throws IOException {
InputStream inStream = getClass().getResourceAsStream(
"notadobe-charset_unknown-encoding.afm");
AFMFile afmFile = sut.parse(inStream, null);
List<AFMCharMetrics> unknownEncodingMetrics = afmFile.getCharMetrics();
checkCharMtrxList(false, expected, unknownEncodingMetrics);
}
/**
* This tests a poorly encoded file, it has AdobeStandardEncoding. We are checking that the
* metrics are correctly analysed against properly encoded char metrics.
*
* @param expected
* @throws IOException
*/
private void nonAdobeCharsetAdobeEncoding(List<AFMCharMetrics> expected)
throws IOException {
InputStream inStream = getClass().getResourceAsStream(
"notadobe-charset_adobe-encoding.afm");
AFMFile afmFile = sut.parse(inStream, null);
List<AFMCharMetrics> correctedCharMetrics = afmFile.getCharMetrics();
checkCharMtrxList(true, expected, correctedCharMetrics);
}
private boolean charMetricsEqual(AFMCharMetrics o1, AFMCharMetrics o2) {
return o1.getCharCode() == o2.getCharCode()
&& objectEquals(o1.getCharacter(), o2.getCharacter())
&& o1.getWidthX() == o2.getWidthX()
&& o1.getWidthY() == o2.getWidthY()
&& objectEquals(o1.getBBox(), o2.getBBox());
}
private void checkCharMtrxList(boolean expectedResult, List<AFMCharMetrics> expectedList,
List<AFMCharMetrics> actualList) {
assertEquals(expectedList.size(), actualList.size());
for (int i = 0; i < expectedList.size(); i++) {
assertEquals(expectedResult, charMetricsEqual(expectedList.get(i), actualList.get(i)));
}
}
private boolean objectEquals(Object o1, Object o2) {
return o1 == null ? o2 == null : (o1 == o2 || o1.equals(o2));
}
}