summaryrefslogtreecommitdiff
path: root/sw/qa/inc/swmodeltestbase.hxx
diff options
context:
space:
mode:
Diffstat (limited to 'sw/qa/inc/swmodeltestbase.hxx')
-rw-r--r--sw/qa/inc/swmodeltestbase.hxx752
1 files changed, 65 insertions, 687 deletions
diff --git a/sw/qa/inc/swmodeltestbase.hxx b/sw/qa/inc/swmodeltestbase.hxx
index a0170896ac80..6193be33afc3 100644
--- a/sw/qa/inc/swmodeltestbase.hxx
+++ b/sw/qa/inc/swmodeltestbase.hxx
@@ -11,44 +11,23 @@
#define INCLUDED_SW_QA_INC_SWMODELTESTBASE_HXX
#include <memory>
-#include <com/sun/star/container/XContentEnumerationAccess.hpp>
+#include <com/sun/star/beans/XPropertySet.hpp>
#include <com/sun/star/container/XNameAccess.hpp>
-#include <com/sun/star/document/XFilter.hpp>
-#include <com/sun/star/document/XImporter.hpp>
-#include <com/sun/star/frame/Desktop.hpp>
-#include <com/sun/star/packages/zip/ZipFileAccess.hpp>
-#include <com/sun/star/style/XStyleFamiliesSupplier.hpp>
-#include <com/sun/star/style/XAutoStylesSupplier.hpp>
+#include <com/sun/star/drawing/XShape.hpp>
#include <com/sun/star/style/XAutoStyleFamily.hpp>
-#include <com/sun/star/text/XPageCursor.hpp>
-#include <com/sun/star/text/XTextDocument.hpp>
#include <com/sun/star/text/XTextRange.hpp>
-#include <com/sun/star/text/XTextTable.hpp>
-#include <com/sun/star/text/XTextViewCursorSupplier.hpp>
#include <com/sun/star/table/XCell.hpp>
#include <com/sun/star/table/BorderLine2.hpp>
#include <com/sun/star/xml/AttributeData.hpp>
+#include "swqahelperdllapi.h"
#include <test/bootstrapfixture.hxx>
#include <test/xmltesttools.hxx>
#include <test/testinteractionhandler.hxx>
#include <unotest/macros_test.hxx>
-#include <unotools/streamwrap.hxx>
-#include <unotools/ucbstreamhelper.hxx>
-#include <rtl/ustrbuf.hxx>
-#include <sfx2/app.hxx>
-#include <comphelper/processfactory.hxx>
-#include <comphelper/sequence.hxx>
#include <unotools/tempfile.hxx>
-#include <unotools/mediadescriptor.hxx>
-#include <unotxdoc.hxx>
-#include <docsh.hxx>
#include <doc.hxx>
-#include <IDocumentLayoutAccess.hxx>
-#include <rootfrm.hxx>
-
-using namespace css;
/**
* Macro to declare a new test (with full round-trip. To test
@@ -140,7 +119,7 @@ using namespace css;
void TestName::verify()
/// Base class for filter tests loading or roundtripping a document, then asserting the document model.
-class SwModelTestBase : public test::BootstrapFixture, public unotest::MacrosTest, public XmlTestTools
+class SWQAHELPER_DLLPUBLIC SwModelTestBase : public test::BootstrapFixture, public unotest::MacrosTest, public XmlTestTools
{
private:
OUString maFilterOptions;
@@ -148,7 +127,7 @@ private:
OUString maImportFilterName;
protected:
- uno::Reference< lang::XComponent > mxComponent;
+ css::uno::Reference< css::lang::XComponent > mxComponent;
rtl::Reference<TestInteractionHandler> xInteractionHandler;
@@ -189,27 +168,7 @@ protected:
virtual OUString getTestName() { return OUString(); }
/// Copy&paste helper.
- void paste(const OUString& aFilename, uno::Reference<text::XTextRange> const& xTextRange)
- {
- uno::Reference<document::XFilter> xFilter(
- m_xSFactory->createInstance("com.sun.star.comp.Writer.RtfFilter"),
- uno::UNO_QUERY_THROW);
- uno::Reference<document::XImporter> xImporter(xFilter, uno::UNO_QUERY_THROW);
- xImporter->setTargetDocument(mxComponent);
- uno::Sequence<beans::PropertyValue> aDescriptor(3);
- aDescriptor[0].Name = "InputStream";
- std::unique_ptr<SvStream> pStream = utl::UcbStreamHelper::CreateStream(
- m_directories.getURLFromSrc("/sw/qa/extras/") + aFilename,
- StreamMode::STD_READ);
- CPPUNIT_ASSERT_EQUAL(ERRCODE_NONE, pStream->GetError());
- uno::Reference<io::XStream> xStream(new utl::OStreamWrapper(std::move(pStream)));
- aDescriptor[0].Value <<= xStream;
- aDescriptor[1].Name = "InsertMode";
- aDescriptor[1].Value <<= true;
- aDescriptor[2].Name = "TextInsertModeRange";
- aDescriptor[2].Value <<= xTextRange;
- CPPUNIT_ASSERT(xFilter->filter(aDescriptor));
- }
+ void paste(const OUString& aFilename, css::uno::Reference<css::text::XTextRange> const& xTextRange);
public:
void setFilterOptions(const OUString &rFilterOptions)
@@ -227,90 +186,32 @@ public:
maImportFilterName = rFilterName;
}
- SwModelTestBase(const OUString& pTestDocumentPath = OUString(), const char* pFilter = "")
- : mpXmlBuffer(nullptr)
- , mpTestDocumentPath(pTestDocumentPath)
- , mpFilter(pFilter)
- , mnStartTime(0)
- , mbExported(false)
- {
- maTempFile.EnableKillingFile();
- }
-
- virtual void setUp() override
- {
- test::BootstrapFixture::setUp();
- mxDesktop.set(css::frame::Desktop::create(comphelper::getComponentContext(getMultiServiceFactory())));
- SfxApplication::GetOrCreate();
- }
+ SwModelTestBase(const OUString& pTestDocumentPath = OUString(), const char* pFilter = "");
- virtual void tearDown() override
- {
- if (mxComponent.is())
- mxComponent->dispose();
+ void setUp() override;
- test::BootstrapFixture::tearDown();
- }
+ void tearDown() override;
protected:
/**
* Helper func used by each unit test to test the 'import' code.
* (Loads the requested file and then calls 'verify' method)
*/
- void executeImportTest(const char* filename, const char* pPassword = nullptr)
- {
- // If the testcase is stored in some other format, it's pointless to test.
- if (mustTestImportOf(filename))
- {
- maTempFile.EnableKillingFile(false);
- header();
- std::unique_ptr<Resetter> const pChanges(preTest(filename));
- load(mpTestDocumentPath, filename, pPassword);
- verify();
- finish();
- maTempFile.EnableKillingFile();
- }
- }
+ void executeImportTest(const char* filename, const char* pPassword = nullptr);
/**
* Helper func used by each unit test to test the 'export' code.
* (Loads the requested file, calls 'verify' function, save it to temp file, load the
* temp file and then calls 'verify' function again)
*/
- void executeLoadVerifyReloadVerify(const char* filename, const char* pPassword = nullptr)
- {
- maTempFile.EnableKillingFile(false);
- header();
- std::unique_ptr<Resetter> const pChanges(preTest(filename));
- load(mpTestDocumentPath, filename, pPassword);
- if (mustTestImportOf(filename))
- {
- verify();
- }
- postLoad(filename);
- reload(mpFilter, filename, pPassword);
- verify();
- finish();
- maTempFile.EnableKillingFile();
- }
+ void executeLoadVerifyReloadVerify(const char* filename, const char* pPassword = nullptr);
/**
* Helper func used by each unit test to test the 'export' code.
* (Loads the requested file, save it to temp file, load the
* temp file and then calls 'verify' method)
*/
- void executeLoadReloadVerify(const char* filename, const char* pPassword = nullptr)
- {
- maTempFile.EnableKillingFile(false);
- header();
- std::unique_ptr<Resetter> const pChanges(preTest(filename));
- load(mpTestDocumentPath, filename, pPassword);
- postLoad(filename);
- reload(mpFilter, filename, pPassword);
- verify();
- finish();
- maTempFile.EnableKillingFile();
- }
+ void executeLoadReloadVerify(const char* filename, const char* pPassword = nullptr);
/**
* Helper func used by each unit test to test the 'export' code.
@@ -318,18 +219,7 @@ protected:
* the initial document condition), exports with the desired
* export filter and then calls 'verify' method)
*/
- void executeImportExport(const char* filename, const char* pPassword)
- {
- maTempFile.EnableKillingFile(false);
- header();
- std::unique_ptr<Resetter> const pChanges(preTest(filename));
- load(mpTestDocumentPath, filename, pPassword);
- save(OUString::createFromAscii(mpFilter), maTempFile);
- maTempFile.EnableKillingFile(false);
- verify();
- finish();
- maTempFile.EnableKillingFile();
- }
+ void executeImportExport(const char* filename, const char* pPassword);
/**
* Function overridden by unit test. See DECLARE_SW_*_TEST macros
@@ -376,137 +266,35 @@ protected:
}
protected:
- void dumpLayout(const uno::Reference< lang::XComponent > & rComponent)
- {
- // create the xml writer
- mpXmlBuffer = xmlBufferCreate();
- xmlTextWriterPtr pXmlWriter = xmlNewTextWriterMemory(mpXmlBuffer, 0);
- xmlTextWriterStartDocument(pXmlWriter, nullptr, nullptr, nullptr);
-
- // create the dump
- SwXTextDocument* pTextDoc = dynamic_cast<SwXTextDocument *>(rComponent.get());
- CPPUNIT_ASSERT(pTextDoc);
- SwDoc* pDoc = pTextDoc->GetDocShell()->GetDoc();
- SwRootFrame* pLayout = pDoc->getIDocumentLayoutAccess().GetCurrentLayout();
- pLayout->dumpAsXml(pXmlWriter);
-
- // delete xml writer
- xmlTextWriterEndDocument(pXmlWriter);
- xmlFreeTextWriter(pXmlWriter);
- }
+ void dumpLayout(const css::uno::Reference< css::lang::XComponent > & rComponent);
- void discardDumpedLayout()
- {
- if (mpXmlBuffer)
- {
- xmlBufferFree(mpXmlBuffer);
- mpXmlBuffer = nullptr;
- }
- }
+ void discardDumpedLayout();
- void calcLayout()
- {
- SwXTextDocument* pTextDoc = dynamic_cast<SwXTextDocument *>(mxComponent.get());
- CPPUNIT_ASSERT(pTextDoc);
- SwDoc* pDoc = pTextDoc->GetDocShell()->GetDoc();
- pDoc->getIDocumentLayoutAccess().GetCurrentViewShell()->CalcLayout();
- }
+ void calcLayout();
/// Get the length of the whole document.
- int getLength() const
- {
- uno::Reference<text::XTextDocument> xTextDocument(mxComponent, uno::UNO_QUERY);
- uno::Reference<container::XEnumerationAccess> xParaEnumAccess(xTextDocument->getText(), uno::UNO_QUERY);
- uno::Reference<container::XEnumeration> xParaEnum = xParaEnumAccess->createEnumeration();
- OUStringBuffer aBuf;
- while (xParaEnum->hasMoreElements())
- {
- uno::Reference<container::XEnumerationAccess> xRangeEnumAccess(xParaEnum->nextElement(), uno::UNO_QUERY);
- uno::Reference<container::XEnumeration> xRangeEnum = xRangeEnumAccess->createEnumeration();
- while (xRangeEnum->hasMoreElements())
- {
- uno::Reference<text::XTextRange> xRange(xRangeEnum->nextElement(), uno::UNO_QUERY);
- aBuf.append(xRange->getString());
- }
- }
- return aBuf.getLength();
- }
+ int getLength() const;
/// Get a family of styles, see com.sun.star.style.StyleFamilies for possible values.
- uno::Reference<container::XNameAccess> getStyles(const OUString& aFamily)
- {
- uno::Reference<style::XStyleFamiliesSupplier> xStyleFamiliesSupplier(mxComponent, uno::UNO_QUERY);
- uno::Reference<container::XNameAccess> xStyleFamilies = xStyleFamiliesSupplier->getStyleFamilies();
- uno::Reference<container::XNameAccess> xStyleFamily(xStyleFamilies->getByName(aFamily), uno::UNO_QUERY);
- return xStyleFamily;
- }
+ css::uno::Reference<css::container::XNameAccess> getStyles(const OUString& aFamily);
/// Get a family of auto styles, see com.sun.star.style.StyleFamilies for possible values.
- uno::Reference<style::XAutoStyleFamily> getAutoStyles(const OUString& aFamily)
- {
- uno::Reference< style::XAutoStylesSupplier > xAutoStylesSupplier(mxComponent, uno::UNO_QUERY);
- uno::Reference< style::XAutoStyles > xAutoStyles(xAutoStylesSupplier->getAutoStyles());
- uno::Reference< style::XAutoStyleFamily > xAutoStyleFamily(xAutoStyles->getByName(aFamily), uno::UNO_QUERY);
- return xAutoStyleFamily;
- }
+ css::uno::Reference<css::style::XAutoStyleFamily> getAutoStyles(const OUString& aFamily);
/// Similar to parseExport(), but this gives the xmlDocPtr of the layout dump.
- xmlDocUniquePtr parseLayoutDump()
- {
- if (!mpXmlBuffer)
- dumpLayout(mxComponent);
-
- return xmlDocUniquePtr(xmlParseMemory(reinterpret_cast<const char*>(xmlBufferContent(mpXmlBuffer)), xmlBufferLength(mpXmlBuffer)));
- }
+ xmlDocUniquePtr parseLayoutDump();
/**
* Extract a value from the layout dump using an XPath expression and an attribute name.
*
* If the attribute is omitted, the text of the node is returned.
*/
- OUString parseDump(const OString& aXPath, const OString& aAttribute = OString())
- {
- xmlDocUniquePtr pXmlDoc = parseLayoutDump();
-
- xmlXPathContextPtr pXmlXpathCtx = xmlXPathNewContext(pXmlDoc.get());
- xmlXPathObjectPtr pXmlXpathObj = xmlXPathEvalExpression(BAD_CAST(aXPath.getStr()), pXmlXpathCtx);
- CPPUNIT_ASSERT_MESSAGE("xpath evaluation failed", pXmlXpathObj);
- xmlChar *pXpathStrResult;
- if (pXmlXpathObj->type == XPATH_NODESET)
- {
- xmlNodeSetPtr pXmlNodes = pXmlXpathObj->nodesetval;
- CPPUNIT_ASSERT_EQUAL_MESSAGE("xpath should match exactly 1 node",
- 1, xmlXPathNodeSetGetLength(pXmlNodes));
- xmlNodePtr pXmlNode = pXmlNodes->nodeTab[0];
- if (aAttribute.getLength())
- pXpathStrResult = xmlGetProp(pXmlNode, BAD_CAST(aAttribute.getStr()));
- else
- pXpathStrResult = xmlNodeGetContent(pXmlNode);
- }
- else
- {
- // the xpath expression evaluated to a value, not a node
- CPPUNIT_ASSERT_EQUAL_MESSAGE(
- "attr name should not be supplied when xpath evals to a value",
- sal_Int32(0), aAttribute.getLength());
- pXpathStrResult = xmlXPathCastToString(pXmlXpathObj);
- CPPUNIT_ASSERT_MESSAGE("xpath result cannot be cast to string",
- pXpathStrResult);
- }
-
- OUString aRet(reinterpret_cast<char*>(pXpathStrResult),
- xmlStrlen(pXpathStrResult), RTL_TEXTENCODING_UTF8);
- xmlFree(pXpathStrResult);
- xmlFree(pXmlXpathObj);
- xmlFree(pXmlXpathCtx);
-
- return aRet;
- }
+ OUString parseDump(const OString& aXPath, const OString& aAttribute = OString());
template< typename T >
- T getProperty( const uno::Any& obj, const OUString& name ) const
+ T getProperty( const css::uno::Any& obj, const OUString& name ) const
{
- uno::Reference< beans::XPropertySet > properties( obj, uno::UNO_QUERY_THROW );
+ css::uno::Reference< css::beans::XPropertySet > properties( obj, uno::UNO_QUERY_THROW );
T data;
if (!css::uno::fromAny(properties->getPropertyValue(name), &data))
{
@@ -518,9 +306,9 @@ protected:
}
template< typename T >
- T getProperty( const uno::Reference< uno::XInterface >& obj, const OUString& name ) const
+ T getProperty( const css::uno::Reference< css::uno::XInterface >& obj, const OUString& name ) const
{
- uno::Reference< beans::XPropertySet > properties( obj, uno::UNO_QUERY_THROW );
+ css::uno::Reference< css::beans::XPropertySet > properties( obj, uno::UNO_QUERY_THROW );
T data = T();
if (!(properties->getPropertyValue(name) >>= data))
{
@@ -531,200 +319,47 @@ protected:
return data;
}
- bool hasProperty(const uno::Reference<uno::XInterface>& obj, const OUString& name) const
- {
- uno::Reference<beans::XPropertySet> properties(obj, uno::UNO_QUERY_THROW);
- return properties->getPropertySetInfo()->hasPropertyByName(name);
- }
-
- xml::AttributeData getUserDefineAttribute(const uno::Any& obj, const OUString& name, const OUString& rValue) const
- {
- uno::Reference<container::XNameContainer> attrsCnt(getProperty<uno::Any>(obj, "UserDefinedAttributes"), uno::UNO_QUERY_THROW);
-
- xml::AttributeData aValue;
- attrsCnt->getByName(name) >>= aValue;
- if (!rValue.isEmpty())
- CPPUNIT_ASSERT_EQUAL_MESSAGE("attribute of cell does not contain expected value", rValue, aValue.Value);
+ bool hasProperty(const css::uno::Reference<css::uno::XInterface>& obj, const OUString& name) const;
- return aValue;
- }
+ css::xml::AttributeData getUserDefineAttribute(const css::uno::Any& obj, const OUString& name, const OUString& rValue) const;
- int getParagraphs( uno::Reference<text::XText> const & xText )
- {
- int nRet = 0;
- if ( ! xText.is() )
- return nRet;
-
- uno::Reference<container::XEnumerationAccess> xParaEnumAccess(xText->getText(), uno::UNO_QUERY);
- uno::Reference<container::XEnumeration> xParaEnum = xParaEnumAccess->createEnumeration();
- while (xParaEnum->hasMoreElements())
- {
- xParaEnum->nextElement();
- nRet++;
- }
- return nRet;
- }
+ int getParagraphs( css::uno::Reference<text::XText> const & xText );
/// Get number of paragraphs of the document.
- int getParagraphs()
- {
- uno::Reference<text::XTextDocument> xTextDocument(mxComponent, uno::UNO_QUERY);
- return getParagraphs( xTextDocument->getText() );
- }
+ int getParagraphs();
- uno::Reference<text::XTextContent> getParagraphOrTable(int number, uno::Reference<text::XText> const & xText = uno::Reference<text::XText>()) const
- {
- assert(number != 0); // this thing is 1-based
- uno::Reference<container::XEnumerationAccess> paraEnumAccess;
- if (xText.is())
- paraEnumAccess.set(xText, uno::UNO_QUERY);
- else
- {
- uno::Reference<text::XTextDocument> textDocument(mxComponent, uno::UNO_QUERY);
- paraEnumAccess.set(textDocument->getText(), uno::UNO_QUERY);
- }
- uno::Reference<container::XEnumeration> paraEnum = paraEnumAccess->createEnumeration();
- for( int i = 1;
- i < number;
- ++i )
- paraEnum->nextElement();
- uno::Reference< text::XTextContent> const xElem(paraEnum->nextElement(),
- uno::UNO_QUERY_THROW);
- return xElem;
- }
+ css::uno::Reference<css::text::XTextContent> getParagraphOrTable(int number, css::uno::Reference<css::text::XText> const & xText = css::uno::Reference<css::text::XText>()) const;
// Get paragraph (counted from 1), optionally check it contains the given text.
- uno::Reference< text::XTextRange > getParagraph( int number, const OUString& content = OUString() ) const
- {
- uno::Reference<text::XTextRange> const xParagraph(
- getParagraphOrTable(number), uno::UNO_QUERY_THROW);
- if( !content.isEmpty())
- CPPUNIT_ASSERT_EQUAL_MESSAGE( "paragraph does not have expected content", content, xParagraph->getString());
- return xParagraph;
- }
+ css::uno::Reference< css::text::XTextRange > getParagraph( int number, const OUString& content = OUString() ) const;
- sal_Int16 getNumberingTypeOfParagraph(int nPara)
- {
- sal_Int16 nNumberingType = -1;
- uno::Reference<text::XTextRange> xPara(getParagraph(nPara));
- uno::Reference< beans::XPropertySet > properties( xPara, uno::UNO_QUERY);
- bool isNumber = false;
- properties->getPropertyValue("NumberingIsNumber") >>= isNumber;
- if (isNumber)
- {
- uno::Reference<container::XIndexAccess> xLevels( properties->getPropertyValue("NumberingRules"), uno::UNO_QUERY);
- sal_Int16 nNumberingLevel = -1;
- properties->getPropertyValue("NumberingLevel") >>= nNumberingLevel;
- if (nNumberingLevel >= 0 && nNumberingLevel < xLevels->getCount())
- {
- uno::Sequence< beans::PropertyValue > aPropertyValue;
- xLevels->getByIndex(nNumberingLevel) >>= aPropertyValue;
- auto pProp = std::find_if(aPropertyValue.begin(), aPropertyValue.end(),
- [](const beans::PropertyValue& rProp) { return rProp.Name == "NumberingType"; });
- if (pProp != aPropertyValue.end())
- nNumberingType = pProp->Value.get<sal_Int16>();
- }
- }
- return nNumberingType;
- }
+ sal_Int16 getNumberingTypeOfParagraph(int nPara);
- uno::Reference<text::XTextRange> getParagraphOfText(int number, uno::Reference<text::XText> const & xText, const OUString& content = OUString()) const
- {
- uno::Reference<text::XTextRange> const xParagraph(getParagraphOrTable(number, xText), uno::UNO_QUERY_THROW);
- if (!content.isEmpty())
- CPPUNIT_ASSERT_EQUAL_MESSAGE( "paragraph does not contain expected content", content, xParagraph->getString());
- return xParagraph;
- }
+ css::uno::Reference<css::text::XTextRange> getParagraphOfText(int number, css::uno::Reference<css::text::XText> const & xText, const OUString& content = OUString()) const;
/// get nth object/fly that is anchored AT paragraph
- uno::Reference<beans::XPropertySet> getParagraphAnchoredObject(
- int const index, uno::Reference<text::XTextRange> const & xPara) const
- {
- uno::Reference<container::XContentEnumerationAccess> xContentEnumAccess(xPara, uno::UNO_QUERY);
- uno::Reference<container::XEnumeration> xContentEnum = xContentEnumAccess->createContentEnumeration("com.sun.star.text.TextContent");
- for (int i = 1; i < index; ++i)
- {
- xContentEnum->nextElement();
- }
- return uno::Reference<beans::XPropertySet>(xContentEnum->nextElement(), uno::UNO_QUERY);
- }
+ css::uno::Reference<css::beans::XPropertySet> getParagraphAnchoredObject(
+ int const index, css::uno::Reference<css::text::XTextRange> const & xPara) const;
/// Get run (counted from 1) of a paragraph, optionally check it contains the given text.
- uno::Reference<text::XTextRange> getRun(uno::Reference<text::XTextRange> const & xParagraph, int number, const OUString& content = OUString()) const
- {
- uno::Reference<container::XEnumerationAccess> xRunEnumAccess(xParagraph, uno::UNO_QUERY);
- uno::Reference<container::XEnumeration> xRunEnum = xRunEnumAccess->createEnumeration();
- for (int i = 1; i < number; ++i)
- xRunEnum->nextElement();
- uno::Reference<text::XTextRange> xRun(xRunEnum->nextElement(), uno::UNO_QUERY);
- if( !content.isEmpty())
- CPPUNIT_ASSERT_EQUAL_MESSAGE( "run does not contain expected content", content, xRun->getString());
- return xRun;
- }
+ css::uno::Reference<css::text::XTextRange> getRun(uno::Reference<css::text::XTextRange> const & xParagraph, int number, const OUString& content = OUString()) const;
/// Get math formula string of a run.
- OUString getFormula(uno::Reference<text::XTextRange> const & xRun) const
- {
- uno::Reference<container::XContentEnumerationAccess> xContentEnumAccess(xRun, uno::UNO_QUERY);
- uno::Reference<container::XEnumeration> xContentEnum = xContentEnumAccess->createContentEnumeration("");
- uno::Reference<beans::XPropertySet> xFormula(xContentEnum->nextElement(), uno::UNO_QUERY);
- return getProperty<OUString>(getProperty< uno::Reference<beans::XPropertySet> >(xFormula, "Model"), "Formula");
- }
+ OUString getFormula(css::uno::Reference<css::text::XTextRange> const & xRun) const;
/// get cell of a table; table can be retrieved with getParagraphOrTable
- uno::Reference<table::XCell> getCell(
- uno::Reference<uno::XInterface> const& xTableIfc,
- OUString const& rCell, OUString const& rContent = OUString())
- {
- uno::Reference<text::XTextTable> const xTable(xTableIfc,
- uno::UNO_QUERY_THROW);
- uno::Reference<table::XCell> const xCell(
- xTable->getCellByName(rCell), uno::UNO_SET_THROW);
- if (!rContent.isEmpty())
- {
- uno::Reference<text::XText> const xCellText(xCell,
- uno::UNO_QUERY_THROW);
- CPPUNIT_ASSERT_EQUAL_MESSAGE("cell does not contain expected content", rContent, xCellText->getString());
- }
- return xCell;
- }
+ css::uno::Reference<css::table::XCell> getCell(
+ css::uno::Reference<css::uno::XInterface> const& xTableIfc,
+ OUString const& rCell, OUString const& rContent = OUString());
/// Get shape (counted from 1)
- uno::Reference<drawing::XShape> getShape(int number)
- {
- uno::Reference<drawing::XDrawPageSupplier> xDrawPageSupplier(mxComponent, uno::UNO_QUERY);
- uno::Reference<drawing::XDrawPage> xDrawPage = xDrawPageSupplier->getDrawPage();
- uno::Reference<drawing::XShape> xShape(xDrawPage->getByIndex(number - 1), uno::UNO_QUERY);
- return xShape;
- }
+ css::uno::Reference<css::drawing::XShape> getShape(int number);
/// Get shape by name
- uno::Reference<drawing::XShape> getShapeByName(const OUString& aName)
- {
- uno::Reference<drawing::XShape> xRet;
-
- uno::Reference<drawing::XDrawPageSupplier> xDrawPageSupplier(mxComponent, uno::UNO_QUERY);
- uno::Reference<drawing::XDrawPage> xDrawPage = xDrawPageSupplier->getDrawPage();
- for (sal_Int32 i = 0; i < xDrawPage->getCount(); ++i)
- {
- uno::Reference<container::XNamed> xShape(xDrawPage->getByIndex(i), uno::UNO_QUERY);
- if (xShape->getName() == aName)
- {
- xRet.set(xShape, uno::UNO_QUERY);
- break;
- }
- }
+ css::uno::Reference<css::drawing::XShape> getShapeByName(const OUString& aName);
- return xRet;
- }
/// Get TextFrame by name
- uno::Reference<drawing::XShape> getTextFrameByName(const OUString& aName)
- {
- uno::Reference<text::XTextFramesSupplier> xTextFramesSupplier(mxComponent, uno::UNO_QUERY);
- uno::Reference<container::XNameAccess> xNameAccess = xTextFramesSupplier->getTextFrames();
- uno::Reference<drawing::XShape> xShape(xNameAccess->getByName(aName), uno::UNO_QUERY);
- return xShape;
- }
+ css::uno::Reference<css::drawing::XShape> getTextFrameByName(const OUString& aName);
void header()
{
@@ -736,190 +371,22 @@ protected:
return loadURL(m_directories.getURLFromSrc(pDir) + OUString::createFromAscii(pName), pName, pPassword);
}
- void setTestInteractionHandler(const char* pPassword, std::vector<beans::PropertyValue>& rFilterOptions)
- {
- OUString sPassword = OUString::createFromAscii(pPassword);
- rFilterOptions.emplace_back();
- xInteractionHandler = rtl::Reference<TestInteractionHandler>(new TestInteractionHandler(sPassword));
- uno::Reference<task::XInteractionHandler2> const xInteraction(xInteractionHandler.get());
- rFilterOptions[0].Name = "InteractionHandler";
- rFilterOptions[0].Value <<= xInteraction;
- }
-
- void loadURL(OUString const& rURL, const char* pName, const char* pPassword = nullptr)
- {
- if (mxComponent.is())
- mxComponent->dispose();
-
- std::vector<beans::PropertyValue> aFilterOptions;
+ void setTestInteractionHandler(const char* pPassword, std::vector<beans::PropertyValue>& rFilterOptions);
- if (pPassword)
- {
- setTestInteractionHandler(pPassword, aFilterOptions);
- }
-
- if (!maImportFilterOptions.isEmpty())
- {
- beans::PropertyValue aValue;
- aValue.Name = "FilterOptions";
- aValue.Value <<= maImportFilterOptions;
- aFilterOptions.push_back(aValue);
- }
+ void loadURL(OUString const& rURL, const char* pName, const char* pPassword = nullptr);
- if (!maImportFilterName.isEmpty())
- {
- beans::PropertyValue aValue;
- aValue.Name = "FilterName";
- aValue.Value <<= maImportFilterName;
- aFilterOptions.push_back(aValue);
- }
-
- // Output name early, so in the case of a hang, the name of the hanging input file is visible.
- if (pName)
- std::cout << pName << ":\n";
- mnStartTime = osl_getGlobalTimer();
- mxComponent = loadFromDesktop(rURL, "com.sun.star.text.TextDocument", comphelper::containerToSequence(aFilterOptions));
-
- if (pPassword)
- {
- CPPUNIT_ASSERT_MESSAGE("Password set but not requested", xInteractionHandler->wasPasswordRequested());
- }
-
- discardDumpedLayout();
- if (pName && mustCalcLayoutOf(pName))
- calcLayout();
- }
-
- void reload(const char* pFilter, const char* filename, const char* pPassword = nullptr)
- {
- uno::Reference<frame::XStorable> xStorable(mxComponent, uno::UNO_QUERY);
- OUString aFilterName = OUString::createFromAscii(pFilter);
- utl::MediaDescriptor aMediaDescriptor;
- aMediaDescriptor["FilterName"] <<= aFilterName;
- if (!maFilterOptions.isEmpty())
- aMediaDescriptor["FilterOptions"] <<= maFilterOptions;
- if (pPassword)
- {
- if (strcmp(pFilter, "Office Open XML Text"))
- {
- aMediaDescriptor["Password"] <<= OUString::createFromAscii(pPassword);
- }
- else
- {
- OUString sPassword = OUString::createFromAscii(pPassword);
- css::uno::Sequence<css::beans::NamedValue> aEncryptionData {
- { "CryptoType", css::uno::makeAny(OUString("Standard")) },
- { "OOXPassword", css::uno::makeAny(sPassword) }
- };
- aMediaDescriptor[utl::MediaDescriptor::PROP_ENCRYPTIONDATA()] <<= aEncryptionData;
- }
- }
- xStorable->storeToURL(maTempFile.GetURL(), aMediaDescriptor.getAsConstPropertyValueList());
- uno::Reference<lang::XComponent> xComponent(xStorable, uno::UNO_QUERY);
- xComponent->dispose();
- mbExported = true;
-
- std::vector<beans::PropertyValue> aFilterOptions;
- if (pPassword)
- {
- setTestInteractionHandler(pPassword, aFilterOptions);
- }
-
- if (!maImportFilterOptions.isEmpty())
- {
- beans::PropertyValue aValue;
- aValue.Name = "FilterOptions";
- aValue.Value <<= maImportFilterOptions;
- aFilterOptions.push_back(aValue);
- }
-
- if (!maImportFilterName.isEmpty())
- {
- beans::PropertyValue aValue;
- aValue.Name = "FilterName";
- aValue.Value <<= maImportFilterName;
- aFilterOptions.push_back(aValue);
- }
-
- mxComponent = loadFromDesktop(maTempFile.GetURL(), "com.sun.star.text.TextDocument", comphelper::containerToSequence(aFilterOptions));
- if (pPassword)
- {
- CPPUNIT_ASSERT_MESSAGE("Password set but not requested", xInteractionHandler->wasPasswordRequested());
- }
- if (mustValidate(filename) || aFilterName == "writer8"
- || aFilterName == "OpenDocument Text Flat XML")
- {
- if(aFilterName == "Office Open XML Text")
- {
- // too many validation errors right now
- validate(maTempFile.GetFileName(), test::OOXML);
- }
- else if(aFilterName == "writer8"
- || aFilterName == "OpenDocument Text Flat XML")
- {
- validate(maTempFile.GetFileName(), test::ODF);
- }
- else if(aFilterName == "MS Word 97")
- {
- validate(maTempFile.GetFileName(), test::MSBINARY);
- }
- else
- {
- OString aMessage = OStringLiteral("validation requested, but don't know how to validate ") +
- filename +
- " (" +
- OUStringToOString(aFilterName, RTL_TEXTENCODING_UTF8) +
- ")";
- CPPUNIT_FAIL(aMessage.getStr());
- }
- }
- discardDumpedLayout();
- if (mustCalcLayoutOf(filename))
- calcLayout();
- }
+ void reload(const char* pFilter, const char* filename, const char* pPassword = nullptr);
/// Save the loaded document to a tempfile. Can be used to check the resulting docx/odt directly as a ZIP file.
- void save(const OUString& aFilterName, utl::TempFile& rTempFile)
- {
- rTempFile.EnableKillingFile();
- uno::Reference<frame::XStorable> xStorable(mxComponent, uno::UNO_QUERY);
- utl::MediaDescriptor aMediaDescriptor;
- aMediaDescriptor["FilterName"] <<= aFilterName;
- if (!maFilterOptions.isEmpty())
- aMediaDescriptor["FilterOptions"] <<= maFilterOptions;
- xStorable->storeToURL(rTempFile.GetURL(), aMediaDescriptor.getAsConstPropertyValueList());
- // TODO: for now, validate only ODF here
- if (aFilterName == "writer8"
- || aFilterName == "OpenDocument Text Flat XML")
- {
- validate(rTempFile.GetFileName(), test::ODF);
- }
- }
+ void save(const OUString& aFilterName, utl::TempFile& rTempFile);
- void finish()
- {
- sal_uInt32 nEndTime = osl_getGlobalTimer();
- std::cout << (nEndTime - mnStartTime) << std::endl;
- discardDumpedLayout();
- }
+ void finish();
/// Get page count.
- int getPages() const
- {
- uno::Reference<frame::XModel> xModel(mxComponent, uno::UNO_QUERY);
- uno::Reference<text::XTextViewCursorSupplier> xTextViewCursorSupplier(xModel->getCurrentController(), uno::UNO_QUERY);
- uno::Reference<text::XPageCursor> xCursor(xTextViewCursorSupplier->getViewCursor(), uno::UNO_QUERY);
- xCursor->jumpToLastPage();
- return xCursor->getPage();
- }
+ int getPages() const;
/// Get shape count.
- int getShapes() const
- {
- uno::Reference<drawing::XDrawPageSupplier> xDrawPageSupplier(mxComponent, uno::UNO_QUERY);
- uno::Reference<container::XIndexAccess> xDraws = xDrawPageSupplier->getDrawPage();
- return xDraws->getCount();
- }
+ int getShapes() const;
/**
* Given that some problem doesn't affect the result in the importer, we
@@ -927,121 +394,32 @@ protected:
* xml stream, and asserting an XPath expression. This method returns the
* xml stream, so that you can do the asserting.
*/
- xmlDocUniquePtr parseExport(const OUString& rStreamName = OUString("word/document.xml"))
- {
- if (!mbExported)
- return nullptr;
-
- return parseExportInternal( maTempFile.GetURL(), rStreamName );
- }
+ xmlDocUniquePtr parseExport(const OUString& rStreamName = OUString("word/document.xml"));
/**
* Returns an xml stream of an exported file.
* To be used when the exporter doesn't create zip archives, but single files
* (like Flat ODF Export)
*/
- xmlDocUniquePtr parseExportedFile()
- {
- auto stream(SvFileStream(maTempFile.GetURL(), StreamMode::READ | StreamMode::TEMPORARY));
- return parseXmlStream(&stream);
- }
-
- std::unique_ptr<SvStream> parseExportStream(const OUString& url, const OUString& rStreamName)
- {
- // Read the stream we're interested in.
- uno::Reference<packages::zip::XZipFileAccess2> xNameAccess = packages::zip::ZipFileAccess::createWithURL(comphelper::getComponentContext(m_xSFactory), url);
- uno::Reference<io::XInputStream> xInputStream(xNameAccess->getByName(rStreamName), uno::UNO_QUERY);
- CPPUNIT_ASSERT(xInputStream.is());
- std::unique_ptr<SvStream> pStream(utl::UcbStreamHelper::CreateStream(xInputStream, true));
- return pStream;
- }
+ xmlDocUniquePtr parseExportedFile();
- xmlDocUniquePtr parseExportInternal(const OUString& url, const OUString& rStreamName)
- {
- std::unique_ptr<SvStream> pStream(parseExportStream(url, rStreamName));
+ std::unique_ptr<SvStream> parseExportStream(const OUString& url, const OUString& rStreamName);
- xmlDocUniquePtr pXmlDoc = parseXmlStream(pStream.get());
- pXmlDoc->name = reinterpret_cast<char *>(xmlStrdup(reinterpret_cast<xmlChar const *>(OUStringToOString(url, RTL_TEXTENCODING_UTF8).getStr())));
- return pXmlDoc;
- }
+ xmlDocUniquePtr parseExportInternal(const OUString& url, const OUString& rStreamName);
/**
* Helper method to return nodes represented by rXPath.
*/
- virtual void registerNamespaces(xmlXPathContextPtr& pXmlXpathCtx) override
- {
- // docx
- 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"));
- xmlXPathRegisterNs(pXmlXpathCtx, BAD_CAST("wps"), BAD_CAST("http://schemas.microsoft.com/office/word/2010/wordprocessingShape"));
- xmlXPathRegisterNs(pXmlXpathCtx, BAD_CAST("wpg"), BAD_CAST("http://schemas.microsoft.com/office/word/2010/wordprocessingGroup"));
- xmlXPathRegisterNs(pXmlXpathCtx, BAD_CAST("wp"), BAD_CAST("http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing"));
- xmlXPathRegisterNs(pXmlXpathCtx, BAD_CAST("wp14"), BAD_CAST("http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing"));
- xmlXPathRegisterNs(pXmlXpathCtx, BAD_CAST("a"), BAD_CAST("http://schemas.openxmlformats.org/drawingml/2006/main"));
- xmlXPathRegisterNs(pXmlXpathCtx, BAD_CAST("pic"), BAD_CAST("http://schemas.openxmlformats.org/drawingml/2006/picture"));
- xmlXPathRegisterNs(pXmlXpathCtx, BAD_CAST("rels"), BAD_CAST("http://schemas.openxmlformats.org/package/2006/relationships"));
- xmlXPathRegisterNs(pXmlXpathCtx, BAD_CAST("w14"), BAD_CAST("http://schemas.microsoft.com/office/word/2010/wordml"));
- xmlXPathRegisterNs(pXmlXpathCtx, BAD_CAST("m"), BAD_CAST("http://schemas.openxmlformats.org/officeDocument/2006/math"));
- 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"));
- xmlXPathRegisterNs(pXmlXpathCtx, BAD_CAST("a14"), BAD_CAST("http://schemas.microsoft.com/office/drawing/2010/main"));
- xmlXPathRegisterNs(pXmlXpathCtx, BAD_CAST("c"), BAD_CAST("http://schemas.openxmlformats.org/drawingml/2006/chart"));
- xmlXPathRegisterNs(pXmlXpathCtx, BAD_CAST("o"), BAD_CAST("urn:schemas-microsoft-com:office:office"));
- xmlXPathRegisterNs(pXmlXpathCtx, BAD_CAST("w10"), BAD_CAST("urn:schemas-microsoft-com:office:word"));
- // odt
- xmlXPathRegisterNs(pXmlXpathCtx, BAD_CAST("office"), BAD_CAST("urn:oasis:names:tc:opendocument:xmlns:office:1.0"));
- xmlXPathRegisterNs(pXmlXpathCtx, BAD_CAST("style"), BAD_CAST("urn:oasis:names:tc:opendocument:xmlns:style:1.0"));
- xmlXPathRegisterNs(pXmlXpathCtx, BAD_CAST("text"), BAD_CAST("urn:oasis:names:tc:opendocument:xmlns:text:1.0"));
- xmlXPathRegisterNs(pXmlXpathCtx, BAD_CAST("table"), BAD_CAST("urn:oasis:names:tc:opendocument:xmlns:table:1.0"));
- xmlXPathRegisterNs(pXmlXpathCtx, BAD_CAST("draw"), BAD_CAST("urn:oasis:names:tc:opendocument:xmlns:drawing:1.0"));
- xmlXPathRegisterNs(pXmlXpathCtx, BAD_CAST("fo"), BAD_CAST("urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0"));
- xmlXPathRegisterNs(pXmlXpathCtx, BAD_CAST("config"), BAD_CAST("urn:oasis:names:tc:opendocument:xmlns:config:1.0"));
- xmlXPathRegisterNs(pXmlXpathCtx, BAD_CAST("xlink"), BAD_CAST("http://www.w3.org/1999/xlink"));
- xmlXPathRegisterNs(pXmlXpathCtx, BAD_CAST("dc"), BAD_CAST("http://purl.org/dc/elements/1.1/"));
- xmlXPathRegisterNs(pXmlXpathCtx, BAD_CAST("meta"), BAD_CAST("urn:oasis:names:tc:opendocument:xmlns:meta:1.0"));
- xmlXPathRegisterNs(pXmlXpathCtx, BAD_CAST("number"), BAD_CAST("urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0"));
- xmlXPathRegisterNs(pXmlXpathCtx, BAD_CAST("svg"), BAD_CAST("urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0"));
- xmlXPathRegisterNs(pXmlXpathCtx, BAD_CAST("chart"), BAD_CAST("urn:oasis:names:tc:opendocument:xmlns:chart:1.0"));
- xmlXPathRegisterNs(pXmlXpathCtx, BAD_CAST("dr3d"), BAD_CAST("urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0"));
- xmlXPathRegisterNs(pXmlXpathCtx, BAD_CAST("math"), BAD_CAST("http://www.w3.org/1998/Math/MathML"));
- xmlXPathRegisterNs(pXmlXpathCtx, BAD_CAST("form"), BAD_CAST("urn:oasis:names:tc:opendocument:xmlns:form:1.0"));
- xmlXPathRegisterNs(pXmlXpathCtx, BAD_CAST("script"), BAD_CAST("urn:oasis:names:tc:opendocument:xmlns:script:1.0"));
- xmlXPathRegisterNs(pXmlXpathCtx, BAD_CAST("ooo"), BAD_CAST("http://openoffice.org/2004/office"));
- xmlXPathRegisterNs(pXmlXpathCtx, BAD_CAST("ooow"), BAD_CAST("http://openoffice.org/2004/writer"));
- xmlXPathRegisterNs(pXmlXpathCtx, BAD_CAST("oooc"), BAD_CAST("http://openoffice.org/2004/calc"));
- xmlXPathRegisterNs(pXmlXpathCtx, BAD_CAST("dom"), BAD_CAST("http://www.w3.org/2001/xml-events"));
- xmlXPathRegisterNs(pXmlXpathCtx, BAD_CAST("xforms"), BAD_CAST("http://www.w3.org/2002/xforms"));
- xmlXPathRegisterNs(pXmlXpathCtx, BAD_CAST("xsd"), BAD_CAST("http://www.w3.org/2001/XMLSchema"));
- xmlXPathRegisterNs(pXmlXpathCtx, BAD_CAST("xsi"), BAD_CAST("http://www.w3.org/2001/XMLSchema-instance"));
- xmlXPathRegisterNs(pXmlXpathCtx, BAD_CAST("rpt"), BAD_CAST("http://openoffice.org/2005/report"));
- xmlXPathRegisterNs(pXmlXpathCtx, BAD_CAST("of"), BAD_CAST("urn:oasis:names:tc:opendocument:xmlns:of:1.2"));
- xmlXPathRegisterNs(pXmlXpathCtx, BAD_CAST("xhtml"), BAD_CAST("http://www.w3.org/1999/xhtml"));
- xmlXPathRegisterNs(pXmlXpathCtx, BAD_CAST("grddl"), BAD_CAST("http://www.w3.org/2003/g/data-view#"));
- xmlXPathRegisterNs(pXmlXpathCtx, BAD_CAST("officeooo"), BAD_CAST("http://openoffice.org/2009/office"));
- xmlXPathRegisterNs(pXmlXpathCtx, BAD_CAST("tableooo"), BAD_CAST("http://openoffice.org/2009/table"));
- xmlXPathRegisterNs(pXmlXpathCtx, BAD_CAST("drawooo"), BAD_CAST("http://openoffice.org/2010/draw"));
- xmlXPathRegisterNs(pXmlXpathCtx, BAD_CAST("calcext"), BAD_CAST("urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0"));
- xmlXPathRegisterNs(pXmlXpathCtx, BAD_CAST("loext"), BAD_CAST("urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0"));
- xmlXPathRegisterNs(pXmlXpathCtx, BAD_CAST("field"), BAD_CAST("urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0"));
- xmlXPathRegisterNs(pXmlXpathCtx, BAD_CAST("formx"), BAD_CAST("urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0"));
- xmlXPathRegisterNs(pXmlXpathCtx, BAD_CAST("css3t"), BAD_CAST("http://www.w3.org/TR/css3-text/"));
- // reqif-xhtml
- xmlXPathRegisterNs(pXmlXpathCtx, BAD_CAST("reqif-xhtml"), BAD_CAST("http://www.w3.org/1999/xhtml"));
- }
+ void registerNamespaces(xmlXPathContextPtr& pXmlXpathCtx) override;
- SwDoc* createSwDoc(const OUString& rDataDirectory = OUString(), const char* pName = nullptr)
- {
- if (rDataDirectory.isEmpty() || !pName)
- loadURL("private:factory/swriter", nullptr);
- else
- load(rDataDirectory, pName);
-
- SwXTextDocument* pTextDoc = dynamic_cast<SwXTextDocument*>(mxComponent.get());
- CPPUNIT_ASSERT(pTextDoc);
- return pTextDoc->GetDocShell()->GetDoc();
- }
+ /**
+ * Creates a new document to be used with the internal sw/ API.
+ *
+ * Examples:
+ * SwDoc* pDoc = createSwDoc();
+ * SwDoc* pDoc = createSwDoc(DATA_DIRECTORY, "test.fodt");
+ */
+ SwDoc* createSwDoc(const OUString& rDataDirectory = OUString(), const char* pName = nullptr);
};
/**
@@ -1055,10 +433,10 @@ protected:
* use that macro instead.
**/
inline void assertBorderEqual(
- const table::BorderLine2& rExpected, const table::BorderLine2& rActual,
+ const css::table::BorderLine2& rExpected, const css::table::BorderLine2& rActual,
const CppUnit::SourceLine& rSourceLine )
{
- CPPUNIT_NS::assertEquals<util::Color>( rExpected.Color, rActual.Color, rSourceLine, "different Color" );
+ CPPUNIT_NS::assertEquals<css::util::Color>( rExpected.Color, rActual.Color, rSourceLine, "different Color" );
CPPUNIT_NS::assertEquals<sal_Int16>( rExpected.InnerLineWidth, rActual.InnerLineWidth, rSourceLine, "different InnerLineWidth" );
CPPUNIT_NS::assertEquals<sal_Int16>( rExpected.OuterLineWidth, rActual.OuterLineWidth, rSourceLine, "different OuterLineWidth" );
CPPUNIT_NS::assertEquals<sal_Int16>( rExpected.LineDistance, rActual.LineDistance, rSourceLine, "different LineDistance" );