/* -*- 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/.
*/
class Test : public SwModelTestBase
{ public:
Test() : SwModelTestBase(u"/sw/qa/extras/ww8export/data/"_ustr, u"MS Word 97"_ustr) {}
};
DECLARE_WW8EXPORT_TEST(testTdf99120, "tdf99120.doc")
{
xmlDocUniquePtr pXmlDoc = parseLayoutDump();
assertXPathContent(pXmlDoc, "/root/page[1]/header/txt/text()", u"Section 1, odd.");
assertXPathContent(pXmlDoc, "/root/page[2]/header/txt/text()", u"Section 1, even."); // This failed: the header was empty on the 3rd page, as the first page header was shown.
assertXPathContent(pXmlDoc, "/root/page[3]/header/txt/text()", u"Section 2, odd.");
assertXPathContent(pXmlDoc, "/root/page[4]/header/txt/text()", u"Section 2, even.");
}
CPPUNIT_TEST_FIXTURE(Test, testTdf41542_borderlessPadding)
{
loadAndReload("tdf41542_borderlessPadding.odt"); // the page style's borderless padding should force this to 3 pages, not 1
CPPUNIT_ASSERT_EQUAL( 3, getPages() );
}
// The border width was zero
table::BorderLine2 aBorder = getProperty<table::BorderLine2>(xTable->getCellByName(u"B2"_ustr), u"RightBorder"_ustr);
CPPUNIT_ASSERT(aBorder.LineWidth > 0);
}
// Since the table has been converted into a floating frame, the relative width either needed to be transferred // onto the frame, or else just thrown out. Otherwise it becomes relative to the size of the frame.
CPPUNIT_ASSERT_EQUAL_MESSAGE("Floated table can't use relative width", sal_Int16(0), getProperty<sal_Int16>(xTable, u"RelativeWidth"_ustr));
}; // This also resulted in a layout loop when flys were allowed to split in footers.
createSwDoc("tdf128700_relativeTableWidth.doc");
verify();
saveAndReload(u"MS Word 97"_ustr);
verify();
}
//For MSO compatibility, the image should be at the top of the cell, not at the bottom - despite VertOrientation::BOTTOM
xmlDocUniquePtr pXmlDoc = parseLayoutDump();
sal_Int32 nFlyTop = getXPath(pXmlDoc, "/root/page/body/tab/row/cell[1]/txt/anchored/fly/infos/bounds", "top").toInt32();
CPPUNIT_ASSERT_MESSAGE("FlyTop should be 3820, not 6623", nFlyTop < 4000);
sal_Int32 nTextTop = getXPath(pXmlDoc, "/root/page/body/tab/row/cell[2]/txt[1]/infos/bounds", "top").toInt32();
CPPUNIT_ASSERT_MESSAGE("TextTop should be 5388", nTextTop > 4000);
}
CPPUNIT_TEST_FIXTURE(Test, testTdf55427_footnote2endnote)
{ auto verify = [this](bool bIsExport = false) {
uno::Reference<beans::XPropertySet> xPageStyle(getStyles(u"ParagraphStyles"_ustr)->getByName(u"Footnote"_ustr), uno::UNO_QUERY);
CPPUNIT_ASSERT_EQUAL_MESSAGE( "Footnote style is rose color", Color(0xFF007F), getProperty< Color >(xPageStyle, u"CharColor"_ustr));
xPageStyle.set(getStyles(u"ParagraphStyles"_ustr)->getByName(u"Endnote"_ustr), uno::UNO_QUERY);
CPPUNIT_ASSERT_EQUAL_MESSAGE( "Endnote style is cyan3 color", Color(0x2BD0D2), getProperty< Color >(xPageStyle, u"CharColor"_ustr));
SwDoc* pDoc = getSwDoc(); // The footnote numbering type of ARABIC will not transfer over when those footnotes are converted to endnotes.
CPPUNIT_ASSERT_EQUAL_MESSAGE( "Footnote numbering type", SVX_NUM_ARABIC, pDoc->GetFootnoteInfo().m_aFormat.GetNumberingType() ); // The original document has a real endnote using ROMAN_LOWER numbering, so that setting MUST remain unchanged.
CPPUNIT_ASSERT_EQUAL_MESSAGE( "Endnote numbering type", SVX_NUM_ROMAN_LOWER, pDoc->GetEndNoteInfo().m_aFormat.GetNumberingType() );
// ODT footnote-at-document-end's closest DOC match is an endnote, so the two imports will not exactly match by design. if (!bIsExport)
{
CPPUNIT_ASSERT_EQUAL_MESSAGE( "original footnote count", sal_Int32(5), xFootnotes->getCount() );
CPPUNIT_ASSERT_EQUAL_MESSAGE( "original endnote count", sal_Int32(1), xEndnotes->getCount() );
DECLARE_WW8EXPORT_TEST(testTdf107931_KERN_DocEnabled_disabledDefStyle, "testTdf107931_KERN_DocEnabled_disabledDefStyle.doc")
{ // Paragraph 3: the default style has kerning disabled
CPPUNIT_ASSERT(!getProperty<bool>(getRun(getParagraph(3), 1), u"CharAutoKerning"_ustr)); // Paragraph 4: style with kerning disabled
CPPUNIT_ASSERT(!getProperty<bool>(getRun(getParagraph(4), 1), u"CharAutoKerning"_ustr)); // Paragraph 5: style with kerning enabled
CPPUNIT_ASSERT(getProperty<bool>(getRun(getParagraph(5), 1), u"CharAutoKerning"_ustr)); // Paragraph 6: directly applied character properties: kerning disabled
CPPUNIT_ASSERT(!getProperty<bool>(getRun(getParagraph(6), 1), u"CharAutoKerning"_ustr)); // Paragraph 7: directly applied character properties: kerning enabled
CPPUNIT_ASSERT(getProperty<bool>(getRun(getParagraph(7), 1), u"CharAutoKerning"_ustr));
}
DECLARE_WW8EXPORT_TEST(testTdf107931_KERN_enabledDefStyle, "testTdf107931_KERN_enabledDefStyle.doc")
{ // Paragraph 3: the default style has kerning enabled
CPPUNIT_ASSERT(getProperty<bool>(getRun(getParagraph(3), 1), u"CharAutoKerning"_ustr)); // Paragraph 4: style with kerning disabled
CPPUNIT_ASSERT(!getProperty<bool>(getRun(getParagraph(4), 1), u"CharAutoKerning"_ustr)); // Paragraph 5: style with kerning enabled
CPPUNIT_ASSERT(getProperty<bool>(getRun(getParagraph(5), 1), u"CharAutoKerning"_ustr)); // Paragraph 6: directly applied character properties: kerning disabled
CPPUNIT_ASSERT(!getProperty<bool>(getRun(getParagraph(6), 1), u"CharAutoKerning"_ustr)); // Paragraph 7: directly applied character properties: kerning enabled
CPPUNIT_ASSERT(getProperty<bool>(getRun(getParagraph(7), 1), u"CharAutoKerning"_ustr));
}
DECLARE_WW8EXPORT_TEST(testTdf89377, "tdf89377_tableWithBreakBeforeParaStyle.doc")
{ // the paragraph style should set table's text-flow break-before-page
CPPUNIT_ASSERT_EQUAL( 2, getPages() );
}
DECLARE_WW8EXPORT_TEST(testTdf96277, "tdf96277.doc")
{ // mismatch between anchoring at paragraph and ULSpacing to Page
CPPUNIT_ASSERT_EQUAL( 1, getPages() );
}
DECLARE_WW8EXPORT_TEST(testBnc863018b, "bnc863018b.doc")
{ // The whitespace above the table should allow text to flow between the table anchor and the table. // Since it doesn't, don't add the whitespace.
CPPUNIT_ASSERT_EQUAL( 1, getPages() );
}
CPPUNIT_ASSERT_EQUAL_MESSAGE( "Number of paragraphs in Endnote i", 1, getParagraphs(xEndnote) );
}
CPPUNIT_TEST_FIXTURE(Test, testTdf106062_nonHangingFootnote)
{
loadAndReload("tdf106062_nonHangingFootnote.odt");
CPPUNIT_ASSERT_EQUAL(1, getPages());
uno::Reference<text::XFootnotesSupplier> xFootnotesSupplier(mxComponent, uno::UNO_QUERY);
uno::Reference<container::XIndexAccess> xFootnotes = xFootnotesSupplier->getFootnotes();
uno::Reference<text::XTextRange> xTextRange(xFootnotes->getByIndex(0), uno::UNO_QUERY); // This failed, tab between the footnote number and the footnote content was lost on import.
CPPUNIT_ASSERT_MESSAGE( "Footnote starts with a tab", xTextRange->getString().startsWith("\t") );
}
CPPUNIT_ASSERT_EQUAL_MESSAGE( "myDefaultStyle - no base style, LTR",
text::WritingMode2::LR_TB, getProperty<sal_Int16>(getParagraph(2), u"WritingMode"_ustr) );
}
CPPUNIT_TEST_FIXTURE(Test, testTdf107773)
{ auto verify = [this]() { // This failed, multi-page table was imported as a non-split frame.
SwDoc* pDoc = getSwDoc();
SwRootFrame* pLayout = pDoc->getIDocumentLayoutAccess().GetCurrentLayout(); auto pPage1 = dynamic_cast<SwPageFrame*>(pLayout->Lower());
CPPUNIT_ASSERT(pPage1); // pPage1 has no sorted (floating) objections.
CPPUNIT_ASSERT(pPage1->GetSortedObjs()); const SwSortedObjs& rPage1Objs = *pPage1->GetSortedObjs();
CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(1), rPage1Objs.size()); auto pPage1Fly = dynamic_cast<SwFlyAtContentFrame*>(rPage1Objs[0]);
CPPUNIT_ASSERT(pPage1Fly); auto pTab1 = dynamic_cast<SwTabFrame*>(pPage1Fly->GetLower());
CPPUNIT_ASSERT(pTab1); // This failed, the split fly containing a table was exported back to DOC as shape+table, // which can't split.
CPPUNIT_ASSERT(pTab1->HasFollow());
DECLARE_WW8EXPORT_TEST(testTdf104805, "tdf104805.doc")
{ // Prefix was "." instead of empty, so the second paragraph was // rendered as ".1" instead of "1.". // Unittest modified due to Prefix/Suffix support obsolete
uno::Reference<beans::XPropertySet> xPara(getParagraph(2), uno::UNO_QUERY);
CPPUNIT_ASSERT_EQUAL(u"1."_ustr, getProperty<OUString>(xPara, u"ListLabelString"_ustr));
}
DECLARE_WW8EXPORT_TEST(testTdf104334, "tdf104334.doc")
{ // This failed with a container::NoSuchElementException: STYLEREF was // mapped to SwChapterField, and the field result was "This is a Heading 1" // instead of just "1".
CPPUNIT_ASSERT_EQUAL(u"1"_ustr, getRun(getParagraph(2), 4)->getString());
}
DECLARE_WW8EXPORT_TEST(testTdf108072, "tdf108072.doc")
{ // The property IsSplitAllowed was imported from an obsolete property, sprmTFCantSplit90 // instead of sprmTFCantSplit. sprmTFCantSplit90 is set to true for merged rows, so // for merged rows incorrect settings were imported, which prevented them from breaking over pages.
uno::Reference<text::XTextTablesSupplier> xTextTablesSupplier(mxComponent, uno::UNO_QUERY);
uno::Reference<container::XIndexAccess> xTables(xTextTablesSupplier->getTextTables(), uno::UNO_QUERY);
uno::Reference<text::XTextTable> xTable(xTables->getByIndex(0), uno::UNO_QUERY);
uno::Reference<container::XIndexAccess> xTableRows = xTable->getRows();
CPPUNIT_ASSERT_EQUAL(true, getProperty<bool>(xTableRows->getByIndex(0), u"IsSplitAllowed"_ustr));
}
DECLARE_WW8EXPORT_TEST(testTdf123321, "shapes-line-ellipse.doc")
{ // These are the 3 lines in which 1st and 3rd one were disappearing before
uno::Reference<drawing::XShape> l1 = getShape(7);
uno::Reference<drawing::XShape> l2 = getShape(8);
uno::Reference<drawing::XShape> l3 = getShape(9);
// first line (smallest) // Fails without the fix: Expected: 423, Actual: 2
CPPUNIT_ASSERT_EQUAL(sal_Int32(423), l1->getSize().Height); // Fails without the fix: Expected: 0, Actual: 2
CPPUNIT_ASSERT_EQUAL(sal_Int32(0), l1->getSize().Width);
CPPUNIT_ASSERT_EQUAL(sal_Int32(7908), l1->getPosition().X);
CPPUNIT_ASSERT_EQUAL(sal_Int32(37), l1->getPosition().Y);
// second line (larger)
CPPUNIT_ASSERT_EQUAL(sal_Int32(2542), l2->getSize().Height);
CPPUNIT_ASSERT_EQUAL(sal_Int32(2), l2->getSize().Width);
CPPUNIT_ASSERT_EQUAL(sal_Int32(7916), l2->getPosition().X);
CPPUNIT_ASSERT_EQUAL(sal_Int32(289), l2->getPosition().Y);
// third line (largest) // Fails without the fix: Expected: 7027, Actual: 2
CPPUNIT_ASSERT_EQUAL(sal_Int32(7027), l3->getSize().Height); // Fails without the fix: Expected: 0, Actual: 2
CPPUNIT_ASSERT_EQUAL(sal_Int32(0), l3->getSize().Width);
CPPUNIT_ASSERT_EQUAL(sal_Int32(7911), l3->getPosition().X);
CPPUNIT_ASSERT_EQUAL(sal_Int32(231), l3->getPosition().Y);
}
CPPUNIT_ASSERT_MESSAGE("Smiley faces are round", aGroupShape.GetHeight() > aGroupShape.GetWidth());
CPPUNIT_ASSERT_MESSAGE("Line is taller, not wider", aLine.GetHeight() > aLine.GetWidth());
}
CPPUNIT_TEST_FIXTURE(Test, testTdf129247)
{
loadAndReload("tdf129247.docx");
CPPUNIT_ASSERT_EQUAL(1, getPages()); // Without the fix in place, the checkbox wouldn't be exported
CPPUNIT_ASSERT_EQUAL(1, getShapes());
}
CPPUNIT_TEST_FIXTURE(Test, testActiveXCheckbox)
{
loadAndReload("checkbox_control.odt");
CPPUNIT_ASSERT_EQUAL(2, getShapes());
CPPUNIT_ASSERT_EQUAL(1, getPages()); // First check box anchored as a floating object
uno::Reference<drawing::XControlShape> xControlShape;
xControlShape.set(getShape(2), uno::UNO_QUERY);
CPPUNIT_ASSERT(xControlShape.is());
// Check whether we have the right control
uno::Reference<beans::XPropertySet> xPropertySet(xControlShape->getControl(), uno::UNO_QUERY);
uno::Reference<lang::XServiceInfo> xServiceInfo(xPropertySet, uno::UNO_QUERY);
CPPUNIT_ASSERT_EQUAL(true, bool(xServiceInfo->supportsService( u"com.sun.star.form.component.CheckBox"_ustr)));
CPPUNIT_ASSERT_EQUAL(u"Floating Checkbox"_ustr, getProperty<OUString>(xPropertySet, u"Label"_ustr));
// Check anchor type
uno::Reference<beans::XPropertySet> xPropertySet2(xControlShape, uno::UNO_QUERY);
CPPUNIT_ASSERT_EQUAL(text::TextContentAnchorType_AT_CHARACTER,getProperty<text::TextContentAnchorType>(xPropertySet2,u"AnchorType"_ustr));
// Second check box anchored inline / as character
xControlShape.set(getShape(1), uno::UNO_QUERY);
// Check whether we have the right control
xPropertySet.set(xControlShape->getControl(), uno::UNO_QUERY);
xServiceInfo.set(xPropertySet, uno::UNO_QUERY);
CPPUNIT_ASSERT_EQUAL(true, bool(xServiceInfo->supportsService(u"com.sun.star.form.component.CheckBox"_ustr)));
CPPUNIT_ASSERT_EQUAL(u"Inline Checkbox"_ustr, getProperty<OUString>(xPropertySet, u"Label"_ustr));
// Check anchor type
xPropertySet2.set(xControlShape, uno::UNO_QUERY);
CPPUNIT_ASSERT_EQUAL(text::TextContentAnchorType_AS_CHARACTER,getProperty<text::TextContentAnchorType>(xPropertySet2,u"AnchorType"_ustr));
}
DECLARE_WW8EXPORT_TEST( testTdf115896_layoutInCell, "tdf115896_layoutInCell.doc" )
{ // Check anchor type - was anchored to page because of unknown version of Word
uno::Reference<beans::XPropertySet> xPropertySet(getShape(1), uno::UNO_QUERY_THROW);
CPPUNIT_ASSERT_EQUAL(text::TextContentAnchorType_AT_CHARACTER,getProperty<text::TextContentAnchorType>(xPropertySet,u"AnchorType"_ustr));
}
CPPUNIT_TEST_FIXTURE(Test, testTableCrossReference)
{
loadAndReload("table_cross_reference.odt");
CPPUNIT_ASSERT_EQUAL(1, getPages()); // tdf#42346: Cross references to tables were not saved // MSO uses simple bookmarks for referencing table caption, so we do the same by export
// Check whether we have all the necessary bookmarks exported and imported back
uno::Reference<text::XBookmarksSupplier> xBookmarksSupplier(mxComponent, uno::UNO_QUERY);
uno::Reference<container::XIndexAccess> xBookmarksByIdx(xBookmarksSupplier->getBookmarks(), uno::UNO_QUERY);
CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(4), xBookmarksByIdx->getCount());
uno::Reference<container::XNameAccess> xBookmarksByName = xBookmarksSupplier->getBookmarks();
CPPUNIT_ASSERT(xBookmarksByName->hasByName(u"Ref_Table0_full"_ustr));
CPPUNIT_ASSERT(xBookmarksByName->hasByName(u"Ref_Table0_label_and_number"_ustr));
CPPUNIT_ASSERT(xBookmarksByName->hasByName(u"Ref_Table0_caption_only"_ustr));
CPPUNIT_ASSERT(xBookmarksByName->hasByName(u"Ref_Table0_number_only"_ustr));
CPPUNIT_TEST_FIXTURE(Test, testTableCrossReferenceCustomFormat)
{
loadAndReload("table_cross_reference_custom_format.odt");
CPPUNIT_ASSERT_EQUAL(1, getPages()); // tdf#42346: Cross references to tables were not saved // Check also captions with custom formatting
// Check whether we have all the necessary bookmarks exported and imported back
uno::Reference<text::XBookmarksSupplier> xBookmarksSupplier(mxComponent, uno::UNO_QUERY);
uno::Reference<container::XIndexAccess> xBookmarksByIdx(xBookmarksSupplier->getBookmarks(), uno::UNO_QUERY);
CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(16), xBookmarksByIdx->getCount());
uno::Reference<container::XNameAccess> xBookmarksByName = xBookmarksSupplier->getBookmarks();
CPPUNIT_ASSERT(xBookmarksByName->hasByName(u"Ref_Table0_full"_ustr));
CPPUNIT_ASSERT(xBookmarksByName->hasByName(u"Ref_Table0_label_and_number"_ustr));
CPPUNIT_ASSERT(xBookmarksByName->hasByName(u"Ref_Table0_caption_only"_ustr));
CPPUNIT_ASSERT(xBookmarksByName->hasByName(u"Ref_Table0_number_only"_ustr));
CPPUNIT_ASSERT(xBookmarksByName->hasByName(u"Ref_Table1_full"_ustr));
CPPUNIT_ASSERT(xBookmarksByName->hasByName(u"Ref_Table1_label_and_number"_ustr));
CPPUNIT_ASSERT(xBookmarksByName->hasByName(u"Ref_Table1_caption_only"_ustr));
CPPUNIT_ASSERT(xBookmarksByName->hasByName(u"Ref_Table1_number_only"_ustr));
CPPUNIT_ASSERT(xBookmarksByName->hasByName(u"Ref_Table2_full"_ustr));
CPPUNIT_ASSERT(xBookmarksByName->hasByName(u"Ref_Table2_label_and_number"_ustr));
CPPUNIT_ASSERT(xBookmarksByName->hasByName(u"Ref_Table2_caption_only"_ustr));
CPPUNIT_ASSERT(xBookmarksByName->hasByName(u"Ref_Table2_number_only"_ustr));
CPPUNIT_ASSERT(xBookmarksByName->hasByName(u"Ref_Table3_full"_ustr));
CPPUNIT_ASSERT(xBookmarksByName->hasByName(u"Ref_Table3_label_and_number"_ustr));
CPPUNIT_ASSERT(xBookmarksByName->hasByName(u"Ref_Table3_caption_only"_ustr));
CPPUNIT_ASSERT(xBookmarksByName->hasByName(u"Ref_Table3_number_only"_ustr));
CPPUNIT_TEST_FIXTURE(Test, testObjectCrossReference)
{
loadAndReload("object_cross_reference.odt");
CPPUNIT_ASSERT_EQUAL(2, getPages()); // tdf#42346: Cross references to objects were not saved // MSO uses simple bookmarks for referencing table caption, so we do the same by export
// Check whether we have all the necessary bookmarks exported and imported back
uno::Reference<text::XBookmarksSupplier> xBookmarksSupplier(mxComponent, uno::UNO_QUERY);
uno::Reference<container::XIndexAccess> xBookmarksByIdx(xBookmarksSupplier->getBookmarks(), uno::UNO_QUERY);
CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(15), xBookmarksByIdx->getCount());
uno::Reference<container::XNameAccess> xBookmarksByName = xBookmarksSupplier->getBookmarks();
CPPUNIT_ASSERT(xBookmarksByName->hasByName(u"Ref_Drawing0_full"_ustr));
CPPUNIT_ASSERT(xBookmarksByName->hasByName(u"Ref_Drawing0_label_and_number"_ustr));
CPPUNIT_ASSERT(xBookmarksByName->hasByName(u"Ref_Drawing0_caption_only"_ustr));
CPPUNIT_ASSERT(xBookmarksByName->hasByName(u"Ref_Drawing0_number_only"_ustr));
CPPUNIT_ASSERT(xBookmarksByName->hasByName(u"Ref_Drawing1_full"_ustr));
// Check that AUTO border color is imported as black
CPPUNIT_ASSERT_EQUAL_MESSAGE(OString(sStage + " border color").getStr(),
sal_Int32(COL_BLACK), aBorder.Color);
}
}
}
CPPUNIT_TEST_FIXTURE(Test, testTdf117503)
{
loadAndReload("tdf117503.docx"); // This was 3, first page + standard page styles were not merged together // on export.
CPPUNIT_ASSERT_EQUAL(2, getPages());
}
/* Get the vertical position of the paragraph containing the text "Start" */
sal_Int32 nParaA_Top = getXPath(pXmlDoc, "/root/page/body/column[1]/body/txt[text()='Start']/infos/bounds", "top"
).toInt32();
/* Get the vertical position of the paragraph containing the text "Top B" */
sal_Int32 nParaB_Top = getXPath(pXmlDoc, "/root/page/body/column[2]/body/txt[text()='Top B']/infos/bounds", "top"
).toInt32();
/* These two paragraphs are supposed to be at the top of the left
* and right columns respectively. Check that they actually line up: */
CPPUNIT_ASSERT_EQUAL(nParaA_Top, nParaB_Top);
}
CPPUNIT_TEST_FIXTURE(Test, testTdf118133)
{
loadAndReload("tdf118133.docx"); // This was 0, doc import + doc export resulted in lost image due to broken // lazy-loading of tiff images.
CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(15240), getShape(1)->getSize().Width);
}
DECLARE_WW8EXPORT_TEST(testTdf118412, "tdf118412.doc")
{ /* Check that the first page's bottom margin is 1.251cm (not 2.540cm) */
OUString sPageStyleName = getProperty<OUString>(getParagraph(1), u"PageStyleName"_ustr);
uno::Reference<style::XStyle> xPageStyle(
getStyles(u"PageStyles"_ustr)->getByName(sPageStyleName), uno::UNO_QUERY);
sal_Int32 nBottomMargin = getProperty<sal_Int32>(xPageStyle, u"BottomMargin"_ustr);
CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(1251), nBottomMargin);
}
CPPUNIT_TEST_FIXTURE(Test, testContentControlExport)
{ // Given a document with a (rich text) content control:
createSwDoc();
uno::Reference<lang::XMultiServiceFactory> xMSF(mxComponent, uno::UNO_QUERY);
uno::Reference<text::XTextDocument> xTextDocument(mxComponent, uno::UNO_QUERY);
uno::Reference<text::XText> xText = xTextDocument->getText();
uno::Reference<text::XTextCursor> xCursor = xText->createTextCursor();
xText->insertString(xCursor, u"test"_ustr, /*bAbsorb=*/false);
xCursor->gotoStart(/*bExpand=*/false);
xCursor->gotoEnd(/*bExpand=*/true);
uno::Reference<text::XTextContent> xContentControl(
xMSF->createInstance(u"com.sun.star.text.ContentControl"_ustr), uno::UNO_QUERY);
xText->insertTextContent(xCursor, xContentControl, /*bAbsorb=*/true);
// When saving that document to DOC and loading it back:
saveAndReload(u"MS Word 97"_ustr);
// Then make sure the dummy character at the end is filtered out:
OUString aBodyText = getBodyText(); // Without the accompanying fix in place, this test would have failed: // - Expected: test // - Actual : test<space> // i.e. the CH_TXTATR_BREAKWORD at the end was written, then the import replaced that with a // space.
CPPUNIT_ASSERT_EQUAL(u"test"_ustr, aBodyText);
}
¤ Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.0.13Bemerkung:
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.