1
/***************************************************************************
2
* Copyright (C) 2007 by Dominik Seichter *
5
* This program is free software; you can redistribute it and/or modify *
6
* it under the terms of the GNU Library General Public License as *
7
* published by the Free Software Foundation; either version 2 of the *
8
* License, or (at your option) any later version. *
10
* This program is distributed in the hope that it will be useful, *
11
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
12
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
13
* GNU General Public License for more details. *
15
* You should have received a copy of the GNU Library General Public *
16
* License along with this program; if not, write to the *
17
* Free Software Foundation, Inc., *
18
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
19
***************************************************************************/
21
#include "TokenizerTest.h"
23
#include <cppunit/Asserter.h>
25
using namespace PoDoFo;
27
CPPUNIT_TEST_SUITE_REGISTRATION( TokenizerTest );
29
void TokenizerTest::Test( const char* pszString, EPdfDataType eDataType, const char* pszExpected )
35
expected = pszExpected ? pszExpected : pszString;
37
printf("Testing with value: %s\n", pszString );
38
PdfTokenizer tokenizer( pszString, strlen( pszString ) );
40
tokenizer.GetNextVariant( variant, NULL );
42
printf(" -> Expected Datatype: %i\n", eDataType );
43
printf(" -> Got Datatype: %i\n", variant.GetDataType() );
44
CPPUNIT_ASSERT_EQUAL( variant.GetDataType(), eDataType );
46
variant.ToString( ret );
47
printf(" -> Convert To String: %s\n", ret.c_str() );
49
CPPUNIT_ASSERT_EQUAL( expected, ret );
52
void TokenizerTest::setUp()
57
void TokenizerTest::tearDown()
62
void TokenizerTest::testArrays()
64
Test( "[]", ePdfDataType_Array, "[ ]" );
65
Test( "[ ]", ePdfDataType_Array );
66
Test( "[ / ]", ePdfDataType_Array, "[ / ]" ); // empty names are legal, too!
67
Test( "[ / [ ] ]", ePdfDataType_Array, "[ / [ ] ]" ); // empty names are legal, too!
68
Test( "[/[]]", ePdfDataType_Array, "[ / [ ] ]" ); // empty names are legal, too!
69
Test( "[ 1 2 3 4 ]", ePdfDataType_Array );
70
Test( "[1 2 3 4]", ePdfDataType_Array, "[ 1 2 3 4 ]" );
71
Test( "[ 2 (Hallo Welt!) 3.500000 /FMC ]", ePdfDataType_Array );
72
Test( "[ [ 1 2 ] (Hallo Welt!) 3.500000 /FMC ]", ePdfDataType_Array );
73
Test( "[/ImageA/ImageB/ImageC]", ePdfDataType_Array, "[ /ImageA /ImageB /ImageC ]" );
74
Test( "[<530464995927cef8aaf46eb953b93373><530464995927cef8aaf46eb953b93373>]", ePdfDataType_Array, "[ <530464995927CEF8AAF46EB953B93373> <530464995927CEF8AAF46EB953B93373> ]" );
75
Test( "[ 2 0 R (Test Data) 4 << /Key /Data >> 5 0 R ]", ePdfDataType_Array, "[ 2 0 R (Test Data) 4 <<\n/Key /Data\n>> 5 0 R ]" );
76
Test( "[<</key/name>>2 0 R]", ePdfDataType_Array, "[ <<\n/key /name\n>> 2 0 R ]" );
77
Test( "[<<//name>>2 0 R]", ePdfDataType_Array,"[ <<\n/ /name\n>> 2 0 R ]" );
78
Test( "[ 27.673200 27.673200 566.256000 651.295000 ]", ePdfDataType_Array );
81
void TokenizerTest::testBool()
83
Test( "false", ePdfDataType_Bool);
84
Test( "true", ePdfDataType_Bool);
87
void TokenizerTest::testHexString()
89
Test( "<FFEB0400A0CC>", ePdfDataType_HexString );
90
Test( "<FFEB0400A0C>", ePdfDataType_HexString, "<FFEB0400A0C0>" );
91
Test( "<>", ePdfDataType_HexString );
94
void TokenizerTest::testName()
96
Test( "/Type", ePdfDataType_Name );
97
Test( "/Length", ePdfDataType_Name );
98
Test( "/Adobe#20Green", ePdfDataType_Name );
99
Test( "/$$", ePdfDataType_Name );
100
Test( "/1.2", ePdfDataType_Name );
101
Test( "/.notdef", ePdfDataType_Name );
102
Test( "/@pattern", ePdfDataType_Name );
103
Test( "/A;Name_With-Various***Characters?", ePdfDataType_Name );
104
Test( "/", ePdfDataType_Name ); // empty names are legal, too!
106
// Some additional tests, which cause errors for Sebastian Loch
108
const char* pszString = "/CheckBox#C3#9Cbersetzungshinweis";
110
PdfTokenizer tokenizer( pszString, strlen( pszString ) );
111
tokenizer.GetNextVariant( variant, NULL );
113
PdfName name2( variant.GetName() );
116
std::ostringstream oss;
117
PdfOutputDevice output(&oss);
118
name2.Write(&output);
120
CPPUNIT_ASSERT_EQUAL( variant.GetName().GetName(), name2.GetName() );
121
CPPUNIT_ASSERT_EQUAL( oss.str(), std::string(pszString) );
123
printf("!!! Name=[%s]\n", variant.GetName().GetName().c_str() );
124
printf("!!! Name2=[%s]\n", name2.GetName().c_str() );
125
printf("!!! oss=[%s]\n", oss.str().c_str() );
128
void TokenizerTest::testNull()
130
Test( "null", ePdfDataType_Null );
133
void TokenizerTest::testNumbers()
135
Test( "145", ePdfDataType_Number );
136
Test( "-12", ePdfDataType_Number );
137
Test( "3.141230", ePdfDataType_Real );
138
Test( "-2.970000", ePdfDataType_Real );
139
Test( "0", ePdfDataType_Number );
140
Test( "4.", ePdfDataType_Real, "4.000000" );
144
void TokenizerTest::testReference()
146
Test( "2 0 R", ePdfDataType_Reference );
147
Test( "3 0 R", ePdfDataType_Reference );
148
Test( "4 1 R", ePdfDataType_Reference );
151
void TokenizerTest::testString()
154
Test( "(Hallo Welt!)", ePdfDataType_String );
155
Test( "(Hallo \\(schöne\\) Welt!)", ePdfDataType_String );
156
Test( "(Balanced () brackets are (ok ()) in PDF Strings)", ePdfDataType_String,
157
"(Balanced \\(\\) brackets are \\(ok \\(\\)\\) in PDF Strings)" );
158
Test( "()", ePdfDataType_String );
160
// Test octal strings
161
Test( "(Test: \\064)", ePdfDataType_String, "(Test: \064)" );
162
Test( "(Test: \\064\\064)", ePdfDataType_String, "(Test: \064\064)" );
163
Test( "(Test: \\0645)", ePdfDataType_String, "(Test: 45)" );
164
Test( "(Test: \\478)", ePdfDataType_String, "(Test: '8)" );
167
Test( "(Hallo\nWelt!)", ePdfDataType_String, "(Hallo\\nWelt!)" );
168
Test( "(These \\\ntwo strings \\\nare the same.)", ePdfDataType_String,
169
"(These two strings are the same.)" );
171
// Test escape sequences
172
Test( "(Hallo\\nWelt!)", ePdfDataType_String, "(Hallo\\nWelt!)" );
173
Test( "(Hallo\\rWelt!)", ePdfDataType_String, "(Hallo\\rWelt!)" );
174
Test( "(Hallo\\tWelt!)", ePdfDataType_String, "(Hallo\\tWelt!)" );
175
Test( "(Hallo\\bWelt!)", ePdfDataType_String, "(Hallo\\bWelt!)" );
176
Test( "(Hallo\\fWelt!)", ePdfDataType_String, "(Hallo\\fWelt!)" );
179
void TokenizerTest::testDictionary()
181
const char* pszDictIn =
182
"<< /CheckBox#C3#9Cbersetzungshinweis(False)/Checkbox#C3#9Cbersetzungstabelle(False) >>";
183
const char* pszDictOut =
184
"<<\n/CheckBox#C3#9Cbersetzungshinweis (False)\n/Checkbox#C3#9Cbersetzungstabelle (False)\n>>";
186
Test( pszDictIn, ePdfDataType_Dictionary, pszDictOut );
189
void TokenizerTest::TestStream( const char* pszBuffer, const char* pszTokens[] )
192
long lLen = strlen( pszBuffer );
193
PdfTokenizer tokenizer( pszBuffer, lLen );
197
while( pszTokens[i] )
199
CPPUNIT_ASSERT_EQUAL( tokenizer.GetNextToken( pszCur, &eType ), true );
201
std::string sCur( pszCur );
202
std::string sToken( pszTokens[i] );
204
CPPUNIT_ASSERT_EQUAL( sCur, sToken );
209
// We are at the end, so GetNextToken has to return false!
210
CPPUNIT_ASSERT_EQUAL( tokenizer.GetNextToken( pszCur, &eType ), false );
213
void TokenizerTest::TestStreamIsNextToken( const char* pszBuffer, const char* pszTokens[] )
216
long lLen = strlen( pszBuffer );
217
PdfTokenizer tokenizer( pszBuffer, lLen );
220
while( pszTokens[i] )
221
CPPUNIT_ASSERT_EQUAL( tokenizer.IsNextToken( pszTokens[i++] ), true );
224
void TokenizerTest::testTokens()
226
const char* pszBuffer = "613 0 obj"
227
"<< /Length 141 /Filter [ /ASCII85Decode /FlateDecode ] >>"
230
const char* pszTokens[] = {
231
"613", "0", "obj", "<<", "/", "Length", "141", "/", "Filter", "[", "/",
232
"ASCII85Decode", "/", "FlateDecode", "]", ">>", "endobj", NULL
235
TestStream( pszBuffer, pszTokens );
236
TestStreamIsNextToken( pszBuffer, pszTokens );
239
void TokenizerTest::testComments()
241
const char* pszBuffer = "613 0 obj\n"
242
"% A comment that should be ignored\n"
243
"<< /Length 141 /Filter\n% A comment in a dictionary\n[ /ASCII85Decode /FlateDecode ] >>"
246
const char* pszTokens[] = {
247
"613", "0", "obj", "<<", "/", "Length", "141", "/", "Filter", "[", "/",
248
"ASCII85Decode", "/", "FlateDecode", "]", ">>", "endobj", NULL
251
TestStream( pszBuffer, pszTokens );
252
TestStreamIsNextToken( pszBuffer, pszTokens );
255
void TokenizerTest::testLocale()
257
// Test with a locale thate uses "," instead of "." for doubles
258
char *old = setlocale( LC_ALL, "de_DE" );
260
const char* pszNumber = "3.140000";
261
Test( pszNumber, ePdfDataType_Real, pszNumber );
263
setlocale( LC_ALL, old );