/* -*- 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 "../helper/qahelper.hxx" #include <LibreOfficeKit/LibreOfficeKitEnums.h> #include <unotools/syslocaleoptions.hxx> #include <vcl/keycodes.hxx> #include <vcl/scheduler.hxx> #include <comphelper/processfactory.hxx> #include <comphelper/propertysequence.hxx> #include <comphelper/scopeguard.hxx> #include <comphelper/servicehelper.hxx> #include <com/sun/star/awt/Key.hpp> #include <com/sun/star/sheet/GlobalSheetSettings.hpp> #include <condformathelper.hxx> #include <conditio.hxx> #include <document.hxx> #include <docsh.hxx> #include <dpobject.hxx> #include <formulaopt.hxx> #include <inputopt.hxx> #include <postit.hxx> #include <rangeutl.hxx> #include <scmod.hxx> #include <tabvwsh.hxx> #include <viewdata.hxx> using namespace ::com::sun::star; class ScUiCalcTest : public ScModelTestBase { public: ScUiCalcTest(); }; ScUiCalcTest::ScUiCalcTest() : ScModelTestBase(u"sc/qa/unit/uicalc/data"_ustr) { } static void lcl_AssertConditionalFormatList(ScDocument& rDoc, size_t nSize, std::unordered_map<OUString, OUString>& rExpectedValues) { ScConditionalFormatList* pList = rDoc.GetCondFormList(0); CPPUNIT_ASSERT_EQUAL(nSize, pList->size()); OUString sRangeStr; for (const auto& rItem : *pList) { const ScRangeList& aRange = rItem->GetRange(); aRange.Format(sRangeStr, ScRefFlags::VALID, rDoc, rDoc.GetAddressConvention()); CPPUNIT_ASSERT_MESSAGE(OString(sRangeStr.toUtf8() + " not found").getStr(), rExpectedValues.count(sRangeStr)); CPPUNIT_ASSERT_EQUAL(rExpectedValues[sRangeStr], ScCondFormatHelper::GetExpression(*rItem, aRange.GetTopLeftCorner())); } } static void lcl_AssertCurrentCursorPosition(ScDocShell& rDocSh, std::u16string_view rStr) { ScAddress aAddr; sal_Int32 nOffset = 0; ScRangeStringConverter::GetAddressFromString(aAddr, rStr, rDocSh.GetDocument(), formula::FormulaGrammar::CONV_OOO, nOffset); ScTabViewShell* pViewShell = rDocSh.GetBestViewShell(false); CPPUNIT_ASSERT_EQUAL_MESSAGE( OUString(OUString::Concat("Incorrect Column in position ") + rStr).toUtf8().getStr(), aAddr.Col(), pViewShell->GetViewData().GetCurX()); CPPUNIT_ASSERT_EQUAL_MESSAGE( OUString(OUString::Concat("Incorrect Row in position ") + rStr).toUtf8().getStr(), aAddr.Row(), pViewShell->GetViewData().GetCurY()); } CPPUNIT_TEST_FIXTURE(ScUiCalcTest, testTdf142854_GridVisibilityImportXlsxInHeadlessMode) { // Tests are running in Headless mode // Import an ods file with 'Hide' global grid visibility setting. createScDoc("tdf126541_GridOffGlobally.ods"); ScDocument* pDoc = getScDoc(); CPPUNIT_ASSERT(!pDoc->GetViewOptions().GetOption(VOPT_GRID)); // To avoid regression, in headless mode leave the bug tdf126541 // It means Sheet based grid line visibility setting will overwrite the global setting. // If there is only 1 sheet in the document, it will not result visible problems. createScDoc("tdf126541_GridOff.xlsx"); pDoc = getScDoc(); CPPUNIT_ASSERT(!pDoc->GetViewOptions().GetOption(VOPT_GRID)); } CPPUNIT_TEST_FIXTURE(ScUiCalcTest, testExternalReferences) { createScDoc(); ScDocument* pDoc = getScDoc(); insertStringToCell(u"A1"_ustr, u"2015"); insertStringToCell(u"A2"_ustr, u"2015"); insertStringToCell(u"A3"_ustr, u"2015"); insertStringToCell(u"B1"_ustr, u"1"); insertStringToCell(u"B2"_ustr, u"1"); insertStringToCell(u"B3"_ustr, u"2"); insertStringToCell(u"C1"_ustr, u"10"); insertStringToCell(u"C2"_ustr, u"20"); insertStringToCell(u"C3"_ustr, u"5"); insertStringToCell(u"D1"_ustr, u"BIG FISH"); insertStringToCell(u"D2"_ustr, u"FISHFISH"); insertStringToCell(u"D3"_ustr, u"FISHY"); // Save the document save(u"calc8"_ustr); // Open a new document createScDoc(); pDoc = getScDoc(); // Insert the references to the external document { // tdf#115162 OUString aFormula = "=SUMIFS('" + maTempFile.GetURL() + "'#$Sheet1.C1:C3,'" + maTempFile.GetURL() + "'#$Sheet1.B1:B3,1,'" + maTempFile.GetURL() + "'#$Sheet1.A1:A3,2015)"; insertStringToCell(u"A1"_ustr, aFormula); // tdf#115162: Without the fix in place, this test would have failed with // - Expected: 30 // - Actual : Err:504 CPPUNIT_ASSERT_EQUAL(u"30"_ustr, pDoc->GetString(ScAddress(0, 0, 0))); } { // tdf#114820 OUString aFormula = "=VLOOKUP('" + maTempFile.GetURL() + "'#$Sheet1.A1;'" + maTempFile.GetURL() + "'#$Sheet1.A1:B3,2,0)"; insertStringToCell(u"A1"_ustr, aFormula); // Without the fix in place, this test would have failed with // - Expected: 1 // - Actual : Err:504 CPPUNIT_ASSERT_EQUAL(u"1"_ustr, pDoc->GetString(ScAddress(0, 0, 0))); } { // tdf#116149 OUString aFormula = "=VAR('" + maTempFile.GetURL() + "'#$Sheet1.C1;'" + maTempFile.GetURL() + "'#$Sheet1.C2)"; insertStringToCell(u"A1"_ustr, aFormula); // Without the fix in place, this test would have failed with // - Expected: 50 // - Actual : Err:504 CPPUNIT_ASSERT_EQUAL(u"50"_ustr, pDoc->GetString(ScAddress(0, 0, 0))); } { // tdf#100847 // Use an empty cell OUString aFormula = "=+'" + maTempFile.GetURL() + "'#$Sheet1.A1000"; insertStringToCell(u"A1"_ustr, aFormula); aFormula = "=+'" + maTempFile.GetURL() + "'#$Sheet1.A1000*1"; insertStringToCell(u"B1"_ustr, aFormula); aFormula = "=+N('" + maTempFile.GetURL() + "'#$Sheet1.A1000)*1"; insertStringToCell(u"C1"_ustr, aFormula); CPPUNIT_ASSERT_EQUAL(u"0"_ustr, pDoc->GetString(ScAddress(0, 0, 0))); // Without the fix in place, this test would have failed with // - Expected: 0 // - Actual : #VALUE! CPPUNIT_ASSERT_EQUAL(u"0"_ustr, pDoc->GetString(ScAddress(1, 0, 0))); CPPUNIT_ASSERT_EQUAL(u"0"_ustr, pDoc->GetString(ScAddress(2, 0, 0))); } { //tdf#36387 OUString aAndFormula = "=AND('" + maTempFile.GetURL() + "'#$Sheet1.A1:C1)"; insertStringToCell(u"A1"_ustr, aAndFormula); OUString aOrFormula = "=OR('" + maTempFile.GetURL() + "'#$Sheet1.A1:C1)"; insertStringToCell(u"B1"_ustr, aOrFormula); // Without the fix in place, this test would have failed with // - Expected: TRUE // - Actual : Err:504 CPPUNIT_ASSERT_EQUAL(u"TRUE"_ustr, pDoc->GetString(ScAddress(0, 0, 0))); CPPUNIT_ASSERT_EQUAL(u"TRUE"_ustr, pDoc->GetString(ScAddress(1, 0, 0))); } { //tdf#113898 OUString aAndFormula = "=SUMPRODUCT(NOT(ISERROR(FIND(\"FISH\";'" + maTempFile.GetURL() + "'#$Sheet1.D1:D3))))"; insertStringToCell(u"A1"_ustr, aAndFormula); // Without the fix in place, this test would have failed with // - Expected: 3 // - Actual : 1 CPPUNIT_ASSERT_EQUAL(3.0, pDoc->GetValue(ScAddress(0, 0, 0))); } } #if !defined(MACOSX) && !defined(_WIN32) //FIXME CPPUNIT_TEST_FIXTURE(ScUiCalcTest, testTdf151886) { createScDoc(); ScDocument* pDoc = getScDoc(); // Set the system locale to German SvtSysLocaleOptions aOptions; OUString sLocaleConfigString = aOptions.GetLanguageTag().getBcp47(); aOptions.SetLocaleConfigString(u"de-DE"_ustr); aOptions.Commit(); comphelper::ScopeGuard g([&aOptions, &sLocaleConfigString] { aOptions.SetLocaleConfigString(sLocaleConfigString); aOptions.Commit(); }); insertStringToCell(u"A1"_ustr, u"=1,1"); insertStringToCell(u"A2"_ustr, u"=1.1"); CPPUNIT_ASSERT_EQUAL(u"1,1"_ustr, pDoc->GetString(0, 0, 0)); CPPUNIT_ASSERT_EQUAL(u"#NAME?"_ustr, pDoc->GetString(0, 1, 0)); // change UseEnglishFuncName to true ScDocShell* pDocSh = getScDocShell(); ScFormulaOptions aFormulaOptions = ScModule::get()->GetFormulaOptions(); bool bOldStatus = aFormulaOptions.GetUseEnglishFuncName(); aFormulaOptions.SetUseEnglishFuncName(true); pDocSh->SetFormulaOptions(aFormulaOptions); insertStringToCell(u"A1"_ustr, u"=1,1"); insertStringToCell(u"A2"_ustr, u"=1.1"); // Without the fix in place, this test would have failed with // - Expected: 1,1 // - Actual : #NAME? CPPUNIT_ASSERT_EQUAL(u"1,1"_ustr, pDoc->GetString(0, 0, 0)); CPPUNIT_ASSERT_EQUAL(u"#NAME?"_ustr, pDoc->GetString(0, 1, 0)); aFormulaOptions.SetUseEnglishFuncName(bOldStatus); pDocSh->SetFormulaOptions(aFormulaOptions); } #endif CPPUNIT_TEST_FIXTURE(ScUiCalcTest, testTdf162087) { auto verify = [this]() { ScDocument* pDoc = getScDoc(); insertArrayToCell(u"E5"_ustr, u"=myData[[#Data]]"); CPPUNIT_ASSERT_EQUAL(u"Elisabeth"_ustr, pDoc->GetString(4, 4, 0)); CPPUNIT_ASSERT_EQUAL(u"Frieda"_ustr, pDoc->GetString(4, 5, 0)); CPPUNIT_ASSERT_EQUAL(u"Adele"_ustr, pDoc->GetString(4, 6, 0)); CPPUNIT_ASSERT_EQUAL(u"Berta"_ustr, pDoc->GetString(4, 7, 0)); CPPUNIT_ASSERT_EQUAL(u"total"_ustr, pDoc->GetString(4, 8, 0)); CPPUNIT_ASSERT_EQUAL(u"7"_ustr, pDoc->GetString(5, 4, 0)); CPPUNIT_ASSERT_EQUAL(u"6"_ustr, pDoc->GetString(5, 5, 0)); CPPUNIT_ASSERT_EQUAL(u"4"_ustr, pDoc->GetString(5, 6, 0)); CPPUNIT_ASSERT_EQUAL(u"5"_ustr, pDoc->GetString(5, 7, 0)); CPPUNIT_ASSERT_EQUAL(u"22"_ustr, pDoc->GetString(5, 8, 0)); insertArrayToCell(u"H5"_ustr, u"=myData[[#Headers]]"); CPPUNIT_ASSERT_EQUAL(u"Name"_ustr, pDoc->GetString(7, 4, 0)); CPPUNIT_ASSERT_EQUAL(u"Count"_ustr, pDoc->GetString(8, 4, 0)); insertArrayToCell(u"K5"_ustr, u"=myData[[#All]]"); CPPUNIT_ASSERT_EQUAL(u"Name"_ustr, pDoc->GetString(10, 4, 0)); CPPUNIT_ASSERT_EQUAL(u"Elisabeth"_ustr, pDoc->GetString(10, 5, 0)); CPPUNIT_ASSERT_EQUAL(u"Frieda"_ustr, pDoc->GetString(10, 6, 0)); CPPUNIT_ASSERT_EQUAL(u"Adele"_ustr, pDoc->GetString(10, 7, 0)); CPPUNIT_ASSERT_EQUAL(u"Berta"_ustr, pDoc->GetString(10, 8, 0)); CPPUNIT_ASSERT_EQUAL(u"total"_ustr, pDoc->GetString(10, 9, 0)); CPPUNIT_ASSERT_EQUAL(u"Count"_ustr, pDoc->GetString(11, 4, 0)); CPPUNIT_ASSERT_EQUAL(u"7"_ustr, pDoc->GetString(11, 5, 0)); CPPUNIT_ASSERT_EQUAL(u"6"_ustr, pDoc->GetString(11, 6, 0)); CPPUNIT_ASSERT_EQUAL(u"4"_ustr, pDoc->GetString(11, 7, 0)); CPPUNIT_ASSERT_EQUAL(u"5"_ustr, pDoc->GetString(11, 8, 0)); CPPUNIT_ASSERT_EQUAL(u"22"_ustr, pDoc->GetString(11, 9, 0)); }; createScDoc("tdf162087.ods"); verify(); // change UseEnglishFuncName to true ScDocShell* pDocSh = getScDocShell(); ScFormulaOptions aFormulaOptions = ScModule::get()->GetFormulaOptions(); bool bOldStatus = aFormulaOptions.GetUseEnglishFuncName(); aFormulaOptions.SetUseEnglishFuncName(true); pDocSh->SetFormulaOptions(aFormulaOptions); createScDoc("tdf162087.ods"); pDocSh = getScDocShell(); // Without the fix in place, this test would have failed with // - Expected: Elisabeth // - Actual : #NAME? verify(); aFormulaOptions.SetUseEnglishFuncName(bOldStatus); pDocSh->SetFormulaOptions(aFormulaOptions); } CPPUNIT_TEST_FIXTURE(ScUiCalcTest, testTdf103994) { createScDoc(); ScDocument* pDoc = getScDoc(); insertStringToCell(u"A1"_ustr, u"1"); insertStringToCell(u"B1"_ustr, u"2"); // Save the document save(u"calc8"_ustr); // Open a new document createScDoc(); pDoc = getScDoc(); // Insert the reference to the external document OUString aFormula = "='" + maTempFile.GetURL() + "'#$Sheet1.A1"; insertStringToCell(u"A1"_ustr, aFormula); CPPUNIT_ASSERT_EQUAL(aFormula, pDoc->GetFormula(0, 0, 0)); CPPUNIT_ASSERT_EQUAL(1.0, pDoc->GetValue(ScAddress(0, 0, 0))); goToCell(u"A1"_ustr); dispatchCommand(mxComponent, u".uno:Cut"_ustr, {}); goToCell(u"B1"_ustr); dispatchCommand(mxComponent, u".uno:Paste"_ustr, {}); // Without the fix in place, this test would have failed with // - Expected: ='file:///tmp/lu124171irlmb.tmp'#$Sheet1.A1 // - Actual : ='file:///tmp/lu124171irlmb.tmp'#$Sheet1.B1 CPPUNIT_ASSERT_EQUAL(aFormula, pDoc->GetFormula(1, 0, 0)); CPPUNIT_ASSERT_EQUAL(1.0, pDoc->GetValue(ScAddress(1, 0, 0))); } CPPUNIT_TEST_FIXTURE(ScUiCalcTest, testTdf113541) { createScDoc(); ScDocument* pDoc = getScDoc(); insertStringToCell(u"A1"_ustr, u"50"); // Save the document save(u"calc8"_ustr); // Open a new document createScDoc(); pDoc = getScDoc(); // Change grammar to Excel A1 FormulaGrammarSwitch aFGSwitch(pDoc, formula::FormulaGrammar::GRAM_ENGLISH_XL_A1); // Insert the reference to the external document OUString aFormula = "=['" + maTempFile.GetURL() + "']Sheet1!A1"; insertStringToCell(u"A1"_ustr, aFormula); // Without the fix in place, this test would have failed with // - Expected: 50 // - Actual : Err:507 CPPUNIT_ASSERT_EQUAL(u"50"_ustr, pDoc->GetString(ScAddress(0, 0, 0))); } CPPUNIT_TEST_FIXTURE(ScUiCalcTest, testTdf126577) { createScDoc(); ScDocument* pDoc = getScDoc(); goToCell(u"A1:A20"_ustr); uno::Sequence<beans::PropertyValue> aArgs( comphelper::InitPropertySequence({ { "FillDir", uno::Any(u"B"_ustr) }, { "FillCmd", uno::Any(u"L"_ustr) }, { "FillStep", uno::Any(u"1"_ustr) }, { "FillDateCmd", uno::Any(u"D"_ustr) }, { "FillStart", uno::Any(u"1"_ustr) }, { "FillMax", uno::Any(u"10"_ustr) } })); dispatchCommand(mxComponent, u".uno:FillSeries"_ustr, aArgs); for (size_t i = 0; i < 10; ++i) { CPPUNIT_ASSERT_EQUAL(OUString(OUString::number(i + 1)), pDoc->GetString(ScAddress(0, i, 0))); } for (size_t i = 10; i < 20; ++i) { // Without the fix in place, this test would have failed with // - Expected: // - Actual : #NUM! CPPUNIT_ASSERT_EQUAL(u""_ustr, pDoc->GetString(ScAddress(0, i, 0))); } } CPPUNIT_TEST_FIXTURE(ScUiCalcTest, testTdf107869) { // Without the fix in place, this test would have crashed createScDoc(); ScDocument* pDoc = getScDoc(); insertStringToCell(u"A1"_ustr, u"A"); insertStringToCell(u"A2"_ustr, u"B"); // Add a new comment to A1 and A2 uno::Sequence<beans::PropertyValue> aArgs = comphelper::InitPropertySequence({ { "Text", uno::Any(u"Comment"_ustr) } }); goToCell(u"A1"_ustr); dispatchCommand(mxComponent, u".uno:InsertAnnotation"_ustr, aArgs); goToCell(u"A2"_ustr); dispatchCommand(mxComponent, u".uno:InsertAnnotation"_ustr, aArgs); CPPUNIT_ASSERT_MESSAGE("There should be a note on A1", pDoc->HasNote(ScAddress(0, 0, 0))); CPPUNIT_ASSERT_MESSAGE("There should be a note on A2", pDoc->HasNote(ScAddress(0, 1, 0))); goToCell(u"A1"_ustr); dispatchCommand(mxComponent, u".uno:SelectRow"_ustr, {}); dispatchCommand(mxComponent, u".uno:DeleteRows"_ustr, {}); for (size_t i = 0; i < 10; ++i) { CPPUNIT_ASSERT_EQUAL(u"B"_ustr, pDoc->GetString(ScAddress(0, 0, 0))); CPPUNIT_ASSERT_MESSAGE("There should be a note on A1", pDoc->HasNote(ScAddress(0, 0, 0))); CPPUNIT_ASSERT_MESSAGE("There should be no note on A2", !pDoc->HasNote(ScAddress(0, 1, 0))); dispatchCommand(mxComponent, u".uno:Undo"_ustr, {}); CPPUNIT_ASSERT_EQUAL(u"A"_ustr, pDoc->GetString(ScAddress(0, 0, 0))); CPPUNIT_ASSERT_EQUAL(u"B"_ustr, pDoc->GetString(ScAddress(0, 1, 0))); CPPUNIT_ASSERT_MESSAGE("There should be a note on A1", pDoc->HasNote(ScAddress(0, 0, 0))); CPPUNIT_ASSERT_MESSAGE("There should be a note on A2", pDoc->HasNote(ScAddress(0, 1, 0))); dispatchCommand(mxComponent, u".uno:Redo"_ustr, {}); } dispatchCommand(mxComponent, u".uno:Undo"_ustr, {}); goToCell(u"A1:A2"_ustr); dispatchCommand(mxComponent, u".uno:SelectRow"_ustr, {}); dispatchCommand(mxComponent, u".uno:DeleteRows"_ustr, {}); for (size_t i = 0; i < 10; ++i) { CPPUNIT_ASSERT_EQUAL(u""_ustr, pDoc->GetString(ScAddress(0, 0, 0))); CPPUNIT_ASSERT_EQUAL(u""_ustr, pDoc->GetString(ScAddress(0, 1, 0))); CPPUNIT_ASSERT_MESSAGE("There should be no note on A1", !pDoc->HasNote(ScAddress(0, 0, 0))); CPPUNIT_ASSERT_MESSAGE("There should be no note on A2", !pDoc->HasNote(ScAddress(0, 1, 0))); dispatchCommand(mxComponent, u".uno:Undo"_ustr, {}); CPPUNIT_ASSERT_EQUAL(u"A"_ustr, pDoc->GetString(ScAddress(0, 0, 0))); CPPUNIT_ASSERT_EQUAL(u"B"_ustr, pDoc->GetString(ScAddress(0, 1, 0))); CPPUNIT_ASSERT_MESSAGE("There should be a note on A1", pDoc->HasNote(ScAddress(0, 0, 0))); CPPUNIT_ASSERT_MESSAGE("There should be a note on A2", pDoc->HasNote(ScAddress(0, 1, 0))); dispatchCommand(mxComponent, u".uno:Redo"_ustr, {}); } } CPPUNIT_TEST_FIXTURE(ScUiCalcTest, testTdf63805) { createScDoc(); ScDocument* pDoc = getScDoc(); insertStringToCell(u"A1"_ustr, u"2012-10-31"); goToCell(u"A1:A20"_ustr); uno::Sequence<beans::PropertyValue> aArgs( comphelper::InitPropertySequence({ { "FillDir", uno::Any(u"B"_ustr) }, { "FillCmd", uno::Any(u"D"_ustr) }, { "FillStep", uno::Any(u"1"_ustr) }, { "FillDateCmd", uno::Any(u"M"_ustr) }, { "FillStart", uno::Any(u"41213"_ustr) } })); dispatchCommand(mxComponent, u".uno:FillSeries"_ustr, aArgs); CPPUNIT_ASSERT_EQUAL(u"2012-10-31"_ustr, pDoc->GetString(ScAddress(0, 0, 0))); // Without the fix in place, this test would have failed with // - Expected: 2012-11-30 // - Actual : 2012-12-01 CPPUNIT_ASSERT_EQUAL(u"2012-11-30"_ustr, pDoc->GetString(ScAddress(0, 1, 0))); CPPUNIT_ASSERT_EQUAL(u"2012-12-31"_ustr, pDoc->GetString(ScAddress(0, 2, 0))); CPPUNIT_ASSERT_EQUAL(u"2013-01-31"_ustr, pDoc->GetString(ScAddress(0, 3, 0))); CPPUNIT_ASSERT_EQUAL(u"2013-02-28"_ustr, pDoc->GetString(ScAddress(0, 4, 0))); CPPUNIT_ASSERT_EQUAL(u"2013-03-31"_ustr, pDoc->GetString(ScAddress(0, 5, 0))); CPPUNIT_ASSERT_EQUAL(u"2013-04-30"_ustr, pDoc->GetString(ScAddress(0, 6, 0))); CPPUNIT_ASSERT_EQUAL(u"2013-05-31"_ustr, pDoc->GetString(ScAddress(0, 7, 0))); CPPUNIT_ASSERT_EQUAL(u"2013-06-30"_ustr, pDoc->GetString(ScAddress(0, 8, 0))); CPPUNIT_ASSERT_EQUAL(u"2013-07-31"_ustr, pDoc->GetString(ScAddress(0, 9, 0))); CPPUNIT_ASSERT_EQUAL(u"2013-08-31"_ustr, pDoc->GetString(ScAddress(0, 10, 0))); CPPUNIT_ASSERT_EQUAL(u"2013-09-30"_ustr, pDoc->GetString(ScAddress(0, 11, 0))); CPPUNIT_ASSERT_EQUAL(u"2013-10-31"_ustr, pDoc->GetString(ScAddress(0, 12, 0))); CPPUNIT_ASSERT_EQUAL(u"2013-11-30"_ustr, pDoc->GetString(ScAddress(0, 13, 0))); CPPUNIT_ASSERT_EQUAL(u"2013-12-31"_ustr, pDoc->GetString(ScAddress(0, 14, 0))); CPPUNIT_ASSERT_EQUAL(u"2014-01-31"_ustr, pDoc->GetString(ScAddress(0, 15, 0))); CPPUNIT_ASSERT_EQUAL(u"2014-02-28"_ustr, pDoc->GetString(ScAddress(0, 16, 0))); CPPUNIT_ASSERT_EQUAL(u"2014-03-31"_ustr, pDoc->GetString(ScAddress(0, 17, 0))); CPPUNIT_ASSERT_EQUAL(u"2014-04-30"_ustr, pDoc->GetString(ScAddress(0, 18, 0))); CPPUNIT_ASSERT_EQUAL(u"2014-05-31"_ustr, pDoc->GetString(ScAddress(0, 19, 0))); dispatchCommand(mxComponent, u".uno:Undo"_ustr, {}); CPPUNIT_ASSERT_EQUAL(u"2012-10-31"_ustr, pDoc->GetString(ScAddress(0, 0, 0))); CPPUNIT_ASSERT_EQUAL(u""_ustr, pDoc->GetString(ScAddress(0, 1, 0))); } CPPUNIT_TEST_FIXTURE(ScUiCalcTest, testTdf147894) { createScDoc(); ScDocument* pDoc = getScDoc(); //Select the first row goToCell(u"1:1"_ustr); uno::Sequence<beans::PropertyValue> aArgs( comphelper::InitPropertySequence({ { "FillDir", uno::Any(u"R"_ustr) }, { "FillCmd", uno::Any(u"L"_ustr) }, { "FillStep", uno::Any(u"1"_ustr) }, { "FillDateCmd", uno::Any(u"D"_ustr) }, { "FillStart", uno::Any(u"1"_ustr) } })); // Without the fix in place, this test would have crashed here dispatchCommand(mxComponent, u".uno:FillSeries"_ustr, aArgs); CPPUNIT_ASSERT_EQUAL(1.0, pDoc->GetValue(ScAddress(0, 0, 0))); CPPUNIT_ASSERT_EQUAL(16384.0, pDoc->GetValue(ScAddress(16383, 0, 0))); } CPPUNIT_TEST_FIXTURE(ScUiCalcTest, testTdf94208) { createScDoc(); ScDocument* pDoc = getScDoc(); insertStringToCell(u"A1"_ustr, u"=COUNTA(B:B)"); insertStringToCell(u"A3"_ustr, u"Range"); insertStringToCell(u"A4"_ustr, u"Range"); insertStringToCell(u"A5"_ustr, u"Range"); insertStringToCell(u"A6"_ustr, u"Range"); insertStringToCell(u"A7"_ustr, u"Range"); insertStringToCell(u"A8"_ustr, u"Range"); insertStringToCell(u"B6"_ustr, u"Test"); CPPUNIT_ASSERT_EQUAL(1.0, pDoc->GetValue(ScAddress(0, 0, 0))); goToCell(u"A3:A8"_ustr); dispatchCommand(mxComponent, u".uno:SelectRow"_ustr, {}); //type Control-D/Fill Down dispatchCommand(mxComponent, u".uno:FillDown"_ustr, {}); CPPUNIT_ASSERT_EQUAL(0.0, pDoc->GetValue(ScAddress(0, 0, 0))); dispatchCommand(mxComponent, u".uno:Undo"_ustr, {}); // Without the fix in place, this test would have failed with // - Expected: 1 // - Actual : 0 CPPUNIT_ASSERT_EQUAL(1.0, pDoc->GetValue(ScAddress(0, 0, 0))); for (SCROW i = 2; i < 8; ++i) { CPPUNIT_ASSERT_EQUAL(u"Range"_ustr, pDoc->GetString(ScAddress(0, i, 0))); } CPPUNIT_ASSERT_EQUAL(u"Test"_ustr, pDoc->GetString(ScAddress(1, 5, 0))); } CPPUNIT_TEST_FIXTURE(ScUiCalcTest, testTdf37623) { createScDoc(); ScDocument* pDoc = getScDoc(); goToCell(u"A3:A4"_ustr); dispatchCommand(mxComponent, u".uno:HideRow"_ustr, {}); insertStringToCell(u"A2"_ustr, u"1"); goToCell(u"A2:A6"_ustr); uno::Sequence<beans::PropertyValue> aArgs( comphelper::InitPropertySequence({ { "FillDir", uno::Any(u"B"_ustr) }, { "FillCmd", uno::Any(u"A"_ustr) }, { "FillStep", uno::Any(u"1"_ustr) }, { "FillDateCmd", uno::Any(u"M"_ustr) } })); dispatchCommand(mxComponent, u".uno:FillSeries"_ustr, aArgs); CPPUNIT_ASSERT_EQUAL(1.0, pDoc->GetValue(ScAddress(0, 1, 0))); CPPUNIT_ASSERT_EQUAL(0.0, pDoc->GetValue(ScAddress(0, 2, 0))); CPPUNIT_ASSERT_EQUAL(0.0, pDoc->GetValue(ScAddress(0, 3, 0))); CPPUNIT_ASSERT_EQUAL(2.0, pDoc->GetValue(ScAddress(0, 4, 0))); CPPUNIT_ASSERT_EQUAL(3.0, pDoc->GetValue(ScAddress(0, 5, 0))); } CPPUNIT_TEST_FIXTURE(ScUiCalcTest, testTdf144308) { createScDoc(); ScDocument* pDoc = getScDoc(); css::uno::Reference<css::sheet::XGlobalSheetSettings> xGlobalSheetSettings = css::sheet::GlobalSheetSettings::create(::comphelper::getProcessComponentContext()); bool bOldValue = xGlobalSheetSettings->getDoAutoComplete(); xGlobalSheetSettings->setDoAutoComplete(true); insertStringToCell(u"A1"_ustr, u"ABC"); insertStringToCell(u"A2"_ustr, u"A"); CPPUNIT_ASSERT_EQUAL(u"ABC"_ustr, pDoc->GetString(ScAddress(0, 1, 0))); xGlobalSheetSettings->setDoAutoComplete(false); insertStringToCell(u"A3"_ustr, u"A"); // Without the fix in place, this test would have failed with // - Expected: A // - Actual : ABC CPPUNIT_ASSERT_EQUAL(u"A"_ustr, pDoc->GetString(ScAddress(0, 2, 0))); // Restore the previous value xGlobalSheetSettings->setDoAutoComplete(bOldValue); } CPPUNIT_TEST_FIXTURE(ScUiCalcTest, testPasteWithReturnKey) { createScDoc(); ScDocument* pDoc = getScDoc(); ScModelObj* pModelObj = comphelper::getFromUnoTunnel<ScModelObj>(mxComponent); insertStringToCell(u"A1"_ustr, u"Test"); goToCell(u"A1"_ustr); for (SCROW i = 1; i <= 10; ++i) { dispatchCommand(mxComponent, u".uno:Copy"_ustr, {}); dispatchCommand(mxComponent, u".uno:GoDown"_ustr, {}); // Paste using Return pModelObj->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, awt::Key::RETURN); pModelObj->postKeyEvent(LOK_KEYEVENT_KEYUP, 0, awt::Key::RETURN); Scheduler::ProcessEventsToIdle(); CPPUNIT_ASSERT_EQUAL(u"Test"_ustr, pDoc->GetString(ScAddress(0, i, 0))); } } CPPUNIT_TEST_FIXTURE(ScUiCalcTest, testTdf56036) { createScDoc(); ScDocument* pDoc = getScDoc(); goToCell(u"A1"_ustr); typeString(u"=SUM( 1 + 2 "); // Insert Newline ScModelObj* pModelObj = comphelper::getFromUnoTunnel<ScModelObj>(mxComponent); pModelObj->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, KEY_MOD1 | awt::Key::RETURN); pModelObj->postKeyEvent(LOK_KEYEVENT_KEYUP, 0, KEY_MOD1 | awt::Key::RETURN); Scheduler::ProcessEventsToIdle(); typeString(u"+ 3)"); pModelObj->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, awt::Key::RETURN); pModelObj->postKeyEvent(LOK_KEYEVENT_KEYUP, 0, awt::Key::RETURN); Scheduler::ProcessEventsToIdle(); // Without the fix in place, this test would have failed with // - Expected: 6 // - Actual : Err:501 CPPUNIT_ASSERT_EQUAL(u"6"_ustr, pDoc->GetString(ScAddress(0, 0, 0))); } CPPUNIT_TEST_FIXTURE(ScUiCalcTest, testTdf154174_repeat_empty) { createScDoc(); insertStringToCell(u"A1"_ustr, u"aaaa"); ScModelObj* pModelObj = comphelper::getFromUnoTunnel<ScModelObj>(mxComponent); pModelObj->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, KEY_MOD1 | KEY_SHIFT | awt::Key::Y); pModelObj->postKeyEvent(LOK_KEYEVENT_KEYUP, 0, KEY_MOD1 | KEY_SHIFT | awt::Key::Y); Scheduler::ProcessEventsToIdle(); ScDocument* pDoc = getScDoc(); CPPUNIT_ASSERT_EQUAL(u"aaaa"_ustr, pDoc->GetString(ScAddress(0, 1, 0))); pModelObj->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, awt::Key::F2); pModelObj->postKeyEvent(LOK_KEYEVENT_KEYUP, 0, awt::Key::F2); Scheduler::ProcessEventsToIdle(); pModelObj->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, awt::Key::DELETE); pModelObj->postKeyEvent(LOK_KEYEVENT_KEYUP, 0, awt::Key::DELETE); Scheduler::ProcessEventsToIdle(); pModelObj->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, awt::Key::RETURN); pModelObj->postKeyEvent(LOK_KEYEVENT_KEYUP, 0, awt::Key::RETURN); Scheduler::ProcessEventsToIdle(); // Without the fix in place, this test would have failed with // - Expected: aaaa // - Actual : CPPUNIT_ASSERT_EQUAL(u"aaaa"_ustr, pDoc->GetString(ScAddress(0, 1, 0))); } CPPUNIT_TEST_FIXTURE(ScUiCalcTest, testTdf119162) { createScDoc(); ScDocument* pDoc = getScDoc(); goToCell(u"A1"_ustr); typeString(u"Test"); // Insert Newline ScModelObj* pModelObj = comphelper::getFromUnoTunnel<ScModelObj>(mxComponent); pModelObj->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, KEY_MOD1 | awt::Key::RETURN); pModelObj->postKeyEvent(LOK_KEYEVENT_KEYUP, 0, KEY_MOD1 | awt::Key::RETURN); Scheduler::ProcessEventsToIdle(); pModelObj->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, awt::Key::RETURN); pModelObj->postKeyEvent(LOK_KEYEVENT_KEYUP, 0, awt::Key::RETURN); Scheduler::ProcessEventsToIdle(); CPPUNIT_ASSERT_EQUAL(OUString(u"Test" + OUStringChar(u'\xA')), pDoc->GetString(ScAddress(0, 0, 0))); goToCell(u"A1"_ustr); // Without the fix in place, this test would have hung here dispatchCommand(mxComponent, u".uno:ChangeCaseRotateCase"_ustr, {}); CPPUNIT_ASSERT_EQUAL(OUString(u"Test" + OUStringChar(u'\xA')), pDoc->GetString(ScAddress(0, 0, 0))); dispatchCommand(mxComponent, u".uno:ChangeCaseToLower"_ustr, {}); CPPUNIT_ASSERT_EQUAL(OUString(u"test" + OUStringChar(u'\xA')), pDoc->GetString(ScAddress(0, 0, 0))); } CPPUNIT_TEST_FIXTURE(ScUiCalcTest, testTdf90579) { createScDoc(); ScDocument* pDoc = getScDoc(); insertStringToCell(u"A1"_ustr, u"2300"); insertStringToCell(u"A2"_ustr, u"Libre"); insertStringToCell(u"B1"_ustr, u"10"); insertStringToCell(u"B2"_ustr, u"Office"); insertStringToCell(u"C1"_ustr, u"=SUM(A1:B1)"); insertStringToCell(u"C2"_ustr, u"=A2&B2"); CPPUNIT_ASSERT_EQUAL(u"2310"_ustr, pDoc->GetString(ScAddress(2, 0, 0))); CPPUNIT_ASSERT_EQUAL(u"LibreOffice"_ustr, pDoc->GetString(ScAddress(2, 1, 0))); goToCell(u"C1:C2"_ustr); dispatchCommand(mxComponent, u".uno:ConvertFormulaToValue"_ustr, {}); CPPUNIT_ASSERT_EQUAL(u"2310"_ustr, pDoc->GetString(ScAddress(2, 0, 0))); CPPUNIT_ASSERT_EQUAL(u"LibreOffice"_ustr, pDoc->GetString(ScAddress(2, 1, 0))); CPPUNIT_ASSERT_EQUAL(u""_ustr, pDoc->GetFormula(2, 0, 0)); CPPUNIT_ASSERT_EQUAL(u""_ustr, pDoc->GetFormula(2, 1, 0)); dispatchCommand(mxComponent, u".uno:Undo"_ustr, {}); CPPUNIT_ASSERT_EQUAL(u"2310"_ustr, pDoc->GetString(ScAddress(2, 0, 0))); CPPUNIT_ASSERT_EQUAL(u"LibreOffice"_ustr, pDoc->GetString(ScAddress(2, 1, 0))); CPPUNIT_ASSERT_EQUAL(u"=SUM(A1:B1)"_ustr, pDoc->GetFormula(2, 0, 0)); CPPUNIT_ASSERT_EQUAL(u"=A2&B2"_ustr, pDoc->GetFormula(2, 1, 0)); } CPPUNIT_TEST_FIXTURE(ScUiCalcTest, testTdf124820) { createScDoc("tdf124820.xlsx"); ScDocument* pDoc = getScDoc(); goToCell(u"B2"_ustr); dispatchCommand(mxComponent, u".uno:Strikeout"_ustr, {}); saveAndReload(u"Calc Office Open XML"_ustr); pDoc = getScDoc(); vcl::Font aFont; const ScPatternAttr* pPattern = pDoc->GetPattern(1, 1, 0); pPattern->fillFontOnly(aFont); // Without the fix in place, this test would have failed here CPPUNIT_ASSERT_EQUAL_MESSAGE("font should be striked out", STRIKEOUT_SINGLE, aFont.GetStrikeout()); } CPPUNIT_TEST_FIXTURE(ScUiCalcTest, testTdf132026) { createScDoc("tdf132026.ods"); ScDocument* pDoc = getScDoc(); std::vector<std::u16string_view> aChars{ u"=", u"+", u"-" }; std::vector<sal_uInt16> aDirections{ KEY_UP, KEY_DOWN, KEY_LEFT, KEY_RIGHT }; ScModelObj* pModelObj = comphelper::getFromUnoTunnel<ScModelObj>(mxComponent); for (auto aChar = aChars.begin(); aChar != aChars.end(); ++aChar) { for (size_t i = 0; i < aDirections.size(); ++i) { goToCell(u"B2"_ustr); typeString(*aChar); sal_uInt16 nDir = aDirections[i]; pModelObj->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, nDir); pModelObj->postKeyEvent(LOK_KEYEVENT_KEYUP, 0, nDir); Scheduler::ProcessEventsToIdle(); pModelObj->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, awt::Key::RETURN); pModelObj->postKeyEvent(LOK_KEYEVENT_KEYUP, 0, awt::Key::RETURN); Scheduler::ProcessEventsToIdle(); sal_Int16 nSign = (*aChar == u"-") ? -1 : 1; sal_Int16 nExpected = nSign * (i + 1); OUString sExpectedResult = OUString::number(nExpected); CPPUNIT_ASSERT_EQUAL(sExpectedResult, pDoc->GetString(ScAddress(1, 1, 0))); goToCell(u"E2"_ustr); typeString(*aChar); pModelObj->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, nDir); pModelObj->postKeyEvent(LOK_KEYEVENT_KEYUP, 0, nDir); Scheduler::ProcessEventsToIdle(); pModelObj->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, awt::Key::RETURN); pModelObj->postKeyEvent(LOK_KEYEVENT_KEYUP, 0, awt::Key::RETURN); Scheduler::ProcessEventsToIdle(); // Without the fix in place, this test would have failed with // - Expected: = // - Actual : =E1 CPPUNIT_ASSERT_EQUAL(OUString(*aChar), pDoc->GetString(ScAddress(4, 1, 0))); } } } CPPUNIT_TEST_FIXTURE(ScUiCalcTest, testTdf152037) { createScDoc("tdf152037.xlsx"); insertStringToCell(u"C2"_ustr, u"abcdefghi"); ScDocument* pDoc = getScDoc(); // Without the fix in place, this test would have failed with // - Expected: abcdefghi // - Actual : CPPUNIT_ASSERT_EQUAL(u"abcdefghi"_ustr, pDoc->GetString(ScAddress(2, 1, 0))); } CPPUNIT_TEST_FIXTURE(ScUiCalcTest, testTdf119155) { createScDoc("tdf119155.xlsx"); ScDocument* pDoc = getScDoc(); goToCell(u"C2:C14"_ustr); // Without the fix in place, this test would have hung here dispatchCommand(mxComponent, u".uno:ChangeCaseToTitleCase"_ustr, {}); CPPUNIT_ASSERT_EQUAL(u"Collagene Expert Targeted Wrinkle Corrector Unboxed 10 Ml"_ustr, pDoc->GetString(ScAddress(2, 1, 0))); CPPUNIT_ASSERT_EQUAL(u"Vitamina Suractivee Hand Cream 400 Ml"_ustr, pDoc->GetString(ScAddress(2, 13, 0))); } CPPUNIT_TEST_FIXTURE(ScUiCalcTest, testTdf146795) { createScDoc("tdf146795.ods"); ScDocument* pDoc = getScDoc(); // Disable replace cell warning ScModule* pMod = ScModule::get(); ScInputOptions aInputOption = pMod->GetInputOptions(); bool bOldStatus = aInputOption.GetReplaceCellsWarn(); aInputOption.SetReplaceCellsWarn(false); pMod->SetInputOptions(aInputOption); goToCell(u"B2"_ustr); dispatchCommand(mxComponent, u".uno:Copy"_ustr, {}); // Move to B3 ScModelObj* pModelObj = comphelper::getFromUnoTunnel<ScModelObj>(mxComponent); pModelObj->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, KEY_DOWN); Scheduler::ProcessEventsToIdle(); // Select the three following cells pModelObj->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, KEY_SHIFT | KEY_DOWN); pModelObj->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, KEY_SHIFT | KEY_DOWN); pModelObj->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, KEY_SHIFT | KEY_DOWN); Scheduler::ProcessEventsToIdle(); // Without the fix in place, this test would have crashed here dispatchCommand(mxComponent, u".uno:Paste"_ustr, {}); CPPUNIT_ASSERT_EQUAL(u"a"_ustr, pDoc->GetString(ScAddress(1, 1, 0))); CPPUNIT_ASSERT_EQUAL(u"a"_ustr, pDoc->GetString(ScAddress(1, 2, 0))); CPPUNIT_ASSERT_EQUAL(u"a"_ustr, pDoc->GetString(ScAddress(1, 3, 0))); CPPUNIT_ASSERT_EQUAL(u"44"_ustr, pDoc->GetString(ScAddress(1, 4, 0))); CPPUNIT_ASSERT_EQUAL(u"44"_ustr, pDoc->GetString(ScAddress(1, 5, 0))); CPPUNIT_ASSERT_EQUAL(u"a"_ustr, pDoc->GetString(ScAddress(1, 6, 0))); CPPUNIT_ASSERT_EQUAL(u"a"_ustr, pDoc->GetString(ScAddress(1, 7, 0))); CPPUNIT_ASSERT_EQUAL(u"44"_ustr, pDoc->GetString(ScAddress(1, 8, 0))); // Restore previous status aInputOption.SetReplaceCellsWarn(bOldStatus); pMod->SetInputOptions(aInputOption); } CPPUNIT_TEST_FIXTURE(ScUiCalcTest, testTdf147744) { createScDoc("tdf147744.ods"); ScDocument* pDoc = getScDoc(); // Disable replace cell warning ScModule* pMod = ScModule::get(); ScInputOptions aInputOption = pMod->GetInputOptions(); bool bOldStatus = aInputOption.GetReplaceCellsWarn(); aInputOption.SetReplaceCellsWarn(false); pMod->SetInputOptions(aInputOption); goToCell(u"A2"_ustr); dispatchCommand(mxComponent, u".uno:Copy"_ustr, {}); // Move to A3 ScModelObj* pModelObj = comphelper::getFromUnoTunnel<ScModelObj>(mxComponent); pModelObj->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, KEY_DOWN); Scheduler::ProcessEventsToIdle(); // Select the following cell pModelObj->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, KEY_SHIFT | KEY_DOWN); Scheduler::ProcessEventsToIdle(); // Without the fix in place, this test would have crashed here dispatchCommand(mxComponent, u".uno:Paste"_ustr, {}); CPPUNIT_ASSERT_EQUAL(1.0, pDoc->GetValue(ScAddress(0, 1, 0))); CPPUNIT_ASSERT_EQUAL(0.0, pDoc->GetValue(ScAddress(0, 2, 0))); CPPUNIT_ASSERT_EQUAL(1.0, pDoc->GetValue(ScAddress(0, 3, 0))); CPPUNIT_ASSERT_EQUAL(0.0, pDoc->GetValue(ScAddress(0, 4, 0))); CPPUNIT_ASSERT_EQUAL(1.0, pDoc->GetValue(ScAddress(0, 5, 0))); CPPUNIT_ASSERT_EQUAL(0.0, pDoc->GetValue(ScAddress(0, 6, 0))); // Restore previous status aInputOption.SetReplaceCellsWarn(bOldStatus); pMod->SetInputOptions(aInputOption); } CPPUNIT_TEST_FIXTURE(ScUiCalcTest, testTdf138432) { createScDoc("tdf138432.ods"); ScDocument* pDoc = getScDoc(); // Set the system locale to Hungarian SvtSysLocaleOptions aOptions; OUString sLocaleConfigString = aOptions.GetLanguageTag().getBcp47(); aOptions.SetLocaleConfigString(u"hu-HU"_ustr); aOptions.Commit(); comphelper::ScopeGuard g([&aOptions, &sLocaleConfigString] { aOptions.SetLocaleConfigString(sLocaleConfigString); aOptions.Commit(); }); OUString sExpectedA1 = "12" + OUStringChar(u'\xa0') + "345,67"; CPPUNIT_ASSERT_EQUAL(sExpectedA1, pDoc->GetString(ScAddress(0, 0, 0))); goToCell(u"A1"_ustr); dispatchCommand(mxComponent, u".uno:Copy"_ustr, {}); goToCell(u"A2"_ustr); typeString(u"="); dispatchCommand(mxComponent, u".uno:Paste"_ustr, {}); ScModelObj* pModelObj = comphelper::getFromUnoTunnel<ScModelObj>(mxComponent); pModelObj->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, awt::Key::RETURN); pModelObj->postKeyEvent(LOK_KEYEVENT_KEYUP, 0, awt::Key::RETURN); Scheduler::ProcessEventsToIdle(); // Without the fix in place, this test would have failed with // - Expected: 12345,67 // - Actual : Err:509 CPPUNIT_ASSERT_EQUAL(u"12345,67"_ustr, pDoc->GetString(ScAddress(0, 1, 0))); } CPPUNIT_TEST_FIXTURE(ScUiCalcTest, testTdf143896) { createScDoc(); ScDocument* pDoc = getScDoc(); insertStringToCell(u"A2000"_ustr, u"Test"); CPPUNIT_ASSERT_EQUAL(u"Test"_ustr, pDoc->GetString(ScAddress(0, 1999, 0))); saveAndReload(u"Calc Office Open XML"_ustr); pDoc = getScDoc(); // Without the fix in place, this test would have failed with // - Expected: Test // - Actual : CPPUNIT_ASSERT_EQUAL(u"Test"_ustr, pDoc->GetString(ScAddress(0, 1999, 0))); } CPPUNIT_TEST_FIXTURE(ScUiCalcTest, testTdf145085) { createScDoc(); ScDocument* pDoc = getScDoc(); insertArrayToCell(u"A1"_ustr, u"=HYPERLINK(\"a\";\"b\")"); CPPUNIT_ASSERT_EQUAL(u"b"_ustr, pDoc->GetString(ScAddress(0, 0, 0))); // Without the fix in place, this test would have failed with // - Expected: // - Actual : a CPPUNIT_ASSERT_EQUAL(u""_ustr, pDoc->GetString(ScAddress(0, 1, 0))); } CPPUNIT_TEST_FIXTURE(ScUiCalcTest, testTdf154125) { createScDoc(); ScDocument* pDoc = getScDoc(); insertArrayToCell(u"A1"_ustr, u"=INDEX({11;21},0,1)"); CPPUNIT_ASSERT_EQUAL(u"11"_ustr, pDoc->GetString(ScAddress(0, 0, 0))); // Without the fix in place, this test would have failed with // - Expected: 21 // - Actual : CPPUNIT_ASSERT_EQUAL(u"21"_ustr, pDoc->GetString(ScAddress(0, 1, 0))); } CPPUNIT_TEST_FIXTURE(ScUiCalcTest, testTdf159046) { createScDoc("tdf159046.ods"); ScDocument* pDoc = getScDoc(); ScDrawLayer* pDrawLayer = pDoc->GetDrawLayer(); std::map<SCROW, std::vector<SdrObject*>> aObjects = pDrawLayer->GetObjectsAnchoredToRange(0, 0, 6, 8); CPPUNIT_ASSERT_EQUAL(size_t(1), aObjects.size()); aObjects = pDrawLayer->GetObjectsAnchoredToRange(0, 1, 6, 8); CPPUNIT_ASSERT_EQUAL(size_t(0), aObjects.size()); goToCell(u"A2:F10"_ustr); dispatchCommand(mxComponent, u".uno:Cut"_ustr, {}); goToCell(u"B2"_ustr); dispatchCommand(mxComponent, u".uno:Paste"_ustr, {}); // Without the fix in place, this test would have crashed here saveAndReload(u"calc8"_ustr); pDoc = getScDoc(); pDrawLayer = pDoc->GetDrawLayer(); aObjects = pDrawLayer->GetObjectsAnchoredToRange(0, 0, 6, 8); CPPUNIT_ASSERT_EQUAL(size_t(0), aObjects.size()); aObjects = pDrawLayer->GetObjectsAnchoredToRange(0, 1, 6, 8); CPPUNIT_ASSERT_EQUAL(size_t(1), aObjects.size()); } CPPUNIT_TEST_FIXTURE(ScUiCalcTest, testTdf148863) { createScDoc(); ScDocument* pDoc = getScDoc(); insertArrayToCell(u"A1"_ustr, u"=TRANSPOSE(IF({0|0|0}=0;RANDBETWEEN.NV(1;1000000)))"); double nA1 = pDoc->GetValue(ScAddress(0, 0, 0)); double nB1 = pDoc->GetValue(ScAddress(1, 0, 0)); double nC1 = pDoc->GetValue(ScAddress(2, 0, 0)); // Without the fix in place, this test would have failed here CPPUNIT_ASSERT(nA1 != nB1); CPPUNIT_ASSERT(nA1 != nC1); CPPUNIT_ASSERT(nB1 != nC1); } CPPUNIT_TEST_FIXTURE(ScUiCalcTest, testTdf144244) { createScDoc("tdf144244.ods"); ScDocument* pDoc = getScDoc(); ScModelObj* pModelObj = comphelper::getFromUnoTunnel<ScModelObj>(mxComponent); uno::Reference<drawing::XDrawPage> xPage(pModelObj->getDrawPages()->getByIndex(0), uno::UNO_QUERY_THROW); CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(2), xPage->getCount()); // Select column A and B goToCell(u"A:B"_ustr); dispatchCommand(mxComponent, u".uno:DeleteColumns"_ustr, {}); CPPUNIT_ASSERT_EQUAL(u"x"_ustr, pDoc->GetString(ScAddress(0, 0, 0))); // Without the fix in place, this test would have crashed saveAndReload(u"calc8"_ustr); pModelObj = comphelper::getFromUnoTunnel<ScModelObj>(mxComponent); pDoc = getScDoc(); CPPUNIT_ASSERT_EQUAL(u"x"_ustr, pDoc->GetString(ScAddress(0, 0, 0))); xPage.set(pModelObj->getDrawPages()->getByIndex(0), uno::UNO_QUERY_THROW); CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(2), xPage->getCount()); } CPPUNIT_TEST_FIXTURE(ScUiCalcTest, testTdf153669) { createScDoc("tdf153669.ods"); ScDocument* pDoc = getScDoc(); // Disable replace cell warning ScModule* pMod = ScModule::get(); ScInputOptions aInputOption = pMod->GetInputOptions(); bool bOldStatus = aInputOption.GetReplaceCellsWarn(); aInputOption.SetReplaceCellsWarn(false); pMod->SetInputOptions(aInputOption); insertStringToCell(u"E2"_ustr, u"100"); CPPUNIT_ASSERT_EQUAL(u"110.00"_ustr, pDoc->GetString(ScAddress(5, 1, 0))); dispatchCommand(mxComponent, u".uno:Undo"_ustr, {}); CPPUNIT_ASSERT_EQUAL(u"15.00"_ustr, pDoc->GetString(ScAddress(5, 1, 0))); goToCell(u"E7"_ustr); dispatchCommand(mxComponent, u".uno:Copy"_ustr, {}); goToCell(u"F7"_ustr); dispatchCommand(mxComponent, u".uno:Paste"_ustr, {}); CPPUNIT_ASSERT_EQUAL(u"text"_ustr, pDoc->GetString(ScAddress(5, 6, 0))); insertStringToCell(u"E2"_ustr, u"100"); // Without the fix in place, this test would have failed with // - Expected: 110.00 // - Actual : 15.00 CPPUNIT_ASSERT_EQUAL(u"110.00"_ustr, pDoc->GetString(ScAddress(5, 1, 0))); dispatchCommand(mxComponent, u".uno:Undo"_ustr, {}); CPPUNIT_ASSERT_EQUAL(u"15.00"_ustr, pDoc->GetString(ScAddress(5, 1, 0))); // Restore previous status aInputOption.SetReplaceCellsWarn(bOldStatus); pMod->SetInputOptions(aInputOption); } CPPUNIT_TEST_FIXTURE(ScUiCalcTest, testTdf100582) { createScDoc("tdf100582.xls"); ScDocument* pDoc = getScDoc(); // Disable replace cell warning ScModule* pMod = ScModule::get(); ScInputOptions aInputOption = pMod->GetInputOptions(); bool bOldStatus = aInputOption.GetReplaceCellsWarn(); aInputOption.SetReplaceCellsWarn(false); pMod->SetInputOptions(aInputOption); goToCell(u"C10"_ustr); dispatchCommand(mxComponent, u".uno:Copy"_ustr, {}); goToCell(u"C10:H14"_ustr); dispatchCommand(mxComponent, u".uno:Paste"_ustr, {}); saveAndReload(u"MS Excel 97"_ustr); pDoc = getScDoc(); OUString aFormula = pDoc->GetFormula(3, 10, 0); // Without the fix in place, this test would have failed with // - Expected: {=SUM(($B$3:$B$7=$B11)*(D$3:D$7))} //- Actual : CPPUNIT_ASSERT_EQUAL(u"{=SUM(($B$3:$B$7=$B11)*(D$3:D$7))}"_ustr, aFormula); aFormula = pDoc->GetFormula(4, 10, 0); CPPUNIT_ASSERT_EQUAL(u"{=SUM(($B$3:$B$7=$B11)*(E$3:E$7))}"_ustr, aFormula); aFormula = pDoc->GetFormula(5, 10, 0); CPPUNIT_ASSERT_EQUAL(u"{=SUM(($B$3:$B$7=$B11)*(F$3:F$7))}"_ustr, aFormula); aFormula = pDoc->GetFormula(6, 10, 0); CPPUNIT_ASSERT_EQUAL(u"{=SUM(($B$3:$B$7=$B11)*(G$3:G$7))}"_ustr, aFormula); aFormula = pDoc->GetFormula(7, 10, 0); CPPUNIT_ASSERT_EQUAL(u"{=SUM(($B$3:$B$7=$B11)*(H$3:H$7))}"_ustr, aFormula); // Restore previous status aInputOption.SetReplaceCellsWarn(bOldStatus); pMod->SetInputOptions(aInputOption); } CPPUNIT_TEST_FIXTURE(ScUiCalcTest, testTdf145640) { createScDoc("tdf145640.ods"); ScDocument* pDoc = getScDoc(); // Enable sorting with update reference ScModule* pMod = ScModule::get(); ScInputOptions aInputOption = pMod->GetInputOptions(); bool bOldStatus = aInputOption.GetSortRefUpdate(); aInputOption.SetSortRefUpdate(true); pMod->SetInputOptions(aInputOption); goToCell(u"A2:F17"_ustr); dispatchCommand(mxComponent, u".uno:SortDescending"_ustr, {}); CPPUNIT_ASSERT_EQUAL(u"=SUM(A15:B15:C15:D15:E15:F15)"_ustr, pDoc->GetFormula(6, 3, 0)); // Without the fix in place, this test would have failed with // - Expected: 10 // - Actual : 0 CPPUNIT_ASSERT_EQUAL(10.0, pDoc->GetValue(ScAddress(6, 3, 0))); dispatchCommand(mxComponent, u".uno:Undo"_ustr, {}); CPPUNIT_ASSERT_EQUAL(u"=SUM(A4:B4:C4:D4:E4:F4)"_ustr, pDoc->GetFormula(6, 3, 0)); CPPUNIT_ASSERT_EQUAL(10.0, pDoc->GetValue(ScAddress(6, 3, 0))); // Restore previous status aInputOption.SetSortRefUpdate(bOldStatus); pMod->SetInputOptions(aInputOption); } CPPUNIT_TEST_FIXTURE(ScUiCalcTest, testTdf97215) { createScDoc("tdf97215.ods"); ScDocument* pDoc = getScDoc(); // Enable sorting with update reference ScModule* pMod = ScModule::get(); ScInputOptions aInputOption = pMod->GetInputOptions(); bool bOldStatus = aInputOption.GetSortRefUpdate(); aInputOption.SetSortRefUpdate(true); pMod->SetInputOptions(aInputOption); CPPUNIT_ASSERT_EQUAL(u"Inserted at bottom"_ustr, pDoc->GetString(ScAddress(0, 23, 0))); goToCell(u"A1:M24"_ustr); // Without the fix in place, this test would have hung here dispatchCommand(mxComponent, u".uno:SortAscending"_ustr, {}); CPPUNIT_ASSERT_EQUAL(u"Inserted at bottom"_ustr, pDoc->GetString(ScAddress(0, 0, 0))); dispatchCommand(mxComponent, u".uno:Undo"_ustr, {}); CPPUNIT_ASSERT_EQUAL(u"Inserted at bottom"_ustr, pDoc->GetString(ScAddress(0, 23, 0))); // Restore previous status aInputOption.SetSortRefUpdate(bOldStatus); pMod->SetInputOptions(aInputOption); } CPPUNIT_TEST_FIXTURE(ScUiCalcTest, testTdf104026) { createScDoc("tdf104026.ods"); ScDocument* pDoc = getScDoc(); std::unordered_map<OUString, OUString> aExpectedValues = { { "A2", "Cell value != $Sheet1.$B2" }, { "A3", "Cell value != $Sheet1.$B3" }, { "A4", "Cell value != $Sheet1.$B4" }, { "A5", "Cell value != $Sheet1.$B5" }, { "A6", "Cell value != $Sheet1.$B6" }, { "A7", "Cell value != $Sheet1.$B7" } }; lcl_AssertConditionalFormatList(*pDoc, 6, aExpectedValues); goToCell(u"A2"_ustr); dispatchCommand(mxComponent, u".uno:DeleteRows"_ustr, {}); // Without the fix in place, this test would have failed with // - Expected: Cell value != $Sheet1.$B2 // - Actual : Cell value != $Sheet1.$B#REF! lcl_AssertConditionalFormatList(*pDoc, 5, aExpectedValues); dispatchCommand(mxComponent, u".uno:Undo"_ustr, {}); // tdf#140330: Without the fix in place, this test would have failed with // - Expected: 6 // - Actual : 5 lcl_AssertConditionalFormatList(*pDoc, 6, aExpectedValues); } CPPUNIT_TEST_FIXTURE(ScUiCalcTest, testTdf92963) { createScDoc("tdf92963.ods"); ScDocument* pDoc = getScDoc(); // Disable replace cell warning ScModule* pMod = ScModule::get(); ScInputOptions aInputOption = pMod->GetInputOptions(); bool bOldStatus = aInputOption.GetReplaceCellsWarn(); aInputOption.SetReplaceCellsWarn(false); pMod->SetInputOptions(aInputOption); std::unordered_map<OUString, OUString> aExpectedValues = { { "C1", "Cell value > 14" }, { "C3", "Cell value > 14" }, { "C4", "Cell value > 14" } }; lcl_AssertConditionalFormatList(*pDoc, 3, aExpectedValues); goToCell(u"A3:C4"_ustr); dispatchCommand(mxComponent, u".uno:Copy"_ustr, {}); goToCell(u"A1:C1"_ustr); dispatchCommand(mxComponent, u".uno:Paste"_ustr, {}); aExpectedValues = { { "C3,C1", "Cell value > 14" }, { "C4,C2", "Cell value > 14" } }; lcl_AssertConditionalFormatList(*pDoc, 2, aExpectedValues); // Restore previous status aInputOption.SetReplaceCellsWarn(bOldStatus); pMod->SetInputOptions(aInputOption); } #if !defined(MACOSX) && !defined(_WIN32) //FIXME CPPUNIT_TEST_FIXTURE(ScUiCalcTest, testTdf140151) { createScDoc("tdf140151.ods"); ScDocShell* pDocSh = getScDocShell(); // Focus is already on the button ScModelObj* pModelObj = comphelper::getFromUnoTunnel<ScModelObj>(mxComponent); pModelObj->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, awt::Key::RETURN); pModelObj->postKeyEvent(LOK_KEYEVENT_KEYUP, 0, awt::Key::RETURN); Scheduler::ProcessEventsToIdle(); // Without the fix in place, the current cursor position wouldn't have changed lcl_AssertCurrentCursorPosition(*pDocSh, u"B111"); } #endif CPPUNIT_TEST_FIXTURE(ScUiCalcTest, testTdf68290) { createScDoc("tdf68290.ods"); ScDocShell* pDocSh = getScDocShell(); const std::vector<OUString> aExpectedAddresses{ u"L3"_ustr, u"L6"_ustr, u"L9"_ustr, u"L10"_ustr, u"L11"_ustr, u"L13"_ustr, u"L15"_ustr }; ScModelObj* pModelObj = comphelper::getFromUnoTunnel<ScModelObj>(mxComponent); for (const auto& rAddress : aExpectedAddresses) { lcl_AssertCurrentCursorPosition(*pDocSh, rAddress); pModelObj->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, awt::Key::RETURN); Scheduler::ProcessEventsToIdle(); } lcl_AssertCurrentCursorPosition(*pDocSh, u"M3"); } CPPUNIT_TEST_FIXTURE(ScUiCalcTest, testTdf156462) { createScDoc("tdf156462.ods"); ScDocShell* pDocSh = getScDocShell(); lcl_AssertCurrentCursorPosition(*pDocSh, u"G2"); ScModelObj* pModelObj = comphelper::getFromUnoTunnel<ScModelObj>(mxComponent); pModelObj->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, KEY_MOD1 | KEY_LEFT); Scheduler::ProcessEventsToIdle(); // Without the fix in place, the cursor would have jumped to cell C2 lcl_AssertCurrentCursorPosition(*pDocSh, u"D2"); } CPPUNIT_TEST_FIXTURE(ScUiCalcTest, testTdf132057) { createScDoc("tdf132057.ods"); ScDocShell* pDocSh = getScDocShell(); lcl_AssertCurrentCursorPosition(*pDocSh, u"AU43"); ScModelObj* pModelObj = comphelper::getFromUnoTunnel<ScModelObj>(mxComponent); pModelObj->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, KEY_RETURN); Scheduler::ProcessEventsToIdle(); // Without the fix in place, the cursor would have jumped to cell BM1 lcl_AssertCurrentCursorPosition(*pDocSh, u"G39"); } CPPUNIT_TEST_FIXTURE(ScUiCalcTest, testTdf122232) { createScDoc("tdf122232.ods"); ScDocShell* pDocSh = getScDocShell(); //Start with from C6. Press tabulator to reach G6. lcl_AssertCurrentCursorPosition(*pDocSh, u"C6"); ScModelObj* pModelObj = comphelper::getFromUnoTunnel<ScModelObj>(mxComponent); pModelObj->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, KEY_TAB); pModelObj->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, KEY_TAB); Scheduler::ProcessEventsToIdle(); lcl_AssertCurrentCursorPosition(*pDocSh, u"G6"); //without the fix, cursor would jump to C29 instead of C7. pModelObj->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, awt::Key::RETURN); Scheduler::ProcessEventsToIdle(); lcl_AssertCurrentCursorPosition(*pDocSh, u"C7"); } CPPUNIT_TEST_FIXTURE(ScUiCalcTest, testTdf123052) { createScDoc("tdf123052.ods"); ScDocShell* pDocSh = getScDocShell(); std::vector<OUString> aExpectedAddresses{ u"F3"_ustr, u"D5"_ustr, u"E5"_ustr, u"F6"_ustr, u"A8"_ustr, u"E9"_ustr }; ScModelObj* pModelObj = comphelper::getFromUnoTunnel<ScModelObj>(mxComponent); for (const auto& rAddress : aExpectedAddresses) { pModelObj->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, awt::Key::TAB); pModelObj->postKeyEvent(LOK_KEYEVENT_KEYUP, 0, awt::Key::TAB); Scheduler::ProcessEventsToIdle(); lcl_AssertCurrentCursorPosition(*pDocSh, rAddress); } aExpectedAddresses.pop_back(); for (std::vector<OUString>::reverse_iterator it = aExpectedAddresses.rbegin(); it != aExpectedAddresses.rend(); ++it) { pModelObj->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, KEY_SHIFT | awt::Key::TAB); pModelObj->postKeyEvent(LOK_KEYEVENT_KEYUP, 0, KEY_SHIFT | awt::Key::TAB); Scheduler::ProcessEventsToIdle(); // Without the fix in place, this test would have failed here lcl_AssertCurrentCursorPosition(*pDocSh, *it); } } CPPUNIT_TEST_FIXTURE(ScUiCalcTest, testTdf120660) { createScDoc("tdf120660.ods"); ScDocument* pDoc = getScDoc(); // Disable replace cell warning ScModule* pMod = ScModule::get(); ScInputOptions aInputOption = pMod->GetInputOptions(); bool bOldStatus = aInputOption.GetReplaceCellsWarn(); aInputOption.SetReplaceCellsWarn(false); pMod->SetInputOptions(aInputOption); goToCell(u"A8:E8"_ustr); dispatchCommand(mxComponent, u".uno:Copy"_ustr, {}); goToCell(u"A4:E4"_ustr); dispatchCommand(mxComponent, u".uno:Paste"_ustr, {}); CPPUNIT_ASSERT_EQUAL(1200.0, pDoc->GetValue(ScAddress(4, 3, 0))); CPPUNIT_ASSERT_EQUAL(-100.0, pDoc->GetValue(ScAddress(4, 7, 0))); dispatchCommand(mxComponent, u".uno:Undo"_ustr, {}); CPPUNIT_ASSERT_EQUAL(2200.0, pDoc->GetValue(ScAddress(4, 3, 0))); CPPUNIT_ASSERT_EQUAL(900.0, pDoc->GetValue(ScAddress(4, 7, 0))); goToCell(u"A8:D8"_ustr); dispatchCommand(mxComponent, u".uno:Copy"_ustr, {}); goToCell(u"A4:D4"_ustr); dispatchCommand(mxComponent, u".uno:Paste"_ustr, {}); CPPUNIT_ASSERT_EQUAL(1200.0, pDoc->GetValue(ScAddress(4, 3, 0))); // Without the fix in place, this test would have failed with // - Expected: -100 // - Actual : 900 CPPUNIT_ASSERT_EQUAL(-100.0, pDoc->GetValue(ScAddress(4, 7, 0))); dispatchCommand(mxComponent, u".uno:Undo"_ustr, {}); CPPUNIT_ASSERT_EQUAL(2200.0, pDoc->GetValue(ScAddress(4, 3, 0))); CPPUNIT_ASSERT_EQUAL(900.0, pDoc->GetValue(ScAddress(4, 7, 0))); // Restore previous status aInputOption.SetReplaceCellsWarn(bOldStatus); pMod->SetInputOptions(aInputOption); } CPPUNIT_TEST_FIXTURE(ScUiCalcTest, testTdf146994) { createScDoc(); ScDocShell* pDocSh = getScDocShell(); goToCell(u"B3"_ustr); lcl_AssertCurrentCursorPosition(*pDocSh, u"B3"); dispatchCommand(mxComponent, u".uno:Copy"_ustr, {}); ScModelObj* pModelObj = comphelper::getFromUnoTunnel<ScModelObj>(mxComponent); pModelObj->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, KEY_RIGHT); pModelObj->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, KEY_RIGHT); Scheduler::ProcessEventsToIdle(); lcl_AssertCurrentCursorPosition(*pDocSh, u"D3"); dispatchCommand(mxComponent, u".uno:Paste"_ustr, {}); pModelObj->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, KEY_SHIFT | KEY_DOWN); Scheduler::ProcessEventsToIdle(); ScRangeList aMarkedArea = getViewShell()->GetViewData().GetMarkData().GetMarkedRanges(); OUString aMarkedAreaString; ScDocument* pDoc = getScDoc(); ScRangeStringConverter::GetStringFromRangeList(aMarkedAreaString, &aMarkedArea, pDoc, formula::FormulaGrammar::CONV_OOO); // Without the fix in place, this test would have failed with // - Expected: Sheet1.D3:Sheet1.D4 // - Actual : Sheet1.A2:Sheet1.D3 CPPUNIT_ASSERT_EQUAL(u"Sheet1.D3:Sheet1.D4"_ustr, aMarkedAreaString); } CPPUNIT_TEST_FIXTURE(ScUiCalcTest, testTdf157897_duplicated_print_ranges) { createScDoc("tdf157897_main.ods"); ScDocument* pDoc = getScDoc(); const sal_uInt16 nPos = 0; const SCTAB nFirstTab = 0; // Ensure that there exists a print range in the first documents tab CPPUNIT_ASSERT_EQUAL(static_cast<sal_uInt16>(1), pDoc->GetPrintRangeCount(nFirstTab)); // Reload all links and check if the print range was not duplicated const auto initialPrintRange = pDoc->GetPrintRange(nFirstTab, nPos); pDoc->GetDocumentShell()->ReloadAllLinks(); // Without the fix in place, the print range in the linked tab will be duplicated CPPUNIT_ASSERT_EQUAL(initialPrintRange, pDoc->GetPrintRange(nFirstTab, nPos)); } CPPUNIT_TEST_FIXTURE(ScUiCalcTest, testTdf154991) { createScDoc("tdf154991.ods"); ScDocument* pDoc = getScDoc(); goToCell(u"A1"_ustr); dispatchCommand(mxComponent, u".uno:SelectColumn"_ustr, {}); // Without the fix in place, this test would have crashed here dispatchCommand(mxComponent, u".uno:HideColumn"_ustr, {}); CPPUNIT_ASSERT(pDoc->ColHidden(0, 0)); dispatchCommand(mxComponent, u".uno:Undo"_ustr, {}); CPPUNIT_ASSERT(!pDoc->ColHidden(0, 0)); } CPPUNIT_TEST_FIXTURE(ScUiCalcTest, testTdf151752) { createScDoc(); ScDocument* pDoc = getScDoc(); insertStringToCell(u"A1"_ustr, u"1"); goToCell(u"A1"_ustr); dispatchCommand(mxComponent, u".uno:SelectUnprotectedCells"_ustr, {}); dispatchCommand(mxComponent, u".uno:Copy"_ustr, {}); goToCell(u"B1"_ustr); // Without the fix in place, this test would have crashed here dispatchCommand(mxComponent, u".uno:Paste"_ustr, {}); CPPUNIT_ASSERT_EQUAL(1.0, pDoc->GetValue(0, 0, 0)); CPPUNIT_ASSERT_EQUAL(0.0, pDoc->GetValue(1, 0, 0)); } CPPUNIT_TEST_FIXTURE(ScUiCalcTest, testTdf95306) { createScDoc(); ScDocument* pDoc = getScDoc(); // Use Adding Selection dispatchCommand(mxComponent, u".uno:StatusSelectionModeExp"_ustr, {}); goToCell(u"B1"_ustr); dispatchCommand(mxComponent, u".uno:SelectColumn"_ustr, {}); dispatchCommand(mxComponent, u".uno:GoRight"_ustr, {}); dispatchCommand(mxComponent, u".uno:GoRight"_ustr, {}); dispatchCommand(mxComponent, u".uno:SelectColumn"_ustr, {}); dispatchCommand(mxComponent, u".uno:HideColumn"_ustr, {}); CPPUNIT_ASSERT(!pDoc->ColHidden(0, 0)); CPPUNIT_ASSERT(pDoc->ColHidden(1, 0)); CPPUNIT_ASSERT(!pDoc->ColHidden(2, 0)); CPPUNIT_ASSERT(pDoc->ColHidden(3, 0)); CPPUNIT_ASSERT(!pDoc->ColHidden(4, 0)); dispatchCommand(mxComponent, u".uno:Undo"_ustr, {}); CPPUNIT_ASSERT(!pDoc->ColHidden(0, 0)); CPPUNIT_ASSERT(!pDoc->ColHidden(1, 0)); CPPUNIT_ASSERT(!pDoc->ColHidden(2, 0)); CPPUNIT_ASSERT(!pDoc->ColHidden(3, 0)); CPPUNIT_ASSERT(!pDoc->ColHidden(4, 0)); } CPPUNIT_TEST_FIXTURE(ScUiCalcTest, testTdf102525) { createScDoc(); ScDocument* pDoc = getScDoc(); insertStringToCell(u"A1"_ustr, u"1"); insertStringToCell(u"A2"_ustr, u"2"); insertStringToCell(u"A3"_ustr, u"3"); insertStringToCell(u"A4"_ustr, u"4"); insertArrayToCell(u"B1"_ustr, u"=IF(A1:A4>2,1,2)"); goToCell(u"B1:B4"_ustr); ScModelObj* pModelObj = comphelper::getFromUnoTunnel<ScModelObj>(mxComponent); pModelObj->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, KEY_F4); Scheduler::ProcessEventsToIdle(); CPPUNIT_ASSERT_EQUAL(2.0, pDoc->GetValue(1, 0, 0)); CPPUNIT_ASSERT_EQUAL(2.0, pDoc->GetValue(1, 1, 0)); CPPUNIT_ASSERT_EQUAL(1.0, pDoc->GetValue(1, 2, 0)); CPPUNIT_ASSERT_EQUAL(1.0, pDoc->GetValue(1, 3, 0)); CPPUNIT_ASSERT_EQUAL(u"{=IF($A$1:$A$4>2,1,2)}"_ustr, pDoc->GetFormula(1, 0, 0)); dispatchCommand(mxComponent, u".uno:Undo"_ustr, {}); CPPUNIT_ASSERT_EQUAL(2.0, pDoc->GetValue(1, 0, 0)); CPPUNIT_ASSERT_EQUAL(2.0, pDoc->GetValue(1, 1, 0)); CPPUNIT_ASSERT_EQUAL(1.0, pDoc->GetValue(1, 2, 0)); CPPUNIT_ASSERT_EQUAL(1.0, pDoc->GetValue(1, 3, 0)); CPPUNIT_ASSERT_EQUAL(u"{=IF(A1:A4>2,1,2)}"_ustr, pDoc->GetFormula(1, 0, 0)); } CPPUNIT_TEST_FIXTURE(ScUiCalcTest, testTdf39650) { createScDoc(); ScDocument* pDoc = getScDoc(); FormulaGrammarSwitch aFGSwitch(pDoc, formula::FormulaGrammar::GRAM_ENGLISH_XL_R1C1); insertStringToCell(u"R3C3"_ustr, u"xxx"); insertStringToCell(u"R2C2"_ustr, u"=R[1]C[1]"); CPPUNIT_ASSERT_EQUAL(u"=R[1]C[1]"_ustr, pDoc->GetFormula(1, 1, 0)); CPPUNIT_ASSERT_EQUAL(u"xxx"_ustr, pDoc->GetString(1, 1, 0)); goToCell(u"B2"_ustr); ScModelObj* pModelObj = comphelper::getFromUnoTunnel<ScModelObj>(mxComponent); pModelObj->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, KEY_F4); Scheduler::ProcessEventsToIdle(); CPPUNIT_ASSERT_EQUAL(u"=R3C3"_ustr, pDoc->GetFormula(1, 1, 0)); CPPUNIT_ASSERT_EQUAL(u"xxx"_ustr, pDoc->GetString(1, 1, 0)); } CPPUNIT_TEST_FIXTURE(ScUiCalcTest, testTdf45020) { createScDoc(); ScDocument* pDoc = getScDoc(); goToCell(u"A2:A3"_ustr); dispatchCommand(mxComponent, u".uno:HideRow"_ustr, {}); goToCell(u"A1"_ustr); ScModelObj* pModelObj = comphelper::getFromUnoTunnel<ScModelObj>(mxComponent); pModelObj->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, KEY_SHIFT | KEY_DOWN); Scheduler::ProcessEventsToIdle(); ScRangeList aMarkedArea = getViewShell()->GetViewData().GetMarkData().GetMarkedRanges(); OUString aMarkedAreaString; ScRangeStringConverter::GetStringFromRangeList(aMarkedAreaString, &aMarkedArea, pDoc, formula::FormulaGrammar::CONV_OOO); // Without the fix in place, this test would have failed with // - Expected: Sheet1.A1:Sheet1.A4 // - Actual : Sheet1.A1:Sheet1.A2 CPPUNIT_ASSERT_EQUAL(u"Sheet1.A1:Sheet1.A4"_ustr, aMarkedAreaString); } CPPUNIT_TEST_FIXTURE(ScUiCalcTest, testTdf117706) { createScDoc(); ScDocShell* pDocSh = getScDocShell(); insertStringToCell(u"A1"_ustr, u"A1"); insertStringToCell(u"A3"_ustr, u"A3"); // Use Adding Selection dispatchCommand(mxComponent, u".uno:StatusSelectionModeExp"_ustr, {}); goToCell(u"A1"_ustr); dispatchCommand(mxComponent, u".uno:SelectRow"_ustr, {}); dispatchCommand(mxComponent, u".uno:GoDown"_ustr, {}); dispatchCommand(mxComponent, u".uno:GoDown"_ustr, {}); lcl_AssertCurrentCursorPosition(*pDocSh, u"A3"); dispatchCommand(mxComponent, u".uno:SelectRow"_ustr, {}); dispatchCommand(mxComponent, u".uno:Copy"_ustr, {}); // Open a new document createScDoc(); ScDocument* pDoc = getScDoc(); dispatchCommand(mxComponent, u".uno:Paste"_ustr, {}); // Without the fix in place, this test would have failed with // - Expected: A1 // - Actual : A3 CPPUNIT_ASSERT_EQUAL(u"A1"_ustr, pDoc->GetString(ScAddress(0, 0, 0))); CPPUNIT_ASSERT_EQUAL(u"A3"_ustr, pDoc->GetString(ScAddress(0, 1, 0))); CPPUNIT_ASSERT_EQUAL(u""_ustr, pDoc->GetString(ScAddress(0, 2, 0))); } CPPUNIT_TEST_FIXTURE(ScUiCalcTest, testTdf159373) { createScDoc("tdf159373.ods"); ScDocument* pDoc = getScDoc(); CPPUNIT_ASSERT_EQUAL(static_cast<SCTAB>(2), pDoc->GetTableCount()); uno::Sequence<beans::PropertyValue> aArgs( comphelper::InitPropertySequence({ { "Index", uno::Any(sal_uInt16(0)) } })); // Without the fix in place, this test would have crashed here dispatchCommand(mxComponent, u".uno:Remove"_ustr, aArgs); CPPUNIT_ASSERT_EQUAL(static_cast<SCTAB>(1), pDoc->GetTableCount()); dispatchCommand(mxComponent, u".uno:Undo"_ustr, aArgs); CPPUNIT_ASSERT_EQUAL(static_cast<SCTAB>(2), pDoc->GetTableCount()); } CPPUNIT_TEST_FIXTURE(ScUiCalcTest, testTdf86166) { createScDoc("tdf86166.ods"); ScDocument* pDoc = getScDoc(); CPPUNIT_ASSERT_EQUAL(static_cast<SCTAB>(2), pDoc->GetTableCount()); uno::Sequence<beans::PropertyValue> aArgs( comphelper::InitPropertySequence({ { "Index", uno::Any(sal_uInt16(0)) } })); // Without the fix in place, this test would have crashed here dispatchCommand(mxComponent, u".uno:Remove"_ustr, aArgs); CPPUNIT_ASSERT_EQUAL(static_cast<SCTAB>(1), pDoc->GetTableCount()); } CPPUNIT_TEST_FIXTURE(ScUiCalcTest, testTdf158802) { createScDoc("tdf158802.xlsx"); ScDocument* pDoc = getScDoc(); CPPUNIT_ASSERT_EQUAL(static_cast<SCTAB>(2), pDoc->GetTableCount()); uno::Sequence<beans::PropertyValue> aArgs( comphelper::InitPropertySequence({ { "Index", uno::Any(sal_uInt16(0)) } })); dispatchCommand(mxComponent, u".uno:Remove"_ustr, aArgs); CPPUNIT_ASSERT_EQUAL(static_cast<SCTAB>(1), pDoc->GetTableCount()); // Without the fix in place, this test would have crashed here dispatchCommand(mxComponent, u".uno:Undo"_ustr, aArgs); CPPUNIT_ASSERT_EQUAL(static_cast<SCTAB>(2), pDoc->GetTableCount()); } CPPUNIT_TEST_FIXTURE(ScUiCalcTest, testTdf149502_HangOnDeletingSheet1) { createScDoc("tdf149502_HangOnDeletingSheet1.ods"); ScDocument* pDoc = getScDoc(); CPPUNIT_ASSERT_EQUAL(static_cast<SCTAB>(4), pDoc->GetTableCount()); uno::Sequence<beans::PropertyValue> aArgs( comphelper::InitPropertySequence({ { "Index", uno::Any(sal_uInt16(0)) } })); // Before the fix in place, this test frozen here dispatchCommand(mxComponent, u".uno:Remove"_ustr, aArgs); CPPUNIT_ASSERT_EQUAL(static_cast<SCTAB>(3), pDoc->GetTableCount()); } CPPUNIT_TEST_FIXTURE(ScUiCalcTest, testTdf149503) { createScDoc("tdf149503.xls"); ScDocument* pDoc = getScDoc(); dispatchCommand(mxComponent, u".uno:SelectAll"_ustr, {}); dispatchCommand(mxComponent, u".uno:Cut"_ustr, {}); // Without the fix in place, this test would have crashed here dispatchCommand(mxComponent, u".uno:Paste"_ustr, {}); ScDPCollection* pDPs = pDoc->GetDPCollection(); CPPUNIT_ASSERT_EQUAL(size_t(1), pDPs->GetCount()); } CPPUNIT_TEST_FIXTURE(ScUiCalcTest, testTdf108292) { createScDoc("tdf108292.ods"); ScDocument* pDoc = getScDoc(); dispatchCommand(mxComponent, u".uno:SelectAll"_ustr, {}); dispatchCommand(mxComponent, u".uno:Copy"_ustr, {}); // Open a new document createScDoc(); pDoc = getScDoc(); // Without the fix in place, this test would have crashed dispatchCommand(mxComponent, u".uno:Paste"_ustr, {}); CPPUNIT_ASSERT_EQUAL(u"2D"_ustr, pDoc->GetString(ScAddress(26, 0, 0))); } // Inspired from testTdf117706, test columns instead of rows CPPUNIT_TEST_FIXTURE(ScUiCalcTest, testMultiRangeCol) { createScDoc(); ScDocShell* pDocSh = getScDocShell(); insertStringToCell(u"A1"_ustr, u"A1"); insertStringToCell(u"C1"_ustr, u"C1"); // Use Adding Selection dispatchCommand(mxComponent, u".uno:StatusSelectionModeExp"_ustr, {}); goToCell(u"A1"_ustr); dispatchCommand(mxComponent, u".uno:SelectColumn"_ustr, {}); dispatchCommand(mxComponent, u".uno:GoRight"_ustr, {}); dispatchCommand(mxComponent, u".uno:GoRight"_ustr, {}); lcl_AssertCurrentCursorPosition(*pDocSh, u"C1"); dispatchCommand(mxComponent, u".uno:SelectColumn"_ustr, {}); dispatchCommand(mxComponent, u".uno:Copy"_ustr, {}); // Open a new document createScDoc(); ScDocument* pDoc = getScDoc(); dispatchCommand(mxComponent, u".uno:Paste"_ustr, {}); CPPUNIT_ASSERT_EQUAL(u"A1"_ustr, pDoc->GetString(ScAddress(0, 0, 0))); CPPUNIT_ASSERT_EQUAL(u"C1"_ustr, pDoc->GetString(ScAddress(1, 0, 0))); CPPUNIT_ASSERT_EQUAL(u""_ustr, pDoc->GetString(ScAddress(2, 0, 0))); } // Test the call of .uno:PasteTransposed (tdf#102255) // Note: the transpose functionality is tested in ucalc CPPUNIT_TEST_FIXTURE(ScUiCalcTest, testPasteTransposed) { createScDoc(); ScDocument* pDoc = getScDoc(); insertStringToCell(u"A1"_ustr, u"1"); insertStringToCell(u"A2"_ustr, u"a"); insertStringToCell(u"A3"_ustr, u"=A1"); // Add a note to A1 goToCell(u"A1"_ustr); uno::Sequence<beans::PropertyValue> aArgs = comphelper::InitPropertySequence({ { "Text", uno::Any(u"Note in A1"_ustr) } }); dispatchCommand(mxComponent, u".uno:InsertAnnotation"_ustr, aArgs); // Set A2 bold goToCell(u"A2"_ustr); dispatchCommand(mxComponent, u".uno:Bold"_ustr, {}); // Check preconditions CPPUNIT_ASSERT_MESSAGE("There should be a note on A1", pDoc->HasNote(ScAddress(0, 0, 0))); const ScPatternAttr* pPattern = pDoc->GetPattern(0, 1, 0); vcl::Font aFont; pPattern->fillFontOnly(aFont); CPPUNIT_ASSERT_EQUAL_MESSAGE("font should be bold", WEIGHT_BOLD, aFont.GetWeightMaybeAskConfig()); goToCell(u"A1:A3"_ustr); dispatchCommand(mxComponent, u".uno:Copy"_ustr, {}); // Open a new document createScDoc(); pDoc = getScDoc(); dispatchCommand(mxComponent, u".uno:PasteTransposed"_ustr, {}); OUString aFormula; CPPUNIT_ASSERT_EQUAL(u"1"_ustr, pDoc->GetString(0, 0, 0)); // A1 CPPUNIT_ASSERT_EQUAL(1.0, pDoc->GetValue(0, 0, 0)); // A1 CPPUNIT_ASSERT_EQUAL(u"a"_ustr, pDoc->GetString(1, 0, 0)); // B1 aFormula = pDoc->GetFormula(2, 0, 0); // C1 CPPUNIT_ASSERT_EQUAL(u"=A1"_ustr, aFormula); // C1 CPPUNIT_ASSERT_EQUAL(u"1"_ustr, pDoc->GetString(2, 0, 0)); // C1 CPPUNIT_ASSERT_EQUAL(1.0, pDoc->GetValue(2, 0, 0)); // C1 CPPUNIT_ASSERT_MESSAGE("There should be a note on A1", pDoc->HasNote(ScAddress(0, 0, 0))); CPPUNIT_ASSERT_EQUAL(u"Note in A1"_ustr, pDoc->GetNote(ScAddress(0, 0, 0))->GetText()); pPattern = pDoc->GetPattern(1, 0, 0); pPattern->fillFontOnly(aFont); CPPUNIT_ASSERT_EQUAL_MESSAGE("font should be bold", WEIGHT_BOLD, aFont.GetWeightMaybeAskConfig()); } // Test the call of .uno:PasteAsLink (tdf#90101) // Note: the paste as link functionality is tested in ucalc CPPUNIT_TEST_FIXTURE(ScUiCalcTest, testPasteAsLink) { createScDoc(); ScDocument* pDoc = getScDoc(); insertStringToCell(u"A1"_ustr, u"1"); insertStringToCell(u"A2"_ustr, u"a"); insertStringToCell(u"A3"_ustr, u"=A1"); // Add a note to A1 goToCell(u"A1"_ustr); uno::Sequence<beans::PropertyValue> aArgs = comphelper::InitPropertySequence({ { "Text", uno::Any(u"Note in A1"_ustr) } }); dispatchCommand(mxComponent, u".uno:InsertAnnotation"_ustr, aArgs); // Set A2 bold goToCell(u"A2"_ustr); dispatchCommand(mxComponent, u".uno:Bold"_ustr, {}); // Check preconditions CPPUNIT_ASSERT_MESSAGE("There should be a note on A1", pDoc->HasNote(ScAddress(0, 0, 0))); const ScPatternAttr* pPattern = pDoc->GetPattern(0, 1, 0); vcl::Font aFont; pPattern->fillFontOnly(aFont); CPPUNIT_ASSERT_EQUAL_MESSAGE("font should be bold", WEIGHT_BOLD, aFont.GetWeightMaybeAskConfig()); goToCell(u"A1:A3"_ustr); dispatchCommand(mxComponent, u".uno:Copy"_ustr, {}); goToCell(u"C1"_ustr); dispatchCommand(mxComponent, u".uno:PasteAsLink"_ustr, {}); OUString aFormula = pDoc->GetFormula(2, 0, 0); CPPUNIT_ASSERT_EQUAL(u"=$Sheet1.$A$1"_ustr, aFormula); // C1 aFormula = pDoc->GetFormula(2, 1, 0); CPPUNIT_ASSERT_EQUAL(u"=$Sheet1.$A$2"_ustr, aFormula); // C2 aFormula = pDoc->GetFormula(2, 2, 0); CPPUNIT_ASSERT_EQUAL(u"=$Sheet1.$A$3"_ustr, aFormula); // C3 CPPUNIT_ASSERT_EQUAL(1.0, pDoc->GetValue(2, 0, 0)); // C1 CPPUNIT_ASSERT_EQUAL(1.0, pDoc->GetValue(2, 2, 0)); // C3 CPPUNIT_ASSERT_MESSAGE("There should be no note on C1", !pDoc->HasNote(ScAddress(2, 0, 0))); pPattern = pDoc->GetPattern(2, 1, 0); pPattern->fillFontOnly(aFont); CPPUNIT_ASSERT_EQUAL_MESSAGE("font should be normal (cell attributes should not be copied)", WEIGHT_NORMAL, aFont.GetWeightMaybeAskConfig()); } CPPUNIT_TEST_FIXTURE(ScUiCalcTest, testTdf119659) { createScDoc(); ScDocument* pDoc = getScDoc(); insertArrayToCell(u"A1:C1"_ustr, u"={1,2,3}"); insertStringToCell(u"A2"_ustr, u"=LOOKUP(3; A1:C1; {1,2})"); // Without the fix in place, this test would have crashed here CPPUNIT_ASSERT_EQUAL(u"#N/A"_ustr, pDoc->GetString(ScAddress(0, 1, 0))); } CPPUNIT_TEST_FIXTURE(ScUiCalcTest, testTdf131442) { createScDoc(); ScDocument* pDoc = getScDoc(); insertArrayToCell(u"A1:A5"_ustr, u"={6;4;2;5;3}"); CPPUNIT_ASSERT_EQUAL(u"6"_ustr, pDoc->GetString(ScAddress(0, 0, 0))); CPPUNIT_ASSERT_EQUAL(u"4"_ustr, pDoc->GetString(ScAddress(0, 1, 0))); CPPUNIT_ASSERT_EQUAL(u"2"_ustr, pDoc->GetString(ScAddress(0, 2, 0))); CPPUNIT_ASSERT_EQUAL(u"5"_ustr, pDoc->GetString(ScAddress(0, 3, 0))); CPPUNIT_ASSERT_EQUAL(u"3"_ustr, pDoc->GetString(ScAddress(0, 4, 0))); dispatchCommand(mxComponent, u".uno:SortAscending"_ustr, {}); // Without the fix in place, this test would have failed with // - Expected: 6 // - Actual : #REF! CPPUNIT_ASSERT_EQUAL(u"6"_ustr, pDoc->GetString(ScAddress(0, 0, 0))); CPPUNIT_ASSERT_EQUAL(u"4"_ustr, pDoc->GetString(ScAddress(0, 1, 0))); CPPUNIT_ASSERT_EQUAL(u"2"_ustr, pDoc->GetString(ScAddress(0, 2, 0))); CPPUNIT_ASSERT_EQUAL(u"5"_ustr, pDoc->GetString(ScAddress(0, 3, 0))); CPPUNIT_ASSERT_EQUAL(u"3"_ustr, pDoc->GetString(ScAddress(0, 4, 0))); dispatchCommand(mxComponent, u".uno:SortDescending"_ustr, {}); CPPUNIT_ASSERT_EQUAL(u"6"_ustr, pDoc->GetString(ScAddress(0, 0, 0))); CPPUNIT_ASSERT_EQUAL(u"4"_ustr, pDoc->GetString(ScAddress(0, 1, 0))); CPPUNIT_ASSERT_EQUAL(u"2"_ustr, pDoc->GetString(ScAddress(0, 2, 0))); CPPUNIT_ASSERT_EQUAL(u"5"_ustr, pDoc->GetString(ScAddress(0, 3, 0))); CPPUNIT_ASSERT_EQUAL(u"3"_ustr, pDoc->GetString(ScAddress(0, 4, 0))); } CPPUNIT_TEST_FIXTURE(ScUiCalcTest, testTdf117458) { createScDoc(); ScDocShell* pDocSh = getScDocShell(); ScModule* pMod = ScModule::get(); ScInputOptions aInputOption = pMod->GetInputOptions(); sal_uInt16 bOldStatus = aInputOption.GetMoveDir(); lcl_AssertCurrentCursorPosition(*pDocSh, u"A1"); aInputOption.SetMoveDir(DIR_BOTTOM); pMod->SetInputOptions(aInputOption); ScModelObj* pModelObj = comphelper::getFromUnoTunnel<ScModelObj>(mxComponent); pModelObj->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, awt::Key::RETURN); Scheduler::ProcessEventsToIdle(); lcl_AssertCurrentCursorPosition(*pDocSh, u"A2"); aInputOption.SetMoveDir(DIR_TOP); pMod->SetInputOptions(aInputOption); pModelObj->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, awt::Key::RETURN); Scheduler::ProcessEventsToIdle(); lcl_AssertCurrentCursorPosition(*pDocSh, u"A1"); aInputOption.SetMoveDir(DIR_RIGHT); pMod->SetInputOptions(aInputOption); pModelObj->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, awt::Key::RETURN); Scheduler::ProcessEventsToIdle(); lcl_AssertCurrentCursorPosition(*pDocSh, u"B1"); aInputOption.SetMoveDir(DIR_LEFT); pMod->SetInputOptions(aInputOption); pModelObj->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, awt::Key::RETURN); Scheduler::ProcessEventsToIdle(); lcl_AssertCurrentCursorPosition(*pDocSh, u"A1"); // Restore previous status aInputOption.SetMoveDir(bOldStatus); pMod->SetInputOptions(aInputOption); } CPPUNIT_TEST_FIXTURE(ScUiCalcTest, testTdf90694) { createScDoc("tdf90694.ods"); ScDocument* pDoc = getScDoc(); // Select row 30 to 60 goToCell(u"30:60"_ustr); // Without the fix in place, this test would have crashed here dispatchCommand(mxComponent, u".uno:DeleteRows"_ustr, {}); CPPUNIT_ASSERT_EQUAL(u""_ustr, pDoc->GetString(ScAddress(0, 29, 0))); CPPUNIT_ASSERT_EQUAL(u""_ustr, pDoc->GetString(ScAddress(0, 59, 0))); dispatchCommand(mxComponent, u".uno:Undo"_ustr, {}); CPPUNIT_ASSERT_EQUAL(u"#REF!"_ustr, pDoc->GetString(ScAddress(0, 29, 0))); CPPUNIT_ASSERT_EQUAL(u"#REF!"_ustr, pDoc->GetString(ScAddress(0, 59, 0))); } CPPUNIT_TEST_FIXTURE(ScUiCalcTest, testTdf138710) { createScDoc("tdf138710.ods"); ScDocument* pDoc = getScDoc(); dispatchCommand(mxComponent, u".uno:SelectAll"_ustr, {}); // Without the fix in place, this test would have crashed here dispatchCommand(mxComponent, u".uno:DeleteRows"_ustr, {}); CPPUNIT_ASSERT_EQUAL(u""_ustr, pDoc->GetString(ScAddress(0, 0, 1))); dispatchCommand(mxComponent, u".uno:Undo"_ustr, {}); CPPUNIT_ASSERT_EQUAL(u"Total"_ustr, pDoc->GetString(ScAddress(0, 0, 1))); dispatchCommand(mxComponent, u".uno:DeleteRows"_ustr, {}); CPPUNIT_ASSERT_EQUAL(u""_ustr, pDoc->GetString(ScAddress(0, 0, 1))); dispatchCommand(mxComponent, u".uno:Undo"_ustr, {}); CPPUNIT_ASSERT_EQUAL(u"Total"_ustr, pDoc->GetString(ScAddress(0, 0, 1))); } CPPUNIT_TEST_FIXTURE(ScUiCalcTest, testTdf128914) { createScDoc("tdf128914.ods"); ScDocument* pDoc = getScDoc(); CPPUNIT_ASSERT_EQUAL(6.0, pDoc->GetValue(ScAddress(3, 1, 0))); goToCell(u"D2"_ustr); dispatchCommand(mxComponent, u".uno:Copy"_ustr, {}); goToCell(u"D3:D6"_ustr); dispatchCommand(mxComponent, u".uno:Paste"_ustr, {}); // Without the fix in place, this test would have failed with // - Expected: 24 // - Actual : 6 CPPUNIT_ASSERT_EQUAL(24.0, pDoc->GetValue(ScAddress(3, 2, 0))); CPPUNIT_ASSERT_EQUAL(60.0, pDoc->GetValue(ScAddress(3, 3, 0))); CPPUNIT_ASSERT_EQUAL(120.0, pDoc->GetValue(ScAddress(3, 4, 0))); CPPUNIT_ASSERT_EQUAL(210.0, pDoc->GetValue(ScAddress(3, 5, 0))); CPPUNIT_ASSERT_EQUAL(6.0, pDoc->GetValue(ScAddress(1, 14, 0))); goToCell(u"B15"_ustr); dispatchCommand(mxComponent, u".uno:Copy"_ustr, {}); goToCell(u"C15:F15"_ustr); dispatchCommand(mxComponent, u".uno:Paste"_ustr, {}); CPPUNIT_ASSERT_EQUAL(24.0, pDoc->GetValue(ScAddress(2, 14, 0))); CPPUNIT_ASSERT_EQUAL(60.0, pDoc->GetValue(ScAddress(3, 14, 0))); CPPUNIT_ASSERT_EQUAL(120.0, pDoc->GetValue(ScAddress(4, 14, 0))); CPPUNIT_ASSERT_EQUAL(210.0, pDoc->GetValue(ScAddress(5, 14, 0))); } CPPUNIT_TEST_FIXTURE(ScUiCalcTest, testTdf108654) { createScDoc("tdf108654.ods"); ScDocument* pDoc = getScDoc(); dispatchCommand(mxComponent, u".uno:SelectAll"_ustr, {}); // first .uno:SelectAll selects the range, second all (tdf#161641) dispatchCommand(mxComponent, u".uno:SelectAll"_ustr, {}); dispatchCommand(mxComponent, u".uno:Copy"_ustr, {}); insertNewSheet(*pDoc); dispatchCommand(mxComponent, u".uno:Paste"_ustr, {}); OUString aFormula = pDoc->GetFormula(3, 126, 1); CPPUNIT_ASSERT_EQUAL(u"=VLOOKUP(C127,#REF!,D$1,0)"_ustr, aFormula); dispatchCommand(mxComponent, u".uno:Undo"_ustr, {}); aFormula = pDoc->GetFormula(3, 126, 1); CPPUNIT_ASSERT_EQUAL(u""_ustr, aFormula); CPPUNIT_ASSERT_EQUAL(static_cast<SCTAB>(2), pDoc->GetTableCount()); dispatchCommand(mxComponent, u".uno:Undo"_ustr, {}); CPPUNIT_ASSERT_EQUAL(static_cast<SCTAB>(1), pDoc->GetTableCount()); } CPPUNIT_TEST_FIXTURE(ScUiCalcTest, testTdf150219) { createScDoc(); ScDocument* pDoc = getScDoc(); insertNewSheet(*pDoc); insertStringToCell(u"A1"_ustr, u"=$Sheet1.A1"); goToCell(u"A1"_ustr); CPPUNIT_ASSERT_EQUAL(u"0"_ustr, pDoc->GetString(ScAddress(0, 0, 1))); dispatchCommand(mxComponent, u".uno:ShowPrecedents"_ustr, {}); // Without the fix in place, this test would have crashed here dispatchCommand(mxComponent, u".uno:Cut"_ustr, {}); CPPUNIT_ASSERT_EQUAL(u""_ustr, pDoc->GetString(ScAddress(0, 0, 1))); } CPPUNIT_TEST_FIXTURE(ScUiCalcTest, testTdf153790) { createScDoc(); ScDocument* pDoc = getScDoc(); insertStringToCell(u"A1"_ustr, u"=SUM($Sheet1.B1:C1)"); CPPUNIT_ASSERT_EQUAL(u"0"_ustr, pDoc->GetString(ScAddress(0, 0, 0))); goToCell(u"A1"_ustr); dispatchCommand(mxComponent, u".uno:Copy"_ustr, {}); goToCell(u"A2"_ustr); dispatchCommand(mxComponent, u".uno:Paste"_ustr, {}); CPPUNIT_ASSERT_EQUAL(u"=SUM($Sheet1.B2:C2)"_ustr, pDoc->GetFormula(0, 1, 0)); goToCell(u"A1"_ustr); dispatchCommand(mxComponent, u".uno:Cut"_ustr, {}); goToCell(u"A3"_ustr); dispatchCommand(mxComponent, u".uno:Paste"_ustr, {}); // Without the fix in place, this test would have failed with // - Expected: =SUM($Sheet1.B1:C1) // - Actual : =SUM($Sheet1.B1:$Sheet1.C1) CPPUNIT_ASSERT_EQUAL(u"=SUM($Sheet1.B1:C1)"_ustr, pDoc->GetFormula(0, 2, 0)); } CPPUNIT_TEST_FIXTURE(ScUiCalcTest, testTdf141440) { createScDoc(); ScDocument* pDoc = getScDoc(); // Insert a note to cell A1 goToCell(u"A1"_ustr); uno::Sequence<beans::PropertyValue> aArgs = comphelper::InitPropertySequence({ { "Text", uno::Any(u"Note in A1"_ustr) } }); dispatchCommand(mxComponent, u".uno:InsertAnnotation"_ustr, aArgs); // Insert a formula to cell A2 insertStringToCell(u"A2"_ustr, u"=1+1"); CPPUNIT_ASSERT_EQUAL(u"2"_ustr, pDoc->GetString(ScAddress(0, 1, 0))); // Copy content of A2 to A1 using paste special command as a formula (Flags F) goToCell(u"A2"_ustr); dispatchCommand(mxComponent, u".uno:Copy"_ustr, {}); goToCell(u"A1"_ustr); aArgs = comphelper::InitPropertySequence( { { "Flags", uno::Any(u"F"_ustr) }, { "FormulaCommand", uno::Any(sal_uInt16(ScPasteFunc::ADD)) }, { "SkipEmptyCells", uno::Any(false) }, { "Transpose", uno::Any(false) }, { "AsLink", uno::Any(false) }, { "MoveMode", uno::Any(sal_uInt16(InsCellCmd::INS_NONE)) } }); dispatchCommand(mxComponent, u".uno:InsertContents"_ustr, aArgs); // Check if string in cell A2 was copied to cell A1 CPPUNIT_ASSERT_EQUAL(u"2"_ustr, pDoc->GetString(ScAddress(0, 0, 0))); // Without the fix in place, there would be no note in cell A1 after using paste special CPPUNIT_ASSERT_MESSAGE("There should be a note on A1", pDoc->HasNote(ScAddress(0, 0, 0))); CPPUNIT_ASSERT_EQUAL(u"Note in A1"_ustr, pDoc->GetNote(ScAddress(0, 0, 0))->GetText()); } CPPUNIT_TEST_FIXTURE(ScUiCalcTest, testTdf163019) { createScDoc(); ScDocument* pDoc = getScDoc(); // Disable replace cell warning ScModule* pMod = ScModule::get(); ScInputOptions aInputOption = pMod->GetInputOptions(); bool bOldStatus = aInputOption.GetReplaceCellsWarn(); aInputOption.SetReplaceCellsWarn(false); pMod->SetInputOptions(aInputOption); // Insert test data and formulas to create a sample crash document insertStringToCell(u"B1"_ustr, u"1"); insertStringToCell(u"A2"_ustr, u"1"); insertStringToCell(u"A3"_ustr, u"1"); insertStringToCell(u"B2"_ustr, u"=B1-A2"); insertStringToCell(u"B3"_ustr, u"=B2-A3"); // Copy content from B2 to B2 using paste special command as a number (Flags ????) goToCell(u"B2"_ustr); dispatchCommand(mxComponent, u".uno:Copy"_ustr, {}); goToCell(u"B2"_ustr); uno::Sequence<beans::PropertyValue> aArgs = comphelper::InitPropertySequence( { { "Flags", uno::Any(u"V"_ustr) }, { "FormulaCommand", uno::Any(sal_uInt16(ScPasteFunc::NONE)) }, { "SkipEmptyCells", uno::Any(false) }, { "Transpose", uno::Any(false) }, { "AsLink", uno::Any(false) }, { "MoveMode", uno::Any(sal_uInt16(InsCellCmd::INS_NONE)) } }); // Without the fix in place, this test would have crashed here dispatchCommand(mxComponent, u".uno:InsertContents"_ustr, aArgs); CPPUNIT_ASSERT_EQUAL(u"0"_ustr, pDoc->GetString(ScAddress(1, 1, 0))); // Restore previous replace cell warning status aInputOption.SetReplaceCellsWarn(bOldStatus); pMod->SetInputOptions(aInputOption); } CPPUNIT_TEST_FIXTURE(ScUiCalcTest, testTdf158551) { createScDoc(); ScDocument* pDoc = getScDoc(); insertStringToCell(u"A1"_ustr, u"10"); // Copy content of A1 to B1 using Formula Add goToCell(u"A1"_ustr); dispatchCommand(mxComponent, u".uno:Copy"_ustr, {}); goToCell(u"B1"_ustr); uno::Sequence<beans::PropertyValue> aArgs = comphelper::InitPropertySequence( { { "Flags", uno::Any(u"SVD"_ustr) }, { "FormulaCommand", uno::Any(sal_uInt16(ScPasteFunc::ADD)) }, { "SkipEmptyCells", uno::Any(false) }, { "Transpose", uno::Any(false) }, { "AsLink", uno::Any(false) }, { "MoveMode", uno::Any(sal_uInt16(InsCellCmd::INS_NONE)) } }); // Without the fix in place, this test would have crashed here dispatchCommand(mxComponent, u".uno:InsertContents"_ustr, aArgs); CPPUNIT_ASSERT_EQUAL(u"10"_ustr, pDoc->GetString(ScAddress(1, 0, 0))); } CPPUNIT_TEST_FIXTURE(ScUiCalcTest, testTdf159174) { createScDoc(); dispatchCommand(mxComponent, u".uno:SelectUnprotectedCells"_ustr, {}); dispatchCommand(mxComponent, u".uno:Copy"_ustr, {}); uno::Sequence<beans::PropertyValue> aPropertyValues = comphelper::InitPropertySequence( { { "SelectedFormat", uno::Any(static_cast<sal_uInt32>(SotClipboardFormatId::BITMAP)) } }); // Without the fix in place, this test would have crashed dispatchCommand(mxComponent, u".uno:ClipboardFormatItems"_ustr, aPropertyValues); ScModelObj* pModelObj = comphelper::getFromUnoTunnel<ScModelObj>(mxComponent); uno::Reference<drawing::XDrawPage> xPage(pModelObj->getDrawPages()->getByIndex(0), uno::UNO_QUERY_THROW); CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(0), xPage->getCount()); } CPPUNIT_TEST_FIXTURE(ScUiCalcTest, testKeyboardMergeRef) { createScDoc(); ScDocShell* pDocSh = getScDocShell(); ScModelObj* pModelObj = comphelper::getFromUnoTunnel<ScModelObj>(mxComponent); ScTabViewShell* pViewShell = pDocSh->GetBestViewShell(false); CPPUNIT_ASSERT(pViewShell); goToCell(u"A1:A5"_ustr); dispatchCommand(mxComponent, u".uno:ToggleMergeCells"_ustr, {}); goToCell(u"A6:A10"_ustr); dispatchCommand(mxComponent, u".uno:ToggleMergeCells"_ustr, {}); goToCell(u"B1"_ustr); typeString(u"="); goToCell(u"A1"_ustr); pModelObj->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, KEY_DOWN | KEY_SHIFT); pModelObj->postKeyEvent(LOK_KEYEVENT_KEYUP, 0, KEY_DOWN | KEY_SHIFT); Scheduler::ProcessEventsToIdle(); CPPUNIT_ASSERT(pViewShell->IsRefInputMode()); { const OUString* pInput = pViewShell->GetEditString(); CPPUNIT_ASSERT(pInput); CPPUNIT_ASSERT_EQUAL(u"=A1:A10"_ustr, *pInput); } pModelObj->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, KEY_UP | KEY_SHIFT); pModelObj->postKeyEvent(LOK_KEYEVENT_KEYUP, 0, KEY_UP | KEY_SHIFT); Scheduler::ProcessEventsToIdle(); CPPUNIT_ASSERT(pViewShell->IsRefInputMode()); { const OUString* pInput = pViewShell->GetEditString(); CPPUNIT_ASSERT(pInput); CPPUNIT_ASSERT_EQUAL(u"=A1:A5"_ustr, *pInput); } } CPPUNIT_TEST_FIXTURE(ScUiCalcTest, testMouseMergeRef) { createScDoc(); ScDocShell* pDocSh = getScDocShell(); ScModelObj* pModelObj = comphelper::getFromUnoTunnel<ScModelObj>(mxComponent); ScTabViewShell* pViewShell = pDocSh->GetBestViewShell(false); CPPUNIT_ASSERT(pViewShell); goToCell(u"A1:A5"_ustr); dispatchCommand(mxComponent, u".uno:ToggleMergeCells"_ustr, {}); goToCell(u"A6:A10"_ustr); dispatchCommand(mxComponent, u".uno:ToggleMergeCells"_ustr, {}); goToCell(u"B1"_ustr); typeString(u"="); Point aA1 = pViewShell->GetViewData().GetPrintTwipsPos(0, 0); Point aA6 = pViewShell->GetViewData().GetPrintTwipsPos(0, 5); Point aA7 = pViewShell->GetViewData().GetPrintTwipsPos(0, 6); pModelObj->postMouseEvent(LOK_MOUSEEVENT_MOUSEBUTTONDOWN, aA1.X() + 5, aA1.Y() + 5, 1, MOUSE_LEFT, 0); pModelObj->postMouseEvent(LOK_MOUSEEVENT_MOUSEMOVE, aA6.X() + 5, aA6.Y() + 5, 1, MOUSE_LEFT, 0); pModelObj->postMouseEvent(LOK_MOUSEEVENT_MOUSEBUTTONUP, aA7.X() + 5, aA7.Y() + 5, 1, MOUSE_LEFT, 0); Scheduler::ProcessEventsToIdle(); CPPUNIT_ASSERT(pViewShell->IsRefInputMode()); { const OUString* pInput = pViewShell->GetEditString(); CPPUNIT_ASSERT(pInput); CPPUNIT_ASSERT_EQUAL(u"=A1:A10"_ustr, *pInput); } } CPPUNIT_TEST_FIXTURE(ScUiCalcTest, testFillHandleDnD) { // Test the fill handle drag and drop createScDoc(); ScTabViewShell* pViewShell = getViewShell(); insertStringToCell(u"A1"_ustr, u"1"); // Select cell A1 to show the handle goToCell(u"A1"_ustr); // B2 left top corner = A1 right bottom corner Point aB2 = pViewShell->GetViewData().GetPrintTwipsPos(1, 1); Point aA7 = pViewShell->GetViewData().GetPrintTwipsPos(0, 6); ScModelObj* pModelObj = comphelper::getFromUnoTunnel<ScModelObj>(mxComponent); pModelObj->postMouseEvent(LOK_MOUSEEVENT_MOUSEBUTTONDOWN, aB2.X() - 1, aB2.Y() - 1, 1, MOUSE_LEFT, 0); pModelObj->postMouseEvent(LOK_MOUSEEVENT_MOUSEMOVE, aA7.X(), aA7.Y(), 1, MOUSE_LEFT, 0); pModelObj->postMouseEvent(LOK_MOUSEEVENT_MOUSEBUTTONUP, aA7.X(), aA7.Y(), 1, MOUSE_LEFT, 0); Scheduler::ProcessEventsToIdle(); ScDocument* pDoc = getScDoc(); CPPUNIT_ASSERT_EQUAL(u"1"_ustr, pDoc->GetString(ScAddress(0, 0, 0))); CPPUNIT_ASSERT_EQUAL(u"2"_ustr, pDoc->GetString(ScAddress(0, 1, 0))); CPPUNIT_ASSERT_EQUAL(u"3"_ustr, pDoc->GetString(ScAddress(0, 2, 0))); CPPUNIT_ASSERT_EQUAL(u"4"_ustr, pDoc->GetString(ScAddress(0, 3, 0))); CPPUNIT_ASSERT_EQUAL(u"5"_ustr, pDoc->GetString(ScAddress(0, 4, 0))); CPPUNIT_ASSERT_EQUAL(u"6"_ustr, pDoc->GetString(ScAddress(0, 5, 0))); } CPPUNIT_PLUGIN_IMPLEMENT(); /* vim:set shiftwidth=4 softtabstop=4 expandtab: */