diff options
author | Mike Kaganski <mike.kaganski@collabora.com> | 2018-10-30 12:54:56 +0300 |
---|---|---|
committer | Mike Kaganski <mike.kaganski@collabora.com> | 2018-10-30 14:42:45 +0100 |
commit | ac12028bf29aad389f03a296402e7af51a86a3e6 (patch) | |
tree | 9f9bb35ed0683f7f762b4af301a66802e9b20879 | |
parent | 8780fa41dcd164af244742461f4e57a4bcf4c7a4 (diff) |
tdf#116989: add unit test
Change-Id: Ia8b5478b0d2a15f91add4ee76455e73c2c970392
Reviewed-on: https://gerrit.libreoffice.org/62544
Tested-by: Jenkins
Reviewed-by: Mike Kaganski <mike.kaganski@collabora.com>
-rw-r--r-- | sw/qa/extras/layout/data/tdf116989.docx | bin | 0 -> 15538 bytes | |||
-rw-r--r-- | sw/qa/extras/layout/layout.cxx | 24 | ||||
-rw-r--r-- | test/source/xmltesttools.cxx | 51 |
3 files changed, 62 insertions, 13 deletions
diff --git a/sw/qa/extras/layout/data/tdf116989.docx b/sw/qa/extras/layout/data/tdf116989.docx Binary files differnew file mode 100644 index 000000000000..498b60dbf345 --- /dev/null +++ b/sw/qa/extras/layout/data/tdf116989.docx diff --git a/sw/qa/extras/layout/layout.cxx b/sw/qa/extras/layout/layout.cxx index da45f2e9198e..40f67c84f444 100644 --- a/sw/qa/extras/layout/layout.cxx +++ b/sw/qa/extras/layout/layout.cxx @@ -60,6 +60,7 @@ public: void testTdf120287(); void testTdf120287b(); void testTdf120287c(); + void testTdf116989(); CPPUNIT_TEST_SUITE(SwLayoutWriter); CPPUNIT_TEST(testRedlineFootnotes); @@ -92,6 +93,7 @@ public: CPPUNIT_TEST(testTdf120287); CPPUNIT_TEST(testTdf120287b); CPPUNIT_TEST(testTdf120287c); + CPPUNIT_TEST(testTdf116989); CPPUNIT_TEST_SUITE_END(); private: @@ -2583,6 +2585,28 @@ void SwLayoutWriter::testTdf120287c() assertXPath(pXmlDoc, "/root/page/body/txt[1]/LineBreak", 3); } +void SwLayoutWriter::testTdf116989() +{ + createDoc("tdf116989.docx"); + xmlDocPtr pXmlDoc = parseLayoutDump(); + // FIXME: the XPath should be adjusted when the proper floating table would be imported + const sal_Int32 nTblTop + = getXPath(pXmlDoc, "/root/page[1]/footer/tab/infos/bounds", "top").toInt32(); + const sal_Int32 nFirstPageParaCount + = getXPathContent(pXmlDoc, "count(/root/page[1]/body/txt)").toInt32(); + // FIXME: should be exactly 30, when proper floating tables in footers are supported + CPPUNIT_ASSERT_GREATEREQUAL(sal_Int32(30), nFirstPageParaCount); + for (sal_Int32 i = 1; i <= nFirstPageParaCount; ++i) + { + const OString xPath = "/root/page[1]/body/txt[" + OString::number(i) + "]/infos/bounds"; + const sal_Int32 nTxtBottom = getXPath(pXmlDoc, xPath.getStr(), "top").toInt32() + + getXPath(pXmlDoc, xPath.getStr(), "height").toInt32(); + // No body paragraphs should overlap the table in the footer + CPPUNIT_ASSERT_MESSAGE(OString("testing paragraph #" + OString::number(i)).getStr(), + nTxtBottom <= nTblTop); + } +} + CPPUNIT_TEST_SUITE_REGISTRATION(SwLayoutWriter); CPPUNIT_PLUGIN_IMPLEMENT(); diff --git a/test/source/xmltesttools.cxx b/test/source/xmltesttools.cxx index cae81afa77a3..dd3179cb1e1f 100644 --- a/test/source/xmltesttools.cxx +++ b/test/source/xmltesttools.cxx @@ -82,20 +82,45 @@ OUString XmlTestTools::getXPath(xmlDocPtr pXmlDoc, const OString& rXPath, const OUString XmlTestTools::getXPathContent(xmlDocPtr pXmlDoc, const OString& rXPath) { xmlXPathObjectPtr pXmlObj = getXPathNode(pXmlDoc, rXPath); - xmlNodeSetPtr pXmlNodes = pXmlObj->nodesetval; - - CPPUNIT_ASSERT_MESSAGE(OString("In <" + OString(pXmlDoc->name) + ">, XPath '" + rXPath + "' not found").getStr(), - xmlXPathNodeSetGetLength(pXmlNodes) > 0); + switch (pXmlObj->type) + { + case XPATH_UNDEFINED: + CPPUNIT_FAIL("Undefined XPath type"); + case XPATH_NODESET: + { + xmlNodeSetPtr pXmlNodes = pXmlObj->nodesetval; + + CPPUNIT_ASSERT_MESSAGE( + OString("In <" + OString(pXmlDoc->name) + ">, XPath '" + rXPath + "' not found") + .getStr(), + xmlXPathNodeSetGetLength(pXmlNodes) > 0); + + xmlNodePtr pXmlNode = pXmlNodes->nodeTab[0]; + xmlNodePtr pXmlChild = pXmlNode->children; + OUString s; + while (pXmlChild && pXmlChild->type != XML_TEXT_NODE) + pXmlChild = pXmlChild->next; + if (pXmlChild && pXmlChild->type == XML_TEXT_NODE) + s = convert(pXmlChild->content); + xmlXPathFreeObject(pXmlObj); + return s; + } + case XPATH_BOOLEAN: + return pXmlObj->boolval ? OUString("true") : OUString("false"); + case XPATH_NUMBER: + return OUString::number(pXmlObj->floatval); + case XPATH_STRING: + return convert(pXmlObj->stringval); + case XPATH_POINT: + case XPATH_RANGE: + case XPATH_LOCATIONSET: + case XPATH_USERS: + case XPATH_XSLT_TREE: + CPPUNIT_FAIL("Unsupported XPath type"); + } - xmlNodePtr pXmlNode = pXmlNodes->nodeTab[0]; - xmlNodePtr pXmlChild = pXmlNode->children; - OUString s; - while (pXmlChild && pXmlChild->type != XML_TEXT_NODE) - pXmlChild = pXmlChild->next; - if (pXmlChild && pXmlChild->type == XML_TEXT_NODE) - s = convert(pXmlChild->content); - xmlXPathFreeObject(pXmlObj); - return s; + CPPUNIT_FAIL("Invalid XPath type"); + return OUString(); // to suppress "Not all control paths return a value" warning on MSVC } void XmlTestTools::assertXPath(xmlDocPtr pXmlDoc, const OString& rXPath, const OString& rAttribute, const OUString& rExpectedValue) |