summaryrefslogtreecommitdiff
path: root/writerfilter/qa
diff options
context:
space:
mode:
authorMichael Stahl <mstahl@redhat.com>2014-03-01 22:05:51 +0100
committerMichael Stahl <mstahl@redhat.com>2014-03-03 13:53:22 +0100
commit3dc548476c7e88f7a67cc38daf622631a34e34dd (patch)
tree3e2997da22b671eb176e9c4c2bc5d86e0c14b3bf /writerfilter/qa
parent74b3f4f00766d199df3b017d056cf7a00ae52988 (diff)
writerfilter: salvage a field parameter parsing train wreck
Field parameters get horribly maimed by lcl_ExtractParameter which clearly has never worked in its 7 years of existence (and looking at the inanity at the call sites makes one wonder what the author was smoking). The format is actually quite annoying, since spaces between parameters are optional. The old RTF filter was at least able to parse "PAGEREF bookmark" fields, so this fixes such regressions (related: rhbz#1065629). Change-Id: I9b2e32c3c7264be0fc1077cb8fb3f1bc5c1955bb
Diffstat (limited to 'writerfilter/qa')
-rw-r--r--writerfilter/qa/cppunittests/misc/misc.cxx162
1 files changed, 162 insertions, 0 deletions
diff --git a/writerfilter/qa/cppunittests/misc/misc.cxx b/writerfilter/qa/cppunittests/misc/misc.cxx
new file mode 100644
index 000000000000..f7031b410fef
--- /dev/null
+++ b/writerfilter/qa/cppunittests/misc/misc.cxx
@@ -0,0 +1,162 @@
+/* -*- 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 <limits>
+#include <vector>
+
+#include <boost/tuple/tuple.hpp>
+
+#include <cppunit/TestAssert.h>
+#include <cppunit/TestFixture.h>
+#include <cppunit/extensions/HelperMacros.h>
+#include <cppunit/plugin/TestPlugIn.h>
+
+#include <sal/types.h>
+
+#include <rtl/ustring.hxx>
+
+#include <WriterFilterDllApi.hxx>
+
+
+using namespace std;
+
+
+namespace writerfilter { namespace dmapper {
+
+SAL_DLLPUBLIC_IMPORT // export just for test
+boost::tuple<OUString, vector<OUString>, vector<OUString> >
+lcl_SplitFieldCommand(const OUString& rCommand);
+
+} }
+
+
+namespace {
+
+class WriterfilterMiscTest
+ : public ::CppUnit::TestFixture
+{
+public:
+ virtual void setUp();
+ virtual void tearDown();
+
+ void testFieldParameters();
+
+ CPPUNIT_TEST_SUITE(WriterfilterMiscTest);
+ CPPUNIT_TEST(testFieldParameters);
+ CPPUNIT_TEST_SUITE_END();
+};
+
+void WriterfilterMiscTest::setUp()
+{
+}
+
+void WriterfilterMiscTest::tearDown()
+{
+}
+
+void WriterfilterMiscTest::testFieldParameters()
+{
+ using writerfilter::dmapper::lcl_SplitFieldCommand;
+ boost::tuple<OUString, vector<OUString>, vector<OUString> > result;
+
+ result = lcl_SplitFieldCommand("PAGEREF last_page");
+ CPPUNIT_ASSERT_EQUAL(OUString("PAGEREF"), boost::get<0>(result));
+ CPPUNIT_ASSERT_EQUAL(size_t(1), boost::get<1>(result).size());
+ CPPUNIT_ASSERT_EQUAL(OUString("last_page"), boost::get<1>(result)[0]);
+ CPPUNIT_ASSERT(boost::get<2>(result).empty());
+
+ result = lcl_SplitFieldCommand(" PAGEREF last_page ");
+ CPPUNIT_ASSERT_EQUAL(OUString("PAGEREF"), boost::get<0>(result));
+ CPPUNIT_ASSERT_EQUAL(size_t(1), boost::get<1>(result).size());
+ CPPUNIT_ASSERT_EQUAL(OUString("last_page"), boost::get<1>(result)[0]);
+
+ result = lcl_SplitFieldCommand("pageref last_page");
+ CPPUNIT_ASSERT(boost::get<2>(result).empty());
+ CPPUNIT_ASSERT_EQUAL(OUString("PAGEREF"), boost::get<0>(result));
+ CPPUNIT_ASSERT_EQUAL(size_t(1), boost::get<1>(result).size());
+ CPPUNIT_ASSERT_EQUAL(OUString("last_page"), boost::get<1>(result)[0]);
+ CPPUNIT_ASSERT(boost::get<2>(result).empty());
+
+ result = lcl_SplitFieldCommand("pageref \"last_page\"");
+ CPPUNIT_ASSERT_EQUAL(OUString("PAGEREF"), boost::get<0>(result));
+ CPPUNIT_ASSERT_EQUAL(size_t(1), boost::get<1>(result).size());
+ CPPUNIT_ASSERT_EQUAL(OUString("last_page"), boost::get<1>(result)[0]);
+ CPPUNIT_ASSERT(boost::get<2>(result).empty());
+
+ result = lcl_SplitFieldCommand("\"PAGEREF\" \"last_page\" \"\" ");
+ CPPUNIT_ASSERT_EQUAL(OUString("PAGEREF"), boost::get<0>(result));
+ CPPUNIT_ASSERT_EQUAL(size_t(2), boost::get<1>(result).size());
+ CPPUNIT_ASSERT_EQUAL(OUString("last_page"), boost::get<1>(result)[0]);
+ CPPUNIT_ASSERT_EQUAL(OUString(), boost::get<1>(result)[1]);
+ CPPUNIT_ASSERT(boost::get<2>(result).empty());
+
+ result = lcl_SplitFieldCommand("\"PAGEREF\"\"last_page\" ");
+ CPPUNIT_ASSERT_EQUAL(OUString("PAGEREF"), boost::get<0>(result));
+ CPPUNIT_ASSERT_EQUAL(size_t(1), boost::get<1>(result).size());
+ CPPUNIT_ASSERT_EQUAL(OUString("last_page"), boost::get<1>(result)[0]);
+ CPPUNIT_ASSERT(boost::get<2>(result).empty());
+
+ result = lcl_SplitFieldCommand("PAGEREF\"last_page\" ");
+ CPPUNIT_ASSERT_EQUAL(OUString("PAGEREF"), boost::get<0>(result));
+ CPPUNIT_ASSERT_EQUAL(size_t(1), boost::get<1>(result).size());
+ CPPUNIT_ASSERT_EQUAL(OUString("last_page"), boost::get<1>(result)[0]);
+ CPPUNIT_ASSERT(boost::get<2>(result).empty());
+
+ result = lcl_SplitFieldCommand("\"PAGEREF\"last_page \"\"");
+ CPPUNIT_ASSERT_EQUAL(OUString("PAGEREF"), boost::get<0>(result));
+ CPPUNIT_ASSERT_EQUAL(size_t(2), boost::get<1>(result).size());
+ CPPUNIT_ASSERT_EQUAL(OUString("last_page"), boost::get<1>(result)[0]);
+ CPPUNIT_ASSERT_EQUAL(OUString(), boost::get<1>(result)[1]);
+ CPPUNIT_ASSERT(boost::get<2>(result).empty());
+
+ result = lcl_SplitFieldCommand("\"PAGEREF\"last_page \"\"");
+ CPPUNIT_ASSERT_EQUAL(OUString("PAGEREF"), boost::get<0>(result));
+ CPPUNIT_ASSERT_EQUAL(size_t(2), boost::get<1>(result).size());
+ CPPUNIT_ASSERT_EQUAL(OUString("last_page"), boost::get<1>(result)[0]);
+ CPPUNIT_ASSERT_EQUAL(OUString(), boost::get<1>(result)[1]);
+ CPPUNIT_ASSERT(boost::get<2>(result).empty());
+
+ result = lcl_SplitFieldCommand("pageref \"last\\\\pa\\\"ge\"");
+ CPPUNIT_ASSERT_EQUAL(OUString("PAGEREF"), boost::get<0>(result));
+ CPPUNIT_ASSERT_EQUAL(size_t(1), boost::get<1>(result).size());
+ CPPUNIT_ASSERT_EQUAL(OUString("last\\pa\"ge"), boost::get<1>(result)[0]);
+ CPPUNIT_ASSERT(boost::get<2>(result).empty());
+
+ result = lcl_SplitFieldCommand("PAGEREF\"last_page\"\\*");
+ CPPUNIT_ASSERT_EQUAL(OUString("PAGEREF"), boost::get<0>(result));
+ CPPUNIT_ASSERT_EQUAL(size_t(1), boost::get<1>(result).size());
+ CPPUNIT_ASSERT_EQUAL(OUString("last_page"), boost::get<1>(result)[0]);
+ CPPUNIT_ASSERT_EQUAL(size_t(1), boost::get<2>(result).size());
+ CPPUNIT_ASSERT_EQUAL(OUString("\\*"), boost::get<2>(result)[0]);
+
+ result = lcl_SplitFieldCommand("PAGEREF last_page \\b foobar ");
+ CPPUNIT_ASSERT_EQUAL(OUString("PAGEREF"), boost::get<0>(result));
+ CPPUNIT_ASSERT_EQUAL(size_t(1), boost::get<1>(result).size());
+ CPPUNIT_ASSERT_EQUAL(OUString("last_page"), boost::get<1>(result)[0]);
+ CPPUNIT_ASSERT_EQUAL(size_t(2), boost::get<2>(result).size());
+ CPPUNIT_ASSERT_EQUAL(OUString("\\B"), boost::get<2>(result)[0]);
+ CPPUNIT_ASSERT_EQUAL(OUString("foobar"), boost::get<2>(result)[1]);
+
+ result = lcl_SplitFieldCommand("PAGEREF\\bfoobar\\A\"\"");
+ CPPUNIT_ASSERT_EQUAL(OUString("PAGEREF"), boost::get<0>(result));
+ CPPUNIT_ASSERT(boost::get<1>(result).empty());
+ CPPUNIT_ASSERT_EQUAL(size_t(4), boost::get<2>(result).size());
+ CPPUNIT_ASSERT_EQUAL(OUString("\\B"), boost::get<2>(result)[0]);
+ CPPUNIT_ASSERT_EQUAL(OUString("foobar"), boost::get<2>(result)[1]);
+ CPPUNIT_ASSERT_EQUAL(OUString("\\A"), boost::get<2>(result)[2]);
+ CPPUNIT_ASSERT_EQUAL(OUString(), boost::get<2>(result)[3]);
+}
+
+CPPUNIT_TEST_SUITE_REGISTRATION(WriterfilterMiscTest);
+
+}
+
+CPPUNIT_PLUGIN_IMPLEMENT();
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */