diff options
author | Markus Mohrhard <markus.mohrhard@googlemail.com> | 2011-11-30 22:09:59 +0100 |
---|---|---|
committer | Markus Mohrhard <markus.mohrhard@googlemail.com> | 2011-11-30 23:48:14 +0100 |
commit | bc84d4782ca3750fd9cabfdaea1d9e89cca20286 (patch) | |
tree | f67f11517f311c5bdce2890e74f5d197159b46ed /sc/qa/extras | |
parent | 973406e43989005c6ccd4f803a48ce344bb06d19 (diff) |
move sc's macros test into sc/qa/extras
Diffstat (limited to 'sc/qa/extras')
-rw-r--r-- | sc/qa/extras/macros-test.cxx | 223 |
1 files changed, 223 insertions, 0 deletions
diff --git a/sc/qa/extras/macros-test.cxx b/sc/qa/extras/macros-test.cxx new file mode 100644 index 000000000000..969978a9d6ee --- /dev/null +++ b/sc/qa/extras/macros-test.cxx @@ -0,0 +1,223 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * Version: MPL 1.1 / GPLv3+ / LGPLv3+ + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Initial Developer of the Original Code is + * Caolán McNamara <caolanm@redhat.com> + * Portions created by the Initial Developer are Copyright (C) 2011 the + * Initial Developer. All Rights Reserved. + * + * Contributor(s): + * Caolán McNamara <caolanm@redhat.com> + * Markus Mohrhard <markus.mohrhard@googlemail.com> + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 3 or later (the "GPLv3+"), or + * the GNU Lesser General Public License Version 3 or later (the "LGPLv3+"), + * in which case the provisions of the GPLv3+ or the LGPLv3+ are applicable + * instead of those above. + */ + +#include <sal/config.h> +#include <test/bootstrapfixture.hxx> +#include <unotest/macros_test.hxx> +#include <rtl/strbuf.hxx> +#include <osl/file.hxx> + +#include <sfx2/app.hxx> +#include <sfx2/docfilt.hxx> +#include <sfx2/docfile.hxx> +#include <sfx2/sfxmodelfactory.hxx> +#include <svl/intitem.hxx> + +#include <basic/sbxdef.hxx> + +#include "docsh.hxx" +#include "patattr.hxx" +#include "scitems.hxx" +#include "document.hxx" + +#define ODS_FORMAT_TYPE 50331943 +#define XLS_FORMAT_TYPE 318767171 +#define XLSX_FORMAT_TYPE 268959811 + +#define ODS 0 +#define XLS 1 +#define XLSX 2 + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; + +namespace { + +struct FileFormat { + const char* pName; const char* pFilterName; const char* pTypeName; sal_uLong nFormatType; +}; + +FileFormat aFileFormats[] = { + { "ods" , "calc8", "", ODS_FORMAT_TYPE }, + { "xls" , "MS Excel 97", "calc_MS_EXCEL_97", XLS_FORMAT_TYPE }, + { "xlsx", "Calc MS Excel 2007 XML" , "MS Excel 2007 XML", XLSX_FORMAT_TYPE } +}; + +} + +/* Implementation of Macros test */ + +class ScMacrosTest : public test::BootstrapFixture, public unotest::MacrosTest +{ +public: + ScMacrosTest(); + + void createFileURL(const rtl::OUString& aFileBase, const rtl::OUString& aFileExtension, rtl::OUString& rFilePath); + + virtual void setUp(); + virtual void tearDown(); + + void testStarBasic(); + void testVba(); + CPPUNIT_TEST_SUITE(ScMacrosTest); +#if !defined(MACOSX) && !defined(WNT) + //enable this test if you want to play with star basic macros in unit tests + //works but does nothing useful yet + CPPUNIT_TEST(testStarBasic); + CPPUNIT_TEST(testVba); +#endif + + CPPUNIT_TEST_SUITE_END(); + +private: + uno::Reference<uno::XInterface> m_xCalcComponent; + rtl::OUString m_aBaseString; +}; + + +void ScMacrosTest::createFileURL(const rtl::OUString& aFileBase, const rtl::OUString& aFileExtension, rtl::OUString& rFilePath) +{ + rtl::OUString aSep(RTL_CONSTASCII_USTRINGPARAM("/")); + rtl::OUStringBuffer aBuffer( getSrcRootURL() ); + aBuffer.append(m_aBaseString).append(aSep).append(aFileExtension); + aBuffer.append(aSep).append(aFileBase).append(aFileExtension); + rFilePath = aBuffer.makeStringAndClear(); +} + +void ScMacrosTest::testStarBasic() +{ + const rtl::OUString aFileNameBase(RTL_CONSTASCII_USTRINGPARAM("StarBasic.")); + rtl::OUString aFileExtension(aFileFormats[0].pName, strlen(aFileFormats[0].pName), RTL_TEXTENCODING_UTF8 ); + rtl::OUString aFilterName(aFileFormats[0].pFilterName, strlen(aFileFormats[0].pFilterName), RTL_TEXTENCODING_UTF8) ; + rtl::OUString aFileName; + createFileURL(aFileNameBase, aFileExtension, aFileName); + rtl::OUString aFilterType(aFileFormats[0].pTypeName, strlen(aFileFormats[0].pTypeName), RTL_TEXTENCODING_UTF8); + std::cout << aFileFormats[0].pName << " Test" << std::endl; + uno::Reference< com::sun::star::lang::XComponent > xComponent = loadFromDesktop(aFileName); + + CPPUNIT_ASSERT_MESSAGE("Failed to load StarBasic.ods", xComponent.is()); + + rtl::OUString aURL(RTL_CONSTASCII_USTRINGPARAM("vnd.sun.Star.script:Standard.Module1.Macro1?language=Basic&location=document")); + String sUrl = aURL; + Any aRet; + Sequence< sal_Int16 > aOutParamIndex; + Sequence< Any > aOutParam; + Sequence< uno::Any > aParams; + + SfxObjectShell* pFoundShell = SfxObjectShell::GetShellFromComponent(xComponent); + + CPPUNIT_ASSERT_MESSAGE("Failed to access document shell", pFoundShell); + ScDocShell* xDocSh = static_cast<ScDocShell*>(pFoundShell); + ScDocument* pDoc = xDocSh->GetDocument(); + + pFoundShell->CallXScript(xComponent, sUrl, aParams, aRet, aOutParamIndex,aOutParam); + double aValue; + pDoc->GetValue(0,0,0,aValue); + std::cout << "returned value = " << aValue << std::endl; + CPPUNIT_ASSERT_MESSAGE("script did not change the value of Sheet1.A1",aValue==2); + xDocSh->DoClose(); +} + + +void ScMacrosTest::testVba() +{ + TestMacroInfo testInfo[] = { + { + rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("TestAddress.")), + rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("vnd.sun.Star.script:VBAProject.testMacros.test?language=Basic&location=document")) + }, + { + rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("vba.")), + rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("vnd.sun.Star.script:VBAProject.Modul1.Modul1?language=Basic&location=document")), + } + }; + + rtl::OUString aFileExtension(aFileFormats[1].pName, strlen(aFileFormats[1].pName), RTL_TEXTENCODING_UTF8 ); + rtl::OUString aFilterName(aFileFormats[1].pFilterName, strlen(aFileFormats[1].pFilterName), RTL_TEXTENCODING_UTF8) ; + rtl::OUString aFilterType(aFileFormats[1].pTypeName, strlen(aFileFormats[1].pTypeName), RTL_TEXTENCODING_UTF8); + std::cout << aFileFormats[1].pName << " Test" << std::endl; + for ( sal_uInt32 i=0; i<SAL_N_ELEMENTS( testInfo ); ++i ) + { + rtl::OUString aFileName; + createFileURL(testInfo[i].sFileBaseName, aFileExtension, aFileName); + uno::Reference< com::sun::star::lang::XComponent > xComponent = loadFromDesktop(aFileName); + rtl::OUString sMsg( RTL_CONSTASCII_USTRINGPARAM("Failed to load ") ); + sMsg.concat( aFileName ); + CPPUNIT_ASSERT_MESSAGE( rtl::OUStringToOString( sMsg, RTL_TEXTENCODING_UTF8 ).getStr(), xComponent.is() ); + + String sUrl = testInfo[i].sMacroUrl; + Any aRet; + Sequence< sal_Int16 > aOutParamIndex; + Sequence< Any > aOutParam; + Sequence< uno::Any > aParams; + + SfxObjectShell* pFoundShell = SfxObjectShell::GetShellFromComponent(xComponent); + + CPPUNIT_ASSERT_MESSAGE("Failed to access document shell", pFoundShell); + pFoundShell->CallXScript(xComponent, sUrl, aParams, aRet, aOutParamIndex,aOutParam); + rtl::OUString aStringRes; + aRet >>= aStringRes; + std::cout << "value of Ret " << rtl::OUStringToOString( aStringRes, RTL_TEXTENCODING_UTF8 ).getStr() << std::endl; + CPPUNIT_ASSERT_MESSAGE("script reported failure",aStringRes.equals( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("OK") )) ); + pFoundShell->DoClose(); + } +} + +ScMacrosTest::ScMacrosTest() + : m_aBaseString(RTL_CONSTASCII_USTRINGPARAM("/sc/qa/unit/data")) +{ +} + +void ScMacrosTest::setUp() +{ + test::BootstrapFixture::setUp(); + + // This is a bit of a fudge, we do this to ensure that ScGlobals::ensure, + // which is a private symbol to us, gets called + m_xCalcComponent = + getMultiServiceFactory()->createInstance(rtl::OUString( + RTL_CONSTASCII_USTRINGPARAM("com.sun.star.comp.Calc.SpreadsheetDocument"))); + CPPUNIT_ASSERT_MESSAGE("no calc component!", m_xCalcComponent.is()); + mxDesktop = Reference<com::sun::star::frame::XDesktop>( getMultiServiceFactory()->createInstance( + rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.frame.Desktop" ))), UNO_QUERY ); + CPPUNIT_ASSERT_MESSAGE("", mxDesktop.is()); +} + +void ScMacrosTest::tearDown() +{ + uno::Reference< lang::XComponent >( m_xCalcComponent, UNO_QUERY_THROW )->dispose(); + test::BootstrapFixture::tearDown(); +} + +CPPUNIT_TEST_SUITE_REGISTRATION(ScMacrosTest); + +CPPUNIT_PLUGIN_IMPLEMENT(); + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |