From 0cf6f241e40b8be3c9d809c528b367df32f3f2ee Mon Sep 17 00:00:00 2001 From: Miklos Vajna Date: Mon, 24 Feb 2014 09:03:22 +0100 Subject: abi#11739 DOCX export: fix validation error, wrong order of some elements Change-Id: Ic1c0174718ba6853fcc8795324a99b2a332b865e --- sw/qa/extras/ooxmlexport/data/abi11739.docx | Bin 0 -> 11635 bytes sw/qa/extras/ooxmlexport/ooxmlexport.cxx | 36 ++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+) create mode 100755 sw/qa/extras/ooxmlexport/data/abi11739.docx (limited to 'sw/qa/extras/ooxmlexport') diff --git a/sw/qa/extras/ooxmlexport/data/abi11739.docx b/sw/qa/extras/ooxmlexport/data/abi11739.docx new file mode 100755 index 000000000000..8eb6999da28d Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/abi11739.docx differ diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport.cxx index 850c11141f42..c1d81ca39c24 100644 --- a/sw/qa/extras/ooxmlexport/ooxmlexport.cxx +++ b/sw/qa/extras/ooxmlexport/ooxmlexport.cxx @@ -96,6 +96,12 @@ protected: */ void assertXPathChildren(xmlDocPtr pXmlDoc, const OString& rXPath, int nNumberOfChildNodes); + /** + * Get the position of the child named rName of the parent node specified by rXPath. + * Useful for checking relative order of elements. + */ + int getXPathPosition(xmlDocPtr pXmlDoc, const OString& rXPath, const OUString& rName); + /** * Same as the assertXPath(), but don't assert: return the string instead. */ @@ -189,6 +195,23 @@ void Test::assertXPathChildren(xmlDocPtr pXmlDoc, const OString& rXPath, int nNu nNumberOfChildNodes, (int)xmlChildElementCount(pXmlNode)); } +int Test::getXPathPosition(xmlDocPtr pXmlDoc, const OString& rXPath, const OUString& rChildName) +{ + xmlNodeSetPtr pXmlNodes = getXPathNode(pXmlDoc, rXPath); + CPPUNIT_ASSERT_EQUAL_MESSAGE(OString("XPath '" + rXPath + "' number of nodes is incorrect").getStr(), + 1, + xmlXPathNodeSetGetLength(pXmlNodes)); + xmlNodePtr pXmlNode = pXmlNodes->nodeTab[0]; + int nRet = 0; + for (xmlNodePtr pChild = pXmlNode->children; pChild; pChild = pChild->next) + { + if (OUString::createFromAscii((const char*)pChild->name) == rChildName) + break; + ++nRet; + } + return nRet; +} + OUString Test::getXPath(xmlDocPtr pXmlDoc, const OString& rXPath, const OString& rAttribute) { xmlNodeSetPtr pXmlNodes = getXPathNode(pXmlDoc, rXPath); @@ -3431,6 +3454,19 @@ DECLARE_OOXMLEXPORT_TEST(testW14TextEffects, "TextEffects.docx") CPPUNIT_ASSERT(getXPath(pXmlDoc, "/w:document/w:body/w:p/w:r[2]/w:rPr/w14:glow", "rad").match("228600")); } +DECLARE_OOXMLEXPORT_TEST(testAbi11739, "abi11739.docx") +{ + // Validation test: order of elements were wrong. + xmlDocPtr pXmlDoc = parseExport("word/styles.xml"); + if (!pXmlDoc) + return; + // Order was: uiPriority, link, basedOn. + CPPUNIT_ASSERT(getXPathPosition(pXmlDoc, "/w:styles/w:style[3]", "basedOn") < getXPathPosition(pXmlDoc, "/w:styles/w:style[3]", "link")); + CPPUNIT_ASSERT(getXPathPosition(pXmlDoc, "/w:styles/w:style[3]", "link") < getXPathPosition(pXmlDoc, "/w:styles/w:style[3]", "uiPriority")); + // Order was: qFormat, unhideWhenUsed. + CPPUNIT_ASSERT(getXPathPosition(pXmlDoc, "/w:styles/w:style[11]", "unhideWhenUsed") < getXPathPosition(pXmlDoc, "/w:styles/w:style[11]", "qFormat")); +} + #endif CPPUNIT_PLUGIN_IMPLEMENT(); -- cgit v1.2.3