summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/test/htmltesttools.hxx29
-rw-r--r--include/test/xmltesttools.hxx48
-rw-r--r--sd/qa/unit/HtmlExportTest.cxx42
-rw-r--r--sw/qa/extras/htmlexport/htmlexport.cxx22
-rw-r--r--sw/qa/extras/inc/swmodeltestbase.hxx107
-rw-r--r--test/Library_test.mk2
-rw-r--r--test/source/htmltesttools.cxx26
-rw-r--r--test/source/xmltesttools.cxx124
8 files changed, 240 insertions, 160 deletions
diff --git a/include/test/htmltesttools.hxx b/include/test/htmltesttools.hxx
new file mode 100644
index 000000000000..99d6bcf9eb89
--- /dev/null
+++ b/include/test/htmltesttools.hxx
@@ -0,0 +1,29 @@
+/* -*- 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/.
+ */
+
+#ifndef HTML_TEST_TOOLS_H
+#define HTML_TEST_TOOLS_H
+
+#include <sal/config.h>
+#include <test/testdllapi.hxx>
+
+#include <libxml/HTMLparser.h>
+#include <libxml/HTMLtree.h>
+
+#include <unotools/tempfile.hxx>
+#include <boost/scoped_array.hpp>
+
+class OOO_DLLPUBLIC_TEST HtmlTestTools
+{
+protected:
+ htmlDocPtr parseHtml(utl::TempFile& aTempFile);
+};
+
+#endif
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/include/test/xmltesttools.hxx b/include/test/xmltesttools.hxx
new file mode 100644
index 000000000000..a12d780ab59e
--- /dev/null
+++ b/include/test/xmltesttools.hxx
@@ -0,0 +1,48 @@
+/* -*- 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/.
+ */
+
+#ifndef XML_TEST_TOOLS_H
+#define XML_TEST_TOOLS_H
+
+#include <sal/config.h>
+#include <test/testdllapi.hxx>
+
+#include <libxml/xmlwriter.h>
+#include <libxml/xpath.h>
+#include <libxml/xpathInternals.h>
+#include <libxml/parserInternals.h>
+
+#include <rtl/string.hxx>
+#include <rtl/ustring.hxx>
+#include <cppunit/TestAssert.h>
+
+class OOO_DLLPUBLIC_TEST XmlTestTools
+{
+protected:
+ XmlTestTools();
+ virtual ~XmlTestTools();
+
+ virtual void registerNamespaces(xmlXPathContextPtr& pXmlXpathCtx);
+
+ xmlNodeSetPtr getXPathNode(xmlDocPtr pXmlDoc, const OString& rXPath);
+ OUString getXPath(xmlDocPtr pXmlDoc, const OString& rXPath, const OString& rAttribute);
+ OUString getXPathContent(xmlDocPtr pXmlDoc, const OString& rXPath);
+ int getXPathPosition(xmlDocPtr pXmlDoc, const OString& rXPath, const OUString& rChildName);
+ void assertXPath(xmlDocPtr pXmlDoc, const OString& rXPath,
+ const OString& rAttribute = OString(),
+ const OUString& rExpectedValue = OUString());
+ void assertXPath(xmlDocPtr pXmlDoc, const OString& rXPath, int nNumberOfNodes);
+ void assertXPathContent(xmlDocPtr pXmlDoc, const OString& rXPath, const OUString& rContent);
+ void assertXPathChildren(xmlDocPtr pXmlDoc, const OString& rXPath, int nNumberOfChildNodes);
+
+};
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/qa/unit/HtmlExportTest.cxx b/sd/qa/unit/HtmlExportTest.cxx
index a8aab8c909b4..4ce0a5d4d9dd 100644
--- a/sd/qa/unit/HtmlExportTest.cxx
+++ b/sd/qa/unit/HtmlExportTest.cxx
@@ -9,49 +9,15 @@
#include "sdmodeltestbase.hxx"
-#include <libxml/xmlwriter.h>
-#include <libxml/xpath.h>
-#include <libxml/xpathInternals.h>
-#include <libxml/parserInternals.h>
-#include <libxml/HTMLparser.h>
-#include <libxml/HTMLtree.h>
-
-#include <rtl/byteseq.hxx>
-#include <boost/scoped_array.hpp>
+#include <test/htmltesttools.hxx>
+#include <test/xmltesttools.hxx>
using namespace css;
using namespace rtl;
-class SdHTMLFilterTest : public SdModelTestBase
+class SdHTMLFilterTest : public SdModelTestBase, public XmlTestTools, public HtmlTestTools
{
- htmlDocPtr parseHtml(utl::TempFile& aTempFile)
- {
- SvFileStream aFileStream(aTempFile.GetURL(), STREAM_READ);
- sal_Size nSize = aFileStream.remainingSize();
-
- boost::scoped_array<sal_uInt8> pBuffer(new sal_uInt8[nSize + 1]);
-
- aFileStream.Read(pBuffer.get(), nSize);
-
- pBuffer[nSize] = 0;
- printf("Content: %s\n", reinterpret_cast<char*>(pBuffer.get()));
- return htmlParseDoc(reinterpret_cast<xmlChar*>(pBuffer.get()), NULL);
- }
-
- xmlNodeSetPtr getXPathNode(xmlDocPtr pXmlDoc, const OString& rXPath)
- {
- xmlXPathContextPtr pXmlXpathCtx = xmlXPathNewContext(pXmlDoc);
- xmlXPathObjectPtr pXmlXpathObj = xmlXPathEvalExpression(BAD_CAST(rXPath.getStr()), pXmlXpathCtx);
- return pXmlXpathObj->nodesetval;
- }
-
- void assertXPath(xmlDocPtr pXmlDoc, const OString& rXPath, int nNumberOfNodes)
- {
- xmlNodeSetPtr pXmlNodes = getXPathNode(pXmlDoc, rXPath);
- CPPUNIT_ASSERT_EQUAL_MESSAGE(OString("XPath '" + rXPath + "' number of nodes is incorrect").getStr(),
- nNumberOfNodes, xmlXPathNodeSetGetLength(pXmlNodes));
- }
-
+private:
htmlDocPtr exportAndparseHtml(sd::DrawDocShellRef& xDocShRef)
{
FileFormat* pFormat = getFormat(HTML);
diff --git a/sw/qa/extras/htmlexport/htmlexport.cxx b/sw/qa/extras/htmlexport/htmlexport.cxx
index 4e42cb417e95..8d73286c62a0 100644
--- a/sw/qa/extras/htmlexport/htmlexport.cxx
+++ b/sw/qa/extras/htmlexport/htmlexport.cxx
@@ -18,12 +18,11 @@
#include <swmodule.hxx>
#include <usrpref.hxx>
-#include <libxml/HTMLparser.h>
-#include <libxml/HTMLtree.h>
+#include <test/htmltesttools.hxx>
using namespace rtl;
-class Test : public SwModelTestBase
+class Test : public SwModelTestBase, public HtmlTestTools
{
private:
FieldUnit m_eUnit;
@@ -34,19 +33,6 @@ public:
m_eUnit(FUNIT_NONE)
{}
-protected:
- htmlDocPtr parseHtml()
- {
- SvFileStream aFileStream(m_aTempFile.GetURL(), STREAM_READ);
- sal_Size nSize = aFileStream.remainingSize();
-
- ByteSequence aBuffer(nSize + 1);
- aFileStream.Read(aBuffer.getArray(), nSize);
-
- aBuffer[nSize] = 0;
- return htmlParseDoc(reinterpret_cast<xmlChar*>(aBuffer.getArray()), NULL);
- }
-
private:
bool mustCalcLayoutOf(const char* filename) SAL_OVERRIDE
{
@@ -119,7 +105,7 @@ DECLARE_HTMLEXPORT_ROUNDTRIP_TEST(testCharacterBorder, "charborder.odt")
DECLARE_HTMLEXPORT_TEST(testExportOfImages, "textAndImage.docx")
{
- htmlDocPtr pDoc = parseHtml();
+ htmlDocPtr pDoc = parseHtml(m_aTempFile);
if (pDoc)
{
assertXPath(pDoc, "/html/body", 1);
@@ -129,7 +115,7 @@ DECLARE_HTMLEXPORT_TEST(testExportOfImages, "textAndImage.docx")
DECLARE_HTMLEXPORT_TEST(testExportOfImagesWithSkipImageEnabled, "textAndImage.docx")
{
- htmlDocPtr pDoc = parseHtml();
+ htmlDocPtr pDoc = parseHtml(m_aTempFile);
if (pDoc)
{
assertXPath(pDoc, "/html/body", 1);
diff --git a/sw/qa/extras/inc/swmodeltestbase.hxx b/sw/qa/extras/inc/swmodeltestbase.hxx
index 7a2cf9a438a5..6c5236a6543f 100644
--- a/sw/qa/extras/inc/swmodeltestbase.hxx
+++ b/sw/qa/extras/inc/swmodeltestbase.hxx
@@ -22,6 +22,7 @@
#include <com/sun/star/table/BorderLine2.hpp>
#include <test/bootstrapfixture.hxx>
+#include <test/xmltesttools.hxx>
#include <unotest/macros_test.hxx>
#include <unotools/ucbstreamhelper.hxx>
#include <rtl/strbuf.hxx>
@@ -36,11 +37,6 @@
#include <doc.hxx>
#include <rootfrm.hxx>
-#include <libxml/xmlwriter.h>
-#include <libxml/xpath.h>
-#include <libxml/xpathInternals.h>
-#include <libxml/parserInternals.h>
-
using namespace css;
#define DEFAULT_STYLE "Default Style"
@@ -114,7 +110,7 @@ using namespace css;
void TestName::verify()
/// Base class for filter tests loading or roundtriping a document, then asserting the document model.
-class SwModelTestBase : public test::BootstrapFixture, public unotest::MacrosTest
+class SwModelTestBase : public test::BootstrapFixture, public unotest::MacrosTest, public XmlTestTools
{
OUString maFilterOptions;
protected:
@@ -586,9 +582,8 @@ protected:
/**
* Helper method to return nodes represented by rXPath.
*/
- xmlNodeSetPtr getXPathNode(xmlDocPtr pXmlDoc, const OString& rXPath)
+ virtual void registerNamespaces(xmlXPathContextPtr& pXmlXpathCtx)
{
- xmlXPathContextPtr pXmlXpathCtx = xmlXPathNewContext(pXmlDoc);
xmlXPathRegisterNs(pXmlXpathCtx, BAD_CAST("w"), BAD_CAST("http://schemas.openxmlformats.org/wordprocessingml/2006/main"));
xmlXPathRegisterNs(pXmlXpathCtx, BAD_CAST("v"), BAD_CAST("urn:schemas-microsoft-com:vml"));
xmlXPathRegisterNs(pXmlXpathCtx, BAD_CAST("mc"), BAD_CAST("http://schemas.openxmlformats.org/markup-compatibility/2006"));
@@ -604,102 +599,6 @@ protected:
xmlXPathRegisterNs(pXmlXpathCtx, BAD_CAST("ContentType"), BAD_CAST("http://schemas.openxmlformats.org/package/2006/content-types"));
xmlXPathRegisterNs(pXmlXpathCtx, BAD_CAST("lc"), BAD_CAST("http://schemas.openxmlformats.org/drawingml/2006/lockedCanvas"));
xmlXPathRegisterNs(pXmlXpathCtx, BAD_CAST("extended-properties"), BAD_CAST("http://schemas.openxmlformats.org/officeDocument/2006/extended-properties"));
- xmlXPathObjectPtr pXmlXpathObj = xmlXPathEvalExpression(BAD_CAST(rXPath.getStr()), pXmlXpathCtx);
- return pXmlXpathObj->nodesetval;
- }
-
- /**
- * Same as the assertXPath(), but don't assert: return the string instead.
- */
- OUString getXPath(xmlDocPtr pXmlDoc, const OString& rXPath, const OString& rAttribute)
- {
- xmlNodeSetPtr pXmlNodes = getXPathNode(pXmlDoc, rXPath);
- CPPUNIT_ASSERT_EQUAL_MESSAGE(OString("XPath '" + rXPath + "' number of nodes is incorrect").getStr(),
- 1, xmlXPathNodeSetGetLength(pXmlNodes));
- if (rAttribute.isEmpty())
- return OUString();
- xmlNodePtr pXmlNode = pXmlNodes->nodeTab[0];
- return OUString::createFromAscii((const char*)xmlGetProp(pXmlNode, BAD_CAST(rAttribute.getStr())));
- }
-
- /**
- * Same as the assertXPathContent(), but don't assert: return the string instead.
- */
- OUString getXPathContent(xmlDocPtr pXmlDoc, const OString& rXPath)
- {
- xmlNodeSetPtr pXmlNodes = getXPathNode(pXmlDoc, rXPath);
-
- CPPUNIT_ASSERT_MESSAGE(OString("XPath '" + rXPath + "' not found").getStr(),
- xmlXPathNodeSetGetLength(pXmlNodes) > 0);
-
- xmlNodePtr pXmlNode = pXmlNodes->nodeTab[0];
- return OUString::createFromAscii((const char*)((pXmlNode->children[0]).content));
- }
-
- /**
- * Assert that rXPath exists, and returns exactly one node.
- * In case rAttribute is provided, the rXPath's attribute's value must
- * equal to the rExpected value.
- */
- void assertXPath(xmlDocPtr pXmlDoc, const OString& rXPath, const OString& rAttribute = OString(), const OUString& rExpectedValue = OUString())
- {
- OUString aValue = getXPath(pXmlDoc, rXPath, rAttribute);
- CPPUNIT_ASSERT_EQUAL_MESSAGE(OString("Attribute '" + rAttribute + "' of '" + rXPath + "' incorrect value.").getStr(),
- rExpectedValue, aValue);
- }
-
- /**
- * Assert that rXPath exists, and returns exactly nNumberOfNodes nodes.
- * Useful for checking that we do _not_ export some node (nNumberOfNodes == 0).
- */
- void assertXPath(xmlDocPtr pXmlDoc, const OString& rXPath, int nNumberOfNodes)
- {
- xmlNodeSetPtr pXmlNodes = getXPathNode(pXmlDoc, rXPath);
- CPPUNIT_ASSERT_EQUAL_MESSAGE(OString("XPath '" + rXPath + "' number of nodes is incorrect").getStr(),
- nNumberOfNodes, xmlXPathNodeSetGetLength(pXmlNodes));
- }
-
- /**
- * Assert that rXPath exists, and its content equals rContent.
- */
- void assertXPathContent(xmlDocPtr pXmlDoc, const OString& rXPath, const OUString& rContent)
- {
- CPPUNIT_ASSERT_EQUAL_MESSAGE("XPath contents of child does not match", rContent, getXPathContent(pXmlDoc, rXPath));
- }
-
- /**
- * Assert that rXPath exists, and has exactly nNumberOfChildNodes child nodes.
- * Useful for checking that we do have a no child nodes to a specific node (nNumberOfChildNodes == 0).
- */
- void assertXPathChildren(xmlDocPtr pXmlDoc, const OString& rXPath, int nNumberOfChildNodes)
- {
- 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];
- CPPUNIT_ASSERT_EQUAL_MESSAGE(OString("XPath '" + rXPath + "' number of child-nodes is incorrect").getStr(),
- nNumberOfChildNodes, (int)xmlChildElementCount(pXmlNode));
- }
-
- /**
- * 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& 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;
}
uno::Reference<lang::XComponent> mxComponent;
diff --git a/test/Library_test.mk b/test/Library_test.mk
index ba304a56bf53..ec46f2cc4adc 100644
--- a/test/Library_test.mk
+++ b/test/Library_test.mk
@@ -45,6 +45,8 @@ endif
$(eval $(call gb_Library_add_exception_objects,test,\
test/source/bootstrapfixture \
test/source/diff/diff \
+ test/source/xmltesttools \
+ test/source/htmltesttools \
))
# vim: set noet sw=4 ts=4:
diff --git a/test/source/htmltesttools.cxx b/test/source/htmltesttools.cxx
new file mode 100644
index 000000000000..9b264bb3f4e9
--- /dev/null
+++ b/test/source/htmltesttools.cxx
@@ -0,0 +1,26 @@
+/* -*- 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/.
+ */
+
+#include <test/htmltesttools.hxx>
+
+htmlDocPtr HtmlTestTools::parseHtml(utl::TempFile& aTempFile)
+{
+ SvFileStream aFileStream(aTempFile.GetURL(), STREAM_READ);
+ sal_Size nSize = aFileStream.remainingSize();
+
+ boost::scoped_array<sal_uInt8> pBuffer(new sal_uInt8[nSize + 1]);
+
+ aFileStream.Read(pBuffer.get(), nSize);
+
+ pBuffer[nSize] = 0;
+
+ return htmlParseDoc(reinterpret_cast<xmlChar*>(pBuffer.get()), NULL);
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/test/source/xmltesttools.cxx b/test/source/xmltesttools.cxx
new file mode 100644
index 000000000000..98153518fcf7
--- /dev/null
+++ b/test/source/xmltesttools.cxx
@@ -0,0 +1,124 @@
+/* -*- 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/.
+ */
+
+#include <test/xmltesttools.hxx>
+
+XmlTestTools::XmlTestTools()
+{}
+
+XmlTestTools::~XmlTestTools()
+{}
+
+xmlNodeSetPtr XmlTestTools::getXPathNode(xmlDocPtr pXmlDoc, const OString& rXPath)
+{
+ xmlXPathContextPtr pXmlXpathCtx = xmlXPathNewContext(pXmlDoc);
+ registerNamespaces(pXmlXpathCtx);
+ xmlXPathObjectPtr pXmlXpathObj = xmlXPathEvalExpression(BAD_CAST(rXPath.getStr()), pXmlXpathCtx);
+ return pXmlXpathObj->nodesetval;
+}
+
+void XmlTestTools::registerNamespaces(xmlXPathContextPtr& /*pXmlXpathCtx*/)
+{
+}
+
+/**
+ * Same as the assertXPath(), but don't assert: return the string instead.
+ */
+OUString XmlTestTools::getXPath(xmlDocPtr pXmlDoc, const OString& rXPath, const OString& rAttribute)
+{
+ xmlNodeSetPtr pXmlNodes = getXPathNode(pXmlDoc, rXPath);
+ CPPUNIT_ASSERT_EQUAL_MESSAGE(OString("XPath '" + rXPath + "' number of nodes is incorrect").getStr(),
+ 1, xmlXPathNodeSetGetLength(pXmlNodes));
+ if (rAttribute.isEmpty())
+ return OUString();
+ xmlNodePtr pXmlNode = pXmlNodes->nodeTab[0];
+ return OUString::createFromAscii((const char*)xmlGetProp(pXmlNode, BAD_CAST(rAttribute.getStr())));
+}
+
+/**
+ * Same as the assertXPathContent(), but don't assert: return the string instead.
+ */
+OUString XmlTestTools::getXPathContent(xmlDocPtr pXmlDoc, const OString& rXPath)
+{
+ xmlNodeSetPtr pXmlNodes = getXPathNode(pXmlDoc, rXPath);
+
+ CPPUNIT_ASSERT_MESSAGE(OString("XPath '" + rXPath + "' not found").getStr(),
+ xmlXPathNodeSetGetLength(pXmlNodes) > 0);
+
+ xmlNodePtr pXmlNode = pXmlNodes->nodeTab[0];
+ return OUString::createFromAscii((const char*)((pXmlNode->children[0]).content));
+}
+
+/**
+ * Assert that rXPath exists, and returns exactly one node.
+ * In case rAttribute is provided, the rXPath's attribute's value must
+ * equal to the rExpected value.
+ */
+void XmlTestTools::assertXPath(xmlDocPtr pXmlDoc, const OString& rXPath, const OString& rAttribute, const OUString& rExpectedValue)
+{
+ OUString aValue = getXPath(pXmlDoc, rXPath, rAttribute);
+ CPPUNIT_ASSERT_EQUAL_MESSAGE(OString("Attribute '" + rAttribute + "' of '" + rXPath + "' incorrect value.").getStr(),
+ rExpectedValue, aValue);
+}
+
+/**
+ * Assert that rXPath exists, and returns exactly nNumberOfNodes nodes.
+ * Useful for checking that we do _not_ export some node (nNumberOfNodes == 0).
+ */
+void XmlTestTools::assertXPath(xmlDocPtr pXmlDoc, const OString& rXPath, int nNumberOfNodes)
+{
+ xmlNodeSetPtr pXmlNodes = getXPathNode(pXmlDoc, rXPath);
+ CPPUNIT_ASSERT_EQUAL_MESSAGE(OString("XPath '" + rXPath + "' number of nodes is incorrect").getStr(),
+ nNumberOfNodes, xmlXPathNodeSetGetLength(pXmlNodes));
+}
+
+/**
+ * Assert that rXPath exists, and its content equals rContent.
+ */
+void XmlTestTools::assertXPathContent(xmlDocPtr pXmlDoc, const OString& rXPath, const OUString& rContent)
+{
+ CPPUNIT_ASSERT_EQUAL_MESSAGE("XPath contents of child does not match", rContent, getXPathContent(pXmlDoc, rXPath));
+}
+
+/**
+ * Assert that rXPath exists, and has exactly nNumberOfChildNodes child nodes.
+ * Useful for checking that we do have a no child nodes to a specific node (nNumberOfChildNodes == 0).
+ */
+void XmlTestTools::assertXPathChildren(xmlDocPtr pXmlDoc, const OString& rXPath, int nNumberOfChildNodes)
+{
+ 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];
+ CPPUNIT_ASSERT_EQUAL_MESSAGE(OString("XPath '" + rXPath + "' number of child-nodes is incorrect").getStr(),
+ nNumberOfChildNodes, (int)xmlChildElementCount(pXmlNode));
+}
+
+/**
+ * Get the position of the child named rName of the parent node specified by rXPath.
+ * Useful for checking relative order of elements.
+ */
+int XmlTestTools::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;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */