| /* |
| * 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.pdf; |
| |
| import java.io.ByteArrayOutputStream; |
| import java.io.IOException; |
| |
| import org.junit.Before; |
| import org.junit.Test; |
| |
| import static org.junit.Assert.assertEquals; |
| import static org.junit.Assert.assertNull; |
| import static org.junit.Assert.fail; |
| |
| import org.apache.commons.io.output.CountingOutputStream; |
| |
| /** |
| * Test case for {@link PDFDictionary}. |
| */ |
| public class PDFDictionaryTestCase extends PDFObjectTestCase { |
| /** The test subject */ |
| private PDFDictionary pdfDictUnderTest; |
| private PDFArray testArray; |
| private PDFNumber testNumber; |
| /** The order in which these objects are put into the dictionary MUST be maintained. */ |
| private String expectedOutput = "<<\n" |
| + " /String (TestValue)\n" |
| + " /int 10\n" |
| + " /double 3.1\n" |
| + " /array [1 (two) 20]\n" |
| + " /number 20\n" |
| + " /null null\n" |
| + ">>"; |
| |
| @Before |
| public void setUp() { |
| // A PDFNumber for testing, this DOES have a parent |
| testNumber = new PDFNumber(); |
| testNumber.setParent(parent); |
| testNumber.setNumber(20); |
| // An array for testing, this DOES NOT have a parent |
| testArray = new PDFArray(); |
| testArray.add(1); |
| testArray.add("two"); |
| testArray.add(testNumber); |
| // Populating the dictionary with a parent, document and the various objects |
| pdfDictUnderTest = new PDFDictionary(parent); |
| pdfDictUnderTest.setDocument(doc); |
| pdfDictUnderTest.put("String", "TestValue"); |
| pdfDictUnderTest.put("int", 10); |
| pdfDictUnderTest.put("double", 3.1); |
| pdfDictUnderTest.put("array", testArray); |
| pdfDictUnderTest.put("number", testNumber); |
| // null is a valid PDF object |
| pdfDictUnderTest.put("null", null); |
| // test that the interface is maintained |
| pdfObjectUnderTest = pdfDictUnderTest; |
| } |
| |
| /** |
| * Tests put() - tests that the object is put into the dictionary and it is handled if it is a |
| * {@link PDFObject}. |
| */ |
| @Test |
| public void testPut() { |
| // The "put()" commands have already been done in setUp(), so just test them. |
| assertEquals("TestValue", pdfDictUnderTest.get("String")); |
| assertEquals(10, pdfDictUnderTest.get("int")); |
| assertEquals(3.1, pdfDictUnderTest.get("double")); |
| // With PDFObjects, if they DO NOT have a parent, the dict becomes their parent. |
| assertEquals(testArray, pdfDictUnderTest.get("array")); |
| assertEquals(pdfDictUnderTest, testArray.getParent()); |
| // With PDFObjects, if they DO have a parent, the dict DOES NOT change the parent object. |
| assertEquals(testNumber, pdfDictUnderTest.get("number")); |
| // Test it doesn't explode when we try to get a non-existent entry |
| assertNull(pdfDictUnderTest.get("Not in dictionary")); |
| // Tests that we can over-write objects |
| pdfDictUnderTest.put("array", 10); |
| assertEquals(10, pdfDictUnderTest.get("array")); |
| // Test that nulls are handled appropriately |
| assertNull(pdfDictUnderTest.get("null")); |
| } |
| |
| /** |
| * Tests get() - tests that objects can be properly retrieved from the dictionary. |
| */ |
| @Test |
| public void testGet() { |
| // Tested fairly comprehensively in testPut(). |
| } |
| |
| /** |
| * Tests writeDictionary() - tests that the dictionary is properly written to the output-stream. |
| */ |
| @Test |
| public void testWriteDictionary() { |
| // Ensure that the objects stored in the dictionary are streamed in the correct format. |
| ByteArrayOutputStream outStream = new ByteArrayOutputStream(); |
| CountingOutputStream cout = new CountingOutputStream(outStream); |
| StringBuilder textBuffer = new StringBuilder(); |
| try { |
| pdfDictUnderTest.writeDictionary(cout, textBuffer); |
| PDFDocument.flushTextBuffer(textBuffer, cout); |
| assertEquals(expectedOutput, outStream.toString()); |
| } catch (IOException e) { |
| fail("IOException: " + e.getMessage()); |
| } |
| } |
| |
| /** |
| * Tests output() - test that this object can write itself to an output stream. |
| * @throws IOException error caused by I/O |
| */ |
| @Test |
| public void testOutput() throws IOException { |
| testOutputStreams(expectedOutput, pdfDictUnderTest); |
| } |
| } |