--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/textrendering/texthandling/ttext/T_CPLAIN.CPP Fri Jun 04 10:37:54 2010 +0100
@@ -0,0 +1,1004 @@
+/*
+* Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+
+#include <e32test.h>
+#include <txtetext.h>
+
+LOCAL_D RTest test(_L("CPlainText Document"));
+
+const TBool KPictureIsDelimiter=EFalse;
+const TBool KPunctuationIsDelimiter=ETrue;
+
+template<class S,class T,CEditableText::TDocumentStorage D>
+class TestCPlainText : public CPlainText
+ {
+public:
+ static TestCPlainText* NewL();
+ void TestL(); // Controls testing of the Flat storage usage.
+ void TestSegmentedL(); // Controls testing of the segmented storage usage.
+ void CheckDocLength(TInt aLength);
+ void CheckDocLength(CPlainText* aDocument,TInt aLength);
+ void CheckContent(const TDesC& aOriginal,TPtrC& aControl);
+ void CheckContent(const TDesC& aOriginal,TDes& aControl);
+ void CheckContent(CPlainText* aDocument,TPtrC& aControl);
+ void CheckParagraphStart(TInt aCalculated,TInt aExpected);
+ void CheckCharsSkipped(TInt aCalculated,TInt aExpected);
+ void DoParagraphStart(TInt aStartPos,TInt aLength,CPlainText* aDocument);
+ void InsertL(TInt aPos,const TDesC& aBuf);
+ void CPlainTest0L(); // Checks all methods are present.
+ void CPlainTest1L(); // Test construction under different memory conditions.
+ void CPlainTest2L(); // Read method tests
+ void CPlainTest3L();
+ void CPlainTest4L();
+ void CPlainTest5L();
+ void CPlainTest5aL(); // Added to test the word info method.
+ void CPlainTest5bL(); // Added to test the CharPosOfParagraph method.
+ void CPlainTest5cL(); // Added to test the ParagraphNumberForPos method.
+ void DoCharPosOfParagraph(CPlainText* aText,TInt aParaN,TInt aPosCheck,TInt aLengthCheck);
+ void DoParagraphNumberForPos(CPlainText* aText,TInt aPos,TInt aParaCheck,TInt aPosCheck);
+ void CPlainTest6L();
+ void CPlainTest7L();
+ void CPlainTest8L();
+ void DefectsL();
+ void INC070807L();
+private:
+ TestCPlainText();
+ TestCPlainText(const TestCPlainText& aTestCPlainText);
+ TestCPlainText& operator=(const TestCPlainText& aTestCPlainText);
+private:
+ static TPtrC iDefaultDoc;
+ static TPtrC iInBuf;
+ static TPtrC iOutBuf;
+ static TPtrC iOutBufComp;
+ static TPtrC iInBuf2;
+ static TPtrC iOutBuf2;
+ static TPtrC iDummy;
+ static TPtrC iComp1;
+ static TPtrC iComp2;
+ static TPtrC iComp3;
+ static TPtrC iComp4;
+ static TPtrC iComp5;
+ static TPtrC iInsertBuf;
+ static TPtrC iTestBuf1;
+ static TPtrC iTestBuf2;
+ static TPtrC iTestBuf2a;
+ static TPtrC iTestBuf3;
+ };
+
+template<> TPtrC TestCPlainText<TText,TPtrC,CEditableText::EFlatStorage>::iDefaultDoc(_L("A default constructor has been used to build this text in a new document that is newly created."));
+template<> TPtrC TestCPlainText<TText,TPtrC,CEditableText::EFlatStorage>::iComp1(_L("A default constructor has been used to build this text in a new document that is newly created."));
+template<> TPtrC TestCPlainText<TText,TPtrC,CEditableText::EFlatStorage>::iComp2(_L("this text in a new document that is newly created."));
+template<> TPtrC TestCPlainText<TText,TPtrC,CEditableText::EFlatStorage>::iComp3(_L("d."));
+template<> TPtrC TestCPlainText<TText,TPtrC,CEditableText::EFlatStorage>::iComp4(_L("."));
+template<> TPtrC TestCPlainText<TText,TPtrC,CEditableText::EFlatStorage>::iComp5(_L(""));
+template<> TPtrC TestCPlainText<TText,TPtrC,CEditableText::EFlatStorage>::iDummy(_L("a"));
+template<> TPtrC TestCPlainText<TText,TPtrC,CEditableText::EFlatStorage>::iInBuf(_L("AAAAAAAAAA"));
+template<> TPtrC TestCPlainText<TText,TPtrC,CEditableText::EFlatStorage>::iOutBuf(_L(""));
+template<> TPtrC TestCPlainText<TText,TPtrC,CEditableText::EFlatStorage>::iInBuf2(_L("OOOO"));
+template<> TPtrC TestCPlainText<TText,TPtrC,CEditableText::EFlatStorage>::iOutBufComp(_L("AAAAAAAAAA"));
+template<> TPtrC TestCPlainText<TText,TPtrC,CEditableText::EFlatStorage>::iOutBuf2(_L(""));
+template<> TPtrC TestCPlainText<TText,TPtrC,CEditableText::EFlatStorage>::iTestBuf1(_L("abcdefINLINE_TEXTghijklmnopqrstuvwxyz"));
+template<> TPtrC TestCPlainText<TText,TPtrC,CEditableText::EFlatStorage>::iInsertBuf(_L("abcdefghijklmnopqrstuvwxyz"));
+template<> TPtrC TestCPlainText<TText,TPtrC,CEditableText::EFlatStorage>::iTestBuf2(_L("klmnopqrstuvwxyz"));
+template<> TPtrC TestCPlainText<TText,TPtrC,CEditableText::EFlatStorage>::iTestBuf2a(_L("klmnopqrst"));
+template<> TPtrC TestCPlainText<TText,TPtrC,CEditableText::EFlatStorage>::iTestBuf3(_L("efghi"));
+
+template<> TPtrC TestCPlainText<TText,TPtrC,CEditableText::ESegmentedStorage>::iDefaultDoc(_L("A default constructor has been used to build this text in a new document that is newly created."));
+template<> TPtrC TestCPlainText<TText,TPtrC,CEditableText::ESegmentedStorage>::iComp1(_L("A default constructor has been used to build this text in a new document that is newly created."));
+template<> TPtrC TestCPlainText<TText,TPtrC,CEditableText::ESegmentedStorage>::iComp2(_L("this text in a new document that is newly created."));
+template<> TPtrC TestCPlainText<TText,TPtrC,CEditableText::ESegmentedStorage>::iComp3(_L("d."));
+template<> TPtrC TestCPlainText<TText,TPtrC,CEditableText::ESegmentedStorage>::iComp4(_L("."));
+template<> TPtrC TestCPlainText<TText,TPtrC,CEditableText::ESegmentedStorage>::iComp5(_L(""));
+template<> TPtrC TestCPlainText<TText,TPtrC,CEditableText::ESegmentedStorage>::iDummy(_L("a"));
+template<> TPtrC TestCPlainText<TText,TPtrC,CEditableText::ESegmentedStorage>::iInBuf(_L("AAAAAAAAAA"));
+template<> TPtrC TestCPlainText<TText,TPtrC,CEditableText::ESegmentedStorage>::iOutBuf(_L(""));
+template<> TPtrC TestCPlainText<TText,TPtrC,CEditableText::ESegmentedStorage>::iInBuf2(_L("OOOO"));
+template<> TPtrC TestCPlainText<TText,TPtrC,CEditableText::ESegmentedStorage>::iOutBufComp(_L("AAAAAAAAAA"));
+template<> TPtrC TestCPlainText<TText,TPtrC,CEditableText::ESegmentedStorage>::iOutBuf2(_L(""));
+
+#if ((defined (__GCC32__)) && (!defined (__X86GCC__)) )
+template class TestCPlainText<TText,TPtrC,CEditableText::EFlatStorage>;
+template class TestCPlainText<TText,TPtrC,CEditableText::ESegmentedStorage>;
+#endif
+
+
+template<class S, class T,CEditableText::TDocumentStorage D>
+TestCPlainText<S,T,D>* TestCPlainText<S,T,D>::NewL()
+//
+//
+//
+ {
+ TestCPlainText<S,T,D>* tmp=new(ELeave)TestCPlainText<S,T,D>;
+ tmp->ConstructL(D);
+ return tmp;
+ }
+
+
+template<class S, class T,CEditableText::TDocumentStorage D>
+TestCPlainText<S,T,D>::TestCPlainText()
+//
+// Default constructor.
+//
+ {}
+
+
+template<class S, class T,CEditableText::TDocumentStorage D>
+void TestCPlainText<S,T,D>::CheckDocLength(TInt aLength)
+//
+// Test the current document length == aLength
+//
+ {
+ TInt docLength=DocumentLength();
+ test(docLength==aLength);
+ }
+
+
+template<class S,class T,CEditableText::TDocumentStorage D>
+void TestCPlainText<S,T,D>::CheckDocLength(CPlainText* aDocument,TInt aLength)
+//
+// Test that the length of document aDocument==aLength
+//
+ {
+ test(aDocument->DocumentLength()==aLength);
+ }
+
+
+template<class S,class T,CEditableText::TDocumentStorage D>
+void TestCPlainText<S,T,D>::CheckContent(const TDesC& aOriginal,TPtrC& aControl)
+//
+// Check that document content is what you expect
+//
+ {
+ test(aOriginal.Length()==aControl.Length());
+ for (TInt offset=0;offset<aOriginal.Length();offset++)
+ {
+ test(aOriginal[offset]==aControl[offset]);
+ }
+ }
+
+
+template<class S,class T,CEditableText::TDocumentStorage D>
+void TestCPlainText<S,T,D>::CheckContent(const TDesC& aOriginal,TDes& aControl)
+//
+// Check that document content is what you expect
+//
+ {
+ test(aOriginal.Length()==aControl.Length());
+ for (TInt offset=0;offset<aOriginal.Length();offset++)
+ {
+ test(*aOriginal.Ptr()==*aControl.Ptr());
+ }
+ }
+
+
+
+template<class S,class T,CEditableText::TDocumentStorage D>
+void TestCPlainText<S,T,D>::CheckContent(CPlainText* aDocument,TPtrC& aControl)
+//
+// Check that document content is what you expect
+//
+ {
+ test(aDocument->DocumentLength()==aControl.Length());
+ TPtrC view(iDummy);
+ for (TInt offset=0;offset<aDocument->DocumentLength();offset++)
+ {
+ view.Set(aDocument->Read(offset).Ptr(),aDocument->Read(offset).Length());
+ test(*view.Ptr()==aControl[offset]);
+ }
+ }
+
+
+template<class S,class T,CEditableText::TDocumentStorage D>
+void TestCPlainText<S,T,D>::CheckParagraphStart(TInt aCalculated,TInt aExpected)
+//
+// Checks the value returned from ParagraphStart(aPos) is what
+// it is expected to be.
+//
+ {
+ test(aCalculated==aExpected);
+ }
+
+
+template<class S,class T,CEditableText::TDocumentStorage D>
+void TestCPlainText<S,T,D>::CheckCharsSkipped(TInt aCalculated,TInt aExpected)
+//
+// Check the number of characters skipped following a ParagraphStart()
+// is as expected.
+//
+ {
+ test(aCalculated==aExpected);
+ }
+
+
+template<class S,class T,CEditableText::TDocumentStorage D>
+void TestCPlainText<S,T,D>::InsertL(TInt aPos,const TDesC& aBuf)
+//
+ {CPlainText::InsertL(aPos,aBuf);}
+
+
+
+template<class S,class T,CEditableText::TDocumentStorage D>
+void TestCPlainText<S,T,D>::DoParagraphStart(TInt aStartPos,TInt aLength,CPlainText* aDocument)
+//
+// Parametric testing of the ParagraphStart method of the
+// document class hierarchy.
+//
+ {
+ TInt tempPos=0;
+ TInt charsSkipped=0;
+ for (TInt charPos=aStartPos;charPos<aStartPos+aLength;charPos++)
+ {// Check Paragraph
+ tempPos=charPos;
+ charsSkipped=aDocument->ToParagraphStart(charPos);
+ // charPos is updated to paragraph start character position.
+ CheckParagraphStart(charPos,aStartPos);
+ charPos=tempPos; // Reset charPos following it's update.
+ CheckCharsSkipped(charsSkipped,charPos-aStartPos);
+ }
+ }
+
+
+template<class S,class T,CEditableText::TDocumentStorage D>
+void TestCPlainText<S,T,D>::CPlainTest0L()
+//
+// Tests that all published methods exist.
+//
+ {
+ __UHEAP_MARK;
+ CPlainText* doc=CPlainText::NewL(D);
+ doc->DocumentLength();
+ doc->InsertL(0,iDefaultDoc);
+ TChar character('X');
+ doc->InsertL(0,character);
+ TInt pos=3;
+ doc->ToParagraphStart(pos);
+ doc->DeleteL(3,1);
+ doc->Read(2);
+ doc->Read(2,2);
+ TBuf<128> buf;
+ doc->Extract(buf);
+ TInt startPos,length;
+ doc->GetWordInfo(13,startPos,length,KPictureIsDelimiter,KPunctuationIsDelimiter);
+ doc->WordCount();
+ doc->ParagraphCount();
+ doc->Reset();
+ delete doc;
+ __UHEAP_MARKEND;
+ }
+
+
+template<class S, class T,CEditableText::TDocumentStorage D>
+void TestCPlainText<S,T,D>::CPlainTest1L()
+//
+// PlainText document construction.
+//
+ {
+ __UHEAP_MARK;
+ test(iByteStore!=NULL);
+ CheckDocLength(0);
+
+ test.Start(_L("NewL()"));
+ CPlainText* document=CPlainText::NewL(D);
+ document->InsertL(0,iDefaultDoc);
+ test(document->DocumentLength()==95);
+ delete document;
+#ifdef _DEBUG
+ test.Next(_L("NewL() failing on OOM"));
+ TInt flag=0;
+ __UHEAP_FAILNEXT(1);
+ TRAPD(ret, (void)CPlainText::NewL(D));
+ if (ret!=KErrNone)
+ {
+ flag++;
+ }
+ test(flag!=0);
+#endif
+
+ test.End();
+ __UHEAP_MARKEND;
+ }
+
+
+template<class S, class T,CEditableText::TDocumentStorage D>
+void TestCPlainText<S,T,D>::CPlainTest2L()
+//
+// Tests the Read method.
+// Does alter the state of the object.
+//
+ {
+ __UHEAP_MARK;
+ CPlainText* document=CPlainText::NewL(D);
+ document->InsertL(0,iDefaultDoc);
+
+ test.Start(_L("sense from start"));
+ /*TPtrC dummy=*/document->Read(0);
+ CheckDocLength(document,95);
+ CheckContent(document,iComp1);
+
+ test.Next(_L("sense from n"));
+ TPtrC dummy2=document->Read(45);
+ //iDummy.Set(document->Read(45).Ptr(),document->Read(45).Length());
+ CPlainText* doc2=CPlainText::NewL(D);
+ doc2->InsertL(0,dummy2);
+ doc2->DeleteL(50,1); // We need a debug copy constructor here. The origianl
+ // document has an oed character, and when we construct a new doucment
+ // based on the original, we get our own eod character plus the one that is
+ // part of the original, = 2 eod characters.
+ // This breaks the following tests. So in the short term I have elected to delete this
+ // trailing, unwanted eod character.
+ CheckDocLength(doc2,50);
+ CheckContent(doc2,iComp2);
+ delete doc2;
+
+ test.Next(_L("sense from last-1"));
+ iDummy.Set(document->Read(93).Ptr(),document->Read(93).Length());
+ CPlainText* doc3=CPlainText::NewL(D);
+ doc3->InsertL(0,iDummy);
+ doc3->DeleteL(2,1);
+ CheckDocLength(doc3,2);
+ CheckContent(doc3,iComp3);
+ delete doc3;
+
+ test.Next(_L("sense from last"));
+ iDummy.Set(document->Read(94).Ptr(),document->Read(94).Length());
+ CPlainText* doc4=CPlainText::NewL(D);
+ doc4->InsertL(0,iDummy);
+ doc4->DeleteL(1,1);
+ CheckDocLength(doc4,1);
+ CheckContent(doc4,iComp4);
+ delete doc4;
+
+ test.Next(_L("sense from last+1"));
+ iDummy.Set(document->Read(95).Ptr(),document->Read(95).Length());
+ CPlainText* doc5=CPlainText::NewL(D);
+ doc5->InsertL(0,iDummy);
+ doc5->DeleteL(0,1);
+ CheckDocLength(doc5,0);
+ CheckContent(doc5,iComp5);
+ delete doc5;
+
+ delete document;
+ test.End();
+ __UHEAP_MARKEND;
+ }
+
+
+template<class S, class T,CEditableText::TDocumentStorage D>
+void TestCPlainText<S,T,D>::CPlainTest3L()
+//
+// Tests correct execution of insert and delete
+// on default document content. The document
+// content should be left unchanged.
+//
+ {
+ __UHEAP_MARK;
+ // Create document with 'AAAAAAAAAA'
+ TChar character('Y');
+ CPlainText* document=CPlainText::NewL(D);
+ document->InsertL(0,iInBuf);
+ iOutBuf.Set(document->Read(0));
+ CheckDocLength(document,10);
+ CheckContent(document,iOutBufComp);
+
+ test.Start(_L("Inverting at start"));
+ document->InsertL(0,iInBuf2);
+ document->InsertL(0,character);
+ document->DeleteL(0,1);
+ CheckDocLength(document,14);
+ document->DeleteL(0,4);
+ iOutBuf2.Set(document->Read(0));
+ CheckDocLength(document,10);
+ CheckContent(document,iOutBufComp);
+
+ test.Next(_L("Inverting in middle"));
+ document->InsertL(4,iInBuf2);
+ document->InsertL(5,character);
+ document->DeleteL(5,1);
+ CheckDocLength(document,14);
+ document->DeleteL(4,4);
+ iOutBuf2.Set(document->Read(0));
+ CheckDocLength(document,10);
+ CheckContent(document,iOutBufComp);
+
+ test.Next(_L("Inverting at end"));
+ document->InsertL(10,iInBuf2);
+ document->InsertL(11,character);
+ document->DeleteL(11,1);
+ CheckDocLength(document,14);
+ document->DeleteL(10,4);
+ iOutBuf2.Set(document->Read(0));
+ CheckDocLength(document,10);
+ CheckContent(document,iOutBufComp);
+
+ document->DeleteL(0,10);
+ CheckDocLength(0);
+ delete document;
+ test.End();
+ __UHEAP_MARKEND;
+ }
+
+
+template<class S,class T,CEditableText::TDocumentStorage D>
+void TestCPlainText<S,T,D>::CPlainTest4L()
+//
+// Test scan method combinations
+//
+ {
+ // Create document content for test.
+ TBuf<128> content;
+ content.Append(_L("Paragraph one. Complete with sentence and word breaks."));
+ content.Append(EParagraphDelimiter);
+ // Para 1 is 55 characters incl. delimiter.
+ content.Append(_L("This is paragraph two."));
+ content.Append(EParagraphDelimiter);
+ // Para 2 is 23 characters incl. delimiter.
+ content.Append(_L("This is paragraph 3"));
+ content.Append(EParagraphDelimiter);
+ // Para 3 is 20 characters incl. delimiter.
+ content.Append(EParagraphDelimiter);
+ // Para 4 is 1 character incl. delimiter.
+ content.Append(EParagraphDelimiter);
+ content.Append(EParagraphDelimiter);
+ // Create document.
+ CPlainText* document=CPlainText::NewL(D);
+ TPtrC body(content);
+ document->InsertL(0,body);
+ // Now do the tests.
+ test.Start(_L("Paragraph 1"));
+ DoParagraphStart(0,55,document); // Paragraph 1
+ test.Next(_L("Paragraph 2"));
+ DoParagraphStart(55,23,document); // Paragraph 2
+ test.Next(_L("Paragraph 3"));
+ DoParagraphStart(78,20,document); // Paragraph 3
+ test.Next(_L("Paragraph 4->2 consecutive delimiters, posshould not change"));
+ DoParagraphStart(99,1,document); // Paragraph 6
+
+ delete document;
+ test.End();
+ }
+
+
+template<class S,class T,CEditableText::TDocumentStorage D>
+void TestCPlainText<S,T,D>::CPlainTest5L()
+//
+// Tests the extract method.
+//
+ {
+ __UHEAP_MARK;
+ CPlainText* doc=CPlainText::NewL(D);
+ doc->InsertL(0,iDefaultDoc);
+
+ test.Start(_L("Extract(buf)"));
+ TBuf<128> buf;
+ doc->Extract(buf);
+ CheckContent(iDefaultDoc,buf);
+
+ test.Next(_L("Extract(buf,pos)"));
+ TInt pos=45;
+ doc->Extract(buf,pos);
+ CheckContent(iComp2,buf);
+
+ test.Next(_L("Extract(buf) from multiple segments"));
+ TBuf<256> bigBuf(_L("abcdefghijklmnopqrstuvwxyzABCEDFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzABCEDFGHIJKLMNOPQRSTUVWXYZ"));
+ CPlainText* segDoc=CPlainText::NewL(ESegmentedStorage);
+ segDoc->InsertL(0,bigBuf);
+ segDoc->Extract(buf);
+ CheckContent(bigBuf,buf);
+ delete segDoc;
+
+ test.End();
+ delete doc;
+ __UHEAP_MARKEND;
+ }
+
+
+template<class S,class T,CEditableText::TDocumentStorage D>
+void TestCPlainText<S,T,D>::CPlainTest5aL()
+//
+// Tests the WordInfo() method.
+//
+ {
+ __UHEAP_MARK;
+ TPtrC content(_L(" some testing a texty content"));
+
+ CPlainText* doc=CPlainText::NewL(D);
+ doc->InsertL(0,content);
+
+ test.Start(_L("WordInfo()"));
+ TInt currentPos,startPos,length;
+ currentPos=0;
+ doc->GetWordInfo(currentPos,startPos,length,KPictureIsDelimiter,KPunctuationIsDelimiter);
+ test(startPos==0); test(length==0);
+ currentPos=1;
+ doc->GetWordInfo(currentPos,startPos,length,KPictureIsDelimiter,KPunctuationIsDelimiter);
+ test(startPos==1); test(length==0);
+ currentPos=2;
+ doc->GetWordInfo(currentPos,startPos,length,KPictureIsDelimiter,KPunctuationIsDelimiter);
+ test(startPos==2); test(length==0);
+
+ currentPos=3;
+ doc->GetWordInfo(currentPos,startPos,length,KPictureIsDelimiter,KPunctuationIsDelimiter);
+ test(startPos==3); test(length==4);
+
+ currentPos=5;
+ doc->GetWordInfo(currentPos,startPos,length,KPictureIsDelimiter,KPunctuationIsDelimiter);
+ test(startPos==3); test(length==4);
+
+ currentPos=7;
+ doc->GetWordInfo(currentPos,startPos,length,KPictureIsDelimiter,KPunctuationIsDelimiter);
+ test(startPos==3); test(length==4);
+
+ currentPos=8;
+ doc->GetWordInfo(currentPos,startPos,length,KPictureIsDelimiter,KPunctuationIsDelimiter);
+ test(startPos==8); test(length==0);
+
+ currentPos=9;
+ doc->GetWordInfo(currentPos,startPos,length,KPictureIsDelimiter,KPunctuationIsDelimiter);
+ test(startPos==9); test(length==0);
+
+ currentPos=10;
+ doc->GetWordInfo(currentPos,startPos,length,KPictureIsDelimiter,KPunctuationIsDelimiter);
+ test(startPos==10); test(length==7);
+
+ currentPos=18;
+ doc->GetWordInfo(currentPos,startPos,length,KPictureIsDelimiter,KPunctuationIsDelimiter);
+ test(startPos==18); test(length==0);
+
+ currentPos=19;
+ doc->GetWordInfo(currentPos,startPos,length,KPictureIsDelimiter,KPunctuationIsDelimiter);
+ test(startPos==19); test(length==1);
+
+ currentPos=20;
+ doc->GetWordInfo(currentPos,startPos,length,KPictureIsDelimiter,KPunctuationIsDelimiter);
+ test(startPos==19); test(length==1);
+
+ currentPos=21;
+ doc->GetWordInfo(currentPos,startPos,length,KPictureIsDelimiter,KPunctuationIsDelimiter);
+ test(startPos==21); test(length==0);
+
+ currentPos=38;
+ doc->GetWordInfo(currentPos,startPos,length,KPictureIsDelimiter,KPunctuationIsDelimiter);
+ test(startPos=32); test(length==7);
+
+ currentPos=39;
+ doc->GetWordInfo(currentPos,startPos,length,KPictureIsDelimiter,KPunctuationIsDelimiter);
+ test(startPos=32); test(length==7);
+
+ test.End();
+ delete doc;
+ __UHEAP_MARKEND;
+ }
+
+
+template<class S,class T,CEditableText::TDocumentStorage D>
+void TestCPlainText<S,T,D>::CPlainTest5bL()
+//
+// Tests the CharPosOfParagraph() method.
+//
+ {
+ __UHEAP_MARK;
+ TPtrC para1(_L("para1"));
+ TPtrC para2(_L("para22"));
+ TPtrC para3(_L("para333"));
+ TPtrC para4(_L("para4444"));
+ CPlainText* doc=CPlainText::NewL(D);
+ doc->InsertL(0,para1);
+ TChar delim(EParagraphDelimiter);
+ doc->InsertL(5,delim);
+ doc->InsertL(6,para2);
+ doc->InsertL(12,delim);
+ doc->InsertL(13,para3);
+ doc->InsertL(20,delim);
+ doc->InsertL(21,para4);
+ //
+ TInt paraN=0;
+ //
+ DoCharPosOfParagraph(doc,paraN,0,6);
+ paraN++;
+ DoCharPosOfParagraph(doc,paraN,6,7);
+ paraN++;
+ DoCharPosOfParagraph(doc,paraN,13,8);
+ paraN++;
+ DoCharPosOfParagraph(doc,paraN,21,9);
+ paraN++;
+ DoCharPosOfParagraph(doc,paraN,CPlainText::EScanEndOfData,-1);
+ //
+ doc->InsertL(0,delim);
+ doc->InsertL(0,delim);
+ paraN=0;
+ DoCharPosOfParagraph(doc,paraN,0,1);
+ doc->InsertL(doc->DocumentLength(),delim);
+ // There are now 6 paras.
+ TInt paraCount=doc->ParagraphCount();
+ test(paraCount==7);
+ paraN=5;
+ DoCharPosOfParagraph(doc,paraN,23,9);
+ paraN++;
+ DoCharPosOfParagraph(doc,paraN,32,1);
+ delete doc;
+ __UHEAP_MARKEND;
+ }
+
+
+template<class S,class T,CEditableText::TDocumentStorage D>
+void TestCPlainText<S,T,D>::DoCharPosOfParagraph(CPlainText* aText,TInt aParaN,TInt aPosCheck,TInt aLengthCheck)
+//
+//
+//
+ {
+ TInt length=0;
+ TInt pos=-1;
+ pos=aText->CharPosOfParagraph(length,aParaN);
+ test(pos==aPosCheck);
+ if (aLengthCheck!=-1)
+ test(length==aLengthCheck);
+ }
+
+
+template<class S,class T,CEditableText::TDocumentStorage D>
+void TestCPlainText<S,T,D>::CPlainTest5cL()
+//
+// Tests the ParagraphNumberForPos() method.
+//
+ {
+ __UHEAP_MARK;
+ TPtrC para1(_L("para1"));
+ TPtrC para2(_L("para22"));
+ TPtrC para3(_L("para333"));
+ TPtrC para4(_L("para4444"));
+ CPlainText* doc=CPlainText::NewL(D);
+ doc->InsertL(0,para1);
+ TChar delim(EParagraphDelimiter);
+ doc->InsertL(5,delim);
+ doc->InsertL(6,para2);
+ doc->InsertL(12,delim);
+ doc->InsertL(13,para3);
+ doc->InsertL(20,delim);
+ doc->InsertL(21,para4);
+ //
+ TInt pos=0;
+ //
+ for (;pos<6;pos++)
+ DoParagraphNumberForPos(doc,pos,0,0);
+ for (pos=6;pos<13;pos++)
+ DoParagraphNumberForPos(doc,pos,1,6);
+ for (pos=13;pos<21;pos++)
+ DoParagraphNumberForPos(doc,pos,2,13);
+ for (pos=21;pos<30;pos++)
+ DoParagraphNumberForPos(doc,pos,3,21);
+ //
+ doc->InsertL(0,delim);
+ doc->InsertL(0,delim);
+ pos=0;
+ DoParagraphNumberForPos(doc,pos,0,0);
+ pos=1;
+ DoParagraphNumberForPos(doc,pos,1,1);
+ doc->InsertL(doc->DocumentLength(),delim);
+ // There are now 7 paras.
+ TInt paraCount=doc->ParagraphCount();
+ test(paraCount==7);
+ pos=32;
+ DoParagraphNumberForPos(doc,pos,6,32);
+ delete doc;
+ __UHEAP_MARKEND;
+ }
+
+
+template<class S,class T,CEditableText::TDocumentStorage D>
+void TestCPlainText<S,T,D>::DoParagraphNumberForPos(CPlainText* aText,TInt aPos,TInt aParaCheck,TInt aPosCheck)
+//
+//
+//
+ {
+ TInt para=-1;
+ para=aText->ParagraphNumberForPos(aPos);
+ test(para==aParaCheck);
+ test(aPos==aPosCheck);
+ }
+
+
+template<class S,class T,CEditableText::TDocumentStorage D>
+void TestCPlainText<S,T,D>::CPlainTest6L()
+//
+// Tests the word count method.
+//
+ {
+ __UHEAP_MARK;
+ CPlainText* doc=CPlainText::NewL(D);
+ TInt count=doc->WordCount();
+ test(count==0);
+
+ TPtrC buf(_L("This has four words"));
+ doc->InsertL(0,buf);
+ count=doc->WordCount();
+ test(count==4);
+ delete doc;
+ __UHEAP_MARKEND;
+ }
+
+
+template<class S,class T,CEditableText::TDocumentStorage D>
+void TestCPlainText<S,T,D>::CPlainTest7L()
+//
+// Tests the paragraph count method.
+//
+ {
+ __UHEAP_MARK;
+ CPlainText* doc=CPlainText::NewL(D);
+ TPtrC buf(_L("This has four words"));
+ doc->InsertL(0,buf);
+ TInt count=doc->ParagraphCount();
+ test(count==1);
+ delete doc;
+ __UHEAP_MARKEND;
+ }
+
+
+template<class S,class T,CEditableText::TDocumentStorage D>
+void TestCPlainText<S,T,D>::CPlainTest8L()
+//
+// Tests the reset method behave as specified.
+//
+ {
+ __UHEAP_MARK;
+ test.Start(_L("1st Reset"));
+ CPlainText* doc=CPlainText::NewL(D);
+ doc->InsertL(0,iDefaultDoc);
+ test(doc->DocumentLength()==95);
+ doc->Reset();
+ test(doc->DocumentLength()==0);
+
+ // Test multiple resets work.
+ // This defect was highlighted by DavidW 13.10.95.
+ // It arises because I have added an assert length>0 in the delete method.
+ // Clearly on a second reset the length is zero, hence the failure.
+ // Defect fixed 13.10.95 by DuncanS and included in the tests below.
+ test.Next(_L("2nd Reset - defect - DavidW 13.10.95"));
+ doc->Reset();
+
+ delete doc;
+ test.End();
+ __UHEAP_MARKEND;
+ }
+
+/**
+@SYMTestCaseID SYSLIB-ETEXT-UT-1574
+@SYMTestCaseDesc Tests for the removal of inline text when inline text removal flag is set.
+@SYMTestPriority High
+@SYMTestActions Inserts some inline text into a section of text, tests to make sure it was inserts
+ then it removes the inline text and tests to make sure it was all removed correctly.
+@SYMTestExpectedResults Test must not fail
+@SYMDEF INC070807
+*/
+
+
+template<class S,class T,CEditableText::TDocumentStorage D>
+void TestCPlainText<S,T,D>::INC070807L()
+//
+// Tests whether inline text is removed when the EExcludeInlineEditedText flag is set.
+//
+ {
+ __UHEAP_MARK;
+
+ TInt textLengthFifty = 50;
+ TInt textLengthTen = 10;
+ TInt startingPositionZero = 0;
+ TInt startingPositionTen = 10;
+ TInt NumberDeleted, NumberInserted, PositionOfInsertion, NewPositionOfInsertion = 0;
+ TBool HasChangedFormat = NULL;
+ TInt NumberToHide = 0;
+ MFepInlineTextFormatRetriever* InlineTextFormatRetriever = NULL;
+ TBufC<20> InitialInlineText =_L("INLINE_TEXT"); // inline text to be inserted
+ TBuf<50> outputBuf;
+
+ test.Start(_L("Return all the text"));
+ CPlainText* doc=CPlainText::NewL(D);
+ doc->DocumentLength();
+ doc->InsertL(0,iInsertBuf); // insert "abcdefghijklmnopqrstuvwxyz"
+
+
+ TInt PosOfInlineText = 6;
+
+ doc->StartFepInlineEditL(HasChangedFormat,NumberDeleted,NumberInserted,PositionOfInsertion,NewPositionOfInsertion,InitialInlineText,PosOfInlineText,NumberToHide,*InlineTextFormatRetriever);
+
+ doc->Extract(outputBuf, startingPositionZero, textLengthFifty); // Returns all the text
+ test (iTestBuf1 == outputBuf); // testing outputBuf, making sure it contains the inline text - "abcdefINLINE_TEXTghijklmnopqrstuvwxyz"
+
+ test.Next(_L("Extract and discard only the inline text, from Pos0 returning the rest"));
+ doc->ExtractSelectively(outputBuf, startingPositionZero, textLengthFifty, EExcludeInlineEditedText); // Returns only non-inline text
+ test (iInsertBuf == outputBuf); // testing outputBuf, making sure the inline text has been extracted correctly - "abcdefghijklmnopqrstuvwxyz"
+ delete doc;
+
+
+ CPlainText* doc2=CPlainText::NewL(D);
+ doc2->DocumentLength();
+ doc2->InsertL(0,iInsertBuf); // insert "abcdefghijklmnopqrstuvwxyz"
+
+ test.Next(_L("Extract upto 50 character, from Pos10, within the range (no inline editting set)"));
+ // Returns upto 50 characters starting from Pos10
+ doc2->ExtractSelectively(outputBuf, startingPositionTen, textLengthFifty, EExcludeInlineEditedText);
+ test (iTestBuf2 == outputBuf); // "klmnopqrstuvwxyz"
+
+ test.Next(_L("Extract upto 10 characters, from Pos10, within the range (no inline editting set)"));
+ // Returns upto 10 characters starting from Pos10
+ doc2->ExtractSelectively(outputBuf, startingPositionTen, textLengthTen, EExcludeInlineEditedText);
+ test (iTestBuf2a == outputBuf); // "klmnopqrst"
+
+ test.Next(_L("Extract upto 50 character, from Pos0, 'EExtractAll' flag selected"));
+ // Returns upto 50 characters starting from Pos0.
+ doc2->ExtractSelectively(outputBuf, startingPositionZero, textLengthFifty, EExtractAll);
+ test (iInsertBuf == outputBuf); // "abcdefghijklmnopqrstuvwxyz"
+ delete doc2;
+
+
+ CPlainText* doc3=CPlainText::NewL(D);
+ doc3->DocumentLength();
+ doc3->InsertL(0,iInsertBuf); // insert "abcdefghijklmnopqrstuvwxyz"
+
+ PosOfInlineText = 4;
+
+ doc3->StartFepInlineEditL(HasChangedFormat,NumberDeleted,NumberInserted,PositionOfInsertion,NewPositionOfInsertion,InitialInlineText,PosOfInlineText,NumberToHide,*InlineTextFormatRetriever);
+
+ test.Next(_L("Extract all the non-inline text, from Pos10, within the range (inline editting on)"));
+ doc3->ExtractSelectively(outputBuf, startingPositionTen, textLengthTen, EExcludeInlineEditedText); // Returns only non-inline text.
+ test (iTestBuf3 == outputBuf); // testing outputBuf, making sure the inline text has been extracted correctly - "efghi".
+ delete doc3;
+
+ test.End();
+
+ __UHEAP_MARKEND;
+ }
+
+
+template<class S,class T,CEditableText::TDocumentStorage D>
+void TestCPlainText<S,T,D>::TestSegmentedL()
+//
+// Controls testing of the segmented storage case.
+//
+ {
+ test.Start(_L("All methods"));
+ CPlainTest0L();
+ test.Next(_L("Construction"));
+ CPlainTest1L();
+ test.Next(_L("Read"));
+ test.Start(_L("Not yet implemented"));
+ test.End();
+ test.Next(_L("Inverse Testing using InsertL&Delete: content left intact"));
+ CPlainTest3L();
+ test.Next(_L("Paragraph Start"));
+ CPlainTest4L();
+ test.Next(_L("Extract"));
+ CPlainTest5L();
+ test.Next(_L("WordInfo"));
+ CPlainTest5aL();
+ test.Next(_L("CharPosOfParagraph"));
+ CPlainTest5bL();
+ test.Next(_L("ParagraphNumberForPos"));
+ CPlainTest5cL();
+ test.Next(_L("CountWords"));
+ CPlainTest6L();
+ test.Next(_L("CountParas"));
+ CPlainTest7L();
+ test.Next(_L("Reset"));
+ CPlainTest8L();
+ test.End();
+ }
+
+
+
+template<class S,class T,CEditableText::TDocumentStorage D>
+void TestCPlainText<S,T,D>::TestL()
+//
+// Test the CPlainText methods
+//
+ {
+ test.Start(_L("All methods"));
+ CPlainTest0L();
+ test.Next(_L("Construction"));
+ CPlainTest1L();
+ test.Next(_L("Read"));
+ CPlainTest2L();
+ test.Next(_L("Inverse Testing using InsertL&Delete: content left intact"));
+ CPlainTest3L();
+ test.Next(_L("Paragraph Start"));
+ CPlainTest4L();
+ test.Next(_L("Extract"));
+ CPlainTest5L();
+ test.Next(_L("WordInfo"));
+ CPlainTest5aL();
+ test.Next(_L("CharPosOfParagraph"));
+ CPlainTest5bL();
+ test.Next(_L("ParagraphNumberForPos"));
+ CPlainTest5cL();
+ test.Next(_L("CountWords"));
+ CPlainTest6L();
+ test.Next(_L("CountParas"));
+ CPlainTest7L();
+ test.Next(_L("Reset"));
+ CPlainTest8L();
+ test.End();
+ }
+
+
+
+template<class S,class T,CEditableText::TDocumentStorage D>
+void TestCPlainText<S,T,D>::DefectsL()
+//
+// Defect Fixes
+//
+ {
+ test.Start(_L(" @SYMTestCaseID:SYSLIB-ETEXT-UT-1574 INC070807 "));
+ INC070807L();
+ test.End();
+ }
+
+
+
+GLDEF_C TInt E32Main()
+//
+// Test the Document Model Services.
+//
+ {
+ CTrapCleanup* cleanup=CTrapCleanup::New();
+
+ __UHEAP_MARK;
+
+ typedef TestCPlainText<TText,TPtrC,CEditableText::EFlatStorage> instance1;
+ typedef TestCPlainText<TText,TPtrC,CEditableText::ESegmentedStorage> instance2;
+ typedef TestCPlainText<TText,TPtrC,CEditableText::EFlatStorage> instance3;
+
+ instance1* doctest=NULL;
+
+ TRAPD(ret, doctest=instance1::NewL());
+ test(ret == KErrNone);
+
+ test.Start(_L("CPlainText - Flat"));
+
+ TRAP(ret,doctest->TestL());
+ test(ret == KErrNone);
+ delete doctest;
+
+ test.Next(_L("CPlainText - Segmented"));
+ instance2* doctest1=NULL;
+
+ TRAP(ret, doctest1=instance2::NewL());
+ test(ret == KErrNone);
+
+ TRAP(ret, doctest1->TestSegmentedL());
+ test(ret == KErrNone);
+ delete doctest1;
+
+ test.Next(_L("Defect..."));
+ instance3* doctest2=NULL;
+
+ TRAP(ret, doctest2=instance3::NewL());
+ test(ret == KErrNone);
+
+ TRAP(ret, doctest2->DefectsL());
+ test(ret == KErrNone);
+ delete doctest2;
+
+ test.End();
+ test.Close();
+
+ __UHEAP_MARKEND;
+
+ delete cleanup;
+
+ return(0);
+ }