office-gobmx/sw/qa/extras/ooxmlimport/ooxmlimport.cxx
Miklos Vajna dd11bca8ab n#777337 testcase
Also remove the #if 0 I forgot to remove previously.

Change-Id: I2cc5e1407c509414c8395d0fd63ab3b379bef04f
2012-08-30 09:12:12 +02:00

808 lines
34 KiB
C++

/*
* Version: MPL 1.1 / GPLv3+ / LGPLv3+
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Initial Developer of the Original Code is
* Miklos Vajna <vmiklos@suse.cz> (SUSE, Inc.)
* Portions created by the Initial Developer are Copyright (C) 2012 the
* Initial Developer. All Rights Reserved.
*
* Contributor(s):
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 3 or later (the "GPLv3+"), or
* the GNU Lesser General Public License Version 3 or later (the "LGPLv3+"),
* in which case the provisions of the GPLv3+ or the LGPLv3+ are applicable
* instead of those above.
*/
#include "../swmodeltestbase.hxx"
#include "bordertest.hxx"
#include <com/sun/star/awt/XBitmap.hpp>
#include <com/sun/star/beans/XPropertySet.hpp>
#include <com/sun/star/document/XEmbeddedObjectSupplier2.hpp>
#include <com/sun/star/drawing/XDrawPageSupplier.hpp>
#include <com/sun/star/lang/XServiceInfo.hpp>
#include <com/sun/star/style/XStyleFamiliesSupplier.hpp>
#include <com/sun/star/text/HoriOrientation.hpp>
#include <com/sun/star/text/SetVariableType.hpp>
#include <com/sun/star/text/TextContentAnchorType.hpp>
#include <com/sun/star/text/WrapTextMode.hpp>
#include <com/sun/star/text/XDependentTextField.hpp>
#include <com/sun/star/text/XFormField.hpp>
#include <com/sun/star/text/XPageCursor.hpp>
#include <com/sun/star/text/XTextFieldsSupplier.hpp>
#include <com/sun/star/text/XTextFrame.hpp>
#include <com/sun/star/text/XTextFramesSupplier.hpp>
#include <com/sun/star/text/XTextViewCursorSupplier.hpp>
#include <com/sun/star/style/ParagraphAdjust.hpp>
#include <vcl/svapp.hxx>
#define TWIP_TO_MM100(TWIP) ((TWIP) >= 0 ? (((TWIP)*127L+36L)/72L) : (((TWIP)*127L-36L)/72L))
using rtl::OString;
using rtl::OUString;
using rtl::OUStringBuffer;
class Test : public SwModelTestBase
{
public:
void testN751054();
void testN751117();
void testN751017();
void testN750935();
void testN757890();
void testFdo49940();
void testN751077();
void testN705956_1();
void testN705956_2();
void testN747461();
void testN750255();
void testN652364();
void testN760764();
void testN764005();
void testSmartart();
void testN764745();
void testN766477();
void testN758883();
void testN766481();
void testN766487();
void testN693238();
void testNumbering1();
void testBnc773061();
void testAllGapsWord();
void testN775906();
void testN775899();
void testN777345();
void testN777337();
CPPUNIT_TEST_SUITE(Test);
#if !defined(MACOSX) && !defined(WNT)
CPPUNIT_TEST(testN751054);
CPPUNIT_TEST(testN751117);
CPPUNIT_TEST(testN751017);
CPPUNIT_TEST(testN750935);
CPPUNIT_TEST(testN757890);
CPPUNIT_TEST(testFdo49940);
CPPUNIT_TEST(testN751077);
CPPUNIT_TEST(testN705956_1);
CPPUNIT_TEST(testN705956_2);
CPPUNIT_TEST(testN747461);
CPPUNIT_TEST(testN750255);
CPPUNIT_TEST(testN652364);
CPPUNIT_TEST(testN760764);
CPPUNIT_TEST(testN764005);
CPPUNIT_TEST(testSmartart);
CPPUNIT_TEST(testN764745);
CPPUNIT_TEST(testN766477);
CPPUNIT_TEST(testN758883);
CPPUNIT_TEST(testN766481);
CPPUNIT_TEST(testN766487);
CPPUNIT_TEST(testN693238);
CPPUNIT_TEST(testNumbering1);
CPPUNIT_TEST(testBnc773061);
CPPUNIT_TEST(testAllGapsWord);
CPPUNIT_TEST(testN775906);
CPPUNIT_TEST(testN775899);
CPPUNIT_TEST(testN777345);
CPPUNIT_TEST(testN777337);
#endif
CPPUNIT_TEST_SUITE_END();
private:
/// Load an OOXML file and make the document available via mxComponent.
void load(const OUString& rURL);
};
void Test::load(const OUString& rFilename)
{
mxComponent = loadFromDesktop(getURLFromSrc("/sw/qa/extras/ooxmlimport/data/") + rFilename);
}
void Test::testN751054()
{
load("n751054.docx");
uno::Reference<drawing::XDrawPageSupplier> xDrawPageSupplier(mxComponent, uno::UNO_QUERY);
uno::Reference<container::XIndexAccess> xDraws(xDrawPageSupplier->getDrawPage(), uno::UNO_QUERY);
uno::Reference<beans::XPropertySet> xPropertySet(xDraws->getByIndex(0), uno::UNO_QUERY);
text::TextContentAnchorType eValue;
xPropertySet->getPropertyValue("AnchorType") >>= eValue;
CPPUNIT_ASSERT(eValue != text::TextContentAnchorType_AS_CHARACTER);
}
void Test::testN751117()
{
load("n751117.docx");
uno::Reference<drawing::XDrawPageSupplier> xDrawPageSupplier(mxComponent, uno::UNO_QUERY);
uno::Reference<container::XIndexAccess> xDraws(xDrawPageSupplier->getDrawPage(), uno::UNO_QUERY);
// First shape: the end should be an arrow, should be rotated and should be flipped.
uno::Reference<beans::XPropertySet> xPropertySet(xDraws->getByIndex(0), uno::UNO_QUERY);
OUString aValue;
xPropertySet->getPropertyValue("LineEndName") >>= aValue;
CPPUNIT_ASSERT(aValue.indexOf("Arrow") != -1);
sal_Int32 nValue = 0;
xPropertySet->getPropertyValue("RotateAngle") >>= nValue;
CPPUNIT_ASSERT_EQUAL(sal_Int32(90 * 100), nValue);
uno::Reference<drawing::XShape> xShape(xPropertySet, uno::UNO_QUERY);
awt::Size aActualSize(xShape->getSize());
CPPUNIT_ASSERT(aActualSize.Width < 0);
// The second shape should be a line
uno::Reference<lang::XServiceInfo> xServiceInfo(xDraws->getByIndex(1), uno::UNO_QUERY);
CPPUNIT_ASSERT(xServiceInfo->supportsService("com.sun.star.drawing.LineShape"));
}
void Test::testN751017()
{
load("n751017.docx");
uno::Reference<text::XTextFieldsSupplier> xTextFieldsSupplier(mxComponent, uno::UNO_QUERY);
uno::Reference<container::XNameAccess> xMasters(xTextFieldsSupplier->getTextFieldMasters());
// Make sure we have a variable named foo.
CPPUNIT_ASSERT(xMasters->hasByName("com.sun.star.text.FieldMaster.SetExpression.foo"));
uno::Reference<container::XEnumerationAccess> xFieldsAccess(xTextFieldsSupplier->getTextFields());
uno::Reference<container::XEnumeration> xFields(xFieldsAccess->createEnumeration());
bool bFoundSet(false), bFoundGet(false);
while (xFields->hasMoreElements())
{
uno::Reference<lang::XServiceInfo> xServiceInfo(xFields->nextElement(), uno::UNO_QUERY);
uno::Reference<beans::XPropertySet> xPropertySet(xServiceInfo, uno::UNO_QUERY);
sal_Int16 nValue = 0;
OUString aValue;
if (xServiceInfo->supportsService("com.sun.star.text.TextField.SetExpression"))
{
bFoundSet = true;
uno::Reference<text::XDependentTextField> xDependentTextField(xServiceInfo, uno::UNO_QUERY);
uno::Reference<beans::XPropertySet> xMasterProps(xDependentTextField->getTextFieldMaster());
// First step: did we set foo to "bar"?
xMasterProps->getPropertyValue("Name") >>= aValue;
CPPUNIT_ASSERT_EQUAL(OUString("foo"), aValue);
xPropertySet->getPropertyValue("SubType") >>= nValue;
CPPUNIT_ASSERT_EQUAL(text::SetVariableType::STRING, nValue);
xPropertySet->getPropertyValue("Content") >>= aValue;
CPPUNIT_ASSERT_EQUAL(OUString("bar"), aValue);
}
else if (xServiceInfo->supportsService("com.sun.star.text.TextField.GetExpression"))
{
// Second step: check the value of foo.
bFoundGet = true;
xPropertySet->getPropertyValue("Content") >>= aValue;
CPPUNIT_ASSERT_EQUAL(OUString("foo"), aValue);
xPropertySet->getPropertyValue("SubType") >>= nValue;
CPPUNIT_ASSERT_EQUAL(text::SetVariableType::STRING, nValue);
xPropertySet->getPropertyValue("CurrentPresentation") >>= aValue;
CPPUNIT_ASSERT_EQUAL(OUString("bar"), aValue);
}
}
CPPUNIT_ASSERT(bFoundSet);
CPPUNIT_ASSERT(bFoundGet);
}
void Test::testN750935()
{
load("n750935.docx");
uno::Reference<frame::XModel> xModel(mxComponent, uno::UNO_QUERY);
uno::Reference<text::XTextViewCursorSupplier> xTextViewCursorSupplier(xModel->getCurrentController(), uno::UNO_QUERY);
uno::Reference<text::XPageCursor> xCursor(xTextViewCursorSupplier->getViewCursor(), uno::UNO_QUERY);
xCursor->jumpToLastPage();
// Some page break types were ignores, resulting in less pages.
CPPUNIT_ASSERT_EQUAL(sal_Int16(5), xCursor->getPage());
/*
* The problem was that the header and footer was not shared.
*
* xray ThisComponent.StyleFamilies.PageStyles.Default.FooterIsShared
*/
uno::Reference<beans::XPropertySet> xPropertySet(getStyles("PageStyles")->getByName("Default"), uno::UNO_QUERY);
sal_Bool bValue = false;
xPropertySet->getPropertyValue("HeaderIsShared") >>= bValue;
CPPUNIT_ASSERT_EQUAL(sal_Bool(true), bValue);
xPropertySet->getPropertyValue("FooterIsShared") >>= bValue;
CPPUNIT_ASSERT_EQUAL(sal_Bool(true), bValue);
}
void Test::testN757890()
{
load("n757890.docx");
// The w:pStyle token affected the text outside the textbox.
uno::Reference<text::XTextDocument> xTextDocument(mxComponent, uno::UNO_QUERY);
uno::Reference<container::XEnumerationAccess> xParaEnumAccess(xTextDocument->getText(), uno::UNO_QUERY);
uno::Reference<container::XEnumeration> xParaEnum = xParaEnumAccess->createEnumeration();
uno::Reference<beans::XPropertySet> xPara(xParaEnum->nextElement(), uno::UNO_QUERY);
OUString aValue;
xPara->getPropertyValue("ParaStyleName") >>= aValue;
CPPUNIT_ASSERT_EQUAL(OUString("Heading 1"), aValue);
// This wan't centered
uno::Reference<text::XTextFramesSupplier> xTextFramesSupplier(mxComponent, uno::UNO_QUERY);
uno::Reference<container::XIndexAccess> xIndexAccess(xTextFramesSupplier->getTextFrames(), uno::UNO_QUERY);
uno::Reference<beans::XPropertySet> xFrame(xIndexAccess->getByIndex(0), uno::UNO_QUERY);
sal_Int16 nValue;
xFrame->getPropertyValue("HoriOrient") >>= nValue;
CPPUNIT_ASSERT_EQUAL(text::HoriOrientation::CENTER, nValue);
}
void Test::testFdo49940()
{
load("fdo49940.docx");
uno::Reference<text::XTextDocument> xTextDocument(mxComponent, uno::UNO_QUERY);
uno::Reference<container::XEnumerationAccess> xParaEnumAccess(xTextDocument->getText(), uno::UNO_QUERY);
uno::Reference<container::XEnumeration> xParaEnum = xParaEnumAccess->createEnumeration();
uno::Reference<beans::XPropertySet> xPara(xParaEnum->nextElement(), uno::UNO_QUERY);
OUString aValue;
xPara->getPropertyValue("PageStyleName") >>= aValue;
CPPUNIT_ASSERT_EQUAL(OUString("First Page"), aValue);
}
void Test::testN751077()
{
load( "n751077.docx" );
/*
enum = ThisComponent.Text.createEnumeration
enum.NextElement
para = enum.NextElement
xray para.String
xray para.PageStyleName
*/
uno::Reference<uno::XInterface> paragraph(getParagraph( 2, "TEXT1" ));
// we want to test the paragraph is on the first page (it was put onto another page without the fix),
// use a small trick and instead of checking the page layout, check the page style
OUString pageStyle = getProperty< OUString >( paragraph, "PageStyleName" );
CPPUNIT_ASSERT_EQUAL( OUString( "First Page" ), pageStyle );
}
void Test::testN705956_1()
{
load( "n705956-1.docx" );
/*
Get the first image in the document and check it's the one image in the document.
It should be also anchored inline (as character).
image = ThisComponent.DrawPage.getByIndex(0)
graphic = image.Graphic
xray graphic.Size
xray image.AnchorType
*/
uno::Reference<text::XTextDocument> textDocument(mxComponent, uno::UNO_QUERY);
uno::Reference<drawing::XDrawPageSupplier> drawPageSupplier(textDocument, uno::UNO_QUERY);
uno::Reference<drawing::XDrawPage> drawPage = drawPageSupplier->getDrawPage();
CPPUNIT_ASSERT_EQUAL( sal_Int32( 1 ), drawPage->getCount());
uno::Reference<drawing::XShape> image;
drawPage->getByIndex(0) >>= image;
uno::Reference<beans::XPropertySet> imageProperties(image, uno::UNO_QUERY);
uno::Reference<graphic::XGraphic> graphic;
imageProperties->getPropertyValue( "Graphic" ) >>= graphic;
uno::Reference<awt::XBitmap> bitmap(graphic, uno::UNO_QUERY);
CPPUNIT_ASSERT_EQUAL( static_cast<sal_Int32>(120), bitmap->getSize().Width );
CPPUNIT_ASSERT_EQUAL( static_cast<sal_Int32>(106), bitmap->getSize().Height );
text::TextContentAnchorType anchorType;
imageProperties->getPropertyValue( "AnchorType" ) >>= anchorType;
CPPUNIT_ASSERT_EQUAL( text::TextContentAnchorType_AS_CHARACTER, anchorType );
}
void Test::testN705956_2()
{
load( "n705956-2.docx" );
/*
<v:shapetype> must be global, reachable even from <v:shape> inside another <w:pict>
image = ThisComponent.DrawPage.getByIndex(0)
xray image.FillColor
*/
uno::Reference<text::XTextDocument> textDocument(mxComponent, uno::UNO_QUERY);
uno::Reference<drawing::XDrawPageSupplier> drawPageSupplier(textDocument, uno::UNO_QUERY);
uno::Reference<drawing::XDrawPage> drawPage = drawPageSupplier->getDrawPage();
uno::Reference<drawing::XShape> image;
drawPage->getByIndex(0) >>= image;
uno::Reference<beans::XPropertySet> imageProperties(image, uno::UNO_QUERY);
sal_Int32 fillColor;
imageProperties->getPropertyValue( "FillColor" ) >>= fillColor;
CPPUNIT_ASSERT_EQUAL( sal_Int32( 0xc0504d ), fillColor );
}
void Test::testN747461()
{
load( "n747461.docx" );
/*
The document contains 3 images (Red, Black, Green, in this order), with explicit
w:relativeHeight (300, 0, 225763766). Check that they are in the right ZOrder
after they are loaded.
*/
uno::Reference<text::XTextDocument> textDocument(mxComponent, uno::UNO_QUERY);
uno::Reference<drawing::XDrawPageSupplier> drawPageSupplier(textDocument, uno::UNO_QUERY);
uno::Reference<drawing::XDrawPage> drawPage = drawPageSupplier->getDrawPage();
uno::Reference<drawing::XShape> image1, image2, image3;
drawPage->getByIndex( 0 ) >>= image1;
drawPage->getByIndex( 1 ) >>= image2;
drawPage->getByIndex( 2 ) >>= image3;
sal_Int32 zOrder1, zOrder2, zOrder3;
OUString descr1, descr2, descr3;
uno::Reference<beans::XPropertySet> imageProperties1(image1, uno::UNO_QUERY);
imageProperties1->getPropertyValue( "ZOrder" ) >>= zOrder1;
imageProperties1->getPropertyValue( "Description" ) >>= descr1;
uno::Reference<beans::XPropertySet> imageProperties2(image2, uno::UNO_QUERY);
imageProperties2->getPropertyValue( "ZOrder" ) >>= zOrder2;
imageProperties2->getPropertyValue( "Description" ) >>= descr2;
uno::Reference<beans::XPropertySet> imageProperties3(image3, uno::UNO_QUERY);
imageProperties3->getPropertyValue( "ZOrder" ) >>= zOrder3;
imageProperties3->getPropertyValue( "Description" ) >>= descr3;
CPPUNIT_ASSERT_EQUAL( sal_Int32( 0 ), zOrder1 );
CPPUNIT_ASSERT_EQUAL( sal_Int32( 1 ), zOrder2 );
CPPUNIT_ASSERT_EQUAL( sal_Int32( 2 ), zOrder3 );
CPPUNIT_ASSERT_EQUAL( OUString( "Black" ), descr1 );
CPPUNIT_ASSERT_EQUAL( OUString( "Red" ), descr2 );
CPPUNIT_ASSERT_EQUAL( OUString( "Green" ), descr3 );
}
void Test::testN750255()
{
load( "n750255.docx" );
/*
Column break without columns on the page is a page break, so check those paragraphs
are on page 2 (page style 'Converted1') and page 3 (page style 'Converted2')
enum = ThisComponent.Text.createEnumeration
enum.nextElement
para1 = enum.nextElement
xray para1.String
xray para1.PageStyleName
para2 = enum.nextElement
xray para2.String
xray para2.PageStyleName
*/
// get the 2nd and 3rd paragraph
uno::Reference<uno::XInterface> paragraph1(getParagraph( 2, "one" ));
uno::Reference<uno::XInterface> paragraph2(getParagraph( 3, "two" ));
OUString pageStyle1 = getProperty< OUString >( paragraph1, "PageStyleName" );
OUString pageStyle2 = getProperty< OUString >( paragraph2, "PageStyleName" );
CPPUNIT_ASSERT_EQUAL( OUString( "Converted1" ), pageStyle1 );
CPPUNIT_ASSERT_EQUAL( OUString( "Converted2" ), pageStyle2 );
}
void Test::testN652364()
{
load( "n652364.docx" );
/*
Related to 750255 above, column break with columns on the page however should be a column break.
enum = ThisComponent.Text.createEnumeration
enum.nextElement
para1 = enum.nextElement
xray para1.String
xray para1.PageStyleName
enum.nextElement
para2 = enum.nextElement
xray para2.String
xray para2.PageStyleName
*/
// get the 2nd and 4th paragraph
uno::Reference<uno::XInterface> paragraph1(getParagraph( 2, "text1" ));
uno::Reference<uno::XInterface> paragraph2(getParagraph( 4, "text2" ));
OUString pageStyle1 = getProperty< OUString >( paragraph1, "PageStyleName" );
OUString pageStyle2 = getProperty< OUString >( paragraph2, "PageStyleName" );
// "Standard" is the style for the first page (2nd is "Converted1").
CPPUNIT_ASSERT_EQUAL( OUString( "Standard" ), pageStyle1 );
CPPUNIT_ASSERT_EQUAL( OUString( "Standard" ), pageStyle2 );
}
void Test::testN760764()
{
load("n760764.docx");
uno::Reference<text::XTextDocument> xTextDocument(mxComponent, uno::UNO_QUERY);
uno::Reference<container::XEnumerationAccess> xParaEnumAccess(xTextDocument->getText(), uno::UNO_QUERY);
uno::Reference<container::XEnumeration> xParaEnum(xParaEnumAccess->createEnumeration());
uno::Reference<container::XEnumerationAccess> xRunEnumAccess(xParaEnum->nextElement(), uno::UNO_QUERY);
uno::Reference<container::XEnumeration> xRunEnum(xRunEnumAccess->createEnumeration());
// Access the second run, which is a textfield
xRunEnum->nextElement();
uno::Reference<beans::XPropertySet> xRun(xRunEnum->nextElement(), uno::UNO_QUERY);
float fValue;
xRun->getPropertyValue("CharHeight") >>= fValue;
// This used to be 11, as character properties were ignored.
CPPUNIT_ASSERT_EQUAL(8.f, fValue);
}
void Test::testN764005()
{
load("n764005.docx");
uno::Reference<drawing::XDrawPageSupplier> xDrawPageSupplier(mxComponent, uno::UNO_QUERY);
uno::Reference<container::XIndexAccess> xDraws(xDrawPageSupplier->getDrawPage(), uno::UNO_QUERY);
uno::Reference<beans::XPropertySet> xPropertySet(xDraws->getByIndex(0), uno::UNO_QUERY);
// The picture in the header wasn't absolutely positioned and wasn't in the background.
text::TextContentAnchorType eValue;
xPropertySet->getPropertyValue("AnchorType") >>= eValue;
CPPUNIT_ASSERT(eValue != text::TextContentAnchorType_AS_CHARACTER);
sal_Bool bValue = sal_True;
xPropertySet->getPropertyValue("Opaque") >>= bValue;
CPPUNIT_ASSERT_EQUAL(sal_False, bValue);
}
void Test::testSmartart()
{
load("smartart.docx");
uno::Reference<drawing::XDrawPageSupplier> xDrawPageSupplier(mxComponent, uno::UNO_QUERY);
uno::Reference<container::XIndexAccess> xDraws(xDrawPageSupplier->getDrawPage(), uno::UNO_QUERY);
CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xDraws->getCount()); // One groupshape in the doc
uno::Reference<container::XIndexAccess> xGroup(xDraws->getByIndex(0), uno::UNO_QUERY);
CPPUNIT_ASSERT_EQUAL(sal_Int32(4), xGroup->getCount()); // 3 rectangles and an arrow in the group
uno::Reference<beans::XPropertySet> xPropertySet(xGroup->getByIndex(1), uno::UNO_QUERY);
sal_Int32 nValue(0);
xPropertySet->getPropertyValue("FillColor") >>= nValue;
CPPUNIT_ASSERT_EQUAL(sal_Int32(0x4f81bd), nValue); // If fill color is right, theme import is OK
uno::Reference<text::XTextRange> xTextRange(xGroup->getByIndex(1), uno::UNO_QUERY);
CPPUNIT_ASSERT_EQUAL(OUString("Sample"), xTextRange->getString()); // Shape has text
uno::Reference<container::XEnumerationAccess> xParaEnumAccess(xTextRange->getText(), uno::UNO_QUERY);
uno::Reference<container::XEnumeration> xParaEnum = xParaEnumAccess->createEnumeration();
xPropertySet.set(xParaEnum->nextElement(), uno::UNO_QUERY);
xPropertySet->getPropertyValue("ParaAdjust") >>= nValue;
CPPUNIT_ASSERT_EQUAL(sal_Int32(style::ParagraphAdjust_CENTER), nValue); // Paragraph properties are imported
}
void Test::testN764745()
{
load( "n764745-alignment.docx" );
/*
shape = ThisComponent.DrawPage.getByIndex(0)
xray shape.AnchorType
xray shape.AnchorPosition.X
xray ThisComponent.StyleFamilies.PageStyles.Default.Width
*/
uno::Reference<drawing::XDrawPageSupplier> xDrawPageSupplier(mxComponent, uno::UNO_QUERY);
uno::Reference<container::XIndexAccess> xDraws(xDrawPageSupplier->getDrawPage(), uno::UNO_QUERY);
uno::Reference<beans::XPropertySet> xPropertySet(xDraws->getByIndex(0), uno::UNO_QUERY);
// The paragraph is right-aligned and the picture does not explicitly specify position,
// so check it's anchored as character and in the right side of the document.
text::TextContentAnchorType anchorType;
xPropertySet->getPropertyValue("AnchorType") >>= anchorType;
CPPUNIT_ASSERT_EQUAL(text::TextContentAnchorType_AS_CHARACTER, anchorType);
awt::Point pos;
xPropertySet->getPropertyValue("AnchorPosition") >>= pos;
uno::Reference<style::XStyleFamiliesSupplier> styleFamiliesSupplier(mxComponent, uno::UNO_QUERY);
uno::Reference<container::XNameAccess> styleFamilies = styleFamiliesSupplier->getStyleFamilies();
uno::Reference<container::XNameAccess> pageStyles;
styleFamilies->getByName("PageStyles") >>= pageStyles;
uno::Reference<uno::XInterface> defaultStyle;
pageStyles->getByName("Default") >>= defaultStyle;
uno::Reference<beans::XPropertySet> styleProperties( defaultStyle, uno::UNO_QUERY );
sal_Int32 width = 0;
styleProperties->getPropertyValue( "Width" ) >>= width;
CPPUNIT_ASSERT( pos.X > width / 2 );
}
void Test::testN766477()
{
/*
* The problem was that the checkbox was not checked.
*
* oParas = ThisComponent.Text.createEnumeration
* oPara = oParas.nextElement
* oRuns = oPara.createEnumeration
* oRun = oRuns.nextElement
* xray oRun.Bookmark.Parameters.ElementNames(0) 'Checkbox_Checked
*/
load("n766477.docx");
uno::Reference<text::XTextDocument> xTextDocument(mxComponent, uno::UNO_QUERY);
uno::Reference<container::XEnumerationAccess> xParaEnumAccess(xTextDocument->getText(), uno::UNO_QUERY);
uno::Reference<container::XEnumeration> xParaEnum(xParaEnumAccess->createEnumeration());
uno::Reference<container::XEnumerationAccess> xRunEnumAccess(xParaEnum->nextElement(), uno::UNO_QUERY);
uno::Reference<container::XEnumeration> xRunEnum(xRunEnumAccess->createEnumeration());
uno::Reference<beans::XPropertySet> xRun(xRunEnum->nextElement(), uno::UNO_QUERY);
uno::Reference<text::XFormField> xFormField(xRun->getPropertyValue("Bookmark"), uno::UNO_QUERY);
uno::Reference<container::XNameContainer> xParameters(xFormField->getParameters());
uno::Sequence<OUString> aElementNames(xParameters->getElementNames());
CPPUNIT_ASSERT_EQUAL(OUString("Checkbox_Checked"), aElementNames[0]);
}
void Test::testN758883()
{
load("n758883.docx");
/*
* The problem was that direct formatting of the paragraph was not applied
* to the numbering. This is easier to test using a layout dump.
*/
OUString aHeight = parseDump("/root/page/body/txt/Special", "nHeight");
CPPUNIT_ASSERT_EQUAL(sal_Int32(220), aHeight.toInt32()); // It was 280
/*
* Next problem was that the page margin contained the width of the page border as well.
*
* xray ThisComponent.StyleFamilies.PageStyles.Default.LeftMargin
*/
uno::Reference<beans::XPropertySet> xPropertySet(getStyles("PageStyles")->getByName("Default"), uno::UNO_QUERY);
sal_Int32 nValue = 0;
xPropertySet->getPropertyValue("LeftMargin") >>= nValue;
CPPUNIT_ASSERT_EQUAL(sal_Int32(794), nValue);
// No assert for the 3rd problem: see the comment in the test doc.
/*
* 4th problem: Wrap type of the textwrape was not 'through'.
*
* xray ThisComponent.DrawPage(0).Surround ' was 2, should be 1
*/
uno::Reference<drawing::XDrawPageSupplier> xDrawPageSupplier(mxComponent, uno::UNO_QUERY);
uno::Reference<container::XIndexAccess> xDraws(xDrawPageSupplier->getDrawPage(), uno::UNO_QUERY);
xPropertySet.set(xDraws->getByIndex(0), uno::UNO_QUERY);
text::WrapTextMode eValue;
xPropertySet->getPropertyValue("Surround") >>= eValue;
CPPUNIT_ASSERT_EQUAL(eValue, text::WrapTextMode_THROUGHT);
/*
* 5th problem: anchor type of the second textbox was wrong.
*
* xray ThisComponent.DrawPage(1).AnchorType ' was 1, should be 4
*/
xPropertySet.set(xDraws->getByIndex(1), uno::UNO_QUERY);
text::TextContentAnchorType eAnchorType;
xPropertySet->getPropertyValue("AnchorType") >>= eAnchorType;
CPPUNIT_ASSERT_EQUAL(text::TextContentAnchorType_AT_CHARACTER, eAnchorType);
// 6th problem: xray ThisComponent.DrawPage(2).AnchorType ' was 2, should be 4
xPropertySet.set(xDraws->getByIndex(2), uno::UNO_QUERY);
xPropertySet->getPropertyValue("AnchorType") >>= eAnchorType;
CPPUNIT_ASSERT_EQUAL(text::TextContentAnchorType_AT_CHARACTER, eAnchorType);
}
void Test::testN766481()
{
/*
* The problem was that we had an additional paragraph before the pagebreak.
*
* oParas = ThisComponent.Text.createEnumeration
* oPara = oParas.nextElement
* oPara = oParas.nextElement
* xray oParas.hasMoreElements ' should be false
*/
load("n766481.docx");
uno::Reference<text::XTextDocument> xTextDocument(mxComponent, uno::UNO_QUERY);
uno::Reference<container::XEnumerationAccess> xParaEnumAccess(xTextDocument->getText(), uno::UNO_QUERY);
uno::Reference<container::XEnumeration> xParaEnum(xParaEnumAccess->createEnumeration());
for (int i = 0; i < 2; ++i)
xParaEnum->nextElement();
CPPUNIT_ASSERT_EQUAL(sal_False, xParaEnum->hasMoreElements());
}
void Test::testN766487()
{
/*
* The problem was that 1) the font size of the first para was too large 2) numbering had no first-line-indent.
*
* oParas = ThisComponent.Text.createEnumeration
* oPara = oParas.nextElement
* oRuns = oPara.createEnumeration
* oRun = oRuns.nextElement
* xray oRun.CharHeight ' 12, was larger
* oPara = oParas.nextElement
* xray oPara.ParaFirstLineIndent ' -635, was 0
*/
load("n766487.docx");
uno::Reference<text::XTextDocument> xTextDocument(mxComponent, uno::UNO_QUERY);
uno::Reference<container::XEnumerationAccess> xParaEnumAccess(xTextDocument->getText(), uno::UNO_QUERY);
uno::Reference<container::XEnumeration> xParaEnum(xParaEnumAccess->createEnumeration());
uno::Reference<container::XEnumerationAccess> xRunEnumAccess(xParaEnum->nextElement(), uno::UNO_QUERY);
uno::Reference<container::XEnumeration> xRunEnum(xRunEnumAccess->createEnumeration());
uno::Reference<beans::XPropertySet> xPropertySet(xRunEnum->nextElement(), uno::UNO_QUERY);
float fValue = 0;
xPropertySet->getPropertyValue("CharHeight") >>= fValue;
CPPUNIT_ASSERT_EQUAL(12.f, fValue);
xPropertySet.set(xParaEnum->nextElement(), uno::UNO_QUERY);
sal_Int32 nValue = 0;
xPropertySet->getPropertyValue("ParaFirstLineIndent") >>= nValue;
CPPUNIT_ASSERT_EQUAL(sal_Int32(TWIP_TO_MM100(-360)), nValue);
}
void Test::testN693238()
{
/*
* The problem was that a continous section break at the end of the doc caused the margins to be ignored.
*
* xray ThisComponent.StyleFamilies.PageStyles.Default.LeftMargin ' was 2000, should be 635
*/
load("n693238.docx");
uno::Reference<beans::XPropertySet> xPropertySet(getStyles("PageStyles")->getByName("Default"), uno::UNO_QUERY);
sal_Int32 nValue = 0;
xPropertySet->getPropertyValue("LeftMargin") >>= nValue;
CPPUNIT_ASSERT_EQUAL(sal_Int32(635), nValue);
}
void Test::testNumbering1()
{
load( "numbering1.docx" );
/* <w:numPr> in the paragraph itself was overriden by <w:numpr> introduced by the paragraph's <w:pStyle>
enum = ThisComponent.Text.createEnumeration
para = enum.NextElement
xray para.NumberingStyleName
numberingstyle = ThisComponent.NumberingRules.getByIndex(6)
xray numberingstyle.name - should match name above
numbering = numberingstyle.getByIndex(0)
xray numbering(11) - should be 4, arabic
note that the indexes may get off as the implementation evolves, C++ code seaches in loops
*/
uno::Reference<text::XTextDocument> xTextDocument(mxComponent, uno::UNO_QUERY);
uno::Reference< text::XTextRange > paragraph(getParagraph( 1, "Text1." ));
OUString numberingStyleName = getProperty< OUString >( paragraph, "NumberingStyleName" );
uno::Reference<text::XNumberingRulesSupplier> xNumberingRulesSupplier(mxComponent, uno::UNO_QUERY);
uno::Reference<container::XIndexAccess> numberingRules(xNumberingRulesSupplier->getNumberingRules(), uno::UNO_QUERY);
uno::Reference<container::XIndexAccess> numberingRule;
for( int i = 0;
i < numberingRules->getCount();
++i )
{
OUString name = getProperty< OUString >( numberingRules->getByIndex( i ), "Name" );
if( name == numberingStyleName )
{
numberingRule.set( numberingRules->getByIndex( i ), uno::UNO_QUERY );
break;
}
}
CPPUNIT_ASSERT( numberingRule.is());
uno::Sequence< beans::PropertyValue > numbering;
numberingRule->getByIndex( 0 ) >>= numbering;
sal_Int16 numberingType = style::NumberingType::NUMBER_NONE;
for( int i = 0;
i < numbering.getLength();
++i )
{
if( numbering[ i ].Name == "NumberingType" )
{
numbering[ i ].Value >>= numberingType;
break;
}
}
CPPUNIT_ASSERT_EQUAL( style::NumberingType::ARABIC, numberingType );
}
void Test::testBnc773061()
{
load( "bnc773061.docx" );
uno::Reference< text::XTextRange > paragraph = getParagraph( 1 );
uno::Reference< text::XTextRange > normal = getRun( paragraph, 1, "Normal " );
uno::Reference< text::XTextRange > raised = getRun( paragraph, 2, "Raised" );
uno::Reference< text::XTextRange > lowered = getRun( paragraph, 4, "Lowered" );
CPPUNIT_ASSERT_EQUAL( sal_Int32( 0 ), getProperty< sal_Int32 >( normal, "CharEscapement" ));
CPPUNIT_ASSERT_EQUAL( sal_Int32( 50 ), getProperty< sal_Int32 >( raised, "CharEscapement" ));
CPPUNIT_ASSERT_EQUAL( sal_Int32( -25 ), getProperty< sal_Int32 >( lowered, "CharEscapement" ));
CPPUNIT_ASSERT_EQUAL( sal_Int32( 100 ), getProperty< sal_Int32 >( normal, "CharEscapementHeight" ));
CPPUNIT_ASSERT_EQUAL( sal_Int32( 100 ), getProperty< sal_Int32 >( raised, "CharEscapementHeight" ));
CPPUNIT_ASSERT_EQUAL( sal_Int32( 100 ), getProperty< sal_Int32 >( lowered, "CharEscapementHeight" ));
}
void Test::testAllGapsWord()
{
load("all_gaps_word.docx");
BorderTest borderTest;
borderTest.testTheBorders(mxComponent);
}
void Test::testN775906()
{
/*
* The problem was that right margin (via direct formatting) erased the left/first margin (inherited from numbering style).
*
* oParas = ThisComponent.Text.createEnumeration
* oPara = oParas.nextElement
* xray oPara.ParaFirstLineIndent ' was 0
* xray oPara.ParaLeftMargin ' was 0
*/
load("n775906.docx");
CPPUNIT_ASSERT_EQUAL(sal_Int32(-635), getProperty<sal_Int32>(getParagraph(1), "ParaFirstLineIndent"));
CPPUNIT_ASSERT_EQUAL(sal_Int32(1905), getProperty<sal_Int32>(getParagraph(1), "ParaLeftMargin"));
}
void Test::testN775899()
{
/*
* The problem was that a floating table wasn't imported as a frame, then it contained fake paragraphs.
*
* ThisComponent.TextFrames.Count ' was 0
* oParas = ThisComponent.TextFrames(0).Text.createEnumeration
* oPara = oParas.nextElement
* oPara.supportsService("com.sun.star.text.TextTable") 'was a fake paragraph
* oParas.hasMoreElements 'was true
*/
load("n775899.docx");
uno::Reference<text::XTextFramesSupplier> xTextFramesSupplier(mxComponent, uno::UNO_QUERY);
uno::Reference<container::XIndexAccess> xIndexAccess(xTextFramesSupplier->getTextFrames(), uno::UNO_QUERY);
CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xIndexAccess->getCount());
uno::Reference<text::XTextFrame> xFrame(xIndexAccess->getByIndex(0), uno::UNO_QUERY);
uno::Reference<container::XEnumerationAccess> xParaEnumAccess(xFrame->getText(), uno::UNO_QUERY);
uno::Reference<container::XEnumeration> xParaEnum = xParaEnumAccess->createEnumeration();
uno::Reference<lang::XServiceInfo> xServiceInfo(xParaEnum->nextElement(), uno::UNO_QUERY);
CPPUNIT_ASSERT_EQUAL(sal_True, xServiceInfo->supportsService("com.sun.star.text.TextTable"));
CPPUNIT_ASSERT_EQUAL(sal_False, xParaEnum->hasMoreElements());
}
void Test::testN777345()
{
// The problem was that v:imagedata inside v:rect was ignored.
load("n777345.docx");
uno::Reference<drawing::XDrawPageSupplier> xDrawPageSupplier(mxComponent, uno::UNO_QUERY);
uno::Reference<container::XIndexAccess> xDraws(xDrawPageSupplier->getDrawPage(), uno::UNO_QUERY);
uno::Reference<document::XEmbeddedObjectSupplier2> xSupplier(xDraws->getByIndex(0), uno::UNO_QUERY);
uno::Reference<graphic::XGraphic> xGraphic = xSupplier->getReplacementGraphic();
Graphic aGraphic(xGraphic);
// If this changes later, feel free to update it, but make sure it's not
// the checksum of a white/transparent placeholder rectangle.
CPPUNIT_ASSERT_EQUAL(sal_uLong(2404338915U), aGraphic.GetChecksum());
}
void Test::testN777337()
{
/*
* The problem was that the top and bottom margin on the first page was only 0.1cm instead of 1.7cm.
*
* oFirst = ThisComponent.StyleFamilies.PageStyles.getByName("First Page")
* xray oFirst.TopMargin
* xray oFirst.BottomMargin
*/
load("n777337.docx");
uno::Reference<beans::XPropertySet> xPropertySet(getStyles("PageStyles")->getByName("First Page"), uno::UNO_QUERY);
CPPUNIT_ASSERT_EQUAL(sal_Int32(1702), getProperty<sal_Int32>(xPropertySet, "TopMargin"));
CPPUNIT_ASSERT_EQUAL(sal_Int32(1702), getProperty<sal_Int32>(xPropertySet, "BottomMargin"));
}
CPPUNIT_TEST_SUITE_REGISTRATION(Test);
CPPUNIT_PLUGIN_IMPLEMENT();
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */