2012-04-11 14:29:11 -04:00
|
|
|
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
|
|
|
/*
|
2013-04-19 21:10:42 +01:00
|
|
|
* This file is part of the LibreOffice project.
|
2012-04-11 14:29:11 -04:00
|
|
|
*
|
2013-04-19 21:10:42 +01:00
|
|
|
* 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/.
|
2012-04-11 14:29:11 -04:00
|
|
|
*/
|
|
|
|
|
|
|
|
#include "test/bootstrapfixture.hxx"
|
|
|
|
|
|
|
|
#include <cppunit/TestFixture.h>
|
|
|
|
#include <cppunit/extensions/HelperMacros.h>
|
|
|
|
|
|
|
|
#include "svl/itempool.hxx"
|
2012-04-11 20:46:45 -04:00
|
|
|
#include "editeng/eerdll.hxx"
|
|
|
|
#include "editeng/eerdll2.hxx"
|
2012-04-11 14:29:11 -04:00
|
|
|
#include "editeng/editeng.hxx"
|
|
|
|
#include "editeng/eeitem.hxx"
|
|
|
|
#include "editeng/editids.hrc"
|
2012-04-11 21:27:34 -04:00
|
|
|
#include "editeng/editdoc.hxx"
|
2013-03-01 10:50:11 +00:00
|
|
|
#include "editeng/svxacorr.hxx"
|
2012-05-11 23:11:10 -04:00
|
|
|
#include "editeng/unofield.hxx"
|
2013-08-20 14:56:27 -04:00
|
|
|
#include "editeng/wghtitem.hxx"
|
|
|
|
#include "editeng/postitem.hxx"
|
2013-08-28 14:41:12 -04:00
|
|
|
#include "editeng/section.hxx"
|
2013-08-20 14:56:27 -04:00
|
|
|
#include "editeng/editobj.hxx"
|
2012-05-11 23:11:10 -04:00
|
|
|
|
|
|
|
#include <com/sun/star/text/textfield/Type.hpp>
|
|
|
|
|
2013-08-20 14:56:27 -04:00
|
|
|
#include <boost/scoped_ptr.hpp>
|
|
|
|
|
2012-05-11 23:11:10 -04:00
|
|
|
using namespace com::sun::star;
|
2012-04-11 14:29:11 -04:00
|
|
|
|
|
|
|
namespace {
|
|
|
|
|
|
|
|
class Test : public test::BootstrapFixture
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
Test();
|
|
|
|
|
2012-04-11 21:53:33 -04:00
|
|
|
virtual void setUp();
|
|
|
|
virtual void tearDown();
|
|
|
|
|
2012-04-11 14:29:11 -04:00
|
|
|
void testConstruction();
|
|
|
|
|
2012-05-11 23:11:10 -04:00
|
|
|
/**
|
|
|
|
* Test UNO service class that implements text field items.
|
|
|
|
*/
|
|
|
|
void testUnoTextFields();
|
|
|
|
|
2013-03-01 10:50:11 +00:00
|
|
|
/**
|
|
|
|
* AutoCorrect tests
|
|
|
|
*/
|
|
|
|
void testAutocorrect();
|
|
|
|
|
2013-08-20 14:56:27 -04:00
|
|
|
void testSectionAttributes();
|
|
|
|
|
2012-04-11 14:29:11 -04:00
|
|
|
CPPUNIT_TEST_SUITE(Test);
|
2012-04-13 11:13:19 +01:00
|
|
|
CPPUNIT_TEST(testConstruction);
|
2012-05-11 23:11:10 -04:00
|
|
|
CPPUNIT_TEST(testUnoTextFields);
|
2013-03-01 10:50:11 +00:00
|
|
|
CPPUNIT_TEST(testAutocorrect);
|
2013-08-20 14:56:27 -04:00
|
|
|
CPPUNIT_TEST(testSectionAttributes);
|
2012-04-11 14:29:11 -04:00
|
|
|
CPPUNIT_TEST_SUITE_END();
|
2012-04-11 21:53:33 -04:00
|
|
|
|
|
|
|
private:
|
|
|
|
EditEngineItemPool* mpItemPool;
|
2012-04-11 14:29:11 -04:00
|
|
|
};
|
|
|
|
|
2012-04-11 21:53:33 -04:00
|
|
|
Test::Test() : mpItemPool(NULL) {}
|
|
|
|
|
|
|
|
void Test::setUp()
|
|
|
|
{
|
|
|
|
test::BootstrapFixture::setUp();
|
|
|
|
|
|
|
|
mpItemPool = new EditEngineItemPool(true);
|
|
|
|
}
|
|
|
|
|
|
|
|
void Test::tearDown()
|
|
|
|
{
|
|
|
|
SfxItemPool::Free(mpItemPool);
|
|
|
|
test::BootstrapFixture::tearDown();
|
|
|
|
}
|
2012-04-11 14:29:11 -04:00
|
|
|
|
|
|
|
void Test::testConstruction()
|
|
|
|
{
|
2012-04-11 21:53:33 -04:00
|
|
|
EditEngine aEngine(mpItemPool);
|
|
|
|
|
2013-04-07 12:06:47 +02:00
|
|
|
OUString aParaText = "I am Edit Engine.";
|
2012-04-11 23:29:01 -04:00
|
|
|
aEngine.SetText(aParaText);
|
2012-04-11 14:29:11 -04:00
|
|
|
}
|
|
|
|
|
2012-05-11 23:11:10 -04:00
|
|
|
namespace {
|
|
|
|
|
2013-04-07 12:06:47 +02:00
|
|
|
bool includes(const uno::Sequence<OUString>& rSeq, const OUString& rVal)
|
2012-05-11 23:11:10 -04:00
|
|
|
{
|
|
|
|
for (sal_Int32 i = 0, n = rSeq.getLength(); i < n; ++i)
|
|
|
|
if (rSeq[i] == rVal)
|
|
|
|
return true;
|
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
void Test::testUnoTextFields()
|
|
|
|
{
|
|
|
|
{
|
|
|
|
// DATE
|
|
|
|
SvxUnoTextField aField(text::textfield::Type::DATE);
|
2013-04-07 12:06:47 +02:00
|
|
|
uno::Sequence<OUString> aSvcs = aField.getSupportedServiceNames();
|
2012-05-11 23:11:10 -04:00
|
|
|
bool bGood = includes(aSvcs, "com.sun.star.text.textfield.DateTime");
|
|
|
|
CPPUNIT_ASSERT_MESSAGE("expected service is not present.", bGood);
|
|
|
|
}
|
|
|
|
|
|
|
|
{
|
|
|
|
// URL
|
|
|
|
SvxUnoTextField aField(text::textfield::Type::URL);
|
2013-04-07 12:06:47 +02:00
|
|
|
uno::Sequence<OUString> aSvcs = aField.getSupportedServiceNames();
|
2012-05-11 23:11:10 -04:00
|
|
|
bool bGood = includes(aSvcs, "com.sun.star.text.textfield.URL");
|
|
|
|
CPPUNIT_ASSERT_MESSAGE("expected service is not present.", bGood);
|
|
|
|
}
|
|
|
|
|
|
|
|
{
|
|
|
|
// PAGE
|
|
|
|
SvxUnoTextField aField(text::textfield::Type::PAGE);
|
2013-04-07 12:06:47 +02:00
|
|
|
uno::Sequence<OUString> aSvcs = aField.getSupportedServiceNames();
|
2012-05-11 23:11:10 -04:00
|
|
|
bool bGood = includes(aSvcs, "com.sun.star.text.textfield.PageNumber");
|
|
|
|
CPPUNIT_ASSERT_MESSAGE("expected service is not present.", bGood);
|
|
|
|
}
|
|
|
|
|
|
|
|
{
|
|
|
|
// PAGES
|
|
|
|
SvxUnoTextField aField(text::textfield::Type::PAGES);
|
2013-04-07 12:06:47 +02:00
|
|
|
uno::Sequence<OUString> aSvcs = aField.getSupportedServiceNames();
|
2012-05-11 23:11:10 -04:00
|
|
|
bool bGood = includes(aSvcs, "com.sun.star.text.textfield.PageCount");
|
|
|
|
CPPUNIT_ASSERT_MESSAGE("expected service is not present.", bGood);
|
|
|
|
}
|
|
|
|
|
|
|
|
{
|
|
|
|
// TIME
|
|
|
|
SvxUnoTextField aField(text::textfield::Type::TIME);
|
2013-04-07 12:06:47 +02:00
|
|
|
uno::Sequence<OUString> aSvcs = aField.getSupportedServiceNames();
|
2012-05-11 23:11:10 -04:00
|
|
|
bool bGood = includes(aSvcs, "com.sun.star.text.textfield.DateTime");
|
|
|
|
CPPUNIT_ASSERT_MESSAGE("expected service is not present.", bGood);
|
|
|
|
}
|
|
|
|
|
|
|
|
{
|
|
|
|
// FILE
|
2012-05-14 10:35:45 -04:00
|
|
|
SvxUnoTextField aField(text::textfield::Type::DOCINFO_TITLE);
|
2013-04-07 12:06:47 +02:00
|
|
|
uno::Sequence<OUString> aSvcs = aField.getSupportedServiceNames();
|
2012-05-11 23:11:10 -04:00
|
|
|
bool bGood = includes(aSvcs, "com.sun.star.text.textfield.docinfo.Title");
|
|
|
|
CPPUNIT_ASSERT_MESSAGE("expected service is not present.", bGood);
|
|
|
|
}
|
|
|
|
|
|
|
|
{
|
|
|
|
// TABLE
|
|
|
|
SvxUnoTextField aField(text::textfield::Type::TABLE);
|
2013-04-07 12:06:47 +02:00
|
|
|
uno::Sequence<OUString> aSvcs = aField.getSupportedServiceNames();
|
2012-05-11 23:11:10 -04:00
|
|
|
bool bGood = includes(aSvcs, "com.sun.star.text.textfield.SheetName");
|
|
|
|
CPPUNIT_ASSERT_MESSAGE("expected service is not present.", bGood);
|
|
|
|
}
|
|
|
|
|
|
|
|
{
|
|
|
|
// EXTENDED TIME
|
|
|
|
SvxUnoTextField aField(text::textfield::Type::EXTENDED_TIME);
|
2013-04-07 12:06:47 +02:00
|
|
|
uno::Sequence<OUString> aSvcs = aField.getSupportedServiceNames();
|
2012-05-11 23:11:10 -04:00
|
|
|
bool bGood = includes(aSvcs, "com.sun.star.text.textfield.DateTime");
|
|
|
|
CPPUNIT_ASSERT_MESSAGE("expected service is not present.", bGood);
|
|
|
|
}
|
|
|
|
|
|
|
|
{
|
|
|
|
// EXTENDED FILE
|
|
|
|
SvxUnoTextField aField(text::textfield::Type::EXTENDED_FILE);
|
2013-04-07 12:06:47 +02:00
|
|
|
uno::Sequence<OUString> aSvcs = aField.getSupportedServiceNames();
|
2012-05-11 23:11:10 -04:00
|
|
|
bool bGood = includes(aSvcs, "com.sun.star.text.textfield.FileName");
|
|
|
|
CPPUNIT_ASSERT_MESSAGE("expected service is not present.", bGood);
|
|
|
|
}
|
|
|
|
|
|
|
|
{
|
|
|
|
// AUTHOR
|
|
|
|
SvxUnoTextField aField(text::textfield::Type::AUTHOR);
|
2013-04-07 12:06:47 +02:00
|
|
|
uno::Sequence<OUString> aSvcs = aField.getSupportedServiceNames();
|
2012-05-11 23:11:10 -04:00
|
|
|
bool bGood = includes(aSvcs, "com.sun.star.text.textfield.Author");
|
|
|
|
CPPUNIT_ASSERT_MESSAGE("expected service is not present.", bGood);
|
|
|
|
}
|
|
|
|
|
|
|
|
{
|
|
|
|
// MEASURE
|
|
|
|
SvxUnoTextField aField(text::textfield::Type::MEASURE);
|
2013-04-07 12:06:47 +02:00
|
|
|
uno::Sequence<OUString> aSvcs = aField.getSupportedServiceNames();
|
2012-05-11 23:11:10 -04:00
|
|
|
bool bGood = includes(aSvcs, "com.sun.star.text.textfield.Measure");
|
|
|
|
CPPUNIT_ASSERT_MESSAGE("expected service is not present.", bGood);
|
|
|
|
}
|
|
|
|
|
|
|
|
{
|
|
|
|
// PRESENTATION HEADER
|
|
|
|
SvxUnoTextField aField(text::textfield::Type::PRESENTATION_HEADER);
|
2013-04-07 12:06:47 +02:00
|
|
|
uno::Sequence<OUString> aSvcs = aField.getSupportedServiceNames();
|
2012-05-11 23:11:10 -04:00
|
|
|
bool bGood = includes(aSvcs, "com.sun.star.presentation.textfield.Header");
|
|
|
|
CPPUNIT_ASSERT_MESSAGE("expected service is not present.", bGood);
|
|
|
|
}
|
|
|
|
|
|
|
|
{
|
|
|
|
// PRESENTATION FOOTER
|
|
|
|
SvxUnoTextField aField(text::textfield::Type::PRESENTATION_FOOTER);
|
2013-04-07 12:06:47 +02:00
|
|
|
uno::Sequence<OUString> aSvcs = aField.getSupportedServiceNames();
|
2012-05-11 23:11:10 -04:00
|
|
|
bool bGood = includes(aSvcs, "com.sun.star.presentation.textfield.Footer");
|
|
|
|
CPPUNIT_ASSERT_MESSAGE("expected service is not present.", bGood);
|
|
|
|
}
|
|
|
|
|
|
|
|
{
|
|
|
|
// PRESENTATION DATE TIME
|
|
|
|
SvxUnoTextField aField(text::textfield::Type::PRESENTATION_DATE_TIME);
|
2013-04-07 12:06:47 +02:00
|
|
|
uno::Sequence<OUString> aSvcs = aField.getSupportedServiceNames();
|
2012-05-11 23:11:10 -04:00
|
|
|
bool bGood = includes(aSvcs, "com.sun.star.presentation.textfield.DateTime");
|
|
|
|
CPPUNIT_ASSERT_MESSAGE("expected service is not present.", bGood);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-03-01 10:50:11 +00:00
|
|
|
class TestAutoCorrDoc : public SvxAutoCorrDoc
|
|
|
|
{
|
|
|
|
public:
|
2013-06-06 20:51:05 +02:00
|
|
|
/// just like the real thing, this dummy modifies the rText parameter :(
|
|
|
|
TestAutoCorrDoc(OUString &rText, LanguageType eLang)
|
|
|
|
: m_rText(rText)
|
2013-03-01 10:50:11 +00:00
|
|
|
, m_eLang(eLang)
|
|
|
|
{
|
|
|
|
}
|
2013-06-06 20:51:05 +02:00
|
|
|
OUString const& getResult() const
|
2013-03-01 10:50:11 +00:00
|
|
|
{
|
2013-06-06 20:51:05 +02:00
|
|
|
return m_rText;
|
2013-03-01 10:50:11 +00:00
|
|
|
}
|
|
|
|
private:
|
2013-06-06 20:51:05 +02:00
|
|
|
OUString & m_rText;
|
2013-03-01 10:50:11 +00:00
|
|
|
LanguageType m_eLang;
|
|
|
|
virtual sal_Bool Delete( xub_StrLen nStt, xub_StrLen nEnd )
|
|
|
|
{
|
|
|
|
//fprintf(stderr, "TestAutoCorrDoc::Delete\n");
|
2013-06-06 20:51:05 +02:00
|
|
|
m_rText = m_rText.replaceAt(nStt, nEnd-nStt, "");
|
2013-03-01 10:50:11 +00:00
|
|
|
return true;
|
|
|
|
}
|
2013-09-06 12:01:31 +02:00
|
|
|
virtual sal_Bool Insert( xub_StrLen nPos, const OUString& rTxt )
|
2013-03-01 10:50:11 +00:00
|
|
|
{
|
|
|
|
//fprintf(stderr, "TestAutoCorrDoc::Insert\n");
|
2013-06-06 20:51:05 +02:00
|
|
|
m_rText = m_rText.replaceAt(nPos, 0, rTxt);
|
2013-03-01 10:50:11 +00:00
|
|
|
return true;
|
|
|
|
}
|
2013-09-06 12:01:31 +02:00
|
|
|
virtual sal_Bool Replace( xub_StrLen nPos, const OUString& rTxt )
|
2013-03-01 10:50:11 +00:00
|
|
|
{
|
|
|
|
//fprintf(stderr, "TestAutoCorrDoc::Replace\n");
|
2013-09-06 12:01:31 +02:00
|
|
|
return ReplaceRange( nPos, rTxt.getLength(), rTxt );
|
2013-03-01 10:50:11 +00:00
|
|
|
}
|
2013-09-06 12:01:31 +02:00
|
|
|
virtual sal_Bool ReplaceRange( xub_StrLen nPos, xub_StrLen nLen, const OUString& rTxt )
|
2013-03-01 10:50:11 +00:00
|
|
|
{
|
|
|
|
//fprintf(stderr, "TestAutoCorrDoc::ReplaceRange %d %d %s\n", nPos, nLen, OUStringToOString(rTxt, RTL_TEXTENCODING_UTF8).getStr());
|
2013-06-06 20:51:05 +02:00
|
|
|
m_rText = m_rText.replaceAt(nPos, nLen, rTxt);
|
2013-03-01 10:50:11 +00:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
virtual sal_Bool SetAttr( xub_StrLen, xub_StrLen, sal_uInt16, SfxPoolItem& )
|
|
|
|
{
|
|
|
|
//fprintf(stderr, "TestAutoCorrDoc::SetAttr\n");
|
|
|
|
return true;
|
|
|
|
}
|
2013-07-28 16:40:20 +02:00
|
|
|
virtual sal_Bool SetINetAttr( xub_StrLen, xub_StrLen, const OUString& )
|
2013-03-01 10:50:11 +00:00
|
|
|
{
|
|
|
|
//fprintf(stderr, "TestAutoCorrDoc::SetINetAttr\n");
|
|
|
|
return true;
|
|
|
|
}
|
2013-09-06 12:01:31 +02:00
|
|
|
virtual OUString GetPrevPara( sal_Bool )
|
2013-03-01 10:50:11 +00:00
|
|
|
{
|
|
|
|
//fprintf(stderr, "TestAutoCorrDoc::GetPrevPara\n");
|
2013-09-06 12:01:31 +02:00
|
|
|
return OUString();
|
2013-03-01 10:50:11 +00:00
|
|
|
}
|
2013-09-18 13:51:35 +01:00
|
|
|
virtual bool ChgAutoCorrWord( sal_Int32& rSttPos,
|
|
|
|
sal_Int32 nEndPos, SvxAutoCorrect& rACorrect,
|
2013-09-06 12:01:31 +02:00
|
|
|
OUString* pPara )
|
2013-03-01 10:50:11 +00:00
|
|
|
{
|
|
|
|
//fprintf(stderr, "TestAutoCorrDoc::ChgAutoCorrWord\n");
|
|
|
|
|
2013-06-06 20:51:05 +02:00
|
|
|
if (m_rText.isEmpty())
|
2013-03-01 10:50:11 +00:00
|
|
|
return false;
|
|
|
|
|
2013-06-06 20:51:05 +02:00
|
|
|
const SvxAutocorrWord* pFnd = rACorrect.SearchWordsInList(
|
|
|
|
m_rText, rSttPos, nEndPos, *this, m_eLang);
|
2013-03-01 10:50:11 +00:00
|
|
|
if (pFnd && pFnd->IsTextOnly())
|
|
|
|
{
|
2013-06-06 20:51:05 +02:00
|
|
|
m_rText = m_rText.replaceAt(rSttPos, nEndPos, pFnd->GetLong());
|
2013-09-06 12:01:31 +02:00
|
|
|
if( pPara )
|
|
|
|
*pPara = "";//&pCurNode->GetString();
|
2013-03-01 10:50:11 +00:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
//https://bugs.freedesktop.org/show_bug.cgi?id=55693
|
|
|
|
//Two capitalized letters are not corrected if dash or slash are directly
|
|
|
|
//before the two letters
|
|
|
|
void Test::testAutocorrect()
|
|
|
|
{
|
|
|
|
OUString sShareAutocorrFile;
|
|
|
|
OUString sUserAutocorrFile;
|
|
|
|
SvxAutoCorrect aAutoCorrect(sShareAutocorrFile, sUserAutocorrFile);
|
|
|
|
|
|
|
|
{
|
|
|
|
OUString sInput("TEst-TEst");
|
|
|
|
sal_Unicode cNextChar(' ');
|
|
|
|
OUString sExpected("Test-Test ");
|
|
|
|
|
|
|
|
TestAutoCorrDoc aFoo(sInput, LANGUAGE_ENGLISH_US);
|
2013-06-06 20:51:05 +02:00
|
|
|
aAutoCorrect.DoAutoCorrect(aFoo, sInput, sInput.getLength(), cNextChar, true);
|
2013-03-01 10:50:11 +00:00
|
|
|
|
|
|
|
CPPUNIT_ASSERT_MESSAGE("autocorrect", aFoo.getResult() == sExpected);
|
|
|
|
}
|
|
|
|
|
|
|
|
{
|
|
|
|
OUString sInput("TEst/TEst");
|
|
|
|
sal_Unicode cNextChar(' ');
|
|
|
|
OUString sExpected("Test/Test ");
|
|
|
|
|
|
|
|
TestAutoCorrDoc aFoo(sInput, LANGUAGE_ENGLISH_US);
|
2013-06-06 20:51:05 +02:00
|
|
|
aAutoCorrect.DoAutoCorrect(aFoo, sInput, sInput.getLength(), cNextChar, true);
|
2013-03-01 10:50:11 +00:00
|
|
|
|
|
|
|
CPPUNIT_ASSERT_MESSAGE("autocorrect", aFoo.getResult() == sExpected);
|
|
|
|
}
|
2013-06-06 20:51:05 +02:00
|
|
|
|
|
|
|
{
|
|
|
|
// test auto-bolding with '*'
|
|
|
|
OUString sInput("*foo");
|
|
|
|
sal_Unicode cNextChar('*');
|
|
|
|
OUString sExpected("foo");
|
|
|
|
|
|
|
|
TestAutoCorrDoc aFoo(sInput, LANGUAGE_ENGLISH_US);
|
2013-09-18 13:51:35 +01:00
|
|
|
aAutoCorrect.DoAutoCorrect(aFoo, sInput, sInput.getLength(), cNextChar, true);
|
2013-06-06 20:51:05 +02:00
|
|
|
|
|
|
|
CPPUNIT_ASSERT_EQUAL(sExpected, aFoo.getResult());
|
|
|
|
}
|
2013-08-20 14:56:27 -04:00
|
|
|
}
|
|
|
|
|
2013-08-28 14:41:12 -04:00
|
|
|
bool hasBold(const editeng::Section& rSecAttr)
|
2013-08-20 14:56:27 -04:00
|
|
|
{
|
|
|
|
std::vector<const SfxPoolItem*>::const_iterator it = rSecAttr.maAttributes.begin(), itEnd = rSecAttr.maAttributes.end();
|
|
|
|
for (; it != itEnd; ++it)
|
|
|
|
{
|
|
|
|
const SfxPoolItem* p = *it;
|
|
|
|
if (p->Which() != EE_CHAR_WEIGHT)
|
|
|
|
continue;
|
|
|
|
|
|
|
|
if (static_cast<const SvxWeightItem*>(p)->GetWeight() != WEIGHT_BOLD)
|
|
|
|
continue;
|
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2013-08-28 14:41:12 -04:00
|
|
|
bool hasItalic(const editeng::Section& rSecAttr)
|
2013-08-20 14:56:27 -04:00
|
|
|
{
|
|
|
|
std::vector<const SfxPoolItem*>::const_iterator it = rSecAttr.maAttributes.begin(), itEnd = rSecAttr.maAttributes.end();
|
|
|
|
for (; it != itEnd; ++it)
|
|
|
|
{
|
|
|
|
const SfxPoolItem* p = *it;
|
|
|
|
if (p->Which() != EE_CHAR_ITALIC)
|
|
|
|
continue;
|
|
|
|
|
|
|
|
if (static_cast<const SvxPostureItem*>(p)->GetPosture() != ITALIC_NORMAL)
|
|
|
|
continue;
|
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
void Test::testSectionAttributes()
|
|
|
|
{
|
|
|
|
EditEngine aEngine(mpItemPool);
|
|
|
|
|
|
|
|
boost::scoped_ptr<SfxItemSet> pSet(new SfxItemSet(aEngine.GetEmptyItemSet()));
|
|
|
|
SvxWeightItem aBold(WEIGHT_BOLD, EE_CHAR_WEIGHT);
|
|
|
|
SvxPostureItem aItalic(ITALIC_NORMAL, EE_CHAR_ITALIC);
|
2013-06-06 20:51:05 +02:00
|
|
|
|
2013-08-28 11:16:12 -04:00
|
|
|
{
|
|
|
|
OUString aParaText = "aaabbbccc";
|
|
|
|
aEngine.SetText(aParaText);
|
|
|
|
pSet->Put(aBold);
|
|
|
|
CPPUNIT_ASSERT_MESSAGE("There should be exactly one item.", pSet->Count() == 1);
|
|
|
|
aEngine.QuickSetAttribs(*pSet, ESelection(0,0,0,6)); // 'aaabbb' - end point is not inclusive.
|
|
|
|
pSet.reset(new SfxItemSet(aEngine.GetEmptyItemSet()));
|
|
|
|
pSet->Put(aItalic);
|
|
|
|
CPPUNIT_ASSERT_MESSAGE("There should be exactly one item.", pSet->Count() == 1);
|
|
|
|
|
|
|
|
aEngine.QuickSetAttribs(*pSet, ESelection(0,3,0,9)); // 'bbbccc'
|
|
|
|
boost::scoped_ptr<EditTextObject> pEditText(aEngine.CreateTextObject());
|
|
|
|
CPPUNIT_ASSERT_MESSAGE("Failed to create text object.", pEditText.get());
|
2013-08-28 14:41:12 -04:00
|
|
|
std::vector<editeng::Section> aAttrs;
|
|
|
|
pEditText->GetAllSections(aAttrs);
|
2013-08-28 11:16:12 -04:00
|
|
|
|
|
|
|
// Now, we should have a total of 3 sections.
|
|
|
|
CPPUNIT_ASSERT_MESSAGE("There should be 3 sections.", aAttrs.size() == 3);
|
|
|
|
|
|
|
|
// First section should be 0-3 of paragraph 0, and it should only have boldness applied.
|
2013-08-28 14:41:12 -04:00
|
|
|
const editeng::Section* pSecAttr = &aAttrs[0];
|
2013-08-28 11:16:12 -04:00
|
|
|
CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(0), pSecAttr->mnParagraph);
|
|
|
|
CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(0), pSecAttr->mnStart);
|
|
|
|
CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(3), pSecAttr->mnEnd);
|
|
|
|
CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(1), pSecAttr->maAttributes.size());
|
|
|
|
CPPUNIT_ASSERT_MESSAGE("This section must be bold.", hasBold(*pSecAttr));
|
|
|
|
|
|
|
|
// Second section should be 3-6, and it should be both bold and italic.
|
|
|
|
pSecAttr = &aAttrs[1];
|
|
|
|
CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(0), pSecAttr->mnParagraph);
|
|
|
|
CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(3), pSecAttr->mnStart);
|
|
|
|
CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(6), pSecAttr->mnEnd);
|
|
|
|
CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(2), pSecAttr->maAttributes.size());
|
|
|
|
CPPUNIT_ASSERT_MESSAGE("This section must be bold and italic.", hasBold(*pSecAttr) && hasItalic(*pSecAttr));
|
|
|
|
|
|
|
|
// Third section should be 6-9, and it should be only italic.
|
|
|
|
pSecAttr = &aAttrs[2];
|
|
|
|
CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(0), pSecAttr->mnParagraph);
|
|
|
|
CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(6), pSecAttr->mnStart);
|
|
|
|
CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(9), pSecAttr->mnEnd);
|
|
|
|
CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(1), pSecAttr->maAttributes.size());
|
|
|
|
CPPUNIT_ASSERT_MESSAGE("This section must be italic.", hasItalic(*pSecAttr));
|
|
|
|
}
|
|
|
|
|
|
|
|
{
|
|
|
|
// Set text consisting of 5 paragraphs with the 2nd and 4th paragraphs
|
|
|
|
// being empty.
|
|
|
|
aEngine.Clear();
|
|
|
|
aEngine.SetText("one\n\ntwo\n\nthree");
|
|
|
|
sal_Int32 nParaCount = aEngine.GetParagraphCount();
|
|
|
|
sal_Int32 nCheck = 5;
|
|
|
|
CPPUNIT_ASSERT_EQUAL(nCheck, nParaCount);
|
|
|
|
|
|
|
|
// Apply boldness to paragraphs 1, 3, 5 only. Leave 2 and 4 unformatted.
|
|
|
|
pSet.reset(new SfxItemSet(aEngine.GetEmptyItemSet()));
|
|
|
|
pSet->Put(aBold);
|
|
|
|
CPPUNIT_ASSERT_MESSAGE("There should be exactly one item.", pSet->Count() == 1);
|
|
|
|
aEngine.QuickSetAttribs(*pSet, ESelection(0,0,0,3));
|
|
|
|
aEngine.QuickSetAttribs(*pSet, ESelection(2,0,2,3));
|
|
|
|
aEngine.QuickSetAttribs(*pSet, ESelection(4,0,4,5));
|
|
|
|
|
|
|
|
boost::scoped_ptr<EditTextObject> pEditText(aEngine.CreateTextObject());
|
|
|
|
CPPUNIT_ASSERT_MESSAGE("Failed to create text object.", pEditText.get());
|
2013-08-28 14:41:12 -04:00
|
|
|
std::vector<editeng::Section> aAttrs;
|
|
|
|
pEditText->GetAllSections(aAttrs);
|
2013-08-28 11:16:12 -04:00
|
|
|
size_t nSecCountCheck = 5;
|
|
|
|
CPPUNIT_ASSERT_EQUAL(nSecCountCheck, aAttrs.size());
|
|
|
|
|
|
|
|
// 1st, 3rd and 5th sections should correspond with 1st, 3rd and 5th paragraphs.
|
2013-08-28 14:41:12 -04:00
|
|
|
const editeng::Section* pSecAttr = &aAttrs[0];
|
2013-08-28 11:16:12 -04:00
|
|
|
CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(0), pSecAttr->mnParagraph);
|
|
|
|
CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(0), pSecAttr->mnStart);
|
|
|
|
CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(3), pSecAttr->mnEnd);
|
|
|
|
CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(1), pSecAttr->maAttributes.size());
|
|
|
|
CPPUNIT_ASSERT_MESSAGE("This section must be bold.", hasBold(*pSecAttr));
|
|
|
|
|
|
|
|
pSecAttr = &aAttrs[2];
|
|
|
|
CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(2), pSecAttr->mnParagraph);
|
|
|
|
CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(0), pSecAttr->mnStart);
|
|
|
|
CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(3), pSecAttr->mnEnd);
|
|
|
|
CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(1), pSecAttr->maAttributes.size());
|
|
|
|
CPPUNIT_ASSERT_MESSAGE("This section must be bold.", hasBold(*pSecAttr));
|
|
|
|
|
|
|
|
pSecAttr = &aAttrs[4];
|
|
|
|
CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(4), pSecAttr->mnParagraph);
|
|
|
|
CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(0), pSecAttr->mnStart);
|
|
|
|
CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(5), pSecAttr->mnEnd);
|
|
|
|
CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(1), pSecAttr->maAttributes.size());
|
|
|
|
CPPUNIT_ASSERT_MESSAGE("This section must be bold.", hasBold(*pSecAttr));
|
|
|
|
|
|
|
|
// The 2nd and 4th paragraphs should be empty.
|
|
|
|
pSecAttr = &aAttrs[1];
|
|
|
|
CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(1), pSecAttr->mnParagraph);
|
|
|
|
CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(0), pSecAttr->mnStart);
|
|
|
|
CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(0), pSecAttr->mnEnd);
|
|
|
|
CPPUNIT_ASSERT_MESSAGE("Attribute array should be empty.", pSecAttr->maAttributes.empty());
|
|
|
|
|
|
|
|
pSecAttr = &aAttrs[3];
|
|
|
|
CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(3), pSecAttr->mnParagraph);
|
|
|
|
CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(0), pSecAttr->mnStart);
|
|
|
|
CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(0), pSecAttr->mnEnd);
|
|
|
|
CPPUNIT_ASSERT_MESSAGE("Attribute array should be empty.", pSecAttr->maAttributes.empty());
|
|
|
|
}
|
2013-03-01 10:50:11 +00:00
|
|
|
}
|
|
|
|
|
2012-04-11 14:29:11 -04:00
|
|
|
CPPUNIT_TEST_SUITE_REGISTRATION(Test);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
CPPUNIT_PLUGIN_IMPLEMENT();
|
|
|
|
|
|
|
|
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|