diff options
Diffstat (limited to 'test')
-rw-r--r-- | test/java/org/apache/fop/StandardTestSuite.java | 2 | ||||
-rw-r--r-- | test/java/org/apache/fop/render/pdf/BasePDFTestCase.java | 26 | ||||
-rw-r--r-- | test/java/org/apache/fop/render/pdf/PDFAConformanceTestCase.java | 5 | ||||
-rw-r--r-- | test/java/org/apache/fop/render/pdf/PDFEncodingTestCase.java | 119 | ||||
-rw-r--r-- | test/xml/pdf-encoding/pdf-encoding-test.xconf | 45 | ||||
-rw-r--r-- | test/xml/pdf-encoding/test-custom-font.fo | 38 | ||||
-rw-r--r-- | test/xml/pdf-encoding/test-standard-font.fo | 38 |
7 files changed, 262 insertions, 11 deletions
diff --git a/test/java/org/apache/fop/StandardTestSuite.java b/test/java/org/apache/fop/StandardTestSuite.java index 6518c7cfc..c50b90f1f 100644 --- a/test/java/org/apache/fop/StandardTestSuite.java +++ b/test/java/org/apache/fop/StandardTestSuite.java @@ -20,6 +20,7 @@ package org.apache.fop; import org.apache.fop.render.pdf.PDFAConformanceTestCase; +import org.apache.fop.render.pdf.PDFEncodingTestCase; import org.apache.fop.render.rtf.RichTextFormatTestSuite; import junit.framework.Test; @@ -41,6 +42,7 @@ public class StandardTestSuite { suite.addTest(BasicDriverTestSuite.suite()); suite.addTest(UtilityCodeTestSuite.suite()); suite.addTest(new TestSuite(PDFAConformanceTestCase.class)); + suite.addTest(new TestSuite(PDFEncodingTestCase.class)); suite.addTest(RichTextFormatTestSuite.suite()); //$JUnit-END$ return suite; diff --git a/test/java/org/apache/fop/render/pdf/BasePDFTestCase.java b/test/java/org/apache/fop/render/pdf/BasePDFTestCase.java index cf7fe3eff..11ee3e75f 100644 --- a/test/java/org/apache/fop/render/pdf/BasePDFTestCase.java +++ b/test/java/org/apache/fop/render/pdf/BasePDFTestCase.java @@ -44,27 +44,41 @@ public class BasePDFTestCase extends TestCase { protected BasePDFTestCase(String name) { super(name); + + final File uc = getUserConfigFile(); + + try { + fopFactory.setUserConfig(uc); + } catch (Exception e) { + throw new RuntimeException("fopFactory.setUserConfig (" + uc.getAbsolutePath() + ") failed: " + e.getMessage()); + } } /** * Convert a test FO file to PDF * @param foFile the FO file * @param ua the preconfigured user agent - * @param dumpPdfFile if true, dumps the generated PDF file to a file name (foFile).pdf and returns it as a File + * @param dumpPdfFile if true, dumps the generated PDF file to a file name (foFile).pdf + * @return the generated PDF data * @throws Exception if the conversion fails */ - protected File convertFO(File foFile, FOUserAgent ua, boolean dumpPdfFile) throws Exception { - File outFile = null; + protected byte[] convertFO(File foFile, FOUserAgent ua, boolean dumpPdfFile) throws Exception { ByteArrayOutputStream baout = new ByteArrayOutputStream(); Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, ua, baout); Transformer transformer = tFactory.newTransformer(); Source src = new StreamSource(foFile); SAXResult res = new SAXResult(fop.getDefaultHandler()); transformer.transform(src, res); + final byte[] result = baout.toByteArray(); if (dumpPdfFile) { - outFile = new File(foFile.getParentFile(), foFile.getName() + ".pdf"); - FileUtils.writeByteArrayToFile(outFile, baout.toByteArray()); + final File outFile = new File(foFile.getParentFile(), foFile.getName() + ".pdf"); + FileUtils.writeByteArrayToFile(outFile, result); } - return outFile; + return result; + } + + /** get FOP config File */ + protected File getUserConfigFile() { + return new File("test/test.xconf"); } } diff --git a/test/java/org/apache/fop/render/pdf/PDFAConformanceTestCase.java b/test/java/org/apache/fop/render/pdf/PDFAConformanceTestCase.java index c46b08179..eb613a989 100644 --- a/test/java/org/apache/fop/render/pdf/PDFAConformanceTestCase.java +++ b/test/java/org/apache/fop/render/pdf/PDFAConformanceTestCase.java @@ -38,11 +38,6 @@ public class PDFAConformanceTestCase extends BasePDFTestCase { */ public PDFAConformanceTestCase(String name) { super(name); - try { - fopFactory.setUserConfig(new File("test/test.xconf")); - } catch (Exception e) { - throw new RuntimeException("Configuring the FopFactory failed: " + e.getMessage()); - } } /** create an FOUserAgent for our tests */ diff --git a/test/java/org/apache/fop/render/pdf/PDFEncodingTestCase.java b/test/java/org/apache/fop/render/pdf/PDFEncodingTestCase.java new file mode 100644 index 000000000..6187cd3db --- /dev/null +++ b/test/java/org/apache/fop/render/pdf/PDFEncodingTestCase.java @@ -0,0 +1,119 @@ +/* + * 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.fop.render.pdf; + +import java.io.File; +import java.io.IOException; +import java.util.StringTokenizer; + +import org.apache.fop.apps.FOUserAgent; + +/** Test that characters are correctly encoded in a generated PDF file */ +public class PDFEncodingTestCase extends BasePDFTestCase { + private File foBaseDir = new File("test/xml/pdf-encoding"); + private final boolean dumpPDF = Boolean.getBoolean("PDFEncodingTestCase.dumpPDF"); + + static final String INPUT_FILE = "test/xml/pdf-encoding/pdf-encoding-test.xconf"; + static final String TEST_MARKER = "PDFE_TEST_MARK_"; + + public PDFEncodingTestCase(String name) { + super(name); + } + + /** create an FOUserAgent for our tests */ + protected FOUserAgent getUserAgent() { + final FOUserAgent a = fopFactory.newFOUserAgent(); + return a; + } + + /** use our specific config */ + protected File getUserConfigFile() { + return new File(INPUT_FILE); + } + + + public void testPDFEncodingWithStandardFont() throws Exception { + + /* If the PDF encoding is correct, a text dump of the generated PDF file contains this (excerpts) + * ...Tm [(PDFE_TEST_MARK_2:) ( ) (This) ( ) (is) ...(acute:) ( ) (XX_\351_XX) ] TJ + * ...Tm [(PDFE_TEST_MARK_3:) ( ) (This) ( ) (is) ...(letter:) ( ) (XX_\342\352\356\364\373_XX) ] TJ + * The following array is used to look for these patterns + */ + final String testPatterns[] = { + TEST_MARKER + "1", "(Standard)", + TEST_MARKER + "2", "XX_\\351_XX", + TEST_MARKER + "3", "XX_\\342\\352\\356\\364\\373_XX" + }; + + runTest("test-standard-font.fo",testPatterns); + } + + /* TODO test disabled for now, fails due (probably) do different PDF encoding when custom font is used */ + public void DISABLED_testPDFEncodingWithCustomFont() throws Exception { + + /* If the PDF encoding is correct, a text dump of the generated PDF file contains this (excerpts) + * ...Tm [(PDFE_TEST_MARK_2:) ( ) (This) ( ) (is) ...(acute:) ( ) (XX_\351_XX) ] TJ + * ...Tm [(PDFE_TEST_MARK_3:) ( ) (This) ( ) (is) ...(letter:) ( ) (XX_\342\352\356\364\373_XX) ] TJ + * The following array is used to look for these patterns + */ + final String testPatterns[] = { + TEST_MARKER + "1", "(Gladiator)", + TEST_MARKER + "2", "XX_\\351_XX", + TEST_MARKER + "3", "XX_\\342\\352\\356\\364\\373_XX" + }; + + runTest("test-custom-font.fo",testPatterns); + } + + /** Test encoding using specified input file and test patterns array */ + private void runTest(String inputFile,String [] testPatterns) throws Exception { + File foFile = new File(foBaseDir, inputFile); + byte[] pdfData = convertFO(foFile, getUserAgent(), dumpPDF); + checkEncoding(pdfData,testPatterns); + } + + /** Check character encodings in the generated PDF data, by reading text + * lines identified by markers and checking their content + * @throws IOException */ + private void checkEncoding(byte[] pdf,String[] testPattern) throws IOException { + + int markersFound = 0; + final String input = new String(pdf); + int pos = 0; + if((pos=input.indexOf(TEST_MARKER)) >= 0) { + final StringTokenizer tk = new StringTokenizer(input.substring(pos),"\n"); + + while(tk.hasMoreTokens()) { + final String line = tk.nextToken(); + if(line.indexOf(TEST_MARKER) >=0) { + markersFound++; + for(int i=0; i < testPattern.length; i+=2) { + if(line.indexOf(testPattern[i]) >= 0) { + final String ref = testPattern[i+1]; + final boolean patternFound = line.indexOf(ref) >= 0; + assertTrue("line containing '" + testPattern[i] + "' must contain '" + ref,patternFound); + } + } + } + } + } + + final int nMarkers = testPattern.length / 2; + assertEquals(nMarkers + " " + TEST_MARKER + " markers must be found",nMarkers,markersFound); + } +} diff --git a/test/xml/pdf-encoding/pdf-encoding-test.xconf b/test/xml/pdf-encoding/pdf-encoding-test.xconf new file mode 100644 index 000000000..6046fb45c --- /dev/null +++ b/test/xml/pdf-encoding/pdf-encoding-test.xconf @@ -0,0 +1,45 @@ +<?xml version="1.0"?> + +<!-- + 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. +--> + +<!-- + FOP config for PDF encoding test: disable all output filters + and setup a custom font +--> + +<fop version="1.0"> + <renderers> + <renderer mime="application/pdf"> + <!-- disable PDF text compression --> + <filterList> + <value>null</value> + </filterList> + <filterList type="image"> + <value>flate</value> + <value>ascii-85</value> + </filterList> + + <!-- use a custom font to show encoding problems --> + <fonts> + <font metrics-url="test/resources/fonts/glb12.ttf.xml" embed-url="test/resources/fonts/glb12.ttf"> + <font-triplet name="Gladiator" style="normal" weight="normal"/> + </font> + </fonts> + </renderer> + </renderers> +</fop> diff --git a/test/xml/pdf-encoding/test-custom-font.fo b/test/xml/pdf-encoding/test-custom-font.fo new file mode 100644 index 000000000..86689f343 --- /dev/null +++ b/test/xml/pdf-encoding/test-custom-font.fo @@ -0,0 +1,38 @@ +<?xml version="1.0" encoding="UTF-8"?> + +<!-- + 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. +--> + +<!-- + Minimal FO document used to test PDF encoding +--> + +<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format" font-family="Gladiator"> + <fo:layout-master-set> + <fo:simple-page-master master-name="A4" page-height="29.7cm" page-width="21cm" margin="2cm"> + <fo:region-body/> + </fo:simple-page-master> + </fo:layout-master-set> + <fo:page-sequence master-reference="A4"> + <fo:flow flow-name="xsl-region-body"> + <fo:block>Testing PDF text encoding using the user-specified Gladiator font</fo:block> + <fo:block>PDFE_TEST_MARK_1: Hello Gladiator World!</fo:block> + <fo:block>PDFE_TEST_MARK_2: This is an e acute: XX_é_XX</fo:block> + <fo:block>PDFE_TEST_MARK_3: This is aeiou with circumflex on each letter: XX_âêîôû_XX</fo:block> + </fo:flow> + </fo:page-sequence> +</fo:root> diff --git a/test/xml/pdf-encoding/test-standard-font.fo b/test/xml/pdf-encoding/test-standard-font.fo new file mode 100644 index 000000000..b629eadad --- /dev/null +++ b/test/xml/pdf-encoding/test-standard-font.fo @@ -0,0 +1,38 @@ +<?xml version="1.0" encoding="UTF-8"?> + +<!-- + 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. +--> + +<!-- + Minimal FO document used to test PDF encoding +--> + +<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format"> + <fo:layout-master-set> + <fo:simple-page-master master-name="A4" page-height="29.7cm" page-width="21cm" margin="2cm"> + <fo:region-body/> + </fo:simple-page-master> + </fo:layout-master-set> + <fo:page-sequence master-reference="A4"> + <fo:flow flow-name="xsl-region-body"> + <fo:block>Testing PDF text encoding using a standard FOP font</fo:block> + <fo:block>PDFE_TEST_MARK_1: Hello Standard World!</fo:block> + <fo:block>PDFE_TEST_MARK_2: This is an e acute: XX_é_XX</fo:block> + <fo:block>PDFE_TEST_MARK_3: This is aeiou with circumflex on each letter: XX_âêîôû_XX</fo:block> + </fo:flow> + </fo:page-sequence> +</fo:root> |