From ed5640d8b587fbcfed7dd7967f3de04b37a76f26 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sun, 7 Apr 2024 11:06:44 +0200 Subject: Adding upstream version 4:7.4.7. Signed-off-by: Daniel Baumann --- sc/qa/extras/vba-macro-test.cxx | 806 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 806 insertions(+) create mode 100644 sc/qa/extras/vba-macro-test.cxx (limited to 'sc/qa/extras/vba-macro-test.cxx') diff --git a/sc/qa/extras/vba-macro-test.cxx b/sc/qa/extras/vba-macro-test.cxx new file mode 100644 index 000000000..15dfe9c87 --- /dev/null +++ b/sc/qa/extras/vba-macro-test.cxx @@ -0,0 +1,806 @@ +/* -*- 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 +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +using namespace css; + +class VBAMacroTest : public UnoApiTest +{ +public: + VBAMacroTest() + : UnoApiTest("/sc/qa/extras/testdocuments") + { + } + + virtual void tearDown() override; + + void testSimpleCopyAndPaste(); + void testMultiDocumentCopyAndPaste(); + void testSheetAndColumnSelectAndHide(); + void testPrintArea(); + void testSelectAllChaged(); + void testRangeSelect(); + void testWindowState(); + void testScroll(); + void testMacroKeyBinding(); + + void testVba(); + void testTdf107885(); + void testTdf131562(); + void testTdf107902(); + void testTdf90278(); + void testForEachInSelection(); + + CPPUNIT_TEST_SUITE(VBAMacroTest); + CPPUNIT_TEST(testSimpleCopyAndPaste); + CPPUNIT_TEST(testMultiDocumentCopyAndPaste); + CPPUNIT_TEST(testSheetAndColumnSelectAndHide); + CPPUNIT_TEST(testPrintArea); + CPPUNIT_TEST(testSelectAllChaged); + CPPUNIT_TEST(testRangeSelect); + CPPUNIT_TEST(testWindowState); + CPPUNIT_TEST(testScroll); + CPPUNIT_TEST(testMacroKeyBinding); + + CPPUNIT_TEST(testVba); + CPPUNIT_TEST(testTdf107885); + CPPUNIT_TEST(testTdf131562); + CPPUNIT_TEST(testTdf107902); + CPPUNIT_TEST(testTdf90278); + CPPUNIT_TEST(testForEachInSelection); + CPPUNIT_TEST_SUITE_END(); + +private: + uno::Reference mxComponent; +}; + +void VBAMacroTest::tearDown() +{ + closeDocument(mxComponent); + UnoApiTest::tearDown(); +} + +void VBAMacroTest::testSimpleCopyAndPaste() +{ + // Copy-paste values in the same sheet + + // Range(Cells(4, 3), Cells(6, 3)).Copy + // Cells(4, 2).Activate + // ActiveCell.PasteSpecial xlValues + + OUString aFileName; + createFileURL(u"SimpleCopyPaste.xlsm", aFileName); + mxComponent = loadFromDesktop(aFileName, "com.sun.star.sheet.SpreadsheetDocument"); + + uno::Any aRet; + uno::Sequence aOutParamIndex; + uno::Sequence aOutParam; + uno::Sequence aParams; + + SfxObjectShell* pFoundShell = SfxObjectShell::GetShellFromComponent(mxComponent); + + CPPUNIT_ASSERT_MESSAGE("Failed to access document shell", pFoundShell); + ScDocShell* pDocSh = static_cast(pFoundShell); + ScDocument& rDoc = pDocSh->GetDocument(); + + // Check state + CPPUNIT_ASSERT_EQUAL(10.0, rDoc.GetValue(ScAddress(2, 3, 0))); + CPPUNIT_ASSERT_EQUAL(20.0, rDoc.GetValue(ScAddress(2, 4, 0))); + CPPUNIT_ASSERT_EQUAL(30.0, rDoc.GetValue(ScAddress(2, 5, 0))); + + CPPUNIT_ASSERT_EQUAL(0.0, rDoc.GetValue(ScAddress(1, 3, 0))); + CPPUNIT_ASSERT_EQUAL(0.0, rDoc.GetValue(ScAddress(1, 4, 0))); + CPPUNIT_ASSERT_EQUAL(0.0, rDoc.GetValue(ScAddress(1, 5, 0))); + + SfxObjectShell::CallXScript( + mxComponent, "vnd.sun.Star.script:VBAProject.Module1.test?language=Basic&location=document", + aParams, aRet, aOutParamIndex, aOutParam); + + // Copy from C4-C6 + CPPUNIT_ASSERT_EQUAL(10.0, rDoc.GetValue(ScAddress(2, 3, 0))); + CPPUNIT_ASSERT_EQUAL(20.0, rDoc.GetValue(ScAddress(2, 4, 0))); + CPPUNIT_ASSERT_EQUAL(30.0, rDoc.GetValue(ScAddress(2, 5, 0))); + + // Paste to B4-B6 + CPPUNIT_ASSERT_EQUAL(10.0, rDoc.GetValue(ScAddress(1, 3, 0))); + CPPUNIT_ASSERT_EQUAL(20.0, rDoc.GetValue(ScAddress(1, 4, 0))); + CPPUNIT_ASSERT_EQUAL(30.0, rDoc.GetValue(ScAddress(1, 5, 0))); + + pDocSh->DoClose(); +} + +void VBAMacroTest::testMultiDocumentCopyAndPaste() +{ + // Creates a new workbook (document) and copy-pastes values + // between the documents. + + // Set CurrentWB = ActiveWorkbook + // Workbooks.Add + // Set NewWB = ActiveWorkbook + // Cells(3, 2).Value = 200 + // Cells(4, 2).Value = 100 + // Range(Cells(3, 2), Cells(4, 2)).Copy + // CurrentWB.Activate + // Cells(2, 2).Activate + // ActiveCell.PasteSpecial xlValues + // ... + + OUString aFileName; + createFileURL(u"MultiDocumentCopyPaste.xlsm", aFileName); + mxComponent = loadFromDesktop(aFileName, "com.sun.star.sheet.SpreadsheetDocument"); + + uno::Any aRet; + uno::Sequence aOutParamIndex; + uno::Sequence aOutParam; + uno::Sequence aParams; + + SfxObjectShell* pFoundShell = SfxObjectShell::GetShellFromComponent(mxComponent); + + CPPUNIT_ASSERT_MESSAGE("Failed to access document shell", pFoundShell); + ScDocShell* pDocSh = static_cast(pFoundShell); + ScDocument& rDoc = pDocSh->GetDocument(); + + CPPUNIT_ASSERT_EQUAL(0.0, rDoc.GetValue(ScAddress(1, 1, 0))); + CPPUNIT_ASSERT_EQUAL(0.0, rDoc.GetValue(ScAddress(1, 2, 0))); + CPPUNIT_ASSERT_EQUAL(0.0, rDoc.GetValue(ScAddress(1, 3, 0))); + + SfxObjectShell::CallXScript( + mxComponent, "vnd.sun.Star.script:VBAProject.Module1.test?language=Basic&location=document", + aParams, aRet, aOutParamIndex, aOutParam); + + CPPUNIT_ASSERT_EQUAL(200.0, rDoc.GetValue(ScAddress(1, 1, 0))); + CPPUNIT_ASSERT_EQUAL(100.0, rDoc.GetValue(ScAddress(1, 2, 0))); + CPPUNIT_ASSERT_EQUAL(0.0, rDoc.GetValue(ScAddress(1, 3, 0))); + + pDocSh->DoClose(); +} + +void VBAMacroTest::testSheetAndColumnSelectAndHide() +{ + OUString aFileName; + createFileURL(u"SheetAndColumnSelectAndHide.xlsm", aFileName); + mxComponent = loadFromDesktop(aFileName, "com.sun.star.sheet.SpreadsheetDocument"); + + SfxObjectShell* pFoundShell = SfxObjectShell::GetShellFromComponent(mxComponent); + + CPPUNIT_ASSERT_MESSAGE("Failed to access document shell", pFoundShell); + ScDocShell* pDocSh = static_cast(pFoundShell); + ScDocument& rDoc = pDocSh->GetDocument(); + + ScTabViewShell* pView = pDocSh->GetBestViewShell(false); + CPPUNIT_ASSERT(pView != nullptr); + auto const& rViewData = pView->GetViewData(); + + CPPUNIT_ASSERT(!rDoc.ColHidden(0, 1)); + CPPUNIT_ASSERT(!rDoc.ColHidden(1, 1)); + CPPUNIT_ASSERT(!rDoc.ColHidden(2, 1)); + CPPUNIT_ASSERT(!rDoc.ColHidden(3, 1)); + CPPUNIT_ASSERT(!rDoc.ColHidden(4, 1)); + + CPPUNIT_ASSERT(!rDoc.ColHidden(0, 2)); + CPPUNIT_ASSERT(!rDoc.ColHidden(1, 2)); + CPPUNIT_ASSERT(!rDoc.ColHidden(2, 2)); + CPPUNIT_ASSERT(!rDoc.ColHidden(3, 2)); + CPPUNIT_ASSERT(!rDoc.ColHidden(4, 2)); + + uno::Any aRet; + uno::Sequence aOutParamIndex; + uno::Sequence aOutParam; + uno::Sequence aParams; + + SfxObjectShell::CallXScript( + mxComponent, + "vnd.sun.Star.script:VBAProject.ThisWorkbook.testHide?language=Basic&location=document", + aParams, aRet, aOutParamIndex, aOutParam); + + CPPUNIT_ASSERT(!rDoc.ColHidden(0, 1)); + CPPUNIT_ASSERT(rDoc.ColHidden(1, 1)); + CPPUNIT_ASSERT(rDoc.ColHidden(2, 1)); + CPPUNIT_ASSERT(!rDoc.ColHidden(3, 1)); + CPPUNIT_ASSERT(!rDoc.ColHidden(4, 1)); + + CPPUNIT_ASSERT(!rDoc.ColHidden(0, 2)); + CPPUNIT_ASSERT(!rDoc.ColHidden(1, 2)); + CPPUNIT_ASSERT(rDoc.ColHidden(2, 2)); + CPPUNIT_ASSERT(rDoc.ColHidden(3, 2)); + CPPUNIT_ASSERT(rDoc.ColHidden(4, 2)); + + CPPUNIT_ASSERT_EQUAL(SCTAB(0), rViewData.GetTabNo()); + + SfxObjectShell::CallXScript( + mxComponent, + "vnd.sun.Star.script:VBAProject.ThisWorkbook.testUnhide?language=Basic&location=document", + aParams, aRet, aOutParamIndex, aOutParam); + + CPPUNIT_ASSERT(!rDoc.ColHidden(0, 1)); + CPPUNIT_ASSERT(!rDoc.ColHidden(1, 1)); + CPPUNIT_ASSERT(!rDoc.ColHidden(2, 1)); + CPPUNIT_ASSERT(!rDoc.ColHidden(3, 1)); + CPPUNIT_ASSERT(!rDoc.ColHidden(4, 1)); + + CPPUNIT_ASSERT(!rDoc.ColHidden(0, 2)); + CPPUNIT_ASSERT(!rDoc.ColHidden(1, 2)); + CPPUNIT_ASSERT(!rDoc.ColHidden(2, 2)); + CPPUNIT_ASSERT(!rDoc.ColHidden(3, 2)); + CPPUNIT_ASSERT(!rDoc.ColHidden(4, 2)); + + CPPUNIT_ASSERT_EQUAL(SCTAB(0), rViewData.GetTabNo()); + + pDocSh->DoClose(); +} + +void VBAMacroTest::testPrintArea() +{ + // Sets the print area to A1:B5 + // ActiveSheet.PageSetup.PrintArea = "$A$1:$B$5" + + OUString aFileName; + createFileURL(u"VariousTestMacros.xlsm", aFileName); + mxComponent = loadFromDesktop(aFileName, "com.sun.star.sheet.SpreadsheetDocument"); + + uno::Reference xDoc(mxComponent, uno::UNO_QUERY_THROW); + uno::Reference xIndex(xDoc->getSheets(), uno::UNO_QUERY_THROW); + uno::Reference xSheet(xIndex->getByIndex(0), uno::UNO_QUERY_THROW); + uno::Reference xPrintAreas(xSheet, uno::UNO_QUERY_THROW); + + { + const uno::Sequence aSequence = xPrintAreas->getPrintAreas(); + CPPUNIT_ASSERT_EQUAL(false, aSequence.hasElements()); + } + + uno::Any aRet; + uno::Sequence aOutParamIndex; + uno::Sequence aOutParam; + uno::Sequence aParams; + + SfxObjectShell::CallXScript(mxComponent, + "vnd.sun.Star.script:VBAProject.ThisWorkbook.testPrintArea?" + "language=Basic&location=document", + aParams, aRet, aOutParamIndex, aOutParam); + + { + const uno::Sequence aSequence = xPrintAreas->getPrintAreas(); + CPPUNIT_ASSERT_EQUAL(true, aSequence.hasElements()); + } + + css::uno::Reference xCloseable(mxComponent, css::uno::UNO_QUERY_THROW); + xCloseable->close(true); +} + +void VBAMacroTest::testSelectAllChaged() +{ + // Columns("A:A").Select + // Range(Selection, Selection.End(xlToRight)).Select + + OUString aFileName; + createFileURL(u"VariousTestMacros.xlsm", aFileName); + mxComponent = loadFromDesktop(aFileName, "com.sun.star.sheet.SpreadsheetDocument"); + + SfxObjectShell* pFoundShell = SfxObjectShell::GetShellFromComponent(mxComponent); + CPPUNIT_ASSERT_MESSAGE("Failed to access document shell", pFoundShell); + + ScDocShell* pDocSh = static_cast(pFoundShell); + ScTabViewShell* pView = pDocSh->GetBestViewShell(false); + CPPUNIT_ASSERT(pView != nullptr); + auto const& pViewData = pView->GetViewData(); + CPPUNIT_ASSERT_EQUAL(ScRange(), pViewData.GetMarkData().GetMarkArea()); + + uno::Any aRet; + uno::Sequence aOutParamIndex; + uno::Sequence aOutParam; + uno::Sequence aParams; + + SfxObjectShell::CallXScript(mxComponent, + "vnd.sun.Star.script:VBAProject.ThisWorkbook.testSelectAll?" + "language=Basic&location=document", + aParams, aRet, aOutParamIndex, aOutParam); + + // A1:E1048576 + CPPUNIT_ASSERT_EQUAL(ScRange(0, 0, 0, 4, MAXROW, 0), pViewData.GetMarkData().GetMarkArea()); + + pDocSh->DoClose(); +} + +void VBAMacroTest::testRangeSelect() +{ + // Range("B2").Select + // Range(Selection, Selection.End(xlToRight)).Select + + OUString aFileName; + createFileURL(u"VariousTestMacros.xlsm", aFileName); + mxComponent = loadFromDesktop(aFileName, "com.sun.star.sheet.SpreadsheetDocument"); + + SfxObjectShell* pFoundShell = SfxObjectShell::GetShellFromComponent(mxComponent); + CPPUNIT_ASSERT_MESSAGE("Failed to access document shell", pFoundShell); + + ScDocShell* pDocSh = static_cast(pFoundShell); + ScTabViewShell* pView = pDocSh->GetBestViewShell(false); + CPPUNIT_ASSERT(pView != nullptr); + auto const& pViewData = pView->GetViewData(); + CPPUNIT_ASSERT_EQUAL(ScRange(), pViewData.GetMarkData().GetMarkArea()); + + uno::Any aRet; + uno::Sequence aOutParamIndex; + uno::Sequence aOutParam; + uno::Sequence aParams; + + SfxObjectShell::CallXScript(mxComponent, + "vnd.sun.Star.script:VBAProject.ThisWorkbook.testRangeSelect?" + "language=Basic&location=document", + aParams, aRet, aOutParamIndex, aOutParam); + + // B2:E5 + CPPUNIT_ASSERT_EQUAL(ScRange(1, 1, 0, 4, 1, 0), pViewData.GetMarkData().GetMarkArea()); + + pDocSh->DoClose(); +} + +void VBAMacroTest::testWindowState() +{ + // Application.WindowState = xlMinimized + // Application.WindowState = xlMaximized + // Application.WindowState = xlNormal + + OUString aFileName; + createFileURL(u"VariousTestMacros.xlsm", aFileName); + mxComponent = loadFromDesktop(aFileName, "com.sun.star.sheet.SpreadsheetDocument"); + + uno::Any aRet; + uno::Sequence aOutParamIndex; + uno::Sequence aOutParam; + uno::Sequence aParams; + + SfxObjectShell::CallXScript(mxComponent, + "vnd.sun.Star.script:VBAProject.ThisWorkbook.testWindowState?" + "language=Basic&location=document", + aParams, aRet, aOutParamIndex, aOutParam); + + css::uno::Reference xCloseable(mxComponent, css::uno::UNO_QUERY_THROW); + xCloseable->close(true); +} + +void VBAMacroTest::testScroll() +{ + // ActiveWindow.ScrollColumn = 30 + // ActiveWindow.ScrollRow = 100 + + OUString aFileName; + createFileURL(u"VariousTestMacros.xlsm", aFileName); + mxComponent = loadFromDesktop(aFileName, "com.sun.star.sheet.SpreadsheetDocument"); + + SfxObjectShell* pFoundShell = SfxObjectShell::GetShellFromComponent(mxComponent); + CPPUNIT_ASSERT_MESSAGE("Failed to access document shell", pFoundShell); + + ScDocShell* pDocSh = static_cast(pFoundShell); + ScTabViewShell* pView = pDocSh->GetBestViewShell(false); + CPPUNIT_ASSERT(pView != nullptr); + auto const& rViewData = pView->GetViewData(); + + CPPUNIT_ASSERT_EQUAL(ScSplitPos::SC_SPLIT_BOTTOMLEFT, rViewData.GetActivePart()); + CPPUNIT_ASSERT_EQUAL(SCCOL(0), rViewData.GetPosX(ScHSplitPos::SC_SPLIT_LEFT)); + CPPUNIT_ASSERT_EQUAL(SCROW(0), rViewData.GetPosY(ScVSplitPos::SC_SPLIT_BOTTOM)); + + uno::Any aRet; + uno::Sequence aOutParamIndex; + uno::Sequence aOutParam; + uno::Sequence aParams; + + SfxObjectShell::CallXScript( + mxComponent, + "vnd.sun.Star.script:VBAProject.ThisWorkbook.testScroll?language=Basic&location=document", + aParams, aRet, aOutParamIndex, aOutParam); + + CPPUNIT_ASSERT_EQUAL(ScSplitPos::SC_SPLIT_BOTTOMLEFT, rViewData.GetActivePart()); + CPPUNIT_ASSERT_EQUAL(SCCOL(29), rViewData.GetPosX(ScHSplitPos::SC_SPLIT_LEFT)); + CPPUNIT_ASSERT_EQUAL(SCROW(99), rViewData.GetPosY(ScVSplitPos::SC_SPLIT_BOTTOM)); + + pDocSh->DoClose(); +} + +void VBAMacroTest::testMacroKeyBinding() +{ + // key_U() -> CTRL+U + // key_T() -> CTRL+T + + OUString aFileName; + createFileURL(u"KeyShortcut.xlsm", aFileName); + mxComponent = loadFromDesktop(aFileName, "com.sun.star.sheet.SpreadsheetDocument"); + + uno::Reference xModel(mxComponent, uno::UNO_QUERY); + CPPUNIT_ASSERT(xModel.is()); + + uno::Reference xConfigSupplier(xModel, uno::UNO_QUERY); + CPPUNIT_ASSERT(xConfigSupplier.is()); + uno::Reference xConfigManager + = xConfigSupplier->getUIConfigurationManager(); + uno::Reference xAccelerator + = xConfigManager->getShortCutManager(); + + awt::KeyEvent aCtrlU; + aCtrlU.KeyCode = css::awt::Key::U; + aCtrlU.Modifiers = css::awt::KeyModifier::MOD1; + + CPPUNIT_ASSERT_EQUAL( + OUString( + "vnd.sun.star.script:VBAProject.ThisWorkbook.key_U?language=Basic&location=document"), + xAccelerator->getCommandByKeyEvent(aCtrlU)); + + awt::KeyEvent aCtrlT; + aCtrlT.KeyCode = css::awt::Key::T; + aCtrlT.Modifiers = css::awt::KeyModifier::MOD1; + + CPPUNIT_ASSERT_EQUAL( + OUString( + "vnd.sun.star.script:VBAProject.ThisWorkbook.key_T?language=Basic&location=document"), + xAccelerator->getCommandByKeyEvent(aCtrlT)); + + css::uno::Reference xCloseable(mxComponent, css::uno::UNO_QUERY_THROW); + xCloseable->close(true); +} + +void VBAMacroTest::testVba() +{ + TestMacroInfo testInfo[] = { + { OUString("TestAddress."), + OUString( + "vnd.sun.Star.script:VBAProject.testMacros.test?language=Basic&location=document") }, + { + OUString("vba."), + OUString( + "vnd.sun.Star.script:VBAProject.Modul1.Modul1?language=Basic&location=document"), + }, + { OUString("MiscRangeTests."), + OUString( + "vnd.sun.Star.script:VBAProject.testMacros.test?language=Basic&location=document") }, + { OUString("bytearraystring."), + OUString( + "vnd.sun.Star.script:VBAProject.testMacro.test?language=Basic&location=document") }, + { OUString("AutoFilter."), + OUString( + "vnd.sun.Star.script:VBAProject.testMacros.test?language=Basic&location=document") }, + { OUString("CalcFont."), + OUString( + "vnd.sun.Star.script:VBAProject.testMacros.test?language=Basic&location=document") }, + { OUString("TestIntersection."), + OUString( + "vnd.sun.Star.script:VBAProject.testMacros.test?language=Basic&location=document") }, + { OUString("TestUnion."), + OUString( + "vnd.sun.Star.script:VBAProject.testMacros.test?language=Basic&location=document") }, + { OUString("range-4."), + OUString( + "vnd.sun.Star.script:VBAProject.testMacros.test?language=Basic&location=document") }, +// FIXME: sometimes it fails on Windows with +// Failed: : Test change event for Range.Clear set: +// Failed: : Test change event for Range.ClearContents set: +// Failed: : Test change event for Range.Replace: +// Failed: : Test change event for Range.FillRight: +// Tests passed: 4 +// Tests failed: 4 +#if !defined(_WIN32) + { OUString("Ranges-3."), + OUString( + "vnd.sun.Star.script:VBAProject.testMacros.test?language=Basic&location=document") }, +#endif + { OUString("TestCalc_Rangetest."), + OUString( + "vnd.sun.Star.script:VBAProject.testMacros.test?language=Basic&location=document") }, + { OUString("TestCalc_Rangetest2."), + OUString( + "vnd.sun.Star.script:VBAProject.testMacros.test?language=Basic&location=document") }, + { OUString("Ranges-2."), + OUString( + "vnd.sun.Star.script:VBAProject.testMacros.test?language=Basic&location=document") }, + { OUString("pagesetup."), + OUString( + "vnd.sun.Star.script:VBAProject.testMacros.test?language=Basic&location=document") }, + { OUString("Window."), + OUString( + "vnd.sun.Star.script:VBAProject.testMacros.test?language=Basic&location=document") }, + { OUString("window2."), + OUString( + "vnd.sun.Star.script:VBAProject.testMacros.test?language=Basic&location=document") }, + { OUString("PageBreaks."), + OUString( + "vnd.sun.Star.script:VBAProject.testMacros.test?language=Basic&location=document") }, + { OUString("Shapes."), + OUString( + "vnd.sun.Star.script:VBAProject.testMacros.test?language=Basic&location=document") }, + { OUString("Ranges."), + OUString( + "vnd.sun.Star.script:VBAProject.testMacros.test?language=Basic&location=document") }, + { OUString("CheckOptionToggleValue."), + OUString( + "vnd.sun.Star.script:VBAProject.testMacros.test?language=Basic&location=document") }, + { OUString("GeneratedEventTest."), + OUString( + "vnd.sun.Star.script:VBAProject.testMacros.test?language=Basic&location=document") }, + { OUString("MiscControlTests."), + OUString( + "vnd.sun.Star.script:VBAProject.testMacros.test?language=Basic&location=document") }, + { OUString("Workbooks."), + OUString( + "vnd.sun.Star.script:VBAProject.testMacros.test?language=Basic&location=document") }, + { OUString("Names."), + OUString( + "vnd.sun.Star.script:VBAProject.testMacros.test?language=Basic&location=document") }, + { OUString("NamesSheetLocal."), + OUString( + "vnd.sun.Star.script:VBAProject.testMacros.test?language=Basic&location=document") }, + { OUString("vba_endFunction."), + OUString( + "vnd.sun.Star.script:VBAProject.testMacros.test?language=Basic&location=document") }, + { OUString("vba_findFunction."), + OUString( + "vnd.sun.Star.script:VBAProject.testMacros.test?language=Basic&location=document") }, + }; + OUString sTempDir; + OUString sTempDirURL; + osl::FileBase::getTempDirURL(sTempDirURL); + osl::FileBase::getSystemPathFromFileURL(sTempDirURL, sTempDir); + sTempDir += OUStringChar(SAL_PATHDELIMITER); + OUString sTestFileName("My Test WorkBook.xls"); + uno::Sequence aParams; + for (const auto& rTestInfo : testInfo) + { + OUString aFileName; + createFileURL(OUStringConcatenation(rTestInfo.sFileBaseName + "xls"), aFileName); + mxComponent = loadFromDesktop(aFileName, "com.sun.star.sheet.SpreadsheetDocument"); + + // process all events such as OnLoad events etc. otherwise they tend + // to arrive later at a random time - while processing other StarBasic + // methods. + Scheduler::ProcessEventsToIdle(); + + uno::Any aRet; + uno::Sequence aOutParamIndex; + uno::Sequence aOutParam; + bool bWorkbooksHandling = rTestInfo.sFileBaseName == "Workbooks." && !sTempDir.isEmpty(); + + if (bWorkbooksHandling) + { + aParams = { uno::Any(sTempDir), uno::Any(sTestFileName) }; + } + + SAL_INFO("sc.qa", "about to invoke vba test in " << aFileName << " with url " + << rTestInfo.sMacroUrl); + + SfxObjectShell::CallXScript(mxComponent, rTestInfo.sMacroUrl, aParams, aRet, aOutParamIndex, + aOutParam); + OUString aStringRes; + aRet >>= aStringRes; + CPPUNIT_ASSERT_EQUAL_MESSAGE( + OUString("script reported failure in file " + rTestInfo.sFileBaseName + "xls") + .toUtf8() + .getStr(), + OUString("OK"), aStringRes); + + css::uno::Reference xCloseable(mxComponent, + css::uno::UNO_QUERY_THROW); + xCloseable->close(true); + + if (bWorkbooksHandling) + { + OUString sFileUrl; + OUString sFilePath = sTempDir + sTestFileName; + osl::FileBase::getFileURLFromSystemPath(sFilePath, sFileUrl); + if (!sFileUrl.isEmpty()) + osl::File::remove(sFileUrl); + } + } +} + +void VBAMacroTest::testTdf107885() +{ + OUString aFileName; + createFileURL(u"tdf107885.xlsm", aFileName); + mxComponent = loadFromDesktop(aFileName, "com.sun.star.sheet.SpreadsheetDocument"); + + uno::Any aRet; + uno::Sequence aOutParamIndex; + uno::Sequence aOutParam; + uno::Sequence aParams; + + SfxObjectShell* pFoundShell = SfxObjectShell::GetShellFromComponent(mxComponent); + + CPPUNIT_ASSERT_MESSAGE("Failed to access document shell", pFoundShell); + ScDocShell* pDocSh = static_cast(pFoundShell); + ScDocument& rDoc = pDocSh->GetDocument(); + + CPPUNIT_ASSERT(!rDoc.RowHidden(1, 0)); + CPPUNIT_ASSERT(!rDoc.RowHidden(2, 0)); + CPPUNIT_ASSERT(!rDoc.RowHidden(3, 0)); + CPPUNIT_ASSERT(!rDoc.RowHidden(4, 0)); + + // Call auto filter macro using a string condition + SfxObjectShell::CallXScript( + mxComponent, + "vnd.sun.Star.script:VBAProject.Module1.AFString?language=Basic&location=document", aParams, + aRet, aOutParamIndex, aOutParam); + + //Without the fix in place, all rows in autofilter would have been hidden + CPPUNIT_ASSERT(rDoc.RowHidden(1, 0)); + CPPUNIT_ASSERT(!rDoc.RowHidden(2, 0)); + CPPUNIT_ASSERT(!rDoc.RowHidden(3, 0)); + CPPUNIT_ASSERT(!rDoc.RowHidden(4, 0)); + + // Call auto filter macro using a numeric condition without any locale + SfxObjectShell::CallXScript( + mxComponent, + "vnd.sun.Star.script:VBAProject.Module1.AFNumeric?language=Basic&location=document", + aParams, aRet, aOutParamIndex, aOutParam); + + CPPUNIT_ASSERT(rDoc.RowHidden(1, 0)); + CPPUNIT_ASSERT(rDoc.RowHidden(2, 0)); + CPPUNIT_ASSERT(!rDoc.RowHidden(3, 0)); + CPPUNIT_ASSERT(!rDoc.RowHidden(4, 0)); + + pDocSh->DoClose(); +} + +void VBAMacroTest::testTdf131562() +{ + OUString aFileName; + createFileURL(u"tdf131562.xlsm", aFileName); + mxComponent = loadFromDesktop(aFileName, "com.sun.star.sheet.SpreadsheetDocument"); + + uno::Any aRet; + uno::Sequence aOutParamIndex; + uno::Sequence aOutParam; + uno::Sequence aParams; + + SfxObjectShell* pFoundShell = SfxObjectShell::GetShellFromComponent(mxComponent); + + CPPUNIT_ASSERT_MESSAGE("Failed to access document shell", pFoundShell); + ScDocShell* pDocSh = static_cast(pFoundShell); + ScDocument& rDoc = pDocSh->GetDocument(); + + CPPUNIT_ASSERT_EQUAL(OUString("1"), rDoc.GetString(ScAddress(0, 2, 0))); + CPPUNIT_ASSERT_EQUAL(OUString(""), rDoc.GetString(ScAddress(0, 3, 0))); + + SfxObjectShell::CallXScript( + mxComponent, + "vnd.sun.Star.script:VBAProject.Munka1.numberconcat?language=Basic&location=document", + aParams, aRet, aOutParamIndex, aOutParam); + + //Without the fix in place, the macro wouldn't have concatenated 1 and " ." + CPPUNIT_ASSERT_EQUAL(OUString("1 ."), rDoc.GetString(ScAddress(0, 2, 0))); + CPPUNIT_ASSERT_EQUAL(OUString("1 .cat"), rDoc.GetString(ScAddress(0, 3, 0))); + + pDocSh->DoClose(); +} + +void VBAMacroTest::testTdf107902() +{ + OUString aFileName; + createFileURL(u"tdf107902.xlsm", aFileName); + mxComponent = loadFromDesktop(aFileName, "com.sun.star.sheet.SpreadsheetDocument"); + + uno::Any aRet; + uno::Sequence aOutParamIndex; + uno::Sequence aOutParam; + uno::Sequence aParams; + + SfxObjectShell* pFoundShell = SfxObjectShell::GetShellFromComponent(mxComponent); + + CPPUNIT_ASSERT_MESSAGE("Failed to access document shell", pFoundShell); + ScDocShell* pDocSh = static_cast(pFoundShell); + ScDocument& rDoc = pDocSh->GetDocument(); + + //Without the fix in place, it would have failed with 'Unexpected dialog: Error: BASIC runtime error.' + SfxObjectShell::CallXScript( + mxComponent, "vnd.sun.Star.script:VBAProject.Module1.AF?language=Basic&location=document", + aParams, aRet, aOutParamIndex, aOutParam); + + //Check the autofilter was created + const ScPatternAttr* pPattern = rDoc.GetPattern(0, 0, 0); + CPPUNIT_ASSERT(pPattern); + + const ScMergeFlagAttr& rAttr = pPattern->GetItem(ATTR_MERGE_FLAG); + CPPUNIT_ASSERT_MESSAGE("Autofilter was not created", rAttr.HasAutoFilter()); + + //Check the last row is hidden + CPPUNIT_ASSERT(!rDoc.RowHidden(0, 0)); + CPPUNIT_ASSERT(!rDoc.RowHidden(1, 0)); + CPPUNIT_ASSERT(!rDoc.RowHidden(2, 0)); + CPPUNIT_ASSERT(!rDoc.RowHidden(3, 0)); + CPPUNIT_ASSERT(rDoc.RowHidden(4, 0)); + + pDocSh->DoClose(); +} + +void VBAMacroTest::testTdf90278() +{ + OUString aFileName; + createFileURL(u"tdf90278.xls", aFileName); + mxComponent = loadFromDesktop(aFileName, "com.sun.star.sheet.SpreadsheetDocument"); + + uno::Any aRet; + uno::Sequence aOutParamIndex; + uno::Sequence aOutParam; + uno::Sequence aParams; + + // Without the fix in place, changing the border weight + // would cause a Basic exception/error in the following script. + SfxObjectShell::CallXScript( + mxComponent, + "vnd.sun.Star.script:VBAProject.Module1.BorderWeight?language=Basic&location=document", + aParams, aRet, aOutParamIndex, aOutParam); + + // Check the border weight of the corresponding cell in the test document + sal_Int32 aReturnValue; + aRet >>= aReturnValue; + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), aReturnValue); + + css::uno::Reference xCloseable(mxComponent, css::uno::UNO_QUERY_THROW); + xCloseable->close(true); +} + +void VBAMacroTest::testForEachInSelection() +{ + OUString aFileName; + createFileURL(u"ForEachInSelection.ods", aFileName); + mxComponent = loadFromDesktop(aFileName, "com.sun.star.sheet.SpreadsheetDocument"); + + SfxObjectShell* pFoundShell = SfxObjectShell::GetShellFromComponent(mxComponent); + + CPPUNIT_ASSERT_MESSAGE("Failed to access document shell", pFoundShell); + ScDocShell* pDocSh = static_cast(pFoundShell); + ScDocument& rDoc = pDocSh->GetDocument(); + + uno::Any aRet; + uno::Sequence aOutParamIndex; + uno::Sequence aOutParam; + uno::Sequence aParams; + + CPPUNIT_ASSERT_EQUAL(OUString("foo"), rDoc.GetString(ScAddress(0, 0, 0))); + CPPUNIT_ASSERT_EQUAL(OUString("bar"), rDoc.GetString(ScAddress(0, 1, 0))); + CPPUNIT_ASSERT_EQUAL(OUString("baz"), rDoc.GetString(ScAddress(0, 2, 0))); + + // tdf#153724: without the fix, this would fail with + // assertion failed + // - Expression: false + // - Unexpected dialog: Error: BASIC runtime error. + // '13' + // Data type mismatch. + SfxObjectShell::CallXScript(mxComponent, + "vnd.sun.Star.script:Standard.Module1.TestForEachInSelection?" + "language=Basic&location=document", + aParams, aRet, aOutParamIndex, aOutParam); + + CPPUNIT_ASSERT_EQUAL(OUString("oof"), rDoc.GetString(ScAddress(0, 0, 0))); + CPPUNIT_ASSERT_EQUAL(OUString("rab"), rDoc.GetString(ScAddress(0, 1, 0))); + CPPUNIT_ASSERT_EQUAL(OUString("zab"), rDoc.GetString(ScAddress(0, 2, 0))); +} + +CPPUNIT_TEST_SUITE_REGISTRATION(VBAMacroTest); + +CPPUNIT_PLUGIN_IMPLEMENT(); + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ -- cgit v1.2.3