/* -*- 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 "helper/qahelper.hxx" #include "helper/shared_test_impl.hxx" #include "docsh.hxx" #include "postit.hxx" #include "patattr.hxx" #include "scitems.hxx" #include "document.hxx" #include "cellform.hxx" using namespace ::com::sun::star; using namespace ::com::sun::star::uno; class ScExportTest : public ScBootstrapFixture { public: ScExportTest(); virtual void setUp(); virtual void tearDown(); ScDocShellRef saveAndReloadPassword( ScDocShell*, const OUString&, const OUString&, const OUString&, sal_uLong ); void test(); void testPasswordExport(); void testConditionalFormatExportODS(); void testConditionalFormatExportXLSX(); void testColorScaleExportODS(); void testColorScaleExportXLSX(); void testDataBarExportODS(); void testDataBarExportXLSX(); void testMiscRowHeightExport(); CPPUNIT_TEST_SUITE(ScExportTest); CPPUNIT_TEST(test); #if !defined(MACOSX) && !defined(DRAGONFLY) CPPUNIT_TEST(testPasswordExport); #endif CPPUNIT_TEST(testConditionalFormatExportODS); CPPUNIT_TEST(testConditionalFormatExportXLSX); CPPUNIT_TEST(testColorScaleExportODS); CPPUNIT_TEST(testColorScaleExportXLSX); CPPUNIT_TEST(testMiscRowHeightExport); CPPUNIT_TEST_SUITE_END(); private: uno::Reference m_xCalcComponent; }; ScDocShellRef ScExportTest::saveAndReloadPassword(ScDocShell* pShell, const OUString &rFilter, const OUString &rUserData, const OUString& rTypeName, sal_uLong nFormatType) { utl::TempFile aTempFile; aTempFile.EnableKillingFile(); SfxMedium aStoreMedium( aTempFile.GetURL(), STREAM_STD_WRITE ); sal_uInt32 nExportFormat = 0; if (nFormatType == ODS_FORMAT_TYPE) nExportFormat = SFX_FILTER_EXPORT | SFX_FILTER_USESOPTIONS; SfxFilter* pExportFilter = new SfxFilter( rFilter, OUString(), nFormatType, nExportFormat, rTypeName, 0, OUString(), rUserData, OUString("private:factory/scalc*") ); pExportFilter->SetVersion(SOFFICE_FILEFORMAT_CURRENT); aStoreMedium.SetFilter(pExportFilter); SfxItemSet* pExportSet = aStoreMedium.GetItemSet(); uno::Sequence< beans::NamedValue > aEncryptionData = comphelper::OStorageHelper::CreatePackageEncryptionData( OUString("test") ); uno::Any xEncryptionData; xEncryptionData <<= aEncryptionData; pExportSet->Put(SfxUnoAnyItem(SID_ENCRYPTIONDATA, xEncryptionData)); uno::Reference< embed::XStorage > xMedStorage = aStoreMedium.GetStorage(); ::comphelper::OStorageHelper::SetCommonStorageEncryptionData( xMedStorage, aEncryptionData ); pShell->DoSaveAs( aStoreMedium ); pShell->DoClose(); //std::cout << "File: " << aTempFile.GetURL() << std::endl; sal_uInt32 nFormat = 0; if (nFormatType == ODS_FORMAT_TYPE) nFormat = SFX_FILTER_IMPORT | SFX_FILTER_USESOPTIONS; OUString aPass("test"); return load(aTempFile.GetURL(), rFilter, rUserData, rTypeName, nFormatType, nFormat, SOFFICE_FILEFORMAT_CURRENT, &aPass); } void ScExportTest::test() { ScDocShell* pShell = new ScDocShell( SFXMODEL_STANDARD | SFXMODEL_DISABLE_EMBEDDED_SCRIPTS | SFXMODEL_DISABLE_DOCUMENT_RECOVERY); pShell->DoInitNew(); ScDocument* pDoc = pShell->GetDocument(); pDoc->SetValue(0,0,0, 1.0); CPPUNIT_ASSERT(pDoc); ScDocShellRef xDocSh = saveAndReload( pShell, ODS ); CPPUNIT_ASSERT(xDocSh.Is()); ScDocument* pLoadedDoc = xDocSh->GetDocument(); double aVal = pLoadedDoc->GetValue(0,0,0); ASSERT_DOUBLES_EQUAL(aVal, 1.0); } void ScExportTest::testPasswordExport() { ScDocShell* pShell = new ScDocShell( SFXMODEL_STANDARD | SFXMODEL_DISABLE_EMBEDDED_SCRIPTS | SFXMODEL_DISABLE_DOCUMENT_RECOVERY); pShell->DoInitNew(); ScDocument* pDoc = pShell->GetDocument(); pDoc->SetValue(0,0,0, 1.0); CPPUNIT_ASSERT(pDoc); sal_Int32 nFormat = ODS; OUString aFilterName(getFileFormats()[nFormat].pFilterName, strlen(getFileFormats()[nFormat].pFilterName), RTL_TEXTENCODING_UTF8) ; OUString aFilterType(getFileFormats()[nFormat].pTypeName, strlen(getFileFormats()[nFormat].pTypeName), RTL_TEXTENCODING_UTF8); ScDocShellRef xDocSh = saveAndReloadPassword(pShell, aFilterName, OUString(), aFilterType, getFileFormats()[nFormat].nFormatType); CPPUNIT_ASSERT(xDocSh.Is()); ScDocument* pLoadedDoc = xDocSh->GetDocument(); double aVal = pLoadedDoc->GetValue(0,0,0); ASSERT_DOUBLES_EQUAL(aVal, 1.0); xDocSh->DoClose(); } void ScExportTest::testConditionalFormatExportODS() { ScDocShellRef xShell = loadDoc("new_cond_format_test.", ODS); CPPUNIT_ASSERT(xShell.Is()); ScDocShellRef xDocSh = saveAndReload(&(*xShell), ODS); CPPUNIT_ASSERT(xDocSh.Is()); ScDocument* pDoc = xDocSh->GetDocument(); OUString aCSVFile("new_cond_format_test."); OUString aCSVPath; createCSVPath( aCSVFile, aCSVPath ); testCondFile(aCSVPath, pDoc, 0); xDocSh->DoClose(); } void ScExportTest::testConditionalFormatExportXLSX() { ScDocShellRef xShell = loadDoc("new_cond_format_test.", XLSX); CPPUNIT_ASSERT(xShell.Is()); ScDocShellRef xDocSh = saveAndReload(&(*xShell), XLSX); CPPUNIT_ASSERT(xDocSh.Is()); ScDocument* pDoc = xDocSh->GetDocument(); OUString aCSVFile("new_cond_format_test."); OUString aCSVPath; createCSVPath( aCSVFile, aCSVPath ); testCondFile(aCSVPath, pDoc, 0); xDocSh->DoClose(); } void ScExportTest::testColorScaleExportODS() { ScDocShellRef xShell = loadDoc("colorscale.", ODS); CPPUNIT_ASSERT(xShell.Is()); ScDocShellRef xDocSh = saveAndReload(xShell, ODS); CPPUNIT_ASSERT(xDocSh.Is()); ScDocument* pDoc = xDocSh->GetDocument(); CPPUNIT_ASSERT(pDoc); testColorScale2Entry_Impl(pDoc); testColorScale3Entry_Impl(pDoc); xDocSh->DoClose(); } void ScExportTest::testColorScaleExportXLSX() { ScDocShellRef xShell = loadDoc("colorscale.", XLSX); CPPUNIT_ASSERT(xShell.Is()); ScDocShellRef xDocSh = saveAndReload(xShell, XLSX); CPPUNIT_ASSERT(xDocSh.Is()); ScDocument* pDoc = xDocSh->GetDocument(); CPPUNIT_ASSERT(pDoc); testColorScale2Entry_Impl(pDoc); testColorScale3Entry_Impl(pDoc); xDocSh->DoClose(); } void ScExportTest::testDataBarExportODS() { ScDocShellRef xShell = loadDoc("databar.", ODS); CPPUNIT_ASSERT(xShell.Is()); ScDocShellRef xDocSh = saveAndReload(xShell, ODS); CPPUNIT_ASSERT(xDocSh.Is()); ScDocument* pDoc = xDocSh->GetDocument(); CPPUNIT_ASSERT(pDoc); testDataBar_Impl(pDoc); xDocSh->DoClose(); } void ScExportTest::testDataBarExportXLSX() { ScDocShellRef xShell = loadDoc("databar.", XLSX); CPPUNIT_ASSERT(xShell.Is()); ScDocShellRef xDocSh = saveAndReload(xShell, XLSX); CPPUNIT_ASSERT(xDocSh.Is()); ScDocument* pDoc = xDocSh->GetDocument(); CPPUNIT_ASSERT(pDoc); testDataBar_Impl(pDoc); xDocSh->DoClose(); } void ScExportTest::testMiscRowHeightExport() { TestParam::RowData DfltRowData[] = { { 0, 4, 0, 529, 0, false }, { 5, 10, 0, 1058, 0, false }, { 17, 20, 0, 1767, 0, false }, // check last couple of row in document to ensure // they are 5.29mm ( effective default row xlsx height ) { 1048573, 1048575, 0, 529, 0, false }, }; TestParam::RowData EmptyRepeatRowData[] = { // rows 0-4, 5-10, 17-20 are all set at various // heights, there is no content in the rows, there // was a bug where only the first row ( of repeated rows ) // was set after export { 0, 4, 0, 529, 0, false }, { 5, 10, 0, 1058, 0, false }, { 17, 20, 0, 1767, 0, false }, }; TestParam aTestValues[] = { // Checks that some distributed ( non-empty ) heights remain set after export (roundtrip) // additionally there is effectively a default row height ( 5.29 mm ). So we test the // unset rows at the end of the document to ensure the effective xlsx default height // is set there too. { "miscrowheights.", XLSX, XLSX, SAL_N_ELEMENTS(DfltRowData), DfltRowData }, // Checks that some distributed ( non-empty ) heights remain set after export (to xls) { "miscrowheights.", XLSX, XLS, SAL_N_ELEMENTS(DfltRowData), DfltRowData }, // Checks that repreated rows ( of various heights ) remain set after export ( to xlsx ) { "miscemptyrepeatedrowheights.", ODS, XLSX, SAL_N_ELEMENTS(EmptyRepeatRowData), EmptyRepeatRowData }, // Checks that repreated rows ( of various heights ) remain set after export ( to xls ) { "miscemptyrepeatedrowheights.", ODS, XLS, SAL_N_ELEMENTS(EmptyRepeatRowData), EmptyRepeatRowData }, }; miscRowHeightsTest( aTestValues, SAL_N_ELEMENTS(aTestValues) ); } ScExportTest::ScExportTest() : ScBootstrapFixture("/sc/qa/unit/data") { } void ScExportTest::setUp() { test::BootstrapFixture::setUp(); // This is a bit of a fudge, we do this to ensure that ScGlobals::ensure, // which is a private symbol to us, gets called m_xCalcComponent = getMultiServiceFactory()->createInstance("com.sun.star.comp.Calc.SpreadsheetDocument"); CPPUNIT_ASSERT_MESSAGE("no calc component!", m_xCalcComponent.is()); } void ScExportTest::tearDown() { uno::Reference< lang::XComponent >( m_xCalcComponent, UNO_QUERY_THROW )->dispose(); test::BootstrapFixture::tearDown(); } CPPUNIT_TEST_SUITE_REGISTRATION(ScExportTest); CPPUNIT_PLUGIN_IMPLEMENT(); /* vim:set shiftwidth=4 softtabstop=4 expandtab: */