/* * 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 #include #include #include #include #include "UndoManager.hxx" static const char* DATA_DIRECTORY = "/sw/qa/extras/uiwriter/data/"; class SwUiWriterTest : public SwModelTestBase { public: void testReplaceForward(); //Regression test of fdo#70143 //EDITING: undo search&replace corrupt text when searching backward void testReplaceBackward(); void testFdo69893(); void testFdo70807(); void testImportRTF(); void testExportRTF(); CPPUNIT_TEST_SUITE(SwUiWriterTest); CPPUNIT_TEST(testReplaceForward); CPPUNIT_TEST(testReplaceBackward); CPPUNIT_TEST(testFdo69893); CPPUNIT_TEST(testFdo70807); CPPUNIT_TEST(testImportRTF); CPPUNIT_TEST(testExportRTF); CPPUNIT_TEST_SUITE_END(); private: SwDoc* createDoc(const char* pName = 0); }; SwDoc* SwUiWriterTest::createDoc(const char* pName) { if (!pName) pName = "empty.odt"; load(DATA_DIRECTORY, pName); SwXTextDocument* pTxtDoc = dynamic_cast(mxComponent.get()); CPPUNIT_ASSERT(pTxtDoc); return pTxtDoc->GetDocShell()->GetDoc(); } //Replacement tests static void lcl_selectCharacters(SwPaM& rPaM, sal_Int32 first, sal_Int32 end) { rPaM.GetPoint()->nContent.Assign(rPaM.GetCntntNode(), first); rPaM.SetMark(); rPaM.GetPoint()->nContent.Assign(rPaM.GetCntntNode(), end); } static const OUString ORIGINAL_REPLACE_CONTENT("toto titi tutu"); static const OUString EXPECTED_REPLACE_CONTENT("toto toto tutu"); void SwUiWriterTest::testReplaceForward() { SwDoc* pDoc = createDoc(); sw::UndoManager& rUndoManager = pDoc->GetUndoManager(); SwNodeIndex aIdx(pDoc->GetNodes().GetEndOfContent(), -1); SwPaM aPaM(aIdx); pDoc->InsertString(aPaM, ORIGINAL_REPLACE_CONTENT); SwTxtNode* pTxtNode = aPaM.GetNode()->GetTxtNode(); lcl_selectCharacters(aPaM, 5, 9); pDoc->ReplaceRange(aPaM, OUString("toto"), false); CPPUNIT_ASSERT_EQUAL(EXPECTED_REPLACE_CONTENT, pTxtNode->GetTxt()); rUndoManager.Undo(); CPPUNIT_ASSERT_EQUAL(ORIGINAL_REPLACE_CONTENT, pTxtNode->GetTxt()); } void SwUiWriterTest::testReplaceBackward() { SwDoc* pDoc = createDoc(); sw::UndoManager& rUndoManager = pDoc->GetUndoManager(); SwNodeIndex aIdx(pDoc->GetNodes().GetEndOfContent(), -1); SwPaM aPaM(aIdx); pDoc->InsertString(aPaM, OUString("toto titi tutu")); SwTxtNode* pTxtNode = aPaM.GetNode()->GetTxtNode(); lcl_selectCharacters(aPaM, 9, 5); pDoc->ReplaceRange(aPaM, OUString("toto"), false); CPPUNIT_ASSERT_EQUAL(EXPECTED_REPLACE_CONTENT, pTxtNode->GetTxt()); rUndoManager.Undo(); CPPUNIT_ASSERT_EQUAL(ORIGINAL_REPLACE_CONTENT, pTxtNode->GetTxt()); } void SwUiWriterTest::testFdo69893() { SwDoc* pDoc = createDoc("fdo69893.odt"); SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); pWrtShell->SelAll(); SwShellCrsr* pShellCrsr = pWrtShell->getShellCrsr(false); SwTxtNode& rEnd = dynamic_cast(pShellCrsr->End()->nNode.GetNode()); // Selection did not include the para after table, this was "B1". CPPUNIT_ASSERT_EQUAL(OUString("Para after table."), rEnd.GetTxt()); } void SwUiWriterTest::testFdo70807() { load(DATA_DIRECTORY, "fdo70807.odt"); uno::Reference stylesIter(getStyles("PageStyles"), uno::UNO_QUERY); for (sal_Int32 i = 0; i < stylesIter->getCount(); ++i) { uno::Reference xStyle(stylesIter->getByIndex(i), uno::UNO_QUERY); uno::Reference xName(xStyle, uno::UNO_QUERY); sal_Bool expectedUsedStyle = sal_False; sal_Bool expectedUserDefined = sal_False; OUString styleName(xName->getName()); // just these styles are user defined styles if (styleName == "pagestyle1" || styleName == "pagestyle2") expectedUserDefined = sal_True; // just these styles are used in the document if (styleName == "Right Page" || styleName == "pagestyle1" || styleName == "pagestyle2") expectedUsedStyle = sal_True; CPPUNIT_ASSERT_EQUAL(expectedUserDefined, xStyle->isUserDefined()); CPPUNIT_ASSERT_EQUAL(expectedUsedStyle, xStyle->isInUse()); } } void SwUiWriterTest::testImportRTF() { // Insert "foobar" and position the cursor between "foo" and "bar". SwDoc* pDoc = createDoc(); SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); pWrtShell->Insert("foobar"); pWrtShell->Left(CRSR_SKIP_CHARS, /*bSelect=*/false, 3, /*bBasicCall=*/false); // Insert the RTF at the cursor position. OString aData = "{\\rtf1 Hello world!\\par}"; SvMemoryStream aStream(const_cast(aData.getStr()), aData.getLength(), STREAM_READ); SwReader aReader(aStream, OUString(), OUString(), *pWrtShell->GetCrsr()); Reader* pRTFReader = SwReaderWriter::GetReader(READER_WRITER_RTF); CPPUNIT_ASSERT(pRTFReader != 0); CPPUNIT_ASSERT_EQUAL(sal_uLong(0), aReader.Read(*pRTFReader)); sal_uLong nIndex = pWrtShell->GetCrsr()->GetNode()->GetIndex(); CPPUNIT_ASSERT_EQUAL(OUString("fooHello world!"), static_cast(pDoc->GetNodes()[nIndex - 1])->GetTxt()); CPPUNIT_ASSERT_EQUAL(OUString("bar"), static_cast(pDoc->GetNodes()[nIndex])->GetTxt()); } void SwUiWriterTest::testExportRTF() { // Insert "aaabbbccc" and select "bbb". SwDoc* pDoc = createDoc(); SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); pWrtShell->Insert("aaabbbccc"); pWrtShell->Left(CRSR_SKIP_CHARS, /*bSelect=*/false, 3, /*bBasicCall=*/false); pWrtShell->Left(CRSR_SKIP_CHARS, /*bSelect=*/true, 3, /*bBasicCall=*/false); // Create the clipboard document. boost::shared_ptr pClpDoc(new SwDoc()); pClpDoc->SetClipBoard(true); pWrtShell->Copy(pClpDoc.get()); // And finally export it as RTF. WriterRef xWrt; SwReaderWriter::GetWriter("RTF", OUString(), xWrt); SvMemoryStream aStream; SwWriter aWrt(aStream, *pClpDoc); aWrt.Write(xWrt); OString aData(static_cast(aStream.GetBuffer()), aStream.GetSize()); CPPUNIT_ASSERT(aData.startsWith("{\\rtf1")); CPPUNIT_ASSERT_EQUAL(sal_Int32(-1), aData.indexOf("aaa")); CPPUNIT_ASSERT(aData.indexOf("bbb") != -1); CPPUNIT_ASSERT_EQUAL(sal_Int32(-1), aData.indexOf("ccc")); } CPPUNIT_TEST_SUITE_REGISTRATION(SwUiWriterTest); CPPUNIT_PLUGIN_IMPLEMENT(); /* vim:set shiftwidth=4 softtabstop=4 expandtab: */