summaryrefslogtreecommitdiffstats
path: root/sot/qa
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-15 05:54:39 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-15 05:54:39 +0000
commit267c6f2ac71f92999e969232431ba04678e7437e (patch)
tree358c9467650e1d0a1d7227a21dac2e3d08b622b2 /sot/qa
parentInitial commit. (diff)
downloadlibreoffice-267c6f2ac71f92999e969232431ba04678e7437e.tar.xz
libreoffice-267c6f2ac71f92999e969232431ba04678e7437e.zip
Adding upstream version 4:24.2.0.upstream/4%24.2.0
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'sot/qa')
-rw-r--r--sot/qa/complex/olesimplestorage/OLESimpleStorageTest.java5
-rw-r--r--sot/qa/complex/olesimplestorage/OLESimpleStorageUnitTest.java84
-rw-r--r--sot/qa/complex/olesimplestorage/Test01.java140
-rw-r--r--sot/qa/complex/olesimplestorage/TestHelper.java41
-rw-r--r--sot/qa/cppunit/data/fail/.gitignore0
-rw-r--r--sot/qa/cppunit/data/fail/fdo70483-1.compoundbin0 -> 175616 bytes
-rw-r--r--sot/qa/cppunit/data/fail/next-page-1.compoundbin0 -> 763 bytes
-rw-r--r--sot/qa/cppunit/data/fail/oversized-fat-1.compoundbin0 -> 5890 bytes
-rw-r--r--sot/qa/cppunit/data/indeterminate/.gitignore0
-rw-r--r--sot/qa/cppunit/data/pass/badchain-1.compoundbin0 -> 1041 bytes
-rw-r--r--sot/qa/cppunit/data/pass/fdo41642-2.compoundbin0 -> 35335 bytes
-rw-r--r--sot/qa/cppunit/data/pass/fdo41642-3.compoundbin0 -> 1252352 bytes
-rw-r--r--sot/qa/cppunit/data/pass/fdo53909-1.compoundbin0 -> 20992 bytes
-rw-r--r--sot/qa/cppunit/data/pass/fdo57532-1.compoundbin0 -> 25088 bytes
-rw-r--r--sot/qa/cppunit/data/pass/fdo84229-1.compoundbin0 -> 14848 bytes
-rw-r--r--sot/qa/cppunit/data/pass/loop-1.compoundbin0 -> 3584 bytes
-rw-r--r--sot/qa/cppunit/data/pass/tdf112399-1.compoundbin0 -> 103427 bytes
-rw-r--r--sot/qa/cppunit/test_sot.cxx183
18 files changed, 453 insertions, 0 deletions
diff --git a/sot/qa/complex/olesimplestorage/OLESimpleStorageTest.java b/sot/qa/complex/olesimplestorage/OLESimpleStorageTest.java
new file mode 100644
index 0000000000..f01a141780
--- /dev/null
+++ b/sot/qa/complex/olesimplestorage/OLESimpleStorageTest.java
@@ -0,0 +1,5 @@
+package complex.olesimplestorage;
+
+interface OLESimpleStorageTest {
+ boolean test();
+}
diff --git a/sot/qa/complex/olesimplestorage/OLESimpleStorageUnitTest.java b/sot/qa/complex/olesimplestorage/OLESimpleStorageUnitTest.java
new file mode 100644
index 0000000000..4c96ce1f65
--- /dev/null
+++ b/sot/qa/complex/olesimplestorage/OLESimpleStorageUnitTest.java
@@ -0,0 +1,84 @@
+/*
+ * 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/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed
+ * with this work for additional information regarding copyright
+ * ownership. The ASF licenses this file to you under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of
+ * the License at http://www.apache.org/licenses/LICENSE-2.0 .
+ */
+package complex.olesimplestorage;
+
+import com.sun.star.lang.XMultiServiceFactory;
+import com.sun.star.uno.UnoRuntime;
+
+
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.openoffice.test.OfficeConnection;
+import static org.junit.Assert.*;
+
+/* Document.
+ */
+
+public class OLESimpleStorageUnitTest
+{
+ private XMultiServiceFactory m_xMSF = null;
+
+ @Before public void before () {
+ System.out.println("before()");
+ try {
+ m_xMSF = getMSF();
+ } catch ( Exception e ){
+ fail( "Cannot create service factory!" );
+ }
+ if ( m_xMSF == null ) {
+ fail( "Cannot create service factory!" );
+ }
+ }
+
+ @After public void after () {
+ System.out.println("after()");
+ m_xMSF = null;
+ }
+
+ @Test public void ExecuteTest01() {
+ System.out.println("ExecuteTest01()");
+ OLESimpleStorageTest aTest = new Test01( m_xMSF );
+ assertTrue( "Test01 failed!", aTest.test() );
+ }
+
+
+
+ private XMultiServiceFactory getMSF()
+ {
+ return UnoRuntime.queryInterface(XMultiServiceFactory.class, connection.getComponentContext().getServiceManager());
+ }
+
+ // setup and close connections
+ @BeforeClass public static void setUpConnection() throws Exception {
+ System.out.println("setUpConnection()");
+ connection.setUp();
+ }
+
+ @AfterClass public static void tearDownConnection()
+ throws InterruptedException, com.sun.star.uno.Exception
+ {
+ System.out.println("tearDownConnection()");
+ connection.tearDown();
+ }
+
+ private static final OfficeConnection connection = new OfficeConnection();
+
+} \ No newline at end of file
diff --git a/sot/qa/complex/olesimplestorage/Test01.java b/sot/qa/complex/olesimplestorage/Test01.java
new file mode 100644
index 0000000000..18d220e054
--- /dev/null
+++ b/sot/qa/complex/olesimplestorage/Test01.java
@@ -0,0 +1,140 @@
+/*
+ * 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/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed
+ * with this work for additional information regarding copyright
+ * ownership. The ASF licenses this file to you under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of
+ * the License at http://www.apache.org/licenses/LICENSE-2.0 .
+ */
+
+package complex.olesimplestorage;
+
+import com.sun.star.lang.XMultiServiceFactory;
+import com.sun.star.io.XTempFile;
+import com.sun.star.embed.XOLESimpleStorage;
+import com.sun.star.uno.UnoRuntime;
+
+import java.util.Random;
+
+
+public class Test01 implements OLESimpleStorageTest
+{
+ private XMultiServiceFactory m_xMSF = null;
+ private TestHelper m_aTestHelper = null;
+ private static final int pStreamCnt = 5;
+ private static final int pBytesCnt = 10;
+
+ public Test01 ( XMultiServiceFactory xMSF )
+ {
+ m_xMSF = xMSF;
+ m_aTestHelper = new TestHelper ("Test01: ");
+ }
+
+ public boolean test ()
+ {
+ try
+ {
+ //create a new temporary stream
+ Object oTempFile = m_xMSF.createInstance ( "com.sun.star.io.TempFile" );
+ XTempFile xTempFile = UnoRuntime.queryInterface(XTempFile.class, oTempFile);
+ m_aTestHelper.Message ( "A new temporary stream created." );
+
+ //create OLESimpleStorage based on it
+ Object pArgs[] = new Object[2];
+ pArgs[0] = xTempFile;
+ pArgs[1] = Boolean.TRUE;
+ Object oOLESimpleStorage = m_xMSF.createInstanceWithArguments ( "com.sun.star.embed.OLESimpleStorage", pArgs );
+ XOLESimpleStorage xOLESimpleStorage = UnoRuntime.queryInterface(XOLESimpleStorage.class, oOLESimpleStorage);
+ m_aTestHelper.Message ( "OLESimpleStorage based on XStream created." );
+
+ //fill it with some streams
+ Object oStream[] = new Object[pStreamCnt];
+ byte pBytesIn[][][] = new byte [pStreamCnt][1][pBytesCnt];
+ byte pBytesOut[][] = new byte [pStreamCnt][pBytesCnt];
+ XTempFile xTempStream[] = new XTempFile[pStreamCnt];
+ Random oRandom = new Random ();
+ final String sSubStreamPrefix = "SubStream";
+ for ( int i = 0; i < pStreamCnt; i++ )
+ {
+ oRandom.nextBytes (pBytesOut[i]);
+ oStream[i] = m_xMSF.createInstance ( "com.sun.star.io.TempFile" );
+ xTempStream[i] = UnoRuntime.queryInterface(XTempFile.class, oStream[i]);
+ xTempStream[i].getOutputStream ().writeBytes (pBytesOut[i]);
+ xTempStream[i].seek (0);
+ m_aTestHelper.Message ( "Substream " + i + " initialized." );
+ if (xOLESimpleStorage.hasByName (sSubStreamPrefix + i))
+ {
+ xOLESimpleStorage.replaceByName ( sSubStreamPrefix + i, xTempStream[i] );
+ }
+ else
+ {
+ xOLESimpleStorage.insertByName ( sSubStreamPrefix + i, xTempStream[i] );
+ m_aTestHelper.Message ( "Substream " + i + " inserted." );
+ }
+ }
+
+ //commit the storage and close it
+ xOLESimpleStorage.commit ();
+ m_aTestHelper.Message ( "Storage committed." );
+ xOLESimpleStorage.dispose ();
+ for ( int i = 0; i < pStreamCnt; ++i )
+ {
+ xTempStream[i].setRemoveFile ( true );
+ xTempStream[i].getInputStream ().closeInput ();
+ xTempStream[i].getOutputStream ().closeOutput ();
+ }
+ m_aTestHelper.Message ( "Storage closed." );
+
+ //open the same stream with the constructor for inputstream
+ pArgs[0] = xTempFile.getInputStream ();
+ oOLESimpleStorage = m_xMSF.createInstanceWithArguments ( "com.sun.star.embed.OLESimpleStorage", pArgs );
+ xOLESimpleStorage = UnoRuntime.queryInterface(XOLESimpleStorage.class, oOLESimpleStorage);
+ m_aTestHelper.Message ( "Storage reopened, based on XInputStream." );
+
+ //check that all the streams contain correct information
+ m_aTestHelper.Message ( "Checking data contained in all the substreams..." );
+ for ( int i = 0; i < pStreamCnt; ++i )
+ {
+ if ( xOLESimpleStorage.hasByName (sSubStreamPrefix + i) )
+ {
+ xTempStream[i] = UnoRuntime.queryInterface(XTempFile.class, xOLESimpleStorage.getByName(sSubStreamPrefix + i));
+ xTempStream[i].seek (0);
+ xTempStream[i].getInputStream ().readBytes (pBytesIn[i], pBytesIn[i][0].length + 1 );
+ for ( int j = 0; j < pBytesCnt; ++j )
+ {
+ if ( pBytesIn[i][0][j] != pBytesOut[i][j] )
+ {
+ m_aTestHelper.Error ( "Stream " + i + " byte " + j + ": INCORRECT DATA!");
+ return false;
+ }
+ else
+ {
+ m_aTestHelper.Message ( "Stream " + i + " byte " + j + ": CORRECT." );
+ }
+ }
+ }
+ else
+ {
+ m_aTestHelper.Error( "Stream " + i + " is lost!");
+ return false;
+ }
+ }
+ m_aTestHelper.Message ( "All substreams contain correct data. SUCCESS." );
+ }
+ catch ( Exception e )
+ {
+ m_aTestHelper.Error ( "Exception: " + e );
+ return false;
+ }
+ return true;
+ }
+}
diff --git a/sot/qa/complex/olesimplestorage/TestHelper.java b/sot/qa/complex/olesimplestorage/TestHelper.java
new file mode 100644
index 0000000000..651ee92183
--- /dev/null
+++ b/sot/qa/complex/olesimplestorage/TestHelper.java
@@ -0,0 +1,41 @@
+/*
+ * 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/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed
+ * with this work for additional information regarding copyright
+ * ownership. The ASF licenses this file to you under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of
+ * the License at http://www.apache.org/licenses/LICENSE-2.0 .
+ */
+
+package complex.olesimplestorage;
+
+public class TestHelper
+{
+
+ private String m_sTestPrefix;
+
+ public TestHelper ( String sTestPrefix )
+ {
+
+ m_sTestPrefix = sTestPrefix;
+ }
+
+ public void Error ( String sError )
+ {
+ System.out.println ( m_sTestPrefix + "Error: " + sError );
+ }
+
+ public void Message ( String sMessage )
+ {
+ System.out.println ( m_sTestPrefix + sMessage );
+ }
+}
diff --git a/sot/qa/cppunit/data/fail/.gitignore b/sot/qa/cppunit/data/fail/.gitignore
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/sot/qa/cppunit/data/fail/.gitignore
diff --git a/sot/qa/cppunit/data/fail/fdo70483-1.compound b/sot/qa/cppunit/data/fail/fdo70483-1.compound
new file mode 100644
index 0000000000..4f6e4f1e7b
--- /dev/null
+++ b/sot/qa/cppunit/data/fail/fdo70483-1.compound
Binary files differ
diff --git a/sot/qa/cppunit/data/fail/next-page-1.compound b/sot/qa/cppunit/data/fail/next-page-1.compound
new file mode 100644
index 0000000000..8a187a3bad
--- /dev/null
+++ b/sot/qa/cppunit/data/fail/next-page-1.compound
Binary files differ
diff --git a/sot/qa/cppunit/data/fail/oversized-fat-1.compound b/sot/qa/cppunit/data/fail/oversized-fat-1.compound
new file mode 100644
index 0000000000..6b25c95b45
--- /dev/null
+++ b/sot/qa/cppunit/data/fail/oversized-fat-1.compound
Binary files differ
diff --git a/sot/qa/cppunit/data/indeterminate/.gitignore b/sot/qa/cppunit/data/indeterminate/.gitignore
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/sot/qa/cppunit/data/indeterminate/.gitignore
diff --git a/sot/qa/cppunit/data/pass/badchain-1.compound b/sot/qa/cppunit/data/pass/badchain-1.compound
new file mode 100644
index 0000000000..4c70faf207
--- /dev/null
+++ b/sot/qa/cppunit/data/pass/badchain-1.compound
Binary files differ
diff --git a/sot/qa/cppunit/data/pass/fdo41642-2.compound b/sot/qa/cppunit/data/pass/fdo41642-2.compound
new file mode 100644
index 0000000000..b1ae6dd630
--- /dev/null
+++ b/sot/qa/cppunit/data/pass/fdo41642-2.compound
Binary files differ
diff --git a/sot/qa/cppunit/data/pass/fdo41642-3.compound b/sot/qa/cppunit/data/pass/fdo41642-3.compound
new file mode 100644
index 0000000000..46a9e84d1d
--- /dev/null
+++ b/sot/qa/cppunit/data/pass/fdo41642-3.compound
Binary files differ
diff --git a/sot/qa/cppunit/data/pass/fdo53909-1.compound b/sot/qa/cppunit/data/pass/fdo53909-1.compound
new file mode 100644
index 0000000000..1faa74dee9
--- /dev/null
+++ b/sot/qa/cppunit/data/pass/fdo53909-1.compound
Binary files differ
diff --git a/sot/qa/cppunit/data/pass/fdo57532-1.compound b/sot/qa/cppunit/data/pass/fdo57532-1.compound
new file mode 100644
index 0000000000..70068fe10c
--- /dev/null
+++ b/sot/qa/cppunit/data/pass/fdo57532-1.compound
Binary files differ
diff --git a/sot/qa/cppunit/data/pass/fdo84229-1.compound b/sot/qa/cppunit/data/pass/fdo84229-1.compound
new file mode 100644
index 0000000000..46eb4da8fd
--- /dev/null
+++ b/sot/qa/cppunit/data/pass/fdo84229-1.compound
Binary files differ
diff --git a/sot/qa/cppunit/data/pass/loop-1.compound b/sot/qa/cppunit/data/pass/loop-1.compound
new file mode 100644
index 0000000000..eddb9164c9
--- /dev/null
+++ b/sot/qa/cppunit/data/pass/loop-1.compound
Binary files differ
diff --git a/sot/qa/cppunit/data/pass/tdf112399-1.compound b/sot/qa/cppunit/data/pass/tdf112399-1.compound
new file mode 100644
index 0000000000..d3628def0c
--- /dev/null
+++ b/sot/qa/cppunit/data/pass/tdf112399-1.compound
Binary files differ
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: */