diff options
Diffstat (limited to 'writerfilter/qa/cppunittests/odiapi')
-rw-r--r-- | writerfilter/qa/cppunittests/odiapi/ExternalViewLogger.cxx | 178 | ||||
-rw-r--r-- | writerfilter/qa/cppunittests/odiapi/ExternalViewLogger.hxx | 65 | ||||
-rw-r--r-- | writerfilter/qa/cppunittests/odiapi/FileLoggerImpl.cxx | 55 | ||||
-rw-r--r-- | writerfilter/qa/cppunittests/odiapi/FileLoggerImpl.hxx | 32 | ||||
-rw-r--r-- | writerfilter/qa/cppunittests/odiapi/export.exp | 1 | ||||
-rw-r--r-- | writerfilter/qa/cppunittests/odiapi/export.map | 38 | ||||
-rw-r--r-- | writerfilter/qa/cppunittests/odiapi/makefile.mk | 78 | ||||
-rw-r--r-- | writerfilter/qa/cppunittests/odiapi/testCore.cxx | 146 | ||||
-rw-r--r-- | writerfilter/qa/cppunittests/odiapi/testProperty.cxx | 657 |
9 files changed, 1250 insertions, 0 deletions
diff --git a/writerfilter/qa/cppunittests/odiapi/ExternalViewLogger.cxx b/writerfilter/qa/cppunittests/odiapi/ExternalViewLogger.cxx new file mode 100644 index 000000000000..6f52350a1979 --- /dev/null +++ b/writerfilter/qa/cppunittests/odiapi/ExternalViewLogger.cxx @@ -0,0 +1,178 @@ +/* Copyright 2005 Sun Microsystems, Inc. */ + +#include "ExternalViewLogger.hxx" +#include <iostream> +#include <boost/assert.hpp> +#include <stdio.h> + +#ifdef WNT + #define SNPRINTF(buffer, size, format, args) _snprintf(buffer, size, format, args) +#else + #define SNPRINTF(buffer, size, format, args) snprintf(buffer, size, format, args) +#endif + +using namespace std; + +namespace util +{ + + NodeDescription::NodeDescription(const string& parent, const string& refersTo, const string& value, bool inUse) : + mParentNodeId(parent), + mRefersToNodeId(refersTo), + mNodeValue(value), + mInUse(inUse) + {} + + ExternalViewLoggerImpl::ExternalViewLoggerImpl(const string& fileName) : + mFileName(fileName), + mFile(fileName.c_str()) + { + if (!mFile) + throw "Cannot open file"; + } + + string ExternalViewLoggerImpl::getNewStyleName() + { + static int i = 0; + char buff[20]; + SNPRINTF(buff, sizeof(buff), "Style_%d", i++); + return string(buff); + } + + void ExternalViewLoggerImpl::beginTree() + { + mParentNodeStack.push(""); + } + + void ExternalViewLoggerImpl::dumpNodeContainer(const std::string& fileName) + { + std::ofstream file(fileName.c_str()); + NodeContainer_t::iterator iter = mNodeContainer.begin(); + NodeContainer_t::iterator iter_end = mNodeContainer.end(); + for (; iter != iter_end; ++iter) + { + file << iter->first << string(" ") << iter->second->mParentNodeId << string(" ") << iter->second->mRefersToNodeId << string(" ") << iter->second->mNodeValue << endl; + } + } + + void ExternalViewLoggerImpl::endTree() + { + //dumpNodeContainer(mFileName + string(".dmp")); + + mFile << "digraph {" << endl; + mFile << "Root [shape=box, color=grey];" << endl; + + while (!mParentNodeStack.empty()) + mParentNodeStack.pop(); + + mParentNodeStack.push("Root"); + + NodeContainer_t::iterator iter = mNodeContainer.begin(); + NodeContainer_t::iterator iter_end = mNodeContainer.end(); + for (; iter != iter_end; ++iter) + { + if (isUnreferencedLeaf(iter->first)) + { + string newStyleName = getNewStyleName(); + mFile << newStyleName << " [shape=box];" << endl; + mFile << mParentNodeStack.top() << " -> " << newStyleName << endl; + mParentNodeStack.push(newStyleName); + dumpTree(iter->first); + mParentNodeStack.pop(); + } + } + + mFile << "}" << endl; + } + + void ExternalViewLoggerImpl::beginNode(const std::string& nodeId, const std::string& value, const std::string& refersToNodeId, bool inUse) + { + mNodeContainer.insert( + NodeContainer_t::value_type(nodeId, + NodeDescription::Pointer_t(new NodeDescription(mParentNodeStack.top(), refersToNodeId, value, inUse)))); + mParentNodeStack.push(nodeId); + } + + void ExternalViewLoggerImpl::endNode(const std::string& nodeId) + { + mParentNodeStack.pop(); + } + + bool ExternalViewLoggerImpl::isLeaf(const std::string& nodeId) + { + bool isLeaf = true; + + NodeContainer_t::const_iterator iter = mNodeContainer.begin(); + NodeContainer_t::const_iterator iter_end = mNodeContainer.end(); + for (; iter != iter_end; ++iter) + { + if (iter->second->mParentNodeId == nodeId) + { + isLeaf = false; + break; + } + } + return isLeaf; + } + + bool ExternalViewLoggerImpl::isUnreferencedLeaf(const string& nodeId) + { + return isLeaf(nodeId) && !isReferenced(nodeId); + } + + bool ExternalViewLoggerImpl::isReferenced(const string& nodeId) + { + bool isReferenced = false; + + NodeContainer_t::const_iterator iter = mNodeContainer.begin(); + NodeContainer_t::const_iterator iter_end = mNodeContainer.end(); + for (; iter != iter_end; ++iter) + { + if (iter->second->mRefersToNodeId == nodeId) + { + isReferenced = true; + break; + } + } + return isReferenced; + } + + bool ExternalViewLoggerImpl::isReferingToOtherNode(const string& nodeId) + { + NodeContainer_t::const_iterator iter = mNodeContainer.find(nodeId); + BOOST_ASSERT(iter != mNodeContainer.end()); + return !iter->second->mRefersToNodeId.empty(); + } + + bool ExternalViewLoggerImpl::hasParent(const string& nodeId) + { + NodeContainer_t::const_iterator iter = mNodeContainer.find(nodeId); + BOOST_ASSERT(iter != mNodeContainer.end()); + return iter->second->mParentNodeId != "Root" && iter->second->mParentNodeId != ""; + } + + string ExternalViewLoggerImpl::getValue(const string& nodeId) + { + return mNodeContainer.find(nodeId)->second->mNodeValue; + } + + void ExternalViewLoggerImpl::dumpTree(const string& nodeId) + { + if (nodeId != "Root") + { + mFile << nodeId << " [label=\"(" << getValue(nodeId) << ")\",shape=box];" << endl; + mFile << mParentNodeStack.top() << " -> " << nodeId << ";" << endl; + if (isReferingToOtherNode(nodeId)) + { + mParentNodeStack.push(nodeId); + dumpTree(mNodeContainer.find(nodeId)->second->mRefersToNodeId); + mParentNodeStack.pop(); + } + } + + if (hasParent(nodeId)) + dumpTree(mNodeContainer.find(nodeId)->second->mParentNodeId); + } + +} // namespace util + diff --git a/writerfilter/qa/cppunittests/odiapi/ExternalViewLogger.hxx b/writerfilter/qa/cppunittests/odiapi/ExternalViewLogger.hxx new file mode 100644 index 000000000000..eebb3b0440eb --- /dev/null +++ b/writerfilter/qa/cppunittests/odiapi/ExternalViewLogger.hxx @@ -0,0 +1,65 @@ +/* Copyright 2005 Sun Microsystems, Inc. */ + +#ifndef INCLUDED_EXTERNALVIEWLOGGER_HXX +#define INCLUDED_EXTERNALVIEWLOGGER_HXX + +#ifndef INCLUDED_LOGGER_HXX +#include <odiapi/props/Logger.hxx> +#endif + +#include <fstream> +#include <stack> +#include <map> +#include <utility> +#include <boost/shared_ptr.hpp> + +namespace util { + + struct NodeDescription + { + typedef boost::shared_ptr<NodeDescription> Pointer_t; + + NodeDescription(const std::string& parent, const std::string& refersTo, const std::string& value, bool inUse); + + std::string mParentNodeId; + std::string mRefersToNodeId; + std::string mNodeValue; + bool mInUse; + }; + + /** A file logger + */ + class ExternalViewLoggerImpl : public Logger + { + public: + ExternalViewLoggerImpl(const std::string& fileName); + + virtual void beginTree(); + virtual void endTree(); + + virtual void beginNode(const std::string& nodeId, const std::string& value, const std::string& refersToNodeId, bool inUse); + virtual void endNode(const std::string& nodeId); + + private: + bool isLeaf(const std::string& nodeId); + bool isUnreferencedLeaf(const std::string& nodeId); + bool isReferenced(const std::string& nodeId); + bool isReferingToOtherNode(const std::string& nodeId); + bool hasParent(const std::string& nodeId); + void dumpTree(const std::string& nodeId); + std::string getValue(const std::string& nodeId); + std::string getNewStyleName(); + void dumpNodeContainer(const std::string& fileName); + + private: + typedef std::map<std::string, NodeDescription::Pointer_t> NodeContainer_t; + + std::string mFileName; + NodeContainer_t mNodeContainer; + std::ofstream mFile; + std::stack<std::string> mParentNodeStack; + }; + +} // namespace util + +#endif // INCLUDED_LOGGER_HXX diff --git a/writerfilter/qa/cppunittests/odiapi/FileLoggerImpl.cxx b/writerfilter/qa/cppunittests/odiapi/FileLoggerImpl.cxx new file mode 100644 index 000000000000..690a15616cec --- /dev/null +++ b/writerfilter/qa/cppunittests/odiapi/FileLoggerImpl.cxx @@ -0,0 +1,55 @@ +/* Copyright 2005 Sun Microsystems, Inc. */ + +#include "FileLoggerImpl.hxx" +#include <iostream> + +using namespace std; + +namespace util +{ + + FileLoggerImpl::FileLoggerImpl(const string& fileName) : + file_(fileName.c_str()) + { + if (!file_) + throw "Cannot open file"; + } + + void FileLoggerImpl::beginTree() + { + file_ << "digraph {" << endl; + } + + void FileLoggerImpl::endTree() + { + file_ << "}" << endl; + } + + void FileLoggerImpl::beginNode(const std::string& nodeId, const std::string& value, const std::string& refersToNodeId, bool inUse) + { + if (!nodeStack_.empty()) + { + if (inUse) + file_ << nodeId << " [ label=\"(" << value << ")\", shape=box, color=grey, style=filled ];"<< endl; + else + file_ << nodeId << " [ label=\"(" << value << ")\" ];"<< endl; + + file_ << nodeStack_.top() << " -> " << nodeId << ";" << endl; + + if (!refersToNodeId.empty()) + file_ << nodeId << " -> " << refersToNodeId << " [ color=grey, weight=0 ];" << endl; + } + else + { + file_ << nodeId << " [ label=\"(" << value << ")\", shape=diamond ];"<< endl; + } + nodeStack_.push(nodeId); + } + + void FileLoggerImpl::endNode(const std::string& nodeId) + { + nodeStack_.pop(); + } + +} // namespace util + diff --git a/writerfilter/qa/cppunittests/odiapi/FileLoggerImpl.hxx b/writerfilter/qa/cppunittests/odiapi/FileLoggerImpl.hxx new file mode 100644 index 000000000000..96f8b5368a94 --- /dev/null +++ b/writerfilter/qa/cppunittests/odiapi/FileLoggerImpl.hxx @@ -0,0 +1,32 @@ +/* Copyright 2005 Sun Microsystems, Inc. */ + +#ifndef INCLUDED_FILELOGGERIMPL_HXX +#define INCLUDED_FILELOGGERIMPL_HXX + +#include <odiapi/props/Logger.hxx> +#include <fstream> +#include <stack> + +namespace util { + +/** A file logger + */ +class FileLoggerImpl : public util::Logger +{ +public: + FileLoggerImpl(const std::string& fileName); + + virtual void beginTree(); + virtual void endTree(); + + virtual void beginNode(const std::string& nodeId, const std::string& value, const std::string& refersToNodeId, bool inUse); + virtual void endNode(const std::string& nodeId); + +private: + std::ofstream file_; + std::stack<std::string> nodeStack_; +}; + +} // namespace util + +#endif // INCLUDED_LOGGER_HXX diff --git a/writerfilter/qa/cppunittests/odiapi/export.exp b/writerfilter/qa/cppunittests/odiapi/export.exp new file mode 100644 index 000000000000..a13529da5876 --- /dev/null +++ b/writerfilter/qa/cppunittests/odiapi/export.exp @@ -0,0 +1 @@ +registerAllTestFunction diff --git a/writerfilter/qa/cppunittests/odiapi/export.map b/writerfilter/qa/cppunittests/odiapi/export.map new file mode 100644 index 000000000000..4f4704fc5e88 --- /dev/null +++ b/writerfilter/qa/cppunittests/odiapi/export.map @@ -0,0 +1,38 @@ +#************************************************************************* +# +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# Copyright 2008 by Sun Microsystems, Inc. +# +# OpenOffice.org - a multi-platform office productivity suite +# +# $RCSfile: export.map,v $ +# +# $Revision: 1.2 $ +# +# This file is part of OpenOffice.org. +# +# OpenOffice.org is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License version 3 +# only, as published by the Free Software Foundation. +# +# OpenOffice.org is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License version 3 for more details +# (a copy is included in the LICENSE file that accompanied this code). +# +# You should have received a copy of the GNU Lesser General Public License +# version 3 along with OpenOffice.org. If not, see +# <http://www.openoffice.org/license.html> +# for a copy of the LGPLv3 License. +# +#************************************************************************* + +UDK_3.0 { + global: + registerAllTestFunction; + + local: + *; +}; diff --git a/writerfilter/qa/cppunittests/odiapi/makefile.mk b/writerfilter/qa/cppunittests/odiapi/makefile.mk new file mode 100644 index 000000000000..b9e50e93919f --- /dev/null +++ b/writerfilter/qa/cppunittests/odiapi/makefile.mk @@ -0,0 +1,78 @@ +#************************************************************************* +# +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# Copyright 2008 by Sun Microsystems, Inc. +# +# OpenOffice.org - a multi-platform office productivity suite +# +# $RCSfile: makefile.mk,v $ +# +# $Revision: 1.2 $ +# +# This file is part of OpenOffice.org. +# +# OpenOffice.org is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License version 3 +# only, as published by the Free Software Foundation. +# +# OpenOffice.org is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License version 3 for more details +# (a copy is included in the LICENSE file that accompanied this code). +# +# You should have received a copy of the GNU Lesser General Public License +# version 3 along with OpenOffice.org. If not, see +# <http://www.openoffice.org/license.html> +# for a copy of the LGPLv3 License. +# +#************************************************************************* +PRJ=..$/..$/.. + +PRJNAME=writerfilter +TARGET=test-odiapi +ENABLE_EXCEPTIONS=TRUE + +# --- Settings ----------------------------------------------------- + +.INCLUDE : settings.mk + +# BEGIN ---------------------------------------------------------------- +# auto generated Target:testjob by codegen.pl + +.IF "$(GUI)" == "WNT" + #CFLAGS+=/Ob1 +.ENDIF + +SHL1OBJS=\ + $(SLO)$/testProperty.obj \ + $(SLO)$/FileLoggerImpl.obj\ + $(SLO)$/ExternalViewLogger.obj\ + $(SLO)$/testCore.obj + +SHL1TARGET=$(TARGET) +SHL1STDLIBS=$(SALLIB) $(TOOLSLIB) + +.IF "$(GUI)"=="WNT" +SHL1STDLIBS+= $(SOLARLIBDIR)$/cppunit.lib $(LB)$/iodiapi.lib +.ELIF "$(GUI)"=="UNX" && "$(GUIBASE)"!="aqua" +SHL1STDLIBS+=$(SOLARLIBDIR)$/libcppunit$(DLLPOSTFIX).a $(LB)$/libodiapi.so +.ELIF "$(GUI)"=="UNX" && "$(GUIBASE)"=="aqua" +SHL1STDLIBS+=$(SOLARLIBDIR)$/libcppunit$(DLLPOSTFIX).a $(LB)$/libodiapi.dylib +.ENDIF + +SHL1IMPLIB= i$(SHL1TARGET) + +# SHL1DEF= $(MISC)$/$(SHL1TARGET).def + +DEF1NAME =$(SHL1TARGET) + +SHL1VERSIONMAP = export.map + +# END ------------------------------------------------------------------ + +# --- Targets ------------------------------------------------------ + +.INCLUDE : target.mk +.INCLUDE : _cppunit.mk diff --git a/writerfilter/qa/cppunittests/odiapi/testCore.cxx b/writerfilter/qa/cppunittests/odiapi/testCore.cxx new file mode 100644 index 000000000000..cbdc47e5d872 --- /dev/null +++ b/writerfilter/qa/cppunittests/odiapi/testCore.cxx @@ -0,0 +1,146 @@ +/* Copyright 2005 Sun Microsystems, Inc. */ + +#include <cppunit/simpleheader.hxx> +#include <odiapi/core/Node.hxx> +#include <odiapi/props/Properties.hxx> + +using namespace odiapi::core; +using namespace odiapi::props; +using namespace writerfilter; +using namespace std; + +class TestCore : public CppUnit::TestFixture +{ +public: + void testCreateCore() + { + PropertyPool::Pointer_t pool = createPropertyPool(); + PropertyBag_Pointer_t pb = createPropertyBag(); + + pb->insert(createIntegerProperty(NS_fo::LN_font_weight, 12)); + PropertyPoolHandle_Pointer_t ph = pool->insert(pb); + + Node::Pointer_t node = createNode(NS_style::LN_char, ph, "NS_style::LN_char"); + + CPPUNIT_ASSERT_MESSAGE("Create node failed wrong node id", node->getId() == NS_style::LN_char); + CPPUNIT_ASSERT_MESSAGE("Create node failed wrong text", node->getText() == "NS_style::LN_char"); + CPPUNIT_ASSERT_MESSAGE("Create node failed wrong pool handle", node->getProperties() == ph); + } + + void testInsertSibling() + { + PropertyPool::Pointer_t pool = createPropertyPool(); + PropertyBag_Pointer_t pb = createPropertyBag(); + + pb->insert(createIntegerProperty(NS_fo::LN_font_weight, 12)); + PropertyPoolHandle_Pointer_t ph = pool->insert(pb); + + Node::Pointer_t node1 = createNode(NS_style::LN_char, ph, "Text"); + Node::Pointer_t node2 = createNode(NS_style::LN_char, ph, "\\par"); + + node1->insertSibling(node2); + + string postfixSeq = node1->getText(); + const Node* n = node1.get(); + while (n->hasNext()) + { + n = &n->getNext(); + postfixSeq = postfixSeq + n->getText(); + } + + CPPUNIT_ASSERT_MESSAGE("Insert sibling failed", postfixSeq == "Text\\par"); + + Node::Pointer_t node3 = createNode(NS_style::LN_char, ph, "\\span"); + + node1->insertSibling(node3); + + postfixSeq = node1->getText(); + n = node1.get(); + while (n->hasNext()) + { + n = &n->getNext(); + postfixSeq = postfixSeq + n->getText(); + } + + CPPUNIT_ASSERT_MESSAGE("Insert sibling failed", postfixSeq == "Text\\span\\par"); + } + + void testAppendChildren() + { + PropertyPool::Pointer_t pool = createPropertyPool(); + PropertyBag_Pointer_t pb = createPropertyBag(); + + pb->insert(createIntegerProperty(NS_fo::LN_font_weight, 12)); + PropertyPoolHandle_Pointer_t ph = pool->insert(pb); + + Node::Pointer_t node1 = createNode(NS_style::LN_char, ph, "Text"); + const Node* pn1 = node1.get(); + + Node::Pointer_t node2 = createNode(NS_style::LN_char, ph, "\\par"); + + node2->appendChildren(node1); + + CPPUNIT_ASSERT_MESSAGE("Append children failed", &node2->getFirstChild() == pn1); + + const Node* n = &node2->getFirstChild(); + string postfixSeq = n->getText() + n->getNext().getText(); + + CPPUNIT_ASSERT_MESSAGE("Append children failed", postfixSeq == "Text\\par"); + } + + void testCore() + { + PropertyPool::Pointer_t pool = createPropertyPool(); + PropertyBag_Pointer_t pb = createPropertyBag(); + + pb->insert(createIntegerProperty(NS_fo::LN_font_weight, 12)); + PropertyPoolHandle_Pointer_t ph = pool->insert(pb); + + Node::Pointer_t node1 = createNode(NS_style::LN_char, ph, "A"); + Node::Pointer_t node2 = createNode(NS_style::LN_char, ph, "\\span"); + + node2->appendChildren(node1); + + Node::Pointer_t node3 = createNode(NS_style::LN_char, ph, "B"); + Node::Pointer_t node4 = createNode(NS_style::LN_char, ph, "\\span"); + + node4->appendChildren(node3); + + node2->insertSibling(node4); + + Node::Pointer_t node5 = createNode(NS_style::LN_char, ph, "\\par"); + + node5->appendChildren(node2); + + Node::Pointer_t node6 = createNode(NS_style::LN_char, ph, "C"); + Node::Pointer_t node7 = createNode(NS_style::LN_char, ph, "\\span"); + + node7->appendChildren(node6); + + node5->appendChildren(node7); + + + string postfixSeq = node5->getText(); + const Node* n = node5.get(); + while (n->hasPrevious()) + { + n = &n->getPrevious(); + postfixSeq = postfixSeq + n->getText(); + } + + CPPUNIT_ASSERT_MESSAGE("Insert sibling failed", postfixSeq == "\\par\\spanC\\spanB\\spanA"); + } + + CPPUNIT_TEST_SUITE(TestCore); + CPPUNIT_TEST(testCreateCore); + CPPUNIT_TEST(testInsertSibling); + CPPUNIT_TEST(testAppendChildren); + CPPUNIT_TEST(testCore); + CPPUNIT_TEST_SUITE_END(); +}; + +//##################################### +// register test suites +CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(TestCore, "TestCore"); + +//NOADDITIONAL; diff --git a/writerfilter/qa/cppunittests/odiapi/testProperty.cxx b/writerfilter/qa/cppunittests/odiapi/testProperty.cxx new file mode 100644 index 000000000000..b2a633f9b70f --- /dev/null +++ b/writerfilter/qa/cppunittests/odiapi/testProperty.cxx @@ -0,0 +1,657 @@ +/* Copyright 2005 Sun Microsystems, Inc. */ + +#include <cppunit/simpleheader.hxx> +#include <odiapi/props/Properties.hxx> +#include "FileLoggerImpl.hxx" +#include "ExternalViewLogger.hxx" +#include <osl/file.hxx> +#include <osl/thread.hxx> +#include <exception> +#include <stdio.h> + +using namespace odiapi::props; +using namespace writerfilter; +using namespace std; +using namespace util; +using namespace osl; +using namespace rtl; + +/** Helper function, get a temporary file name + */ +OString getTempFileName(const OUString& fileName) +{ + OUString ousTmpUrl; + FileBase::getTempDirURL(ousTmpUrl); + if (!ousTmpUrl.endsWithIgnoreAsciiCaseAsciiL("/", 1)) + ousTmpUrl += OUString::createFromAscii("/"); + ousTmpUrl += fileName; + + OUString sysTmpPath; + FileBase::getSystemPathFromFileURL(ousTmpUrl, sysTmpPath); + + return OUStringToOString(sysTmpPath, osl_getThreadTextEncoding()); +} + +class TestProperty : public CppUnit::TestFixture +{ +public: + void testCreateIntProperty() + { + Property::Pointer_t intProp = createIntegerProperty(NS_fo::LN_font_weight, 35); + CPPUNIT_ASSERT_MESSAGE("Wrong property id", intProp->getId() == NS_fo::LN_font_weight); + CPPUNIT_ASSERT_MESSAGE("Wrong int value", intProp->getIntValue() == 35); + CPPUNIT_ASSERT_MESSAGE("Wrong string value", intProp->getStringValue() == "35"); + } + + void testCreateStringProperty() + { + Property::Pointer_t strProp = createStringProperty(NS_style::LN_font_face, "Times New Roman"); + CPPUNIT_ASSERT_MESSAGE("Wrong property id", strProp->getId() == NS_style::LN_font_face); + CPPUNIT_ASSERT_MESSAGE("Wrong string value", strProp->getStringValue() == "Times New Roman"); + try + { + strProp->getIntValue(); + } + catch(const logic_error& ex) + { + return; + } + CPPUNIT_ASSERT_MESSAGE("Operation getIntValue should not be supported by StringProperty", false); + } + + void testCreateCompositeProperty() + { + PropertyPool::Pointer_t pool = createPropertyPool(); + + PropertyBag_Pointer_t pb = createPropertyBag(); + pb->insert(createStringProperty(NS_style::LN_font_face, "Times")); + pb->insert(createIntegerProperty(NS_fo::LN_font_weight, 12)); + Property::Pointer_t cp1 = createCompositeProperty(NS_style::LN_paragraph_properties, pool->insert(pb)); + + CPPUNIT_ASSERT_MESSAGE("Failed to get NS_style::LN_font_face", cp1->findChild(NS_style::LN_font_face)->getStringValue() == "Times"); + CPPUNIT_ASSERT_MESSAGE("Failed to get NS_fo::LN_font_weight", cp1->findChild(NS_fo::LN_font_weight)->getIntValue() == 12); + } + + void testCompareSimpleProperties() + { + Property::Pointer_t pb1 = createStringProperty(NS_style::LN_font_face, "Times New Roman"); + Property::Pointer_t pb2 = createStringProperty(NS_style::LN_font_face, "Times New Roman"); + CPPUNIT_ASSERT_MESSAGE("pb1 == pb2", pb1 == pb2); + + Property::Pointer_t fw = createIntegerProperty(NS_fo::LN_font_weight, 12); + Property::Pointer_t ff = createStringProperty(NS_style::LN_font_face, "Times"); + + CPPUNIT_ASSERT_MESSAGE("fw == fw failed", fw == fw); + CPPUNIT_ASSERT_MESSAGE("fw > ff failed", ff < fw); + CPPUNIT_ASSERT_MESSAGE("ff == ff failed", ff == ff); + CPPUNIT_ASSERT_MESSAGE("!(ff < fw) failed", !(fw < ff)); + } + + void testCompareCompositeProperties() + { + PropertyPool::Pointer_t pool = createPropertyPool(); + + PropertyBag_Pointer_t pb1 = createPropertyBag(); + pb1->insert(createStringProperty(NS_style::LN_font_face, "Times")); + pb1->insert(createIntegerProperty(NS_fo::LN_font_weight, 12)); + Property::Pointer_t cp1 = createCompositeProperty(NS_style::LN_paragraph_properties, pool->insert(pb1)); + + PropertyBag_Pointer_t ps2 = createPropertyBag(); + ps2->insert(createStringProperty(NS_style::LN_font_face, "Times")); + ps2->insert(createIntegerProperty(NS_fo::LN_font_weight, 12)); + Property::Pointer_t cp2 = createCompositeProperty(NS_style::LN_paragraph_properties, pool->insert(ps2)); + + CPPUNIT_ASSERT_MESSAGE("cp1 == cp2 failed", cp1 == cp2); + } + + void testPropertyBagAsStructure() + { + PropertyBag_Pointer_t propSeq = createPropertyBag(); + Property::Pointer_t fontWeight12 = createIntegerProperty(NS_fo::LN_font_weight, 12); + + propSeq->insert(fontWeight12); + CPPUNIT_ASSERT_MESSAGE("Inserting property into property sequence failed", propSeq->size() == 1); + CPPUNIT_ASSERT_MESSAGE("Property not in property sequence", propSeq->find(NS_fo::LN_font_weight)->getIntValue() == 12); + } + + void testNoDuplicatesInPropertyBagStructures() + { + PropertyBag_Pointer_t propSeq = createPropertyBag(); + Property::Pointer_t fontWeight12 = createIntegerProperty(NS_fo::LN_font_weight, 12); + propSeq->insert(fontWeight12); + + CPPUNIT_ASSERT_MESSAGE("Expect property sequence with 1 element", propSeq->size() == 1); + CPPUNIT_ASSERT_MESSAGE("Expect property sequence with one int value 12", propSeq->find(NS_fo::LN_font_weight)->getIntValue() == 12); + + Property::Pointer_t fontWeight14 = createIntegerProperty(NS_fo::LN_font_weight, 14); + propSeq->insert(fontWeight14); + + CPPUNIT_ASSERT_MESSAGE("Expect property sequence with 1 element", propSeq->size() == 1); + CPPUNIT_ASSERT_MESSAGE("Expect property sequence with one int value 14", propSeq->find(NS_fo::LN_font_weight)->getIntValue() == 14); + } + + void testPropertyBagAsArray() + { + PropertyBag_Pointer_t pb = createPropertyBag(); + Property::Pointer_t fontWeight12 = createIntegerProperty(NS_fo::LN_font_weight, 12); + + pb->insert(0, fontWeight12); + + CPPUNIT_ASSERT_MESSAGE("Inserting property into property sequence failed", pb->size() == 1); + CPPUNIT_ASSERT_MESSAGE("Property not in property sequence", pb->get(0)->getIntValue() == 12); + CPPUNIT_ASSERT_MESSAGE("Wrong property id", pb->get(0)->getId() == NS_fo::LN_font_weight); + + Iterator<Property::Pointer_t>::Pointer_t iter = pb->createIterator(); + for (iter->first(); !iter->isDone(); iter->next()) + { + CPPUNIT_ASSERT_MESSAGE("Test property bag as array failed", iter->getCurrent()->getId() == NS_fo::LN_font_weight); + } + } + + void testCopyPropertyBag() + { + PropertyBag_Pointer_t propBag = createPropertyBag(); + Property::Pointer_t fontWeight12 = createIntegerProperty(NS_fo::LN_font_weight, 12); + + propBag->insert(0, fontWeight12); + + CPPUNIT_ASSERT_MESSAGE("Inserting property into property sequence failed", propBag->size() == 1); + CPPUNIT_ASSERT_MESSAGE("Property not in property sequence", propBag->get(0)->getIntValue() == 12); + CPPUNIT_ASSERT_MESSAGE("Wrong property id", propBag->get(0)->getId() == NS_fo::LN_font_weight); + + PropertyBag_Pointer_t propBagCopy = propBag->copy(); + + CPPUNIT_ASSERT_MESSAGE("Copy property bag failed, distinct instances expected", propBag.get() != propBagCopy.get()); + + CPPUNIT_ASSERT_MESSAGE("Copy property bag failed", propBagCopy->size() == 1); + CPPUNIT_ASSERT_MESSAGE("Copy property bag failed", propBagCopy->get(0)->getIntValue() == 12); + CPPUNIT_ASSERT_MESSAGE("Copy property bag failed", propBagCopy->get(0)->getId() == NS_fo::LN_font_weight); + } + + void testClearPropertyBag() + { + PropertyBag_Pointer_t pb = createPropertyBag(); + pb->insert(createStringProperty(NS_style::LN_font_face, "Times")); + pb->insert(createIntegerProperty(NS_fo::LN_font_weight, 12)); + + CPPUNIT_ASSERT_MESSAGE("Insert into property bag failed", pb->size() == 2); + + pb->clear(); + + CPPUNIT_ASSERT_MESSAGE("Clearing property bag failed", pb->size() == 0); + } + + void testSortPropertyBag() + { + QName_t sortedOrder [] = { NS_style::LN_font_face, NS_fo::LN_font_weight }; + + PropertyBag_Pointer_t pb = createPropertyBag(); + pb->insert(createIntegerProperty(NS_fo::LN_font_weight, 12)); + pb->insert(createStringProperty(NS_style::LN_font_face, "Times")); + + pb->sort(); + + Iterator<Property::Pointer_t>::Pointer_t iter = pb->createIterator(); + int i = 0; + for (iter->first(); !iter->isDone(); iter->next(), i++) + { + CPPUNIT_ASSERT_MESSAGE("Sorting property bag failed", sortedOrder[i] == iter->getCurrent()->getId()); + } + } + + void testDuplicateValuesInArray() + { + PropertyBag_Pointer_t propSeq = createPropertyBag(); + + Property::Pointer_t fontWeight1 = createIntegerProperty(NS_fo::LN_font_weight, 12); + propSeq->insert(0, fontWeight1); + + Property::Pointer_t fontWeight2 = createIntegerProperty(NS_fo::LN_font_weight, 12); + propSeq->insert(1, fontWeight2); + + CPPUNIT_ASSERT_MESSAGE("Inserting property into property sequence failed", propSeq->size() == 2); + CPPUNIT_ASSERT_MESSAGE("Property not in property sequence", + propSeq->get(0)->getId() == propSeq->get(1)->getId() && + propSeq->get(0)->getIntValue() == propSeq->get(1)->getIntValue()); + } + + void testPropertyPool() + { + PropertyPool::Pointer_t pool = createPropertyPool(); + + PropertyBag_Pointer_t pb1 = createPropertyBag(); + pb1->insert(createStringProperty(NS_style::LN_font_face, "Times")); + pb1->insert(createIntegerProperty(NS_fo::LN_font_weight, 12)); + PropertyPoolHandle_Pointer_t ph1 = pool->insert(pb1); + + PropertyBag_Pointer_t ps2 = createPropertyBag(); + ps2->insert(createIntegerProperty(NS_fo::LN_font_weight, 12)); + ps2->insert(createStringProperty(NS_style::LN_font_face, "Times")); + PropertyPoolHandle_Pointer_t ph2 = pool->insert(ps2); + + CPPUNIT_ASSERT_MESSAGE("ph1 == ph2 failed", ph1 == ph2); + + PropertyBag_Pointer_t ps3 = createPropertyBag(); + ps3->insert(createIntegerProperty(NS_fo::LN_font_weight, 14)); + ps3->insert(createStringProperty(NS_style::LN_font_face, "Times")); + + PropertyPoolHandle_Pointer_t ph3 = pool->insert(ps3); + + CPPUNIT_ASSERT_MESSAGE("ph2 != ph3 failed", ph2 != ph3); + + PropertyBag_Pointer_t ps4 = createPropertyBag(); + ps4->insert(0, createIntegerProperty(NS_fo::LN_font_weight, 12)); + ps4->insert(1, createIntegerProperty(NS_fo::LN_font_weight, 12)); + ps4->insert(2, createIntegerProperty(NS_fo::LN_font_weight, 12)); + ps4->insert(3, createIntegerProperty(NS_fo::LN_font_weight, 12)); + + pool->insert(ps4); + + OString tmpFileName = getTempFileName(OUString::createFromAscii("testPropertyPool_int.dot")); + printf("Pool dump: %s\n", tmpFileName.getStr()); + FileLoggerImpl fl(tmpFileName.getStr()); + pool->dump(&fl); + + OString tmpFileName2 = getTempFileName(OUString::createFromAscii("testPropertyPool_ext.dot")); + printf("Pool dump: %s\n", tmpFileName2.getStr()); + ExternalViewLoggerImpl evl(tmpFileName2.getStr()); + pool->dump(&evl); + } + + void testCompareEqualPropertyTypesWithDifferentIdsDoesNotFail() + { + PropertyPool::Pointer_t pool = createPropertyPool(); + + PropertyBag_Pointer_t pb1 = createPropertyBag(); + pb1->insert(createIntegerProperty(NS_style::LN_tab_stop, 100)); + pb1->insert(createStringProperty(NS_style::LN_type, "left")); + Property::Pointer_t tab100 = createCompositeProperty(NS_style::LN_tab_stop, pool->insert(pb1)); + + pb1->clear(); + pb1->insert(createIntegerProperty(NS_fo::LN_font_weight, 12)); + pb1->insert(createStringProperty(NS_style::LN_font_face, "Times New Roman")); + Property::Pointer_t charProps1 = createCompositeProperty(NS_style::LN_char, pool->insert(pb1)); + + pb1->clear(); + pb1->insert(createIntegerProperty(NS_fo::LN_font_weight, 12)); + pb1->insert(createStringProperty(NS_style::LN_font_face, "Times New Roman")); + Property::Pointer_t charProps2 = createCompositeProperty(NS_style::LN_char, pool->insert(pb1)); + + CPPUNIT_ASSERT_MESSAGE("CharProps1 == CharProps2 failed", charProps1 == charProps2); + } + + void testComplexParagraphProperty() + { + PropertyPool::Pointer_t pool = createPropertyPool(); + PropertyBag_Pointer_t pb1 = createPropertyBag(); + + pb1->insert(createIntegerProperty(NS_style::LN_position, 100)); + pb1->insert(createStringProperty(NS_style::LN_type, "left")); + Property::Pointer_t tab100 = createCompositeProperty(NS_style::LN_tab_stop, pool->insert(pb1)); + + pb1->clear(); + + pb1->insert(createIntegerProperty(NS_style::LN_position, 200)); + pb1->insert(createStringProperty(NS_style::LN_type, "center")); + Property::Pointer_t tab200 = createCompositeProperty(NS_style::LN_tab_stop, pool->insert(pb1)); + + CPPUNIT_ASSERT_MESSAGE("tab100 != tab200 failed", tab100 != tab200); + + pb1->clear(); + pb1->insert(100, tab100); + pb1->insert(200, tab200); + Property::Pointer_t tabs = createCompositeProperty(NS_style::LN_tab_stops, pool->insert(pb1)); + + pb1->clear(); + pb1->insert(createIntegerProperty(NS_fo::LN_font_weight, 12)); + pb1->insert(createStringProperty(NS_style::LN_font_face, "Times New Roman")); + Property::Pointer_t charProps = createCompositeProperty(NS_style::LN_char, pool->insert(pb1)); + + pb1->clear(); + pb1->insert(createIntegerProperty(NS_fo::LN_line_height, 20)); + pb1->insert(tabs); + pb1->insert(charProps); + Property::Pointer_t paraProps = createCompositeProperty(NS_style::LN_paragraph_properties, pool->insert(pb1)); + + pb1->clear(); + pb1->insert(createIntegerProperty(NS_style::LN_position, 100)); + pb1->insert(createStringProperty(NS_style::LN_type, "left")); + Property::Pointer_t tab300 = createCompositeProperty(NS_style::LN_tab_stop, pool->insert(pb1)); + + pb1->clear(); + pb1->insert(createIntegerProperty(NS_style::LN_position, 200)); + pb1->insert(createStringProperty(NS_style::LN_type, "center")); + Property::Pointer_t tab400 = createCompositeProperty(NS_style::LN_tab_stop, pool->insert(pb1)); + + CPPUNIT_ASSERT_MESSAGE("tab300 != tab400 failed", tab300 != tab400); + + pb1->clear(); + pb1->insert(100, tab300); + pb1->insert(200, tab400); + Property::Pointer_t tabulators = createCompositeProperty(NS_style::LN_tab_stops, pool->insert(pb1)); + + CPPUNIT_ASSERT_MESSAGE("tabs == tabulators failed", tabs == tabulators); + + pb1->clear(); + pb1->insert(createIntegerProperty(NS_fo::LN_font_weight, 12)); + pb1->insert(createStringProperty(NS_style::LN_font_face, "Times New Roman")); + Property::Pointer_t characterProps = createCompositeProperty(NS_style::LN_char, pool->insert(pb1)); + + CPPUNIT_ASSERT_MESSAGE("Comparison of character properties failed", charProps == characterProps); + + pb1->clear(); + pb1->insert(createIntegerProperty(NS_fo::LN_line_height, 20)); + pb1->insert(tabulators); + pb1->insert(characterProps); + Property::Pointer_t paragraphProps = createCompositeProperty(NS_style::LN_paragraph_properties, pool->insert(pb1)); + + CPPUNIT_ASSERT_MESSAGE("paraProps == failed failed", paraProps == paragraphProps); + + OString tmpFileName = getTempFileName(OUString::createFromAscii("testComplexParaProps_int.dot")); + printf("Pool dump: %s\n", tmpFileName.getStr()); + FileLoggerImpl fl(tmpFileName.getStr()); + pool->dump(&fl); + + OString tmpFileName2 = getTempFileName(OUString::createFromAscii("testComplexParaProps_ext.dot")); + printf("Pool dump: %s\n", tmpFileName2.getStr()); + ExternalViewLoggerImpl evl(tmpFileName2.getStr()); + pool->dump(&evl); + } + + void testInsertEmptyPropertyBag() + { + PropertyPool::Pointer_t pool = createPropertyPool(); + PropertyBag_Pointer_t pb = createPropertyBag(); + PropertyPoolHandle_Pointer_t ph = pool->insert(pb); + + CPPUNIT_ASSERT_MESSAGE("Inserting empty property bag failed", ph->getPropertyBag()->size() == 0); + } + + void testDumpPropertyPool() + { + PropertyPool::Pointer_t pool = createPropertyPool(); + PropertyBag_Pointer_t pb1 = createPropertyBag(); + pb1->insert(createIntegerProperty(NS_fo::LN_font_weight, 12)); + pb1->insert(createStringProperty(NS_style::LN_font_face, "Times")); + PropertyPoolHandle_Pointer_t ph1 = pool->insert(pb1); + + Iterator<PropertyBag_Pointer_t>::Pointer_t iter = pool->createIterator(); + + int i = 0; + for (iter->first(); !iter->isDone(); iter->next(), i++) /* nothing to do */; + + CPPUNIT_ASSERT_MESSAGE("Dump PropertyBags failed", i == 1); + + /* Insert an equal PropertyBag again, as PropertyBags in the + pool are unique there must be still just one PropertyBag in the pool + */ + PropertyBag_Pointer_t pb2 = createPropertyBag(); + pb2->insert(createIntegerProperty(NS_fo::LN_font_weight, 12)); + pb2->insert(createStringProperty(NS_style::LN_font_face, "Times")); + PropertyPoolHandle_Pointer_t ph2 = pool->insert(pb2); + + iter = pool->createIterator(); + + i = 0; + for (iter->first(); !iter->isDone(); iter->next(), i++) /* nothing to do */; + + CPPUNIT_ASSERT_MESSAGE("Dump PropertyBags failed", i == 1); + + { // scope + + /* Insert a different PropertyBag into the pool now there must be + two PropertyBags in the pool */ + PropertyBag_Pointer_t pb3 = createPropertyBag(); + pb3->insert(createIntegerProperty(NS_style::LN_position, 12)); + pb3->insert(createStringProperty(NS_style::LN_type, "left")); + PropertyPoolHandle_Pointer_t ph3 = pool->insert(pb3); + + iter = pool->createIterator(); + + i = 0; + for (iter->first(); !iter->isDone(); iter->next(), i++) /* nothing to do */; + + CPPUNIT_ASSERT_MESSAGE("Dump PropertyBags failed", i == 2); + + } // end scope + + /* as pb3 is only valid in the above scope the property pool must + now contain just one property bag + */ + iter = pool->createIterator(); + + i = 0; + for (iter->first(); !iter->isDone(); iter->next(), i++) /*nothing to do*/; + + CPPUNIT_ASSERT_MESSAGE("Dump PropertyBags failed", i == 1); + } + + void testInsertPropertySubsets() + { + PropertyPool::Pointer_t pool = createPropertyPool(); + + PropertyBag_Pointer_t pb1 = createPropertyBag(); + pb1->insert(createIntegerProperty(NS_fo::LN_font_weight, 12)); + pb1->insert(createStringProperty(NS_style::LN_font_face, "Times")); + PropertyPoolHandle_Pointer_t ph1 = pool->insert(pb1); + + /* Insert an equal PropertyBag again, as PropertyBags in the + pool are unique there must be still just one PropertyBag in the pool + */ + pb1->clear(); + pb1->insert(createIntegerProperty(NS_fo::LN_font_weight, 12)); + PropertyPoolHandle_Pointer_t ph2 = pool->insert(pb1); + + CPPUNIT_ASSERT_MESSAGE("ph1 != ph2 failed", ph1 != ph2); + + Iterator<PropertyBag_Pointer_t>::Pointer_t iter = pool->createIterator(); + + int i = 0; + for (iter->first(); !iter->isDone(); iter->next(), i++) /* nothing to do */; + + CPPUNIT_ASSERT_MESSAGE("Dump PropertyBags failed", i == 2); + } + + void testDumpEmptyPropertyPool() + { + PropertyPool::Pointer_t pool = createPropertyPool(); + Iterator<PropertyBag_Pointer_t>::Pointer_t iter = pool->createIterator(); + + int i = 0; + for (iter->first(); !iter->isDone(); iter->next(), i++) /*nothing to do*/; + + CPPUNIT_ASSERT_MESSAGE("Dump PropertyBags failed", i == 0); + } + + void testPropertyPoolGarbageCollection() + { + PropertyPool::Pointer_t pool = createPropertyPool(); + + PropertyBag_Pointer_t pb1 = createPropertyBag(); + pb1->insert(createIntegerProperty(NS_fo::LN_font_weight, 12)); + pb1->insert(createStringProperty(NS_style::LN_font_face, "Times")); + pb1->insert(createIntegerProperty(NS_fo::LN_line_height, 20)); + PropertyPoolHandle_Pointer_t ph1 = pool->insert(pb1); + + { + PropertyBag_Pointer_t pb2 = createPropertyBag(); + pb2->insert(createIntegerProperty(NS_fo::LN_font_weight, 12)); + pb2->insert(createStringProperty(NS_style::LN_font_face, "Roman")); + PropertyPoolHandle_Pointer_t ph2 = pool->insert(pb2); + + OString tmpFileName = getTempFileName(OUString::createFromAscii("testPropPoolGarbageColl_1.dot")); + printf("Pool dump: %s\n", tmpFileName.getStr()); + FileLoggerImpl fl(tmpFileName.getStr()); + pool->dump(&fl); + + } + + OString tmpFileName = getTempFileName(OUString::createFromAscii("testPropPoolGarbageColl_2.dot")); + printf("Pool dump: %s\n", tmpFileName.getStr()); + FileLoggerImpl fl(tmpFileName.getStr()); + pool->dump(&fl); + + pool->garbageCollection(); + + OString tmpFileName2 = getTempFileName(OUString::createFromAscii("testPropPoolGarbageColl_after.dot")); + printf("Pool dump: %s\n", tmpFileName2.getStr()); + FileLoggerImpl fl2(tmpFileName2.getStr()); + pool->dump(&fl2); + + } + + void testDumpPropertyPoolAfterGarbageCollection() + { + PropertyPool::Pointer_t pool = createPropertyPool(); + + PropertyBag_Pointer_t pb1 = createPropertyBag(); + pb1->insert(createIntegerProperty(NS_fo::LN_font_weight, 12)); + pb1->insert(createStringProperty(NS_style::LN_font_face, "Times")); + pb1->insert(createIntegerProperty(NS_fo::LN_line_height, 20)); + PropertyPoolHandle_Pointer_t ph1 = pool->insert(pb1); + + { + PropertyBag_Pointer_t pb2 = createPropertyBag(); + pb2->insert(createIntegerProperty(NS_fo::LN_font_weight, 12)); + pb2->insert(createStringProperty(NS_style::LN_font_face, "Roman")); + PropertyPoolHandle_Pointer_t ph2 = pool->insert(pb2); + + Iterator<PropertyBag_Pointer_t>::Pointer_t iter = pool->createIterator(); + + int i = 0; + for (iter->first(); !iter->isDone(); iter->next(), i++) /*nothing to do*/; + + CPPUNIT_ASSERT_MESSAGE("Expectation '2 PropertyBags in PropertyPool' failed", i == 2); + } + + pool->garbageCollection(); + + Iterator<PropertyBag_Pointer_t>::Pointer_t iter = pool->createIterator(); + + int i = 0; + for (iter->first(); !iter->isDone(); iter->next(), i++) /*nothing to do*/; + + CPPUNIT_ASSERT_MESSAGE("Expectation '1 PropertyBag in PropertyPool' failed", i == 1); + } + + // 'cm', 'mm', 'inch', 'pt', 'px', 'pc' + void testCreateTwipsProperty() + { + Property::Pointer_t tp1 = createTwipsProperty(NS_style::LN_position, "1cm"); + CPPUNIT_ASSERT_MESSAGE("getIntValue: wrong twips value returned", tp1->getIntValue() == 567); + CPPUNIT_ASSERT_MESSAGE("getStringValue: wrong twips value returned", tp1->getStringValue() == "1.000 cm"); + + Property::Pointer_t tp2 = createTwipsProperty(NS_style::LN_position, "1 cm"); + CPPUNIT_ASSERT_MESSAGE("getIntValue: wrong twips value returned", tp2->getIntValue() == 567); + CPPUNIT_ASSERT_MESSAGE("getStringValue: wrong twips value returned", tp2->getStringValue() == "1.000 cm"); + + Property::Pointer_t tp3 = createTwipsProperty(NS_style::LN_position, "1 cm "); + CPPUNIT_ASSERT_MESSAGE("getIntValue: wrong twips value returned", tp3->getIntValue() == 567); + CPPUNIT_ASSERT_MESSAGE("getStringValue: wrong twips value returned", tp3->getStringValue() == "1.000 cm"); + + Property::Pointer_t tp4 = createTwipsProperty(NS_style::LN_position, "0 cm"); + CPPUNIT_ASSERT_MESSAGE("getIntValue: wrong twips value returned", tp4->getIntValue() == 0); + CPPUNIT_ASSERT_MESSAGE("getStringValue: wrong twips value returned", tp4->getStringValue() == "0.000 cm"); + + Property::Pointer_t tp5 = createTwipsProperty(NS_style::LN_position, "10mm"); + CPPUNIT_ASSERT_MESSAGE("getIntValue: wrong twips value returned", tp5->getIntValue() == 567); + CPPUNIT_ASSERT_MESSAGE("getStringValue: wrong twips value returned", tp5->getStringValue() == "1.000 cm"); + + Property::Pointer_t tp6 = createTwipsProperty(NS_style::LN_position, 567); + CPPUNIT_ASSERT_MESSAGE("getIntValue: wrong twips value returned", tp6->getIntValue() == 567); + CPPUNIT_ASSERT_MESSAGE("getStringValue: wrong twips value returned", tp6->getStringValue() == "1.000 cm"); + + Property::Pointer_t tp7 = createTwipsProperty(NS_style::LN_position, "100pt"); + CPPUNIT_ASSERT_MESSAGE("getIntValue: wrong twips value returned", tp7->getIntValue() == 2000); + CPPUNIT_ASSERT_MESSAGE("getStringValue: wrong twips value returned", tp7->getStringValue() == "3.527 cm"); + + Property::Pointer_t tp8 = createTwipsProperty(NS_style::LN_position, "1 in"); + CPPUNIT_ASSERT_MESSAGE("getIntValue: wrong twips value returned", tp8->getIntValue() == 1440); + CPPUNIT_ASSERT_MESSAGE("getStringValue: wrong twips value returned", tp8->getStringValue() == "2.540 cm"); + + Property::Pointer_t tp9 = createTwipsProperty(NS_style::LN_position, "-1 cm"); + CPPUNIT_ASSERT_MESSAGE("getIntValue: wrong twips value returned", tp9->getIntValue() == -567); + CPPUNIT_ASSERT_MESSAGE("getStringValue: wrong twips value returned", tp9->getStringValue() == "-1.000 cm"); + + Property::Pointer_t tp10 = createTwipsProperty(NS_style::LN_position, "+1 cm"); + CPPUNIT_ASSERT_MESSAGE("getIntValue: wrong twips value returned", tp10->getIntValue() == 567); + CPPUNIT_ASSERT_MESSAGE("getStringValue: wrong twips value returned", tp10->getStringValue() == "1.000 cm"); + + Property::Pointer_t tp11 = createTwipsProperty(NS_style::LN_position, "1 pt "); + Property::Pointer_t tp12 = createTwipsProperty(NS_style::LN_position, "2pt"); + CPPUNIT_ASSERT_MESSAGE("Comparing twips properties failed", tp11 < tp12); + } + + void testCreateInvalidTwipsProperty() + { + try + { + Property::Pointer_t tp = createTwipsProperty(NS_style::LN_position, "0,1 cm"); + } + catch(std::invalid_argument& ) + { + return; // OK + } + CPPUNIT_ASSERT_MESSAGE("Creating an twips property with invalid number must fail", false); + } + + void testCreateInvalidTwipsProperty2() + { + try + { + Property::Pointer_t tp = createTwipsProperty(NS_style::LN_position, ""); + } + catch(std::invalid_argument& ) + { + return; // OK + } + CPPUNIT_ASSERT_MESSAGE("Creating an twips property with invalid number must fail", false); + } + + void testCreateInvalidTwipsProperty3() + { + try + { + Property::Pointer_t tp = createTwipsProperty(NS_style::LN_position, " cm"); + } + catch(std::invalid_argument& ) + { + return; // OK + } + CPPUNIT_ASSERT_MESSAGE("Creating an twips property with invalid number must fail", false); + } + + CPPUNIT_TEST_SUITE(TestProperty); + CPPUNIT_TEST(testCreateIntProperty); + CPPUNIT_TEST(testCreateStringProperty); + CPPUNIT_TEST(testCreateCompositeProperty); + CPPUNIT_TEST(testPropertyBagAsStructure); + CPPUNIT_TEST(testNoDuplicatesInPropertyBagStructures); + CPPUNIT_TEST(testPropertyBagAsArray); + CPPUNIT_TEST(testDuplicateValuesInArray); + CPPUNIT_TEST(testCopyPropertyBag); + CPPUNIT_TEST(testClearPropertyBag); + CPPUNIT_TEST(testSortPropertyBag); + CPPUNIT_TEST(testCompareSimpleProperties); + CPPUNIT_TEST(testCompareCompositeProperties); + CPPUNIT_TEST(testPropertyPool); + CPPUNIT_TEST(testComplexParagraphProperty); + CPPUNIT_TEST(testInsertEmptyPropertyBag); + CPPUNIT_TEST(testCompareEqualPropertyTypesWithDifferentIdsDoesNotFail); + CPPUNIT_TEST(testDumpPropertyPool); + CPPUNIT_TEST(testDumpEmptyPropertyPool); + CPPUNIT_TEST(testInsertPropertySubsets); + CPPUNIT_TEST(testPropertyPoolGarbageCollection); + CPPUNIT_TEST(testDumpPropertyPoolAfterGarbageCollection); + CPPUNIT_TEST(testCreateTwipsProperty); + CPPUNIT_TEST(testCreateInvalidTwipsProperty); + CPPUNIT_TEST(testCreateInvalidTwipsProperty2); + CPPUNIT_TEST(testCreateInvalidTwipsProperty3); + CPPUNIT_TEST_SUITE_END(); +}; + +//##################################### +// register test suites +CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(TestProperty, "TestProperty"); + +NOADDITIONAL; |