Kaydet (Commit) 813e7136 authored tarafından Kohei Yoshida's avatar Kohei Yoshida

Add test for exporting of chart to xls format.

Change-Id: I49adfcabec4b8bafa8f1b25e7771acca9ccf0ead
üst 51c94094
......@@ -83,6 +83,7 @@ $(eval $(call gb_CppunitTest_use_components,sc_subsequent_export_test,\
framework/util/fwk \
i18npool/util/i18npool \
i18npool/source/search/i18nsearch \
linguistic/source/lng \
oox/util/oox \
package/source/xstor/xstor \
package/util/package2 \
......@@ -103,9 +104,9 @@ $(eval $(call gb_CppunitTest_use_components,sc_subsequent_export_test,\
unotools/util/utl \
unoxml/source/rdf/unordf \
unoxml/source/service/unoxml \
xmloff/util/xo \
xmlsecurity/util/xsec_fw \
xmlsecurity/util/xmlsecurity \
xmloff/util/xo \
))
ifeq ($(OS),WNT)
......
......@@ -39,6 +39,8 @@ $(eval $(call gb_Library_use_libraries,scqahelper,\
sot \
svl \
svt \
svx \
svxcore \
test \
tl \
unotest \
......
......@@ -9,6 +9,9 @@
#include "qahelper.hxx"
#include "csv_handler.hxx"
#include "drwlayer.hxx"
#include "svx/svdpage.hxx"
#include "svx/svdoole2.hxx"
#if defined WNT
#define __ORCUS_STATIC_LIB
......@@ -17,6 +20,14 @@
#include <fstream>
#include <com/sun/star/frame/XModel.hpp>
#include <com/sun/star/text/textfield/Type.hpp>
#include <com/sun/star/chart2/XChartDocument.hpp>
#include <com/sun/star/chart2/data/XDataReceiver.hpp>
using namespace com::sun::star;
using namespace ::com::sun::star::uno;
FileFormat aFileFormats[] = {
{ "ods" , "calc8", "", ODS_FORMAT_TYPE },
{ "xls" , "MS Excel 97", "calc_MS_EXCEL_97", XLS_FORMAT_TYPE },
......@@ -107,6 +118,123 @@ void testCondFile(OUString& aFileName, ScDocument* pDoc, SCTAB nTab)
}
}
const SdrOle2Obj* getSingleChartObject(ScDocument& rDoc, sal_uInt16 nPage)
{
// Retrieve the chart object instance from the 2nd page (for the 2nd sheet).
ScDrawLayer* pDrawLayer = rDoc.GetDrawLayer();
if (!pDrawLayer)
{
cout << "Failed to retrieve the drawing layer object." << endl;
return NULL;
}
const SdrPage* pPage = pDrawLayer->GetPage(nPage);
if (!pPage)
{
cout << "Failed to retrieve the page object." << endl;
return NULL;
}
if (pPage->GetObjCount() != 1)
{
cout << "This page should contain one drawing object." << endl;
return NULL;
}
const SdrObject* pObj = pPage->GetObj(0);
if (!pObj)
{
cout << "Failed to retrieve the drawing object." << endl;
return NULL;
}
if (pObj->GetObjIdentifier() != OBJ_OLE2)
{
cout << "This is not an OLE2 object." << endl;
return NULL;
}
const SdrOle2Obj& rOleObj = static_cast<const SdrOle2Obj&>(*pObj);
if (!rOleObj.IsChart())
{
cout << "This should be a chart object." << endl;
return NULL;
}
return &rOleObj;
}
std::vector<OUString> getChartRangeRepresentations(const SdrOle2Obj& rChartObj)
{
std::vector<OUString> aRangeReps;
// Make sure the chart object has correct range references.
Reference<frame::XModel> xModel = rChartObj.getXModel();
if (!xModel.is())
{
cout << "Failed to get the embedded object interface." << endl;
return aRangeReps;
}
Reference<chart2::XChartDocument> xChartDoc(xModel, UNO_QUERY);
if (!xChartDoc.is())
{
cout << "Failed to get the chart document interface." << endl;
return aRangeReps;
}
Reference<chart2::data::XDataSource> xDataSource(xChartDoc, UNO_QUERY);
if (!xDataSource.is())
{
cout << "Failed to get the data source interface." << endl;
return aRangeReps;
}
Sequence<Reference<chart2::data::XLabeledDataSequence> > xDataSeqs = xDataSource->getDataSequences();
if (!xDataSeqs.getLength())
{
cout << "There should be at least one data sequences." << endl;
return aRangeReps;
}
Reference<chart2::data::XDataReceiver> xDataRec(xChartDoc, UNO_QUERY);
if (!xDataRec.is())
{
cout << "Failed to get the data receiver interface." << endl;
return aRangeReps;
}
Sequence<OUString> aRangeRepSeqs = xDataRec->getUsedRangeRepresentations();
for (sal_Int32 i = 0, n = aRangeRepSeqs.getLength(); i < n; ++i)
aRangeReps.push_back(aRangeRepSeqs[i]);
return aRangeReps;
}
ScRangeList getChartRanges(ScDocument& rDoc, const SdrOle2Obj& rChartObj)
{
std::vector<OUString> aRangeReps = getChartRangeRepresentations(rChartObj);
ScRangeList aRanges;
for (size_t i = 0, n = aRangeReps.size(); i < n; ++i)
{
ScRange aRange;
sal_uInt16 nRes = aRange.Parse(aRangeReps[i], &rDoc, rDoc.GetAddressConvention());
if (nRes & SCA_VALID)
// This is a range address.
aRanges.Append(aRange);
else
{
// Parse it as a single cell address.
ScAddress aAddr;
nRes = aAddr.Parse(aRangeReps[i], &rDoc, rDoc.GetAddressConvention());
CPPUNIT_ASSERT_MESSAGE("Failed to parse a range representation.", (nRes & SCA_VALID));
aRanges.Append(aAddr);
}
}
return aRanges;
}
ScDocShellRef ScBootstrapFixture::load( bool bReadWrite,
const OUString& rURL, const OUString& rFilter, const OUString &rUserData,
const OUString& rTypeName, unsigned int nFilterFlags, unsigned int nClipboardID,
......
......@@ -50,6 +50,9 @@ SC_DLLPUBLIC bool testEqualsWithTolerance( long nVal1, long nVal2, long nTol );
#define CHECK_OPTIMAL 0x1
class SdrOle2Obj;
class ScRangeList;
// data format for row height tests
struct TestParam
{
......@@ -86,7 +89,11 @@ SC_DLLPUBLIC void testFile(OUString& aFileName, ScDocument* pDoc, SCTAB nTab, St
//need own handler because conditional formatting strings must be generated
SC_DLLPUBLIC void testCondFile(OUString& aFileName, ScDocument* pDoc, SCTAB nTab);
SC_DLLPUBLIC void clearRange(ScDocument* pDoc, const ScRange& rRange);
SC_DLLPUBLIC const SdrOle2Obj* getSingleChartObject(ScDocument& rDoc, sal_uInt16 nPage);
SC_DLLPUBLIC std::vector<OUString> getChartRangeRepresentations(const SdrOle2Obj& rChartObj);
SC_DLLPUBLIC ScRangeList getChartRanges(ScDocument& rDoc, const SdrOle2Obj& rChartObj);
inline std::string print(const ScAddress& rAddr)
{
......
......@@ -28,6 +28,8 @@
#include "cellform.hxx"
#include "formulacell.hxx"
#include "svx/svdoole2.hxx"
using namespace ::com::sun::star;
using namespace ::com::sun::star::uno;
......@@ -53,6 +55,7 @@ public:
void testNamedRangeBugfdo62729();
void testInlineArrayXLS();
void testEmbeddedChartXLS();
CPPUNIT_TEST_SUITE(ScExportTest);
CPPUNIT_TEST(test);
......@@ -66,6 +69,7 @@ public:
CPPUNIT_TEST(testMiscRowHeightExport);
CPPUNIT_TEST(testNamedRangeBugfdo62729);
CPPUNIT_TEST(testInlineArrayXLS);
CPPUNIT_TEST(testEmbeddedChartXLS);
CPPUNIT_TEST_SUITE_END();
private:
......@@ -355,6 +359,7 @@ void ScExportTest::testInlineArrayXLS()
CPPUNIT_ASSERT(xShell.Is());
ScDocShellRef xDocSh = saveAndReload(xShell, XLS);
xShell->DoClose();
CPPUNIT_ASSERT(xDocSh.Is());
ScDocument* pDoc = xDocSh->GetDocument();
......@@ -372,6 +377,34 @@ void ScExportTest::testInlineArrayXLS()
xDocSh->DoClose();
}
void ScExportTest::testEmbeddedChartXLS()
{
ScDocShellRef xShell = loadDoc("embedded-chart.", XLS);
CPPUNIT_ASSERT(xShell.Is());
ScDocShellRef xDocSh = saveAndReload(xShell, XLS);
xShell->DoClose();
CPPUNIT_ASSERT(xDocSh.Is());
ScDocument* pDoc = xDocSh->GetDocument();
CPPUNIT_ASSERT(pDoc);
// Make sure the 2nd sheet is named 'Chart1'.
OUString aName;
pDoc->GetName(1, aName);
CPPUNIT_ASSERT_EQUAL(OUString("Chart1"), aName);
const SdrOle2Obj* pOleObj = getSingleChartObject(*pDoc, 1);
CPPUNIT_ASSERT_MESSAGE("Failed to retrieve a chart object from the 2nd sheet.", pOleObj);
ScRangeList aRanges = getChartRanges(*pDoc, *pOleObj);
CPPUNIT_ASSERT_MESSAGE("Label range (B3:B5) not found.", aRanges.In(ScRange(1,2,1,1,4,1)));
CPPUNIT_ASSERT_MESSAGE("Data label (C2) not found.", aRanges.In(ScAddress(2,1,1)));
CPPUNIT_ASSERT_MESSAGE("Data range (C3:C5) not found.", aRanges.In(ScRange(2,2,1,2,4,1)));
xDocSh->DoClose();
}
ScExportTest::ScExportTest()
: ScBootstrapFixture("/sc/qa/unit/data")
{
......
......@@ -18,9 +18,10 @@
#include <sfx2/docfile.hxx>
#include <sfx2/sfxmodelfactory.hxx>
#include <svl/stritem.hxx>
#include "drwlayer.hxx"
#include "svx/svdpage.hxx"
#include "svx/svdoole2.hxx"
#include "editeng/wghtitem.hxx"
#include "editeng/postitem.hxx"
#include "editeng/udlnitem.hxx"
......@@ -33,7 +34,6 @@
#include <dbdata.hxx>
#include "validat.hxx"
#include "formulacell.hxx"
#include "drwlayer.hxx"
#include "userdat.hxx"
#include "dpobject.hxx"
#include "dpsave.hxx"
......@@ -1302,48 +1302,10 @@ void ScFiltersTest::testChartImportODS()
CPPUNIT_ASSERT_EQUAL(OUString("Title"), aName);
// Retrieve the chart object instance from the 2nd page (for the 2nd sheet).
ScDrawLayer* pDrawLayer = pDoc->GetDrawLayer();
CPPUNIT_ASSERT_MESSAGE("Failed to retrieve the drawing layer object.", pDrawLayer);
const SdrPage* pPage = pDrawLayer->GetPage(1); // for the 2nd sheet.
CPPUNIT_ASSERT_MESSAGE("Failed to retrieve the page object.", pPage);
CPPUNIT_ASSERT_MESSAGE("This page should contain one drawing object.", pPage->GetObjCount() == 1);
const SdrObject* pObj = pPage->GetObj(0);
CPPUNIT_ASSERT_MESSAGE("Failed to retrieve the drawing object.", pObj);
CPPUNIT_ASSERT_MESSAGE("This is not an OLE2 object.", pObj->GetObjIdentifier() == OBJ_OLE2);
const SdrOle2Obj& rOleObj = static_cast<const SdrOle2Obj&>(*pObj);
CPPUNIT_ASSERT_MESSAGE("This should be a chart object.", rOleObj.IsChart());
// Make sure the chart object has correct range references.
Reference<frame::XModel> xModel = rOleObj.getXModel();
CPPUNIT_ASSERT_MESSAGE("Failed to get the embedded object interface.", xModel.is());
Reference<chart2::XChartDocument> xChartDoc(xModel, UNO_QUERY);
CPPUNIT_ASSERT_MESSAGE("Failed to get the chart document interface.", xChartDoc.is());
Reference<chart2::data::XDataSource> xDataSource(xChartDoc, UNO_QUERY);
CPPUNIT_ASSERT_MESSAGE("Failed to get the data source interface.", xDataSource.is());
Sequence<Reference<chart2::data::XLabeledDataSequence> > xDataSeqs = xDataSource->getDataSequences();
CPPUNIT_ASSERT_MESSAGE("There should be at least one data sequences.", xDataSeqs.getLength() > 0);
Reference<chart2::data::XDataReceiver> xDataRec(xChartDoc, UNO_QUERY);
CPPUNIT_ASSERT_MESSAGE("Failed to get the data receiver interface.", xDataRec.is());
Sequence<OUString> aRangeReps = xDataRec->getUsedRangeRepresentations();
CPPUNIT_ASSERT_MESSAGE("There should be at least one range representations.", aRangeReps.getLength() > 0);
ScRangeList aRanges;
for (sal_Int32 i = 0, n = aRangeReps.getLength(); i < n; ++i)
{
ScRange aRange;
sal_uInt16 nRes = aRange.Parse(aRangeReps[i], pDoc, pDoc->GetAddressConvention());
if (nRes & SCA_VALID)
// This is a range address.
aRanges.Append(aRange);
else
{
// Parse it as a single cell address.
ScAddress aAddr;
nRes = aAddr.Parse(aRangeReps[i], pDoc, pDoc->GetAddressConvention());
CPPUNIT_ASSERT_MESSAGE("Failed to parse a range representation.", (nRes & SCA_VALID));
aRanges.Append(aAddr);
}
}
const SdrOle2Obj* pOleObj = getSingleChartObject(*pDoc, 1);
CPPUNIT_ASSERT_MESSAGE("Failed to retrieve a chart object from the 2nd sheet.", pOleObj);
ScRangeList aRanges = getChartRanges(*pDoc, *pOleObj);
CPPUNIT_ASSERT_MESSAGE("Data series title cell not found.", aRanges.In(ScAddress(1,0,3))); // B1 on Title
CPPUNIT_ASSERT_MESSAGE("Data series label range not found.", aRanges.In(ScRange(0,1,2,0,3,2))); // A2:A4 on Data
......
......@@ -877,14 +877,8 @@ void lclAddDoubleRefData(
SCsTAB nScTab2, SCsCOL nScCol2, SCsROW nScRow2 )
{
ScComplexRefData aComplexRef;
aComplexRef.InitFlags();
aComplexRef.InitRange(ScRange(nScCol1,nScRow1,nScTab1,nScCol2,nScRow2,nScTab2));
aComplexRef.Ref1.SetFlag3D( true );
aComplexRef.Ref1.nTab = nScTab1;
aComplexRef.Ref1.nCol = nScCol1;
aComplexRef.Ref1.nRow = nScRow1;
aComplexRef.Ref2.nTab = nScTab2;
aComplexRef.Ref2.nCol = nScCol2;
aComplexRef.Ref2.nRow = nScRow2;
if( orArray.GetLen() > 0 )
orArray.AddOpCode( ocUnion );
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment