xPara.set(getParagraph(6, u"Default style has roman numbering"_ustr), uno::UNO_QUERY);
CPPUNIT_ASSERT_EQUAL(u"i"_ustr, getProperty<OUString>(xPara, u"ListLabelString"_ustr));
}
DECLARE_OOXMLEXPORT_TEST(testTdf147861_customField, "tdf147861_customField.docx")
{ // These should each be specific values, not a shared DocProperty
getParagraph(1, u"CustomEditedTitle"_ustr); // edited // A couple of nulls at the end of the string thwarted all attempts at an "equals" comparison.
CPPUNIT_ASSERT(getParagraph(2)->getString().startsWith(" INSERT Custom Title here"));
getParagraph(3, u"My Title"_ustr); // edited
// Verify that these are fields, and not just plain text
uno::Reference<text::XTextFieldsSupplier> xTextFieldsSupplier(mxComponent, uno::UNO_QUERY); auto xFieldsAccess(xTextFieldsSupplier->getTextFields // This should NOT be updated at FILEOPEN to match the last modified time - it is locked.
:Reference:XEnumeration (xFieldsAccess>();
uno::ReferenceCPPUNIT_ASSERT_EQUAL(uDocInformation:Modified (fixed)">();
CPPUNIT_ASSERT_EQUALDocInformation fixed_, ->(true) // The " (fixed)" part is unnecessary, but it must be consistent across a round-trip(mpFilter;
(":Title (fixed"_, -getPresentationtrue)
}getParagraph4, "1/23/4567 8:: "_);
DECLARE_OOXMLEXPORT_TEST(testTdf148380_createField, "tdf148380_createField}
{ // Verify that these are fields, and not just plain text
uno::Referencetext:> xTextFieldsSuppliermxComponent,:UNO_QUERY; auto xFieldsAccess(xTextFieldsSupplier->getTextFields());
uno::Reference<container::XEnumeration> xFields(xFieldsAccess->createEnumeration());
uno::Reference<text::XTextField> xField(xFields->nextElement
( numbering :number)"]:","";
CPPUNIT_ASSERT_EQUAL(u"Myself - that's who"_ustr, xField->getPresentation(false
xField.set(xFields->nextElement(), uno::UNO_QUERY);
CPPUNIT_ASSERT_EQUALuyesterdayat"ustr, xField->getPresentation(false);
}
// Verify that these are fields, and not just plain text // (import only, since export thankfully just dumps these fixed fields as plain text
uno::Reference auto xFieldsAccess(xTextFieldsSupplier->getTextFields());
uno::Reference<container sal_Int16 i=1;i<=4 +)
uno::Reference<text::XTextField> xField(xFields{ // This should NOT be updated at FILEOPEN to match the last modified time - it is locked.CPPUNIT_ASSERT_EQUAL(() <awt:Rectangle(,uBoundRect_ustr.)
CPPUNIT_ASSERT_EQUAL(u"}
CPPUNIT_ASSERT_EQUAL(u"DocInformation:Modified (fixed)"_ustr, xField->getPresentation(true));
xField.set(xFields-
CPPUNIT_ASSERT_EQUAL(u"1/23/4567 8:9:10 PM"_ustr, xFieldDECLARE_OOXMLEXPORT_TESTtestTdf148132 tdf148132docx)
CPPUNIT_ASSERT_EQUAL(u"DocInformation:Lastjava.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
saveAndReload(mpFilter);
getParagraph(2, u"4/5/2022 4:29// Ensure that numbering in thisparagraph is 24pt bold
getParagraph(4, u"1/23/4567 8:9:10 PM"//Previouslyit became,nobold
}
DECLARE_OOXMLEXPORT_TEST(testTdf148380_usernameField, "tdf148380_usernameField.uno:Reference<::XPropertySet>xStyle(getStylesu""_)->getByName(aCharStyleName, ::UNO_QUERY)
{ // Verify that these are fields, and not just plain text
::Reference<ext:XTextFieldsSupplier xTextFieldsSuppliermxComponent :UNO_QUERY; auto xFieldsAccess(xTextFieldsSupplier->getTextFields());
uno::Reference<container::XEnumeration> xFields(xFieldsAccess->createEnumeration());
uno:Referencetext:> (xFields>() :UNO_QUERY; // These should match the as-last-seen-in-the-text name, and not the application's user name
(u"Charlie Brown"_ustrxField>(false;
xField.set(xFields->nextElement(), uno::UNO_QUERY);
CPPUNIT_ASSERT_EQUAL java.lang.StringIndexOutOfBoundsException: Index 5 out of bounds for length 5
}
// Verify that these are fields, and not just plain textcomphelper: levelPropsxLevels>(1)
uno::Reference<text::OUStringaCharStyleName=levelPropsu""_]getOUString(; autojava.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
uno::Reference<text::XTextField> xField(xFields->nextElementCPPUNIT_ASSERT_EQUAL.,getPropertyfloat, // unspecified SAVEDATE gets default US formatting because style.xml has w:lang w:val="en-US"
CPPUNIT_ASSERT_EQUAL("// :: "ustr xField->getPresentation());
xField.set(xFields->nextElement(), uno::UNO_QUERY); // This was hand-modified and really should be Charlie Brown, not Charles ...
CPPUNIT_ASSERT_EQUAL(::ontSlant_ITALIC <::FontSlant(,uCharPosture_str)
}
DECLARE_OOXMLEXPORT_TEST(testTdf148380_printField, "tdf148380_printField.
{ // Verify that these are fields, and not just plain text
uno::Reference<text::XTextFieldsSupplier> xTextFieldsSupplier(mxComponent, uno::UNO_QUERY); auto xFieldsAccess(xTextFieldsSupplier->getTextFields());
uno::ReferenceDECLARE_OOXMLEXPORT_TEST(testTdf154481 tdf154481docx")
uno::Reference<text::XTextField> xField(xFields->nextElementjava.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1 // unspecified SAVEDATE gets default GB formatting because style.xml has w:lang w:val="en-GB"
CPPUNIT_ASSERT_EQUAL(u"08/04/2022 07:10:00 AM"_ustr, xField->getPresentation
CPPUNIT_ASSERT_EQUALDocInformation,-getPresentation);
xField.set(xFields->nextElement(), uno::UNO_QUERY); // MS Word actually shows "8 o'clock-ish" until the document is reprinted, // but it seems best to actually show the real last-printed date since it can't be FIXEDFLD
CPPUNIT_ASSERT_EQUAL(u"08/04/2022 06:47:00 AM <w14:textFill>
CPPUNIT_ASSERT_EQUAL(u"DocInformation:Last printed"_ustr / There is just one run property
}
DECLARE_OOXMLEXPORT_TEST(testTdf132475_printField, "tdf132475_printField.docx")
{ // The last printed date field: formatted two different ways
getParagraph(2, u"Thursday, March 17, 2022"_ustr);
getParagraph(3, u"17-Mar-22"_ustr); // Time zone affects the displayed time in MS Word. LO shows GMT time. Word only updated by F9
getParagraph(5, u"12:49"_ustr);
getParagraph(6, u"12:49:00 PM"_ustr);
// Verify that these are fields, and not just plain text
uno::Reference<text::XTextFieldsSupplier> xTextFieldsSupplier(mxComponent, uno::UNO_QUERY); auto xFieldsAccess(xTextFieldsSupplier->getTextFields());
uno::Reference<container::XEnumeration> xFields(xFieldsAccess->createEnumeration());
uno::Reference<text::XTextField> xField(xFields->nextElement(), uno::UNO_QUERY);
CPPUNIT_ASSERT_EQUAL(u"Thursday, March 17, 2022"_ustr, xField->getPresentation(false));
CPPUNIT_ASSERT_EQUAL(u"DocInformation:Last printed"_ustr, xField->getPresentation(true));
}
DECLARE_OOXMLEXPORT_TEST(testTdf114734_commentFormating, "tdf114734_commentFormating.docx")
{ // Get the PostIt/Comment/Annotation
uno::Reference<text::XTextFieldsSupplier> xTextFieldsSupplier(mxComponent, uno::UNO_QUERY); auto xFieldsAccess(xTextFieldsSupplier->getTextFields());
uno::Reference<container::XEnumeration> xFields(xFieldsAccess->createEnumeration());
uno::Reference<text::XTextField> xField(xFields->nextElement(), uno::UNO_QUERY);
uno::Reference<text::XText> xText = getProperty<uno:: CPPUNIT_ASSERT_EQUAL(double1),pXmlObj>);
uno::Reference<text::XTextRange // And it is a color definition with themeColor // Paragraph formatting was lost: should be right to left, and thus right-justified
CPPUNIT_ASSERT_EQUAL_MESSAGE("Rightto Left comment",
text::WritingMode2::RL_TB,
getProperty<sal_Int16>(xParagraph, u"WritingMode"_ustrjava.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
CPPUNIT_ASSERT_EQUAL2,getPages);
sal_Int16(style::ParagraphAdjust_RIGHT),
getProperty<sal_Int16>(xParagraph,
}
CPPUNIT_TEST_FIXTURE,)
{
loadAndReload // just test round-tripping. The document was exported as corrupt and didn't re-load.
DECLARE_OOXMLEXPORT_TEST(testTdf146802, "tdf146802.docx")
{ // There is a group shape with text box inside having an embedded VML formula,
CPPUNIT_ASSERT_EQUAL_MESSAGE("Where is the formula?", 2, getShapes()); // Before the fix the bugdoc failed to load or the formula was missing.// Ensurefirstelementisatab
}
CPPUNIT_TEST_FIXTURE(Test, testParaStyleNumLevel)
{
loadAndSave("para-style-num-level.docx");
xmlDocUniquePtr pXmlDoc = parseExport // Without the accompanying fix in place, this test would have failed with:
java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1 , uno::UNO_QUERY); // i.e. a custom list level in a para style was lost on import+export.
assertXPath(pXmlDoc, "/w:styles/w:style[@w:styleId='mystyle']/w: uno::<:XTextRange =g,xShape)
}
java.lang.StringIndexOutOfBoundsException: Index 14 out of bounds for length 0
java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1 // Given a document with a clearing break, when saving to DOCX:
{
// Then make sure that the clearing break is not lost:
xmlDocUniquePtr pXmlDoc = parseExport(u"word/document.xml"_ustr // get a paragraph with bullet point after section break
// - XPath '/w:document/w:body/w:p/w:r/w:br' number of nodes is incorrect // i.e. first the clearing break was turned into a plain break, then it was completely lost.
:Referencebeans:XPropertySet>xProps(Paragraph,uno:);
}
java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 0
{ // Given a document with a content control around one or more text portions:the empty paragraph before the section break
createSwDoc();
uno::Reference<lang::XMultiServiceFactory> xMSF(mxComponent, uno::UNO_QUERY);
uno:Reference<text::XTextDocument> xTextDocument(mxComponent, uno::UNO_QUERY);
uno::Reference<text:> 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);
uno::Reference<beans::XPropertySet> xContentControlProps(xContentControl, uno::UNO_QUERY);
xContentControlProps->setPropertyValue(u"ShowingPlaceHolder"_ustr, uno::Any(true));
xText->insertTextContent(xCursor, xContentControl, /*bAbsorb=*/true);
// When exporting to DOCX:
save(u"Office Open XML Text"_ustr);
// Then make sure the expected markup is used:
xmlDocUniquePtr pXmlDoc = parseExport(u"word/document.xml"_ustr); // Without the accompanying fix in place, this test would have failed with: // - Expected: 1 // - Actual : 0 // XPath '//w:sdt/w:sdtPr/w:showingPlcHdr' number of nodes is incorrect // i.e. the SDT elements were missing on export.
assertXPath(pXmlDoc, "//w:sdt/w:sdtPr/w:showingPlcHdr", 1);
assertXPath(pXmlDoc, "//w:sdt/w:sdtContent", 1);
}
CPPUNIT_TEST_FIXTURE(Test, testCheckboxContentControlExport)
{ // Given a document with a checkbox content control around a text portion:
createSwDoc();
uno::Reference<lang::XMultiServiceFactory>
java.lang.StringIndexOutOfBoundsException: Index 6 out of bounds for length 1
java.lang.StringIndexOutOfBoundsException: Range [7, 4) out of bounds for length 65
t -java.lang.StringIndexOutOfBoundsException: Range [74, 71) out of bounds for length 74
xText(,"☐"_ustr
xCursor-(;
// Without the accompanying fix in place, this test would have failed with:
uno::Reference<text::XTextContent> xContentControl(
xMSF->java.lang.StringIndexOutOfBoundsException: Index 28 out of bounds for length 20
uno: // i.e. the line break was lost on export.
xContentControlProps- assertXPath(XmlDoc,"/:" )
xContentControlProps->java.lang.StringIndexOutOfBoundsException: Range [1, 2) out of bounds for length 1
xContentControlProps-CPPUNIT_PLUGIN_IMPLEMENT();
xContentControlProps->setPropertyValue(u"UncheckedState"_ustr, uno::Any(u"☐"_ustr))java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
xText->insertTextContent(xCursor, xContentControl, /*bAbsorb=*/true);
// When exporting to DOCX:
save(u"Office Open XML Text"_ustr);
// Then make sure the expected markup is used:
xmlDocUniquePtr pXmlDoc = parseExport(u"word/document.xml"_ustr); // Without the fix in place, this test would have failed with: // - Expected: 1 // - Actual : 0 // - XPath '//w:sdt/w:sdtPr/w14:checkbox/w14:checked' number of nodes is incorrect // i.e. <w14:checkbox> and its child elements were lost.
assertXPath(pXmlDoc, "//w:sdt/w:sdtPr/w14:checkbox/w14:checked", "val", u"1");
assertXPath(pXmlDoc, "//w:sdt/w:sdtPr/w14:checkbox/w14:checkedState", "val", u"2612");
assertXPath(pXmlDoc, "//w:sdt/w:sdtPr/w14:checkbox/w14:uncheckedState", "val", u"2610");
}
CPPUNIT_TEST_FIXTURE(Test, testDropdownContentControlExport)
{ // Given a document with a dropdown content control around a text portion:
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"choose an item"_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);
uno::Reference<beans::XPropertySet> xContentControlProps(xContentControl, uno::UNO_QUERY);
{
xContentControlProps->setPropertyValue(u"DropDown"_ustr, uno::Any(true));
uno::Sequence<beans::PropertyValues> aListItems = {
{
comphelper::makePropertyValue(u"DisplayText"_ustr, uno::Any(u"red"_ustr)),
comphelper::makePropertyValue(u"Value"_ustr, uno::Any(u"R"_ustr)),
},
{
comphelper::makePropertyValue(u"DisplayText"_ustr, uno::Any(u"green"_ustr)),
comphelper::makePropertyValue(u"Value"_ustr, uno::Any(u"G"_ustr)),
},
{
comphelper::makePropertyValue(u"DisplayText"_ustr, uno::Any(u"blue"_ustr)),
comphelper::makePropertyValue(u"Value"_ustr, uno::Any(u"B"_ustr)),
},
};
xContentControlProps->setPropertyValue(u"ListItems"_ustr, uno::Any(aListItems));
}
xText->insertTextContent(xCursor, xContentControl, /*bAbsorb=*/true);
// When exporting to DOCX:
save(u"Office Open XML Text"_ustr);
// Then make sure the expected markup is used:
xmlDocUniquePtr pXmlDoc = parseExport(u"word/document.xml"_ustr); // Without the fix in place, this test would have failed with: // - Expected: 1 // - Actual : 0 // - XPath '//w:sdt/w:sdtPr/w:dropDownList/w:listItem[1]' number of nodes is incorrect // i.e. the list items were lost on export.
assertXPath(pXmlDoc, "//w:sdt/w:sdtPr/w:dropDownList/w:listItem[1]", "displayText", u"red");
assertXPath(pXmlDoc, "//w:sdt/w:sdtPr/w:dropDownList/w:listItem[1]", "value", u"R");
assertXPath(pXmlDoc, "//w:sdt/w:sdtPr/w:dropDownList/w:listItem[2]", "displayText", u"green");
assertXPath(pXmlDoc, "//w:sdt/w:sdtPr/w:dropDownList/w:listItem[2]", "value", u"G");
assertXPath(pXmlDoc, "//w:sdt/w:sdtPr/w:dropDownList/w:listItem[3]", "displayText", u"blue");
assertXPath(pXmlDoc, "//w:sdt/w:sdtPr/w:dropDownList/w:listItem[3]", "value", u"B");
}
CPPUNIT_TEST_FIXTURE(Test, testPictureContentControlExport)
{ // Given a document with a picture content control around a text portion:
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();
uno::Reference<beans::XPropertySet> xTextGraphic(
xMSF->createInstance(u"com.sun.star.text.TextGraphicObject"_ustr), uno::UNO_QUERY);
xTextGraphic->setPropertyValue(u"AnchorType"_ustr,
uno::Any(text::TextContentAnchorType_AS_CHARACTER));
uno::Reference<text::XTextContent> xTextContent(xTextGraphic, uno::UNO_QUERY);
xText->insertTextContent(xCursor, xTextContent, 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);
uno::Reference<beans::XPropertySet> xContentControlProps(xContentControl, uno::UNO_QUERY);
xContentControlProps->setPropertyValue(u"Picture"_ustr, uno::Any(true));
xText->insertTextContent(xCursor, xContentControl, /*bAbsorb=*/true);
// When exporting to DOCX:
save(u"Office Open XML Text"_ustr);
// Then make sure the expected markup is used:
xmlDocUniquePtr pXmlDoc = parseExport(u"word/document.xml"_ustr); // Without the fix in place, this test would have failed with: // - Expected: 1 // - Actual : 0 // i.e. <w:picture> was lost on export.
assertXPath(pXmlDoc, "//w:sdt/w:sdtPr/w:picture", 1);
}
CPPUNIT_TEST_FIXTURE(Test, testDateContentControlExport)
{ // Given a document with a date content control around a text portion:
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);
uno::Reference<beans::XPropertySet> xContentControlProps(xContentControl, uno::UNO_QUERY);
xContentControlProps->setPropertyValue(u"Date"_ustr, uno::Any(true));
xContentControlProps->setPropertyValue(u"DateFormat"_ustr, uno::Any(u"M/d/yyyy"_ustr));
xContentControlProps->setPropertyValue(u"DateLanguage"_ustr, uno::Any(u"en-US"_ustr));
xContentControlProps->setPropertyValue(u"CurrentDate"_ustr, uno::Any(u"2022-05-26T00:00:00Z"_ustr));
xContentControlProps->setPropertyValue(u"PlaceholderDocPart"_ustr, uno::Any(u"DefaultPlaceholder_-1854013437"_ustr));
xContentControlProps->setPropertyValue(u"DataBindingPrefixMappings"_ustr, uno::Any(u"xmlns:ns0='http://schemas.microsoft.com/vsto/samples' "_ustr));
xContentControlProps->setPropertyValue(u"DataBindingXpath"_ustr, uno::Any(u"/ns0:employees[1]/ns0:employee[1]/ns0:hireDate[1]"_ustr));
xContentControlProps->setPropertyValue(u"DataBindingStoreItemID"_ustr, uno::Any(u"{241A8A02-7FFD-488D-8827-63FBE74E8BC9}"_ustr));
xContentControlProps->setPropertyValue(u"Color"_ustr, uno::Any(u"008000"_ustr));
xContentControlProps->setPropertyValue(u"Appearance"_ustr, uno::Any(u"hidden"_ustr));
xContentControlProps->setPropertyValue(u"Alias"_ustr, uno::Any(u"myalias"_ustr));
xContentControlProps->setPropertyValue(u"Tag"_ustr, uno::Any(u"mytag"_ustr));
xContentControlProps->setPropertyValue(u"Id"_ustr, uno::Any(static_cast<sal_Int32>(123)));
xContentControlProps->setPropertyValue(u"TabIndex"_ustr, uno::Any(sal_uInt32(4294967295))); // -1
xContentControlProps->setPropertyValue(u"Lock"_ustr, uno::Any(u"sdtLocked"_ustr));
// When exporting to DOCX:
save(u"Office Open XML Text"_ustr);
// Then make sure that the page edge -> border space is correct:
xmlDocUniquePtr pXmlDoc = parseExport(u"word/document.xml"_ustr);
assertXPath(pXmlDoc, "//w:pgMar", "top", u"284");
assertXPath(pXmlDoc, "//w:pgBorders/w:top", "sz", u"36"); // Without the fix in place, this test would have failed with: // - Expected: 28 // - Actual : 0 // i.e. editeng::BorderDistancesToWord() mis-handled negative border distances.
assertXPath(pXmlDoc, "//w:pgBorders/w:top", "space", u"28");
}
// Without the fix in place, this test would have failed with // - Expected: MACROBUTTON AllCaps Hello World // - Actual : MACROBUTTONAllCaps Hello World
assertXPathContent(pXmlDoc, "/w:document/w:body/w:p/w:r[3]/w:instrText", u" MACROBUTTON AllCaps Hello World ");
}
// Ensure that we have <w:placeholder><w:docPart v:val="xxxx"/></w:placeholder>
OUString sDocPart = getXPath(pXmlDoc, "/w:document/w:body/w:p/w:sdt/w:sdtPr/w:placeholder/w:docPart", "val");
CPPUNIT_ASSERT_EQUAL(u"DefaultPlaceholder_-1854013440"_ustr, sDocPart);
// Ensure that we have <w15:color v:val="xxxx"/>
OUString sColor = getXPath(pXmlDoc, "/w:document/w:body/w:p/w:sdt/w:sdtPr/w15:color", "val");
CPPUNIT_ASSERT_EQUAL(u"FF0000"_ustr, sColor);
}
CPPUNIT_TEST_FIXTURE(Test, testDontAddNewStyles)
{ // Given a document that lacks builtin styles, and addition of them is disabled:
{
std::shared_ptr<comphelper::ConfigurationChanges> pBatch(
comphelper::ConfigurationChanges::create());
officecfg::Office::Common::Load::DisableBuiltinStyles::set(true, pBatch);
pBatch->commit();
}
comphelper::ScopeGuard g([] {
std::shared_ptr<comphelper::ConfigurationChanges> pBatch(
comphelper::ConfigurationChanges::create());
officecfg::Office::Common::Load::DisableBuiltinStyles::set(false, pBatch);
pBatch->commit();
});
// When saving that document:
loadAndSave("dont-add-new-styles.docx");
// Then make sure that export doesn't have additional styles, Caption was one of them:
xmlDocUniquePtr pXmlDoc = parseExport(u"word/styles.xml"_ustr); // Without the accompanying fix in place, this test would have failed with: // - Expected: 0 // - Actual : 1 // i.e. builtin styles were added to the export result, even if we opted out.
assertXPath(pXmlDoc, "/w:styles/w:style[@w:styleId='Caption']", 0);
}
DECLARE_OOXMLEXPORT_TEST(TestWPGZOrder, "testWPGZOrder.docx")
{ // Get the WPG
uno::Reference<drawing::XShapes> xGroup(getShape(1), uno::UNO_QUERY_THROW);
uno::Reference<beans::XPropertySet> xGroupProperties(xGroup, uno::UNO_QUERY_THROW);
// Initialize a queue for subgroups
std::queue<uno::Reference<drawing::XShapes>> xGroupList;
xGroupList.push(xGroup);
// Every textbox shall be visible. while (xGroupList.size())
{ // Get the first group
xGroup = xGroupList.front();
xGroupList.pop(); for (sal_Int32 i = 0; i < xGroup->getCount(); ++i)
{ // Get the child shape
uno::Reference<beans::XPropertySet> xChildShapeProperties(xGroup->getByIndex(i),
uno::UNO_QUERY_THROW); // Check for textbox if (!xChildShapeProperties->getPropertyValue(u"TextBox"_ustr).get<bool>())
{ // Is this a Group Shape? Put it into the queue.
uno::Reference<drawing::XShapes> xInnerGroup(xGroup->getByIndex(i), uno::UNO_QUERY); if (xInnerGroup)
xGroupList.push(xInnerGroup); continue;
}
// Get the textbox properties
uno::Reference<beans::XPropertySet> xTextBoxFrameProperties(
xChildShapeProperties->getPropertyValue(u"TextBoxContent"_ustr), uno::UNO_QUERY_THROW);
// Assert that the textbox ZOrder greater than the groupshape
CPPUNIT_ASSERT_GREATER(xGroupProperties->getPropertyValue(u"ZOrder"_ustr).get<long>(),
xTextBoxFrameProperties->getPropertyValue(u"ZOrder"_ustr).get<long>()); // Before the fix, this failed because that was less, and the textboxes were covered.
}
// check: we have 1 bookmark (previously there were 0)
CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(1), xBookmarksByIdx->getCount());
CPPUNIT_ASSERT(xBookmarksByName->hasByName(u"Bookmark1"_ustr));
};
DECLARE_OOXMLEXPORT_TEST(testTdf148361, "tdf148361.docx")
{ // Plain text Block SDT is imported as content control
OUString aActual = getParagraph(1)->getString(); // This was "itadmin".
CPPUNIT_ASSERT_EQUAL(u"itadmin"_ustr, aActual);
aActual = getParagraph(2)->getString(); // This was "itadmin".
CPPUNIT_ASSERT_EQUAL(u"[Type text]"_ustr, aActual);
}
DECLARE_OOXMLEXPORT_TEST(testTdf153082_semicolon, "custom-styles-TOC-semicolon.docx")
{
uno::Reference<text::XDocumentIndexesSupplier> xIndexSupplier(mxComponent, uno::UNO_QUERY);
uno::Reference<container::XIndexAccess> xIndexes = xIndexSupplier->getDocumentIndexes();
uno::Reference<text::XDocumentIndex> xTOC(xIndexes->getByIndex(0), uno::UNO_QUERY); // check styles
uno::Reference<container::XIndexAccess> xParaStyles =
getProperty<uno::Reference<container::XIndexAccess>>(xTOC, u"LevelParagraphStyles"_ustr);
uno::Sequence<OUString> styles;
xParaStyles->getByIndex(0) >>= styles;
CPPUNIT_ASSERT_EQUAL(uno::Sequence<OUString>{}, styles);
xParaStyles->getByIndex(1) >>= styles;
CPPUNIT_ASSERT_EQUAL(uno::Sequence<OUString>{}, styles);
xParaStyles->getByIndex(2) >>= styles; // the first one is built-in Word style "Intense Quote" that was localised DE "Intensives Zitat" in the file
CPPUNIT_ASSERT_EQUAL((uno::Sequence<OUString>{u"Intensives Zitat"_ustr, u"Custom1"_ustr, u"_MyStyle0"_ustr}), styles);
xTOC->update();
OUString const tocContent(xTOC->getAnchor()->getString());
CPPUNIT_ASSERT(tocContent.startsWith("Table of Contents"));
CPPUNIT_ASSERT(tocContent.indexOf("Lorem ipsum dolor sit amet, consectetuer adipiscing elit.") != -1);
CPPUNIT_ASSERT(tocContent.indexOf("Fusce posuere, magna sed pulvinar ultricies, purus lectus malesuada libero, sit amet commodo magna eros quis urna.") != -1);
CPPUNIT_ASSERT(tocContent.indexOf("Proin pharetra nonummy pede. Mauris et orci.") != -1);
}
DECLARE_OOXMLEXPORT_TEST(testTdf153082_comma, "custom-styles-TOC-comma.docx")
{
uno::Reference<text::XDocumentIndexesSupplier> xIndexSupplier(mxComponent, uno::UNO_QUERY);
uno::Reference<container::XIndexAccess> xIndexes = xIndexSupplier->getDocumentIndexes();
uno::Reference<text::XDocumentIndex> xTOC(xIndexes->getByIndex(0), uno::UNO_QUERY); // check styles
uno::Reference<container::XIndexAccess> xParaStyles =
getProperty<uno::Reference<container::XIndexAccess>>(xTOC, u"LevelParagraphStyles"_ustr);
uno::Sequence<OUString> styles;
xParaStyles->getByIndex(0) >>= styles;
CPPUNIT_ASSERT_EQUAL(uno::Sequence<OUString>{u"_MyStyle0"_ustr}, styles);
xParaStyles->getByIndex(1) >>= styles;
CPPUNIT_ASSERT_EQUAL(uno::Sequence<OUString>{u"Custom1"_ustr}, styles);
xParaStyles->getByIndex(2) >>= styles; // the first one is built-in Word style "Intense Quote" that was localised DE "Intensives Zitat" in the file
CPPUNIT_ASSERT_EQUAL(uno::Sequence<OUString>{u"Intensives Zitat"_ustr}, styles);
xTOC->update();
OUString const tocContent(xTOC->getAnchor()->getString());
CPPUNIT_ASSERT(tocContent.startsWith("Table of Contents"));
CPPUNIT_ASSERT(tocContent.indexOf("Lorem ipsum dolor sit amet, consectetuer adipiscing elit.") != -1);
CPPUNIT_ASSERT(tocContent.indexOf("Fusce posuere, magna sed pulvinar ultricies, purus lectus malesuada libero, sit amet commodo magna eros quis urna.") != -1);
CPPUNIT_ASSERT(tocContent.indexOf("Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.") != -1);
}
DECLARE_OOXMLEXPORT_TEST(testTdf142407, "tdf142407.docx")
{
uno::Reference<container::XNameAccess> xPageStyles = getStyles(u"PageStyles"_ustr);
uno::Reference<beans::XPropertySet> xPageStyle(xPageStyles->getByName(u"Standard"_ustr), uno::UNO_QUERY);
sal_Int16 nGridLines;
xPageStyle->getPropertyValue(u"GridLines"_ustr) >>= nGridLines;
CPPUNIT_ASSERT_EQUAL( sal_Int16(36), nGridLines); // was 23, left large space before text.
}
DECLARE_OOXMLEXPORT_TEST(testWPGBodyPr, "WPGbodyPr.docx")
{ // There are a WPG shape and a picture
CPPUNIT_ASSERT_EQUAL(2, getShapes());
// Get the WPG shape
uno::Reference<drawing::XShapes> xGroup(getShape(1), uno::UNO_QUERY); // And the embed WPG
uno::Reference<drawing::XShapes> xEmbedGroup(xGroup->getByIndex(1), uno::UNO_QUERY);
// Get the properties of the shapes
uno::Reference<beans::XPropertySet> xOuterShape(xGroup->getByIndex(0), uno::UNO_QUERY);
uno::Reference<beans::XPropertySet> xMiddleShape(xEmbedGroup->getByIndex(0), uno::UNO_QUERY);
uno::Reference<beans::XPropertySet> xInnerShape(xEmbedGroup->getByIndex(1), uno::UNO_QUERY);
// Get the properties of the textboxes too
uno::Reference<beans::XPropertySet> xOuterTextBox(
xOuterShape->getPropertyValue(u"TextBoxContent"_ustr), uno::UNO_QUERY);
uno::Reference<beans::XPropertySet> xMiddleTextBox(
xMiddleShape->getPropertyValue(u"TextBoxContent"_ustr), uno::UNO_QUERY);
uno::Reference<beans::XPropertySet> xInnerTextBox(
xInnerShape->getPropertyValue(u"TextBoxContent"_ustr), uno::UNO_QUERY);
// Check the inset margins, all were 0 before the fix
CPPUNIT_ASSERT_EQUAL(sal_Int32(499),
xInnerShape->getPropertyValue(u"TextLowerDistance"_ustr).get<sal_Int32>());
CPPUNIT_ASSERT_EQUAL(sal_Int32(499),
xInnerShape->getPropertyValue(u"TextUpperDistance"_ustr).get<sal_Int32>());
CPPUNIT_ASSERT_EQUAL(sal_Int32(1000),
xInnerShape->getPropertyValue(u"TextLeftDistance"_ustr).get<sal_Int32>());
CPPUNIT_ASSERT_EQUAL(sal_Int32(254),
xInnerShape->getPropertyValue(u"TextRightDistance"_ustr).get<sal_Int32>());
}
DECLARE_OOXMLEXPORT_TEST(testTdf146851_2, "tdf146851_2.docx")
{ // Ensure numbering on second para
uno::Reference<beans::XPropertySet> xPara;
xPara.set(getParagraph(2, u"."_ustr), uno::UNO_QUERY);
CPPUNIT_ASSERT_EQUAL(u"Schedule"_ustr, getProperty<OUString>(xPara, u"ListLabelString"_ustr));
// Refresh fields and ensure cross-reference to numbered para is okay
uno::Reference<text::XTextFieldsSupplier> xTextFieldsSupplier(mxComponent, uno::UNO_QUERY);
uno::Reference<container::XEnumerationAccess> xFieldsAccess(xTextFieldsSupplier->getTextFields());
// Without the fix in place, this test would have failed with // - Expected: 14. Aug 18 // - Actual : 11. Apr 22
CPPUNIT_ASSERT_EQUAL(u"14. Aug 18"_ustr, xTextField->getPresentation(false));
}
uno::Reference<container::XEnumeration> xFields(xFieldsAccess->createEnumeration());
std::vector<OUString> aExpectedValues = { // These field values are NOT in order in document: getTextFields did provide // fields in a strange but fixed order (mostly reversed, thanks to SwModify::Add)
u"Title"_ustr, u"Placeholder"_ustr, u"Placeholder"_ustr, u"Placeholder"_ustr,
u"Placeholder"_ustr, u"Placeholder"_ustr, u"Placeholder"_ustr, u"Placeholder"_ustr,
u"Placeholder"_ustr, u"Placeholder"_ustr, u"Placeholder"_ustr, u"Placeholder"_ustr,
u"Placeholder"_ustr, u"Placeholder"_ustr, u"Placeholder"_ustr, u"Placeholder"_ustr,
u"Placeholder"_ustr, u"Title"_ustr, u"Title"_ustr, u"Title"_ustr,
u"Title"_ustr, u"Title"_ustr, u"Title"_ustr, u"Title"_ustr
};
xmlDocUniquePtr pXmlDoc = parseExport(u"word/document.xml"_ustr); // ShowingPlaceholder should be off for 0, false and "on". (This was 21 before the fix)
assertXPath(pXmlDoc,"//w:p/w:sdt/w:sdtPr/w:showingPlcHdr", 12);
}
DECLARE_OOXMLEXPORT_TEST(TestTdf73499, "tdf73499.docx")
{ // Get the groupshape
uno::Reference<drawing::XShapes> xGroup(getShape(1), uno::UNO_QUERY_THROW);
// Get the textboxes of the groupshape
uno::Reference<text::XText> xTextBox1(xGroup->getByIndex(0), uno::UNO_QUERY_THROW);
uno::Reference<text::XText> xTextBox2(xGroup->getByIndex(1), uno::UNO_QUERY_THROW);
// Get the properties of the textboxes
uno::Reference<beans::XPropertySet> xTextBox1Properties(xTextBox1, uno::UNO_QUERY_THROW);
uno::Reference<beans::XPropertySet> xTextBox2Properties(xTextBox2, uno::UNO_QUERY_THROW);
// Get the name of the textboxes
uno::Reference<container::XNamed> xTextBox1Name(xTextBox1, uno::UNO_QUERY_THROW);
uno::Reference<container::XNamed> xTextBox2Name(xTextBox2, uno::UNO_QUERY_THROW);
// Check for the links, before the fix that were missing
CPPUNIT_ASSERT_EQUAL_MESSAGE( "Link name missing!", xTextBox2Name->getName(),
xTextBox1Properties->getPropertyValue(u"ChainNextName"_ustr).get<OUString>());
CPPUNIT_ASSERT_EQUAL_MESSAGE( "Link name missing!", xTextBox1Name->getName(),
xTextBox2Properties->getPropertyValue(u"ChainPrevName"_ustr).get<OUString>());
}
// Ensure that we have <w:text w:multiLine="1"/>
assertXPath(pXmlDoc, "/w:document/w:body/w:p[1]/w:sdt/w:sdtPr/w:text", "multiLine", u"1");
// Ensure that we have <w:text w:multiLine="0"/>
assertXPath(pXmlDoc, "/w:document/w:body/w:p[2]/w:sdt/w:sdtPr/w:text", "multiLine", u"0");
// Ensure that we have <w:text/>
assertXPath(pXmlDoc, "/w:document/w:body/w:p[3]/w:sdt/w:sdtPr/w:text");
assertXPath(pXmlDoc, "/w:document/w:body/w:p[4]/w:sdt/w:sdtPr/w:text");
}
std::vector<OUString> aExpectedValues = { // These field values are NOT in order in document: getTextFields did provide // fields in a strange but fixed order (mostly reversed, thanks to SwModify::Add)
u"1"_ustr, u"1"_ustr, u"1"_ustr, u"1"_ustr, u"1/"_ustr, u"1/"_ustr, u"1/"_ustr, u"1)"_ustr, u"1)"_ustr, u"1)"_ustr, u"1.)"_ustr,
u"1.)"_ustr, u"1.)"_ustr, u"1.."_ustr, u"1.."_ustr, u"1.."_ustr, u"1."_ustr, u"1."_ustr, u"1."_ustr, u"1"_ustr, u"1"_ustr
};
// broken test document? #if !defined(_WIN32)
CPPUNIT_TEST_FIXTURE(Test, testTdf146955)
{
loadAndReload("tdf146955.odt"); // import of a (broken?) DOCX export with dozens of frames raised a SAX exception, // when the code tried to access to a non-existent footnote
uno::Reference<text::XFootnotesSupplier> xNotes(mxComponent, uno::UNO_QUERY);
CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xNotes->getFootnotes()->getCount());
} #endif
// Ensure we have empty lvlOverride for levels 0 - 1
assertXPath(pNumberingDoc, "/w:numbering/w:num[@w:numId='" + OString::number(nListId) +"']/w:lvlOverride[@w:ilvl='0']");
assertXPath(pNumberingDoc, "/w:numbering/w:num[@w:numId='" + OString::number(nListId) +"']/w:lvlOverride[@w:ilvl='1']"); // And normal override for level 2
getXPath(pNumberingDoc, "/w:numbering/w:num[@w:numId='" + OString::number(nListId) +"']/w:lvlOverride[@w:ilvl='2']/w:startOverride", "val");
}
CPPUNIT_TEST_FIXTURE(Test, testTdf147978enhancedPathABVW)
{
createSwDoc("tdf147978_enhancedPath_commandABVW.odt");
saveAndReload(u"Office Open XML Text"_ustr); // Make sure the new implemented export for commands A,B,V and W use the correct arc between // the given two points, here the short one. for (sal_Int16 i = 1 ; i <= 4; ++i)
{
uno::Reference<drawing::XShape> xShape = getShape(i);
CPPUNIT_ASSERT_EQUAL(sal_Int32(506), getProperty<awt::Rectangle>(xShape, u"BoundRect"_ustr).Height);
}
}
DECLARE_OOXMLEXPORT_TEST(testTdf148132, "tdf148132.docx")
{
{
uno::Reference<text::XTextRange> xParagraph = getParagraph(1); auto xLevels = getProperty< uno::Reference<container::XIndexAccess> >(xParagraph, u"NumberingRules"_ustr); // Get level 2 char style
comphelper::SequenceAsHashMap levelProps(xLevels->getByIndex(1));
OUString aCharStyleName = levelProps[u"CharStyleName"_ustr].get<OUString>(); // Ensure that numbering in this paragraph is 24pt bold italic // Previously it got overridden by paragraph properties and became 6pt, no bold, no italic
uno::Reference<beans::XPropertySet> xStyle(getStyles(u"CharacterStyles"_ustr)->getByName(aCharStyleName), uno::UNO_QUERY);
CPPUNIT_ASSERT_EQUAL(24.f, getProperty<float>(xStyle, u"CharHeight"_ustr));
CPPUNIT_ASSERT_EQUAL(awt::FontWeight::BOLD, getProperty<float>(xStyle, u"CharWeight"_ustr));
CPPUNIT_ASSERT_EQUAL(awt::FontSlant_ITALIC, getProperty<awt::FontSlant>(xStyle, u"CharPosture"_ustr));
} // And do the same for second paragraph. Numbering should be identical
{
uno::Reference<text::XTextRange> xParagraph = getParagraph(2); auto xLevels = getProperty< uno::Reference<container::XIndexAccess> >(xParagraph, u"NumberingRules"_ustr);
comphelper::SequenceAsHashMap levelProps(xLevels->getByIndex(1));
OUString aCharStyleName = levelProps[u"CharStyleName"_ustr].get<OUString>();
// Ensure there is no unexpected invalid structure <w14:textFill> // There is just one run property
xmlXPathObjectPtr pXmlObj = getXPathNode(pXmlDoc, "count(/w:document/w:body/w:p[1]/w:r[1]/w:rPr/*)");
CPPUNIT_ASSERT(pXmlObj);
CPPUNIT_ASSERT_EQUAL(double(1), pXmlObj->floatval); // And it is a color definition with themeColor
assertXPath(pXmlDoc, "/w:document/w:body/w:p[1]/w:r[1]/w:rPr/w:color", "themeColor", u"dark1");
}
DECLARE_OOXMLEXPORT_TEST(testTdf149313, "tdf149313.docx")
{ // only 2, but not 3 pages in document
CPPUNIT_ASSERT_EQUAL(2, getPages());
xmlDocUniquePtr pXmlDoc = parseLayoutDump(); // And ensure that pages are with correct sections (have correct dimensions)
CPPUNIT_ASSERT_EQUAL(sal_Int32(4989), getXPath(pXmlDoc, "/root/page[1]/infos/bounds", "height").toInt32());
CPPUNIT_ASSERT_EQUAL(sal_Int32(4989), getXPath(pXmlDoc, "/root/page[1]/infos/bounds", "width").toInt32());
CPPUNIT_ASSERT_EQUAL(sal_Int32(4989), getXPath(pXmlDoc, "/root/page[2]/infos/bounds", "height").toInt32());
CPPUNIT_ASSERT_EQUAL(sal_Int32(8000), getXPath(pXmlDoc, "/root/page[2]/infos/bounds", "width").toInt32());
}
// Ensure first element is a tab
assertXPath(pLayout, "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout/child::*[1]", "type", u"PortionType::TabLeft"); // and only then goes content
assertXPath(pLayout, "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout/child::*[2]", "type", u"PortionType::Text");
}
DECLARE_OOXMLEXPORT_TEST(testTdf148273_sectionBulletFormatLeak, "tdf148273_sectionBulletFormatLeak.docx")
{ // get a paragraph with bullet point after section break
uno::Reference<text::XTextRange> xParagraph = getParagraph(4);
uno::Reference<beans::XPropertySet> xProps(xParagraph, uno::UNO_QUERY);
// Make sure that the bullet has no ListAutoFormat inherited from // the empty paragraph before the section break // Without the accompanying fix in place, this test would have failed with: // - Expected: 0 // - Actual : 1 // i.e. empty paragraph formats from the first section leaked to the bullet's formatting
uno::Any aValue = xProps->getPropertyValue(u"ListAutoFormat"_ustr);
CPPUNIT_ASSERT_EQUAL(false, aValue.hasValue());
}
CPPUNIT_TEST_FIXTURE(Test, testTdf139128)
{
loadAndReload("tdf139128.odt");
xmlDocUniquePtr pXmlDoc = parseExport(u"word/document.xml"_ustr);
CPPUNIT_ASSERT(pXmlDoc); // Without the accompanying fix in place, this test would have failed with: // - Expected: 2 // - Actual : 0 // i.e. the line break was lost on export.
assertXPath(pXmlDoc, "//w:br", 2);
}
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.