diff -r 000000000000 -r 1fb32624e06b textrendering/texthandling/ttext/T_SCANDC.CPP --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/textrendering/texthandling/ttext/T_SCANDC.CPP Tue Feb 02 02:02:46 2010 +0200 @@ -0,0 +1,682 @@ +/* +* 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 +#include + +#define UNUSED_VAR(a) a = a + +LOCAL_D RTest test(_L("SCANNING OF TEXT DOCUMENTS")); +LOCAL_D CTrapCleanup* TheTrapCleanup; + +template +class CTestScan : public CPlainText + { +public: + static CTestScan* NewL(); + void Destruct(); + void Test1L(); // Tests all operations of the class. + void Test2L(); // Test public methods of class. + void Test2aL(); // Tests for CountWords + void Test2bL(); // Tests for ScanWord + void Test2cL(); // Tests for CountParagraphs + void Test2dL(); // Tests for ScanParagraph + void TestHeapSpace(); // Test for memory leakage + void StoreTextL(TBuf<64>&); + void DoCountWords(TInt); + void DoCountParas(TInt); + void DoScanWords(TInt aPos,TUint aFlags,TInt aEndPos,TInt aCharCheck); + void DoScanParas(TInt aPos,TUint aFlags,TInt aEndPos,TInt aCharCheck); + void InsertL(TInt aPos,const TDesC& aBuf); +public: + CPlainText *iDocument; + TInt iUnitCount; + TInt iCharsSkipped; + TChar iDelimiter; + TInt startAvail,endAvail,temp; +private: + CTestScan(); // Default constructor + CTestScan(const CTestScan& aCTestScan); + CTestScan& operator=(const CTestScan& aCTestScan); + }; + + +template +GLDEF_C CTestScan* CTestScan::NewL() +// +// constructs a new instance of this class. +// + { + CTestScan* tmp=new(ELeave) CTestScan; + tmp->ConstructL(D); + return tmp; + } + + +template +GLDEF_C CTestScan::CTestScan() +// +// Default constructor +// + :iDelimiter(EParagraphDelimiter) + { + TRAPD(ret,iDocument=CPlainText::NewL(D)); + UNUSED_VAR(ret); + } + + +template +void CTestScan::Destruct() +// +// +// + { + delete iDocument; + } + + +template +GLDEF_C void CTestScan::InsertL(TInt aPos,const TDesC& aBuf) +// + {CPlainText::InsertL(aPos,aBuf);} + + + +template +GLDEF_C void CTestScan::StoreTextL(TBuf<64>& aBuf) +// +// Insert from aBuf into document storage at position 0. +// + { + TInt length=iDocument->DocumentLength(); + if (length>0) + { + iDocument->DeleteL(0,(length)); + } + TPtrC buf(aBuf); + iDocument->InsertL(0,buf); + iUnitCount=0; + } + + +template +GLDEF_C void CTestScan::DoCountWords(TInt aCount) +// +// Calls CountWords, and checks that number of words +// counted, matches the known good value 'count'. +// + { + iUnitCount=iDocument->WordCount(); + test(aCount==iUnitCount); + } + + +template +GLDEF_C void CTestScan::DoCountParas(TInt aCount) +// +// Calls CountParagraphs, and checks that number +// counted, matches the known good value 'count'. +// + { + iUnitCount=iDocument->ParagraphCount(); + test(aCount==iUnitCount); + } + + +template +GLDEF_C void CTestScan::DoScanWords(TInt aPos,TUint aFlags,TInt aEndPos,TInt aCharCheck) +// +// Calls ScanWords and tests results are as expected. +// + { + iCharsSkipped=iDocument->ScanWords(aPos,aFlags); + test(iCharsSkipped==aCharCheck); + test(aPos==aEndPos); + iCharsSkipped=0; + } + + +template +GLDEF_C void CTestScan::DoScanParas(TInt aPos,TUint aFlags,TInt aEndPos,TInt aCharCheck) +// +// Calls ScanParas and checks results are as expected. +// + { + iCharsSkipped=iDocument->ScanParas(aPos,aFlags); + test(iCharsSkipped==aCharCheck); + test(aPos==aEndPos); + iCharsSkipped=0; + } + + +template +GLDEF_C void CTestScan::Test1L() +// +// Tests all operations of the class. +// + { + TBuf<64> temp1; + temp1.Append(_L("The world")); // Create a descriptor over some text + temp1.Append(iDelimiter); + temp1.Append(iDelimiter); + temp1.Append(_L("is a")); + StoreTextL(temp1); + iDocument->WordCount(); + TInt pos=5; + TUint flags=(CPlainText::EScanToUnitStart|CPlainText::EScanJoinDelimiters|CPlainText::EScanStayIfBoundary); + ((CTestScan*)iDocument)->ScanWords(pos,flags); + TBuf<64> temp2(_L("This is a paragraph")); + temp2.Append(iDelimiter); + iDocument->DeleteL(0,temp1.Length()); + StoreTextL(temp2); + pos=0; + flags=(CPlainText::EScanToUnitStart|CPlainText::EScanJoinDelimiters); + ((CTestScan*)iDocument)->ScanParas(pos,flags); + iDocument->ParagraphCount(); + } + +template +GLDEF_C void CTestScan::Test2aL() +// +// Tests the CountWords method with different cases +// + { + TBuf<64> temp; + + //test.Start(_L("0 words")); + //iDocument->InsertL(0,buf.Ptr(),buf.Size()); + //DoCountWords(0); + // This test has been removed since it is no longer feasible. + // The design currently inserts an end of document character + // as soon as the document is created, hence, there can not + // be 0 words. + + test.Start(_L("0 words, all delimiters")); + temp.Append(_L(" ")); + temp.Append(iDelimiter); + temp.Append(_L(" ")); + StoreTextL(temp); + DoCountWords(0); + + test.Next(_L("1 word, no delimiter")); + temp.Append(_L("This")); + StoreTextL(temp); + DoCountWords(1); + + test.Next(_L("1 word, at start, no delimiter")); + temp.Delete(0,temp.Size()); + temp.Append(_L("THIS")); + StoreTextL(temp); + DoCountWords(1); + + test.Next(_L("1 word, with delimiter")); + temp.Append(' '); + StoreTextL(temp); + DoCountWords(1); + + test.Next(_L("Many words, no delimiter")); + temp.Append(_L(" is a wonderful world")); + StoreTextL(temp); + DoCountWords(5); + + test.Next(_L("Many words with delimiter")); + temp.Append(' '); + StoreTextL(temp); + DoCountWords(5); + + test.End(); + } + + +template +GLDEF_C void CTestScan::Test2bL() +// +// Tests the ScanWord method with different flag settings +// + { + TBuf<64> buf; + buf.Append(_L(" This tEsT TeXT")); + StoreTextL(buf); + + iCharsSkipped=iUnitCount=0; + test.Start(_L("Forward scan")); + + test.Next(_L("Stay at boundary:to unit start")); + TUint flags=(CPlainText::EScanStayIfBoundary | CPlainText::EScanToUnitStart); + DoScanWords(8,flags,12,4); + DoScanWords(7,flags,7,0); + DoScanWords(6,flags,6,0); + DoScanWords(5,flags,6,1); + + test.Next(_L("Stay at boundary:to unit end")); + flags |= CPlainText::EScanToUnitEnd; + flags &=~CPlainText::EScanToUnitStart; + DoScanWords(8,flags,11,3); + DoScanWords(7,flags,11,4); + DoScanWords(6,flags,6,0); + DoScanWords(5,flags,5,0); + + test.Next(_L("Stay at boundary:to unit start:join delimiters")); + flags=(CPlainText::EScanStayIfBoundary|CPlainText::EScanToUnitStart|CPlainText::EScanJoinDelimiters); + DoScanWords(8,flags,13,5); + DoScanWords(7,flags,7,0); + DoScanWords(6,flags,7,1); + DoScanWords(5,flags,7,2); + + test.Next(_L("Stay at boundary:to unit end:join delimiters")); + flags |= CPlainText::EScanToUnitEnd; + flags &=~CPlainText::EScanToUnitStart; + DoScanWords(8,flags,11,3); + DoScanWords(7,flags,11,4); + DoScanWords(6,flags,11,5); + DoScanWords(5,flags,5,0); + + test.Next(_L("To unit start")); + flags=CPlainText::EScanToUnitStart; + DoScanWords(8,flags,12,4); + DoScanWords(7,flags,12,5); + DoScanWords(6,flags,7,1); + DoScanWords(5,flags,6,1); + + test.Next(_L("To unit end")); + flags |= CPlainText::EScanToUnitEnd; + flags &=~CPlainText::EScanToUnitStart; + DoScanWords(8,flags,11,3); + DoScanWords(7,flags,11,4); + DoScanWords(6,flags,11,5); + DoScanWords(5,flags,6,1); + + test.Next(_L("To unit start:join delimiters")); + flags=(CPlainText::EScanToUnitStart|CPlainText::EScanJoinDelimiters); + DoScanWords(8,flags,13,5); + DoScanWords(7,flags,13,6); + DoScanWords(6,flags,7,1); + DoScanWords(5,flags,7,2); + + test.Next(_L("To unit end:join delimiters")); + flags |= CPlainText::EScanToUnitEnd; + flags &=~CPlainText::EScanToUnitStart; + DoScanWords(8,flags,11,3); + DoScanWords(7,flags,11,4); + DoScanWords(6,flags,11,5); + DoScanWords(5,flags,11,6); + + test.Next(_L("Backward scan")); + test.Next(_L("Stay at boundary:to unit start")); + flags=(CPlainText::EScanBackwards|CPlainText::EScanStayIfBoundary|CPlainText::EScanToUnitStart); + DoScanWords(9,flags,7,2); + DoScanWords(10,flags,7,3); + DoScanWords(11,flags,7,4); + DoScanWords(12,flags,12,0); + DoScanWords(13,flags,13,0); + + test.Next(_L("Stay at boundary:to unit end")); + flags |= CPlainText::EScanToUnitEnd; + flags &=~CPlainText::EScanToUnitStart; + DoScanWords(9,flags,6,3); + DoScanWords(10,flags,6,4); + DoScanWords(11,flags,11,0); + DoScanWords(12,flags,12,0); + DoScanWords(13,flags,12,1); + + test.Next(_L("Stay at boundary:to unit start:join delimiters")); + flags=CPlainText::EScanBackwards|CPlainText::EScanStayIfBoundary|CPlainText::EScanToUnitStart|CPlainText::EScanJoinDelimiters; + DoScanWords(9,flags,7,2); + DoScanWords(10,flags,7,3); + DoScanWords(11,flags,7,4); + DoScanWords(12,flags,7,5); + DoScanWords(13,flags,13,0); + + test.Next(_L("Stay at boundary:to unit end:join delimiters")); + flags |= CPlainText::EScanToUnitEnd; + flags &=~CPlainText::EScanToUnitStart; + DoScanWords(9,flags,5,4); + DoScanWords(10,flags,5,5); + DoScanWords(11,flags,11,0); + DoScanWords(12,flags,11,1); + DoScanWords(13,flags,11,2); + + test.Next(_L("To unit start")); + flags=CPlainText::EScanBackwards|CPlainText::EScanToUnitStart; + DoScanWords(9,flags,7,2); + DoScanWords(10,flags,7,3); + DoScanWords(11,flags,7,4); + DoScanWords(12,flags,7,5); + DoScanWords(13,flags,12,1); + + test.Next(_L("To unit end")); + flags |= CPlainText::EScanToUnitEnd; + flags &=~CPlainText::EScanToUnitStart; + DoScanWords(9,flags,6,3); + DoScanWords(10,flags,6,4); + DoScanWords(11,flags,6,5); + DoScanWords(12,flags,11,1); + DoScanWords(13,flags,12,1); + + test.Next(_L("To unit start:join delimiters")); + flags=CPlainText::EScanBackwards|CPlainText::EScanToUnitStart|CPlainText::EScanJoinDelimiters; + DoScanWords(9,flags,7,2); + DoScanWords(10,flags,7,3); + DoScanWords(11,flags,7,4); + DoScanWords(12,flags,7,5); + DoScanWords(13,flags,7,6); + + test.Next(_L("To unit end:join delimiters")); + flags=CPlainText::EScanToUnitEnd|CPlainText::EScanJoinDelimiters|CPlainText::EScanBackwards; + DoScanWords(9,flags,5,4); + DoScanWords(10,flags,5,5); + DoScanWords(11,flags,5,6); + DoScanWords(12,flags,11,1); + DoScanWords(13,flags,11,2); + test.End(); + } + + +template +GLDEF_C void CTestScan::Test2cL() +// +// Tests the CountParagraphs method with different cases +// + { + TBuf<64> buf; + + //test.Start(_L("0 paras")); + //iDocument->InsertL(0,buf.Ptr(),buf.Size()); + //DoCountParagraphs(0); + // This test no longer applies, since documents are created with + // an end of document character. ie, The document can not have + // 0 words. + + test.Start(_L("Empty text source")); +// buf.Append(iDelimiter); +// buf.Append(iDelimiter); + StoreTextL(buf); + DoCountParas(1); + + test.Next(_L("1 para. no delimiter")); + buf.Append(_L("This")); + StoreTextL(buf); + DoCountParas(1); + + test.Next(_L("1 para. at start, no delimiter")); + buf.Delete(0,buf.Size()); + buf.Append(_L(" THIS ")); + StoreTextL(buf); + DoCountParas(1); + + test.Next(_L("1 para, with delimiter")); + buf.Append(iDelimiter); + StoreTextL(buf); + DoCountParas(2); + + test.Next(_L("2 paras, no delimiter")); + buf.Append(' '); + StoreTextL(buf); + DoCountParas(2); + + test.Next(_L("2 paras with delimiter")); + buf.Append(iDelimiter); + StoreTextL(buf); + DoCountParas(3); + + test.End(); + } + + +template +GLDEF_C void CTestScan::Test2dL() +// +// Tests the ScanParagraph method with different flag settings +// + { + TBuf<64> buf; + buf.Append(_L(" This")); + buf.Append(iDelimiter); + buf.Append(iDelimiter); + buf.Append(_L("tEsT")); + buf.Append(iDelimiter); + buf.Append(iDelimiter); + buf.Append(_L("TeXT")); + StoreTextL(buf); + + iCharsSkipped=iUnitCount=0; + test.Start(_L("Forward scan")); + + test.Next(_L("Stay at boundary:to unit start")); + TUint flags=(CPlainText::EScanStayIfBoundary|CPlainText::EScanToUnitStart); + DoScanParas(8,flags,12,4); + DoScanParas(7,flags,7,0); + DoScanParas(6,flags,6,0); + DoScanParas(5,flags,6,1); + + test.Next(_L("Stay at boundary:to unit end")); + flags |= CPlainText::EScanToUnitEnd; + flags &=~CPlainText::EScanToUnitStart; + DoScanParas(8,flags,11,3); + DoScanParas(7,flags,11,4); + DoScanParas(6,flags,6,0); + DoScanParas(5,flags,5,0); + + test.Next(_L("Stay at boundary:to unit start:join delimiters")); + flags=(CPlainText::EScanStayIfBoundary | CPlainText::EScanToUnitStart | CPlainText::EScanJoinDelimiters); + DoScanParas(8,flags,13,5); + DoScanParas(7,flags,7,0); + DoScanParas(6,flags,7,1); + DoScanParas(5,flags,7,2); + + test.Next(_L("Stay at boundary:to unit end:join delimiters")); + flags |= CPlainText::EScanToUnitEnd; + flags &=~CPlainText::EScanToUnitStart; + DoScanParas(8,flags,11,3); + DoScanParas(7,flags,11,4); + DoScanParas(6,flags,11,5); + DoScanParas(5,flags,5,0); + + test.Next(_L("To unit start")); + flags=CPlainText::EScanToUnitStart; + DoScanParas(8,flags,12,4); + DoScanParas(7,flags,12,5); + DoScanParas(6,flags,7,1); + DoScanParas(5,flags,6,1); + + test.Next(_L("To unit end")); + flags |= CPlainText::EScanToUnitEnd; + flags &=~CPlainText::EScanToUnitStart; + DoScanParas(8,flags,11,3); + DoScanParas(7,flags,11,4); + DoScanParas(6,flags,11,5); + DoScanParas(5,flags,6,1); + + test.Next(_L("To unit start:join delimiters")); + flags=(CPlainText::EScanToUnitStart | CPlainText::EScanJoinDelimiters); + DoScanParas(8,flags,13,5); + DoScanParas(7,flags,13,6); + DoScanParas(6,flags,7,1); + DoScanParas(5,flags,7,2); + + test.Next(_L("To unit end:join delimiters")); + flags |= CPlainText::EScanToUnitEnd; + flags &=~CPlainText::EScanToUnitStart; + DoScanParas(8,flags,11,3); + DoScanParas(7,flags,11,4); + DoScanParas(6,flags,11,5); + DoScanParas(5,flags,11,6); + + test.Next(_L("Backward scan")); + test.Next(_L("Stay at boundary:to unit start")); + flags=(CPlainText::EScanBackwards|CPlainText::EScanStayIfBoundary|CPlainText::EScanToUnitStart); + DoScanParas(9,flags,7,2); + DoScanParas(10,flags,7,3); + DoScanParas(11,flags,7,4); + DoScanParas(12,flags,12,0); + DoScanParas(13,flags,13,0); + DoScanParas(7,flags,7,0); + DoScanParas(1,flags,0,1); + DoScanParas(5,flags,0,5); + DoScanParas(4,flags,0,4); + DoScanParas(3,flags,0,3); + DoScanParas(2,flags,0,2); + DoScanParas(1,flags,0,1); + test.Next(_L("Testing at buffer boundaries.")); + DoScanParas(0,flags,0,0); + DoScanParas(16,flags,13,3); + + + test.Next(_L("Stay at boundary:to unit end")); + flags |= CPlainText::EScanToUnitEnd; + flags &=~CPlainText::EScanToUnitStart; + DoScanParas(9,flags,6,3); + DoScanParas(10,flags,6,4); + DoScanParas(11,flags,11,0); + DoScanParas(12,flags,12,0); + DoScanParas(13,flags,12,1); + + test.Next(_L("Stay at boundary:to unit start:join delimiters")); + flags=CPlainText::EScanBackwards|CPlainText::EScanStayIfBoundary|CPlainText::EScanToUnitStart|CPlainText::EScanJoinDelimiters; + DoScanParas(9,flags,7,2); + DoScanParas(10,flags,7,3); + DoScanParas(11,flags,7,4); + DoScanParas(12,flags,7,5); + DoScanParas(13,flags,13,0); + + test.Next(_L("Stay at boundary:to unit end:join delimiters")); + flags |= CPlainText::EScanToUnitEnd; + flags &=~CPlainText::EScanToUnitStart; + DoScanParas(9,flags,5,4); + DoScanParas(10,flags,5,5); + DoScanParas(11,flags,11,0); + DoScanParas(12,flags,11,1); + DoScanParas(13,flags,11,2); + + test.Next(_L("To unit start")); + flags=CPlainText::EScanBackwards|CPlainText::EScanToUnitStart; + DoScanParas(9,flags,7,2); + DoScanParas(10,flags,7,3); + DoScanParas(11,flags,7,4); + DoScanParas(12,flags,7,5); + DoScanParas(13,flags,12,1); + + test.Next(_L("To unit end")); + flags |= CPlainText::EScanToUnitEnd; + flags &=~CPlainText::EScanToUnitStart; + DoScanParas(9,flags,6,3); + DoScanParas(10,flags,6,4); + DoScanParas(11,flags,6,5); + DoScanParas(12,flags,11,1); + DoScanParas(13,flags,12,1); + + test.Next(_L("To unit start:join delimiters")); + flags=CPlainText::EScanBackwards|CPlainText::EScanToUnitStart|CPlainText::EScanJoinDelimiters; + DoScanParas(9,flags,7,2); + DoScanParas(10,flags,7,3); + DoScanParas(11,flags,7,4); + DoScanParas(12,flags,7,5); + DoScanParas(13,flags,7,6); + + test.Next(_L("To unit end:join delimiters")); + flags |= CPlainText::EScanToUnitEnd; + flags &=~CPlainText::EScanToUnitStart; + DoScanParas(9,flags,5,4); + DoScanParas(10,flags,5,5); + DoScanParas(11,flags,5,6); + DoScanParas(12,flags,11,1); + DoScanParas(13,flags,11,2); + + test.End(); + } + + +template +GLDEF_C void CTestScan::Test2L() +// +// Test all the methods of the class +// + { + test.Start(_L("CountWords")); + Test2aL(); + + test.Next(_L("ScanWord")); + Test2bL(); + + test.Next(_L("Count Paragraphs")); + Test2cL(); + + test.Next(_L("Scan Paragraph")); + Test2dL(); + + test.End(); + } + + +GLDEF_C TInt E32Main() +// +// Test the OLIB Varray types. +// + { + TheTrapCleanup=CTrapCleanup::New(); + + test.Title(); + test.Start(_L(" @SYMTestCaseID:SYSLIB-TTEXT-LEGACY-T_SCANDC-0001 CPlainText - Flat ")); + typedef CTestScan instance1; + typedef CTestScan instance2; + + instance1* aa=NULL; + TRAPD(ret, aa=instance1::NewL()); + test(ret == KErrNone); + + test.Start(_L("Registering all methods")); + + TRAP(ret,aa->Test1L()); + test(ret == KErrNone); + + test.Next(_L("Testing all methods")); + + TRAP(ret,aa->Test2L()); + test(ret == KErrNone); + + __UHEAP_MARK; + delete aa; + __UHEAP_MARKEND; + + test.End(); + + test.Next(_L("CPlainText - Segmented")); + + instance2* bb=NULL; + TRAP(ret, bb=instance2::NewL()); + test(ret == KErrNone); + + __UHEAP_MARK; + test.Start(_L("Registering all methods")); + TRAP(ret,bb->Test1L()); + test(ret == KErrNone); + test.Next(_L("Testing all methods")); + TRAP(ret,bb->Test2L()); + test(ret == KErrNone); + delete bb; + __UHEAP_MARKEND; + test.End(); + + test.End(); + test.Close(); + + delete TheTrapCleanup; + + return(0); + } +