summaryrefslogtreecommitdiffstats
path: root/sot/qa/cppunit/test_sot.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'sot/qa/cppunit/test_sot.cxx')
-rw-r--r--sot/qa/cppunit/test_sot.cxx183
1 files changed, 183 insertions, 0 deletions
diff --git a/sot/qa/cppunit/test_sot.cxx b/sot/qa/cppunit/test_sot.cxx
new file mode 100644
index 0000000000..fde0757fba
--- /dev/null
+++ b/sot/qa/cppunit/test_sot.cxx
@@ -0,0 +1,183 @@
+/* -*- 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 <unotest/filters-test.hxx>
+#include <unotest/bootstrapfixturebase.hxx>
+
+#include <sot/storage.hxx>
+#include <sot/storinfo.hxx>
+#include <sysformats.hxx>
+
+using namespace ::com::sun::star;
+
+namespace
+{
+ auto FindFormatIndex(std::span<const SotAction_Impl> pFormats, SotClipboardFormatId eFormat)
+ {
+ auto it = std::find_if(pFormats.begin(), pFormats.end(),
+ [eFormat](const auto& item) { return item.nFormatId == eFormat; });
+ return std::distance(pFormats.begin(), it);
+ }
+
+ class SotTest
+ : public test::FiltersTest
+ , public test::BootstrapFixtureBase
+ {
+ public:
+ SotTest() {}
+
+ bool checkStream( const tools::SvRef<SotStorage> &xObjStor,
+ const OUString &rStreamName,
+ sal_uInt64 nSize );
+ bool checkStorage( const tools::SvRef<SotStorage> &xObjStor );
+
+ virtual bool load(const OUString &,
+ const OUString &rURL, const OUString &,
+ SfxFilterFlags, SotClipboardFormatId, unsigned int) override;
+
+ void test();
+ void testSize();
+ void testClipboard();
+
+ CPPUNIT_TEST_SUITE(SotTest);
+ CPPUNIT_TEST(test);
+ CPPUNIT_TEST(testSize);
+ CPPUNIT_TEST(testClipboard);
+ CPPUNIT_TEST_SUITE_END();
+ };
+
+ bool SotTest::checkStream( const tools::SvRef<SotStorage> &xObjStor,
+ const OUString &rStreamName,
+ sal_uInt64 nSize )
+ {
+ unsigned char *pData = static_cast<unsigned char*>(malloc( nSize ));
+ sal_uInt64 nReadableSize = 0;
+ if( !pData )
+ return true;
+
+ { // Read the data in one block
+ tools::SvRef<SotStorageStream> xStream( xObjStor->OpenSotStream( rStreamName ) );
+ xStream->Seek(0);
+ sal_uInt64 nRemaining = xStream->GetSize() - xStream->Tell();
+
+ CPPUNIT_ASSERT_EQUAL_MESSAGE( "check size", nSize, nRemaining );
+ CPPUNIT_ASSERT_EQUAL_MESSAGE( "check size #2", nSize, xStream->remainingSize());
+
+ // Read as much as we can, a corrupted FAT chain can cause real grief here
+ nReadableSize = xStream->ReadBytes(static_cast<void *>(pData), nSize);
+ }
+ { // Read the data backwards as well
+ tools::SvRef<SotStorageStream> xStream( xObjStor->OpenSotStream( rStreamName ) );
+ for( sal_uInt64 i = nReadableSize; i > 0; i-- )
+ {
+ CPPUNIT_ASSERT_MESSAGE( "sot reading error", !xStream->GetError() );
+ unsigned char c;
+ xStream->Seek( i - 1 );
+ CPPUNIT_ASSERT_EQUAL_MESSAGE( "sot storage reading byte",
+ static_cast<size_t>(1), xStream->ReadBytes(&c, 1));
+ CPPUNIT_ASSERT_EQUAL_MESSAGE( "mismatching data storage reading byte",
+ c, pData[i - 1] );
+ }
+ }
+ free(pData);
+ return true;
+ }
+
+ bool SotTest::checkStorage( const tools::SvRef<SotStorage> &xObjStor )
+ {
+ SvStorageInfoList aInfoList;
+ xObjStor->FillInfoList( &aInfoList );
+
+ for (auto& rInfo : aInfoList)
+ {
+ if( rInfo.IsStorage() )
+ {
+ tools::SvRef<SotStorage> xChild( xObjStor->OpenSotStorage( rInfo.GetName() ) );
+ checkStorage( xChild );
+ }
+ else if( rInfo.IsStream() )
+ checkStream( xObjStor, rInfo.GetName(), rInfo.GetSize() );
+ }
+
+ return true;
+ }
+
+ bool SotTest::load(const OUString &,
+ const OUString &rURL, const OUString &,
+ SfxFilterFlags, SotClipboardFormatId, unsigned int)
+ {
+ SvFileStream aStream(rURL, StreamMode::READ);
+ tools::SvRef<SotStorage> xObjStor = new SotStorage(aStream);
+ if (!xObjStor.is() || xObjStor->GetError())
+ return false;
+
+ CPPUNIT_ASSERT_MESSAGE("sot storage is not valid", xObjStor->Validate());
+ return checkStorage (xObjStor);
+ }
+
+ void SotTest::test()
+ {
+ testDir(OUString(),
+ m_directories.getURLFromSrc(u"/sot/qa/cppunit/data/"));
+ }
+
+ void SotTest::testSize()
+ {
+ OUString aURL(
+ m_directories.getURLFromSrc(u"/sot/qa/cppunit/data/pass/fdo84229-1.compound"));
+ SvFileStream aStream(aURL, StreamMode::READ);
+ tools::SvRef<SotStorage> xObjStor = new SotStorage(aStream);
+ CPPUNIT_ASSERT_MESSAGE("sot storage failed to open",
+ xObjStor.is());
+ CPPUNIT_ASSERT_MESSAGE("sot storage failed to open",
+ !xObjStor->GetError());
+ tools::SvRef<SotStorageStream> xStream = xObjStor->OpenSotStream("Book");
+ CPPUNIT_ASSERT_MESSAGE("stream failed to open",
+ xStream.is());
+ CPPUNIT_ASSERT_MESSAGE("stream failed to open",
+ !xObjStor->GetError());
+ CPPUNIT_ASSERT_MESSAGE("error in opened stream", !xStream->GetError());
+ sal_uInt64 nPos = xStream->GetSize();
+ CPPUNIT_ASSERT_EQUAL_MESSAGE("odd stream length", static_cast<sal_uInt64>(13312), nPos);
+
+ xStream->Seek(STREAM_SEEK_TO_END);
+ CPPUNIT_ASSERT_MESSAGE("error seeking to end", !xStream->GetError());
+ // cf. comment in Pos2Page, not extremely intuitive ...
+ CPPUNIT_ASSERT_EQUAL_MESSAGE("stream not at beginning", static_cast<sal_uInt64>(xStream->GetSize()), xStream->Tell());
+ xStream->Seek(STREAM_SEEK_TO_BEGIN);
+
+ CPPUNIT_ASSERT_MESSAGE("error seeking to beginning", !xStream->GetError());
+ CPPUNIT_ASSERT_EQUAL_MESSAGE("stream not at beginning", static_cast<sal_uInt64>(0), xStream->Tell());
+ }
+
+ void SotTest::testClipboard()
+ {
+ auto pFormats = sot::GetExchangeDestinationWriterFreeAreaCopy();
+ // tdf#52547 prefer BITMAP over HTML
+ // tdf#78801 prefer image over html over text
+ CPPUNIT_ASSERT(FindFormatIndex(pFormats, SotClipboardFormatId::BITMAP) < FindFormatIndex(pFormats, SotClipboardFormatId::HTML));
+ CPPUNIT_ASSERT(FindFormatIndex(pFormats, SotClipboardFormatId::HTML) < FindFormatIndex(pFormats, SotClipboardFormatId::STRING));
+ // tdf#81835 prefer RTF/HTML over GDI Metafile
+ CPPUNIT_ASSERT(FindFormatIndex(pFormats, SotClipboardFormatId::RTF) < FindFormatIndex(pFormats, SotClipboardFormatId::GDIMETAFILE));
+ CPPUNIT_ASSERT(FindFormatIndex(pFormats, SotClipboardFormatId::HTML) < FindFormatIndex(pFormats, SotClipboardFormatId::GDIMETAFILE));
+#ifndef MACOSX
+ // tdf#115574 prefer RTF over BITMAP (Excel provides a BITMAP we can't
+ // read, also Excel paste result used to be an editable table)
+ CPPUNIT_ASSERT(FindFormatIndex(pFormats, SotClipboardFormatId::RTF) < FindFormatIndex(pFormats, SotClipboardFormatId::BITMAP));
+#else
+ CPPUNIT_ASSERT(FindFormatIndex(pFormats, SotClipboardFormatId::BITMAP) < FindFormatIndex(pFormats, SotClipboardFormatId::RTF));
+#endif
+ }
+
+ CPPUNIT_TEST_SUITE_REGISTRATION(SotTest);
+}
+
+CPPUNIT_PLUGIN_IMPLEMENT();
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */