diff options
Diffstat (limited to 'sw/qa/core/objectpositioning/objectpositioning.cxx')
-rw-r--r-- | sw/qa/core/objectpositioning/objectpositioning.cxx | 289 |
1 files changed, 219 insertions, 70 deletions
diff --git a/sw/qa/core/objectpositioning/objectpositioning.cxx b/sw/qa/core/objectpositioning/objectpositioning.cxx index 2a35a41f1ec2..717d63ded052 100644 --- a/sw/qa/core/objectpositioning/objectpositioning.cxx +++ b/sw/qa/core/objectpositioning/objectpositioning.cxx @@ -12,27 +12,43 @@ #include <com/sun/star/text/VertOrientation.hpp> #include <com/sun/star/drawing/XDrawPageSupplier.hpp> +#include <editeng/ulspitem.hxx> + #include <wrtsh.hxx> #include <unotxdoc.hxx> #include <docsh.hxx> +#include <IDocumentLayoutAccess.hxx> +#include <rootfrm.hxx> +#include <pagefrm.hxx> +#include <sortedobjs.hxx> +#include <anchoredobject.hxx> +#include <flyfrm.hxx> +#include <frmatr.hxx> -constexpr OUStringLiteral DATA_DIRECTORY = u"/sw/qa/core/objectpositioning/data/"; +#include <vcl/scheduler.hxx> +namespace +{ /// Covers sw/source/core/objectpositioning/ fixes. -class SwCoreObjectpositioningTest : public SwModelTestBase +class Test : public SwModelTestBase { +public: + Test() + : SwModelTestBase("/sw/qa/core/objectpositioning/data/") + { + } }; -CPPUNIT_TEST_FIXTURE(SwCoreObjectpositioningTest, testOverlapCrash) +CPPUNIT_TEST_FIXTURE(Test, testOverlapCrash) { // Load a document with 2 images. - load(DATA_DIRECTORY, "overlap-crash.odt"); + createSwDoc("overlap-crash.odt"); // Change their anchor type to to-char. uno::Reference<beans::XPropertySet> xShape1(getShape(1), uno::UNO_QUERY); - xShape1->setPropertyValue("AnchorType", uno::makeAny(text::TextContentAnchorType_AT_CHARACTER)); + xShape1->setPropertyValue("AnchorType", uno::Any(text::TextContentAnchorType_AT_CHARACTER)); uno::Reference<beans::XPropertySet> xShape2(getShape(1), uno::UNO_QUERY); - xShape2->setPropertyValue("AnchorType", uno::makeAny(text::TextContentAnchorType_AT_CHARACTER)); + xShape2->setPropertyValue("AnchorType", uno::Any(text::TextContentAnchorType_AT_CHARACTER)); // Insert a new paragraph at the start. SwXTextDocument* pTextDoc = dynamic_cast<SwXTextDocument*>(mxComponent.get()); @@ -42,43 +58,53 @@ CPPUNIT_TEST_FIXTURE(SwCoreObjectpositioningTest, testOverlapCrash) pWrtShell->SplitNode(); } -CPPUNIT_TEST_FIXTURE(SwCoreObjectpositioningTest, testVertPosFromBottom) +CPPUNIT_TEST_FIXTURE(Test, testImgMoveCrash) +{ + createSwDoc("tdf154863-img-move-crash.docx"); + uno::Reference<drawing::XShape> xShape(getShapeByName(u"Image26"), uno::UNO_QUERY); + uno::Reference<beans::XPropertySet> xShapeProps(xShape, uno::UNO_QUERY); + xShapeProps->setPropertyValue("VertOrient", uno::Any(static_cast<sal_Int32>(0))); + xShapeProps->setPropertyValue("VertOrientPosition", uno::Any(static_cast<sal_Int32>(3000))); + Scheduler::ProcessEventsToIdle(); + // Crash expected before assert if bug exists + CPPUNIT_ASSERT(true); +} + +CPPUNIT_TEST_FIXTURE(Test, testVertPosFromBottom) { // Create a document, insert a shape and position it 1cm above the bottom of the body area. - mxComponent = loadFromDesktop("private:factory/swriter", "com.sun.star.text.TextDocument"); + createSwDoc(); uno::Reference<css::lang::XMultiServiceFactory> xFactory(mxComponent, uno::UNO_QUERY); uno::Reference<drawing::XShape> xShape( xFactory->createInstance("com.sun.star.drawing.RectangleShape"), uno::UNO_QUERY); xShape->setSize(awt::Size(10000, 10000)); uno::Reference<beans::XPropertySet> xShapeProps(xShape, uno::UNO_QUERY); - xShapeProps->setPropertyValue("AnchorType", - uno::makeAny(text::TextContentAnchorType_AT_CHARACTER)); - xShapeProps->setPropertyValue("VertOrient", uno::makeAny(text::VertOrientation::NONE)); + xShapeProps->setPropertyValue("AnchorType", uno::Any(text::TextContentAnchorType_AT_CHARACTER)); + xShapeProps->setPropertyValue("VertOrient", uno::Any(text::VertOrientation::NONE)); xShapeProps->setPropertyValue("VertOrientRelation", - uno::makeAny(text::RelOrientation::PAGE_PRINT_AREA_BOTTOM)); - xShapeProps->setPropertyValue("VertOrientPosition", - uno::makeAny(static_cast<sal_Int32>(-11000))); + uno::Any(text::RelOrientation::PAGE_PRINT_AREA_BOTTOM)); + xShapeProps->setPropertyValue("VertOrientPosition", uno::Any(static_cast<sal_Int32>(-11000))); uno::Reference<drawing::XDrawPageSupplier> xDrawPageSupplier(mxComponent, uno::UNO_QUERY); xDrawPageSupplier->getDrawPage()->add(xShape); // Verify that the distance between the body and anchored object bottom is indeed around 1cm. xmlDocUniquePtr pXmlDoc = parseLayoutDump(); - sal_Int32 nBodyBottom = getXPath(pXmlDoc, "//body/infos/bounds", "bottom").toInt32(); + sal_Int32 nBodyBottom = getXPath(pXmlDoc, "//body/infos/bounds"_ostr, "bottom"_ostr).toInt32(); sal_Int32 nAnchoredBottom - = getXPath(pXmlDoc, "//SwAnchoredDrawObject/bounds", "bottom").toInt32(); + = getXPath(pXmlDoc, "//anchored/SwAnchoredDrawObject/bounds"_ostr, "bottom"_ostr).toInt32(); // Without the accompanying fix in place, this test would have failed with: - // - Expected: 564 + // - Expected: 565 // - Actual : 9035 // i.e. the vertical position was from-top, not from-bottom. - CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(564), nBodyBottom - nAnchoredBottom); + CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(565), nBodyBottom - nAnchoredBottom); } -CPPUNIT_TEST_FIXTURE(SwCoreObjectpositioningTest, testVertAlignBottomMargin) +CPPUNIT_TEST_FIXTURE(Test, testVertAlignBottomMargin) { // Create a document, insert three shapes and align it the bottom,center,top of page print area bottom. // The size of shapes are 284 ~ 0.5cm // The height of page print area bottom is 1134 ~ 2cm - mxComponent = loadFromDesktop("private:factory/swriter", "com.sun.star.text.TextDocument"); + createSwDoc(); uno::Reference<css::lang::XMultiServiceFactory> xFactory(mxComponent, uno::UNO_QUERY); //Create first shape and align bottom of page print area bottom. @@ -87,10 +113,10 @@ CPPUNIT_TEST_FIXTURE(SwCoreObjectpositioningTest, testVertAlignBottomMargin) xShapeBottom->setSize(awt::Size(500, 500)); uno::Reference<beans::XPropertySet> xShapePropsBottom(xShapeBottom, uno::UNO_QUERY); xShapePropsBottom->setPropertyValue("AnchorType", - uno::makeAny(text::TextContentAnchorType_AT_CHARACTER)); - xShapePropsBottom->setPropertyValue("VertOrient", uno::makeAny(text::VertOrientation::BOTTOM)); + uno::Any(text::TextContentAnchorType_AT_CHARACTER)); + xShapePropsBottom->setPropertyValue("VertOrient", uno::Any(text::VertOrientation::BOTTOM)); xShapePropsBottom->setPropertyValue("VertOrientRelation", - uno::makeAny(text::RelOrientation::PAGE_PRINT_AREA_BOTTOM)); + uno::Any(text::RelOrientation::PAGE_PRINT_AREA_BOTTOM)); uno::Reference<drawing::XDrawPageSupplier> xDrawPageSupplierBottom(mxComponent, uno::UNO_QUERY); xDrawPageSupplierBottom->getDrawPage()->add(xShapeBottom); @@ -100,10 +126,10 @@ CPPUNIT_TEST_FIXTURE(SwCoreObjectpositioningTest, testVertAlignBottomMargin) xShapeCenter->setSize(awt::Size(500, 500)); uno::Reference<beans::XPropertySet> xShapePropsCenter(xShapeCenter, uno::UNO_QUERY); xShapePropsCenter->setPropertyValue("AnchorType", - uno::makeAny(text::TextContentAnchorType_AT_CHARACTER)); - xShapePropsCenter->setPropertyValue("VertOrient", uno::makeAny(text::VertOrientation::CENTER)); + uno::Any(text::TextContentAnchorType_AT_CHARACTER)); + xShapePropsCenter->setPropertyValue("VertOrient", uno::Any(text::VertOrientation::CENTER)); xShapePropsCenter->setPropertyValue("VertOrientRelation", - uno::makeAny(text::RelOrientation::PAGE_PRINT_AREA_BOTTOM)); + uno::Any(text::RelOrientation::PAGE_PRINT_AREA_BOTTOM)); uno::Reference<drawing::XDrawPageSupplier> xDrawPageSupplierCenter(mxComponent, uno::UNO_QUERY); xDrawPageSupplierCenter->getDrawPage()->add(xShapeCenter); @@ -113,24 +139,30 @@ CPPUNIT_TEST_FIXTURE(SwCoreObjectpositioningTest, testVertAlignBottomMargin) xShapeTop->setSize(awt::Size(500, 500)); uno::Reference<beans::XPropertySet> xShapePropsTop(xShapeTop, uno::UNO_QUERY); xShapePropsTop->setPropertyValue("AnchorType", - uno::makeAny(text::TextContentAnchorType_AT_CHARACTER)); - xShapePropsTop->setPropertyValue("VertOrient", uno::makeAny(text::VertOrientation::TOP)); + uno::Any(text::TextContentAnchorType_AT_CHARACTER)); + xShapePropsTop->setPropertyValue("VertOrient", uno::Any(text::VertOrientation::TOP)); xShapePropsTop->setPropertyValue("VertOrientRelation", - uno::makeAny(text::RelOrientation::PAGE_PRINT_AREA_BOTTOM)); + uno::Any(text::RelOrientation::PAGE_PRINT_AREA_BOTTOM)); uno::Reference<drawing::XDrawPageSupplier> xDrawPageSupplierTop(mxComponent, uno::UNO_QUERY); xDrawPageSupplierTop->getDrawPage()->add(xShapeTop); xmlDocUniquePtr pXmlDoc = parseLayoutDump(); - sal_Int32 nBodyBottom = getXPath(pXmlDoc, "//body/infos/bounds", "bottom").toInt32(); //14989 - sal_Int32 nPageBottom = getXPath(pXmlDoc, "//page/infos/bounds", "bottom").toInt32(); //16123 + sal_Int32 nBodyBottom + = getXPath(pXmlDoc, "//body/infos/bounds"_ostr, "bottom"_ostr).toInt32(); //14989 + sal_Int32 nPageBottom + = getXPath(pXmlDoc, "//page/infos/bounds"_ostr, "bottom"_ostr).toInt32(); //16123 sal_Int32 nFirstShapeBottom - = getXPath(pXmlDoc, "//SwAnchoredDrawObject[1]/bounds", "bottom").toInt32(); //16124 + = getXPath(pXmlDoc, "//anchored/SwAnchoredDrawObject[1]/bounds"_ostr, "bottom"_ostr) + .toInt32(); //16124 sal_Int32 nSecondShapeBottom - = getXPath(pXmlDoc, "//SwAnchoredDrawObject[2]/bounds", "bottom").toInt32(); //15699 + = getXPath(pXmlDoc, "//anchored/SwAnchoredDrawObject[2]/bounds"_ostr, "bottom"_ostr) + .toInt32(); //15699 sal_Int32 nSecondShapeTop - = getXPath(pXmlDoc, "//SwAnchoredDrawObject[2]/bounds", "top").toInt32(); //15414 + = getXPath(pXmlDoc, "//anchored/SwAnchoredDrawObject[2]/bounds"_ostr, "top"_ostr) + .toInt32(); //15414 sal_Int32 nThirdShapeTop - = getXPath(pXmlDoc, "//SwAnchoredDrawObject[3]/bounds", "top").toInt32(); //14989 + = getXPath(pXmlDoc, "//anchored/SwAnchoredDrawObject[3]/bounds"_ostr, "top"_ostr) + .toInt32(); //14989 // Verify that the distance between the bottom of page and bottom of first shape is around 0cm. (align=bottom) CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(1), nFirstShapeBottom - nPageBottom); @@ -142,10 +174,10 @@ CPPUNIT_TEST_FIXTURE(SwCoreObjectpositioningTest, testVertAlignBottomMargin) CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(0), nThirdShapeTop - nBodyBottom); } -CPPUNIT_TEST_FIXTURE(SwCoreObjectpositioningTest, testVertAlignBottomMarginWithFooter) +CPPUNIT_TEST_FIXTURE(Test, testVertAlignBottomMarginWithFooter) { // Load an empty document with footer. - load(DATA_DIRECTORY, "bottom-margin-with-footer.docx"); + createSwDoc("bottom-margin-with-footer.docx"); uno::Reference<css::lang::XMultiServiceFactory> xFactory(mxComponent, uno::UNO_QUERY); // Insert three shapes and align it the bottom,center,top of page print area bottom. @@ -157,10 +189,10 @@ CPPUNIT_TEST_FIXTURE(SwCoreObjectpositioningTest, testVertAlignBottomMarginWithF xShapeBottom->setSize(awt::Size(1000, 1000)); uno::Reference<beans::XPropertySet> xShapePropsBottom(xShapeBottom, uno::UNO_QUERY); xShapePropsBottom->setPropertyValue("AnchorType", - uno::makeAny(text::TextContentAnchorType_AT_CHARACTER)); - xShapePropsBottom->setPropertyValue("VertOrient", uno::makeAny(text::VertOrientation::BOTTOM)); + uno::Any(text::TextContentAnchorType_AT_CHARACTER)); + xShapePropsBottom->setPropertyValue("VertOrient", uno::Any(text::VertOrientation::BOTTOM)); xShapePropsBottom->setPropertyValue("VertOrientRelation", - uno::makeAny(text::RelOrientation::PAGE_PRINT_AREA_BOTTOM)); + uno::Any(text::RelOrientation::PAGE_PRINT_AREA_BOTTOM)); uno::Reference<drawing::XDrawPageSupplier> xDrawPageSupplierBottom(mxComponent, uno::UNO_QUERY); xDrawPageSupplierBottom->getDrawPage()->add(xShapeBottom); @@ -170,10 +202,10 @@ CPPUNIT_TEST_FIXTURE(SwCoreObjectpositioningTest, testVertAlignBottomMarginWithF xShapeCenter->setSize(awt::Size(1000, 1000)); uno::Reference<beans::XPropertySet> xShapePropsCenter(xShapeCenter, uno::UNO_QUERY); xShapePropsCenter->setPropertyValue("AnchorType", - uno::makeAny(text::TextContentAnchorType_AT_CHARACTER)); - xShapePropsCenter->setPropertyValue("VertOrient", uno::makeAny(text::VertOrientation::CENTER)); + uno::Any(text::TextContentAnchorType_AT_CHARACTER)); + xShapePropsCenter->setPropertyValue("VertOrient", uno::Any(text::VertOrientation::CENTER)); xShapePropsCenter->setPropertyValue("VertOrientRelation", - uno::makeAny(text::RelOrientation::PAGE_PRINT_AREA_BOTTOM)); + uno::Any(text::RelOrientation::PAGE_PRINT_AREA_BOTTOM)); uno::Reference<drawing::XDrawPageSupplier> xDrawPageSupplierCenter(mxComponent, uno::UNO_QUERY); xDrawPageSupplierCenter->getDrawPage()->add(xShapeCenter); @@ -183,24 +215,30 @@ CPPUNIT_TEST_FIXTURE(SwCoreObjectpositioningTest, testVertAlignBottomMarginWithF xShapeTop->setSize(awt::Size(1000, 1000)); uno::Reference<beans::XPropertySet> xShapePropsTop(xShapeTop, uno::UNO_QUERY); xShapePropsTop->setPropertyValue("AnchorType", - uno::makeAny(text::TextContentAnchorType_AT_CHARACTER)); - xShapePropsTop->setPropertyValue("VertOrient", uno::makeAny(text::VertOrientation::TOP)); + uno::Any(text::TextContentAnchorType_AT_CHARACTER)); + xShapePropsTop->setPropertyValue("VertOrient", uno::Any(text::VertOrientation::TOP)); xShapePropsTop->setPropertyValue("VertOrientRelation", - uno::makeAny(text::RelOrientation::PAGE_PRINT_AREA_BOTTOM)); + uno::Any(text::RelOrientation::PAGE_PRINT_AREA_BOTTOM)); uno::Reference<drawing::XDrawPageSupplier> xDrawPageSupplierTop(mxComponent, uno::UNO_QUERY); xDrawPageSupplierTop->getDrawPage()->add(xShapeTop); xmlDocUniquePtr pXmlDoc = parseLayoutDump(); - sal_Int32 nBodyBottom = getXPath(pXmlDoc, "//body/infos/bounds", "bottom").toInt32(); //14853 - sal_Int32 nPageBottom = getXPath(pXmlDoc, "//page/infos/bounds", "bottom").toInt32(); //17121 + sal_Int32 nBodyBottom + = getXPath(pXmlDoc, "//body/infos/bounds"_ostr, "bottom"_ostr).toInt32(); //14853 + sal_Int32 nPageBottom + = getXPath(pXmlDoc, "//page/infos/bounds"_ostr, "bottom"_ostr).toInt32(); //17121 sal_Int32 nFirstShapeBottom - = getXPath(pXmlDoc, "//SwAnchoredDrawObject[1]/bounds", "bottom").toInt32(); //17122 + = getXPath(pXmlDoc, "//anchored/SwAnchoredDrawObject[1]/bounds"_ostr, "bottom"_ostr) + .toInt32(); //17122 sal_Int32 nSecondShapeTop - = getXPath(pXmlDoc, "//SwAnchoredDrawObject[2]/bounds", "top").toInt32(); //15703 + = getXPath(pXmlDoc, "//anchored/SwAnchoredDrawObject[2]/bounds"_ostr, "top"_ostr) + .toInt32(); //15703 sal_Int32 nSecondShapeBottom - = getXPath(pXmlDoc, "//SwAnchoredDrawObject[2]/bounds", "bottom").toInt32(); //16272 + = getXPath(pXmlDoc, "//anchored/SwAnchoredDrawObject[2]/bounds"_ostr, "bottom"_ostr) + .toInt32(); //16272 sal_Int32 nThirdShapeTop - = getXPath(pXmlDoc, "//SwAnchoredDrawObject[3]/bounds", "top").toInt32(); //14853 + = getXPath(pXmlDoc, "//anchored/SwAnchoredDrawObject[3]/bounds"_ostr, "top"_ostr) + .toInt32(); //14853 // Verify that the distance between the bottom of page and bottom of first shape is around 0cm. (align=bottom) CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(1), nFirstShapeBottom - nPageBottom); @@ -212,50 +250,62 @@ CPPUNIT_TEST_FIXTURE(SwCoreObjectpositioningTest, testVertAlignBottomMarginWithF CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(0), nThirdShapeTop - nBodyBottom); } -CPPUNIT_TEST_FIXTURE(SwCoreObjectpositioningTest, testInsideOutsideVertAlignBottomMargin) +CPPUNIT_TEST_FIXTURE(Test, testInsideOutsideVertAlignBottomMargin) { // Load a document, with two shapes. // The shapes align the outside and inside of page print area bottom. - load(DATA_DIRECTORY, "inside-outside-vert-align.docx"); + createSwDoc("inside-outside-vert-align.docx"); xmlDocUniquePtr pXmlDoc = parseLayoutDump(); - sal_Int32 nBodyBottom = getXPath(pXmlDoc, "//body/infos/bounds", "bottom").toInt32(); //15704 - sal_Int32 nPageBottom = getXPath(pXmlDoc, "//page/infos/bounds", "bottom").toInt32(); //17121 + sal_Int32 nBodyBottom + = getXPath(pXmlDoc, "//body/infos/bounds"_ostr, "bottom"_ostr).toInt32(); //15704 + sal_Int32 nPageBottom + = getXPath(pXmlDoc, "//page/infos/bounds"_ostr, "bottom"_ostr).toInt32(); //17121 sal_Int32 nFirstShapeOutside - = getXPath(pXmlDoc, "//SwAnchoredDrawObject[1]/bounds", "bottom").toInt32(); //17098 + = getXPath(pXmlDoc, "//anchored/SwAnchoredDrawObject[1]/bounds"_ostr, "bottom"_ostr) + .toInt32(); //17098 sal_Int32 nSecondShapeInside - = getXPath(pXmlDoc, "//SwAnchoredDrawObject[2]/bounds", "top").toInt32(); //15694 + = getXPath(pXmlDoc, "//anchored/SwAnchoredDrawObject[2]/bounds"_ostr, "top"_ostr) + .toInt32(); //15694 // Verify that the distance between the bottom of page and bottom of first shape is around 0cm. (align=outside) - CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(23), nPageBottom - nFirstShapeOutside); + CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(3), nPageBottom - nFirstShapeOutside); // Verify that the distance between the bottom of body and top of second shape is around 0cm. (align=inside) - CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(10), nBodyBottom - nSecondShapeInside); + CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(0), nBodyBottom - nSecondShapeInside); } -CPPUNIT_TEST_FIXTURE(SwCoreObjectpositioningTest, testVMLVertAlignBottomMargin) +CPPUNIT_TEST_FIXTURE(Test, testVMLVertAlignBottomMargin) { // Load a document, with five shapes. // The shapes align the top,center,bottom,outside and inside of page print area bottom. // The height of page print area bottom is 4320 ~ 7.62cm. // The size of shapes are 442 ~ 0.78cm - load(DATA_DIRECTORY, "vml-vertical-alignment.docx"); + createSwDoc("vml-vertical-alignment.docx"); xmlDocUniquePtr pXmlDoc = parseLayoutDump(); - sal_Int32 nBodyBottom = getXPath(pXmlDoc, "//body/infos/bounds", "bottom").toInt32(); //11803 - sal_Int32 nPageBottom = getXPath(pXmlDoc, "//page/infos/bounds", "bottom").toInt32(); //16123 + sal_Int32 nBodyBottom + = getXPath(pXmlDoc, "//body/infos/bounds"_ostr, "bottom"_ostr).toInt32(); //11803 + sal_Int32 nPageBottom + = getXPath(pXmlDoc, "//page/infos/bounds"_ostr, "bottom"_ostr).toInt32(); //16123 sal_Int32 nFirstVMLShapeInside - = getXPath(pXmlDoc, "//SwAnchoredDrawObject[1]/bounds", "top").toInt32(); //11802 + = getXPath(pXmlDoc, "//anchored/SwAnchoredDrawObject[1]/bounds"_ostr, "top"_ostr) + .toInt32(); //11802 sal_Int32 nSecondVMLShapeBottom - = getXPath(pXmlDoc, "//SwAnchoredDrawObject[2]/bounds", "bottom").toInt32(); //16124 + = getXPath(pXmlDoc, "//anchored/SwAnchoredDrawObject[2]/bounds"_ostr, "bottom"_ostr) + .toInt32(); //16124 sal_Int32 nThirdVMLShapeCenterBottom - = getXPath(pXmlDoc, "//SwAnchoredDrawObject[3]/bounds", "bottom").toInt32(); //14185 + = getXPath(pXmlDoc, "//anchored/SwAnchoredDrawObject[3]/bounds"_ostr, "bottom"_ostr) + .toInt32(); //14185 sal_Int32 nThirdVMLShapeCenterTop - = getXPath(pXmlDoc, "//SwAnchoredDrawObject[3]/bounds", "top").toInt32(); //13741 + = getXPath(pXmlDoc, "//anchored/SwAnchoredDrawObject[3]/bounds"_ostr, "top"_ostr) + .toInt32(); //13741 sal_Int32 nFourthVMLShapeTop - = getXPath(pXmlDoc, "//SwAnchoredDrawObject[4]/bounds", "top").toInt32(); //11802 + = getXPath(pXmlDoc, "//anchored/SwAnchoredDrawObject[4]/bounds"_ostr, "top"_ostr) + .toInt32(); //11802 sal_Int32 nFifthVMLShapeOutside - = getXPath(pXmlDoc, "//SwAnchoredDrawObject[5]/bounds", "bottom").toInt32(); //16124 + = getXPath(pXmlDoc, "//anchored/SwAnchoredDrawObject[5]/bounds"_ostr, "bottom"_ostr) + .toInt32(); //16124 // Verify that the distance between the bottom of body and top of first VMLshape is around 0cm. (align=inside) CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(1), nBodyBottom - nFirstVMLShapeInside); @@ -271,6 +321,105 @@ CPPUNIT_TEST_FIXTURE(SwCoreObjectpositioningTest, testVMLVertAlignBottomMargin) CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(1), nFifthVMLShapeOutside - nPageBottom); } +CPPUNIT_TEST_FIXTURE(Test, testFloatingTableOverlapNever) +{ + // Given a document with two floating tables, positioned in a way that normally these would + // overlap, but SwFormatWrapInfluenceOnObjPos::mbAllowOverlap == false explicitly asks to avoid + // overlaps: + createSwDoc("floattable-tbl-overlap.docx"); + + // When laying out that document: + calcLayout(); + + // Then make sure no overlap happens: + SwDoc* pDoc = getSwDoc(); + SwRootFrame* pLayout = pDoc->getIDocumentLayoutAccess().GetCurrentLayout(); + auto pPage1 = dynamic_cast<SwPageFrame*>(pLayout->Lower()); + CPPUNIT_ASSERT(pPage1); + CPPUNIT_ASSERT(pPage1->GetSortedObjs()); + const SwSortedObjs& rPage1Objs = *pPage1->GetSortedObjs(); + CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(2), rPage1Objs.size()); + auto pFlyFrame1 = rPage1Objs[0]->DynCastFlyFrame(); + auto pFlyFrame2 = rPage1Objs[1]->DynCastFlyFrame(); + // Without the accompanying fix in place, this test would have failed with: + // - Expected greater than: 2291 + // - Actual : 2175 + // i.e. the 2nd floating table overlapped with the first one. + CPPUNIT_ASSERT_GREATER(pFlyFrame1->getFrameArea().Bottom(), pFlyFrame2->getFrameArea().Top()); +} + +CPPUNIT_TEST_FIXTURE(Test, testFloatingTableVertOrientTop) +{ + // Given a document with a vert-orient=from-top anchored floating table: + createSwDoc("floattable-vert-orient-top.odt"); + + // When laying out that document: + calcLayout(); + + // Then make sure we correctly split the table to two pages: + // Without the accompanying fix in place, this test would have produced a layout loop. + SwDoc* pDoc = getSwDoc(); + SwRootFrame* pLayout = pDoc->getIDocumentLayoutAccess().GetCurrentLayout(); + auto pPage1 = pLayout->Lower()->DynCastPageFrame(); + CPPUNIT_ASSERT(pPage1); + CPPUNIT_ASSERT(pPage1->GetSortedObjs()); + const SwSortedObjs& rPage1Objs = *pPage1->GetSortedObjs(); + CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(1), rPage1Objs.size()); + auto pPage2 = pPage1->GetNext()->DynCastPageFrame(); + CPPUNIT_ASSERT(pPage2); + CPPUNIT_ASSERT(pPage2->GetSortedObjs()); + const SwSortedObjs& rPage2Objs = *pPage2->GetSortedObjs(); + CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(1), rPage2Objs.size()); +} + +CPPUNIT_TEST_FIXTURE(Test, testFloatingTableFollowWrongPage) +{ + // Given a document with text on 2 pages, the first page has a fly frame that can split: + createSwDoc("floattable-follow-on-wrong-page.odt"); + + // When increasing the top and bottom margins from 0.5cm to 2.5cm: + SwDoc* pDoc = getSwDoc(); + SwPageDesc aStandard(pDoc->GetPageDesc(0)); + SvxULSpaceItem aPageMargin(aStandard.GetMaster().GetULSpace()); + aPageMargin.SetUpper(1417); + aPageMargin.SetLower(1417); + aStandard.GetMaster().SetFormatAttr(aPageMargin); + pDoc->ChgPageDesc(0, aStandard); + + // Then make sure the first and second page has fly frames: + SwRootFrame* pLayout = pDoc->getIDocumentLayoutAccess().GetCurrentLayout(); + auto pPage1 = pLayout->Lower()->DynCastPageFrame(); + CPPUNIT_ASSERT(pPage1); + CPPUNIT_ASSERT(pPage1->GetSortedObjs()); + const SwSortedObjs& rPage1Objs = *pPage1->GetSortedObjs(); + CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(1), rPage1Objs.size()); + auto pPage2 = pPage1->GetNext()->DynCastPageFrame(); + CPPUNIT_ASSERT(pPage2); + // Without the accompanying fix in place, this test would have failed, page 2 had no fly frame + // (page 3 had one). + CPPUNIT_ASSERT(pPage2->GetSortedObjs()); + const SwSortedObjs& rPage2Objs = *pPage2->GetSortedObjs(); + CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(1), rPage2Objs.size()); +} + +CPPUNIT_TEST_FIXTURE(Test, testFloatingTableOverlapCell) +{ + // Given a document with floating tables, overlapping, but anchored to different table cells: + createSwDoc("floattable-overlap-cell.docx"); + + // When laying out the document: + // Without the accompanying fix in place, this resulted in a layout loop. + calcLayout(); + + // Then make sure the layout doesn't loop and results in a single page: + SwDoc* pDoc = getSwDoc(); + SwRootFrame* pLayout = pDoc->getIDocumentLayoutAccess().GetCurrentLayout(); + auto pPage1 = pLayout->Lower()->DynCastPageFrame(); + CPPUNIT_ASSERT(pPage1); + CPPUNIT_ASSERT(!pPage1->GetNext()); +} +} + CPPUNIT_PLUGIN_IMPLEMENT(); /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |