textrendering/texthandling/ttext/T_CPLAIN.CPP
changeset 0 1fb32624e06b
child 51 a7c938434754
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/textrendering/texthandling/ttext/T_CPLAIN.CPP	Tue Feb 02 02:02:46 2010 +0200
@@ -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);
+    }