diff options
Diffstat (limited to 'sw/qa/extras/mailmerge/mailmerge.cxx')
-rw-r--r-- | sw/qa/extras/mailmerge/mailmerge.cxx | 112 |
1 files changed, 90 insertions, 22 deletions
diff --git a/sw/qa/extras/mailmerge/mailmerge.cxx b/sw/qa/extras/mailmerge/mailmerge.cxx index 8e13aef44069..4b2e8ef05794 100644 --- a/sw/qa/extras/mailmerge/mailmerge.cxx +++ b/sw/qa/extras/mailmerge/mailmerge.cxx @@ -10,6 +10,7 @@ #include <sal/config.h> #include <set> +#include <vector> #include <swmodeltestbase.hxx> @@ -21,6 +22,8 @@ #include <com/sun/star/text/MailMergeType.hpp> #include <com/sun/star/sdb/XDocumentDataSource.hpp> #include <com/sun/star/text/TextContentAnchorType.hpp> +#include <com/sun/star/sdbc/XRowSet.hpp> +#include <com/sun/star/sdbcx/XRowLocate.hpp> #include <wrtsh.hxx> #include <ndtxt.hxx> @@ -66,20 +69,20 @@ public: * The 'verify' method actually has to execute the mail merge by * calling executeMailMerge() after modifying the job arguments. */ - void executeMailMergeTest(const char* filename, const char* datasource, const char* tablename, bool file) + void executeMailMergeTest(const char* filename, const char* datasource, const char* tablename, bool file, int selection) { + maMMtestFilename = filename; header(); preTest(filename); - load(mpTestDocumentPath, filename); utl::TempFile aTempDir(nullptr, true); const OUString aWorkDir = aTempDir.GetURL(); const OUString aURI( m_directories.getURLFromSrc(mpTestDocumentPath) + OUString::createFromAscii(datasource) ); OUString aDBName = registerDBsource( aURI, aWorkDir ); - initMailMergeJobAndArgs( filename, tablename, aDBName, "LOMM_", aWorkDir, file ); + initMailMergeJobAndArgs( filename, tablename, aDBName, "LOMM_", aWorkDir, file, selection ); - postTest(filename); verify(); + postTest(filename); finish(); ::utl::removeTree(aWorkDir); @@ -105,28 +108,64 @@ public: return aDBName; } + uno::Reference< sdbc::XRowSet > getXResultFromDataset( const char* tablename, const OUString &aDBName ) + { + uno::Reference< sdbc::XRowSet > xCurResultSet; + uno::Reference< uno::XInterface > xInstance = getMultiServiceFactory()->createInstance( "com.sun.star.sdb.RowSet" ); + uno::Reference< beans::XPropertySet > xRowSetPropSet( xInstance, uno::UNO_QUERY ); + assert( xRowSetPropSet.is() && "failed to get XPropertySet interface from RowSet" ); + if (xRowSetPropSet.is()) + { + xRowSetPropSet->setPropertyValue( "DataSourceName", uno::makeAny( aDBName ) ); + xRowSetPropSet->setPropertyValue( "Command", uno::makeAny( OUString::createFromAscii(tablename) ) ); + xRowSetPropSet->setPropertyValue( "CommandType", uno::makeAny( sdb::CommandType::TABLE ) ); + + uno::Reference< sdbc::XRowSet > xRowSet( xInstance, uno::UNO_QUERY ); + if (xRowSet.is()) + xRowSet->execute(); // build ResultSet from properties + xCurResultSet.set( xRowSet, uno::UNO_QUERY ); + assert( xCurResultSet.is() && "failed to build ResultSet" ); + } + return xCurResultSet; + } + void initMailMergeJobAndArgs( const char* filename, const char* tablename, const OUString &aDBName, - const OUString &aPrefix, const OUString &aWorkDir, bool file ) + const OUString &aPrefix, const OUString &aWorkDir, bool file, int nDataSets ) { uno::Reference< task::XJob > xJob( getMultiServiceFactory()->createInstance( "com.sun.star.text.MailMerge" ), uno::UNO_QUERY_THROW ); mxJob.set( xJob ); - int seq_id = 5; - if (tablename) seq_id += 2; - mSeqMailMergeArgs.realloc( seq_id ); - - seq_id = 0; - mSeqMailMergeArgs[ seq_id++ ] = beans::NamedValue( OUString( UNO_NAME_OUTPUT_TYPE ), uno::Any( file ? text::MailMergeType::FILE : text::MailMergeType::SHELL ) ); - mSeqMailMergeArgs[ seq_id++ ] = beans::NamedValue( OUString( UNO_NAME_DOCUMENT_URL ), uno::Any( - ( OUString(m_directories.getURLFromSrc(mpTestDocumentPath) + OUString::createFromAscii(filename)) ) ) ); - mSeqMailMergeArgs[ seq_id++ ] = beans::NamedValue( OUString( UNO_NAME_DATA_SOURCE_NAME ), uno::Any( aDBName ) ); - mSeqMailMergeArgs[ seq_id++ ] = beans::NamedValue( OUString( UNO_NAME_OUTPUT_URL ), uno::Any( aWorkDir ) ); - mSeqMailMergeArgs[ seq_id++ ] = beans::NamedValue( OUString( UNO_NAME_FILE_NAME_PREFIX ), uno::Any( aPrefix )); + std::vector< beans::NamedValue > args; + + args.push_back( beans::NamedValue( OUString( UNO_NAME_OUTPUT_TYPE ), uno::Any( file ? text::MailMergeType::FILE : text::MailMergeType::SHELL ) ) ); + args.push_back( beans::NamedValue( OUString( UNO_NAME_DOCUMENT_URL ), uno::Any( + ( OUString( m_directories.getURLFromSrc(mpTestDocumentPath) + OUString::createFromAscii(filename)) ) ) ) ); + args.push_back( beans::NamedValue( OUString( UNO_NAME_DATA_SOURCE_NAME ), uno::Any( aDBName ) ) ); + args.push_back( beans::NamedValue( OUString( UNO_NAME_OUTPUT_URL ), uno::Any( aWorkDir ) ) ); + args.push_back( beans::NamedValue( OUString( UNO_NAME_FILE_NAME_PREFIX ), uno::Any( aPrefix )) ); + if (tablename) { - mSeqMailMergeArgs[ seq_id++ ] = beans::NamedValue( OUString( UNO_NAME_DAD_COMMAND_TYPE ), uno::Any( sdb::CommandType::TABLE ) ); - mSeqMailMergeArgs[ seq_id++ ] = beans::NamedValue( OUString( UNO_NAME_DAD_COMMAND ), uno::Any( OUString::createFromAscii(tablename) ) ); + args.push_back( beans::NamedValue( OUString( UNO_NAME_DAD_COMMAND_TYPE ), uno::Any( sdb::CommandType::TABLE ) ) ); + args.push_back( beans::NamedValue( OUString( UNO_NAME_DAD_COMMAND ), uno::Any( OUString::createFromAscii(tablename) ) ) ); + } + + if (nDataSets > 0) + { + uno::Reference< sdbc::XRowSet > xCurResultSet = getXResultFromDataset( tablename, aDBName ); + uno::Reference< sdbcx::XRowLocate > xCurRowLocate( xCurResultSet, uno::UNO_QUERY ); + args.push_back( beans::NamedValue( OUString( UNO_NAME_RESULT_SET ), uno::Any( xCurResultSet ) ) ); + std::vector< uno::Any > vResult; + vResult.reserve( nDataSets ); + sal_Int32 i; + for (i = 0, xCurResultSet->first(); i < nDataSets; i++, xCurResultSet->next()) + { + vResult.push_back( uno::Any( xCurRowLocate->getBookmark() ) ); + } + args.push_back( beans::NamedValue( OUString( UNO_NAME_SELECTION ), uno::Any( comphelper::containerToSequence(vResult) ) ) ); } + + mSeqMailMergeArgs = comphelper::containerToSequence( args ); } void executeMailMerge() @@ -152,6 +191,12 @@ public: CPPUNIT_ASSERT(bOk); + // MM via UNO just works with file names. If we load the file on + // Windows before MM uses it, MM won't work, as it's already open. + // Don't move the load before the mail merge execution! + // (see gb_CppunitTest_use_instdir_configuration) + load(mpTestDocumentPath, maMMtestFilename); + if (mnCurOutputType == text::MailMergeType::SHELL) { CPPUNIT_ASSERT(res >>= mxMMComponent); @@ -206,9 +251,10 @@ protected: OUString mailMergeOutputPrefix; sal_Int16 mnCurOutputType; uno::Reference< lang::XComponent > mxMMComponent; + const char* maMMtestFilename; }; -#define DECLARE_MAILMERGE_TEST(TestName, filename, datasource, tablename, file, BaseClass) \ +#define DECLARE_MAILMERGE_TEST(TestName, filename, datasource, tablename, file, BaseClass, selection) \ class TestName : public BaseClass { \ protected: \ virtual OUString getTestName() override { return OUString(#TestName); } \ @@ -218,7 +264,7 @@ protected: CPPUNIT_TEST_SUITE_END(); \ \ void MailMerge() { \ - executeMailMergeTest(filename, datasource, tablename, file); \ + executeMailMergeTest(filename, datasource, tablename, file, selection); \ } \ void verify() override; \ }; \ @@ -227,11 +273,14 @@ protected: // Will generate the resulting document in mxMMDocument. #define DECLARE_SHELL_MAILMERGE_TEST(TestName, filename, datasource, tablename) \ - DECLARE_MAILMERGE_TEST(TestName, filename, datasource, tablename, false, MMTest) + DECLARE_MAILMERGE_TEST(TestName, filename, datasource, tablename, false, MMTest, 0) // Will generate documents as files, use loadMailMergeDocument(). #define DECLARE_FILE_MAILMERGE_TEST(TestName, filename, datasource, tablename) \ - DECLARE_MAILMERGE_TEST(TestName, filename, datasource, tablename, true, MMTest) + DECLARE_MAILMERGE_TEST(TestName, filename, datasource, tablename, true, MMTest, 0) + +#define DECLARE_SHELL_MAILMERGE_TEST_SELECTION(TestName, filename, datasource, tablename, selection) \ + DECLARE_MAILMERGE_TEST(TestName, filename, datasource, tablename, false, MMTest, selection) int MMTest::documentStartPageNumber( int document ) const { // See documentStartPageNumber() . @@ -256,9 +305,11 @@ int MMTest::documentStartPageNumber( int document ) const shell->Pop(false); return page; } + MMTest::MMTest() : SwModelTestBase("/sw/qa/extras/mailmerge/data/", "writer8") , mnCurOutputType(0) + , maMMtestFilename(nullptr) { } @@ -463,5 +514,22 @@ DECLARE_SHELL_MAILMERGE_TEST(testTdf92623, "tdf92623.odt", "10-testing-addresses CPPUNIT_ASSERT_EQUAL(sal_Int32(10), countFieldMarks); } +DECLARE_SHELL_MAILMERGE_TEST_SELECTION(testTdf95292, "linked-labels.odt", "10-testing-addresses.ods", "testing-addresses", 5) +{ + // A document with two labes merged with 5 datasets should result in three pages + executeMailMerge(); + + SwXTextDocument* pTextDoc = dynamic_cast<SwXTextDocument *>( mxComponent.get() ); + CPPUNIT_ASSERT( pTextDoc ); + SwWrtShell *pWrtShell = pTextDoc->GetDocShell()->GetWrtShell(); + CPPUNIT_ASSERT( pWrtShell->IsLabelDoc() ); + + pTextDoc = dynamic_cast<SwXTextDocument *>( mxMMComponent.get() ); + CPPUNIT_ASSERT( pTextDoc ); + pWrtShell = pTextDoc->GetDocShell()->GetWrtShell(); + CPPUNIT_ASSERT( !pWrtShell->IsLabelDoc() ); + CPPUNIT_ASSERT_EQUAL( sal_uInt16( 5 ), pWrtShell->GetPhyPageNum() ); +} + CPPUNIT_PLUGIN_IMPLEMENT(); /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |