Update ooo320-m1
[ooovba.git] / sdext / source / pdfimport / test / tests.cxx
blob12d384e1af4f09e5f9a11c79f908c3c7ab2cab5a
1 /*************************************************************************
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * Copyright 2008 by Sun Microsystems, Inc.
7 * OpenOffice.org - a multi-platform office productivity suite
9 * $RCSfile: tests.cxx,v $
11 * $Revision: 1.2.6.1 $
13 * This file is part of OpenOffice.org.
15 * OpenOffice.org is free software: you can redistribute it and/or modify
16 * it under the terms of the GNU Lesser General Public License version 3
17 * only, as published by the Free Software Foundation.
19 * OpenOffice.org is distributed in the hope that it will be useful,
20 * but WITHOUT ANY WARRANTY; without even the implied warranty of
21 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22 * GNU Lesser General Public License version 3 for more details
23 * (a copy is included in the LICENSE file that accompanied this code).
25 * You should have received a copy of the GNU Lesser General Public License
26 * version 3 along with OpenOffice.org. If not, see
27 * <http://www.openoffice.org/license.html>
28 * for a copy of the LGPLv3 License.
30 ************************************************************************/
32 // MARKER(update_precomp.py): autogen include statement, do not remove
33 #include "precompiled_sdext.hxx"
35 #ifdef SYSTEM_ZLIB
36 #include "zlib.h"
37 #else
38 #include <zlib/zlib.h>
39 #endif
41 #include "outputwrap.hxx"
42 #include "contentsink.hxx"
43 #include "pdfihelper.hxx"
44 #include "wrapper.hxx"
45 #include "pdfparse.hxx"
46 #include "../pdfiadaptor.hxx"
48 #include <rtl/math.hxx>
49 #include <osl/file.hxx>
50 #include <osl/process.h>
51 #include <cppunit/simpleheader.hxx>
52 #include <cppuhelper/compbase1.hxx>
53 #include <cppuhelper/bootstrap.hxx>
54 #include <cppuhelper/basemutex.hxx>
55 #include <comphelper/sequence.hxx>
58 #include <com/sun/star/rendering/XCanvas.hpp>
59 #include <com/sun/star/rendering/XColorSpace.hpp>
60 #include <com/sun/star/rendering/PathJoinType.hpp>
61 #include <com/sun/star/rendering/PathCapType.hpp>
62 #include <com/sun/star/rendering/BlendMode.hpp>
63 #include <com/sun/star/lang/XMultiServiceFactory.hpp>
64 #include <com/sun/star/lang/XInitialization.hpp>
65 #include <com/sun/star/registry/XSimpleRegistry.hpp>
67 #include <basegfx/matrix/b2dhommatrix.hxx>
68 #include <basegfx/tools/canvastools.hxx>
69 #include <basegfx/polygon/b2dpolygon.hxx>
70 #include <basegfx/polygon/b2dpolypolygon.hxx>
71 #include <basegfx/polygon/b2dpolypolygontools.hxx>
72 #include <basegfx/polygon/b2dpolygonclipper.hxx>
74 #include <vector>
75 #include <hash_map>
78 using namespace ::pdfparse;
79 using namespace ::pdfi;
80 using namespace ::com::sun::star;
82 namespace
84 class TestSink : public ContentSink
86 public:
87 TestSink() :
88 m_nNextFontId( 1 ),
89 m_aIdToFont(),
90 m_aFontToId(),
91 m_aGCStack(1),
92 m_aPageSize(),
93 m_aHyperlinkBounds(),
94 m_aURI(),
95 m_aTextOut(),
96 m_nNumPages(0),
97 m_bPageEnded(false),
98 m_bRedCircleSeen(false),
99 m_bGreenStrokeSeen(false),
100 m_bDashedLineSeen(false)
103 ~TestSink()
105 CPPUNIT_ASSERT_MESSAGE( "A4 page size (in 100th of points)",
106 m_aPageSize.Width == 79400 && m_aPageSize.Height == 59500 );
107 CPPUNIT_ASSERT_MESSAGE( "endPage() called", m_bPageEnded );
108 CPPUNIT_ASSERT_MESSAGE( "Num pages equal one", m_nNumPages == 1 );
109 CPPUNIT_ASSERT_MESSAGE( "Correct hyperlink bounding box",
110 rtl::math::approxEqual(m_aHyperlinkBounds.X1,34.7 ) &&
111 rtl::math::approxEqual(m_aHyperlinkBounds.Y1,386.0) &&
112 rtl::math::approxEqual(m_aHyperlinkBounds.X2,166.7) &&
113 rtl::math::approxEqual(m_aHyperlinkBounds.Y2,406.2) );
114 CPPUNIT_ASSERT_MESSAGE( "Correct hyperlink URI",
115 m_aURI == ::rtl::OUString::createFromAscii( "http://download.openoffice.org/" ) );
117 const char* sText = " \n \nThis is a testtext\nNew paragraph,\nnew line\n"
118 "Hyperlink, this is\n?\nThis is more text\noutline mode\n?\nNew paragraph\n";
119 ::rtl::OString aTmp;
120 m_aTextOut.makeStringAndClear().convertToString( &aTmp,
121 RTL_TEXTENCODING_ASCII_US,
122 OUSTRING_TO_OSTRING_CVTFLAGS );
123 CPPUNIT_ASSERT_MESSAGE( "Imported text is \"This is a testtext New paragraph, new line"
124 " Hyperlink, this is * This is more text outline mode * New paragraph\"",
125 sText == aTmp );
127 CPPUNIT_ASSERT_MESSAGE( "red circle seen in input", m_bRedCircleSeen );
128 CPPUNIT_ASSERT_MESSAGE( "green stroke seen in input", m_bGreenStrokeSeen );
129 CPPUNIT_ASSERT_MESSAGE( "dashed line seen in input", m_bDashedLineSeen );
132 private:
133 GraphicsContext& getCurrentContext() { return m_aGCStack.back(); }
135 // ContentSink interface implementation
136 virtual void setPageNum( sal_Int32 nNumPages )
138 m_nNumPages = nNumPages;
141 virtual void startPage( const geometry::RealSize2D& rSize )
143 m_aPageSize = rSize;
146 virtual void endPage()
148 m_bPageEnded = true;
151 virtual void hyperLink( const geometry::RealRectangle2D& rBounds,
152 const ::rtl::OUString& rURI )
154 m_aHyperlinkBounds = rBounds;
155 m_aURI = rURI;
158 virtual void pushState()
160 m_aGCStack.push_back( m_aGCStack.back() );
163 virtual void popState()
165 m_aGCStack.pop_back();
168 virtual void setTransformation( const geometry::AffineMatrix2D& rMatrix )
170 basegfx::unotools::homMatrixFromAffineMatrix(
171 getCurrentContext().Transformation,
172 rMatrix );
175 virtual void setLineDash( const uno::Sequence<double>& dashes,
176 double start )
178 GraphicsContext& rContext( getCurrentContext() );
179 if( dashes.getLength() )
180 comphelper::sequenceToContainer(rContext.DashArray,dashes);
181 CPPUNIT_ASSERT_MESSAGE( "line dashing start offset", start == 0.0 );
184 virtual void setFlatness( double nFlatness )
186 getCurrentContext().Flatness = nFlatness;
189 virtual void setLineJoin(sal_Int8 nJoin)
191 getCurrentContext().LineJoin = nJoin;
194 virtual void setLineCap(sal_Int8 nCap)
196 getCurrentContext().LineCap = nCap;
199 virtual void setMiterLimit(double nVal)
201 getCurrentContext().MiterLimit = nVal;
204 virtual void setLineWidth(double nVal)
206 getCurrentContext().LineWidth = nVal;
209 virtual void setFillColor( const rendering::ARGBColor& rColor )
211 getCurrentContext().FillColor = rColor;
214 virtual void setStrokeColor( const rendering::ARGBColor& rColor )
216 getCurrentContext().LineColor = rColor;
219 virtual void setBlendMode(sal_Int8 nMode)
221 getCurrentContext().BlendMode = nMode;
224 virtual void setFont( const FontAttributes& rFont )
226 FontToIdMap::const_iterator it = m_aFontToId.find( rFont );
227 if( it != m_aFontToId.end() )
228 getCurrentContext().FontId = it->second;
229 else
231 m_aFontToId[ rFont ] = m_nNextFontId;
232 m_aIdToFont[ m_nNextFontId ] = rFont;
233 getCurrentContext().FontId = m_nNextFontId;
234 m_nNextFontId++;
238 virtual void strokePath( const uno::Reference<rendering::XPolyPolygon2D>& rPath )
240 GraphicsContext& rContext( getCurrentContext() );
241 basegfx::B2DPolyPolygon aPath = basegfx::unotools::b2DPolyPolygonFromXPolyPolygon2D(rPath);
242 aPath.transform( rContext.Transformation );
244 if( rContext.DashArray.empty() )
246 CPPUNIT_ASSERT_MESSAGE( "Line color is green",
247 rContext.LineColor.Alpha == 1.0 &&
248 rContext.LineColor.Red == 0.0 &&
249 rContext.LineColor.Green == 1.0 &&
250 rContext.LineColor.Blue == 0.0 );
252 CPPUNIT_ASSERT_MESSAGE( "Line width is 0",
253 rtl::math::approxEqual(rContext.LineWidth, 28.3) );
255 const char* sExportString = "m53570 7650-35430 24100";
256 CPPUNIT_ASSERT_MESSAGE( "Stroke is m535.7 518.5-354.3-241",
257 basegfx::tools::exportToSvgD( aPath ).compareToAscii(sExportString) == 0 );
259 m_bGreenStrokeSeen = true;
261 else
263 CPPUNIT_ASSERT_MESSAGE( "Dash array cons ists of four entries",
264 rContext.DashArray.size() == 4 &&
265 rtl::math::approxEqual(rContext.DashArray[0],14.3764) &&
266 rContext.DashArray[0] == rContext.DashArray[1] &&
267 rContext.DashArray[1] == rContext.DashArray[2] &&
268 rContext.DashArray[2] == rContext.DashArray[3] );
270 CPPUNIT_ASSERT_MESSAGE( "Line color is black",
271 rContext.LineColor.Alpha == 1.0 &&
272 rContext.LineColor.Red == 0.0 &&
273 rContext.LineColor.Green == 0.0 &&
274 rContext.LineColor.Blue == 0.0 );
276 CPPUNIT_ASSERT_MESSAGE( "Line width is 0",
277 rContext.LineWidth == 0 );
279 const char* sExportString = "m49890 5670.00000000001-35430 24090";
280 CPPUNIT_ASSERT_MESSAGE( "Stroke is m49890 5670.00000000001-35430 24090",
281 basegfx::tools::exportToSvgD( aPath ).compareToAscii(sExportString) == 0 );
283 m_bDashedLineSeen = true;
285 CPPUNIT_ASSERT_MESSAGE( "Blend mode is normal",
286 rContext.BlendMode == rendering::BlendMode::NORMAL );
287 CPPUNIT_ASSERT_MESSAGE( "Join type is round",
288 rContext.LineJoin == rendering::PathJoinType::ROUND );
289 CPPUNIT_ASSERT_MESSAGE( "Cap type is butt",
290 rContext.LineCap == rendering::PathCapType::BUTT );
291 CPPUNIT_ASSERT_MESSAGE( "Line miter limit is 10",
292 rContext.MiterLimit == 10 );
293 CPPUNIT_ASSERT_MESSAGE( "Flatness is 0",
294 rContext.Flatness == 1 );
295 CPPUNIT_ASSERT_MESSAGE( "Font id is 0",
296 rContext.FontId == 0 );
299 virtual void fillPath( 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_MESSAGE( "Fill color is black",
306 rContext.FillColor.Alpha == 1.0 &&
307 rContext.FillColor.Red == 0.0 &&
308 rContext.FillColor.Green == 0.0 &&
309 rContext.FillColor.Blue == 0.0 );
310 CPPUNIT_ASSERT_MESSAGE( "Blend mode is normal",
311 rContext.BlendMode == rendering::BlendMode::NORMAL );
312 CPPUNIT_ASSERT_MESSAGE( "Flatness is 10",
313 rContext.Flatness == 10 );
314 CPPUNIT_ASSERT_MESSAGE( "Font id is 0",
315 rContext.FontId == 0 );
318 virtual void eoFillPath( const uno::Reference<rendering::XPolyPolygon2D>& rPath )
320 GraphicsContext& rContext( getCurrentContext() );
321 basegfx::B2DPolyPolygon aPath = basegfx::unotools::b2DPolyPolygonFromXPolyPolygon2D(rPath);
322 aPath.transform( rContext.Transformation );
324 CPPUNIT_ASSERT_MESSAGE( "Fill color is black",
325 rContext.FillColor.Alpha == 1.0 &&
326 rContext.FillColor.Red == 1.0 &&
327 rContext.FillColor.Green == 0.0 &&
328 rContext.FillColor.Blue == 0.0 );
329 CPPUNIT_ASSERT_MESSAGE( "Blend mode is normal",
330 rContext.BlendMode == rendering::BlendMode::NORMAL );
331 CPPUNIT_ASSERT_MESSAGE( "Flatness is 0",
332 rContext.Flatness == 1 );
333 CPPUNIT_ASSERT_MESSAGE( "Font id is 0",
334 rContext.FontId == 0 );
336 const char* sExportString = "m12050 49610c-4310 0-7800-3490-7800-7800 0-4300 "
337 "3490-7790 7800-7790 4300 0 7790 3490 7790 7790 0 4310-3490 7800-7790 7800z";
338 CPPUNIT_ASSERT_MESSAGE( "Stroke is a 4-bezier circle",
339 basegfx::tools::exportToSvgD( aPath ).compareToAscii(sExportString) == 0 );
341 m_bRedCircleSeen = true;
344 virtual void intersectClip(const uno::Reference<rendering::XPolyPolygon2D>& rPath)
346 basegfx::B2DPolyPolygon aNewClip = basegfx::unotools::b2DPolyPolygonFromXPolyPolygon2D(rPath);
347 basegfx::B2DPolyPolygon aCurClip = getCurrentContext().Clip;
349 if( aCurClip.count() ) // #i92985# adapted API from (..., false, false) to (..., true, false)
350 aNewClip = basegfx::tools::clipPolyPolygonOnPolyPolygon( aCurClip, aNewClip, true, false );
352 getCurrentContext().Clip = aNewClip;
355 virtual void intersectEoClip(const uno::Reference<rendering::XPolyPolygon2D>& rPath)
357 basegfx::B2DPolyPolygon aNewClip = basegfx::unotools::b2DPolyPolygonFromXPolyPolygon2D(rPath);
358 basegfx::B2DPolyPolygon aCurClip = getCurrentContext().Clip;
360 if( aCurClip.count() ) // #i92985# adapted API from (..., false, false) to (..., true, false)
361 aNewClip = basegfx::tools::clipPolyPolygonOnPolyPolygon( aCurClip, aNewClip, true, false );
363 getCurrentContext().Clip = aNewClip;
366 virtual void drawGlyphs( const rtl::OUString& rGlyphs,
367 const geometry::RealRectangle2D& /*rRect*/,
368 const geometry::Matrix2D& /*rFontMatrix*/ )
370 m_aTextOut.append(rGlyphs);
373 virtual void endText()
375 m_aTextOut.append( ::rtl::OUString::createFromAscii("\n") );
378 virtual void drawMask(const uno::Sequence<beans::PropertyValue>& xBitmap,
379 bool /*bInvert*/ )
381 CPPUNIT_ASSERT_MESSAGE( "drawMask received two properties",
382 xBitmap.getLength()==3 );
383 CPPUNIT_ASSERT_MESSAGE( "drawMask got URL param",
384 xBitmap[0].Name.compareToAscii( "URL" ) == 0 );
385 CPPUNIT_ASSERT_MESSAGE( "drawMask got InputStream param",
386 xBitmap[1].Name.compareToAscii( "InputStream" ) == 0 );
389 virtual void drawImage(const uno::Sequence<beans::PropertyValue>& xBitmap )
391 CPPUNIT_ASSERT_MESSAGE( "drawImage received two properties",
392 xBitmap.getLength()==3 );
393 CPPUNIT_ASSERT_MESSAGE( "drawImage got URL param",
394 xBitmap[0].Name.compareToAscii( "URL" ) == 0 );
395 CPPUNIT_ASSERT_MESSAGE( "drawImage got InputStream param",
396 xBitmap[1].Name.compareToAscii( "InputStream" ) == 0 );
399 virtual void drawColorMaskedImage(const uno::Sequence<beans::PropertyValue>& xBitmap,
400 const uno::Sequence<uno::Any>& /*xMaskColors*/ )
402 CPPUNIT_ASSERT_MESSAGE( "drawColorMaskedImage received two properties",
403 xBitmap.getLength()==3 );
404 CPPUNIT_ASSERT_MESSAGE( "drawColorMaskedImage got URL param",
405 xBitmap[0].Name.compareToAscii( "URL" ) == 0 );
406 CPPUNIT_ASSERT_MESSAGE( "drawColorMaskedImage got InputStream param",
407 xBitmap[1].Name.compareToAscii( "InputStream" ) == 0 );
410 virtual void drawMaskedImage(const uno::Sequence<beans::PropertyValue>& xBitmap,
411 const uno::Sequence<beans::PropertyValue>& xMask,
412 bool /*bInvertMask*/)
414 CPPUNIT_ASSERT_MESSAGE( "drawMaskedImage received two properties #1",
415 xBitmap.getLength()==3 );
416 CPPUNIT_ASSERT_MESSAGE( "drawMaskedImage got URL param #1",
417 xBitmap[0].Name.compareToAscii( "URL" ) == 0 );
418 CPPUNIT_ASSERT_MESSAGE( "drawMaskedImage got InputStream param #1",
419 xBitmap[1].Name.compareToAscii( "InputStream" ) == 0 );
421 CPPUNIT_ASSERT_MESSAGE( "drawMaskedImage received two properties #2",
422 xMask.getLength()==3 );
423 CPPUNIT_ASSERT_MESSAGE( "drawMaskedImage got URL param #2",
424 xMask[0].Name.compareToAscii( "URL" ) == 0 );
425 CPPUNIT_ASSERT_MESSAGE( "drawMaskedImage got InputStream param #2",
426 xMask[1].Name.compareToAscii( "InputStream" ) == 0 );
429 virtual void drawAlphaMaskedImage(const uno::Sequence<beans::PropertyValue>& xBitmap,
430 const uno::Sequence<beans::PropertyValue>& xMask)
432 CPPUNIT_ASSERT_MESSAGE( "drawAlphaMaskedImage received two properties #1",
433 xBitmap.getLength()==3 );
434 CPPUNIT_ASSERT_MESSAGE( "drawAlphaMaskedImage got URL param #1",
435 xBitmap[0].Name.compareToAscii( "URL" ) == 0 );
436 CPPUNIT_ASSERT_MESSAGE( "drawAlphaMaskedImage got InputStream param #1",
437 xBitmap[1].Name.compareToAscii( "InputStream" ) == 0 );
439 CPPUNIT_ASSERT_MESSAGE( "drawAlphaMaskedImage received two properties #2",
440 xMask.getLength()==3 );
441 CPPUNIT_ASSERT_MESSAGE( "drawAlphaMaskedImage got URL param #2",
442 xMask[0].Name.compareToAscii( "URL" ) == 0 );
443 CPPUNIT_ASSERT_MESSAGE( "drawAlphaMaskedImage got InputStream param #2",
444 xMask[1].Name.compareToAscii( "InputStream" ) == 0 );
447 virtual void setTextRenderMode( sal_Int32 )
451 typedef std::hash_map<sal_Int32,FontAttributes> IdToFontMap;
452 typedef std::hash_map<FontAttributes,sal_Int32,FontAttrHash> FontToIdMap;
454 typedef std::hash_map<sal_Int32,GraphicsContext> IdToGCMap;
455 typedef std::hash_map<GraphicsContext,sal_Int32,GraphicsContextHash> GCToIdMap;
457 typedef std::vector<GraphicsContext> GraphicsContextStack;
459 sal_Int32 m_nNextFontId;
460 IdToFontMap m_aIdToFont;
461 FontToIdMap m_aFontToId;
463 GraphicsContextStack m_aGCStack;
464 geometry::RealSize2D m_aPageSize;
465 geometry::RealRectangle2D m_aHyperlinkBounds;
466 ::rtl::OUString m_aURI;
467 ::rtl::OUStringBuffer m_aTextOut;
468 sal_Int32 m_nNumPages;
469 bool m_bPageEnded;
470 bool m_bRedCircleSeen;
471 bool m_bGreenStrokeSeen;
472 bool m_bDashedLineSeen;
475 class PDFITest : public CppUnit::TestFixture
477 uno::Reference<uno::XComponentContext> mxCtx;
478 rtl::OUString msBaseDir;
479 bool mbUnoInitialized;
481 public:
482 PDFITest() : mxCtx(),msBaseDir(),mbUnoInitialized(false)
485 void setUp()
487 if( !mbUnoInitialized )
489 const char* pArgs( getForwardString() );
490 CPPUNIT_ASSERT_MESSAGE("Test file parameter", pArgs);
492 msBaseDir = rtl::OUString::createFromAscii(pArgs);
494 // bootstrap UNO
497 ::rtl::OUString aIniUrl;
498 CPPUNIT_ASSERT_MESSAGE(
499 "Converting ini file to URL",
500 osl_getFileURLFromSystemPath(
501 (msBaseDir+rtl::OUString::createFromAscii("pdfi_unittest_test.ini")).pData,
502 &aIniUrl.pData ) == osl_File_E_None );
504 mxCtx = ::cppu::defaultBootstrap_InitialComponentContext(aIniUrl);
505 CPPUNIT_ASSERT_MESSAGE("Getting component context", mxCtx.is());
507 catch( uno::Exception& )
509 CPPUNIT_ASSERT_MESSAGE("Bootstrapping UNO", false);
512 mbUnoInitialized = true;
515 void tearDown()
519 void testXPDFParser()
521 pdfi::ContentSinkSharedPtr pSink( new TestSink() );
522 pdfi::xpdf_ImportFromFile( msBaseDir + rtl::OUString::createFromAscii("pdfi_unittest_test.pdf"),
523 pSink,
524 uno::Reference< task::XInteractionHandler >(),
525 rtl::OUString(),
526 mxCtx );
528 // make destruction explicit, a bunch of things are
529 // checked in the destructor
530 pSink.reset();
533 void testOdfDrawExport()
535 pdfi::PDFIRawAdaptor aAdaptor( mxCtx );
536 aAdaptor.setTreeVisitorFactory( createDrawTreeVisitorFactory() );
538 ::rtl::OUString aURL, aAbsURL, aBaseURL;
539 osl_getFileURLFromSystemPath( (msBaseDir + rtl::OUString::createFromAscii("pdfi_unittest_draw.xml")).pData,
540 &aURL.pData );
541 osl_getProcessWorkingDir(&aBaseURL.pData);
542 osl_getAbsoluteFileURL(aBaseURL.pData,aURL.pData,&aAbsURL.pData);
543 CPPUNIT_ASSERT_MESSAGE("Exporting to ODF",
544 aAdaptor.odfConvert( msBaseDir + rtl::OUString::createFromAscii("pdfi_unittest_test.pdf"),
545 new OutputWrap(aAbsURL),
546 NULL ));
549 void testOdfWriterExport()
551 pdfi::PDFIRawAdaptor aAdaptor( mxCtx );
552 aAdaptor.setTreeVisitorFactory( createWriterTreeVisitorFactory() );
554 ::rtl::OUString aURL, aAbsURL, aBaseURL;
555 osl_getFileURLFromSystemPath( (msBaseDir + rtl::OUString::createFromAscii("pdfi_unittest_writer.xml")).pData,
556 &aURL.pData );
557 osl_getProcessWorkingDir(&aBaseURL.pData);
558 osl_getAbsoluteFileURL(aBaseURL.pData,aURL.pData,&aAbsURL.pData);
559 CPPUNIT_ASSERT_MESSAGE("Exporting to ODF",
560 aAdaptor.odfConvert( msBaseDir + rtl::OUString::createFromAscii("pdfi_unittest_test.pdf"),
561 new OutputWrap(aAbsURL),
562 NULL ));
565 CPPUNIT_TEST_SUITE(PDFITest);
566 CPPUNIT_TEST(testXPDFParser);
567 CPPUNIT_TEST(testOdfWriterExport);
568 CPPUNIT_TEST(testOdfDrawExport);
569 CPPUNIT_TEST_SUITE_END();
574 // =======================================================================
576 CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(PDFITest, "PDFITest");
579 // -----------------------------------------------------------------------------
581 // this macro creates an empty function, which will called by the RegisterAllFunctions()
582 // to let the user the possibility to also register some functions by hand.
583 NOADDITIONAL;