diff options
Diffstat (limited to 'sw/qa/extras/uiwriter/uiwriter2.cxx')
-rw-r--r-- | sw/qa/extras/uiwriter/uiwriter2.cxx | 233 |
1 files changed, 233 insertions, 0 deletions
diff --git a/sw/qa/extras/uiwriter/uiwriter2.cxx b/sw/qa/extras/uiwriter/uiwriter2.cxx index bdea12f0370a..1418ddd0ae51 100644 --- a/sw/qa/extras/uiwriter/uiwriter2.cxx +++ b/sw/qa/extras/uiwriter/uiwriter2.cxx @@ -28,6 +28,7 @@ #include <wrtsh.hxx> #include <IDocumentRedlineAccess.hxx> #include <flyfrm.hxx> +#include <pagefrm.hxx> #include <fmtanchr.hxx> #include <UndoManager.hxx> #include <sortedobjs.hxx> @@ -820,6 +821,238 @@ CPPUNIT_TEST_FIXTURE(SwUiWriterTest2, testTdf131912) CPPUNIT_ASSERT_EQUAL(OUString("foo"), pWrtShell->GetCursor()->GetText()); } +CPPUNIT_TEST_FIXTURE(SwUiWriterTest2, testTdf140007) +{ + typedef sal_uLong SwNodeOffset; + SwDoc* const pDoc = createDoc(); + SwWrtShell* const pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + + pWrtShell->Insert("foo"); + pWrtShell->SplitNode(); + pWrtShell->Insert("bar"); + pWrtShell->SplitNode(); + pWrtShell->Insert("baz"); + CPPUNIT_ASSERT_EQUAL(sal_uLong(13), pDoc->GetNodes().Count()); + CPPUNIT_ASSERT_EQUAL(OUString("foo"), + pDoc->GetNodes()[SwNodeOffset(9)]->GetTextNode()->GetText()); + CPPUNIT_ASSERT_EQUAL(OUString("bar"), + pDoc->GetNodes()[SwNodeOffset(10)]->GetTextNode()->GetText()); + CPPUNIT_ASSERT_EQUAL(OUString("baz"), + pDoc->GetNodes()[SwNodeOffset(11)]->GetTextNode()->GetText()); + + pWrtShell->SttEndDoc(true); + pWrtShell->EndPara(false); + pWrtShell->Right(CRSR_SKIP_CHARS, /*bSelect=*/true, 1, /*bBasicCall=*/false); + pWrtShell->Replace(" ", true); + CPPUNIT_ASSERT_EQUAL(SwNodeOffset(12), pDoc->GetNodes().Count()); + CPPUNIT_ASSERT_EQUAL(OUString("foo bar"), + pDoc->GetNodes()[SwNodeOffset(9)]->GetTextNode()->GetText()); + CPPUNIT_ASSERT_EQUAL(OUString("baz"), + pDoc->GetNodes()[SwNodeOffset(10)]->GetTextNode()->GetText()); + + pWrtShell->SttEndDoc(true); + pWrtShell->EndPara(false); + pWrtShell->Right(CRSR_SKIP_CHARS, /*bSelect=*/true, 1, /*bBasicCall=*/false); + pWrtShell->Replace(" ", true); + CPPUNIT_ASSERT_EQUAL(OUString("foo bar baz"), + pDoc->GetNodes()[SwNodeOffset(9)]->GetTextNode()->GetText()); + CPPUNIT_ASSERT_EQUAL(SwNodeOffset(11), pDoc->GetNodes().Count()); + + pWrtShell->Undo(); + + CPPUNIT_ASSERT_EQUAL(SwNodeOffset(12), pDoc->GetNodes().Count()); + CPPUNIT_ASSERT_EQUAL(OUString("foo bar"), + pDoc->GetNodes()[SwNodeOffset(9)]->GetTextNode()->GetText()); + CPPUNIT_ASSERT_EQUAL(OUString("baz"), + pDoc->GetNodes()[SwNodeOffset(10)]->GetTextNode()->GetText()); + + pWrtShell->Undo(); + + CPPUNIT_ASSERT_EQUAL(SwNodeOffset(13), pDoc->GetNodes().Count()); + CPPUNIT_ASSERT_EQUAL(OUString("foo"), + pDoc->GetNodes()[SwNodeOffset(9)]->GetTextNode()->GetText()); + CPPUNIT_ASSERT_EQUAL(OUString("bar"), + pDoc->GetNodes()[SwNodeOffset(10)]->GetTextNode()->GetText()); + CPPUNIT_ASSERT_EQUAL(OUString("baz"), + pDoc->GetNodes()[SwNodeOffset(11)]->GetTextNode()->GetText()); + + pWrtShell->Redo(); + + CPPUNIT_ASSERT_EQUAL(SwNodeOffset(12), pDoc->GetNodes().Count()); + CPPUNIT_ASSERT_EQUAL(OUString("foo bar"), + pDoc->GetNodes()[SwNodeOffset(9)]->GetTextNode()->GetText()); + CPPUNIT_ASSERT_EQUAL(OUString("baz"), + pDoc->GetNodes()[SwNodeOffset(10)]->GetTextNode()->GetText()); + + pWrtShell->Redo(); + + CPPUNIT_ASSERT_EQUAL(OUString("foo bar baz"), + pDoc->GetNodes()[SwNodeOffset(9)]->GetTextNode()->GetText()); + CPPUNIT_ASSERT_EQUAL(SwNodeOffset(11), pDoc->GetNodes().Count()); + + pWrtShell->Undo(); + + CPPUNIT_ASSERT_EQUAL(SwNodeOffset(12), pDoc->GetNodes().Count()); + CPPUNIT_ASSERT_EQUAL(OUString("foo bar"), + pDoc->GetNodes()[SwNodeOffset(9)]->GetTextNode()->GetText()); + CPPUNIT_ASSERT_EQUAL(OUString("baz"), + pDoc->GetNodes()[SwNodeOffset(10)]->GetTextNode()->GetText()); + + pWrtShell->Undo(); + + CPPUNIT_ASSERT_EQUAL(SwNodeOffset(13), pDoc->GetNodes().Count()); + CPPUNIT_ASSERT_EQUAL(OUString("foo"), + pDoc->GetNodes()[SwNodeOffset(9)]->GetTextNode()->GetText()); + CPPUNIT_ASSERT_EQUAL(OUString("bar"), + pDoc->GetNodes()[SwNodeOffset(10)]->GetTextNode()->GetText()); + CPPUNIT_ASSERT_EQUAL(OUString("baz"), + pDoc->GetNodes()[SwNodeOffset(11)]->GetTextNode()->GetText()); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest2, testTdf139982) +{ + SwDoc* const pDoc = createDoc(); + SwWrtShell* const pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + + // turn on redlining and show changes + pDoc->getIDocumentRedlineAccess().SetRedlineFlags(RedlineFlags::On | RedlineFlags::ShowDelete + | RedlineFlags::ShowInsert); + CPPUNIT_ASSERT_MESSAGE("redlining should be on", + pDoc->getIDocumentRedlineAccess().IsRedlineOn()); + CPPUNIT_ASSERT_MESSAGE( + "redlines should be visible", + IDocumentRedlineAccess::IsShowChanges(pDoc->getIDocumentRedlineAccess().GetRedlineFlags())); + + pWrtShell->Insert("helloo"); + + pWrtShell->Left(CRSR_SKIP_CHARS, /*bSelect=*/false, 1, /*bBasicCall=*/false); + { + SwFormatAnchor anchor(RndStdIds::FLY_AT_CHAR); + anchor.SetAnchor(pWrtShell->GetCursor()->GetPoint()); + SfxItemSet flySet(pDoc->GetAttrPool(), svl::Items<RES_ANCHOR, RES_ANCHOR>{}); + flySet.Put(anchor); + SwFrameFormat const* pFly = pWrtShell->NewFlyFrame(flySet, /*bAnchValid=*/true); + CPPUNIT_ASSERT(pFly != nullptr); + } + + pWrtShell->SttEndDoc(true); + pWrtShell->EndPara(/*bSelect=*/true); + + CPPUNIT_ASSERT_EQUAL(size_t(1), pWrtShell->GetFlyCount(FLYCNTTYPE_FRM)); + + pWrtShell->Replace("hello", true); + + // the problem was that a redline delete with the same author as redline + // insert has its text deleted immediately, including anchored flys. + CPPUNIT_ASSERT_EQUAL(size_t(1), pWrtShell->GetFlyCount(FLYCNTTYPE_FRM)); + + pWrtShell->Undo(); + + CPPUNIT_ASSERT_EQUAL(size_t(1), pWrtShell->GetFlyCount(FLYCNTTYPE_FRM)); + + pWrtShell->Redo(); + + CPPUNIT_ASSERT_EQUAL(size_t(1), pWrtShell->GetFlyCount(FLYCNTTYPE_FRM)); + + pWrtShell->Undo(); + + CPPUNIT_ASSERT_EQUAL(size_t(1), pWrtShell->GetFlyCount(FLYCNTTYPE_FRM)); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest2, testTdf135976) +{ + SwDoc* const pDoc = createDoc(); + SwWrtShell* const pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + + pWrtShell->Insert("foobar"); + + pWrtShell->Left(CRSR_SKIP_CHARS, /*bSelect=*/false, 2, /*bBasicCall=*/false); + SwFormatAnchor anchor(RndStdIds::FLY_AT_CHAR); + anchor.SetAnchor(pWrtShell->GetCursor()->GetPoint()); + SfxItemSet flySet(pDoc->GetAttrPool(), svl::Items<RES_ANCHOR, RES_ANCHOR>{}); + flySet.Put(anchor); + SwFrameFormat const* pFly = pWrtShell->NewFlyFrame(flySet, /*bAnchValid=*/true); + CPPUNIT_ASSERT(pFly != nullptr); + + // turn on redlining and show changes + pDoc->getIDocumentRedlineAccess().SetRedlineFlags(RedlineFlags::On | RedlineFlags::ShowDelete + | RedlineFlags::ShowInsert); + lcl_dispatchCommand(mxComponent, ".uno:ShowTrackedChanges", {}); + CPPUNIT_ASSERT_MESSAGE("redlining should be on", + pDoc->getIDocumentRedlineAccess().IsRedlineOn()); + CPPUNIT_ASSERT_MESSAGE( + "redlines should be visible", + IDocumentRedlineAccess::IsShowChanges(pDoc->getIDocumentRedlineAccess().GetRedlineFlags())); + CPPUNIT_ASSERT(pWrtShell->GetLayout()->IsHideRedlines()); + + CPPUNIT_ASSERT_EQUAL(size_t(1), pWrtShell->GetFlyCount(FLYCNTTYPE_FRM)); + CPPUNIT_ASSERT_EQUAL(size_t(1), pWrtShell->GetLayout()->GetLastPage()->GetSortedObjs()->size()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(4), pFly->GetAnchor().GetContentAnchor()->nContent.GetIndex()); + + pWrtShell->UnSelectFrame(); + pWrtShell->SttEndDoc(/*bStart=*/false); + pWrtShell->Left(CRSR_SKIP_CHARS, /*bSelect=*/false, 1, /*bBasicCall=*/false); + + pWrtShell->DelLeft(); + pWrtShell->DelLeft(); + + CPPUNIT_ASSERT_EQUAL(size_t(1), pWrtShell->GetFlyCount(FLYCNTTYPE_FRM)); + // the problem was that the fly was deleted from the layout + CPPUNIT_ASSERT_EQUAL(size_t(1), pWrtShell->GetLayout()->GetLastPage()->GetSortedObjs()->size()); + // check that the anchor was moved outside the redline + CPPUNIT_ASSERT_EQUAL(sal_Int32(3), pFly->GetAnchor().GetContentAnchor()->nContent.GetIndex()); + + pWrtShell->Undo(2); + + CPPUNIT_ASSERT_EQUAL(size_t(1), pWrtShell->GetFlyCount(FLYCNTTYPE_FRM)); + CPPUNIT_ASSERT_EQUAL(size_t(1), pWrtShell->GetLayout()->GetLastPage()->GetSortedObjs()->size()); + // check that the anchor was restored + CPPUNIT_ASSERT_EQUAL(sal_Int32(4), pFly->GetAnchor().GetContentAnchor()->nContent.GetIndex()); + + pWrtShell->Redo(2); + + CPPUNIT_ASSERT_EQUAL(size_t(1), pWrtShell->GetFlyCount(FLYCNTTYPE_FRM)); + CPPUNIT_ASSERT_EQUAL(size_t(1), pWrtShell->GetLayout()->GetLastPage()->GetSortedObjs()->size()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(3), pFly->GetAnchor().GetContentAnchor()->nContent.GetIndex()); + + pWrtShell->Undo(2); + + CPPUNIT_ASSERT_EQUAL(size_t(1), pWrtShell->GetFlyCount(FLYCNTTYPE_FRM)); + CPPUNIT_ASSERT_EQUAL(size_t(1), pWrtShell->GetLayout()->GetLastPage()->GetSortedObjs()->size()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(4), pFly->GetAnchor().GetContentAnchor()->nContent.GetIndex()); + + // now again in the other direction: + + pWrtShell->SttEndDoc(/*bStart=*/false); + pWrtShell->Left(CRSR_SKIP_CHARS, /*bSelect=*/false, 3, /*bBasicCall=*/false); + + pWrtShell->DelRight(); + pWrtShell->DelRight(); + + CPPUNIT_ASSERT_EQUAL(size_t(1), pWrtShell->GetFlyCount(FLYCNTTYPE_FRM)); + // the problem was that the fly was deleted from the layout + CPPUNIT_ASSERT_EQUAL(size_t(1), pWrtShell->GetLayout()->GetLastPage()->GetSortedObjs()->size()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(5), pFly->GetAnchor().GetContentAnchor()->nContent.GetIndex()); + + pWrtShell->Undo(2); + + CPPUNIT_ASSERT_EQUAL(size_t(1), pWrtShell->GetFlyCount(FLYCNTTYPE_FRM)); + CPPUNIT_ASSERT_EQUAL(size_t(1), pWrtShell->GetLayout()->GetLastPage()->GetSortedObjs()->size()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(4), pFly->GetAnchor().GetContentAnchor()->nContent.GetIndex()); + + pWrtShell->Redo(2); + + CPPUNIT_ASSERT_EQUAL(size_t(1), pWrtShell->GetFlyCount(FLYCNTTYPE_FRM)); + CPPUNIT_ASSERT_EQUAL(size_t(1), pWrtShell->GetLayout()->GetLastPage()->GetSortedObjs()->size()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(5), pFly->GetAnchor().GetContentAnchor()->nContent.GetIndex()); + + pWrtShell->Undo(2); + + CPPUNIT_ASSERT_EQUAL(size_t(1), pWrtShell->GetFlyCount(FLYCNTTYPE_FRM)); + CPPUNIT_ASSERT_EQUAL(size_t(1), pWrtShell->GetLayout()->GetLastPage()->GetSortedObjs()->size()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(4), pFly->GetAnchor().GetContentAnchor()->nContent.GetIndex()); +} + CPPUNIT_TEST_FIXTURE(SwUiWriterTest2, testTdf54819) { load(DATA_DIRECTORY, "tdf54819.fodt"); |