bump product version to 4.1.6.2
[LibreOffice.git] / sdext / source / pdfimport / test / tests.cxx
blob5ea11848dc3eb78638b779780a803b02af9f3282
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
3 * This file is part of the LibreOffice project.
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
9 * This file incorporates work covered by the following license notice:
11 * Licensed to the Apache Software Foundation (ASF) under one or more
12 * contributor license agreements. See the NOTICE file distributed
13 * with this work for additional information regarding copyright
14 * ownership. The ASF licenses this file to you under the Apache
15 * License, Version 2.0 (the "License"); you may not use this file
16 * except in compliance with the License. You may obtain a copy of
17 * the License at http://www.apache.org/licenses/LICENSE-2.0 .
20 #include <zlib.h>
22 #include "outputwrap.hxx"
23 #include "contentsink.hxx"
24 #include "pdfihelper.hxx"
25 #include "wrapper.hxx"
26 #include "pdfparse.hxx"
27 #include "../pdfiadaptor.hxx"
29 #include <rtl/math.hxx>
30 #include <osl/file.hxx>
31 #include <comphelper/sequence.hxx>
33 #include "cppunit/TestAssert.h"
34 #include "cppunit/TestFixture.h"
35 #include "cppunit/extensions/HelperMacros.h"
36 #include "cppunit/plugin/TestPlugIn.h"
37 #include <test/bootstrapfixture.hxx>
39 #include <com/sun/star/rendering/XCanvas.hpp>
40 #include <com/sun/star/rendering/XColorSpace.hpp>
41 #include <com/sun/star/rendering/PathJoinType.hpp>
42 #include <com/sun/star/rendering/PathCapType.hpp>
43 #include <com/sun/star/rendering/BlendMode.hpp>
45 #include <basegfx/matrix/b2dhommatrix.hxx>
46 #include <basegfx/tools/canvastools.hxx>
47 #include <basegfx/polygon/b2dpolygon.hxx>
48 #include <basegfx/polygon/b2dpolypolygon.hxx>
49 #include <basegfx/polygon/b2dpolypolygontools.hxx>
50 #include <basegfx/polygon/b2dpolygonclipper.hxx>
52 #include <vector>
53 #include <boost/unordered_map.hpp>
55 #include <cassert>
56 #include <rtl/ustring.hxx>
58 using namespace ::pdfparse;
59 using namespace ::pdfi;
60 using namespace ::com::sun::star;
62 namespace
65 class TestSink : public ContentSink
67 public:
68 TestSink() :
69 m_nNextFontId( 1 ),
70 m_aIdToFont(),
71 m_aFontToId(),
72 m_aGCStack(1),
73 m_aPageSize(),
74 m_aHyperlinkBounds(),
75 m_aURI(),
76 m_aTextOut(),
77 m_nNumPages(0),
78 m_bPageEnded(false),
79 m_bRedCircleSeen(false),
80 m_bGreenStrokeSeen(false),
81 m_bDashedLineSeen(false),
82 m_bImageSeen(false)
85 ~TestSink()
87 CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE( "A4 page size (in 100th of points): Width", m_aPageSize.Width, 79400, 0.00000001);
88 CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE( "A4 page size (in 100th of points): Height" , m_aPageSize.Height, 59500, 0.0000001 );
89 CPPUNIT_ASSERT_MESSAGE( "endPage() called", m_bPageEnded );
90 CPPUNIT_ASSERT_EQUAL_MESSAGE( "Num pages equal one", m_nNumPages, (sal_Int32) 1 );
91 CPPUNIT_ASSERT_MESSAGE( "Correct hyperlink bounding box",
92 rtl::math::approxEqual(m_aHyperlinkBounds.X1,34.7 ) &&
93 rtl::math::approxEqual(m_aHyperlinkBounds.Y1,386.0) &&
94 rtl::math::approxEqual(m_aHyperlinkBounds.X2,166.7) &&
95 rtl::math::approxEqual(m_aHyperlinkBounds.Y2,406.2) );
96 CPPUNIT_ASSERT_EQUAL_MESSAGE( "Correct hyperlink URI", m_aURI, OUString("http://download.openoffice.org/") );
98 const char* sText = " \n \nThis is a testtext\nNew paragraph,\nnew line\n"
99 "Hyperlink, this is\n?\nThis is more text\noutline mode\n?\nNew paragraph\n";
100 OString aTmp;
101 m_aTextOut.makeStringAndClear().convertToString( &aTmp,
102 RTL_TEXTENCODING_ASCII_US,
103 OUSTRING_TO_OSTRING_CVTFLAGS );
104 CPPUNIT_ASSERT_EQUAL_MESSAGE( "Imported text is \"This is a testtext New paragraph, new line"
105 " Hyperlink, this is * This is more text outline mode * New paragraph\"",
106 OString(sText), aTmp );
108 CPPUNIT_ASSERT_MESSAGE( "red circle seen in input", m_bRedCircleSeen );
109 CPPUNIT_ASSERT_MESSAGE( "green stroke seen in input", m_bGreenStrokeSeen );
110 CPPUNIT_ASSERT_MESSAGE( "dashed line seen in input", m_bDashedLineSeen );
111 CPPUNIT_ASSERT_MESSAGE( "image seen in input", m_bImageSeen );
114 private:
115 GraphicsContext& getCurrentContext() { return m_aGCStack.back(); }
117 // ContentSink interface implementation
118 virtual void setPageNum( sal_Int32 nNumPages )
120 m_nNumPages = nNumPages;
123 virtual void startPage( const geometry::RealSize2D& rSize )
125 m_aPageSize = rSize;
128 virtual void endPage()
130 m_bPageEnded = true;
133 virtual void hyperLink( const geometry::RealRectangle2D& rBounds,
134 const OUString& rURI )
136 m_aHyperlinkBounds = rBounds;
137 m_aURI = rURI;
140 virtual void pushState()
142 GraphicsContextStack::value_type const a(m_aGCStack.back());
143 m_aGCStack.push_back(a);
146 virtual void popState()
148 m_aGCStack.pop_back();
151 virtual void setTransformation( const geometry::AffineMatrix2D& rMatrix )
153 basegfx::unotools::homMatrixFromAffineMatrix(
154 getCurrentContext().Transformation,
155 rMatrix );
158 virtual void setLineDash( const uno::Sequence<double>& dashes,
159 double start )
161 GraphicsContext& rContext( getCurrentContext() );
162 if( dashes.getLength() )
163 comphelper::sequenceToContainer(rContext.DashArray,dashes);
164 CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE( "line dashing start offset", start, 0.0, 0.000000001 );
167 virtual void setFlatness( double nFlatness )
169 getCurrentContext().Flatness = nFlatness;
172 virtual void setLineJoin(sal_Int8 nJoin)
174 getCurrentContext().LineJoin = nJoin;
177 virtual void setLineCap(sal_Int8 nCap)
179 getCurrentContext().LineCap = nCap;
182 virtual void setMiterLimit(double nVal)
184 getCurrentContext().MiterLimit = nVal;
187 virtual void setLineWidth(double nVal)
189 getCurrentContext().LineWidth = nVal;
192 virtual void setFillColor( const rendering::ARGBColor& rColor )
194 getCurrentContext().FillColor = rColor;
197 virtual void setStrokeColor( const rendering::ARGBColor& rColor )
199 getCurrentContext().LineColor = rColor;
202 virtual void setBlendMode(sal_Int8 nMode)
204 getCurrentContext().BlendMode = nMode;
207 virtual void setFont( const FontAttributes& rFont )
209 FontToIdMap::const_iterator it = m_aFontToId.find( rFont );
210 if( it != m_aFontToId.end() )
211 getCurrentContext().FontId = it->second;
212 else
214 m_aFontToId[ rFont ] = m_nNextFontId;
215 m_aIdToFont[ m_nNextFontId ] = rFont;
216 getCurrentContext().FontId = m_nNextFontId;
217 m_nNextFontId++;
221 virtual void strokePath( const uno::Reference<rendering::XPolyPolygon2D>& rPath )
223 GraphicsContext& rContext( getCurrentContext() );
224 basegfx::B2DPolyPolygon aPath = basegfx::unotools::b2DPolyPolygonFromXPolyPolygon2D(rPath);
225 aPath.transform( rContext.Transformation );
227 if( rContext.DashArray.empty() )
229 CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE( "Line color is green", rContext.LineColor.Alpha, 1.0, 0.00000001);
230 CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE( "Line color is green", rContext.LineColor.Blue, 0.0, 0.00000001);
231 CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE( "Line color is green", rContext.LineColor.Green, 1.0, 0.00000001);
232 CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE( "Line color is green", rContext.LineColor.Red, 0.0, 0.00000001);
234 CPPUNIT_ASSERT_MESSAGE( "Line width is 0",
235 rtl::math::approxEqual(rContext.LineWidth, 28.3) );
237 const char* sExportString = "m53570 7650-35430 24100";
238 CPPUNIT_ASSERT_MESSAGE( "Stroke is m535.7 518.5-354.3-241",
239 basegfx::tools::exportToSvgD( aPath ).compareToAscii(sExportString) == 0 );
241 m_bGreenStrokeSeen = true;
243 else
245 CPPUNIT_ASSERT_MESSAGE( "Dash array consists of four entries",
246 rContext.DashArray.size() == 4 &&
247 rtl::math::approxEqual(rContext.DashArray[0],14.3764) &&
248 rContext.DashArray[0] == rContext.DashArray[1] &&
249 rContext.DashArray[1] == rContext.DashArray[2] &&
250 rContext.DashArray[2] == rContext.DashArray[3] );
252 CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE( "Line color is black", rContext.LineColor.Alpha, 1.0, 0.00000001);
253 CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE( "Line color is black", rContext.LineColor.Blue, 0.0, 0.00000001);
254 CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE( "Line color is black", rContext.LineColor.Green, 0.0, 0.00000001);
255 CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE( "Line color is black", rContext.LineColor.Red, 0.0, 0.00000001);
257 CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE( "Line width is 0",
258 rContext.LineWidth, 0, 0.0000001 );
260 const char* sExportString = "m49890 5670.00000000001-35430 24090";
261 CPPUNIT_ASSERT_MESSAGE( "Stroke is m49890 5670.00000000001-35430 24090",
262 basegfx::tools::exportToSvgD( aPath ).compareToAscii(sExportString) == 0 );
264 m_bDashedLineSeen = true;
266 CPPUNIT_ASSERT_MESSAGE( "Blend mode is normal",
267 rContext.BlendMode == rendering::BlendMode::NORMAL );
268 CPPUNIT_ASSERT_MESSAGE( "Join type is round",
269 rContext.LineJoin == rendering::PathJoinType::ROUND );
270 CPPUNIT_ASSERT_MESSAGE( "Cap type is butt",
271 rContext.LineCap == rendering::PathCapType::BUTT );
272 CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE( "Line miter limit is 10",
273 rContext.MiterLimit, 10, 0.0000001 );
274 CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE( "Flatness is 0",
275 rContext.Flatness, 1, 0.00000001 );
276 CPPUNIT_ASSERT_EQUAL_MESSAGE( "Font id is 0",
277 rContext.FontId, (sal_Int32) 0 );
280 virtual void fillPath( const uno::Reference<rendering::XPolyPolygon2D>& rPath )
282 GraphicsContext& rContext( getCurrentContext() );
283 basegfx::B2DPolyPolygon aPath = basegfx::unotools::b2DPolyPolygonFromXPolyPolygon2D(rPath);
284 aPath.transform( rContext.Transformation );
286 CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE( "Line color is black", rContext.LineColor.Alpha, 1.0, 0.00000001);
287 CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE( "Line color is black", rContext.LineColor.Blue, 0.0, 0.00000001);
288 CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE( "Line color is black", rContext.LineColor.Green, 0.0, 0.00000001);
289 CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE( "Line color is black", rContext.LineColor.Red, 0.0, 0.00000001);
291 CPPUNIT_ASSERT_MESSAGE( "Blend mode is normal",
292 rContext.BlendMode == rendering::BlendMode::NORMAL );
293 CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE( "Flatness is 10",
294 rContext.Flatness, 10, 0.00000001 );
295 CPPUNIT_ASSERT_EQUAL_MESSAGE( "Font id is 0",
296 rContext.FontId, (sal_Int32) 0 );
299 virtual void eoFillPath( const uno::Reference<rendering::XPolyPolygon2D>& rPath )
301 GraphicsContext& rContext( getCurrentContext() );
302 basegfx::B2DPolyPolygon aPath = basegfx::unotools::b2DPolyPolygonFromXPolyPolygon2D(rPath);
303 aPath.transform( rContext.Transformation );
305 CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE( "Line color is black", rContext.LineColor.Alpha, 1.0, 0.00000001);
306 CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE( "Line color is black", rContext.LineColor.Blue, 0.0, 0.00000001);
307 CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE( "Line color is black", rContext.LineColor.Green, 0.0, 0.00000001);
308 CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE( "Line color is black", rContext.LineColor.Red, 0.0, 0.00000001);
310 CPPUNIT_ASSERT_MESSAGE( "Blend mode is normal",
311 rContext.BlendMode == rendering::BlendMode::NORMAL );
312 CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE( "Flatness is 0",
313 rContext.Flatness, 1, 0.00000001 );
314 CPPUNIT_ASSERT_EQUAL_MESSAGE( "Font id is 0",
315 rContext.FontId, (sal_Int32) 0 );
317 const char* sExportString = "m12050 49610c-4310 0-7800-3490-7800-7800 0-4300 "
318 "3490-7790 7800-7790 4300 0 7790 3490 7790 7790 0 4310-3490 7800-7790 7800z";
319 CPPUNIT_ASSERT_MESSAGE( "Stroke is a 4-bezier circle",
320 basegfx::tools::exportToSvgD( aPath ).compareToAscii(sExportString) == 0 );
322 m_bRedCircleSeen = true;
325 virtual void intersectClip(const uno::Reference<rendering::XPolyPolygon2D>& rPath)
327 basegfx::B2DPolyPolygon aNewClip = basegfx::unotools::b2DPolyPolygonFromXPolyPolygon2D(rPath);
328 basegfx::B2DPolyPolygon aCurClip = getCurrentContext().Clip;
330 if( aCurClip.count() ) // #i92985# adapted API from (..., false, false) to (..., true, false)
331 aNewClip = basegfx::tools::clipPolyPolygonOnPolyPolygon( aCurClip, aNewClip, true, false );
333 getCurrentContext().Clip = aNewClip;
336 virtual void intersectEoClip(const uno::Reference<rendering::XPolyPolygon2D>& rPath)
338 basegfx::B2DPolyPolygon aNewClip = basegfx::unotools::b2DPolyPolygonFromXPolyPolygon2D(rPath);
339 basegfx::B2DPolyPolygon aCurClip = getCurrentContext().Clip;
341 if( aCurClip.count() ) // #i92985# adapted API from (..., false, false) to (..., true, false)
342 aNewClip = basegfx::tools::clipPolyPolygonOnPolyPolygon( aCurClip, aNewClip, true, false );
344 getCurrentContext().Clip = aNewClip;
347 virtual void drawGlyphs( const OUString& rGlyphs,
348 const geometry::RealRectangle2D& /*rRect*/,
349 const geometry::Matrix2D& /*rFontMatrix*/ )
351 m_aTextOut.append(rGlyphs);
354 virtual void endText()
356 m_aTextOut.append( OUString("\n") );
359 virtual void drawMask(const uno::Sequence<beans::PropertyValue>& xBitmap,
360 bool /*bInvert*/ )
362 CPPUNIT_ASSERT_EQUAL_MESSAGE( "drawMask received two properties",
363 xBitmap.getLength(), (sal_Int32) 3 );
364 CPPUNIT_ASSERT_MESSAGE( "drawMask got URL param",
365 xBitmap[0].Name.compareToAscii( "URL" ) == 0 );
366 CPPUNIT_ASSERT_MESSAGE( "drawMask got InputStream param",
367 xBitmap[1].Name.compareToAscii( "InputStream" ) == 0 );
370 virtual void drawImage(const uno::Sequence<beans::PropertyValue>& xBitmap )
372 CPPUNIT_ASSERT_EQUAL_MESSAGE( "drawImage received two properties",
373 xBitmap.getLength(), (sal_Int32) 3 );
374 CPPUNIT_ASSERT_MESSAGE( "drawImage got URL param",
375 xBitmap[0].Name.compareToAscii( "URL" ) == 0 );
376 CPPUNIT_ASSERT_MESSAGE( "drawImage got InputStream param",
377 xBitmap[1].Name.compareToAscii( "InputStream" ) == 0 );
378 m_bImageSeen = true;
381 virtual void drawColorMaskedImage(const uno::Sequence<beans::PropertyValue>& xBitmap,
382 const uno::Sequence<uno::Any>& /*xMaskColors*/ )
384 CPPUNIT_ASSERT_EQUAL_MESSAGE( "drawColorMaskedImage received two properties",
385 xBitmap.getLength(), (sal_Int32) 3 );
386 CPPUNIT_ASSERT_MESSAGE( "drawColorMaskedImage got URL param",
387 xBitmap[0].Name.compareToAscii( "URL" ) == 0 );
388 CPPUNIT_ASSERT_MESSAGE( "drawColorMaskedImage got InputStream param",
389 xBitmap[1].Name.compareToAscii( "InputStream" ) == 0 );
392 virtual void drawMaskedImage(const uno::Sequence<beans::PropertyValue>& xBitmap,
393 const uno::Sequence<beans::PropertyValue>& xMask,
394 bool /*bInvertMask*/)
396 CPPUNIT_ASSERT_EQUAL_MESSAGE( "drawMaskedImage received two properties #1",
397 xBitmap.getLength(), (sal_Int32) 3 );
398 CPPUNIT_ASSERT_MESSAGE( "drawMaskedImage got URL param #1",
399 xBitmap[0].Name.compareToAscii( "URL" ) == 0 );
400 CPPUNIT_ASSERT_MESSAGE( "drawMaskedImage got InputStream param #1",
401 xBitmap[1].Name.compareToAscii( "InputStream" ) == 0 );
403 CPPUNIT_ASSERT_EQUAL_MESSAGE( "drawMaskedImage received two properties #2",
404 xMask.getLength(), (sal_Int32) 3 );
405 CPPUNIT_ASSERT_MESSAGE( "drawMaskedImage got URL param #2",
406 xMask[0].Name.compareToAscii( "URL" ) == 0 );
407 CPPUNIT_ASSERT_MESSAGE( "drawMaskedImage got InputStream param #2",
408 xMask[1].Name.compareToAscii( "InputStream" ) == 0 );
411 virtual void drawAlphaMaskedImage(const uno::Sequence<beans::PropertyValue>& xBitmap,
412 const uno::Sequence<beans::PropertyValue>& xMask)
414 CPPUNIT_ASSERT_EQUAL_MESSAGE( "drawAlphaMaskedImage received two properties #1",
415 xBitmap.getLength(), (sal_Int32) 3 );
416 CPPUNIT_ASSERT_MESSAGE( "drawAlphaMaskedImage got URL param #1",
417 xBitmap[0].Name.compareToAscii( "URL" ) == 0 );
418 CPPUNIT_ASSERT_MESSAGE( "drawAlphaMaskedImage got InputStream param #1",
419 xBitmap[1].Name.compareToAscii( "InputStream" ) == 0 );
421 CPPUNIT_ASSERT_EQUAL_MESSAGE( "drawAlphaMaskedImage received two properties #2",
422 xMask.getLength(), (sal_Int32) 3 );
423 CPPUNIT_ASSERT_MESSAGE( "drawAlphaMaskedImage got URL param #2",
424 xMask[0].Name.compareToAscii( "URL" ) == 0 );
425 CPPUNIT_ASSERT_MESSAGE( "drawAlphaMaskedImage got InputStream param #2",
426 xMask[1].Name.compareToAscii( "InputStream" ) == 0 );
429 virtual void setTextRenderMode( sal_Int32 )
433 typedef boost::unordered_map<sal_Int32,FontAttributes> IdToFontMap;
434 typedef boost::unordered_map<FontAttributes,sal_Int32,FontAttrHash> FontToIdMap;
436 typedef std::vector<GraphicsContext> GraphicsContextStack;
438 sal_Int32 m_nNextFontId;
439 IdToFontMap m_aIdToFont;
440 FontToIdMap m_aFontToId;
442 GraphicsContextStack m_aGCStack;
443 geometry::RealSize2D m_aPageSize;
444 geometry::RealRectangle2D m_aHyperlinkBounds;
445 OUString m_aURI;
446 OUStringBuffer m_aTextOut;
447 sal_Int32 m_nNumPages;
448 bool m_bPageEnded;
449 bool m_bRedCircleSeen;
450 bool m_bGreenStrokeSeen;
451 bool m_bDashedLineSeen;
452 bool m_bImageSeen;
455 class PDFITest : public test::BootstrapFixture
457 public:
458 void testXPDFParser()
460 pdfi::ContentSinkSharedPtr pSink( new TestSink() );
461 pdfi::xpdf_ImportFromFile( getURLFromSrc("/sdext/source/pdfimport/test/testinput.pdf"),
462 pSink,
463 uno::Reference< task::XInteractionHandler >(),
464 OUString(),
465 getComponentContext() );
467 // make destruction explicit, a bunch of things are
468 // checked in the destructor
469 pSink.reset();
472 void testOdfDrawExport()
474 pdfi::PDFIRawAdaptor aAdaptor( getComponentContext() );
475 aAdaptor.setTreeVisitorFactory( createDrawTreeVisitorFactory() );
477 OUString tempFileURL;
478 CPPUNIT_ASSERT( osl::File::createTempFile( NULL, NULL, &tempFileURL ) == osl::File::E_None );
479 osl::File::remove( tempFileURL ); // FIXME the below apparently fails silently if the file already exists
480 CPPUNIT_ASSERT_MESSAGE("Exporting to ODF",
481 aAdaptor.odfConvert( getURLFromSrc("/sdext/source/pdfimport/test/testinput.pdf"),
482 new OutputWrap(tempFileURL),
483 NULL ));
484 osl::File::remove( tempFileURL );
487 void testOdfWriterExport()
489 pdfi::PDFIRawAdaptor aAdaptor( getComponentContext() );
490 aAdaptor.setTreeVisitorFactory( createWriterTreeVisitorFactory() );
492 OUString tempFileURL;
493 CPPUNIT_ASSERT( osl::File::createTempFile( NULL, NULL, &tempFileURL ) == osl::File::E_None );
494 osl::File::remove( tempFileURL ); // FIXME the below apparently fails silently if the file already exists
495 CPPUNIT_ASSERT_MESSAGE("Exporting to ODF",
496 aAdaptor.odfConvert( getURLFromSrc("/sdext/source/pdfimport/test/testinput.pdf"),
497 new OutputWrap(tempFileURL),
498 NULL ));
499 osl::File::remove( tempFileURL );
502 CPPUNIT_TEST_SUITE(PDFITest);
503 CPPUNIT_TEST(testXPDFParser);
504 CPPUNIT_TEST(testOdfWriterExport);
505 CPPUNIT_TEST(testOdfDrawExport);
506 CPPUNIT_TEST_SUITE_END();
511 CPPUNIT_TEST_SUITE_REGISTRATION(PDFITest);
513 CPPUNIT_PLUGIN_IMPLEMENT();
515 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */