diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-15 05:54:39 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-15 05:54:39 +0000 |
commit | 267c6f2ac71f92999e969232431ba04678e7437e (patch) | |
tree | 358c9467650e1d0a1d7227a21dac2e3d08b622b2 /sw/qa/core/undo | |
parent | Initial commit. (diff) | |
download | libreoffice-267c6f2ac71f92999e969232431ba04678e7437e.tar.xz libreoffice-267c6f2ac71f92999e969232431ba04678e7437e.zip |
Adding upstream version 4:24.2.0.upstream/4%24.2.0
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'sw/qa/core/undo')
-rw-r--r-- | sw/qa/core/undo/data/anchor-type-change-position.docx | bin | 0 -> 49986 bytes | |||
-rw-r--r-- | sw/qa/core/undo/data/image-as-character.odt | bin | 0 -> 9907 bytes | |||
-rw-r--r-- | sw/qa/core/undo/data/table-copy-redline.odt | bin | 0 -> 32554 bytes | |||
-rw-r--r-- | sw/qa/core/undo/data/textbox-cut-save.docx | bin | 0 -> 7272 bytes | |||
-rw-r--r-- | sw/qa/core/undo/data/textbox-cut-undo.docx | bin | 0 -> 13196 bytes | |||
-rw-r--r-- | sw/qa/core/undo/undo.cxx | 181 |
6 files changed, 181 insertions, 0 deletions
diff --git a/sw/qa/core/undo/data/anchor-type-change-position.docx b/sw/qa/core/undo/data/anchor-type-change-position.docx Binary files differnew file mode 100644 index 0000000000..1a5d27b3f4 --- /dev/null +++ b/sw/qa/core/undo/data/anchor-type-change-position.docx diff --git a/sw/qa/core/undo/data/image-as-character.odt b/sw/qa/core/undo/data/image-as-character.odt Binary files differnew file mode 100644 index 0000000000..0b1aa6a21f --- /dev/null +++ b/sw/qa/core/undo/data/image-as-character.odt diff --git a/sw/qa/core/undo/data/table-copy-redline.odt b/sw/qa/core/undo/data/table-copy-redline.odt Binary files differnew file mode 100644 index 0000000000..f391687823 --- /dev/null +++ b/sw/qa/core/undo/data/table-copy-redline.odt diff --git a/sw/qa/core/undo/data/textbox-cut-save.docx b/sw/qa/core/undo/data/textbox-cut-save.docx Binary files differnew file mode 100644 index 0000000000..a1a350d08a --- /dev/null +++ b/sw/qa/core/undo/data/textbox-cut-save.docx diff --git a/sw/qa/core/undo/data/textbox-cut-undo.docx b/sw/qa/core/undo/data/textbox-cut-undo.docx Binary files differnew file mode 100644 index 0000000000..35f0e85717 --- /dev/null +++ b/sw/qa/core/undo/data/textbox-cut-undo.docx diff --git a/sw/qa/core/undo/undo.cxx b/sw/qa/core/undo/undo.cxx new file mode 100644 index 0000000000..7b68e1b3b2 --- /dev/null +++ b/sw/qa/core/undo/undo.cxx @@ -0,0 +1,181 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include <swmodeltestbase.hxx> + +#include <unotools/mediadescriptor.hxx> + +#include <unotxdoc.hxx> +#include <docsh.hxx> +#include <wrtsh.hxx> +#include <swdtflvr.hxx> +#include <frameformats.hxx> +#include <fmtcntnt.hxx> + +/// Covers sw/source/core/undo/ fixes. +class SwCoreUndoTest : public SwModelTestBase +{ +public: + SwCoreUndoTest() + : SwModelTestBase("/sw/qa/core/undo/data/") + { + } +}; + +CPPUNIT_TEST_FIXTURE(SwCoreUndoTest, testTextboxCutSave) +{ + // Load the document and select all. + createSwDoc("textbox-cut-save.docx"); + SwXTextDocument* pTextDoc = dynamic_cast<SwXTextDocument*>(mxComponent.get()); + SwDocShell* pDocShell = pTextDoc->GetDocShell(); + SwWrtShell* pWrtShell = pDocShell->GetWrtShell(); + pWrtShell->SelAll(); + + // Cut. + rtl::Reference<SwTransferable> pTransfer = new SwTransferable(*pWrtShell); + pTransfer->Cut(); + + // Undo. + pWrtShell->Undo(); + + // Save. + uno::Reference<frame::XStorable> xStorable(mxComponent, uno::UNO_QUERY); + utl::MediaDescriptor aMediaDescriptor; + aMediaDescriptor["FilterName"] <<= OUString("Office Open XML Text"); + + // Without the accompanying fix in place, this test would have failed with: + // void sax_fastparser::FastSaxSerializer::endDocument(): Assertion `mbMarkStackEmpty && maMarkStack.empty()' failed. + // i.e. failed to save because we tried to write not-well-formed XML. + xStorable->storeToURL(maTempFile.GetURL(), aMediaDescriptor.getAsConstPropertyValueList()); +} + +CPPUNIT_TEST_FIXTURE(SwCoreUndoTest, testTextboxCutUndo) +{ + createSwDoc("textbox-cut-undo.docx"); + SwXTextDocument* pTextDoc = dynamic_cast<SwXTextDocument*>(mxComponent.get()); + SwDocShell* pDocShell = pTextDoc->GetDocShell(); + SwWrtShell* pWrtShell = pDocShell->GetWrtShell(); + SwDoc* pDoc = pDocShell->GetDoc(); + + selectShape(1); + rtl::Reference<SwTransferable> pTransfer = new SwTransferable(*pWrtShell); + pTransfer->Cut(); + auto& rSpzFrameFormats = *pDoc->GetSpzFrameFormats(); + CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(0), rSpzFrameFormats.size()); + + pWrtShell->Undo(); + CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(2), rSpzFrameFormats.size()); + + const SwNodeIndex* pIndex1 = rSpzFrameFormats[0]->GetContent().GetContentIdx(); + const SwNodeIndex* pIndex2 = rSpzFrameFormats[1]->GetContent().GetContentIdx(); + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 5 + // - Actual : 8 + // i.e. the draw frame format had a wrong node index in its content. + CPPUNIT_ASSERT_EQUAL(pIndex1->GetIndex(), pIndex2->GetIndex()); +} + +CPPUNIT_TEST_FIXTURE(SwCoreUndoTest, testTableCopyRedline) +{ + // Given a document with two table cells and redlining enabled: + createSwDoc("table-copy-redline.odt"); + SwXTextDocument* pTextDoc = dynamic_cast<SwXTextDocument*>(mxComponent.get()); + SwDocShell* pDocShell = pTextDoc->GetDocShell(); + SwWrtShell* pWrtShell = pDocShell->GetWrtShell(); + + // When doing select-all, copy, paste and undo: + pWrtShell->SelAll(); + rtl::Reference<SwTransferable> pTransfer = new SwTransferable(*pWrtShell); + pTransfer->Copy(); + TransferableDataHelper aHelper(pTransfer); + SwTransferable::Paste(*pWrtShell, aHelper); + + // Without the accompanying fix in place, this test would have crashed. + pWrtShell->Undo(); +} + +CPPUNIT_TEST_FIXTURE(SwCoreUndoTest, testImagePropsCreateUndoAndModifyDoc) +{ + createSwDoc("image-as-character.odt"); + SwXTextDocument* pTextDoc = dynamic_cast<SwXTextDocument*>(mxComponent.get()); + SwDocShell* pDocShell = pTextDoc->GetDocShell(); + SwWrtShell* pWrtShell = pDocShell->GetWrtShell(); + css::uno::Reference<css::beans::XPropertySet> xImage( + pTextDoc->getGraphicObjects()->getByName("Image1"), css::uno::UNO_QUERY_THROW); + + CPPUNIT_ASSERT(pTextDoc->isSetModifiedEnabled()); + CPPUNIT_ASSERT(!pTextDoc->isModified()); + CPPUNIT_ASSERT(!pWrtShell->GetLastUndoInfo(nullptr, nullptr, nullptr)); + + // Check that modifications of the geometry mark document dirty, and create an undo + + xImage->setPropertyValue("RelativeWidth", css::uno::Any(sal_Int16(80))); + + // Without the fix, this would fail + CPPUNIT_ASSERT(pTextDoc->isModified()); + CPPUNIT_ASSERT(pWrtShell->GetLastUndoInfo(nullptr, nullptr, nullptr)); + + pWrtShell->Undo(); + CPPUNIT_ASSERT(!pTextDoc->isModified()); + CPPUNIT_ASSERT(!pWrtShell->GetLastUndoInfo(nullptr, nullptr, nullptr)); + + // Check that modifications of anchor mark document dirty, and create an undo + + xImage->setPropertyValue("AnchorType", + css::uno::Any(css::text::TextContentAnchorType_AT_PARAGRAPH)); + + CPPUNIT_ASSERT(pTextDoc->isModified()); + CPPUNIT_ASSERT(pWrtShell->GetLastUndoInfo(nullptr, nullptr, nullptr)); + + pWrtShell->Undo(); + CPPUNIT_ASSERT(!pTextDoc->isModified()); + CPPUNIT_ASSERT(!pWrtShell->GetLastUndoInfo(nullptr, nullptr, nullptr)); + + // Check that setting the same values do not make it dirty and do not add undo + + xImage->setPropertyValue("RelativeWidth", xImage->getPropertyValue("RelativeWidth")); + xImage->setPropertyValue("AnchorType", xImage->getPropertyValue("AnchorType")); + + CPPUNIT_ASSERT(!pTextDoc->isModified()); + CPPUNIT_ASSERT(!pWrtShell->GetLastUndoInfo(nullptr, nullptr, nullptr)); +} + +CPPUNIT_TEST_FIXTURE(SwCoreUndoTest, testAnchorTypeChangePosition) +{ + // Given a document with a textbox (draw + fly format pair) + an inner image: + createSwDoc("anchor-type-change-position.docx"); + selectShape(1); + SwDoc* pDoc = getSwDoc(); + const auto& rFormats = *pDoc->GetSpzFrameFormats(); + CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(3), rFormats.size()); + Point aOldPos; + { + const SwFormatHoriOrient& rHoriOrient = rFormats[0]->GetHoriOrient(); + const SwFormatVertOrient& rVertOrient = rFormats[0]->GetVertOrient(); + aOldPos = Point(rHoriOrient.GetPos(), rVertOrient.GetPos()); + } + + // When changing the anchor type + undo: + dispatchCommand(mxComponent, ".uno:SetAnchorToChar", {}); + dispatchCommand(mxComponent, ".uno:Undo", {}); + + // Then make sure the old position is also restored: + const SwFormatHoriOrient& rHoriOrient = rFormats[0]->GetHoriOrient(); + const SwFormatVertOrient& rVertOrient = rFormats[0]->GetVertOrient(); + Point aNewPos(rHoriOrient.GetPos(), rVertOrient.GetPos()); + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 789,213 + // - Actual : 1578,3425 + // i.e. there was a big, unexpected increase in the vertical position after undo. + CPPUNIT_ASSERT_EQUAL(aOldPos, aNewPos); +} + +CPPUNIT_PLUGIN_IMPLEMENT(); + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |