/* -*- 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/.
*/
DECLARE_OOXMLEXPORT_TEST(testTdf46938_clearTabStop, "tdf46938_clearTabStop.docx")
{ // Number of tabstops should be zero, overriding the one in the style
CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty< uno::Sequence<style::TabStop> >(getParagraph(1), u"ParaTabStops"_ustr).getLength());
}
DECLARE_OOXMLEXPORT_TEST(testTdf124384, "tdf124384.docx")
{ // There should be no crash during loading of the document // so, let's check just how much pages we have
CPPUNIT_ASSERT_EQUAL(1, getPages());
}
// Related issue tdf#121561: w:sdt/w:sdtContent around TOC
DECLARE_OOXMLEXPORT_TEST(testTdf124106, "tdf121456.docx")
{
uno::Reference<text::XTextDocument> textDocument(mxComponent, uno::UNO_QUERY);
uno::Reference<text::XText> text = textDocument->getText(); // -1 if the 'Y' character does not occur
CPPUNIT_ASSERT_EQUAL(sal_Int32(-1), text->getString().indexOf('Y'));
CPPUNIT_ASSERT_EQUAL(sal_Int32(-1), text->getString().indexOf('y'));
}
DECLARE_OOXMLEXPORT_TEST(testTdf115861, "tdf115861.docx")
{ // Second item in the paragraph enumeration was a table, 2nd paragraph was // lost.
CPPUNIT_ASSERT_EQUAL(u"(k)"_ustr, getParagraph(2)->getString());
}
DECLARE_OOXMLEXPORT_TEST(testTdf115719, "tdf115719.docx")
{ // This was a single page, instead of pushing the textboxes to the second // page.
CPPUNIT_ASSERT_EQUAL(2, getPages());
}
DECLARE_OOXMLEXPORT_TEST(testTdf115719b, "tdf115719b.docx")
{ // This is similar to testTdf115719, but here the left textbox is not aligned "from left, by // 0cm" but simply aligned to left, which is a different codepath.
// Without the accompanying fix in place, this test would have failed with: // - Expected: 2 // - Actual : 1 // i.e. the textboxes did not appear on the 2nd page, but everything was on a single page.
CPPUNIT_ASSERT_EQUAL(2, getPages());
}
DECLARE_OOXMLEXPORT_TEST(testTdf123243, "tdf123243.docx")
{ // Without the accompanying fix in place, this test would have failed with 'Expected: 1; Actual: // 2'; i.e. unexpected paragraph margin created 2 pages.
CPPUNIT_ASSERT_EQUAL(1, getPages());
}
DECLARE_OOXMLEXPORT_TEST(testTdf116410, "tdf116410.docx")
{ // Opposite of the above, was 2 pages, should be 1 page.
CPPUNIT_ASSERT_EQUAL(1, getPages());
}
DECLARE_OOXMLEXPORT_TEST(testTdf94801, "tdf94801.docx")
{ // This was a 2-page document with unwanted line breaking in table cells, because // the table was narrower, than defined (< 1/100 mm loss during twip to 1/100 mm conversion)
CPPUNIT_ASSERT_EQUAL(1, getPages());
}
// Test document has only two paragraphs. After splitting, it should contain // three of them.
assertXPath(pXmlDoc, "//w:sectPr", 2);
assertXPath(pXmlDoc, "//w:p", 3);
}
OUString aSigningInstructions;
xPropSet->getPropertyValue(u"SignatureLineSigningInstructions"_ustr) >>= aSigningInstructions;
CPPUNIT_ASSERT_EQUAL(u"Check the machines!"_ustr, aSigningInstructions);
}
CPPUNIT_TEST_FIXTURE(Test, testTdf117805)
{
loadAndSave("tdf117805.odt");
CPPUNIT_ASSERT_EQUAL(1, getShapes());
CPPUNIT_ASSERT_EQUAL(1, getPages());
uno::Reference<packages::zip::XZipFileAccess2> xNameAccess
= packages::zip::ZipFileAccess::createWithURL(comphelper::getComponentContext(m_xSFactory),
maTempFile.GetURL()); // This failed, the header was lost. It's still referenced at an incorrect // location in document.xml, though.
CPPUNIT_ASSERT(xNameAccess->hasByName(u"word/header1.xml"_ustr));
DECLARE_OOXMLEXPORT_TEST(testTdf113183, "tdf113183.docx")
{ // The horizontal positioning of the star shape affected the positioning of // the triangle one, so the triangle was outside the page frame.
xmlDocUniquePtr pXmlDoc = parseLayoutDump();
sal_Int32 nPageLeft = getXPath(pXmlDoc, "/root/page[1]/infos/bounds", "left").toInt32();
sal_Int32 nPageWidth = getXPath(pXmlDoc, "/root/page[1]/infos/bounds", "width").toInt32();
sal_Int32 nShapeLeft
= getXPath(pXmlDoc, "/root/page/body/txt/anchored/SwAnchoredDrawObject[2]/bounds", "left")
.toInt32();
sal_Int32 nShapeWidth
= getXPath(pXmlDoc, "/root/page/body/txt/anchored/SwAnchoredDrawObject[2]/bounds", "width")
.toInt32(); // Make sure the second triangle shape is within the page bounds (with ~1px tolerance).
CPPUNIT_ASSERT_GREATEREQUAL(nShapeLeft + nShapeWidth, nPageLeft + nPageWidth + 21);
}
DECLARE_OOXMLEXPORT_TEST(testTdf113547, "tdf113547.docx")
{
uno::Reference<beans::XPropertySet> xPropertySet(
getStyles(u"NumberingStyles"_ustr)->getByName(u"WWNum1"_ustr), uno::UNO_QUERY);
uno::Reference<container::XIndexAccess> xLevels(
xPropertySet->getPropertyValue(u"NumberingRules"_ustr), uno::UNO_QUERY);
comphelper::SequenceAsHashMap aProps(xLevels->getByIndex(0)); // 1st level // This was 0, first-line left margin of the numbering was lost.
CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(-635), aProps[u"FirstLineIndent"_ustr].get<sal_Int32>());
}
CPPUNIT_TEST_FIXTURE(Test, testTdf113399)
{
loadAndReload("tdf113399.doc"); // 0 padding was not preserved // In LO 0 is the default, but in OOXML format the default is 254 / 127
uno::Reference<beans::XPropertySet> xPropSet(getShape(1), uno::UNO_QUERY);
sal_Int32 nPaddingValue;
xPropSet->getPropertyValue(u"TextLeftDistance"_ustr) >>= nPaddingValue;
CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(0), nPaddingValue);
xPropSet->getPropertyValue(u"TextRightDistance"_ustr) >>= nPaddingValue;
CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(0), nPaddingValue);
xPropSet->getPropertyValue(u"TextUpperDistance"_ustr) >>= nPaddingValue;
CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(0), nPaddingValue);
xPropSet->getPropertyValue(u"TextLowerDistance"_ustr) >>= nPaddingValue;
CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(0), nPaddingValue);
}
DECLARE_OOXMLEXPORT_TEST(testTdf114882, "tdf114882.docx")
{ // fastserializer must not fail assertion because of mismatching elements
}
DECLARE_OOXMLEXPORT_TEST(testTdf114703, "tdf114703.docx")
{
uno::Reference<container::XIndexAccess> xRules
= getProperty<uno::Reference<container::XIndexAccess>>(
getStyles(u"NumberingStyles"_ustr)->getByName(u"WWNum1"_ustr), u"NumberingRules"_ustr); // This was 0, level override "default" replaced the non-default value from // the abstract level.
CPPUNIT_ASSERT_EQUAL( static_cast<sal_Int32>(-1000),
comphelper::SequenceAsHashMap(xRules->getByIndex(0))[u"FirstLineIndent"_ustr].get<sal_Int32>());
}
DECLARE_OOXMLEXPORT_TEST(testTdf113258, "tdf113258.docx")
{
uno::Reference<text::XTextRange> xShape(getShape(1), uno::UNO_QUERY); // This was 494, i.e. automatic spacing resulted in non-zero paragraph top // margin for the first paragraph in a shape.
CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(0),
getProperty<sal_Int32>(xShape->getStart(), u"ParaTopMargin"_ustr));
}
DECLARE_OOXMLEXPORT_TEST(testTdf113258_noBeforeAutospacing, "tdf113258_noBeforeAutospacing.docx")
{
uno::Reference<text::XTextRange> xShape(getShape(1), uno::UNO_QUERY); // This was 0, i.e. disabled automatic spacing still resulted in zero paragraph // top margin for the first paragraph in a shape.
CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(1764),
getProperty<sal_Int32>(xShape->getStart(), u"ParaTopMargin"_ustr));
}
CPPUNIT_TEST_FIXTURE(Test, testTdf137655)
{
loadAndSave("tdf137655.docx");
xmlDocUniquePtr pXmlDoc = parseExport(u"word/document.xml"_ustr); // These were 280.
assertXPath(pXmlDoc, "/w:document/w:body/w:tbl/w:tr[2]/w:tc[1]/w:p[1]/w:pPr/w:spacing", "before", u"0");
assertXPath(pXmlDoc, "/w:document/w:body/w:tbl/w:tr[2]/w:tc[2]/w:p[1]/w:pPr/w:spacing", "before", u"0");
//tdf#142542: ensure that the original beforeAutospacing = 0 is not changed.
assertXPath(pXmlDoc, "/w:document/w:body/w:tbl/w:tr[2]/w:tc[1]/w:p[1]/w:pPr/w:spacing", "beforeAutospacing", u"0");
}
DECLARE_OOXMLEXPORT_TEST(testTdf104354, "tdf104354.docx")
{
uno::Reference<text::XTextRange> xShape(getShape(1), uno::UNO_QUERY); // This was 494, i.e. automatic spacing resulted in non-zero paragraph top // margin for the first paragraph in a text frame.
CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(0),
getProperty<sal_Int32>(xShape->getStart(), u"ParaTopMargin"_ustr)); // still 494 in the second paragraph
CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(494),
getProperty<sal_Int32>(xShape->getEnd(), u"ParaTopMargin"_ustr));
}
CPPUNIT_TEST_FIXTURE(Test, testPageBreak_after)
{
loadAndReload("pageBreak_after.odt"); // The problem was that the page breakAfter put the empty page BEFORE the table
xmlDocUniquePtr pDump = parseLayoutDump();
assertXPath(pDump, "/root/page[1]/body/tab", 1); // There should be two pages actually - a blank page after a page break.
CPPUNIT_ASSERT_EQUAL_MESSAGE("Did you fix?? Table should be on page one of two", 1, getPages());
}
DECLARE_OOXMLEXPORT_TEST(testTdf107035, "tdf107035.docx")
{ // Select the second run containing the page number field auto xPgNumRun = getRun(getParagraph(1), 2, u"1"_ustr);
// Check that the page number field colour is set to "automatic".
Color nPgNumColour = getProperty<Color>(xPgNumRun, u"CharColor"_ustr);
CPPUNIT_ASSERT_EQUAL(COL_AUTO, nPgNumColour);
}
DECLARE_OOXMLEXPORT_TEST(testTdf112118_DOCX, "tdf112118.docx")
{ // The resulting left margin width (2081) differs from its DOC counterpart from ww8export2.cxx, // because DOCX import does two conversions between mm/100 and twips on the route, losing one // twip on the road and arriving with a value that is 2 mm/100 less. I don't see an obvious way // to avoid that. staticconststruct { constchar* styleName; struct { constchar* sideName;
sal_Int32 nMargin;
sal_Int32 nBorderDistance;
sal_Int32 nBorderWidth;
} sideParams[4];
} styleParams[] = { // Margin (MS-style), border distance, border width
{ "Standard",
{
{ "Top", 496, 847, 159 }, // 851 twip, 24 pt (from text), 4.5 pt
{ "Left", 2081, 706, 212 }, // 1701 twip, 20 pt (from text), 6.0 pt
{ "Bottom", 1401, 564, 35 }, // 1134 twip, 16 pt (from text), 1.0 pt
{ "Right", 3471, 423, 106 } // 2268 twip, 12 pt (from text), 3.0 pt
}
},
{ "Converted1",
{
{ "Top", 847, 496, 159 }, // 851 twip, 24 pt (from edge), 4.5 pt
{ "Left", 706, 2081, 212 }, // 1701 twip, 20 pt (from edge), 6.0 pt
{ "Bottom", 564, 1401, 35 }, // 1134 twip, 16 pt (from edge), 1.0 pt
{ "Right", 423, 3471, 106 } // 2268 twip, 12 pt (from edge), 3.0 pt
}
}
}; auto xStyles = getStyles(u"PageStyles"_ustr);
// tdf#116472: check that AUTO border color is imported as black
CPPUNIT_ASSERT_EQUAL_MESSAGE(OString(sStage + " border color").getStr(),
sal_Int32(COL_BLACK), aBorder.Color);
}
}
}
DECLARE_OOXMLEXPORT_TEST(testTdf116976, "tdf116976.docx")
{ // This was 0, relative size of shape after bitmap was ignored.
CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int16>(40),
getProperty<sal_Int16>(getShapeByName(u"Text Box 2"), u"RelativeWidth"_ustr));
}
DECLARE_OOXMLEXPORT_TEST(testTdf116985, "tdf116985.docx")
{ // Body frame width is 10800, 40% is the requested relative width, with 144 // spacing to text on the left/right side. So ideal width would be 4032, // was 3431. Allow one pixel tolerance, though.
xmlDocUniquePtr pXmlDoc = parseLayoutDump();
sal_Int32 nWidth
= getXPath(pXmlDoc, "/root/page[1]/body/txt[1]/anchored/fly/infos/bounds", "width").toInt32();
CPPUNIT_ASSERT(nWidth > 4000);
}
DECLARE_OOXMLEXPORT_TEST(testTdf116801, "tdf116801.docx")
{
uno::Reference<text::XTextTablesSupplier> xTablesSupplier(mxComponent, uno::UNO_QUERY);
uno::Reference<container::XIndexAccess> xTables(xTablesSupplier->getTextTables(),
uno::UNO_QUERY); // This raised a lang::IndexOutOfBoundsException, table was missing from // the import result.
uno::Reference<text::XTextTable> xTable(xTables->getByIndex(0), uno::UNO_QUERY);
uno::Reference<text::XTextRange> xCell(xTable->getCellByName(u"D1"_ustr), uno::UNO_QUERY);
CPPUNIT_ASSERT_EQUAL(u"D1"_ustr, xCell->getString());
}
DECLARE_OOXMLEXPORT_TEST(testTdf107969, "tdf107969.docx")
{ // A VML object in a footnote's tracked changes caused write past end of document.xml at export to docx. // After that, importing after export failed with // SAXParseException: '[word/document.xml line 2]: Extra content at the end of the document', Stream 'word/document.xml'.
}
// Row 1: color directly applied to the paragraph, overrides table and style colors
CPPUNIT_ASSERT_EQUAL(Color(0x2E74B5), getProperty<Color>(getRun(xPara,1), u"CharColor"_ustr));
// Row2: (still part of firstRow table-style) ought to use the Normal style color, not the table-style color(5B9BD5) //xCell.set(xTable->getCellByName("A2"), uno::UNO_QUERY); //xParaEnumAccess.set(xCell->getText(), uno::UNO_QUERY); //xParaEnum = xParaEnumAccess->createEnumeration(); //xPara.set(xParaEnum->nextElement(), uno::UNO_QUERY); //CPPUNIT_ASSERT_EQUAL(sal_Int32(COL_LIGHTMAGENTA), getProperty<sal_Int32>(getRun(xPara,1), "CharColor"));
// Row 3+: Normal style still applied, even if nothing is specified with w:default="1"
xCell.set(xTable->getCellByName(u"A3"_ustr), uno::UNO_QUERY);
xParaEnumAccess.set(xCell->getText(), uno::UNO_QUERY);
xParaEnum = xParaEnumAccess->createEnumeration();
xPara.set(xParaEnum->nextElement(), uno::UNO_QUERY);
CPPUNIT_ASSERT_EQUAL(sal_Int32(COL_LIGHTMAGENTA), getProperty<sal_Int32>(getRun(xPara,1), u"CharColor"_ustr));
}
DECLARE_OOXMLEXPORT_TEST(testMarginsFromStyle, "margins_from_style.docx")
{ // tdf#118521 paragraphs with direct formatting of top or bottom margins have // lost the other margin comes from paragraph style, getting a bad // margin from the default style
// from direct formatting
CPPUNIT_ASSERT_EQUAL(sal_Int32(35), getProperty<sal_Int32>(getParagraph(1), u"ParaTopMargin"_ustr)); // from paragraph style
CPPUNIT_ASSERT_EQUAL(sal_Int32(106), getProperty<sal_Int32>(getParagraph(1), u"ParaBottomMargin"_ustr));
// from paragraph style
CPPUNIT_ASSERT_EQUAL(sal_Int32(388), getProperty<sal_Int32>(getParagraph(3), u"ParaTopMargin"_ustr)); // from direct formatting
CPPUNIT_ASSERT_EQUAL(sal_Int32(600), getProperty<sal_Int32>(getParagraph(3), u"ParaBottomMargin"_ustr));
}
// This wasn't zero (it was inherited from style of the previous paragraph in the main text)
CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty<sal_Int32>(xParagraph, u"ParaTopMargin"_ustr));
}
// These weren't zero (values inherited from style of the previous paragraph in the main text)
CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty<sal_Int32>(xParagraph, u"ParaBottomMargin"_ustr));
CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty<sal_Int32>(xParagraph, u"ParaTopMargin"_ustr));
}
DECLARE_OOXMLEXPORT_TEST(testTdf104348_contextMargin, "tdf104348_contextMargin.docx")
{ // tdf#104348 shows that ContextMargin belongs with Top/Bottom handling
uno::Reference<beans::XPropertySet> xMyStyle(getStyles(u"ParagraphStyles"_ustr)->getByName(u"MyStyle"_ustr), uno::UNO_QUERY); // from paragraph style - this is what direct formatting should equal
sal_Int32 nMargin = getProperty<sal_Int32>(xMyStyle, u"ParaBottomMargin"_ustr);
CPPUNIT_ASSERT_EQUAL(sal_Int32(0), nMargin); // from direct formatting
CPPUNIT_ASSERT_EQUAL(nMargin, getProperty<sal_Int32>(getParagraph(2), u"ParaBottomMargin"_ustr));
}
DECLARE_OOXMLEXPORT_TEST(testTdf149996, "lorem_hyperlink.fodt")
{ // Without the accompanying fix in place, this test would have crashed, // because the exported file was corrupted.
}
CPPUNIT_TEST_FIXTURE(Test, testGroupedShapeLink)
{
loadAndSave("grouped_link.docx"); // tdf#145147 Hyperlink in grouped shape not imported // tdf#154469 Hyperlink in grouped shape not exported
uno::Reference<drawing::XShapes> xGroupShape(getShape(1), uno::UNO_QUERY);
CPPUNIT_ASSERT_EQUAL(u"https://www.libreoffice.org"_ustr,
getProperty<OUString>(xGroupShape->getByIndex(0), u"Hyperlink"_ustr));
CPPUNIT_ASSERT_EQUAL(u"https://www.documentfoundation.org"_ustr,
getProperty<OUString>(xGroupShape->getByIndex(1), u"Hyperlink"_ustr));
// The id of the grouped shape's docPr must be > 0, otherwise Word fails to open the exported docx
sal_Int32 aId = getXPath(pXmlDoc, "/w:document/w:body/w:p/w:r/mc:AlternateContent/mc:Choice/w:drawing/wp:anchor/wp:docPr", "id").toInt32();
CPPUNIT_ASSERT(aId > 0);
}
DECLARE_OOXMLEXPORT_TEST(testTdf147810, "tdf147810.odt")
{ // Without the accompanying fix in place, this test would have crashed, // because the exported file was corrupted.
}
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.