/*
* Copyright 2014 The Apache Software Foundation.
*
* Licensed 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 com.tom_roush.pdfbox.pdfparser;
import com.tom_roush.pdfbox.contentstream.operator.Operator;
import junit.framework.TestCase;
import java.io.IOException;
import java.util.List;
import static org.junit.Assert.assertArrayEquals;
/**
* Tests for PDFStreamParser.
*
* @author Tilman Hausherr
*/
public class PDFStreamParserTest extends TestCase
{
/**
* Tests for inline images, whether the EI is correctly identified as
* ending. To test hasNoFollowingBinData(), the amount of data after EI nust
* be at least PDFStreamParser.MAX_BIN_CHAR_TEST_LENGTH
*
* @throws IOException
*/
public void testInlineImages() throws IOException
{
testInlineImage2ops("ID\n12345EI Q", "12345", "Q");
testInlineImage2ops("ID\n12345EI EMC", "12345", "EMC");
testInlineImage2ops("ID\n12345EI Q ", "12345", "Q");
testInlineImage2ops("ID\n12345EI EMC ", "12345", "EMC");
testInlineImage2ops("ID\n12345EI Q", "12345", "Q");
testInlineImage2ops("ID\n12345EI EMC", "12345", "EMC");
testInlineImage2ops("ID\n12345EI Q ", "12345", "Q");
testInlineImage2ops("ID\n12345EI EMC ", "12345", "EMC");
testInlineImage2ops("ID\n12345EI Q ", "12345", "Q");
testInlineImage2ops("ID\n12345EI EMC ", "12345", "EMC");
testInlineImage1op("ID\n12345EI", "12345");
testInlineImage1op("ID\n12345EI ", "12345");
testInlineImage2ops("ID\n12345EI Q ", "12345", "Q");
testInlineImage2ops("ID\n12345EI EMC ", "12345", "EMC");
testInlineImage2ops("ID\n12345EI Q", "12345", "Q");
testInlineImage2ops("ID\n12345EI EMC", "12345", "EMC");
testInlineImage1op("ID\n12EI5EI", "12EI5");
testInlineImage1op("ID\n12EI5EI ", "12EI5");
testInlineImage1op("ID\n12EI5EIQEI", "12EI5EIQ");
testInlineImage2ops("ID\n12EI5EIQEI Q", "12EI5EIQ", "Q");
testInlineImage2ops("ID\n12EI5EI Q", "12EI5", "Q");
testInlineImage2ops("ID\n12EI5EI Q ", "12EI5", "Q");
testInlineImage2ops("ID\n12EI5EI EMC", "12EI5", "EMC");
testInlineImage2ops("ID\n12EI5EI EMC ", "12EI5", "EMC");
testInlineImage2ops("ID\n12EI5EI Q", "12EI5", "Q");
testInlineImage2ops("ID\n12EI5EI Q ", "12EI5", "Q");
testInlineImage2ops("ID\n12EI5EI EMC", "12EI5", "EMC");
testInlineImage2ops("ID\n12EI5EI EMC ", "12EI5", "EMC");
// MAX_BIN_CHAR_TEST_LENGTH is currently 10, test boundaries
// 1234567890
testInlineImage2ops("ID\n12EI5EI EMC ", "12EI5", "EMC");
testInlineImage2ops("ID\n12EI5EI EMC ", "12EI5", "EMC");
testInlineImage2ops("ID\n12EI5EI EMC ", "12EI5", "EMC");
testInlineImage2ops("ID\n12EI5EI EMC ", "12EI5", "EMC");
testInlineImage2ops("ID\n12EI5EI Q ", "12EI5", "Q");
testInlineImage2ops("ID\n12EI5EI Q ", "12EI5", "Q");
testInlineImage2ops("ID\n12EI5EI Q ", "12EI5", "Q");
testInlineImage2ops("ID\n12EI5EI Q ", "12EI5", "Q");
}
// checks whether there are two operators, one inline image and the named operator
private void testInlineImage2ops(String s, String imageDataString, String opName) throws IOException
{
List<Object> tokens = parseTokenString(s);
assertEquals(2, tokens.size());
assertEquals("ID", ((Operator) tokens.get(0)).getName());
assertEquals(imageDataString.length(), ((Operator) tokens.get(0)).getImageData().length);
assertArrayEquals(imageDataString.getBytes(), ((Operator) tokens.get(0)).getImageData());
assertEquals(opName, ((Operator) tokens.get(1)).getName());
}
// checks whether there is one operator, one inline image
private void testInlineImage1op(String s, String imageDataString) throws IOException
{
List<Object> tokens = parseTokenString(s);
assertEquals(1, tokens.size());
assertEquals("ID", ((Operator) tokens.get(0)).getName());
assertEquals(imageDataString.length(), ((Operator) tokens.get(0)).getImageData().length);
assertArrayEquals(imageDataString.getBytes(), ((Operator) tokens.get(0)).getImageData());
}
// parse string and return list of tokens
private List<Object> parseTokenString(String s) throws IOException
{
PDFStreamParser pdfStreamParser = new PDFStreamParser(s.getBytes());
pdfStreamParser.parse();
return pdfStreamParser.getTokens();
}
}