os/textandloc/textrendering/textformatting/test/src/TTextView2.cpp
author sl
Tue, 10 Jun 2014 14:32:02 +0200
changeset 1 260cb5ec6c19
permissions -rw-r--r--
Update contrib.
     1 /*
     2 * Copyright (c) 2002-2009 Nokia Corporation and/or its subsidiary(-ies).
     3 * All rights reserved.
     4 * This component and the accompanying materials are made available
     5 * under the terms of "Eclipse Public License v1.0"
     6 * which accompanies this distribution, and is available
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
     8 *
     9 * Initial Contributors:
    10 * Nokia Corporation - initial contribution.
    11 *
    12 * Contributors:
    13 *
    14 * Description: 
    15 * @file
    16 * @internalComponent 
    17 *
    18 */
    19 
    20 
    21 #include "TCustomWrap.h"
    22 #include "TGraphicsContext.h"
    23 #include "TBitmapDoc.h"
    24 #include "TestPicture.h"
    25 #include <e32std.h>
    26 #include <e32test.h>
    27 #include <frmtlay.h>
    28 #include <frmtview.h>
    29 #include <txtlaydc.h>
    30 #include <fbs.h>
    31 #include <w32std.h>
    32 
    33 #ifdef SYMBIAN_ENABLE_SPLIT_HEADERS
    34 #include "TAGMA_INTERNAL.H"
    35 #endif
    36 
    37 namespace LocalToFile {
    38 
    39 _LIT(KTTextView2, "TTextView2");
    40 const TInt KDisplayWidth = 100;
    41 const TInt KDisplayHeight = 100;
    42 const TInt KAleph = 0x5D0;
    43 const TInt KPictureCharacter = 0xFFFC;
    44 const TInt KRightToLeftMarker = 0x200F;
    45 const TInt KZeroWidthNonJoiner = 0x200C;
    46 RTest test(KTTextView2);
    47 
    48 /** Simple test picture. */
    49 class CPinkSquare : public CPicture
    50 	{
    51 public:
    52 	// Size of square in twips.
    53 	// 600 is 15 pixels using the standard test graphics device at
    54 	// its default resolution.
    55 	enum { KWidth = 600, KHeight = 600 };
    56 	CPinkSquare() {}
    57 	void Draw(CGraphicsContext& aGc, const TPoint& aTopLeft,
    58 		const TRect& aClipRect, MGraphicsDeviceMap* aMap) const
    59 		{
    60 		// This picture is a magenta square
    61 		TPoint size(KWidth, KHeight);
    62 		if (aMap)
    63 			size = aMap->TwipsToPixels(size);
    64 		TRect rect(aTopLeft, aTopLeft + size);
    65 		aGc.SetClippingRect(aClipRect);
    66 		aGc.SetDrawMode(CGraphicsContext::EDrawModePEN);
    67 		aGc.SetPenColor(KRgbMagenta);
    68 		aGc.SetBrushStyle(CGraphicsContext::ESolidBrush);
    69 		aGc.SetBrushColor(KRgbMagenta);
    70 		aGc.DrawRect(rect);
    71 		}
    72 	void ExternalizeL(RWriteStream&) const {}
    73 	void GetOriginalSizeInTwips(TSize& a) const
    74 		{
    75 		a.iWidth = CPinkSquare::KWidth;
    76 		a.iHeight = CPinkSquare::KHeight;
    77 		}
    78 	};
    79 
    80 _LIT(KEnd, "\x2029");
    81 /** Lightweight test document model. */
    82 class TDocModel : public MLayDoc
    83 	{
    84 public:
    85 	TDocModel(const TDesC& aDes)
    86 		: iDes(&aDes), iParagraphFormat(0), iBreakPos(0) {}
    87 	void SetParagraphFormat(CParaFormat* a)
    88 		{
    89 		iParagraphFormat = a;
    90 		}
    91 	/** Sets the segmentation of the buffer to cut at this point.
    92 	aParam a 0 means no break at all. */
    93 	void SetBreakPos(TInt a)
    94 		{
    95 		iBreakPos = a;
    96 		}
    97 	// From MLayDoc
    98 	TInt LdDocumentLength() const { return iDes->Length(); }
    99 	TInt LdToParagraphStart(TInt& a) const
   100 		{
   101 		TInt curr = a;
   102 		if (a < LdDocumentLength())
   103 			{
   104 			a = iDes->Left(a).LocateReverse(0x2029);
   105 			a = a < 0? 0 : a + 1;
   106 			}
   107 		return curr - a;
   108 		}
   109 	void GetParagraphFormatL(CParaFormat* aFormat, TInt) const
   110 		{
   111 		if (iParagraphFormat)
   112 			{
   113 			aFormat->CopyL(*iParagraphFormat);
   114 			return;
   115 			}
   116 		aFormat->Reset();
   117 		TTabStop tabStop;
   118 		tabStop.iTwipsPosition = 1000;
   119 		tabStop.iType = TTabStop::ELeftTab;
   120 		aFormat->StoreTabL(tabStop);
   121 		}
   122 	void GetChars(TPtrC& aView,TCharFormat& aFormat, TInt aStartPos)const
   123 		{
   124 		TCharFormat cf;
   125 		aFormat = cf;
   126 		TInt docLength = LdDocumentLength();
   127 		if (aStartPos < iBreakPos && iBreakPos < docLength)
   128 			aView.Set(iDes->Mid(aStartPos, iBreakPos - aStartPos));
   129 		else if (aStartPos == docLength)
   130 			aView.Set(KEnd);
   131 		else
   132 			aView.Set(iDes->Mid(aStartPos));
   133 		}
   134 	TInt GetPictureSizeInTwips(TSize& aSize, TInt aPos) const
   135 		{
   136 		if ((*iDes)[aPos] != KPictureCharacter)
   137 			return KErrNotFound;
   138 		aSize.iWidth = CPinkSquare::KWidth;
   139 		aSize.iHeight = CPinkSquare::KHeight;
   140 		return KErrNone;
   141 		}
   142 	CPicture* PictureHandleL(TInt aPos, TForcePictureLoad) const
   143 		{
   144 		if ((*iDes)[aPos] != KPictureCharacter)
   145 			return 0;
   146 		return new(ELeave) CPinkSquare;
   147 		}
   148 	TBool EnquirePageBreak(TInt aPos, TInt aLength)const
   149 		{
   150 		return iDes->Mid(aPos, aLength).Locate(0x000C) < 0?
   151 			EFalse : ETrue;
   152 		}
   153 	TBool SelectParagraphLabel(TInt) { return EFalse; }
   154 	void CancelSelectLabel() {}
   155 private:
   156 	const TDesC* iDes;
   157 	CParaFormat* iParagraphFormat;
   158 	TInt iBreakPos;
   159 	};
   160 }
   161 
   162 // Remaps whatever character is used in construction to the letter 'E'
   163 class TTestCustomRemap : public MFormCustomInvisibleCharacterRemapper
   164 	{
   165 public:
   166 	TTestCustomRemap(TUint aChar)
   167 		{
   168 		iChar = aChar;
   169 		}
   170 	TUint Remap(TUint aChar, const TNonPrintingCharVisibility aNonPrintingCharVisibility,
   171 		const TLayDocTextSource& aLayDoc)
   172 		{
   173 	    if (aChar == iChar)
   174 	        {
   175 			return 'E';
   176 	        }
   177 	    else
   178 	    	{
   179 		    return DefaultMapping(aChar, aNonPrintingCharVisibility, aLayDoc);
   180 	    	}
   181 		}
   182 private:
   183 	TUint iChar;
   184 	};
   185 
   186 
   187 // Remaps all break characters to the letter 'E'
   188 class TTestCustomRemapper : public MFormCustomInvisibleCharacterRemapper
   189 	{
   190 public:
   191 	TUint Remap(TUint aChar, const TNonPrintingCharVisibility aNonPrintingCharVisibility,
   192 		const TLayDocTextSource& aLayDoc)
   193 		{
   194 	    switch (aChar)
   195 	        {
   196 	        case CEditableText::ELineBreak:
   197 	        case CEditableText::EParagraphDelimiter:
   198 	        case CEditableText::EPageBreak:
   199 				return 'E';
   200 
   201 	        default:
   202 	            break; // do nothing
   203 	        }
   204 
   205 	    return DefaultMapping(aChar, aNonPrintingCharVisibility, aLayDoc);
   206 		}
   207 	};
   208 
   209 using namespace LocalToFile;
   210 
   211 class CTestTextView
   212 	{
   213 public:
   214 	static void SetOffScreenContext(CTextView* aView, CBitmapContext* aContext)
   215 		{
   216 		aView->iOffScreenContext = aContext;
   217 		}
   218 	static TRect GetInvalidRect(CTextView* aView)
   219 		{
   220 		return aView->iDisplay.ClippingRect();
   221 		}
   222 	static int GetFormattedHeight(CTextView* aView)
   223 		{
   224 		return aView->iFormattedUpTo;
   225 		}
   226 	static void TestMemberOffsetsL()
   227 		{
   228 		// The members of these classes must not move due to inline method offsets.
   229 		// Any of the following tests failing will indicate a BC break.
   230 		test(_FOFF(CTextView, iLayout)==64);
   231 		test(_FOFF(CTextView, iCursorPos)==192);
   232 		test(_FOFF(CTextView, iFlags)==240);
   233 		test(_FOFF(CTextView, iObserver)==264);
   234 		}
   235 	};
   236 
   237 class CTestTextLayout
   238 	{
   239 public:
   240 	static void TestMemberOffsetsL()
   241 		{
   242 		// The members of these classes must not move due to inline method offsets.
   243 		// Any of the following tests failing will indicate a BC break.
   244 		test(_FOFF(CTextLayout, iText)==4);
   245 		test(_FOFF(CTextLayout, iBandTop)==104);
   246 		test(_FOFF(CTextLayout, iScrollFlags)==116);
   247 		test(_FOFF(CTextLayout, iHighlightExtensions)==128);
   248 		}
   249 	};
   250 
   251 // Test for TET-5D7MCV: Sound object focus indicators flickering
   252 _LIT(KPicture, "\xFFFC");
   253 _LIT(KInitialText, "xy");
   254 
   255 void SetViewRect1(CTextView *aView)
   256 	{
   257 	TRect view(0, 0, 100, 100);
   258 	aView->SetViewRect(view);
   259 	}
   260 
   261 void SetViewRect2(CTextView *aView)
   262 	{
   263 	TRect view(10, 15, 60, 65);
   264 	aView->SetViewRect(view);
   265 	}
   266 
   267 void TET_5D7MCV_L(TDes& aText, CTestGraphicsDevice* aDevice, CTextView* aView,
   268 	CTextLayout* aLayout)
   269 	{
   270 	// This is supposed to test flicker-free redraw, but that is very difficult
   271 	// to test properly, so we do what we can:
   272 	// 1) If flicker-free redraw is disabled and there is no off-screen context set,
   273 	//    there should be drawing to the real device
   274 	// 2) If there is an off-screen context set, there should be drawing to the
   275 	//    off-screen context, and not the real device
   276 	// 3) If flicker-free redraw is enabled and there is no off-screen context set,
   277 	//    there should be no drawing to the real device.
   278 	// We are not testing that the correct thing is drawn to the internal off-screen
   279 	// bitmap when flicker-free redraw is enabled. This is bad, but I can't work
   280 	// out a good way round it. As the off-screen context uses much of the same
   281 	// machinery as flicker-free redraw, it tests maybe 80% of it.
   282 	SetViewRect1(aView);
   283 	CTestGraphicsDevice* offScreenDevice = CTestGraphicsDevice::NewL(aDevice->SizeInPixels(), 0);
   284 	CleanupStack::PushL(offScreenDevice);
   285 	CWindowGc* offScreenContext;
   286 	User::LeaveIfError(offScreenDevice->CreateContext(offScreenContext));
   287 	CleanupStack::PushL(offScreenContext);
   288 
   289 	CTestTextView::SetOffScreenContext(aView, 0);
   290 	aView->DisableFlickerFreeRedraw();
   291 
   292 	aText.Append(KInitialText);
   293 	aView->HandleInsertDeleteL(TCursorSelection(0,KInitialText().Length()), 0, EFalse);
   294 	aText.Insert(1, KPicture);
   295 	aView->HandleInsertDeleteL(TCursorSelection(1,2), 0, ETrue);
   296 	aView->SetCursorVisibilityL(TCursor::EFCursorVisible, TCursor::EFCursorVisible);
   297 	aView->SetSelectionVisibilityL(ETrue);
   298 	aView->EnablePictureFrameL(ETrue);
   299 	TRect* pictureRectPtr;
   300 	TInt frameEdges;
   301 	aView->SetXyPosL(TPoint(11, 1), EFalse, pictureRectPtr, frameEdges);
   302 	test(pictureRectPtr != 0);
   303 	aDevice->ClearAreaDrawnWithCondition();
   304 	offScreenDevice->ClearAreaDrawnWithCondition();
   305 	aView->DrawL(TRect(0, 0, CPinkSquare::KWidth, CPinkSquare::KHeight));
   306 	test(!aDevice->AreaDrawnWithCondition().IsEmpty());
   307 	test(offScreenDevice->AreaDrawnWithCondition().IsEmpty());
   308 	aDevice->ClearAreaDrawnWithCondition();
   309 	offScreenDevice->ClearAreaDrawnWithCondition();
   310 
   311 	CTestTextView::SetOffScreenContext(aView, offScreenContext);
   312 	aView->EnableFlickerFreeRedraw();
   313 
   314 	aView->DrawL(TRect(0, 0, CPinkSquare::KWidth, CPinkSquare::KHeight));
   315 	test(aDevice->AreaDrawnWithCondition().IsEmpty());
   316 	TRect xoredArea = offScreenDevice->AreaDrawnWithCondition();
   317 	test(!xoredArea.IsEmpty());
   318 	offScreenDevice->ClearAreaDrawnWithCondition();
   319 	SetViewRect1(aView);
   320 	const TRect &viewRect = aView->ViewRect();
   321 	aView->DrawL(viewRect);
   322 	test(aDevice->AreaDrawnWithCondition().IsEmpty());
   323 	test(offScreenDevice->AreaDrawnWithCondition() == xoredArea);
   324 
   325 	// We need a CFbsDevice -- this will supply fonts that can be drawn to the
   326 	// offscreen bitmap created by the flicker-free redraw code.
   327 	CFbsBitmap* bm = new CFbsBitmap;
   328 	CleanupStack::PushL(bm);
   329 	bm->Create(TSize(1,1), EGray2);
   330 	CFbsBitmapDevice* bitmapDevice = CFbsBitmapDevice::NewL(bm);
   331 	CleanupStack::PushL(bitmapDevice);
   332 	aLayout->SetImageDeviceMap(bitmapDevice);
   333 	CTestTextView::SetOffScreenContext(aView, 0);
   334 	aView->EnableFlickerFreeRedraw();
   335 
   336 	aView->DrawL(TRect(0, 0, CPinkSquare::KWidth, CPinkSquare::KHeight));
   337 	test(aDevice->AreaDrawnWithCondition().IsEmpty());
   338 	xoredArea = offScreenDevice->AreaDrawnWithCondition();
   339 	test(!xoredArea.IsEmpty());
   340 	offScreenDevice->ClearAreaDrawnWithCondition();
   341 	SetViewRect1(aView);
   342 	aView->DrawL(viewRect);
   343 	test(aDevice->AreaDrawnWithCondition().IsEmpty());
   344 
   345 	aLayout->SetImageDeviceMap(aDevice);
   346 	CleanupStack::PopAndDestroy(bitmapDevice);
   347 	CleanupStack::PopAndDestroy(bm);
   348 	CTestTextView::SetOffScreenContext(aView, 0);
   349 	aView->DisableFlickerFreeRedraw();
   350 
   351 	aDevice->ClearAreaDrawnWithCondition();
   352 	offScreenDevice->ClearAreaDrawnWithCondition();
   353 	aView->DrawL(viewRect);
   354 	test(offScreenDevice->AreaDrawnWithCondition().IsEmpty());
   355 	xoredArea.Move(viewRect.iTl);
   356 	test(aDevice->AreaDrawnWithCondition() == xoredArea);
   357 
   358 	CleanupStack::PopAndDestroy(offScreenContext);
   359 	CleanupStack::PopAndDestroy(offScreenDevice);
   360 	}
   361 /**
   362 @SYMTestCaseID          SYSLIB-FORM-CT-4014
   363 @SYMTestCaseDesc	    Tests CTextView::IsPictureFrameSelected doesn't panic with EFNoPictureFrame
   364 @SYMTestPriority 	    High
   365 @SYMTestActions
   366 @SYMTestExpectedResults Resulting document position are where expected and frame drawn correctly.
   367  						In  this case picture frame is not drawn as we set the selection visibility to "off"
   368 @SYMDEF                 PDEF118831
   369 */
   370 void RunPDEF118831TestL()
   371 	{
   372 	//create editor/bitmap
   373  	CTestBitmapFile* bitMap = CTestBitmapFile::NewLC(TRect(0, 0, 140, 185));
   374 
   375 	//create the picture to insert (this one is a red box)
   376 	CTestPicture* pic = new(ELeave)CTestPicture();
   377  	CleanupStack::PushL(pic);
   378    	pic->SetSizeInTwips(TSize(400,400));
   379 
   380    	//add some text before the pictures
   381    	bitMap->AppendL(_L("A"));
   382 
   383 	//Add 2 pictures
   384 	TInt pos = 0;
   385 	for (pos=0;pos<2;pos++)
   386 		bitMap->AppendL(pic);
   387 
   388 	//add some text after the pictures
   389 	bitMap->AppendL(_L("A"));
   390 	bitMap->View()->HandleGlobalChangeL();
   391 
   392 	//As a result we have
   393 	//            A+Pict+Pict+A
   394 	//with cursor pos: 01 1 2  2 3  4
   395 
   396 	//SetSelectionVisibility to false
   397 	bitMap->View()->SetSelectionVisibilityL(EFalse);
   398 
   399 	// Place the cursor at the end of the last picture added and start moving the cursor left.
   400 	TCursorPosition::TMovementType type = TCursorPosition::EFLeft;
   401 
   402 	// Docuemnt position is already at the end, but it is Trailing. Make it Leading and set it.
   403 	TTmDocPosSpec::TType docPosType = TTmDocPosSpec::ELeading;
   404 
   405 	TTmDocPos thisPos;
   406 	TTmDocPosSpec docPos;
   407 	docPos.iPos = 4;
   408 	docPos.iType = docPosType;
   409 	TRect dummyRect;
   410 	TInt dummyPos;
   411 	TBool selectionIsPictureFrame;
   412 
   413 	// Cursor on last letter "A"
   414 	bitMap->View()->SetDocPosL(docPos);
   415 	bitMap->View()->GetCursorPos(thisPos);
   416 	selectionIsPictureFrame
   417 	= bitMap->View()->IsPictureFrameSelected(dummyRect, dummyPos);
   418 	test(thisPos.iPos == 4 && type == TCursorPosition::EFLeft);
   419 	test(selectionIsPictureFrame == 0);
   420 
   421 	// Move cursor left
   422 	// Cursor moved to first (from the right) picture but picture frame not selected
   423 	bitMap->View()->MoveCursorL(type, EFalse);
   424 	bitMap->View()->GetCursorPos(thisPos);
   425 	selectionIsPictureFrame
   426 	= bitMap->View()->IsPictureFrameSelected(dummyRect, dummyPos);
   427 	test(thisPos.iPos == 3 && type == TCursorPosition::EFLeft);
   428 	test(selectionIsPictureFrame == 0);
   429 
   430 
   431 	// Move cursor left
   432 	// Cursor still on first picture and now picture frame has been selected
   433 	bitMap->View()->MoveCursorL(type, EFalse);
   434 	bitMap->View()->GetCursorPos(thisPos);
   435 	selectionIsPictureFrame
   436 	= bitMap->View()->IsPictureFrameSelected(dummyRect, dummyPos);
   437 	test(thisPos.iPos == 2 && type == TCursorPosition::EFLeft);
   438 	test(selectionIsPictureFrame == 1);
   439 
   440 	// Move cursor left
   441 	// Cursor on second picture and picture frame not selected
   442 	bitMap->View()->MoveCursorL(type, EFalse);
   443 	bitMap->View()->GetCursorPos(thisPos);
   444 	selectionIsPictureFrame
   445 	= bitMap->View()->IsPictureFrameSelected(dummyRect, dummyPos);
   446 	test(thisPos.iPos == 2 && type == TCursorPosition::EFLeft);
   447 	test(selectionIsPictureFrame == 0);
   448 
   449 
   450 	// Move cursor left
   451 	// Cusror still on second picture and picture frame has been selected
   452 	bitMap->View()->MoveCursorL(type, EFalse);
   453 	bitMap->View()->GetCursorPos(thisPos);
   454 	selectionIsPictureFrame
   455 	= bitMap->View()->IsPictureFrameSelected(dummyRect, dummyPos);
   456 	test(thisPos.iPos == 1 && type == TCursorPosition::EFLeft);
   457 	test(selectionIsPictureFrame == 1);
   458 
   459 	// Move cursor left
   460 	// Cursor moved to second letter "A"
   461 	bitMap->View()->MoveCursorL(type, EFalse);
   462 	bitMap->View()->GetCursorPos(thisPos);
   463 	selectionIsPictureFrame
   464 	= bitMap->View()->IsPictureFrameSelected(dummyRect, dummyPos);
   465 	test(thisPos.iPos == 1 && type == TCursorPosition::EFLeft);
   466 	test(selectionIsPictureFrame == 0);
   467 
   468 
   469 	//Move cursor left
   470 	bitMap->View()->MoveCursorL(type, EFalse);
   471 	bitMap->View()->GetCursorPos(thisPos);
   472 	selectionIsPictureFrame
   473 	= bitMap->View()->IsPictureFrameSelected(dummyRect, dummyPos);
   474 	test(thisPos.iPos == 0 && type == TCursorPosition::EFLeft);
   475 	test(selectionIsPictureFrame == 0);
   476 
   477 
   478 	CleanupStack::Pop(pic);
   479 	CleanupStack::PopAndDestroy(1);
   480 	}
   481 /**
   482 Test for defect INC020746: Visual cursor position update incorrect at end of
   483 document
   484 */
   485 void INC020746_L(TDes& aText, CTextView* aView)
   486 	{
   487 	aText.Zero();
   488 	aText.Append('A');
   489 	aText.Append(0x5D0);	// Aleph
   490 	SetViewRect1(aView);
   491 	aView->DisableFlickerFreeRedraw();
   492 	aView->HandleGlobalChangeL();
   493 	TTmDocPosSpec pos(2, TTmDocPosSpec::ELeading);
   494 	aView->SetDocPosL(pos);
   495 	TTmDocPos posOut;
   496 	aView->GetCursorPos(posOut);
   497 	test(posOut.iPos == 2);
   498 	test(posOut.iLeadingEdge);
   499 	pos.iType = TTmDocPosSpec::ETrailing;
   500 	aView->SetDocPosL(pos);
   501 	aView->GetCursorPos(posOut);
   502 	test(posOut.iPos == 2);
   503 	test(!posOut.iLeadingEdge);
   504 	}
   505 
   506 /**
   507 @SYMTestCaseID SYSLIB-FORM-UT-1653
   508 @SYMTestCaseDesc Test to make sure an ordinary hyphen is returned when a potential hyphen is inserted.
   509 @SYMTestPriority Critical.
   510 @SYMTestActions Insets a potential hyphen into some text and then check the output once it has passed
   511 				 	through MTmCustom::Map.
   512 @SYMTestExpectedResults The test must not fail.
   513 @SYMDEF INC080603: Soft Hyphen is not replaced by Ordinary Hyphen in Tagma
   514 */
   515 
   516 // Test code had to be changed because of a problem in BullseyeCoverage, which does not like
   517 // dealing with certain hexadecimal character combinations in string literals.
   518 void INC080603L(TDes& aText, CTestGraphicsDevice* aDevice,CTextLayout* aLayout, CTextView* aView)
   519 	{
   520 	_LIT(KInputText,  "ABCDEFABCDEF");
   521 	const TUint16 Hyphen = 0x00ad;
   522 
   523 	aDevice->LineArray().ResetLineArray();
   524 	aDevice->LineArray().Enable();
   525 
   526 	aText.Zero();
   527 	aText = KInputText;
   528 	aText.Insert(6, (TPtrC(&Hyphen,1)));
   529 
   530 	SetViewRect1(aView);
   531 	aLayout->SetWrapWidth(aView->ViewRect().Width());
   532 	aLayout->ForceNoWrapping(CTextLayout::EFParagraphsWrappedByDefault);
   533 
   534 	aView->HandleGlobalChangeL();
   535 
   536 	TBuf<3> des2 (aDevice->LineArray().Line(1).LineData()); //Hyphen should be on this line
   537 	TInt pos = des2.Find(_L("-"));
   538 	test (pos != KErrNotFound);
   539 
   540 	aDevice->LineArray().Disable();
   541 	}
   542 
   543 /**
   544 DEF035472 - Non-printable char detection api does not report correct result
   545 */
   546 void DEF035472_L(TDes& aText, CTextView* aView)
   547 	{
   548 	const TChar leftToRightMarker(0x200E);
   549 	aText.Zero();
   550 	aText.Append(leftToRightMarker);
   551 	aText.Append(leftToRightMarker);
   552 	aText.Append(leftToRightMarker);
   553 	aText.Append('A');
   554 	aText.Append(leftToRightMarker);
   555 	aText.Append(leftToRightMarker);
   556 	aText.Append(leftToRightMarker);
   557 	aView->HandleGlobalChangeL();
   558 	TTmDocPosSpec position(3, TTmDocPosSpec::ELeading);
   559 	aView->SetDocPosL(position);
   560 	TCursorSelection selection = aView->GetBackwardDeletePositionL();
   561 	test(selection.LowerPos() == 0);
   562 	test(selection.HigherPos() == 3);
   563 	position.iType = TTmDocPosSpec::ETrailing;
   564 	aView->SetDocPosL(position);
   565 	selection = aView->GetBackwardDeletePositionL();
   566 	test(selection.LowerPos() == 0);
   567 	test(selection.HigherPos() == 3);
   568 	position.iPos = 4;
   569 	aView->SetDocPosL(position);
   570 	selection = aView->GetForwardDeletePositionL();
   571 	test(selection.LowerPos() == 4);
   572 	test(selection.HigherPos() == 7);
   573 	position.iType = TTmDocPosSpec::ELeading;
   574 	aView->SetDocPosL(position);
   575 	selection = aView->GetForwardDeletePositionL();
   576 	test(selection.LowerPos() == 4);
   577 	test(selection.HigherPos() == 7);
   578 	}
   579 
   580 /**
   581 INC036005 - Word--difficult to place focus on an object in word.
   582 This defect is caused by a defect in Form in which when finding a position
   583 by x-y coordinate, the trailing edge is never found, always the leading edge.
   584 This means that the trailing edge of the picture is incorrectly identified as
   585 the leading edge of the following character and the picture is not highlighted.
   586 This test tests that the trailing edge of characters is found correctly.
   587 */
   588 void INC036005_L(TDes& aText, CTextView* aView)
   589 	{
   590 	aText.Zero();
   591 	aText.Append('A');
   592 	aText.Append('B');
   593 	aText.Append('C');
   594 	SetViewRect2(aView);
   595 	aView->DisableFlickerFreeRedraw();
   596 	aView->HandleGlobalChangeL();
   597 	aView->SetLeftTextMargin(0);
   598 	aView->SetViewLineAtTopL(1);
   599 	TPoint pt(22, 20);
   600 	test(1 == aView->XyPosToDocPosL(pt));
   601 	pt.SetXY(28, 20);
   602 	test(1 == aView->XyPosToDocPosL(pt));
   603 	aText.Zero();
   604 	aText.Append(0x5D0);
   605 	aText.Append(0x5D1);
   606 	aText.Append(0x5D2);
   607 	aView->HandleGlobalChangeL();
   608 	aView->SetLeftTextMargin(0);
   609 	aView->SetViewLineAtTopL(1);
   610 	pt.SetXY(92, 20);
   611 	test(1 == aView->XyPosToDocPosL(pt));
   612 	pt.SetXY(98, 20);
   613 	test(1 == aView->XyPosToDocPosL(pt));
   614 
   615 	// Test with real picture
   616 	aText.Zero();
   617 	aText.Append('A');
   618 	aText.Append(KPictureCharacter);
   619 	aText.Append('C');
   620 	aView->HandleGlobalChangeL();
   621 	aView->SetLeftTextMargin(0);
   622 	aView->SetViewLineAtTopL(1);
   623 	TInt edges;
   624 	TRect* rect;
   625 	pt.SetXY(22, 20);
   626 	aView->SetXyPosL(pt, EFalse, rect, edges);
   627 	TCursorSelection sel = aView->Selection();
   628 	test(sel.LowerPos() == 1 && sel.HigherPos() == 2);
   629 	aView->SetDocPosL(0, EFalse);
   630 	pt.SetXY(32, 20);
   631 	aView->SetXyPosL(pt, EFalse, rect, edges);
   632 	sel = aView->Selection();
   633 	test(sel.LowerPos() == 1 && sel.HigherPos() == 2);
   634 
   635 	// Test with real picture and potentially confusing ambiguities
   636 	aText.Zero();
   637 	aText.Append('A');
   638 	aText.Append(KRightToLeftMarker);
   639 	aText.Append(KPictureCharacter);
   640 	aText.Append(KRightToLeftMarker);
   641 	aText.Append('C');
   642 	aView->HandleGlobalChangeL();
   643 	aView->SetLeftTextMargin(0);
   644 	aView->SetViewLineAtTopL(1);
   645 	pt.SetXY(22, 20);
   646 	aView->SetXyPosL(pt, EFalse, rect, edges);
   647 	sel = aView->Selection();
   648 	test(sel.LowerPos() == 2 && sel.HigherPos() == 3);
   649 	aView->SetDocPosL(0, EFalse);
   650 	pt.SetXY(32, 20);
   651 	aView->SetXyPosL(pt, EFalse, rect, edges);
   652 	sel = aView->Selection();
   653 	test(sel.LowerPos() == 2 && sel.HigherPos() == 3);
   654 	}
   655 
   656 
   657 // INC085809: CSHelp - Scrolling doesn't work properly, length of the bar changes weirdly
   658 // With the fix in PosRangeInBand, the output in this case will be one pixel larger than before
   659 void INC085809_L(CTextLayout* aLayout, CTextView* aView)
   660 	{
   661 	TInt input;
   662 	TRect view(0, 0, 102, 26);
   663 	aView->SetViewRect(view);
   664 	TInt output = aLayout->PosRangeInBand(input);
   665 	test(output==11);
   666 	}
   667 
   668 // Utility functions to show contents of test data using test.Printf
   669 
   670 _LIT(KAddressMarker, "> ");
   671 _LIT(KSpace, " ");
   672 _LIT(KLength, ", Length of Data = %d 16-bit words\r\n");
   673 _LIT(KSpaces, "                                                                      ");
   674 _LIT(KPeriod, ".");
   675 _LIT(KSingleString, "%s\r\n");
   676 
   677 
   678  void PrintTestData (const TDesC& aTitle , const TDesC16& aData)
   679 	{
   680 
   681 	TInt i;
   682 	TInt j;
   683 	TInt end;
   684 
   685 	TInt length = aData.Length();
   686 
   687 	TBuf<80> buffer;
   688 
   689 	buffer.Zero();
   690 	buffer.Append(aTitle);
   691 	buffer.Append(KLength);
   692 
   693 	test.Printf(buffer, length);
   694 
   695 	for (i = 0 ; i < length ; i += 8)
   696 		{
   697 		buffer.Zero();
   698 		buffer.AppendNumFixedWidth(i, EHex, 8);
   699 		buffer += KAddressMarker;
   700 
   701 		end = ((length-i) >= 8) ? i+8 : length;
   702 
   703 		for (j = i ; j < end ; ++j)
   704 			{
   705 			buffer.AppendNumFixedWidth(aData[j], EHex, 4);
   706 			buffer += KSpace;
   707 			}
   708 		buffer += TPtrC(KSpaces().Ptr(), ((8-(j-i))*5)+4);
   709 
   710 		for (j = i ; j < end ; ++j)
   711 			{
   712 			if (aData[j] >= 32)
   713 				{
   714 				buffer.Append(aData[j]);
   715 				}
   716 			else
   717 				{
   718 				buffer += KPeriod;
   719 				}
   720 			}
   721 		buffer.ZeroTerminate();
   722 		test.Printf(KSingleString, buffer.Ptr());
   723 		}
   724 
   725 	}
   726 
   727 void PrintTestData(const TDesC& aTitle, const TText16* aDataBuffer, const TInt aSize)
   728 	{
   729 	PrintTestData(aTitle, TPtrC16(aDataBuffer, aSize));
   730 	}
   731 
   732 
   733   _LIT(KTavSequence, "\x05ea\x05ea\x05ea\x05ea\x05ea\x05ea\x05ea\x05ea\x05ea\x05ea");
   734 
   735   _LIT(KMixedSequence, "\x05d1\x05d2\x05d3\x05d4\x05d5\x05d6\x05d7\x05d8\x05d9 JCDEFGHIJ "
   736   	 L"\x05da\x05db\x05dc\x05dd\x05de\x05df\x05e0\x05e1\x05e2 KLMNOPQRS ");
   737 
   738 static const TInt KChunksPerTest = 9;
   739 static const TInt KDirectionalityTests = 5;
   740 
   741 static const TPtrC16 KDirectionalityResults[KDirectionalityTests][KChunksPerTest] =
   742 	{
   743 		{
   744 		_S("\xffff\x0020\xffff"),
   745 		_S("\xffff\x05d9\x05d8\x05d7\x05d6\x05d5\x05d4\x05d3\x05d2\x05d1\x05d0\xffff"),
   746 		_S("\xffff\x0020\xffff"),
   747 		_S("\xffff\x004a\x0043\x0044\x0045\x0046\x0047\x0048\x0049\x004a\xffff"),
   748 		_S("\xffff\x0020\xffff"),
   749 		_S("\xffff\x05e2\x05e1\x05e0\x05df\x05de\x05dd\x05dc\x05db\x05da\xffff"),
   750 		_S("\xffff\xffff\xffff"),
   751 		_S("\xffff\x0020\xffff"),
   752 		_S("\xffff\x004b\x004c\x004d\x004e\x004f\x0050\x0051\x0052\x0053\xffff")
   753 		},
   754 		{
   755 		_S("\xffff\x0020\xffff"),
   756 		_S("\xffff\x05d9\x05d8\x05d7\x05d6\x05d5\x05d4\x05d3\x05d2\x05d1\xffff"),
   757 		_S("\xffff\x0020\xffff"),
   758 		_S("\xffff\x004a\x0043\x0044\x0045\x0046\x0047\x0048\x0049\x004a\xffff"),
   759 		_S("\xffff\x0020\xffff"),
   760 		_S("\xffff\x05e2\x05e1\x05e0\x05df\x05de\x05dd\x05dc\x05db\x05da\xffff"),
   761 		_S("\xffff\xffff\xffff"),
   762 		_S("\xffff\x0020\xffff"),
   763 		_S("\xffff\x004b\x004c\x004d\x004e\x004f\x0050\x0051\x0052\x0053\xffff"),
   764 		},
   765 		{
   766 		_S("\xffff\x0049\xffff"),
   767 		_S("\xffff\x05d9\x05d8\x05d7\x05d6\x05d5\x05d4\x05d3\x05d2\x05d1\xffff"),
   768 		_S("\xffff\x0020\xffff"),
   769 		_S("\xffff\x004a\x0043\x0044\x0045\x0046\x0047\x0048\x0049\x004a\xffff"),
   770 		_S("\xffff\x0020\xffff"),
   771 		_S("\xffff\x05e2\x05e1\x05e0\x05df\x05de\x05dd\x05dc\x05db\x05da\xffff"),
   772 		_S("\xffff\x0020\xffff"),
   773 		_S("\xffff\x004b\x004c\x004d\x004e\x004f\x0050\x0051\x0052\x0053\x0020\xffff\xffff"),
   774 		_S("\xffff\xffff\xffff"),
   775 		},
   776 		{
   777 		_S("\xffff\x0020\xffff"),
   778 		_S("\xffff\x05d9\x05d8\x05d7\x05d6\x05d5\x05d4\x05d3\x05d2\x05d1\xffff"),
   779 		_S("\xffff\x0020\xffff"),
   780 		_S("\xffff\x004a\x0043\x0044\x0045\x0046\x0047\x0048\x0049\x004a\xffff"),
   781 		_S("\xffff\x0020\xffff"),
   782 		_S("\xffff\x05e2\x05e1\x05e0\x05df\x05de\x05dd\x05dc\x05db\x05da\xffff"),
   783 		_S("\xffff\xffff\xffff"),
   784 		_S("\xffff\x0020\xffff"),
   785 		_S("\xffff\x004b\x004c\x004d\x004e\x004f\x0050\x0051\x0052\x0053\xffff"),
   786 		},
   787 		{
   788 		_S("\xffff\x0020\xffff"),
   789 		_S("\xffff\x05d9\x05d8\x05d7\x05d6\x05d5\x05d4\x05d3\x05d2\x05d1\x05d0\xffff"),
   790 		_S("\xffff\x0020\xffff"),
   791 		_S("\xffff\x004a\x0043\x0044\x0045\x0046\x0047\x0048\x0049\x004a\xffff"),
   792 		_S("\xffff\x0020\xffff"),
   793 		_S("\xffff\x05e2\x05e1\x05e0\x05df\x05de\x05dd\x05dc\x05db\x05da\xffff"),
   794 		_S("\xffff\xffff\xffff"),
   795 		_S("\xffff\x0020\xffff"),
   796 		_S("\xffff\x004b\x004c\x004d\x004e\x004f\x0050\x0051\x0052\x0053\xffff"),
   797 		}
   798 	};
   799 
   800 _LIT(KTitle1, "Initial format (RtoL)");
   801 _LIT(KTitle2, "Deleting first character , still RtoL");
   802 _LIT(KTitle3, "Inserting a first character, now LtoR");
   803 _LIT(KTitle4, "Deleting first character , becoming RtoL");
   804 _LIT(KTitle5, "Inserting a first character, still RToL");
   805 _LIT(KPassed, "passed\r\n");
   806 _LIT(KFailed, "failed\r\n");
   807 _LIT(KExpected, "Expected");
   808 _LIT(KGot, "Got");
   809 _LIT(KCase, "Test case %d, testing chunk %d\r\n");
   810 
   811 
   812 
   813 const TUint16 KUnicodeLetterA			  =   'I';
   814 const TUint16 KUnicodeLetterHebrewAlef  =   0x05d0;
   815 
   816 TPtrC KLUnicodeLetterA(&KUnicodeLetterA,1);
   817 TPtrC KLUnicodeLetterHebrewAlef(&KUnicodeLetterHebrewAlef,1);
   818 
   819 void DirectionalityTestL(TDes& aText, CTestGraphicsDevice* aDevice, CTextLayout* aLayout, CTextView* aView)
   820 	{
   821 	test.Next(_L("Testing paragraph directionality of editable text"));
   822 	CTestGraphicsDevice* offScreenDevice = CTestGraphicsDevice::NewL(aDevice->SizeInPixels(), 0);
   823 	CleanupStack::PushL(offScreenDevice);
   824 	offScreenDevice->SetLineArray(aDevice->LineArray());
   825 	CWindowGc* offScreenContext;
   826 	User::LeaveIfError(offScreenDevice->CreateContext(offScreenContext));
   827 	CleanupStack::PushL(offScreenContext);
   828 	CTestTextView::SetOffScreenContext(aView, offScreenContext);
   829 	aView->EnableFlickerFreeRedraw();
   830 	TInt i;
   831 	TPtrC16 title;
   832 	TBool match;
   833 	TBool passed;
   834 	TBool allPassed = ETrue;
   835 	TInt chunksInThisTest;
   836 	for (TInt testCase = 0 ; testCase < KDirectionalityTests ; ++testCase)
   837 		{
   838 		test.Printf(_L("Directionality test case %d\r\n"), testCase+1);
   839 		passed = ETrue;
   840 		aDevice->LineArray().ResetLineArray();
   841 		chunksInThisTest = KChunksPerTest;
   842 		switch(testCase)
   843 			{
   844 			case 0:
   845 				title.Set(KTitle1);
   846 				aLayout->SetAmountToFormat(CTextLayout::EFFormatAllText);
   847 				aText.Zero();
   848 				aDevice->LineArray().ResetLineArray();
   849 				aText.Append(KUnicodeLetterHebrewAlef);  //first strong character is right-to-left
   850 				aText.Append(KMixedSequence);			 //rest of test data is constant
   851 				aView->HandleGlobalChangeL();
   852 				aView->FinishBackgroundFormattingL();
   853 				break;
   854 			case 1:
   855 				title.Set(KTitle2);
   856 				aView->SetDocPosL(0,EFalse);
   857 				aDevice->LineArray().ResetLineArray();
   858 				aText.Delete(0,1);	//delete the first character
   859 				aView->HandleGlobalChangeL();
   860 				break;
   861 			case 2:
   862 				title.Set(KTitle3);
   863 				aView->SetDocPosL(0,EFalse);
   864 				aDevice->LineArray().ResetLineArray();
   865 				aText.Insert(0,KLUnicodeLetterA); //replace first character with a left-to-right one
   866 				aView->HandleGlobalChangeL();
   867 				chunksInThisTest = KChunksPerTest - 1;
   868 				break;
   869 			case 3:
   870 				title.Set(KTitle4);
   871 				aView->SetDocPosL(0,EFalse);
   872 				aDevice->LineArray().ResetLineArray();
   873 				aText.Delete(0,1);	//delete the first character
   874 				aView->HandleGlobalChangeL();
   875 				break;
   876 			case 4:
   877 				title.Set(KTitle5);
   878 				aView->SetDocPosL(0,EFalse);
   879 				aDevice->LineArray().ResetLineArray();
   880 				aText.Insert(0,KLUnicodeLetterHebrewAlef); //replace first character with a right-to-left one again
   881 				aView->HandleGlobalChangeL();
   882 				break;
   883 			default:
   884 				test.Printf(_L("Directionality test %d undefined\r\n"), testCase);
   885 				break;
   886 			}
   887 		test.Printf(title);
   888 		for (i = 0; i < chunksInThisTest ; ++i)
   889 			{
   890             const TDesC16& des1 = KDirectionalityResults[testCase][i];
   891             const TDesC16& des2 = aDevice->LineArray().Line(i).LineData();
   892 			match = (des1.Compare(des2) == 0);
   893 			if (!match)
   894 				{
   895 				test.Printf(KCase, testCase, i);
   896 				PrintTestData(KExpected,  KDirectionalityResults[testCase][i]);
   897 				PrintTestData(KGot, aDevice->LineArray().Line(i).LineData());
   898 				}
   899 			passed = passed && match;
   900 			}
   901 		if (passed)
   902 			{
   903 			test.Printf(KPassed);
   904 			}
   905 		else
   906 			{
   907 			allPassed = EFalse;
   908 			test.Printf(KFailed);
   909 			}
   910 		}
   911 	test(allPassed);
   912 	CTestTextView::SetOffScreenContext(aView, 0);
   913 	CleanupStack::PopAndDestroy(offScreenContext);
   914 	CleanupStack::PopAndDestroy(offScreenDevice);
   915 	}
   916 
   917 // Test for defect DEF021603: Visual cursor position update incorrect when insert a LTR char after
   918 // a RTL string.
   919 void DEF021603_L(TDes& aText, CTestGraphicsDevice* aDevice, CTextView* aView)
   920 	{
   921 	CTestGraphicsDevice* offScreenDevice = CTestGraphicsDevice::NewL(aDevice->SizeInPixels(), 0);
   922 	CleanupStack::PushL(offScreenDevice);
   923 	CWindowGc* offScreenContext;
   924 	User::LeaveIfError(offScreenDevice->CreateContext(offScreenContext));
   925 	CleanupStack::PushL(offScreenContext);
   926 	CTestTextView::SetOffScreenContext(aView, offScreenContext);
   927 
   928 	TTmDocPos posOut;
   929 	aText.Zero();
   930 	aText.Append(KLUnicodeLetterHebrewAlef);
   931 	aText.Append(KLUnicodeLetterHebrewAlef);
   932 	aText.Append(KLUnicodeLetterA);
   933 	aView->HandleCharEditL(CTextLayout::EFCharacterInsert, EFalse);
   934 	aView->GetCursorPos(posOut);
   935 	test(!posOut.iLeadingEdge);		// should be on trailing edge (rhs)
   936 
   937 	CleanupStack::PopAndDestroy(offScreenContext);
   938 	CleanupStack::PopAndDestroy(offScreenDevice);
   939 	}
   940 
   941 
   942 _LIT(KText_022229, "ABCDEFGHIJABCDEFGHIJABCDEFGHIJABCABCDEFGHIJABCDEFGHIJABCDEFGHIJ");
   943 
   944 /**
   945 Test for defect DEF022229: Form: Cursor sent to 'home' position on Page up/down
   946 movement in Word.
   947 */
   948 void DEF022229_L(TDes& aText, CTestGraphicsDevice* aDevice, CTextView* aView)
   949 	{
   950 	SetViewRect2(aView);
   951 	CTestGraphicsDevice* offScreenDevice = CTestGraphicsDevice::NewL(aDevice->SizeInPixels(), 0);
   952 	CleanupStack::PushL(offScreenDevice);
   953 	CWindowGc* offScreenContext;
   954 	User::LeaveIfError(offScreenDevice->CreateContext(offScreenContext));
   955 	CleanupStack::PushL(offScreenContext);
   956 	CTestTextView::SetOffScreenContext(aView, offScreenContext);
   957 
   958 	TTmDocPos cursorPos;
   959 	aText = KText_022229;
   960 	aView->SetDocPosL(0);
   961 	test(cursorPos.iPos==0);
   962 
   963 	//LineDown
   964 	TCursorPosition::TMovementType lineDown = TCursorPosition::EFLineDown;
   965 	aView->MoveCursorL(lineDown, EFalse);
   966 	aView->GetCursorPos(cursorPos);
   967 	TInt compare = cursorPos.iPos;
   968 
   969 	//PageDown
   970 	TCursorPosition::TMovementType pageDown = TCursorPosition::EFPageDown;
   971 	aView->MoveCursorL(pageDown, EFalse);
   972 	aView->GetCursorPos(cursorPos);
   973 	test(cursorPos.iPos!=0);
   974 
   975 	//PageUp
   976 	TCursorPosition::TMovementType pageUp = TCursorPosition::EFPageUp;
   977 	aView->MoveCursorL(pageUp, EFalse);
   978 	aView->GetCursorPos(cursorPos);
   979 	test(cursorPos.iPos==compare);
   980 
   981 	CTestTextView::SetOffScreenContext(aView, 0);
   982 	CleanupStack::PopAndDestroy(offScreenContext);
   983 	CleanupStack::PopAndDestroy(offScreenDevice);
   984 	}
   985 
   986 /**
   987 Tests that CTextView::XyPosToDocPosL returns the correct positions in the case
   988 where the point passed in is beyond the horizontal bounds of the line.
   989 */
   990 void TestCTextView_XyPosToDocPosL_ReturnsCorrectLine(
   991 	TDes& aText, CTextView* aView)
   992 	{
   993 	aText = _L("abcdef ghijkl\x2029zyxwvu.");
   994 	aView->HandleGlobalChangeL();
   995 	TPoint pt(-20, 24);
   996 	TInt pos = aView->XyPosToDocPosL(pt);
   997 	test(pos == 0);
   998 	pt.SetXY(200, 24);
   999 	pos = aView->XyPosToDocPosL(pt);
  1000 	test(pos == 6 || pos == 5);
  1001 	pt.SetXY(-20, 36);
  1002 	pos = aView->XyPosToDocPosL(pt);
  1003 	test(pos == 7);
  1004 	pt.SetXY(200, 36);
  1005 	pos = aView->XyPosToDocPosL(pt);
  1006 	test(pos == 13);
  1007 	pt.SetXY(-20, 48);
  1008 	pos = aView->XyPosToDocPosL(pt);
  1009 	test(pos == 14);
  1010 	pt.SetXY(200, 48);
  1011 	pos = aView->XyPosToDocPosL(pt);
  1012 	test(pos == 20 || pos == 21);
  1013 	}
  1014 
  1015 void INC036809_L(TDes& aText, CTextView* aView)
  1016 	{
  1017 	aText = _L("A\tB");
  1018 	aView->HandleGlobalChangeL();
  1019 	TTmPosInfo2 posInfo;
  1020 	TTmDocPosSpec pos(1, TTmDocPosSpec::ELeading);
  1021 	TBool result = aView->FindDocPosL(pos, posInfo);
  1022 	test(result);
  1023 	test(posInfo.iDocPos.iPos == 1);
  1024 	test(posInfo.iDocPos.iLeadingEdge);
  1025 	test(posInfo.iEdge.iX = 30);
  1026 	pos.iPos = 2;
  1027 	pos.iType = TTmDocPosSpec::ETrailing;
  1028 	result = aView->FindDocPosL(pos, posInfo);
  1029 	test(result);
  1030 	test(posInfo.iDocPos.iPos == 2);
  1031 	test(!posInfo.iDocPos.iLeadingEdge);
  1032 	test(posInfo.iEdge.iX = 45);
  1033 	pos.iType = TTmDocPosSpec::ELeading;
  1034 	result = aView->FindDocPosL(pos, posInfo);
  1035 	test(result);
  1036 	test(posInfo.iDocPos.iPos == 2);
  1037 	test(posInfo.iDocPos.iLeadingEdge);
  1038 	test(posInfo.iEdge.iX = 45);
  1039 	}
  1040 
  1041 void DEF037255_L(TDes& aText, CTextView* aView)
  1042 	{
  1043 	// 0x2004 = 3-per-em space: 3 pixels in the test font
  1044 	// 0x2029 = Paragraph delimiter
  1045 	// 0xFFFC = object replacement character
  1046 	aText = _L("\x2004\x2004Y\x2029\xFFFC\x2029\x2004\x2004W");
  1047 	aView->EnablePictureFrameL(ETrue);
  1048 	aView->HandleGlobalChangeL();
  1049 	TTmDocPos pos(1, EFalse);
  1050 	aView->SetDocPosL(pos);
  1051 	const TCursorPosition::TMovementType down = TCursorPosition::EFLineDown;
  1052 	TCursorPosition::TMovementType m = down;
  1053 	aView->MoveCursorL(m, EFalse);
  1054 	TCursorSelection sel = aView->Selection();
  1055 	test(sel.LowerPos() == 4);
  1056 	test(sel.HigherPos() == 5);
  1057 	m = down;
  1058 	aView->MoveCursorL(m, EFalse);
  1059 	sel = aView->Selection();
  1060 	test(sel.LowerPos() == 7);
  1061 	test(sel.HigherPos() == 7);
  1062 	}
  1063 
  1064 /** Tests that the horizontal scroll position is within acceptable bounds.
  1065 */
  1066 void TestCursorPosition(const CTextView* aView)
  1067 	{
  1068 	TInt hsj = aView->HorizontalScrollJump();
  1069 	TInt width = aView->ViewRect().Width();
  1070 	TInt buffer = width / 10;
  1071 	TInt left;
  1072 	TInt right;
  1073 	aView->Layout()->CalculateHorizontalExtremesL(left, right, ETrue, EFalse);
  1074 	TInt minCursorX = 0;
  1075 	TInt maxCursorX = width;
  1076 	if (left < 0)
  1077 		{
  1078 		left -= hsj + buffer;
  1079 		minCursorX = buffer;
  1080 		}
  1081 	if (width < right)
  1082 		{
  1083 		right += hsj + buffer;
  1084 		maxCursorX = width - buffer;
  1085 		}
  1086 	TInt ltm = aView->LeftTextMargin();
  1087 	TTmDocPos docPos;
  1088 	aView->GetCursorPos(docPos);
  1089 	TTmPosInfo2 posInfo;
  1090 	TTmLineInfo lineInfo;
  1091 	TBool docPosFormatted = aView->Layout()
  1092 		->FindDocPos(docPos, posInfo, &lineInfo);
  1093 	TBool cursorIsOutsideBounds = posInfo.iEdge.iX < lineInfo.iInnerRect.iTl.iX
  1094 		|| lineInfo.iInnerRect.iBr.iX <= posInfo.iEdge.iX? ETrue : EFalse;
  1095 	TInt cursorX = posInfo.iEdge.iX - ltm;
  1096 	test(docPosFormatted);
  1097 	test((left <= ltm && ltm + width <= right)
  1098 		|| cursorIsOutsideBounds);
  1099 	test((minCursorX <= cursorX && cursorX <= maxCursorX)
  1100 		|| cursorIsOutsideBounds);
  1101 	}
  1102 
  1103 void INC037293_L(TDes& aText, CTextView* aView, CTextLayout* aLayout)
  1104 	{
  1105 	aView->EnablePictureFrameL(EFalse);
  1106 	aLayout->ForceNoWrapping(CTextLayout::EFAllParagraphsNotWrapped);
  1107 	aLayout->SetWrapWidth(aView->ViewRect().Width());
  1108 	aText.Zero();
  1109 	aView->HandleGlobalChangeL();
  1110 	TestCursorPosition(aView);
  1111 	TCursorPosition::TMovementType move;
  1112 	for (TInt i0 = 0; i0 != 20; ++i0)
  1113 		{
  1114 		aText.Append('a' + i0);
  1115 		TCursorSelection sel(i0, i0 + 1);
  1116 		aView->HandleInsertDeleteL(sel, 0, EFalse);
  1117 		TestCursorPosition(aView);
  1118 		}
  1119 	move = TCursorPosition::EFLineBeg;
  1120 	aView->MoveCursorL(move, EFalse);
  1121 	TestCursorPosition(aView);
  1122 	move = TCursorPosition::EFLineEnd;
  1123 	aView->MoveCursorL(move, EFalse);
  1124 	TestCursorPosition(aView);
  1125 	for (TInt i1 = 0; i1 != 20; ++i1)
  1126 		{
  1127 		move = TCursorPosition::EFLeft;
  1128 		aView->MoveCursorL(move, EFalse);
  1129 		TestCursorPosition(aView);
  1130 		}
  1131 	for (TInt i2 = 0; i2 != 20; ++i2)
  1132 		{
  1133 		move = TCursorPosition::EFRight;
  1134 		aView->MoveCursorL(move, EFalse);
  1135 		TestCursorPosition(aView);
  1136 		}
  1137 	aText.Zero();
  1138 	aView->HandleGlobalChangeL();
  1139 	TestCursorPosition(aView);
  1140 	for (TInt i3 = 0; i3 != 20; ++i3)
  1141 		{
  1142 		aText.Append(KAleph);
  1143 		TCursorSelection sel(i3, i3 + 1);
  1144 		aView->HandleInsertDeleteL(sel, 0, EFalse);
  1145 		TestCursorPosition(aView);
  1146 		}
  1147 	move = TCursorPosition::EFLineBeg;
  1148 	aView->MoveCursorL(move, EFalse);
  1149 	TestCursorPosition(aView);
  1150 	move = TCursorPosition::EFLineEnd;
  1151 	aView->MoveCursorL(move, EFalse);
  1152 	TestCursorPosition(aView);
  1153 	for (TInt i4 = 0; i4 != 20; ++i4)
  1154 		{
  1155 		move = TCursorPosition::EFRight;
  1156 		aView->MoveCursorL(move, EFalse);
  1157 		TestCursorPosition(aView);
  1158 		}
  1159 	for (TInt i5 = 0; i5 != 20; ++i5)
  1160 		{
  1161 		move = TCursorPosition::EFLeft;
  1162 		aView->MoveCursorL(move, EFalse);
  1163 		TestCursorPosition(aView);
  1164 		}
  1165 
  1166 	aText.Zero();
  1167 	aLayout->ForceNoWrapping(CTextLayout::EFParagraphsWrappedByDefault);
  1168 	aView->HandleGlobalChangeL();
  1169 	TestCursorPosition(aView);
  1170 	for (TInt i6 = 0; i6 != 10; ++i6)
  1171 		{
  1172 		aText.Append('a' + i6);
  1173 		aText.Append(' ');
  1174 		TCursorSelection sel(i6 * 2, i6 * 2 + 2);
  1175 		aView->HandleInsertDeleteL(sel, 0, EFalse);
  1176 		TestCursorPosition(aView);
  1177 		}
  1178 	for (TInt i7 = 0; i7 != 30; ++i7)
  1179 		{
  1180 		move = TCursorPosition::EFLeft;
  1181 		aView->MoveCursorL(move, EFalse);
  1182 		TestCursorPosition(aView);
  1183 		}
  1184 	for (TInt i8 = 0; i8 != 30; ++i8)
  1185 		{
  1186 		move = TCursorPosition::EFRight;
  1187 		aView->MoveCursorL(move, EFalse);
  1188 		TestCursorPosition(aView);
  1189 		}
  1190 
  1191 	aText.Zero();
  1192 	aView->HandleGlobalChangeL();
  1193 	TestCursorPosition(aView);
  1194 	for (TInt i9 = 0; i9 != 10; ++i9)
  1195 		{
  1196 		aText.Append(KAleph);
  1197 		aText.Append(' ');
  1198 		TCursorSelection sel(i9 * 2, i9 * 2 + 2);
  1199 		aView->HandleInsertDeleteL(sel, 0, EFalse);
  1200 		TestCursorPosition(aView);
  1201 		}
  1202 	for (TInt ia = 0; ia != 30; ++ia)
  1203 		{
  1204 		move = TCursorPosition::EFRight;
  1205 		aView->MoveCursorL(move, EFalse);
  1206 		TestCursorPosition(aView);
  1207 		}
  1208 	for (TInt ib = 0; ib != 30; ++ib)
  1209 		{
  1210 		move = TCursorPosition::EFLeft;
  1211 		aView->MoveCursorL(move, EFalse);
  1212 		TestCursorPosition(aView);
  1213 		}
  1214 	}
  1215 
  1216 /** Tests that the text specified has been drawn by the device and returns
  1217 its x-coordinate. */
  1218 TInt XCoordinateOfText(const TDesC& aText, CTestGraphicsDevice* aDevice)
  1219 	{
  1220 	const TTestGCDisplayLine* line = aDevice->LineArray().Find(aText);
  1221 	test(line != 0);
  1222 	return line->Position().iX;
  1223 	}
  1224 
  1225 /**
  1226 INC038282 - Right-to-Left text in CSHLPCMP toolchain + Form is not formatted
  1227 correctly
  1228 
  1229 Tests that when the text directionality is resolved implicitly the indents,
  1230 margins and bullets are on the correct sides.
  1231 @internalComponent
  1232 */
  1233 void INC038282_L(TDes& aText, CTestGraphicsDevice* aDevice,
  1234 	CTextLayout* aLayout, CTextView* aView,
  1235 	CParaFormat* aParagraphFormat)
  1236 	{
  1237 	SetViewRect2(aView);
  1238 	// Gentle first test: set margins, left-to-right text, no bullets, leading alignment.
  1239 	aText = _L("F s.");
  1240 	aParagraphFormat->iLeftMarginInTwips = 200;	// 5 pixels
  1241 	aParagraphFormat->iRightMarginInTwips = 600;	// 15 pixels
  1242 	aParagraphFormat->iIndentInTwips = 280;		// 7 pixels
  1243 	aParagraphFormat->iHorizontalAlignment = CParaFormat::ELeftAlign;
  1244 	aLayout->SetWrapWidth(aView->ViewRect().Width());
  1245 	TCursorSelection selection(0, 0);
  1246 	aView->SetPendingSelection(selection);
  1247 	aDevice->LineArray().ResetLineArray();
  1248 	aView->HandleGlobalChangeL();
  1249 	TInt x = XCoordinateOfText(_L("F"), aDevice);
  1250 	test(x == 22);
  1251 	x = XCoordinateOfText(_L("s."), aDevice);
  1252 	test(x == 15);
  1253 	// Now right aligned
  1254 	aParagraphFormat->iHorizontalAlignment = CParaFormat::ERightAlign;
  1255 	aView->SetPendingSelection(selection);
  1256 	aDevice->LineArray().ResetLineArray();
  1257 	aView->HandleGlobalChangeL();
  1258 	x = XCoordinateOfText(_L("F"), aDevice);
  1259 	test(x == 35);
  1260 	x = XCoordinateOfText(_L("s."), aDevice);
  1261 	test(x == 25);
  1262 	// Now Hebrew left aligned (with ERightAlign set, because really
  1263 	// that means "trailing")
  1264 	aText = _L("\x5D0 \x5D1");
  1265 	aView->SetPendingSelection(selection);
  1266 	aDevice->LineArray().ResetLineArray();
  1267 	aView->HandleGlobalChangeL();
  1268 	x = XCoordinateOfText(_L("\x5D0"), aDevice);
  1269 	test(x == 25);
  1270 	x = XCoordinateOfText(_L("\x5D1"), aDevice);
  1271 	test(x == 25);
  1272 	// Now right aligned (== leading == ELeftAlign).
  1273 	aParagraphFormat->iHorizontalAlignment = CParaFormat::ELeftAlign;
  1274 	aView->SetPendingSelection(selection);
  1275 	aDevice->LineArray().ResetLineArray();
  1276 	aView->HandleGlobalChangeL();
  1277 	x = XCoordinateOfText(_L("\x5D0"), aDevice);
  1278 	test(x == 38);
  1279 	x = XCoordinateOfText(_L("\x5D1"), aDevice);
  1280 	test(x == 45);
  1281 	// Now with a bullet.
  1282 	aParagraphFormat->iIndentInTwips = 440;		// 11 pixels
  1283 	aParagraphFormat->iBullet = new(ELeave) TBullet;
  1284 	aParagraphFormat->iBullet->iHangingIndent = EFalse;
  1285 	aParagraphFormat->iBullet->iCharacterCode = 0x2022;
  1286 	aView->SetPendingSelection(selection);
  1287 	aDevice->LineArray().ResetLineArray();
  1288 	aView->HandleGlobalChangeL();
  1289 	x = XCoordinateOfText(_L("\x5D0"), aDevice);
  1290 	test(x == 34);
  1291 	x = XCoordinateOfText(_L("\x5D1"), aDevice);
  1292 	test(x == 45);
  1293 	x = XCoordinateOfText(_L("\x2022"), aDevice);
  1294 	test(44 <= x);
  1295 	// Trailing (left) align
  1296 	aParagraphFormat->iHorizontalAlignment = CParaFormat::ERightAlign;
  1297 	aView->SetPendingSelection(selection);
  1298 	aDevice->LineArray().ResetLineArray();
  1299 	aView->HandleGlobalChangeL();
  1300 	x = XCoordinateOfText(_L("\x5D0"), aDevice);
  1301 	test(x == 25);
  1302 	x = XCoordinateOfText(_L("\x5D1"), aDevice);
  1303 	test(x == 25);
  1304 	x = XCoordinateOfText(_L("\x2022"), aDevice);
  1305 	test(35 <= x);
  1306 	// Latin text, right aligned.
  1307 	aText = _L("F s.");
  1308 	aView->SetPendingSelection(selection);
  1309 	aDevice->LineArray().ResetLineArray();
  1310 	aView->HandleGlobalChangeL();
  1311 	x = XCoordinateOfText(_L("F"), aDevice);
  1312 	test(x == 35);
  1313 	x = XCoordinateOfText(_L("s."), aDevice);
  1314 	test(x == 25);
  1315 	x = XCoordinateOfText(_L("\x2022"), aDevice);
  1316 	test(x <= 25);
  1317 	// left aligned
  1318 	aParagraphFormat->iHorizontalAlignment = CParaFormat::ELeftAlign;
  1319 	aView->SetPendingSelection(selection);
  1320 	aDevice->LineArray().ResetLineArray();
  1321 	aView->HandleGlobalChangeL();
  1322 	x = XCoordinateOfText(_L("F"), aDevice);
  1323 	test(x == 26);
  1324 	x = XCoordinateOfText(_L("s"), aDevice);
  1325 	test(x == 15);
  1326 	x = XCoordinateOfText(_L("\x2022"), aDevice);
  1327 	test(x <= 15);
  1328 	// Now bullet with hanging indent (Latin text, leading alignment)
  1329 	aParagraphFormat->iBullet->iHangingIndent = ETrue;
  1330 	aView->SetPendingSelection(selection);
  1331 	aDevice->LineArray().ResetLineArray();
  1332 	aView->HandleGlobalChangeL();
  1333 	x = XCoordinateOfText(_L("F"), aDevice);
  1334 	test(x == 26);
  1335 	x = XCoordinateOfText(_L("s"), aDevice);
  1336 	test(x == 26);
  1337 	x = XCoordinateOfText(_L("\x2022"), aDevice);
  1338 	test(x <= 15);
  1339 	// Trailing alignment
  1340 	aParagraphFormat->iHorizontalAlignment = CParaFormat::ERightAlign;
  1341 	aView->SetPendingSelection(selection);
  1342 	aDevice->LineArray().ResetLineArray();
  1343 	aView->HandleGlobalChangeL();
  1344 	x = XCoordinateOfText(_L("F"), aDevice);
  1345 	test(x == 35);
  1346 	x = XCoordinateOfText(_L("s"), aDevice);
  1347 	test(x == 35);
  1348 	x = XCoordinateOfText(_L("\x2022"), aDevice);
  1349 	test(x <= 25);
  1350 	// Hebrew, trailing, hanging indent
  1351 	aText = _L("\x5D0 \x5D1");
  1352 	aView->SetPendingSelection(selection);
  1353 	aDevice->LineArray().ResetLineArray();
  1354 	aView->HandleGlobalChangeL();
  1355 	x = XCoordinateOfText(_L("\x5D0"), aDevice);
  1356 	test(x == 25);
  1357 	x = XCoordinateOfText(_L("\x5D1"), aDevice);
  1358 	test(x == 25);
  1359 	x = XCoordinateOfText(_L("\x2022"), aDevice);
  1360 	test(36 <= x);
  1361 	// Leading alignment
  1362 	aParagraphFormat->iHorizontalAlignment = CParaFormat::ELeftAlign;
  1363 	aView->SetPendingSelection(selection);
  1364 	aDevice->LineArray().ResetLineArray();
  1365 	aView->HandleGlobalChangeL();
  1366 	x = XCoordinateOfText(_L("\x5D0"), aDevice);
  1367 	test(x == 34);
  1368 	x = XCoordinateOfText(_L("\x5D1"), aDevice);
  1369 	test(x == 34);
  1370 	x = XCoordinateOfText(_L("\x2022"), aDevice);
  1371 	test(44 <= x);
  1372 
  1373 	aParagraphFormat->Reset();
  1374 	}
  1375 
  1376 /**
  1377 @SYMTestCaseID          SYSLIB-FORM-UT-1663
  1378 @SYMTestCaseDesc	    Tests to make sure when non-solid border has been set for the paragraph more than 1 line,
  1379 						there's no border been drawn between the lines in the paragraph.
  1380 @SYMTestPriority 	    High
  1381 @SYMTestActions  	    Insert a paragraph of text, which contains at least 3 lines. Draw non-solid borders
  1382 						for the paragraph. Check the area between line 1 and line 2 to see if there's any border
  1383 						been drawn incorrectly.
  1384 @SYMTestExpectedResults Test must not fail
  1385 @SYMDEF                 DEF073913
  1386 */
  1387 const TInt KBorderThicknessInTwips=40;
  1388 
  1389 void DEF073913L(TDes& aText, CTestGraphicsDevice* aDevice, CTextView* aView, CParaFormat* aParagraphFormat)
  1390 	{
  1391 	SetViewRect1(aView);
  1392 
  1393 	aText = _L("abcdefghijklmnopqrstuvwxyz");
  1394 
  1395 	// set borders' attribute
  1396 	TParaBorder top;
  1397 	TParaBorder bottom;
  1398 	TParaBorder left;
  1399 	TParaBorder right;
  1400 	top.iThickness=KBorderThicknessInTwips;
  1401 	bottom.iThickness=KBorderThicknessInTwips;
  1402 	left.iThickness=KBorderThicknessInTwips;
  1403 	right.iThickness=KBorderThicknessInTwips;
  1404 
  1405 	// make it non-solid for the defect testing
  1406 	top.iLineStyle=TParaBorder::EDotted;
  1407 	bottom.iLineStyle=TParaBorder::EDotted;
  1408 	left.iLineStyle=TParaBorder::EDotted;
  1409 	right.iLineStyle=TParaBorder::EDotted;
  1410 
  1411 	TParaFormatMask aParaMask;
  1412 	aParaMask.SetAttrib(EAttTopBorder);
  1413 	aParaMask.SetAttrib(EAttBottomBorder);
  1414 	aParaMask.SetAttrib(EAttLeftBorder);
  1415 	aParaMask.SetAttrib(EAttRightBorder);
  1416 
  1417 	aParagraphFormat->SetParaBorderL(CParaFormat::EParaBorderTop,top);
  1418 	aParagraphFormat->SetParaBorderL(CParaFormat::EParaBorderBottom,bottom);
  1419 	aParagraphFormat->SetParaBorderL(CParaFormat::EParaBorderLeft,left);
  1420 	aParagraphFormat->SetParaBorderL(CParaFormat::EParaBorderRight,right);
  1421 
  1422 	TCursorSelection selection(0, 0);
  1423 	aView->SetPendingSelection(selection);
  1424 
  1425 	// set testing area: border area between text line 1 and line 2
  1426 	TRect forbiddenArea(1, 13, 49, 13);
  1427 	aDevice->SetTestingArea(forbiddenArea);
  1428 	aDevice->LineArray().ResetLineArray();
  1429 	aView->HandleGlobalChangeL();
  1430 
  1431 	// check there have enough lines in the paragraph
  1432 	TInt lines = aDevice->LineArray().LinesPresent();
  1433 	test(lines >= 3);
  1434 
  1435 	// check the drawing result,
  1436 	// expected: no line has been drawn on the testing area
  1437 	test(aDevice->HasDrawnOnTestingArea() == EFalse);
  1438 
  1439 	aParagraphFormat->Reset();
  1440 	}
  1441 
  1442 /**
  1443 INC039567 - Zero-width Non-joiner character does not work in editors
  1444 
  1445 Tests that Arabic letters separated by ZWNJ (U+200C) are either rendered in
  1446 separate calls or remain separated in their strings by ZWNJ.
  1447 @internalComponent
  1448 */
  1449 void INC039567_L(TDes& aText, CTestGraphicsDevice* aDevice, CTextView* aView)
  1450 	{
  1451 	aText = _L("\x628\x200C\x62D\x200C\x633");
  1452 	aDevice->LineArray().ResetLineArray();
  1453 	aView->HandleGlobalChangeL();
  1454 	for (TInt i = 0; i < aText.Length(); i += 2)
  1455 		{
  1456 		const TTestGCDisplayLine *line = aDevice->LineArray().Find(
  1457 			aText.Mid(i, 1));
  1458 		// Check that the line actually was drawn
  1459 		test(0 != line);
  1460 		const TDesC& displayed = line->iLineData;
  1461 		TInt pos = displayed.Locate(aText[i]);
  1462 		// Check that the line contains the text we expect. Failure here indicates
  1463 		// a failure of the test code.
  1464 		test(0 <= pos);
  1465 		// Check that the character is followed by a ZWNJ, if anything at all.
  1466 		// 0xFFFF intervening is OK
  1467 		for (TInt j = pos + 1;
  1468 			j != displayed.Length() && displayed[j] != KZeroWidthNonJoiner;
  1469 			++j)
  1470 			test(displayed[j] == 0xFFFF);
  1471 		// Check that the character is preceded by a ZWNJ, if anything at all.
  1472 		// 0xFFFF intervening is OK
  1473 		for (TInt k = pos;
  1474 			0 != k && displayed[k - 1] != KZeroWidthNonJoiner; --k)
  1475 			test(displayed[k - 1] == 0xFFFF);
  1476 		}
  1477 	}
  1478 
  1479 /** Erroneous Cursor movement on top two lines
  1480 
  1481 Tests that when the cursor is moved up to the top of the document and then up
  1482 one more to the start of the document, that the latent X position moves to the
  1483 start of the line as well.
  1484 @internalComponent
  1485 */
  1486 void DEF061143_L(TDes& aText, CTextLayout* aLayout, CTextView* aView)
  1487 	{
  1488 	SetViewRect1(aView);
  1489 	aLayout->ForceNoWrapping(CTextLayout::EFParagraphsWrappedByDefault);
  1490 	aLayout->SetWrapWidth(aView->ViewRect().Width());
  1491 	aText = _L("First Line Second.");
  1492 	aView->HandleGlobalChangeL();
  1493 	TTmDocPos pos(15, ETrue);
  1494 	aView->SetDocPosL(pos);
  1495 	TCursorPosition::TMovementType move = TCursorPosition::EFLineUp;
  1496 	aView->MoveCursorL(move, EFalse);
  1497 	move = TCursorPosition::EFLineUp;
  1498 	aView->MoveCursorL(move, EFalse);
  1499 	aView->GetCursorPos(pos);
  1500 	test(pos.iPos == 0);
  1501 	move = TCursorPosition::EFLineDown;
  1502 	aView->MoveCursorL(move, EFalse);
  1503 	aView->GetCursorPos(pos);
  1504 	test(pos.iPos == 11);
  1505 	}
  1506 
  1507 /** Page Down from last line moves the cursor to the start of the line. */
  1508 void DEF063340_L(TDes& aText, CTextLayout* aLayout, CTextView* aView)
  1509 	{
  1510 	SetViewRect1(aView);
  1511 	aLayout->ForceNoWrapping(CTextLayout::EFParagraphsWrappedByDefault);
  1512 	aLayout->SetWrapWidth(aView->ViewRect().Width());
  1513 	aText = _L("j");
  1514 	aView->HandleGlobalChangeL();
  1515 	TTmDocPos pos(1, EFalse);
  1516 	aView->SetDocPosL(pos);
  1517 	TCursorPosition::TMovementType move = TCursorPosition::EFPageDown;
  1518 	aView->MoveCursorL(move, EFalse);
  1519 	aView->GetCursorPos(pos);
  1520 	test(pos.iPos == 1);
  1521 	test(move == TCursorPosition::EFLineEnd);
  1522 	}
  1523 
  1524 TBool LineIsEqual(CLineArray& aLineArray, TInt aLineNumber,
  1525 	const TDesC& aCandidate)
  1526 	{
  1527 	TPtrC line;
  1528 	line.Set( aLineArray.Line(aLineNumber).LineData() );
  1529 	while (1 < line.Length() && line[0] == 0xFFFF)
  1530 		line.Set( line.Mid(1) );
  1531 	while (1 < line.Length() && line[line.Length() - 1] == 0xFFFF)
  1532 		line.Set( line.Left(line.Length() - 1) );
  1533 	return 0 == aCandidate.Compare(line);
  1534 	}
  1535 
  1536 _LIT(KClusterBreakTest1, "\xE01\xE33");
  1537 _LIT(KClusterBreakTest2, "citta\x300");
  1538 _LIT(KClusterBreakTest3, "\x928\x94d\x928");
  1539 /** @SYMTestCaseID SYSLIB-FORM-UT-1533
  1540 @SYMTestCaseDesc
  1541 	Test that clusters are not broken by segmented storage.
  1542 @SYMTestPriority High
  1543 @SYMTestActions
  1544 	Format some Devanagari with a text model that deliberately
  1545 	refuses to supply Form with whole syllables. Check that whole
  1546 	syllables are rendered.
  1547 @SYMTestExpectedResults No panics.
  1548 @SYMPREQ PREQ18 */
  1549 void TestClusterBreaks(TDes& aText, CTestGraphicsDevice* aDevice,
  1550 	CTextLayout* aLayout, CTextView* aView, TDocModel* aDocModel)
  1551 	{
  1552 	SetViewRect1(aView);
  1553 	aLayout->ForceNoWrapping(CTextLayout::EFParagraphsWrappedByDefault);
  1554 	aLayout->SetWrapWidth(aView->ViewRect().Width());
  1555 	aDevice->LineArray().Enable();
  1556 	TCharFormat dummy;
  1557 	TPtrC text;
  1558 	aText = KClusterBreakTest1();
  1559 	aDocModel->SetBreakPos(1);
  1560 	// Check TDocModel is actually doing the test correctly
  1561 	aDocModel->GetChars(text, dummy, 0);
  1562 	test(text.Length() == 1);
  1563 	aDevice->LineArray().ResetLineArray();
  1564 	aView->HandleGlobalChangeL();
  1565 	test(LineIsEqual(aDevice->LineArray(), 0, KClusterBreakTest1));
  1566 
  1567 	aText = KClusterBreakTest2();
  1568 	aDocModel->SetBreakPos(5);
  1569 	aDocModel->GetChars(text, dummy, 0);
  1570 	test(text.Length() == 5);
  1571 	aDevice->LineArray().ResetLineArray();
  1572 	aView->HandleGlobalChangeL();
  1573 	test(LineIsEqual(aDevice->LineArray(), 0, KClusterBreakTest2));
  1574 
  1575 	aText = KClusterBreakTest3();
  1576 	aDocModel->SetBreakPos(2);
  1577 	aDocModel->GetChars(text, dummy, 0);
  1578 	test(text.Length() == 2);
  1579 	aDevice->LineArray().ResetLineArray();
  1580 	aView->HandleGlobalChangeL();
  1581 	test(LineIsEqual(aDevice->LineArray(), 0, KClusterBreakTest3));
  1582 
  1583 	aDocModel->SetBreakPos(0);
  1584 	}
  1585 
  1586 /** DEF065322: Inconsistent parameter values in MFormCustomDraw::DrawBackground() */
  1587 const TInt KDEF065322_CharSize = 13; // height of char
  1588 const TInt KDEF065322_MaxCount = 3;
  1589 const TInt KDEF065322_RectSize = 100; // view is 100 by 100
  1590 
  1591 class DEF065322_CustomDraw : public MFormCustomDraw
  1592 	{
  1593 public:
  1594 	void DrawBackground(const TParam &aParam, const TRgb &aBackground, TRect &aDrawn) const
  1595 		{
  1596 		TRgb ignore(aBackground);
  1597 		aDrawn = aParam.iDrawRect;
  1598 
  1599 		// Test that there are 3 calls to this method and that the expected results are returned.
  1600 		test(count < KDEF065322_MaxCount);
  1601 
  1602 		test(aDrawn.iTl.iX == 0);
  1603 		test(aDrawn.iTl.iY == count*KDEF065322_CharSize);
  1604 		test(aDrawn.iBr.iX == KDEF065322_RectSize);
  1605 
  1606 		if(count < KDEF065322_MaxCount-1)
  1607 			{
  1608 			test(aDrawn.iBr.iY == (1+count)*KDEF065322_CharSize);
  1609 			}
  1610 		else
  1611 			{
  1612 			test(aDrawn.iBr.iY == KDEF065322_RectSize);
  1613 			}
  1614 		count++;
  1615 		}
  1616 
  1617 		static TInt count;
  1618 	};
  1619 
  1620 TInt DEF065322_CustomDraw::count = 0;
  1621 
  1622 void DEF065322_L(TDes& aText, CTextLayout* aLayout, CTextView* aView)
  1623 	{
  1624 	// This text results in 3 calls to the DEF065322_CustomDraw::DrawBackground()
  1625 	// 1 call for each line of text (2) and 1 for remainder of the text view.
  1626 	aText = _L("12345678901234567890");
  1627 	TRect displayRect(0, 0, 100, 100);
  1628 
  1629 	// custom draw
  1630 	DEF065322_CustomDraw customDraw;
  1631 	aLayout->SetCustomDraw(&customDraw);
  1632 
  1633 	// create screen context
  1634 	CTestGraphicsDevice* device = CTestGraphicsDevice::NewL(displayRect.Size(), 0);
  1635 	CleanupStack::PushL(device);
  1636 	CTestGraphicsDevice* screenDevice = CTestGraphicsDevice::NewL(device->SizeInPixels(), 0);
  1637 	CleanupStack::PushL(screenDevice);
  1638 	screenDevice->SetLineArray(device->LineArray());
  1639 	CWindowGc* screenContext;
  1640 	User::LeaveIfError(screenDevice->CreateContext(screenContext));
  1641 	CleanupStack::PushL(screenContext);
  1642 	CTestTextView::SetOffScreenContext(aView, screenContext);
  1643 
  1644 	// enable flicker free redraw
  1645 	aView->EnableFlickerFreeRedraw();
  1646 
  1647 	// Cause DEF065322_CustomDraw::DrawBackground() to be executed 3 times
  1648 	aView->HandleGlobalChangeL();
  1649 
  1650 	// reset counter
  1651 	DEF065322_CustomDraw::count = 0;
  1652 
  1653 	// disable flicker free redraw
  1654 	aView->DisableFlickerFreeRedraw();
  1655 
  1656 	// Cause DEF065322_CustomDraw::DrawBackground() to be executed 3 times
  1657 	aView->HandleGlobalChangeL();
  1658 
  1659 	// remove custom draw
  1660 	aLayout->SetCustomDraw(NULL);
  1661 
  1662 	// tidy up
  1663 	CTestTextView::SetOffScreenContext(aView, 0);
  1664 	CleanupStack::PopAndDestroy(screenContext);
  1665 	CleanupStack::PopAndDestroy(screenDevice);
  1666 	CleanupStack::PopAndDestroy(device);
  1667 	}
  1668 
  1669  // Side-bearings at the ends of chunks are now taken into account.
  1670  void INC078304_L(TDes& aText, CTextView* aView)
  1671  	{
  1672  	// W has side-bearings of 1 pixel extending on each side.
  1673  	// Waw (U+0648) has a left side-bearing of -5
  1674  	// Therefore "WWW" has total width 1+10+10+10+1 == 32
  1675  	// WawWaw has total width 5+10+10 == 25
  1676  	SetViewRect1(aView);
  1677  	aText = _L("WWW\x648\x648WWW\x2029\xff0f\xff0f\xff0f\x2029///");
  1678  	aView->HandleGlobalChangeL();
  1679  	TTmLineInfo line;
  1680  	TTmPosInfo2 posInfo;
  1681  	TTmDocPosSpec posSpec(1, TTmDocPosSpec::ETrailing);
  1682  	aView->FindDocPosL(posSpec, posInfo, &line);
  1683  	test(line.iInnerRect.iTl.iX == 0);
  1684  	test(line.iInnerRect.iBr.iX == 89);
  1685  	test(posInfo.iEdge.iX == 11);
  1686  	posSpec.iPos = 2;
  1687  	aView->FindDocPosL(posSpec, posInfo, 0);
  1688  	test(posInfo.iEdge.iX == 21);
  1689  	posSpec.iPos = 3;
  1690  	aView->FindDocPosL(posSpec, posInfo, 0);
  1691  	test(posInfo.iEdge.iX == 32);
  1692  	posSpec.iType = TTmDocPosSpec::ELeading;
  1693  	aView->FindDocPosL(posSpec, posInfo, 0);
  1694  	test(posInfo.iEdge.iX == 57);
  1695  	posSpec.iPos = 4;
  1696  	posSpec.iType = TTmDocPosSpec::ETrailing;
  1697  	aView->FindDocPosL(posSpec, posInfo, 0);
  1698  	test(posInfo.iEdge.iX == 47);
  1699  	posSpec.iPos = 5;
  1700  	aView->FindDocPosL(posSpec, posInfo, 0);
  1701  	test(posInfo.iEdge.iX == 32);
  1702  	posSpec.iType = TTmDocPosSpec::ELeading;
  1703  	aView->FindDocPosL(posSpec, posInfo, 0);
  1704  	test(posInfo.iEdge.iX == 57);
  1705  	posSpec.iPos = 6;
  1706  	posSpec.iType = TTmDocPosSpec::ETrailing;
  1707  	aView->FindDocPosL(posSpec, posInfo, 0);
  1708  	test(posInfo.iEdge.iX == 68);
  1709  	posSpec.iPos = 7;
  1710  	aView->FindDocPosL(posSpec, posInfo, 0);
  1711  	test(posInfo.iEdge.iX == 78);
  1712  	posSpec.iPos = 8;
  1713  	aView->FindDocPosL(posSpec, posInfo, 0);
  1714  	test(posInfo.iEdge.iX == 89);
  1715 
  1716 	// Test fullwidth solidus -- has a right side-bearing in our font
  1717 	// It is best if this goes 10, 20, 31
  1718 	// but it is acceptable for it to go 11, 22, 33
  1719 	posSpec.iPos = 10;
  1720 	aView->FindDocPosL(posSpec, posInfo, 0);
  1721 	TInt x1 = posInfo.iEdge.iX;
  1722 	test(x1 == 10 || x1 == 11);
  1723 	posSpec.iPos = 11;
  1724 	aView->FindDocPosL(posSpec, posInfo, 0);
  1725 	TInt x2 = posInfo.iEdge.iX;
  1726 	test(x2 - x1 == 10 || x2 - x1 == 11);
  1727 	posSpec.iPos = 12;
  1728 	aView->FindDocPosL(posSpec, posInfo, 0);
  1729 	test(posInfo.iEdge.iX - x2 == 11);
  1730 
  1731 	// Test "///" -- / has a left side-bearing in our font
  1732 	// It is best if this goes 11, 21, 31
  1733 	// but it is acceptable for it to go 11, 22, 33
  1734 	posSpec.iPos = 14;
  1735 	aView->FindDocPosL(posSpec, posInfo, 0);
  1736 	test(posInfo.iEdge.iX == 11);
  1737 	posSpec.iPos = 15;
  1738 	aView->FindDocPosL(posSpec, posInfo, 0);
  1739 	x1 = posInfo.iEdge.iX;
  1740 	test(x1 == 21 || x1 == 22);
  1741 	posSpec.iPos = 16;
  1742 	aView->FindDocPosL(posSpec, posInfo, 0);
  1743 	x2 = posInfo.iEdge.iX;
  1744 	test(x2 - x1 == 10 || x2 - x1 == 11);
  1745  	}
  1746 
  1747 // Pen position now taken into account in bounds calculation/check.
  1748 void INC086257_L(TDes& aText, CTextLayout* aLayout, CTextView* aView)
  1749 	// Conditions setup to simulate the unwanted horiz scroll pre-fix
  1750 	// Fix will cause line-break instead
  1751  	{
  1752  	// Left-to-right
  1753  	aText = _L("DDDDDDDDDD");
  1754 	aView->HandleGlobalChangeL();
  1755 	TPoint cursorPoint;
  1756  	aView->DocPosToXyPosL(aLayout->TagmaTextLayout().EndChar()-1,cursorPoint);
  1757 	test(cursorPoint.iX==11); //break happened - cursor is one character from left margin
  1758 	test(cursorPoint.iY==23); //and on the next line
  1759 	// Right-to-left
  1760  	aText = KTavSequence;  // right-to-left characters
  1761 	aView->HandleGlobalChangeL();
  1762  	aView->DocPosToXyPosL(aLayout->TagmaTextLayout().EndChar()-1,cursorPoint);
  1763 	test(cursorPoint.iX==89); //break happened - cursor is one character from right margin
  1764 	test(cursorPoint.iY==23); //and on the next line
  1765 	}
  1766 
  1767 // Remapped linebreak characters now conditionally taken into account in bounds calculation/check.
  1768 void INC087637_test(TDes& aText, CTextLayout* aLayout, CTextView* aView,
  1769 	TPoint& cursorPoint, TBool aLeft2Right, TUint aAppendChar=0)
  1770 // Set up conditions placed in subroutine to guarantee consistency
  1771 	{
  1772 	if(aLeft2Right)
  1773 		{
  1774 	 	aText = _L("DDDDDDDDDD");
  1775 		}
  1776 	else
  1777 		{
  1778 	 	aText = KTavSequence;  // right-to-left characters
  1779 		}
  1780 	if(aAppendChar)
  1781 		{
  1782 		aText.Append(aAppendChar);
  1783 		aView->HandleGlobalChangeL();
  1784 	 	aView->DocPosToXyPosL(aLayout->TagmaTextLayout().EndChar()-2,cursorPoint);
  1785 		}
  1786 	else
  1787 		{
  1788 		aView->HandleGlobalChangeL();
  1789 	 	aView->DocPosToXyPosL(aLayout->TagmaTextLayout().EndChar()-1,cursorPoint);
  1790 		}
  1791 	};
  1792 void INC087637_L(TDes& aText, CTextLayout* aLayout, CTextView* aView)
  1793 	// Conditions setup to simulate the linebreak character overhanging margin
  1794 	// Fix will cause wrap conditional upon flag set in layout object
  1795  	{
  1796  	TTestCustomRemap paradelim(CEditableText::EParagraphDelimiter);
  1797  	TTestCustomRemap linebreak(CEditableText::ELineBreak);
  1798  	TTestCustomRemap pagebreak(CEditableText::EPageBreak);
  1799  	TTestCustomRemapper allbreaks;
  1800  	TRect view(0, 0, 200, 200);
  1801 	aView->SetViewRect(view);
  1802 	aLayout->SetWrapWidth(102); // allow a couple of pixels to allow for linebreak char start
  1803   	TPoint cursorPoint;
  1804   	const TBool Left2Right = ETrue;
  1805   	const TBool Right2Left = EFalse;
  1806   	TTestCustomWrap customWrap;
  1807 
  1808 	// Left-to-right
  1809 
  1810  	// First test status quo to show difference
  1811  	INC087637_test(aText,aLayout,aView,cursorPoint,Left2Right);
  1812 	test(cursorPoint.iX==101); //cursor is near right margin
  1813 	test(cursorPoint.iY==10);  //and on the first line
  1814  	INC087637_test(aText,aLayout,aView,cursorPoint,Left2Right,CEditableText::ELineBreak);
  1815 	test(cursorPoint.iX==101); //cursor is near right margin
  1816 	test(cursorPoint.iY==10);  //and on the first line
  1817  	INC087637_test(aText,aLayout,aView,cursorPoint,Left2Right,CEditableText::EPageBreak);
  1818 	test(cursorPoint.iX==101); //cursor is near right margin
  1819 	test(cursorPoint.iY==10);  //and on the first line
  1820 	// Remap paragraph delimiter - still no difference because no custom wrap set
  1821  	aLayout->SetCustomInvisibleCharacterRemapper(&paradelim);
  1822  	INC087637_test(aText,aLayout,aView,cursorPoint,Left2Right);
  1823 	test(cursorPoint.iX==101); //cursor is near right margin
  1824 	test(cursorPoint.iY==10);  //and on the first line
  1825  	INC087637_test(aText,aLayout,aView,cursorPoint,Left2Right,CEditableText::ELineBreak);
  1826 	test(cursorPoint.iX==101); //cursor is near right margin
  1827 	test(cursorPoint.iY==10);  //and on the first line
  1828  	INC087637_test(aText,aLayout,aView,cursorPoint,Left2Right,CEditableText::EPageBreak);
  1829  	test(cursorPoint.iX==101); //cursor is near right margin
  1830 	test(cursorPoint.iY==10);  //and on the first line
  1831  	// Set custom wrap - paragraph delimiter, and only paragraph delimiter breaks to a new line
  1832  	aLayout->SetCustomWrap(&customWrap);
  1833  	INC087637_test(aText,aLayout,aView,cursorPoint,Left2Right);
  1834 	test(cursorPoint.iX==0);   //cursor is at left margin
  1835 	test(cursorPoint.iY==23);  //and on the second line
  1836  	INC087637_test(aText,aLayout,aView,cursorPoint,Left2Right,CEditableText::ELineBreak);
  1837 	test(cursorPoint.iX==101); //cursor is near right margin
  1838 	test(cursorPoint.iY==10);  //and on the first line
  1839  	INC087637_test(aText,aLayout,aView,cursorPoint,Left2Right,CEditableText::EPageBreak);
  1840 	test(cursorPoint.iX==101); //cursor is near right margin
  1841 	test(cursorPoint.iY==10);  //and on the first line
  1842  	// Remap linebreak character - linebreak character, and only linebreak character breaks to a new line
  1843  	aLayout->SetCustomInvisibleCharacterRemapper(&linebreak);
  1844  	INC087637_test(aText,aLayout,aView,cursorPoint,Left2Right);
  1845 	test(cursorPoint.iX==101); //cursor is near right margin
  1846 	test(cursorPoint.iY==10);  //and on the first line
  1847  	INC087637_test(aText,aLayout,aView,cursorPoint,Left2Right,CEditableText::ELineBreak);
  1848 	test(cursorPoint.iX==0);   //cursor is at left margin
  1849 	test(cursorPoint.iY==23);  //and on the second line
  1850  	INC087637_test(aText,aLayout,aView,cursorPoint,Left2Right,CEditableText::EPageBreak);
  1851 	test(cursorPoint.iX==101); //cursor is near right margin
  1852 	test(cursorPoint.iY==10);  //and on the first line
  1853  	// Remap pagebreak character - pagebreak character, and only pagebreak character breaks to a new line
  1854  	aLayout->SetCustomInvisibleCharacterRemapper(&pagebreak);
  1855  	INC087637_test(aText,aLayout,aView,cursorPoint,Left2Right);
  1856 	test(cursorPoint.iX==101); //cursor is near right margin
  1857 	test(cursorPoint.iY==10);  //and on the first line
  1858  	INC087637_test(aText,aLayout,aView,cursorPoint,Left2Right,CEditableText::ELineBreak);
  1859 	test(cursorPoint.iX==101); //cursor is near right margin
  1860 	test(cursorPoint.iY==10);  //and on the first line
  1861  	INC087637_test(aText,aLayout,aView,cursorPoint,Left2Right,CEditableText::EPageBreak);
  1862 	test(cursorPoint.iX==0);   //cursor is at left margin
  1863 	test(cursorPoint.iY==23);  //and on the second line
  1864  	// Remap all linebreak characters - all test break to a new line
  1865  	aLayout->SetCustomInvisibleCharacterRemapper(&allbreaks);
  1866  	INC087637_test(aText,aLayout,aView,cursorPoint,Left2Right);
  1867 	test(cursorPoint.iX==0);   //cursor is at left margin
  1868 	test(cursorPoint.iY==23);  //and on the second line
  1869  	INC087637_test(aText,aLayout,aView,cursorPoint,Left2Right,CEditableText::ELineBreak);
  1870 	test(cursorPoint.iX==0);   //cursor is at left margin
  1871 	test(cursorPoint.iY==23);  //and on the second line
  1872  	INC087637_test(aText,aLayout,aView,cursorPoint,Left2Right,CEditableText::EPageBreak);
  1873 	test(cursorPoint.iX==0);   //cursor is at left margin
  1874 	test(cursorPoint.iY==23);  //and on the second line
  1875  	// With all linebreak characters remapped, reset custom wrap - no breaks occur
  1876  	aLayout->SetCustomWrap(NULL);
  1877  	INC087637_test(aText,aLayout,aView,cursorPoint,Left2Right);
  1878 	test(cursorPoint.iX==101); //cursor is near right margin
  1879 	test(cursorPoint.iY==10);  //and on the first line
  1880  	INC087637_test(aText,aLayout,aView,cursorPoint,Left2Right,CEditableText::ELineBreak);
  1881 	test(cursorPoint.iX==101); //cursor is near right margin
  1882 	test(cursorPoint.iY==10);  //and on the first line
  1883  	INC087637_test(aText,aLayout,aView,cursorPoint,Left2Right,CEditableText::EPageBreak);
  1884 	test(cursorPoint.iX==101); //cursor is near right margin
  1885 	test(cursorPoint.iY==10);  //and on the first line
  1886 
  1887 	// Right-to-Left
  1888 
  1889  	// First test status quo to show difference
  1890  	aLayout->SetCustomInvisibleCharacterRemapper(NULL);// switch off character remapping
  1891  	INC087637_test(aText,aLayout,aView,cursorPoint,Right2Left);
  1892 	test(cursorPoint.iX==1);   //cursor is near left margin
  1893 	test(cursorPoint.iY==10);  //and on the first line
  1894  	INC087637_test(aText,aLayout,aView,cursorPoint,Right2Left,CEditableText::ELineBreak);
  1895  	test(cursorPoint.iX==1);   //cursor is near left margin
  1896 	test(cursorPoint.iY==10);  //and on the first line
  1897 	INC087637_test(aText,aLayout,aView,cursorPoint,Right2Left,CEditableText::EPageBreak);
  1898 	test(cursorPoint.iX==1);   //cursor is near left margin
  1899 	test(cursorPoint.iY==10);  //and on the first line
  1900 	// Remap paragraph delimiter - still no difference because no custom wrap set
  1901  	aLayout->SetCustomInvisibleCharacterRemapper(&paradelim);
  1902  	INC087637_test(aText,aLayout,aView,cursorPoint,Right2Left);
  1903 	test(cursorPoint.iX==1);   //cursor is near left margin
  1904 	test(cursorPoint.iY==10);  //and on the first line
  1905  	INC087637_test(aText,aLayout,aView,cursorPoint,Right2Left,CEditableText::ELineBreak);
  1906 	test(cursorPoint.iX==1);   //cursor is near left margin
  1907 	test(cursorPoint.iY==10);  //and on the first line
  1908  	INC087637_test(aText,aLayout,aView,cursorPoint,Right2Left,CEditableText::EPageBreak);
  1909 	test(cursorPoint.iX==1);   //cursor is near left margin
  1910 	test(cursorPoint.iY==10);  //and on the first line
  1911  	// Set custom wrap - paragraph delimiter, and only paragraph delimiter breaks to a new line
  1912  	aLayout->SetCustomWrap(&customWrap);
  1913  	INC087637_test(aText,aLayout,aView,cursorPoint,Right2Left);
  1914 	test(cursorPoint.iX==102); //cursor is at right margin
  1915 	test(cursorPoint.iY==23);  //and on the second line
  1916  	INC087637_test(aText,aLayout,aView,cursorPoint,Right2Left,CEditableText::ELineBreak);
  1917 	test(cursorPoint.iX==1);   //cursor is near left margin
  1918 	test(cursorPoint.iY==10);  //and on the first line
  1919  	INC087637_test(aText,aLayout,aView,cursorPoint,Right2Left,CEditableText::EPageBreak);
  1920 	test(cursorPoint.iX==1);   //cursor is near left margin
  1921 	test(cursorPoint.iY==10);  //and on the first line
  1922  	// Remap linebreak character - linebreak character, and only linebreak character breaks to a new line
  1923  	aLayout->SetCustomInvisibleCharacterRemapper(&linebreak);
  1924  	INC087637_test(aText,aLayout,aView,cursorPoint,Right2Left);
  1925 	test(cursorPoint.iX==1);   //cursor is near left margin
  1926 	test(cursorPoint.iY==10);  //and on the first line
  1927  	INC087637_test(aText,aLayout,aView,cursorPoint,Right2Left,CEditableText::ELineBreak);
  1928 	test(cursorPoint.iX==102); //cursor is at right margin
  1929 	test(cursorPoint.iY==23);  //but on the second line
  1930  	INC087637_test(aText,aLayout,aView,cursorPoint,Right2Left,CEditableText::EPageBreak);
  1931 	test(cursorPoint.iX==1);   //cursor is near left margin
  1932 	test(cursorPoint.iY==10);  //and on the first line
  1933  	// Remap pagebreak character - pagebreak character, and only pagebreak character breaks to a new line
  1934  	aLayout->SetCustomInvisibleCharacterRemapper(&pagebreak);
  1935  	INC087637_test(aText,aLayout,aView,cursorPoint,Right2Left);
  1936 	test(cursorPoint.iX==1);   //cursor is near left margin
  1937 	test(cursorPoint.iY==10);  //and on the first line
  1938  	INC087637_test(aText,aLayout,aView,cursorPoint,Right2Left,CEditableText::ELineBreak);
  1939 	test(cursorPoint.iX==1);   //cursor is near left margin
  1940 	test(cursorPoint.iY==10);  //and on the first line
  1941  	INC087637_test(aText,aLayout,aView,cursorPoint,Right2Left,CEditableText::EPageBreak);
  1942 	test(cursorPoint.iX==102); //cursor is at right margin
  1943 	test(cursorPoint.iY==23);  //but on the second line
  1944  	// Remap all linebreak characters - all test break to a new line
  1945  	aLayout->SetCustomInvisibleCharacterRemapper(&allbreaks);
  1946  	INC087637_test(aText,aLayout,aView,cursorPoint,Right2Left);
  1947 	test(cursorPoint.iX==102); //cursor is at right margin
  1948 	test(cursorPoint.iY==23);  //but on the second line
  1949  	INC087637_test(aText,aLayout,aView,cursorPoint,Right2Left,CEditableText::ELineBreak);
  1950 	test(cursorPoint.iX==102); //cursor is at right margin
  1951 	test(cursorPoint.iY==23);  //but on the second line
  1952  	INC087637_test(aText,aLayout,aView,cursorPoint,Right2Left,CEditableText::EPageBreak);
  1953 	test(cursorPoint.iX==102); //cursor is at right margin
  1954 	test(cursorPoint.iY==23);  //but on the second line
  1955  	// With all linebreak characters remapped, reset custom wrap - no breaks occur
  1956  	aLayout->SetCustomWrap(NULL);
  1957  	INC087637_test(aText,aLayout,aView,cursorPoint,Right2Left);
  1958 	test(cursorPoint.iX==1);   //cursor is near left margin
  1959 	test(cursorPoint.iY==10);  //and on the first line
  1960  	INC087637_test(aText,aLayout,aView,cursorPoint,Right2Left,CEditableText::ELineBreak);
  1961 	test(cursorPoint.iX==1);   //cursor is near left margin
  1962 	test(cursorPoint.iY==10);  //and on the first line
  1963  	INC087637_test(aText,aLayout,aView,cursorPoint,Right2Left,CEditableText::EPageBreak);
  1964 	test(cursorPoint.iX==1);   //cursor is near left margin
  1965 	test(cursorPoint.iY==10);  //and on the first line
  1966 
  1967 	// reset for next test
  1968 	aLayout->SetWrapWidth(100);
  1969  	aLayout->SetCustomInvisibleCharacterRemapper(NULL);
  1970 	}
  1971 
  1972 // No Memory mode entered twice on a certain leave unwinding
  1973 void DEF078967_L(TDes& aText, CTestGraphicsDevice* aDevice, CTextView* aView)
  1974 	{
  1975 	SetViewRect1(aView);
  1976 	aText = _L("some text is bigger than others");
  1977 	aView->HandleGlobalChangeL();
  1978 	TSize size(100, 100);
  1979 	CTestGraphicsDevice* offScreenDevice = CTestGraphicsDevice::NewL(size, 0);
  1980 	CleanupStack::PushL(offScreenDevice);
  1981 	CWindowGc* offScreenContext;
  1982 	User::LeaveIfError(offScreenDevice->CreateContext(offScreenContext));
  1983 	CleanupStack::PushL(offScreenContext);
  1984 	CTestTextView::SetOffScreenContext(aView, offScreenContext);
  1985 	aView->EnableFlickerFreeRedraw();
  1986 	TRect rect(size);
  1987 	CBitmapContext* bc;
  1988 	User::LeaveIfError(aDevice->CreateBitmapContext(bc));
  1989 	CleanupStack::PushL(bc);
  1990 	// Form can eat leaves, so we'll want a clear run of
  1991 	// (say) three before we'll stop testing.
  1992 	TInt ok = 0;
  1993 	for (TInt i = 1; ok < 3; ++i)
  1994 		{
  1995 		__UHEAP_FAILNEXT(i);
  1996 		TRAPD(error, aView->DrawL(rect, *bc));
  1997 		if (error == KErrNone)
  1998 			++ok;
  1999 		else
  2000 			ok = 0;
  2001 		__UHEAP_RESET;
  2002 		}
  2003 	CleanupStack::PopAndDestroy(bc);
  2004 	CleanupStack::PopAndDestroy(offScreenContext);
  2005 	CleanupStack::PopAndDestroy(offScreenDevice);
  2006 	aView->DisableFlickerFreeRedraw();
  2007 	}
  2008 
  2009 void INC092568_L(TDes& aText, CTextLayout* aLayout, CTextView* aView)
  2010 	{
  2011 	//fill up text buffer/ view
  2012 	aText = _L("1234567890123456789012345678901234567890123456789012");
  2013 	aText.Append(_L("34567890123456789012345678901234567890123456789"));
  2014 	aView->HandleGlobalChangeL();
  2015 
  2016 	//set up test variable
  2017 	TInt end = aText.Length();
  2018 	TPoint viewableWindowTopLeft(0,0);
  2019 	TCursorSelection selectTop(0,0);
  2020 	TCursorSelection selectBottom(end,end);
  2021 	TTmPosInfo2 posInfo;
  2022 
  2023 	//restrict viewable window so that scrolling is necessary
  2024 	aLayout->SetBandHeight(70);
  2025 
  2026 	//test scrolling *without* SetPendingSelection
  2027 	aView->SetDocPosL(0); //scroll text down to top of document
  2028 	aView->FindXyPosL(viewableWindowTopLeft, posInfo, NULL);
  2029 	test(posInfo.iDocPos.iPos == 0);
  2030 	aView->HandleInsertDeleteL(selectBottom,0,ETrue);
  2031 	aView->FindXyPosL(viewableWindowTopLeft, posInfo, NULL);
  2032 	test(posInfo.iDocPos.iPos == 40); //text has scrolled up
  2033 	aView->SetDocPosL(0); //scroll text down to top of document
  2034 	aView->FindXyPosL(viewableWindowTopLeft, posInfo, NULL);
  2035 	test(posInfo.iDocPos.iPos == 0); //text has scrolled down
  2036 	aView->HandleRangeFormatChangeL(selectBottom,ETrue);
  2037 	aView->FindXyPosL(viewableWindowTopLeft, posInfo, NULL);
  2038 	test(posInfo.iDocPos.iPos == 40); //text has scrolled up
  2039 
  2040 	//test *no* scrolling with SetPendingSelection
  2041 	//and selection reset by Handle.. methods
  2042 	aView->SetDocPosL(0);//scroll text down to top of document
  2043 	aView->FindXyPosL(viewableWindowTopLeft, posInfo, NULL);
  2044 	test(posInfo.iDocPos.iPos == 0);
  2045 	aView->SetPendingSelection(selectTop);
  2046 	aView->HandleInsertDeleteL(selectBottom,0,ETrue);
  2047 	aView->FindXyPosL(viewableWindowTopLeft, posInfo, NULL);
  2048 	test(posInfo.iDocPos.iPos == 0); //text has not scrolled
  2049 	aView->HandleRangeFormatChangeL(selectBottom,ETrue);
  2050 	aView->FindXyPosL(viewableWindowTopLeft, posInfo, NULL);
  2051 	test(posInfo.iDocPos.iPos == 40); //text has scrolled up due to reset
  2052 	aView->SetDocPosL(0); //scroll text down to top of document
  2053 	aView->FindXyPosL(viewableWindowTopLeft, posInfo, NULL);
  2054 	test(posInfo.iDocPos.iPos == 0);
  2055 	aView->SetPendingSelection(selectTop);
  2056 	aView->HandleRangeFormatChangeL(selectBottom,ETrue);
  2057 	aView->FindXyPosL(viewableWindowTopLeft, posInfo, NULL);
  2058 	test(posInfo.iDocPos.iPos == 0); //text has not scrolled
  2059 	aView->HandleInsertDeleteL(selectBottom,0,ETrue);
  2060 	aView->FindXyPosL(viewableWindowTopLeft, posInfo, NULL);
  2061 	test(posInfo.iDocPos.iPos == 40); //text has scrolled up due to reset
  2062 
  2063 	//test *scrolling* with SetPendingSelection
  2064 	aView->SetDocPosL(0);//scroll text down to top of document
  2065 	aView->FindXyPosL(viewableWindowTopLeft, posInfo, NULL);
  2066 	test(posInfo.iDocPos.iPos == 0);
  2067 	aView->SetPendingSelection(selectBottom);
  2068 	aView->HandleInsertDeleteL(selectTop,0,ETrue);
  2069 	aView->FindXyPosL(viewableWindowTopLeft, posInfo, NULL);
  2070 	test(posInfo.iDocPos.iPos == 40); //text has scrolled up due to selectpending
  2071 	aView->SetDocPosL(0); //scroll text down to top of document
  2072 	aView->FindXyPosL(viewableWindowTopLeft, posInfo, NULL);
  2073 	test(posInfo.iDocPos.iPos == 0);
  2074 	aView->SetPendingSelection(selectBottom);
  2075 	aView->HandleRangeFormatChangeL(selectTop,ETrue);
  2076 	aView->FindXyPosL(viewableWindowTopLeft, posInfo, NULL);
  2077 	test(posInfo.iDocPos.iPos == 40); //text has scrolled up due to selectpending
  2078 
  2079 	//reset for next test
  2080 	aView->SetDocPosL(0);
  2081 	}
  2082 
  2083 void INC092257L(TDes& aText,CTextView* aView)
  2084 	{
  2085  	aText.Zero();
  2086  	aView->HandleGlobalChangeL();
  2087  	aView->GetForwardDeletePositionL();
  2088  	aView->GetBackwardDeletePositionL();
  2089  	}
  2090 
  2091 /**
  2092 @SYMTestCaseID          SYSLIB-FORM-CT-3422
  2093 @SYMTestCaseDesc	    "Scrolling works weirdly when replying to email".  This was a particular
  2094 						sequence of API calls under certain conditions that was causing an
  2095 						unexpected downward line scroll.
  2096 @SYMTestPriority 	    High
  2097 @SYMTestActions  	    Recreate the defect's pre-conditions and then call the API sequence.
  2098 @SYMTestExpectedResults At the end of the sequence, no downward line scroll should have occurred.
  2099 @SYMDEF                 PDEF109450
  2100 */
  2101 void PDEF109450_L(TDes& aText, CTextLayout* aLayout, CTextView* aView)
  2102 	{
  2103 	// Text buffer/ view should be filled up and should include
  2104 	// a paragraph break after a few characters
  2105 	aText = _L("12345");
  2106 	aText.Append(_L("\x2029")); // para delim
  2107 	aText.Append(_L("6789012345678901234567890123456789012345678901"));
  2108 	aText.Append(_L("2345678901234567890123456789012345678901234567"));
  2109 	aView->HandleGlobalChangeL();
  2110 
  2111 	// Set up defect preconditions
  2112 	TViewYPosQualifier viewYPosQualifier;
  2113 	viewYPosQualifier.SetFillScreen();
  2114 	viewYPosQualifier.SetMakeLineFullyVisible();
  2115 	aLayout->SetBandHeight(50); //restrict viewable window so that scrolling is necessary
  2116 	aLayout->SetAmountToFormat(CTextLayout::EFFormatBand);//set visible height to band height
  2117 	aView->SetDocPosL(0);//scroll to top of document
  2118 	TCursorPosition::TMovementType cursorMovement = TCursorPosition::EFLineDown;
  2119 	aView->MoveCursorL(cursorMovement,0);//move the cursor down one line from the top
  2120 	TTmDocPos docPos;
  2121 	aView->GetCursorPos(docPos);
  2122 	aText.Insert(docPos.iPos, _L("\x2029"));//insert a 2nd para break right after the 1st
  2123 
  2124 	// Call the API sequence
  2125 	aView->SetPendingSelection(TCursorSelection(docPos.iPos,docPos.iPos));
  2126 	aView->HandleInsertDeleteL(TCursorSelection(docPos.iPos+1,docPos.iPos),1);
  2127 	aView->HandleGlobalChangeNoRedrawL(viewYPosQualifier);
  2128 	aView->HandleCharEditL(CTextLayout::EFParagraphDelimiter);
  2129 
  2130 	// Test to ensure no scroll has occurred
  2131 	TPoint viewableWindowTopLeft(0,0);
  2132 	TTmPosInfo2 posInfo;
  2133 	aView->FindXyPosL(viewableWindowTopLeft, posInfo, NULL);
  2134 	test(posInfo.iDocPos.iPos == 0);//viewableWindowTopLeft should still be at doc start
  2135 
  2136 	//reset for next test
  2137 	aView->SetDocPosL(0);
  2138 	}
  2139 
  2140 void VerifyLineBreak(CTextView* aView,TInt aLines, TInt *aLineEnds)
  2141 	{
  2142 	CTextView::TTagmaForwarder forwarder;
  2143   	forwarder.InitL(aView);
  2144 
  2145   	//force reformatting of text
  2146   	aView->HandleGlobalChangeL();
  2147 
  2148   	//get the number of lines in the text
  2149 	TInt lines = forwarder.Lines();
  2150 	test(lines == aLines);
  2151 
  2152 	//verify that the lines are broken in the correct places
  2153 	TTmLineInfo info;
  2154 	for(TInt index = 0;index < aLines;index++)
  2155 		{
  2156 		forwarder.LineNumberToLine(index,info);
  2157 		test(info.iEnd == aLineEnds[index]);
  2158 		}
  2159 	}
  2160 /**
  2161 @SYMTestCaseID          SYSLIB-FORM-CT-3478
  2162 @SYMTestCaseDesc	    Tests to ensure the correct line breaking behaviour when wrapping tabs
  2163 @SYMTestPriority 	    High
  2164 @SYMTestActions  	    Formats a series of strings using a variety of custom wrapping rules and verifies that
  2165 						strings with tabs are broken correctly
  2166 @SYMTestExpectedResults All strings should be broken as specified by the line breaking rules
  2167 @SYMDEF                 PDEF107440
  2168 */
  2169 void PDEF107440_L(TDes& aText, CTextLayout* aLayout, CTextView* aView)
  2170 	{
  2171 	//This array defines the positions in the string where the lines should end
  2172   	TInt lineEnds[2] = {10,17};
  2173 
  2174   	_LIT(KTestString1,"gggggg ggg\taaaaa");
  2175   	_LIT(KTestString2,"gggggggggg\taaaaa");
  2176   	_LIT(KTestString3,"gggggggggg\t aaaa");
  2177   	_LIT(KTestString4,"gggggggggg \taaaa");
  2178 
  2179   	//Set the text string - the length of this string (actually the position
  2180   	//of the tab within the string) is set so that the tab character should not
  2181   	//fit properly into a single line
  2182   	aText = KTestString1;
  2183 
  2184   	//This custom wrapper will allow breaking before the tab character
  2185 	TTestCustomWrap2 customWrap2;
  2186   	aLayout->SetCustomWrap(&customWrap2);
  2187 
  2188   	//Check that the line is broken before the tab
  2189   	VerifyLineBreak(aView, 2, lineEnds);
  2190 
  2191   	//This custom wrapper will allow the tab to hang
  2192 	TTestCustomWrap3 customWrap3;
  2193   	aLayout->SetCustomWrap(&customWrap3);
  2194 
  2195   	aText = KTestString1;
  2196 
  2197   	//Check that the line is broken after the tab
  2198   	lineEnds[0] = 11;
  2199   	VerifyLineBreak(aView, 2, lineEnds);
  2200 
  2201   	//This custom wrapper will treat the tab as a space line breaking class
  2202 	TTestCustomWrap4 customWrap4;
  2203   	aLayout->SetCustomWrap(&customWrap4);
  2204 
  2205   	//Check that the line is broken after the tab
  2206   	lineEnds[0] = 11;
  2207   	VerifyLineBreak(aView, 2, lineEnds);
  2208 
  2209 	//Now change the text so that the tab is followed by a space character
  2210   	aText = KTestString3;
  2211 
  2212   	//Verify that the line is broken after the space - as the space and tab are allowed to hang
  2213   	lineEnds[0] = 12;
  2214   	VerifyLineBreak(aView, 2, lineEnds);
  2215 
  2216   	//Now change the text so that the tab follows a space character
  2217   	aText = KTestString4;
  2218 
  2219   	//Verify that the line is broken after the tab - as the space and tab are allowed to hang
  2220   	VerifyLineBreak(aView, 2, lineEnds);
  2221 
  2222   	//reset to the default wrapper - this will not allow breaking
  2223   	//before the tab and will not allow the tab to hang
  2224   	aLayout->SetCustomWrap(NULL);
  2225 
  2226   	//Set back to the original string
  2227   	aText = KTestString1;
  2228 
  2229   	//Verify that the line is broken after the space as the string cannot
  2230   	// be legally broken before or after the tab
  2231   	lineEnds[0] = 7;
  2232   	VerifyLineBreak(aView, 2, lineEnds);
  2233 
  2234   	//Now change the text so that the line cannot be broken legally
  2235   	//at the space character
  2236   	aText = KTestString2;
  2237 
  2238   	//Verify that the line is broken before the tab - this is a forced break
  2239   	lineEnds[0] = 10;
  2240   	VerifyLineBreak(aView, 2, lineEnds);
  2241 
  2242   	//Now change the text so that the tab is followed by a space character
  2243   	aText = KTestString3;
  2244 
  2245   	//Verify that the line is broken before the tab as the tab is not allowed to hang
  2246   	//this is a forced break
  2247   	lineEnds[0] = 10;
  2248   	VerifyLineBreak(aView, 2, lineEnds);
  2249 
  2250   	//Now change the text so that the tab follows a space character
  2251   	aText = KTestString4;
  2252 
  2253   	//Verify that the line is broken before the tab as space is allowed to hang
  2254   	lineEnds[0] = 11;
  2255   	VerifyLineBreak(aView, 2, lineEnds);
  2256  	}
  2257 
  2258 /**
  2259 @SYMTestCaseID          SYSLIB-FORM-UT-3521
  2260 @SYMTestCaseDesc        Testing the fix for INC108075: Marathi Input : Fallback rendered characters appears suddenly when we are insert
  2261 @SYMTestPriority        Medium
  2262 @SYMTestActions         Check that cverlapping characters in the text do not affect the line breaking
  2263 @SYMTestExpectedResults Lines should be broken at correct positions with ZWJ.
  2264 @SYMDEF                 INC108075
  2265 */
  2266 void INC108075_L(TDes& aText, CTextLayout* aLayout, CTextView* aView)
  2267 	{
  2268 	// Ra+Virama(Halant)+ZWJ = Eyelash Ra
  2269   	_LIT(KTestString1,"\x0930\x094D\x200D Hello, 12 abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz");
  2270   	// Same as above, but replacing a space with Arabic letter Feh, this should cause an overlap of chunks
  2271   	// at the ZWJ
  2272   	_LIT(KTestString2,"\x0930\x094D\x200D\x0641Hello, 12 abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz");
  2273 	aLayout->SetWrapWidth(533);
  2274 	aText = KTestString1;
  2275   	//This array defines the positions in the string where the lines should end
  2276   	TInt lineEnds[2] = {14,67};
  2277 	//Verify that the line is broken in the correct places
  2278   	VerifyLineBreak(aView, 2, lineEnds);
  2279   	aText = KTestString2;
  2280 	//Verify that the line is broken in the correct places
  2281   	VerifyLineBreak(aView, 2, lineEnds);
  2282  	}
  2283 
  2284 void TestTextViewL(TDes& aText, CTestGraphicsDevice* aDevice,
  2285 	CTextLayout* aLayout, CTextView* aView, TDocModel* aDocModel)
  2286 	{
  2287 	test.Start(_L("Test fix for defect TET_5D7MCV"));
  2288 	TET_5D7MCV_L(aText, aDevice, aView, aLayout);
  2289 	test.Next(_L("Test fix for defect INC020746"));
  2290 	INC020746_L(aText, aView);
  2291 	test.Next(_L("Test fix for defect DEF021603"));
  2292 	DEF021603_L(aText, aDevice, aView);
  2293 	test.Next(_L("Test fix for defect DEF022229"));
  2294 	DEF022229_L(aText, aDevice, aView);
  2295 	test.Next(_L("Test fix for defect DEF035472"));
  2296 	DEF035472_L(aText, aView);
  2297 	test.Next(_L("Test fix for defect INC036005"));
  2298 	INC036005_L(aText, aView);
  2299 	test.Next(_L("Test XyPosToDocPosL outside horizontal bounds"));
  2300 	TestCTextView_XyPosToDocPosL_ReturnsCorrectLine(aText, aView);
  2301 	test.Next(_L("Test fix for defect INC036809"));
  2302 	INC036809_L(aText, aView);
  2303 	test.Next(_L("Test fix for defect DEF037255"));
  2304 	DEF037255_L(aText, aView);
  2305 	test.Next(_L("Test fix for defect INC037293"));
  2306 	INC037293_L(aText, aView, aLayout);
  2307 	test.Next(_L("Test fix for defect INC039567"));
  2308 	INC039567_L(aText, aDevice, aView);
  2309 	test.Next(_L("Test fix for defect DEF061143"));
  2310 	DEF061143_L(aText, aLayout, aView);
  2311 	test.Next(_L("Test fix for defect DEF063340"));
  2312 	DEF063340_L(aText, aLayout, aView);
  2313 	test.Next(_L(" @SYMTestCaseID:SYSLIB-FORM-UT-1533 Test clusters are not broken "));
  2314 	TestClusterBreaks(aText, aDevice, aLayout, aView, aDocModel);
  2315 	test.Next(_L("Test fix for defect DEF065322"));
  2316 	DEF065322_L(aText, aLayout, aView);
  2317 	test.Next(_L("Test fix for defect DEF078967"));
  2318 	DEF078967_L(aText, aDevice, aView);
  2319 	test.Next(_L("Test fix for defect INC078304"));
  2320 	INC078304_L(aText, aView);
  2321 	test.Next(_L(" @SYMTestCaseID:SYSLIB-FORM-UT-1653 Test fix for defect INC080603 "));
  2322 	INC080603L(aText, aDevice, aLayout, aView);
  2323 	test.Next(_L("Test fix for defect INC086257"));
  2324 	INC086257_L(aText, aLayout, aView);
  2325 	test.Next(_L("Test fix for defect INC085809"));
  2326 	INC085809_L(aLayout, aView);
  2327 	test.Next(_L("Test fix for defect INC092568"));
  2328 	INC092568_L(aText, aLayout, aView);
  2329 	test.Next(_L("Test fix for defect INC087637"));
  2330 	INC087637_L(aText, aLayout, aView);
  2331  	test.Next(_L("Test fix for defect INC092557/DEF094709"));
  2332  	INC092257L(aText,aView);
  2333 	test.Next(_L(" @SYMTestCaseID:SYSLIB-FORM-CT-3422 Test fix for defect PDEF109450 "));
  2334 	PDEF109450_L(aText, aLayout, aView);
  2335  	test.Next(_L(" @SYMTestCaseID:SYSLIB-FORM-CT-3478 Test fix for defect PDEF107440 "));
  2336  	PDEF107440_L(aText, aLayout, aView);
  2337  	test.Next(_L(" @SYMTestCaseID:SYSLIB-FORM-UT-3521 Test fix for defect INC108075 "));
  2338  	INC108075_L(aText, aLayout, aView);
  2339  	test.End();
  2340 	}
  2341 
  2342 void DEF047281L(TDes& aText,CTextLayout* aLayout)
  2343 	{
  2344 	_LIT(KText, "ThisIsTheTestForDEF047281");
  2345 	aText.Zero();
  2346 	aText = KText;
  2347 
  2348 	TSize aSize;
  2349 	TInt KHeight=0xD;
  2350 	aLayout->GetMinimumSizeL(200, aSize);
  2351 	test(aSize.iHeight == KHeight); // height of 1 line
  2352 	aLayout->GetMinimumSizeL(200, ETrue, aSize);
  2353 	test(aSize.iHeight == KHeight); // height of 1 line
  2354 	aLayout->GetMinimumSizeL(200, EFalse, aSize);
  2355 	test(aSize.iHeight == KHeight*2); // height of 2 lines
  2356  	}
  2357 
  2358 
  2359 void TestTextViewParagraphL(TDes& aText, CTestGraphicsDevice* aDevice,
  2360 	CTextLayout* aLayout, CTextView* aView, CParaFormat* aParagraphFormat)
  2361 	{
  2362 	test.Start(_L("Test fix for defect INC038282"));
  2363 	INC038282_L(aText, aDevice, aLayout, aView, aParagraphFormat);
  2364 	test.Next(_L(" @SYMTestCaseID:SYSLIB-FORM-UT-1663 Test fix for defect DEF073913 "));
  2365 	DEF073913L(aText, aDevice, aView, aParagraphFormat);
  2366 	test.Next(_L("Test fix for defect DEF047281"));
  2367 	DEF047281L(aText, aLayout);
  2368 
  2369 	test.End();
  2370 	}
  2371 
  2372 void RunTestTextViewL()
  2373 	{
  2374 	TBuf<100> text;
  2375 	TDocModel docModel(text);
  2376 	TRect displayRect(0, 0, KDisplayWidth, KDisplayHeight);
  2377 	CTextLayout* layout = CTextLayout::NewL(&docModel, displayRect.Width());
  2378 	CleanupStack::PushL(layout);
  2379 	CTestGraphicsDevice* device = CTestGraphicsDevice::NewL(displayRect.Size(), 0);
  2380 	CleanupStack::PushL(device);
  2381 	CTextView* view = CTextView::NewL(layout, displayRect,
  2382 		device, device, 0, 0, 0);
  2383 	CleanupStack::PushL(view);
  2384 	TestTextViewL(text, device, layout, view, &docModel);
  2385 	CParaFormat* paragraph = CParaFormat::NewLC();
  2386 	docModel.SetParagraphFormat(paragraph);
  2387 	TestTextViewParagraphL(text, device, layout, view, paragraph);
  2388 	CleanupStack::PopAndDestroy(paragraph);
  2389 	CleanupStack::PopAndDestroy(view);
  2390 	CleanupStack::PopAndDestroy(device);
  2391 	CleanupStack::PopAndDestroy(layout);
  2392 	}
  2393 
  2394 void RunDirectionalityTestL()
  2395 	{
  2396 	TBuf<100> text;
  2397 	TDocModel docModel(text);
  2398 	TRect displayRect(0, 0, KDisplayWidth, KDisplayHeight);
  2399 	CTextLayout* layout = CTextLayout::NewL(&docModel, displayRect.Width());
  2400 	CleanupStack::PushL(layout);
  2401 	CTestGraphicsDevice* device = CTestGraphicsDevice::NewL(displayRect.Size(), 0);
  2402 	CleanupStack::PushL(device);
  2403 	CTextView* view = CTextView::NewL(layout, displayRect,
  2404 		device, device, 0, 0, 0);
  2405 	CleanupStack::PushL(view);
  2406 	DirectionalityTestL(text, device, layout, view);
  2407 	CleanupStack::PopAndDestroy(view);
  2408 	CleanupStack::PopAndDestroy(device);
  2409 	CleanupStack::PopAndDestroy(layout);
  2410 	}
  2411 
  2412 _LIT(KText_020329, "ABCDEFGHIJ ABCDEFGHIJ ABCDEFGHIJ ABC\x2029 ABCDEFGHIJ ABCDEFGHIJ ABCDEFGHIJ \x2029 ABCDEFGHIJ ABCDEFGHIJ ABCDEFGHIJ \x2029 ABCDEFGHIJ ABCDEFGHIJ ABCDEFGHIJ \x2029");
  2413 
  2414 void INC020329TestL(TDes& aText, CTestGraphicsDevice* /*aDevice*/, CTextLayout* aLayout, CTextView* aView)
  2415 	{
  2416 	TSize smallSize(100, 40);
  2417 	CTestGraphicsDevice* offScreenDevice = CTestGraphicsDevice::NewL(smallSize, 0);
  2418 	CleanupStack::PushL(offScreenDevice);
  2419 	CWindowGc* offScreenContext;
  2420 	User::LeaveIfError(offScreenDevice->CreateContext(offScreenContext));
  2421 	CleanupStack::PushL(offScreenContext);
  2422 	CTestTextView::SetOffScreenContext(aView, offScreenContext);
  2423 	aView->EnableFlickerFreeRedraw();
  2424 
  2425 	// This test procedure checks for the presence of defect INC020329.
  2426 	// To do this we need a small view (100x40) and two paragraphs where
  2427 	// the first is 3.5 lines long. The defect results in the cursor
  2428 	// being unable to move down a line to the second paragraph from
  2429 	// the last half line of paragraph one. The cursor first jumps to end
  2430 	// of paragraph (end of line 4) and then no further. This defect occurs
  2431 	// when band formatting is configured.
  2432 
  2433 	TTestCustomWrap wrapAnywhere;
  2434 	TCursorPosition::TMovementType moveDown = TCursorPosition::EFLineDown;
  2435 	TPoint scrollBy;
  2436 	TTmDocPos cursorPos;
  2437 
  2438 	// Setup view/layout state appropriate for the 1st part of test.
  2439 	// Insert text, setup wrapping on any character
  2440 	// Cursor doc pos is 0, formatting is EFFormatAllText not band
  2441 
  2442 	aText = KText_020329;
  2443 	aLayout->SetCustomWrap(&wrapAnywhere);
  2444 	aLayout->DiscardFormat();
  2445 	aView->HandleGlobalChangeL();
  2446 
  2447 	// TEST: Cursor movement with WHOLE text formatting
  2448 
  2449 	scrollBy = aView->SetDocPosL(0); // =(0,10)
  2450 
  2451 	scrollBy = aView->SetDocPosL(22); // =(0,0)
  2452 
  2453 	scrollBy = aView->MoveCursorL(moveDown, EFalse); // =(0,-12), EFLineDown
  2454 	test(moveDown==TCursorPosition::EFLineDown);
  2455 	aView->GetCursorPos(cursorPos); // (32,1)
  2456 	test(cursorPos.iPos==32);
  2457 
  2458 	scrollBy = aView->MoveCursorL(moveDown, EFalse); // =(0,-13), EFLineDown
  2459 	test(moveDown==TCursorPosition::EFLineDown);
  2460 	aView->GetCursorPos(cursorPos); // (39,1)
  2461 	test(cursorPos.iPos==39);
  2462 
  2463 	scrollBy = aView->MoveCursorL(moveDown, EFalse); // =(0,-13), EFLineDown
  2464 	test(moveDown==TCursorPosition::EFLineDown);
  2465 	aView->GetCursorPos(cursorPos); // (49,1)
  2466 	test(cursorPos.iPos==49);
  2467 
  2468 	// Setup view/layout state appropriate for the 2nd part of test.
  2469 	// Loose all formatting data from previous test
  2470 	// Cursor doc pos is 0, formatting is EFFormatBand only
  2471 
  2472 	aLayout->DiscardFormat();
  2473 	aLayout->SetAmountToFormat(CTextLayout::EFFormatBand);
  2474 	test(aLayout->IsFormattingBand());
  2475 	aView->HandleGlobalChangeL();
  2476 
  2477 	// TEST: Same cursor movement above BUT with Band formatting
  2478 
  2479 	scrollBy = aView->SetDocPosL(0);
  2480 
  2481 	scrollBy = aView->SetDocPosL(22);
  2482 
  2483 	scrollBy = aView->MoveCursorL(moveDown, EFalse);
  2484 	test(moveDown==TCursorPosition::EFLineDown);
  2485 	aView->GetCursorPos(cursorPos); // (32,1)
  2486 	test(cursorPos.iPos==32);
  2487 
  2488 	scrollBy = aView->MoveCursorL(moveDown, EFalse); // Defect: =(0,0), EFLineEnd!
  2489 	test(moveDown==TCursorPosition::EFLineDown);
  2490 	aView->GetCursorPos(cursorPos); // Defect: (36,1)
  2491 	test(cursorPos.iPos==39);
  2492 
  2493 	scrollBy = aView->MoveCursorL(moveDown, EFalse); // Defect: =(0,0), EFNoMovement!
  2494 	test(moveDown==TCursorPosition::EFLineDown);
  2495 	aView->GetCursorPos(cursorPos); // Defect: (36,1)
  2496 	test(cursorPos.iPos==49);
  2497 
  2498 	// Cleanup
  2499 	aLayout->SetCustomWrap(0);
  2500 	aText.Delete(0, aText.Length());
  2501 
  2502 	CTestTextView::SetOffScreenContext(aView, 0);
  2503 	CleanupStack::PopAndDestroy(offScreenContext);
  2504 	CleanupStack::PopAndDestroy(offScreenDevice);
  2505 	}
  2506 
  2507 void RunTestINC020329L()
  2508 	{
  2509 	TBuf<200> text;
  2510 	TDocModel docModel(text);
  2511 	TRect displayRect(0, 0, 100, 40);
  2512 	CTextLayout* layout = CTextLayout::NewL(&docModel, displayRect.Width());
  2513 	CleanupStack::PushL(layout);
  2514 	CTestGraphicsDevice* device = CTestGraphicsDevice::NewL(displayRect.Size(), 0);
  2515 	CleanupStack::PushL(device);
  2516 	CTextView* view = CTextView::NewL(layout, displayRect,
  2517 		device, device, 0, 0, 0);
  2518 	CleanupStack::PushL(view);
  2519 
  2520 	INC020329TestL(text, device, layout, view);
  2521 
  2522 	CleanupStack::PopAndDestroy(view);
  2523 	CleanupStack::PopAndDestroy(device);
  2524 	CleanupStack::PopAndDestroy(layout);
  2525 	}
  2526 
  2527 /**
  2528 @SYMTestCaseID          SYSLIB-FORM-CT-1861
  2529 @SYMTestCaseDesc	    Tests to ensure the correct operation of highlight extensions.
  2530 @SYMTestPriority 	    High
  2531 @SYMTestActions  	    Insert a paragraph of text, which contains at least 3 lines. Highlight different
  2532 						sections with different highlight extension settings and compare resulting
  2533 						screen with pre-defined bitmaps.
  2534 @SYMTestExpectedResults Screen and bitmaps should match
  2535 @SYMDEF                 PDEF085280
  2536 */
  2537 void RunTestPDEF085280L()
  2538 	{
  2539 	//create editor/bitmap
  2540  	CTestBitmapFile* bitMap = CTestBitmapFile::NewLC(TRect(0, 0, 360, 94));
  2541 
  2542 	//open the zipfile containing the comparison bitmaps
  2543 	CTestBitmapZipFileExtractor* extract = CTestBitmapZipFileExtractor::NewLC(
  2544     		_L("Z:\\test\\app-framework\\form\\input\\bitmaps.zip"));
  2545 
  2546 	//add some text
  2547  	bitMap->AppendL(_L("the quick brown fox jumped over the lazy dog. 1234567890?!*"));
  2548  	bitMap->View()->HandleGlobalChangeL();
  2549 
  2550 	/*********************************************************
  2551 	Note:- The commented "SaveFileL" code below was used to originally
  2552 	generate the baseline test data.  It has been left in and commented
  2553 	so that if the data needs to be changed in the future, it will just
  2554 	be  case of temporarily moving the commenter from the "SaveFileL"
  2555 	to the "test".
  2556 	*********************************************************/
  2557 
  2558  	//Base-line test - no highlight extensions
  2559  	bitMap->View()->SetDocPosL(27);
  2560  	bitMap->View()->SetDocPosL(31,ETrue);
  2561 //	bitMap->SaveFileL(_L("c:\\SetHighlightExtensions(0,0,0,0).bmp"));
  2562 	test(bitMap->CompareL(extract->BitmapFileL(_L("SetHighlightExtensions(0,0,0,0).bmp"))));
  2563 
  2564  	//Shift highlight north-west
  2565  	bitMap->View()->SetDocPosL(27);
  2566 	bitMap->View()->SetHighlightExtensions(25,-25,12,-12);
  2567  	bitMap->View()->SetDocPosL(31,ETrue);
  2568 //	bitMap->SaveFileL(_L("c:\\SetHighlightExtensions(25,-25,12,-12).bmp"));
  2569 	test(bitMap->CompareL(extract->BitmapFileL(_L("SetHighlightExtensions(25,-25,12,-12).bmp"))));
  2570 
  2571  	//Shift highlight south-east
  2572  	bitMap->View()->SetDocPosL(27);
  2573 	bitMap->View()->SetHighlightExtensions(-25,25,-12,12);
  2574  	bitMap->View()->SetDocPosL(31,ETrue);
  2575 //	bitMap->SaveFileL(_L("c:\\SetHighlightExtensions(-25,25,-12,12).bmp"));
  2576 	test(bitMap->CompareL(extract->BitmapFileL(_L("SetHighlightExtensions(-25,25,-12,12).bmp"))));
  2577 
  2578  	//Shift highlight north-east
  2579  	bitMap->View()->SetDocPosL(27);
  2580 	bitMap->View()->SetHighlightExtensions(-25,25,12,-12);
  2581  	bitMap->View()->SetDocPosL(31,ETrue);
  2582 //	bitMap->SaveFileL(_L("c:\\SetHighlightExtensions(-25,25,12,-12).bmp"));
  2583 	test(bitMap->CompareL(extract->BitmapFileL(_L("SetHighlightExtensions(-25,25,12,-12).bmp"))));
  2584 
  2585  	//Shift highlight south-west
  2586  	bitMap->View()->SetDocPosL(27);
  2587 	bitMap->View()->SetHighlightExtensions(25,-25,-12,12);
  2588  	bitMap->View()->SetDocPosL(31,ETrue);
  2589 //	bitMap->SaveFileL(_L("c:\\SetHighlightExtensions(25,-25,-12,12).bmp"));
  2590 	test(bitMap->CompareL(extract->BitmapFileL(_L("SetHighlightExtensions(25,-25,-12,12).bmp"))));
  2591 
  2592  	//Make extensions huge and highlight one character - highlight blobs over nearly whole screen
  2593  	bitMap->View()->SetDocPosL(29);
  2594 	bitMap->View()->SetHighlightExtensions(120,100,15,15);
  2595  	bitMap->View()->SetDocPosL(30,ETrue);
  2596 //	bitMap->SaveFileL(_L("c:\\SetHighlightExtensions(120,100,15,15).bmp"));
  2597 	test(bitMap->CompareL(extract->BitmapFileL(_L("SetHighlightExtensions(120,100,15,15).bmp"))));
  2598 
  2599  	//Precursor to highlight overlap - skinny highlight through text
  2600  	bitMap->View()->SetDocPosL(8);
  2601 	bitMap->View()->SetHighlightExtensions(0,0,-5,-5);
  2602  	bitMap->View()->SetDocPosL(31,ETrue);
  2603 //	bitMap->SaveFileL(_L("c:\\SetHighlightExtensions(0,0,-5,-5).bmp"));
  2604 	test(bitMap->CompareL(extract->BitmapFileL(_L("SetHighlightExtensions(0,0,-5,-5).bmp"))));
  2605 
  2606  	//Highlight overlap - extension top and bottom overlaps between lines
  2607  	bitMap->View()->SetDocPosL(8);
  2608 	bitMap->View()->SetHighlightExtensions(0,0,10,10);
  2609  	bitMap->View()->SetDocPosL(31,ETrue);
  2610 //	bitMap->SaveFileL(_L("c:\\SetHighlightExtensions(0,0,10,10).bmp"));
  2611 	test(bitMap->CompareL(extract->BitmapFileL(_L("SetHighlightExtensions(0,0,10,10).bmp"))));
  2612 
  2613 	CleanupStack::PopAndDestroy(2,bitMap);
  2614 	}
  2615 
  2616 void PDEF097387TestL(CRichText* aRichText, CTextView* aTextView)
  2617 	{
  2618 	_LIT(KTest,"0123456789");
  2619 	TPtrC text1(KTest().Ptr(), KTest().Length());
  2620 	CTextLayout* layout = const_cast<CTextLayout*>(aTextView->Layout());
  2621 	aRichText->Reset();
  2622 	aRichText->InsertL(0, text1);
  2623 
  2624 	// set line ascent and descent so baseline will be outside line rect
  2625 	aTextView->SetExcessHeightRequired(3);
  2626 	layout->SetMinimumLineDescent(0);
  2627 	aTextView->FormatTextL();
  2628 
  2629 	// scroll through the document and test that the cursor goes to the right position
  2630 	// none of these tests should fail.
  2631 	TTmDocPos pos(9, ETrue);
  2632 	aTextView->SetDocPosL(pos);
  2633 	TCursorPosition::TMovementType move = TCursorPosition::EFLeft;
  2634 	aTextView->MoveCursorL(move, EFalse);
  2635 	aTextView->GetCursorPos(pos);
  2636 	test(pos.iPos == 8);
  2637 	aTextView->MoveCursorL(move, EFalse);
  2638 	aTextView->GetCursorPos(pos);
  2639 	test(pos.iPos == 7);
  2640 	aTextView->MoveCursorL(move, EFalse);
  2641 	aTextView->GetCursorPos(pos);
  2642 	test(pos.iPos == 6);
  2643 	move = TCursorPosition::EFLeft;
  2644 	aTextView->MoveCursorL(move, EFalse);
  2645 	aTextView->GetCursorPos(pos);
  2646 	test(pos.iPos == 5);
  2647 	move = TCursorPosition::EFLeft;
  2648 	aTextView->MoveCursorL(move, EFalse);
  2649 	aTextView->GetCursorPos(pos);
  2650 	test(pos.iPos == 4);
  2651 	move = TCursorPosition::EFLeft;
  2652 	aTextView->MoveCursorL(move, EFalse);
  2653 	aTextView->GetCursorPos(pos);
  2654 	test(pos.iPos == 3);
  2655 	move = TCursorPosition::EFLeft;
  2656 	aTextView->MoveCursorL(move, EFalse);
  2657 	aTextView->GetCursorPos(pos);
  2658 	test(pos.iPos == 2);
  2659 	move = TCursorPosition::EFLeft;
  2660 	aTextView->MoveCursorL(move, EFalse);
  2661 	aTextView->GetCursorPos(pos);
  2662 	test(pos.iPos == 1);
  2663 	move = TCursorPosition::EFLeft;
  2664 	aTextView->MoveCursorL(move, EFalse);
  2665 	aTextView->GetCursorPos(pos);
  2666 	test(pos.iPos == 0);
  2667 	}
  2668 
  2669 
  2670 void RunPDEF097387TestL(CFbsScreenDevice* aDevice)
  2671 	{
  2672 	CParaFormat* paraFormat = CParaFormat::NewLC();
  2673 	TParaFormatMask paraFormatMask;
  2674 	// set up paragraph propeties
  2675 	paraFormat->iHorizontalAlignment=CParaFormat::ELeftAlign;
  2676 	paraFormatMask.SetAttrib(EAttAlignment);
  2677 	paraFormat->iLineSpacingInTwips=21;
  2678 	paraFormatMask.SetAttrib(EAttLineSpacing);
  2679 	paraFormat->iLineSpacingControl=CParaFormat::ELineSpacingExactlyInPixels;
  2680 	paraFormatMask.SetAttrib(EAttLineSpacingControl);
  2681 	CParaFormatLayer* paraFormatLayer = CParaFormatLayer::NewL(paraFormat,paraFormatMask);
  2682 	CleanupStack::PushL(paraFormatLayer);
  2683 	CCharFormatLayer* charFormat = CCharFormatLayer::NewL();
  2684 	CleanupStack::PushL(charFormat);
  2685 	CRichText* text = CRichText::NewL(paraFormatLayer, charFormat);
  2686 	CleanupStack::PushL(text);
  2687 	TRect displayRect(0, 0, 70, 42);
  2688 	CTextLayout* layout = CTextLayout::NewL(text, displayRect.Width());
  2689 	CleanupStack::PushL(layout);
  2690 	CTextView* view = CTextView::NewL(layout, displayRect,
  2691 		aDevice, aDevice, 0, 0, 0);
  2692 	CleanupStack::PushL(view);
  2693 	//Run test
  2694 	PDEF097387TestL(text, view);
  2695 	CleanupStack::PopAndDestroy(view);
  2696 	CleanupStack::PopAndDestroy(layout);
  2697 	CleanupStack::PopAndDestroy(text);
  2698 	CleanupStack::PopAndDestroy(charFormat);
  2699 	CleanupStack::PopAndDestroy(paraFormatLayer);
  2700 	CleanupStack::PopAndDestroy(paraFormat);
  2701 	}
  2702 
  2703 /**
  2704 @SYMTestCaseID          SYSLIB-FORM-UT-3162
  2705 @SYMTestCaseDesc	    Tests to ensure the correct cursor position is maintained when scrolling through a document
  2706 @SYMTestPriority 	    High
  2707 @SYMTestActions  	    Creates a view and layout whose will have baselines outside the rect. of the line.
  2708 						It then tests that when scrolling through the document that the correct cursor position is maintained
  2709 @SYMTestExpectedResults Cursor position should be maintained correctly when scrolling through document.
  2710 @SYMDEF                 PDEF097387
  2711 */
  2712 _LIT(KTestFont, "ClearlyU");
  2713 void SetupAndRunPDEF097387TestL()
  2714 	{
  2715 	TInt error;
  2716 	CFbsScreenDevice* screenDevice = 0;
  2717 	TRAP(error, screenDevice = CFbsScreenDevice::NewL(0,EColor16M));
  2718 	if (error == KErrNotSupported)
  2719 		TRAP(error, screenDevice = CFbsScreenDevice::NewL(0,EColor16MA));
  2720 	if (error == KErrNotSupported)
  2721 		TRAP(error, screenDevice = CFbsScreenDevice::NewL(0,EColor16MU));
  2722 	if (error == KErrNotSupported)
  2723 		TRAP(error, screenDevice = CFbsScreenDevice::NewL(0,EColor64K));
  2724 	if (error == KErrNotSupported)
  2725 		TRAP(error, screenDevice = CFbsScreenDevice::NewL(0,EColor4K));
  2726 	if (error == KErrNotSupported)
  2727 		TRAP(error, screenDevice = CFbsScreenDevice::NewL(0,EColor256));
  2728 	if (error == KErrNotSupported)
  2729 		TRAP(error, screenDevice = CFbsScreenDevice::NewL(0,EColor16));
  2730 	if (error == KErrNotSupported)
  2731 		TRAP(error, screenDevice = CFbsScreenDevice::NewL(0,EGray256));
  2732 	if (error == KErrNotSupported)
  2733 		TRAP(error, screenDevice = CFbsScreenDevice::NewL(0,EGray16));
  2734 	if (error == KErrNotSupported)
  2735 		TRAP(error, screenDevice = CFbsScreenDevice::NewL(0,EGray4));
  2736 	if (error == KErrNotSupported)
  2737 		screenDevice = CFbsScreenDevice::NewL(0,EGray2);	
  2738 	
  2739 	CleanupStack::PushL(screenDevice);
  2740 	screenDevice->ChangeScreenDevice(0);
  2741 	screenDevice->SetAutoUpdate(ETrue);
  2742 	CGraphicsContext* gc;
  2743 	User::LeaveIfError(screenDevice->CreateContext(gc));
  2744 	CleanupStack::PushL(gc);
  2745 	TFontSpec fs(KTestFont, 20);
  2746 	CFont* font;
  2747 	User::LeaveIfError(screenDevice->GetNearestFontInPixels(font, fs));
  2748 	TFontSpec fontSpec = font->FontSpecInTwips();
  2749 	if(0 != fontSpec.iTypeface.iName.Compare(KTestFont))
  2750 		{
  2751 		// Test font not found.
  2752 		User::Leave(KErrNotFound);
  2753 		}
  2754 	TRAP(error, RunPDEF097387TestL(screenDevice));
  2755 	CleanupStack::PopAndDestroy(gc);
  2756 	CleanupStack::PopAndDestroy(screenDevice);
  2757 	User::LeaveIfError(error);
  2758 	}
  2759 
  2760 /**
  2761 @SYMTestCaseID          SYSLIB-FORM-UT-3241
  2762 @SYMTestCaseDesc	    Test to ensure that invalid rectangle of the text view is being set
  2763 						correctly after removing of a line of text
  2764 @SYMTestPriority 	    High
  2765 @SYMTestActions  	    Creates a text document and view and layout objects for it.
  2766 						Then appends text to the document one character at a
  2767 						time until text starts to wrap to the second line. At this point
  2768 						the last character is being deleted, so that the text fits into
  2769 						one line once again. Then we get the invalid rectangle of the view
  2770 						and check that this rectangle includes the area where the second line
  2771 						used to be.
  2772 @SYMTestExpectedResults The location of the second line of text should be included into
  2773 						invalid area.
  2774 @SYMDEF                 PDEF098569
  2775 */
  2776 void RunPDEF098569TestL()
  2777 	{
  2778 	//create editor/bitmap
  2779  	CTestBitmapFile* bitMap = CTestBitmapFile::NewLC();
  2780 
  2781 	bitMap->AppendL(_L("a")); //insert first character to calculate first line's height
  2782  	bitMap->View()->HandleCharEditL();
  2783  	TInt FirstLineBottom = CTestTextView::GetFormattedHeight(bitMap->View());
  2784  	//perform appending loop
  2785  	do
  2786  		{
  2787  		bitMap->AppendL(_L("a"));
  2788  		bitMap->View()->HandleCharEditL();
  2789  		}
  2790  	while (CTestTextView::GetFormattedHeight(bitMap->View())==FirstLineBottom );
  2791  	TInt SecondLineBottom = CTestTextView::GetFormattedHeight(bitMap->View());
  2792 
  2793  	//delete last character
  2794  	TInt last = bitMap->Layout()->DocumentLength() - 1;
  2795  	TCursorSelection selection=TCursorSelection(last,last);
  2796 	bitMap->DocModel()->DelSetInsertCharFormatL(selection.LowerPos(),1);
  2797 	bitMap->View()->HandleCharEditL(CTextLayout::EFLeftDelete,EFalse);
  2798 
  2799  	//get the invalid area of the view object
  2800  	TRect invalid_rect = CTestTextView::GetInvalidRect(bitMap->View());
  2801  	//check that entire rectangle of the second line lies within the invalid area
  2802  	test(invalid_rect.iTl.iY<=FirstLineBottom && invalid_rect.iBr.iY>=SecondLineBottom);
  2803 
  2804 	CleanupStack::PopAndDestroy(bitMap);
  2805 	}
  2806 
  2807 /**
  2808 @SYMTestCaseID				SYSLIB-FORM-UT-3345
  2809 @SYMTestCaseDesc			Test to ensure that implicit redraw is disabled until an external
  2810 							draw is performed.
  2811 @SYMTestPriority				High
  2812 @SYMTestActions				Create a view and layout object.
  2813 							Check BeginDraw() and EndDraw() are disabled.
  2814 							Do external draw.
  2815 							Check BeginDraw() and EndDraw() are enabled.
  2816 @SYMTestExpectedResults		Implicit redraw should be disabled until external draw
  2817 							is performed.
  2818 @SYMDEF					INC099424
  2819 */
  2820 void RunINC099424TestL()
  2821 	{
  2822 	TBuf<100> text;
  2823 	TDocModel docModel(text);
  2824 	TRect displayRect(0, 0, KDisplayWidth, KDisplayHeight);
  2825 	CTextLayout* layout = CTextLayout::NewL(&docModel, displayRect.Width());
  2826 	CleanupStack::PushL(layout);
  2827 	CTestGraphicsDevice* device = CTestGraphicsDevice::NewL(displayRect.Size(), 0);
  2828 	CleanupStack::PushL(device);
  2829 	CTextView* view = CTextView::NewL(layout, displayRect,
  2830 		device, device, 0, 0, 0);
  2831 	CleanupStack::PushL(view);
  2832 
  2833 	// This test uses CTextLayout::BeginRedrawCalled() to determine whether or not
  2834 	// CTextLayout::BeginRedraw() and CTextLayout::EndRedraw() are enabled.
  2835 	// CTextLayout::BeginRedrawCalled() returns ETrue if CTextLayout::iBeginRedrawCount
  2836 	// is greater than 0. Otherwise EFalse.
  2837 	// CTextLayout::BeginRedraw() and CTextLayout::EndRedraw() increments or
  2838 	// decrements iBeginRedrawCount respectively if they are enabled.
  2839 
  2840 	TRect rect(0,0,0,0);
  2841 
  2842 	// Check iBeginRedrawCount is 0 initially.
  2843 	// If next line is successful then iBeginRedrawCount must be 0
  2844 	// because it is initialised to this on construction.
  2845 	test(layout->BeginRedrawCalled() == EFalse);
  2846 
  2847 	// Check begin and end functions are disabled
  2848 	layout->BeginRedraw(rect);
  2849 	test(layout->BeginRedrawCalled() == EFalse);
  2850 	// Doing this many times in case enabled and the CTextLayout::iBeginRedrawCount
  2851 	// was already negative.
  2852 	for(TInt i = 0; i < 20; i++)
  2853 		layout->EndRedraw();
  2854 	test(layout->BeginRedrawCalled() == EFalse);
  2855 
  2856 	// Enable begin and end functions with external draw.
  2857 	// BeginRedrawCalled returns EFalse because DrawL call both begin and end
  2858 	// which increments then decrements iBeginRedrawCount
  2859 	view->DrawL(rect);
  2860 	test(layout->BeginRedrawCalled() == EFalse);
  2861 
  2862 	// Test begin and end functions are enabled individually
  2863 	layout->BeginRedraw(rect);
  2864 	test(layout->BeginRedrawCalled() != EFalse);
  2865 	layout->EndRedraw();
  2866 	test(layout->BeginRedrawCalled() == EFalse);
  2867 
  2868 	// tidy up
  2869 	CleanupStack::PopAndDestroy(view);
  2870 	CleanupStack::PopAndDestroy(device);
  2871 	CleanupStack::PopAndDestroy(layout);
  2872  	}
  2873 
  2874 /**
  2875 @SYMTestCaseID          SYSLIB-FORM-CT-3754
  2876 @SYMTestCaseDesc	    A further test to ensure the correct operation of highlight extensions.
  2877 @SYMTestPriority 	    High
  2878 @SYMTestActions  	    Fill viewable area with multiple short lines of text. The next line
  2879 						to scroll into view should be a longer line of text followed by more
  2880 						short lines.  Ensure highlighting and band formatting are on.  Select
  2881 						the text from the beginning of the document until after the short line
  2882 						directly following the long line.
  2883 @SYMTestExpectedResults Screen and bitmaps should match - the whole of the long line should be
  2884 						highlighted.
  2885 @SYMDEF                 INC109995
  2886 */
  2887 void RunINC109995TestL()
  2888 	{
  2889 	//create editor/bitmap
  2890  	CTestBitmapFile* bitMap = CTestBitmapFile::NewLC();
  2891 
  2892 	//open the zipfile containing the comparison bitmaps
  2893 	CTestBitmapZipFileExtractor* extract = CTestBitmapZipFileExtractor::NewLC(
  2894     		_L("Z:\\test\\app-framework\\form\\input\\bitmaps.zip"));
  2895 
  2896 	//set up test conditions
  2897 	bitMap->Layout()->SetAmountToFormat();
  2898 	bitMap->Layout()->SetHighlightExtensions(0,0,-1,-1);
  2899 
  2900 	// the offscreen bitmap.  This looks like an unexpected feature in its' own right.  The visual
  2901 	// effect, in this case, is that out of the three visible lines, only the
  2902 	// second line gets updated when scrolling with highlighting on.
  2903 	bitMap->View()->DisableFlickerFreeRedraw();
  2904 
  2905 	//insert some text
  2906 	bitMap->AppendL(_L("11111\x2029"));
  2907 	bitMap->AppendL(_L("22222\x2029"));
  2908 	bitMap->AppendL(_L("33333\x2029"));
  2909 	bitMap->AppendL(_L("aaaaaaaaaaaaaaaaa\x2029"));
  2910 	bitMap->AppendL(_L("44444\x2029"));
  2911 	bitMap->AppendL(_L("55555\x2029"));
  2912  	bitMap->View()->HandleGlobalChangeL();
  2913 
  2914 	//highlight the text
  2915 	TCursorPosition::TMovementType lineDown = TCursorPosition::EFLineDown;
  2916 	bitMap->View()->SetDocPosL(0);
  2917 	bitMap->View()->MoveCursorL(lineDown,ETrue);
  2918 	bitMap->View()->MoveCursorL(lineDown,ETrue);
  2919 	bitMap->View()->MoveCursorL(lineDown,ETrue);
  2920 	bitMap->View()->MoveCursorL(lineDown,ETrue);
  2921 	bitMap->View()->MoveCursorL(lineDown,ETrue);
  2922 
  2923 //	bitMap->SaveFileL(_L("c:\\ScrolledHighlight.bmp"));
  2924 	test(bitMap->CompareL(extract->BitmapFileL(_L("ScrolledHighlight.bmp"))));
  2925 
  2926 	CleanupStack::PopAndDestroy(2,bitMap);
  2927 	}
  2928 
  2929 /**
  2930 @SYMTestCaseID          SYSLIB-FORM-CT-4003
  2931 @SYMTestCaseDesc	    Test to ensure correct cursor movement between 2 lines containing a pictures.
  2932 @SYMTestPriority 	    High
  2933 @SYMTestActions  	    Inserts pictures until the line breaks, then moves the cursor leftwards for
  2934 						LTR text, and rightwards for RTL text, starting from the end of the 2nd line,
  2935 						testing the MovementType that has taken place and the position of the cursor
  2936 						after the movement, especially when the cursor moves to the first line.
  2937 @SYMTestExpectedResults Resulting document position are where expected.
  2938 @SYMDEF                 PDEF112004
  2939 */
  2940 void RunPDEF112004TestL()
  2941 	{
  2942 
  2943 	//create editor/bitmap
  2944  	CTestBitmapFile* bitMap = CTestBitmapFile::NewLC(TRect(0, 0, 140, 185));
  2945 
  2946 	//create the picture to insert (this one is a red box)
  2947 	CTestPicture* pic = new(ELeave)CTestPicture();
  2948  	CleanupStack::PushL(pic);
  2949    	pic->SetSizeInTwips(TSize(400,400));
  2950 
  2951 	//Add lots of pictures until we get a line break, and then format the view
  2952 	// Just to be sure, add one picture after we get a line break.
  2953 	TInt numLines = 0;
  2954 	TInt pos = 0;
  2955 	for (;;)
  2956 		{
  2957 		if (numLines > 1)
  2958 		break;
  2959 		bitMap->AppendL(pic);
  2960 		numLines = bitMap->View()->Layout()->NumFormattedLines();
  2961 		pos++;
  2962 		}
  2963 	bitMap->View()->HandleGlobalChangeL();
  2964 
  2965 	// Place the cursor at the end of the last picture added and start moving the cursor left.
  2966 	TTmDocPos thisPos;
  2967 	bitMap->View()->GetCursorPos(thisPos);
  2968 	TCursorPosition::TMovementType type = TCursorPosition::EFLeft;
  2969 
  2970 	// Docuemnt position is already at the end, but it is Trailing. Make it Leading and set it.
  2971 	TTmDocPosSpec::TType docPosType = TTmDocPosSpec::ELeading;
  2972 	TTmDocPosSpec docPos;
  2973 	docPos.iPos = pos;//thisPos.iPos;
  2974 	docPos.iType = docPosType;
  2975 
  2976 	bitMap->View()->SetDocPosL(docPos);
  2977 	bitMap->View()->GetCursorPos(thisPos);
  2978 	test(thisPos.iPos == 4);
  2979 	// Move the cursor and test if it has moved
  2980 	bitMap->View()->MoveCursorL(type, EFalse);
  2981 	bitMap->View()->GetCursorPos(thisPos);
  2982 
  2983 	test(thisPos.iPos == 3 && type == TCursorPosition::EFLeft);
  2984 	// Move the cursor and test if it has moved
  2985 	bitMap->View()->MoveCursorL(type, EFalse);
  2986 	bitMap->View()->GetCursorPos(thisPos);
  2987 	test(thisPos.iPos == 3 && type == TCursorPosition::EFLeft);
  2988 	// Move the cursor and test if it has moved
  2989 	bitMap->View()->MoveCursorL(type, EFalse);
  2990 	bitMap->View()->GetCursorPos(thisPos);
  2991 	test(thisPos.iPos == 2 && type == TCursorPosition::EFLeft);
  2992 	// Move the cursor and test if it has moved
  2993 	bitMap->View()->MoveCursorL(type, EFalse);
  2994 	bitMap->View()->GetCursorPos(thisPos);
  2995 	test(thisPos.iPos == 1 && type == TCursorPosition::EFLeft);
  2996 	// Move the cursor and test if it has moved
  2997 	bitMap->View()->MoveCursorL(type, EFalse);
  2998 	bitMap->View()->GetCursorPos(thisPos);
  2999 	test(thisPos.iPos == 1 && type == TCursorPosition::EFLeft);
  3000 
  3001 	/**	Now test the same for pictures in a RTL paragraph.
  3002 		Put some RTL text so that the paragraph changes to a RTL paragraph.
  3003 		Then move the cursor right, through the pictures */
  3004 	bitMap->AppendL(_L("\x630"));
  3005  	bitMap->View()->HandleGlobalChangeL();
  3006 
  3007 	docPos.iPos = bitMap->View()->Layout()->DocumentLength();
  3008 	docPos.iType = TTmDocPosSpec::ELeading;
  3009 	bitMap->View()->SetDocPosL(docPos);
  3010 	bitMap->View()->GetCursorPos(thisPos);
  3011 	test(thisPos.iPos == 5);
  3012 
  3013 	type = TCursorPosition::EFRight;
  3014 	// Move the cursor and test if it has moved
  3015 	bitMap->View()->MoveCursorL(type, EFalse);
  3016 	bitMap->View()->GetCursorPos(thisPos);
  3017 
  3018 	test(thisPos.iPos == 4 && type == TCursorPosition::EFRight);
  3019 	// Move the cursor and test if it has moved
  3020 	bitMap->View()->MoveCursorL(type, EFalse);
  3021 	bitMap->View()->GetCursorPos(thisPos);
  3022 
  3023 	test(thisPos.iPos == 3 && type == TCursorPosition::EFRight);
  3024 	// Move the cursor and test if it has moved
  3025 	bitMap->View()->MoveCursorL(type, EFalse);
  3026 	bitMap->View()->GetCursorPos(thisPos);
  3027 
  3028 	test(thisPos.iPos == 3 && type == TCursorPosition::EFRight);
  3029 	// Move the cursor and test if it has moved
  3030 	bitMap->View()->MoveCursorL(type, EFalse);
  3031 	bitMap->View()->GetCursorPos(thisPos);
  3032 
  3033 	test(thisPos.iPos == 2 && type == TCursorPosition::EFRight);
  3034 	// Move the cursor and test if it has moved
  3035 	bitMap->View()->MoveCursorL(type, EFalse);
  3036 	bitMap->View()->GetCursorPos(thisPos);
  3037 
  3038 	test(thisPos.iPos == 1 && type == TCursorPosition::EFRight);
  3039 
  3040 	CleanupStack::Pop(pic);
  3041 	CleanupStack::PopAndDestroy(1);
  3042 	}
  3043 
  3044 
  3045 /**
  3046 @SYMTestCaseID          SYSLIB-FORM-CT-4001
  3047 @SYMTestCaseDesc	    Test to ensure correct picture selection and cursor movement in
  3048 						line of text containing a picture.
  3049 @SYMTestPriority 	    High
  3050 @SYMTestActions  	    Writes text wrapping to five lines and inserts pictures in the
  3051 						middle three lines and sets picture text alignment other than
  3052 						baseline, then tests that various cursor movements result in the
  3053 						correct doc positions. Also checks that a frame is drawn around the
  3054 						centre picture when expected.
  3055 @SYMTestExpectedResults Resulting document position are where expected; frame drawn correctly
  3056 @SYMDEF                 INC112423
  3057 */
  3058 void RunINC112423TestVariantsL(const TDesC& aComparisonFileName, const TDesC& aText,
  3059 	TFontPresentation::TAlignment aAlignment, TCursorPosition::TMovementType aMove)
  3060 	{
  3061 	//open the zipfile containing the comparison bitmaps
  3062 	CTestBitmapZipFileExtractor* extract = CTestBitmapZipFileExtractor::NewLC(
  3063     		_L("Z:\\test\\app-framework\\form\\input\\bitmaps.zip"));
  3064 
  3065 	//create editor/bitmap
  3066  	CTestBitmapFile* bitMap = CTestBitmapFile::NewLC(TRect(0, 0, 160, 185), TCharFormat(_L("ClearlyU"),1));
  3067 
  3068 	//create the picture to insert (this one is a red box)
  3069 	CTestPicture* pic = new(ELeave)CTestPicture();
  3070  	CleanupStack::PushL(pic);
  3071    	pic->SetSizeInTwips(TSize(400,400)); //pic needs to be higher than text height to catch all aligments
  3072 
  3073 	//insert mixture of text and pictures
  3074 	bitMap->AppendL(aText);
  3075 	bitMap->AppendL(aText);
  3076 	bitMap->AppendL(aText);
  3077 	TInt firstPicPos = bitMap->DocModel()->DocumentLength(); //get cursor pos of first picture
  3078 	bitMap->AppendL(pic);
  3079 	bitMap->View()->HandleGlobalChangeL();
  3080 
  3081 	//change picture alignment
  3082 	TInt docLength = bitMap->DocModel()->DocumentLength();
  3083 	TCursorSelection selection(docLength, docLength-1);
  3084 	bitMap->View()->SetSelectionL(selection);
  3085 	TCharFormat format;
  3086 	format.iFontPresentation.iPictureAlignment = aAlignment;
  3087 	TCharFormatMask mask;
  3088 	mask.SetAttrib(EAttFontPictureAlignment);
  3089 	bitMap->DocModel()->ApplyCharFormatL(format, mask, selection.LowerPos(), 1);
  3090 	bitMap->View()->HandleRangeFormatChangeL(selection,EFalse);
  3091 	bitMap->View()->CancelSelectionL();
  3092 
  3093 	//insert more text and pictures
  3094 	bitMap->AppendL(aText);
  3095 	bitMap->AppendL(aText);
  3096 	TInt secondPicPos = bitMap->DocModel()->DocumentLength(); //get cursor pos of second picture
  3097 	bitMap->AppendL(pic);
  3098 	bitMap->AppendL(aText);
  3099 	bitMap->AppendL(aText);
  3100 	TInt thirdPicPos = bitMap->DocModel()->DocumentLength(); //get cursor pos of third picture
  3101 	bitMap->AppendL(pic);
  3102 	bitMap->AppendL(aText);
  3103 	bitMap->AppendL(aText);
  3104 	bitMap->AppendL(aText);
  3105 	bitMap->View()->HandleGlobalChangeL();
  3106 
  3107 	//now move cursor over each picture and test for correct selection
  3108 	TTmDocPos thisPos;
  3109 	bitMap->View()->SetDocPosL(firstPicPos);
  3110 	bitMap->View()->MoveCursorL(aMove, EFalse);
  3111 	bitMap->View()->GetCursorPos(thisPos);
  3112 	test(thisPos.iPos == firstPicPos); //cursor should be over the first picture
  3113 	bitMap->View()->SetDocPosL(secondPicPos);
  3114 	bitMap->View()->MoveCursorL(aMove, EFalse);
  3115 	bitMap->View()->GetCursorPos(thisPos);
  3116 	test(thisPos.iPos == secondPicPos); //cursor should be over the second picture
  3117 //	bitMap->SaveFileL(aComparisonFileName); //and a frame should be drawn over it
  3118 	test(bitMap->CompareL(extract->BitmapFileL(aComparisonFileName)));
  3119 	bitMap->View()->SetDocPosL(thirdPicPos);
  3120 	bitMap->View()->MoveCursorL(aMove, EFalse);
  3121 	bitMap->View()->GetCursorPos(thisPos);
  3122 	test(thisPos.iPos == thirdPicPos); //cursor should be over the third picture
  3123 
  3124 	//Test up/down cursor movement
  3125 	TTmDocPos lastPos;
  3126 	TBool leadingEdge = aMove == TCursorPosition::EFRight;
  3127 	TCursorPosition::TMovementType move = TCursorPosition::EFLineDown;
  3128 	bitMap->View()->SetDocPosL(0); //go to top of document
  3129 	bitMap->View()->GetCursorPos(thisPos);
  3130 	lastPos = thisPos;
  3131 	TTmDocPos firstLineHome(thisPos.iPos, leadingEdge);
  3132 	bitMap->View()->MoveCursorL(move, EFalse);
  3133 	bitMap->View()->GetCursorPos(thisPos);
  3134 	test(thisPos.iPos > lastPos.iPos); //cursor should have moved down
  3135 	TTmDocPos secondLineHome = lastPos = thisPos;
  3136 	TTmDocPos firstLineEnd(secondLineHome.iPos - 1, leadingEdge);
  3137 	bitMap->View()->MoveCursorL(move, EFalse);
  3138 	bitMap->View()->GetCursorPos(thisPos);
  3139 	test(thisPos.iPos > lastPos.iPos); //cursor should have moved down again
  3140 	TTmDocPos thirdLineHome = lastPos = thisPos;
  3141 	TTmDocPos secondLineEnd(thirdLineHome.iPos - 1, leadingEdge);
  3142 	bitMap->View()->MoveCursorL(move, EFalse);
  3143 	bitMap->View()->GetCursorPos(thisPos);
  3144 	test(thisPos.iPos > lastPos.iPos); //cursor should have moved down again
  3145 	TTmDocPos fourthLineHome = lastPos = thisPos;
  3146 	TTmDocPos thirdLineEnd(fourthLineHome.iPos - 1, leadingEdge);
  3147 	bitMap->View()->MoveCursorL(move, EFalse);
  3148 	bitMap->View()->GetCursorPos(thisPos);
  3149 	test(thisPos.iPos > lastPos.iPos); //cursor should have moved down again
  3150 	TTmDocPos fifthLineHome = lastPos = thisPos;
  3151 	TTmDocPos fourthLineEnd(fifthLineHome.iPos - 1, leadingEdge);
  3152 	bitMap->View()->SetDocPosL(bitMap->DocModel()->DocumentLength()); //go to end of document
  3153 	bitMap->View()->GetCursorPos(thisPos);
  3154 	lastPos = thisPos;
  3155 	TTmDocPos fifthLineEnd(thisPos.iPos, leadingEdge);
  3156 	bitMap->View()->MoveCursorL(move = TCursorPosition::EFLineUp, EFalse);
  3157 	bitMap->View()->GetCursorPos(thisPos);
  3158 	test(thisPos.iPos < lastPos.iPos); //cursor should have moved up
  3159 	lastPos = thisPos;
  3160 	bitMap->View()->MoveCursorL(move, EFalse);
  3161 	bitMap->View()->GetCursorPos(thisPos);
  3162 	test(thisPos.iPos < lastPos.iPos); //cursor should have moved up again
  3163 	lastPos = thisPos;
  3164 	bitMap->View()->MoveCursorL(move, EFalse);
  3165 	bitMap->View()->GetCursorPos(thisPos);
  3166 	test(thisPos.iPos < lastPos.iPos); //cursor should have moved up again
  3167 	lastPos = thisPos;
  3168 	bitMap->View()->MoveCursorL(move, EFalse);
  3169 	bitMap->View()->GetCursorPos(thisPos);
  3170 	test(thisPos.iPos < lastPos.iPos); //cursor should have moved up again
  3171 
  3172 	//Test home/end cursor movement
  3173 	bitMap->View()->MoveCursorL(move = TCursorPosition::EFLineBeg, EFalse);
  3174 	bitMap->View()->GetCursorPos(thisPos);
  3175 	test(thisPos == firstLineHome);
  3176 	bitMap->View()->MoveCursorL(move = TCursorPosition::EFLineEnd, EFalse);
  3177 	bitMap->View()->GetCursorPos(thisPos);
  3178 	test(thisPos == firstLineEnd);
  3179 	bitMap->View()->MoveCursorL(move = TCursorPosition::EFLineDown, EFalse);
  3180 	bitMap->View()->MoveCursorL(move = TCursorPosition::EFLineBeg, EFalse);
  3181 	bitMap->View()->GetCursorPos(thisPos);
  3182 	test(thisPos == secondLineHome);
  3183 	bitMap->View()->MoveCursorL(move = TCursorPosition::EFLineEnd, EFalse);
  3184 	bitMap->View()->GetCursorPos(thisPos);
  3185 	test(thisPos == secondLineEnd);
  3186 	bitMap->View()->MoveCursorL(move = TCursorPosition::EFLineDown, EFalse);
  3187 	bitMap->View()->MoveCursorL(move = TCursorPosition::EFLineBeg, EFalse);
  3188 	bitMap->View()->GetCursorPos(thisPos);
  3189 	test(thisPos == thirdLineHome);
  3190 	bitMap->View()->MoveCursorL(move = TCursorPosition::EFLineEnd, EFalse);
  3191 	bitMap->View()->GetCursorPos(thisPos);
  3192 	test(thisPos == thirdLineEnd);
  3193 	bitMap->View()->MoveCursorL(move = TCursorPosition::EFLineDown, EFalse);
  3194 	bitMap->View()->MoveCursorL(move = TCursorPosition::EFLineBeg, EFalse);
  3195 	bitMap->View()->GetCursorPos(thisPos);
  3196 	test(thisPos == fourthLineHome);
  3197 	bitMap->View()->MoveCursorL(move = TCursorPosition::EFLineEnd, EFalse);
  3198 	bitMap->View()->GetCursorPos(thisPos);
  3199 	test(thisPos == fourthLineEnd);
  3200 	bitMap->View()->MoveCursorL(move = TCursorPosition::EFLineDown, EFalse);
  3201 	bitMap->View()->MoveCursorL(move = TCursorPosition::EFLineBeg, EFalse);
  3202 	bitMap->View()->GetCursorPos(thisPos);
  3203 	test(thisPos == fifthLineHome);
  3204 	bitMap->View()->MoveCursorL(move = TCursorPosition::EFLineEnd, EFalse);
  3205 	bitMap->View()->GetCursorPos(thisPos);
  3206 	test(thisPos == fifthLineEnd);
  3207 
  3208 	//Test at line extremes cursor movement left/right wraps to next/previous line
  3209 	move = aMove == TCursorPosition::EFRight? TCursorPosition::EFLeft : TCursorPosition::EFRight;
  3210 	bitMap->View()->SetDocPosL(firstLineEnd);
  3211 	bitMap->View()->MoveCursorL(aMove, EFalse);
  3212 	bitMap->View()->GetCursorPos(thisPos);
  3213 	test(thisPos == secondLineHome);
  3214 	bitMap->View()->MoveCursorL(move, EFalse);
  3215 	bitMap->View()->GetCursorPos(thisPos);
  3216 	test(thisPos == firstLineEnd);
  3217 	bitMap->View()->SetDocPosL(secondLineEnd);
  3218 	bitMap->View()->MoveCursorL(aMove, EFalse);
  3219 	bitMap->View()->GetCursorPos(thisPos);
  3220 	test(thisPos == thirdLineHome);
  3221 	bitMap->View()->MoveCursorL(move, EFalse);
  3222 	bitMap->View()->GetCursorPos(thisPos);
  3223 	test(thisPos == secondLineEnd);
  3224 	bitMap->View()->SetDocPosL(thirdLineEnd);
  3225 	bitMap->View()->MoveCursorL(aMove, EFalse);
  3226 	bitMap->View()->GetCursorPos(thisPos);
  3227 	test(thisPos == fourthLineHome);
  3228 	bitMap->View()->MoveCursorL(move, EFalse);
  3229 	bitMap->View()->GetCursorPos(thisPos);
  3230 	test(thisPos == thirdLineEnd);
  3231 	bitMap->View()->SetDocPosL(fourthLineEnd);
  3232 	bitMap->View()->MoveCursorL(aMove, EFalse);
  3233 	bitMap->View()->GetCursorPos(thisPos);
  3234 	test(thisPos == fifthLineHome);
  3235 	bitMap->View()->MoveCursorL(move, EFalse);
  3236 	bitMap->View()->GetCursorPos(thisPos);
  3237 	test(thisPos == fourthLineEnd);
  3238 
  3239 	//Test pageup/pagedown
  3240 	bitMap->View()->MoveCursorL(move = TCursorPosition::EFPageUp, EFalse);
  3241 	bitMap->View()->MoveCursorL(move = TCursorPosition::EFPageUp, EFalse);
  3242 	bitMap->View()->GetCursorPos(thisPos);
  3243 	test(thisPos.iPos == firstLineHome.iPos);
  3244 	bitMap->View()->MoveCursorL(move = TCursorPosition::EFPageDown, EFalse);
  3245 	bitMap->View()->MoveCursorL(move = TCursorPosition::EFPageDown, EFalse);
  3246 	bitMap->View()->GetCursorPos(thisPos);
  3247 	test(thisPos.iPos == fifthLineEnd.iPos);
  3248 
  3249 	CleanupStack::Pop(pic);
  3250 	CleanupStack::PopAndDestroy(2, extract);
  3251 	}
  3252 void RunINC112423TestL()
  3253 	{
  3254 	RunINC112423TestVariantsL(_L("alignArabicBot.bmp"), _L("\x630\x630\x630\x630\x630\x630\x630\x630 "),
  3255 		TFontPresentation::EAlignBottom, TCursorPosition::EFLeft);
  3256 	RunINC112423TestVariantsL(_L("alignArabicCen.bmp"), _L("\x630\x630\x630\x630\x630\x630\x630\x630 "),
  3257 		TFontPresentation::EAlignCentered, TCursorPosition::EFLeft);
  3258 	RunINC112423TestVariantsL(_L("alignArabicTop.bmp"), _L("\x630\x630\x630\x630\x630\x630\x630\x630 "),
  3259 		TFontPresentation::EAlignTop, TCursorPosition::EFLeft);
  3260 	RunINC112423TestVariantsL(_L("alignLatinBot.bmp"), _L("aaaaaaaa "),
  3261 		TFontPresentation::EAlignBottom, TCursorPosition::EFRight);
  3262 	RunINC112423TestVariantsL(_L("alignLatinCen.bmp"), _L("aaaaaaaa "),
  3263 		TFontPresentation::EAlignCentered, TCursorPosition::EFRight);
  3264 	RunINC112423TestVariantsL(_L("alignLatinTop.bmp"), _L("aaaaaaaa "),
  3265 		TFontPresentation::EAlignTop, TCursorPosition::EFRight);
  3266 	}
  3267 
  3268 /**
  3269 @SYMTestCaseID          SYSLIB-FORM-CT-4005
  3270 @SYMTestCaseDesc        Given the usecase condition, test to ensure there is no highlighted
  3271                         character following CTextView::CancelSelectionL();
  3272 @SYMTestPriority        High
  3273 @SYMTestActions         Create an empty document and append one character to it. Select this
  3274                         character in the document and then cancel the selection.
  3275 @SYMTestExpectedResults Screen and bitmap should match - the character should not be highlighted.
  3276 @SYMDEF                 PDEF114862
  3277 */
  3278 void RunPDEF114862TestL()
  3279 	{
  3280 	//create editor/bitmap
  3281  	CTestBitmapFile* bitMap = CTestBitmapFile::NewLC();
  3282 
  3283 	//open the zipfile containing the comparison bitmaps
  3284 	CTestBitmapZipFileExtractor* extract = CTestBitmapZipFileExtractor::NewLC(
  3285     		_L("Z:\\test\\app-framework\\form\\input\\bitmaps.zip"));
  3286 
  3287 	//set up test conditions
  3288 	bitMap->AppendL(_L("@"));
  3289 	bitMap->View()->SetSelectionL(TCursorSelection(1,0));
  3290 	bitMap->View()->CancelSelectionL();
  3291 
  3292 //	bitMap->SaveFileL(_L("c:\\MailboxWizard.bmp"));
  3293 	test(bitMap->CompareL(extract->BitmapFileL(_L("MailboxWizard.bmp"))));
  3294 
  3295 	CleanupStack::PopAndDestroy(2, bitMap);
  3296 	}
  3297 
  3298 
  3299 /**
  3300 @SYMTestCaseID          SYSLIB-FORM-CT-4008
  3301 @SYMTestCaseDesc	    Make sure any highlighting is properly canceled when moving
  3302                         the cursor without drag.
  3303 @SYMTestPriority 	    High
  3304 @SYMTestActions         Write some text to an empty document, highlight part of the text
  3305                         and then move the cursor without selecting text.
  3306 @SYMTestExpectedResults No text should be highlighted following cursor move.
  3307 @SYMDEF                 INC116681
  3308 */
  3309 void RunINC116681TestL()
  3310 	{
  3311 	//open the zipfile containing the comparison bitmaps
  3312 	CTestBitmapZipFileExtractor* extract = CTestBitmapZipFileExtractor::NewLC(
  3313     		_L("Z:\\test\\app-framework\\form\\input\\bitmaps.zip"));
  3314 
  3315 	//create editor/bitmap
  3316  	CTestBitmapFile* bitMap = CTestBitmapFile::NewLC();
  3317 
  3318  	//setup test conditions
  3319  	bitMap->AppendL(_L("SomeText"));                       // enter some text
  3320  	bitMap->View()->SetSelectionL(TCursorSelection(5,1));  //highlight some of it
  3321 	TCursorPosition::TMovementType moveRight = TCursorPosition::EFRight;
  3322  	bitMap->View()->MoveCursorL(moveRight, EFalse);        //move cursor with drag off
  3323 //	bitMap->SaveFileL(_L("c:\\INC116681.bmp"));
  3324 	test(bitMap->CompareL(extract->BitmapFileL(_L("INC116681.bmp"))));
  3325 
  3326  	CleanupStack::PopAndDestroy(2);
  3327 	}
  3328 
  3329 /**
  3330 @SYMTestCaseID          SYSLIB-FORM-UT-4018
  3331 @SYMTestCaseDesc	Performance test for formatting document with many pictures and test.
  3332 @SYMTestPriority 	Medium
  3333 @SYMTestActions         Add a lot pictures separated by commas and time the operation.
  3334 @SYMTestExpectedResults The formatting should not take longer than the specified timeout.
  3335 @SYMDEF                 PDEF123018
  3336 */
  3337 void RunPDEF123018TestL()
  3338 	{
  3339 	// define a time unit for the performance test timeout
  3340 	const TInt KOneSecond = 1000000;
  3341 	//create editor/bitmap
  3342  	CTestBitmapFile* bitMap = CTestBitmapFile::NewLC(TRect(0, 0, 140, 185));
  3343  	
  3344 	//create any old picture to insert
  3345 	CTestPicture* pic = new(ELeave)CTestPicture();
  3346  	CleanupStack::PushL(pic);
  3347    	pic->SetSizeInTwips(TSize(400,400));
  3348    
  3349    	// Add some text and pictures, and time it.
  3350    	// Appending a picture will invoke the formatting.
  3351    	// Many calls should cause a lot of reformatting which will show the performance.
  3352    	TTime startTime;
  3353    	startTime.HomeTime();
  3354    	for (TInt i = 0; i < 50; i++)
  3355    		{
  3356 		bitMap->AppendL(pic);
  3357 	   	bitMap->AppendL(_L(","));
  3358    		}
  3359    	TTime endTime;
  3360    	endTime.HomeTime(); 
  3361    	TTimeIntervalMicroSeconds diff = endTime.MicroSecondsFrom(startTime);
  3362    	
  3363    	// Different performance timeouts for emulator / hardware.
  3364 	TBuf<100> buf;
  3365 	#if defined __WINS__ || defined __WINSCW__
  3366 		buf.Format( _L("Testing on emulator: Timeout = 3 seconds; finished in %d microseconds"), diff.Int64() );
  3367 		RDebug::Print( buf );
  3368 		test(diff < 3*KOneSecond);
  3369 	#elif defined __ARMCC__
  3370 		// for naviengine SMP, the timeout should be 150% time needed compare with H4, 25m for H4, 38m for naviengine
  3371 		buf.Format( _L("Testing on hardware: Timeout = 38 seconds; finished in %d microseconds"), diff.Int64() );
  3372 		RDebug::Print( buf );
  3373 		test(diff < 38*KOneSecond);
  3374 	#endif
  3375    	
  3376    	// Cleanup.
  3377 	CleanupStack::Pop(pic);
  3378 	CleanupStack::PopAndDestroy(1);
  3379 	}
  3380 
  3381 /**
  3382 @SYMTestCaseID          SYSLIB-FORM-CT-4019
  3383 @SYMTestCaseDesc        When a line in a document is filled with nothing but pictures
  3384                         and the picture alignment is set to anything other than baseline
  3385                         then the cursor should be correctly placed on that line.
  3386 @SYMTestPriority        Medium
  3387 @SYMTestActions         Fill a line up with pictures so that it wraps, place the cursor
  3388                         at the beginning of that line and measure the line metrics.
  3389 @SYMTestExpectedResults The line metrics should be correct in order to place the cursor
  3390                         in the expected position.
  3391 @SYMDEF                 DEF122198
  3392 */
  3393 void RunDEF122198_1TestL() //picture is taller than font height
  3394 	{
  3395  	CTestBitmapFile* bitMap = CTestBitmapFile::NewLC(TRect(0, 0, 160, 80));
  3396 
  3397 	//create the picture to insert (this one is a red box)
  3398 	CTestPicture* pic = new(ELeave)CTestPicture();
  3399  	CleanupStack::PushL(pic);
  3400    	pic->SetSizeInTwips(TSize(400,400));
  3401 
  3402 	//insert line of pictures
  3403 	bitMap->AppendL(pic);
  3404 	bitMap->AppendL(pic);
  3405 	bitMap->AppendL(pic);
  3406 	bitMap->AppendL(pic);
  3407 	bitMap->AppendL(pic);
  3408 	bitMap->View()->HandleGlobalChangeL();
  3409 	
  3410 	//change picture alignment
  3411 	TCursorSelection selection(0, bitMap->DocModel()->DocumentLength());
  3412 	bitMap->View()->SetSelectionL(selection);
  3413 	TCharFormat format;
  3414 	format.iFontPresentation.iPictureAlignment = TFontPresentation::EAlignBottom;
  3415 	TCharFormatMask mask;
  3416 	mask.SetAttrib(EAttFontPictureAlignment);
  3417 	bitMap->DocModel()->ApplyCharFormatL(format, mask, selection.LowerPos(), selection.Length());
  3418 	bitMap->View()->HandleRangeFormatChangeL(selection,EFalse);
  3419 	bitMap->View()->CancelSelectionL();
  3420 
  3421 	// I could find no way of getting a bitmap screenshot which showed the cursor.
  3422 	// All attempts - including rewriting bitmapDoc to use Wserv - failed.
  3423 	// Therefore, the best I can do is test the resulting line information against
  3424 	// which the position of the cursor is drawn.
  3425 	TTmPosInfo2 posInfo;
  3426    	TTmLineInfo currentLineInfo;
  3427 	TTmDocPos docPos;
  3428 	bitMap->View()->SetDocPosL(0,EFalse);
  3429 	bitMap->View()->GetCursorPos(docPos);
  3430    	bitMap->Layout()->FindDocPos(docPos, posInfo, &currentLineInfo);
  3431 
  3432    	test(posInfo.iEdge.iY==33);
  3433 	test(currentLineInfo.iBaseline==33);
  3434 
  3435    	//change picture alignment and test again
  3436 	format.iFontPresentation.iPictureAlignment = TFontPresentation::EAlignCentered;
  3437 	bitMap->View()->SetSelectionL(selection);
  3438 	bitMap->DocModel()->ApplyCharFormatL(format, mask, selection.LowerPos(), selection.Length());
  3439 	bitMap->View()->HandleRangeFormatChangeL(selection,EFalse);
  3440 	bitMap->View()->CancelSelectionL();
  3441    	bitMap->Layout()->FindDocPos(docPos, posInfo, &currentLineInfo);
  3442 	
  3443    	test(posInfo.iEdge.iY==29);
  3444 	test(currentLineInfo.iBaseline==29);
  3445 
  3446    	//change picture alignment and test again
  3447 	format.iFontPresentation.iPictureAlignment = TFontPresentation::EAlignTop;
  3448 	bitMap->View()->SetSelectionL(selection);
  3449 	bitMap->DocModel()->ApplyCharFormatL(format, mask, selection.LowerPos(), selection.Length());
  3450 	bitMap->View()->HandleRangeFormatChangeL(selection,EFalse);
  3451 	bitMap->View()->CancelSelectionL();
  3452    	bitMap->Layout()->FindDocPos(docPos, posInfo, &currentLineInfo);
  3453 
  3454    	test(posInfo.iEdge.iY==25);
  3455 	test(currentLineInfo.iBaseline==25);
  3456 	
  3457  	CleanupStack::PopAndDestroy(2);
  3458 	}
  3459 
  3460 void RunDEF122198_2TestL() //picture is shorter than font height
  3461 	{
  3462  	CTestBitmapFile* bitMap = CTestBitmapFile::NewLC(TRect(0, 0, 160, 80));
  3463 
  3464 	//create the picture to insert (this one is a red box)
  3465 	CTestPicture* pic = new(ELeave)CTestPicture();
  3466  	CleanupStack::PushL(pic);
  3467    	pic->SetSizeInTwips(TSize(400,200));
  3468 
  3469 	//insert line of pictures
  3470 	bitMap->AppendL(pic);
  3471 	bitMap->AppendL(pic);
  3472 	bitMap->AppendL(pic);
  3473 	bitMap->AppendL(pic);
  3474 	bitMap->AppendL(pic);
  3475 	bitMap->View()->HandleGlobalChangeL();
  3476 	
  3477 	//change picture alignment
  3478 	TCursorSelection selection(0, bitMap->DocModel()->DocumentLength());
  3479 	bitMap->View()->SetSelectionL(selection);
  3480 	TCharFormat format;
  3481 	format.iFontPresentation.iPictureAlignment = TFontPresentation::EAlignBottom;
  3482 	TCharFormatMask mask;
  3483 	mask.SetAttrib(EAttFontPictureAlignment);
  3484 	bitMap->DocModel()->ApplyCharFormatL(format, mask, selection.LowerPos(), selection.Length());
  3485 	bitMap->View()->HandleRangeFormatChangeL(selection,EFalse);
  3486 	bitMap->View()->CancelSelectionL();
  3487 
  3488 	// I could find no way of getting a bitmap screenshot which showed the cursor.
  3489 	// All attempts - including rewriting bitmapDoc to use Wserv - failed.
  3490 	// Therefore, the best I can do is test the resulting line information against
  3491 	// which the position of the cursor is drawn.
  3492 	TTmPosInfo2 posInfo;
  3493    	TTmLineInfo currentLineInfo;
  3494 	TTmDocPos docPos;
  3495 	bitMap->View()->SetDocPosL(0,EFalse);
  3496 	bitMap->View()->GetCursorPos(docPos);
  3497    	bitMap->Layout()->FindDocPos(docPos, posInfo, &currentLineInfo);
  3498 	test(posInfo.iEdge.iY==25);
  3499 	test(currentLineInfo.iBaseline==25);
  3500 	
  3501  	CleanupStack::PopAndDestroy(2);
  3502 	}
  3503 
  3504 /**
  3505 @SYMTestCaseID          SYSLIB-FORM-CT-4020
  3506 @SYMTestCaseDesc        When a zero-width character precedes the current doc position,
  3507                         pressing backspace should not delete everything back to the
  3508                         beginning of the document.
  3509 @SYMTestPriority        Medium
  3510 @SYMTestActions         Recreate the reported usecase and test for the correct action,
  3511                         then perform a similar test for every zero-width character.
  3512 @SYMTestExpectedResults The selection anchor point should be at the correct position
  3513                         in each case.
  3514 @SYMDEF                 INC123427
  3515 */
  3516 void RunINC123427TestL()
  3517 	{
  3518 	// *** First test actual defect usecase ***
  3519  	CTestBitmapFile* bitMap = CTestBitmapFile::NewLC();
  3520  	bitMap->AppendL(_L("a meeting\x2029"));
  3521  	bitMap->AppendL(_L("\x200E\x0038:00 am - 8:00 am 18/06/2008\x2029"));
  3522  	bitMap->AppendL(_L("\x200Ehere\x2029"));
  3523  	bitMap->AppendL(_L("\x2029"));
  3524  	bitMap->AppendL(_L("\x200ERepeats daily:\x2029"));
  3525  	bitMap->AppendL(_L("\x200E\x0046rom 17/06/2008\x2029"));
  3526  	bitMap->View()->HandleGlobalChangeL();
  3527  	
  3528  	bitMap->View()->SetDocPosL(48);
  3529  	TCursorSelection selection = bitMap->View()->GetBackwardDeletePositionL();
  3530  	test(selection.iAnchorPos==46);
  3531  	
  3532  	// *** Now reset the doc and test for all zero-width characters ***
  3533  	bitMap->DocModel()->Reset();
  3534  	bitMap->AppendL(_L("->")); //something valid to start
  3535  	TText charVal;
  3536  	TUint stringIndex=0;
  3537  	TText string[70];
  3538 
  3539  	// create a continuous line containing every zero width character:
  3540  	// add C0, C1 controls
  3541  	for (charVal=0x1; charVal<0x9; charVal++)
  3542  		{
  3543  		string[stringIndex++] = charVal;
  3544  		}
  3545  	string[stringIndex++] = 0xB;
  3546  	for (charVal=0xD; charVal<0x20; charVal++)
  3547  		{
  3548  		string[stringIndex++] = charVal;
  3549  		}
  3550  	string[stringIndex++] = 0x7F;
  3551  	string[stringIndex++] = 0x81;
  3552 	string[stringIndex++] = 0x8F;
  3553  	string[stringIndex++] = 0x90;
  3554 
  3555  	// add layout controls & invisible operators
  3556  	for (charVal=0x200B; charVal<0x2010; charVal++)
  3557  		{
  3558  		string[stringIndex++] = charVal;
  3559  		}
  3560  	// U+205F is not zero width 
  3561  	for (charVal=0x2060; charVal<0x2065; charVal++)
  3562  		{
  3563  		string[stringIndex++] = charVal;
  3564  		}
  3565  	for (charVal=0x206A; charVal<0x2070; charVal++)
  3566  		{
  3567  		string[stringIndex++] = charVal;
  3568  		}
  3569 
  3570  	// add specials
  3571  	for (charVal=0xFFF9; charVal<0xFFFD; charVal++)
  3572  		{
  3573  		string[stringIndex++] = charVal;
  3574  		}
  3575 
  3576  	string[stringIndex] = 0; // zero terminate
  3577 
  3578  	TPtrC temp;
  3579  	TTmCharFormat temp2;
  3580 	bitMap->AppendL(TBuf<70>(string));
  3581 	bitMap->AppendL(_L("<"));
  3582  	bitMap->View()->HandleGlobalChangeL();
  3583  	
  3584  	// cycle through the doc at each zerowidth char and test correct backward
  3585  	// delete position.  This test would have passed without the fix
  3586  	TUint startpos=2;
  3587  	for (TUint i=startpos; i<stringIndex+startpos; i++)
  3588  		{
  3589  	 	bitMap->View()->SetDocPosL(i);
  3590  	 	selection = bitMap->View()->GetBackwardDeletePositionL();
  3591  	 	test(selection.iAnchorPos==1);
  3592  		}
  3593  	
  3594  	// same test again but with no valid characters at the start.
  3595  	// This test would have passed without the fix
  3596  	bitMap->DocModel()->Reset();
  3597 	bitMap->AppendL(TBuf<70>(string));
  3598  	bitMap->View()->HandleGlobalChangeL();
  3599  	for (TUint i=0; i<stringIndex; i++)
  3600  		{
  3601  	 	bitMap->View()->SetDocPosL(i);
  3602  	 	selection = bitMap->View()->GetBackwardDeletePositionL();
  3603  	 	test(selection.iAnchorPos==0);
  3604  		}
  3605 	
  3606  	// same test again but with a complete line of visible characters before the
  3607  	// line of invisible ones. This test would *not* have passed without the fix
  3608  	bitMap->DocModel()->Reset();
  3609 	bitMap->AppendL(_L("0123456789\x2029"));
  3610 	bitMap->AppendL(_L("0123456789\x2029"));
  3611 	bitMap->AppendL(TBuf<70>(string));
  3612  	bitMap->View()->HandleGlobalChangeL();
  3613  	startpos=23;
  3614  	for (TUint i=startpos; i<stringIndex+startpos-1; i++)
  3615  		{
  3616  	 	bitMap->View()->SetDocPosL(i);
  3617  	 	selection = bitMap->View()->GetBackwardDeletePositionL();
  3618  	 	test(selection.iAnchorPos==21);
  3619  		}
  3620  	
  3621  	CleanupStack::PopAndDestroy();
  3622 	}
  3623 
  3624 TInt E32Main()
  3625 	{
  3626 	test.Title();
  3627 	static CTrapCleanup* TrapCleanup = CTrapCleanup::New();
  3628 	TInt error = RFbsSession::Connect();
  3629 	if (error == KErrNotFound)
  3630 		{
  3631 		FbsStartup();
  3632 		error = RFbsSession::Connect();
  3633 		}
  3634 	CActiveScheduler* scheduler = new(ELeave) CActiveScheduler;
  3635 	CActiveScheduler::Install(scheduler);
  3636 	test(error == KErrNone);
  3637 	test.Start(_L("CTextView tests"));
  3638 	TRAP(error, RunTestTextViewL());
  3639 	test(error == KErrNone);
  3640 	test.Next(_L(" @SYMTestCaseID:SYSLIB-FORM-CT-4014 RunPDEF118831TestL "));
  3641 	TRAP(error, RunPDEF118831TestL());
  3642 	test(error == KErrNone);
  3643 	test.Next(_L("Directionality tests"));
  3644 	TRAP(error, RunDirectionalityTestL());
  3645 	test(error == KErrNone);
  3646 	test.Next(_L("Inline offsets test"));
  3647 	TRAP(error, CTestTextView::TestMemberOffsetsL());
  3648 	test(error == KErrNone);
  3649 	TRAP(error, CTestTextLayout::TestMemberOffsetsL());
  3650 	test(error == KErrNone);
  3651 	test.Next(_L("Test fix for defect INC020329"));
  3652 	TRAP(error, RunTestINC020329L());
  3653 	test(error == KErrNone);
  3654 	test.Next(_L(" @SYMTestCaseID:SYSLIB-FORM-CT-1861 Test fix for defect PDEF085280 "));
  3655 	TRAP(error, RunTestPDEF085280L());
  3656 	test(error == KErrNone);
  3657 	test.Next(_L(" @SYMTestCaseID:SYSLIB-FORM-UT-3162 Test fix for defect PDEF097387 "));
  3658 	TRAP(error, SetupAndRunPDEF097387TestL());
  3659 	test(error == KErrNone);
  3660 	test.Next(_L(" @SYMTestCaseID:SYSLIB-FORM-UT-3241 Test fix for defect PDEF098569 "));
  3661 	TRAP(error, RunPDEF098569TestL());
  3662 	test(error == KErrNone);
  3663 	test.Next(_L(" @SYMTestCaseID:SYSLIB-FORM-UT-3345 Test fix for defect INC099424 "));
  3664 	TRAP(error, RunINC099424TestL());
  3665 	test(error == KErrNone);
  3666 	test.Next(_L(" @SYMTestCaseID:SYSLIB-FORM-CT-3754 Test fix for defect INC109995 & DEF118277 "));
  3667 	TRAP(error, RunINC109995TestL());
  3668 	test(error == KErrNone);
  3669 	test.Next(_L(" @SYMTestCaseID:SYSLIB-FORM-CT-4003 Test fix for defect PDEF112004 "));
  3670 	TRAP(error, RunPDEF112004TestL());
  3671 	test(error == KErrNone);
  3672 	test.Next(_L(" @SYMTestCaseID:SYSLIB-FORM-CT-4001 Test fix for defect INC112423 "));
  3673 	TRAP(error, RunINC112423TestL());
  3674 	test(error == KErrNone);
  3675 	test.Next(_L(" @SYMTestCaseID:SYSLIB-FORM-CT-4005 Test fix for defect PDEF114862 "));
  3676 	TRAP(error, RunPDEF114862TestL());
  3677 	test(error == KErrNone);
  3678 	test.Next(_L(" @SYMTestCaseID:SYSLIB-FORM-CT-4008 Test fix for defect INC116681 "));
  3679 	TRAP(error, RunINC116681TestL());
  3680 	test(error == KErrNone);
  3681 	test.Next(_L(" @SYMTestCaseID:SYSLIB-FORM-CT-4019 Test fix for defect DEF122198 "));
  3682 	TRAP(error, RunDEF122198_1TestL());
  3683 	test(error == KErrNone);
  3684 	TRAP(error, RunDEF122198_2TestL());
  3685 	test(error == KErrNone);
  3686 	test.Next(_L(" @SYMTestCaseID:SYSLIB-FORM-CT-4020 Test fix for defect INC123427 "));
  3687 	TRAP(error, RunINC123427TestL());
  3688 	test(error == KErrNone);
  3689 	test.Next(_L(" @SYMTestCaseID:SYSLIB-FORM-UT-4018 Test fix for defect PDEF123018"));
  3690 	TRAP(error, RunPDEF123018TestL());
  3691 	test(error == KErrNone);
  3692 
  3693 	RFbsSession::Disconnect();
  3694 	delete scheduler;
  3695 	delete TrapCleanup;
  3696 	test.End();
  3697 	test.Close();
  3698 	return error;
  3699 	}