diff options
Diffstat (limited to 'sc/qa/unit/helper/qahelper.cxx')
-rw-r--r-- | sc/qa/unit/helper/qahelper.cxx | 251 |
1 files changed, 251 insertions, 0 deletions
diff --git a/sc/qa/unit/helper/qahelper.cxx b/sc/qa/unit/helper/qahelper.cxx new file mode 100644 index 000000000000..b330f2c5fffb --- /dev/null +++ b/sc/qa/unit/helper/qahelper.cxx @@ -0,0 +1,251 @@ +/* -*- 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 "qahelper.hxx" + +#define __ORCUS_STATIC_LIB +#include <orcus/csv_parser.hpp> + +#include <fstream> + +bool testEqualsWithTolerance( long nVal1, long nVal2, long nTol ) +{ + return ( labs( nVal1 - nVal2 ) <= nTol ); +} + +void loadFile(const OUString& aFileName, std::string& aContent) +{ + OString aOFileName = OUStringToOString(aFileName, RTL_TEXTENCODING_UTF8); + +#ifdef ANDROID + size_t size; + if (strncmp(aOFileName.getStr(), "/assets/", sizeof("/assets/")-1) == 0) { + const char *contents = (const char *) lo_apkentry(aOFileName.getStr(), &size); + if (contents != 0) { + aContent = std::string(contents, size); + return; + } + } +#endif + + std::ifstream aFile(aOFileName.getStr()); + + OStringBuffer aErrorMsg("Could not open csv file: "); + aErrorMsg.append(aOFileName); + CPPUNIT_ASSERT_MESSAGE(aErrorMsg.getStr(), aFile); + std::ostringstream aOStream; + aOStream << aFile.rdbuf(); + aFile.close(); + aContent = aOStream.str(); +} + +void testFile(OUString& aFileName, ScDocument* pDoc, SCTAB nTab, StringType aStringFormat) +{ + csv_handler aHandler(pDoc, nTab, aStringFormat); + orcus::csv_parser_config aConfig; + aConfig.delimiters.push_back(','); + aConfig.delimiters.push_back(';'); + aConfig.text_qualifier = '"'; + aConfig.trim_cell_value = false; + + + std::string aContent; + loadFile(aFileName, aContent); + orcus::csv_parser<csv_handler> parser ( &aContent[0], aContent.size() , aHandler, aConfig); + try + { + parser.parse(); + } + catch (const orcus::csv_parse_error& e) + { + std::cout << "reading csv content file failed: " << e.what() << std::endl; + OStringBuffer aErrorMsg("csv parser error: "); + aErrorMsg.append(e.what()); + CPPUNIT_ASSERT_MESSAGE(aErrorMsg.getStr(), false); + } +} + +void testCondFile(OUString& aFileName, ScDocument* pDoc, SCTAB nTab) +{ + conditional_format_handler aHandler(pDoc, nTab); + orcus::csv_parser_config aConfig; + aConfig.delimiters.push_back(','); + aConfig.delimiters.push_back(';'); + aConfig.text_qualifier = '"'; + std::string aContent; + loadFile(aFileName, aContent); + orcus::csv_parser<conditional_format_handler> parser ( &aContent[0], aContent.size() , aHandler, aConfig); + try + { + parser.parse(); + } + catch (const orcus::csv_parse_error& e) + { + std::cout << "reading csv content file failed: " << e.what() << std::endl; + OStringBuffer aErrorMsg("csv parser error: "); + aErrorMsg.append(e.what()); + CPPUNIT_ASSERT_MESSAGE(aErrorMsg.getStr(), false); + } +} + +ScDocShellRef ScBootstrapFixture::load( bool bReadWrite, + const OUString& rURL, const OUString& rFilter, const OUString &rUserData, + const OUString& rTypeName, unsigned int nFilterFlags, unsigned int nClipboardID, + sal_uIntPtr nFilterVersion, const OUString* pPassword ) +{ + SfxFilter* pFilter = new SfxFilter( + rFilter, + OUString(), nFilterFlags, nClipboardID, rTypeName, 0, OUString(), + rUserData, OUString("private:factory/scalc*")); + pFilter->SetVersion(nFilterVersion); + + ScDocShellRef xDocShRef = new ScDocShell; + xDocShRef->GetDocument()->EnableUserInteraction(false); + SfxMedium* pSrcMed = new SfxMedium(rURL, bReadWrite ? STREAM_STD_READWRITE : STREAM_STD_READ ); + pSrcMed->SetFilter(pFilter); + pSrcMed->UseInteractionHandler(false); + if (pPassword) + { + SfxItemSet* pSet = pSrcMed->GetItemSet(); + pSet->Put(SfxStringItem(SID_PASSWORD, *pPassword)); + } + printf("about to load %s\n", OUStringToOString( rURL, RTL_TEXTENCODING_UTF8 ).getStr() ); + if (!xDocShRef->DoLoad(pSrcMed)) + { + xDocShRef->DoClose(); + // load failed. + xDocShRef.Clear(); + } + + return xDocShRef; +} + +ScDocShellRef ScBootstrapFixture::load( + const OUString& rURL, const OUString& rFilter, const OUString &rUserData, + const OUString& rTypeName, unsigned int nFilterFlags, unsigned int nClipboardID, + sal_uIntPtr nFilterVersion, const OUString* pPassword ) +{ + return load( false, rURL, rFilter, rUserData, rTypeName, nFilterFlags, nClipboardID, nFilterVersion, pPassword ); +} + +ScDocShellRef ScBootstrapFixture::loadDoc( + const OUString& rFileName, sal_Int32 nFormat, bool bReadWrite ) +{ + OUString aFileExtension(aFileFormats[nFormat].pName, strlen(aFileFormats[nFormat].pName), RTL_TEXTENCODING_UTF8 ); + OUString aFilterName(aFileFormats[nFormat].pFilterName, strlen(aFileFormats[nFormat].pFilterName), RTL_TEXTENCODING_UTF8) ; + OUString aFileName; + createFileURL( rFileName, aFileExtension, aFileName ); + OUString aFilterType(aFileFormats[nFormat].pTypeName, strlen(aFileFormats[nFormat].pTypeName), RTL_TEXTENCODING_UTF8); + unsigned int nFormatType = aFileFormats[nFormat].nFormatType; + unsigned int nClipboardId = nFormatType ? SFX_FILTER_IMPORT | SFX_FILTER_USESOPTIONS : 0; + + return load(bReadWrite, aFileName, aFilterName, OUString(), aFilterType, nFormatType, nClipboardId, nFormatType); +} + +void ScBootstrapFixture::createFileURL( + const OUString& aFileBase, const OUString& aFileExtension, OUString& rFilePath) +{ + OUString aSep("/"); + OUStringBuffer aBuffer( getSrcRootURL() ); + aBuffer.append(m_aBaseString).append(aSep).append(aFileExtension); + aBuffer.append(aSep).append(aFileBase).append(aFileExtension); + rFilePath = aBuffer.makeStringAndClear(); +} + +void ScBootstrapFixture::createCSVPath(const OUString& aFileBase, OUString& rCSVPath) +{ + OUStringBuffer aBuffer( getSrcRootPath()); + aBuffer.append(m_aBaseString).append(OUString("/contentCSV/")); + aBuffer.append(aFileBase).append(OUString("csv")); + rCSVPath = aBuffer.makeStringAndClear(); +} + +ScDocShellRef ScBootstrapFixture::saveAndReload( + 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); + 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; + + return load(aTempFile.GetURL(), rFilter, rUserData, rTypeName, nFormatType, nFormat ); +} + +ScDocShellRef ScBootstrapFixture::saveAndReload( ScDocShell* pShell, sal_Int32 nFormat ) +{ + OUString aFilterName(aFileFormats[nFormat].pFilterName, strlen(aFileFormats[nFormat].pFilterName), RTL_TEXTENCODING_UTF8) ; + OUString aFilterType(aFileFormats[nFormat].pTypeName, strlen(aFileFormats[nFormat].pTypeName), RTL_TEXTENCODING_UTF8); + ScDocShellRef xDocSh = saveAndReload(pShell, aFilterName, OUString(), aFilterType, aFileFormats[nFormat].nFormatType); + + CPPUNIT_ASSERT(xDocSh.Is()); + return xDocSh; +} + +void ScBootstrapFixture::miscRowHeightsTest( TestParam* aTestValues, unsigned int numElems ) +{ + for ( unsigned int index=0; index<numElems; ++index ) + { + OUString sFileName = OUString::createFromAscii( aTestValues[ index ].sTestDoc ); + printf("aTestValues[%u] %s\n", index, OUStringToOString( sFileName, RTL_TEXTENCODING_UTF8 ).getStr() ); + int nImportType = aTestValues[ index ].nImportType; + int nExportType = aTestValues[ index ].nExportType; + ScDocShellRef xShell = loadDoc( sFileName, nImportType ); + CPPUNIT_ASSERT(xShell.Is()); + + if ( nExportType != -1 ) + xShell = saveAndReload(&(*xShell), nExportType ); + + CPPUNIT_ASSERT(xShell.Is()); + + ScDocument* pDoc = xShell->GetDocument(); + + for (int i=0; i<aTestValues[ index ].nRowData; ++i) + { + SCROW nRow = aTestValues[ index ].pData[ i].nStartRow; + SCROW nEndRow = aTestValues[ index ].pData[ i ].nEndRow; + SCTAB nTab = aTestValues[ index ].pData[ i ].nTab; + int nExpectedHeight = aTestValues[ index ].pData[ i ].nExpectedHeight; + if ( nExpectedHeight == -1 ) + nExpectedHeight = sc::TwipsToHMM( ScGlobal::nStdRowHeight ); + bool bCheckOpt = ( ( aTestValues[ index ].pData[ i ].nCheck & CHECK_OPTIMAL ) == CHECK_OPTIMAL ); + for ( ; nRow <= nEndRow; ++nRow ) + { + printf("\t checking row %" SAL_PRIdINT32 " for height %d\n", nRow, nExpectedHeight ); + int nHeight = sc::TwipsToHMM( pDoc->GetRowHeight(nRow, nTab, false) ); + if ( bCheckOpt ) + { + bool bOpt = !(pDoc->GetRowFlags( nRow, nTab ) & CR_MANUALSIZE); + CPPUNIT_ASSERT_EQUAL(aTestValues[ index ].pData[ i ].bOptimal, bOpt); + } + CPPUNIT_ASSERT_EQUAL(nExpectedHeight, nHeight); + } + } + xShell->DoClose(); + } +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |