1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
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/.
10 #include <string_view>
12 #include <cppunit/TestAssert.h>
13 #include <cppunit/extensions/HelperMacros.h>
15 #include <unotest/bootstrapfixturebase.hxx>
16 #include <unotest/directories.hxx>
17 #include <unotools/datetime.hxx>
19 #include <com/sun/star/util/DateTime.hpp>
21 #include <vcl/graph.hxx>
22 #include <vcl/graphicfilter.hxx>
23 #include <tools/stream.hxx>
25 #include <vcl/filter/PDFiumLibrary.hxx>
26 #include <vcl/pdfread.hxx>
27 #include <vcl/BitmapReadAccess.hxx>
29 class PDFiumLibraryTest
: public test::BootstrapFixtureBase
31 OUString
getFullUrl(std::u16string_view sFileName
)
33 return m_directories
.getURLFromSrc(u
"/vcl/qa/cppunit/data/") + sFileName
;
38 void testPageObjects();
39 void testAnnotationsMadeInEvince();
40 void testAnnotationsMadeInAcrobat();
41 void testAnnotationsDifferentTypes();
43 void testFormFields();
45 CPPUNIT_TEST_SUITE(PDFiumLibraryTest
);
46 CPPUNIT_TEST(testDocument
);
47 CPPUNIT_TEST(testPages
);
48 CPPUNIT_TEST(testPageObjects
);
49 CPPUNIT_TEST(testAnnotationsMadeInEvince
);
50 CPPUNIT_TEST(testAnnotationsMadeInAcrobat
);
51 CPPUNIT_TEST(testAnnotationsDifferentTypes
);
52 CPPUNIT_TEST(testTools
);
53 CPPUNIT_TEST(testFormFields
);
54 CPPUNIT_TEST_SUITE_END();
57 void PDFiumLibraryTest::testDocument()
59 OUString aURL
= getFullUrl(u
"Pangram.pdf");
60 SvFileStream
aStream(aURL
, StreamMode::READ
);
61 GraphicFilter
& rGraphicFilter
= GraphicFilter::GetGraphicFilter();
62 Graphic aGraphic
= rGraphicFilter
.ImportUnloadedGraphic(aStream
);
63 aGraphic
.makeAvailable();
65 auto pVectorGraphicData
= aGraphic
.getVectorGraphicData();
66 CPPUNIT_ASSERT(pVectorGraphicData
);
67 CPPUNIT_ASSERT_EQUAL(VectorGraphicDataType::Pdf
, pVectorGraphicData
->getType());
69 auto& rDataContainer
= pVectorGraphicData
->getBinaryDataContainer();
71 auto pPdfium
= vcl::pdf::PDFiumLibrary::get();
72 CPPUNIT_ASSERT(pPdfium
);
74 = pPdfium
->openDocument(rDataContainer
.getData(), rDataContainer
.getSize(), OString());
75 CPPUNIT_ASSERT(pDocument
);
77 CPPUNIT_ASSERT_EQUAL(1, pDocument
->getPageCount());
79 auto aSize
= pDocument
->getPageSize(0);
80 CPPUNIT_ASSERT_EQUAL(612.0, aSize
.getWidth());
81 CPPUNIT_ASSERT_EQUAL(792.0, aSize
.getHeight());
84 void PDFiumLibraryTest::testPages()
86 OUString aURL
= getFullUrl(u
"Pangram.pdf");
87 SvFileStream
aStream(aURL
, StreamMode::READ
);
88 GraphicFilter
& rGraphicFilter
= GraphicFilter::GetGraphicFilter();
89 Graphic aGraphic
= rGraphicFilter
.ImportUnloadedGraphic(aStream
);
90 aGraphic
.makeAvailable();
92 auto pVectorGraphicData
= aGraphic
.getVectorGraphicData();
93 CPPUNIT_ASSERT(pVectorGraphicData
);
94 CPPUNIT_ASSERT_EQUAL(VectorGraphicDataType::Pdf
, pVectorGraphicData
->getType());
96 auto& rDataContainer
= pVectorGraphicData
->getBinaryDataContainer();
98 auto pPdfium
= vcl::pdf::PDFiumLibrary::get();
100 = pPdfium
->openDocument(rDataContainer
.getData(), rDataContainer
.getSize(), OString());
101 CPPUNIT_ASSERT(pDocument
);
103 CPPUNIT_ASSERT_EQUAL(1, pDocument
->getPageCount());
105 auto pPage
= pDocument
->openPage(0);
106 CPPUNIT_ASSERT(pPage
);
109 void PDFiumLibraryTest::testPageObjects()
111 OUString aURL
= getFullUrl(u
"Pangram.pdf");
112 SvFileStream
aStream(aURL
, StreamMode::READ
);
113 GraphicFilter
& rGraphicFilter
= GraphicFilter::GetGraphicFilter();
114 Graphic aGraphic
= rGraphicFilter
.ImportUnloadedGraphic(aStream
);
115 aGraphic
.makeAvailable();
117 auto pVectorGraphicData
= aGraphic
.getVectorGraphicData();
118 CPPUNIT_ASSERT(pVectorGraphicData
);
119 CPPUNIT_ASSERT_EQUAL(VectorGraphicDataType::Pdf
, pVectorGraphicData
->getType());
121 auto& rDataContainer
= pVectorGraphicData
->getBinaryDataContainer();
123 auto pPdfium
= vcl::pdf::PDFiumLibrary::get();
125 = pPdfium
->openDocument(rDataContainer
.getData(), rDataContainer
.getSize(), OString());
126 CPPUNIT_ASSERT(pDocument
);
128 CPPUNIT_ASSERT_EQUAL(1, pDocument
->getPageCount());
130 auto pPage
= pDocument
->openPage(0);
131 CPPUNIT_ASSERT(pPage
);
133 CPPUNIT_ASSERT_EQUAL(12, pPage
->getObjectCount());
135 auto pPageObject
= pPage
->getObject(0);
136 auto pTextPage
= pPage
->getTextPage();
138 CPPUNIT_ASSERT_EQUAL(vcl::pdf::PDFPageObjectType::Text
, pPageObject
->getType());
140 CPPUNIT_ASSERT_EQUAL(OUString("The quick, brown fox jumps over a lazy dog. DJs flock by when "
141 "MTV ax quiz prog. Junk MTV quiz "),
142 pPageObject
->getText(pTextPage
));
144 CPPUNIT_ASSERT_EQUAL(12.0, pPageObject
->getFontSize());
145 CPPUNIT_ASSERT_EQUAL(OUString("Liberation Serif"), pPageObject
->getFontName());
146 CPPUNIT_ASSERT_EQUAL(vcl::pdf::PDFTextRenderMode::Fill
, pPageObject
->getTextRenderMode());
147 CPPUNIT_ASSERT_EQUAL(COL_BLACK
, pPageObject
->getFillColor());
148 CPPUNIT_ASSERT_EQUAL(COL_BLACK
, pPageObject
->getStrokeColor());
150 basegfx::B2DHomMatrix aMatrix
= pPageObject
->getMatrix();
151 // Ignore translation, ensure there is no rotate/scale.
152 aMatrix
.set(0, 2, 0);
153 aMatrix
.set(1, 2, 0);
154 CPPUNIT_ASSERT_EQUAL(true, aMatrix
.isIdentity());
156 CPPUNIT_ASSERT_DOUBLES_EQUAL(057.01, pPageObject
->getBounds().getMinX(), 1E-2);
157 CPPUNIT_ASSERT_DOUBLES_EQUAL(721.51, pPageObject
->getBounds().getMinY(), 1E-2);
158 CPPUNIT_ASSERT_DOUBLES_EQUAL(539.48, pPageObject
->getBounds().getMaxX(), 1E-2);
159 CPPUNIT_ASSERT_DOUBLES_EQUAL(732.54, pPageObject
->getBounds().getMaxY(), 1E-2);
162 void PDFiumLibraryTest::testAnnotationsMadeInEvince()
164 OUString aURL
= getFullUrl(u
"PangramWithAnnotations.pdf");
165 SvFileStream
aStream(aURL
, StreamMode::READ
);
166 GraphicFilter
& rGraphicFilter
= GraphicFilter::GetGraphicFilter();
167 Graphic aGraphic
= rGraphicFilter
.ImportUnloadedGraphic(aStream
);
168 aGraphic
.makeAvailable();
170 auto pVectorGraphicData
= aGraphic
.getVectorGraphicData();
171 CPPUNIT_ASSERT(pVectorGraphicData
);
172 CPPUNIT_ASSERT_EQUAL(VectorGraphicDataType::Pdf
, pVectorGraphicData
->getType());
174 auto& rDataContainer
= pVectorGraphicData
->getBinaryDataContainer();
176 auto pPdfium
= vcl::pdf::PDFiumLibrary::get();
178 = pPdfium
->openDocument(rDataContainer
.getData(), rDataContainer
.getSize(), OString());
179 CPPUNIT_ASSERT(pDocument
);
181 CPPUNIT_ASSERT_EQUAL(1, pDocument
->getPageCount());
183 auto pPage
= pDocument
->openPage(0);
184 CPPUNIT_ASSERT(pPage
);
186 CPPUNIT_ASSERT_EQUAL(2, pPage
->getAnnotationCount());
189 auto pAnnotation
= pPage
->getAnnotation(0);
190 CPPUNIT_ASSERT(pAnnotation
);
191 CPPUNIT_ASSERT_EQUAL(vcl::pdf::PDFAnnotationSubType::Text
, pAnnotation
->getSubType());
193 OUString aPopupString
= pAnnotation
->getString(vcl::pdf::constDictionaryKeyTitle
);
194 CPPUNIT_ASSERT_EQUAL(OUString("quikee"), aPopupString
);
196 OUString aContentsString
= pAnnotation
->getString(vcl::pdf::constDictionaryKeyContents
);
197 CPPUNIT_ASSERT_EQUAL(OUString("Annotation test"), aContentsString
);
199 CPPUNIT_ASSERT_EQUAL(true, pAnnotation
->hasKey(vcl::pdf::constDictionaryKeyPopup
));
200 auto pPopupAnnotation
= pAnnotation
->getLinked(vcl::pdf::constDictionaryKeyPopup
);
201 CPPUNIT_ASSERT(pPopupAnnotation
);
203 CPPUNIT_ASSERT_EQUAL(1, pPage
->getAnnotationIndex(pPopupAnnotation
));
204 CPPUNIT_ASSERT_EQUAL(vcl::pdf::PDFAnnotationSubType::Popup
, pPopupAnnotation
->getSubType());
206 OUString sDateTimeString
207 = pAnnotation
->getString(vcl::pdf::constDictionaryKeyModificationDate
);
208 CPPUNIT_ASSERT_EQUAL(OUString("D:20200612201322+02'00"), sDateTimeString
);
212 auto pAnnotation
= pPage
->getAnnotation(1);
213 CPPUNIT_ASSERT(pAnnotation
);
214 CPPUNIT_ASSERT_EQUAL(vcl::pdf::PDFAnnotationSubType::Popup
, pAnnotation
->getSubType());
218 void PDFiumLibraryTest::testAnnotationsMadeInAcrobat()
220 OUString aURL
= getFullUrl(u
"PangramAcrobatAnnotations.pdf");
221 SvFileStream
aStream(aURL
, StreamMode::READ
);
222 GraphicFilter
& rGraphicFilter
= GraphicFilter::GetGraphicFilter();
223 Graphic aGraphic
= rGraphicFilter
.ImportUnloadedGraphic(aStream
);
224 aGraphic
.makeAvailable();
226 auto pVectorGraphicData
= aGraphic
.getVectorGraphicData();
227 CPPUNIT_ASSERT(pVectorGraphicData
);
228 CPPUNIT_ASSERT_EQUAL(VectorGraphicDataType::Pdf
, pVectorGraphicData
->getType());
230 auto& rDataContainer
= pVectorGraphicData
->getBinaryDataContainer();
232 auto pPdfium
= vcl::pdf::PDFiumLibrary::get();
234 = pPdfium
->openDocument(rDataContainer
.getData(), rDataContainer
.getSize(), OString());
235 CPPUNIT_ASSERT(pDocument
);
237 CPPUNIT_ASSERT_EQUAL(1, pDocument
->getPageCount());
239 auto pPage
= pDocument
->openPage(0);
240 CPPUNIT_ASSERT(pPage
);
242 CPPUNIT_ASSERT_EQUAL(4, pPage
->getAnnotationCount());
245 auto pAnnotation
= pPage
->getAnnotation(0);
246 CPPUNIT_ASSERT(pAnnotation
);
247 CPPUNIT_ASSERT_EQUAL(vcl::pdf::PDFAnnotationSubType::Text
, pAnnotation
->getSubType());
249 OUString aPopupString
= pAnnotation
->getString(vcl::pdf::constDictionaryKeyTitle
);
250 CPPUNIT_ASSERT_EQUAL(OUString("quikee"), aPopupString
);
252 OUString aContentsString
= pAnnotation
->getString(vcl::pdf::constDictionaryKeyContents
);
253 CPPUNIT_ASSERT_EQUAL(OUString("YEEEY"), aContentsString
);
255 CPPUNIT_ASSERT_EQUAL(true, pAnnotation
->hasKey(vcl::pdf::constDictionaryKeyPopup
));
256 auto pPopupAnnotation
= pAnnotation
->getLinked(vcl::pdf::constDictionaryKeyPopup
);
257 CPPUNIT_ASSERT(pPopupAnnotation
);
259 CPPUNIT_ASSERT_EQUAL(1, pPage
->getAnnotationIndex(pPopupAnnotation
));
260 CPPUNIT_ASSERT_EQUAL(vcl::pdf::PDFAnnotationSubType::Popup
, pPopupAnnotation
->getSubType());
264 auto pAnnotation
= pPage
->getAnnotation(1);
265 CPPUNIT_ASSERT(pAnnotation
);
266 CPPUNIT_ASSERT_EQUAL(vcl::pdf::PDFAnnotationSubType::Popup
, pAnnotation
->getSubType());
270 auto pAnnotation
= pPage
->getAnnotation(2);
271 CPPUNIT_ASSERT(pAnnotation
);
272 CPPUNIT_ASSERT_EQUAL(vcl::pdf::PDFAnnotationSubType::Text
, pAnnotation
->getSubType());
274 OUString aPopupString
= pAnnotation
->getString(vcl::pdf::constDictionaryKeyTitle
);
275 CPPUNIT_ASSERT_EQUAL(OUString("quikee"), aPopupString
);
277 OUString aContentsString
= pAnnotation
->getString(vcl::pdf::constDictionaryKeyContents
);
278 CPPUNIT_ASSERT_EQUAL(OUString("Note"), aContentsString
);
280 CPPUNIT_ASSERT_EQUAL(true, pAnnotation
->hasKey(vcl::pdf::constDictionaryKeyPopup
));
281 auto pPopupAnnotation
= pAnnotation
->getLinked(vcl::pdf::constDictionaryKeyPopup
);
282 CPPUNIT_ASSERT(pPopupAnnotation
);
284 CPPUNIT_ASSERT_EQUAL(3, pPage
->getAnnotationIndex(pPopupAnnotation
));
285 CPPUNIT_ASSERT_EQUAL(vcl::pdf::PDFAnnotationSubType::Popup
, pPopupAnnotation
->getSubType());
289 auto pAnnotation
= pPage
->getAnnotation(3);
290 CPPUNIT_ASSERT(pAnnotation
);
291 CPPUNIT_ASSERT_EQUAL(vcl::pdf::PDFAnnotationSubType::Popup
, pAnnotation
->getSubType());
295 void PDFiumLibraryTest::testFormFields()
297 // Given a document with a form field that looks like plain text:
298 OUString aURL
= getFullUrl(u
"form-fields.pdf");
299 SvFileStream
aFileStream(aURL
, StreamMode::READ
);
300 SvMemoryStream aMemory
;
301 aMemory
.WriteStream(aFileStream
);
304 // When rendering its first (and only) page to a bitmap:
305 std::vector
<BitmapEx
> aBitmaps
;
306 int nRet
= vcl::RenderPDFBitmaps(aMemory
.GetData(), aMemory
.GetSize(), aBitmaps
);
307 CPPUNIT_ASSERT(nRet
);
308 CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(1), aBitmaps
.size());
310 // Then make sure the bitmap contains that text:
311 Bitmap aBitmap
= aBitmaps
[0].GetBitmap();
312 BitmapReadAccess
aAccess(aBitmap
);
313 Size aSize
= aBitmap
.GetSizePixel();
314 std::set
<sal_uInt32
> aColors
;
315 for (tools::Long y
= 0; y
< aSize
.Height(); ++y
)
317 for (tools::Long x
= 0; x
< aSize
.Width(); ++x
)
319 aColors
.insert(static_cast<sal_uInt32
>(aAccess
.GetPixel(y
, x
)));
322 // Without the accompanying fix in place, this test would have failed with:
323 // - Expected greater than: 1
325 // i.e. at least black text and white background is expected (possibly more, due to
326 // anti-aliasing), but nothing was rendered.
327 CPPUNIT_ASSERT_GREATER(static_cast<size_t>(1), aColors
.size());
330 void PDFiumLibraryTest::testAnnotationsDifferentTypes()
332 OUString aURL
= getFullUrl(u
"PangramWithMultipleTypeOfAnnotations.pdf");
333 SvFileStream
aStream(aURL
, StreamMode::READ
);
334 GraphicFilter
& rGraphicFilter
= GraphicFilter::GetGraphicFilter();
335 Graphic aGraphic
= rGraphicFilter
.ImportUnloadedGraphic(aStream
);
336 aGraphic
.makeAvailable();
338 auto pVectorGraphicData
= aGraphic
.getVectorGraphicData();
339 CPPUNIT_ASSERT(pVectorGraphicData
);
340 CPPUNIT_ASSERT_EQUAL(VectorGraphicDataType::Pdf
, pVectorGraphicData
->getType());
342 auto& rDataContainer
= pVectorGraphicData
->getBinaryDataContainer();
344 auto pPdfium
= vcl::pdf::PDFiumLibrary::get();
346 = pPdfium
->openDocument(rDataContainer
.getData(), rDataContainer
.getSize(), OString());
347 CPPUNIT_ASSERT(pDocument
);
349 CPPUNIT_ASSERT_EQUAL(1, pDocument
->getPageCount());
351 auto pPage
= pDocument
->openPage(0);
352 CPPUNIT_ASSERT(pPage
);
354 CPPUNIT_ASSERT_EQUAL(6, pPage
->getAnnotationCount());
357 auto pAnnotation
= pPage
->getAnnotation(0);
358 CPPUNIT_ASSERT(pAnnotation
);
359 CPPUNIT_ASSERT_EQUAL(vcl::pdf::PDFAnnotationSubType::FreeText
, pAnnotation
->getSubType());
360 CPPUNIT_ASSERT_EQUAL(0, pAnnotation
->getObjectCount());
361 OUString aContentsString
= pAnnotation
->getString(vcl::pdf::constDictionaryKeyContents
);
362 CPPUNIT_ASSERT_EQUAL(OUString("Inline Note"), aContentsString
);
363 auto const& rLineGeometry
= pAnnotation
->getLineGeometry();
364 CPPUNIT_ASSERT_EQUAL(true, rLineGeometry
.empty());
368 auto pAnnotation
= pPage
->getAnnotation(1);
369 CPPUNIT_ASSERT(pAnnotation
);
370 CPPUNIT_ASSERT_EQUAL(vcl::pdf::PDFAnnotationSubType::Ink
, pAnnotation
->getSubType());
371 CPPUNIT_ASSERT_EQUAL(0, pAnnotation
->getObjectCount());
372 OUString aContentsString
= pAnnotation
->getString(vcl::pdf::constDictionaryKeyContents
);
373 CPPUNIT_ASSERT_EQUAL(OUString("Freehand Text"), aContentsString
);
374 CPPUNIT_ASSERT_EQUAL(size_t(1), pAnnotation
->getInkStrokes().size());
375 auto const& aInkStrokes
= pAnnotation
->getInkStrokes();
376 auto const& aPoints
= aInkStrokes
[0];
377 CPPUNIT_ASSERT_EQUAL(size_t(74), aPoints
.size());
378 CPPUNIT_ASSERT_DOUBLES_EQUAL(2.0f
, pAnnotation
->getBorderWidth(), 1E-2);
379 auto const& rLineGeometry
= pAnnotation
->getLineGeometry();
380 CPPUNIT_ASSERT_EQUAL(true, rLineGeometry
.empty());
384 auto pAnnotation
= pPage
->getAnnotation(2);
385 CPPUNIT_ASSERT(pAnnotation
);
386 CPPUNIT_ASSERT_EQUAL(vcl::pdf::PDFAnnotationSubType::Line
, pAnnotation
->getSubType());
387 CPPUNIT_ASSERT_EQUAL(0, pAnnotation
->getObjectCount());
388 OUString aContentsString
= pAnnotation
->getString(vcl::pdf::constDictionaryKeyContents
);
389 CPPUNIT_ASSERT_EQUAL(OUString("Line Text"), aContentsString
);
390 auto const& rLineGeometry
= pAnnotation
->getLineGeometry();
391 CPPUNIT_ASSERT_EQUAL(false, rLineGeometry
.empty());
395 auto pAnnotation
= pPage
->getAnnotation(3);
396 CPPUNIT_ASSERT(pAnnotation
);
397 CPPUNIT_ASSERT_EQUAL(vcl::pdf::PDFAnnotationSubType::Polygon
, pAnnotation
->getSubType());
398 CPPUNIT_ASSERT_EQUAL(0, pAnnotation
->getObjectCount());
399 CPPUNIT_ASSERT_EQUAL(true, pAnnotation
->hasKey("Vertices"));
400 OUString aContentsString
= pAnnotation
->getString(vcl::pdf::constDictionaryKeyContents
);
401 CPPUNIT_ASSERT_EQUAL(OUString("Polygon Text"), aContentsString
);
402 auto const& aVertices
= pAnnotation
->getVertices();
403 CPPUNIT_ASSERT_EQUAL(size_t(3), aVertices
.size());
404 CPPUNIT_ASSERT_DOUBLES_EQUAL(2.0f
, pAnnotation
->getBorderWidth(), 1E-2);
405 auto const& rLineGeometry
= pAnnotation
->getLineGeometry();
406 CPPUNIT_ASSERT_EQUAL(true, rLineGeometry
.empty());
410 auto pAnnotation
= pPage
->getAnnotation(4);
411 CPPUNIT_ASSERT(pAnnotation
);
412 CPPUNIT_ASSERT_EQUAL(vcl::pdf::PDFAnnotationSubType::Circle
, pAnnotation
->getSubType());
413 CPPUNIT_ASSERT_EQUAL(0, pAnnotation
->getObjectCount());
414 OUString aContentsString
= pAnnotation
->getString(vcl::pdf::constDictionaryKeyContents
);
415 CPPUNIT_ASSERT_EQUAL(OUString("Ellipse Text"), aContentsString
);
416 auto const& rLineGeometry
= pAnnotation
->getLineGeometry();
417 CPPUNIT_ASSERT_EQUAL(true, rLineGeometry
.empty());
421 auto pAnnotation
= pPage
->getAnnotation(5);
422 CPPUNIT_ASSERT(pAnnotation
);
423 CPPUNIT_ASSERT_EQUAL(vcl::pdf::PDFAnnotationSubType::Square
, pAnnotation
->getSubType());
424 CPPUNIT_ASSERT_EQUAL(0, pAnnotation
->getObjectCount());
425 OUString aContentsString
= pAnnotation
->getString(vcl::pdf::constDictionaryKeyContents
);
426 CPPUNIT_ASSERT_EQUAL(OUString("Rectangle Text"), aContentsString
);
427 CPPUNIT_ASSERT_EQUAL(Color(0xFF, 0xE0, 0x00), pAnnotation
->getColor());
428 CPPUNIT_ASSERT_EQUAL(false, pAnnotation
->hasKey(vcl::pdf::constDictionaryKeyInteriorColor
));
429 auto const& rLineGeometry
= pAnnotation
->getLineGeometry();
430 CPPUNIT_ASSERT_EQUAL(true, rLineGeometry
.empty());
434 void PDFiumLibraryTest::testTools()
436 OUString sConverted
= vcl::pdf::convertPdfDateToISO8601(u
"D:20200612201322+02'00");
438 css::util::DateTime aDateTime
;
439 CPPUNIT_ASSERT(utl::ISO8601parseDateTime(sConverted
, aDateTime
));
440 CPPUNIT_ASSERT_EQUAL(sal_Int16(2020), aDateTime
.Year
);
441 CPPUNIT_ASSERT_EQUAL(sal_uInt16(6), aDateTime
.Month
);
442 CPPUNIT_ASSERT_EQUAL(sal_uInt16(12), aDateTime
.Day
);
443 CPPUNIT_ASSERT_EQUAL(sal_uInt16(20), aDateTime
.Hours
);
444 CPPUNIT_ASSERT_EQUAL(sal_uInt16(13), aDateTime
.Minutes
);
445 CPPUNIT_ASSERT_EQUAL(sal_uInt16(22), aDateTime
.Seconds
);
446 CPPUNIT_ASSERT_EQUAL(sal_uInt32(0), aDateTime
.NanoSeconds
);
447 CPPUNIT_ASSERT_EQUAL(false, bool(aDateTime
.IsUTC
));
450 CPPUNIT_TEST_SUITE_REGISTRATION(PDFiumLibraryTest
);
452 CPPUNIT_PLUGIN_IMPLEMENT();
454 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */