summaryrefslogtreecommitdiffstats
path: root/sc/qa/unit/bugfix-test.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'sc/qa/unit/bugfix-test.cxx')
-rw-r--r--sc/qa/unit/bugfix-test.cxx781
1 files changed, 781 insertions, 0 deletions
diff --git a/sc/qa/unit/bugfix-test.cxx b/sc/qa/unit/bugfix-test.cxx
new file mode 100644
index 000000000..2975b0b0a
--- /dev/null
+++ b/sc/qa/unit/bugfix-test.cxx
@@ -0,0 +1,781 @@
+/* -*- 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 <sal/config.h>
+
+#include <cstdlib>
+#include <string_view>
+
+#include <postit.hxx>
+#include <validat.hxx>
+#include <tabvwsh.hxx>
+#include <com/sun/star/frame/Desktop.hpp>
+#include <com/sun/star/drawing/FillStyle.hpp>
+#include "helper/qahelper.hxx"
+#include <comphelper/processfactory.hxx>
+#include <comphelper/propertyvalue.hxx>
+#include <svx/svdocapt.hxx>
+#include <svx/xfillit0.hxx>
+#include <svx/xflclit.hxx>
+#include <svx/xflgrit.hxx>
+#include <svx/xflhtit.hxx>
+#include <drwlayer.hxx>
+#include <svx/svdpage.hxx>
+#include <svx/svdomeas.hxx>
+#include <userdat.hxx>
+#include <stlpool.hxx>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+
+class ScFiltersTest : public ScBootstrapFixture
+{
+public:
+ ScFiltersTest();
+
+ virtual void setUp() override;
+ virtual void tearDown() override;
+
+ void testTdf137576_Measureline();
+ void testTdf137216_HideCol();
+ void testTdf137044_CoverHiddenRows();
+ void testTdf137020_FlipVertical();
+ void testTdf64229();
+ void testTdf36933();
+ void testTdf43700();
+ void testTdf43534();
+ void testTdf91979();
+ // void testTdf40110();
+ void testTdf98657();
+ void testTdf88821();
+ void testTdf88821_2();
+ void testTdf103960();
+ void testRhbz1390776();
+ void testTdf104310();
+ void testTdf31231();
+ void testTdf141914();
+ void testTdf128951();
+ void testTdf129789();
+ void testTdf130725();
+ void testTdf104502_hiddenColsCountedInPageCount();
+ void testTdf108188_pagestyle();
+
+ CPPUNIT_TEST_SUITE(ScFiltersTest);
+ CPPUNIT_TEST(testTdf137576_Measureline);
+ CPPUNIT_TEST(testTdf137216_HideCol);
+ CPPUNIT_TEST(testTdf137044_CoverHiddenRows);
+ CPPUNIT_TEST(testTdf137020_FlipVertical);
+ CPPUNIT_TEST(testTdf64229);
+ CPPUNIT_TEST(testTdf36933);
+ CPPUNIT_TEST(testTdf43700);
+ CPPUNIT_TEST(testTdf43534);
+ CPPUNIT_TEST(testTdf91979);
+ // CPPUNIT_TEST(testTdf40110);
+ CPPUNIT_TEST(testTdf98657);
+ CPPUNIT_TEST(testTdf88821);
+ CPPUNIT_TEST(testTdf88821_2);
+ CPPUNIT_TEST(testTdf103960);
+ CPPUNIT_TEST(testRhbz1390776);
+ CPPUNIT_TEST(testTdf104310);
+ CPPUNIT_TEST(testTdf31231);
+ CPPUNIT_TEST(testTdf141914);
+ CPPUNIT_TEST(testTdf128951);
+ CPPUNIT_TEST(testTdf129789);
+ CPPUNIT_TEST(testTdf130725);
+ CPPUNIT_TEST(testTdf104502_hiddenColsCountedInPageCount);
+ CPPUNIT_TEST(testTdf108188_pagestyle);
+ CPPUNIT_TEST_SUITE_END();
+
+private:
+ uno::Reference<uno::XInterface> m_xCalcComponent;
+};
+
+static void lcl_AssertRectEqualWithTolerance(std::string_view sInfo,
+ const tools::Rectangle& rExpected,
+ const tools::Rectangle& rActual,
+ const sal_Int32 nTolerance)
+{
+ // Left
+ OString sMsg = OString::Concat(sInfo) + " Left expected " + OString::number(rExpected.Left())
+ + " actual "
+ + OString::number(rActual.Left()) + " Tolerance " + OString::number(nTolerance);
+ CPPUNIT_ASSERT_MESSAGE(
+ sMsg.getStr(), std::abs(rExpected.Left() - rActual.Left()) <= nTolerance);
+
+ // Top
+ sMsg = OString::Concat(sInfo) + " Top expected " + OString::number(rExpected.Top()) + " actual "
+ + OString::number(rActual.Top()) + " Tolerance " + OString::number(nTolerance);
+ CPPUNIT_ASSERT_MESSAGE(sMsg.getStr(), std::abs(rExpected.Top() - rActual.Top()) <= nTolerance);
+
+ // Width
+ sMsg = OString::Concat(sInfo) + " Width expected " + OString::number(rExpected.GetWidth())
+ + " actual "
+ + OString::number(rActual.GetWidth()) + " Tolerance " + OString::number(nTolerance);
+ CPPUNIT_ASSERT_MESSAGE(sMsg.getStr(),
+ std::abs(rExpected.GetWidth() - rActual.GetWidth()) <= nTolerance);
+
+ // Height
+ sMsg = OString::Concat(sInfo) + " Height expected " + OString::number(rExpected.GetHeight())
+ + " actual "
+ + OString::number(rActual.GetHeight()) + " Tolerance " + OString::number(nTolerance);
+ CPPUNIT_ASSERT_MESSAGE(sMsg.getStr(),
+ std::abs(rExpected.GetHeight() - rActual.GetHeight()) <= nTolerance);
+}
+
+static void lcl_AssertPointEqualWithTolerance(std::string_view sInfo, const Point rExpected,
+ const Point rActual, const sal_Int32 nTolerance)
+{
+ // X
+ OString sMsg = OString::Concat(sInfo) + " X expected " + OString::number(rExpected.X())
+ + " actual "
+ + OString::number(rActual.X()) + " Tolerance " + OString::number(nTolerance);
+ CPPUNIT_ASSERT_MESSAGE(sMsg.getStr(), std::abs(rExpected.X() - rActual.X()) <= nTolerance);
+ // Y
+ sMsg = OString::Concat(sInfo) + " Y expected " + OString::number(rExpected.Y()) + " actual "
+ + OString::number(rActual.Y()) + " Tolerance " + OString::number(nTolerance);
+ CPPUNIT_ASSERT_MESSAGE(sMsg.getStr(), std::abs(rExpected.Y() - rActual.Y()) <= nTolerance);
+}
+
+void ScFiltersTest::testTdf137576_Measureline()
+{
+ // The document contains a vertical measure line, anchored "To Cell (resize with cell)" with
+ // length 37mm. Save and reload had resulted in a line of 0mm length.
+
+ // Get document
+ ScDocShellRef xDocSh = loadDoc(u"tdf137576_Measureline.", FORMAT_ODS);
+ ScDocument& rDoc = xDocSh->GetDocument();
+
+ // Get shape
+ ScDrawLayer* pDrawLayer = rDoc.GetDrawLayer();
+ CPPUNIT_ASSERT_MESSAGE("Load: No ScDrawLayer", pDrawLayer);
+ SdrPage* pPage = pDrawLayer->GetPage(0);
+ CPPUNIT_ASSERT_MESSAGE("Load: No draw page", pPage);
+ SdrMeasureObj* pObj = static_cast<SdrMeasureObj*>(pPage->GetObj(0));
+ CPPUNIT_ASSERT_MESSAGE("Load: No measure object", pObj);
+
+ // Check start and end point of measureline
+ const Point aStart = pObj->GetPoint(0);
+ lcl_AssertPointEqualWithTolerance("Load, start point: ", Point(4800, 1500), aStart, 1);
+ const Point aEnd = pObj->GetPoint(1);
+ lcl_AssertPointEqualWithTolerance("Load, end point: ", Point(4800, 5200), aEnd, 1);
+
+ // Save and reload
+ xDocSh = saveAndReload(*xDocSh, FORMAT_ODS);
+ ScDocument& rDoc2 = xDocSh->GetDocument();
+
+ // Get shape
+ pDrawLayer = rDoc2.GetDrawLayer();
+ CPPUNIT_ASSERT_MESSAGE("Reload: No ScDrawLayer", pDrawLayer);
+ pPage = pDrawLayer->GetPage(0);
+ CPPUNIT_ASSERT_MESSAGE("Reload: No draw page", pPage);
+ pObj = static_cast<SdrMeasureObj*>(pPage->GetObj(0));
+ CPPUNIT_ASSERT_MESSAGE("Reload: No measure object", pObj);
+
+ // Check start and end point of measureline, should be unchanged
+ const Point aStart2 = pObj->GetPoint(0);
+ lcl_AssertPointEqualWithTolerance("Reload start point: ", Point(4800, 1500), aStart2, 1);
+ const Point aEnd2 = pObj->GetPoint(1);
+ lcl_AssertPointEqualWithTolerance("Reload end point: ", Point(4800, 5200), aEnd2, 1);
+
+ xDocSh->DoClose();
+}
+
+void ScFiltersTest::testTdf137216_HideCol()
+{
+ // The document contains a shape anchored "To Cell (resize with cell)" with start in C3.
+ // Error was, that hiding column C did not make the shape invisible.
+
+ // Get document
+ ScDocShellRef xDocSh = loadDoc(u"tdf137216_HideCol.", FORMAT_ODS);
+ ScDocument& rDoc = xDocSh->GetDocument();
+
+ // Get shape
+ ScDrawLayer* pDrawLayer = rDoc.GetDrawLayer();
+ CPPUNIT_ASSERT_MESSAGE("Load: No ScDrawLayer", pDrawLayer);
+ const SdrPage* pPage = pDrawLayer->GetPage(0);
+ CPPUNIT_ASSERT_MESSAGE("Load: No draw page", pPage);
+ SdrObject* pObj = pPage->GetObj(0);
+ CPPUNIT_ASSERT_MESSAGE("Load: No object found", pObj);
+
+ // Assert object is visible before and invisible after hiding column.
+ CPPUNIT_ASSERT_MESSAGE("before column hide: Object should be visible", pObj->IsVisible());
+ rDoc.SetColHidden(2, 2, 0, true); // col C in UI = col index 2 to 2.
+ CPPUNIT_ASSERT_MESSAGE("after column hide: Object should be invisible", !pObj->IsVisible());
+}
+
+void ScFiltersTest::testTdf137044_CoverHiddenRows()
+{
+ // The document contains a shape anchored "To Cell (resize with cell)" with start in cell A4 and
+ // end in cell A7. Row height is 30mm. Hiding rows 5 and 6, then saving and reload had resulted
+ // in a wrong end cell offset and thus a wrong height of the shape.
+
+ // Get document
+ ScDocShellRef xDocSh = loadDoc(u"tdf137044_CoverHiddenRows.", FORMAT_ODS);
+ ScDocument& rDoc = xDocSh->GetDocument();
+
+ // Get shape
+ ScDrawLayer* pDrawLayer = rDoc.GetDrawLayer();
+ CPPUNIT_ASSERT_MESSAGE("Load: No ScDrawLayer", pDrawLayer);
+ SdrPage* pPage = pDrawLayer->GetPage(0);
+ CPPUNIT_ASSERT_MESSAGE("Load: No draw page", pPage);
+ SdrObject* pObj = pPage->GetObj(0);
+ CPPUNIT_ASSERT_MESSAGE("Load: No object", pObj);
+
+ // Get original object values
+ tools::Rectangle aSnapRectOrig = pObj->GetSnapRect();
+ Point aOriginalEndOffset = ScDrawLayer::GetObjData(pObj)->maEndOffset;
+ lcl_AssertRectEqualWithTolerance("Load:", tools::Rectangle(Point(500, 3500), Size(1501, 11001)),
+ aSnapRectOrig, 1);
+ lcl_AssertPointEqualWithTolerance("Load: end offset", Point(2000, 2499), aOriginalEndOffset, 1);
+
+ // Hide rows 5 and 6 in UI = row index 4 to 5.
+ rDoc.SetRowHidden(4, 5, 0, true);
+
+ // Save and reload
+ xDocSh = saveAndReload(*xDocSh, FORMAT_ODS);
+ ScDocument& rDoc2 = xDocSh->GetDocument();
+
+ // Get shape
+ pDrawLayer = rDoc2.GetDrawLayer();
+ CPPUNIT_ASSERT_MESSAGE("Reload: No ScDrawLayer", pDrawLayer);
+ pPage = pDrawLayer->GetPage(0);
+ CPPUNIT_ASSERT_MESSAGE("Reload: No draw page", pPage);
+ pObj = pPage->GetObj(0);
+ CPPUNIT_ASSERT_MESSAGE("Reload: No object", pObj);
+
+ // Get new values and compare. End offset should be the same, height should be 6000 smaller.
+ tools::Rectangle aSnapRectReload = pObj->GetSnapRect();
+ Point aReloadEndOffset = ScDrawLayer::GetObjData(pObj)->maEndOffset;
+ lcl_AssertRectEqualWithTolerance(
+ "Reload:", tools::Rectangle(Point(500, 3500), Size(1501, 5001)), aSnapRectReload, 1);
+ lcl_AssertPointEqualWithTolerance("Reload: end offset", Point(2000, 2499), aReloadEndOffset, 1);
+
+ xDocSh->DoClose();
+}
+
+void ScFiltersTest::testTdf137020_FlipVertical()
+{
+ // Get document
+ ScDocShellRef xDocSh = loadDoc(u"tdf137020_FlipVertical.", FORMAT_ODS);
+ ScDocument& rDoc = xDocSh->GetDocument();
+
+ // Get shape
+ ScDrawLayer* pDrawLayer = rDoc.GetDrawLayer();
+ CPPUNIT_ASSERT_MESSAGE("Load: No ScDrawLayer", pDrawLayer);
+ SdrPage* pPage = pDrawLayer->GetPage(0);
+ CPPUNIT_ASSERT_MESSAGE("Load: No draw page", pPage);
+ SdrObject* pObj = pPage->GetObj(0);
+ CPPUNIT_ASSERT_MESSAGE("Load: No object", pObj);
+
+ const tools::Rectangle aSnapRectOrig = pObj->GetSnapRect();
+
+ // Vertical mirror on center should not change the snap rect.
+ pObj->Mirror(aSnapRectOrig.LeftCenter(), aSnapRectOrig.RightCenter());
+ const tools::Rectangle aSnapRectFlip = pObj->GetSnapRect();
+ lcl_AssertRectEqualWithTolerance("Mirror:", aSnapRectOrig, aSnapRectFlip, 1);
+
+ // Save and reload
+ xDocSh = saveAndReload(*xDocSh, FORMAT_ODS);
+ ScDocument& rDoc2 = xDocSh->GetDocument();
+
+ // Get shape
+ pDrawLayer = rDoc2.GetDrawLayer();
+ CPPUNIT_ASSERT_MESSAGE("Reload: No ScDrawLayer", pDrawLayer);
+ pPage = pDrawLayer->GetPage(0);
+ CPPUNIT_ASSERT_MESSAGE("Reload: No draw page", pPage);
+ pObj = pPage->GetObj(0);
+ CPPUNIT_ASSERT_MESSAGE("Reload: No object", pObj);
+
+ // Check pos and size of shape again, should be unchanged
+ const tools::Rectangle aSnapRectReload = pObj->GetSnapRect();
+ lcl_AssertRectEqualWithTolerance("Reload:", aSnapRectOrig, aSnapRectReload, 1);
+
+ xDocSh->DoClose();
+}
+
+void ScFiltersTest::testTdf64229()
+{
+ ScDocShellRef xDocSh = loadDoc(u"fdo64229b.", FORMAT_ODS);
+
+ xDocSh->DoHardRecalc();
+
+ CPPUNIT_ASSERT_MESSAGE("Failed to load fdo64229b.*", xDocSh.is());
+ ScDocument& rDoc = xDocSh->GetDocument();
+ OUString aCSVFileName;
+
+ //test hard recalc: document has an incorrect cached formula result
+ //hard recalc should have updated to the correct result
+ createCSVPath("fdo64229b.", aCSVFileName);
+ testFile(aCSVFileName, rDoc, 0);
+
+ xDocSh->DoClose();
+}
+
+void ScFiltersTest::testTdf36933()
+{
+ ScDocShellRef xDocSh = loadDoc(u"fdo36933test.", FORMAT_ODS);
+
+ xDocSh->DoHardRecalc();
+
+ CPPUNIT_ASSERT_MESSAGE("Failed to load fdo36933test.*", xDocSh.is());
+ ScDocument& rDoc = xDocSh->GetDocument();
+ OUString aCSVFileName;
+
+ //test hard recalc: document has an incorrect cached formula result
+ //hard recalc should have updated to the correct result
+ createCSVPath("fdo36933test.", aCSVFileName);
+ testFile(aCSVFileName, rDoc, 0);
+
+ xDocSh->DoClose();
+}
+
+void ScFiltersTest::testTdf43700()
+{
+ ScDocShellRef xDocSh = loadDoc(u"fdo43700test.", FORMAT_ODS);
+
+ xDocSh->DoHardRecalc();
+
+ CPPUNIT_ASSERT_MESSAGE("Failed to load fdo43700test.*", xDocSh.is());
+ ScDocument& rDoc = xDocSh->GetDocument();
+ OUString aCSVFileName;
+
+ //test hard recalc: document has an incorrect cached formula result
+ //hard recalc should have updated to the correct result
+ createCSVPath("fdo43700test.", aCSVFileName);
+ testFile(aCSVFileName, rDoc, 0);
+
+ xDocSh->DoClose();
+}
+
+void ScFiltersTest::testTdf43534()
+{
+ ScDocShellRef xDocSh = loadDoc(u"fdo43534test.", FORMAT_ODS);
+
+ xDocSh->DoHardRecalc();
+
+ CPPUNIT_ASSERT_MESSAGE("Failed to load fdo43534test.*", xDocSh.is());
+ // ScDocument& rDoc = xDocSh->GetDocument();
+ OUString aCSVFileName;
+
+ //test hard recalc: document has an incorrect cached formula result
+ //hard recalc should have updated to the correct result
+ createCSVPath("fdo43534test.", aCSVFileName);
+ // testFile(aCSVFileName, rDoc, 0);
+
+ xDocSh->DoClose();
+}
+
+void ScFiltersTest::testTdf91979()
+{
+ Sequence < beans::PropertyValue > args{ comphelper::makePropertyValue("Hidden", true) };
+ ScDocShellRef xDocSh = loadEmptyDocument(args);
+ CPPUNIT_ASSERT(xDocSh);
+
+ // Get the document controller
+ ScTabViewShell* pViewShell = xDocSh->GetBestViewShell(false);
+ CPPUNIT_ASSERT(pViewShell != nullptr);
+ auto& aViewData = pViewShell->GetViewData();
+ auto& rDoc = aViewData.GetDocument();
+
+ // Check coordinates of a distant cell
+ Point aPos = aViewData.GetScrPos(rDoc.MaxCol() - 1, 10000, SC_SPLIT_TOPLEFT, true);
+ int nColWidth = ScViewData::ToPixel(rDoc.GetColWidth(0, 0), aViewData.GetPPTX());
+ int nRowHeight = ScViewData::ToPixel(rDoc.GetRowHeight(0, 0), aViewData.GetPPTY());
+ CPPUNIT_ASSERT_EQUAL(static_cast<tools::Long>((rDoc.MaxCol() - 1) * nColWidth), aPos.getX());
+ CPPUNIT_ASSERT_EQUAL(static_cast<tools::Long>(10000 * nRowHeight), aPos.getY());
+
+ xDocSh->DoClose();
+}
+
+/*
+void ScFiltersTest::testTdf40110()
+{
+ ScDocShellRef xDocSh = loadDoc("fdo40110test.", FORMAT_ODS);
+
+ CPPUNIT_ASSERT_MESSAGE("Failed to load fdo40110test.*", xDocSh.Is());
+ xDocSh->DoHardRecalc();
+
+ ScDocument& rDoc = xDocSh->GetDocument();
+ OUString aCSVFileName;
+
+ //test hard recalc: document has an incorrect cached formula result
+ //hard recalc should have updated to the correct result
+ createCSVPath(OUString("fdo40110test."), aCSVFileName);
+ testFile(aCSVFileName, rDoc, 0);
+
+ xDocSh->DoClose();
+}
+*/
+
+void ScFiltersTest::testTdf98657()
+{
+ ScDocShellRef xDocSh = loadDoc(u"tdf98657.", FORMAT_ODS);
+ ScDocument& rDoc = xDocSh->GetDocument();
+
+ xDocSh->DoHardRecalc();
+
+ // this was a NaN before the fix
+ CPPUNIT_ASSERT_EQUAL(285.0, rDoc.GetValue(ScAddress(1, 1, 0)));
+
+ xDocSh->DoClose();
+}
+
+void ScFiltersTest::testTdf88821()
+{
+ ScDocShellRef xDocSh = loadDoc(u"tdf88821.", FORMAT_HTML);
+ ScDocument& rDoc = xDocSh->GetDocument();
+
+ // B2 should be 'Périmètre', not 'Périmètre'
+ CPPUNIT_ASSERT_EQUAL(OStringToOUString("P\xC3\xA9rim\xC3\xA8tre", RTL_TEXTENCODING_UTF8), rDoc.GetString(1, 1, 0));
+
+ xDocSh->DoClose();
+}
+
+void ScFiltersTest::testTdf88821_2()
+{
+ ScDocShellRef xDocSh = loadDoc(u"tdf88821-2.", FORMAT_HTML);
+ ScDocument& rDoc = xDocSh->GetDocument();
+
+ // A2 should be 'ABCabcČŠŽčšž', not 'ABCabcČŠŽÄヘšž'
+ CPPUNIT_ASSERT_EQUAL(OStringToOUString("ABCabc\xC4\x8C\xC5\xA0\xC5\xBD\xC4\x8D\xC5\xA1\xC5\xBE", RTL_TEXTENCODING_UTF8), rDoc.GetString(0, 1, 0));
+
+ xDocSh->DoClose();
+}
+
+void ScFiltersTest::testTdf103960()
+{
+ ScDocShellRef xDocSh = loadDoc(u"tdf103960.", FORMAT_HTML);
+ ScDocument& rDoc = xDocSh->GetDocument();
+
+ // A1 should be 'Data', not the entire content of the file
+ CPPUNIT_ASSERT_EQUAL(OStringToOUString("Data", RTL_TEXTENCODING_UTF8), rDoc.GetString(0, 0, 0));
+
+ xDocSh->DoClose();
+}
+
+void ScFiltersTest::testRhbz1390776()
+{
+ ScDocShellRef xDocSh = loadDoc(u"rhbz1390776.", FORMAT_XLS_XML);
+ ScDocument& rDoc = xDocSh->GetDocument();
+
+ ASSERT_FORMULA_EQUAL(rDoc, ScAddress(0, 27, 0), "SUM(A18:A23)", "Wrong range");
+
+ xDocSh->DoClose();
+}
+
+void ScFiltersTest::testTdf104310()
+{
+ // 1. Test x14 extension
+ {
+ ScDocShellRef xDocSh = loadDoc(u"tdf104310.", FORMAT_XLSX);
+ ScDocument& rDoc = xDocSh->GetDocument();
+
+ const ScValidationData* pData = rDoc.GetValidationEntry(1);
+ CPPUNIT_ASSERT(pData);
+
+ // Make sure the list is correct.
+ std::vector<ScTypedStrData> aList;
+ pData->FillSelectionList(aList, ScAddress(0, 1, 0));
+ CPPUNIT_ASSERT_EQUAL(size_t(5), aList.size());
+ for (size_t i = 0; i < 5; ++i)
+ CPPUNIT_ASSERT_DOUBLES_EQUAL(double(i + 1), aList[i].GetValue(), 1e-8);
+
+ xDocSh->DoClose();
+ }
+
+ // 2. Test x12ac extension
+ {
+ ScDocShellRef xDocSh = loadDoc(u"tdf104310-2.", FORMAT_XLSX);
+ ScDocument& rDoc = xDocSh->GetDocument();
+
+ const ScValidationData* pData = rDoc.GetValidationEntry(1);
+ CPPUNIT_ASSERT(pData);
+
+ // Make sure the list is correct.
+ std::vector<ScTypedStrData> aList;
+ pData->FillSelectionList(aList, ScAddress(0, 1, 0));
+ CPPUNIT_ASSERT_EQUAL(size_t(3), aList.size());
+ CPPUNIT_ASSERT_EQUAL(OUString("1"), aList[0].GetString());
+ CPPUNIT_ASSERT_EQUAL(OUString("2,3"), aList[1].GetString());
+ CPPUNIT_ASSERT_EQUAL(OUString("4"), aList[2].GetString());
+
+ xDocSh->DoClose();
+ }
+}
+
+void ScFiltersTest::testTdf31231()
+{
+ // We must open it read-write to allow setting modified flag
+ ScDocShellRef xDocSh = loadDoc(u"tdf31231.", FORMAT_ODS, true);
+ xDocSh->DoHardRecalc();
+
+ CPPUNIT_ASSERT_MESSAGE("The spreadsheet must be allowed to set modified state", xDocSh->IsEnableSetModified());
+ CPPUNIT_ASSERT_MESSAGE("The spreadsheet must not be modified on open", !xDocSh->IsModified());
+
+ xDocSh->DoClose();
+}
+
+void ScFiltersTest::testTdf141914()
+{
+ // We must open it read-write to allow setting modified flag
+ ScDocShellRef xDocSh = loadDoc(u"tdf141914.", FORMAT_ODS, true);
+
+ CPPUNIT_ASSERT_MESSAGE("The spreadsheet must be allowed to set modified state", xDocSh->IsEnableSetModified());
+ CPPUNIT_ASSERT_MESSAGE("The spreadsheet must not be modified on open", !xDocSh->IsModified());
+
+ xDocSh->DoClose();
+}
+
+void ScFiltersTest::testTdf128951()
+{
+ css::uno::Reference<css::frame::XDesktop2> xDesktop
+ = css::frame::Desktop::create(::comphelper::getProcessComponentContext());
+ CPPUNIT_ASSERT(xDesktop.is());
+
+ // 1. Create spreadsheet
+ css::uno::Sequence aHiddenArgList{ comphelper::makePropertyValue("Hidden", true) };
+
+ css::uno::Reference<css::lang::XComponent> xComponent
+ = xDesktop->loadComponentFromURL("private:factory/scalc", "_blank", 0, aHiddenArgList);
+ CPPUNIT_ASSERT(xComponent.is());
+
+ // 2. Create a new sheet instance
+ css::uno::Reference<css::lang::XMultiServiceFactory> xFac(xComponent,
+ css::uno::UNO_QUERY_THROW);
+ auto xSheet = xFac->createInstance("com.sun.star.sheet.Spreadsheet");
+
+ // 3. Insert sheet into the spreadsheet (was throwing IllegalArgumentException)
+ css::uno::Reference<css::sheet::XSpreadsheetDocument> xDoc(xComponent,
+ css::uno::UNO_QUERY_THROW);
+ CPPUNIT_ASSERT_NO_THROW(xDoc->getSheets()->insertByName("mustNotThrow", css::uno::Any(xSheet)));
+}
+
+namespace {
+
+SdrCaptionObj* checkCaption( ScDocument& rDoc, const ScAddress& rAddress, bool bIsShown)
+{
+ ScPostIt *pNote = rDoc.GetNote(rAddress);
+
+ CPPUNIT_ASSERT(pNote);
+ CPPUNIT_ASSERT_EQUAL(pNote->IsCaptionShown(), bIsShown );
+
+ if (!bIsShown)
+ pNote->ShowCaption(rAddress, true);
+
+ SdrCaptionObj* pCaption = pNote->GetCaption();
+ CPPUNIT_ASSERT(pCaption);
+
+ return pCaption;
+}
+}
+
+void ScFiltersTest::testTdf129789()
+{
+
+ ScDocShellRef xDocSh = loadDoc(u"tdf129789.", FORMAT_ODS, true);
+ ScDocument& rDoc = xDocSh->GetDocument();
+
+ {
+ // Fill: None
+ SdrCaptionObj *const pCaptionB2 = checkCaption(rDoc, ScAddress(1, 1, 0), true);
+
+ const XFillStyleItem& rStyleItemB2 = dynamic_cast<const XFillStyleItem&>(
+ pCaptionB2->GetMergedItem(XATTR_FILLSTYLE));
+
+ CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_NONE, rStyleItemB2.GetValue());
+
+ SdrCaptionObj *const pCaptionB9 = checkCaption(rDoc, ScAddress(1, 8, 0), false);
+
+ const XFillStyleItem& rStyleItemB9 = dynamic_cast<const XFillStyleItem&>(
+ pCaptionB9->GetMergedItem(XATTR_FILLSTYLE));
+
+ CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_NONE, rStyleItemB9.GetValue());
+ }
+
+ {
+ // Fill: Solid
+ SdrCaptionObj *const pCaptionE2 = checkCaption(rDoc, ScAddress(4, 1, 0), true);
+
+ const XFillStyleItem& rStyleItemE2 = dynamic_cast<const XFillStyleItem&>(
+ pCaptionE2->GetMergedItem(XATTR_FILLSTYLE));
+
+ CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_SOLID, rStyleItemE2.GetValue());
+
+ const XFillColorItem& rColorItem = dynamic_cast<const XFillColorItem&>(
+ pCaptionE2->GetMergedItem(XATTR_FILLCOLOR));
+ CPPUNIT_ASSERT_EQUAL(Color(0xffffc0), rColorItem.GetColorValue());
+
+ SdrCaptionObj *const pCaptionE9 = checkCaption(rDoc, ScAddress(4, 8, 0), false);
+
+ const XFillStyleItem& rStyleItemE9 = dynamic_cast<const XFillStyleItem&>(
+ pCaptionE9->GetMergedItem(XATTR_FILLSTYLE));
+
+ CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_SOLID, rStyleItemE9.GetValue());
+
+ const XFillColorItem& rColorItem2 = dynamic_cast<const XFillColorItem&>(
+ pCaptionE9->GetMergedItem(XATTR_FILLCOLOR));
+ CPPUNIT_ASSERT_EQUAL(Color(0xffffc0), rColorItem2.GetColorValue());
+ }
+
+ {
+ // Fill: Gradient
+ SdrCaptionObj *const pCaptionH2 = checkCaption(rDoc, ScAddress(7, 1, 0), true);
+
+ const XFillStyleItem& rStyleItemH2 = dynamic_cast<const XFillStyleItem&>(
+ pCaptionH2->GetMergedItem(XATTR_FILLSTYLE));
+
+ CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_GRADIENT, rStyleItemH2.GetValue());
+ const XFillGradientItem& rGradientItem = dynamic_cast<const XFillGradientItem&>(
+ pCaptionH2->GetMergedItem(XATTR_FILLGRADIENT));
+ CPPUNIT_ASSERT_EQUAL(Color(0xdde8cb), rGradientItem.GetGradientValue().GetStartColor());
+ CPPUNIT_ASSERT_EQUAL(Color(0xffd7d7), rGradientItem.GetGradientValue().GetEndColor());
+
+ SdrCaptionObj *const pCaptionH9 = checkCaption(rDoc, ScAddress(7, 8, 0), false);
+
+ const XFillStyleItem& rStyleItemH9 = dynamic_cast<const XFillStyleItem&>(
+ pCaptionH9->GetMergedItem(XATTR_FILLSTYLE));
+
+ CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_GRADIENT, rStyleItemH9.GetValue());
+ const XFillGradientItem& rGradientItem2 = dynamic_cast<const XFillGradientItem&>(
+ pCaptionH2->GetMergedItem(XATTR_FILLGRADIENT));
+ CPPUNIT_ASSERT_EQUAL(Color(0xdde8cb), rGradientItem2.GetGradientValue().GetStartColor());
+ CPPUNIT_ASSERT_EQUAL(Color(0xffd7d7), rGradientItem2.GetGradientValue().GetEndColor());
+ }
+
+ {
+ // Fill: Hatch
+ SdrCaptionObj *const pCaptionK2 = checkCaption(rDoc, ScAddress(10, 1, 0), true);
+
+ const XFillStyleItem& rStyleItemK2 = dynamic_cast<const XFillStyleItem&>(
+ pCaptionK2->GetMergedItem(XATTR_FILLSTYLE));
+
+ CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_HATCH, rStyleItemK2.GetValue());
+ const XFillHatchItem& rHatchItem = dynamic_cast<const XFillHatchItem&>(
+ pCaptionK2->GetMergedItem(XATTR_FILLHATCH));
+ CPPUNIT_ASSERT_EQUAL(Color(0x000080), rHatchItem.GetHatchValue().GetColor());
+
+ SdrCaptionObj *const pCaptionK9 = checkCaption(rDoc, ScAddress(10, 8, 0), false);
+
+ const XFillStyleItem& rStyleItemK9 = dynamic_cast<const XFillStyleItem&>(
+ pCaptionK9->GetMergedItem(XATTR_FILLSTYLE));
+
+ CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_HATCH, rStyleItemK9.GetValue());
+ const XFillHatchItem& rHatchItem2 = dynamic_cast<const XFillHatchItem&>(
+ pCaptionK9->GetMergedItem(XATTR_FILLHATCH));
+ CPPUNIT_ASSERT_EQUAL(Color(0x000080), rHatchItem2.GetHatchValue().GetColor());
+ }
+
+ {
+ // Fill: Bitmap
+ SdrCaptionObj *const pCaptionN2 = checkCaption(rDoc, ScAddress(13, 1, 0), true);
+
+ const XFillStyleItem& rStyleItemN2 = dynamic_cast<const XFillStyleItem&>(
+ pCaptionN2->GetMergedItem(XATTR_FILLSTYLE));
+
+ CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_BITMAP, rStyleItemN2.GetValue());
+
+ SdrCaptionObj *const pCaptionN9 = checkCaption(rDoc, ScAddress(13, 8, 0), false);
+
+ const XFillStyleItem& rStyleItemN9 = dynamic_cast<const XFillStyleItem&>(
+ pCaptionN9->GetMergedItem(XATTR_FILLSTYLE));
+
+ CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_BITMAP, rStyleItemN9.GetValue());
+ }
+
+ xDocSh->DoClose();
+}
+
+void ScFiltersTest::testTdf130725()
+{
+ Sequence < beans::PropertyValue > args{ comphelper::makePropertyValue("Hidden", true) };
+ ScDocShellRef xDocSh = loadEmptyDocument(args);
+ CPPUNIT_ASSERT(xDocSh);
+
+ uno::Reference<frame::XModel> xModel = xDocSh->GetModel();
+ uno::Reference<sheet::XSpreadsheetDocument> xDoc(xModel, uno::UNO_QUERY_THROW);
+
+ // 2. Insert 0.0042 into a cell as a formula, to force the conversion from string to double
+ css::uno::Reference<css::sheet::XCellRangesAccess> xSheets(xDoc->getSheets(),
+ css::uno::UNO_QUERY_THROW);
+ css::uno::Reference<css::table::XCell> xCell = xSheets->getCellByPosition(0, 0, 0);
+ xCell->setFormula("0.0042"); // this assumes en-US locale
+
+ // 3. Check that the value is the nearest double-precision representation of the decimal 0.0042
+ // (it was 0.0042000000000000006 instead of 0.0041999999999999997).
+ CPPUNIT_ASSERT_EQUAL_MESSAGE("Value must be the nearest representation of decimal 0.0042",
+ 0.0042, xCell->getValue()); // strict equality
+
+ xDocSh->DoClose();
+}
+
+void ScFiltersTest::testTdf104502_hiddenColsCountedInPageCount()
+{
+ ScDocShellRef xShell = loadDoc(u"tdf104502_hiddenColsCountedInPageCount.", FORMAT_ODS);
+
+ ScDocument& rDoc = xShell->GetDocument();
+
+ //Check that hidden columns are not calculated into Print Area
+ SCCOL nEndCol = 0;
+ SCROW nEndRow = 0;
+ CPPUNIT_ASSERT(rDoc.GetPrintArea(0, nEndCol, nEndRow, false));
+ CPPUNIT_ASSERT_EQUAL(SCCOL(0), nEndCol);
+ CPPUNIT_ASSERT_EQUAL(SCROW(55), nEndRow);
+
+ xShell->DoClose();
+}
+void ScFiltersTest::testTdf108188_pagestyle()
+{
+ ScDocShellRef xDocSh = loadDoc(u"tdf108188_pagestyle.", FORMAT_ODS);
+ CPPUNIT_ASSERT(xDocSh);
+
+ // Check if the user defined page style is present
+ const OUString aTestPageStyle = "TestPageStyle";
+ ScDocument& rDoc = xDocSh->GetDocument();
+ CPPUNIT_ASSERT_EQUAL(aTestPageStyle, rDoc.GetPageStyle(0));
+
+ // Without the accompanying fix in place, the page styles are always used
+ ScStyleSheetPool* pStylePool = rDoc.GetStyleSheetPool();
+ CPPUNIT_ASSERT(pStylePool->Find(aTestPageStyle, SfxStyleFamily::Page)->IsUsed());
+ CPPUNIT_ASSERT(!pStylePool->Find("Default", SfxStyleFamily::Page)->IsUsed());
+
+ xDocSh->DoClose();
+}
+
+
+ScFiltersTest::ScFiltersTest()
+ : ScBootstrapFixture( "sc/qa/unit/data" )
+{
+}
+
+void ScFiltersTest::setUp()
+{
+ test::BootstrapFixture::setUp();
+
+ // This is a bit of a fudge, we do this to ensure that ScGlobals::ensure,
+ // which is a private symbol to us, gets called
+ m_xCalcComponent =
+ getMultiServiceFactory()->createInstance("com.sun.star.comp.Calc.SpreadsheetDocument");
+ CPPUNIT_ASSERT_MESSAGE("no calc component!", m_xCalcComponent.is());
+}
+
+void ScFiltersTest::tearDown()
+{
+ uno::Reference< lang::XComponent > xComp(m_xCalcComponent, uno::UNO_QUERY);
+ if (xComp)
+ xComp->dispose();
+ m_xCalcComponent.clear();
+
+ test::BootstrapFixture::tearDown();
+}
+
+CPPUNIT_TEST_SUITE_REGISTRATION(ScFiltersTest);
+
+CPPUNIT_PLUGIN_IMPLEMENT();
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */