summaryrefslogtreecommitdiff
path: root/sw/qa/extras/mailmerge/mailmerge.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'sw/qa/extras/mailmerge/mailmerge.cxx')
-rw-r--r--sw/qa/extras/mailmerge/mailmerge.cxx112
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: */