From 267c6f2ac71f92999e969232431ba04678e7437e Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Mon, 15 Apr 2024 07:54:39 +0200 Subject: Adding upstream version 4:24.2.0. Signed-off-by: Daniel Baumann --- sw/qa/extras/odfexport/data/2_MathType3.docx | Bin 0 -> 15260 bytes .../odfexport/data/CrossRefHeadingBookmark.fodt | 120 + sw/qa/extras/odfexport/data/Custom-Style-TOC.docx | Bin 0 -> 13994 bytes .../data/Formcontrol needs high z-index.odt | Bin 0 -> 25828 bytes sw/qa/extras/odfexport/data/IsLegal.fodt | 28 + sw/qa/extras/odfexport/data/MadeByLO7.odt | Bin 0 -> 17354 bytes .../odfexport/data/ParagraphMarkerMarkup.fodt | 22 + sw/qa/extras/odfexport/data/WordTest_edit.odt | Bin 0 -> 6496 bytes sw/qa/extras/odfexport/data/allow-overlap.odt | Bin 0 -> 9853 bytes .../odfexport/data/arabic-zero-numbering.odt | Bin 0 -> 8730 bytes .../odfexport/data/arabic-zero3-numbering.odt | Bin 0 -> 9166 bytes .../odfexport/data/arabic-zero4-numbering.odt | Bin 0 -> 8702 bytes .../odfexport/data/arabic-zero5-numbering.odt | Bin 0 -> 8779 bytes sw/qa/extras/odfexport/data/border_types.odt | Bin 0 -> 10656 bytes sw/qa/extras/odfexport/data/btlr-cell.odt | Bin 0 -> 9174 bytes sw/qa/extras/odfexport/data/btlr-frame.odt | Bin 0 -> 8564 bytes .../odfexport/data/chapter-number-new-line.odt | Bin 0 -> 8649 bytes sw/qa/extras/odfexport/data/charborder.odt | Bin 0 -> 8704 bytes .../extras/odfexport/data/embedded-font-props.odt | Bin 0 -> 8097 bytes sw/qa/extras/odfexport/data/embedded-pdf.odt | Bin 0 -> 23502 bytes sw/qa/extras/odfexport/data/fdo38244.odt | Bin 0 -> 10334 bytes sw/qa/extras/odfexport/data/fdo43807.odt | Bin 0 -> 7630 bytes sw/qa/extras/odfexport/data/fdo58949.docx | Bin 0 -> 26510 bytes sw/qa/extras/odfexport/data/fdo60769.odt | Bin 0 -> 9482 bytes sw/qa/extras/odfexport/data/fdo79358.odt | Bin 0 -> 9356 bytes sw/qa/extras/odfexport/data/fdo86963.odt | Bin 0 -> 39845 bytes sw/qa/extras/odfexport/data/fillbitmap3.odt | Bin 0 -> 10748 bytes .../data/footnote-collect-at-end-of-section.fodt | 192 ++ sw/qa/extras/odfexport/data/framebackgrounds.odt | Bin 0 -> 14327 bytes sw/qa/extras/odfexport/data/gerrit13858.odt | Bin 0 -> 10200 bytes sw/qa/extras/odfexport/data/gutter-left.odt | Bin 0 -> 8519 bytes sw/qa/extras/odfexport/data/image-mimetype.odt | Bin 0 -> 88597 bytes sw/qa/extras/odfexport/data/listformat.docx | Bin 0 -> 13082 bytes sw/qa/extras/odfexport/data/listformat.odt | Bin 0 -> 9221 bytes .../extras/odfexport/data/nestedTableInFooter.odt | Bin 0 -> 8611 bytes .../odfexport/data/ooo321_stylepagenumber.odt | Bin 0 -> 8558 bytes sw/qa/extras/odfexport/data/oooxml_embedded.sxw | Bin 0 -> 21943 bytes .../extras/odfexport/data/page-content-bottom.odt | Bin 0 -> 8502 bytes sw/qa/extras/odfexport/data/page-content-top.odt | Bin 0 -> 8561 bytes .../odfexport/data/pagestyle_background_lo64.odt | Bin 0 -> 9947 bytes .../odfexport/data/pagestyle_background_lo70.odt | Bin 0 -> 10125 bytes .../odfexport/data/pagestyle_background_ooo33.odt | Bin 0 -> 9127 bytes sw/qa/extras/odfexport/data/protection-key.fodt | 48 + sw/qa/extras/odfexport/data/qrcode-properties.odt | Bin 0 -> 11634 bytes sw/qa/extras/odfexport/data/redlineTextFrame.odt | Bin 0 -> 8560 bytes sw/qa/extras/odfexport/data/referencelanguage.odt | Bin 0 -> 16137 bytes sw/qa/extras/odfexport/data/relh-page-tdf80282.odt | Bin 0 -> 128045 bytes sw/qa/extras/odfexport/data/relh-page.odt | Bin 0 -> 10183 bytes sw/qa/extras/odfexport/data/relw-page.odt | Bin 0 -> 10221 bytes sw/qa/extras/odfexport/data/resolved-comment.odt | Bin 0 -> 8912 bytes sw/qa/extras/odfexport/data/rovas-numbering.odt | Bin 0 -> 8786 bytes sw/qa/extras/odfexport/data/ruby-position.odt | Bin 0 -> 8325 bytes .../odfexport/data/section-columns-separator.fodt | 24 + sw/qa/extras/odfexport/data/sender-initials.fodt | 71 + sw/qa/extras/odfexport/data/sha1_correct.odt | Bin 0 -> 8587 bytes sw/qa/extras/odfexport/data/sha1_wrong.odt | Bin 0 -> 8435 bytes sw/qa/extras/odfexport/data/shape-relsize.odt | Bin 0 -> 10706 bytes .../extras/odfexport/data/shape-with-hyperlink.odt | Bin 0 -> 10149 bytes sw/qa/extras/odfexport/data/shapes-hyperlink.odt | Bin 0 -> 12199 bytes .../odfexport/data/signatureline-properties.fodt | 596 +++++ .../odfexport/data/spellout-numberingtypes.odt | Bin 0 -> 10222 bytes sw/qa/extras/odfexport/data/style-link.fodt | 15 + sw/qa/extras/odfexport/data/sw_hatch.odt | Bin 0 -> 6560 bytes .../table-in-frame-in-table-in-header-base.odt | Bin 0 -> 10398 bytes .../odfexport/data/table_number_format_3.docx | Bin 0 -> 5130 bytes sw/qa/extras/odfexport/data/table_styles_1.odt | Bin 0 -> 9874 bytes sw/qa/extras/odfexport/data/table_styles_2.odt | Bin 0 -> 10727 bytes sw/qa/extras/odfexport/data/table_styles_3.odt | Bin 0 -> 9376 bytes sw/qa/extras/odfexport/data/table_styles_4.odt | Bin 0 -> 9094 bytes sw/qa/extras/odfexport/data/table_styles_5.odt | Bin 0 -> 9841 bytes sw/qa/extras/odfexport/data/tdf100492.odt | Bin 0 -> 19671 bytes sw/qa/extras/odfexport/data/tdf101710.odt | Bin 0 -> 9350 bytes sw/qa/extras/odfexport/data/tdf101856.odt | Bin 0 -> 9406 bytes .../extras/odfexport/data/tdf101856_overlapped.odt | Bin 0 -> 9233 bytes sw/qa/extras/odfexport/data/tdf103091.fodt | 307 +++ sw/qa/extras/odfexport/data/tdf103567.odt | Bin 0 -> 13562 bytes .../odfexport/data/tdf104254_noHeaderWrapping.odt | Bin 0 -> 63167 bytes sw/qa/extras/odfexport/data/tdf107292.odt | Bin 0 -> 9921 bytes sw/qa/extras/odfexport/data/tdf107696.odt | Bin 0 -> 11122 bytes .../odfexport/data/tdf111891_frameVertStyle.odt | Bin 0 -> 8814 bytes sw/qa/extras/odfexport/data/tdf114287.odt | Bin 0 -> 10067 bytes sw/qa/extras/odfexport/data/tdf115815.odt | Bin 0 -> 9809 bytes sw/qa/extras/odfexport/data/tdf118502.odt | Bin 0 -> 76491 bytes sw/qa/extras/odfexport/data/tdf118637.odt | Bin 0 -> 10547 bytes sw/qa/extras/odfexport/data/tdf121658.odt | Bin 0 -> 20057 bytes .../data/tdf124470TableAndEmbeddedUsedFonts.odt | Bin 0 -> 10880 bytes sw/qa/extras/odfexport/data/tdf128504.docx | Bin 0 -> 3969 bytes sw/qa/extras/odfexport/data/tdf129520.docx | Bin 0 -> 15574 bytes sw/qa/extras/odfexport/data/tdf129568-ui.fodt | 368 +++ sw/qa/extras/odfexport/data/tdf129568.fodt | 368 +++ sw/qa/extras/odfexport/data/tdf130314.docx | Bin 0 -> 31668 bytes sw/qa/extras/odfexport/data/tdf130950.odt | Bin 0 -> 28785 bytes .../odfexport/data/tdf131025_noZerosInTable.odt | Bin 0 -> 11544 bytes sw/qa/extras/odfexport/data/tdf131621.ott | Bin 0 -> 29145 bytes sw/qa/extras/odfexport/data/tdf131812.odt | Bin 0 -> 8683 bytes .../odfexport/data/tdf132642_keepWithNextTable.odt | Bin 0 -> 10030 bytes .../data/tdf133507_contextualSpacingSection.odt | Bin 0 -> 40288 bytes sw/qa/extras/odfexport/data/tdf134987.docx | Bin 0 -> 39541 bytes sw/qa/extras/odfexport/data/tdf135144.docx | Bin 0 -> 40894 bytes .../data/tdf135338_firstLeftPageFooter.odt | Bin 0 -> 10687 bytes sw/qa/extras/odfexport/data/tdf136645.odt | Bin 0 -> 18408 bytes sw/qa/extras/odfexport/data/tdf137199.docx | Bin 0 -> 13281 bytes sw/qa/extras/odfexport/data/tdf139126.odt | Bin 0 -> 11105 bytes sw/qa/extras/odfexport/data/tdf140437.odt | Bin 0 -> 8641 bytes sw/qa/extras/odfexport/data/tdf142483.odt | Bin 0 -> 9011 bytes sw/qa/extras/odfexport/data/tdf143605.odt | Bin 0 -> 8729 bytes .../odfexport/data/tdf143793_noBodyWrapping.odt | Bin 0 -> 117036 bytes sw/qa/extras/odfexport/data/tdf144319.odt | Bin 0 -> 28531 bytes sw/qa/extras/odfexport/data/tdf145226.fodt | 188 ++ sw/qa/extras/odfexport/data/tdf145361.odt | Bin 0 -> 9513 bytes sw/qa/extras/odfexport/data/tdf145871.odt | Bin 0 -> 15877 bytes sw/qa/extras/odfexport/data/tdf146264.odt | Bin 0 -> 13422 bytes sw/qa/extras/odfexport/data/tdf149248.odt | Bin 0 -> 20313 bytes sw/qa/extras/odfexport/data/tdf149324.odt | Bin 0 -> 20206 bytes sw/qa/extras/odfexport/data/tdf149420.odt | Bin 0 -> 38885 bytes sw/qa/extras/odfexport/data/tdf150149.fodt | 79 + sw/qa/extras/odfexport/data/tdf150394.odt | Bin 0 -> 35943 bytes sw/qa/extras/odfexport/data/tdf151100.docx | Bin 0 -> 17741 bytes sw/qa/extras/odfexport/data/tdf152710.odt | Bin 0 -> 11650 bytes sw/qa/extras/odfexport/data/tdf156905.odt | Bin 0 -> 30831 bytes .../odfexport/data/tdf43569_conditionalfield.doc | Bin 0 -> 22016 bytes .../odfexport/data/tdf57317_autoListName.odt | Bin 0 -> 10953 bytes sw/qa/extras/odfexport/data/tdf66305.odt | Bin 0 -> 12685 bytes sw/qa/extras/odfexport/data/tdf77961.odt | Bin 0 -> 11510 bytes sw/qa/extras/odfexport/data/tdf92379.fodt | 89 + sw/qa/extras/odfexport/data/tdf95806.docx | Bin 0 -> 16907 bytes sw/qa/extras/odfexport/data/tdf99631.docx | Bin 0 -> 32417 bytes .../odfexport/data/testTdf52065_centerTabs.odt | Bin 0 -> 11274 bytes .../odfexport/data/textbox-rounded-corners.odt | Bin 0 -> 13249 bytes sw/qa/extras/odfexport/data/textframe-gradient.odt | Bin 0 -> 9800 bytes .../data/textframe-transparent-shadow.odt | Bin 0 -> 9634 bytes .../extras/odfexport/data/textframe-vertadjust.odt | Bin 0 -> 12850 bytes .../extras/odfexport/data/user-field-decl-fly.odt | Bin 0 -> 9167 bytes sw/qa/extras/odfexport/data/user-field-decl.odt | Bin 0 -> 8597 bytes .../odfexport/data/userdefattr-tablecell.odt | Bin 0 -> 9172 bytes sw/qa/extras/odfexport/data/whitespace.odt | Bin 0 -> 10981 bytes sw/qa/extras/odfexport/odfexport.cxx | 2708 ++++++++++++++++++++ sw/qa/extras/odfexport/odfexport2.cxx | 1133 ++++++++ 138 files changed, 6356 insertions(+) create mode 100644 sw/qa/extras/odfexport/data/2_MathType3.docx create mode 100644 sw/qa/extras/odfexport/data/CrossRefHeadingBookmark.fodt create mode 100644 sw/qa/extras/odfexport/data/Custom-Style-TOC.docx create mode 100644 sw/qa/extras/odfexport/data/Formcontrol needs high z-index.odt create mode 100644 sw/qa/extras/odfexport/data/IsLegal.fodt create mode 100644 sw/qa/extras/odfexport/data/MadeByLO7.odt create mode 100644 sw/qa/extras/odfexport/data/ParagraphMarkerMarkup.fodt create mode 100644 sw/qa/extras/odfexport/data/WordTest_edit.odt create mode 100644 sw/qa/extras/odfexport/data/allow-overlap.odt create mode 100644 sw/qa/extras/odfexport/data/arabic-zero-numbering.odt create mode 100644 sw/qa/extras/odfexport/data/arabic-zero3-numbering.odt create mode 100644 sw/qa/extras/odfexport/data/arabic-zero4-numbering.odt create mode 100644 sw/qa/extras/odfexport/data/arabic-zero5-numbering.odt create mode 100644 sw/qa/extras/odfexport/data/border_types.odt create mode 100644 sw/qa/extras/odfexport/data/btlr-cell.odt create mode 100644 sw/qa/extras/odfexport/data/btlr-frame.odt create mode 100644 sw/qa/extras/odfexport/data/chapter-number-new-line.odt create mode 100644 sw/qa/extras/odfexport/data/charborder.odt create mode 100644 sw/qa/extras/odfexport/data/embedded-font-props.odt create mode 100644 sw/qa/extras/odfexport/data/embedded-pdf.odt create mode 100644 sw/qa/extras/odfexport/data/fdo38244.odt create mode 100644 sw/qa/extras/odfexport/data/fdo43807.odt create mode 100644 sw/qa/extras/odfexport/data/fdo58949.docx create mode 100644 sw/qa/extras/odfexport/data/fdo60769.odt create mode 100644 sw/qa/extras/odfexport/data/fdo79358.odt create mode 100644 sw/qa/extras/odfexport/data/fdo86963.odt create mode 100644 sw/qa/extras/odfexport/data/fillbitmap3.odt create mode 100644 sw/qa/extras/odfexport/data/footnote-collect-at-end-of-section.fodt create mode 100644 sw/qa/extras/odfexport/data/framebackgrounds.odt create mode 100644 sw/qa/extras/odfexport/data/gerrit13858.odt create mode 100644 sw/qa/extras/odfexport/data/gutter-left.odt create mode 100644 sw/qa/extras/odfexport/data/image-mimetype.odt create mode 100644 sw/qa/extras/odfexport/data/listformat.docx create mode 100644 sw/qa/extras/odfexport/data/listformat.odt create mode 100644 sw/qa/extras/odfexport/data/nestedTableInFooter.odt create mode 100644 sw/qa/extras/odfexport/data/ooo321_stylepagenumber.odt create mode 100644 sw/qa/extras/odfexport/data/oooxml_embedded.sxw create mode 100644 sw/qa/extras/odfexport/data/page-content-bottom.odt create mode 100644 sw/qa/extras/odfexport/data/page-content-top.odt create mode 100644 sw/qa/extras/odfexport/data/pagestyle_background_lo64.odt create mode 100644 sw/qa/extras/odfexport/data/pagestyle_background_lo70.odt create mode 100644 sw/qa/extras/odfexport/data/pagestyle_background_ooo33.odt create mode 100644 sw/qa/extras/odfexport/data/protection-key.fodt create mode 100644 sw/qa/extras/odfexport/data/qrcode-properties.odt create mode 100644 sw/qa/extras/odfexport/data/redlineTextFrame.odt create mode 100644 sw/qa/extras/odfexport/data/referencelanguage.odt create mode 100644 sw/qa/extras/odfexport/data/relh-page-tdf80282.odt create mode 100644 sw/qa/extras/odfexport/data/relh-page.odt create mode 100644 sw/qa/extras/odfexport/data/relw-page.odt create mode 100644 sw/qa/extras/odfexport/data/resolved-comment.odt create mode 100644 sw/qa/extras/odfexport/data/rovas-numbering.odt create mode 100644 sw/qa/extras/odfexport/data/ruby-position.odt create mode 100644 sw/qa/extras/odfexport/data/section-columns-separator.fodt create mode 100644 sw/qa/extras/odfexport/data/sender-initials.fodt create mode 100644 sw/qa/extras/odfexport/data/sha1_correct.odt create mode 100644 sw/qa/extras/odfexport/data/sha1_wrong.odt create mode 100644 sw/qa/extras/odfexport/data/shape-relsize.odt create mode 100644 sw/qa/extras/odfexport/data/shape-with-hyperlink.odt create mode 100644 sw/qa/extras/odfexport/data/shapes-hyperlink.odt create mode 100644 sw/qa/extras/odfexport/data/signatureline-properties.fodt create mode 100644 sw/qa/extras/odfexport/data/spellout-numberingtypes.odt create mode 100644 sw/qa/extras/odfexport/data/style-link.fodt create mode 100644 sw/qa/extras/odfexport/data/sw_hatch.odt create mode 100644 sw/qa/extras/odfexport/data/table-in-frame-in-table-in-header-base.odt create mode 100644 sw/qa/extras/odfexport/data/table_number_format_3.docx create mode 100644 sw/qa/extras/odfexport/data/table_styles_1.odt create mode 100644 sw/qa/extras/odfexport/data/table_styles_2.odt create mode 100644 sw/qa/extras/odfexport/data/table_styles_3.odt create mode 100644 sw/qa/extras/odfexport/data/table_styles_4.odt create mode 100644 sw/qa/extras/odfexport/data/table_styles_5.odt create mode 100644 sw/qa/extras/odfexport/data/tdf100492.odt create mode 100644 sw/qa/extras/odfexport/data/tdf101710.odt create mode 100644 sw/qa/extras/odfexport/data/tdf101856.odt create mode 100644 sw/qa/extras/odfexport/data/tdf101856_overlapped.odt create mode 100644 sw/qa/extras/odfexport/data/tdf103091.fodt create mode 100644 sw/qa/extras/odfexport/data/tdf103567.odt create mode 100644 sw/qa/extras/odfexport/data/tdf104254_noHeaderWrapping.odt create mode 100644 sw/qa/extras/odfexport/data/tdf107292.odt create mode 100644 sw/qa/extras/odfexport/data/tdf107696.odt create mode 100644 sw/qa/extras/odfexport/data/tdf111891_frameVertStyle.odt create mode 100644 sw/qa/extras/odfexport/data/tdf114287.odt create mode 100644 sw/qa/extras/odfexport/data/tdf115815.odt create mode 100644 sw/qa/extras/odfexport/data/tdf118502.odt create mode 100644 sw/qa/extras/odfexport/data/tdf118637.odt create mode 100644 sw/qa/extras/odfexport/data/tdf121658.odt create mode 100644 sw/qa/extras/odfexport/data/tdf124470TableAndEmbeddedUsedFonts.odt create mode 100644 sw/qa/extras/odfexport/data/tdf128504.docx create mode 100644 sw/qa/extras/odfexport/data/tdf129520.docx create mode 100644 sw/qa/extras/odfexport/data/tdf129568-ui.fodt create mode 100644 sw/qa/extras/odfexport/data/tdf129568.fodt create mode 100644 sw/qa/extras/odfexport/data/tdf130314.docx create mode 100644 sw/qa/extras/odfexport/data/tdf130950.odt create mode 100644 sw/qa/extras/odfexport/data/tdf131025_noZerosInTable.odt create mode 100644 sw/qa/extras/odfexport/data/tdf131621.ott create mode 100644 sw/qa/extras/odfexport/data/tdf131812.odt create mode 100644 sw/qa/extras/odfexport/data/tdf132642_keepWithNextTable.odt create mode 100644 sw/qa/extras/odfexport/data/tdf133507_contextualSpacingSection.odt create mode 100644 sw/qa/extras/odfexport/data/tdf134987.docx create mode 100644 sw/qa/extras/odfexport/data/tdf135144.docx create mode 100644 sw/qa/extras/odfexport/data/tdf135338_firstLeftPageFooter.odt create mode 100644 sw/qa/extras/odfexport/data/tdf136645.odt create mode 100644 sw/qa/extras/odfexport/data/tdf137199.docx create mode 100644 sw/qa/extras/odfexport/data/tdf139126.odt create mode 100644 sw/qa/extras/odfexport/data/tdf140437.odt create mode 100644 sw/qa/extras/odfexport/data/tdf142483.odt create mode 100644 sw/qa/extras/odfexport/data/tdf143605.odt create mode 100644 sw/qa/extras/odfexport/data/tdf143793_noBodyWrapping.odt create mode 100644 sw/qa/extras/odfexport/data/tdf144319.odt create mode 100644 sw/qa/extras/odfexport/data/tdf145226.fodt create mode 100644 sw/qa/extras/odfexport/data/tdf145361.odt create mode 100644 sw/qa/extras/odfexport/data/tdf145871.odt create mode 100644 sw/qa/extras/odfexport/data/tdf146264.odt create mode 100644 sw/qa/extras/odfexport/data/tdf149248.odt create mode 100644 sw/qa/extras/odfexport/data/tdf149324.odt create mode 100644 sw/qa/extras/odfexport/data/tdf149420.odt create mode 100644 sw/qa/extras/odfexport/data/tdf150149.fodt create mode 100644 sw/qa/extras/odfexport/data/tdf150394.odt create mode 100644 sw/qa/extras/odfexport/data/tdf151100.docx create mode 100644 sw/qa/extras/odfexport/data/tdf152710.odt create mode 100644 sw/qa/extras/odfexport/data/tdf156905.odt create mode 100644 sw/qa/extras/odfexport/data/tdf43569_conditionalfield.doc create mode 100644 sw/qa/extras/odfexport/data/tdf57317_autoListName.odt create mode 100644 sw/qa/extras/odfexport/data/tdf66305.odt create mode 100644 sw/qa/extras/odfexport/data/tdf77961.odt create mode 100644 sw/qa/extras/odfexport/data/tdf92379.fodt create mode 100644 sw/qa/extras/odfexport/data/tdf95806.docx create mode 100644 sw/qa/extras/odfexport/data/tdf99631.docx create mode 100644 sw/qa/extras/odfexport/data/testTdf52065_centerTabs.odt create mode 100644 sw/qa/extras/odfexport/data/textbox-rounded-corners.odt create mode 100644 sw/qa/extras/odfexport/data/textframe-gradient.odt create mode 100644 sw/qa/extras/odfexport/data/textframe-transparent-shadow.odt create mode 100644 sw/qa/extras/odfexport/data/textframe-vertadjust.odt create mode 100644 sw/qa/extras/odfexport/data/user-field-decl-fly.odt create mode 100644 sw/qa/extras/odfexport/data/user-field-decl.odt create mode 100644 sw/qa/extras/odfexport/data/userdefattr-tablecell.odt create mode 100644 sw/qa/extras/odfexport/data/whitespace.odt create mode 100644 sw/qa/extras/odfexport/odfexport.cxx create mode 100644 sw/qa/extras/odfexport/odfexport2.cxx (limited to 'sw/qa/extras/odfexport') diff --git a/sw/qa/extras/odfexport/data/2_MathType3.docx b/sw/qa/extras/odfexport/data/2_MathType3.docx new file mode 100644 index 0000000000..0694921b39 Binary files /dev/null and b/sw/qa/extras/odfexport/data/2_MathType3.docx differ diff --git a/sw/qa/extras/odfexport/data/CrossRefHeadingBookmark.fodt b/sw/qa/extras/odfexport/data/CrossRefHeadingBookmark.fodt new file mode 100644 index 0000000000..64d6205372 --- /dev/null +++ b/sw/qa/extras/odfexport/data/CrossRefHeadingBookmark.fodt @@ -0,0 +1,120 @@ + + + + ms 2015-08-24T21:49:45.305718699LibreOfficeDev/4.3.7.2$Linux_X86_64 LibreOffice_project/8a35821d8636a03b8bf4e15b48f59794652c68ba + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text + + + cross-reference to 1.1 (Numbered paragraph - Number) and 1.1(Numbered paragraph - no context) + + + + + + + diff --git a/sw/qa/extras/odfexport/data/Custom-Style-TOC.docx b/sw/qa/extras/odfexport/data/Custom-Style-TOC.docx new file mode 100644 index 0000000000..2b4c57054f Binary files /dev/null and b/sw/qa/extras/odfexport/data/Custom-Style-TOC.docx differ diff --git a/sw/qa/extras/odfexport/data/Formcontrol needs high z-index.odt b/sw/qa/extras/odfexport/data/Formcontrol needs high z-index.odt new file mode 100644 index 0000000000..4b03bd7fd1 Binary files /dev/null and b/sw/qa/extras/odfexport/data/Formcontrol needs high z-index.odt differ diff --git a/sw/qa/extras/odfexport/data/IsLegal.fodt b/sw/qa/extras/odfexport/data/IsLegal.fodt new file mode 100644 index 0000000000..a4af751fb1 --- /dev/null +++ b/sw/qa/extras/odfexport/data/IsLegal.fodt @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + Foo + + Bar + + + \ No newline at end of file diff --git a/sw/qa/extras/odfexport/data/MadeByLO7.odt b/sw/qa/extras/odfexport/data/MadeByLO7.odt new file mode 100644 index 0000000000..9587fffe64 Binary files /dev/null and b/sw/qa/extras/odfexport/data/MadeByLO7.odt differ diff --git a/sw/qa/extras/odfexport/data/ParagraphMarkerMarkup.fodt b/sw/qa/extras/odfexport/data/ParagraphMarkerMarkup.fodt new file mode 100644 index 0000000000..c3a21261da --- /dev/null +++ b/sw/qa/extras/odfexport/data/ParagraphMarkerMarkup.fodt @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + text + + + \ No newline at end of file diff --git a/sw/qa/extras/odfexport/data/WordTest_edit.odt b/sw/qa/extras/odfexport/data/WordTest_edit.odt new file mode 100644 index 0000000000..4c14295e93 Binary files /dev/null and b/sw/qa/extras/odfexport/data/WordTest_edit.odt differ diff --git a/sw/qa/extras/odfexport/data/allow-overlap.odt b/sw/qa/extras/odfexport/data/allow-overlap.odt new file mode 100644 index 0000000000..b23f5b360b Binary files /dev/null and b/sw/qa/extras/odfexport/data/allow-overlap.odt differ diff --git a/sw/qa/extras/odfexport/data/arabic-zero-numbering.odt b/sw/qa/extras/odfexport/data/arabic-zero-numbering.odt new file mode 100644 index 0000000000..2a445b2274 Binary files /dev/null and b/sw/qa/extras/odfexport/data/arabic-zero-numbering.odt differ diff --git a/sw/qa/extras/odfexport/data/arabic-zero3-numbering.odt b/sw/qa/extras/odfexport/data/arabic-zero3-numbering.odt new file mode 100644 index 0000000000..0bdca270ee Binary files /dev/null and b/sw/qa/extras/odfexport/data/arabic-zero3-numbering.odt differ diff --git a/sw/qa/extras/odfexport/data/arabic-zero4-numbering.odt b/sw/qa/extras/odfexport/data/arabic-zero4-numbering.odt new file mode 100644 index 0000000000..2eb9b49ced Binary files /dev/null and b/sw/qa/extras/odfexport/data/arabic-zero4-numbering.odt differ diff --git a/sw/qa/extras/odfexport/data/arabic-zero5-numbering.odt b/sw/qa/extras/odfexport/data/arabic-zero5-numbering.odt new file mode 100644 index 0000000000..3526ee8d70 Binary files /dev/null and b/sw/qa/extras/odfexport/data/arabic-zero5-numbering.odt differ diff --git a/sw/qa/extras/odfexport/data/border_types.odt b/sw/qa/extras/odfexport/data/border_types.odt new file mode 100644 index 0000000000..97b72436f0 Binary files /dev/null and b/sw/qa/extras/odfexport/data/border_types.odt differ diff --git a/sw/qa/extras/odfexport/data/btlr-cell.odt b/sw/qa/extras/odfexport/data/btlr-cell.odt new file mode 100644 index 0000000000..c010fa9f51 Binary files /dev/null and b/sw/qa/extras/odfexport/data/btlr-cell.odt differ diff --git a/sw/qa/extras/odfexport/data/btlr-frame.odt b/sw/qa/extras/odfexport/data/btlr-frame.odt new file mode 100644 index 0000000000..31cb03849c Binary files /dev/null and b/sw/qa/extras/odfexport/data/btlr-frame.odt differ diff --git a/sw/qa/extras/odfexport/data/chapter-number-new-line.odt b/sw/qa/extras/odfexport/data/chapter-number-new-line.odt new file mode 100644 index 0000000000..68a427f72e Binary files /dev/null and b/sw/qa/extras/odfexport/data/chapter-number-new-line.odt differ diff --git a/sw/qa/extras/odfexport/data/charborder.odt b/sw/qa/extras/odfexport/data/charborder.odt new file mode 100644 index 0000000000..0d4d50691a Binary files /dev/null and b/sw/qa/extras/odfexport/data/charborder.odt differ diff --git a/sw/qa/extras/odfexport/data/embedded-font-props.odt b/sw/qa/extras/odfexport/data/embedded-font-props.odt new file mode 100644 index 0000000000..6eb073e29f Binary files /dev/null and b/sw/qa/extras/odfexport/data/embedded-font-props.odt differ diff --git a/sw/qa/extras/odfexport/data/embedded-pdf.odt b/sw/qa/extras/odfexport/data/embedded-pdf.odt new file mode 100644 index 0000000000..3adb4cf11d Binary files /dev/null and b/sw/qa/extras/odfexport/data/embedded-pdf.odt differ diff --git a/sw/qa/extras/odfexport/data/fdo38244.odt b/sw/qa/extras/odfexport/data/fdo38244.odt new file mode 100644 index 0000000000..0fcc168a8b Binary files /dev/null and b/sw/qa/extras/odfexport/data/fdo38244.odt differ diff --git a/sw/qa/extras/odfexport/data/fdo43807.odt b/sw/qa/extras/odfexport/data/fdo43807.odt new file mode 100644 index 0000000000..ae03c59043 Binary files /dev/null and b/sw/qa/extras/odfexport/data/fdo43807.odt differ diff --git a/sw/qa/extras/odfexport/data/fdo58949.docx b/sw/qa/extras/odfexport/data/fdo58949.docx new file mode 100644 index 0000000000..d8f568b16c Binary files /dev/null and b/sw/qa/extras/odfexport/data/fdo58949.docx differ diff --git a/sw/qa/extras/odfexport/data/fdo60769.odt b/sw/qa/extras/odfexport/data/fdo60769.odt new file mode 100644 index 0000000000..b3c39376b8 Binary files /dev/null and b/sw/qa/extras/odfexport/data/fdo60769.odt differ diff --git a/sw/qa/extras/odfexport/data/fdo79358.odt b/sw/qa/extras/odfexport/data/fdo79358.odt new file mode 100644 index 0000000000..a1d2572a6d Binary files /dev/null and b/sw/qa/extras/odfexport/data/fdo79358.odt differ diff --git a/sw/qa/extras/odfexport/data/fdo86963.odt b/sw/qa/extras/odfexport/data/fdo86963.odt new file mode 100644 index 0000000000..72896e1399 Binary files /dev/null and b/sw/qa/extras/odfexport/data/fdo86963.odt differ diff --git a/sw/qa/extras/odfexport/data/fillbitmap3.odt b/sw/qa/extras/odfexport/data/fillbitmap3.odt new file mode 100644 index 0000000000..90308a5ec4 Binary files /dev/null and b/sw/qa/extras/odfexport/data/fillbitmap3.odt differ diff --git a/sw/qa/extras/odfexport/data/footnote-collect-at-end-of-section.fodt b/sw/qa/extras/odfexport/data/footnote-collect-at-end-of-section.fodt new file mode 100644 index 0000000000..b991033485 --- /dev/null +++ b/sw/qa/extras/odfexport/data/footnote-collect-at-end-of-section.fodt @@ -0,0 +1,192 @@ + + + + 2019-10-21T13:59:35.8473398492019-10-21T14:28:45.221080424PT23M48S2LibreOffice_powered_by_CIBDev/6.1.7.5$Linux_X86_64 LibreOffice_project/3ab5486449d1f3ca0247a9c133da746401c57e28 + + + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Unknown Author + 2019-10-21T14:28:28 + + 2 + two3 + three + + + + + 1 + one2 + two + + + 1 + one2 + four + + + + + diff --git a/sw/qa/extras/odfexport/data/framebackgrounds.odt b/sw/qa/extras/odfexport/data/framebackgrounds.odt new file mode 100644 index 0000000000..9ad338c2d1 Binary files /dev/null and b/sw/qa/extras/odfexport/data/framebackgrounds.odt differ diff --git a/sw/qa/extras/odfexport/data/gerrit13858.odt b/sw/qa/extras/odfexport/data/gerrit13858.odt new file mode 100644 index 0000000000..9b3dd37ff1 Binary files /dev/null and b/sw/qa/extras/odfexport/data/gerrit13858.odt differ diff --git a/sw/qa/extras/odfexport/data/gutter-left.odt b/sw/qa/extras/odfexport/data/gutter-left.odt new file mode 100644 index 0000000000..a047ecaa33 Binary files /dev/null and b/sw/qa/extras/odfexport/data/gutter-left.odt differ diff --git a/sw/qa/extras/odfexport/data/image-mimetype.odt b/sw/qa/extras/odfexport/data/image-mimetype.odt new file mode 100644 index 0000000000..4c4924a1b2 Binary files /dev/null and b/sw/qa/extras/odfexport/data/image-mimetype.odt differ diff --git a/sw/qa/extras/odfexport/data/listformat.docx b/sw/qa/extras/odfexport/data/listformat.docx new file mode 100644 index 0000000000..338678d82d Binary files /dev/null and b/sw/qa/extras/odfexport/data/listformat.docx differ diff --git a/sw/qa/extras/odfexport/data/listformat.odt b/sw/qa/extras/odfexport/data/listformat.odt new file mode 100644 index 0000000000..ec3992c8fd Binary files /dev/null and b/sw/qa/extras/odfexport/data/listformat.odt differ diff --git a/sw/qa/extras/odfexport/data/nestedTableInFooter.odt b/sw/qa/extras/odfexport/data/nestedTableInFooter.odt new file mode 100644 index 0000000000..0356f04ee1 Binary files /dev/null and b/sw/qa/extras/odfexport/data/nestedTableInFooter.odt differ diff --git a/sw/qa/extras/odfexport/data/ooo321_stylepagenumber.odt b/sw/qa/extras/odfexport/data/ooo321_stylepagenumber.odt new file mode 100644 index 0000000000..aae70e1063 Binary files /dev/null and b/sw/qa/extras/odfexport/data/ooo321_stylepagenumber.odt differ diff --git a/sw/qa/extras/odfexport/data/oooxml_embedded.sxw b/sw/qa/extras/odfexport/data/oooxml_embedded.sxw new file mode 100644 index 0000000000..e4fe14aef5 Binary files /dev/null and b/sw/qa/extras/odfexport/data/oooxml_embedded.sxw differ diff --git a/sw/qa/extras/odfexport/data/page-content-bottom.odt b/sw/qa/extras/odfexport/data/page-content-bottom.odt new file mode 100644 index 0000000000..263ca7df40 Binary files /dev/null and b/sw/qa/extras/odfexport/data/page-content-bottom.odt differ diff --git a/sw/qa/extras/odfexport/data/page-content-top.odt b/sw/qa/extras/odfexport/data/page-content-top.odt new file mode 100644 index 0000000000..755d50242e Binary files /dev/null and b/sw/qa/extras/odfexport/data/page-content-top.odt differ diff --git a/sw/qa/extras/odfexport/data/pagestyle_background_lo64.odt b/sw/qa/extras/odfexport/data/pagestyle_background_lo64.odt new file mode 100644 index 0000000000..c8b3c3fdd0 Binary files /dev/null and b/sw/qa/extras/odfexport/data/pagestyle_background_lo64.odt differ diff --git a/sw/qa/extras/odfexport/data/pagestyle_background_lo70.odt b/sw/qa/extras/odfexport/data/pagestyle_background_lo70.odt new file mode 100644 index 0000000000..eb8b4a0e72 Binary files /dev/null and b/sw/qa/extras/odfexport/data/pagestyle_background_lo70.odt differ diff --git a/sw/qa/extras/odfexport/data/pagestyle_background_ooo33.odt b/sw/qa/extras/odfexport/data/pagestyle_background_ooo33.odt new file mode 100644 index 0000000000..92098d0bcf Binary files /dev/null and b/sw/qa/extras/odfexport/data/pagestyle_background_ooo33.odt differ diff --git a/sw/qa/extras/odfexport/data/protection-key.fodt b/sw/qa/extras/odfexport/data/protection-key.fodt new file mode 100644 index 0000000000..cd4cde9623 --- /dev/null +++ b/sw/qa/extras/odfexport/data/protection-key.fodt @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sw/qa/extras/odfexport/data/qrcode-properties.odt b/sw/qa/extras/odfexport/data/qrcode-properties.odt new file mode 100644 index 0000000000..2de59b0414 Binary files /dev/null and b/sw/qa/extras/odfexport/data/qrcode-properties.odt differ diff --git a/sw/qa/extras/odfexport/data/redlineTextFrame.odt b/sw/qa/extras/odfexport/data/redlineTextFrame.odt new file mode 100644 index 0000000000..0986c3792f Binary files /dev/null and b/sw/qa/extras/odfexport/data/redlineTextFrame.odt differ diff --git a/sw/qa/extras/odfexport/data/referencelanguage.odt b/sw/qa/extras/odfexport/data/referencelanguage.odt new file mode 100644 index 0000000000..9614bb3e31 Binary files /dev/null and b/sw/qa/extras/odfexport/data/referencelanguage.odt differ diff --git a/sw/qa/extras/odfexport/data/relh-page-tdf80282.odt b/sw/qa/extras/odfexport/data/relh-page-tdf80282.odt new file mode 100644 index 0000000000..6b3c583d36 Binary files /dev/null and b/sw/qa/extras/odfexport/data/relh-page-tdf80282.odt differ diff --git a/sw/qa/extras/odfexport/data/relh-page.odt b/sw/qa/extras/odfexport/data/relh-page.odt new file mode 100644 index 0000000000..2dcf641243 Binary files /dev/null and b/sw/qa/extras/odfexport/data/relh-page.odt differ diff --git a/sw/qa/extras/odfexport/data/relw-page.odt b/sw/qa/extras/odfexport/data/relw-page.odt new file mode 100644 index 0000000000..047d91e876 Binary files /dev/null and b/sw/qa/extras/odfexport/data/relw-page.odt differ diff --git a/sw/qa/extras/odfexport/data/resolved-comment.odt b/sw/qa/extras/odfexport/data/resolved-comment.odt new file mode 100644 index 0000000000..e136cac3d8 Binary files /dev/null and b/sw/qa/extras/odfexport/data/resolved-comment.odt differ diff --git a/sw/qa/extras/odfexport/data/rovas-numbering.odt b/sw/qa/extras/odfexport/data/rovas-numbering.odt new file mode 100644 index 0000000000..72cb8895a9 Binary files /dev/null and b/sw/qa/extras/odfexport/data/rovas-numbering.odt differ diff --git a/sw/qa/extras/odfexport/data/ruby-position.odt b/sw/qa/extras/odfexport/data/ruby-position.odt new file mode 100644 index 0000000000..7086144bf1 Binary files /dev/null and b/sw/qa/extras/odfexport/data/ruby-position.odt differ diff --git a/sw/qa/extras/odfexport/data/section-columns-separator.fodt b/sw/qa/extras/odfexport/data/section-columns-separator.fodt new file mode 100644 index 0000000000..b9c97eb9e3 --- /dev/null +++ b/sw/qa/extras/odfexport/data/section-columns-separator.fodt @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum consequat mi quis pretium semper. Proin luctus orci ac neque venenatis, quis commodo dolor posuere. Curabitur dignissim sapien quis cursus egestas. Donec blandit auctor arcu, nec pellentesque eros molestie eget. In consectetur aliquam hendrerit. Sed cursus mauris vitae ligula pellentesque, non pellentesque urna aliquet. Fusce placerat mauris enim, nec rutrum purus semper vel. Praesent tincidunt neque eu pellentesque pharetra. Fusce pellentesque est orci. + Integer sodales tincidunt tristique. Sed a metus posuere, adipiscing nunc et, viverra odio. Donec auctor molestie sem, sit amet tristique lectus hendrerit sed. Cras sodales nisl sed orci mattis iaculis. Nunc eget dolor accumsan, pharetra risus a, vestibulum mauris. Nunc vulputate lobortis mollis. Vivamus nec tellus faucibus, tempor magna nec, facilisis felis. Donec commodo enim a vehicula pellentesque. Nullam vehicula vestibulum est vel ultricies. + Aliquam velit massa, laoreet vel leo nec, volutpat facilisis eros. Donec consequat arcu ut diam tempor luctus. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Praesent vitae lacus vel leo sodales pharetra a a nibh. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nam luctus tempus nibh, fringilla dictum augue consectetur eget. Curabitur at ante sit amet tortor pharetra molestie eu nec ante. Mauris tincidunt, nibh eu sollicitudin molestie, dolor sapien congue tortor, a pulvinar sapien turpis sed ante. Donec nec est elementum, euismod nulla in, mollis nunc. + + + + \ No newline at end of file diff --git a/sw/qa/extras/odfexport/data/sender-initials.fodt b/sw/qa/extras/odfexport/data/sender-initials.fodt new file mode 100644 index 0000000000..b8a5c1e670 --- /dev/null +++ b/sw/qa/extras/odfexport/data/sender-initials.fodt @@ -0,0 +1,71 @@ + + + + ms 2015-08-24T21:49:45.305718699LibreOfficeDev/4.3.7.2$Linux_X86_64 LibreOffice_project/8a35821d8636a03b8bf4e15b48f59794652c68ba + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + I2018-05-08T11:09:30.015915376barFoo + + I2018-05-08T11:09:30.015915376barFoo + + I2018-05-08T11:09:30.015915376barFoo + + + I + + + + I + + + + + diff --git a/sw/qa/extras/odfexport/data/sha1_correct.odt b/sw/qa/extras/odfexport/data/sha1_correct.odt new file mode 100644 index 0000000000..01cbb0a073 Binary files /dev/null and b/sw/qa/extras/odfexport/data/sha1_correct.odt differ diff --git a/sw/qa/extras/odfexport/data/sha1_wrong.odt b/sw/qa/extras/odfexport/data/sha1_wrong.odt new file mode 100644 index 0000000000..94032025b3 Binary files /dev/null and b/sw/qa/extras/odfexport/data/sha1_wrong.odt differ diff --git a/sw/qa/extras/odfexport/data/shape-relsize.odt b/sw/qa/extras/odfexport/data/shape-relsize.odt new file mode 100644 index 0000000000..05a3ffa591 Binary files /dev/null and b/sw/qa/extras/odfexport/data/shape-relsize.odt differ diff --git a/sw/qa/extras/odfexport/data/shape-with-hyperlink.odt b/sw/qa/extras/odfexport/data/shape-with-hyperlink.odt new file mode 100644 index 0000000000..7b11278284 Binary files /dev/null and b/sw/qa/extras/odfexport/data/shape-with-hyperlink.odt differ diff --git a/sw/qa/extras/odfexport/data/shapes-hyperlink.odt b/sw/qa/extras/odfexport/data/shapes-hyperlink.odt new file mode 100644 index 0000000000..f8f4e15565 Binary files /dev/null and b/sw/qa/extras/odfexport/data/shapes-hyperlink.odt differ diff --git a/sw/qa/extras/odfexport/data/signatureline-properties.fodt b/sw/qa/extras/odfexport/data/signatureline-properties.fodt new file mode 100644 index 0000000000..ddceff9f35 --- /dev/null +++ b/sw/qa/extras/odfexport/data/signatureline-properties.fodt @@ -0,0 +1,596 @@ + + + + 2017-12-11T16:12:21.9478635282017-12-11T16:12:44.952307632PT27S1LibreOfficeDev/6.1.0.0.alpha0$Linux_X86_64 LibreOffice_project/f694d0c29b4f38b6c40850c61ec6aeac3969fd88 + + + 0 + 0 + 47891 + 23206 + true + false + + + view2 + 21447 + 2501 + 0 + 0 + 47890 + 23204 + 0 + 1 + false + 100 + false + false + + + + + false + + false + false + false + false + false + true + true + false + true + true + false + + true + + false + false + true + false + false + 855097 + false + false + true + true + false + false + true + true + true + true + true + true + false + false + 1 + true + false + + false + false + + false + false + false + + false + 0 + 0 + false + + false + true + false + false + false + false + false + true + false + false + false + true + 1224071 + true + false + false + false + false + high-resolution + true + true + true + false + false + false + false + false + false + false + false + false + true + false + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+ + PHN2ZyB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5z + OmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiIHhtbG5zOnJkZj0iaHR0cDov + L3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIgeG1sbnM6c3ZnPSJodHRw + Oi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAv + c3ZnIiB4bWxuczpzb2RpcG9kaT0iaHR0cDovL3NvZGlwb2RpLnNvdXJjZWZvcmdlLm5ldC9E + VEQvc29kaXBvZGktMC5kdGQiIHhtbG5zOmlua3NjYXBlPSJodHRwOi8vd3d3Lmlua3NjYXBl + Lm9yZy9uYW1lc3BhY2VzL2lua3NjYXBlIiB2ZXJzaW9uPSIxLjIiIHdpZHRoPSI5MG1tIiBo + ZWlnaHQ9IjQ1bW0iIHZpZXdCb3g9IjAgMCA5MDAwIDQ1MDAiIHByZXNlcnZlQXNwZWN0UmF0 + aW89InhNaWRZTWlkIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHN0cm9rZS13aWR0aD0iMjguMjIy + IiBzdHJva2UtbGluZWpvaW49InJvdW5kIiB4bWw6c3BhY2U9InByZXNlcnZlIiBpZD0ic3Zn + NTc3IiBpbmtzY2FwZTp2ZXJzaW9uPSIwLjkyLjIgKDVjM2U4MGQsIDIwMTctMDgtMDYpIj48 + bWV0YWRhdGEgaWQ9Im1ldGFkYXRhNTgxIj48cmRmOlJERj48Y2M6V29yayByZGY6YWJvdXQ9 + IiI+PGRjOmZvcm1hdD5pbWFnZS9zdmcreG1sPC9kYzpmb3JtYXQ+PGRjOnR5cGUgcmRmOnJl + c291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIvPjxkYzp0 + aXRsZS8+PC9jYzpXb3JrPjwvcmRmOlJERj48L21ldGFkYXRhPjxzb2RpcG9kaTpuYW1lZHZp + ZXcgcGFnZWNvbG9yPSIjZmZmZmZmIiBib3JkZXJjb2xvcj0iIzY2NjY2NiIgYm9yZGVyb3Bh + Y2l0eT0iMSIgb2JqZWN0dG9sZXJhbmNlPSIxMCIgZ3JpZHRvbGVyYW5jZT0iMTAiIGd1aWRl + dG9sZXJhbmNlPSIxMCIgaW5rc2NhcGU6cGFnZW9wYWNpdHk9IjAiIGlua3NjYXBlOnBhZ2Vz + aGFkb3c9IjIiIGlua3NjYXBlOndpbmRvdy13aWR0aD0iMTg2MyIgaW5rc2NhcGU6d2luZG93 + LWhlaWdodD0iMTA1NiIgaWQ9Im5hbWVkdmlldzU3OSIgc2hvd2dyaWQ9ImZhbHNlIiBpbmtz + Y2FwZTp6b29tPSIwLjkwMjUyMzE1IiBpbmtzY2FwZTpjeD0iMTcwLjA3ODc0IiBpbmtzY2Fw + ZTpjeT0iODUuMDM5MzciIGlua3NjYXBlOndpbmRvdy14PSI1NyIgaW5rc2NhcGU6d2luZG93 + LXk9IjI0IiBpbmtzY2FwZTp3aW5kb3ctbWF4aW1pemVkPSIxIiBpbmtzY2FwZTpjdXJyZW50 + LWxheWVyPSJzdmc1NzciIGlua3NjYXBlOnBhZ2VjaGVja2VyYm9hcmQ9ImZhbHNlIi8+PGRl + ZnMgY2xhc3M9IkNsaXBQYXRoR3JvdXAiIGlkPSJkZWZzOCI+PGNsaXBQYXRoIGlkPSJwcmVz + ZW50YXRpb25fY2xpcF9wYXRoIiBjbGlwUGF0aFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHJl + Y3QgeD0iMCIgeT0iMCIgd2lkdGg9IjkwMDAiIGhlaWdodD0iNDUwMCIgaWQ9InJlY3QyIi8+ + PC9jbGlwUGF0aD48L2RlZnM+PGRlZnMgaWQ9ImRlZnM0OSIvPjxkZWZzIGlkPSJkZWZzODYi + Lz48ZGVmcyBjbGFzcz0iVGV4dFNoYXBlSW5kZXgiIGlkPSJkZWZzOTAiLz48ZGVmcyBjbGFz + cz0iRW1iZWRkZWRCdWxsZXRDaGFycyIgaWQ9ImRlZnMxMjIiLz48ZGVmcyBjbGFzcz0iVGV4 + dEVtYmVkZGVkQml0bWFwcyIgaWQ9ImRlZnMxMjQiLz48ZyBpZD0iZzEyOSI+PGcgaWQ9Imlk + MiIgY2xhc3M9Ik1hc3Rlcl9TbGlkZSI+PGcgaWQ9ImJnLWlkMiIgY2xhc3M9IkJhY2tncm91 + bmQiLz48ZyBpZD0iYm8taWQyIiBjbGFzcz0iQmFja2dyb3VuZE9iamVjdHMiLz48L2c+PC9n + PjxnIGNsYXNzPSJTbGlkZUdyb3VwIiBpZD0iZzU3NSI+PGcgaWQ9Imc1NzMiPjxnIGlkPSJj + b250YWluZXItaWQxIj48ZyBpZD0iaWQxIiBjbGFzcz0iU2xpZGUiIGNsaXAtcGF0aD0idXJs + KCNwcmVzZW50YXRpb25fY2xpcF9wYXRoKSI+PGcgY2xhc3M9IlBhZ2UiIGlkPSJnNTY5Ij48 + ZyBjbGFzcz0iY29tLnN1bi5zdGFyLmRyYXdpbmcuTGluZVNoYXBlIiBpZD0iZzE1NCI+PGcg + aWQ9ImlkMyI+PHJlY3QgY2xhc3M9IkJvdW5kaW5nQm94IiBzdHJva2U9Im5vbmUiIGZpbGw9 + Im5vbmUiIHg9Ii0yNyIgeT0iMjM3MyIgd2lkdGg9IjkwNTUiIGhlaWdodD0iNTUiIGlkPSJy + ZWN0MTMxIi8+PGRlc2MgaWQ9ImRlc2MxMzMiPjE1MDwvZGVzYz48ZGVzYyBpZD0iZGVzYzEz + NSI+MTM5PC9kZXNjPjxkZXNjIGlkPSJkZXNjMTM3Ij4xMzI8L2Rlc2M+PGRlc2MgaWQ9ImRl + c2MxMzkiPjUxMjogWFBBVEhTVFJPS0VfU0VRX0JFR0lOPC9kZXNjPjxkZXNjIGlkPSJkZXNj + MTQxIj4xMzI8L2Rlc2M+PGRlc2MgaWQ9ImRlc2MxNDMiPjEzMzwvZGVzYz48ZGVzYyBpZD0i + ZGVzYzE0NSI+MTA5PC9kZXNjPjxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0icmdiKDAsMCww + KSIgc3Ryb2tlLXdpZHRoPSI1MyIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgZD0iTSAwLDI0 + MDAgTCA5MDAwLDI0MDAiIGlkPSJwYXRoMTQ3Ii8+PGRlc2MgaWQ9ImRlc2MxNDkiPjUxMjog + WFBBVEhTVFJPS0VfU0VRX0VORDwvZGVzYz48ZGVzYyBpZD0iZGVzYzE1MSI+MTQwPC9kZXNj + PjwvZz48L2c+PGcgY2xhc3M9ImNvbS5zdW4uc3Rhci5kcmF3aW5nLkNsb3NlZEJlemllclNo + YXBlIiBpZD0iZzE3MyI+PGcgaWQ9ImlkNCI+PHJlY3QgY2xhc3M9IkJvdW5kaW5nQm94IiBz + dHJva2U9Im5vbmUiIGZpbGw9Im5vbmUiIHg9IjMwMSIgeT0iMTQwMCIgd2lkdGg9IjgwMSIg + aGVpZ2h0PSI4MDEiIGlkPSJyZWN0MTU2Ii8+PGRlc2MgaWQ9ImRlc2MxNTgiPjE1MDwvZGVz + Yz48ZGVzYyBpZD0iZGVzYzE2MCI+MTM5PC9kZXNjPjxkZXNjIGlkPSJkZXNjMTYyIj4xMzM8 + L2Rlc2M+PGRlc2MgaWQ9ImRlc2MxNjQiPjEzMjwvZGVzYz48ZGVzYyBpZD0iZGVzYzE2NiI+ + MTExPC9kZXNjPjxwYXRoIGZpbGw9InJnYigwLDAsMCkiIHN0cm9rZT0ibm9uZSIgZD0iTSA5 + NjksMjIwMCBDIDg4MCwyMDgzIDc5MiwxOTY3IDcwNCwxODUwIDYxNCwxOTY3IDUyMywyMDgz + IDQzMywyMjAwIDM4OSwyMjAwIDM0NSwyMjAwIDMwMSwyMjAwIDQxMywyMDYxIDUyNSwxOTIz + IDYzNywxNzg0IDUzMywxNjU2IDQzMCwxNTI4IDMyNywxNDAwIDM3MSwxNDAwIDQxNSwxNDAw + IDQ1OSwxNDAwIDU0MSwxNTA1IDYyMywxNjA5IDcwNCwxNzE0IDc4NCwxNjA5IDg2MywxNTA1 + IDk0MywxNDAwIDk4NywxNDAwIDEwMzEsMTQwMCAxMDc1LDE0MDAgOTc1LDE1MjcgODc0LDE2 + NTMgNzczLDE3ODAgODgyLDE5MjAgOTkyLDIwNjAgMTEwMSwyMjAwIDEwNTcsMjIwMCAxMDEz + LDIyMDAgOTY5LDIyMDAgWiIgaWQ9InBhdGgxNjgiLz48ZGVzYyBpZD0iZGVzYzE3MCI+MTQw + PC9kZXNjPjwvZz48L2c+PGcgY2xhc3M9ImNvbS5zdW4uc3Rhci5kcmF3aW5nLlRleHRTaGFw + ZSIgaWQ9ImcyMzYiPjxnIGlkPSJpZDUiPjxyZWN0IGNsYXNzPSJCb3VuZGluZ0JveCIgc3Ry + b2tlPSJub25lIiBmaWxsPSJub25lIiB4PSIxMzAwIiB5PSIxNTAwIiB3aWR0aD0iODAwMSIg + aGVpZ2h0PSI5MjUiIGlkPSJyZWN0MTc1Ii8+PGRlc2MgaWQ9ImRlc2MxNzciPjE1MDwvZGVz + Yz48ZGVzYyBpZD0iZGVzYzE3OSI+NTEyOiBYVEVYVF9QQUlOVFNIQVBFX0JFR0lOPC9kZXNj + Pjx0ZXh0IGNsYXNzPSJUZXh0U2hhcGUiIGlkPSJ0ZXh0MjMzIj48ZGVzYyBjbGFzcz0iUGFy + YWdyYXBoIiBpZD0iZGVzYzE4MSIvPjx0c3BhbiBjbGFzcz0iVGV4dFBhcmFncmFwaCIgZm9u + dC1mYW1pbHk9IkxpYmVyYXRpb24gU2Fucywgc2Fucy1zZXJpZiIgZm9udC1zaXplPSI2MDBw + eCIgZm9udC13ZWlnaHQ9IjQwMCIgaWQ9InRzcGFuMjMxIj48ZGVzYyBpZD0iZGVzYzE4MyI+ + MTM4PC9kZXNjPjxkZXNjIGlkPSJkZXNjMTg1Ij4xMzY8L2Rlc2M+PGRlc2MgaWQ9ImRlc2Mx + ODciPjEzNTwvZGVzYz48ZGVzYyBpZD0iZGVzYzE4OSI+MTM0PC9kZXNjPjxkZXNjIGlkPSJk + ZXNjMTkxIj4xMTM8L2Rlc2M+PGRlc2MgY2xhc3M9IlRleHRQb3J0aW9uIiBpZD0iZGVzYzE5 + MyI+dHlwZTogVGV4dDsgY29udGVudDogOyA8L2Rlc2M+PHRzcGFuIGNsYXNzPSJUZXh0UG9z + aXRpb24iIHg9IjE1NTAiIHk9IjIxNzEiIGlkPSJ0c3BhbjIyOSI+PHRzcGFuIGZpbGw9InJn + YigwLDAsMCkiIHN0cm9rZT0ibm9uZSIgaWQ9InRzcGFuMTk1Ij48L3RzcGFuPjxkZXNjIGlk + PSJkZXNjMTk3Ij41MTI6IFhURVhUX0VPQzwvZGVzYz48ZGVzYyBpZD0iZGVzYzE5OSI+NTEy + OiBYVEVYVF9FT0M8L2Rlc2M+PGRlc2MgaWQ9ImRlc2MyMDEiPjUxMjogWFRFWFRfRU9XPC9k + ZXNjPjxkZXNjIGlkPSJkZXNjMjAzIj41MTI6IFhURVhUX0VPQzwvZGVzYz48ZGVzYyBpZD0i + ZGVzYzIwNSI+NTEyOiBYVEVYVF9FT0M8L2Rlc2M+PGRlc2MgaWQ9ImRlc2MyMDciPjUxMjog + WFRFWFRfRU9DPC9kZXNjPjxkZXNjIGlkPSJkZXNjMjA5Ij41MTI6IFhURVhUX0VPQzwvZGVz + Yz48ZGVzYyBpZD0iZGVzYzIxMSI+NTEyOiBYVEVYVF9FT0M8L2Rlc2M+PGRlc2MgaWQ9ImRl + c2MyMTMiPjUxMjogWFRFWFRfRU9DPC9kZXNjPjxkZXNjIGlkPSJkZXNjMjE1Ij41MTI6IFhU + RVhUX0VPQzwvZGVzYz48ZGVzYyBpZD0iZGVzYzIxNyI+NTEyOiBYVEVYVF9FT0M8L2Rlc2M+ + PGRlc2MgaWQ9ImRlc2MyMTkiPjUxMjogWFRFWFRfRU9DPC9kZXNjPjxkZXNjIGlkPSJkZXNj + MjIxIj41MTI6IFhURVhUX0VPVzwvZGVzYz48ZGVzYyBpZD0iZGVzYzIyMyI+NTEyOiBYVEVY + VF9FT0w8L2Rlc2M+PGRlc2MgaWQ9ImRlc2MyMjUiPjUxMjogWFRFWFRfRU9QPC9kZXNjPjxk + ZXNjIGlkPSJkZXNjMjI3Ij41MTI6IFhURVhUX1BBSU5UU0hBUEVfRU5EPC9kZXNjPjwvdHNw + YW4+PC90c3Bhbj48L3RleHQ+PC9nPjwvZz48ZyBjbGFzcz0iY29tLnN1bi5zdGFyLmRyYXdp + bmcuVGV4dFNoYXBlIiBpZD0iZzMwMyI+PGcgaWQ9ImlkNiI+PHJlY3QgY2xhc3M9IkJvdW5k + aW5nQm94IiBzdHJva2U9Im5vbmUiIGZpbGw9Im5vbmUiIHg9IjEwMCIgeT0iMjUwMCIgd2lk + dGg9Ijg5MDEiIGhlaWdodD0iNzI2IiBpZD0icmVjdDIzOCIvPjxkZXNjIGlkPSJkZXNjMjQw + Ij4xNTA8L2Rlc2M+PGRlc2MgaWQ9ImRlc2MyNDIiPjUxMjogWFRFWFRfUEFJTlRTSEFQRV9C + RUdJTjwvZGVzYz48dGV4dCBjbGFzcz0iVGV4dFNoYXBlIiBpZD0idGV4dDMwMCI+PGRlc2Mg + Y2xhc3M9IlBhcmFncmFwaCIgaWQ9ImRlc2MyNDQiLz48dHNwYW4gY2xhc3M9IlRleHRQYXJh + Z3JhcGgiIGZvbnQtZmFtaWx5PSJMaWJlcmF0aW9uIFNhbnMsIHNhbnMtc2VyaWYiIGZvbnQt + c2l6ZT0iNDIzcHgiIGZvbnQtd2VpZ2h0PSI0MDAiIGlkPSJ0c3BhbjI5OCI+PGRlc2MgaWQ9 + ImRlc2MyNDYiPjEzODwvZGVzYz48ZGVzYyBpZD0iZGVzYzI0OCI+MTM2PC9kZXNjPjxkZXNj + IGlkPSJkZXNjMjUwIj4xMzU8L2Rlc2M+PGRlc2MgaWQ9ImRlc2MyNTIiPjEzNDwvZGVzYz48 + ZGVzYyBpZD0iZGVzYzI1NCI+MTEzPC9kZXNjPjxkZXNjIGNsYXNzPSJUZXh0UG9ydGlvbiIg + aWQ9ImRlc2MyNTYiPnR5cGU6IFRleHQ7IGNvbnRlbnQ6IEpvaG4gRG9lOyA8L2Rlc2M+PHRz + cGFuIGNsYXNzPSJUZXh0UG9zaXRpb24iIHg9IjM1MCIgeT0iMzAxMCIgaWQ9InRzcGFuMjk2 + Ij48dHNwYW4gZmlsbD0icmdiKDAsMCwwKSIgc3Ryb2tlPSJub25lIiBpZD0idHNwYW4yNTgi + PkpvaG4gRG9lPC90c3Bhbj48ZGVzYyBpZD0iZGVzYzI2MCI+NTEyOiBYVEVYVF9FT0M8L2Rl + c2M+PGRlc2MgaWQ9ImRlc2MyNjIiPjUxMjogWFRFWFRfRU9DPC9kZXNjPjxkZXNjIGlkPSJk + ZXNjMjY0Ij41MTI6IFhURVhUX0VPVzwvZGVzYz48ZGVzYyBpZD0iZGVzYzI2NiI+NTEyOiBY + VEVYVF9FT0M8L2Rlc2M+PGRlc2MgaWQ9ImRlc2MyNjgiPjUxMjogWFRFWFRfRU9DPC9kZXNj + PjxkZXNjIGlkPSJkZXNjMjcwIj41MTI6IFhURVhUX0VPQzwvZGVzYz48ZGVzYyBpZD0iZGVz + YzI3MiI+NTEyOiBYVEVYVF9FT0M8L2Rlc2M+PGRlc2MgaWQ9ImRlc2MyNzQiPjUxMjogWFRF + WFRfRU9DPC9kZXNjPjxkZXNjIGlkPSJkZXNjMjc2Ij41MTI6IFhURVhUX0VPQzwvZGVzYz48 + ZGVzYyBpZD0iZGVzYzI3OCI+NTEyOiBYVEVYVF9FT0M8L2Rlc2M+PGRlc2MgaWQ9ImRlc2My + ODAiPjUxMjogWFRFWFRfRU9DPC9kZXNjPjxkZXNjIGlkPSJkZXNjMjgyIj41MTI6IFhURVhU + X0VPQzwvZGVzYz48ZGVzYyBpZD0iZGVzYzI4NCI+NTEyOiBYVEVYVF9FT0M8L2Rlc2M+PGRl + c2MgaWQ9ImRlc2MyODYiPjUxMjogWFRFWFRfRU9DPC9kZXNjPjxkZXNjIGlkPSJkZXNjMjg4 + Ij41MTI6IFhURVhUX0VPVzwvZGVzYz48ZGVzYyBpZD0iZGVzYzI5MCI+NTEyOiBYVEVYVF9F + T0w8L2Rlc2M+PGRlc2MgaWQ9ImRlc2MyOTIiPjUxMjogWFRFWFRfRU9QPC9kZXNjPjxkZXNj + IGlkPSJkZXNjMjk0Ij41MTI6IFhURVhUX1BBSU5UU0hBUEVfRU5EPC9kZXNjPjwvdHNwYW4+ + PC90c3Bhbj48L3RleHQ+PC9nPjwvZz48ZyBjbGFzcz0iY29tLnN1bi5zdGFyLmRyYXdpbmcu + VGV4dFNoYXBlIiBpZD0iZzM3MiI+PGcgaWQ9ImlkNyI+PHJlY3QgY2xhc3M9IkJvdW5kaW5n + Qm94IiBzdHJva2U9Im5vbmUiIGZpbGw9Im5vbmUiIHg9IjEwMCIgeT0iMzA3NSIgd2lkdGg9 + Ijg5MDEiIGhlaWdodD0iNzI2IiBpZD0icmVjdDMwNSIvPjxkZXNjIGlkPSJkZXNjMzA3Ij4x + NTA8L2Rlc2M+PGRlc2MgaWQ9ImRlc2MzMDkiPjUxMjogWFRFWFRfUEFJTlRTSEFQRV9CRUdJ + TjwvZGVzYz48dGV4dCBjbGFzcz0iVGV4dFNoYXBlIiBpZD0idGV4dDM2OSI+PGRlc2MgY2xh + c3M9IlBhcmFncmFwaCIgaWQ9ImRlc2MzMTEiLz48dHNwYW4gY2xhc3M9IlRleHRQYXJhZ3Jh + cGgiIGZvbnQtZmFtaWx5PSJMaWJlcmF0aW9uIFNhbnMsIHNhbnMtc2VyaWYiIGZvbnQtc2l6 + ZT0iNDIzcHgiIGZvbnQtd2VpZ2h0PSI0MDAiIGlkPSJ0c3BhbjM2NyI+PGRlc2MgaWQ9ImRl + c2MzMTMiPjEzODwvZGVzYz48ZGVzYyBpZD0iZGVzYzMxNSI+MTM2PC9kZXNjPjxkZXNjIGlk + PSJkZXNjMzE3Ij4xMzU8L2Rlc2M+PGRlc2MgaWQ9ImRlc2MzMTkiPjEzNDwvZGVzYz48ZGVz + YyBpZD0iZGVzYzMyMSI+MTEzPC9kZXNjPjxkZXNjIGNsYXNzPSJUZXh0UG9ydGlvbiIgaWQ9 + ImRlc2MzMjMiPnR5cGU6IFRleHQ7IGNvbnRlbnQ6IEZhcm1lcjsgPC9kZXNjPjx0c3BhbiBj + bGFzcz0iVGV4dFBvc2l0aW9uIiB4PSIzNTAiIHk9IjM1ODUiIGlkPSJ0c3BhbjM2NSI+PHRz + cGFuIGZpbGw9InJnYigwLDAsMCkiIHN0cm9rZT0ibm9uZSIgaWQ9InRzcGFuMzI1Ij5GYXJt + ZXI8L3RzcGFuPjxkZXNjIGlkPSJkZXNjMzI3Ij41MTI6IFhURVhUX0VPQzwvZGVzYz48ZGVz + YyBpZD0iZGVzYzMyOSI+NTEyOiBYVEVYVF9FT0M8L2Rlc2M+PGRlc2MgaWQ9ImRlc2MzMzEi + PjUxMjogWFRFWFRfRU9XPC9kZXNjPjxkZXNjIGlkPSJkZXNjMzMzIj41MTI6IFhURVhUX0VP + QzwvZGVzYz48ZGVzYyBpZD0iZGVzYzMzNSI+NTEyOiBYVEVYVF9FT0M8L2Rlc2M+PGRlc2Mg + aWQ9ImRlc2MzMzciPjUxMjogWFRFWFRfRU9DPC9kZXNjPjxkZXNjIGlkPSJkZXNjMzM5Ij41 + MTI6IFhURVhUX0VPQzwvZGVzYz48ZGVzYyBpZD0iZGVzYzM0MSI+NTEyOiBYVEVYVF9FT0M8 + L2Rlc2M+PGRlc2MgaWQ9ImRlc2MzNDMiPjUxMjogWFRFWFRfRU9DPC9kZXNjPjxkZXNjIGlk + PSJkZXNjMzQ1Ij41MTI6IFhURVhUX0VPQzwvZGVzYz48ZGVzYyBpZD0iZGVzYzM0NyI+NTEy + OiBYVEVYVF9FT0M8L2Rlc2M+PGRlc2MgaWQ9ImRlc2MzNDkiPjUxMjogWFRFWFRfRU9DPC9k + ZXNjPjxkZXNjIGlkPSJkZXNjMzUxIj41MTI6IFhURVhUX0VPQzwvZGVzYz48ZGVzYyBpZD0i + ZGVzYzM1MyI+NTEyOiBYVEVYVF9FT0M8L2Rlc2M+PGRlc2MgaWQ9ImRlc2MzNTUiPjUxMjog + WFRFWFRfRU9DPC9kZXNjPjxkZXNjIGlkPSJkZXNjMzU3Ij41MTI6IFhURVhUX0VPVzwvZGVz + Yz48ZGVzYyBpZD0iZGVzYzM1OSI+NTEyOiBYVEVYVF9FT0w8L2Rlc2M+PGRlc2MgaWQ9ImRl + c2MzNjEiPjUxMjogWFRFWFRfRU9QPC9kZXNjPjxkZXNjIGlkPSJkZXNjMzYzIj41MTI6IFhU + RVhUX1BBSU5UU0hBUEVfRU5EPC9kZXNjPjwvdHNwYW4+PC90c3Bhbj48L3RleHQ+PC9nPjwv + Zz48ZyBjbGFzcz0iY29tLnN1bi5zdGFyLmRyYXdpbmcuVGV4dFNoYXBlIiBpZD0iZzQzNSI+ + PGcgaWQ9ImlkOCI+PHJlY3QgY2xhc3M9IkJvdW5kaW5nQm94IiBzdHJva2U9Im5vbmUiIGZp + bGw9Im5vbmUiIHg9IjEwMCIgeT0iMzY2MCIgd2lkdGg9Ijg5MDEiIGhlaWdodD0iNzI2IiBp + ZD0icmVjdDM3NCIvPjxkZXNjIGlkPSJkZXNjMzc2Ij4xNTA8L2Rlc2M+PGRlc2MgaWQ9ImRl + c2MzNzgiPjUxMjogWFRFWFRfUEFJTlRTSEFQRV9CRUdJTjwvZGVzYz48dGV4dCBjbGFzcz0i + VGV4dFNoYXBlIiBpZD0idGV4dDQzMiI+PGRlc2MgY2xhc3M9IlBhcmFncmFwaCIgaWQ9ImRl + c2MzODAiLz48dHNwYW4gY2xhc3M9IlRleHRQYXJhZ3JhcGgiIGZvbnQtZmFtaWx5PSJMaWJl + cmF0aW9uIFNhbnMsIHNhbnMtc2VyaWYiIGZvbnQtc2l6ZT0iNDIzcHgiIGZvbnQtd2VpZ2h0 + PSI0MDAiIGlkPSJ0c3BhbjQzMCI+PGRlc2MgaWQ9ImRlc2MzODIiPjEzODwvZGVzYz48ZGVz + YyBpZD0iZGVzYzM4NCI+MTM2PC9kZXNjPjxkZXNjIGlkPSJkZXNjMzg2Ij4xMzU8L2Rlc2M+ + PGRlc2MgaWQ9ImRlc2MzODgiPjEzNDwvZGVzYz48ZGVzYyBpZD0iZGVzYzM5MCI+MTEzPC9k + ZXNjPjxkZXNjIGNsYXNzPSJUZXh0UG9ydGlvbiIgaWQ9ImRlc2MzOTIiPnR5cGU6IFRleHQ7 + IGNvbnRlbnQ6IDsgPC9kZXNjPjx0c3BhbiBjbGFzcz0iVGV4dFBvc2l0aW9uIiB4PSIzNTAi + IHk9IjQxNzAiIGlkPSJ0c3BhbjQyOCI+PHRzcGFuIGZpbGw9InJnYigwLDAsMCkiIHN0cm9r + ZT0ibm9uZSIgaWQ9InRzcGFuMzk0Ij48L3RzcGFuPjxkZXNjIGlkPSJkZXNjMzk2Ij41MTI6 + IFhURVhUX0VPQzwvZGVzYz48ZGVzYyBpZD0iZGVzYzM5OCI+NTEyOiBYVEVYVF9FT0M8L2Rl + c2M+PGRlc2MgaWQ9ImRlc2M0MDAiPjUxMjogWFRFWFRfRU9XPC9kZXNjPjxkZXNjIGlkPSJk + ZXNjNDAyIj41MTI6IFhURVhUX0VPQzwvZGVzYz48ZGVzYyBpZD0iZGVzYzQwNCI+NTEyOiBY + VEVYVF9FT0M8L2Rlc2M+PGRlc2MgaWQ9ImRlc2M0MDYiPjUxMjogWFRFWFRfRU9DPC9kZXNj + PjxkZXNjIGlkPSJkZXNjNDA4Ij41MTI6IFhURVhUX0VPQzwvZGVzYz48ZGVzYyBpZD0iZGVz + YzQxMCI+NTEyOiBYVEVYVF9FT0M8L2Rlc2M+PGRlc2MgaWQ9ImRlc2M0MTIiPjUxMjogWFRF + WFRfRU9DPC9kZXNjPjxkZXNjIGlkPSJkZXNjNDE0Ij41MTI6IFhURVhUX0VPQzwvZGVzYz48 + ZGVzYyBpZD0iZGVzYzQxNiI+NTEyOiBYVEVYVF9FT0M8L2Rlc2M+PGRlc2MgaWQ9ImRlc2M0 + MTgiPjUxMjogWFRFWFRfRU9DPC9kZXNjPjxkZXNjIGlkPSJkZXNjNDIwIj41MTI6IFhURVhU + X0VPVzwvZGVzYz48ZGVzYyBpZD0iZGVzYzQyMiI+NTEyOiBYVEVYVF9FT0w8L2Rlc2M+PGRl + c2MgaWQ9ImRlc2M0MjQiPjUxMjogWFRFWFRfRU9QPC9kZXNjPjxkZXNjIGlkPSJkZXNjNDI2 + Ij41MTI6IFhURVhUX1BBSU5UU0hBUEVfRU5EPC9kZXNjPjwvdHNwYW4+PC90c3Bhbj48L3Rl + eHQ+PC9nPjwvZz48ZyBjbGFzcz0iY29tLnN1bi5zdGFyLmRyYXdpbmcuVGV4dFNoYXBlIiBp + ZD0iZzQ4OCI+PGcgaWQ9ImlkOSI+PHJlY3QgY2xhc3M9IkJvdW5kaW5nQm94IiBzdHJva2U9 + Im5vbmUiIGZpbGw9Im5vbmUiIHg9IjQ4MDAiIHk9IjAiIHdpZHRoPSI0MjAxIiBoZWlnaHQ9 + IjcyNiIgaWQ9InJlY3Q0MzciLz48ZGVzYyBpZD0iZGVzYzQzOSI+MTUwPC9kZXNjPjxkZXNj + IGlkPSJkZXNjNDQxIj41MTI6IFhURVhUX1BBSU5UU0hBUEVfQkVHSU48L2Rlc2M+PHRleHQg + Y2xhc3M9IlRleHRTaGFwZSIgaWQ9InRleHQ0ODUiPjxkZXNjIGNsYXNzPSJQYXJhZ3JhcGgi + IGlkPSJkZXNjNDQzIi8+PHRzcGFuIGNsYXNzPSJUZXh0UGFyYWdyYXBoIiBmb250LWZhbWls + eT0iTGliZXJhdGlvbiBTYW5zLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjQyM3B4IiBmb250 + LXdlaWdodD0iNDAwIiBpZD0idHNwYW40ODMiPjxkZXNjIGlkPSJkZXNjNDQ1Ij4xMzg8L2Rl + c2M+PGRlc2MgaWQ9ImRlc2M0NDciPjEzNjwvZGVzYz48ZGVzYyBpZD0iZGVzYzQ0OSI+MTM1 + PC9kZXNjPjxkZXNjIGlkPSJkZXNjNDUxIj4xMzQ8L2Rlc2M+PGRlc2MgaWQ9ImRlc2M0NTMi + PjExMzwvZGVzYz48ZGVzYyBjbGFzcz0iVGV4dFBvcnRpb24iIGlkPSJkZXNjNDU1Ij50eXBl + OiBUZXh0OyBjb250ZW50OiA7IDwvZGVzYz48dHNwYW4gY2xhc3M9IlRleHRQb3NpdGlvbiIg + eD0iNzQxNyIgeT0iNTEwIiBpZD0idHNwYW40ODEiPjx0c3BhbiBmaWxsPSJyZ2IoMCwwLDAp + IiBzdHJva2U9Im5vbmUiIGlkPSJ0c3BhbjQ1NyI+PC90c3Bhbj48ZGVzYyBpZD0iZGVzYzQ1 + OSI+NTEyOiBYVEVYVF9FT0M8L2Rlc2M+PGRlc2MgaWQ9ImRlc2M0NjEiPjUxMjogWFRFWFRf + RU9DPC9kZXNjPjxkZXNjIGlkPSJkZXNjNDYzIj41MTI6IFhURVhUX0VPVzwvZGVzYz48ZGVz + YyBpZD0iZGVzYzQ2NSI+NTEyOiBYVEVYVF9FT0M8L2Rlc2M+PGRlc2MgaWQ9ImRlc2M0Njci + PjUxMjogWFRFWFRfRU9DPC9kZXNjPjxkZXNjIGlkPSJkZXNjNDY5Ij41MTI6IFhURVhUX0VP + QzwvZGVzYz48ZGVzYyBpZD0iZGVzYzQ3MSI+NTEyOiBYVEVYVF9FT0M8L2Rlc2M+PGRlc2Mg + aWQ9ImRlc2M0NzMiPjUxMjogWFRFWFRfRU9XPC9kZXNjPjxkZXNjIGlkPSJkZXNjNDc1Ij41 + MTI6IFhURVhUX0VPTDwvZGVzYz48ZGVzYyBpZD0iZGVzYzQ3NyI+NTEyOiBYVEVYVF9FT1A8 + L2Rlc2M+PGRlc2MgaWQ9ImRlc2M0NzkiPjUxMjogWFRFWFRfUEFJTlRTSEFQRV9FTkQ8L2Rl + c2M+PC90c3Bhbj48L3RzcGFuPjwvdGV4dD48L2c+PC9nPjxnIGNsYXNzPSJjb20uc3VuLnN0 + YXIuZHJhd2luZy5UZXh0U2hhcGUiIGlkPSJnNTY3Ij48ZyBpZD0iaWQxMCI+PHJlY3QgY2xh + c3M9IkJvdW5kaW5nQm94IiBzdHJva2U9Im5vbmUiIGZpbGw9Im5vbmUiIHg9IjAiIHk9IjEi + IHdpZHRoPSI5MDAxIiBoZWlnaHQ9IjcyNiIgaWQ9InJlY3Q0OTAiLz48ZGVzYyBpZD0iZGVz + YzQ5MiI+MTUwPC9kZXNjPjxkZXNjIGlkPSJkZXNjNDk0Ij41MTI6IFhURVhUX1BBSU5UU0hB + UEVfQkVHSU48L2Rlc2M+PHRleHQgY2xhc3M9IlRleHRTaGFwZSIgaWQ9InRleHQ1NjQiPjxk + ZXNjIGNsYXNzPSJQYXJhZ3JhcGgiIGlkPSJkZXNjNDk2Ii8+PHRzcGFuIGNsYXNzPSJUZXh0 + UGFyYWdyYXBoIiBmb250LWZhbWlseT0iTGliZXJhdGlvbiBTYW5zLCBzYW5zLXNlcmlmIiBm + b250LXNpemU9IjQyM3B4IiBmb250LXdlaWdodD0iNzAwIiBpZD0idHNwYW41NjIiPjxkZXNj + IGlkPSJkZXNjNDk4Ij4xMzg8L2Rlc2M+PGRlc2MgaWQ9ImRlc2M1MDAiPjEzNjwvZGVzYz48 + ZGVzYyBpZD0iZGVzYzUwMiI+MTM1PC9kZXNjPjxkZXNjIGlkPSJkZXNjNTA0Ij4xMzQ8L2Rl + c2M+PGRlc2MgaWQ9ImRlc2M1MDYiPjExMzwvZGVzYz48ZGVzYyBjbGFzcz0iVGV4dFBvcnRp + b24iIGlkPSJkZXNjNTA4Ij50eXBlOiBUZXh0OyBjb250ZW50OiA7IDwvZGVzYz48dHNwYW4g + Y2xhc3M9IlRleHRQb3NpdGlvbiIgeD0iMjE4MCIgeT0iNTExIiBpZD0idHNwYW41NjAiPjx0 + c3BhbiBmaWxsPSJyZ2IoMjM5LDY1LDYxKSIgc3Ryb2tlPSJub25lIiBpZD0idHNwYW41MTAi + PjwvdHNwYW4+PGRlc2MgaWQ9ImRlc2M1MTIiPjUxMjogWFRFWFRfRU9DPC9kZXNjPjxkZXNj + IGlkPSJkZXNjNTE0Ij41MTI6IFhURVhUX0VPQzwvZGVzYz48ZGVzYyBpZD0iZGVzYzUxNiI+ + NTEyOiBYVEVYVF9FT1c8L2Rlc2M+PGRlc2MgaWQ9ImRlc2M1MTgiPjUxMjogWFRFWFRfRU9D + PC9kZXNjPjxkZXNjIGlkPSJkZXNjNTIwIj41MTI6IFhURVhUX0VPQzwvZGVzYz48ZGVzYyBp + ZD0iZGVzYzUyMiI+NTEyOiBYVEVYVF9FT0M8L2Rlc2M+PGRlc2MgaWQ9ImRlc2M1MjQiPjUx + MjogWFRFWFRfRU9DPC9kZXNjPjxkZXNjIGlkPSJkZXNjNTI2Ij41MTI6IFhURVhUX0VPQzwv + ZGVzYz48ZGVzYyBpZD0iZGVzYzUyOCI+NTEyOiBYVEVYVF9FT0M8L2Rlc2M+PGRlc2MgaWQ9 + ImRlc2M1MzAiPjUxMjogWFRFWFRfRU9DPC9kZXNjPjxkZXNjIGlkPSJkZXNjNTMyIj41MTI6 + IFhURVhUX0VPQzwvZGVzYz48ZGVzYyBpZD0iZGVzYzUzNCI+NTEyOiBYVEVYVF9FT0M8L2Rl + c2M+PGRlc2MgaWQ9ImRlc2M1MzYiPjUxMjogWFRFWFRfRU9DPC9kZXNjPjxkZXNjIGlkPSJk + ZXNjNTM4Ij41MTI6IFhURVhUX0VPQzwvZGVzYz48ZGVzYyBpZD0iZGVzYzU0MCI+NTEyOiBY + VEVYVF9FT0M8L2Rlc2M+PGRlc2MgaWQ9ImRlc2M1NDIiPjUxMjogWFRFWFRfRU9DPC9kZXNj + PjxkZXNjIGlkPSJkZXNjNTQ0Ij41MTI6IFhURVhUX0VPQzwvZGVzYz48ZGVzYyBpZD0iZGVz + YzU0NiI+NTEyOiBYVEVYVF9FT0M8L2Rlc2M+PGRlc2MgaWQ9ImRlc2M1NDgiPjUxMjogWFRF + WFRfRU9DPC9kZXNjPjxkZXNjIGlkPSJkZXNjNTUwIj41MTI6IFhURVhUX0VPQzwvZGVzYz48 + ZGVzYyBpZD0iZGVzYzU1MiI+NTEyOiBYVEVYVF9FT1c8L2Rlc2M+PGRlc2MgaWQ9ImRlc2M1 + NTQiPjUxMjogWFRFWFRfRU9MPC9kZXNjPjxkZXNjIGlkPSJkZXNjNTU2Ij41MTI6IFhURVhU + X0VPUDwvZGVzYz48ZGVzYyBpZD0iZGVzYzU1OCI+NTEyOiBYVEVYVF9QQUlOVFNIQVBFX0VO + RDwvZGVzYz48L3RzcGFuPjwvdHNwYW4+PC90ZXh0PjwvZz48L2c+PC9nPjwvZz48L2c+PC9n + PjwvZz48L3N2Zz4= + + + + + iVBORw0KGgoAAAANSUhEUgAAAVQAAACqCAYAAADyfbdoAAAACXBIWXMAAA7CAAAOwgEVKEqA + AAATfklEQVR4nO3dd1hUV/7H8Xun0Is9FgSUJKi4dsS+saxGFE2iRMWOXTcq9hQ7KIFYWVEi + UWOJJWpcNRpr/MWusZfVxACajS122kiZ+Xl0xxCWLGXOiJr363nmeZzDnXu/4x+f58y9p+hM + JpMCALCcrrALAICXBYEKAJIQqAAgCYEKAJIQqAAgCYEKAJIQqAAgCYEKAJIQqAAgCYEKAJIQ + qAAgCYEKAJIQqAAgCYEKAJIQqAAgCYEKAJIQqAAgCYEKAJIQqAAgCYEKAJIQqAAgCYEKAJIQ + qAAgCYEKAJIQqAAgCYEKAJIQqAAgCYEKAJIQqAAgCYEKAJIQqAAgCYEKAJIQqAAgCYEKAJIQ + qAAgCYEKAJIQqAAgCYEKAJIQqAAgCYEKAJIQqAAgCYEKAJIQqAAgCYEKAJIQqAAgCYEKAJIQ + qAAgCYEKAJIQqAAgCYEKAJIQqAAgSb4D1Wg0asQra5tWq81UVdVkaTE5nVuj0RjFy9JzA4C1 + 5TtQz5w585cGDRocSElJcTC31a1b98h3333XxNbW9mFBCzEYDHYNGzbcf/z48VrmNicnp6SD + Bw/Wr1q16tmCnhcAnpV8B2r16tVPLV26tEdgYOCXJpNJFW1HjhypO2zYsDkLFiwYWNBChg4d + OjdrmIoe72effdaHMAXwoijQPdQOHTqsGzVq1CeRkZGjzW0xMTEDRE81ODh4UX7Pt3Llyi4L + Fy7sl7VtzJgxEe++++6agtQHAIWhwA+lwsPDx507d85ny5Yt/ua2IUOGzBM92Nq1ax/L63ku + XrzoPWDAgJisbc2bN98VFhb2YUFrA4DCUOBAFQ+Kli9f3k30Si9duvSqaBP3QUXv9fvvv69T + okSJW7mdIzk52fGdd95Zn5iY6Gxu8/DwuLxq1arO4kFXQWsDgMJg0bCpokWL3t20aVNAvXr1 + Dt2/f99VtF2+fNkjKCjoi61bt7bOLRQHDRo0//z581XM7+3s7Azr1q3rkJcwBoDnjcXjUCtV + qnTh888/7yl6muYhTzt27PhbaGjoRxMnTpz8R5+bP3/+oGXLlnXP3paf2wUA8DyRMrC/ffv2 + /xw/fvzUyZMnTzS3TZkyZYKvr+9Rf3//LdmPP3XqVPWRI0fOyNoWEhIyq1evXktk1AMAhUHa + TCnRGxUPqdauXdtRvBe91W7dui0X91MrVqwYZz7u3r17RURvNjU11d7cJsaffvzxx2Nl1QIA + hUFaoIpxo4sXL+594cKFSmfPnq0q2u7evVtUhOeBAwcaODg4pIhxq3369PksLi6uovlz5cuX + /3n9+vXv6PX6dFm1AEBhkDqXX8xs2rhxYzvxU//27dvFRZv4eS+GRYn7pTNmzBgpwtN8vHgI + JXq0pUqVuimzDgAoDNIXR6lQoUK8CM+AgIBNmZmZWtEmhle5uLg8yD54f968eUPEsCvZNQBA + YbDKalOtW7feKgbmjxs3LtzcFh0dPTjrMYMHD44uyKwqAHheWW35PjF19OTJkzXEIP3sf6tf + v/7BWbNmhVjr2gBQGKwWqOIh1aRHVq9e3cm8iIpZx44d19rY2KRZ69oAUBisFqhiGmr37t2X + ZQ9TQdwK8PPzOyyGS1nr+gDwrFktUPv37//p0aNHfc3vxdx/80yq9PR0vZieeuzYsdpMMwXw + srBKoIrhUVmnlTo6OiZv27atleixxsfHVxBtV65cce/UqdPq7du3t2QhFAAvA+mBumvXruZZ + n+4LYo6++Hkv7qc2atRoX1pamo1o3717dzMxZXXatGkfyK4DAJ41qYGakJDg2blz51UZGRlP + zytW4hc9U/FvMeA/IiJizPDhw2eb/y7WVRULoohl/2TWAgDPmrRATUpKcmrXrt3GW7dulTC3 + iQdPWVf1F8RWKfv27WtknvMvHlr17t17cZUqVc5Xrlz5X7LqAYBnTUqgmufoiw38zG1iOqkI + zZyGRy1atChYHCtW6xfvxQLTYs6/2JvK2dk5UUZNAPCsSQlUMStqzZo175rfiyf64qGUm5vb + v3M6XoSmOF4sTG1edUosqiJGBoj9pWTUBADPmsWBKp7eiwH8WdvE4tItW7bc/r8+V61atdNi + ttTAgQMXmNvErCoxi0rcd7W0LgB41iwKVPGTXQx9Mi+CIrRt23Zz9qf8f0SsQiWW9hPbUpvb + xG6qNWvWPNG4ceO9ltQGAM9agQPVfN/TvJeU4OnpmbBkyZJeYtppXs8jFk0Ri1Cb95YSg/7F + 9tFi0H/ZsmWvFrQ+AHjWChSoYsaTmOmU0wZ7xYsXv52fc4lB/+J+qhgRIHZBFW3Xr18vHRgY + +OW3337blDn/AF4UBQrUjz76KHTz5s1ts7aJnmatWrWOF+R8Pj4+58RaqSKkzW3iVsD7778/ + Xcy6Ksg5AeBZy3egihX3xWD8rG3i6bwYS2pJIV26dFm5c+fOFmJIlblt5syZI2rUqHHSPDEA + AJ5n+QrU06dPV+vRo8fSrCtIVa9e/dTs2bOHyyhGrOB/4sSJmuJlbhMLUYuer+jFyrgGAFhL + vgJVPCQSoZq1rWTJkr/a29unyihG3IcV903N+1GZubq63pdxfgCwpnwFqlhqz9rL7YnwJEAB + vIisth4qAPzZEKgAIAmBCgCSEKgAIAmBCgCS6D799NP+4lXYhQDAi0539erVsmIhksIuBABe + dDoxbTQgIGBTYRcCAC86nZj9xDJ5AGA5HkoBgCQEKgBIQqACgCQEKgBIQqACgCQEKgBIQqAC + gCQEKgBIYlmgGuP0M5tUXjdyf1qAeKuvHXb61OEPmlTWKrmvuJ++32GEd/Nvt3c9cOTk1FrD + HhVitKiWp5I0X7xdMrbrBkPvx29VjaJ3cE0t5VH1Sv1WnXcMCQmOeqO83Q9yrgUAv7EsUDVl + MjrO3jq+2j1D1HdT3x4enqy4SarLYjrvvj/FRncd5qExpaQn33JIOLW76prY0T1bLF0eNHbN + xn6hzUp8pSqKqbDrBPDysPAnv73JvU6zU+5KqnonRhOoxD8/gao6VUiu+9c39j3tLbcJ/Lrv + kF4xoW1bLZvcdei8GqdWnAsspV4s5DIBvESsdw/V8IP92kljRk37Yk/vf914WM6+TNUbTbuP + XxU5vl1oRRvlgfkwrXpb3T21fUhI1I4RPyY6FKvQOPjQJ4umDw5w0/5LSd/j8J6X/95zI3dt + Hn4z7OEHi/5v0KV7NiXcG/c9NHPR9EFt3TQX8lOS6up37/3okWO/qh22d+6K+K4dQipO1Ihe + al5qTbts+/W00UMnL9nZ/8y1h+WdPHx/aT/s4wURg/3mFlOVh5L/9wC8gKwTqKY72i3vtZoS + tLFiz3Exu0d8Wct1/90jMTWGD3h3TpuUHUW/n9F4kOOTA5Vba8f/bbb/eztidk0LsI3/suz7 + fcKi+k98Y8qlz/y7OD4qT6fLyDwfNbbbujGzovdcqentcGVl6X7Nem/oN+mNKT/Ftg5yUJSM + fH3hym3j2nhPOTNr3+F6SSEVdS6mO8bca000fjum1QcdlrgMHTD/m3ErGxTZfn1XRKNBQ/1n + dNUf03zd3zNCw+0D4E/PKoFqurH+lagvrnX2nbozZtJbXiseh417WMKck1terT8/ZtSOyY3D + 3rJVbipKpnqnVNDd6IiuYz01SrLyl1dPjAiY1+ztkydaJGT6O/ooarqqGJWk13v9HNGv9rwS + qmJQvALje7QcsW3t8eOt4jNbO/rk5QFYVtpy6R7ltFfTb1x/7ZZRsXW+ud4lt1rbGzakzl4U + 19NnzPHPZnSpulA8QPMKjkqYc3yX95tzYnudDA5dWEun3LHG/yWAF4dVAjX93DHP0+nlXDr7 + uR/9reemN/n41jjuEHHG4WRchtdblUWgak3ufn6n3DRK6pNjNEqRYq531dRkm1STohWnEse4 + Vat6obiqpD05RlVcXF3uZzkmn4yq0fjoQjqd8dGXN+Wl1jZ3jySdMLgV6fCG997fRiPYm+r+ + te4+m9jDfz/6q8mtVhmVQAX+5KzTQ0184JCoOGtcnDVJWds1js4GByXJmJhkevKL/1E46m30 + aVmPUVU1209nVdHpdenZmgouI87mYlymp2MDj2slNYohL7UaEx8YEzMuO/yjufOX89Usw7uM + GZo05S+ZN24ZiytlCpDtAF4qBQhUo5r48+myJ68XKVfH1/OY/aPf7U97fXp9pujBqS6uKc5K + ovFBotFJydKJzEx6YJ+suGhcnTWJEr9DvhiOrPPZdNm+cqPx9VbZPao1PQ+1ajKKJLvoKyZ3 + Xrlh1LAq2v2/O6Fqayrhqf33s/4eAJ4/BQjUNOVgqP/QNpve7PbVhUUN27ooCUrGDzbnf8j0 + sq/ieb20VknV+/jG17BZdP/wkZ/rGBtW3PTkp3S6eubQ8TqpResl1fbSXpL/VXJnuru36KRh + C8ITPIJvL3in1FoxDjUvtepSfR/Wslt0N+FOsWLelcpcNI9fNd5OKBKvlLUtYaskF8b3AfB8 + KUCg2pmaBPdeXfnzyL5DgsrH3ulXY0HK9vAGURfK1u0U2bK/k3jSVOrtm0O7h65oFzG4//TK + M870rOZw8Pq+qLrDYq78verQZaubOyhXlXTFVv7X+Y0pKd7xyP/taXRDoyQbDXfsrpze5bN8 + /pK+e+7XeGXC5rBuTZ2VX8RxealVdWhvGto7dJn/hF4jppScfrV77RL70uJ3uc0NCQlbU3pm + xvGNwe3dNYQq8GdXoHuodn4TTny1Iq3H3yfMDx0Y+GCFXfl6VzvFbBz3yZuuqx/33tQima1m + fTPlC9dRKaF960dOuZle1ql8rautx26MjRhdJ8Lu8W0C68q4GOvVq3nsZnHDVdXojc6lX79Z + 980JOzZ+ODTCv6L92acH5qlWZ6VpxDfTvywyJmnKsOaTw39JdtcWf/Vevbemb94yvfd4whSA + UMCHUrYmrw6RX2999PrDQ+xeS+0Q/s+pHcKVqTn+Xd8wZWacwS9bo6l+5I+hhkgl9Mn7hkru + x2TnZAz6KjU4SFGC8/ptcq1VsPE0tJ20JrLtJCUyz+cF8KfCalMAIAmBCgCSEKgAIAmBCgCS + EKgAIAmBCgCSEKgAIAmBCgCSFDBQs22El53e1zD99MGW4ypp91pQGwC8UCzqoepeD46Lieoy + 4r+mXmpcja+5a89YVBkAvGAsClTV2SupfvMWe/K0bXReZWZoMzQ6k06Vta30c3ItAC89q99D + zfj3trLhoyeHLtl52v/KvYzijuWqX3tzYPjiOWOaTi+lUQxK2k7HQZ4BB34cvX5Tm91DPCfs + ft1/1g9j3zxVv838cyFbtvT9aYL+oxVH+1w1lbFp0G/usqWjnD5eNnh4WNT2i+3uO1ZKaz9p + SWTswOqzHu8tldtGejldK35rk76l1LO5fxMA+N+sG6jGK/rY4MCZYdc614jZsLBbg9KahJsH + 5/oOHhA4e5D7+V/XBpWap6o2Jhu9MT3h80/a7es4a/O2id6tvIreij8nNueLntbl8MeLQ8/M + fsXtckynLk2G9533t70N6naL3DYlYZWu3/eTWw9rMWrc+83f2vJNn9JJ53LdSC/Ha6lxVv0/ + APCnYVmgGtM0KUlJjkna3y/Hp6p6k52jbYpWUyaj67Kz7/lrSmrcS9rfEH97tcKoK92jFwdN + 33msaXpQ62gbRatotZnGn50DHu74oP20CholSUnf76AqJiXZp0f8hLe9Vjo+6l1W7txxa92R + 2+5dqB9ydnTjV7bYPLq6X+eATd6fLBx18kLG6ybdhpu5bqSnaA3/dS0AkMSiQE0/MblqnSKT + f8nerine++amq4tq+tvorqk395SYOW5W6PoDF/567f7DYhkmkyrWKHX0SN1iero7lMZUtnbt + c24aJSXLWUzlKntfclWVx/tJqY5OBidVl+5V6bUf9P9ZMf9xm5KamWow2WWcO+KZ60Z6JZRL + OV8LACxn2VP+Sv1/WhLTfYhHtqf8qv6V9Cp65ZaSuMN1VEDfFWsrjDMsPbSrRbPXip21U66o + c5u+tuYDRbH57RMaxdHJMfn3e++pik6nzfjt7ZPN+37X9p88Fn8wis32cttI70mg5nAtALCc + ZU/5HT2SazVsdOiPnvKnf7+x9tdXy1fssWJ8T39v/cnHjRm37X69YyyqlM021EpVTDmcIs80 + LvnYSM/CawFATqz6UMpkSLUxqK5qUVfN08BNOby82toLmTVNPqb9/+uz+aXz8U3IdSO9dMVB + 5jUBICurBqqumt9PtWxWPFgdvSG4w4d+CZmnlnlPiLgX0qSF077FP55wP3a9pUed4spNGddS + i7e/letGego9UwDWY9VA1ZTr+cucfxwZ2evDnuE1l9ied/frfGxC9NyR/pcdHPd3mbmq3Vu2 + q7/5ttnbcq7mbMx1I71MeqgArKeAgfp0I7xc2Joq9Yxdc+jR63fNVaKUs/eiXjG/rZN9I76c + NvCz7fhgTWpHz6xNmgrD4/cahpd52pDbRno5bgwIAHKw2hQASEKgAoAkBCoASEKgAoAkBCoA + SEKgAoAkBCoASEKgAoAkBCoASEKgAoAkBCoASEKgAoAkBCoASEKgAoAkBCoASEKgAoAkBCoA + SEKgAoAkBCoASEKgAoAkBCoASEKgAoAkBCoASEKgAoAkBCoASEKgAoAkBCoASEKgAoAkBCoA + SEKgAoAkBCoASEKgAoAkBCoASEKgAoAk/w/xJdzkzVWshgAAAABJRU5ErkJggg== + + + 140 + + + + + \ No newline at end of file diff --git a/sw/qa/extras/odfexport/data/spellout-numberingtypes.odt b/sw/qa/extras/odfexport/data/spellout-numberingtypes.odt new file mode 100644 index 0000000000..0f07d93f24 Binary files /dev/null and b/sw/qa/extras/odfexport/data/spellout-numberingtypes.odt differ diff --git a/sw/qa/extras/odfexport/data/style-link.fodt b/sw/qa/extras/odfexport/data/style-link.fodt new file mode 100644 index 0000000000..76c36c6988 --- /dev/null +++ b/sw/qa/extras/odfexport/data/style-link.fodt @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/sw/qa/extras/odfexport/data/sw_hatch.odt b/sw/qa/extras/odfexport/data/sw_hatch.odt new file mode 100644 index 0000000000..45e36c6ecc Binary files /dev/null and b/sw/qa/extras/odfexport/data/sw_hatch.odt differ diff --git a/sw/qa/extras/odfexport/data/table-in-frame-in-table-in-header-base.odt b/sw/qa/extras/odfexport/data/table-in-frame-in-table-in-header-base.odt new file mode 100644 index 0000000000..44dbf0bdec Binary files /dev/null and b/sw/qa/extras/odfexport/data/table-in-frame-in-table-in-header-base.odt differ diff --git a/sw/qa/extras/odfexport/data/table_number_format_3.docx b/sw/qa/extras/odfexport/data/table_number_format_3.docx new file mode 100644 index 0000000000..1bb423e455 Binary files /dev/null and b/sw/qa/extras/odfexport/data/table_number_format_3.docx differ diff --git a/sw/qa/extras/odfexport/data/table_styles_1.odt b/sw/qa/extras/odfexport/data/table_styles_1.odt new file mode 100644 index 0000000000..701fd92c2a Binary files /dev/null and b/sw/qa/extras/odfexport/data/table_styles_1.odt differ diff --git a/sw/qa/extras/odfexport/data/table_styles_2.odt b/sw/qa/extras/odfexport/data/table_styles_2.odt new file mode 100644 index 0000000000..735ea44319 Binary files /dev/null and b/sw/qa/extras/odfexport/data/table_styles_2.odt differ diff --git a/sw/qa/extras/odfexport/data/table_styles_3.odt b/sw/qa/extras/odfexport/data/table_styles_3.odt new file mode 100644 index 0000000000..7367864890 Binary files /dev/null and b/sw/qa/extras/odfexport/data/table_styles_3.odt differ diff --git a/sw/qa/extras/odfexport/data/table_styles_4.odt b/sw/qa/extras/odfexport/data/table_styles_4.odt new file mode 100644 index 0000000000..0d96127e3b Binary files /dev/null and b/sw/qa/extras/odfexport/data/table_styles_4.odt differ diff --git a/sw/qa/extras/odfexport/data/table_styles_5.odt b/sw/qa/extras/odfexport/data/table_styles_5.odt new file mode 100644 index 0000000000..c90958322a Binary files /dev/null and b/sw/qa/extras/odfexport/data/table_styles_5.odt differ diff --git a/sw/qa/extras/odfexport/data/tdf100492.odt b/sw/qa/extras/odfexport/data/tdf100492.odt new file mode 100644 index 0000000000..e17bd67c50 Binary files /dev/null and b/sw/qa/extras/odfexport/data/tdf100492.odt differ diff --git a/sw/qa/extras/odfexport/data/tdf101710.odt b/sw/qa/extras/odfexport/data/tdf101710.odt new file mode 100644 index 0000000000..50ab736070 Binary files /dev/null and b/sw/qa/extras/odfexport/data/tdf101710.odt differ diff --git a/sw/qa/extras/odfexport/data/tdf101856.odt b/sw/qa/extras/odfexport/data/tdf101856.odt new file mode 100644 index 0000000000..bddd150228 Binary files /dev/null and b/sw/qa/extras/odfexport/data/tdf101856.odt differ diff --git a/sw/qa/extras/odfexport/data/tdf101856_overlapped.odt b/sw/qa/extras/odfexport/data/tdf101856_overlapped.odt new file mode 100644 index 0000000000..c05df538da Binary files /dev/null and b/sw/qa/extras/odfexport/data/tdf101856_overlapped.odt differ diff --git a/sw/qa/extras/odfexport/data/tdf103091.fodt b/sw/qa/extras/odfexport/data/tdf103091.fodt new file mode 100644 index 0000000000..7b7d35cd46 --- /dev/null +++ b/sw/qa/extras/odfexport/data/tdf103091.fodt @@ -0,0 +1,307 @@ + + + + ms 2017-06-15T21:56:462017-06-15T21:59:44ms P0D1LibreOffice/3.5$Linux_X86_64 LibreOffice_project/3215f89-f603614-ab984f2-7348103-1225a5b + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sw/qa/extras/odfexport/data/tdf103567.odt b/sw/qa/extras/odfexport/data/tdf103567.odt new file mode 100644 index 0000000000..cbd29bd298 Binary files /dev/null and b/sw/qa/extras/odfexport/data/tdf103567.odt differ diff --git a/sw/qa/extras/odfexport/data/tdf104254_noHeaderWrapping.odt b/sw/qa/extras/odfexport/data/tdf104254_noHeaderWrapping.odt new file mode 100644 index 0000000000..06dde4802b Binary files /dev/null and b/sw/qa/extras/odfexport/data/tdf104254_noHeaderWrapping.odt differ diff --git a/sw/qa/extras/odfexport/data/tdf107292.odt b/sw/qa/extras/odfexport/data/tdf107292.odt new file mode 100644 index 0000000000..f35da387f9 Binary files /dev/null and b/sw/qa/extras/odfexport/data/tdf107292.odt differ diff --git a/sw/qa/extras/odfexport/data/tdf107696.odt b/sw/qa/extras/odfexport/data/tdf107696.odt new file mode 100644 index 0000000000..c24100bbdf Binary files /dev/null and b/sw/qa/extras/odfexport/data/tdf107696.odt differ diff --git a/sw/qa/extras/odfexport/data/tdf111891_frameVertStyle.odt b/sw/qa/extras/odfexport/data/tdf111891_frameVertStyle.odt new file mode 100644 index 0000000000..8fcf98a627 Binary files /dev/null and b/sw/qa/extras/odfexport/data/tdf111891_frameVertStyle.odt differ diff --git a/sw/qa/extras/odfexport/data/tdf114287.odt b/sw/qa/extras/odfexport/data/tdf114287.odt new file mode 100644 index 0000000000..a9e9d38e29 Binary files /dev/null and b/sw/qa/extras/odfexport/data/tdf114287.odt differ diff --git a/sw/qa/extras/odfexport/data/tdf115815.odt b/sw/qa/extras/odfexport/data/tdf115815.odt new file mode 100644 index 0000000000..7c2aad0da6 Binary files /dev/null and b/sw/qa/extras/odfexport/data/tdf115815.odt differ diff --git a/sw/qa/extras/odfexport/data/tdf118502.odt b/sw/qa/extras/odfexport/data/tdf118502.odt new file mode 100644 index 0000000000..f006d607ac Binary files /dev/null and b/sw/qa/extras/odfexport/data/tdf118502.odt differ diff --git a/sw/qa/extras/odfexport/data/tdf118637.odt b/sw/qa/extras/odfexport/data/tdf118637.odt new file mode 100644 index 0000000000..c2a8b4f530 Binary files /dev/null and b/sw/qa/extras/odfexport/data/tdf118637.odt differ diff --git a/sw/qa/extras/odfexport/data/tdf121658.odt b/sw/qa/extras/odfexport/data/tdf121658.odt new file mode 100644 index 0000000000..1ab6f75c8d Binary files /dev/null and b/sw/qa/extras/odfexport/data/tdf121658.odt differ diff --git a/sw/qa/extras/odfexport/data/tdf124470TableAndEmbeddedUsedFonts.odt b/sw/qa/extras/odfexport/data/tdf124470TableAndEmbeddedUsedFonts.odt new file mode 100644 index 0000000000..21969e9e54 Binary files /dev/null and b/sw/qa/extras/odfexport/data/tdf124470TableAndEmbeddedUsedFonts.odt differ diff --git a/sw/qa/extras/odfexport/data/tdf128504.docx b/sw/qa/extras/odfexport/data/tdf128504.docx new file mode 100644 index 0000000000..2e6e5225b8 Binary files /dev/null and b/sw/qa/extras/odfexport/data/tdf128504.docx differ diff --git a/sw/qa/extras/odfexport/data/tdf129520.docx b/sw/qa/extras/odfexport/data/tdf129520.docx new file mode 100644 index 0000000000..4f74826ada Binary files /dev/null and b/sw/qa/extras/odfexport/data/tdf129520.docx differ diff --git a/sw/qa/extras/odfexport/data/tdf129568-ui.fodt b/sw/qa/extras/odfexport/data/tdf129568-ui.fodt new file mode 100644 index 0000000000..8958bd6853 --- /dev/null +++ b/sw/qa/extras/odfexport/data/tdf129568-ui.fodt @@ -0,0 +1,368 @@ + + + + 2020-02-03T11:01:15.2025491202020-02-03T11:02:08.562696933PT55S2LibreOffice/6.3.4.2.0$Linux_X86_64 LibreOffice_project/30$Build-2 + + + 0 + 0 + 25137 + 13522 + true + false + + + view2 + 4165 + 2616 + 0 + 0 + 25135 + 13520 + 0 + 1 + false + 100 + false + false + + + + + false + true + true + true + 0 + true + true + + false + false + true + false + false + false + true + true + false + false + false + false + false + false + false + false + false + true + true + false + false + true + 1284982 + false + + false + true + false + false + false + true + false + false + false + true + 1284982 + + true + false + false + true + false + true + true + false + true + false + false + false + 0 + false + true + high-resolution + false + false + false + true + false + false + false + true + true + + true + false + false + true + false + false + false + + true + false + false + 1 + true + false + false + 0 + false + false + + + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sw/qa/extras/odfexport/data/tdf129568.fodt b/sw/qa/extras/odfexport/data/tdf129568.fodt new file mode 100644 index 0000000000..30256a6cd5 --- /dev/null +++ b/sw/qa/extras/odfexport/data/tdf129568.fodt @@ -0,0 +1,368 @@ + + + + 2020-02-03T11:01:15.2025491202020-02-03T11:02:08.562696933PT55S2LibreOffice/6.3.4.2.0$Linux_X86_64 LibreOffice_project/30$Build-2 + + + 0 + 0 + 25137 + 13522 + true + false + + + view2 + 4165 + 2616 + 0 + 0 + 25135 + 13520 + 0 + 1 + false + 100 + false + false + + + + + false + true + true + true + 0 + true + true + + false + false + true + false + false + false + true + true + false + false + false + false + false + false + false + false + false + true + true + false + false + true + 1284982 + false + + false + true + false + false + false + true + false + false + false + true + 1284982 + + true + false + false + true + false + true + true + false + true + false + false + false + 0 + false + true + high-resolution + false + false + false + true + false + false + false + true + true + + true + false + false + true + false + false + false + + true + false + false + 1 + true + false + false + 0 + false + false + + + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sw/qa/extras/odfexport/data/tdf130314.docx b/sw/qa/extras/odfexport/data/tdf130314.docx new file mode 100644 index 0000000000..592ffbf5b3 Binary files /dev/null and b/sw/qa/extras/odfexport/data/tdf130314.docx differ diff --git a/sw/qa/extras/odfexport/data/tdf130950.odt b/sw/qa/extras/odfexport/data/tdf130950.odt new file mode 100644 index 0000000000..a669cb87b5 Binary files /dev/null and b/sw/qa/extras/odfexport/data/tdf130950.odt differ diff --git a/sw/qa/extras/odfexport/data/tdf131025_noZerosInTable.odt b/sw/qa/extras/odfexport/data/tdf131025_noZerosInTable.odt new file mode 100644 index 0000000000..f2bffb050a Binary files /dev/null and b/sw/qa/extras/odfexport/data/tdf131025_noZerosInTable.odt differ diff --git a/sw/qa/extras/odfexport/data/tdf131621.ott b/sw/qa/extras/odfexport/data/tdf131621.ott new file mode 100644 index 0000000000..8590c16ae1 Binary files /dev/null and b/sw/qa/extras/odfexport/data/tdf131621.ott differ diff --git a/sw/qa/extras/odfexport/data/tdf131812.odt b/sw/qa/extras/odfexport/data/tdf131812.odt new file mode 100644 index 0000000000..c2833ff25d Binary files /dev/null and b/sw/qa/extras/odfexport/data/tdf131812.odt differ diff --git a/sw/qa/extras/odfexport/data/tdf132642_keepWithNextTable.odt b/sw/qa/extras/odfexport/data/tdf132642_keepWithNextTable.odt new file mode 100644 index 0000000000..739cd0078a Binary files /dev/null and b/sw/qa/extras/odfexport/data/tdf132642_keepWithNextTable.odt differ diff --git a/sw/qa/extras/odfexport/data/tdf133507_contextualSpacingSection.odt b/sw/qa/extras/odfexport/data/tdf133507_contextualSpacingSection.odt new file mode 100644 index 0000000000..efc1c3f592 Binary files /dev/null and b/sw/qa/extras/odfexport/data/tdf133507_contextualSpacingSection.odt differ diff --git a/sw/qa/extras/odfexport/data/tdf134987.docx b/sw/qa/extras/odfexport/data/tdf134987.docx new file mode 100644 index 0000000000..c828bf442e Binary files /dev/null and b/sw/qa/extras/odfexport/data/tdf134987.docx differ diff --git a/sw/qa/extras/odfexport/data/tdf135144.docx b/sw/qa/extras/odfexport/data/tdf135144.docx new file mode 100644 index 0000000000..012c40432b Binary files /dev/null and b/sw/qa/extras/odfexport/data/tdf135144.docx differ diff --git a/sw/qa/extras/odfexport/data/tdf135338_firstLeftPageFooter.odt b/sw/qa/extras/odfexport/data/tdf135338_firstLeftPageFooter.odt new file mode 100644 index 0000000000..4f98088758 Binary files /dev/null and b/sw/qa/extras/odfexport/data/tdf135338_firstLeftPageFooter.odt differ diff --git a/sw/qa/extras/odfexport/data/tdf136645.odt b/sw/qa/extras/odfexport/data/tdf136645.odt new file mode 100644 index 0000000000..a8487c3173 Binary files /dev/null and b/sw/qa/extras/odfexport/data/tdf136645.odt differ diff --git a/sw/qa/extras/odfexport/data/tdf137199.docx b/sw/qa/extras/odfexport/data/tdf137199.docx new file mode 100644 index 0000000000..25b52977be Binary files /dev/null and b/sw/qa/extras/odfexport/data/tdf137199.docx differ diff --git a/sw/qa/extras/odfexport/data/tdf139126.odt b/sw/qa/extras/odfexport/data/tdf139126.odt new file mode 100644 index 0000000000..0648f0abed Binary files /dev/null and b/sw/qa/extras/odfexport/data/tdf139126.odt differ diff --git a/sw/qa/extras/odfexport/data/tdf140437.odt b/sw/qa/extras/odfexport/data/tdf140437.odt new file mode 100644 index 0000000000..8ed9ee77ce Binary files /dev/null and b/sw/qa/extras/odfexport/data/tdf140437.odt differ diff --git a/sw/qa/extras/odfexport/data/tdf142483.odt b/sw/qa/extras/odfexport/data/tdf142483.odt new file mode 100644 index 0000000000..d6aba2bbd9 Binary files /dev/null and b/sw/qa/extras/odfexport/data/tdf142483.odt differ diff --git a/sw/qa/extras/odfexport/data/tdf143605.odt b/sw/qa/extras/odfexport/data/tdf143605.odt new file mode 100644 index 0000000000..7fb597e6d7 Binary files /dev/null and b/sw/qa/extras/odfexport/data/tdf143605.odt differ diff --git a/sw/qa/extras/odfexport/data/tdf143793_noBodyWrapping.odt b/sw/qa/extras/odfexport/data/tdf143793_noBodyWrapping.odt new file mode 100644 index 0000000000..c2de181f11 Binary files /dev/null and b/sw/qa/extras/odfexport/data/tdf143793_noBodyWrapping.odt differ diff --git a/sw/qa/extras/odfexport/data/tdf144319.odt b/sw/qa/extras/odfexport/data/tdf144319.odt new file mode 100644 index 0000000000..937482c34f Binary files /dev/null and b/sw/qa/extras/odfexport/data/tdf144319.odt differ diff --git a/sw/qa/extras/odfexport/data/tdf145226.fodt b/sw/qa/extras/odfexport/data/tdf145226.fodt new file mode 100644 index 0000000000..426f2621f1 --- /dev/null +++ b/sw/qa/extras/odfexport/data/tdf145226.fodt @@ -0,0 +1,188 @@ + + + 2022-08-09T14:29:03.6767505862022-08-09T14:29:17.977094506PT14S1LibreOfficeDev/7.5.0.0.alpha0$Linux_X86_64 LibreOffice_project/e77bfe281403e49c58730489e94b62032c296e75 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/sw/qa/extras/odfexport/data/tdf145361.odt b/sw/qa/extras/odfexport/data/tdf145361.odt new file mode 100644 index 0000000000..e5a6a03c9c Binary files /dev/null and b/sw/qa/extras/odfexport/data/tdf145361.odt differ diff --git a/sw/qa/extras/odfexport/data/tdf145871.odt b/sw/qa/extras/odfexport/data/tdf145871.odt new file mode 100644 index 0000000000..78677452f5 Binary files /dev/null and b/sw/qa/extras/odfexport/data/tdf145871.odt differ diff --git a/sw/qa/extras/odfexport/data/tdf146264.odt b/sw/qa/extras/odfexport/data/tdf146264.odt new file mode 100644 index 0000000000..941c7db74f Binary files /dev/null and b/sw/qa/extras/odfexport/data/tdf146264.odt differ diff --git a/sw/qa/extras/odfexport/data/tdf149248.odt b/sw/qa/extras/odfexport/data/tdf149248.odt new file mode 100644 index 0000000000..18685bd0a5 Binary files /dev/null and b/sw/qa/extras/odfexport/data/tdf149248.odt differ diff --git a/sw/qa/extras/odfexport/data/tdf149324.odt b/sw/qa/extras/odfexport/data/tdf149324.odt new file mode 100644 index 0000000000..da4b87d89e Binary files /dev/null and b/sw/qa/extras/odfexport/data/tdf149324.odt differ diff --git a/sw/qa/extras/odfexport/data/tdf149420.odt b/sw/qa/extras/odfexport/data/tdf149420.odt new file mode 100644 index 0000000000..249d7267eb Binary files /dev/null and b/sw/qa/extras/odfexport/data/tdf149420.odt differ diff --git a/sw/qa/extras/odfexport/data/tdf150149.fodt b/sw/qa/extras/odfexport/data/tdf150149.fodt new file mode 100644 index 0000000000..51aea046a2 --- /dev/null +++ b/sw/qa/extras/odfexport/data/tdf150149.fodt @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + + + + + + + A + + + B + + + C + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sw/qa/extras/odfexport/data/tdf150394.odt b/sw/qa/extras/odfexport/data/tdf150394.odt new file mode 100644 index 0000000000..e514f405bc Binary files /dev/null and b/sw/qa/extras/odfexport/data/tdf150394.odt differ diff --git a/sw/qa/extras/odfexport/data/tdf151100.docx b/sw/qa/extras/odfexport/data/tdf151100.docx new file mode 100644 index 0000000000..e0341bdb9c Binary files /dev/null and b/sw/qa/extras/odfexport/data/tdf151100.docx differ diff --git a/sw/qa/extras/odfexport/data/tdf152710.odt b/sw/qa/extras/odfexport/data/tdf152710.odt new file mode 100644 index 0000000000..9fadf26458 Binary files /dev/null and b/sw/qa/extras/odfexport/data/tdf152710.odt differ diff --git a/sw/qa/extras/odfexport/data/tdf156905.odt b/sw/qa/extras/odfexport/data/tdf156905.odt new file mode 100644 index 0000000000..41fe7a1d8c Binary files /dev/null and b/sw/qa/extras/odfexport/data/tdf156905.odt differ diff --git a/sw/qa/extras/odfexport/data/tdf43569_conditionalfield.doc b/sw/qa/extras/odfexport/data/tdf43569_conditionalfield.doc new file mode 100644 index 0000000000..456a6ed833 Binary files /dev/null and b/sw/qa/extras/odfexport/data/tdf43569_conditionalfield.doc differ diff --git a/sw/qa/extras/odfexport/data/tdf57317_autoListName.odt b/sw/qa/extras/odfexport/data/tdf57317_autoListName.odt new file mode 100644 index 0000000000..3aafbc5193 Binary files /dev/null and b/sw/qa/extras/odfexport/data/tdf57317_autoListName.odt differ diff --git a/sw/qa/extras/odfexport/data/tdf66305.odt b/sw/qa/extras/odfexport/data/tdf66305.odt new file mode 100644 index 0000000000..4a310a83d4 Binary files /dev/null and b/sw/qa/extras/odfexport/data/tdf66305.odt differ diff --git a/sw/qa/extras/odfexport/data/tdf77961.odt b/sw/qa/extras/odfexport/data/tdf77961.odt new file mode 100644 index 0000000000..a6205e018d Binary files /dev/null and b/sw/qa/extras/odfexport/data/tdf77961.odt differ diff --git a/sw/qa/extras/odfexport/data/tdf92379.fodt b/sw/qa/extras/odfexport/data/tdf92379.fodt new file mode 100644 index 0000000000..762a04d577 --- /dev/null +++ b/sw/qa/extras/odfexport/data/tdf92379.fodt @@ -0,0 +1,89 @@ + + + + ms 2015-08-24T21:49:45.305718699LibreOfficeDev/4.3.7.2$Linux_X86_64 LibreOffice_project/8a35821d8636a03b8bf4e15b48f59794652c68ba + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sw/qa/extras/odfexport/data/tdf95806.docx b/sw/qa/extras/odfexport/data/tdf95806.docx new file mode 100644 index 0000000000..65bfaae3e4 Binary files /dev/null and b/sw/qa/extras/odfexport/data/tdf95806.docx differ diff --git a/sw/qa/extras/odfexport/data/tdf99631.docx b/sw/qa/extras/odfexport/data/tdf99631.docx new file mode 100644 index 0000000000..c72950b724 Binary files /dev/null and b/sw/qa/extras/odfexport/data/tdf99631.docx differ diff --git a/sw/qa/extras/odfexport/data/testTdf52065_centerTabs.odt b/sw/qa/extras/odfexport/data/testTdf52065_centerTabs.odt new file mode 100644 index 0000000000..8cdaf3eb9f Binary files /dev/null and b/sw/qa/extras/odfexport/data/testTdf52065_centerTabs.odt differ diff --git a/sw/qa/extras/odfexport/data/textbox-rounded-corners.odt b/sw/qa/extras/odfexport/data/textbox-rounded-corners.odt new file mode 100644 index 0000000000..add7512c6c Binary files /dev/null and b/sw/qa/extras/odfexport/data/textbox-rounded-corners.odt differ diff --git a/sw/qa/extras/odfexport/data/textframe-gradient.odt b/sw/qa/extras/odfexport/data/textframe-gradient.odt new file mode 100644 index 0000000000..cdcae4fff6 Binary files /dev/null and b/sw/qa/extras/odfexport/data/textframe-gradient.odt differ diff --git a/sw/qa/extras/odfexport/data/textframe-transparent-shadow.odt b/sw/qa/extras/odfexport/data/textframe-transparent-shadow.odt new file mode 100644 index 0000000000..508e853c9d Binary files /dev/null and b/sw/qa/extras/odfexport/data/textframe-transparent-shadow.odt differ diff --git a/sw/qa/extras/odfexport/data/textframe-vertadjust.odt b/sw/qa/extras/odfexport/data/textframe-vertadjust.odt new file mode 100644 index 0000000000..bbf3416c09 Binary files /dev/null and b/sw/qa/extras/odfexport/data/textframe-vertadjust.odt differ diff --git a/sw/qa/extras/odfexport/data/user-field-decl-fly.odt b/sw/qa/extras/odfexport/data/user-field-decl-fly.odt new file mode 100644 index 0000000000..2ffe3ae555 Binary files /dev/null and b/sw/qa/extras/odfexport/data/user-field-decl-fly.odt differ diff --git a/sw/qa/extras/odfexport/data/user-field-decl.odt b/sw/qa/extras/odfexport/data/user-field-decl.odt new file mode 100644 index 0000000000..f037f403ec Binary files /dev/null and b/sw/qa/extras/odfexport/data/user-field-decl.odt differ diff --git a/sw/qa/extras/odfexport/data/userdefattr-tablecell.odt b/sw/qa/extras/odfexport/data/userdefattr-tablecell.odt new file mode 100644 index 0000000000..c8f6dcca5f Binary files /dev/null and b/sw/qa/extras/odfexport/data/userdefattr-tablecell.odt differ diff --git a/sw/qa/extras/odfexport/data/whitespace.odt b/sw/qa/extras/odfexport/data/whitespace.odt new file mode 100644 index 0000000000..fe2b3dd574 Binary files /dev/null and b/sw/qa/extras/odfexport/data/whitespace.odt differ diff --git a/sw/qa/extras/odfexport/odfexport.cxx b/sw/qa/extras/odfexport/odfexport.cxx new file mode 100644 index 0000000000..51cfa15b7b --- /dev/null +++ b/sw/qa/extras/odfexport/odfexport.cxx @@ -0,0 +1,2708 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include // for SwHiddenTextField::ParseIfFieldDefinition() method call +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +class Test : public SwModelTestBase +{ +public: + Test() : SwModelTestBase("/sw/qa/extras/odfexport/data/", "writer8") {} +}; + +CPPUNIT_TEST_FIXTURE(Test, testMathObjectFlatExport) +{ + comphelper::ScopeGuard g([this]() { + mpFilter = "writer8"; + std::shared_ptr pBatch( + comphelper::ConfigurationChanges::create()); + officecfg::Office::Common::Cache::Writer::OLE_Objects::set(20, pBatch); + return pBatch->commit(); + }); + mpFilter = "OpenDocument Text Flat XML"; // doesn't happen with ODF package + std::shared_ptr pBatch( + comphelper::ConfigurationChanges::create()); + officecfg::Office::Common::Cache::Writer::OLE_Objects::set(1, pBatch); + pBatch->commit(); + loadAndReload("2_MathType3.docx"); + + uno::Reference xModifiable(mxComponent, uno::UNO_QUERY); + CPPUNIT_ASSERT(!xModifiable->isModified()); + // see above, set the OLE cache to 1 for this test + // and the problem was that the formulas that were in the cache + // (the second one) were lost + OUString formula1(getFormula(getRun(getParagraph(1), 1))); + CPPUNIT_ASSERT_EQUAL(OUString(" size 12{1+1=2} {}"), formula1); + OUString formula2(getFormula(getRun(getParagraph(2), 1))); + CPPUNIT_ASSERT_EQUAL(OUString(" size 12{2+2=4} {}"), formula2); +} + +DECLARE_ODFEXPORT_TEST(testTdf144319, "tdf144319.odt") +{ + CPPUNIT_ASSERT_EQUAL(7, getShapes()); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + OUString formula1(getFormula(getRun(getParagraph(3), 1))); + CPPUNIT_ASSERT_EQUAL(OUString("{ x = frac { { - b +- sqrt { b ^ 2 - 4 a c } } } { { 2 a } } }"), formula1); + OUString formula2(getFormula(getRun(getParagraph(4), 1))); + CPPUNIT_ASSERT_EQUAL(OUString("{ sum csup n csub { i = 1 } i ^ 3 = left ( frac { { n left ( { n + 1 } right ) } } { 2 } right ) ^ 2 }"), formula2); + OUString formula3(getFormula(getRun(getParagraph(5), 1))); + CPPUNIT_ASSERT_EQUAL(OUString("{ sum ^ n _ { i = 1 } i ^ 3 = left ( frac { { n left ( { n + 1 } right ) } } { 2 } right ) ^ 2 }"), formula3); + OUString formula4(getFormula(getRun(getParagraph(6), 1))); + CPPUNIT_ASSERT_EQUAL(OUString("{ sum ^ n _ { i = 1 } i ^ 3 = left ( frac { { n left ( { n + 1 } right ) } } { 2 } right ) ^ 2 }"), formula4); + + // Without the fix in place, this test would have failed with + // - the property is of unexpected type or void: Model + OUString formula5(getFormula(getRun(getParagraph(7), 1))); + CPPUNIT_ASSERT_EQUAL(OUString("{ y ^ 2 { nitalic m p } = left ( { x ^ 3 + 7 } right ) { nitalic m p } }"), formula5); +} + +static void testTdf43569_CheckIfFieldParse() +{ + { + OUString paramCondition; + OUString paramTrue; + OUString paramFalse; + + SwHiddenTextField::ParseIfFieldDefinition(u"IF A B C", paramCondition, paramTrue, paramFalse); + + CPPUNIT_ASSERT_EQUAL(OUString("A"), paramCondition); + CPPUNIT_ASSERT_EQUAL(OUString("B"), paramTrue); + CPPUNIT_ASSERT_EQUAL(OUString("C"), paramFalse); + } + + { + OUString paramCondition; + OUString paramTrue; + OUString paramFalse; + + SwHiddenTextField::ParseIfFieldDefinition(u" IF AAA BBB CCC ", paramCondition, paramTrue, paramFalse); + + CPPUNIT_ASSERT_EQUAL(OUString("AAA"), paramCondition); + CPPUNIT_ASSERT_EQUAL(OUString("BBB"), paramTrue); + CPPUNIT_ASSERT_EQUAL(OUString("CCC"), paramFalse); + } + + { + OUString paramCondition; + OUString paramTrue; + OUString paramFalse; + + SwHiddenTextField::ParseIfFieldDefinition(u" IF AAA \"BBB\" \"CCC\" ", paramCondition, paramTrue, paramFalse); + + CPPUNIT_ASSERT_EQUAL(OUString("AAA"), paramCondition); + CPPUNIT_ASSERT_EQUAL(OUString("BBB"), paramTrue); + CPPUNIT_ASSERT_EQUAL(OUString("CCC"), paramFalse); + } + + // true-case and false-case have spaces inside + { + OUString paramCondition; + OUString paramTrue; + OUString paramFalse; + + SwHiddenTextField::ParseIfFieldDefinition(u" IF A A A \"B B B\" \"C C C\" ", paramCondition, paramTrue, paramFalse); + + CPPUNIT_ASSERT_EQUAL(OUString("A A A"), paramCondition); + CPPUNIT_ASSERT_EQUAL(OUString("B B B"), paramTrue); + CPPUNIT_ASSERT_EQUAL(OUString("C C C"), paramFalse); + } + + // true-case and false-case have leading/trailing space + { + OUString paramCondition; + OUString paramTrue; + OUString paramFalse; + + SwHiddenTextField::ParseIfFieldDefinition(u"IF A1 A2 A3 \"B1 B2 \" \" C1 C2\" ", paramCondition, paramTrue, paramFalse); + + CPPUNIT_ASSERT_EQUAL(OUString("A1 A2 A3"), paramCondition); + CPPUNIT_ASSERT_EQUAL(OUString("B1 B2 "), paramTrue); + CPPUNIT_ASSERT_EQUAL(OUString(" C1 C2"), paramFalse); + } + + // true-case and false-case are empty + { + OUString paramCondition; + OUString paramTrue; + OUString paramFalse; + + SwHiddenTextField::ParseIfFieldDefinition(u"IF condition \"\" \"\" ", paramCondition, paramTrue, paramFalse); + + CPPUNIT_ASSERT_EQUAL(OUString("condition"), paramCondition); + CPPUNIT_ASSERT_EQUAL(OUString(""), paramTrue); + CPPUNIT_ASSERT_EQUAL(OUString(""), paramFalse); + } +} + +// Input document contains only one IF-field, +// and it should be imported as com.sun.star.text.TextField.ConditionalText in any case, +// instead of insertion of the pair of two field-marks: + . +CPPUNIT_TEST_FIXTURE(Test, testTdf43569) +{ + loadAndReload("tdf43569_conditionalfield.doc"); + // check if our parser is valid + testTdf43569_CheckIfFieldParse(); + + // now check field creation during import + uno::Reference xTextFieldsSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xFieldsAccess(xTextFieldsSupplier->getTextFields()); + uno::Reference xFields(xFieldsAccess->createEnumeration()); + + // at least one field should be detected + CPPUNIT_ASSERT(xFields->hasMoreElements()); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf130314) +{ + loadAndReload("tdf130314.docx"); + // Without the fix in place, this test would have hung + CPPUNIT_ASSERT_EQUAL(2, getPages()); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf133487) +{ + loadAndReload("MadeByLO7.odt"); + CPPUNIT_ASSERT_EQUAL(3, getShapes()); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + xmlDocUniquePtr pXmlDoc = parseExport("content.xml"); + // shape in background has lowest index + assertXPath(pXmlDoc, "/office:document-content/office:body/office:text/text:p[2]/draw:custom-shape"_ostr, "z-index"_ostr, "0"); + assertXPath(pXmlDoc, "/office:document-content/office:automatic-styles/style:style[@style:name = /office:document-content/office:body/office:text/text:p[2]/draw:custom-shape[@draw:z-index = '0']/attribute::draw:style-name]/style:graphic-properties"_ostr, "run-through"_ostr, "background"); + // shape in foreground, previously index 1 + assertXPath(pXmlDoc, "/office:document-content/office:body/office:text/text:p[1]/draw:custom-shape"_ostr, "z-index"_ostr, "2"); + assertXPath(pXmlDoc, "/office:document-content/office:automatic-styles/style:style[@style:name = /office:document-content/office:body/office:text/text:p[1]/draw:custom-shape[@draw:z-index = '2']/attribute::draw:style-name]/style:graphic-properties"_ostr, "run-through"_ostr, "foreground"); + // shape in foreground, previously index 0 + assertXPath(pXmlDoc, "/office:document-content/office:body/office:text/text:p[3]/draw:custom-shape"_ostr, "z-index"_ostr, "1"); + assertXPath(pXmlDoc, "/office:document-content/office:automatic-styles/style:style[@style:name = /office:document-content/office:body/office:text/text:p[3]/draw:custom-shape[@draw:z-index = '1']/attribute::draw:style-name]/style:graphic-properties"_ostr, "run-through"_ostr, "foreground"); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf141467) +{ + loadAndReload("Formcontrol needs high z-index.odt"); + CPPUNIT_ASSERT_EQUAL(2, getShapes()); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + xmlDocUniquePtr pXmlDoc = parseExport("content.xml"); + // shape in foreground has lowest index + assertXPath(pXmlDoc, "/office:document-content/office:body/office:text/text:p[2]/draw:custom-shape"_ostr, "z-index"_ostr, "0"); + assertXPath(pXmlDoc, "/office:document-content/office:automatic-styles/style:style[@style:name = /office:document-content/office:body/office:text/text:p[2]/draw:custom-shape[@draw:z-index = '0']/attribute::draw:style-name]/style:graphic-properties"_ostr, "run-through"_ostr, "foreground"); + // form control, previously index 0 + assertXPath(pXmlDoc, "/office:document-content/office:body/office:text/text:p[2]/draw:control"_ostr, "z-index"_ostr, "1"); + // no run-through on form's style + assertXPath(pXmlDoc, "/office:document-content/office:automatic-styles/style:style[@style:name = /office:document-content/office:body/office:text/text:p[2]/draw:control[@draw:z-index = '1']/attribute::draw:style-name]/style:graphic-properties/attribute::run-through"_ostr, 0); +} + +DECLARE_ODFEXPORT_TEST(testTdf139126, "tdf139126.odt") +{ + CPPUNIT_ASSERT_EQUAL(1, getPages()); + uno::Reference xSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xTables = xSupplier->getTextTables(); + uno::Reference xTable(xTables->getByName("Table1"), uno::UNO_QUERY); + + uno::Reference xD2(xTable->getCellByName("D2"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("4.0"), xD2->getString()); + + // Without the fix in place, this test would have failed with + // - Expected: ** Expression is faulty ** + // - Actual : 17976931348623200... + uno::Reference xE2(xTable->getCellByName("E2"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("** Expression is faulty **"), xE2->getString()); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf125877) +{ + loadAndReload("tdf95806.docx"); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + uno::Reference xSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xTables(xSupplier->getTextTables(), uno::UNO_QUERY); + + // This was 0 (lost table during ODT export in footnotes) + // Note: fix also tdf#95806: painting table layout is correct + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTables->getCount()); + + // floating table: there is a frame now + uno::Reference xTextFramesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xIndexAccess(xTextFramesSupplier->getTextFrames(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xIndexAccess->getCount()); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf150149) +{ + loadAndReload("tdf150149.fodt"); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + xmlDocUniquePtr pXmlDoc = parseExport("content.xml"); + // This was 0 (lost table header in multi-column section) + assertXPath(pXmlDoc, "//table:table-header-rows"_ostr, 1); + assertXPath(pXmlDoc, "//table:table-header-rows/table:table-row/table:table-cell"_ostr, 3); +} + +DECLARE_ODFEXPORT_TEST(testTdf103567, "tdf103567.odt") +{ + CPPUNIT_ASSERT_EQUAL(1, getShapes()); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + uno::Reference const xShape(getShape(1)); + + // contour wrap polygon + css::drawing::PointSequenceSequence const pointss( + getProperty(xShape, "ContourPolyPolygon")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), pointss.getLength()); + // for some reason this property exists with 199 points if it wasn't + // imported, that would be a fail + CPPUNIT_ASSERT_EQUAL(sal_Int32(5), pointss[0].getLength()); + CPPUNIT_ASSERT_EQUAL(sal_Int32( 0), pointss[0][0].X); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2672), pointss[0][0].Y); + CPPUNIT_ASSERT_EQUAL(sal_Int32( 0), pointss[0][1].X); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1111), pointss[0][1].Y); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2672), pointss[0][2].X); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1111), pointss[0][2].Y); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2672), pointss[0][3].X); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2672), pointss[0][3].Y); + CPPUNIT_ASSERT_EQUAL(sal_Int32( 0), pointss[0][4].X); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2672), pointss[0][4].Y); + + // image map, one rectangle + uno::Reference const xImageMap( + getProperty>(xShape, "ImageMap")); + + uno::Reference const xEntry(xImageMap->getByIndex(0), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("http://example.com/"), getProperty(xEntry, "URL")); + awt::Rectangle const rect(getProperty(xEntry, "Boundary")); + CPPUNIT_ASSERT_EQUAL(sal_Int32( 726), rect.X); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1718), rect.Y); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1347), rect.Width); + CPPUNIT_ASSERT_EQUAL(sal_Int32( 408), rect.Height); +} + +CPPUNIT_TEST_FIXTURE(Test, testUserFieldDecl) +{ + loadAndReload("user-field-decl.odt"); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + xmlDocUniquePtr pXmlDoc = parseExport("styles.xml"); + // Without the accompanying fix in place, this test would have failed with 'Expected: 2; + // Actual: 1', i.e. the in-table field had no declaration (in the header), while the + // outside-table one had the declaration. + assertXPath(pXmlDoc, "//style:header/text:user-field-decls/text:user-field-decl"_ostr, 2); +} + +CPPUNIT_TEST_FIXTURE(Test, testUserFieldDeclFly) +{ + loadAndReload("user-field-decl-fly.odt"); + CPPUNIT_ASSERT_EQUAL(1, getShapes()); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + xmlDocUniquePtr pXmlDoc = parseExport("styles.xml"); + // Without the accompanying fix in place, this test would have failed with 'Expected: 2; + // Actual: 1', i.e. the in-textframe field had no declaration (in the header), while the + // outside-textframe one had the declaration. + assertXPath(pXmlDoc, "//style:header/text:user-field-decls/text:user-field-decl"_ostr, 2); +} + +DECLARE_ODFEXPORT_TEST(testFramebackgrounds, "framebackgrounds.odt") +{ + CPPUNIT_ASSERT_EQUAL(16, getShapes()); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + //Counting the Number of Frames and checking with the expected count + uno::Reference xTextFramesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xIndexAccess(xTextFramesSupplier->getTextFrames(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_Int32(16), xIndexAccess->getCount()); + uno::Reference xTextFrame; + awt::Gradient aGradientxTextFrame; + //Frame 1 + xTextFrame = getShape(1); + CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_NONE, getProperty(xTextFrame, "FillStyle")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(xTextFrame, "FillTransparence")); + //Frame 2 + xTextFrame = getShape(2); + CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_SOLID, getProperty(xTextFrame, "FillStyle")); + CPPUNIT_ASSERT_EQUAL(Color(0x006600), getProperty(xTextFrame, "FillColor")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(xTextFrame, "FillTransparence")); + //Frame 3 + xTextFrame = getShape(3); + CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_SOLID, getProperty(xTextFrame, "FillStyle")); + CPPUNIT_ASSERT_EQUAL(Color(0x006600), getProperty(xTextFrame, "FillColor")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(45), getProperty(xTextFrame, "FillTransparence")); + //Frame 4 + xTextFrame = getShape(4); + CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_SOLID, getProperty(xTextFrame, "FillStyle")); + CPPUNIT_ASSERT_EQUAL(Color(0x579D1C), getProperty(xTextFrame, "FillColor")); + aGradientxTextFrame = getProperty(xTextFrame, "FillTransparenceGradient"); + CPPUNIT_ASSERT_EQUAL(css::awt::GradientStyle_LINEAR, aGradientxTextFrame.Style); + //Frame 5 + xTextFrame = getShape(5); + CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_GRADIENT, getProperty(xTextFrame, "FillStyle")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(xTextFrame, "FillTransparence")); + CPPUNIT_ASSERT_EQUAL(OUString("Subtle Tango Green"), getProperty(xTextFrame, "FillGradientName")); + //Frame 6 + xTextFrame = getShape(6); + CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_GRADIENT, getProperty(xTextFrame, "FillStyle")); + CPPUNIT_ASSERT_EQUAL(OUString("Subtle Tango Green"), getProperty(xTextFrame, "FillGradientName")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(45), getProperty(xTextFrame, "FillTransparence")); + //Frame 7 + xTextFrame = getShape(7); + CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_GRADIENT, getProperty(xTextFrame, "FillStyle")); + CPPUNIT_ASSERT_EQUAL(OUString("Subtle Tango Green"), getProperty(xTextFrame, "FillGradientName")); + aGradientxTextFrame = getProperty(xTextFrame, "FillTransparenceGradient"); + CPPUNIT_ASSERT_EQUAL(css::awt::GradientStyle_LINEAR, aGradientxTextFrame.Style); + //Frame 8 + xTextFrame = getShape(8); + CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_HATCH, getProperty(xTextFrame, "FillStyle")); + CPPUNIT_ASSERT_EQUAL(OUString("Black 0 Degrees"), getProperty(xTextFrame, "FillHatchName")); + CPPUNIT_ASSERT_EQUAL(false, getProperty(xTextFrame, "FillBackground")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(xTextFrame, "FillTransparence")); + //Frame 9 + xTextFrame = getShape(9); + CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_HATCH, getProperty(xTextFrame, "FillStyle")); + CPPUNIT_ASSERT_EQUAL(OUString("Black 0 Degrees"), getProperty(xTextFrame, "FillHatchName")); + CPPUNIT_ASSERT_EQUAL(true, getProperty(xTextFrame, "FillBackground")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(xTextFrame, "FillTransparence")); + //Frame 10 + xTextFrame = getShape(10); + CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_HATCH, getProperty(xTextFrame, "FillStyle")); + CPPUNIT_ASSERT_EQUAL(OUString("Black 0 Degrees"), getProperty(xTextFrame, "FillHatchName")); + CPPUNIT_ASSERT_EQUAL(false, getProperty(xTextFrame, "FillBackground")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(45), getProperty(xTextFrame, "FillTransparence")); + //Frame 11 + xTextFrame = getShape(11); + CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_HATCH, getProperty(xTextFrame, "FillStyle")); + CPPUNIT_ASSERT_EQUAL(OUString("Black 0 Degrees"), getProperty(xTextFrame, "FillHatchName")); + CPPUNIT_ASSERT_EQUAL(true, getProperty(xTextFrame, "FillBackground")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(45), getProperty(xTextFrame, "FillTransparence")); + //Frame 12 + xTextFrame = getShape(12); + CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_HATCH, getProperty(xTextFrame, "FillStyle")); + CPPUNIT_ASSERT_EQUAL(OUString("Black 0 Degrees"), getProperty(xTextFrame, "FillHatchName")); + CPPUNIT_ASSERT_EQUAL(false, getProperty(xTextFrame, "FillBackground")); + aGradientxTextFrame = getProperty(xTextFrame, "FillTransparenceGradient"); + CPPUNIT_ASSERT_EQUAL(css::awt::GradientStyle_LINEAR, aGradientxTextFrame.Style); + //Frame 13 + xTextFrame = getShape(13); + CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_HATCH, getProperty(xTextFrame, "FillStyle")); + CPPUNIT_ASSERT_EQUAL(OUString("Black 0 Degrees"), getProperty(xTextFrame, "FillHatchName")); + CPPUNIT_ASSERT_EQUAL(true, getProperty(xTextFrame, "FillBackground")); + aGradientxTextFrame = getProperty(xTextFrame, "FillTransparenceGradient"); + CPPUNIT_ASSERT_EQUAL(css::awt::GradientStyle_LINEAR, aGradientxTextFrame.Style); + //Frame 14 + xTextFrame = getShape(14); + CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_BITMAP, getProperty(xTextFrame, "FillStyle")); + CPPUNIT_ASSERT_EQUAL(OUString("Sky"), getProperty(xTextFrame, "FillBitmapName")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(xTextFrame, "FillTransparence")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(xTextFrame, "FillBitmapPositionOffsetX")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(xTextFrame, "FillBitmapPositionOffsetY")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(xTextFrame, "FillBitmapOffsetX")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(xTextFrame, "FillBitmapOffsetY")); + CPPUNIT_ASSERT_EQUAL(true, getProperty(xTextFrame, "FillBitmapTile")); + //Frame 15 + xTextFrame = getShape(15); + CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_BITMAP, getProperty(xTextFrame, "FillStyle")); + CPPUNIT_ASSERT_EQUAL(OUString("Sky"), getProperty(xTextFrame, "FillBitmapName")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(45), getProperty(xTextFrame, "FillTransparence")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(xTextFrame, "FillBitmapPositionOffsetX")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(xTextFrame, "FillBitmapPositionOffsetY")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(xTextFrame, "FillBitmapOffsetX")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(xTextFrame, "FillBitmapOffsetY")); + CPPUNIT_ASSERT_EQUAL(true, getProperty(xTextFrame, "FillBitmapTile")); + //Frame 16 + xTextFrame = getShape(16); + CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_BITMAP, getProperty(xTextFrame, "FillStyle")); + CPPUNIT_ASSERT_EQUAL(OUString("Sky"), getProperty(xTextFrame, "FillBitmapName")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(xTextFrame, "FillBitmapPositionOffsetX")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(xTextFrame, "FillBitmapPositionOffsetY")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(xTextFrame, "FillBitmapOffsetX")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(xTextFrame, "FillBitmapOffsetY")); + CPPUNIT_ASSERT_EQUAL(true, getProperty(xTextFrame, "FillBitmapTile")); + aGradientxTextFrame = getProperty(xTextFrame, "FillTransparenceGradient"); + CPPUNIT_ASSERT_EQUAL(css::awt::GradientStyle_LINEAR, aGradientxTextFrame.Style); + + if (isExported()) + { + xmlDocUniquePtr pXmlDoc = parseExport("content.xml"); + // check that there are 3 background-image elements + assertXPath(pXmlDoc, "//style:style[@style:parent-style-name='Frame' and @style:family='graphic']/style:graphic-properties[@draw:fill='bitmap']/style:background-image[@style:repeat='stretch']"_ostr, 3); + // tdf#90640: check that one of them is 55% opaque + assertXPath(pXmlDoc, "//style:style[@style:parent-style-name='Frame' and @style:family='graphic']/style:graphic-properties[@draw:fill='bitmap' and @fo:background-color='transparent' and @draw:opacity='55%']/style:background-image[@style:repeat='stretch' and @draw:opacity='55%']"_ostr, 1); + // tdf#90640: check that one of them is 43% opaque + // (emulated - hopefully not with rounding errors) + assertXPath(pXmlDoc, "//style:style[@style:parent-style-name='Frame' and @style:family='graphic']/style:graphic-properties[@draw:fill='bitmap' and @fo:background-color='transparent' and @draw:opacity-name='Transparency_20_1']/style:background-image[@style:repeat='stretch' and @draw:opacity='43%']"_ostr, 1); + } +} + +DECLARE_SW_ROUNDTRIP_TEST(testSHA1Correct, "sha1_correct.odt", "1012345678901234567890123456789012345678901234567890", Test) +{ // tdf#114939 this has both an affected password as well as content.xml + CPPUNIT_ASSERT_EQUAL(1, getPages()); + getParagraph(1, "012"); +} + +DECLARE_SW_ROUNDTRIP_TEST(testSHA1Wrong, "sha1_wrong.odt", "1012345678901234567890123456789012345678901234567890", Test) +{ // tdf#114939 this has both an affected password as well as content.xml + CPPUNIT_ASSERT_EQUAL(1, getPages()); + getParagraph(1, "012"); +} + +CPPUNIT_TEST_FIXTURE(Test, testOOoxmlEmbedded) +{ + loadAndReload("oooxml_embedded.sxw"); + uno::Reference xTEOSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xAccess(xTEOSupplier->getEmbeddedObjects()); + uno::Sequence aSeq(xAccess->getElementNames()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(4), aSeq.getLength()); + uno::Reference xEOSupplier1(xAccess->getByName("Object1"), uno::UNO_QUERY); + uno::Reference xObj1(xEOSupplier1->getEmbeddedObject()); + uno::Reference xEOSupplier2(xAccess->getByName("Object2"), uno::UNO_QUERY); + uno::Reference xObj2(xEOSupplier2->getEmbeddedObject()); + uno::Reference xEOSupplier3(xAccess->getByName("Object3"), uno::UNO_QUERY); + uno::Reference xObj3(xEOSupplier3->getEmbeddedObject()); + uno::Reference xEOSupplier4(xAccess->getByName("Object4"), uno::UNO_QUERY); + uno::Reference xObj4(xEOSupplier4->getEmbeddedObject()); + //checking first object + uno::Reference xSBDoc1(xObj1, uno::UNO_QUERY); + uno::Reference xStorage1(xSBDoc1->getDocumentStorage()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(SOFFICE_FILEFORMAT_8), comphelper::OStorageHelper::GetXStorageFormat(xStorage1)); + //checking second object + uno::Reference xSBDoc2(xObj2, uno::UNO_QUERY); + uno::Reference xStorage2(xSBDoc2->getDocumentStorage()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(SOFFICE_FILEFORMAT_8), comphelper::OStorageHelper::GetXStorageFormat(xStorage2)); + //checking third object + uno::Reference xSBDoc3(xObj3, uno::UNO_QUERY); + uno::Reference xStorage3(xSBDoc3->getDocumentStorage()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(SOFFICE_FILEFORMAT_8), comphelper::OStorageHelper::GetXStorageFormat(xStorage3)); + //checking fourth object + uno::Reference xSBDoc4(xObj4, uno::UNO_QUERY); + uno::Reference xStorage4(xSBDoc4->getDocumentStorage()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(SOFFICE_FILEFORMAT_8), comphelper::OStorageHelper::GetXStorageFormat(xStorage4)); +} + +DECLARE_ODFEXPORT_TEST(testTdf152710, "tdf152710.odt") +{ + // Without this fix in place, this test would have crash at import time + CPPUNIT_ASSERT_EQUAL(2, getPages()); +} + +DECLARE_ODFEXPORT_TEST(testredlineTextFrame, "redlineTextFrame.odt") +{ + CPPUNIT_ASSERT_EQUAL(2, getShapes()); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + //Note this is for a crash test + //Counting the Number of Frames and checking with the expected count + uno::Reference xTextFramesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xIndexAccess(xTextFramesSupplier->getTextFrames(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xIndexAccess->getCount()); +} + +DECLARE_ODFEXPORT_TEST(testTdf107292, "tdf107292.odt") +{ + // tracked deletions at the same position were loaded in reverse order + CPPUNIT_ASSERT_EQUAL(1, getPages()); + + // Without this fix in place, this test would have failed with + // - Expected: Lorem ipsum dolor sit... + // - Actual : dolor ipsumLorem sit... + CPPUNIT_ASSERT_EQUAL(OUString("Lorem ipsum dolor sit..."), getParagraph(1)->getString()); +} + +DECLARE_ODFEXPORT_TEST(testTdf140437, "tdf140437.odt") +{ + // Without the fix in place, the document would have failed to load + CPPUNIT_ASSERT_EQUAL(1, getPages()); + + uno::Reference xTextFieldsSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xFieldsAccess(xTextFieldsSupplier->getTextFields()); + uno::Reference xFields(xFieldsAccess->createEnumeration()); + + // at least one field should be detected + CPPUNIT_ASSERT(xFields->hasMoreElements()); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf131621) +{ + loadAndReload("tdf131621.ott"); + CPPUNIT_ASSERT_EQUAL(12, getShapes()); + //Crash test, Check number of pages + CPPUNIT_ASSERT_EQUAL( 1, getPages() ); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf135144) +{ + loadAndReload("tdf135144.docx"); + //Crashes at import time after roundtrip + CPPUNIT_ASSERT_EQUAL(3, getPages()); + CPPUNIT_ASSERT_EQUAL(4, getShapes()); +} + +DECLARE_ODFEXPORT_TEST(testTdf130950, "tdf130950.odt") +{ + //Crashes at import time + CPPUNIT_ASSERT_EQUAL(1, getPages()); + CPPUNIT_ASSERT_EQUAL(2, getShapes()); +} + +DECLARE_ODFEXPORT_TEST(testFdo38244, "fdo38244.odt") +{ + CPPUNIT_ASSERT_EQUAL(1, getPages()); + // See ooxmlexport's testFdo38244(). + + // Test comment range feature. + uno::Reference xTextDocument(mxComponent, uno::UNO_QUERY); + uno::Reference xParaEnumAccess(xTextDocument->getText(), uno::UNO_QUERY); + uno::Reference xParaEnum = xParaEnumAccess->createEnumeration(); + uno::Reference xRunEnumAccess(xParaEnum->nextElement(), uno::UNO_QUERY); + uno::Reference xRunEnum = xRunEnumAccess->createEnumeration(); + xRunEnum->nextElement(); + uno::Reference xPropertySet(xRunEnum->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Annotation"), getProperty(xPropertySet, "TextPortionType")); + xRunEnum->nextElement(); + xPropertySet.set(xRunEnum->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("AnnotationEnd"), getProperty(xPropertySet, "TextPortionType")); + + // Test properties + uno::Reference xTextFieldsSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xFieldsAccess(xTextFieldsSupplier->getTextFields()); + uno::Reference xFields(xFieldsAccess->createEnumeration()); + xPropertySet.set(xFields->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("__Fieldmark__4_1833023242"), getProperty(xPropertySet, "Name")); + CPPUNIT_ASSERT_EQUAL(OUString("M"), getProperty(xPropertySet, "Initials")); +} + +CPPUNIT_TEST_FIXTURE(Test, testSenderInitials) +{ + loadAndReload("sender-initials.fodt"); + // Test sender-initial properties (both annotation metadata and text field) + uno::Reference xTextFieldsSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xFieldsAccess(xTextFieldsSupplier->getTextFields()); + uno::Reference xFields(xFieldsAccess->createEnumeration()); + // first 3 are annotations, last 2 are text fields + for (unsigned i = 0; i < 3; ++i) + { + uno::Reference xPropertySet(xFields->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("I"), getProperty(xPropertySet, "Initials")); + } + for (unsigned i = 0; i < 2; ++i) + { + uno::Reference xPropertySet(xFields->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(true, getProperty(xPropertySet, "IsFixed")); + CPPUNIT_ASSERT_EQUAL(OUString("I"), getProperty(xPropertySet, "Content")); + } +} + +DECLARE_ODFEXPORT_TEST(testResolvedComment, "resolved-comment.odt") +{ + CPPUNIT_ASSERT_EQUAL(1, getPages()); + uno::Reference xTextFieldsSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xFieldsAccess(xTextFieldsSupplier->getTextFields()); + uno::Reference xFields(xFieldsAccess->createEnumeration()); + uno::Reference xPropertySet(xFields->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(true, getProperty(xPropertySet, "Resolved")); + xPropertySet.set(xFields->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(false, getProperty(xPropertySet, "Resolved")); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf92379) +{ + loadAndReload("tdf92379.fodt"); + // frame style fo:background-color was not imported + uno::Reference xStyles(getStyles("FrameStyles")); + uno::Reference xStyle(xStyles->getByName("encarts"), + uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(Color(0xffcc99), getProperty(xStyle, "BackColorRGB")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(xStyle, "BackColorTransparency")); + CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_SOLID, getProperty(xStyle, "FillStyle")); + CPPUNIT_ASSERT_EQUAL(Color(0xffcc99), getProperty(xStyle, "FillColor")); + CPPUNIT_ASSERT_EQUAL(sal_Int16(0), getProperty(xStyle, "FillTransparence")); + + uno::Reference xFrameStyle2(xStyles->getByName("Untitled1"), + uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(COL_WHITE, getProperty(xFrameStyle2, "BackColorRGB")); + CPPUNIT_ASSERT_EQUAL(true, getProperty(xFrameStyle2, "BackTransparent")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(100), getProperty(xFrameStyle2, "BackColorTransparency")); + CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_NONE, getProperty(xFrameStyle2, "FillStyle")); +// unfortunately this is actually the pool default value, which would be hard to fix - but it isn't a problem because style is NONE +// CPPUNIT_ASSERT_EQUAL(sal_Int32(0xffffff), getProperty(xFrameStyle2, "FillColor")); +// CPPUNIT_ASSERT_EQUAL(sal_Int16(100), getProperty(xFrameStyle2, "FillTransparence")); + + if (isExported()) + { + xmlDocUniquePtr pXmlDoc = parseExport("styles.xml"); + // check that fo:background-color attribute is exported properly + assertXPath(pXmlDoc, "//style:style[@style:family='graphic' and @style:name='encarts']/style:graphic-properties[@fo:background-color='#ffcc99']"_ostr, 1); + assertXPath(pXmlDoc, "//style:style[@style:family='graphic' and @style:name='Untitled1']/style:graphic-properties[@fo:background-color='transparent']"_ostr, 1); + } + + // paragraph style fo:background-color was wrongly inherited despite being + // overridden in derived style + uno::Reference xParaStyles(getStyles("ParagraphStyles")); + uno::Reference xStyle1(xParaStyles->getByName( + "Titre Avis expert"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(Color(0x661900), getProperty(xStyle1, "ParaBackColor")); + CPPUNIT_ASSERT_EQUAL(false, getProperty(xStyle1, "ParaBackTransparent")); + CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_SOLID, getProperty(xStyle1, "FillStyle")); + CPPUNIT_ASSERT_EQUAL(Color(0x661900), getProperty(xStyle1, "FillColor")); + CPPUNIT_ASSERT_EQUAL(sal_Int16(0), getProperty(xStyle1, "FillTransparence")); + CPPUNIT_ASSERT_EQUAL(COL_WHITE, getProperty(xStyle1, "CharColor")); + + uno::Reference xStyle2(xParaStyles->getByName( + "Avis expert questions"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(COL_TRANSPARENT, getProperty(xStyle2, "ParaBackColor")); + CPPUNIT_ASSERT_EQUAL(true, getProperty(xStyle2, "ParaBackTransparent")); + CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_NONE, getProperty(xStyle2, "FillStyle")); +// unfortunately this is actually the pool default value, which would be hard to fix - but it isn't a problem because style is NONE +// CPPUNIT_ASSERT_EQUAL(sal_Int32(0xffffff), getProperty(xStyle2, "FillColor")); +// CPPUNIT_ASSERT_EQUAL(sal_Int16(100), getProperty(xStyle2, "FillTransparence")); + CPPUNIT_ASSERT_EQUAL(Color(0x661900), getProperty(xStyle2, "CharColor")); + + uno::Reference xStyle31(xParaStyles->getByName( + "avis expert questions non cadres"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(Color(0x801900), getProperty(xStyle31, "ParaBackColor")); + CPPUNIT_ASSERT_EQUAL(false, getProperty(xStyle31, "ParaBackTransparent")); + CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_SOLID, getProperty(xStyle31, "FillStyle")); + CPPUNIT_ASSERT_EQUAL(Color(0x801900), getProperty(xStyle31, "FillColor")); + CPPUNIT_ASSERT_EQUAL(sal_Int16(0), getProperty(xStyle31, "FillTransparence")); + CPPUNIT_ASSERT_EQUAL(Color(0x661900), getProperty(xStyle31, "CharColor")); + + uno::Reference xStyle32(xParaStyles->getByName( + "Avis expert rXponses"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(COL_TRANSPARENT, getProperty(xStyle32, "ParaBackColor")); + CPPUNIT_ASSERT_EQUAL(true, getProperty(xStyle32, "ParaBackTransparent")); + CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_NONE, getProperty(xStyle32, "FillStyle")); +// unfortunately this is actually the pool default value, which would be hard to fix - but it isn't a problem because style is NONE +// CPPUNIT_ASSERT_EQUAL(sal_Int32(0xffffff), getProperty(xStyle32, "FillColor")); +// CPPUNIT_ASSERT_EQUAL(sal_Int16(100), getProperty(xStyle32, "FillTransparence")); + CPPUNIT_ASSERT_EQUAL(Color(0x461900), getProperty(xStyle32, "CharColor")); + + if (isExported()) + { + xmlDocUniquePtr pXmlDoc = parseExport("styles.xml"); + // check that fo:background-color attribute is exported properly + assertXPath(pXmlDoc, "//style:style[@style:family='paragraph' and @style:display-name='Titre Avis expert']/style:paragraph-properties[@fo:background-color='#661900']"_ostr, 1); + assertXPath(pXmlDoc, "//style:style[@style:family='paragraph' and @style:display-name='Avis expert questions']/style:paragraph-properties[@fo:background-color='transparent']"_ostr, 1); + assertXPath(pXmlDoc, "//style:style[@style:family='paragraph' and @style:display-name='avis expert questions non cadres']/style:paragraph-properties[@fo:background-color='#801900']"_ostr, 1); + assertXPath(pXmlDoc, "//style:style[@style:family='paragraph' and @style:display-name='Avis expert rXponses']/style:paragraph-properties[@fo:background-color='transparent']"_ostr, 1); + } +} + +DECLARE_ODFEXPORT_TEST(testFdo79358, "fdo79358.odt") +{ + CPPUNIT_ASSERT_EQUAL(1, getPages()); + // the boolean properties of the index were not exported properly + uno::Reference xIndexSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xIndexes = xIndexSupplier->getDocumentIndexes(); + uno::Reference xTOCIndex(xIndexes->getByIndex(0), uno::UNO_QUERY); + uno::Reference xTOCProps(xTOCIndex, uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(false, getProperty(xTOCProps, "CreateFromOutline")); + CPPUNIT_ASSERT_EQUAL(false, getProperty(xTOCProps, "CreateFromMarks")); + CPPUNIT_ASSERT_EQUAL(true, getProperty(xTOCProps, "CreateFromLevelParagraphStyles")); + // check that the source styles are preserved too while at it + uno::Reference xLevels( + getProperty< uno::Reference >(xTOCProps, + "LevelParagraphStyles")); + uno::Sequence seq { "Heading" }; + CPPUNIT_ASSERT_EQUAL(uno::Any(seq), xLevels->getByIndex(1)); + CPPUNIT_ASSERT_EQUAL(uno::Any(uno::Sequence()), xLevels->getByIndex(2)); +} + +DECLARE_ODFEXPORT_TEST(testTextframeGradient, "textframe-gradient.odt") +{ + CPPUNIT_ASSERT_EQUAL(2, getShapes()); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + uno::Reference xTextFramesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xIndexAccess(xTextFramesSupplier->getTextFrames(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xIndexAccess->getCount()); + + uno::Reference xFrame(xIndexAccess->getByIndex(0), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_GRADIENT, getProperty(xFrame, "FillStyle")); + awt::Gradient2 aGradient = getProperty(xFrame, "FillGradient"); + + // MCGR: Use the completely imported gradient to check for correctness + basegfx::BColorStops aColorStops = model::gradient::getColorStopsFromUno(aGradient.ColorStops); + + CPPUNIT_ASSERT_EQUAL(size_t(2), aColorStops.size()); + CPPUNIT_ASSERT(basegfx::fTools::equal(aColorStops[0].getStopOffset(), 0.0)); + CPPUNIT_ASSERT_EQUAL(Color(0xc0504d), Color(aColorStops[0].getStopColor())); + CPPUNIT_ASSERT(basegfx::fTools::equal(aColorStops[1].getStopOffset(), 1.0)); + CPPUNIT_ASSERT_EQUAL(Color(0xd99594), Color(aColorStops[1].getStopColor())); + CPPUNIT_ASSERT_EQUAL(awt::GradientStyle_AXIAL, aGradient.Style); + + xFrame.set(xIndexAccess->getByIndex(1), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_GRADIENT, getProperty(xFrame, "FillStyle")); + aGradient = getProperty(xFrame, "FillGradient"); + + // MCGR: Use the completely imported gradient to check for correctness + aColorStops = model::gradient::getColorStopsFromUno(aGradient.ColorStops); + + CPPUNIT_ASSERT_EQUAL(size_t(2), aColorStops.size()); + CPPUNIT_ASSERT(basegfx::fTools::equal(aColorStops[0].getStopOffset(), 0.0)); + CPPUNIT_ASSERT_EQUAL(Color(0x000000), Color(aColorStops[0].getStopColor())); + CPPUNIT_ASSERT(basegfx::fTools::equal(aColorStops[1].getStopOffset(), 1.0)); + CPPUNIT_ASSERT_EQUAL(Color(0x666666), Color(aColorStops[1].getStopColor())); + CPPUNIT_ASSERT_EQUAL(awt::GradientStyle_AXIAL, aGradient.Style); +} + +CPPUNIT_TEST_FIXTURE(Test, testDuplicateCrossRefHeadingBookmark) +{ + loadAndReload("CrossRefHeadingBookmark.fodt"); + // the file contains invalid duplicate heading cross reference bookmarks + // but we have to round trip them, tdf#94804 + + uno::Reference xBookmarksSupplier(mxComponent, + uno::UNO_QUERY); + uno::Reference xBookmarks = + xBookmarksSupplier->getBookmarks(); + uno::Reference xBookmark1( + xBookmarks->getByName("__RefHeading__8284_1826734303"), uno::UNO_QUERY); + CPPUNIT_ASSERT(xBookmark1.is()); + CPPUNIT_ASSERT_THROW(xBookmarks->getByName("__RefHeading__1673_25705824"), container::NoSuchElementException); + + uno::Reference xTextFieldsSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference(xTextFieldsSupplier->getTextFields(), uno::UNO_QUERY_THROW)->refresh(); + + uno::Reference xFieldsAccess(xTextFieldsSupplier->getTextFields()); + uno::Reference xFields(xFieldsAccess->createEnumeration()); + uno::Any aField1 = xFields->nextElement(); + uno::Reference xField1(aField1, uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("1.1"), xField1->getPresentation(false)); + uno::Any aField2 = xFields->nextElement(); + uno::Reference xField2(aField2, uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("1.1"), xField2->getPresentation(false)); +} + +DECLARE_ODFEXPORT_TEST(testFdo60769, "fdo60769.odt") +{ + CPPUNIT_ASSERT_EQUAL(1, getPages()); + // Test multi-paragraph comment range feature. + uno::Reference xTextDocument(mxComponent, uno::UNO_QUERY); + uno::Reference xParaEnumAccess(xTextDocument->getText(), uno::UNO_QUERY); + uno::Reference xParaEnum = xParaEnumAccess->createEnumeration(); + uno::Reference xRunEnumAccess(xParaEnum->nextElement(), uno::UNO_QUERY); + uno::Reference xRunEnum = xRunEnumAccess->createEnumeration(); + while (xRunEnum->hasMoreElements()) + { + uno::Reference xPropertySet(xRunEnum->nextElement(), uno::UNO_QUERY); + OUString aType = getProperty(xPropertySet, "TextPortionType"); + // First paragraph: no field end, no anchor + CPPUNIT_ASSERT(aType == "Text" || aType == "Annotation"); + } + + xRunEnumAccess.set(xParaEnum->nextElement(), uno::UNO_QUERY); + while (xRunEnum->hasMoreElements()) + { + uno::Reference xPropertySet(xRunEnum->nextElement(), uno::UNO_QUERY); + OUString aType = getProperty(xPropertySet, "TextPortionType"); + // Second paragraph: no field start + CPPUNIT_ASSERT(aType == "Text" || aType == "AnnotationEnd"); + } +} + +DECLARE_ODFEXPORT_TEST(testTdf115815, "tdf115815.odt") +{ + CPPUNIT_ASSERT_EQUAL(1, getPages()); + // Test comment range feature on tracked deletion. + uno::Reference xTextDocument(mxComponent, uno::UNO_QUERY); + uno::Reference xParaEnumAccess(xTextDocument->getText(), uno::UNO_QUERY); + uno::Reference xParaEnum = xParaEnumAccess->createEnumeration(); + uno::Reference xRunEnumAccess(xParaEnum->nextElement(), uno::UNO_QUERY); + uno::Reference xRunEnum = xRunEnumAccess->createEnumeration(); + bool bAnnotationStart = false; + bool bBeforeAnnotation = true; + OUString sTextBeforeAnnotation; + while (xRunEnum->hasMoreElements()) + { + uno::Reference xPropertySet(xRunEnum->nextElement(), uno::UNO_QUERY); + OUString aType = getProperty(xPropertySet, "TextPortionType"); + // there is no AnnotationEnd with preceding AnnotationStart, + // i.e. annotation with lost range + CPPUNIT_ASSERT(aType != "AnnotationEnd" || !bAnnotationStart); + + bAnnotationStart = (aType == "Annotation"); + + // collect paragraph text before the first annotation + if (bBeforeAnnotation) + { + if (bAnnotationStart) + bBeforeAnnotation = false; + else if (aType == "Text") + { + uno::Reference xRun(xPropertySet, uno::UNO_QUERY); + sTextBeforeAnnotation += xRun->getString(); + } + } + } + + // This was "Lorem ipsum" (collapsed annotation range) + CPPUNIT_ASSERT_EQUAL(OUString("Lorem "), sTextBeforeAnnotation); +} + +CPPUNIT_TEST_FIXTURE(Test, testFdo58949) +{ + comphelper::ScopeGuard g([]() { + std::shared_ptr pBatch( + comphelper::ConfigurationChanges::create()); + officecfg::Office::Common::Filter::Microsoft::Import::MathTypeToMath::set(true, pBatch); + pBatch->commit(); + }); + + std::shared_ptr pBatch( + comphelper::ConfigurationChanges::create()); + officecfg::Office::Common::Filter::Microsoft::Import::MathTypeToMath::set(false, pBatch); + pBatch->commit(); + loadAndReload("fdo58949.docx"); + + /* + * The problem was that the exporter didn't insert "Obj102" to the + * resulting zip file. No idea how to check for "broken" (missing OLE data + * and replacement image) OLE objects using UNO, so we'll check the zip file directly. + */ + + save("writer8"); + + uno::Sequence aArgs{ uno::Any(maTempFile.GetURL()) }; + uno::Reference xNameAccess(m_xSFactory->createInstanceWithArguments("com.sun.star.packages.zip.ZipFileAccess", aArgs), uno::UNO_QUERY); + const css::uno::Sequence aNames(xNameAccess->getElementNames()); + // The exported document must have three objects named ObjNNN. The names are assigned in + // OLEHandler::copyOLEOStream using a static counter, and actual numbers depend on previous + // tests; so just count the matching names here. + int nMatches = 0; + for (const OUString& sName : aNames) + { + OUString sRest; + if (sName.startsWith("Obj", &sRest)) + { + // all following characters must be decimal digits; minimal value is 100 + bool bMatch = sRest.getLength() >= 3 + && std::all_of(sRest.getStr(), sRest.getStr() + sRest.getLength(), + [](sal_Unicode ch) { return ch >= '0' && ch <= '9'; }); + if (bMatch) + ++nMatches; + } + } + CPPUNIT_ASSERT_EQUAL(3, nMatches); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf134987) +{ + loadAndReload("tdf134987.docx"); + uno::Reference xTEOSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xAccess(xTEOSupplier->getEmbeddedObjects()); + uno::Sequence aSeq(xAccess->getElementNames()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(3), aSeq.getLength()); + + OUString aMediaType; + // checking first object (formula) + { + uno::Reference xEOSupplier(xAccess->getByName("Object1"), uno::UNO_QUERY); + uno::Reference xObj(xEOSupplier->getEmbeddedObject()); + CPPUNIT_ASSERT(xObj.is()); + + uno::Reference xSBDoc(xObj, uno::UNO_QUERY); + uno::Reference xStorage(xSBDoc->getDocumentStorage()); + CPPUNIT_ASSERT(xStorage.is()); + + uno::Reference< beans::XPropertySet > xStorProps(xStorage, uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT(xStorProps->getPropertyValue("MediaType") >>= aMediaType); + CPPUNIT_ASSERT(aMediaType.equalsIgnoreAsciiCase(MIMETYPE_OASIS_OPENDOCUMENT_FORMULA_ASCII)); + } + // checking second object (chart) + { + uno::Reference xEOSupplier(xAccess->getByName("Diagram 1"), uno::UNO_QUERY); + uno::Reference xObj(xEOSupplier->getEmbeddedObject()); + CPPUNIT_ASSERT(xObj.is()); + + uno::Reference xSBDoc(xObj, uno::UNO_QUERY); + uno::Reference xStorage(xSBDoc->getDocumentStorage()); + CPPUNIT_ASSERT(xStorage.is()); + + uno::Reference< beans::XPropertySet > xStorProps(xStorage, uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT(xStorProps->getPropertyValue("MediaType") >>= aMediaType); + CPPUNIT_ASSERT(aMediaType.equalsIgnoreAsciiCase(MIMETYPE_OASIS_OPENDOCUMENT_CHART_ASCII)); + } + // checking third object (chart) + { + uno::Reference xEOSupplier(xAccess->getByName("Diagram 2"), uno::UNO_QUERY); + uno::Reference xObj(xEOSupplier->getEmbeddedObject()); + CPPUNIT_ASSERT(xObj.is()); + + uno::Reference xSBDoc(xObj, uno::UNO_QUERY); + uno::Reference xStorage(xSBDoc->getDocumentStorage()); + CPPUNIT_ASSERT(xStorage.is()); + + uno::Reference< beans::XPropertySet > xStorProps(xStorage, uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT(xStorProps->getPropertyValue("MediaType") >>= aMediaType); + CPPUNIT_ASSERT(aMediaType.equalsIgnoreAsciiCase(MIMETYPE_OASIS_OPENDOCUMENT_CHART_ASCII)); + } +} + +DECLARE_ODFEXPORT_TEST(testStylePageNumber, "ooo321_stylepagenumber.odt") +{ + CPPUNIT_ASSERT_EQUAL(5, getPages()); + uno::Reference xTable1(getParagraphOrTable(1)); +// actually no break attribute is written in this case +// CPPUNIT_ASSERT_EQUAL(style::BreakType_PAGE_BEFORE, getProperty(xTable1, "BreakType")); + CPPUNIT_ASSERT_EQUAL(OUString("Left Page"), getProperty(xTable1, "PageDescName")); + CPPUNIT_ASSERT_EQUAL(sal_Int16(1), getProperty(xTable1, "PageNumberOffset")); + + uno::Reference xPara1(getParagraphOrTable(2)); + CPPUNIT_ASSERT_EQUAL(OUString("Right Page"), getProperty(xPara1, "PageDescName")); + CPPUNIT_ASSERT_EQUAL(sal_Int16(1), getProperty(xPara1, "PageNumberOffset")); + + // i#114163 tdf#77111: OOo < 3.3 bug, it wrote "auto" as "0" for tables + uno::Reference xTable0(getParagraphOrTable(3), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Left Page"), getProperty(xTable0, "PageDescName")); + CPPUNIT_ASSERT_EQUAL(uno::Any(), xTable0->getPropertyValue("PageNumberOffset")); + + uno::Reference xPara0(getParagraphOrTable(4), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Right Page"), getProperty(xPara0, "PageDescName")); + CPPUNIT_ASSERT_EQUAL(uno::Any(), xPara0->getPropertyValue("PageNumberOffset")); + + uno::Reference xParaStyles = getStyles("ParagraphStyles"); + uno::Reference xStyle1(xParaStyles->getByName("stylewithbreak1"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Right Page"), getProperty(xStyle1, "PageDescName")); + CPPUNIT_ASSERT_EQUAL(sal_Int16(1), getProperty(xStyle1, "PageNumberOffset")); + + uno::Reference xStyle0(xParaStyles->getByName("stylewithbreak0"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("First Page"), getProperty(xStyle0, "PageDescName")); + CPPUNIT_ASSERT_EQUAL(uno::Any(), xStyle0->getPropertyValue("PageNumberOffset")); +} + +DECLARE_ODFEXPORT_TEST(testCharacterBorder, "charborder.odt") +{ + CPPUNIT_ASSERT_EQUAL(1, getPages()); + // Make sure paragraph and character attributes don't interfere + // First paragraph has a paragraph border and a character border included by the paragraph style + + // Paragraph border of first paragraph + { + const table::BorderLine2 aFirstParTopBorder(0x6666FF,2,26,26,7,55); + const sal_Int32 aFirstParTopPadding(150); + uno::Reference xSet(getParagraph(1), uno::UNO_QUERY); + + // Top border + CPPUNIT_ASSERT_BORDER_EQUAL(aFirstParTopBorder, getProperty(xSet,"TopBorder")); + CPPUNIT_ASSERT_EQUAL(aFirstParTopPadding, getProperty(xSet,"TopBorderDistance")); + + // Bottom border (same as top border) + CPPUNIT_ASSERT_BORDER_EQUAL(aFirstParTopBorder, getProperty(xSet,"BottomBorder")); + CPPUNIT_ASSERT_EQUAL(aFirstParTopPadding, getProperty(xSet,"BottomBorderDistance")); + + // Left border (same as top border) + CPPUNIT_ASSERT_BORDER_EQUAL(aFirstParTopBorder, getProperty(xSet,"LeftBorder")); + CPPUNIT_ASSERT_EQUAL(aFirstParTopPadding, getProperty(xSet,"LeftBorderDistance")); + + // Right border (same as top border) + CPPUNIT_ASSERT_BORDER_EQUAL(aFirstParTopBorder, getProperty(xSet,"RightBorder")); + CPPUNIT_ASSERT_EQUAL(aFirstParTopPadding, getProperty(xSet,"RightBorderDistance")); + + // Shadow + const table::ShadowFormat aShadow = getProperty(xSet,"ParaShadowFormat"); + CPPUNIT_ASSERT_EQUAL(COL_BLACK, Color(ColorTransparency, aShadow.Color)); + CPPUNIT_ASSERT_EQUAL(false, static_cast(aShadow.IsTransparent)); + CPPUNIT_ASSERT_EQUAL(table::ShadowLocation(0), aShadow.Location); + CPPUNIT_ASSERT_EQUAL(sal_Int16(0), aShadow.ShadowWidth); + } + + // Character border for first paragraph + { + const table::BorderLine2 aFirstParCharTopBorder(0xFF3333,0,37,0,2,37); + const sal_Int32 aFirstParCharTopPadding(450); + uno::Reference xSet(getParagraph(1), uno::UNO_QUERY); + + // Top border + CPPUNIT_ASSERT_BORDER_EQUAL(aFirstParCharTopBorder, getProperty(xSet,"CharTopBorder")); + CPPUNIT_ASSERT_EQUAL(aFirstParCharTopPadding, getProperty(xSet,"CharTopBorderDistance")); + + // Bottom border (same as top border) + CPPUNIT_ASSERT_BORDER_EQUAL(aFirstParCharTopBorder, getProperty(xSet,"CharBottomBorder")); + CPPUNIT_ASSERT_EQUAL(aFirstParCharTopPadding, getProperty(xSet,"CharBottomBorderDistance")); + + // Left border (same as top border) + CPPUNIT_ASSERT_BORDER_EQUAL(aFirstParCharTopBorder, getProperty(xSet,"CharLeftBorder")); + CPPUNIT_ASSERT_EQUAL(aFirstParCharTopPadding, getProperty(xSet,"CharLeftBorderDistance")); + + // Right border (same as top border) + CPPUNIT_ASSERT_BORDER_EQUAL(aFirstParCharTopBorder, getProperty(xSet,"CharRightBorder")); + CPPUNIT_ASSERT_EQUAL(aFirstParCharTopPadding, getProperty(xSet,"CharRightBorderDistance")); + + // Shadow + const table::ShadowFormat aShadow = getProperty(xSet,"CharShadowFormat"); + CPPUNIT_ASSERT_EQUAL(Color(0xFF3333), Color(ColorTransparency, aShadow.Color)); + CPPUNIT_ASSERT_EQUAL(false, static_cast(aShadow.IsTransparent)); + CPPUNIT_ASSERT_EQUAL(table::ShadowLocation(2), aShadow.Location); + CPPUNIT_ASSERT_EQUAL(sal_Int16(280), aShadow.ShadowWidth); + + // Check autostyle + { + uno::Reference< style::XAutoStyleFamily > xAutoStyleFamily(getAutoStyles("ParagraphStyles")); + uno::Reference < container::XEnumeration > xAutoStylesEnum( xAutoStyleFamily->createEnumeration() ); + CPPUNIT_ASSERT_EQUAL(true, static_cast(xAutoStylesEnum->hasMoreElements())); + + // Top border + CPPUNIT_ASSERT_BORDER_EQUAL(aFirstParCharTopBorder, getProperty(xSet,"CharTopBorder")); + CPPUNIT_ASSERT_EQUAL(aFirstParCharTopPadding, getProperty(xSet,"CharTopBorderDistance")); + + // Bottom border + CPPUNIT_ASSERT_BORDER_EQUAL(aFirstParCharTopBorder, getProperty(xSet,"CharBottomBorder")); + CPPUNIT_ASSERT_EQUAL(aFirstParCharTopPadding, getProperty(xSet,"CharBottomBorderDistance")); + + // Left border + CPPUNIT_ASSERT_BORDER_EQUAL(aFirstParCharTopBorder, getProperty(xSet,"CharLeftBorder")); + CPPUNIT_ASSERT_EQUAL(aFirstParCharTopPadding, getProperty(xSet,"CharLeftBorderDistance")); + + // Right border + CPPUNIT_ASSERT_BORDER_EQUAL(aFirstParCharTopBorder, getProperty(xSet,"CharRightBorder")); + CPPUNIT_ASSERT_EQUAL(aFirstParCharTopPadding, getProperty(xSet,"CharRightBorderDistance")); + } + } + + // Second paragraph's second text portion has a character style named CharDiffBor + // This style includes border with different sides + { + + table::BorderLine2 aBorderArray[4] = + { + table::BorderLine2(0xFF3333,0,37,0,14,37), // Top (fine dashed line) + table::BorderLine2(0x99FF66,26,26,53,11,106), // Bottom + table::BorderLine2(0x6666FF,9,26,9,12,71), // Left + table::BorderLine2(0,0,0,0,table::BorderLineStyle::NONE,0) // Right + }; + + sal_Int32 aDistances[4] = { 400 /*Top*/, 300 /*Bottom*/, 250 /*Left*/, 0 /*Right*/ }; + + // Get second text portion of second paragraph + uno::Reference < beans::XPropertySet > xSet( getRun(getParagraph(2),2), uno::UNO_QUERY ); + + // Top border + CPPUNIT_ASSERT_BORDER_EQUAL(aBorderArray[0], getProperty(xSet,"CharTopBorder")); + CPPUNIT_ASSERT_EQUAL(aDistances[0], getProperty(xSet,"CharTopBorderDistance")); + + // Bottom border + CPPUNIT_ASSERT_BORDER_EQUAL(aBorderArray[1], getProperty(xSet,"CharBottomBorder")); + CPPUNIT_ASSERT_EQUAL(aDistances[1], getProperty(xSet,"CharBottomBorderDistance")); + + // Left border + CPPUNIT_ASSERT_BORDER_EQUAL(aBorderArray[2], getProperty(xSet,"CharLeftBorder")); + CPPUNIT_ASSERT_EQUAL(aDistances[2], getProperty(xSet,"CharLeftBorderDistance")); + + // Right border + CPPUNIT_ASSERT_BORDER_EQUAL(aBorderArray[3], getProperty(xSet,"CharRightBorder")); + CPPUNIT_ASSERT_EQUAL(aDistances[3], getProperty(xSet,"CharRightBorderDistance")); + + // Shadow + const table::ShadowFormat aShadow = getProperty(xSet,"CharShadowFormat"); + CPPUNIT_ASSERT_EQUAL(COL_BLACK, Color(ColorTransparency, aShadow.Color)); + CPPUNIT_ASSERT_EQUAL(false, static_cast(aShadow.IsTransparent)); + CPPUNIT_ASSERT_EQUAL(table::ShadowLocation(3), aShadow.Location); + CPPUNIT_ASSERT_EQUAL(sal_Int16(79), aShadow.ShadowWidth); + + // Check character style + { + uno::Reference< container::XNameAccess > xStyleFamily = getStyles("CharacterStyles"); + uno::Reference < beans::XPropertySet > xStyleSet(xStyleFamily->getByName("CharDiffBor"), uno::UNO_QUERY); + + // Top border + CPPUNIT_ASSERT_BORDER_EQUAL(aBorderArray[0], getProperty(xStyleSet,"CharTopBorder")); + CPPUNIT_ASSERT_EQUAL(aDistances[0], getProperty(xStyleSet,"CharTopBorderDistance")); + + // Bottom border + CPPUNIT_ASSERT_BORDER_EQUAL(aBorderArray[1], getProperty(xStyleSet,"CharBottomBorder")); + CPPUNIT_ASSERT_EQUAL(aDistances[1], getProperty(xStyleSet,"CharBottomBorderDistance")); + + // Left border + CPPUNIT_ASSERT_BORDER_EQUAL(aBorderArray[2], getProperty(xStyleSet,"CharLeftBorder")); + CPPUNIT_ASSERT_EQUAL(aDistances[2], getProperty(xStyleSet,"CharLeftBorderDistance")); + + // Right border + CPPUNIT_ASSERT_BORDER_EQUAL(aBorderArray[3], getProperty(xStyleSet,"CharRightBorder")); + CPPUNIT_ASSERT_EQUAL(aDistances[3], getProperty(xStyleSet,"CharRightBorderDistance")); + } + } +} + +CPPUNIT_TEST_FIXTURE(Test, testProtectionKey) +{ + loadAndReload("protection-key.fodt"); + OUString constexpr password(u"1012345678901234567890123456789012345678901234567890"_ustr); + + // check 1 invalid OOo legacy password and 3 valid ODF 1.2 passwords + uno::Reference xTextSectionsSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xSections(xTextSectionsSupplier->getTextSections(), uno::UNO_QUERY); + uno::Reference xSect0(xSections->getByIndex(0), uno::UNO_QUERY); + uno::Sequence const key0(getProperty>(xSect0, "ProtectionKey")); + CPPUNIT_ASSERT(SvPasswordHelper::CompareHashPassword(key0, password)); + uno::Reference xSect1(xSections->getByIndex(1), uno::UNO_QUERY); + uno::Sequence const key1(getProperty>(xSect1, "ProtectionKey")); + CPPUNIT_ASSERT(SvPasswordHelper::CompareHashPassword(key1, password)); + uno::Reference xSect2(xSections->getByIndex(2), uno::UNO_QUERY); + uno::Sequence const key2(getProperty>(xSect2, "ProtectionKey")); + CPPUNIT_ASSERT(SvPasswordHelper::CompareHashPassword(key2, password)); + uno::Reference xSect3(xSections->getByIndex(3), uno::UNO_QUERY); + uno::Sequence const key3(getProperty>(xSect3, "ProtectionKey")); + CPPUNIT_ASSERT(SvPasswordHelper::CompareHashPassword(key3, password)); + + // we can't assume that the user entered the password; check that we + // round-trip the password as-is + if (isExported()) + { + xmlDocUniquePtr pXmlDoc = parseExport("content.xml"); + assertXPath(pXmlDoc, "//text:section[@text:name='Section0' and @text:protected='true' and @text:protection-key='vbnhxyBKtPHCA1wB21zG1Oha8ZA=']"_ostr); + assertXPath(pXmlDoc, "//text:section[@text:name='Section1' and @text:protected='true' and @text:protection-key='nLHas0RIwepGDaH4c2hpyIUvIS8=']"_ostr); + assertXPath(pXmlDoc, "//text:section[@text:name='Section2' and @text:protected='true' and @text:protection-key-digest-algorithm='http://www.w3.org/2000/09/xmldsig#sha256' and @text:protection-key='1tnJohagR2T0yF/v69hLPuumSTsj32CumW97nkKGuSQ=']"_ostr); + assertXPath(pXmlDoc, "//text:section[@text:name='Section3' and @text:protected='true' and @text:protection-key-digest-algorithm='http://www.w3.org/2000/09/xmldsig#sha256' and @text:protection-key='1tnJohagR2T0yF/v69hLPuumSTsj32CumW97nkKGuSQ=']"_ostr); + } +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf128188) +{ + loadAndReload("footnote-collect-at-end-of-section.fodt"); + SwDoc *const pDoc = dynamic_cast(*mxComponent).GetDocShell()->GetDoc(); + CPPUNIT_ASSERT(pDoc); + SwFootnoteIdxs const& rFootnotes(pDoc->GetFootnoteIdxs()); + // Section1 + CPPUNIT_ASSERT_EQUAL(sal_uInt16(1), rFootnotes[0]->GetFootnote().GetNumber()); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(1), rFootnotes[0]->GetFootnote().GetNumberRLHidden()); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(2), rFootnotes[1]->GetFootnote().GetNumber()); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(2), rFootnotes[1]->GetFootnote().GetNumberRLHidden()); + // Section2 + CPPUNIT_ASSERT_EQUAL(sal_uInt16(1), rFootnotes[2]->GetFootnote().GetNumber()); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(1), rFootnotes[2]->GetFootnote().GetNumberRLHidden()); + // deleted + CPPUNIT_ASSERT_EQUAL(sal_uInt16(2), rFootnotes[3]->GetFootnote().GetNumber()); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(1), rFootnotes[3]->GetFootnote().GetNumberRLHidden()); + // deleted + CPPUNIT_ASSERT_EQUAL(sal_uInt16(3), rFootnotes[4]->GetFootnote().GetNumber()); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(1), rFootnotes[4]->GetFootnote().GetNumberRLHidden()); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(4), rFootnotes[5]->GetFootnote().GetNumber()); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(2), rFootnotes[5]->GetFootnote().GetNumberRLHidden()); +} + +DECLARE_ODFEXPORT_TEST(testFdo43807, "fdo43807.odt") +{ + CPPUNIT_ASSERT_EQUAL(1, getPages()); + uno::Reference xSet(getParagraph(1), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Drop Caps"),getProperty(xSet,"DropCapCharStyleName")); + + xSet.set(getParagraph(2), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("User Defined Drop Caps"),getProperty(xSet,"DropCapCharStyleName")); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf103091) +{ + loadAndReload("tdf103091.fodt"); + // check that all conditional paragraph style conditions are imported + uno::Reference xParaStyles(getStyles("ParagraphStyles")); + uno::Reference xStyle1(xParaStyles->getByName( + "Text body"), uno::UNO_QUERY); + auto conditions(getProperty>(xStyle1, "ParaStyleConditions")); + + CPPUNIT_ASSERT_EQUAL(sal_Int32(28), conditions.getLength()); + CPPUNIT_ASSERT_EQUAL(OUString("TableHeader"), conditions[0].Name); + CPPUNIT_ASSERT_EQUAL(uno::Any(OUString("Addressee")), conditions[0].Value); + CPPUNIT_ASSERT_EQUAL(OUString("Table"), conditions[1].Name); + CPPUNIT_ASSERT_EQUAL(uno::Any(OUString("Bibliography 1")), conditions[1].Value); + CPPUNIT_ASSERT_EQUAL(OUString("Frame"), conditions[2].Name); + CPPUNIT_ASSERT_EQUAL(uno::Any(OUString("Bibliography Heading")), conditions[2].Value); + CPPUNIT_ASSERT_EQUAL(OUString("Section"), conditions[3].Name); + CPPUNIT_ASSERT_EQUAL(uno::Any(OUString("Caption")), conditions[3].Value); + CPPUNIT_ASSERT_EQUAL(OUString("Footnote"), conditions[4].Name); + CPPUNIT_ASSERT_EQUAL(uno::Any(OUString("Salutation")), conditions[4].Value); + CPPUNIT_ASSERT_EQUAL(OUString("Endnote"), conditions[5].Name); + CPPUNIT_ASSERT_EQUAL(uno::Any(OUString("Contents 1")), conditions[5].Value); + CPPUNIT_ASSERT_EQUAL(OUString("Header"), conditions[6].Name); + CPPUNIT_ASSERT_EQUAL(uno::Any(OUString("Contents 2")), conditions[6].Value); + CPPUNIT_ASSERT_EQUAL(OUString("Footer"), conditions[7].Name); + CPPUNIT_ASSERT_EQUAL(uno::Any(OUString("Contents 3")), conditions[7].Value); + CPPUNIT_ASSERT_EQUAL(OUString("OutlineLevel1"), conditions[8].Name); + CPPUNIT_ASSERT_EQUAL(uno::Any(OUString("Contents 4")), conditions[8].Value); + CPPUNIT_ASSERT_EQUAL(OUString("OutlineLevel2"), conditions[9].Name); + CPPUNIT_ASSERT_EQUAL(uno::Any(OUString("Contents 5")), conditions[9].Value); + CPPUNIT_ASSERT_EQUAL(OUString("OutlineLevel3"), conditions[10].Name); + CPPUNIT_ASSERT_EQUAL(uno::Any(OUString("Contents 6")), conditions[10].Value); + CPPUNIT_ASSERT_EQUAL(OUString("OutlineLevel4"), conditions[11].Name); + CPPUNIT_ASSERT_EQUAL(uno::Any(OUString("Contents 7")), conditions[11].Value); + CPPUNIT_ASSERT_EQUAL(OUString("OutlineLevel5"), conditions[12].Name); + CPPUNIT_ASSERT_EQUAL(uno::Any(OUString("Contents 8")), conditions[12].Value); + CPPUNIT_ASSERT_EQUAL(OUString("OutlineLevel6"), conditions[13].Name); + CPPUNIT_ASSERT_EQUAL(uno::Any(OUString("Contents 9")), conditions[13].Value); + CPPUNIT_ASSERT_EQUAL(OUString("OutlineLevel7"), conditions[14].Name); + CPPUNIT_ASSERT_EQUAL(uno::Any(OUString("Contents 10")), conditions[14].Value); + CPPUNIT_ASSERT_EQUAL(OUString("OutlineLevel8"), conditions[15].Name); + CPPUNIT_ASSERT_EQUAL(uno::Any(OUString("Contents Heading")), conditions[15].Value); + CPPUNIT_ASSERT_EQUAL(OUString("OutlineLevel9"), conditions[16].Name); + CPPUNIT_ASSERT_EQUAL(uno::Any(OUString("Standard")), conditions[16].Value); + CPPUNIT_ASSERT_EQUAL(OUString("OutlineLevel10"), conditions[17].Name); + CPPUNIT_ASSERT_EQUAL(uno::Any(OUString("Drawing")), conditions[17].Value); + CPPUNIT_ASSERT_EQUAL(OUString("NumberingLevel1"), conditions[18].Name); + CPPUNIT_ASSERT_EQUAL(uno::Any(OUString("Endnote")), conditions[18].Value); + CPPUNIT_ASSERT_EQUAL(OUString("NumberingLevel2"), conditions[19].Name); + CPPUNIT_ASSERT_EQUAL(uno::Any(OUString("First line indent")), conditions[19].Value); + CPPUNIT_ASSERT_EQUAL(OUString("NumberingLevel3"), conditions[20].Name); + CPPUNIT_ASSERT_EQUAL(uno::Any(OUString("Footer")), conditions[20].Value); + CPPUNIT_ASSERT_EQUAL(OUString("NumberingLevel4"), conditions[21].Name); + CPPUNIT_ASSERT_EQUAL(uno::Any(OUString("Footer left")), conditions[21].Value); + CPPUNIT_ASSERT_EQUAL(OUString("NumberingLevel5"), conditions[22].Name); + CPPUNIT_ASSERT_EQUAL(uno::Any(OUString("Footer right")), conditions[22].Value); + CPPUNIT_ASSERT_EQUAL(OUString("NumberingLevel6"), conditions[23].Name); + CPPUNIT_ASSERT_EQUAL(uno::Any(OUString("Footnote")), conditions[23].Value); + CPPUNIT_ASSERT_EQUAL(OUString("NumberingLevel7"), conditions[24].Name); + CPPUNIT_ASSERT_EQUAL(uno::Any(OUString("Frame contents")), conditions[24].Value); + CPPUNIT_ASSERT_EQUAL(OUString("NumberingLevel8"), conditions[25].Name); + CPPUNIT_ASSERT_EQUAL(uno::Any(OUString("Hanging indent")), conditions[25].Value); + CPPUNIT_ASSERT_EQUAL(OUString("NumberingLevel9"), conditions[26].Name); + CPPUNIT_ASSERT_EQUAL(uno::Any(OUString("Header")), conditions[26].Value); + CPPUNIT_ASSERT_EQUAL(OUString("NumberingLevel10"), conditions[27].Name); + CPPUNIT_ASSERT_EQUAL(uno::Any(OUString("Header left")), conditions[27].Value); +} + +DECLARE_ODFEXPORT_TEST(testTextframeTransparentShadow, "textframe-transparent-shadow.odt") +{ + CPPUNIT_ASSERT_EQUAL(1, getShapes()); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + uno::Reference xPicture = getShape(1); + // ODF stores opacity of 75%, that means 25% transparency. + CPPUNIT_ASSERT_EQUAL(sal_Int32(25), getProperty(xPicture, "ShadowTransparence")); +} + +DECLARE_ODFEXPORT_TEST(testRelhPage, "relh-page.odt") +{ + CPPUNIT_ASSERT_EQUAL(1, getShapes()); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + uno::Reference xTextFrame = getShape(1); + // This was text::RelOrientation::FRAME (the default), RelativeHeightRelation was not handled in xmloff. + CPPUNIT_ASSERT_EQUAL(text::RelOrientation::PAGE_FRAME, getProperty(xTextFrame, "RelativeHeightRelation")); + // Make sure rel-height-rel doesn't affect width. + CPPUNIT_ASSERT_EQUAL(text::RelOrientation::FRAME, getProperty(xTextFrame, "RelativeWidthRelation")); + + // This was 2601, 20% height was relative from margin, not page. + CPPUNIT_ASSERT_EQUAL(sal_Int32(3168), parseDump("/root/page/body/txt/anchored/fly/infos/bounds"_ostr, "height"_ostr).toInt32()); +} + +DECLARE_ODFEXPORT_TEST(testRelhPageTdf80282, "relh-page-tdf80282.odt") +{ + CPPUNIT_ASSERT_EQUAL(1, getShapes()); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + uno::Reference xTextFrame = getShape(1); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Height", sal_Int32(8391), parseDump("//anchored/fly/infos/bounds"_ostr, "height"_ostr).toInt32()); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Width", sal_Int32(5953), parseDump("//anchored/fly/infos/bounds"_ostr, "width"_ostr).toInt32()); +} + +DECLARE_ODFEXPORT_TEST(testRelwPage, "relw-page.odt") +{ + CPPUNIT_ASSERT_EQUAL(1, getShapes()); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + uno::Reference xTextFrame = getShape(1); + // This was text::RelOrientation::FRAME (the default), RelativeWidthRelation was not handled in xmloff. + CPPUNIT_ASSERT_EQUAL(text::RelOrientation::PAGE_FRAME, getProperty(xTextFrame, "RelativeWidthRelation")); + // Make sure rel-width-rel doesn't affect height. + CPPUNIT_ASSERT_EQUAL(text::RelOrientation::FRAME, getProperty(xTextFrame, "RelativeHeightRelation")); + + // This was 3762, 40% width was relative from margin, not page. + CPPUNIT_ASSERT_EQUAL(sal_Int32(4896), parseDump("/root/page/body/txt/anchored/fly/infos/bounds"_ostr, "width"_ostr).toInt32()); +} + +DECLARE_ODFEXPORT_TEST(testTextFrameVertAdjust, "textframe-vertadjust.odt") +{ + CPPUNIT_ASSERT_EQUAL(3, getShapes()); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + // Test import/export of new frame attribute called TextVerticalAdjust + + // 1st frame's context is adjusted to the top + uno::Reference xFrame(getTextFrameByName("Rectangle 1"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(drawing::TextVerticalAdjust_TOP, getProperty(xFrame, "TextVerticalAdjust")); + // 2nd frame's context is adjusted to the center + xFrame.set(getTextFrameByName("Rectangle 2"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(drawing::TextVerticalAdjust_CENTER, getProperty(xFrame, "TextVerticalAdjust")); + // 3rd frame's context is adjusted to the bottom + xFrame.set(getTextFrameByName("Rectangle 3"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(drawing::TextVerticalAdjust_BOTTOM, getProperty(xFrame, "TextVerticalAdjust")); +} + +DECLARE_ODFEXPORT_TEST(testTdf111891_frameVertStyle, "tdf111891_frameVertStyle.odt") +{ + CPPUNIT_ASSERT_EQUAL(1, getShapes()); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + uno::Reference xFrame(getShape(1), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(drawing::TextVerticalAdjust_BOTTOM, getProperty(xFrame, "TextVerticalAdjust")); +} + +DECLARE_ODFEXPORT_TEST(testShapeRelsize, "shape-relsize.odt") +{ + CPPUNIT_ASSERT_EQUAL(1, getShapes()); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + uno::Reference xShape = getShape(1); + // These were all 0, as style:rel-width/height was ignored on import for shapes. + CPPUNIT_ASSERT_EQUAL(sal_Int16(40), getProperty(xShape, "RelativeWidth")); + CPPUNIT_ASSERT_EQUAL(sal_Int16(20), getProperty(xShape, "RelativeHeight")); + + // Relation was "page" for both width and height, should be "paragraph" for width. + CPPUNIT_ASSERT_EQUAL(text::RelOrientation::FRAME, getProperty(xShape, "RelativeWidthRelation")); + // And make sure that height stays "page". + CPPUNIT_ASSERT_EQUAL(text::RelOrientation::PAGE_FRAME, getProperty(xShape, "RelativeHeightRelation")); +} + +DECLARE_ODFEXPORT_TEST(testTextboxRoundedCorners, "textbox-rounded-corners.odt") +{ + CPPUNIT_ASSERT_EQUAL(1, getShapes()); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + uno::Reference xShape = getShape(1); + comphelper::SequenceAsHashMap aCustomShapeGeometry(getProperty< uno::Sequence >(xShape, "CustomShapeGeometry")); + + // Test that the shape is a rounded rectangle. + CPPUNIT_ASSERT_EQUAL(OUString("round-rectangle"), aCustomShapeGeometry["Type"].get()); + + // The shape text should start with a table, with "a" in its A1 cell. + uno::Reference xText = uno::Reference(xShape, uno::UNO_QUERY_THROW)->getText(); + uno::Reference xTable(getParagraphOrTable(1, xText), uno::UNO_QUERY); + uno::Reference xCell(xTable->getCellByName("A1"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("a"), xCell->getString()); + + // Table inside a textbox should be in the extension namespace. + if (isExported()) + { + xmlDocUniquePtr pXmlDoc = parseExport("content.xml"); + // This failed, as draw:custom-shape had a table:table child. + assertXPath(pXmlDoc, "//draw:custom-shape/loext:table"_ostr, "name"_ostr, "Table1"); + } +} + +// test that import whitespace collapsing is compatible with old docs +DECLARE_ODFEXPORT_TEST(testWhitespace, "whitespace.odt") +{ + CPPUNIT_ASSERT_EQUAL(4, getShapes()); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + uno::Reference xPara; + uno::Reference xPortions; + uno::Reference xPortion; + xPara.set(getParagraphOrTable(1), uno::UNO_QUERY); + xPortions.set(xPara->createEnumeration()); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Text"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT_EQUAL(OUString("X "), xPortion->getString()); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Text"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT_EQUAL(OUString(" "), xPortion->getString()); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Text"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT_EQUAL(OUString(" X"), xPortion->getString()); + CPPUNIT_ASSERT(!xPortions->hasMoreElements()); + + xPara.set(getParagraphOrTable(2), uno::UNO_QUERY); + xPortions.set(xPara->createEnumeration()); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Text"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT_EQUAL(OUString("X "), xPortion->getString()); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Text"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT_EQUAL(OUString(" "), xPortion->getString()); + CPPUNIT_ASSERT_EQUAL(OUString("http://example.com/"), getProperty(xPortion, "HyperLinkURL")); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Text"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT_EQUAL(OUString(" X"), xPortion->getString()); + CPPUNIT_ASSERT(!xPortions->hasMoreElements()); + + xPara.set(getParagraphOrTable(3), uno::UNO_QUERY); + xPortions.set(xPara->createEnumeration()); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Text"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT_EQUAL(OUString("X "), xPortion->getString()); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Ruby"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT_EQUAL(OUString(), xPortion->getString()); + CPPUNIT_ASSERT_EQUAL(OUString("foo"), getProperty(xPortion, "RubyText")); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Text"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT_EQUAL(OUString(" "), xPortion->getString()); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Ruby"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT_EQUAL(OUString(), xPortion->getString()); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Text"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT_EQUAL(OUString(" X"), xPortion->getString()); + CPPUNIT_ASSERT(!xPortions->hasMoreElements()); + + xPara.set(getParagraphOrTable(4), uno::UNO_QUERY); + xPortions.set(xPara->createEnumeration()); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Text"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT_EQUAL(OUString("X "), xPortion->getString()); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("InContentMetadata"), getProperty(xPortion, "TextPortionType")); + { + // what a stupid idea to require recursively enumerating this + uno::Reference xMeta( + getProperty>(xPortion, "InContentMetadata"), uno::UNO_QUERY); + uno::Reference xMetaPortions = + xMeta->createEnumeration(); + uno::Reference xMP(xMetaPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Text"), getProperty(xMP, "TextPortionType")); + CPPUNIT_ASSERT_EQUAL(OUString(" "), xMP->getString()); + CPPUNIT_ASSERT(!xMetaPortions->hasMoreElements()); + } + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Text"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT_EQUAL(OUString(" X"), xPortion->getString()); + CPPUNIT_ASSERT(!xPortions->hasMoreElements()); + + xPara.set(getParagraphOrTable(5), uno::UNO_QUERY); + xPortions.set(xPara->createEnumeration()); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Text"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT_EQUAL(OUString("X "), xPortion->getString()); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("TextField"), getProperty(xPortion, "TextPortionType")); + { + // what a stupid idea to require recursively enumerating this + uno::Reference xMeta( + getProperty>(xPortion, "TextField"), uno::UNO_QUERY); + uno::Reference xMetaPortions = + xMeta->createEnumeration(); + uno::Reference xMP(xMetaPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Text"), getProperty(xMP, "TextPortionType")); + CPPUNIT_ASSERT_EQUAL(OUString(" "), xMP->getString()); + CPPUNIT_ASSERT(!xMetaPortions->hasMoreElements()); + } + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Text"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT_EQUAL(OUString(" X"), xPortion->getString()); + CPPUNIT_ASSERT(!xPortions->hasMoreElements()); + + xPara.set(getParagraphOrTable(7), uno::UNO_QUERY); + xPortions.set(xPara->createEnumeration()); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Text"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT_EQUAL(OUString("X "), xPortion->getString()); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Frame"), getProperty(xPortion, "TextPortionType")); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Text"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT_EQUAL(OUString(" X"), xPortion->getString()); + CPPUNIT_ASSERT(!xPortions->hasMoreElements()); + + xPara.set(getParagraphOrTable(8), uno::UNO_QUERY); + xPortions.set(xPara->createEnumeration()); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Text"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT_EQUAL(OUString("X "), xPortion->getString()); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Frame"), getProperty(xPortion, "TextPortionType")); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Text"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT_EQUAL(OUString(" X"), xPortion->getString()); + CPPUNIT_ASSERT(!xPortions->hasMoreElements()); + + xPara.set(getParagraphOrTable(9), uno::UNO_QUERY); + xPortions.set(xPara->createEnumeration()); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Text"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT_EQUAL(OUString("X "), xPortion->getString()); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Frame"), getProperty(xPortion, "TextPortionType")); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Text"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT_EQUAL(OUString(" X"), xPortion->getString()); + CPPUNIT_ASSERT(!xPortions->hasMoreElements()); + + xPara.set(getParagraphOrTable(10), uno::UNO_QUERY); + uno::Reference xCEA(xPara, uno::UNO_QUERY); + uno::Reference xFrames( + xCEA->createContentEnumeration("com.sun.star.text.TextContent")); + xFrames->nextElement(); // one at-paragraph frame + CPPUNIT_ASSERT(!xFrames->hasMoreElements()); + xPortions.set(xPara->createEnumeration()); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Text"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT_EQUAL(OUString(" X"), xPortion->getString()); + CPPUNIT_ASSERT(!xPortions->hasMoreElements()); + + xPara.set(getParagraphOrTable(11), uno::UNO_QUERY); + xPortions.set(xPara->createEnumeration()); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Text"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT_EQUAL(OUString("X "), xPortion->getString()); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Footnote"), getProperty(xPortion, "TextPortionType")); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Text"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT_EQUAL(OUString(" X"), xPortion->getString()); + CPPUNIT_ASSERT(!xPortions->hasMoreElements()); + + xPara.set(getParagraphOrTable(12), uno::UNO_QUERY); + xPortions.set(xPara->createEnumeration()); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Text"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT_EQUAL(OUString("X "), xPortion->getString()); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("TextField"), getProperty(xPortion, "TextPortionType")); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Text"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT_EQUAL(OUString(" X"), xPortion->getString()); + CPPUNIT_ASSERT(!xPortions->hasMoreElements()); + + xPara.set(getParagraphOrTable(13), uno::UNO_QUERY); + xPortions.set(xPara->createEnumeration()); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Text"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT_EQUAL(OUString("X "), xPortion->getString()); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Annotation"), getProperty(xPortion, "TextPortionType")); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Text"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT_EQUAL(OUString(" "), xPortion->getString()); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("AnnotationEnd"), getProperty(xPortion, "TextPortionType")); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Text"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT_EQUAL(OUString(" X"), xPortion->getString()); + CPPUNIT_ASSERT(!xPortions->hasMoreElements()); + + xPara.set(getParagraphOrTable(15), uno::UNO_QUERY); + xPortions.set(xPara->createEnumeration()); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Text"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT_EQUAL(OUString("X "), xPortion->getString()); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Bookmark"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT(getProperty(xPortion, "IsCollapsed")); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Text"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT_EQUAL(OUString(" X"), xPortion->getString()); + CPPUNIT_ASSERT(!xPortions->hasMoreElements()); + + xPara.set(getParagraphOrTable(16), uno::UNO_QUERY); + xPortions.set(xPara->createEnumeration()); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Text"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT_EQUAL(OUString("X "), xPortion->getString()); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Bookmark"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT(!getProperty(xPortion, "IsCollapsed")); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Text"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT_EQUAL(OUString(" "), xPortion->getString()); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Bookmark"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT(!getProperty(xPortion, "IsCollapsed")); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Text"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT_EQUAL(OUString(" X"), xPortion->getString()); + CPPUNIT_ASSERT(!xPortions->hasMoreElements()); + + xPara.set(getParagraphOrTable(17), uno::UNO_QUERY); + xPortions.set(xPara->createEnumeration()); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Text"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT_EQUAL(OUString("X "), xPortion->getString()); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Redline"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT(!getProperty(xPortion, "IsCollapsed")); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Text"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT_EQUAL(OUString(" "), xPortion->getString()); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Redline"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT(!getProperty(xPortion, "IsCollapsed")); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Text"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT_EQUAL(OUString(" X"), xPortion->getString()); + CPPUNIT_ASSERT(!xPortions->hasMoreElements()); + + xPara.set(getParagraphOrTable(18), uno::UNO_QUERY); + xPortions.set(xPara->createEnumeration()); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Text"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT_EQUAL(OUString("X "), xPortion->getString()); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Redline"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT(!getProperty(xPortion, "IsCollapsed")); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Text"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT_EQUAL(OUString(" "), xPortion->getString()); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Redline"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT(!getProperty(xPortion, "IsCollapsed")); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Text"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT_EQUAL(OUString(" X"), xPortion->getString()); + CPPUNIT_ASSERT(!xPortions->hasMoreElements()); + + xPara.set(getParagraphOrTable(19), uno::UNO_QUERY); + xPortions.set(xPara->createEnumeration()); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Text"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT_EQUAL(OUString("X "), xPortion->getString()); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("ReferenceMark"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT(getProperty(xPortion, "IsCollapsed")); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Text"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT_EQUAL(OUString(" X"), xPortion->getString()); + CPPUNIT_ASSERT(!xPortions->hasMoreElements()); + + xPara.set(getParagraphOrTable(20), uno::UNO_QUERY); + xPortions.set(xPara->createEnumeration()); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Text"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT_EQUAL(OUString("X "), xPortion->getString()); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("ReferenceMark"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT(!getProperty(xPortion, "IsCollapsed")); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Text"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT_EQUAL(OUString(" "), xPortion->getString()); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("ReferenceMark"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT(!getProperty(xPortion, "IsCollapsed")); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Text"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT_EQUAL(OUString(" X"), xPortion->getString()); + CPPUNIT_ASSERT(!xPortions->hasMoreElements()); + + xPara.set(getParagraphOrTable(21), uno::UNO_QUERY); + xPortions.set(xPara->createEnumeration()); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Text"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT_EQUAL(OUString("X "), xPortion->getString()); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("DocumentIndexMark"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT(getProperty(xPortion, "IsCollapsed")); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Text"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT_EQUAL(OUString(" X"), xPortion->getString()); + CPPUNIT_ASSERT(!xPortions->hasMoreElements()); + + xPara.set(getParagraphOrTable(22), uno::UNO_QUERY); + xPortions.set(xPara->createEnumeration()); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Text"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT_EQUAL(OUString("X "), xPortion->getString()); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("DocumentIndexMark"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT(!getProperty(xPortion, "IsCollapsed")); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Text"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT_EQUAL(OUString(" "), xPortion->getString()); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("DocumentIndexMark"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT(!getProperty(xPortion, "IsCollapsed")); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Text"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT_EQUAL(OUString(" X"), xPortion->getString()); + CPPUNIT_ASSERT(!xPortions->hasMoreElements()); +} + +DECLARE_ODFEXPORT_TEST(testTdf136645, "tdf136645.odt") +{ + CPPUNIT_ASSERT_EQUAL(1, getPages()); + + // Without the fix in place, this would have failed with + //- Expected: 2640 + //- Actual : 3000 + CPPUNIT_ASSERT_EQUAL(sal_Int32(2640), parseDump("/root/page/body/section/column[1]/body/infos/bounds"_ostr, "width"_ostr).toInt32()); + + //- Expected: 6000 + //- Actual : 6360 + CPPUNIT_ASSERT_EQUAL(sal_Int32(6000), parseDump("/root/page/body/section/column[2]/body/infos/bounds"_ostr, "width"_ostr).toInt32()); +} + +DECLARE_ODFEXPORT_TEST(testBtlrCell, "btlr-cell.odt") +{ + CPPUNIT_ASSERT_EQUAL(1, getPages()); + // Without the accompanying fix in place, this test would have failed, as + // the btlr text direction in the A1 cell was lost on ODF import and + // export. + uno::Reference xSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xTables = xSupplier->getTextTables(); + uno::Reference xTable(xTables->getByName("Table1"), uno::UNO_QUERY); + uno::Reference xA1(xTable->getCellByName("A1"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(text::WritingMode2::BT_LR, getProperty(xA1, "WritingMode")); + + uno::Reference xB1(xTable->getCellByName("B1"), uno::UNO_QUERY); + auto nActual = getProperty(xB1, "WritingMode"); + CPPUNIT_ASSERT(nActual == text::WritingMode2::LR_TB || nActual == text::WritingMode2::CONTEXT); + + uno::Reference xC1(xTable->getCellByName("C1"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(text::WritingMode2::TB_RL, getProperty(xC1, "WritingMode")); +} + +DECLARE_ODFEXPORT_TEST(testBtlrFrame, "btlr-frame.odt") +{ + CPPUNIT_ASSERT_EQUAL(1, getShapes()); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + // Without the accompanying fix in place, this test would have failed, as + // the btlr text direction in the text frame was lost on ODF import and + // export. + uno::Reference xTextFrame(getShape(1), uno::UNO_QUERY); + CPPUNIT_ASSERT(xTextFrame.is()); + + auto nActual = getProperty(xTextFrame, "WritingMode"); + CPPUNIT_ASSERT_EQUAL(text::WritingMode2::BT_LR, nActual); + + // Without the accompanying fix in place, this test would have failed, as the fly frame had + // mbVertical==true, but mbVertLRBT==false, even if the writing direction in the doc model was + // btlr. + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pTextDoc); + + SwDoc* pDoc = pTextDoc->GetDocShell()->GetDoc(); + CPPUNIT_ASSERT(pDoc); + + SwRootFrame* pLayout = pDoc->getIDocumentLayoutAccess().GetCurrentLayout(); + CPPUNIT_ASSERT(pLayout); + + SwFrame* pPageFrame = pLayout->GetLower(); + CPPUNIT_ASSERT(pPageFrame); + CPPUNIT_ASSERT(pPageFrame->IsPageFrame()); + + SwFrame* pBodyFrame = pPageFrame->GetLower(); + CPPUNIT_ASSERT(pBodyFrame); + CPPUNIT_ASSERT(pBodyFrame->IsBodyFrame()); + + SwFrame* pBodyTextFrame = pBodyFrame->GetLower(); + CPPUNIT_ASSERT(pBodyTextFrame); + CPPUNIT_ASSERT(pBodyTextFrame->IsTextFrame()); + + CPPUNIT_ASSERT(pBodyTextFrame->GetDrawObjs()); + const SwSortedObjs& rAnchored = *pBodyTextFrame->GetDrawObjs(); + CPPUNIT_ASSERT_EQUAL(static_cast(1), rAnchored.size()); + + auto* pFlyFrame = dynamic_cast(rAnchored[0]); + CPPUNIT_ASSERT(pFlyFrame); + CPPUNIT_ASSERT(pFlyFrame->IsVertLRBT()); + + if (!isExported()) + // Not yet exported, don't modify the doc model for test purposes. + return; + + // Make sure that btlr -> tbrl transition clears the "BT" flag. + xTextFrame->setPropertyValue("WritingMode", uno::Any(text::WritingMode2::TB_LR)); + pFlyFrame = dynamic_cast(rAnchored[0]); + CPPUNIT_ASSERT(pFlyFrame); + CPPUNIT_ASSERT(!pFlyFrame->IsVertLRBT()); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf129520) +{ + loadAndReload("tdf129520.docx"); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + CPPUNIT_ASSERT_EQUAL(OUString("M"), getParagraph(1)->getString()); + + // Without this fix in place, this test would have failed with + // - Expected: Ma + // - Actual : + CPPUNIT_ASSERT_EQUAL(OUString("Ma"), getParagraph(2)->getString()); + CPPUNIT_ASSERT_EQUAL(OUString("1815"), getParagraph(3)->getString()); +} + +DECLARE_ODFEXPORT_TEST(testFdo86963, "fdo86963.odt") +{ + CPPUNIT_ASSERT_EQUAL(1, getPages()); + // Export of this document failed with beans::UnknownPropertyException. + CPPUNIT_ASSERT_EQUAL(1, getShapes()); +} + +DECLARE_ODFEXPORT_TEST(testTdf135338_firstLeftPageFooter, "tdf135338_firstLeftPageFooter.odt") +{ + CPPUNIT_ASSERT_EQUAL(6, getPages()); + // The first page is a left page only style, but it should still show the first page footer + // instead of the left footer text "EVEN/LEFT (Left page only)" + CPPUNIT_ASSERT_EQUAL(OUString("First (Left page only)"), parseDump("/root/page[2]/footer/txt/text()"_ostr)); +} + +DECLARE_ODFEXPORT_TEST(testGerrit13858, "gerrit13858.odt") +{ + CPPUNIT_ASSERT_EQUAL(1, getShapes()); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + // Just make sure the output is valid. +} +DECLARE_ODFEXPORT_TEST(testOdtBorderTypes, "border_types.odt") +{ + CPPUNIT_ASSERT_EQUAL(1, getPages()); + static const sal_Int32 lineStyles[] = { 0, 1, 2, 14, 16, 17, 3, 15 }; + uno::Reference textDocument(mxComponent, uno::UNO_QUERY); + uno::Reference xParaEnumAccess(textDocument->getText(), uno::UNO_QUERY); + // list of paragraphs + uno::Reference xParaEnum = xParaEnumAccess->createEnumeration(); + do + { + uno::Reference xServiceInfo; + if (xParaEnum->nextElement() >>= xServiceInfo) + { + if (xServiceInfo->supportsService("com.sun.star.text.TextTable")) + { + uno::Reference const xCellRange(xServiceInfo, uno::UNO_QUERY_THROW); + + for (sal_Int32 row = 0; row < 15; row += 2) + { + uno::Reference xCell = xCellRange->getCellByPosition(1, row); + uno::Reference< beans::XPropertySet > xPropSet(xCell, uno::UNO_QUERY_THROW); + + uno::Any aTopBorder = xPropSet->getPropertyValue("TopBorder"); + table::BorderLine2 aTopBorderLine; + if (aTopBorder >>= aTopBorderLine) + { + sal_Int32 lineStyle = aTopBorderLine.LineStyle; + CPPUNIT_ASSERT_EQUAL(lineStyles[row / 2], lineStyle); + } + } //end of the 'for' loop + } + } + } while (xParaEnum->hasMoreElements()); +} + +DECLARE_ODFEXPORT_TEST(testMasterPageWithDrawingPage, "sw_hatch.odt") +{ + CPPUNIT_ASSERT_EQUAL(1, getPages()); + uno::Reference xStyles(getStyles("PageStyles")); + uno::Reference xStyle(xStyles->getByName("Standard"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_HATCH, getProperty(xStyle, "FillStyle")); + CPPUNIT_ASSERT_EQUAL(OUString("Blue -45 Degrees"), getProperty(xStyle, "FillHatchName")); + CPPUNIT_ASSERT(!getProperty(xStyle, "FillBackground")); + CPPUNIT_ASSERT_EQUAL(sal_Int16(0), getProperty(xStyle, "FillTransparence")); +} + +CPPUNIT_TEST_FIXTURE(Test, testPageStyleBackgroundFullSizeOOo) +{ + loadAndReload("pagestyle_background_ooo33.odt"); + CPPUNIT_ASSERT_EQUAL(3, getPages()); + xmlDocUniquePtr pXmlDoc = parseExport("styles.xml"); + // Standard + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " + "/office:document-styles/office:master-styles/style:master-page[@style:name='Standard']/attribute::draw:style-name" + "]/style:drawing-page-properties"_ostr, "background-size"_ostr, "border"); + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " + "/office:document-styles/office:master-styles/style:master-page[@style:name='Standard']/attribute::draw:style-name" + "]/style:drawing-page-properties"_ostr, "fill"_ostr, "solid"); + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " + "/office:document-styles/office:master-styles/style:master-page[@style:name='Standard']/attribute::draw:style-name" + "]/style:drawing-page-properties"_ostr, "fill-color"_ostr, "#99ccff"); + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " + "/office:document-styles/office:master-styles/style:master-page[@style:name='Standard']/attribute::draw:style-name" + "]/style:drawing-page-properties"_ostr, "opacity"_ostr, "100%"); + // Endnote + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " + "/office:document-styles/office:master-styles/style:master-page[@style:name='Endnote']/attribute::draw:style-name" + "]/style:drawing-page-properties"_ostr, "background-size"_ostr, "border"); + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " + "/office:document-styles/office:master-styles/style:master-page[@style:name='Endnote']/attribute::draw:style-name" + "]/style:drawing-page-properties"_ostr, "fill"_ostr, "bitmap"); + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " + "/office:document-styles/office:master-styles/style:master-page[@style:name='Endnote']/attribute::draw:style-name" + "]/style:drawing-page-properties"_ostr, "repeat"_ostr, "repeat"); + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " + "/office:document-styles/office:master-styles/style:master-page[@style:name='Endnote']/attribute::draw:style-name" + "]/style:drawing-page-properties"_ostr, "fill-image-ref-point"_ostr, "top-left"); + // Footnote + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " + "/office:document-styles/office:master-styles/style:master-page[@style:name='Footnote']/attribute::draw:style-name" + "]/style:drawing-page-properties"_ostr, "background-size"_ostr, "border"); + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " + "/office:document-styles/office:master-styles/style:master-page[@style:name='Footnote']/attribute::draw:style-name" + "]/style:drawing-page-properties"_ostr, "fill"_ostr, "bitmap"); + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " + "/office:document-styles/office:master-styles/style:master-page[@style:name='Footnote']/attribute::draw:style-name" + "]/style:drawing-page-properties"_ostr, "repeat"_ostr, "stretch"); + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " + "/office:document-styles/office:master-styles/style:master-page[@style:name='Footnote']/attribute::draw:style-name" + "]/style:drawing-page-properties"_ostr, "fill-image-ref-point"_ostr, "top-left"); +} + +CPPUNIT_TEST_FIXTURE(Test, testPageStyleBackgroundFullSizeLO64) +{ + loadAndReload("pagestyle_background_lo64.odt"); + CPPUNIT_ASSERT_EQUAL(6, getPages()); + xmlDocUniquePtr pXmlDoc = parseExport("styles.xml"); + // Standard + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " + "/office:document-styles/office:master-styles/style:master-page[@style:name='Standard']/attribute::draw:style-name" + "]/style:drawing-page-properties"_ostr, "background-size"_ostr, "full"); + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " + "/office:document-styles/office:master-styles/style:master-page[@style:name='Standard']/attribute::draw:style-name" + "]/style:drawing-page-properties"_ostr, "fill"_ostr, "solid"); + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " + "/office:document-styles/office:master-styles/style:master-page[@style:name='Standard']/attribute::draw:style-name" + "]/style:drawing-page-properties"_ostr, "fill-color"_ostr, "#99ccff"); + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " + "/office:document-styles/office:master-styles/style:master-page[@style:name='Standard']/attribute::draw:style-name" + "]/style:drawing-page-properties"_ostr, "opacity"_ostr, "100%"); + // Endnote + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " + "/office:document-styles/office:master-styles/style:master-page[@style:name='Endnote']/attribute::draw:style-name" + "]/style:drawing-page-properties"_ostr, "background-size"_ostr, "full"); + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " + "/office:document-styles/office:master-styles/style:master-page[@style:name='Endnote']/attribute::draw:style-name" + "]/style:drawing-page-properties"_ostr, "fill"_ostr, "bitmap"); + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " + "/office:document-styles/office:master-styles/style:master-page[@style:name='Endnote']/attribute::draw:style-name" + "]/style:drawing-page-properties"_ostr, "repeat"_ostr, "repeat"); + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " + "/office:document-styles/office:master-styles/style:master-page[@style:name='Endnote']/attribute::draw:style-name" + "]/style:drawing-page-properties"_ostr, "fill-image-ref-point"_ostr, "top-left"); + // Footnote + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " + "/office:document-styles/office:master-styles/style:master-page[@style:name='Footnote']/attribute::draw:style-name" + "]/style:drawing-page-properties"_ostr, "background-size"_ostr, "border"); + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " + "/office:document-styles/office:master-styles/style:master-page[@style:name='Footnote']/attribute::draw:style-name" + "]/style:drawing-page-properties"_ostr, "fill"_ostr, "bitmap"); + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " + "/office:document-styles/office:master-styles/style:master-page[@style:name='Footnote']/attribute::draw:style-name" + "]/style:drawing-page-properties"_ostr, "repeat"_ostr, "stretch"); + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " + "/office:document-styles/office:master-styles/style:master-page[@style:name='Footnote']/attribute::draw:style-name" + "]/style:drawing-page-properties"_ostr, "fill-image-ref-point"_ostr, "top-left"); + // Landscape + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " + "/office:document-styles/office:master-styles/style:master-page[@style:name='Landscape']/attribute::draw:style-name" + "]/style:drawing-page-properties"_ostr, "background-size"_ostr, "border"); + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " + "/office:document-styles/office:master-styles/style:master-page[@style:name='Landscape']/attribute::draw:style-name" + "]/style:drawing-page-properties"_ostr, "fill"_ostr, "bitmap"); + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " + "/office:document-styles/office:master-styles/style:master-page[@style:name='Landscape']/attribute::draw:style-name" + "]/style:drawing-page-properties"_ostr, "repeat"_ostr, "no-repeat"); + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " + "/office:document-styles/office:master-styles/style:master-page[@style:name='Landscape']/attribute::draw:style-name" + "]/style:drawing-page-properties"_ostr, "fill-image-ref-point"_ostr, "top-left"); + // Index + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " + "/office:document-styles/office:master-styles/style:master-page[@style:name='Index']/attribute::draw:style-name" + "]/style:drawing-page-properties"_ostr, "background-size"_ostr, "full"); + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " + "/office:document-styles/office:master-styles/style:master-page[@style:name='Index']/attribute::draw:style-name" + "]/style:drawing-page-properties"_ostr, "fill"_ostr, "gradient"); + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " + "/office:document-styles/office:master-styles/style:master-page[@style:name='Index']/attribute::draw:style-name" + "]/style:drawing-page-properties"_ostr, "gradient-step-count"_ostr, "0"); + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " + "/office:document-styles/office:master-styles/style:master-page[@style:name='Index']/attribute::draw:style-name" + "]/style:drawing-page-properties"_ostr, "opacity"_ostr, "100%"); + // First Page + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " + "/office:document-styles/office:master-styles/style:master-page[@style:name='First_20_Page']/attribute::draw:style-name" + "]/style:drawing-page-properties"_ostr, "background-size"_ostr, "full"); + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " + "/office:document-styles/office:master-styles/style:master-page[@style:name='First_20_Page']/attribute::draw:style-name" + "]/style:drawing-page-properties"_ostr, "fill"_ostr, "hatch"); + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " + "/office:document-styles/office:master-styles/style:master-page[@style:name='First_20_Page']/attribute::draw:style-name" + "]/style:drawing-page-properties"_ostr, "fill-hatch-solid"_ostr, "false"); + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " + "/office:document-styles/office:master-styles/style:master-page[@style:name='First_20_Page']/attribute::draw:style-name" + "]/style:drawing-page-properties"_ostr, "opacity"_ostr, "100%"); +} + +CPPUNIT_TEST_FIXTURE(Test, testPageStyleBackgroundFullSizeLO70) +{ + loadAndReload("pagestyle_background_lo70.odt"); + CPPUNIT_ASSERT_EQUAL(6, getPages()); + xmlDocUniquePtr pXmlDoc = parseExport("styles.xml"); + // Standard + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " + "/office:document-styles/office:master-styles/style:master-page[@style:name='Standard']/attribute::draw:style-name" + "]/style:drawing-page-properties"_ostr, "background-size"_ostr, "full"); + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " + "/office:document-styles/office:master-styles/style:master-page[@style:name='Standard']/attribute::draw:style-name" + "]/style:drawing-page-properties"_ostr, "fill"_ostr, "solid"); + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " + "/office:document-styles/office:master-styles/style:master-page[@style:name='Standard']/attribute::draw:style-name" + "]/style:drawing-page-properties"_ostr, "fill-color"_ostr, "#99ccff"); + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " + "/office:document-styles/office:master-styles/style:master-page[@style:name='Standard']/attribute::draw:style-name" + "]/style:drawing-page-properties"_ostr, "opacity"_ostr, "100%"); + // Endnote + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " + "/office:document-styles/office:master-styles/style:master-page[@style:name='Endnote']/attribute::draw:style-name" + "]/style:drawing-page-properties"_ostr, "background-size"_ostr, "full"); + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " + "/office:document-styles/office:master-styles/style:master-page[@style:name='Endnote']/attribute::draw:style-name" + "]/style:drawing-page-properties"_ostr, "fill"_ostr, "bitmap"); + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " + "/office:document-styles/office:master-styles/style:master-page[@style:name='Endnote']/attribute::draw:style-name" + "]/style:drawing-page-properties"_ostr, "repeat"_ostr, "repeat"); + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " + "/office:document-styles/office:master-styles/style:master-page[@style:name='Endnote']/attribute::draw:style-name" + "]/style:drawing-page-properties"_ostr, "fill-image-ref-point"_ostr, "top-left"); + // Footnote + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " + "/office:document-styles/office:master-styles/style:master-page[@style:name='Footnote']/attribute::draw:style-name" + "]/style:drawing-page-properties"_ostr, "background-size"_ostr, "border"); + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " + "/office:document-styles/office:master-styles/style:master-page[@style:name='Footnote']/attribute::draw:style-name" + "]/style:drawing-page-properties"_ostr, "fill"_ostr, "bitmap"); + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " + "/office:document-styles/office:master-styles/style:master-page[@style:name='Footnote']/attribute::draw:style-name" + "]/style:drawing-page-properties"_ostr, "repeat"_ostr, "stretch"); + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " + "/office:document-styles/office:master-styles/style:master-page[@style:name='Footnote']/attribute::draw:style-name" + "]/style:drawing-page-properties"_ostr, "fill-image-ref-point"_ostr, "top-left"); + // Landscape + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " + "/office:document-styles/office:master-styles/style:master-page[@style:name='Landscape']/attribute::draw:style-name" + "]/style:drawing-page-properties"_ostr, "background-size"_ostr, "border"); + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " + "/office:document-styles/office:master-styles/style:master-page[@style:name='Landscape']/attribute::draw:style-name" + "]/style:drawing-page-properties"_ostr, "fill"_ostr, "bitmap"); + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " + "/office:document-styles/office:master-styles/style:master-page[@style:name='Landscape']/attribute::draw:style-name" + "]/style:drawing-page-properties"_ostr, "repeat"_ostr, "no-repeat"); + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " + "/office:document-styles/office:master-styles/style:master-page[@style:name='Landscape']/attribute::draw:style-name" + "]/style:drawing-page-properties"_ostr, "fill-image-ref-point"_ostr, "top-left"); + // Index + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " + "/office:document-styles/office:master-styles/style:master-page[@style:name='Index']/attribute::draw:style-name" + "]/style:drawing-page-properties"_ostr, "background-size"_ostr, "full"); + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " + "/office:document-styles/office:master-styles/style:master-page[@style:name='Index']/attribute::draw:style-name" + "]/style:drawing-page-properties"_ostr, "fill"_ostr, "gradient"); + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " + "/office:document-styles/office:master-styles/style:master-page[@style:name='Index']/attribute::draw:style-name" + "]/style:drawing-page-properties"_ostr, "gradient-step-count"_ostr, "0"); + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " + "/office:document-styles/office:master-styles/style:master-page[@style:name='Index']/attribute::draw:style-name" + "]/style:drawing-page-properties"_ostr, "opacity"_ostr, "100%"); + // First Page + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " + "/office:document-styles/office:master-styles/style:master-page[@style:name='First_20_Page']/attribute::draw:style-name" + "]/style:drawing-page-properties"_ostr, "background-size"_ostr, "full"); + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " + "/office:document-styles/office:master-styles/style:master-page[@style:name='First_20_Page']/attribute::draw:style-name" + "]/style:drawing-page-properties"_ostr, "fill"_ostr, "hatch"); + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " + "/office:document-styles/office:master-styles/style:master-page[@style:name='First_20_Page']/attribute::draw:style-name" + "]/style:drawing-page-properties"_ostr, "fill-hatch-solid"_ostr, "false"); + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " + "/office:document-styles/office:master-styles/style:master-page[@style:name='First_20_Page']/attribute::draw:style-name" + "]/style:drawing-page-properties"_ostr, "opacity"_ostr, "100%"); +} + +CPPUNIT_TEST_FIXTURE(Test, testFillBitmapUnused) +{ + loadAndReload("fillbitmap3.odt"); + CPPUNIT_ASSERT_EQUAL(4, getShapes()); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + // nav_5f_home and all its references are completely gone + xmlDocUniquePtr pXmlDoc = parseExport("styles.xml"); + + // paragraph style + assertXPath(pXmlDoc, + "/office:document-styles/office:styles/style:style[@style:name='Text_20_body']/loext:graphic-properties"_ostr, "fill"_ostr, "solid"); + assertXPath(pXmlDoc, + "/office:document-styles/office:styles/style:style[@style:name='Text_20_body']/loext:graphic-properties"_ostr, "fill-color"_ostr, "#c0c0c0"); + assertXPath(pXmlDoc, + "/office:document-styles/office:styles/style:style[@style:name='Text_20_body']/loext:graphic-properties[@draw:fill-image-name]"_ostr, 0); + + // page style page-layout + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:page-layout[@style:name='Mpm1']/style:page-layout-properties"_ostr, "fill"_ostr, "bitmap"); + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:page-layout[@style:name='Mpm1']/style:page-layout-properties"_ostr, "fill-image-name"_ostr, "nav_5f_up"); + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:page-layout[@style:name='Mpm1']/style:header-style/style:header-footer-properties"_ostr, "fill"_ostr, "bitmap"); + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:page-layout[@style:name='Mpm1']/style:header-style/style:header-footer-properties"_ostr, "fill-image-name"_ostr, "nav_5f_up"); + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:page-layout[@style:name='Mpm1']/style:footer-style/style:header-footer-properties"_ostr, "fill"_ostr, "bitmap"); + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:page-layout[@style:name='Mpm1']/style:footer-style/style:header-footer-properties"_ostr, "fill-image-name"_ostr, "nav_5f_up"); + + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:page-layout[@style:name='Mpm2']/style:page-layout-properties"_ostr, "fill"_ostr, "solid"); + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:page-layout[@style:name='Mpm2']/style:page-layout-properties[@draw:fill-image-name]"_ostr, 0); + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:page-layout[@style:name='Mpm2']/style:header-style/style:header-footer-properties"_ostr, "fill"_ostr, "solid"); + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:page-layout[@style:name='Mpm2']/style:header-style/style:header-footer-properties[@draw:fill-image-name]"_ostr, 0); + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:page-layout[@style:name='Mpm2']/style:footer-style/style:header-footer-properties"_ostr, "fill"_ostr, "solid"); + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:page-layout[@style:name='Mpm2']/style:footer-style/style:header-footer-properties[@draw:fill-image-name]"_ostr, 0); + + // page style drawing-page + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:name='Mdp1']/style:drawing-page-properties"_ostr, "fill"_ostr, "bitmap"); + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:name='Mdp1']/style:drawing-page-properties"_ostr, "fill-image-name"_ostr, "nav_5f_up"); + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:name='Mdp2']/style:drawing-page-properties"_ostr, "fill"_ostr, "solid"); + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:name='Mdp2']/style:drawing-page-properties"_ostr, "fill-color"_ostr, "#c0c0c0"); + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:name='Mdp2']/style:drawing-page-properties[@draw:fill-image-name]"_ostr, 0); + + // the named items + assertXPath(pXmlDoc, + "/office:document-styles/office:styles/draw:fill-image"_ostr, 1); + assertXPath(pXmlDoc, + "/office:document-styles/office:styles/draw:fill-image"_ostr, "name"_ostr, "nav_5f_up"); +} + +DECLARE_ODFEXPORT_TEST(testCellUserDefineAttr, "userdefattr-tablecell.odt") +{ + CPPUNIT_ASSERT_EQUAL(1, getPages()); + uno::Reference xTable(getParagraphOrTable(1), uno::UNO_QUERY); + uno::Reference const xCellA1(xTable->getCellByName("A1"), uno::UNO_SET_THROW); + uno::Reference const xCellB1(xTable->getCellByName("B1"), uno::UNO_SET_THROW); + uno::Reference const xCellC1(xTable->getCellByName("C1"), uno::UNO_SET_THROW); + getUserDefineAttribute(uno::Any(xCellA1), "proName", "v1"); + getUserDefineAttribute(uno::Any(xCellB1), "proName", "v2"); + getUserDefineAttribute(uno::Any(xCellC1), "proName", "v3"); +} + +DECLARE_ODFEXPORT_TEST(testEmbeddedPdf, "embedded-pdf.odt") +{ + auto pPdfium = vcl::pdf::PDFiumLibrary::get(); + if (!pPdfium) + { + return; + } + + CPPUNIT_ASSERT_EQUAL(1, getShapes()); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + uno::Reference xShape = getShape(1); + // This failed, pdf+png replacement graphics pair didn't survive an ODT roundtrip. + auto xReplacementGraphic = getProperty>(xShape, "ReplacementGraphic"); + CPPUNIT_ASSERT(xReplacementGraphic.is()); + + auto xGraphic = getProperty>(xShape, "Graphic"); + CPPUNIT_ASSERT(xGraphic.is()); + // This was image/x-vclgraphic, not exposing the info that the image is a PDF one. + CPPUNIT_ASSERT_EQUAL(OUString("application/pdf"), getProperty(xGraphic, "MimeType")); + + if (isExported()) + { + uno::Sequence aArgs{ uno::Any(maTempFile.GetURL()) }; + uno::Reference xNameAccess(m_xSFactory->createInstanceWithArguments("com.sun.star.packages.zip.ZipFileAccess", aArgs), uno::UNO_QUERY); + bool bHasBitmap = false; + const uno::Sequence aNames = xNameAccess->getElementNames(); + for (const auto& rElementName : aNames) + { + if (rElementName.startsWith("Pictures") && rElementName.endsWith("png")) + { + bHasBitmap = true; + break; + } + } + // This failed, replacement was an svm file. + CPPUNIT_ASSERT(bHasBitmap); + } +} + +DECLARE_ODFEXPORT_TEST(testTableStyles1, "table_styles_1.odt") +{ + CPPUNIT_ASSERT_EQUAL(1, getPages()); + // Table styles basic graphic test. + // Doesn't cover all attributes. + uno::Reference XFamiliesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xFamilies(XFamiliesSupplier->getStyleFamilies()); + uno::Reference xCellFamily(xFamilies->getByName("CellStyles"), uno::UNO_QUERY); + uno::Reference xCell1Style; + xCellFamily->getByName("Test style.1") >>= xCell1Style; + + sal_Int32 nInt32 = 0xF0F0F0; + table::BorderLine2 oBorder; + + CPPUNIT_ASSERT_EQUAL(Color(0xCC0000), getProperty(xCell1Style, "BackColor")); + xCell1Style->getPropertyValue("WritingMode") >>= nInt32; + CPPUNIT_ASSERT_EQUAL(sal_Int32(4), nInt32); + xCell1Style->getPropertyValue("VertOrient") >>= nInt32; + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), nInt32); + xCell1Style->getPropertyValue("BorderDistance") >>= nInt32; + CPPUNIT_ASSERT_EQUAL(sal_Int32(97), nInt32); + xCell1Style->getPropertyValue("LeftBorderDistance") >>= nInt32; + CPPUNIT_ASSERT_EQUAL(sal_Int32(97), nInt32); + xCell1Style->getPropertyValue("RightBorderDistance") >>= nInt32; + CPPUNIT_ASSERT_EQUAL(sal_Int32(97), nInt32); + xCell1Style->getPropertyValue("TopBorderDistance") >>= nInt32; + CPPUNIT_ASSERT_EQUAL(sal_Int32(97), nInt32); + xCell1Style->getPropertyValue("BottomBorderDistance") >>= nInt32; + CPPUNIT_ASSERT_EQUAL(sal_Int32(97), nInt32); + xCell1Style->getPropertyValue("RightBorder") >>= oBorder; + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), oBorder.Color); + xCell1Style->getPropertyValue("LeftBorder") >>= oBorder; + CPPUNIT_ASSERT_EQUAL(COL_BLACK, Color(ColorTransparency, oBorder.Color)); + xCell1Style->getPropertyValue("TopBorder") >>= oBorder; + CPPUNIT_ASSERT_EQUAL(COL_BLACK, Color(ColorTransparency, oBorder.Color)); + xCell1Style->getPropertyValue("BottomBorder") >>= oBorder; + CPPUNIT_ASSERT_EQUAL(COL_BLACK, Color(ColorTransparency, oBorder.Color)); +} + +DECLARE_ODFEXPORT_TEST(testTableStyles2, "table_styles_2.odt") +{ + CPPUNIT_ASSERT_EQUAL(1, getPages()); + // Table styles paragraph and char tests + // Doesn't cover all attributes. + // Problem: underline for table autoformat doesn't work. + uno::Reference XFamiliesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xFamilies(XFamiliesSupplier->getStyleFamilies()); + uno::Reference xTableFamily(xFamilies->getByName("TableStyles"), uno::UNO_QUERY); + uno::Reference xTableStyle(xTableFamily->getByName("Test style2"), uno::UNO_QUERY); + uno::Reference xCell1Style; + + float fFloat = 0.; + bool bBool = true; + sal_Int16 nInt16 = 0xF0; + sal_Int32 nInt32 = 0xF0F0F0; + OUString sString; + awt::FontSlant eCharPosture; + + // cell 1 + xTableStyle->getByName("first-row-start-column") >>= xCell1Style; + xCell1Style->getPropertyValue("ParaAdjust") >>= nInt32; + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), nInt32); + CPPUNIT_ASSERT_EQUAL(Color(0xFF6600), getProperty(xCell1Style, "CharColor")); + xCell1Style->getPropertyValue("CharContoured") >>= bBool; + CPPUNIT_ASSERT_EQUAL(false, bBool); + xCell1Style->getPropertyValue("CharShadowed") >>= bBool; + CPPUNIT_ASSERT_EQUAL(true, bBool); + xCell1Style->getPropertyValue("CharStrikeout") >>= nInt32; + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), nInt32); + xCell1Style->getPropertyValue("CharUnderline") >>= nInt32; + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), nInt32); + // underline color is not working for table autoformats + // xCell1Style->getPropertyValue("CharUnderlineHasColor") >>= bBool; + // CPPUNIT_ASSERT_EQUAL(bool(false), bBool); + // xCell1Style->getPropertyValue("CharUnderlineColor") >>= nInt64; + // CPPUNIT_ASSERT_EQUAL(sal_Int64(-1), nInt64); + // standard font + xCell1Style->getPropertyValue("CharHeight") >>= fFloat; + CPPUNIT_ASSERT_EQUAL(float(18.), fFloat); + xCell1Style->getPropertyValue("CharWeight") >>= fFloat; + CPPUNIT_ASSERT_EQUAL(float(100.), fFloat); + xCell1Style->getPropertyValue("CharPosture") >>= eCharPosture; + CPPUNIT_ASSERT_EQUAL(awt::FontSlant_NONE, eCharPosture); + xCell1Style->getPropertyValue("CharFontName") >>= sString; + CPPUNIT_ASSERT_EQUAL(OUString("Courier"), sString); + xCell1Style->getPropertyValue("CharFontStyleName") >>= sString; + CPPUNIT_ASSERT_EQUAL(OUString(), sString); + xCell1Style->getPropertyValue("CharFontFamily") >>= nInt16; + CPPUNIT_ASSERT_EQUAL(sal_Int16(2), nInt16); + xCell1Style->getPropertyValue("CharFontPitch") >>= nInt16; + CPPUNIT_ASSERT_EQUAL(sal_Int16(1), nInt16); + // cjk font + xCell1Style->getPropertyValue("CharHeightAsian") >>= fFloat; + CPPUNIT_ASSERT_EQUAL(float(18.), fFloat); + xCell1Style->getPropertyValue("CharWeightAsian") >>= fFloat; + CPPUNIT_ASSERT_EQUAL(float(100.), fFloat); + xCell1Style->getPropertyValue("CharPostureAsian") >>= eCharPosture; + CPPUNIT_ASSERT_EQUAL(awt::FontSlant_NONE, eCharPosture); + xCell1Style->getPropertyValue("CharFontNameAsian") >>= sString; + CPPUNIT_ASSERT_EQUAL(OUString("Courier"), sString); + xCell1Style->getPropertyValue("CharFontStyleNameAsian") >>= sString; + CPPUNIT_ASSERT_EQUAL(OUString("Regularna"), sString); + xCell1Style->getPropertyValue("CharFontFamilyAsian") >>= nInt16; + CPPUNIT_ASSERT_EQUAL(sal_Int16(2), nInt16); + xCell1Style->getPropertyValue("CharFontPitchAsian") >>= nInt16; + CPPUNIT_ASSERT_EQUAL(sal_Int16(1), nInt16); + // ctl font + xCell1Style->getPropertyValue("CharHeightComplex") >>= fFloat; + CPPUNIT_ASSERT_EQUAL(float(18.), fFloat); + xCell1Style->getPropertyValue("CharWeightComplex") >>= fFloat; + CPPUNIT_ASSERT_EQUAL(float(100.), fFloat); + xCell1Style->getPropertyValue("CharPostureComplex") >>= eCharPosture; + CPPUNIT_ASSERT_EQUAL(awt::FontSlant_NONE, eCharPosture); + xCell1Style->getPropertyValue("CharFontNameComplex") >>= sString; + CPPUNIT_ASSERT_EQUAL(OUString("Courier"), sString); + xCell1Style->getPropertyValue("CharFontStyleNameComplex") >>= sString; + CPPUNIT_ASSERT_EQUAL(OUString("Regularna"), sString); + xCell1Style->getPropertyValue("CharFontFamilyComplex") >>= nInt16; + CPPUNIT_ASSERT_EQUAL(sal_Int16(2), nInt16); + xCell1Style->getPropertyValue("CharFontPitchComplex") >>= nInt16; + CPPUNIT_ASSERT_EQUAL(sal_Int16(1), nInt16); + + // cell 2 + xTableStyle->getByName("first-row") >>= xCell1Style; + xCell1Style->getPropertyValue("ParaAdjust") >>= nInt32; + CPPUNIT_ASSERT_EQUAL(sal_Int32(3), nInt32); + CPPUNIT_ASSERT_EQUAL(Color(0x9900FF), getProperty(xCell1Style, "CharColor")); + xCell1Style->getPropertyValue("CharContoured") >>= bBool; + CPPUNIT_ASSERT_EQUAL(true, bBool); + xCell1Style->getPropertyValue("CharShadowed") >>= bBool; + CPPUNIT_ASSERT_EQUAL(false, bBool); + xCell1Style->getPropertyValue("CharStrikeout") >>= nInt32; + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), nInt32); + xCell1Style->getPropertyValue("CharUnderline") >>= nInt32; + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), nInt32); + // underline color test place + // standard font + xCell1Style->getPropertyValue("CharHeight") >>= fFloat; + CPPUNIT_ASSERT_EQUAL(float(12.), fFloat); + xCell1Style->getPropertyValue("CharWeight") >>= fFloat; + CPPUNIT_ASSERT_EQUAL(float(150.), fFloat); + xCell1Style->getPropertyValue("CharPosture") >>= eCharPosture; + CPPUNIT_ASSERT_EQUAL(awt::FontSlant_NONE, eCharPosture); + xCell1Style->getPropertyValue("CharFontName") >>= sString; + CPPUNIT_ASSERT_EQUAL(OUString("Liberation Serif"), sString); + xCell1Style->getPropertyValue("CharFontStyleName") >>= sString; + CPPUNIT_ASSERT_EQUAL(OUString(), sString); + xCell1Style->getPropertyValue("CharFontFamily") >>= nInt16; + CPPUNIT_ASSERT_EQUAL(sal_Int16(3), nInt16); + xCell1Style->getPropertyValue("CharFontPitch") >>= nInt16; + CPPUNIT_ASSERT_EQUAL(sal_Int16(2), nInt16); + // cjk font + xCell1Style->getPropertyValue("CharHeightAsian") >>= fFloat; + CPPUNIT_ASSERT_EQUAL(float(12.), fFloat); + xCell1Style->getPropertyValue("CharWeightAsian") >>= fFloat; + CPPUNIT_ASSERT_EQUAL(float(150.), fFloat); + xCell1Style->getPropertyValue("CharPostureAsian") >>= eCharPosture; + CPPUNIT_ASSERT_EQUAL(awt::FontSlant_NONE, eCharPosture); + xCell1Style->getPropertyValue("CharFontNameAsian") >>= sString; + CPPUNIT_ASSERT_EQUAL(OUString("Liberation Serif"), sString); + xCell1Style->getPropertyValue("CharFontStyleNameAsian") >>= sString; + CPPUNIT_ASSERT_EQUAL(OUString("Pogrubiona"), sString); + xCell1Style->getPropertyValue("CharFontFamilyAsian") >>= nInt16; + CPPUNIT_ASSERT_EQUAL(sal_Int16(3), nInt16); + xCell1Style->getPropertyValue("CharFontPitchAsian") >>= nInt16; + CPPUNIT_ASSERT_EQUAL(sal_Int16(2), nInt16); + // ctl font + xCell1Style->getPropertyValue("CharHeightComplex") >>= fFloat; + CPPUNIT_ASSERT_EQUAL(float(12.), fFloat); + xCell1Style->getPropertyValue("CharWeightComplex") >>= fFloat; + CPPUNIT_ASSERT_EQUAL(float(150.), fFloat); + xCell1Style->getPropertyValue("CharPostureComplex") >>= eCharPosture; + CPPUNIT_ASSERT_EQUAL(awt::FontSlant_NONE, eCharPosture); + xCell1Style->getPropertyValue("CharFontNameComplex") >>= sString; + CPPUNIT_ASSERT_EQUAL(OUString("Liberation Serif"), sString); + xCell1Style->getPropertyValue("CharFontStyleNameComplex") >>= sString; + CPPUNIT_ASSERT_EQUAL(OUString("Pogrubiona"), sString); + xCell1Style->getPropertyValue("CharFontFamilyComplex") >>= nInt16; + CPPUNIT_ASSERT_EQUAL(sal_Int16(3), nInt16); + xCell1Style->getPropertyValue("CharFontPitchComplex") >>= nInt16; + CPPUNIT_ASSERT_EQUAL(sal_Int16(2), nInt16); + + // cell 3 + xTableStyle->getByName("first-row-even-column") >>= xCell1Style; + xCell1Style->getPropertyValue("ParaAdjust") >>= nInt32; + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), nInt32); + CPPUNIT_ASSERT_EQUAL(COL_BLACK, getProperty(xCell1Style, "CharColor")); + xCell1Style->getPropertyValue("CharContoured") >>= bBool; + CPPUNIT_ASSERT_EQUAL(true, bBool); + xCell1Style->getPropertyValue("CharShadowed") >>= bBool; + CPPUNIT_ASSERT_EQUAL(true, bBool); + xCell1Style->getPropertyValue("CharStrikeout") >>= nInt32; + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), nInt32); + xCell1Style->getPropertyValue("CharUnderline") >>= nInt32; + CPPUNIT_ASSERT_EQUAL(sal_Int32(6), nInt32); + // underline color test place + // standard font + xCell1Style->getPropertyValue("CharHeight") >>= fFloat; + CPPUNIT_ASSERT_EQUAL(float(12.), fFloat); + xCell1Style->getPropertyValue("CharWeight") >>= fFloat; + CPPUNIT_ASSERT_EQUAL(float(100.), fFloat); + xCell1Style->getPropertyValue("CharPosture") >>= eCharPosture; + CPPUNIT_ASSERT_EQUAL(awt::FontSlant_ITALIC, eCharPosture); + xCell1Style->getPropertyValue("CharFontName") >>= sString; + CPPUNIT_ASSERT_EQUAL(OUString("Open Sans"), sString); + xCell1Style->getPropertyValue("CharFontStyleName") >>= sString; + CPPUNIT_ASSERT_EQUAL(OUString(), sString); + xCell1Style->getPropertyValue("CharFontFamily") >>= nInt16; + CPPUNIT_ASSERT_EQUAL(sal_Int16(0), nInt16); + xCell1Style->getPropertyValue("CharFontPitch") >>= nInt16; + CPPUNIT_ASSERT_EQUAL(sal_Int16(2), nInt16); + // cjk font + xCell1Style->getPropertyValue("CharHeightAsian") >>= fFloat; + CPPUNIT_ASSERT_EQUAL(float(12.), fFloat); + xCell1Style->getPropertyValue("CharWeightAsian") >>= fFloat; + CPPUNIT_ASSERT_EQUAL(float(100.), fFloat); + xCell1Style->getPropertyValue("CharPostureAsian") >>= eCharPosture; + CPPUNIT_ASSERT_EQUAL(awt::FontSlant_ITALIC, eCharPosture); + xCell1Style->getPropertyValue("CharFontNameAsian") >>= sString; + CPPUNIT_ASSERT_EQUAL(OUString("Open Sans"), sString); + xCell1Style->getPropertyValue("CharFontStyleNameAsian") >>= sString; + CPPUNIT_ASSERT_EQUAL(OUString("Kursywa"), sString); + xCell1Style->getPropertyValue("CharFontFamilyAsian") >>= nInt16; + CPPUNIT_ASSERT_EQUAL(sal_Int16(0), nInt16); + xCell1Style->getPropertyValue("CharFontPitchAsian") >>= nInt16; + CPPUNIT_ASSERT_EQUAL(sal_Int16(2), nInt16); + // ctl font + xCell1Style->getPropertyValue("CharHeightComplex") >>= fFloat; + CPPUNIT_ASSERT_EQUAL(float(12.), fFloat); + xCell1Style->getPropertyValue("CharWeightComplex") >>= fFloat; + CPPUNIT_ASSERT_EQUAL(float(100.), fFloat); + xCell1Style->getPropertyValue("CharPostureComplex") >>= eCharPosture; + CPPUNIT_ASSERT_EQUAL(awt::FontSlant_ITALIC, eCharPosture); + xCell1Style->getPropertyValue("CharFontNameComplex") >>= sString; + CPPUNIT_ASSERT_EQUAL(OUString("Open Sans"), sString); + xCell1Style->getPropertyValue("CharFontStyleNameComplex") >>= sString; + CPPUNIT_ASSERT_EQUAL(OUString("Kursywa"), sString); + xCell1Style->getPropertyValue("CharFontFamilyComplex") >>= nInt16; + CPPUNIT_ASSERT_EQUAL(sal_Int16(0), nInt16); + xCell1Style->getPropertyValue("CharFontPitchComplex") >>= nInt16; + CPPUNIT_ASSERT_EQUAL(sal_Int16(2), nInt16); +} + +CPPUNIT_TEST_FIXTURE(Test, testTableStyles3) +{ + loadAndReload("table_styles_3.odt"); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + // This test checks if default valued attributes aren't exported. + xmlDocUniquePtr pXmlDoc = parseExport("styles.xml"); + + // + // For this element the only exported attributes are: "border-left", "border-bottom" + assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style3.2']/style:table-cell-properties"_ostr, "background-color"_ostr); + // border-left place + assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style3.2']/style:table-cell-properties"_ostr, "border-right"_ostr); + assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style3.2']/style:table-cell-properties"_ostr, "border-top"_ostr); + // border-bottom place + assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style3.2']/style:table-cell-properties"_ostr, "padding"_ostr); + assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style3.2']/style:table-cell-properties"_ostr, "padding-left"_ostr); + assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style3.2']/style:table-cell-properties"_ostr, "padding-right"_ostr); + assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style3.2']/style:table-cell-properties"_ostr, "padding-top"_ostr); + assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style3.2']/style:table-cell-properties"_ostr, "padding-bottom"_ostr); + assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style3.2']/style:table-cell-properties"_ostr, "writing-mode"_ostr); + + // should be absent, because it has only "text-align" attribute, which shouldn't be exported. + // Assume that style:paragraph-properties and style:text-properties exists. + assertXPathChildren(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style3.2']"_ostr, 2); + + // + // For this element the only exported attributes are: "use-window-font-color place", "font-size-asian", "font-name-asian", "font-family-asian", "font-name-complex", "font-family-complex" + // use-window-font-color place + assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style3.2']/style:text-properties"_ostr, "text-shadow"_ostr); + assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style3.2']/style:text-properties"_ostr, "text-outline"_ostr); + assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style3.2']/style:text-properties"_ostr, "text-line-through-style"_ostr); + assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style3.2']/style:text-properties"_ostr, "text-line-through-type"_ostr); + assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style3.2']/style:text-properties"_ostr, "text-underline-style"_ostr); + assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style3.2']/style:text-properties"_ostr, "text-underline-color"_ostr); + assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style3.2']/style:text-properties"_ostr, "font-size"_ostr); + assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style3.2']/style:text-properties"_ostr, "font-weight"_ostr); + assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style3.2']/style:text-properties"_ostr, "font-style"_ostr); + assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style3.2']/style:text-properties"_ostr, "font-name"_ostr); + assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style3.2']/style:text-properties"_ostr, "font-family"_ostr); + assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style3.2']/style:text-properties"_ostr, "font-style-name"_ostr); + assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style3.2']/style:text-properties"_ostr, "font-family-generic"_ostr); + assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style3.2']/style:text-properties"_ostr, "font-pitch"_ostr); + // font-size-asian place + assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style3.2']/style:text-properties"_ostr, "font-weight-asian"_ostr); + assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style3.2']/style:text-properties"_ostr, "font-style-asian"_ostr); + // font-name-asian place + // font-family-asian place + assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style3.2']/style:text-properties"_ostr, "font-style-name-asian"_ostr); + assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style3.2']/style:text-properties"_ostr, "font-family-generic-asian"_ostr); + assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style3.2']/style:text-properties"_ostr, "font-pitch-asian"_ostr); + assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style3.2']/style:text-properties"_ostr, "font-size-complex"_ostr); + assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style3.2']/style:text-properties"_ostr, "font-weight-complex"_ostr); + assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style3.2']/style:text-properties"_ostr, "font-style-complex"_ostr); + // font-name-complex place + // font-family-complex place + assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style3.2']/style:text-properties"_ostr, "font-style-name-complex"_ostr); + assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style3.2']/style:text-properties"_ostr, "font-family-generic-complex"_ostr); + assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style3.2']/style:text-properties"_ostr, "font-pitch-complex"_ostr); + +} + +CPPUNIT_TEST_FIXTURE(Test, testTableStyles4) +{ + createSwDoc("table_styles_4.odt"); + // Test if loaded styles overwrite existing styles + uno::Reference XFamiliesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xFamilies(XFamiliesSupplier->getStyleFamilies()); + uno::Reference xTableFamily(xFamilies->getByName("TableStyles"), uno::UNO_QUERY); + uno::Reference xTableStyle(xTableFamily->getByName("Green"), uno::UNO_QUERY); + uno::Reference xCell1Style; + + xTableStyle->getByName("first-row-start-column") >>= xCell1Style; + CPPUNIT_ASSERT_EQUAL(Color(0x00ff00), getProperty(xCell1Style, "BackColor")); +} + +CPPUNIT_TEST_FIXTURE(Test, testTableStyles5) +{ + loadAndReload("table_styles_5.odt"); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + // Test if cell styles doesn't have a style:parent-style-name attribute. + xmlDocUniquePtr pXmlDoc = parseExport("styles.xml"); + + assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style.1']"_ostr, "parent-style-name"_ostr); + assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style.2']"_ostr, "parent-style-name"_ostr); + assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style.3']"_ostr, "parent-style-name"_ostr); + assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style.4']"_ostr, "parent-style-name"_ostr); + assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style.5']"_ostr, "parent-style-name"_ostr); + assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style.6']"_ostr, "parent-style-name"_ostr); + assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style.7']"_ostr, "parent-style-name"_ostr); + assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style.8']"_ostr, "parent-style-name"_ostr); + assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style.9']"_ostr, "parent-style-name"_ostr); + assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style.10']"_ostr, "parent-style-name"_ostr); + assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style.11']"_ostr, "parent-style-name"_ostr); + assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style.12']"_ostr, "parent-style-name"_ostr); + assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style.13']"_ostr, "parent-style-name"_ostr); + assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style.14']"_ostr, "parent-style-name"_ostr); + assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style.15']"_ostr, "parent-style-name"_ostr); + assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style.16']"_ostr, "parent-style-name"_ostr); + +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf145226) +{ + loadAndReload("tdf145226.fodt"); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + xmlDocUniquePtr pXmlDoc = parseExport("content.xml"); + + assertXPathNoAttribute(pXmlDoc, "/office:document-content/office:body/office:text/table:table/table:table-row[1]"_ostr, "style-name"_ostr); + assertXPathNoAttribute(pXmlDoc, "/office:document-content/office:body/office:text/table:table/table:table-row[2]"_ostr, "style-name"_ostr); + assertXPathNoAttribute(pXmlDoc, "/office:document-content/office:body/office:text/table:table/table:table-row[3]"_ostr, "style-name"_ostr); + assertXPathNoAttribute(pXmlDoc, "/office:document-content/office:body/office:text/table:table/table:table-row[4]"_ostr, "style-name"_ostr); +} + +DECLARE_ODFEXPORT_TEST(testTdf101710, "tdf101710.odt") +{ + CPPUNIT_ASSERT_EQUAL(1, getPages()); + // Test that number format of cell styles can be imported and exported. + uno::Reference xStyle(getStyles("CellStyles")->getByName("Test Style.11"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_uInt32(10104), getProperty(xStyle, "NumberFormat")); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf129568) +{ + loadAndReload("tdf129568.fodt"); + // Test that export doesn't fail, and that style is imported and in use. + uno::Reference xStyle(getStyles("CellStyles")->getByName("Default Style.1"), uno::UNO_QUERY); + CPPUNIT_ASSERT(xStyle->isInUse()); + CPPUNIT_ASSERT_EQUAL(Color(0xffff00), getProperty(xStyle, "BackColor")); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf129568ui) +{ + loadAndReload("tdf129568-ui.fodt"); + // Same as above, but styles referenced by UI name. + uno::Reference xStyle(getStyles("CellStyles")->getByName("Default Style.1"), uno::UNO_QUERY); + CPPUNIT_ASSERT(xStyle->isInUse()); + CPPUNIT_ASSERT_EQUAL(Color(0xffff00), getProperty(xStyle, "BackColor")); +} + +DECLARE_ODFEXPORT_TEST(testTdf132642_keepWithNextTable, "tdf132642_keepWithNextTable.odt") +{ + // Since the row is very big, it should split over two pages. + // Since up to this point we haven't tried to make it match MS formats, it should start on page 1. + CPPUNIT_ASSERT_EQUAL_MESSAGE("Row splits over 2 pages", 2, getPages()); +} + +CPPUNIT_TEST_FIXTURE(Test, testImageMimetype) +{ + loadAndReload("image-mimetype.odt"); + CPPUNIT_ASSERT_EQUAL(1, getShapes()); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + // Test that the loext:mimetype attribute is written for exported images, tdf#109202 + xmlDocUniquePtr pXmlDoc = parseExport("content.xml"); + // Original image (svg) + assertXPath(pXmlDoc, "/office:document-content/office:body/office:text/text:p/draw:frame/draw:image[@draw:mime-type='image/svg+xml']"_ostr); +} + + +CPPUNIT_PLUGIN_IMPLEMENT(); +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/qa/extras/odfexport/odfexport2.cxx b/sw/qa/extras/odfexport/odfexport2.cxx new file mode 100644 index 0000000000..6db396c40d --- /dev/null +++ b/sw/qa/extras/odfexport/odfexport2.cxx @@ -0,0 +1,1133 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +class Test : public SwModelTestBase +{ +public: + Test() : SwModelTestBase("/sw/qa/extras/odfexport/data/", "writer8") {} +}; + +CPPUNIT_TEST_FIXTURE(Test, testEmbeddedFontProps) +{ + loadAndReload("embedded-font-props.odt"); + CPPUNIT_ASSERT_EQUAL(1, getPages()); +#if !defined(MACOSX) + // Test that font style/weight of embedded fonts is exposed. + // Test file is a normal ODT, except EmbedFonts is set to true in settings.xml. + xmlDocUniquePtr pXmlDoc = parseExport("content.xml"); + // These failed, the attributes were missing. + assertXPath(pXmlDoc, "//style:font-face[@style:name='Liberation Serif']/svg:font-face-src/svg:font-face-uri[1]"_ostr, "font-style"_ostr, "normal"); + assertXPath(pXmlDoc, "//style:font-face[@style:name='Liberation Serif']/svg:font-face-src/svg:font-face-uri[1]"_ostr, "font-weight"_ostr, "normal"); + assertXPath(pXmlDoc, "//style:font-face[@style:name='Liberation Serif']/svg:font-face-src/svg:font-face-uri[2]"_ostr, "font-style"_ostr, "normal"); + assertXPath(pXmlDoc, "//style:font-face[@style:name='Liberation Serif']/svg:font-face-src/svg:font-face-uri[2]"_ostr, "font-weight"_ostr, "bold"); + assertXPath(pXmlDoc, "//style:font-face[@style:name='Liberation Serif']/svg:font-face-src/svg:font-face-uri[3]"_ostr, "font-style"_ostr, "italic"); + assertXPath(pXmlDoc, "//style:font-face[@style:name='Liberation Serif']/svg:font-face-src/svg:font-face-uri[3]"_ostr, "font-weight"_ostr, "normal"); + assertXPath(pXmlDoc, "//style:font-face[@style:name='Liberation Serif']/svg:font-face-src/svg:font-face-uri[4]"_ostr, "font-style"_ostr, "italic"); + assertXPath(pXmlDoc, "//style:font-face[@style:name='Liberation Serif']/svg:font-face-src/svg:font-face-uri[4]"_ostr, "font-weight"_ostr, "bold"); +#endif +} + +DECLARE_ODFEXPORT_TEST(testTdf100492, "tdf100492.odt") +{ + CPPUNIT_ASSERT_EQUAL(2, getShapes()); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + uno::Reference xShape = getShape(1); + CPPUNIT_ASSERT(xShape.is()); + + // Save the first shape to a SVG + uno::Reference xGraphicExporter = drawing::GraphicExportFilter::create(comphelper::getProcessComponentContext()); + uno::Reference xSourceDoc(xShape, uno::UNO_QUERY); + xGraphicExporter->setSourceDocument(xSourceDoc); + + SvMemoryStream aStream; + uno::Reference xOutputStream(new utl::OStreamWrapper(aStream)); + uno::Sequence aDescriptor( comphelper::InitPropertySequence({ + { "OutputStream", uno::Any(xOutputStream) }, + { "FilterName", uno::Any(OUString("SVG")) } + })); + xGraphicExporter->filter(aDescriptor); + aStream.Seek(STREAM_SEEK_TO_BEGIN); + + // TODO: Disabled. Parsing of SVG gives just root node without any children. + // Reason of such behavior unclear. So XPATH assert fails. + + // Parse resulting SVG as XML file. + // xmlDocUniquePtr pXmlDoc = parseXmlStream(&aStream); + + // Check amount of paths required to draw an arrow. + // Since there are still some empty paths in output test can fail later. There are just two + // really used and visible paths. + //assertXPath(pXmlDoc, "/svg/path", 4); +} + +DECLARE_ODFEXPORT_TEST(testTdf77961, "tdf77961.odt") +{ + CPPUNIT_ASSERT_EQUAL(1, getPages()); + uno::Reference xStyles(getStyles("PageStyles")); + uno::Reference xStyle(xStyles->getByName("Standard"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL( false , getProperty(xStyle, "GridDisplay")); + CPPUNIT_ASSERT_EQUAL( false , getProperty(xStyle, "GridPrint")); +} + +DECLARE_ODFEXPORT_TEST(testReferenceLanguage, "referencelanguage.odt") +{ + CPPUNIT_ASSERT_EQUAL(2, getPages()); + // Test loext:reference-language attribute of reference fields + // (used from LibreOffice 6.1, and proposed for next ODF) + OUString const aFieldTexts[] = { "A 2", "Az Isten", "Az 50-esek", + "A 2018-asok", "Az egyebek", "A fejezetek", + u"Az „Őseinket...”"_ustr, "a 2", + "Az v", "az 1", "Az e)", "az 1", + "Az (5)", "az 1", "A 2", "az 1" }; + uno::Reference xTextFieldsSupplier(mxComponent, uno::UNO_QUERY); + // update "A (4)" to "Az (5)" + uno::Reference(xTextFieldsSupplier->getTextFields(), uno::UNO_QUERY_THROW)->refresh(); + + uno::Reference xFieldsAccess(xTextFieldsSupplier->getTextFields()); + uno::Reference xFields(xFieldsAccess->createEnumeration()); + + uno::Any aHu(OUString("Hu")); + uno::Any ahu(OUString("hu")); + for (auto const& sFieldText : aFieldTexts) + { + uno::Any aField = xFields->nextElement(); + uno::Reference xServiceInfo(aField, uno::UNO_QUERY); + if (xServiceInfo->supportsService("com.sun.star.text.textfield.GetReference")) + { + uno::Reference xPropertySet(aField, uno::UNO_QUERY); + uno::Any aLang = xPropertySet->getPropertyValue("ReferenceFieldLanguage"); + CPPUNIT_ASSERT_EQUAL(true, aLang == aHu || aLang == ahu); + uno::Reference xField(aField, uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sFieldText, xField->getAnchor()->getString()); + } + } +} + +CPPUNIT_TEST_FIXTURE(Test, testRubyPosition) +{ + loadAndReload("ruby-position.odt"); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + xmlDocUniquePtr pXmlDoc = parseExport("content.xml"); + + assertXPath(pXmlDoc, "//style:style[@style:family='ruby']/style:ruby-properties[@loext:ruby-position='inter-character']"_ostr, 1); + assertXPath(pXmlDoc, "//style:style[@style:family='ruby']/style:ruby-properties[@style:ruby-position='below']"_ostr, 1); +} + +DECLARE_ODFEXPORT_TEST(testAllowOverlap, "allow-overlap.odt") +{ + CPPUNIT_ASSERT_EQUAL(2, getShapes()); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + uno::Reference xShape = getShape(1); + // Without the accompanying fix in place, this test would have failed with: + // - Expression: !getProperty(xShape, "AllowOverlap") + // i.e. the custom AllowOverlap=false shape property was lost on import/export. + CPPUNIT_ASSERT(!getProperty(xShape, "AllowOverlap")); + xShape = getShape(2); + CPPUNIT_ASSERT(!getProperty(xShape, "AllowOverlap")); +} + +CPPUNIT_TEST_FIXTURE(Test, testSignatureLineProperties) +{ + loadAndReload("signatureline-properties.fodt"); + uno::Reference xShape = getShape(1); + CPPUNIT_ASSERT(xShape.is()); + + CPPUNIT_ASSERT_EQUAL(true, getProperty(xShape, "IsSignatureLine")); + CPPUNIT_ASSERT_EQUAL(OUString("{3C24159B-3B98-4F60-AB52-00E7721758E9}"), + getProperty(xShape, "SignatureLineId")); + CPPUNIT_ASSERT_EQUAL(OUString("John Doe"), + getProperty(xShape, "SignatureLineSuggestedSignerName")); + CPPUNIT_ASSERT_EQUAL(OUString("Farmer"), + getProperty(xShape, "SignatureLineSuggestedSignerTitle")); + CPPUNIT_ASSERT_EQUAL(OUString("john@farmers.org"), + getProperty(xShape, "SignatureLineSuggestedSignerEmail")); + CPPUNIT_ASSERT_EQUAL(OUString("Please farm here."), + getProperty(xShape, "SignatureLineSigningInstructions")); + CPPUNIT_ASSERT_EQUAL(true, getProperty(xShape, "SignatureLineCanAddComment")); + CPPUNIT_ASSERT_EQUAL(true, getProperty(xShape, "SignatureLineShowSignDate")); + + // tdf#130917 This needs to be always set when importing a doc, ooxml export expects it. + uno::Reference xUnsignedGraphic; + uno::Reference xProps(xShape, uno::UNO_QUERY); + xProps->getPropertyValue("SignatureLineUnsignedImage") >>= xUnsignedGraphic; + CPPUNIT_ASSERT_EQUAL(true, xUnsignedGraphic.is()); +} + +DECLARE_ODFEXPORT_TEST(testQrCodeGenProperties, "qrcode-properties.odt") +{ + CPPUNIT_ASSERT_EQUAL(1, getShapes()); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + uno::Reference xShape = getShape(1); + CPPUNIT_ASSERT(xShape.is()); + + css::drawing::BarCode aBarCode = getProperty(xShape, "BarCodeProperties"); + + CPPUNIT_ASSERT_EQUAL(OUString("www.libreoffice.org"), + aBarCode.Payload); + CPPUNIT_ASSERT_EQUAL(css::drawing::BarCodeErrorCorrection::LOW, + aBarCode.ErrorCorrection); + CPPUNIT_ASSERT_EQUAL(sal_Int32(5), + aBarCode.Border); +} + +DECLARE_ODFEXPORT_TEST(testChapterNumberingNewLine, "chapter-number-new-line.odt") +{ + CPPUNIT_ASSERT_EQUAL(1, getPages()); + uno::Reference xNumberingSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xNumberingRules = xNumberingSupplier->getChapterNumberingRules(); + comphelper::SequenceAsHashMap hashMap(xNumberingRules->getByIndex(0)); + + //This failed Actual Value was LISTTAB instead of NEWLINE + CPPUNIT_ASSERT_EQUAL( + sal_Int16(SvxNumberFormat::NEWLINE), hashMap["LabelFollowedBy"].get()); +} + +DECLARE_ODFEXPORT_TEST(testSpellOutNumberingTypes, "spellout-numberingtypes.odt") +{ + CPPUNIT_ASSERT_EQUAL(1, getPages()); + // ordinal indicator, ordinal and cardinal number numbering styles (from LibreOffice 6.1) + OUString const aFieldTexts[] = { "1st", "Erste", "Eins", "1.", "Premier", "Un", u"1ᵉʳ"_ustr, "First", "One" }; + // fallback for old platforms without std::codecvt and std::regex supports + OUString const aFieldTextFallbacks[] = { "Ordinal-number 1", "Ordinal 1", "1" }; + uno::Reference xTextFieldsSupplier(mxComponent, uno::UNO_QUERY); + // update text field content + uno::Reference(xTextFieldsSupplier->getTextFields(), uno::UNO_QUERY_THROW)->refresh(); + + uno::Reference xFieldsAccess(xTextFieldsSupplier->getTextFields()); + uno::Reference xFields(xFieldsAccess->createEnumeration()); + + for (size_t i = 0; i < SAL_N_ELEMENTS(aFieldTexts); i++) + { + uno::Any aField = xFields->nextElement(); + uno::Reference xServiceInfo(aField, uno::UNO_QUERY); + if (xServiceInfo->supportsService("com.sun.star.text.textfield.PageNumber")) + { + uno::Reference xField(aField, uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(true, aFieldTexts[i].equals(xField->getAnchor()->getString()) || + aFieldTextFallbacks[i%3].equals(xField->getAnchor()->getString())); + } + } +} + +DECLARE_ODFEXPORT_TEST(tdf133507_contextualSpacingSection, "tdf133507_contextualSpacingSection.odt") +{ + // Previously this was one page (no UL spacing) or three pages (every para had spacing) + CPPUNIT_ASSERT_EQUAL(2, getPages()); +} + +// MAILMERGE Add conditional to expand / collapse bookmarks +DECLARE_ODFEXPORT_TEST(tdf101856_overlapped, "tdf101856_overlapped.odt") +{ + CPPUNIT_ASSERT_EQUAL(1, getPages()); + // get bookmark interface + uno::Reference xBookmarksSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xBookmarksByIdx(xBookmarksSupplier->getBookmarks(), uno::UNO_QUERY); + uno::Reference xBookmarksByName = xBookmarksSupplier->getBookmarks(); + + // check: we have 2 bookmarks + CPPUNIT_ASSERT_EQUAL(static_cast(2), xBookmarksByIdx->getCount()); + CPPUNIT_ASSERT(xBookmarksByName->hasByName("BookmarkNonHidden")); + CPPUNIT_ASSERT(xBookmarksByName->hasByName("BookmarkHidden")); + + // + uno::Reference xBookmark1(xBookmarksByName->getByName("BookmarkNonHidden"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString(""), getProperty(xBookmark1, UNO_NAME_BOOKMARK_CONDITION)); + CPPUNIT_ASSERT_EQUAL(false, getProperty(xBookmark1, UNO_NAME_BOOKMARK_HIDDEN)); + + // + uno::Reference xBookmark2(xBookmarksByName->getByName("BookmarkHidden"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString(""), getProperty(xBookmark2, UNO_NAME_BOOKMARK_CONDITION)); + CPPUNIT_ASSERT_EQUAL(true, getProperty(xBookmark2, UNO_NAME_BOOKMARK_HIDDEN)); +} + +// MAILMERGE Add conditional to expand / collapse bookmarks +DECLARE_ODFEXPORT_TEST(tdf101856, "tdf101856.odt") +{ + CPPUNIT_ASSERT_EQUAL(1, getPages()); + // get bookmark interface + uno::Reference xBookmarksSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xBookmarksByIdx(xBookmarksSupplier->getBookmarks(), uno::UNO_QUERY); + uno::Reference xBookmarksByName = xBookmarksSupplier->getBookmarks(); + + // check: we have 2 bookmarks + CPPUNIT_ASSERT_EQUAL(static_cast(5), xBookmarksByIdx->getCount()); + CPPUNIT_ASSERT(xBookmarksByName->hasByName("BookmarkVisible")); + CPPUNIT_ASSERT(xBookmarksByName->hasByName("BookmarkHidden")); + CPPUNIT_ASSERT(xBookmarksByName->hasByName("BookmarkVisibleWithCondition")); + CPPUNIT_ASSERT(xBookmarksByName->hasByName("BookmarkNotHiddenWithCondition")); + CPPUNIT_ASSERT(xBookmarksByName->hasByName("BookmarkHiddenWithCondition")); + + // + uno::Reference xBookmark1(xBookmarksByName->getByName("BookmarkVisible"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString(""), getProperty(xBookmark1, UNO_NAME_BOOKMARK_CONDITION)); + CPPUNIT_ASSERT_EQUAL(false, getProperty(xBookmark1, UNO_NAME_BOOKMARK_HIDDEN)); + + // + uno::Reference xBookmark2(xBookmarksByName->getByName("BookmarkHidden"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString(""), getProperty(xBookmark2, UNO_NAME_BOOKMARK_CONDITION)); + CPPUNIT_ASSERT_EQUAL(true, getProperty(xBookmark2, UNO_NAME_BOOKMARK_HIDDEN)); + + // + uno::Reference xBookmark3(xBookmarksByName->getByName("BookmarkVisibleWithCondition"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("0==1"), getProperty(xBookmark3, UNO_NAME_BOOKMARK_CONDITION)); + CPPUNIT_ASSERT_EQUAL(true, getProperty(xBookmark3, UNO_NAME_BOOKMARK_HIDDEN)); + + // + // + // The following test doesn't work, while during output in the case of loext:hidden="false". + // no additional parameters are written. Implementation should be reviewed. + // +// uno::Reference xBookmark4(xBookmarksByName->getByName("BookmarkNotHiddenWithCondition"), uno::UNO_QUERY); +// CPPUNIT_ASSERT_EQUAL(OUString("1==1"), getProperty(xBookmark4, UNO_NAME_BOOKMARK_CONDITION)); +// CPPUNIT_ASSERT_EQUAL(false, getProperty(xBookmark4, UNO_NAME_BOOKMARK_HIDDEN)); + + // + uno::Reference xBookmark5(xBookmarksByName->getByName("BookmarkHiddenWithCondition"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("1==1"), getProperty(xBookmark5, UNO_NAME_BOOKMARK_CONDITION)); + CPPUNIT_ASSERT_EQUAL(true, getProperty(xBookmark5, UNO_NAME_BOOKMARK_HIDDEN)); +} + +DECLARE_ODFEXPORT_TEST(tdf118502, "tdf118502.odt") +{ + CPPUNIT_ASSERT_EQUAL(1, getShapes()); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + uno::Reference xShape = getShape(1); + // Make sure the replacement graphic is still there + // (was gone because the original graphic was not recognized during load) + auto xReplacementGraphic + = getProperty>(xShape, "ReplacementGraphic"); + CPPUNIT_ASSERT(xReplacementGraphic.is()); +} + +CPPUNIT_TEST_FIXTURE(Test, tdf99631) +{ + loadAndReload("tdf99631.docx"); + // check import of VisualArea settings of the embedded XLSX OLE objects + xmlDocUniquePtr pXmlDoc = parseExport("Object 1/settings.xml"); + assertXPathContent(pXmlDoc, "//config:config-item[@config:name='VisibleAreaWidth']"_ostr, "4516"); + assertXPathContent(pXmlDoc, "//config:config-item[@config:name='VisibleAreaHeight']"_ostr, "903"); + + xmlDocUniquePtr pXmlDoc2 = parseExport("Object 2/settings.xml"); + assertXPathContent(pXmlDoc2, "//config:config-item[@config:name='VisibleAreaWidth']"_ostr, "4516"); + assertXPathContent(pXmlDoc2, "//config:config-item[@config:name='VisibleAreaHeight']"_ostr, "1355"); +} + +CPPUNIT_TEST_FIXTURE(Test, tdf145871) +{ + loadAndReload("tdf145871.odt"); + uno::Reference xTablesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xTables(xTablesSupplier->getTextTables( ), uno::UNO_QUERY); + uno::Reference xTextTable(xTables->getByIndex(0), uno::UNO_QUERY); + uno::Reference xTableRows = xTextTable->getRows(); + + // Without the fix in place, this test would have failed with + // - Expected: 3150 + // - Actual : 5851 + CPPUNIT_ASSERT_EQUAL(sal_Int64(3150) , getProperty(xTableRows->getByIndex(0), "Height")); +} + +CPPUNIT_TEST_FIXTURE(Test, tdf128504) +{ + loadAndReload("tdf128504.docx"); + uno::Reference xPara = getParagraph(6); + uno::Reference xRun(getRun(xPara,1), uno::UNO_QUERY); + OUString unVisitedStyleName = getProperty(xRun, "UnvisitedCharStyleName"); + CPPUNIT_ASSERT(!unVisitedStyleName.equalsIgnoreAsciiCase("Internet Link")); + OUString visitedStyleName = getProperty(xRun, "VisitedCharStyleName"); + CPPUNIT_ASSERT(!visitedStyleName.equalsIgnoreAsciiCase("Visited Internet Link")); +} + +DECLARE_ODFEXPORT_TEST(tdf121658, "tdf121658.odt") +{ + CPPUNIT_ASSERT_EQUAL(1, getPages()); + uno::Reference xParaStyles(getStyles("ParagraphStyles")); + uno::Reference xStyle1(xParaStyles->getByName( + "Standard"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(true, getProperty(xStyle1, "ParaHyphenationNoCaps")); +} + +DECLARE_ODFEXPORT_TEST(tdf149248, "tdf149248.odt") +{ + CPPUNIT_ASSERT_EQUAL(1, getPages()); + CPPUNIT_ASSERT_EQUAL(false, getProperty(getParagraph(2), "ParaHyphenationNoLastWord")); + CPPUNIT_ASSERT_EQUAL(true, getProperty(getParagraph(4), "ParaHyphenationNoLastWord")); +} + +DECLARE_ODFEXPORT_TEST(testThemeCrash, "tdf156905.odt") +{ + // first it started to crash at import time, later at export time + CPPUNIT_ASSERT_EQUAL(4, getPages()); +} + +DECLARE_ODFEXPORT_TEST(testTdf150394, "tdf150394.odt") +{ + // crashes at import time + CPPUNIT_ASSERT_EQUAL(1, getPages()); +} + +DECLARE_ODFEXPORT_TEST(tdf149324, "tdf149324.odt") +{ + CPPUNIT_ASSERT_EQUAL(1, getPages()); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(0), getProperty(getParagraph(2), "ParaHyphenationMinWordLength")); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(7), getProperty(getParagraph(4), "ParaHyphenationMinWordLength")); +} + +DECLARE_ODFEXPORT_TEST(tdf149420, "tdf149420.odt") +{ + CPPUNIT_ASSERT_EQUAL(1, getPages()); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(0), getProperty(getParagraph(2), "ParaHyphenationZone")); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(567), getProperty(getParagraph(4), "ParaHyphenationZone")); +} + +DECLARE_ODFEXPORT_TEST(testArabicZeroNumbering, "arabic-zero-numbering.odt") +{ + CPPUNIT_ASSERT_EQUAL(1, getPages()); + auto xNumberingRules + = getProperty>(getParagraph(1), "NumberingRules"); + comphelper::SequenceAsHashMap aMap(xNumberingRules->getByIndex(0)); + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 64 + // - Actual : 4 + // i.e. numbering type was ARABIC, not ARABIC_ZERO. + CPPUNIT_ASSERT_EQUAL(o3tl::narrowing(style::NumberingType::ARABIC_ZERO), + aMap["NumberingType"].get()); +} + +DECLARE_ODFEXPORT_TEST(testArabicZero3Numbering, "arabic-zero3-numbering.odt") +{ + CPPUNIT_ASSERT_EQUAL(1, getPages()); + auto xNumberingRules + = getProperty>(getParagraph(1), "NumberingRules"); + comphelper::SequenceAsHashMap aMap(xNumberingRules->getByIndex(0)); + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 65 + // - Actual : 4 + // i.e. numbering type was ARABIC, not ARABIC_ZERO3. + CPPUNIT_ASSERT_EQUAL(o3tl::narrowing(style::NumberingType::ARABIC_ZERO3), + aMap["NumberingType"].get()); +} + +DECLARE_ODFEXPORT_TEST(testArabicZero4Numbering, "arabic-zero4-numbering.odt") +{ + CPPUNIT_ASSERT_EQUAL(1, getPages()); + auto xNumberingRules + = getProperty>(getParagraph(1), "NumberingRules"); + comphelper::SequenceAsHashMap aMap(xNumberingRules->getByIndex(0)); + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 66 + // - Actual : 4 + // i.e. numbering type was ARABIC, not ARABIC_ZERO4. + CPPUNIT_ASSERT_EQUAL(o3tl::narrowing(style::NumberingType::ARABIC_ZERO4), + aMap["NumberingType"].get()); +} + +DECLARE_ODFEXPORT_TEST(testArabicZero5Numbering, "arabic-zero5-numbering.odt") +{ + CPPUNIT_ASSERT_EQUAL(1, getPages()); + auto xNumberingRules + = getProperty>(getParagraph(1), "NumberingRules"); + comphelper::SequenceAsHashMap aMap(xNumberingRules->getByIndex(0)); + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 67 + // - Actual : 4 + // i.e. numbering type was ARABIC, not ARABIC_ZERO5. + CPPUNIT_ASSERT_EQUAL(o3tl::narrowing(style::NumberingType::ARABIC_ZERO5), + aMap["NumberingType"].get()); +} + +DECLARE_ODFEXPORT_TEST(testRovasNumbering, "rovas-numbering.odt") +{ + CPPUNIT_ASSERT_EQUAL(1, getPages()); + auto xNumberingRules + = getProperty>(getParagraph(1), "NumberingRules"); + comphelper::SequenceAsHashMap aMap(xNumberingRules->getByIndex(0)); + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 68 + // - Actual : 4 + // i.e. numbering type was ARABIC, not SZEKELY_ROVAS. + CPPUNIT_ASSERT_EQUAL(o3tl::narrowing(style::NumberingType::SZEKELY_ROVAS), + aMap["NumberingType"].get()); +} + +DECLARE_ODFEXPORT_TEST(testPageContentTop, "page-content-top.odt") +{ + CPPUNIT_ASSERT_EQUAL(1, getShapes()); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + uno::Reference xShape(getShape(1), uno::UNO_QUERY); + sal_Int16 nExpected = text::RelOrientation::PAGE_PRINT_AREA_TOP; + CPPUNIT_ASSERT_EQUAL(nExpected, getProperty(xShape, "VertOrientRelation")); +} + +DECLARE_ODFEXPORT_TEST(testPageContentBottom, "page-content-bottom.odt") +{ + CPPUNIT_ASSERT_EQUAL(1, getShapes()); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + uno::Reference xShape(getShape(1), uno::UNO_QUERY); + sal_Int16 nExpected = text::RelOrientation::PAGE_PRINT_AREA_BOTTOM; + CPPUNIT_ASSERT_EQUAL(nExpected, getProperty(xShape, "VertOrientRelation")); +} + +CPPUNIT_TEST_FIXTURE(Test, tdf124470) +{ + loadAndReload("tdf124470TableAndEmbeddedUsedFonts.odt"); + // Table styles were exported out of place, inside font-face-decls. + // Without the fix in place, this will fail already in ODF validation: + // "content.xml[2,2150]: Error: tag name "style:style" is not allowed. Possible tag names are: " + + CPPUNIT_ASSERT_EQUAL(1, getPages()); + + xmlDocUniquePtr pXmlDoc = parseExport("content.xml"); + + assertXPath(pXmlDoc, "/office:document-content/office:font-face-decls/style:style"_ostr, 0); + assertXPath(pXmlDoc, "/office:document-content/office:automatic-styles/style:style[@style:family='table']"_ostr, 1); + assertXPath(pXmlDoc, "/office:document-content/office:automatic-styles/style:style[@style:family='table-column']"_ostr, 2); + assertXPath(pXmlDoc, "/office:document-content/office:automatic-styles/style:style[@style:family='paragraph']"_ostr, 1); +} + +CPPUNIT_TEST_FIXTURE(Test, tdf135942) +{ + loadAndReload("nestedTableInFooter.odt"); + // All table autostyles should be collected, including nested, and must not crash. + + CPPUNIT_ASSERT_EQUAL(1, getPages()); + + xmlDocUniquePtr pXmlDoc = parseExport("styles.xml"); + + assertXPath(pXmlDoc, "/office:document-styles/office:automatic-styles/style:style[@style:family='table']"_ostr, 2); +} + +CPPUNIT_TEST_FIXTURE(Test, tdf150927) +{ + // Similar to tdf135942 + + loadAndReload("table-in-frame-in-table-in-header-base.odt"); + // All table autostyles should be collected, including nested, and must not crash. + + CPPUNIT_ASSERT_EQUAL(1, getPages()); + + xmlDocUniquePtr pXmlDoc = parseExport("styles.xml"); + + assertXPath(pXmlDoc, "/office:document-styles/office:automatic-styles/style:style[@style:family='table']"_ostr, 2); +} + +CPPUNIT_TEST_FIXTURE(Test, tdf151100) +{ + // Similar to tdf135942 + + loadAndReload("tdf151100.docx"); + // All table autostyles should be collected, including nested, and must not crash. + + CPPUNIT_ASSERT_EQUAL(1, getPages()); + + xmlDocUniquePtr pXmlDoc = parseExport("styles.xml"); + + assertXPath(pXmlDoc, "/office:document-styles/office:automatic-styles/style:style[@style:family='table']"_ostr, 1); +} + +DECLARE_ODFEXPORT_TEST(testGutterLeft, "gutter-left.odt") +{ + CPPUNIT_ASSERT_EQUAL(1, getPages()); + uno::Reference xPageStyle; + getStyles("PageStyles")->getByName("Standard") >>= xPageStyle; + sal_Int32 nGutterMargin{}; + xPageStyle->getPropertyValue("GutterMargin") >>= nGutterMargin; + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 1270 + // - Actual : 0 + // i.e. gutter margin was lost. + CPPUNIT_ASSERT_EQUAL(static_cast(1270), nGutterMargin); +} + +DECLARE_ODFEXPORT_TEST(testTdf52065_centerTabs, "testTdf52065_centerTabs.odt") +{ + CPPUNIT_ASSERT_EQUAL(1, getPages()); + sal_Int32 nTabStop = parseDump("//body/txt[4]/SwParaPortion/SwLineLayout/child::*[3]"_ostr, "width"_ostr).toInt32(); + // Without the fix, the text was unseen, with a tabstop width of 64057. It should be 3057 + CPPUNIT_ASSERT(nTabStop < 4000); + CPPUNIT_ASSERT(3000 < nTabStop); + CPPUNIT_ASSERT_EQUAL(u"Pečiatka zamestnávateľa"_ustr, parseDump("//body/txt[4]/SwParaPortion/SwLineLayout/child::*[4]"_ostr, "portion"_ostr)); + + // tdf#149547: __XXX___invalid CharacterStyles should not be imported/exported + CPPUNIT_ASSERT(!getStyles("CharacterStyles")->hasByName("__XXX___invalid")); +} + +DECLARE_ODFEXPORT_TEST(testTdf104254_noHeaderWrapping, "tdf104254_noHeaderWrapping.odt") +{ + CPPUNIT_ASSERT_EQUAL(1, getShapes()); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + + sal_Int32 nParaHeight = getXPath(pXmlDoc, "//header/txt[1]/infos/bounds"_ostr, "height"_ostr).toInt32(); + // The wrapping on header images is supposed to be ignored (since OOo for MS compat reasons), + // thus making the text run underneath the image. Before, height was 1104. Now it is 552. + CPPUNIT_ASSERT_MESSAGE("Paragraph should fit on a single line", nParaHeight < 600); +} + +DECLARE_ODFEXPORT_TEST(testTdf131025_noZerosInTable, "tdf131025_noZerosInTable.odt") +{ + uno::Reference xSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xTables = xSupplier->getTextTables(); + uno::Reference xTable(xTables->getByName("Table1"), uno::UNO_QUERY); + + uno::Reference xCell(xTable->getCellByName("C3"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("5 gp"), xCell->getString()); +} + +DECLARE_ODFEXPORT_TEST(testTdf153090, "Custom-Style-TOC.docx") +{ + uno::Reference xIndexSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xIndexes(xIndexSupplier->getDocumentIndexes()); + uno::Reference xTOC(xIndexes->getByIndex(0), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("_CustomImageCaption"), getProperty(xTOC, "CreateFromParagraphStyle")); + // tdf#153659 this was imported as "table of figures" instead of "Figure Index 1" + // thus custom settings were not retained after ToF update + CPPUNIT_ASSERT_EQUAL(OUString("Figure Index 1"), getProperty(getParagraph(1), "ParaStyleName")); + + xTOC->update(); + OUString const tocContent(xTOC->getAnchor()->getString()); + CPPUNIT_ASSERT(tocContent.indexOf("1. Abb. Ein Haus") != -1); + CPPUNIT_ASSERT(tocContent.indexOf("2. Abb.Ein Schiff!") != -1); + CPPUNIT_ASSERT(tocContent.indexOf(u"1. ábra Small house with Hungarian description category") != -1); +} + +DECLARE_ODFEXPORT_TEST(testTdf143793_noBodyWrapping, "tdf143793_noBodyWrapping.odt") +{ + CPPUNIT_ASSERT_EQUAL(2, getShapes()); + // Preserve old document wrapping. Compat "Use OOo 1.1 text wrapping around objects" + // Originally, the body text did not wrap around spill-over header images + CPPUNIT_ASSERT_EQUAL_MESSAGE( "Fits on one page", 1, getPages() ); + + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + + sal_Int32 nParaHeight = getXPath(pXmlDoc, "//page[1]/header/txt[1]/infos/bounds"_ostr, "height"_ostr).toInt32(); + // The header text should wrap around the header image in OOo 1.1 and prior, + // thus taking up two lines instead of one. One line is 276. It should be 552. + CPPUNIT_ASSERT_MESSAGE("Header text should fill two lines", nParaHeight > 400); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf137199) +{ + loadAndReload("tdf137199.docx"); + CPPUNIT_ASSERT_EQUAL(OUString(">1<"), getProperty(getParagraph(1), "ListLabelString")); + + CPPUNIT_ASSERT_EQUAL(OUString("1)"), getProperty(getParagraph(2), "ListLabelString")); + + CPPUNIT_ASSERT_EQUAL(OUString("HELLO1WORLD!"), getProperty(getParagraph(3), "ListLabelString")); + + CPPUNIT_ASSERT_EQUAL(OUString("HELLO2WORLD!"), getProperty(getParagraph(4), "ListLabelString")); +} + +DECLARE_ODFEXPORT_TEST(testTdf143605, "tdf143605.odt") +{ + CPPUNIT_ASSERT_EQUAL(1, getPages()); + // With numbering type "none" there should be just prefix & suffix + CPPUNIT_ASSERT_EQUAL(OUString("."), getProperty(getParagraph(1), "ListLabelString")); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf57317_autoListName) +{ + createSwDoc("tdf57317_autoListName.odt"); + // The list style (from styles.xml) overrides a duplicate named auto-style + //uno::Any aNumStyle = getStyles("NumberingStyles")->getByName("L1"); + //CPPUNIT_ASSERT(aNumStyle.hasValue()); + uno::Reference xPara(getParagraph(1), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString(">1<"), getProperty(xPara, "ListLabelString")); + CPPUNIT_ASSERT_EQUAL(OUString("L1"), getProperty(xPara, "NumberingStyleName")); + + dispatchCommand(mxComponent, ".uno:SelectAll", {}); + dispatchCommand(mxComponent, ".uno:DefaultBullet", {}); + + // This was failing with a duplicate auto numbering style name of L1 instead of a unique name, + // thus it was showing the same info as before the bullet modification. + saveAndReload("writer8"); + xPara.set(getParagraph(1), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString(""), getProperty(xPara, "ListLabelString")); + + uno::Reference xLevels(xPara->getPropertyValue("NumberingRules"), + uno::UNO_QUERY); + uno::Sequence aProps; + xLevels->getByIndex(0) >>= aProps; + for (beans::PropertyValue const& rProp : std::as_const(aProps)) + { + if (rProp.Name == "BulletChar") + return; + } + CPPUNIT_FAIL("no BulletChar property"); +} + +CPPUNIT_TEST_FIXTURE(Test, testListFormatDocx) +{ + loadAndReload("listformat.docx"); + // Ensure in resulting ODT we also have not just prefix/suffix, but custom delimiters + CPPUNIT_ASSERT_EQUAL(OUString(">1<"), getProperty(getParagraph(1), "ListLabelString")); + CPPUNIT_ASSERT_EQUAL(OUString(">>1/1<<"), getProperty(getParagraph(2), "ListLabelString")); + CPPUNIT_ASSERT_EQUAL(OUString(">>1/1/1<<"), getProperty(getParagraph(3), "ListLabelString")); + CPPUNIT_ASSERT_EQUAL(OUString(">>1/1/2<<"), getProperty(getParagraph(4), "ListLabelString")); + + // Check also that in numbering styles we have num-list-format defined + xmlDocUniquePtr pXmlDoc = parseExport("styles.xml"); + assertXPath(pXmlDoc, "/office:document-styles/office:styles/text:list-style[@style:name='WWNum1']/" + "text:list-level-style-number[@text:level='1']"_ostr, "num-list-format"_ostr, ">%1%<"); + assertXPath(pXmlDoc, "/office:document-styles/office:styles/text:list-style[@style:name='WWNum1']/" + "text:list-level-style-number[@text:level='2']"_ostr, "num-list-format"_ostr, ">>%1%/%2%<<"); + assertXPath(pXmlDoc, "/office:document-styles/office:styles/text:list-style[@style:name='WWNum1']/" + "text:list-level-style-number[@text:level='3']"_ostr, "num-list-format"_ostr, ">>%1%/%2%/%3%<<"); + + // But for compatibility there are still prefix/suffix + assertXPath(pXmlDoc, "/office:document-styles/office:styles/text:list-style[@style:name='WWNum1']/" + "text:list-level-style-number[@text:level='1']"_ostr, "num-prefix"_ostr, ">"); + assertXPath(pXmlDoc, "/office:document-styles/office:styles/text:list-style[@style:name='WWNum1']/" + "text:list-level-style-number[@text:level='1']"_ostr, "num-suffix"_ostr, "<"); + assertXPath(pXmlDoc, "/office:document-styles/office:styles/text:list-style[@style:name='WWNum1']/" + "text:list-level-style-number[@text:level='2']"_ostr, "num-prefix"_ostr, ">>"); + assertXPath(pXmlDoc, "/office:document-styles/office:styles/text:list-style[@style:name='WWNum1']/" + "text:list-level-style-number[@text:level='2']"_ostr, "num-suffix"_ostr, "<<"); + assertXPath(pXmlDoc, "/office:document-styles/office:styles/text:list-style[@style:name='WWNum1']/" + "text:list-level-style-number[@text:level='3']"_ostr, "num-prefix"_ostr, ">>"); + assertXPath(pXmlDoc, "/office:document-styles/office:styles/text:list-style[@style:name='WWNum1']/" + "text:list-level-style-number[@text:level='3']"_ostr, "num-suffix"_ostr, "<<"); +} + +DECLARE_ODFEXPORT_TEST(testShapeWithHyperlink, "shape-with-hyperlink.odt") +{ + CPPUNIT_ASSERT_EQUAL(1, getShapes()); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + if (isExported()) + { + xmlDocUniquePtr pXmlDoc = parseExport("content.xml"); + // Check how conversion from prefix/suffix to list format did work + assertXPath(pXmlDoc, "/office:document-content/office:body/office:text/text:p/draw:a"_ostr, + "href"_ostr, "http://shape.com/"); + } +} + +DECLARE_ODFEXPORT_TEST(testShapesHyperlink, "shapes-hyperlink.odt") +{ + CPPUNIT_ASSERT_EQUAL(1, getPages()); + CPPUNIT_ASSERT_EQUAL(5, getShapes()); + uno::Reference const xPropSet1(getShape(1), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("http://libreoffice.org/"), getProperty(xPropSet1, "Hyperlink")); + + uno::Reference const xPropSet2(getShape(2), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("http://libreoffice2.org/"), getProperty(xPropSet2, "Hyperlink")); + + uno::Reference const xPropSet3(getShape(3), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("http://libreoffice3.org/"), getProperty(xPropSet3, "Hyperlink")); + + uno::Reference const xPropSet4(getShape(4), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("http://libreoffice4.org/"), getProperty(xPropSet4, "Hyperlink")); + + uno::Reference const xPropSet5(getShape(5), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("http://libreoffice5.org/"), getProperty(xPropSet5, "Hyperlink")); +} + +DECLARE_ODFEXPORT_TEST(testListFormatOdt, "listformat.odt") +{ + CPPUNIT_ASSERT_EQUAL(1, getPages()); + // Ensure in resulting ODT we also have not just prefix/suffix, but custom delimiters + CPPUNIT_ASSERT_EQUAL(OUString(">1<"), getProperty(getParagraph(1), "ListLabelString")); + CPPUNIT_ASSERT_EQUAL(OUString(">>1.1<<"), getProperty(getParagraph(2), "ListLabelString")); + CPPUNIT_ASSERT_EQUAL(OUString(">>1.1.1<<"), getProperty(getParagraph(3), "ListLabelString")); + CPPUNIT_ASSERT_EQUAL(OUString(">>1.1.2<<"), getProperty(getParagraph(4), "ListLabelString")); + + if (isExported()) + { + xmlDocUniquePtr pXmlDoc = parseExport("content.xml"); + // Check how conversion from prefix/suffix to list format did work + assertXPath(pXmlDoc, "/office:document-content/office:automatic-styles/text:list-style[@style:name='L1']/" + "text:list-level-style-number[@text:level='1']"_ostr, "num-list-format"_ostr, ">%1%<"); + assertXPath(pXmlDoc, "/office:document-content/office:automatic-styles/text:list-style[@style:name='L1']/" + "text:list-level-style-number[@text:level='2']"_ostr, "num-list-format"_ostr, ">>%1%.%2%<<"); + assertXPath(pXmlDoc, "/office:document-content/office:automatic-styles/text:list-style[@style:name='L1']/" + "text:list-level-style-number[@text:level='3']"_ostr, "num-list-format"_ostr, ">>%1%.%2%.%3%<<"); + + // But for compatibility there are still prefix/suffix as they were before + assertXPath(pXmlDoc, "/office:document-content/office:automatic-styles/text:list-style[@style:name='L1']/" + "text:list-level-style-number[@text:level='1']"_ostr, "num-prefix"_ostr, ">"); + assertXPath(pXmlDoc, "/office:document-content/office:automatic-styles/text:list-style[@style:name='L1']/" + "text:list-level-style-number[@text:level='1']"_ostr, "num-suffix"_ostr, "<"); + assertXPath(pXmlDoc, "/office:document-content/office:automatic-styles/text:list-style[@style:name='L1']/" + "text:list-level-style-number[@text:level='2']"_ostr, "num-prefix"_ostr, ">>"); + assertXPath(pXmlDoc, "/office:document-content/office:automatic-styles/text:list-style[@style:name='L1']/" + "text:list-level-style-number[@text:level='2']"_ostr, "num-suffix"_ostr, "<<"); + assertXPath(pXmlDoc, "/office:document-content/office:automatic-styles/text:list-style[@style:name='L1']/" + "text:list-level-style-number[@text:level='3']"_ostr, "num-prefix"_ostr, ">>"); + assertXPath(pXmlDoc, "/office:document-content/office:automatic-styles/text:list-style[@style:name='L1']/" + "text:list-level-style-number[@text:level='3']"_ostr, "num-suffix"_ostr, "<<"); + } +} + +CPPUNIT_TEST_FIXTURE(Test, testStyleLink) +{ + // Given a document with a para and a char style that links each other, when loading that + // document: + createSwDoc("style-link.fodt"); + + // Then make sure the char style links the para one: + uno::Any aCharStyle = getStyles("CharacterStyles")->getByName("List Paragraph Char"); + // Without the accompanying fix in place, this test would have failed with: + // - Expected: List Paragraph + // - Actual : + // i.e. the linked style was lost on import. + CPPUNIT_ASSERT_EQUAL(OUString("List Paragraph"), getProperty(aCharStyle, "LinkStyle")); + uno::Any aParaStyle = getStyles("ParagraphStyles")->getByName("List Paragraph"); + // Without the accompanying fix in place, this test would have failed with: + // - Expected: List Paragraph Char + // - Actual : + // i.e. the linked style was lost on import. + CPPUNIT_ASSERT_EQUAL(OUString("List Paragraph Char"), getProperty(aParaStyle, "LinkStyle")); +} + +CPPUNIT_TEST_FIXTURE(Test, tdf120972) +{ + loadAndReload("table_number_format_3.docx"); + + xmlDocUniquePtr pXmlDoc = parseExport("content.xml"); + OUString cDecimal(SvtSysLocale().GetLocaleData().getNumDecimalSep()[0]); + assertXPath( + pXmlDoc, + "//style:style[@style:name='P1']/style:paragraph-properties/style:tab-stops/style:tab-stop"_ostr, + "char"_ostr, cDecimal); + assertXPath( + pXmlDoc, + "//style:style[@style:name='P2']/style:paragraph-properties/style:tab-stops/style:tab-stop"_ostr, + "char"_ostr, cDecimal); +} + +DECLARE_ODFEXPORT_TEST(testTdf114287, "tdf114287.odt") +{ + uno::Reference const xLevels1( + getProperty>(getParagraph(2), "NumberingRules")); + uno::Reference const xNum1(xLevels1, uno::UNO_QUERY); + ::comphelper::SequenceAsHashMap props1(xLevels1->getByIndex(0)); + CPPUNIT_ASSERT_EQUAL(sal_Int32(-700), props1["FirstLineIndent"].get()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1330), props1["IndentAt"].get()); + + // 1: automatic style applies list-style-name and margin-left + CPPUNIT_ASSERT_EQUAL(sal_Int32(-1000), getProperty(getParagraph(2), "ParaFirstLineIndent")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(5001), getProperty(getParagraph(2), "ParaLeftMargin")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(getParagraph(2), "ParaRightMargin")); + + // list is continued + uno::Reference const xNum2( + getProperty>(getParagraph(9), "NumberingRules")); + CPPUNIT_ASSERT_EQUAL(xNum1->getName(), xNum2->getName()); + + // 2: style applies list-style-name and margin-left, list applies list-style-name + CPPUNIT_ASSERT_EQUAL(sal_Int32(-1000), getProperty(getParagraph(9), "ParaFirstLineIndent")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(5001), getProperty(getParagraph(9), "ParaLeftMargin")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(getParagraph(9), "ParaRightMargin")); + + // list is continued + uno::Reference const xNum3( + getProperty>(getParagraph(16), "NumberingRules")); + CPPUNIT_ASSERT_EQUAL(xNum1->getName(), xNum3->getName()); + + // 3: style applies margin-left, automatic style applies list-style-name + CPPUNIT_ASSERT_EQUAL(sal_Int32(-1000), getProperty(getParagraph(16), "ParaFirstLineIndent")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(5001), getProperty(getParagraph(16), "ParaLeftMargin")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(getParagraph(16), "ParaRightMargin")); + + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[2]/infos/prtBounds"_ostr, "left"_ostr, "2268"); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[2]/infos/prtBounds"_ostr, "right"_ostr, "11339"); + // the problem was that the list style name of the list must override the + // paragraph style even though it's the same list style + assertXPath(pXmlDoc, "/root/page[1]/body/txt[9]/infos/prtBounds"_ostr, "left"_ostr, "357"); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[9]/infos/prtBounds"_ostr, "right"_ostr, "11339"); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[16]/infos/prtBounds"_ostr, "left"_ostr, "357"); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[16]/infos/prtBounds"_ostr, "right"_ostr, "11339"); +} + +DECLARE_ODFEXPORT_TEST(testSectionColumnSeparator, "section-columns-separator.fodt") +{ + // tdf#150235: due to wrong types used in column export, 'style:height' and 'style:style' + // attributes were exported incorrectly for 'style:column-sep' element + auto xSection = getProperty>(getParagraph(1), "TextSection"); + auto xColumns = getProperty>(xSection, "TextColumns"); + CPPUNIT_ASSERT(xColumns); + CPPUNIT_ASSERT_EQUAL(sal_Int16(2), xColumns->getColumnCount()); + + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 50 + // - Actual : 100 + CPPUNIT_ASSERT_EQUAL(static_cast(50), + getProperty(xColumns, "SeparatorLineRelativeHeight")); + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 2 + // - Actual : 0 + CPPUNIT_ASSERT_EQUAL(css::text::ColumnSeparatorStyle::DOTTED, + getProperty(xColumns, "SeparatorLineStyle")); + + // Check the rest of the properties, too + CPPUNIT_ASSERT_EQUAL(true, getProperty(xColumns, "IsAutomatic")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(600), getProperty(xColumns, "AutomaticDistance")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(9), getProperty(xColumns, "SeparatorLineWidth")); + CPPUNIT_ASSERT_EQUAL(Color(0x99, 0xAA, 0xBB), + getProperty(xColumns, "SeparatorLineColor")); + CPPUNIT_ASSERT_EQUAL( + css::style::VerticalAlignment_BOTTOM, + getProperty(xColumns, "SeparatorLineVerticalAlignment")); + CPPUNIT_ASSERT_EQUAL(true, getProperty(xColumns, "SeparatorLineIsOn")); +} + +DECLARE_ODFEXPORT_TEST(testTdf78510, "WordTest_edit.odt") +{ + uno::Reference const xLevels1( + getProperty>(getParagraph(1), "NumberingRules")); + ::comphelper::SequenceAsHashMap props1(xLevels1->getByIndex(0)); + CPPUNIT_ASSERT_EQUAL(sal_Int32(-1000), props1["FirstLineIndent"].get()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2000), props1["IndentAt"].get()); + + // 1: inherited from paragraph style and overridden by list + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(getParagraph(1), "ParaFirstLineIndent")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1270), getProperty(getParagraph(1), "ParaLeftMargin")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(getParagraph(1), "ParaRightMargin")); + // 2: as 1 + paragraph sets firstline + CPPUNIT_ASSERT_EQUAL(sal_Int32(1000), getProperty(getParagraph(2), "ParaFirstLineIndent")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1270), getProperty(getParagraph(2), "ParaLeftMargin")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(getParagraph(2), "ParaRightMargin")); + // 3: as 1 + paragraph sets textleft + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(getParagraph(3), "ParaFirstLineIndent")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(3000), getProperty(getParagraph(3), "ParaLeftMargin")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(getParagraph(3), "ParaRightMargin")); + // 4: as 1 + paragraph sets firstline, textleft + CPPUNIT_ASSERT_EQUAL(sal_Int32(-2000), getProperty(getParagraph(4), "ParaFirstLineIndent")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(3000), getProperty(getParagraph(4), "ParaLeftMargin")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(getParagraph(4), "ParaRightMargin")); + // 5: as 1 + paragraph sets firstline + CPPUNIT_ASSERT_EQUAL(sal_Int32(-2000), getProperty(getParagraph(5), "ParaFirstLineIndent")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1270), getProperty(getParagraph(5), "ParaLeftMargin")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(getParagraph(5), "ParaRightMargin")); + // 6: as 1 + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(getParagraph(6), "ParaFirstLineIndent")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1270), getProperty(getParagraph(6), "ParaLeftMargin")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(getParagraph(6), "ParaRightMargin")); + + uno::Reference const xLevels8( + getProperty>(getParagraph(8), "NumberingRules")); + ::comphelper::SequenceAsHashMap props8(xLevels8->getByIndex(0)); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1000), props8["FirstLineIndent"].get()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1000), props8["IndentAt"].get()); + + // 8: inherited from paragraph style and overridden by list + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(getParagraph(8), "ParaFirstLineIndent")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1270), getProperty(getParagraph(8), "ParaLeftMargin")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(getParagraph(8), "ParaRightMargin")); + // 9: as 8 + paragraph sets firstline + CPPUNIT_ASSERT_EQUAL(sal_Int32(2000), getProperty(getParagraph(9), "ParaFirstLineIndent")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1270), getProperty(getParagraph(9), "ParaLeftMargin")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(getParagraph(9), "ParaRightMargin")); + // 10: as 8 + paragraph sets textleft + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(getParagraph(10), "ParaFirstLineIndent")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(3000), getProperty(getParagraph(10), "ParaLeftMargin")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(getParagraph(10), "ParaRightMargin")); + // 11: as 8 + paragraph sets firstline, textleft + CPPUNIT_ASSERT_EQUAL(sal_Int32(-2000), getProperty(getParagraph(11), "ParaFirstLineIndent")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(3000), getProperty(getParagraph(11), "ParaLeftMargin")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(getParagraph(11), "ParaRightMargin")); + // 12: as 8 + paragraph sets firstline + CPPUNIT_ASSERT_EQUAL(sal_Int32(-2000), getProperty(getParagraph(12), "ParaFirstLineIndent")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1270), getProperty(getParagraph(12), "ParaLeftMargin")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(getParagraph(12), "ParaRightMargin")); + // 13: as 8 + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(getParagraph(13), "ParaFirstLineIndent")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1270), getProperty(getParagraph(13), "ParaLeftMargin")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(getParagraph(13), "ParaRightMargin")); + + // unfortunately it appears that the portions don't have a position + // so it's not possible to check the first-line-offset that's applied + // (the first-line-indent is computed on the fly in SwTextMargin when + // painting) + { + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[1]/infos/prtBounds"_ostr, "left"_ostr, "567"); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[1]/infos/prtBounds"_ostr, "right"_ostr, "9359"); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[2]/infos/prtBounds"_ostr, "left"_ostr, "1134"); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[2]/infos/prtBounds"_ostr, "right"_ostr, "9359"); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[3]/infos/prtBounds"_ostr, "left"_ostr, "1134"); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[3]/infos/prtBounds"_ostr, "right"_ostr, "9359"); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[4]/infos/prtBounds"_ostr, "left"_ostr, "567"); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[4]/infos/prtBounds"_ostr, "right"_ostr, "9359"); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[5]/infos/prtBounds"_ostr, "left"_ostr, "0"); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[5]/infos/prtBounds"_ostr, "right"_ostr, "9359"); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[6]/infos/prtBounds"_ostr, "left"_ostr, "567"); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[6]/infos/prtBounds"_ostr, "right"_ostr, "9359"); + + assertXPath(pXmlDoc, "/root/page[1]/body/txt[8]/infos/prtBounds"_ostr, "left"_ostr, "567"); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[8]/infos/prtBounds"_ostr, "right"_ostr, "9359"); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[9]/infos/prtBounds"_ostr, "left"_ostr, "567"); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[9]/infos/prtBounds"_ostr, "right"_ostr, "9359"); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[10]/infos/prtBounds"_ostr, "left"_ostr, "1701"); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[10]/infos/prtBounds"_ostr, "right"_ostr, "9359"); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[11]/infos/prtBounds"_ostr, "left"_ostr, "567"); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[11]/infos/prtBounds"_ostr, "right"_ostr, "9359"); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[12]/infos/prtBounds"_ostr, "left"_ostr, "-567"); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[12]/infos/prtBounds"_ostr, "right"_ostr, "9359"); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[13]/infos/prtBounds"_ostr, "left"_ostr, "567"); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[13]/infos/prtBounds"_ostr, "right"_ostr, "9359"); + } + + // now check the positions where text is actually painted - + // wonder how fragile this is... + // FIXME some platform difference, 1st one is 2306 on Linux, 3087 on WNT ? + // some Mac has 3110 +#if !defined(_WIN32) && !defined(MACOSX) + { + SwDocShell *const pShell(dynamic_cast(*mxComponent).GetDocShell()); + std::shared_ptr pMetaFile = pShell->GetPreviewMetaFile(); + MetafileXmlDump aDumper; + xmlDocUniquePtr pXmlDoc = dumpAndParse(aDumper, *pMetaFile); + + // 1: inherited from paragraph style and overridden by list + // bullet char is extra + + assertXPath(pXmlDoc, "//textarray[1]"_ostr, "x"_ostr, "2306"); + // text is after a tab from list - haven't checked if that is correct? + assertXPath(pXmlDoc, "//textarray[2]"_ostr, "x"_ostr, "2873"); + // second line + assertXPath(pXmlDoc, "//textarray[3]"_ostr, "x"_ostr, "2873"); + // 2: as 1 + paragraph sets firstline + assertXPath(pXmlDoc, "//textarray[4]"_ostr, "x"_ostr, "3440"); + assertXPath(pXmlDoc, "//textarray[5]"_ostr, "x"_ostr, "3593"); + assertXPath(pXmlDoc, "//textarray[6]"_ostr, "x"_ostr, "2873"); + // 3: as 1 + paragraph sets textleft + assertXPath(pXmlDoc, "//textarray[7]"_ostr, "x"_ostr, "2873"); + assertXPath(pXmlDoc, "//textarray[8]"_ostr, "x"_ostr, "3440"); + assertXPath(pXmlDoc, "//textarray[9]"_ostr, "x"_ostr, "3440"); + // 4: as 1 + paragraph sets firstline, textleft + assertXPath(pXmlDoc, "//textarray[10]"_ostr, "x"_ostr, "2306"); + assertXPath(pXmlDoc, "//textarray[11]"_ostr, "x"_ostr, "3440"); + assertXPath(pXmlDoc, "//textarray[12]"_ostr, "x"_ostr, "3440"); + // 5: as 1 + paragraph sets firstline + assertXPath(pXmlDoc, "//textarray[13]"_ostr, "x"_ostr, "1739"); + assertXPath(pXmlDoc, "//textarray[14]"_ostr, "x"_ostr, "2873"); + assertXPath(pXmlDoc, "//textarray[15]"_ostr, "x"_ostr, "2873"); + // 6: as 1 + assertXPath(pXmlDoc, "//textarray[16]"_ostr, "x"_ostr, "2306"); + assertXPath(pXmlDoc, "//textarray[17]"_ostr, "x"_ostr, "2873"); + + // 8: inherited from paragraph style and overridden by list + assertXPath(pXmlDoc, "//textarray[18]"_ostr, "x"_ostr, "2873"); + assertXPath(pXmlDoc, "//textarray[19]"_ostr, "x"_ostr, "3746"); + assertXPath(pXmlDoc, "//textarray[20]"_ostr, "x"_ostr, "2306"); + // 9: as 8 + paragraph sets firstline + assertXPath(pXmlDoc, "//textarray[21]"_ostr, "x"_ostr, "3440"); + assertXPath(pXmlDoc, "//textarray[22]"_ostr, "x"_ostr, "3746"); + assertXPath(pXmlDoc, "//textarray[23]"_ostr, "x"_ostr, "2306"); + // 10: as 8 + paragraph sets textleft + assertXPath(pXmlDoc, "//textarray[24]"_ostr, "x"_ostr, "4007"); + assertXPath(pXmlDoc, "//textarray[25]"_ostr, "x"_ostr, "4880"); + assertXPath(pXmlDoc, "//textarray[26]"_ostr, "x"_ostr, "3440"); + // 11: as 8 + paragraph sets firstline, textleft + assertXPath(pXmlDoc, "//textarray[27]"_ostr, "x"_ostr, "2306"); + assertXPath(pXmlDoc, "//textarray[28]"_ostr, "x"_ostr, "3440"); + assertXPath(pXmlDoc, "//textarray[29]"_ostr, "x"_ostr, "3440"); + // 12: as 8 + paragraph sets firstline + assertXPath(pXmlDoc, "//textarray[30]"_ostr, "x"_ostr, "1172"); + assertXPath(pXmlDoc, "//textarray[31]"_ostr, "x"_ostr, "1739"); + assertXPath(pXmlDoc, "//textarray[32]"_ostr, "x"_ostr, "2306"); + // 13: as 8 + assertXPath(pXmlDoc, "//textarray[33]"_ostr, "x"_ostr, "2873"); + assertXPath(pXmlDoc, "//textarray[34]"_ostr, "x"_ostr, "3746"); + } +#endif +} + +CPPUNIT_TEST_FIXTURE(Test, testParagraphMarkerMarkupRoundtrip) +{ + loadAndReload("ParagraphMarkerMarkup.fodt"); + // Test that the markup stays at save-and-reload + xmlDocUniquePtr pXmlDoc = parseExport("content.xml"); + assertXPath(pXmlDoc, "/office:document-content/office:body/office:text/text:p"_ostr, "marker-style-name"_ostr, "T2"); + assertXPath(pXmlDoc, "/office:document-content/office:automatic-styles/style:style[@style:name='T2']/style:text-properties"_ostr, "font-size"_ostr, "9pt"); + assertXPath(pXmlDoc, "/office:document-content/office:automatic-styles/style:style[@style:name='T2']/style:text-properties"_ostr, "color"_ostr, "#ff0000"); +} + +CPPUNIT_TEST_FIXTURE(Test, testCommentStyles) +{ + createSwDoc(); + + auto xFactory(mxComponent.queryThrow()); + auto xComment(xFactory->createInstance("com.sun.star.text.textfield.Annotation").queryThrow()); + auto xCommentText(getProperty>(xComment, "TextRange")); + xCommentText->setString("Hello World"); + xCommentText.queryThrow()->setPropertyValue("ParaStyleName", uno::Any(OUString("Heading"))); + + xComment->attach(getParagraph(1)->getEnd()); + + saveAndReload("writer8"); + + auto xFields(mxComponent.queryThrow()->getTextFields()->createEnumeration()); + xComment.set(xFields->nextElement().queryThrow()); + CPPUNIT_ASSERT(xComment.queryThrow()->supportsService("com.sun.star.text.textfield.Annotation")); + + xCommentText.set(getProperty>(xComment, "TextRange")); + CPPUNIT_ASSERT_EQUAL(OUString("Heading"), getProperty(xCommentText, "ParaStyleName")); + + auto xStyleFamilies(mxComponent.queryThrow()->getStyleFamilies()); + auto xParaStyles(xStyleFamilies->getByName("ParagraphStyles")); + auto xStyle(xParaStyles.queryThrow()->getByName("Heading")); + CPPUNIT_ASSERT_EQUAL(getProperty(xStyle, "CharHeight"), getProperty(xCommentText, "CharHeight")); + CPPUNIT_ASSERT_EQUAL(beans::PropertyState_DEFAULT_VALUE, + xCommentText.queryThrow()->getPropertyState("CharHeight")); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf150408_IsLegal) +{ + loadAndReload("IsLegal.fodt"); + + // Second level's numbering should use Arabic numbers for first level reference + auto xPara = getParagraph(1); + CPPUNIT_ASSERT_EQUAL(OUString("CH I"), getProperty(xPara, "ListLabelString")); + xPara = getParagraph(2); + CPPUNIT_ASSERT_EQUAL(OUString("Sect 1.01"), getProperty(xPara, "ListLabelString")); + xPara = getParagraph(3); + CPPUNIT_ASSERT_EQUAL(OUString("CH II"), getProperty(xPara, "ListLabelString")); + xPara = getParagraph(4); + CPPUNIT_ASSERT_EQUAL(OUString("Sect 2.01"), getProperty(xPara, "ListLabelString")); + + // Test that the markup stays at save-and-reload + xmlDocUniquePtr pXmlDoc = parseExport("styles.xml"); + assertXPath( + pXmlDoc, + "/office:document-styles/office:styles/text:outline-style/text:outline-level-style[2]"_ostr, + "is-legal"_ostr, "true"); +} + +CPPUNIT_PLUGIN_IMPLEMENT(); + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ -- cgit v1.2.3