blob: b2da349fc41a73708b156877e48ca8a4301ddcc7 [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.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);
}
}