graphicsdeviceinterface/gdi/tgdi/TGlyphSel.cpp
changeset 183 6a1564a2f3e6
parent 168 2bd88482bfe5
child 194 18f84489a694
equal deleted inserted replaced
168:2bd88482bfe5 183:6a1564a2f3e6
     1 // Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
       
     2 // All rights reserved.
       
     3 // This component and the accompanying materials are made available
       
     4 // under the terms of "Eclipse Public License v1.0"
       
     5 // which accompanies this distribution, and is available
       
     6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     7 //
       
     8 // Initial Contributors:
       
     9 // Nokia Corporation - initial contribution.
       
    10 //
       
    11 // Contributors:
       
    12 //
       
    13 // Description:
       
    14 // This is a unit test module which defines the test code that 
       
    15 // exercise CFont::GetCharacterPosition() functionality.
       
    16 // 
       
    17 //
       
    18 
       
    19 /**
       
    20  @file
       
    21  @test
       
    22  @internalComponent
       
    23 */
       
    24 
       
    25 
       
    26 //
       
    27 // -- INCLUDE FILES ---------------------------------------------------------
       
    28 //
       
    29 
       
    30 
       
    31 #include <e32std.h>
       
    32 #include <biditext.h>
       
    33 #include <bidi.h>
       
    34 #include <linebreak.h>
       
    35 #include <bidivisual.h>
       
    36 #include "GlyphSel.h"
       
    37 #include "TGlyphSel.h"
       
    38 #include <graphics/openfontconstants.h>
       
    39 #include <graphics/openfontrasterizer.h>
       
    40 
       
    41 
       
    42 //
       
    43 // -- CONSTANTS -------------------------------------------------------------
       
    44 //
       
    45 
       
    46 /**
       
    47  This define when set introduces a delay to start up to allow Glowcode to
       
    48  be set up to collect statistics.
       
    49 */
       
    50 //#define _GLOWCODE_LAUNCH_DELAY 1
       
    51 
       
    52 
       
    53 /** RTest object for unit test output */
       
    54 //RTest TEST(_L("TGlyphSel - CFont Glyph Selection"));
       
    55 
       
    56 /** Thread name for test cases involving a new thread. */
       
    57 _LIT(KThread2NameFirst, "GlyphSelPanicTest_First");
       
    58 _LIT(KThread2NameSecond, "GlyphSelPanicTest_Second");
       
    59 
       
    60 /*Beginning of Indic language font file constants declaration*/
       
    61 
       
    62 _LIT16(KTestHindiFontFile, "C:\\TNR_Dev_OT.ttf");
       
    63 _LIT16(KTestHindiFontFaceName, "Devanagari OT Eval");
       
    64 
       
    65 //_LIT16(KTestIndicFontFile, "C:\\s60ssb_v435.ttf");
       
    66 _LIT16(KTestIndicFontFile, "C:\\s60ssb_v500.ttf");
       
    67 _LIT16(KTestIndicFontFaceName, "Series 60 Sans");
       
    68 
       
    69 //_LIT16(KTestTeluguFontFile, "C:\\s60ssb_v500.ttf");
       
    70 //_LIT16(KTestTeluguFontFaceName, "Series 60 Sans");
       
    71 
       
    72 _LIT16(KTestGB18030FontFile, "C:\\TestExtB.ttf");
       
    73 _LIT16(KTestGB18030FontFaceName, "Test Font for CJK ExtB");
       
    74 
       
    75 /*End of Indic language font file constants declaration*/
       
    76 //
       
    77 // -- THAI TEST DATA --------------------------------------------------------
       
    78 //
       
    79 
       
    80 
       
    81 /**
       
    82  An array of Thai characters each of which is individually passed into
       
    83  GetCharacterPosition() for testing.
       
    84 */
       
    85 LOCAL_D const TText16 Thai_SimpleChars[] = {
       
    86 	 // Digits test 0..9
       
    87 	0x0E50, 0x0E51, 0x0E52, 0x0E53, 0x0E54,
       
    88 	0x0E55, 0x0E56, 0x0E57, 0x0E58, 0x0E59,
       
    89 
       
    90 	// Consonants
       
    91 	0x0E01, 0x0E02, 0x0E03, 0x0E04, 0x0E05, 0x0E06, 0x0E07, 
       
    92 	0x0E08, 0x0E09, 0x0E0A, 0x0E0B, 0x0E0C, 0x0E0D, 0x0E0E, 0x0E0F, 
       
    93 	0x0E10, 0x0E11, 0x0E12, 0x0E13, 0x0E14, 0x0E15, 0x0E16, 0x0E17, 
       
    94 	0x0E18, 0x0E19, 0x0E1A, 0x0E1B, 0x0E1C, 0x0E1D, 0x0E1E, 0x0E1F, 
       
    95 	0x0E20, 0x0E21, 0x0E22, 0x0E23, 0x0E24, 0x0E25, 0x0E26, 0x0E27, 
       
    96 	0x0E28, 0x0E29, 0x0E2A, 0x0E2B, 0x0E2C, 0x0E2D, 0x0E2E, 
       
    97 
       
    98 	// Independent vowels
       
    99 	0x0E30, 0x0E32, // 0x0E33, Sara Am decomposed, not simple
       
   100 	0x0E40, 0x0E41, 0x0E42, 0x0E43, 0x0E44, 
       
   101 
       
   102 	// Independent signs
       
   103 	0x0E2F, 0x0E3F, 0x0E45, 0x0E46, 0x0E4F, 0x0E5A, 0x0E5B, 
       
   104 
       
   105 	// Array end
       
   106 	0xFFFF,
       
   107 	};
       
   108 
       
   109 /**
       
   110  Data structure used to hold the in and out data of one invoke
       
   111  of the CFont::GetCharacterPosition() API.
       
   112 */
       
   113 struct TTestInput_PositionParam
       
   114 	{
       
   115 	TInt	iTextLen;
       
   116 	TText16	iText[4];
       
   117 	TInt	iPosInText;
       
   118 	TInt	oPosInText;
       
   119 	TInt	oOutputLen;
       
   120 	TText16	oOutput[CFont::TPositionParam::EMaxOutputGlyphs];
       
   121 	};
       
   122 
       
   123 /**
       
   124  This array of structs is used in the test routine 
       
   125  CTGlyphSelection::TestThai_ValidGlyphClusters() for verifying
       
   126  GetCharacterPosition() constructs Thai PUA glyph clusters correctly.
       
   127 */
       
   128 LOCAL_D const TTestInput_PositionParam Thai_ValidGlyphClusters[] = {
       
   129 //    --INPUT----------------			--OUTPUT----------------------
       
   130 
       
   131 //  TEST A1..A8 handled in Thai_SimpleChars table.
       
   132 
       
   133 //0.TEST A9 - Decomposed SARA AM
       
   134 	{ 2, {0x0E01, 0x0E33}, 1,			2, 1, {0x0E33}},
       
   135 	{ 2, {0x0E1B, 0x0E33}, 1,			2, 2, {0xF711, 0x0E32}},
       
   136 	{ 2, {0x0E41, 0x0E33}, 1,			2, 2, {KUnicodeDottedCircle, 0x0E33}},
       
   137 	{ 1, {0x0E33}, 0,					1, 2, {KUnicodeDottedCircle, 0x0E33}},
       
   138 	{ 3, {0x0E19, 0x0E49, 0x0E33}, 0,	3, 4, {0x0E19, 0x0E4D, 0x0E49, 0x0E32}},
       
   139 
       
   140 //5.TEST A9.1 - SARA AM exlcuded from cluster when vowel present
       
   141 	{ 3, {0x0E19, 0x0E35, 0x0E33}, 0,           2, 2, {0x0E19, 0x0E35}},
       
   142 	{ 3, {0x0E19, 0x0E39, 0x0E33}, 0,           2, 2, {0x0E19, 0x0E39}},
       
   143 	{ 4, {0x0E19, 0x0E35, 0x0E48, 0x0E33}, 0,   3, 3, {0x0E19, 0x0E35, 0x0E48}},
       
   144 
       
   145 //8.TEST B1 - Normal right aligned vowel/sign above short consonant
       
   146 	{ 2, {0x0E04, 0x0E35}, 0,			2, 2, {0x0E04, 0x0E35}},
       
   147 	{ 2, {0x0E01, 0x0E4D}, 0,			2, 2, {0x0E01, 0x0E4D}},
       
   148 
       
   149 //10.TEST B2 - Left aligned vowel/sign above tall consonant
       
   150 	{ 2, {0x0E1B, 0x0E34}, 0,			2, 2, {0x0E1B, 0xF701}},
       
   151 	{ 2, {0x0E1D, 0x0E35}, 0,			2, 2, {0x0E1D, 0xF702}},
       
   152 	{ 2, {0x0E1F, 0x0E36}, 0,			2, 2, {0x0E1F, 0xF703}},
       
   153 	{ 2, {0x0E2C, 0x0E37}, 0,			2, 2, {0x0E2C, 0xF704}},
       
   154 	{ 2, {0x0E1B, 0x0E31}, 0,			2, 2, {0x0E1B, 0xF710}},
       
   155 	{ 2, {0x0E1D, 0x0E4D}, 0,			2, 2, {0x0E1D, 0xF711}},
       
   156 	{ 2, {0x0E1F, 0x0E47}, 0,			2, 2, {0x0E1F, 0xF712}},
       
   157 	
       
   158 //17.TEST B3 - Normal right aligned vowel below short consonant
       
   159 	{ 2, {0x0E2C, 0x0E3A}, 0,			2, 2, {0x0E2C, 0x0E3A}},
       
   160 	{ 2, {0x0E0C, 0x0E38}, 0,			2, 2, {0x0E0C, 0x0E38}},
       
   161 
       
   162 //19.TEST B4 - Vowel below consonant with joint decender 
       
   163 	{ 2, {0x0E0E, 0x0E38}, 0,			2, 2, {0x0E0E, 0xF718}},
       
   164 	{ 2, {0x0E0F, 0x0E39}, 0,			2, 2, {0x0E0F, 0xF719}},
       
   165 	{ 2, {0x0E0F, 0x0E3A}, 0,			2, 2, {0x0E0F, 0xF71A}},
       
   166 	{ 2, {0x0E24, 0x0E38}, 0,			2, 2, {0x0E24, 0xF718}},
       
   167 	{ 2, {0x0E26, 0x0E39}, 0,			2, 2, {0x0E26, 0xF719}},
       
   168 
       
   169 //24.TEST B5 - Vowel below consonant with disjoint decender
       
   170 	{ 2, {0x0E10, 0x0E38}, 0,			2, 2, {0xF700, 0x0E38}},
       
   171 	{ 2, {0x0E0D, 0x0E39}, 0,			2, 2, {0xF70F, 0x0E39}},
       
   172 	{ 2, {0x0E10, 0x0E3A}, 0,			2, 2, {0xF700, 0x0E3A}},
       
   173  
       
   174 //27.TEST C1 - Tone mark/sign above short consonant
       
   175 	{ 2, {0x0E14, 0x0E48}, 0,			2, 2, {0x0E14, 0xF70A}},
       
   176 	{ 2, {0x0E16, 0x0E49}, 0,			2, 2, {0x0E16, 0xF70B}},
       
   177 	{ 2, {0x0E17, 0x0E4A}, 0,			2, 2, {0x0E17, 0xF70C}},
       
   178 	{ 2, {0x0E19, 0x0E4B}, 0,			2, 2, {0x0E19, 0xF70D}},
       
   179 	{ 2, {0x0E20, 0x0E4C}, 0,			2, 2, {0x0E20, 0xF70E}},
       
   180 	// with lower vowel char in between the two?
       
   181 	{ 3, {0x0E16, 0x0E39, 0x0E49}, 0,	3, 3, {0x0E16, 0x0E39, 0xF70B}},
       
   182 
       
   183 //33.TEST C2 - Upper Vowel & tone makr/sign above short consonant
       
   184 	{ 3, {0x0E01, 0x0E34, 0x0E48}, 0,	3, 3, {0x0E01, 0x0E34, 0x0E48}},
       
   185 	{ 3, {0x0E02, 0x0E35, 0x0E49}, 0,	3, 3, {0x0E02, 0x0E35, 0x0E49}},
       
   186 	{ 3, {0x0E04, 0x0E36, 0x0E4A}, 0,	3, 3, {0x0E04, 0x0E36, 0x0E4A}},
       
   187 	{ 3, {0x0E08, 0x0E37, 0x0E4B}, 0,	3, 3, {0x0E08, 0x0E37, 0x0E4B}},
       
   188 	{ 3, {0x0E09, 0x0E34, 0x0E4C}, 0,	3, 3, {0x0E09, 0x0E34, 0x0E4C}},
       
   189 	{ 3, {0x0E11, 0x0E47, 0x0E4C}, 0,	2, 2, {0x0E11, 0x0E47}},
       
   190 
       
   191 //39.TEST C2.1 - Lower Vowel & tone makr/sign above short consonant
       
   192 	{ 3, {0x0E01, 0x0E38, 0x0E48}, 0,	3, 3, {0x0E01, 0x0E38, 0xF70A}},
       
   193 	{ 3, {0x0E02, 0x0E39, 0x0E49}, 0,	3, 3, {0x0E02, 0x0E39, 0xF70B}},
       
   194 	{ 3, {0x0E04, 0x0E38, 0x0E4A}, 0,	3, 3, {0x0E04, 0x0E38, 0xF70C}},
       
   195 	{ 3, {0x0E08, 0x0E39, 0x0E4B}, 0,	3, 3, {0x0E08, 0x0E39, 0xF70D}},
       
   196 	{ 3, {0x0E09, 0x0E38, 0x0E4C}, 0,	3, 3, {0x0E09, 0x0E38, 0xF70E}},
       
   197 	{ 3, {0x0E09, 0x0E39, 0x0E4C}, 0,	2, 2, {0x0E09, 0x0E39}},
       
   198 
       
   199 //45.TEST C3 - Left aligned tone mark/sign above tall consonant
       
   200 	{ 2, {0x0E1B, 0x0E48}, 0,			2, 2, {0x0E1B, 0xF705}},
       
   201 	{ 2, {0x0E1D, 0x0E49}, 0,			2, 2, {0x0E1D, 0xF706}},
       
   202 	{ 2, {0x0E1F, 0x0E4A}, 0,			2, 2, {0x0E1F, 0xF707}},
       
   203 	{ 2, {0x0E2C, 0x0E4B}, 0,			2, 2, {0x0E2C, 0xF708}},
       
   204 	{ 2, {0x0E1B, 0x0E4C}, 0,			2, 2, {0x0E1B, 0xF709}},
       
   205 
       
   206 //50.TEST C4 - Left aligned vowel & tone mark/sign above tall consonant
       
   207 	{ 3, {0x0E1B, 0x0E34, 0x0E48}, 0,	3, 3, {0x0E1B, 0xF701, 0xF713}},
       
   208 	{ 3, {0x0E1D, 0x0E35, 0x0E49}, 0,	3, 3, {0x0E1D, 0xF702, 0xF714}},
       
   209 	{ 3, {0x0E1F, 0x0E36, 0x0E4A}, 0,	3, 3, {0x0E1F, 0xF703, 0xF715}},
       
   210 	{ 3, {0x0E2C, 0x0E37, 0x0E4B}, 0,	3, 3, {0x0E2C, 0xF704, 0xF716}},
       
   211 	{ 3, {0x0E1B, 0x0E34, 0x0E4C}, 0,	3, 3, {0x0E1B, 0xF701, 0xF717}},
       
   212 
       
   213 //55. INC043221 - Tone marks are not readable with tall consonants and Sara Am
       
   214 // Test that the nikhahit part of a sara am causes the same effects as top
       
   215 // vowels.
       
   216 // Test 4 already does one suitable test.
       
   217 	{ 3, {0x0E1B, 0x0E49, 0x0E33}, 0,	3, 4, {0x0E1B, 0xF711, 0xF714, 0x0E32}},
       
   218 
       
   219 //56. INC127996 - Tone mark/diacritic displayed incorrectly when combinded 
       
   220 //	with long tail consonanat and below vowel. Test that in context 
       
   221 //	'short consonanat + below vowel + Tone Mark/diacritic', mark/diacritic
       
   222 //	can be replaced by corresonding PUA code.
       
   223 	{ 3, {0x0E0D, 0x0E39, 0x0E49}, 0, 	3, 3, {0xF70F, 0x0E39, 0xF70B}},
       
   224 	{ 3, {0x0E0E, 0x0E38, 0x0E48}, 0,	3, 3, {0x0E0E, 0xF718, 0xF70A}},
       
   225 	{ 3, {0x0E0F, 0x0E39, 0x0E4A}, 0,	3, 3, {0x0E0F, 0xF719, 0xF70C}},
       
   226 	{ 3, {0x0E26, 0x0E39, 0x0E4B}, 0,	3, 3, {0x0E26, 0xF719, 0xF70D}},
       
   227 	{ 3, {0x0E24, 0x0E38, 0x0E49}, 0,	3, 3, {0x0E24, 0xF718, 0xF70B}},
       
   228 	{ 3, {0x0E10, 0x0E38, 0x0E4C}, 0,	3, 3, {0xF700, 0x0E38, 0xF70E}},
       
   229 
       
   230 //62.TABLE END
       
   231 	{ -1, {0}, -1,						-1, 0, {0}}
       
   232 	};
       
   233 
       
   234 /**
       
   235  Data structure used to hold the in and out data of two invokes
       
   236  of the CFont::GetCharacterPosition() API.
       
   237 */
       
   238 struct TTestInput_Invoke
       
   239 	{
       
   240 	TInt                iPosInText;
       
   241 	TInt				oPosInText;
       
   242 	TInt				oOutputLen;
       
   243 	TText16				oOutput[CFont::TPositionParam::EMaxOutputGlyphs];
       
   244 	};
       
   245 
       
   246 /**
       
   247  Data structure used to hold the in and out data of two invokes
       
   248  of the CFont::GetCharacterPosition() API.
       
   249 */
       
   250 struct TTestInput_PositionParam2
       
   251 	{
       
   252 	TInt				iTextLen;
       
   253 	TText16				iText[4];
       
   254 	TTestInput_Invoke   oOut[2];
       
   255 	};
       
   256 
       
   257 /**
       
   258  Data structure used to hold the in and out data of two invokes
       
   259  of the CFont::GetCharacterPosition() API.
       
   260 */
       
   261 struct TTestInput_PositionParam6
       
   262 	{
       
   263 	TInt				iTextLen;
       
   264 	TText16				iText[6];
       
   265 	TTestInput_Invoke   oOut[6];
       
   266 	};
       
   267 
       
   268 //	{-1, 1, 1, {0} } } indicate end of sequence
       
   269 //	The most significant bit of glyph index is trimmed off when stored
       
   270 LOCAL_D const TTestInput_PositionParam6 Indic_GurmukhiDigit[] = {
       
   271 		{ 1, {0x0a66}, { {0, 1, 1, {0x12fe} }, {-1, 1, 1, {0} } } },
       
   272 		{ 1, {0x0a67}, { {0, 1, 1, {0x12ff} }, {-1, 1, 1, {0} } } },
       
   273 		{ 1, {0x0a68}, { {0, 1, 1, {0x1300} }, {-1, 1, 1, {0} } } },
       
   274 		{ 1, {0x0a69}, { {0, 1, 1, {0x1301} }, {-1, 1, 1, {0} } } },
       
   275 		{ 1, {0x0a6a}, { {0, 1, 1, {0x1302} }, {-1, 1, 1, {0} } } },
       
   276 		{ 1, {0x0a6b}, { {0, 1, 1, {0x1303} }, {-1, 1, 1, {0} } } },
       
   277 		{ 1, {0x0a6c}, { {0, 1, 1, {0x1304} }, {-1, 1, 1, {0} } } },
       
   278 		{ 1, {0x0a6d}, { {0, 1, 1, {0x1305} }, {-1, 1, 1, {0} } } },
       
   279 		{ 1, {0x0a6e}, { {0, 1, 1, {0x1306} }, {-1, 1, 1, {0} } } },
       
   280 		{ 1, {0x0a6f}, { {0, 1, 1, {0x1307} }, {-1, 1, 1, {0} } } },
       
   281 		//	Consonant + digit
       
   282 		{ 2, {0x0a15, 0x0a66}, { {0, 1, 1, {0x12cd}}, {1, 2, 1, {0x12fe}}, {-1, 1, 1, {0} } } },
       
   283 		{ 2, {0x0a17, 0x0a67}, { {0, 1, 1, {0x12cf}}, {1, 2, 1, {0x12ff}}, {-1, 1, 1, {0} } } },
       
   284 		{ 2, {0x0a19, 0x0a68}, { {0, 1, 1, {0x12d1}}, {1, 2, 1, {0x1300}}, {-1, 1, 1, {0} } } },
       
   285 		{ 2, {0x0a25, 0x0a69}, { {0, 1, 1, {0x12dd}}, {1, 2, 1, {0x1301}}, {-1, 1, 1, {0} } } },
       
   286 		{ 2, {0x0a27, 0x0a6a}, { {0, 1, 1, {0x12df}}, {1, 2, 1, {0x1302}}, {-1, 1, 1, {0} } } },
       
   287 		{ 2, {0x0a28, 0x0a6b}, { {0, 1, 1, {0x12e0}}, {1, 2, 1, {0x1303}}, {-1, 1, 1, {0} } } },
       
   288 		{ 2, {0x0a29, 0x0a6c}, { {0, 1, 1, {0x0000}}, {1, 2, 1, {0x1304}}, {-1, 1, 1, {0} } } },
       
   289 		{ 2, {0x0a3a, 0x0a6d}, { {0, 1, 1, {0x0000}}, {1, 2, 1, {0x1305}}, {-1, 1, 1, {0} } } },
       
   290 		{ 2, {0x0a3b, 0x0a6e}, { {0, 1, 1, {0x0000}}, {1, 2, 1, {0x1306}}, {-1, 1, 1, {0} } } },
       
   291 		{ 2, {0x0a3c, 0x0a6f}, { {0, 1, 2, {0x058f, 0x12ee}}, {1, 2, 1, {0x1307}}, {-1, 1, 1, {0} } } },
       
   292 		//	Modifier + digit
       
   293 		{ 2, {0x0a3e, 0x0a66}, { {0, 1, 2, {0x058f, 0x12ef}}, {1, 2, 1, {0x12fe}}, {-1, 1, 1, {0} } } },
       
   294 		{ 2, {0x0a3e, 0x0a67}, { {0, 1, 2, {0x058f, 0x12ef}}, {1, 2, 1, {0x12ff}}, {-1, 1, 1, {0} } } },
       
   295 		{ 2, {0x0a3e, 0x0a68}, { {0, 1, 2, {0x058f, 0x12ef}}, {1, 2, 1, {0x1300}}, {-1, 1, 1, {0} } } },
       
   296 		{ 2, {0x0a3e, 0x0a69}, { {0, 1, 2, {0x058f, 0x12ef}}, {1, 2, 1, {0x1301}}, {-1, 1, 1, {0} } } },
       
   297 		{ 2, {0x0a3e, 0x0a6a}, { {0, 1, 2, {0x058f, 0x12ef}}, {1, 2, 1, {0x1302}}, {-1, 1, 1, {0} } } },
       
   298 		{ 2, {0x0a3e, 0x0a6b}, { {0, 1, 2, {0x058f, 0x12ef}}, {1, 2, 1, {0x1303}}, {-1, 1, 1, {0} } } },
       
   299 		{ 2, {0x0a3e, 0x0a6c}, { {0, 1, 2, {0x058f, 0x12ef}}, {1, 2, 1, {0x1304}}, {-1, 1, 1, {0} } } },
       
   300 		{ 2, {0x0a3e, 0x0a6d}, { {0, 1, 2, {0x058f, 0x12ef}}, {1, 2, 1, {0x1305}}, {-1, 1, 1, {0} } } },
       
   301 		{ 2, {0x0a3e, 0x0a6e}, { {0, 1, 2, {0x058f, 0x12ef}}, {1, 2, 1, {0x1306}}, {-1, 1, 1, {0} } } },
       
   302 		{ 2, {0x0a3e, 0x0a6f}, { {0, 1, 2, {0x058f, 0x12ef}}, {1, 2, 1, {0x1307}}, {-1, 1, 1, {0} } } },
       
   303 		//	Vowel + digit
       
   304 		{ 2, {0x0a73, 0x0a66}, { {0, 1, 1, {0x130b}}, {1, 2, 1, {0x12fe}}, {-1, 1, 1, {0} } } },
       
   305 		{ 2, {0x0a73, 0x0a67}, { {0, 1, 1, {0x130b}}, {1, 2, 1, {0x12ff}}, {-1, 1, 1, {0} } } },
       
   306 		{ 2, {0x0a73, 0x0a68}, { {0, 1, 1, {0x130b}}, {1, 2, 1, {0x1300}}, {-1, 1, 1, {0} } } },
       
   307 		{ 2, {0x0a73, 0x0a69}, { {0, 1, 1, {0x130b}}, {1, 2, 1, {0x1301}}, {-1, 1, 1, {0} } } },
       
   308 		{ 2, {0x0a73, 0x0a6a}, { {0, 1, 1, {0x130b}}, {1, 2, 1, {0x1302}}, {-1, 1, 1, {0} } } },
       
   309 		{ 2, {0x0a73, 0x0a6b}, { {0, 1, 1, {0x130b}}, {1, 2, 1, {0x1303}}, {-1, 1, 1, {0} } } },
       
   310 		{ 2, {0x0a73, 0x0a6c}, { {0, 1, 1, {0x130b}}, {1, 2, 1, {0x1304}}, {-1, 1, 1, {0} } } },
       
   311 		{ 2, {0x0a73, 0x0a6d}, { {0, 1, 1, {0x130b}}, {1, 2, 1, {0x1305}}, {-1, 1, 1, {0} } } },
       
   312 		{ 2, {0x0a73, 0x0a6e}, { {0, 1, 1, {0x130b}}, {1, 2, 1, {0x1306}}, {-1, 1, 1, {0} } } },
       
   313 		{ 2, {0x0a73, 0x0a6f}, { {0, 1, 1, {0x130b}}, {1, 2, 1, {0x1307}}, {-1, 1, 1, {0} } } },
       
   314 		//	Virama + digit
       
   315 		{ 2, {0x0a4d, 0x0a66}, { {0, 1, 2, {0x058f, 0x12f8}}, {1, 2, 1, {0x12fe}}, {-1, 1, 1, {0} } } },
       
   316 		{ 2, {0x0a4d, 0x0a67}, { {0, 1, 2, {0x058f, 0x12f8}}, {1, 2, 1, {0x12ff}}, {-1, 1, 1, {0} } } },
       
   317 		{ 2, {0x0a4d, 0x0a68}, { {0, 1, 2, {0x058f, 0x12f8}}, {1, 2, 1, {0x1300}}, {-1, 1, 1, {0} } } },
       
   318 		{ 2, {0x0a4d, 0x0a69}, { {0, 1, 2, {0x058f, 0x12f8}}, {1, 2, 1, {0x1301}}, {-1, 1, 1, {0} } } },
       
   319 		{ 2, {0x0a4d, 0x0a6a}, { {0, 1, 2, {0x058f, 0x12f8}}, {1, 2, 1, {0x1302}}, {-1, 1, 1, {0} } } },
       
   320 		{ 2, {0x0a4d, 0x0a6b}, { {0, 1, 2, {0x058f, 0x12f8}}, {1, 2, 1, {0x1303}}, {-1, 1, 1, {0} } } },
       
   321 		{ 2, {0x0a4d, 0x0a6c}, { {0, 1, 2, {0x058f, 0x12f8}}, {1, 2, 1, {0x1304}}, {-1, 1, 1, {0} } } },
       
   322 		{ 2, {0x0a4d, 0x0a6d}, { {0, 1, 2, {0x058f, 0x12f8}}, {1, 2, 1, {0x1305}}, {-1, 1, 1, {0} } } },
       
   323 		{ 2, {0x0a4d, 0x0a6e}, { {0, 1, 2, {0x058f, 0x12f8}}, {1, 2, 1, {0x1306}}, {-1, 1, 1, {0} } } },
       
   324 		{ 2, {0x0a4d, 0x0a6f}, { {0, 1, 2, {0x058f, 0x12f8}}, {1, 2, 1, {0x1307}}, {-1, 1, 1, {0} } } },
       
   325 		//	Consonant + digit + Matra
       
   326 		{ 3, {0x0a15, 0x0a66, 0x0a3e}, { {0, 1, 1, {0x12cd}}, {1, 2, 1, {0x12fe}}, {2, 3, 2, {0x058f, 0x12ef}}, {-1, 1, 1, {0} } } },
       
   327 		{ 3, {0x0a16, 0x0a67, 0x0a3e}, { {0, 1, 1, {0x12ce}}, {1, 2, 1, {0x12ff}}, {2, 3, 2, {0x058f, 0x12ef}}, {-1, 1, 1, {0} } } },
       
   328 		{ 3, {0x0a17, 0x0a68, 0x0a3e}, { {0, 1, 1, {0x12cf}}, {1, 2, 1, {0x1300}}, {2, 3, 2, {0x058f, 0x12ef}}, {-1, 1, 1, {0} } } },
       
   329 		{ 3, {0x0a18, 0x0a69, 0x0a3e}, { {0, 1, 1, {0x12d0}}, {1, 2, 1, {0x1301}}, {2, 3, 2, {0x058f, 0x12ef}}, {-1, 1, 1, {0} } } },
       
   330 		{ 3, {0x0a19, 0x0a6a, 0x0a3e}, { {0, 1, 1, {0x12d1}}, {1, 2, 1, {0x1302}}, {2, 3, 2, {0x058f, 0x12ef}}, {-1, 1, 1, {0} } } },
       
   331 		{ 3, {0x0a25, 0x0a6b, 0x0a3e}, { {0, 1, 1, {0x12dd}}, {1, 2, 1, {0x1303}}, {2, 3, 2, {0x058f, 0x12ef}}, {-1, 1, 1, {0} } } },
       
   332 		{ 3, {0x0a2a, 0x0a6c, 0x0a3e}, { {0, 1, 1, {0x12e1}}, {1, 2, 1, {0x1304}}, {2, 3, 2, {0x058f, 0x12ef}}, {-1, 1, 1, {0} } } },
       
   333 		{ 3, {0x0a2d, 0x0a6d, 0x0a3e}, { {0, 1, 1, {0x12e4}}, {1, 2, 1, {0x1305}}, {2, 3, 2, {0x058f, 0x12ef}}, {-1, 1, 1, {0} } } },
       
   334 		{ 3, {0x0a30, 0x0a6e, 0x0a3e}, { {0, 1, 1, {0x12e7}}, {1, 2, 1, {0x1306}}, {2, 3, 2, {0x058f, 0x12ef}}, {-1, 1, 1, {0} } } },
       
   335 		{ 3, {0x0a33, 0x0a6f, 0x0a3e}, { {0, 1, 1, {0x12e9}}, {1, 2, 1, {0x1307}}, {2, 3, 2, {0x058f, 0x12ef}}, {-1, 1, 1, {0} } } },
       
   336 		{ -1, {0}, -1,						-1, 0, {0}}
       
   337 };
       
   338 
       
   339 
       
   340 LOCAL_D const TTestInput_PositionParam6 Indic_MalayalamDigit[] = {
       
   341 		{ 1, {0x0d66}, { {0, 1, 1, {0x123e} }, {-1, 1, 1, {0} } }  },
       
   342 		{ 1, {0x0d67}, { {0, 1, 1, {0x123f} }, {-1, 1, 1, {0} }  } },
       
   343 		{ 1, {0x0d68}, { {0, 1, 1, {0x1240} }, {-1, 1, 1, {0} } } },
       
   344 		{ 1, {0x0d69}, { {0, 1, 1, {0x1241} }, {-1, 1, 1, {0} } } },
       
   345 		{ 1, {0x0d6a}, { {0, 1, 1, {0x1242} }, {-1, 1, 1, {0} } } },
       
   346 		{ 1, {0x0d6b}, { {0, 1, 1, {0x1243} }, {-1, 1, 1, {0} } } },
       
   347 		{ 1, {0x0d6c}, { {0, 1, 1, {0x1244} }, {-1, 1, 1, {0} } } },
       
   348 		{ 1, {0x0d6d}, { {0, 1, 1, {0x1245} }, {-1, 1, 1, {0} } } },
       
   349 		{ 1, {0x0d6e}, { {0, 1, 1, {0x1246} }, {-1, 1, 1, {0} } } },
       
   350 		{ 1, {0x0d6f}, { {0, 1, 1, {0x1247} }, {-1, 1, 1, {0} } } },
       
   351 		//	Consonant + digit
       
   352 		{ 2, {0x0d15, 0x0d66}, { {0, 1, 1, {0x120a}}, {1, 2, 1, {0x123e}}, {-1, 1, 1, {0} }  } },
       
   353 		{ 2, {0x0d15, 0x0d67}, { {0, 1, 1, {0x120a}}, {1, 2, 1, {0x123f}}, {-1, 1, 1, {0} }  } },
       
   354 		{ 2, {0x0d17, 0x0d68}, { {0, 1, 1, {0x120c}}, {1, 2, 1, {0x1240}}, {-1, 1, 1, {0} }  } },
       
   355 		{ 2, {0x0d19, 0x0d69}, { {0, 1, 1, {0x120e}}, {1, 2, 1, {0x1241}}, {-1, 1, 1, {0} }  } },
       
   356 		{ 2, {0x0d25, 0x0d6a}, { {0, 1, 1, {0x121a}}, {1, 2, 1, {0x1242}}, {-1, 1, 1, {0} }  } },
       
   357 		{ 2, {0x0d26, 0x0d6b}, { {0, 1, 1, {0x121b}}, {1, 2, 1, {0x1243}}, {-1, 1, 1, {0} }  } },
       
   358 		{ 2, {0x0d15, 0x0d6c}, { {0, 1, 1, {0x120a}}, {1, 2, 1, {0x1244}}, {-1, 1, 1, {0} }  } },
       
   359 		{ 2, {0x0d30, 0x0d6d}, { {0, 1, 1, {0x1224}}, {1, 2, 1, {0x1245}}, {-1, 1, 1, {0} }  } },
       
   360 		{ 2, {0x0d31, 0x0d6e}, { {0, 1, 1, {0x1225}}, {1, 2, 1, {0x1246}}, {-1, 1, 1, {0} }  } },
       
   361 		{ 2, {0x0d32, 0x0d6f}, { {0, 1, 1, {0x1226}}, {1, 2, 1, {0x1247}}, {-1, 1, 1, {0} }  } },
       
   362 		//	Modifier + digit
       
   363 		{ 2, {0x0d03, 0x0d66}, { {0, 1, 2, {0x058f, 0x11fb}}, {1, 2, 1, {0x123e}}, {-1, 1, 1, {0} }  } },
       
   364 		{ 2, {0x0d03, 0x0d67}, { {0, 1, 2, {0x058f, 0x11fb}}, {1, 2, 1, {0x123f}}, {-1, 1, 1, {0} }  } },
       
   365 		{ 2, {0x0d03, 0x0d68}, { {0, 1, 2, {0x058f, 0x11fb}}, {1, 2, 1, {0x1240}}, {-1, 1, 1, {0} }  } },
       
   366 		{ 2, {0x0d03, 0x0d69}, { {0, 1, 2, {0x058f, 0x11fb}}, {1, 2, 1, {0x1241}}, {-1, 1, 1, {0} }  } },
       
   367 		{ 2, {0x0d03, 0x0d6a}, { {0, 1, 2, {0x058f, 0x11fb}}, {1, 2, 1, {0x1242}}, {-1, 1, 1, {0} }  } },
       
   368 		{ 2, {0x0d02, 0x0d6b}, { {0, 1, 2, {0x058f, 0x11fa}}, {1, 2, 1, {0x1243}}, {-1, 1, 1, {0} }  } },
       
   369 		{ 2, {0x0d02, 0x0d6c}, { {0, 1, 2, {0x058f, 0x11fa}}, {1, 2, 1, {0x1244}}, {-1, 1, 1, {0} }  } },
       
   370 		{ 2, {0x0d02, 0x0d6d}, { {0, 1, 2, {0x058f, 0x11fa}}, {1, 2, 1, {0x1245}}, {-1, 1, 1, {0} }  } },
       
   371 		{ 2, {0x0d02, 0x0d6e}, { {0, 1, 2, {0x058f, 0x11fa}}, {1, 2, 1, {0x1246}}, {-1, 1, 1, {0} }  } },
       
   372 		{ 2, {0x0d02, 0x0d6f}, { {0, 1, 2, {0x058f, 0x11fa}}, {1, 2, 1, {0x1247}}, {-1, 1, 1, {0} }  } },
       
   373 		//	Vowel + digit
       
   374 		{ 2, {0x0d3e, 0x0d66}, { {0, 1, 2, {0x058f, 0x122e}}, {1, 2, 1, {0x123e}}, {-1, 1, 1, {0} }  } },
       
   375 		{ 2, {0x0d3f, 0x0d67}, { {0, 1, 2, {0x058f, 0x122f}}, {1, 2, 1, {0x123f}}, {-1, 1, 1, {0} }  } },
       
   376 		{ 2, {0x0d40, 0x0d68}, { {0, 1, 2, {0x058f, 0x1230}}, {1, 2, 1, {0x1240}}, {-1, 1, 1, {0} }  } },
       
   377 		{ 2, {0x0d41, 0x0d69}, { {0, 1, 2, {0x058f, 0x1231}}, {1, 2, 1, {0x1241}}, {-1, 1, 1, {0} }  } },
       
   378 		{ 2, {0x0d42, 0x0d6a}, { {0, 1, 2, {0x058f, 0x1232}}, {1, 2, 1, {0x1242}}, {-1, 1, 1, {0} }  } },
       
   379 		{ 2, {0x0d43, 0x0d6b}, { {0, 1, 2, {0x058f, 0x1233}}, {1, 2, 1, {0x1243}}, {-1, 1, 1, {0} }  } },
       
   380 		{ 2, {0x0d46, 0x0d6c}, { {0, 1, 2, {0x1234, 0x058f}}, {1, 2, 1, {0x1244}}, {-1, 1, 1, {0} }  } },
       
   381 		{ 2, {0x0d47, 0x0d6d}, { {0, 1, 2, {0x1235, 0x058f}}, {1, 2, 1, {0x1245}}, {-1, 1, 1, {0} }  } },
       
   382 		{ 2, {0x0d48, 0x0d6e}, { {0, 1, 2, {0x1236, 0x058f}}, {1, 2, 1, {0x1246}}, {-1, 1, 1, {0} }  } },
       
   383 		{ 2, {0x0d4c, 0x0d6f}, { {0, 1, 2, {0x058f, 0x123b}}, {1, 2, 1, {0x1247}}, {-1, 1, 1, {0} }  } },
       
   384 		//	Virama + digit
       
   385 		{ 2, {0x0d4d, 0x0d66}, { {0, 1, 2, {0x058f, 0x123a}}, {1, 2, 1, {0x123e}}, {-1, 1, 1, {0} }  } },
       
   386 		{ 2, {0x0d4d, 0x0d67}, { {0, 1, 2, {0x058f, 0x123a}}, {1, 2, 1, {0x123f}}, {-1, 1, 1, {0} }  } },
       
   387 		{ 2, {0x0d4d, 0x0d68}, { {0, 1, 2, {0x058f, 0x123a}}, {1, 2, 1, {0x1240}}, {-1, 1, 1, {0} }  } },
       
   388 		{ 2, {0x0d4d, 0x0d69}, { {0, 1, 2, {0x058f, 0x123a}}, {1, 2, 1, {0x1241}}, {-1, 1, 1, {0} }  } },
       
   389 		{ 2, {0x0d4d, 0x0d6a}, { {0, 1, 2, {0x058f, 0x123a}}, {1, 2, 1, {0x1242}}, {-1, 1, 1, {0} }  } },
       
   390 		{ 2, {0x0d4d, 0x0d6b}, { {0, 1, 2, {0x058f, 0x123a}}, {1, 2, 1, {0x1243}}, {-1, 1, 1, {0} }  } },
       
   391 		{ 2, {0x0d4d, 0x0d6c}, { {0, 1, 2, {0x058f, 0x123a}}, {1, 2, 1, {0x1244}}, {-1, 1, 1, {0} }  } },
       
   392 		{ 2, {0x0d4d, 0x0d6d}, { {0, 1, 2, {0x058f, 0x123a}}, {1, 2, 1, {0x1245}}, {-1, 1, 1, {0} }  } },
       
   393 		{ 2, {0x0d4d, 0x0d6e}, { {0, 1, 2, {0x058f, 0x123a}}, {1, 2, 1, {0x1246}}, {-1, 1, 1, {0} }  } },
       
   394 		{ 2, {0x0d4d, 0x0d6f}, { {0, 1, 2, {0x058f, 0x123a}}, {1, 2, 1, {0x1247}}, {-1, 1, 1, {0} }  } },
       
   395 		//	Consonant + digit + Matra
       
   396 		{ 3, {0x0d15, 0x0d66, 0x0d3e}, { {0, 1, 1, {0x120a}}, {1, 2, 1, {0x123e}}, {2, 3, 2, {0x058f, 0x122e}}, {-1, 1, 1, {0} }  } },
       
   397 		{ 3, {0x0d20, 0x0d67, 0x0d3f}, { {0, 1, 1, {0x1215}}, {1, 2, 1, {0x123f}}, {2, 3, 2, {0x058f, 0x122f}}, {-1, 1, 1, {0} }  } },
       
   398 		{ 3, {0x0d22, 0x0d68, 0x0d40}, { {0, 1, 1, {0x1217}}, {1, 2, 1, {0x1240}}, {2, 3, 2, {0x058f, 0x1230}}, {-1, 1, 1, {0} }  } },
       
   399 		{ 3, {0x0d27, 0x0d69, 0x0d41}, { {0, 1, 1, {0x121c}}, {1, 2, 1, {0x1241}}, {2, 3, 2, {0x058f, 0x1231}}, {-1, 1, 1, {0} }  } },
       
   400 		{ 3, {0x0d28, 0x0d6a, 0x0d42}, { {0, 1, 1, {0x121d}}, {1, 2, 1, {0x1242}}, {2, 3, 2, {0x058f, 0x1232}}, {-1, 1, 1, {0} }  } },
       
   401 		{ 3, {0x0d2A, 0x0d6b, 0x0d43}, { {0, 1, 1, {0x121e}}, {1, 2, 1, {0x1243}}, {2, 3, 2, {0x058f, 0x1233}}, {-1, 1, 1, {0} }  } },
       
   402 		{ 3, {0x0d2D, 0x0d6c, 0x0d46}, { {0, 1, 1, {0x1221}}, {1, 2, 1, {0x1244}}, {2, 3, 2, {0x1234, 0x058f}}, {-1, 1, 1, {0} }  } },
       
   403 		{ 3, {0x0d32, 0x0d6d, 0x0d47}, { {0, 1, 1, {0x1226}}, {1, 2, 1, {0x1245}}, {2, 3, 2, {0x1235, 0x058f}}, {-1, 1, 1, {0} }  } },
       
   404 		{ 3, {0x0d34, 0x0d6e, 0x0d48}, { {0, 1, 1, {0x1228}}, {1, 2, 1, {0x1246}}, {2, 3, 2, {0x1236, 0x058f}}, {-1, 1, 1, {0} }  } },
       
   405 		{ 3, {0x0d39, 0x0d6f, 0x0d4a}, { {0, 1, 1, {0x122d}}, {1, 2, 1, {0x1247}}, {2, 3, 3, {0x1234, 0x058f, 0x122e}}, {-1, 1, 1, {0} }  } },
       
   406 		{ -1, {0}, -1,						-1, 0, {0}}
       
   407 };
       
   408 
       
   409 LOCAL_D const TTestInput_PositionParam6 Indic_GurmukhiAndLatin[] = {
       
   410 		//	Gurmukhi sequence + Latin
       
   411 		{ 3, {0x0a05, 0x0a70, 0x0077}, { {0, 2, 2, {0x12c3, 0x1308}}, {1, 2, 1, {0x1308}}, {2, 3, 1, {0x0077}}, {-1, 1, 1, {0} } } },
       
   412 		//	Latin + Gurmukhi sequence
       
   413 		{ 3, {0x0063, 0x0a19, 0x0a48}, { {0, 1, 1, {0x0063}}, {1, 3, 2, {0x12d1, 0x12f5}}, {2, 3, 1, {0x12f5}}, {-1, 1, 1, {0} } } },
       
   414 		{ 3, {0x0064, 0x0a3f, 0x0a71}, { {0, 1, 1, {0x0064}}, {1, 2, 2, {0x12f0, 0x058f}}, {2, 3, 2, {0x058f, 0x1309}}, {-1, 1, 1, {0} } } },
       
   415 		{ 3, {0x0066, 0x0a69, 0x0a3e}, { {0, 1, 1, {0x0066}}, {1, 2, 1, {0x1301}}, {2, 3, 2, {0x058f, 0x12ef}}, {-1, 1, 1, {0} } } },
       
   416 		{ 3, {0x0068, 0x0a6a, 0x0a3e}, { {0, 1, 1, {0x0068}}, {1, 2, 1, {0x1302}}, {2, 3, 2, {0x058f, 0x12ef}}, {-1, 1, 1, {0} } } },
       
   417 		{ 3, {0x002e, 0x0a6b, 0x0a3e}, { {0, 1, 1, {0x0772}}, {1, 2, 1, {0x1303}}, {2, 3, 2, {0x058f, 0x12ef}}, {-1, 1, 1, {0} } } },
       
   418 		{ 3, {0x0074, 0x0a6c, 0x0a3e}, { {0, 1, 1, {0x0074}}, {1, 2, 1, {0x1304}}, {2, 3, 2, {0x058f, 0x12ef}}, {-1, 1, 1, {0} } } },
       
   419 		{ 3, {0x002c, 0x0a6d, 0x0a3e}, { {0, 1, 1, {0x0770}}, {1, 2, 1, {0x1305}}, {2, 3, 2, {0x058f, 0x12ef}}, {-1, 1, 1, {0} } } },
       
   420 		{ 3, {0x0078, 0x0a6e, 0x0a3e}, { {0, 1, 1, {0x0078}}, {1, 2, 1, {0x1306}}, {2, 3, 2, {0x058f, 0x12ef}}, {-1, 1, 1, {0} } } },
       
   421 		{ 3, {0x007a, 0x0a6f, 0x0a3e}, { {0, 1, 1, {0x007a}}, {1, 2, 1, {0x1307}}, {2, 3, 2, {0x058f, 0x12ef}}, {-1, 1, 1, {0} } } },
       
   422 		{ 3, {0x0a6f, 0x0a3e, 0x0078}, { {0, 1, 1, {0x1307}}, {1, 2, 2, {0x058f, 0x12ef}}, {2, 3, 1, {0x0078}}, {-1, 1, 1, {0} } } },
       
   423 		{ 3, {0x0a6f, 0x0a3e, 0x002e}, { {0, 1, 1, {0x1307}}, {1, 2, 2, {0x058f, 0x12ef}}, {2, 3, 1, {0x0772}}, {-1, 1, 1, {0} } } },
       
   424 		{ 3, {0x0a6f, 0x0a3e, 0x0066}, { {0, 1, 1, {0x1307}}, {1, 2, 2, {0x058f, 0x12ef}}, {2, 3, 1, {0x0066}}, {-1, 1, 1, {0} } } },
       
   425 		{ -1, {0}, -1,						-1, 0, {0}}
       
   426 };
       
   427 
       
   428 
       
   429 LOCAL_D const TTestInput_PositionParam6 Indic_MalayalamAndLatin[] = {
       
   430 		//	Malayalam sequence + Latin
       
   431 		//{ 3, {0x0d05, 0x0d70, 0x0077}, { {0, 1, 1, {0x11fc}}, {1, 2, 1, {0x0000}}, {2, 3, 1, {0x0077}}, {-1, 1, 1, {0} }  } },
       
   432 		//	Latin + Malayalam sequence
       
   433 		{ 3, {0x0063, 0x0d19, 0x0d48}, { {0, 1, 1, {0x0063}}, {1, 3, 2, {0x1236, 0x120e}}, {2, 3, 1, {0x1236}}, {-1, 1, 1, {0} }  } },
       
   434 		{ 3, {0x0066, 0x0d69, 0x0d3e}, { {0, 1, 1, {0x0066}}, {1, 2, 1, {0x1241}}, {2, 3, 2, {0x058f, 0x122e}}, {-1, 1, 1, {0} }  } },
       
   435 		{ 3, {0x0068, 0x0d6a, 0x0d3e}, { {0, 1, 1, {0x0068}}, {1, 2, 1, {0x1242}}, {2, 3, 2, {0x058f, 0x122e}}, {-1, 1, 1, {0} }  } },
       
   436 		{ 3, {0x002e, 0x0d6b, 0x0d3e}, { {0, 1, 1, {0x0c87}}, {1, 2, 1, {0x1243}}, {2, 3, 2, {0x058f, 0x122e}}, {-1, 1, 1, {0} }  } },
       
   437 		{ 3, {0x0074, 0x0d6c, 0x0d3e}, { {0, 1, 1, {0x0074}}, {1, 2, 1, {0x1244}}, {2, 3, 2, {0x058f, 0x122e}}, {-1, 1, 1, {0} }  } },
       
   438 		{ 3, {0x002c, 0x0d6d, 0x0d3e}, { {0, 1, 1, {0x0c85}}, {1, 2, 1, {0x1245}}, {2, 3, 2, {0x058f, 0x122e}}, {-1, 1, 1, {0} }  } },
       
   439 		{ 3, {0x0078, 0x0d6e, 0x0d3e}, { {0, 1, 1, {0x0078}}, {1, 2, 1, {0x1246}}, {2, 3, 2, {0x058f, 0x122e}}, {-1, 1, 1, {0} }  } },
       
   440 		{ 3, {0x007a, 0x0d6f, 0x0d3e}, { {0, 1, 1, {0x007a}}, {1, 2, 1, {0x1247}}, {2, 3, 2, {0x058f, 0x122e}}, {-1, 1, 1, {0} }  } },
       
   441 		{ -1, {0}, -1,						-1, 0, {0}}
       
   442 };
       
   443 
       
   444 
       
   445 LOCAL_D const TTestInput_PositionParam6 Indic_GurmukhiModifierAfterConsonantViramaZWJ[] = {
       
   446 		//	Consonant + Virama + ZWJ + Modifier
       
   447 		{ 4, {0x0a15, 0x0a4d, 0x200d, 0x0A01}, { {0, 4, 2, {0x1335, 0x12c0}}, {1, 2, 0, {0x0000}}, {2, 4, 1, {0x12c0}}, {3, 4, 1, {0x12c0}}, {-1, 1, 1, {0} } } },
       
   448 		{ 4, {0x0a16, 0x0a4d, 0x200d, 0x0A02}, { {0, 4, 2, {0x1336, 0x12c1}}, {1, 2, 0, {0x0000}}, {2, 4, 1, {0x12c1}}, {3, 4, 1, {0x12c1}}, {-1, 1, 1, {0} } } },
       
   449 		{ 4, {0x0a17, 0x0a4d, 0x200d, 0x0A03}, { {0, 4, 2, {0x1337, 0x12c2}}, {1, 2, 0, {0x0000}}, {2, 4, 1, {0x12c2}}, {3, 4, 1, {0x12c2}}, {-1, 1, 1, {0} } } },
       
   450 		{ 4, {0x0a18, 0x0a4d, 0x200d, 0x0A70}, { {0, 4, 2, {0x1338, 0x1308}}, {1, 2, 0, {0x0000}}, {2, 4, 1, {0x1308}}, {3, 4, 1, {0x1308}}, {-1, 1, 1, {0} } } },
       
   451 		{ -1, {0}, -1,						-1, 0, {0}}
       
   452 };
       
   453 
       
   454 
       
   455 LOCAL_D const TTestInput_PositionParam6 Indic_MalayalamModifierAfterConsonantViramaZWJ[] = {
       
   456 		//	Consonant + Virama + ZWJ + Modifier
       
   457 		{ 4, {0x0d15, 0x0d4d, 0x200d, 0x0d02}, { {0, 4, 2, {0x1248, 0x11fa}}, {1, 2, 0, {0x0000}}, {2, 4, 1, {0x11fa}}, {3, 4, 1, {0x11fa}}, {-1, 1, 1, {0} }  } },
       
   458 		{ 4, {0x0d25, 0x0d4d, 0x200d, 0x0d02}, { {0, 4, 2, {0x1258, 0x11fa}}, {1, 2, 0, {0x0000}}, {2, 4, 1, {0x11fa}}, {3, 4, 1, {0x11fa}}, {-1, 1, 1, {0} }  } },
       
   459 		{ 4, {0x0d33, 0x0d4d, 0x200d, 0x0d03}, { {0, 3, 1, {0x1275}}, {1, 2, 0, {0x0000}}, {2, 4, 1, {0x11fb}}, {3, 4, 1, {0x11fb}}, {-1, 1, 1, {0} }  } },
       
   460 		{ 4, {0x0d34, 0x0d4d, 0x200d, 0x0d03}, { {0, 4, 2, {0x1266, 0x11fb}}, {1, 2, 0, {0x0000}}, {2, 4, 1, {0x11fb}}, {3, 4, 1, {0x11fb}}, {-1, 1, 1, {0} }  } },
       
   461 		{ -1, {0}, -1,						-1, 0, {0}}
       
   462 };
       
   463 
       
   464 LOCAL_D const TTestInput_PositionParam6 Indic_GurmukhiConsonantLeading[] = {
       
   465 		//	Consonant + Nukta
       
   466 		{ 2, {0x0a17, 0x0A3C}, { {0, 2, 1, {0x12fa}}, {-1, 1, 1, {0} } } },
       
   467 		//	Consonant + dependent vowel, two sequences to check context shaping
       
   468 		{ 2, {0x0a15, 0x0A4C}, { {0, 2, 2, {0x12cd, 0x12f7}}, {1, 2, 1, {0x12f7}}, {-1, 1, 1, {0} } } },
       
   469 		{ 2, {0x0a16, 0x0A4C}, { {0, 2, 2, {0x12ce, 0x12f7}}, {1, 2, 1, {0x12f7}}, {-1, 1, 1, {0} } } },
       
   470 		//	Consonant + Matra /i/, and other Matras
       
   471 		{ 2, {0x0a16, 0x0A3f}, { {0, 2, 2, {0x12f0, 0x12ce}}, {1, 2, 1, {0x12f0}}, {-1, 1, 1, {0} } } },
       
   472 		{ 2, {0x0a16, 0x0A3e}, { {0, 2, 2, {0x12ce, 0x12ef}}, {1, 2, 1, {0x12ef}}, {-1, 1, 1, {0} } } },
       
   473 		{ 2, {0x0a16, 0x0A40}, { {0, 2, 2, {0x12ce, 0x12f1}}, {1, 2, 1, {0x12f1}}, {-1, 1, 1, {0} } } },
       
   474 		{ 2, {0x0a16, 0x0A41}, { {0, 2, 2, {0x12ce, 0x12f2}}, {1, 2, 1, {0x12f2}}, {-1, 1, 1, {0} } } },
       
   475 		{ 2, {0x0a16, 0x0A42}, { {0, 2, 2, {0x12ce, 0x12f3}}, {1, 2, 1, {0x12f3}}, {-1, 1, 1, {0} } } },
       
   476 		{ 2, {0x0a16, 0x0A43}, { {0, 1, 1, {0x12ce}}, {1, 2, 1, {0x0000}}, {-1, 1, 1, {0} } } },
       
   477 		{ 2, {0x0a16, 0x0A44}, { {0, 1, 1, {0x12ce}}, {1, 2, 1, {0x0000}}, {-1, 1, 1, {0} } } },
       
   478 		{ 2, {0x0a16, 0x0A45}, { {0, 1, 1, {0x12ce}}, {1, 2, 1, {0x0000}}, {-1, 1, 1, {0} } } },
       
   479 		{ 2, {0x0a16, 0x0A46}, { {0, 1, 1, {0x12ce}}, {1, 2, 1, {0x0000}}, {-1, 1, 1, {0} } } },
       
   480 		{ 2, {0x0a16, 0x0A47}, { {0, 2, 2, {0x12ce, 0x12f4}}, {1, 2, 1, {0x12f4}}, {-1, 1, 1, {0} } } },
       
   481 		{ 2, {0x0a16, 0x0A48}, { {0, 2, 2, {0x12ce, 0x12f5}}, {1, 2, 1, {0x12f5}}, {-1, 1, 1, {0} } } },
       
   482 		{ 2, {0x0a16, 0x0A49}, { {0, 1, 1, {0x12ce}}, {1, 2, 1, {0x0000}}, {-1, 1, 1, {0} } } },
       
   483 		{ 2, {0x0a16, 0x0A4a}, { {0, 1, 1, {0x12ce}}, {1, 2, 1, {0x0000}}, {-1, 1, 1, {0} } } },
       
   484 		{ 2, {0x0a16, 0x0A4b}, { {0, 2, 2, {0x12ce, 0x12f6}}, {1, 2, 1, {0x12f6}}, {-1, 1, 1, {0} } } },
       
   485 		{ 2, {0x0a16, 0x0A4c}, { {0, 2, 2, {0x12ce, 0x12f7}}, {1, 2, 1, {0x12f7}}, {-1, 1, 1, {0} } } },
       
   486 		//0d24 + 0d4d + 0d30
       
   487 		//0d28 + 0d4d + //0d24 + 0d4d + 0d30
       
   488 		//0d38 + 0d4d + //0d15 + 0d4d + 0d30
       
   489 		//	Consonant + Virama + HA(RA/VA/YA)
       
   490 		{ 3, {0x0a15, 0x0a4d, 0x0a39}, { {0, 3, 2, {0x12cd, 0x1331}}, {1, 2, 0, {0x0000}}, {2, 3, 1, {0x1331}}, {-1, 1, 1, {0} } } },
       
   491 		{ 3, {0x0a15, 0x0a4d, 0x0a30}, { {0, 3, 1, {0x13e7}}, {-1, 1, 1, {0} } } },
       
   492 		{ 3, {0x0a15, 0x0a4d, 0x0a35}, { {0, 3, 2, {0x1399, 0x1333}}, {1, 2, 0, {0x0000}}, {2, 3, 1, {0x1333}}, {-1, 1, 1, {0} } } },
       
   493 		{ 3, {0x0a15, 0x0a4d, 0x0a2f}, { {0, 3, 2, {0x12cd, 0x1373}}, {1, 2, 0, {0x0000}}, {2, 3, 1, {0x1373}}, {-1, 1, 1, {0} } } },
       
   494 		//	Consonant + Addak
       
   495 		{ 2, {0x0a16, 0x0A71}, { {0, 2, 2, {0x12ce, 0x1309}}, {1, 2, 1, {0x1309}}, {-1, 1, 1, {0} } } },
       
   496 		//	Consonant + bindi
       
   497 		{ 2, {0x0a16, 0x0A02}, { {0, 2, 2, {0x12ce, 0x12c1}}, {1, 2, 1, {0x12c1}}, {-1, 1, 1, {0} } } },
       
   498 		{ 3, {0x0a16, 0x0a40, 0x0A02}, { {0, 3, 2, {0x12ce, 0x13f0}}, {1, 2, 1, {0x13f0}}, {-1, 1, 1, {0} } } },
       
   499 		{ 3, {0x0a16, 0x0a4b, 0x0A02}, { {0, 3, 2, {0x12ce, 0x13f3}}, {1, 2, 1, {0x13f3}}, {-1, 1, 1, {0} } } },
       
   500 		//	Consonant + Tippi
       
   501 		{ 2, {0x0a25, 0x0A70}, { {0, 2, 2, {0x12dd, 0x1308}}, {1, 2, 1, {0x1308}}, {-1, 1, 1, {0} } } },
       
   502 		{ 3, {0x0a25, 0x0a3f, 0x0A70}, { {0, 3, 3, {0x12f0, 0x12dd, 0x1308}}, {1, 2, 1, {0x12f0}}, {2, 3, 1, {0x1308}}, {-1, 1, 1, {0} } } },
       
   503 		{ 3, {0x0a25, 0x0a41, 0x0A70}, { {0, 3, 3, {0x12dd, 0x12f2, 0x1308}}, {1, 2, 1, {0x12f2}}, {2, 3, 1, {0x1308}}, {-1, 1, 1, {0} } } },
       
   504 		//	Nukta, corresponding consonant, Nukta pair
       
   505 		{ 1, {0x0a33}, { {0, 1, 1, {0x12e9}}, {-1, 1, 1, {0} } } },
       
   506 		{ 2, {0x0a32, 0x0A3c}, { {0, 2, 1, {0x12e9}}, {-1, 1, 1, {0} } } },
       
   507 		{ 1, {0x0a36}, { {0, 1, 1, {0x12eb}},{-1, 1, 1, {0} } } },
       
   508 		{ 2, {0x0a38, 0x0A3c}, { {0, 2, 1, {0x12eb}}, {-1, 1, 1, {0} } } },
       
   509 		{ 1, {0x0a59}, { {0, 1, 1, {0x12f9}}, {-1, 1, 1, {0} } } },
       
   510 		{ 2, {0x0aa1, 0x0A3c}, { {0, 1, 1, {0x096e}}, {1, 2, 2, {0x058f, 0x12ee}}, {-1, 1, 1, {0} } } },
       
   511 		{ 1, {0x0a5a}, { {0, 1, 1, {0x12fa}}, {-1, 1, 1, {0} } } },
       
   512 		{ 2, {0x0a17, 0x0A3c}, { {0, 2, 1, {0x12fa}}, {-1, 1, 1, {0} } } },
       
   513 		{ 1, {0x0a5b}, { {0, 1, 1, {0x12fb}}, {-1, 1, 1, {0} } } },
       
   514 		{ 2, {0x0a1c, 0x0A3c}, { {0, 2, 1, {0x12fb}}, {-1, 1, 1, {0} } } },
       
   515 		{ 1, {0x0a5e}, { {0, 1, 1, {0x12fd}}, {-1, 1, 1, {0} } } },
       
   516 		{ 2, {0x0a2b, 0x0A3c}, { {0, 2, 1, {0x12fd}}, {-1, 1, 1, {0} } } },
       
   517 		{ -1, {0}, -1,						-1, 0, {0}}
       
   518 };
       
   519 
       
   520 
       
   521 
       
   522 LOCAL_D const TTestInput_PositionParam6 Indic_MalayalamConsonantLeading[] = {
       
   523 		//	Consonant, and its split representation
       
   524 		{ 2, {0x0d15, 0x0d14}, { {0, 1, 1, {0x120a}}, {1, 2, 1, {0x1209}}, {-1, 1, 1, {0} }  } },
       
   525 		{ 3, {0x0d15, 0x0d12, 0x0d57}, { {0, 1, 1, {0x120a}}, {1, 3, 3, {0x1207, 0x058f, 0x123b}}, {2, 3, 2, {0x058f, 0x123b}}, {-1, 1, 1, {0} }  } },
       
   526 		
       
   527 		{ 2, {0x0d15, 0x0d4a}, { {0, 2, 3, {0x1234, 0x120a, 0x122e}}, {1, 2, 2, {0x1234, 0x122e}}, {-1, 1, 1, {0} }  } },
       
   528 		{ 3, {0x0d15, 0x0d46, 0x0d3e}, { {0, 3, 3, {0x1234, 0x120a, 0x122e}}, {1, 2, 1, {0x1234}}, {2, 3, 1, {0x122e}}, {-1, 1, 1, {0} }  } },
       
   529 
       
   530 		{ 2, {0x0d17, 0x0d4b}, { {0, 2, 3, {0x1235, 0x120c, 0x122e}}, {1, 2, 2, {0x1235, 0x122e}}, {-1, 1, 1, {0} } } },
       
   531 		{ 3, {0x0d17, 0x0d47, 0x0d3e}, { {0, 3, 3, {0x1235, 0x120c, 0x122e}}, {1, 2, 1, {0x1235}}, {2, 3, 1, {0x122e}}, {-1, 1, 1, {0} }  } },
       
   532 
       
   533 		{ 2, {0x0d19, 0x0d4c}, { {0, 2, 2, {0x120e, 0x123b}}, {1, 2, 1, {0x123b}}, {-1, 1, 1, {0} } } },
       
   534 		{ 3, {0x0d19, 0x0d46, 0x0d57}, { {0, 3, 2, {0x120e, 0x123b}}, {1, 2, 0, {0x0000}}, {2, 3, 1, {0x123b}}, {-1, 1, 1, {0} }  } },
       
   535 
       
   536 		//	Consonant + dependent vowel, two sequences to check context shaping
       
   537 		{ 2, {0x0d15, 0x0d0a}, { {0, 1, 1, {0x120a}}, {1, 2, 1, {0x1201}}, {-1, 1, 1, {0} }  } },
       
   538 		{ 2, {0x0d16, 0x0d0a}, { {0, 1, 1, {0x120b}}, {1, 2, 1, {0x1201}}, {-1, 1, 1, {0} }  } },
       
   539 		
       
   540 		//	Consonant + Matra /-e/, /-ee/, /-ai/ 
       
   541 		{ 2, {0x0d16, 0x0d46}, { {0, 2, 2, {0x1234, 0x120b}}, {1, 2, 1, {0x1234}}, {-1, 1, 1, {0} }  } },
       
   542 		{ 2, {0x0d17, 0x0d47}, { {0, 2, 2, {0x1235, 0x120c}}, {1, 2, 1, {0x1235}}, {-1, 1, 1, {0} }  } },
       
   543 		{ 2, {0x0d18, 0x0d48}, { {0, 2, 2, {0x1236, 0x120d}}, {1, 2, 1, {0x1236}}, {-1, 1, 1, {0} }  } },
       
   544 		
       
   545 		//	Consonant and Matras /-o/, /-oo/, /-au/ to shaper
       
   546 		//	Consonant and 0x0d4c (first form of Matra /-au/ ) to shaper,
       
   547 		//	Consonant, 0x0d46 and 0x0d57 (second form of Matra /-au/) to shaper002E
       
   548 		{ 2, {0x0d16, 0x0d4A}, { {0, 2, 3, {0x1234, 0x120b, 0x122e}}, {1, 2, 2, {0x1234, 0x122e}}, {-1, 1, 1, {0} }  } },
       
   549 		{ 2, {0x0d17, 0x0d4B}, { {0, 2, 3, {0x1235, 0x120c, 0x122e}}, {1, 2, 2, {0x1235, 0x122e}}, {-1, 1, 1, {0} }  } },
       
   550 		{ 2, {0x0d18, 0x0d4C}, { {0, 2, 2, {0x120d, 0x123b}}, {1, 2, 1, {0x123b}}, {-1, 1, 1, {0} }  } },
       
   551 		{ 3, {0x0d15, 0x0d46, 0x0d57}, { {0, 3, 2, {0x120a, 0x123b}}, {1, 2, 0, {0x0000}}, {2, 3, 1, {0x123b}}, {-1, 1, 1, {0} }  } },
       
   552 		
       
   553 		//	Consonant + 0x0d4d + Consonant
       
   554 		{ 3, {0x0d15, 0x0d4d, 0x0d15}, { {0, 3, 1, {0x1277}}, {-1, 1, 1, {0} }  } },
       
   555 		{ 4, {0x0d31, 0x0d4d, 0x0d31, 0x0d4d}, { {0, 4, 2, {0x12a7, 0x123a}}, {1, 2, 0, {0x0000}}, {2, 4, 1, {0x123a}}, {3, 4, 1, {0x123a}}, {-1, 1, 1, {0} }  } },
       
   556 		
       
   557 		//	Consonant (NNA, NA, RA, LA, LLA) + Virama + ZWJ to shaper
       
   558 		//	KA + Virama + ZWJ to shaper.
       
   559 		// 	other Consonant + Virama + ZWJ to shaper.
       
   560 		{ 3, {0x0d23, 0x0d4d, 0x200d}, { {0, 3, 1, {0x1272}}, {-1, 1, 1, {0} }  } },
       
   561 		{ 3, {0x0d28, 0x0d4d, 0x200d}, { {0, 3, 1, {0x1273}}, {-1, 1, 1, {0} }  } },
       
   562 		{ 3, {0x0d32, 0x0d4d, 0x200d}, { {0, 3, 1, {0x1276}}, {-1, 1, 1, {0} }  } },
       
   563 		{ 3, {0x0d33, 0x0d4d, 0x200d}, { {0, 3, 1, {0x1275}}, {-1, 1, 1, {0} }  } },
       
   564 		{ 3, {0x0d15, 0x0d4d, 0x200d}, { {0, 3, 1, {0x1248}}, {-1, 1, 1, {0} }  } },
       
   565 		{ 3, {0x0d16, 0x0d4d, 0x200d}, { {0, 3, 1, {0x1249}}, {-1, 1, 1, {0} }  } },
       
   566 		
       
   567 		//	RA + Virama + ZWJ to shaper,
       
   568 		//	RRA + Viram + ZWJ to shaper.
       
   569 		{ 3, {0x0d30, 0x0d4d, 0x200d}, { {0, 3, 1, {0x1274}}, {-1, 1, 1, {0} }  } },
       
   570 		{ 3, {0x0d31, 0x0d4d, 0x200d}, { {0, 3, 1, {0x1263}}, {-1, 1, 1, {0} }  } },
       
   571 		
       
   572 		//	Chillu and Modifier to shaper
       
   573 		//	Chillu and Virama to shaper
       
   574 		{ 4, {0x0d31, 0x0d4d, 0x200d, 0x0d05}, { {0, 3, 1, {0x1263}}, {1, 2, 0, {0x0000}}, {2, 3, 0, {0x0000}}, {3, 4, 1, {0x11fc}}, {-1, 1, 1, {0} } } },
       
   575 		{ 4, {0x0d15, 0x0d4d, 0x200d, 0x0d14}, { {0, 3, 1, {0x1248}}, {1, 2, 0, {0x0000}}, {2, 3, 0, {0x0000}}, {3, 4, 1, {0x1209}}, {-1, 1, 1, {0} } } },
       
   576 		{ 4, {0x0d31, 0x0d4d, 0x200d, 0x0d4d}, { {0, 3, 1, {0x1263}}, {1, 2, 0, {0x0000}}, {2, 4, 2, {0x058f, 0x123a}}, {3, 4, 2, {0x058f, 0x123a}}, {-1, 1, 1, {0} } } },
       
   577 		{ 4, {0x0d15, 0x0d4d, 0x200d, 0x0d4d}, { {0, 3, 1, {0x1248}}, {1, 2, 0, {0x0000}}, {2, 4, 2, {0x058f, 0x123a}}, {3, 4, 2, {0x058f, 0x123a}}, {-1, 1, 1, {0} } } },
       
   578 
       
   579 		//	AAR
       
   580 		{ 3, {0x0d06, 0x0d4d, 0x200d}, { {0, 1, 1, {0x11fd}}, {1, 2, 2, {0x058f, 0x123a}}, {-1, 1, 1, {0} }  } },
       
   581 		{ 2, {0x0d06, 0x0d4d}, { {0, 1, 1, {0x11fd}}, {1, 2, 2, {0x058f, 0x123a}}, {-1, 1, 1, {0} }  } },
       
   582 
       
   583 		//	K.KA, K.TA, K.SSA, G.NA, G.MA, 
       
   584 		//	NG.KA, NG.NGA, J.JA, J.NYA, NY.NYA, TT.TTA, NN.MA, T.BHA, T.MA, 
       
   585 		//	T.SA, D.DA, D.DHA, 
       
   586 		//	N.TA, N.DA, N.DHA, N.NA, 
       
   587 		//	M.PA, M.MA, 
       
   588 		//	SH.CA, S.THA, 
       
   589 		//	H.NA, H.MA and LL.LLA
       
   590 		{ 3, {0x0d15, 0x0d4d, 0x0d15}, { {0, 3, 1, {0x1277}}, {-1, 1, 1, {0} } } },
       
   591 		{ 3, {0x0d15, 0x0d4d, 0x0d24}, { {0, 3, 1, {0x1278}}, {-1, 1, 1, {0} } } },
       
   592 		{ 3, {0x0d15, 0x0d4d, 0x0d37}, { {0, 3, 1, {0x127b}}, {-1, 1, 1, {0} } } },
       
   593 		{ 3, {0x0d17, 0x0d4d, 0x0d28}, { {0, 3, 1, {0x127e}}, {-1, 1, 1, {0} } } },
       
   594 		{ 3, {0x0d17, 0x0d4d, 0x0d2e}, { {0, 3, 1, {0x127d}}, {-1, 1, 1, {0} } } },
       
   595 		{ 3, {0x0d19, 0x0d4d, 0x0d15}, { {0, 3, 1, {0x1280}}, {-1, 1, 1, {0} } } },
       
   596 		{ 3, {0x0d19, 0x0d4d, 0x0d19}, { {0, 3, 1, {0x1281}}, {-1, 1, 1, {0} } } },
       
   597 		{ 3, {0x0d1c, 0x0d4d, 0x0d1c}, { {0, 3, 1, {0x1284}}, {-1, 1, 1, {0} } } },
       
   598 		{ 3, {0x0d1c, 0x0d4d, 0x0d1e}, { {0, 3, 1, {0x1285}}, {-1, 1, 1, {0} } } },
       
   599 		{ 3, {0x0d1f, 0x0d4d, 0x0d1f}, { {0, 3, 1, {0x1288}}, {-1, 1, 1, {0} } } },
       
   600 		{ 3, {0x0d23, 0x0d4d, 0x0d2e}, { {0, 3, 1, {0x128b}}, {-1, 1, 1, {0} } } },
       
   601 		{ 3, {0x0d24, 0x0d4d, 0x0d2d}, { {0, 3, 1, {0x128e}}, {-1, 1, 1, {0} } } },
       
   602 		{ 3, {0x0d24, 0x0d4d, 0x0d2e}, { {0, 3, 1, {0x128f}}, {-1, 1, 1, {0} } } },
       
   603 		{ 3, {0x0d24, 0x0d4d, 0x0d38}, { {0, 3, 1, {0x1290}}, {-1, 1, 1, {0} } } },
       
   604 		{ 3, {0x0d26, 0x0d4d, 0x0d26}, { {0, 3, 1, {0x1293}}, {-1, 1, 1, {0} } } },
       
   605 		{ 3, {0x0d26, 0x0d4d, 0x0d27}, { {0, 3, 1, {0x1294}}, {-1, 1, 1, {0} } } },
       
   606 		{ 3, {0x0d28, 0x0d4d, 0x0d24}, { {0, 3, 1, {0x129a}}, {-1, 1, 1, {0} } } },
       
   607 		{ 3, {0x0d28, 0x0d4d, 0x0d26}, { {0, 3, 1, {0x1295}}, {-1, 1, 1, {0} } } },
       
   608 		{ 3, {0x0d28, 0x0d4d, 0x0d27}, { {0, 3, 1, {0x1296}}, {-1, 1, 1, {0} } } },
       
   609 		{ 3, {0x0d28, 0x0d4d, 0x0d28}, { {0, 3, 1, {0x1297}}, {-1, 1, 1, {0} } } },
       
   610 		{ 3, {0x0d2e, 0x0d4d, 0x0d2a}, { {0, 3, 1, {0x12a4}}, {-1, 1, 1, {0} } } },
       
   611 		{ 3, {0x0d2e, 0x0d4d, 0x0d2e}, { {0, 3, 1, {0x12a3}}, {-1, 1, 1, {0} } } },
       
   612 		{ 3, {0x0d36, 0x0d4d, 0x0d1a}, { {0, 3, 1, {0x12ab}}, {-1, 1, 1, {0} } } },
       
   613 		{ 3, {0x0d38, 0x0d4d, 0x0d25}, { {0, 3, 1, {0x12b1}}, {-1, 1, 1, {0} } } },
       
   614 		{ 3, {0x0d39, 0x0d4d, 0x0d28}, { {0, 3, 1, {0x12b4}}, {-1, 1, 1, {0} } } },
       
   615 		{ 3, {0x0d39, 0x0d4d, 0x0d2e}, { {0, 3, 1, {0x12b3}}, {-1, 1, 1, {0} } } },
       
   616 		{ 3, {0x0d33, 0x0d4d, 0x0d23}, { {0, 3, 2, {0x1265, 0x1218}}, {1, 2, 0, {0x0000}}, {2, 3, 1, {0x1218}}, {-1, 1, 1, {0} } } },
       
   617 		
       
   618 		//	One of (KA, GA, PA, BA, MA, LA, SHA, SA, HA), Virama and LA to shaper
       
   619 		{ 3, {0x0d15, 0x0d4d, 0x0d32}, { {0, 3, 1, {0x127a}}, {-1, 1, 1, {0} } } },
       
   620 		{ 3, {0x0d17, 0x0d4d, 0x0d32}, { {0, 3, 1, {0x127f}}, {-1, 1, 1, {0} } } },
       
   621 		{ 3, {0x0d2a, 0x0d4d, 0x0d32}, { {0, 3, 1, {0x129d}}, {-1, 1, 1, {0} } } },
       
   622 		{ 3, {0x0d2c, 0x0d4d, 0x0d32}, { {0, 3, 1, {0x12a2}}, {-1, 1, 1, {0} } } },
       
   623 		{ 3, {0x0d2e, 0x0d4d, 0x0d32}, { {0, 3, 1, {0x12a5}}, {-1, 1, 1, {0} } } },
       
   624 		{ 3, {0x0d32, 0x0d4d, 0x0d32}, { {0, 3, 1, {0x12a8}}, {-1, 1, 1, {0} } } },
       
   625 		{ 3, {0x0d36, 0x0d4d, 0x0d32}, { {0, 3, 1, {0x12ad}}, {-1, 1, 1, {0} } } },
       
   626 		{ 3, {0x0d38, 0x0d4d, 0x0d32}, { {0, 3, 1, {0x12b2}}, {-1, 1, 1, {0} } } },
       
   627 		{ 3, {0x0d39, 0x0d4d, 0x0d32}, { {0, 3, 1, {0x12b5}}, {-1, 1, 1, {0} } } },
       
   628 		
       
   629 		//	CA, Virama and CA to shaper
       
   630 		//	BA, Virama and BA to shaper
       
   631 		//	YA, Virama and YA to shaper
       
   632 		//	VA, Virama and VA to shaper
       
   633 		//	other Consonant, Virama and the same Consonant to shaper.
       
   634 		{ 3, {0x0d1a, 0x0d4d, 0x0d1a}, { {0, 3, 1, {0x1282}}, {-1, 1, 1, {0} } } },
       
   635 		{ 3, {0x0d2c, 0x0d4d, 0x0d2c}, { {0, 3, 1, {0x129f}}, {-1, 1, 1, {0} } } },
       
   636 		{ 3, {0x0d2f, 0x0d4d, 0x0d2f}, { {0, 3, 1, {0x12a6}}, {-1, 1, 1, {0} } } },
       
   637 		{ 3, {0x0d35, 0x0d4d, 0x0d35}, { {0, 3, 1, {0x12aa}}, {-1, 1, 1, {0} } } },
       
   638 		{ 3, {0x0d15, 0x0d4d, 0x0d15}, { {0, 3, 1, {0x1277}}, {-1, 1, 1, {0} } } },
       
   639 
       
   640 		//	G.GA, C.CHA, K.TTA, SS.TTA, DD.DDA, NN.NNA, B.DA, B.DHA, P.PA, RR.RRA, SH.SHA, S.SA clusters to shaper
       
   641 		{ 3, {0x0d17, 0x0d4d, 0x0d17}, { {0, 3, 1, {0x127c}}, {-1, 1, 1, {0} } } },
       
   642 		{ 3, {0x0d2c, 0x0d4d, 0x0d26}, { {0, 3, 1, {0x12a0}}, {-1, 1, 1, {0} } } },
       
   643 		{ 3, {0x0d1a, 0x0d4d, 0x0d1b}, { {0, 3, 1, {0x1283}}, {-1, 1, 1, {0} } } },
       
   644 		{ 3, {0x0d2c, 0x0d4d, 0x0d27}, { {0, 3, 1, {0x12a1}}, {-1, 1, 1, {0} } } },
       
   645 		{ 3, {0x0d15, 0x0d4d, 0x0d1f}, { {0, 3, 1, {0x1279}}, {-1, 1, 1, {0} } } },
       
   646 		{ 3, {0x0d2a, 0x0d4d, 0x0d2a}, { {0, 3, 1, {0x129c}}, {-1, 1, 1, {0} } } },
       
   647 		{ 3, {0x0d37, 0x0d4d, 0x0d1f}, { {0, 3, 1, {0x12ae}}, {-1, 1, 1, {0} } } },
       
   648 		{ 3, {0x0d31, 0x0d4d, 0x0d31}, { {0, 3, 1, {0x12a7}}, {-1, 1, 1, {0} } } },
       
   649 		{ 3, {0x0d21, 0x0d4d, 0x0d21}, { {0, 3, 1, {0x1289}}, {-1, 1, 1, {0} } } },
       
   650 		{ 3, {0x0d36, 0x0d4d, 0x0d36}, { {0, 3, 1, {0x12ac}}, {-1, 1, 1, {0} } } },
       
   651 		{ 3, {0x0d23, 0x0d4d, 0x0d23}, { {0, 3, 1, {0x128c}}, {-1, 1, 1, {0} } } },
       
   652 		{ 3, {0x0d38, 0x0d4d, 0x0d38}, { {0, 3, 1, {0x12b0}}, {-1, 1, 1, {0} } } },
       
   653 		
       
   654 		
       
   655 		//	Consonant clusters from REQ1.3.11 to shaper.
       
   656 		//	Already covered in other sequence
       
   657 		//	S.RR.RRA to shaper,
       
   658 		//	N.RR.RRA to shaper
       
   659 		{ 5, {0x0d38, 0x0d4d, 0x0d31, 0x0d4d, 0x0d31}, { {0, 5, 1, {0x12af}}, {-1, 1, 1, {0} } } },
       
   660 		{ 4, {0x0d28, 0x0d4d, 0x0d31, 0x0d31}, { {0, 3, 2, {0x125b, 0x1225}}, {1, 2, 0, {0x0000}}, {2, 3, 1, {0x1225}}, {3, 4, 1, {0x1225}}, {-1, 1, 1, {0} } } },
       
   661 		
       
   662 		//	N.RRA
       
   663 		{ 4, {0x0d28, 0x0d4d, 0x200d, 0x0d31}, { {0, 4, 1, {0x1299}}, {-1, 1, 1, {0} } } },
       
   664 		
       
   665 		//	NA, Virama, ZWJ, RRA to shaper
       
   666 		//	NA, Virama, ZWJ, ZWNJ, RRA to shaper
       
   667 		{ 4, {0x0d28, 0x0d4d, 0x200d, 0x0d31}, { {0, 4, 1, {0x1299}}, {-1, 1, 1, {0} } } },
       
   668 		{ 5, {0x0d28, 0x0d4d, 0x200d, 0x200c, 0x0d31}, { {0, 3, 1, {0x1273}}, {1, 2, 0, {0x0000}}, {2, 3, 0, {0x0000}}, {3, 4, 0, {0x0000}}, {4, 5, 1, {0x1225}}, {-1, 1, 1, {0} } } },
       
   669 		
       
   670 		//	Consonant cluster and YA to shaper
       
   671 		//	Consonant cluster and VA to shaper
       
   672 		{ 4, {0x0d15, 0x0d4d, 0x0d30, 0x0d3f}, { {0, 4, 3, {0x1271, 0x120a, 0x122f}}, {1, 2, 0, {0x0000}}, {2, 4, 2, {0x1271, 0x122f}}, {3, 4, 1, {0x122f}}, {-1, 1, 1, {0} } } },
       
   673 		{ 4, {0x0d15, 0x0d4d, 0x0d30, 0x0d35}, { {0, 3, 2, {0x1271, 0x120a}}, {1, 2, 0, {0x0000}}, {2, 3, 1, {0x1271}}, {3, 4, 1, {0x1229}}, {-1, 1, 1, {0} } } },
       
   674 		
       
   675 		//	YA, YAKAR to shaper
       
   676 		//	VA, VAKAR to shaper
       
   677 		{ 3, {0x0d15, 0x0d4d, 0x0d2f}, { {0, 3, 2, {0x120a, 0x126f}}, {1, 2, 0, {0x0000}}, {2, 3, 1, {0x126f}}, {-1, 1, 1, {0} } } },
       
   678 		{ 3, {0x0d15, 0x0d4d, 0x0d35}, { {0, 3, 2, {0x120a, 0x1270}}, {1, 2, 0, {0x0000}}, {2, 3, 1, {0x1270}}, {-1, 1, 1, {0} } } },
       
   679 		{ 5, {0x0d15, 0x0d4d, 0x0d30, 0x0d4d, 0x0d2f}, { {0, 5, 3, {0x1271, 0x120a, 0x126f}}, {1, 2, 0, {0x0000}}, {2, 5, 2, {0x1271, 0x126f}}, {3, 4, 0, {0x0000}}, {4, 5, 1, {0x126f}}, {-1, 1, 1, {0} } } },
       
   680 		{ 5, {0x0d15, 0x0d4d, 0x0d30, 0x0d4d, 0x0d35}, { {0, 5, 3, {0x1271, 0x120a, 0x1270}}, {1, 2, 0, {0x0000}}, {2, 5, 2, {0x1271, 0x1270}}, {3, 4, 0, {0x0000}}, {4, 5, 1, {0x1270}}, {-1, 1, 1, {0} } } },
       
   681 		{ 5, {0x0d15, 0x0d4d, 0x0d2f, 0x0d4d, 0x0d30}, { {0, 5, 3, {0x1248, 0x1271, 0x1223}}, {1, 2, 0, {0x0000}}, {2, 5, 2, {0x1271, 0x1223}}, {3, 4, 0, {0x0000}}, {4, 5, 1, {0x1271}}, {-1, 1, 1, {0} } } },
       
   682 		{ 5, {0x0d15, 0x0d4d, 0x0d35, 0x0d4d, 0x0d30}, { {0, 5, 3, {0x1248, 0x1271, 0x1229}}, {1, 2, 0, {0x0000}}, {2, 5, 2, {0x1271, 0x1229}}, {3, 4, 0, {0x0000}}, {4, 5, 1, {0x1271}}, {-1, 1, 1, {0} } } },
       
   683 
       
   684 		//	one of (LLA, LLLA, RRA) and YA to shaper
       
   685 		//	one of (LLA, LLLA, RRA) and VA to shaper
       
   686 		{ 2, {0x0d33, 0x0d2f}, { {0, 1, 1, {0x1227}}, {1, 2, 1, {0x1223}}, {-1, 1, 1, {0} } } },
       
   687 		{ 2, {0x0d34, 0x0d2f}, { {0, 1, 1, {0x1228}}, {1, 2, 1, {0x1223}}, {-1, 1, 1, {0} } } },
       
   688 		{ 2, {0x0d31, 0x0d2f}, { {0, 1, 1, {0x1225}}, {1, 2, 1, {0x1223}}, {-1, 1, 1, {0} } } },
       
   689 		{ 2, {0x0d33, 0x0d35}, { {0, 1, 1, {0x1227}}, {1, 2, 1, {0x1229}}, {-1, 1, 1, {0} } } },
       
   690 		{ 2, {0x0d34, 0x0d35}, { {0, 1, 1, {0x1228}}, {1, 2, 1, {0x1229}}, {-1, 1, 1, {0} } } },
       
   691 		{ 2, {0x0d31, 0x0d35}, { {0, 1, 1, {0x1225}}, {1, 2, 1, {0x1229}}, {-1, 1, 1, {0} } } },
       
   692 		//	KSSA
       
   693 		//0d15, 0d4d, 0d37
       
   694 		//	Consonant cluster and RA to shaper
       
   695 		{ 4, {0x0d15, 0x0d4d, 0x0d30, 0x0d30}, { {0, 3, 2, {0x1271, 0x120a}}, {1, 2, 0, {0x0000}}, {2, 3, 1, {0x1271}}, {3, 4, 1, {0x1224}}, {-1, 1, 1, {0} } } },
       
   696 
       
   697 		//	one of (LLA, LLLA, RRA) and RA to shaper
       
   698 		{ 2, {0x0d33, 0x0d30}, { {0, 1, 1, {0x1227}}, {1, 2, 1, {0x1224}}, {-1, 1, 1, {0} } } },
       
   699 		{ 2, {0x0d34, 0x0d30}, { {0, 1, 1, {0x1228}}, {1, 2, 1, {0x1224}}, {-1, 1, 1, {0} } } },
       
   700 		{ 2, {0x0d31, 0x0d30}, { {0, 1, 1, {0x1225}}, {1, 2, 1, {0x1224}}, {-1, 1, 1, {0} } } },
       
   701 		
       
   702 		//	YAKAR/VAKAR and RA to shaper.
       
   703 		{ 4, {0x0d15, 0x0d4d, 0x0d2f, 0x0d30}, { {0, 3, 2, {0x120a, 0x126f}}, {1, 2, 0, {0x0000}}, {2, 3, 1, {0x126f}}, {3, 4, 1, {0x1224}}, {-1, 1, 1, {0} } } },
       
   704 		{ 4, {0x0d15, 0x0d4d, 0x0d35, 0x0d30}, { {0, 3, 2, {0x120a, 0x1270}}, {1, 2, 0, {0x0000}}, {2, 3, 1, {0x1270}}, {3, 4, 1, {0x1224}}, {-1, 1, 1, {0} } } },
       
   705 
       
   706 		//	Chillu
       
   707 		//	Chillu and Vowel to shaper
       
   708 		//	Chillu and Consonant to shaper
       
   709 		//	Chillu and Modifier to shaper
       
   710 		//	Chillu and Virama to shaper
       
   711 		{ 4, {0x0d06, 0x0d23, 0x0d4d, 0x200d}, { {0, 1, 1, {0x11fd}}, {1, 4, 1, {0x1272}}, {2, 3, 0, {0x058f, 0x123a}}, {3, 4, 0, {0x0d30}}, {-1, 1, 1, {0} } } },
       
   712 		{ 4, {0x0d06, 0x0d28, 0x0d4d, 0x200d}, { {0, 1, 1, {0x11fd}}, {1, 4, 1, {0x1273}}, {2, 3, 0, {0x058f, 0x123a}}, {3, 4, 0, {0x0d30}}, {-1, 1, 1, {0} } } },
       
   713 		{ 4, {0x0d06, 0x0d30, 0x0d4d, 0x200d}, { {0, 1, 1, {0x11fd}}, {1, 4, 1, {0x1274}}, {2, 3, 0, {0x058f, 0x123a}}, {3, 4, 0, {0x0d30}}, {-1, 1, 1, {0} } } },
       
   714 		{ 4, {0x0d06, 0x0d32, 0x0d4d, 0x200d}, { {0, 1, 1, {0x11fd}}, {1, 4, 1, {0x1276}}, {2, 3, 0, {0x058f, 0x123a}}, {3, 4, 0, {0x0d30}}, {-1, 1, 1, {0} } } },
       
   715 		{ 4, {0x0d06, 0x0d33, 0x0d4d, 0x200d}, { {0, 1, 1, {0x11fd}}, {1, 4, 1, {0x1275}}, {2, 3, 0, {0x058f, 0x123a}}, {3, 4, 0, {0x0d30}}, {-1, 1, 1, {0} } } },
       
   716 
       
   717 		{ 4, {0x0d23, 0x0d4d, 0x200d, 0x0d06}, { {0, 3, 1, {0x1272}}, {1, 2, 0, {0x0000}}, {2, 3, 0, {0x0000}}, {3, 4, 1, {0x11fd}}, {-1, 1, 1, {0} } } },
       
   718 		{ 4, {0x0d28, 0x0d4d, 0x200d, 0x0d09}, { {0, 3, 1, {0x1273}}, {1, 2, 0, {0x0000}}, {2, 3, 0, {0x0000}}, {3, 4, 1, {0x1200}}, {-1, 1, 1, {0} } } },
       
   719 		{ 4, {0x0d30, 0x0d4d, 0x200d, 0x0d0a}, { {0, 3, 1, {0x1274}}, {1, 2, 0, {0x0000}}, {2, 3, 0, {0x0000}}, {3, 4, 1, {0x1201}}, {-1, 1, 1, {0} } } },
       
   720 		{ 4, {0x0d32, 0x0d4d, 0x200d, 0x0d0f}, { {0, 3, 1, {0x1276}}, {1, 2, 0, {0x0000}}, {2, 3, 0, {0x0000}}, {3, 4, 1, {0x1205}}, {-1, 1, 1, {0} } } },
       
   721 		{ 4, {0x0d33, 0x0d4d, 0x200d, 0x0d13}, { {0, 3, 1, {0x1275}}, {1, 2, 0, {0x0000}}, {2, 3, 0, {0x0000}}, {3, 4, 1, {0x1208}}, {-1, 1, 1, {0} } } },
       
   722 
       
   723 		{ 4, {0x0d23, 0x0d4d, 0x200d, 0x0d16}, { {0, 3, 1, {0x1272}}, {1, 2, 0, {0x0000}}, {2, 3, 0, {0x0000}}, {3, 4, 1, {0x120b}}, {-1, 1, 1, {0} } } },
       
   724 		{ 4, {0x0d28, 0x0d4d, 0x200d, 0x0d19}, { {0, 3, 1, {0x1273}}, {1, 2, 0, {0x0000}}, {2, 3, 0, {0x0000}}, {3, 4, 1, {0x120e}}, {-1, 1, 1, {0} } } },
       
   725 		{ 4, {0x0d30, 0x0d4d, 0x200d, 0x0d1a}, { {0, 3, 1, {0x1274}}, {1, 2, 0, {0x0000}}, {2, 3, 0, {0x0000}}, {3, 4, 1, {0x120f}}, {-1, 1, 1, {0} } } },
       
   726 		{ 4, {0x0d32, 0x0d4d, 0x200d, 0x0d1f}, { {0, 3, 1, {0x1276}}, {1, 2, 0, {0x0000}}, {2, 3, 0, {0x0000}}, {3, 4, 1, {0x1214}}, {-1, 1, 1, {0} } } },
       
   727 		{ 4, {0x0d33, 0x0d4d, 0x200d, 0x0d31}, { {0, 3, 1, {0x1275}}, {1, 2, 0, {0x0000}}, {2, 3, 0, {0x0000}}, {3, 4, 1, {0x1225}}, {-1, 1, 1, {0} } } },
       
   728 
       
   729 		{ 4, {0x0d23, 0x0d4d, 0x200d, 0x0d02}, { {0, 3, 1, {0x1272}}, {1, 2, 0, {0x0000}}, {2, 4, 1, {0x11fa}}, {3, 4, 1, {0x11fa}}, {-1, 1, 1, {0} } } },
       
   730 		{ 4, {0x0d28, 0x0d4d, 0x200d, 0x0d02}, { {0, 3, 1, {0x1273}}, {1, 2, 0, {0x0000}}, {2, 4, 1, {0x11fa}}, {3, 4, 1, {0x11fa}}, {-1, 1, 1, {0} } } },
       
   731 		{ 4, {0x0d30, 0x0d4d, 0x200d, 0x0d03}, { {0, 3, 1, {0x1274}}, {1, 2, 0, {0x0000}}, {2, 4, 1, {0x11fb}}, {3, 4, 1, {0x11fb}}, {-1, 1, 1, {0} } } },
       
   732 		{ 4, {0x0d32, 0x0d4d, 0x200d, 0x0d03}, { {0, 3, 1, {0x1276}}, {1, 2, 0, {0x0000}}, {2, 4, 1, {0x11fb}}, {3, 4, 1, {0x11fb}}, {-1, 1, 1, {0} } } },
       
   733 		{ 4, {0x0d33, 0x0d4d, 0x200d, 0x0d03}, { {0, 3, 1, {0x1275}}, {1, 2, 0, {0x0000}}, {2, 4, 1, {0x11fb}}, {3, 4, 1, {0x11fb}}, {-1, 1, 1, {0} } } },
       
   734 
       
   735 		{ 4, {0x0d23, 0x0d4d, 0x200d, 0x0d4d}, { {0, 3, 1, {0x1272}}, {1, 2, 0, {0x0000}}, {2, 4, 2, {0x058f, 0x123a}}, {3, 4, 2, {0x058f, 0x123a}}, {-1, 1, 1, {0} } } },
       
   736 		{ 4, {0x0d28, 0x0d4d, 0x200d, 0x0d4d}, { {0, 3, 1, {0x1273}}, {1, 2, 0, {0x0000}}, {2, 4, 2, {0x058f, 0x123a}}, {3, 4, 2, {0x058f, 0x123a}}, {-1, 1, 1, {0} } } },
       
   737 		{ 4, {0x0d30, 0x0d4d, 0x200d, 0x0d4d}, { {0, 3, 1, {0x1274}}, {1, 2, 0, {0x0000}}, {2, 4, 2, {0x058f, 0x123a}}, {3, 4, 2, {0x058f, 0x123a}}, {-1, 1, 1, {0} } } },
       
   738 		{ 4, {0x0d32, 0x0d4d, 0x200d, 0x0d4d}, { {0, 3, 1, {0x1276}}, {1, 2, 0, {0x0000}}, {2, 4, 2, {0x058f, 0x123a}}, {3, 4, 2, {0x058f, 0x123a}}, {-1, 1, 1, {0} } } },
       
   739 		{ 4, {0x0d33, 0x0d4d, 0x200d, 0x0d4d}, { {0, 3, 1, {0x1275}}, {1, 2, 0, {0x0000}}, {2, 4, 2, {0x058f, 0x123a}}, {3, 4, 2, {0x058f, 0x123a}}, {-1, 1, 1, {0} } } },
       
   740 		{ -1, {0}, -1,						-1, 0, {0}}
       
   741 };
       
   742 
       
   743 LOCAL_D const TTestInput_PositionParam6 Indic_GurmukhiVowelLeading[] = {
       
   744 		//	ARA, IRI, URA, independent vowel to shaper
       
   745 		{ 1, {0x0a05}, { {0, 1, 1, {0x12c3}}, {-1, 1, 1, {0} } } },
       
   746 		{ 1, {0x0a06}, { {0, 1, 1, {0x12c4}}, {-1, 1, 1, {0} } } },
       
   747 		{ 1, {0x0a07}, { {0, 1, 1, {0x12c5}}, {-1, 1, 1, {0} } } },
       
   748 		{ 1, {0x0a08}, { {0, 1, 1, {0x12c6}}, {-1, 1, 1, {0} } } },		
       
   749 		{ 1, {0x0a09}, { {0, 1, 1, {0x12c7}}, {-1, 1, 1, {0} } } },
       
   750 		{ 1, {0x0a0a}, { {0, 1, 1, {0x12c8}}, {-1, 1, 1, {0} } } },
       
   751 		{ 1, {0x0a0b}, { {0, 1, 1, {0x0000}}, {-1, 1, 1, {0} } } },
       
   752 		{ 1, {0x0a0c}, { {0, 1, 1, {0x0000}}, {-1, 1, 1, {0} } } },
       
   753 		{ 1, {0x0a0d}, { {0, 1, 1, {0x0000}}, {-1, 1, 1, {0} } } },
       
   754 		{ 1, {0x0a0e}, { {0, 1, 1, {0x0000}}, {-1, 1, 1, {0} } } },
       
   755 		{ 1, {0x0a0f}, { {0, 1, 1, {0x12c9}}, {-1, 1, 1, {0} } } },
       
   756 		{ 1, {0x0a10}, { {0, 1, 1, {0x12ca}}, {-1, 1, 1, {0} } } },
       
   757 		{ 1, {0x0a11}, { {0, 1, 1, {0x0000}}, {-1, 1, 1, {0} } } },
       
   758 		{ 1, {0x0a12}, { {0, 1, 1, {0x0000}}, {-1, 1, 1, {0} } } },
       
   759 		{ 1, {0x0a13}, { {0, 1, 1, {0x12cb}}, {-1, 1, 1, {0} } } },
       
   760 		{ 1, {0x0a14}, { {0, 1, 1, {0x12cc}}, {-1, 1, 1, {0} } } },
       
   761 		{ 1, {0x0a72}, { {0, 1, 1, {0x130a}}, {-1, 1, 1, {0} } } },
       
   762 		{ 1, {0x0a73}, { {0, 1, 1, {0x130b}}, {-1, 1, 1, {0} } } },
       
   763 		//	Valid bear + vowel
       
   764 		{ 2, {0x0a05, 0x0a3e}, { {0, 2, 2, {0x12c3, 0x12ef}}, {1, 2, 1, {0x12ef}}, {-1, 1, 1, {0} } } },
       
   765 		{ 2, {0x0a05, 0x0a48}, { {0, 2, 2, {0x12c3, 0x12f5}}, {1, 2, 1, {0x12f5}}, {-1, 1, 1, {0} } } },
       
   766 		{ 2, {0x0a05, 0x0a4c}, { {0, 2, 2, {0x12c3, 0x12f7}}, {1, 2, 1, {0x12f7}}, {-1, 1, 1, {0} } } },
       
   767 		{ 2, {0x0a72, 0x0a3f}, { {0, 2, 2, {0x12f0, 0x130a}}, {1, 2, 1, {0x12f0}}, {-1, 1, 1, {0} } } },
       
   768 		{ 2, {0x0a72, 0x0a40}, { {0, 2, 2, {0x130a, 0x12f1}}, {1, 2, 1, {0x12f1}}, {-1, 1, 1, {0} } } },
       
   769 		{ 2, {0x0a72, 0x0a47}, { {0, 2, 2, {0x130a, 0x12f4}}, {1, 2, 1, {0x12f4}}, {-1, 1, 1, {0} } } },
       
   770 		{ 2, {0x0a73, 0x0a41}, { {0, 2, 1, {0x12c7}}, {-1, 1, 1, {0} } } },
       
   771 		{ 2, {0x0a73, 0x0a42}, { {0, 2, 1, {0x12c8}}, {-1, 1, 1, {0} } } },
       
   772 		{ 2, {0x0a73, 0x0a4b}, { {0, 2, 1, {0x12cb}}, {-1, 1, 1, {0} } } },
       
   773 		//	Invalid bear + vowel sequence
       
   774 		{ 2, {0x0a72, 0x0a4b}, { {0, 1, 1, {0x130a}}, {1, 2, 2, {0x058f, 0x12f6}}, {-1, 1, 1, {0} } } },
       
   775 		{ 2, {0x0a05, 0x0a4b}, { {0, 1, 1, {0x12c3}}, {1, 2, 2, {0x058f, 0x12f6}}, {-1, 1, 1, {0} } } },
       
   776 		{ 2, {0x0a73, 0x0a3f}, { {0, 1, 1, {0x130b}}, {1, 2, 2, {0x12f0, 0x058f}}, {-1, 1, 1, {0} } } },
       
   777 		{ -1, {0}, -1,						-1, 0, {0}}
       
   778 };
       
   779 
       
   780 
       
   781 LOCAL_D const TTestInput_PositionParam6 Indic_MalayalamVowelLeading[] = {
       
   782 		//	Vowel
       
   783 		{ 1, {0x0d05}, { {0, 1, 1, {0x11fc}}, {-1, 1, 1, {0} } } },
       
   784 		{ 1, {0x0d06}, { {0, 1, 1, {0x11fd}}, {-1, 1, 1, {0} } } },
       
   785 		{ 1, {0x0d07}, { {0, 1, 1, {0x11fe}}, {-1, 1, 1, {0} } } },
       
   786 		{ 1, {0x0d08}, { {0, 1, 1, {0x11ff}}, {-1, 1, 1, {0} } } },
       
   787 		{ 1, {0x0d09}, { {0, 1, 1, {0x1200}}, {-1, 1, 1, {0} } } },
       
   788 		{ 1, {0x0d0a}, { {0, 1, 1, {0x1201}}, {-1, 1, 1, {0} } } },
       
   789 		{ 1, {0x0d0b}, { {0, 1, 1, {0x1202}}, {-1, 1, 1, {0} } } },
       
   790 		{ 1, {0x0d60}, { {0, 1, 1, {0x123c}}, {-1, 1, 1, {0} } } },
       
   791 		{ 1, {0x0d0c}, { {0, 1, 1, {0x1203}}, {-1, 1, 1, {0} } } },
       
   792 		{ 1, {0x0d61}, { {0, 1, 1, {0x123d}}, {-1, 1, 1, {0} } } },
       
   793 		{ 1, {0x0d0e}, { {0, 1, 1, {0x1204}}, {-1, 1, 1, {0} } } },
       
   794 		{ 1, {0x0d0f}, { {0, 1, 1, {0x1205}}, {-1, 1, 1, {0} } } },
       
   795 		{ 1, {0x0d10}, { {0, 1, 1, {0x1206}}, {-1, 1, 1, {0} } } },
       
   796 		{ 1, {0x0d12}, { {0, 1, 1, {0x1207}}, {-1, 1, 1, {0} } } },
       
   797 		{ 1, {0x0d13}, { {0, 1, 1, {0x1208}}, {-1, 1, 1, {0} } } },
       
   798 		{ 1, {0x0d14}, { {0, 1, 1, {0x1209}}, {-1, 1, 1, {0} } } },
       
   799 		//	Vowel + modifer 
       
   800 		{ 2, {0x0d05, 0x0d02}, { {0, 2, 2, {0x11fc, 0x11fa}}, {1, 2, 1, {0x11fa}}, {-1, 1, 1, {0} } } },
       
   801 		{ 2, {0x0d06, 0x0d02}, { {0, 2, 2, {0x11fd, 0x11fa}}, {1, 2, 1, {0x11fa}}, {-1, 1, 1, {0} } } },
       
   802 		{ 2, {0x0d07, 0x0d02}, { {0, 2, 2, {0x11fe, 0x11fa}}, {1, 2, 1, {0x11fa}}, {-1, 1, 1, {0} } } },
       
   803 		{ 2, {0x0d08, 0x0d02}, { {0, 2, 2, {0x11ff, 0x11fa}}, {1, 2, 1, {0x11fa}}, {-1, 1, 1, {0} } } },
       
   804 		{ 2, {0x0d09, 0x0d02}, { {0, 2, 2, {0x1200, 0x11fa}}, {1, 2, 1, {0x11fa}}, {-1, 1, 1, {0} } } },
       
   805 		{ 2, {0x0d0a, 0x0d02}, { {0, 2, 2, {0x1201, 0x11fa}}, {1, 2, 1, {0x11fa}}, {-1, 1, 1, {0} } } },
       
   806 		{ 2, {0x0d0b, 0x0d02}, { {0, 2, 2, {0x1202, 0x11fa}}, {1, 2, 1, {0x11fa}}, {-1, 1, 1, {0} } } },
       
   807 		{ 2, {0x0d60, 0x0d02}, { {0, 2, 2, {0x123c, 0x11fa}}, {1, 2, 1, {0x11fa}}, {-1, 1, 1, {0} } } },
       
   808 		{ 2, {0x0d0c, 0x0d03}, { {0, 2, 2, {0x1203, 0x11fb}}, {1, 2, 1, {0x11fb}}, {-1, 1, 1, {0} } } },
       
   809 		{ 2, {0x0d61, 0x0d03}, { {0, 2, 2, {0x123d, 0x11fb}}, {1, 2, 1, {0x11fb}}, {-1, 1, 1, {0} } } },
       
   810 		{ 2, {0x0d0e, 0x0d03}, { {0, 2, 2, {0x1204, 0x11fb}}, {1, 2, 1, {0x11fb}}, {-1, 1, 1, {0} } } },
       
   811 		{ 2, {0x0d0f, 0x0d03}, { {0, 2, 2, {0x1205, 0x11fb}}, {1, 2, 1, {0x11fb}}, {-1, 1, 1, {0} } } },
       
   812 		{ 2, {0x0d10, 0x0d03}, { {0, 2, 2, {0x1206, 0x11fb}}, {1, 2, 1, {0x11fb}}, {-1, 1, 1, {0} } } },
       
   813 		{ 2, {0x0d12, 0x0d03}, { {0, 2, 2, {0x1207, 0x11fb}}, {1, 2, 1, {0x11fb}}, {-1, 1, 1, {0} } } },
       
   814 		{ 2, {0x0d13, 0x0d03}, { {0, 2, 2, {0x1208, 0x11fb}}, {1, 2, 1, {0x11fb}}, {-1, 1, 1, {0} } } },
       
   815 		{ 2, {0x0d14, 0x0d03}, { {0, 2, 2, {0x1209, 0x11fb}}, {1, 2, 1, {0x11fb}}, {-1, 1, 1, {0} } } },
       
   816 		//	Vowel, Modifier, Matra
       
   817 		{ 3, {0x0d05, 0x0d02, 0x0d3e}, { {0, 2, 2, {0x11fc, 0x11fa}}, {1, 2, 1, {0x11fa}}, {2, 3, 2, {0x058f, 0x122e}}, {-1, 1, 1, {0} } } },
       
   818 		{ 3, {0x0d06, 0x0d02, 0x0d3f}, { {0, 2, 2, {0x11fd, 0x11fa}}, {1, 2, 1, {0x11fa}}, {2, 3, 2, {0x058f, 0x122f}}, {-1, 1, 1, {0} } } },
       
   819 		{ 3, {0x0d07, 0x0d02, 0x0d40}, { {0, 2, 2, {0x11fe, 0x11fa}}, {1, 2, 1, {0x11fa}}, {2, 3, 2, {0x058f, 0x1230}}, {-1, 1, 1, {0} } } },
       
   820 		{ 3, {0x0d08, 0x0d02, 0x0d41}, { {0, 2, 2, {0x11ff, 0x11fa}}, {1, 2, 1, {0x11fa}}, {2, 3, 2, {0x058f, 0x1231}}, {-1, 1, 1, {0} } } },
       
   821 		{ 3, {0x0d09, 0x0d02, 0x0d42}, { {0, 2, 2, {0x1200, 0x11fa}}, {1, 2, 1, {0x11fa}}, {2, 3, 2, {0x058f, 0x1232}}, {-1, 1, 1, {0} } } },
       
   822 		{ 3, {0x0d0a, 0x0d02, 0x0d43}, { {0, 2, 2, {0x1201, 0x11fa}}, {1, 2, 1, {0x11fa}}, {2, 3, 2, {0x058f, 0x1233}}, {-1, 1, 1, {0} } } },
       
   823 		{ 3, {0x0d0b, 0x0d02, 0x0d46}, { {0, 2, 2, {0x1202, 0x11fa}}, {1, 2, 1, {0x11fa}}, {2, 3, 2, {0x1234, 0x058f}}, {-1, 1, 1, {0} } } },
       
   824 		{ 3, {0x0d60, 0x0d02, 0x0d47}, { {0, 2, 2, {0x123c, 0x11fa}}, {1, 2, 1, {0x11fa}}, {2, 3, 2, {0x1235, 0x058f}}, {-1, 1, 1, {0} } } },
       
   825 		{ 3, {0x0d0c, 0x0d03, 0x0d48}, { {0, 2, 2, {0x1203, 0x11fb}}, {1, 2, 1, {0x11fb}}, {2, 3, 2, {0x1236, 0x058f}}, {-1, 1, 1, {0} } } },
       
   826 		{ 3, {0x0d61, 0x0d03, 0x0d4a}, { {0, 2, 2, {0x123d, 0x11fb}}, {1, 2, 1, {0x11fb}}, {2, 3, 3, {0x1234, 0x058f, 0x122e}}, {-1, 1, 1, {0} } } },
       
   827 		{ 3, {0x0d0e, 0x0d03, 0x0d4b}, { {0, 2, 2, {0x1204, 0x11fb}}, {1, 2, 1, {0x11fb}}, {2, 3, 3, {0x1235, 0x058f, 0x122e}}, {-1, 1, 1, {0} } } },
       
   828 		{ 3, {0x0d0f, 0x0d03, 0x0d4c}, { {0, 2, 2, {0x1205, 0x11fb}}, {1, 2, 1, {0x11fb}}, {2, 3, 2, {0x058f, 0x123b}}, {-1, 1, 1, {0} } } },
       
   829 		{ 3, {0x0d10, 0x0d03, 0x0d3e}, { {0, 2, 2, {0x1206, 0x11fb}}, {1, 2, 1, {0x11fb}}, {2, 3, 2, {0x058f, 0x122e}}, {-1, 1, 1, {0} } } },
       
   830 		{ 3, {0x0d12, 0x0d03, 0x0d3f}, { {0, 2, 2, {0x1207, 0x11fb}}, {1, 2, 1, {0x11fb}}, {2, 3, 2, {0x058f, 0x122f}}, {-1, 1, 1, {0} } } },
       
   831 		{ 3, {0x0d13, 0x0d03, 0x0d40}, { {0, 2, 2, {0x1208, 0x11fb}}, {1, 2, 1, {0x11fb}}, {2, 3, 2, {0x058f, 0x1230}}, {-1, 1, 1, {0} } } },
       
   832 		{ 3, {0x0d14, 0x0d03, 0x0d4c}, { {0, 2, 2, {0x1209, 0x11fb}}, {1, 2, 1, {0x11fb}}, {2, 3, 2, {0x058f, 0x123b}}, {-1, 1, 1, {0} } } },
       
   833 		
       
   834 		//	Vowel, Virama,
       
   835 		{ 2, {0x0d05, 0x0d4d}, { {0, 1, 1, {0x11fc}}, {1, 2, 2, {0x058f, 0x123a}}, {-1, 1, 1, {0} } } },
       
   836 		{ 2, {0x0d06, 0x0d4d}, { {0, 1, 1, {0x11fd}}, {1, 2, 2, {0x058f, 0x123a}}, {-1, 1, 1, {0} } } },
       
   837 		{ 2, {0x0d07, 0x0d4d}, { {0, 1, 1, {0x11fe}}, {1, 2, 2, {0x058f, 0x123a}}, {-1, 1, 1, {0} } } },
       
   838 		{ 2, {0x0d08, 0x0d4d}, { {0, 1, 1, {0x11ff}}, {1, 2, 2, {0x058f, 0x123a}}, {-1, 1, 1, {0} } } },
       
   839 		{ 2, {0x0d09, 0x0d4d}, { {0, 1, 1, {0x1200}}, {1, 2, 2, {0x058f, 0x123a}}, {-1, 1, 1, {0} } } },
       
   840 		{ 2, {0x0d0a, 0x0d4d}, { {0, 1, 1, {0x1201}}, {1, 2, 2, {0x058f, 0x123a}}, {-1, 1, 1, {0} } } },
       
   841 		{ 2, {0x0d0b, 0x0d4d}, { {0, 1, 1, {0x1202}}, {1, 2, 2, {0x058f, 0x123a}}, {-1, 1, 1, {0} } } },
       
   842 		{ 2, {0x0d60, 0x0d4d}, { {0, 1, 1, {0x123c}}, {1, 2, 2, {0x058f, 0x123a}}, {-1, 1, 1, {0} } } },
       
   843 		{ 2, {0x0d0c, 0x0d4d}, { {0, 1, 1, {0x1203}}, {1, 2, 2, {0x058f, 0x123a}}, {-1, 1, 1, {0} } } },
       
   844 		{ 2, {0x0d61, 0x0d4d}, { {0, 1, 1, {0x123d}}, {1, 2, 2, {0x058f, 0x123a}}, {-1, 1, 1, {0} } } },
       
   845 		{ 2, {0x0d0e, 0x0d4d}, { {0, 1, 1, {0x1204}}, {1, 2, 2, {0x058f, 0x123a}}, {-1, 1, 1, {0} } } },
       
   846 		{ 2, {0x0d0f, 0x0d4d}, { {0, 1, 1, {0x1205}}, {1, 2, 2, {0x058f, 0x123a}}, {-1, 1, 1, {0} } } },
       
   847 		{ 2, {0x0d10, 0x0d4d}, { {0, 1, 1, {0x1206}}, {1, 2, 2, {0x058f, 0x123a}}, {-1, 1, 1, {0} } } },
       
   848 		{ 2, {0x0d12, 0x0d4d}, { {0, 1, 1, {0x1207}}, {1, 2, 2, {0x058f, 0x123a}}, {-1, 1, 1, {0} } } },
       
   849 		{ 2, {0x0d13, 0x0d4d}, { {0, 1, 1, {0x1208}}, {1, 2, 2, {0x058f, 0x123a}}, {-1, 1, 1, {0} } } },
       
   850 		{ 2, {0x0d14, 0x0d4d}, { {0, 1, 1, {0x1209}}, {1, 2, 2, {0x058f, 0x123a}}, {-1, 1, 1, {0} } } },
       
   851 
       
   852 		//	Vowel, Matra,
       
   853 		{ 2, {0x0d05, 0x0d3e}, { {0, 1, 1, {0x11fc}}, {1, 2, 2, {0x058f, 0x122e}}, {-1, 1, 1, {0} } } },
       
   854 		{ 2, {0x0d06, 0x0d3f}, { {0, 1, 1, {0x11fd}}, {1, 2, 2, {0x058f, 0x122f}}, {-1, 1, 1, {0} } } },
       
   855 		{ 2, {0x0d07, 0x0d40}, { {0, 1, 1, {0x11fe}}, {1, 2, 2, {0x058f, 0x1230}}, {-1, 1, 1, {0} } } },
       
   856 		{ 2, {0x0d08, 0x0d41}, { {0, 1, 1, {0x11ff}}, {1, 2, 2, {0x058f, 0x1231}}, {-1, 1, 1, {0} } } },
       
   857 		{ 2, {0x0d09, 0x0d42}, { {0, 1, 1, {0x1200}}, {1, 2, 2, {0x058f, 0x1232}}, {-1, 1, 1, {0} } } },
       
   858 		{ 2, {0x0d0a, 0x0d43}, { {0, 1, 1, {0x1201}}, {1, 2, 2, {0x058f, 0x1233}}, {-1, 1, 1, {0} } } },
       
   859 		{ 2, {0x0d0b, 0x0d46}, { {0, 1, 1, {0x1202}}, {1, 2, 2, {0x1234, 0x058f}}, {-1, 1, 1, {0} } } },
       
   860 		{ 2, {0x0d60, 0x0d47}, { {0, 1, 1, {0x123c}}, {1, 2, 2, {0x1235, 0x058f}}, {-1, 1, 1, {0} } } },
       
   861 		{ 2, {0x0d0c, 0x0d48}, { {0, 1, 1, {0x1203}}, {1, 2, 2, {0x1236, 0x058f}}, {-1, 1, 1, {0} } } },
       
   862 		{ 2, {0x0d61, 0x0d4a}, { {0, 1, 1, {0x123d}}, {1, 2, 3, {0x1234, 0x058f, 0x122e}}, {-1, 1, 1, {0} } } },
       
   863 		{ 2, {0x0d0e, 0x0d4b}, { {0, 1, 1, {0x1204}}, {1, 2, 3, {0x1235, 0x058f, 0x122e}}, {-1, 1, 1, {0} } } },
       
   864 		{ 2, {0x0d0f, 0x0d4c}, { {0, 1, 1, {0x1205}}, {1, 2, 2, {0x058f, 0x123b}}, {-1, 1, 1, {0} } } },
       
   865 		{ 2, {0x0d10, 0x0d3e}, { {0, 1, 1, {0x1206}}, {1, 2, 2, {0x058f, 0x122e}}, {-1, 1, 1, {0} } } },
       
   866 		{ 2, {0x0d12, 0x0d3f}, { {0, 1, 1, {0x1207}}, {1, 2, 2, {0x058f, 0x122f}}, {-1, 1, 1, {0} } } },
       
   867 		{ 2, {0x0d13, 0x0d40}, { {0, 1, 1, {0x1208}}, {1, 2, 2, {0x058f, 0x1230}}, {-1, 1, 1, {0} } } },
       
   868 		{ 2, {0x0d14, 0x0d4c}, { {0, 1, 1, {0x1209}}, {1, 2, 2, {0x058f, 0x123b}}, {-1, 1, 1, {0} } } },
       
   869 		//	Vowel Virma, Matra
       
   870 		{ 3, {0x0d05, 0x0d4d, 0x0d3e}, { {0, 1, 1, {0x11fc}}, {1, 2, 2, {0x058f, 0x123a}}, {2, 3, 2, {0x058f, 0x122e}}, {-1, 1, 1, {0} } } },
       
   871 		{ 3, {0x0d06, 0x0d4d, 0x0d3f}, { {0, 1, 1, {0x11fd}}, {1, 2, 2, {0x058f, 0x123a}}, {2, 3, 2, {0x058f, 0x122f}}, {-1, 1, 1, {0} } } },
       
   872 		{ 3, {0x0d07, 0x0d4d, 0x0d40}, { {0, 1, 1, {0x11fe}}, {1, 2, 2, {0x058f, 0x123a}}, {2, 3, 2, {0x058f, 0x1230}}, {-1, 1, 1, {0} } } },
       
   873 		{ 3, {0x0d08, 0x0d4d, 0x0d41}, { {0, 1, 1, {0x11ff}}, {1, 2, 2, {0x058f, 0x123a}}, {2, 3, 2, {0x058f, 0x1231}}, {-1, 1, 1, {0} } } },
       
   874 		{ 3, {0x0d09, 0x0d4d, 0x0d42}, { {0, 1, 1, {0x1200}}, {1, 2, 2, {0x058f, 0x123a}}, {2, 3, 2, {0x058f, 0x1232}}, {-1, 1, 1, {0} } } },
       
   875 		{ 3, {0x0d0a, 0x0d4d, 0x0d43}, { {0, 1, 1, {0x1201}}, {1, 2, 2, {0x058f, 0x123a}}, {2, 3, 2, {0x058f, 0x1233}}, {-1, 1, 1, {0} } } },
       
   876 		{ 3, {0x0d0b, 0x0d4d, 0x0d46}, { {0, 1, 1, {0x1202}}, {1, 2, 2, {0x058f, 0x123a}}, {2, 3, 2, {0x1234, 0x058f}}, {-1, 1, 1, {0} } } },
       
   877 		{ 3, {0x0d60, 0x0d4d, 0x0d47}, { {0, 1, 1, {0x123c}}, {1, 2, 2, {0x058f, 0x123a}}, {2, 3, 2, {0x1235, 0x058f}}, {-1, 1, 1, {0} } } },
       
   878 		{ 3, {0x0d0c, 0x0d4d, 0x0d48}, { {0, 1, 1, {0x1203}}, {1, 2, 2, {0x058f, 0x123a}}, {2, 3, 2, {0x1236, 0x058f}}, {-1, 1, 1, {0} } } },
       
   879 		{ 3, {0x0d61, 0x0d4d, 0x0d4a}, { {0, 1, 1, {0x123d}}, {1, 2, 2, {0x058f, 0x123a}}, {2, 3, 3, {0x1234, 0x058f, 0x122e}}, {-1, 1, 1, {0} } } },
       
   880 		{ 3, {0x0d0e, 0x0d4d, 0x0d4b}, { {0, 1, 1, {0x1204}}, {1, 2, 2, {0x058f, 0x123a}}, {2, 3, 3, {0x1235, 0x058f, 0x122e}}, {-1, 1, 1, {0} } } },
       
   881 		{ 3, {0x0d0f, 0x0d4d, 0x0d4c}, { {0, 1, 1, {0x1205}}, {1, 2, 2, {0x058f, 0x123a}}, {2, 3, 2, {0x058f, 0x123b}}, {-1, 1, 1, {0} } } },
       
   882 		{ 3, {0x0d10, 0x0d4d, 0x0d3e}, { {0, 1, 1, {0x1206}}, {1, 2, 2, {0x058f, 0x123a}}, {2, 3, 2, {0x058f, 0x122e}}, {-1, 1, 1, {0} } } },
       
   883 		{ 3, {0x0d12, 0x0d4d, 0x0d3f}, { {0, 1, 1, {0x1207}}, {1, 2, 2, {0x058f, 0x123a}}, {2, 3, 2, {0x058f, 0x122f}}, {-1, 1, 1, {0} } } },
       
   884 		{ 3, {0x0d13, 0x0d4d, 0x0d40}, { {0, 1, 1, {0x1208}}, {1, 2, 2, {0x058f, 0x123a}}, {2, 3, 2, {0x058f, 0x1230}}, {-1, 1, 1, {0} } } },
       
   885 		{ 3, {0x0d14, 0x0d4d, 0x0d4c}, { {0, 1, 1, {0x1209}}, {1, 2, 2, {0x058f, 0x123a}}, {2, 3, 2, {0x058f, 0x123b}}, {-1, 1, 1, {0} } } },
       
   886 		{ -1, {0}, -1,						-1, 0, {0}}
       
   887 };
       
   888 
       
   889 /**
       
   890  This array of structs is used in the test routine 
       
   891  CTGlyphSelection::TestThai_InvalidGlyphClusters() to verify that
       
   892  GetCharacterPosition() correctly uses the dotted circle character
       
   893  when it crosses a glyph cluster boundary and finds invalid combining
       
   894  characters.
       
   895 */
       
   896 LOCAL_D const TTestInput_PositionParam2 Thai_GlyphClusterBoundaries[] = {
       
   897 //    --TEXT----------------	--INVOKE 1---------------		--INVOKE 2----------------
       
   898 
       
   899 //0.TEST D1 - Control character - skipped
       
   900 
       
   901 //0.TEST D2 - Non Thai letter
       
   902 	{ 2, {0x0E3F, 0x0E5B}, 	 	{{0, 1, 1, {0x0E3F}},			{1, 2, 1, {0x0E5B}}}},
       
   903 	{ 2, {0x0041, 0x0E03}, 	 	{{0, 1, 1, {0x0041}},			{1, 2, 1, {0x0E03}}}},
       
   904 	{ 2, {0x0E2F, 0x0E40}, 	 	{{0, 1, 1, {0x0E2F}},			{1, 2, 1, {0x0E40}}}},
       
   905 	{ 2, {0x0E3F, 0x0E30}, 	 	{{0, 1, 1, {0x0E3F}},			{1, 2, 1, {0x0E30}}}},
       
   906 	{ 2, {0x0E46, 0x0E45}, 	 	{{0, 1, 1, {0x0E46}},			{1, 2, 1, {0x0E45}}}},
       
   907 	{ 2, {0x0E4F, 0x0E24}, 	 	{{0, 1, 1, {0x0E4F}},			{1, 2, 1, {0x0E24}}}},
       
   908 
       
   909 	{ 2, {0x0E50, 0x0E38}, 	 	{{0, 1, 1, {0x0E50}},			{1, 2, 2, {KUnicodeDottedCircle, 0x0E38}}}},
       
   910 	{ 2, {0x0E51, 0x0E39}, 	 	{{0, 1, 1, {0x0E51}},			{1, 2, 2, {KUnicodeDottedCircle, 0x0E39}}}},
       
   911 	{ 2, {0x0E52, 0x0E3A}, 	 	{{0, 1, 1, {0x0E52}},			{1, 2, 2, {KUnicodeDottedCircle, 0x0E3A}}}},
       
   912 	{ 2, {0x0E55, 0x0E49}, 	 	{{0, 1, 1, {0x0E55}},			{1, 2, 2, {KUnicodeDottedCircle, 0xF70B}}}},
       
   913 	{ 2, {0x0E56, 0x0E4C}, 	 	{{0, 1, 1, {0x0E56}},			{1, 2, 2, {KUnicodeDottedCircle, 0xF70E}}}},
       
   914 	{ 2, {0x0E58, 0x0E47}, 	 	{{0, 1, 1, {0x0E58}},			{1, 2, 2, {KUnicodeDottedCircle, 0x0E47}}}},
       
   915 	{ 2, {0x0E59, 0x0E4E}, 	 	{{0, 1, 1, {0x0E59}},			{1, 2, 2, {KUnicodeDottedCircle, 0x0E4E}}}},
       
   916 	{ 2, {0x0E5A, 0x0E34}, 	 	{{0, 1, 1, {0x0E5A}},			{1, 2, 2, {KUnicodeDottedCircle, 0x0E34}}}},
       
   917 	{ 2, {0x0E5B, 0x0E31}, 	 	{{0, 1, 1, {0x0E5B}},			{1, 2, 2, {KUnicodeDottedCircle, 0x0E31}}}},
       
   918 	{ 2, {0x005A, 0x0E37}, 	 	{{0, 1, 1, {0x005A}},			{1, 2, 2, {KUnicodeDottedCircle, 0x0E37}}}},
       
   919 
       
   920 //16.TEST D3 - Thai consonant
       
   921 	{ 2, {0x0E01, 0x0E3F},	 	{{0, 1, 1, {0x0E01}},			{1, 2, 1, {0x0E3F}}}},
       
   922 	{ 2, {0x0E01, 0x0E03}, 	 	{{0, 1, 1, {0x0E01}},			{1, 2, 1, {0x0E03}}}},
       
   923 	{ 2, {0x0E02, 0x0E40}, 	 	{{0, 1, 1, {0x0E02}},			{1, 2, 1, {0x0E40}}}},
       
   924 	{ 2, {0x0E03, 0x0E30}, 	 	{{0, 1, 1, {0x0E03}},			{1, 2, 1, {0x0E30}}}},
       
   925 	{ 2, {0x0E04, 0x0E45}, 	 	{{0, 1, 1, {0x0E04}},			{1, 2, 1, {0x0E45}}}},
       
   926 	{ 2, {0x0E05, 0x0E24}, 	 	{{0, 1, 1, {0x0E05}},			{1, 2, 1, {0x0E24}}}},
       
   927 
       
   928 	{ 2, {0x0E06, 0x0E38}, 	 	{{0, 2, 2, {0x0E06, 0x0E38}},	{-1, -1, 0, {0}}}},
       
   929 	{ 2, {0x0E07, 0x0E39}, 	 	{{0, 2, 2, {0x0E07, 0x0E39}},	{-1, -1, 0, {0}}}},
       
   930 	{ 2, {0x0E23, 0x0E3A}, 	 	{{0, 2, 2, {0x0E23, 0x0E3A}},	{-1, -1, 0, {0}}}},
       
   931 	{ 2, {0x0E25, 0x0E49}, 	 	{{0, 2, 2, {0x0E25, 0xF70B}},	{-1, -1, 0, {0}}}},
       
   932 	{ 2, {0x0E27, 0x0E4C}, 	 	{{0, 2, 2, {0x0E27, 0xF70E}},	{-1, -1, 0, {0}}}},
       
   933 	{ 2, {0x0E28, 0x0E47}, 	 	{{0, 2, 2, {0x0E28, 0x0E47}},	{-1, -1, 0, {0}}}},
       
   934 	{ 2, {0x0E29, 0x0E4E}, 	 	{{0, 2, 2, {0x0E29, 0x0E4E}},	{-1, -1, 0, {0}}}},
       
   935 	{ 2, {0x0E2A, 0x0E34}, 	 	{{0, 2, 2, {0x0E2A, 0x0E34}},	{-1, -1, 0, {0}}}},
       
   936 	{ 2, {0x0E2D, 0x0E31}, 	 	{{0, 2, 2, {0x0E2D, 0x0E31}},	{-1, -1, 0, {0}}}},
       
   937 	{ 2, {0x0E2E, 0x0E37}, 	 	{{0, 2, 2, {0x0E2E, 0x0E37}},	{-1, -1, 0, {0}}}},
       
   938 
       
   939 //32.TEST D4 - Thai leading vowel
       
   940 	{ 2, {0x0E40, 0x0E3F}, 	 	{{0, 1, 1, {0x0E40}},			{1, 2, 1, {0x0E3F}}}},
       
   941 	{ 2, {0x0E41, 0x0E03}, 	 	{{0, 1, 1, {0x0E41}},			{1, 2, 1, {0x0E03}}}},
       
   942 	{ 2, {0x0E42, 0x0E40}, 	 	{{0, 1, 1, {0x0E42}},			{1, 2, 1, {0x0E40}}}},
       
   943 	{ 2, {0x0E43, 0x0E30}, 	 	{{0, 1, 1, {0x0E43}},			{1, 2, 1, {0x0E30}}}},
       
   944 	{ 2, {0x0E44, 0x0E45}, 	 	{{0, 1, 1, {0x0E44}},			{1, 2, 1, {0x0E45}}}},
       
   945 	{ 2, {0x0E44, 0x0E24}, 	 	{{0, 1, 1, {0x0E44}},			{1, 2, 1, {0x0E24}}}},
       
   946 
       
   947 	{ 2, {0x0E40, 0x0E38},		{{0, 1, 1, {0x0E40}},			{1, 2, 2, {KUnicodeDottedCircle, 0x0E38}}}},
       
   948 	{ 2, {0x0E41, 0x0E39}, 	 	{{0, 1, 1, {0x0E41}},			{1, 2, 2, {KUnicodeDottedCircle, 0x0E39}}}},
       
   949 	{ 2, {0x0E42, 0x0E3A}, 	 	{{0, 1, 1, {0x0E42}},			{1, 2, 2, {KUnicodeDottedCircle, 0x0E3A}}}},
       
   950 	{ 2, {0x0E43, 0x0E49}, 	 	{{0, 1, 1, {0x0E43}},			{1, 2, 2, {KUnicodeDottedCircle, 0xF70B}}}},
       
   951 	{ 2, {0x0E44, 0x0E4C}, 	 	{{0, 1, 1, {0x0E44}},			{1, 2, 2, {KUnicodeDottedCircle, 0xF70E}}}},
       
   952 	{ 2, {0x0E40, 0x0E47}, 	 	{{0, 1, 1, {0x0E40}},			{1, 2, 2, {KUnicodeDottedCircle, 0x0E47}}}},
       
   953 	{ 2, {0x0E41, 0x0E4E}, 	 	{{0, 1, 1, {0x0E41}},			{1, 2, 2, {KUnicodeDottedCircle, 0x0E4E}}}},
       
   954 	{ 2, {0x0E42, 0x0E34}, 	 	{{0, 1, 1, {0x0E42}},			{1, 2, 2, {KUnicodeDottedCircle, 0x0E34}}}},
       
   955 	{ 2, {0x0E43, 0x0E31}, 	 	{{0, 1, 1, {0x0E43}},			{1, 2, 2, {KUnicodeDottedCircle, 0x0E31}}}},
       
   956 	{ 2, {0x0E44, 0x0E37}, 	 	{{0, 1, 1, {0x0E44}},			{1, 2, 2, {KUnicodeDottedCircle, 0x0E37}}}},
       
   957 
       
   958 //48.TEST D5 - Thai following vowel 1
       
   959 	{ 2, {0x0E30, 0x0E3F}, 	 	{{0, 1, 1, {0x0E30}},				{1, 2, 1, {0x0E3F}}}},
       
   960 	{ 2, {0x0E32, 0x0E03}, 	 	{{0, 1, 1, {0x0E32}},				{1, 2, 1, {0x0E03}}}},
       
   961 	{ 2, {0x0E33, 0x0E40}, 	 	{{0, 1, 2, {KUnicodeDottedCircle, 0x0E33}},{1, 2, 1, {0x0E40}}}},
       
   962 	{ 2, {0x0E30, 0x0E30}, 	 	{{0, 1, 1, {0x0E30}},				{1, 2, 1, {0x0E30}}}},
       
   963 	{ 2, {0x0E32, 0x0E45}, 	 	{{0, 1, 1, {0x0E32}},				{1, 2, 1, {0x0E45}}}},
       
   964 	{ 2, {0x0E33, 0x0E24}, 	 	{{0, 1, 2, {KUnicodeDottedCircle, 0x0E33}},{1, 2, 1, {0x0E24}}}},
       
   965 
       
   966 	{ 2, {0x0E30, 0x0E38},		{{0, 1, 1, {0x0E30}},				{1, 2, 2, {KUnicodeDottedCircle, 0x0E38}}}},
       
   967 	{ 2, {0x0E32, 0x0E39}, 	 	{{0, 1, 1, {0x0E32}},				{1, 2, 2, {KUnicodeDottedCircle, 0x0E39}}}},
       
   968 	{ 2, {0x0E33, 0x0E3A}, 	 	{{0, 1, 2, {KUnicodeDottedCircle, 0x0E33}},{1, 2, 2, {KUnicodeDottedCircle, 0x0E3A}}}},
       
   969 	{ 2, {0x0E30, 0x0E49}, 	 	{{0, 1, 1, {0x0E30}},				{1, 2, 2, {KUnicodeDottedCircle, 0xF70B}}}},
       
   970 	{ 2, {0x0E32, 0x0E4C}, 	 	{{0, 1, 1, {0x0E32}},				{1, 2, 2, {KUnicodeDottedCircle, 0xF70E}}}},
       
   971 	{ 2, {0x0E33, 0x0E47}, 	 	{{0, 1, 2, {KUnicodeDottedCircle, 0x0E33}},{1, 2, 2, {KUnicodeDottedCircle, 0x0E47}}}},
       
   972 	{ 2, {0x0E30, 0x0E4E}, 	 	{{0, 1, 1, {0x0E30}},				{1, 2, 2, {KUnicodeDottedCircle, 0x0E4E}}}},
       
   973 	{ 2, {0x0E32, 0x0E34}, 	 	{{0, 1, 1, {0x0E32}},				{1, 2, 2, {KUnicodeDottedCircle, 0x0E34}}}},
       
   974 	{ 2, {0x0E33, 0x0E31}, 	 	{{0, 1, 2, {KUnicodeDottedCircle, 0x0E33}},{1, 2, 2, {KUnicodeDottedCircle, 0x0E31}}}},
       
   975 	{ 2, {0x0E30, 0x0E37}, 	 	{{0, 1, 1, {0x0E30}},				{1, 2, 2, {KUnicodeDottedCircle, 0x0E37}}}},
       
   976 
       
   977 //64.TEST D6 - Thai following vowel 2
       
   978 	{ 2, {0x0E45, 0x0E3F}, 	 	{{0, 1, 1, {0x0E45}},			{1, 2, 1, {0x0E3F}}}},
       
   979 	{ 2, {0x0E45, 0x0E03}, 	 	{{0, 1, 1, {0x0E45}},			{1, 2, 1, {0x0E03}}}},
       
   980 	{ 2, {0x0E45, 0x0E40}, 	 	{{0, 1, 1, {0x0E45}},			{1, 2, 1, {0x0E40}}}},
       
   981 	{ 2, {0x0E45, 0x0E30}, 	 	{{0, 1, 1, {0x0E45}},			{1, 2, 1, {0x0E30}}}},
       
   982 	{ 2, {0x0E45, 0x0E45}, 	 	{{0, 1, 1, {0x0E45}},			{1, 2, 1, {0x0E45}}}},
       
   983 	{ 2, {0x0E45, 0x0E24}, 	 	{{0, 1, 1, {0x0E45}},			{1, 2, 1, {0x0E24}}}},
       
   984 
       
   985 	{ 2, {0x0E45, 0x0E38},		{{0, 1, 1, {0x0E45}},			{1, 2, 2, {KUnicodeDottedCircle, 0x0E38}}}},
       
   986 	{ 2, {0x0E45, 0x0E39}, 	 	{{0, 1, 1, {0x0E45}},			{1, 2, 2, {KUnicodeDottedCircle, 0x0E39}}}},
       
   987 	{ 2, {0x0E45, 0x0E3A}, 	 	{{0, 1, 1, {0x0E45}},			{1, 2, 2, {KUnicodeDottedCircle, 0x0E3A}}}},
       
   988 	{ 2, {0x0E45, 0x0E49}, 	 	{{0, 1, 1, {0x0E45}},			{1, 2, 2, {KUnicodeDottedCircle, 0xF70B}}}},
       
   989 	{ 2, {0x0E45, 0x0E4C}, 	 	{{0, 1, 1, {0x0E45}},			{1, 2, 2, {KUnicodeDottedCircle, 0xF70E}}}},
       
   990 	{ 2, {0x0E45, 0x0E47}, 	 	{{0, 1, 1, {0x0E45}},			{1, 2, 2, {KUnicodeDottedCircle, 0x0E47}}}},
       
   991 	{ 2, {0x0E45, 0x0E4E}, 	 	{{0, 1, 1, {0x0E45}},			{1, 2, 2, {KUnicodeDottedCircle, 0x0E4E}}}},
       
   992 	{ 2, {0x0E45, 0x0E34}, 	 	{{0, 1, 1, {0x0E45}},			{1, 2, 2, {KUnicodeDottedCircle, 0x0E34}}}},
       
   993 	{ 2, {0x0E45, 0x0E31}, 	 	{{0, 1, 1, {0x0E45}},			{1, 2, 2, {KUnicodeDottedCircle, 0x0E31}}}},
       
   994 	{ 2, {0x0E45, 0x0E37}, 	 	{{0, 1, 1, {0x0E45}},			{1, 2, 2, {KUnicodeDottedCircle, 0x0E37}}}},
       
   995 
       
   996 //80.TEST D7 - Thai following vowel 3
       
   997 	{ 2, {0x0E24, 0x0E3F}, 	 	{{0, 1, 1, {0x0E24}},			{1, 2, 1, {0x0E3F}}}},
       
   998 	{ 2, {0x0E26, 0x0E03}, 	 	{{0, 1, 1, {0x0E26}},			{1, 2, 1, {0x0E03}}}},
       
   999 	{ 2, {0x0E24, 0x0E40}, 	 	{{0, 1, 1, {0x0E24}},			{1, 2, 1, {0x0E40}}}},
       
  1000 	{ 2, {0x0E26, 0x0E30}, 	 	{{0, 1, 1, {0x0E26}},			{1, 2, 1, {0x0E30}}}},
       
  1001 	{ 2, {0x0E24, 0x0E45}, 	 	{{0, 1, 1, {0x0E24}},			{1, 2, 1, {0x0E45}}}},
       
  1002 	{ 2, {0x0E26, 0x0E24}, 	 	{{0, 1, 1, {0x0E26}},			{1, 2, 1, {0x0E24}}}},
       
  1003 
       
  1004 	{ 2, {0x0E24, 0x0E38},		{{0, 2, 2, {0x0E24, 0xF718}},	{-1, -1, 0, {0}}}},
       
  1005 	{ 2, {0x0E26, 0x0E39}, 	 	{{0, 2, 2, {0x0E26, 0xF719}},	{-1, -1, 0, {0}}}},
       
  1006 	{ 2, {0x0E24, 0x0E3A}, 	 	{{0, 2, 2, {0x0E24, 0xF71A}},	{-1, -1, 0, {0}}}},
       
  1007 	{ 2, {0x0E26, 0x0E49}, 	 	{{0, 2, 2, {0x0E26, 0xF70B}},	{-1, -1, 0, {0}}}},
       
  1008 	{ 2, {0x0E24, 0x0E4C}, 	 	{{0, 2, 2, {0x0E24, 0xF70E}},	{-1, -1, 0, {0}}}},
       
  1009 	{ 2, {0x0E26, 0x0E47}, 	 	{{0, 2, 2, {0x0E26, 0x0E47}},	{-1, -1, 0, {0}}}},
       
  1010 	{ 2, {0x0E24, 0x0E4E}, 	 	{{0, 2, 2, {0x0E24, 0x0E4E}},	{-1, -1, 0, {0}}}},
       
  1011 	{ 2, {0x0E26, 0x0E34}, 	 	{{0, 2, 2, {0x0E26, 0x0E34}},	{-1, -1, 0, {0}}}},
       
  1012 	{ 2, {0x0E24, 0x0E31}, 	 	{{0, 2, 2, {0x0E24, 0x0E31}},	{-1, -1, 0, {0}}}},
       
  1013 	{ 2, {0x0E26, 0x0E37}, 	 	{{0, 2, 2, {0x0E26, 0x0E37}},	{-1, -1, 0, {0}}}},
       
  1014 
       
  1015 //96.TEST D8 - Thai NO NU & Below Vowel 1
       
  1016 	{ 3, {0x0E19, 0x0E38, 0x0E3F}, 	 	{{0, 2, 2, {0x0E19, 0x0E38}},			{2, 3, 1, {0x0E3F}}}},
       
  1017 	{ 3, {0x0E19, 0x0E38, 0x0E03}, 	 	{{0, 2, 2, {0x0E19, 0x0E38}},			{2, 3, 1, {0x0E03}}}},
       
  1018 	{ 3, {0x0E19, 0x0E38, 0x0E40}, 	 	{{0, 2, 2, {0x0E19, 0x0E38}},			{2, 3, 1, {0x0E40}}}},
       
  1019 	{ 3, {0x0E19, 0x0E38, 0x0E30}, 	 	{{0, 2, 2, {0x0E19, 0x0E38}},			{2, 3, 1, {0x0E30}}}},
       
  1020 	{ 3, {0x0E19, 0x0E38, 0x0E45}, 	 	{{0, 2, 2, {0x0E19, 0x0E38}},			{2, 3, 1, {0x0E45}}}},
       
  1021 	{ 3, {0x0E19, 0x0E38, 0x0E24}, 	 	{{0, 2, 2, {0x0E19, 0x0E38}},			{2, 3, 1, {0x0E24}}}},
       
  1022 
       
  1023 	{ 3, {0x0E19, 0x0E38, 0x0E38},		{{0, 2, 2, {0x0E19, 0x0E38}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E38}}}},
       
  1024 	{ 3, {0x0E19, 0x0E38, 0x0E39}, 	 	{{0, 2, 2, {0x0E19, 0x0E38}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E39}}}},
       
  1025 	{ 3, {0x0E19, 0x0E38, 0x0E3A}, 	 	{{0, 2, 2, {0x0E19, 0x0E38}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E3A}}}},
       
  1026 	{ 3, {0x0E19, 0x0E38, 0x0E49}, 	 	{{0, 3, 3, {0x0E19, 0x0E38, 0xF70B}},	{-1, -1, 0, {0}}}},
       
  1027 	{ 3, {0x0E19, 0x0E38, 0x0E4C}, 	 	{{0, 3, 3, {0x0E19, 0x0E38, 0xF70E}},	{-1, -1, 0, {0}}}},
       
  1028 	{ 3, {0x0E19, 0x0E38, 0x0E47}, 	 	{{0, 2, 2, {0x0E19, 0x0E38}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E47}}}},
       
  1029 	{ 3, {0x0E19, 0x0E38, 0x0E4E}, 	 	{{0, 2, 2, {0x0E19, 0x0E38}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E4E}}}},
       
  1030 	{ 3, {0x0E19, 0x0E38, 0x0E34}, 	 	{{0, 2, 2, {0x0E19, 0x0E38}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E34}}}},
       
  1031 	{ 3, {0x0E19, 0x0E38, 0x0E31}, 	 	{{0, 2, 2, {0x0E19, 0x0E38}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E31}}}},
       
  1032 	{ 3, {0x0E19, 0x0E38, 0x0E37}, 	 	{{0, 2, 2, {0x0E19, 0x0E38}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E37}}}},
       
  1033 
       
  1034 //112.TEST D9 - Thai NO NU & Below Vowel 2
       
  1035 	{ 3, {0x0E19, 0x0E39, 0x0E3F}, 	 	{{0, 2, 2, {0x0E19, 0x0E39}},			{2, 3, 1, {0x0E3F}}}},
       
  1036 	{ 3, {0x0E19, 0x0E39, 0x0E03}, 	 	{{0, 2, 2, {0x0E19, 0x0E39}},			{2, 3, 1, {0x0E03}}}},
       
  1037 	{ 3, {0x0E19, 0x0E39, 0x0E40}, 	 	{{0, 2, 2, {0x0E19, 0x0E39}},			{2, 3, 1, {0x0E40}}}},
       
  1038 	{ 3, {0x0E19, 0x0E39, 0x0E30}, 	 	{{0, 2, 2, {0x0E19, 0x0E39}},			{2, 3, 1, {0x0E30}}}},
       
  1039 	{ 3, {0x0E19, 0x0E39, 0x0E45}, 	 	{{0, 2, 2, {0x0E19, 0x0E39}},			{2, 3, 1, {0x0E45}}}},
       
  1040 	{ 3, {0x0E19, 0x0E39, 0x0E24}, 	 	{{0, 2, 2, {0x0E19, 0x0E39}},			{2, 3, 1, {0x0E24}}}},
       
  1041 
       
  1042 	{ 3, {0x0E19, 0x0E39, 0x0E38},		{{0, 2, 2, {0x0E19, 0x0E39}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E38}}}},
       
  1043 	{ 3, {0x0E19, 0x0E39, 0x0E39}, 	 	{{0, 2, 2, {0x0E19, 0x0E39}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E39}}}},
       
  1044 	{ 3, {0x0E19, 0x0E39, 0x0E3A}, 	 	{{0, 2, 2, {0x0E19, 0x0E39}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E3A}}}},
       
  1045 	{ 3, {0x0E19, 0x0E39, 0x0E49}, 	 	{{0, 3, 3, {0x0E19, 0x0E39, 0xF70B}},	{-1, -1, 0, {0}}}},
       
  1046 	{ 3, {0x0E19, 0x0E39, 0x0E4C}, 	 	{{0, 2, 2, {0x0E19, 0x0E39}},			{2, 3, 2, {KUnicodeDottedCircle, 0xF70E}}}},
       
  1047 	{ 3, {0x0E19, 0x0E39, 0x0E47}, 	 	{{0, 2, 2, {0x0E19, 0x0E39}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E47}}}},
       
  1048 	{ 3, {0x0E19, 0x0E39, 0x0E4E}, 	 	{{0, 2, 2, {0x0E19, 0x0E39}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E4E}}}},
       
  1049 	{ 3, {0x0E19, 0x0E39, 0x0E34}, 	 	{{0, 2, 2, {0x0E19, 0x0E39}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E34}}}},
       
  1050 	{ 3, {0x0E19, 0x0E39, 0x0E31}, 	 	{{0, 2, 2, {0x0E19, 0x0E39}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E31}}}},
       
  1051 	{ 3, {0x0E19, 0x0E39, 0x0E37}, 	 	{{0, 2, 2, {0x0E19, 0x0E39}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E37}}}},
       
  1052 
       
  1053 //128.TEST D10 - Thai NO NU & Below Diacritic
       
  1054 	{ 3, {0x0E19, 0x0E3A, 0x0E3F}, 	 	{{0, 2, 2, {0x0E19, 0x0E3A}},			{2, 3, 1, {0x0E3F}}}},
       
  1055 	{ 3, {0x0E19, 0x0E3A, 0x0E03}, 	 	{{0, 2, 2, {0x0E19, 0x0E3A}},			{2, 3, 1, {0x0E03}}}},
       
  1056 	{ 3, {0x0E19, 0x0E3A, 0x0E40}, 	 	{{0, 2, 2, {0x0E19, 0x0E3A}},			{2, 3, 1, {0x0E40}}}},
       
  1057 	{ 3, {0x0E19, 0x0E3A, 0x0E30}, 	 	{{0, 2, 2, {0x0E19, 0x0E3A}},			{2, 3, 1, {0x0E30}}}},
       
  1058 	{ 3, {0x0E19, 0x0E3A, 0x0E45}, 	 	{{0, 2, 2, {0x0E19, 0x0E3A}},			{2, 3, 1, {0x0E45}}}},
       
  1059 	{ 3, {0x0E19, 0x0E3A, 0x0E24}, 	 	{{0, 2, 2, {0x0E19, 0x0E3A}},			{2, 3, 1, {0x0E24}}}},
       
  1060 
       
  1061 	{ 3, {0x0E19, 0x0E3A, 0x0E38},		{{0, 2, 2, {0x0E19, 0x0E3A}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E38}}}},
       
  1062 	{ 3, {0x0E19, 0x0E3A, 0x0E39}, 	 	{{0, 2, 2, {0x0E19, 0x0E3A}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E39}}}},
       
  1063 	{ 3, {0x0E19, 0x0E3A, 0x0E3A}, 	 	{{0, 2, 2, {0x0E19, 0x0E3A}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E3A}}}},
       
  1064 	{ 3, {0x0E19, 0x0E3A, 0x0E49}, 	 	{{0, 2, 2, {0x0E19, 0x0E3A}},			{2, 3, 2, {KUnicodeDottedCircle, 0xF70B}}}},
       
  1065 	{ 3, {0x0E19, 0x0E3A, 0x0E4C}, 	 	{{0, 2, 2, {0x0E19, 0x0E3A}},			{2, 3, 2, {KUnicodeDottedCircle, 0xF70E}}}},
       
  1066 	{ 3, {0x0E19, 0x0E3A, 0x0E47}, 	 	{{0, 2, 2, {0x0E19, 0x0E3A}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E47}}}},
       
  1067 	{ 3, {0x0E19, 0x0E3A, 0x0E4E}, 	 	{{0, 2, 2, {0x0E19, 0x0E3A}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E4E}}}},
       
  1068 	{ 3, {0x0E19, 0x0E3A, 0x0E34}, 	 	{{0, 2, 2, {0x0E19, 0x0E3A}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E34}}}},
       
  1069 	{ 3, {0x0E19, 0x0E3A, 0x0E31}, 	 	{{0, 2, 2, {0x0E19, 0x0E3A}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E31}}}},
       
  1070 	{ 3, {0x0E19, 0x0E3A, 0x0E37}, 	 	{{0, 2, 2, {0x0E19, 0x0E3A}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E37}}}},
       
  1071 
       
  1072 //144.TEST D11 - Thai NO NU & Tone mark
       
  1073 	{ 3, {0x0E19, 0x0E48, 0x0E3F}, 	 	{{0, 2, 2, {0x0E19, 0xF70A}},			{2, 3, 1, {0x0E3F}}}},
       
  1074 	{ 3, {0x0E19, 0x0E49, 0x0E03}, 	 	{{0, 2, 2, {0x0E19, 0xF70B}},			{2, 3, 1, {0x0E03}}}},
       
  1075 	{ 3, {0x0E19, 0x0E4A, 0x0E40}, 	 	{{0, 2, 2, {0x0E19, 0xF70C}},			{2, 3, 1, {0x0E40}}}},
       
  1076 	{ 3, {0x0E19, 0x0E4B, 0x0E30}, 	 	{{0, 2, 2, {0x0E19, 0xF70D}},			{2, 3, 1, {0x0E30}}}},
       
  1077 	{ 3, {0x0E19, 0x0E48, 0x0E45}, 	 	{{0, 2, 2, {0x0E19, 0xF70A}},			{2, 3, 1, {0x0E45}}}},
       
  1078 	{ 3, {0x0E19, 0x0E49, 0x0E24}, 	 	{{0, 2, 2, {0x0E19, 0xF70B}},			{2, 3, 1, {0x0E24}}}},
       
  1079 
       
  1080 	{ 3, {0x0E19, 0x0E4A, 0x0E38},		{{0, 2, 2, {0x0E19, 0xF70C}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E38}}}},
       
  1081 	{ 3, {0x0E19, 0x0E4B, 0x0E39}, 	 	{{0, 2, 2, {0x0E19, 0xF70D}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E39}}}},
       
  1082 	{ 3, {0x0E19, 0x0E48, 0x0E3A}, 	 	{{0, 2, 2, {0x0E19, 0xF70A}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E3A}}}},
       
  1083 	{ 3, {0x0E19, 0x0E49, 0x0E49}, 	 	{{0, 2, 2, {0x0E19, 0xF70B}},			{2, 3, 2, {KUnicodeDottedCircle, 0xF70B}}}},
       
  1084 	{ 3, {0x0E19, 0x0E4A, 0x0E4C}, 	 	{{0, 2, 2, {0x0E19, 0xF70C}},			{2, 3, 2, {KUnicodeDottedCircle, 0xF70E}}}},
       
  1085 	{ 3, {0x0E19, 0x0E4B, 0x0E47}, 	 	{{0, 2, 2, {0x0E19, 0xF70D}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E47}}}},
       
  1086 	{ 3, {0x0E19, 0x0E48, 0x0E4E}, 	 	{{0, 2, 2, {0x0E19, 0xF70A}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E4E}}}},
       
  1087 	{ 3, {0x0E19, 0x0E49, 0x0E34}, 	 	{{0, 2, 2, {0x0E19, 0xF70B}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E34}}}},
       
  1088 	{ 3, {0x0E19, 0x0E4A, 0x0E31}, 	 	{{0, 2, 2, {0x0E19, 0xF70C}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E31}}}},
       
  1089 	{ 3, {0x0E19, 0x0E4B, 0x0E37}, 	 	{{0, 2, 2, {0x0E19, 0xF70D}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E37}}}},
       
  1090 
       
  1091 //160.TEST D12 - Thai NO NU & Above Diacritic 1
       
  1092 	{ 3, {0x0E19, 0x0E4C, 0x0E3F}, 	 	{{0, 2, 2, {0x0E19, 0xF70E}},			{2, 3, 1, {0x0E3F}}}},
       
  1093 	{ 3, {0x0E19, 0x0E4D, 0x0E03}, 	 	{{0, 2, 2, {0x0E19, 0x0E4D}},			{2, 3, 1, {0x0E03}}}},
       
  1094 	{ 3, {0x0E19, 0x0E4C, 0x0E40}, 	 	{{0, 2, 2, {0x0E19, 0xF70E}},			{2, 3, 1, {0x0E40}}}},
       
  1095 	{ 3, {0x0E19, 0x0E4D, 0x0E30}, 	 	{{0, 2, 2, {0x0E19, 0x0E4D}},			{2, 3, 1, {0x0E30}}}},
       
  1096 	{ 3, {0x0E19, 0x0E4C, 0x0E45}, 	 	{{0, 2, 2, {0x0E19, 0xF70E}},			{2, 3, 1, {0x0E45}}}},
       
  1097 	{ 3, {0x0E19, 0x0E4D, 0x0E24}, 	 	{{0, 2, 2, {0x0E19, 0x0E4D}},			{2, 3, 1, {0x0E24}}}},
       
  1098 
       
  1099 	{ 3, {0x0E19, 0x0E4C, 0x0E38},		{{0, 2, 2, {0x0E19, 0xF70E}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E38}}}},
       
  1100 	{ 3, {0x0E19, 0x0E4D, 0x0E39}, 	 	{{0, 2, 2, {0x0E19, 0x0E4D}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E39}}}},
       
  1101 	{ 3, {0x0E19, 0x0E4C, 0x0E3A}, 	 	{{0, 2, 2, {0x0E19, 0xF70E}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E3A}}}},
       
  1102 	{ 3, {0x0E19, 0x0E4D, 0x0E49}, 	 	{{0, 2, 2, {0x0E19, 0x0E4D}},			{2, 3, 2, {KUnicodeDottedCircle, 0xF70B}}}},
       
  1103 	{ 3, {0x0E19, 0x0E4C, 0x0E4C}, 	 	{{0, 2, 2, {0x0E19, 0xF70E}},			{2, 3, 2, {KUnicodeDottedCircle, 0xF70E}}}},
       
  1104 	{ 3, {0x0E19, 0x0E4D, 0x0E47}, 	 	{{0, 2, 2, {0x0E19, 0x0E4D}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E47}}}},
       
  1105 	{ 3, {0x0E19, 0x0E4C, 0x0E4E}, 	 	{{0, 2, 2, {0x0E19, 0xF70E}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E4E}}}},
       
  1106 	{ 3, {0x0E19, 0x0E4D, 0x0E34}, 	 	{{0, 2, 2, {0x0E19, 0x0E4D}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E34}}}},
       
  1107 	{ 3, {0x0E19, 0x0E4C, 0x0E31}, 	 	{{0, 2, 2, {0x0E19, 0xF70E}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E31}}}},
       
  1108 	{ 3, {0x0E19, 0x0E4D, 0x0E37}, 	 	{{0, 2, 2, {0x0E19, 0x0E4D}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E37}}}},
       
  1109 
       
  1110 //176.TEST D13 - Thai NO NU & Above Diacritic 2
       
  1111 	{ 3, {0x0E19, 0x0E47, 0x0E3F}, 	 	{{0, 2, 2, {0x0E19, 0x0E47}},			{2, 3, 1, {0x0E3F}}}},
       
  1112 	{ 3, {0x0E19, 0x0E47, 0x0E03}, 	 	{{0, 2, 2, {0x0E19, 0x0E47}},			{2, 3, 1, {0x0E03}}}},
       
  1113 	{ 3, {0x0E19, 0x0E47, 0x0E40}, 	 	{{0, 2, 2, {0x0E19, 0x0E47}},			{2, 3, 1, {0x0E40}}}},
       
  1114 	{ 3, {0x0E19, 0x0E47, 0x0E30}, 	 	{{0, 2, 2, {0x0E19, 0x0E47}},			{2, 3, 1, {0x0E30}}}},
       
  1115 	{ 3, {0x0E19, 0x0E47, 0x0E45}, 	 	{{0, 2, 2, {0x0E19, 0x0E47}},			{2, 3, 1, {0x0E45}}}},
       
  1116 	{ 3, {0x0E19, 0x0E47, 0x0E24}, 	 	{{0, 2, 2, {0x0E19, 0x0E47}},			{2, 3, 1, {0x0E24}}}},
       
  1117 
       
  1118 	{ 3, {0x0E19, 0x0E47, 0x0E38},		{{0, 2, 2, {0x0E19, 0x0E47}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E38}}}},
       
  1119 	{ 3, {0x0E19, 0x0E47, 0x0E39}, 	 	{{0, 2, 2, {0x0E19, 0x0E47}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E39}}}},
       
  1120 	{ 3, {0x0E19, 0x0E47, 0x0E3A}, 	 	{{0, 2, 2, {0x0E19, 0x0E47}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E3A}}}},
       
  1121 	{ 3, {0x0E19, 0x0E47, 0x0E49}, 	 	{{0, 2, 2, {0x0E19, 0x0E47}},			{2, 3, 2, {KUnicodeDottedCircle, 0xF70B}}}},
       
  1122 	{ 3, {0x0E19, 0x0E47, 0x0E4C}, 	 	{{0, 2, 2, {0x0E19, 0x0E47}},			{2, 3, 2, {KUnicodeDottedCircle, 0xF70E}}}},
       
  1123 	{ 3, {0x0E19, 0x0E47, 0x0E47}, 	 	{{0, 2, 2, {0x0E19, 0x0E47}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E47}}}},
       
  1124 	{ 3, {0x0E19, 0x0E47, 0x0E4E}, 	 	{{0, 2, 2, {0x0E19, 0x0E47}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E4E}}}},
       
  1125 	{ 3, {0x0E19, 0x0E47, 0x0E34}, 	 	{{0, 2, 2, {0x0E19, 0x0E47}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E34}}}},
       
  1126 	{ 3, {0x0E19, 0x0E47, 0x0E31}, 	 	{{0, 2, 2, {0x0E19, 0x0E47}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E31}}}},
       
  1127 	{ 3, {0x0E19, 0x0E47, 0x0E37}, 	 	{{0, 2, 2, {0x0E19, 0x0E47}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E37}}}},
       
  1128 
       
  1129 //176.TEST D14 - Thai NO NU & Above Diacritic 3
       
  1130 	{ 3, {0x0E19, 0x0E4E, 0x0E3F}, 	 	{{0, 2, 2, {0x0E19, 0x0E4E}},			{2, 3, 1, {0x0E3F}}}},
       
  1131 	{ 3, {0x0E19, 0x0E4E, 0x0E03}, 	 	{{0, 2, 2, {0x0E19, 0x0E4E}},			{2, 3, 1, {0x0E03}}}},
       
  1132 	{ 3, {0x0E19, 0x0E4E, 0x0E40}, 	 	{{0, 2, 2, {0x0E19, 0x0E4E}},			{2, 3, 1, {0x0E40}}}},
       
  1133 	{ 3, {0x0E19, 0x0E4E, 0x0E30}, 	 	{{0, 2, 2, {0x0E19, 0x0E4E}},			{2, 3, 1, {0x0E30}}}},
       
  1134 	{ 3, {0x0E19, 0x0E4E, 0x0E45}, 	 	{{0, 2, 2, {0x0E19, 0x0E4E}},			{2, 3, 1, {0x0E45}}}},
       
  1135 	{ 3, {0x0E19, 0x0E4E, 0x0E24}, 	 	{{0, 2, 2, {0x0E19, 0x0E4E}},			{2, 3, 1, {0x0E24}}}},
       
  1136 
       
  1137 	{ 3, {0x0E19, 0x0E4E, 0x0E38},		{{0, 2, 2, {0x0E19, 0x0E4E}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E38}}}},
       
  1138 	{ 3, {0x0E19, 0x0E4E, 0x0E39}, 	 	{{0, 2, 2, {0x0E19, 0x0E4E}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E39}}}},
       
  1139 	{ 3, {0x0E19, 0x0E4E, 0x0E3A}, 	 	{{0, 2, 2, {0x0E19, 0x0E4E}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E3A}}}},
       
  1140 	{ 3, {0x0E19, 0x0E4E, 0x0E49}, 	 	{{0, 2, 2, {0x0E19, 0x0E4E}},			{2, 3, 2, {KUnicodeDottedCircle, 0xF70B}}}},
       
  1141 	{ 3, {0x0E19, 0x0E4E, 0x0E4C}, 	 	{{0, 2, 2, {0x0E19, 0x0E4E}},			{2, 3, 2, {KUnicodeDottedCircle, 0xF70E}}}},
       
  1142 	{ 3, {0x0E19, 0x0E4E, 0x0E47}, 	 	{{0, 2, 2, {0x0E19, 0x0E4E}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E47}}}},
       
  1143 	{ 3, {0x0E19, 0x0E4E, 0x0E4E}, 	 	{{0, 2, 2, {0x0E19, 0x0E4E}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E4E}}}},
       
  1144 	{ 3, {0x0E19, 0x0E4E, 0x0E34}, 	 	{{0, 2, 2, {0x0E19, 0x0E4E}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E34}}}},
       
  1145 	{ 3, {0x0E19, 0x0E4E, 0x0E31}, 	 	{{0, 2, 2, {0x0E19, 0x0E4E}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E31}}}},
       
  1146 	{ 3, {0x0E19, 0x0E4E, 0x0E37}, 	 	{{0, 2, 2, {0x0E19, 0x0E4E}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E37}}}},
       
  1147 
       
  1148 //192.TEST D15 - Thai NO NU & Above Vowel 1
       
  1149 	{ 3, {0x0E19, 0x0E34, 0x0E3F}, 	 	{{0, 2, 2, {0x0E19, 0x0E34}},			{2, 3, 1, {0x0E3F}}}},
       
  1150 	{ 3, {0x0E19, 0x0E34, 0x0E03}, 	 	{{0, 2, 2, {0x0E19, 0x0E34}},			{2, 3, 1, {0x0E03}}}},
       
  1151 	{ 3, {0x0E19, 0x0E34, 0x0E40}, 	 	{{0, 2, 2, {0x0E19, 0x0E34}},			{2, 3, 1, {0x0E40}}}},
       
  1152 	{ 3, {0x0E19, 0x0E34, 0x0E30}, 	 	{{0, 2, 2, {0x0E19, 0x0E34}},			{2, 3, 1, {0x0E30}}}},
       
  1153 	{ 3, {0x0E19, 0x0E34, 0x0E45}, 	 	{{0, 2, 2, {0x0E19, 0x0E34}},			{2, 3, 1, {0x0E45}}}},
       
  1154 	{ 3, {0x0E19, 0x0E34, 0x0E24}, 	 	{{0, 2, 2, {0x0E19, 0x0E34}},			{2, 3, 1, {0x0E24}}}},
       
  1155 
       
  1156 	{ 3, {0x0E19, 0x0E34, 0x0E38},		{{0, 2, 2, {0x0E19, 0x0E34}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E38}}}},
       
  1157 	{ 3, {0x0E19, 0x0E34, 0x0E39}, 	 	{{0, 2, 2, {0x0E19, 0x0E34}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E39}}}},
       
  1158 	{ 3, {0x0E19, 0x0E34, 0x0E3A}, 	 	{{0, 2, 2, {0x0E19, 0x0E34}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E3A}}}},
       
  1159 	{ 3, {0x0E19, 0x0E34, 0x0E49}, 	 	{{0, 3, 3, {0x0E19, 0x0E34, 0x0E49}},	{-1, -1, 0, {0}}}},
       
  1160 	{ 3, {0x0E19, 0x0E34, 0x0E4C}, 	 	{{0, 3, 3, {0x0E19, 0x0E34, 0x0E4C}},	{-1, -1, 0, {0}}}},
       
  1161 	{ 3, {0x0E19, 0x0E34, 0x0E47}, 	 	{{0, 2, 2, {0x0E19, 0x0E34}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E47}}}},
       
  1162 	{ 3, {0x0E19, 0x0E34, 0x0E4E}, 	 	{{0, 2, 2, {0x0E19, 0x0E34}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E4E}}}},
       
  1163 	{ 3, {0x0E19, 0x0E34, 0x0E34}, 	 	{{0, 2, 2, {0x0E19, 0x0E34}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E34}}}},
       
  1164 	{ 3, {0x0E19, 0x0E34, 0x0E31}, 	 	{{0, 2, 2, {0x0E19, 0x0E34}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E31}}}},
       
  1165 	{ 3, {0x0E19, 0x0E34, 0x0E37}, 	 	{{0, 2, 2, {0x0E19, 0x0E34}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E37}}}},
       
  1166 
       
  1167 //208.TEST D16 - Thai NO NU & Above Vowel 2
       
  1168 	{ 3, {0x0E19, 0x0E31, 0x0E3F}, 	 	{{0, 2, 2, {0x0E19, 0x0E31}},			{2, 3, 1, {0x0E3F}}}},
       
  1169 	{ 3, {0x0E19, 0x0E36, 0x0E03}, 	 	{{0, 2, 2, {0x0E19, 0x0E36}},			{2, 3, 1, {0x0E03}}}},
       
  1170 	{ 3, {0x0E19, 0x0E31, 0x0E40}, 	 	{{0, 2, 2, {0x0E19, 0x0E31}},			{2, 3, 1, {0x0E40}}}},
       
  1171 	{ 3, {0x0E19, 0x0E36, 0x0E30}, 	 	{{0, 2, 2, {0x0E19, 0x0E36}},			{2, 3, 1, {0x0E30}}}},
       
  1172 	{ 3, {0x0E19, 0x0E31, 0x0E45}, 	 	{{0, 2, 2, {0x0E19, 0x0E31}},			{2, 3, 1, {0x0E45}}}},
       
  1173 	{ 3, {0x0E19, 0x0E36, 0x0E24}, 	 	{{0, 2, 2, {0x0E19, 0x0E36}},			{2, 3, 1, {0x0E24}}}},
       
  1174 
       
  1175 	{ 3, {0x0E19, 0x0E31, 0x0E38},		{{0, 2, 2, {0x0E19, 0x0E31}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E38}}}},
       
  1176 	{ 3, {0x0E19, 0x0E36, 0x0E39}, 	 	{{0, 2, 2, {0x0E19, 0x0E36}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E39}}}},
       
  1177 	{ 3, {0x0E19, 0x0E31, 0x0E3A}, 	 	{{0, 2, 2, {0x0E19, 0x0E31}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E3A}}}},
       
  1178 	{ 3, {0x0E19, 0x0E36, 0x0E49}, 	 	{{0, 3, 3, {0x0E19, 0x0E36, 0x0E49}},	{-1, -1, 0, {0}}}},
       
  1179 	{ 3, {0x0E19, 0x0E31, 0x0E4C}, 	 	{{0, 2, 2, {0x0E19, 0x0E31}},			{2, 3, 2, {KUnicodeDottedCircle, 0xF70E}}}},
       
  1180 	{ 3, {0x0E19, 0x0E36, 0x0E47}, 	 	{{0, 2, 2, {0x0E19, 0x0E36}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E47}}}},
       
  1181 	{ 3, {0x0E19, 0x0E31, 0x0E4E}, 	 	{{0, 2, 2, {0x0E19, 0x0E31}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E4E}}}},
       
  1182 	{ 3, {0x0E19, 0x0E36, 0x0E34}, 	 	{{0, 2, 2, {0x0E19, 0x0E36}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E34}}}},
       
  1183 	{ 3, {0x0E19, 0x0E31, 0x0E31}, 	 	{{0, 2, 2, {0x0E19, 0x0E31}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E31}}}},
       
  1184 	{ 3, {0x0E19, 0x0E36, 0x0E37}, 	 	{{0, 2, 2, {0x0E19, 0x0E36}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E37}}}},
       
  1185 
       
  1186 //240.TEST D17 - Thai NO NU & Above Vowel 3
       
  1187 	{ 3, {0x0E19, 0x0E35, 0x0E3F}, 	 	{{0, 2, 2, {0x0E19, 0x0E35}},			{2, 3, 1, {0x0E3F}}}},
       
  1188 	{ 3, {0x0E19, 0x0E37, 0x0E03}, 	 	{{0, 2, 2, {0x0E19, 0x0E37}},			{2, 3, 1, {0x0E03}}}},
       
  1189 	{ 3, {0x0E19, 0x0E35, 0x0E40}, 	 	{{0, 2, 2, {0x0E19, 0x0E35}},			{2, 3, 1, {0x0E40}}}},
       
  1190 	{ 3, {0x0E19, 0x0E37, 0x0E30}, 	 	{{0, 2, 2, {0x0E19, 0x0E37}},			{2, 3, 1, {0x0E30}}}},
       
  1191 	{ 3, {0x0E19, 0x0E35, 0x0E45}, 	 	{{0, 2, 2, {0x0E19, 0x0E35}},			{2, 3, 1, {0x0E45}}}},
       
  1192 	{ 3, {0x0E19, 0x0E37, 0x0E24}, 	 	{{0, 2, 2, {0x0E19, 0x0E37}},			{2, 3, 1, {0x0E24}}}},
       
  1193 
       
  1194 	{ 3, {0x0E19, 0x0E35, 0x0E38},		{{0, 2, 2, {0x0E19, 0x0E35}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E38}}}},
       
  1195 	{ 3, {0x0E19, 0x0E37, 0x0E39}, 	 	{{0, 2, 2, {0x0E19, 0x0E37}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E39}}}},
       
  1196 	{ 3, {0x0E19, 0x0E35, 0x0E3A}, 	 	{{0, 2, 2, {0x0E19, 0x0E35}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E3A}}}},
       
  1197 	{ 3, {0x0E19, 0x0E37, 0x0E49}, 	 	{{0, 3, 3, {0x0E19, 0x0E37, 0x0E49}},	{-1, -1, 0, {0}}}},
       
  1198 	{ 3, {0x0E19, 0x0E35, 0x0E4C}, 	 	{{0, 2, 2, {0x0E19, 0x0E35}},			{2, 3, 2, {KUnicodeDottedCircle, 0xF70E}}}},
       
  1199 	{ 3, {0x0E19, 0x0E37, 0x0E47},		{{0, 2, 2, {0x0E19, 0x0E37}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E47}}}},
       
  1200 	{ 3, {0x0E19, 0x0E35, 0x0E4E}, 	 	{{0, 2, 2, {0x0E19, 0x0E35}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E4E}}}},
       
  1201 	{ 3, {0x0E19, 0x0E37, 0x0E34}, 	 	{{0, 2, 2, {0x0E19, 0x0E37}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E34}}}},
       
  1202 	{ 3, {0x0E19, 0x0E35, 0x0E31}, 	 	{{0, 2, 2, {0x0E19, 0x0E35}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E31}}}},
       
  1203 	{ 3, {0x0E19, 0x0E37, 0x0E37}, 	 	{{0, 2, 2, {0x0E19, 0x0E37}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E37}}}},
       
  1204 
       
  1205 //256.TEST D18a - Test Thai combining marks stack over a dotted circle.
       
  1206 	{ 2, {0x0E36, 0x0E48}, 	 			{{0, 2, 3, {KUnicodeDottedCircle, 0x0E36, 0x0E48}},	{-1, -1, 0, {0}}}},
       
  1207 
       
  1208 //257.TEST D18b - Test non-thai consonant preceding two tone/signs in a row
       
  1209 	{ 2, {0x0041, 0x0E48, 0x0E49},		{{1, 2, 2, {KUnicodeDottedCircle, 0xF70A}},	{2, 3, 2, {KUnicodeDottedCircle, 0xF70B}}}},
       
  1210 
       
  1211 //258. TEST DEF038524 - Test WTT2.0 Rare 4 optional combinations 0xBE, 0xDE, 0xE7, 0xF7
       
  1212 //3 Not supported, but render should degrade display to not overstrike at a minimum. 1 is supported.
       
  1213 	{ 3, {0x0E01, 0x0E35, 0x0E47},		{{0, 2, 2, {0x0E01, 0x0E35}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E47}}}},
       
  1214 	{ 3, {0x0E01, 0x0E37, 0x0E47},		{{0, 2, 2, {0x0E01, 0x0E37}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E47}}}},
       
  1215 	{ 3, {0x0E01, 0x0E38, 0x0E4D},		{{0, 3, 3, {0x0E01, 0x0E38, 0x0E4D}},	{-1, -1, 0, {0}}}},
       
  1216 	{ 3, {0x0E01, 0x0E34, 0x0E4D},		{{0, 2, 2, {0x0E01, 0x0E34}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E4D}}}},
       
  1217 
       
  1218 //246.TABLE END
       
  1219 	{ -1, {0}, 	 				{{-1, -1, 0, {0}},				{-1, -1, 0, {0}}}}
       
  1220 	};
       
  1221 
       
  1222 
       
  1223 //
       
  1224 // --- CLASS CTGlyphSelection --------------------------------------------
       
  1225 //
       
  1226 
       
  1227 
       
  1228 CTGlyphSelection::CTGlyphSelection(CTestStep* aStep) :
       
  1229 	CTGraphicsBase(aStep),
       
  1230 	iTestFont(NULL),
       
  1231 	iTestGraphicsDevice(NULL),
       
  1232 	iTestGraphicsContext(NULL)
       
  1233 	{
       
  1234 	}
       
  1235 
       
  1236 
       
  1237 CTGlyphSelection::~CTGlyphSelection()
       
  1238 /**
       
  1239  This method cleans up after testing is finished. It releases memory
       
  1240  allocated by the test obejct at a point before object destruction.
       
  1241 */
       
  1242 	{
       
  1243 	delete iTestGraphicsContext;
       
  1244 	delete iTestGraphicsDevice;
       
  1245 	delete iTestFont;
       
  1246 	iFs.Close();
       
  1247 	}
       
  1248 
       
  1249 void CTGlyphSelection::ConstructL()
       
  1250 	{
       
  1251 	CreateTestGraphicsContextL();
       
  1252 	User::LeaveIfError(iFs.Connect());
       
  1253 	}
       
  1254 
       
  1255 void CTGlyphSelection::CreateTestGraphicsContextL()
       
  1256 /**
       
  1257  This method sets-up the context data for the proceeding test cases.
       
  1258 */
       
  1259 	{
       
  1260 	// Setup 400 pixel dummy graphics test device.
       
  1261 	TSize windowSize(400, 400);
       
  1262 	iTestGraphicsDevice = CTestGraphicsDevice::NewL(windowSize);
       
  1263 
       
  1264 	// Create a dummy graphics test context.
       
  1265 	CGraphicsContext* tContext = NULL;	
       
  1266 	TEST(iTestGraphicsDevice->CreateContext(tContext) == KErrNone);
       
  1267 	iTestGraphicsContext = static_cast<CTestGraphicsContext*>(tContext);
       
  1268 
       
  1269 	// Allocate the dummy test font to be used.
       
  1270 	iTestFont = new (ELeave) CTestFont;
       
  1271 	}
       
  1272 
       
  1273 
       
  1274 LOCAL_C TInt TestApiBoundaries_TC2(TAny* aData)
       
  1275 /**
       
  1276  This is a root thread function which runs as part of the test case
       
  1277  CTGlyphSelection::TestApiBoundaries(). It tests a panic
       
  1278  is produced when an invalid text descriptor is supplied in the
       
  1279  TPositionParam argument.
       
  1280 */
       
  1281 	{
       
  1282 	CTGlyphSelection* testPtr = (CTGlyphSelection*)aData;
       
  1283 
       
  1284 	CFont::TPositionParam param;
       
  1285 	param.iDirection = CFont::EHorizontal;
       
  1286 	param.iFlags = CFont::TPositionParam::EFLogicalOrder;
       
  1287 	param.iPosInText = 0;
       
  1288 	param.iPen.iX = param.iPen.iY = 0;
       
  1289 
       
  1290 	testPtr->iTestFont->GetCharacterPosition(param);
       
  1291 
       
  1292 	// Line above panics if component in UDEB is working OK; 
       
  1293 	// should never get here if component is in UDEB.
       
  1294 
       
  1295 	// If component is in UREL, then could reach here.
       
  1296 	
       
  1297 	return (0);
       
  1298 	}
       
  1299 
       
  1300 
       
  1301 LOCAL_C TInt TestApiBoundaries_TC5(TAny* aData)
       
  1302 /**
       
  1303  This is a root thread function which runs as part of the test case
       
  1304  CTGlyphSelection::TestApiBoundaries(). It tests a panic
       
  1305  is produced when a negative text position is supplied in the
       
  1306  TPositionParam argument.
       
  1307 */
       
  1308 	{
       
  1309 	CTGlyphSelection* testPtr = (CTGlyphSelection*)aData;
       
  1310 
       
  1311 	CFont::TPositionParam param;
       
  1312 	param.iDirection = CFont::EHorizontal;
       
  1313 	param.iFlags = CFont::TPositionParam::EFLogicalOrder;
       
  1314 	_LIT16(KText_aaaa, "aaaa");
       
  1315 	param.iText.Set(KText_aaaa);
       
  1316 	param.iPosInText = -10;
       
  1317 	param.iPen.iX = param.iPen.iY = 0;
       
  1318 
       
  1319 	testPtr->iTestFont->GetCharacterPosition(param);
       
  1320 
       
  1321 	// Line above panics if component in UDEB is working OK; 
       
  1322 	// should never get here if component is in UDEB.
       
  1323 
       
  1324 	// If component is in UREL, then could reach here.
       
  1325 
       
  1326 	return (0);
       
  1327 	}
       
  1328 
       
  1329 
       
  1330 void CTGlyphSelection::TestApiBoundaries()
       
  1331 /**
       
  1332  This method is a test case to exercise GetCharacterPosition() with
       
  1333  parameter values at range boundaries and in some cases out-or-raange.
       
  1334 */
       
  1335 	{
       
  1336 	TBool r;
       
  1337 	TBuf<20> testText(0);
       
  1338 
       
  1339 	CFont::TPositionParam param;
       
  1340 	param.iDirection = CFont::EHorizontal;
       
  1341 	param.iFlags = CFont::TPositionParam::EFLogicalOrder;
       
  1342 
       
  1343 	// 1: Check input arguments in paramter not modified
       
  1344 	testText = _L16("a");
       
  1345 	param.iText.Set(testText);
       
  1346 	param.iPosInText = 0;
       
  1347 	param.iPen.iX = param.iPen.iY = 0;
       
  1348 	r = iTestFont->GetCharacterPosition(param);
       
  1349 	TEST(r && param.iDirection == CFont::EHorizontal
       
  1350 		   && param.iFlags == CFont::TPositionParam::EFLogicalOrder
       
  1351 		   && param.iText.Ptr() == testText.Ptr());
       
  1352 
       
  1353 	// 2: Check invalid iText descriptor panics (when component in UDEB)
       
  1354 	//    When component built in UREL, behaviour is undefined, so do not test.
       
  1355 	TRequestStatus threadStatus;
       
  1356 	RThread thread;
       
  1357 	TInt rc;
       
  1358 	TBool jit;
       
  1359 	jit = User::JustInTime();
       
  1360 	User::SetJustInTime(EFalse);
       
  1361 	rc = thread.Create(KThread2NameFirst, TestApiBoundaries_TC2, 
       
  1362 		KDefaultStackSize, KMinHeapSize, KMinHeapSize*4, this);
       
  1363 	TEST(KErrNone == rc);
       
  1364 	thread.Logon(threadStatus);
       
  1365 	thread.Resume();
       
  1366 	User::WaitForRequest(threadStatus);
       
  1367 	
       
  1368 	if (thread.ExitType() == EExitPanic)
       
  1369 		{
       
  1370 		TEST (thread.ExitReason() == EGdiPanic_InvalidInputParam);
       
  1371 		INFO_PRINTF2(_L("Exit reason %d"), thread.ExitReason());
       
  1372 		TExitCategoryName exitCategory = thread.ExitCategory();
       
  1373 		INFO_PRINTF2(_L("Exit category %S"), &exitCategory);			
       
  1374 		}
       
  1375 	else
       
  1376 		{
       
  1377 		// Function does not panic on invalid input; 
       
  1378 		// Warn that this is only valid behaviour if the GDI component being tested is built in UREL mode
       
  1379 		// and there is a problem if the function has not panicked if the GDI component is build in UDEB mode
       
  1380 		INFO_PRINTF1(_L("Warning: GetCharacterPosition() when given invalid iText descriptor has not panicked - this is only ok if the GDI component is built in UREL mode. If the GDI component is built in UDEB mode, then there is a problem."));
       
  1381 		}	
       
  1382 	thread.Close();
       
  1383 	User::SetJustInTime(jit);
       
  1384 
       
  1385 	// 3: Zero length text descriptor
       
  1386 	testText = _L("");
       
  1387 	param.iText.Set(testText);
       
  1388 	param.iPosInText = 0;
       
  1389 	param.iPen.iX = param.iPen.iY = 0;
       
  1390 	r = iTestFont->GetCharacterPosition(param);
       
  1391 	TEST(!r && param.iPen.iX == 0 
       
  1392 		    && param.iOutputGlyphs == 0);
       
  1393 
       
  1394 	// 4: Position in text beyond descriptor length
       
  1395 	testText = _L16("a");
       
  1396 	param.iText.Set(testText);
       
  1397 	param.iPosInText = 5;
       
  1398 	param.iPen.iX = param.iPen.iY = 0;
       
  1399 	r = iTestFont->GetCharacterPosition(param);
       
  1400 	TEST(!r && param.iPen.iX == 0 
       
  1401 		   && param.iOutputGlyphs == 0);
       
  1402 
       
  1403 	// 5: Position in text is negative, should panic (when component in UDEB)
       
  1404 	//    When component built in UREL, behaviour is undefined, so do not test.
       
  1405 	jit = User::JustInTime();
       
  1406 	User::SetJustInTime(EFalse);
       
  1407 	rc = thread.Create(KThread2NameSecond, TestApiBoundaries_TC5, 
       
  1408 		KDefaultStackSize, KMinHeapSize, KMinHeapSize*4, this);
       
  1409 	TEST(KErrNone == rc);
       
  1410 	thread.Logon(threadStatus);
       
  1411 	thread.Resume();
       
  1412 	User::WaitForRequest(threadStatus);
       
  1413 
       
  1414 	if (thread.ExitType() == EExitPanic)
       
  1415 		{
       
  1416 		TEST (thread.ExitReason() == EGdiPanic_InvalidInputParam);
       
  1417 		INFO_PRINTF2(_L("Exit reason %d"), thread.ExitReason());
       
  1418 		TExitCategoryName exitCategory = thread.ExitCategory();
       
  1419 		INFO_PRINTF2(_L("Exit category %S"), &exitCategory);			
       
  1420 		}
       
  1421 	else
       
  1422 		{
       
  1423 		// Function does not panic on invalid input; 
       
  1424 		// Warn that this is only valid behaviour if the GDI component being tested is built in UREL mode
       
  1425 		// and there is a problem if the function has not panicked if the GDI component is build in UDEB mode
       
  1426 		INFO_PRINTF1(_L("Warning: GetCharacterPosition() when given negative iPosInText has not panicked - this is only ok if the GDI component is built in UREL mode. If the GDI component is built in UDEB mode, then there is a problem."));
       
  1427 		}	
       
  1428 
       
  1429 	thread.Close();
       
  1430 	User::SetJustInTime(jit);
       
  1431 
       
  1432 	// 6: Check 'No-char-data' condition handled
       
  1433 	testText = _L16("A\033C");
       
  1434 	param.iText.Set(testText);
       
  1435 	param.iPosInText = 1;
       
  1436 	param.iPen.iX = param.iPen.iY = 0;
       
  1437 	r = iTestFont->GetCharacterPosition(param);
       
  1438 	TEST( !r
       
  1439 		   && param.iPosInText == 2
       
  1440 		   && param.iPen.iX == 0 
       
  1441 		   && param.iOutputGlyphs == 0);
       
  1442 
       
  1443 	// 7: Check "Not-a-Char" condition handled
       
  1444 	testText = _L16("\xFFFF\xFFFE\xFFFF\xFFFF\xFFFF\xFFFE\xFFFF\xFFFF\xFFFF\xFFFE\xFFFF\xFFFF");
       
  1445 	param.iText.Set(testText);
       
  1446 	param.iPosInText = 0;
       
  1447 	param.iPen.iX = param.iPen.iY = 0;
       
  1448 	r = iTestFont->GetCharacterPosition(param);
       
  1449 	TEST(  r
       
  1450 		   && param.iPosInText == 1
       
  1451 		   && param.iPen.iX == 0 
       
  1452 		   && param.iOutputGlyphs == 0);
       
  1453 
       
  1454 	param.iPosInText = 5;
       
  1455 	param.iPen.iX = param.iPen.iY = 0;
       
  1456 	r = iTestFont->GetCharacterPosition(param);
       
  1457 	TEST(  r
       
  1458 		   && param.iPosInText == 6
       
  1459 		   && param.iPen.iX == 0 
       
  1460 		   && param.iOutputGlyphs == 0);
       
  1461 
       
  1462 	// 8. Check that a cluster cannot be made from heterogeneous elements
       
  1463 	// (in this case a 6 with a Hindi virama)
       
  1464 	testText = _L16("6\x94D");
       
  1465 	param.iText.Set(testText);
       
  1466 	param.iPosInText = 0;
       
  1467 	param.iPen.iX = param.iPen.iY = 0;
       
  1468 	r = iTestFont->GetCharacterPosition(param);
       
  1469 	TEST(r && param.iOutputGlyphs == 1);
       
  1470 	}
       
  1471 
       
  1472 inline TBool IsSupplementary(TUint aChar)
       
  1473 /**
       
  1474 @param aChar The 32-bit code point value of a Unicode character.
       
  1475 
       
  1476 @return True, if aChar is supplementary character; false, otherwise.
       
  1477 */
       
  1478 	{
       
  1479 	return (aChar > 0xFFFF);
       
  1480 	}
       
  1481 
       
  1482 inline TBool IsSurrogate(TText16 aInt16)
       
  1483 /**
       
  1484 @return True, if aText16 is high surrogate or low surrogate; false, otherwise.
       
  1485 */
       
  1486 	{
       
  1487 	return (aInt16 & 0xF800) == 0xD800;
       
  1488 	}
       
  1489 
       
  1490 inline TText16 GetHighSurrogate(TUint aChar)
       
  1491 /**
       
  1492 Retrieve the high surrogate of a supplementary character.
       
  1493 
       
  1494 @param aChar The 32-bit code point value of a Unicode character.
       
  1495 
       
  1496 @return High surrogate of aChar, if aChar is a supplementary character; 
       
  1497         aChar itself, if aChar is not a supplementary character.
       
  1498 */
       
  1499 	{
       
  1500 	return STATIC_CAST(TText16, 0xD7C0 + (aChar >> 10));
       
  1501 	}
       
  1502 
       
  1503 inline TText16 GetLowSurrogate(TUint aChar)
       
  1504 /**
       
  1505 Retrieve the low surrogate of a supplementary character.
       
  1506 
       
  1507 @param aChar The 32-bit code point value of a Unicode character.
       
  1508 
       
  1509 @return Low surrogate of aChar, if aChar is a supplementary character; 
       
  1510         zero, if aChar is not a supplementary character.
       
  1511 */
       
  1512 	{
       
  1513 	return STATIC_CAST(TText16, 0xDC00 | (aChar & 0x3FF));
       
  1514 	}
       
  1515 
       
  1516 void CTGlyphSelection::TestCodepoint(TUint aCodepoint, CFont* aFont)
       
  1517 /**
       
  1518  This helper routine is used by the test case 
       
  1519  CTGlyphSelection::TestCtrlCharsIgnored().
       
  1520 @param aCodepoint
       
  1521  The Unicode character to test.
       
  1522 @param aFont
       
  1523  The font to use in the test.
       
  1524 */
       
  1525 	{
       
  1526 	TInt expectResultPosInText;
       
  1527 
       
  1528 	const TInt KTestTextLen = 5;
       
  1529 	TBuf<16> testText(KTestTextLen);
       
  1530 	testText[0] = 'a';
       
  1531 	testText[1] = 'b';
       
  1532 	if (IsSupplementary(aCodepoint))
       
  1533 		{
       
  1534 		testText[2] = GetHighSurrogate(aCodepoint);
       
  1535 		testText[3] = GetLowSurrogate(aCodepoint);
       
  1536 		expectResultPosInText = 4;
       
  1537 		}
       
  1538 	else
       
  1539 		{
       
  1540 		testText[2] = aCodepoint;
       
  1541 		testText[3] = 'c';
       
  1542 		expectResultPosInText = 3;
       
  1543 		}
       
  1544 	testText[4] = 'd';
       
  1545 
       
  1546 	CFont::TPositionParam param;
       
  1547 	param.iDirection = CFont::EHorizontal;
       
  1548 	param.iFlags = CFont::TPositionParam::EFLogicalOrder;
       
  1549 	param.iText.Set(testText);
       
  1550 	param.iPen.iX = param.iPen.iY = 0;
       
  1551 	param.iPosInText = 2; 
       
  1552 	TBool r = aFont->GetCharacterPosition(param);
       
  1553 
       
  1554 	TEST(r && param.iPosInText == expectResultPosInText
       
  1555 		   && param.iPen.iX == 0 
       
  1556 		   && param.iOutputGlyphs == 0);
       
  1557 	}
       
  1558 
       
  1559 
       
  1560 void CTGlyphSelection::TestCtrlCharsIgnored()
       
  1561 /**
       
  1562  This method is a test case to test GetCharacterPosition() copes
       
  1563  with formatting and control characters in the text supplied by
       
  1564  ignoring them.
       
  1565 */
       
  1566 	{
       
  1567 	static const TUint testData[] = {
       
  1568 		// 1: Formatting control codes Unicode3-p499&p500
       
  1569 		0x200C, 0x200D, 0x200E, 0x200F,
       
  1570 		0x202A, 0x202B, 0x202C, 0x202D, 0x202E,
       
  1571 		// 3: Non-character codes Unicode3-p846 U+FFFE?
       
  1572 		// Original:
       
  1573 		// 0xFFFF 
       
  1574 		// 4: Latin Ctrl codes U+0000..U+001F, U+007F Unicode3-p???
       
  1575 		// 5: Latin Supplement Ctrl code U+0080..U+009F Unicode3-p???
       
  1576 		// 6: Supplementary characters (scripts outside BMP still not supported)
       
  1577 		};
       
  1578 	static const TUint testDataLength = sizeof(testData)/sizeof(testData[0]);
       
  1579 
       
  1580 	for (TUint i = 0; i < testDataLength; i++)
       
  1581 		TestCodepoint(testData[i], iTestFont);
       
  1582 	}
       
  1583 
       
  1584 
       
  1585 void CTGlyphSelection::TestLatinChars()
       
  1586 /**
       
  1587  This method is a test case to test GetCharacterPosition() correctly
       
  1588  processes characters from the Latin code page returning appropriate glyphs
       
  1589  codes.
       
  1590 */
       
  1591 	{
       
  1592 	TBool r;
       
  1593 	CFont::TPositionParam param;
       
  1594 	param.iDirection = CFont::EHorizontal;
       
  1595 	param.iFlags = CFont::TPositionParam::EFLogicalOrder;
       
  1596 	_LIT16(KText_aBc_1, "aBc 1");
       
  1597 	param.iText.Set(KText_aBc_1);
       
  1598 
       
  1599 	// 1: Latin glyph at start of text
       
  1600 	param.iPosInText = 0;
       
  1601 	param.iPen.iX = param.iPen.iY = 0;
       
  1602 	r = iTestFont->GetCharacterPosition(param);
       
  1603 	TEST(r && param.iPosInText == 1 
       
  1604 		   && param.iPen.iX == 10
       
  1605 		   && param.iOutputGlyphs == 1 
       
  1606 		   && param.iOutput[0].iCode == 'a');
       
  1607 
       
  1608 	// 2: Latin glyph in middle of text
       
  1609 	param.iPosInText = 1;
       
  1610 	param.iPen.iX = param.iPen.iY = 0;
       
  1611 	r = iTestFont->GetCharacterPosition(param);
       
  1612 	TEST(r && param.iPosInText == 2 
       
  1613 		   && param.iPen.iX == 10
       
  1614 		   && param.iOutputGlyphs == 1 
       
  1615 		   && param.iOutput[0].iCode == 'B');
       
  1616 
       
  1617 	// 3: Latin glyph at end of text
       
  1618 	param.iPosInText = 4;
       
  1619 	param.iPen.iX = param.iPen.iY = 0;
       
  1620 	r = iTestFont->GetCharacterPosition(param);
       
  1621 	TEST(r && param.iPosInText == 5 
       
  1622 		   && param.iPen.iX == 10
       
  1623 		   && param.iOutputGlyphs == 1 
       
  1624 		   && param.iOutput[0].iCode == '1');
       
  1625 
       
  1626 	// 4: Latin space glyph 
       
  1627 	param.iPosInText = 3;
       
  1628 	param.iPen.iX = param.iPen.iY = 0;
       
  1629 	r = iTestFont->GetCharacterPosition(param);
       
  1630 	TEST(r && param.iPosInText == 4 
       
  1631 		   && param.iPen.iX == 10
       
  1632 		   && param.iOutputGlyphs == 1 
       
  1633 		   && param.iOutput[0].iCode == ' ');
       
  1634 	}	
       
  1635 
       
  1636 
       
  1637 void CTGlyphSelection::TestSoftHyphen()
       
  1638 /**
       
  1639  This method is a test case to test GetCharacterPosition() correctly
       
  1640  processes soft hyphen chars by ignoring them if they are NOT at the
       
  1641  end of the text (aka end of the line).
       
  1642 */
       
  1643 	{
       
  1644 	TBool r;
       
  1645 	CFont::TPositionParam param;
       
  1646 	param.iDirection = CFont::EHorizontal;
       
  1647 	param.iFlags = CFont::TPositionParam::EFLogicalOrder;
       
  1648 	_LIT16(KText_DKNY, "DK\xadNY\xad");
       
  1649 	param.iText.Set(KText_DKNY);
       
  1650 
       
  1651 	// 1: Invoke on char before hyphen position 
       
  1652 	// This test returns only the glyph of the char before the hyphen
       
  1653 	// treating the hyphen as another base char which end scanning. 
       
  1654 	param.iPosInText = 1;
       
  1655 	param.iPen.iX = param.iPen.iY = 0;
       
  1656 	r = iTestFont->GetCharacterPosition(param);
       
  1657 	TEST(r && param.iPosInText == 2 
       
  1658 		   && param.iPen.iX == 10
       
  1659 		   && param.iOutputGlyphs == 1 
       
  1660 		   && param.iOutput[0].iCode == 'K');
       
  1661 
       
  1662 	// 2: Invoke on hyphen position
       
  1663 	// This test should show it ignores and skips soft hyphens returning
       
  1664 	// no hyphen glyph. This is because soft hyphen are not visible when
       
  1665 	// in middle of lines.
       
  1666 	param.iPosInText = 2;
       
  1667 	param.iPen.iX = param.iPen.iY = 0;
       
  1668 	r = iTestFont->GetCharacterPosition(param);
       
  1669 	TEST(r && param.iPosInText == 3 
       
  1670 		   && param.iPen.iX == 0
       
  1671 		   && param.iOutputGlyphs == 0);
       
  1672 
       
  1673 	// 3: Invoke on hyphen position when hyphen at end of text
       
  1674 	// This test should result in the hyphen glyph being returned as it
       
  1675 	// is expect to be visible when it is at the end of the text supplied.
       
  1676 	param.iPosInText = 5;
       
  1677 	param.iPen.iX = param.iPen.iY = 0;
       
  1678 	r = iTestFont->GetCharacterPosition(param);
       
  1679 	TEST(r && param.iPosInText == 6 
       
  1680 		   && param.iPen.iX == 10
       
  1681 		   && param.iOutputGlyphs == 1 
       
  1682 		   && param.iOutput[0].iCode == 0x00AD);
       
  1683 
       
  1684 	}	
       
  1685 
       
  1686 
       
  1687 void CTGlyphSelection::TestSurrogates()
       
  1688 /**
       
  1689  This method is a test case to test GetCharacterPosition() correctly
       
  1690  processes surrogate pairs.
       
  1691 */
       
  1692 	{
       
  1693 	static const TUint validPairs[] = {
       
  1694 	//  Hi		Lo		Code		Hi		Lo		Code		Hi		Lo		Code
       
  1695 		0xD800, 0xDC00, 0x00010000, 0xD800, 0xDE9A, 0x0001029A, 0xD800, 0xDFFF, 0x000103FF,
       
  1696 		0xD89A, 0xDC00, 0x00036800, 0xD89A, 0xDE9A, 0x00036A9A, 0xD89A, 0xDFFF, 0x00036BFF,
       
  1697 		0xDBFF, 0xDC00, 0x0010FC00, 0xDBFF, 0xDE9A, 0x0010FE9A, 0xDBFF, 0xDFFF, 0x0010FFFF
       
  1698 		};
       
  1699 	static const TUint validPairsLength = sizeof(validPairs)/sizeof(TText16);
       
  1700 
       
  1701 	TBool r;
       
  1702 	TBuf<20> testText(0);
       
  1703 	CFont::TPositionParam param;
       
  1704 	param.iDirection = CFont::EHorizontal;
       
  1705 	param.iFlags = CFont::TPositionParam::EFLogicalOrder;
       
  1706 
       
  1707 	// 1: Test valid surrogate pair chars
       
  1708 	testText.SetLength(5);
       
  1709 	testText[0] = 'a';
       
  1710 	testText[3] = 'D';
       
  1711 	testText[4] = '1';
       
  1712 	param.iText.Set(testText);
       
  1713 	for (TUint i = 0; i < validPairsLength/3; i+=3)
       
  1714 		{
       
  1715 		testText[1] = (TText16) validPairs[i];
       
  1716 		testText[2] = (TText16) validPairs[i+1];
       
  1717 		param.iPosInText = 1;
       
  1718 		param.iPen.iX = param.iPen.iY = 0;
       
  1719 		r = iTestFont->GetCharacterPosition(param);
       
  1720 		TEST(r && param.iPosInText == 3
       
  1721 				&& param.iPen.iX == 10
       
  1722 				&& param.iOutputGlyphs == 1
       
  1723 				&& param.iOutput[0].iCode == validPairs[i+2]);
       
  1724 		}
       
  1725 
       
  1726 	// 2: Test unpaired high surrogate chars
       
  1727 	testText[1] = 0xD809;
       
  1728 	testText[2] = 'a';
       
  1729 	param.iPosInText = 1;
       
  1730 	param.iPen.iX = param.iPen.iY = 0;
       
  1731 	r = iTestFont->GetCharacterPosition(param);
       
  1732 	TEST(r && param.iPosInText == 2
       
  1733 		   && param.iPen.iX == 0
       
  1734 		   && param.iOutputGlyphs == 0);
       
  1735 
       
  1736 	// 3: Test unpaired low surrogate chars
       
  1737 	testText[1] = 'a';
       
  1738 	testText[2] = 0xDC09;
       
  1739 	param.iPosInText = 2;
       
  1740 	param.iPen.iX = param.iPen.iY = 0;
       
  1741 	r = iTestFont->GetCharacterPosition(param);
       
  1742 	TEST(r && param.iPosInText == 3
       
  1743 		   && param.iPen.iX == 0
       
  1744 		   && param.iOutputGlyphs == 0);
       
  1745 
       
  1746 	// 4: Test latin/surrogate boundry ensuring surrogate not skipped!
       
  1747 	testText[1] = (TText16) validPairs[0];
       
  1748 	testText[2] = (TText16) validPairs[1];
       
  1749 	param.iPosInText = 0;
       
  1750 	param.iPen.iX = param.iPen.iY = 0;
       
  1751 	r = iTestFont->GetCharacterPosition(param);
       
  1752 	TEST(r && param.iPosInText == 1
       
  1753 		   && param.iPen.iX == 10
       
  1754 		   && param.iOutputGlyphs == 1
       
  1755 		   && param.iOutput[0].iCode =='a');
       
  1756 	}
       
  1757 
       
  1758 
       
  1759 /**
       
  1760 @SYMTestCaseID TI18N-GDI-CIT-4077
       
  1761 @SYMTestCaseDesc Automated GDI testing for GB18030 ExtB
       
  1762 @SYMTestPriority High
       
  1763 @SYMTestActions  Attempt to get glyph information for GB18030 ExtB characters.
       
  1764 @SYMTestExpectedResults The expected glyph clusters for given Unicode charactors must be returned
       
  1765 @SYMPREQ 2471: UTF-16 compliant text handling
       
  1766 */
       
  1767 void CTGlyphSelection::TestNonBmpCharsInGB18030(CFbsFont* aFont)
       
  1768 	{
       
  1769 	INFO_PRINTF1(_L("Test GB18030 non-BMP Glyphs"));	
       
  1770 	// Do the testing
       
  1771 	
       
  1772 	TBool r;
       
  1773 	TBuf<30> testText(0);
       
  1774 	CFont::TPositionParam param;
       
  1775 	param.iDirection = CFont::EHorizontal;
       
  1776 	param.iFlags = CFont::TPositionParam::EFLogicalOrder;
       
  1777 
       
  1778 	testText.SetLength(4);
       
  1779 	
       
  1780 	// 201AD = D840, DDAD
       
  1781 	testText[0] = 0xD840;
       
  1782 	testText[1] = 0xDDAD;
       
  1783 	
       
  1784 	// 253BB = D854, DFBB
       
  1785 	testText[2] = 0xD854;
       
  1786 	testText[3] = 0xDFBB;
       
  1787 		
       
  1788 	param.iText.Set(testText);
       
  1789 	
       
  1790 	RShapeInfo aShapeInfo;
       
  1791 
       
  1792 	// Do the testing
       
  1793 	
       
  1794 	param.iPosInText = 0;
       
  1795 	param.iPen.iX = param.iPen.iY = 0;
       
  1796 	r = aFont->GetCharacterPosition2(param, aShapeInfo);
       
  1797 
       
  1798 	TEST(r && param.iPosInText == 2 
       
  1799 		   && param.iOutputGlyphs == 1
       
  1800 		   && param.iOutput[0].iCode == 0x000201AD);
       
  1801 
       
  1802 	INFO_PRINTF5(_L("The result of this shaping is %d %d %d 0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
       
  1803 
       
  1804 	param.iPosInText = 2;
       
  1805 	param.iPen.iX = param.iPen.iY = 0;
       
  1806 	r = aFont->GetCharacterPosition2(param, aShapeInfo);
       
  1807 
       
  1808 	TEST(r && param.iPosInText == 4 
       
  1809 		   && param.iOutputGlyphs == 1
       
  1810 		   && param.iOutput[0].iCode == 0x000253BB);
       
  1811 
       
  1812 	
       
  1813 	INFO_PRINTF5(_L("The result of this shaping is %d %d %d 0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
       
  1814 	
       
  1815 	// Close aShapeInfo which releases any memory it is occupying
       
  1816 	if (aShapeInfo.IsOpen())
       
  1817 		aShapeInfo.Close();
       
  1818 		   
       
  1819 	}
       
  1820 
       
  1821 
       
  1822 void CTGlyphSelection::TestCombiningLatinChars()
       
  1823 /**
       
  1824  This method is a test case to test GetCharacterPosition() correctly
       
  1825  processes regular latin characters with diacritics.
       
  1826 */
       
  1827 	{
       
  1828 	TBool r;
       
  1829 	TBuf<20> testText(0);
       
  1830 	CFont::TPositionParam param;
       
  1831 	param.iDirection = CFont::EHorizontal;
       
  1832 	param.iFlags = CFont::TPositionParam::EFLogicalOrder;
       
  1833 
       
  1834 	testText.SetLength(10);
       
  1835 	testText[0] = 'A';
       
  1836 	testText[1] = ' ';
       
  1837 	testText[2] = 'A';
       
  1838 	testText[3] = 0x0300; // Above Grave Acent
       
  1839 	testText[4] = 'I';
       
  1840 	testText[5] = 0x0330; // Below Tidle 
       
  1841 	testText[6] = 'o';
       
  1842 	testText[7] = 0x0308; // Above Diaeresis
       
  1843 	testText[8] = 0x032F; // Below Inverted Breve
       
  1844 	testText[9] = 'M';
       
  1845 	param.iText.Set(testText);
       
  1846 
       
  1847 	// 1: Latin base with following space
       
  1848 	param.iPosInText = 0;
       
  1849 	param.iPen.iX = param.iPen.iY = 0;
       
  1850 	r = iTestFont->GetCharacterPosition(param);
       
  1851 	TEST(r && param.iPosInText == 1 
       
  1852 		   && param.iPen.iX == 10
       
  1853 		   && param.iOutputGlyphs == 1
       
  1854 		   && param.iOutput[0].iCode == 'A');
       
  1855 
       
  1856 	// 2: Latin base with 1 combining above diacritic
       
  1857 	param.iPosInText = 2;
       
  1858 	param.iPen.iX = param.iPen.iY = 0;
       
  1859 	r = iTestFont->GetCharacterPosition(param);
       
  1860 	// Will Compose A (0x41) followed by grave accent (0x300) into A grave (0xC0)
       
  1861 	TEST(r && param.iPosInText == 4 
       
  1862 		   && param.iPen.iX == 10
       
  1863 		   && param.iOutputGlyphs == 1
       
  1864 		   && param.iOutput[0].iCode == 0xC0
       
  1865 		   && param.iOutput[0].iBounds.iTl == TPoint(0,-10)
       
  1866 		   && param.iOutput[0].iBounds.iBr == TPoint(10,2));
       
  1867 
       
  1868 	// 3: Latin base with 1 combining below diacritic
       
  1869 	param.iPosInText = 4;
       
  1870 	param.iPen.iX = param.iPen.iY = 0;
       
  1871 	r = iTestFont->GetCharacterPosition(param);
       
  1872 	// Will compose I (0x49) with tilde below (0x330) into I with tilde below (0x1E2C)
       
  1873 	TEST(r && param.iPosInText == 6 
       
  1874 		   && param.iPen.iX == 10
       
  1875 		   && param.iOutputGlyphs == 1
       
  1876 		   && param.iOutput[0].iCode == 0x1E2C
       
  1877 		   && param.iOutput[0].iBounds.iTl == TPoint(0,-10)
       
  1878 		   && param.iOutput[0].iBounds.iBr == TPoint(10,2));
       
  1879 
       
  1880 	// 4: Latin base with 2 combining diacritic
       
  1881 	param.iPosInText = 6;
       
  1882 	param.iPen.iX = param.iPen.iY = 0;
       
  1883 	r = iTestFont->GetCharacterPosition(param);
       
  1884 	TEST(r && param.iPosInText == 9 
       
  1885 		   && param.iPen.iX == 10
       
  1886 		   && param.iOutputGlyphs == 3
       
  1887 		   && param.iOutput[0].iCode == 'o'
       
  1888 		   && param.iOutput[0].iBounds.iTl == TPoint(0,-10)
       
  1889 		   && param.iOutput[0].iBounds.iBr == TPoint(10,2)
       
  1890 		   && param.iOutput[1].iCode == 0x0308
       
  1891 		   && param.iOutput[1].iBounds.iTl == TPoint(0,-23)
       
  1892 		   && param.iOutput[1].iBounds.iBr == TPoint(10,-11)
       
  1893 		   && param.iOutput[2].iCode == 0x032F
       
  1894 		   && param.iOutput[2].iBounds.iTl == TPoint(0,3)
       
  1895 		   && param.iOutput[2].iBounds.iBr == TPoint(10,15));
       
  1896 
       
  1897 	// 5: Latin base with 9 combining chars, should exceed max output!
       
  1898 	testText[0] = 'a';
       
  1899 	testText[1] = 0x0300; // Above Grave Acent
       
  1900 	testText[2] = 0x0330; // Below Tidle 
       
  1901 	testText[3] = 0x0308; // Above Diaeresis
       
  1902 	testText[4] = 0x032F; // Below Inverted Breve
       
  1903 	testText[5] = 0x0300; // Above Grave Acent
       
  1904 	testText[6] = 0x0330; // Below Tidle 
       
  1905 	testText[7] = 0x0308; // Above Diaeresis
       
  1906 	testText[8] = 0x032F; // Below Inverted Breve
       
  1907 	testText[9] = 0x0300; // Above Grave Acent
       
  1908 	param.iPosInText = 0;
       
  1909 	param.iPen.iX = param.iPen.iY = 0;
       
  1910 	r = iTestFont->GetCharacterPosition(param);
       
  1911 	TEST(r && param.iPosInText == 8 
       
  1912 		   && param.iPen.iX == 10
       
  1913 		   && param.iOutputGlyphs == 8
       
  1914 		   && param.iOutput[0].iCode == 'a'
       
  1915 		   && param.iOutput[7].iCode == 0x0308);
       
  1916 	}
       
  1917 
       
  1918 /* 
       
  1919 Used for cleanup of RImplInfoArray implementationArray below 
       
  1920 This method is stolen from FbsTop.cpp
       
  1921 */
       
  1922 
       
  1923 LOCAL_C void ResetAndDestroyRImplInfoPtrArray(TAny* aPtr)
       
  1924 	{
       
  1925 	RImplInfoPtrArray* array = reinterpret_cast <RImplInfoPtrArray*> (aPtr);
       
  1926 	array->ResetAndDestroy();
       
  1927 	}
       
  1928 	
       
  1929 LOCAL_C void LoadOpenFontLibraries(CFontStore* aFontStore)
       
  1930 	{
       
  1931 
       
  1932 	RImplInfoPtrArray implementationArray;
       
  1933 	TCleanupItem cleanup(ResetAndDestroyRImplInfoPtrArray, &implementationArray);
       
  1934 	CleanupStack::PushL(cleanup);
       
  1935 	TInt error;
       
  1936 	TInt ecomerror;
       
  1937 	TInt ecomnotready;
       
  1938 	TUid uid = {KUidOpenFontRasterizerPlunginInterface};
       
  1939 
       
  1940 	// Making sure that no race situation arises
       
  1941 	// If ECom is not ready, give it another chance and try again. if it still doesn't work 
       
  1942 	// after the third try, then it just carries on quietly and fails... 
       
  1943 	for (ecomnotready =0; ecomnotready <3; ecomnotready++)
       
  1944 		{
       
  1945 		TRAP(ecomerror,REComSession::ListImplementationsL(uid,implementationArray));
       
  1946 		if (!ecomerror)
       
  1947 			{
       
  1948 			break;
       
  1949 			}
       
  1950 		else
       
  1951 			{
       
  1952 			ecomerror = 0; 	
       
  1953 			User::After(0);
       
  1954 			}
       
  1955 		}
       
  1956 
       
  1957 	const TInt availCount = implementationArray.Count();
       
  1958 	for (TInt count=0;count<availCount;++count)
       
  1959 		{
       
  1960 		const CImplementationInformation* info = implementationArray[count];
       
  1961 		TUid rasterizerUid = info->ImplementationUid();
       
  1962  		// Create a rasterizer
       
  1963  		COpenFontRasterizer* rasterizer=0;
       
  1964  		TRAP(error,rasterizer = COpenFontRasterizer::NewL(rasterizerUid));
       
  1965  		if (!error)
       
  1966    			{
       
  1967    			// Install it in the font store.
       
  1968    			TRAP(error,aFontStore->InstallRasterizerL(rasterizer));
       
  1969    			if (error)
       
  1970    				delete rasterizer;
       
  1971    			}
       
  1972 		}
       
  1973 	CleanupStack::PopAndDestroy(&implementationArray); 
       
  1974 
       
  1975 	}
       
  1976 	
       
  1977 void CTGlyphSelection::TestIsolatedCombiningLatinChars()
       
  1978 /**
       
  1979  This method is a test case to test GetCharacterPosition() correctly
       
  1980  processes isloated combining marks.
       
  1981 */
       
  1982 	{
       
  1983 	// Need to use a valid font so that GetCharacterPosition will be able to find the necessary glyph information.
       
  1984 	_LIT16(KTestFontFile, "C:\\s60ssb_v500.ttf");
       
  1985 	_LIT16(KTestFontFaceName, "Series 60 Sans");
       
  1986 	
       
  1987 	// create a font store for testing
       
  1988 	CFontStore* fontStore = CFontStore::NewL(&User::Heap());
       
  1989 	//load all ecom implemented rasterizer dlls. installs the rasterizer.	
       
  1990 	LoadOpenFontLibraries(fontStore);
       
  1991 	// test font preparation
       
  1992 	fontStore->iKPixelWidthInTwips = 11860; //This value is default
       
  1993 	//add any required font files
       
  1994 	TUid err = fontStore->AddFileL(KTestFontFile);
       
  1995 	TFontSpec testFontSpec(KTestFontFaceName,200); 
       
  1996 	 
       
  1997 	CFbsBitmap* bmp = new(ELeave) CFbsBitmap;
       
  1998 	
       
  1999 	TInt ret = bmp->Create(TSize(100,100),EGray2);
       
  2000 	if (ret == KErrNotSupported)
       
  2001 		return;
       
  2002 	else
       
  2003 		User::LeaveIfError(ret);
       
  2004 
       
  2005 	CFbsBitmapDevice* device = NULL;
       
  2006 	TRAPD(err2,device = CFbsBitmapDevice::NewL(bmp));
       
  2007 	TEST(err2 == KErrNone);
       
  2008 
       
  2009 	CFbsBitGc* gc = NULL;
       
  2010 	User::LeaveIfError(device->CreateContext(gc));
       
  2011 	// Font file Creation
       
  2012 	CFbsFont* testFont = NULL;
       
  2013 	User::LeaveIfError(device->GetNearestFontToDesignHeightInTwips(testFont,testFontSpec));
       
  2014 	gc->UseFont(testFont);
       
  2015 	CleanupStack::PushL(testFont);
       
  2016 	
       
  2017 	// Now start the test case:
       
  2018 	
       
  2019 	TBool r;
       
  2020 	TBuf<20> testText(0);
       
  2021 	CFont::TPositionParam param;
       
  2022 	param.iFlags = CFont::TPositionParam::EFLogicalOrder;
       
  2023 	
       
  2024 	testText.SetLength(7);
       
  2025 	testText[0] = 0x0323; 	//Below Dot
       
  2026 	testText[1] = ' ';
       
  2027 	testText[2] = 0x0300;   //Above Grave Acent
       
  2028 	testText[3] = ' ';
       
  2029 	testText[4] = 0x0323;	//Below Dot
       
  2030 	testText[5] = 0x0300;	//Above Grave Acent
       
  2031 	testText[6] = 0x0301; 	//Above Acute Acent
       
  2032 	param.iText.Set(testText);
       
  2033 	
       
  2034 	// 1: Test the bounds for combining below mark in isolation
       
  2035 	param.iPosInText = 0;
       
  2036 	param.iPen.iX = param.iPen.iY = 0;
       
  2037 	r = testFont->GetCharacterPosition(param);
       
  2038 
       
  2039 	TEST(r && param.iPosInText == 1 
       
  2040 		   && param.iOutputGlyphs == 1 
       
  2041 		   && param.iOutput[0].iCode == 0x0323);
       
  2042 	
       
  2043 	#if defined __WINS__ || defined __WINSCW__
       
  2044 	TEST(r && param.iPen == TPoint(0,0)
       
  2045 		   && param.iOutput[0].iBounds.iTl == TPoint(-6,1)
       
  2046 		   && param.iOutput[0].iBounds.iBr == TPoint(-4,3));
       
  2047 	#endif
       
  2048 	
       
  2049 	// 2: Test the bounds for combining above mark in isolation
       
  2050 	param.iPosInText = 1;
       
  2051 	param.iPen.iX = param.iPen.iY = 0;
       
  2052 	r = testFont->GetCharacterPosition(param);
       
  2053 
       
  2054 	TEST(r && param.iPosInText == 3
       
  2055 		   && param.iOutputGlyphs == 2 
       
  2056 		   && param.iOutput[1].iCode == 0x0300);
       
  2057 
       
  2058 	#if defined __WINS__ || defined __WINSCW__
       
  2059 	TEST(r && param.iPen == TPoint(4,0) 
       
  2060 		   && param.iOutput[1].iBounds.iTl == TPoint(-2,-15)
       
  2061 		   && param.iOutput[1].iBounds.iBr == TPoint(2,-12));
       
  2062 	#endif
       
  2063 		
       
  2064 	// 3: Test the bounds for multiple combing marks in isolation
       
  2065 	param.iPosInText = 3;
       
  2066 	param.iPen.iX = param.iPen.iY = 0;
       
  2067 	r = testFont->GetCharacterPosition(param);
       
  2068 
       
  2069 	TEST(r && param.iPosInText == 7 
       
  2070 		   && param.iOutputGlyphs == 4
       
  2071 		   && param.iOutput[1].iCode == 0x0323
       
  2072 		   && param.iOutput[2].iCode == 0x0300
       
  2073 		   && param.iOutput[3].iCode == 0x0301);
       
  2074 
       
  2075 	#if defined __WINS__ || defined __WINSCW__
       
  2076 	TEST(r && param.iPen == TPoint(4,0)
       
  2077 		   && param.iOutput[1].iBounds.iTl == TPoint(-1,1)
       
  2078 		   && param.iOutput[1].iBounds.iBr == TPoint(1,3)
       
  2079            && param.iOutput[2].iBounds.iTl == TPoint(-2,-16)
       
  2080            && param.iOutput[2].iBounds.iBr == TPoint(2,-13)
       
  2081            && param.iOutput[3].iBounds.iTl == TPoint(-2,-20)
       
  2082            && param.iOutput[3].iBounds.iBr == TPoint(2,-17));
       
  2083 	#endif
       
  2084 	
       
  2085 	// Done with the font, pop it off.
       
  2086 	CleanupStack::Pop(testFont);
       
  2087 	
       
  2088 	//Cleaning the memory
       
  2089 	delete bmp;
       
  2090 	delete device;
       
  2091 	delete gc;
       
  2092 	fontStore->RemoveFile(err);
       
  2093 	delete fontStore;
       
  2094 	REComSession::FinalClose();
       
  2095 	}
       
  2096 
       
  2097 
       
  2098 void CTGlyphSelection::TestContextInShapeInfo()
       
  2099 /**
       
  2100  This method is a test case to test GetCharacterPosition2() correctly
       
  2101  handle context.
       
  2102 */
       
  2103 	{
       
  2104 	TBool r;
       
  2105 	TBuf<20> testText(0);
       
  2106 	CFont::TPositionParam param;
       
  2107 	param.iFlags = CFont::TPositionParam::EFLogicalOrder;
       
  2108 	RShapeInfo shapeInfo;
       
  2109 	
       
  2110 	//test control characters which has not defined processFun in TTableEntry
       
  2111 	testText.SetLength(7);
       
  2112 	testText[0] = 0xffff; 	//control character, test for the range { 0xFFFE,   0xFFFF,   0}
       
  2113 	testText[1] = '1';
       
  2114 	testText[2] = 0x200E;   //control character, test for the range { 0x200C,   0x200F,   0}
       
  2115 	testText[3] = '.';  
       
  2116 	testText[4] = 'a';
       
  2117 	testText[5] = 0x202A;   //control character, test for the range { 0x202A,   0x202E,   0}
       
  2118 	testText[6] = ',';
       
  2119 		
       
  2120 	param.iText.Set(testText);
       
  2121 	
       
  2122 	// 1. Test '0xffff' as NULL context at position zero - 
       
  2123 	// 0xffff should not be taken as context, and character '1' can be rendered correctly 
       
  2124 	param.iPosInText = 1;
       
  2125 	param.iPen.iX = param.iPen.iY = 0;
       
  2126 	r = iTestFont->GetCharacterPosition2(param, shapeInfo);
       
  2127 	TEST(r && param.iPosInText == 2 
       
  2128 		   && param.iOutputGlyphs == 1 
       
  2129 		   && param.iOutput[0].iCode == 49);
       
  2130 	
       
  2131 	// 2. Test '0x200E' - 0x200E is not rendered, either not treated as context.
       
  2132 	// character '.' and 'a' should be rendered correctly.
       
  2133 	param.iPosInText = 2;
       
  2134 	param.iPen.iX = param.iPen.iY = 0;
       
  2135 	r = iTestFont->GetCharacterPosition2(param, shapeInfo);
       
  2136 	TEST(r && param.iPosInText == 3 
       
  2137 		   && param.iOutputGlyphs == 0);
       
  2138 			
       
  2139 	param.iPosInText = 3;
       
  2140 	param.iPen.iX = param.iPen.iY = 0;
       
  2141 	r = iTestFont->GetCharacterPosition2(param, shapeInfo);
       
  2142 	TEST(r && param.iPosInText == 4 
       
  2143 		   && param.iOutputGlyphs == 1
       
  2144 		   && param.iOutput[0].iCode == 46);
       
  2145 
       
  2146 	param.iPosInText = 4;
       
  2147 	param.iPen.iX = param.iPen.iY = 0;
       
  2148 	r = iTestFont->GetCharacterPosition2(param, shapeInfo);
       
  2149 	TEST(r && param.iPosInText == 5 
       
  2150 		   && param.iOutputGlyphs == 1
       
  2151 		   && param.iOutput[0].iCode == 'a');
       
  2152 	
       
  2153 	// 3. Test '0x202A' - 0x202A is not rendered, either not treated as context.
       
  2154 	// character ',' should be rendered correctly. 
       
  2155 	param.iPosInText = 5;
       
  2156 	param.iPen.iX = param.iPen.iY = 0;
       
  2157 	r = iTestFont->GetCharacterPosition2(param, shapeInfo);
       
  2158 	TEST(r && param.iPosInText == 6 
       
  2159 		   && param.iOutputGlyphs == 0);
       
  2160 	
       
  2161 	param.iPosInText = 6;
       
  2162 	param.iPen.iX = param.iPen.iY = 0;
       
  2163 	r = iTestFont->GetCharacterPosition2(param, shapeInfo);
       
  2164 	TEST(r && param.iPosInText == 7 
       
  2165 		   && param.iOutputGlyphs == 1
       
  2166 		   && param.iOutput[0].iCode == 44);
       
  2167 	}
       
  2168 
       
  2169 /**
       
  2170 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-1580
       
  2171 @SYMTestCaseDesc Automated GDI testing for Hindi
       
  2172 @SYMTestPriority High
       
  2173 @SYMTestActions  Attempt to compose various valid and invalid Hindi glyph clusters.
       
  2174 @SYMTestExpectedResults The expected glyph clusters for given Unicode charactors must be returned
       
  2175 @SYMPREQ 18: Hindi for Bravo
       
  2176 */
       
  2177 void CTGlyphSelection::TestHindiChars(CFbsFont* aFont)
       
  2178 	{
       
  2179 	INFO_PRINTF1(_L("Test Hindi Glyphs"));	
       
  2180 	// Do the testing
       
  2181 	
       
  2182 	TBool r;
       
  2183 	TBuf<30> testText(0);
       
  2184 	CFont::TPositionParam param;
       
  2185 	param.iDirection = CFont::EHorizontal;
       
  2186 	param.iFlags = CFont::TPositionParam::EFLogicalOrder;
       
  2187 
       
  2188 	testText.SetLength(30);
       
  2189 	
       
  2190 	testText[0] = 0x0930;
       
  2191 	testText[1] = 0x093C;
       
  2192 	testText[2] = 0x094D;
       
  2193 	testText[3] = 0x0915;
       
  2194 	
       
  2195 	testText[4] = 0x0915;
       
  2196 	testText[5] = 0x094D;
       
  2197 	testText[6] = 0x0915;
       
  2198 	
       
  2199 	testText[7] = 0x0930;
       
  2200 	testText[8] = 0x094D;
       
  2201 	testText[9] = 0x0915;
       
  2202 	
       
  2203 	testText[10] = 0x0915;
       
  2204 	testText[11] = 0x094D;
       
  2205 	testText[12] = 0x0930;
       
  2206 	
       
  2207 	testText[13] = 0x0915;
       
  2208 	testText[14] = 0x094D;
       
  2209 	testText[15] = 0x0937;
       
  2210 	
       
  2211 	testText[16] = 0x0915;
       
  2212 	testText[17] = 0x094D;
       
  2213 	testText[18] = 0x0930;
       
  2214 	testText[19] = 0x094D;
       
  2215 	testText[20] = 0x092A;
       
  2216 	
       
  2217 	/*	When the following character 0x0036 is shaped, the context will be taken into consideration when
       
  2218 		determining the glyph for 0x0036 
       
  2219 		The context for 0x0036 is the Devanagari character 0x092A at position (iPosInText) 20
       
  2220 	**/
       
  2221 	testText[21] = 0x0036;
       
  2222 	testText[22] = 0x094D;
       
  2223 	
       
  2224 	testText[23] = 0x0020;
       
  2225 	
       
  2226 	// INC101103: Strings containing ZWJ do not get rendered properly for Hindi 
       
  2227 	testText[24] = 0x092E;
       
  2228 	testText[25] = 0x094D;
       
  2229 	testText[26] = 0x200D;
       
  2230 	testText[27] = 0x092E; 
       
  2231 	testText[28] = 0x093F;
       
  2232 	testText[29] = 0x200D;
       
  2233 		
       
  2234 	param.iText.Set(testText);
       
  2235 	
       
  2236 	RShapeInfo aShapeInfo;
       
  2237 
       
  2238 	// Do the testing
       
  2239 	
       
  2240 	param.iPosInText = 0;
       
  2241 	param.iPen.iX = param.iPen.iY = 0;
       
  2242 	r = aFont->GetCharacterPosition2(param, aShapeInfo);
       
  2243 
       
  2244 	TEST(r && param.iPosInText == 4 
       
  2245 		   && param.iOutputGlyphs == 2
       
  2246 		   && param.iOutput[0].iCode == 0x80000108
       
  2247 		   && param.iOutput[1].iCode == 0x80000072);
       
  2248 
       
  2249 	#if defined __WINS__ || defined __WINSCW__
       
  2250 	TEST(r && param.iPen.iX == 17);
       
  2251 	#endif
       
  2252 	
       
  2253 	INFO_PRINTF6(_L("The result of this shaping is %d %d %d 0x%x 0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
       
  2254 
       
  2255 	param.iPosInText = 4;
       
  2256 	param.iPen.iX = param.iPen.iY = 0;
       
  2257 	r = aFont->GetCharacterPosition2(param, aShapeInfo);
       
  2258 
       
  2259 	TEST(r && param.iPosInText == 7 
       
  2260 		   && param.iOutputGlyphs == 1
       
  2261 		   && param.iOutput[0].iCode == 0x800001C2);
       
  2262 
       
  2263 	#if defined __WINS__ || defined __WINSCW__
       
  2264 	TEST(r && param.iPen.iX == 12);
       
  2265 	#endif
       
  2266 	
       
  2267 	INFO_PRINTF5(_L("The result of this shaping is %d %d %d 0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
       
  2268 	
       
  2269 	param.iPosInText = 7;
       
  2270 	param.iPen.iX = param.iPen.iY = 0;
       
  2271 	r = aFont->GetCharacterPosition2(param, aShapeInfo);
       
  2272 
       
  2273 	TEST(r && param.iPosInText == 10 
       
  2274 		   && param.iOutputGlyphs == 2
       
  2275 		   && param.iOutput[0].iCode == 0x80000072
       
  2276 		   && param.iOutput[1].iCode == 0x80000130);
       
  2277 
       
  2278 	#if defined __WINS__ || defined __WINSCW__
       
  2279 	TEST(r && param.iPen.iX == 11);
       
  2280 	#endif
       
  2281 	
       
  2282 	INFO_PRINTF6(_L("The result of this shaping is %d %d %d 0x%x 0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
       
  2283 	
       
  2284 	param.iPosInText = 10;
       
  2285 	param.iPen.iX = param.iPen.iY = 0;
       
  2286 	r = aFont->GetCharacterPosition2(param, aShapeInfo);
       
  2287 
       
  2288 	TEST(r && param.iPosInText == 13 
       
  2289 		   && param.iOutputGlyphs == 1
       
  2290 		   && param.iOutput[0].iCode == 0x80000136);
       
  2291 
       
  2292 	#if defined __WINS__ || defined __WINSCW__
       
  2293 	TEST(r && param.iPen.iX == 12);
       
  2294 	#endif
       
  2295 	
       
  2296 	INFO_PRINTF5(_L("The result of this shaping is %d %d %d 0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
       
  2297 	
       
  2298 	param.iPosInText = 13;
       
  2299 	param.iPen.iX = param.iPen.iY = 0;
       
  2300 	r = aFont->GetCharacterPosition2(param, aShapeInfo);
       
  2301 
       
  2302 	TEST(r && param.iPosInText == 16 
       
  2303 		   && param.iOutputGlyphs == 1
       
  2304 		   && param.iOutput[0].iCode == 0x800001BE);
       
  2305 
       
  2306 	#if defined __WINS__ || defined __WINSCW__
       
  2307 	TEST(r && param.iPen.iX == 12);
       
  2308 	#endif
       
  2309 	
       
  2310 	INFO_PRINTF5(_L("The result of this shaping is %d %d %d 0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
       
  2311 
       
  2312 	param.iPosInText = 16;
       
  2313 	param.iPen.iX = param.iPen.iY = 0;
       
  2314 	r = aFont->GetCharacterPosition2(param, aShapeInfo);
       
  2315 
       
  2316 	TEST(r && param.iPosInText == 21 
       
  2317 		   && param.iOutputGlyphs == 2
       
  2318 		   && param.iOutput[0].iCode == 0x8000017A
       
  2319 		   && param.iOutput[1].iCode == 0x80000087);
       
  2320 	
       
  2321 	#if defined __WINS__ || defined __WINSCW__
       
  2322 	TEST(r && param.iPen.iX == 18);
       
  2323 	#endif
       
  2324 	
       
  2325 	INFO_PRINTF6(_L("The result of this shaping is %d %d %d 0x%x 0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
       
  2326 
       
  2327 	/*	The following shaping will consider the context when determining the glyph for 0x0036 Digit character 
       
  2328 		The context for 0x0036 is the Devanagari character 0x092A at position (iPosInText) 20
       
  2329 	**/
       
  2330 	param.iPosInText = 21;
       
  2331 	param.iPen.iX = param.iPen.iY = 0;
       
  2332 	r = aFont->GetCharacterPosition2(param, aShapeInfo);
       
  2333 
       
  2334 	TEST(r && param.iPosInText == 22 
       
  2335 		   && param.iOutputGlyphs == 1
       
  2336 		   && param.iOutput[0].iCode == 0x80000016);
       
  2337 	
       
  2338 	#if defined __WINS__ || defined __WINSCW__
       
  2339 	TEST(r && param.iPen.iX == 9);
       
  2340 	#endif
       
  2341 	
       
  2342 	INFO_PRINTF5(_L("The result of this shaping is %d %d %d 0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
       
  2343 
       
  2344 	// INC101103: Strings containing ZWJ do not get rendered properly for Hindi 
       
  2345 	param.iPosInText = 24;
       
  2346 	param.iPen.iX = param.iPen.iY = 0;
       
  2347 	r = aFont->GetCharacterPosition2(param, aShapeInfo);
       
  2348 	// We are mainly testing the position in text after rendering, which should be at the end of the syllable
       
  2349 	// that should include the ZWJ and any consonant that follows it
       
  2350 	TEST(r && param.iPosInText == 29 
       
  2351 		   && param.iOutputGlyphs == 3
       
  2352 		   && param.iOutput[0].iCode == 0x80000272
       
  2353 		   && param.iOutput[1].iCode == 0x80000105
       
  2354 		   && param.iOutput[2].iCode == 0x8000008B);
       
  2355 		   
       
  2356 	// Close aShapeInfo which releases any memory it is occupying
       
  2357 	if (aShapeInfo.IsOpen())
       
  2358 		aShapeInfo.Close();
       
  2359 		   
       
  2360 	}
       
  2361 	
       
  2362 /**
       
  2363 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-3381
       
  2364 @SYMTestCaseDesc Automated GDI testing for Kannada
       
  2365 @SYMTestPriority High
       
  2366 @SYMTestActions  Attempt to compose various valid and invalid Kannada glyph clusters.
       
  2367 @SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
       
  2368 @SYMPREQ 19: Kannada for Ogmha
       
  2369 */
       
  2370 	
       
  2371 void CTGlyphSelection::TestKannadaChars(CFbsFont* aFont)
       
  2372 	{
       
  2373 INFO_PRINTF1(_L("Test Kannada Glyphs"));
       
  2374 	
       
  2375 	TBuf<79> testText(0);
       
  2376 	CFont::TPositionParam param;
       
  2377 	param.iDirection = CFont::EHorizontal;
       
  2378 	param.iFlags = CFont::TPositionParam::EFLogicalOrder;
       
  2379 
       
  2380 	testText.SetLength(79);
       
  2381 	//Testdata for kannada Langauage
       
  2382 	
       
  2383 	testText[0] = 0x0C95;
       
  2384 	testText[1] = 0x0CCD;
       
  2385 	testText[2] = 0x0020; 
       
  2386 	
       
  2387 	testText[3] = 0x0CAF;
       
  2388 	testText[4] = 0x0CCD;
       
  2389 	testText[5] = 0x0020;
       
  2390 	
       
  2391 	testText[6] = 0x0C99;
       
  2392 	testText[7] = 0x0CCD;
       
  2393 	testText[8] = 0x0020;
       
  2394 	
       
  2395 	testText[9] = 0x0CA3;
       
  2396 	testText[10] = 0x0CCD;
       
  2397 	testText[11] = 0x0020;
       
  2398 	
       
  2399 	testText[12] = 0x0C95;
       
  2400 	testText[13] = 0x0CC3;
       
  2401 	
       
  2402 	testText[14] = 0x0CA4;
       
  2403 	testText[15] = 0x0CC6;
       
  2404 	
       
  2405 	testText[16] = 0x0C9D;
       
  2406 	testText[17] = 0x0CBE;
       
  2407 	
       
  2408 	testText[18] = 0x0C9E;
       
  2409 	testText[19] = 0x0CBE;
       
  2410 	
       
  2411 	testText[20] = 0x0CA3;
       
  2412 	testText[21] = 0x0CBE;
       
  2413 	
       
  2414 	testText[22] = 0x0CB3;
       
  2415 	testText[23] = 0x0CC6;
       
  2416 	
       
  2417 	testText[24] = 0x0C9D;
       
  2418 	testText[25] = 0x0CC6;
       
  2419 	
       
  2420 	testText[26] = 0x0CAC;
       
  2421 	testText[27] = 0x0CC6;
       
  2422 	
       
  2423 	testText[28] = 0x0C9F;
       
  2424 	testText[29] = 0x0CC6;
       
  2425 	
       
  2426 	testText[30] = 0x0C99;
       
  2427 	testText[31] = 0x0CC6;
       
  2428 	
       
  2429 	testText[32] = 0x0CA3;
       
  2430 	testText[33] = 0x0CC6;
       
  2431 	
       
  2432 	testText[34] = 0x0C95;
       
  2433 	testText[35] = 0x0CBF;
       
  2434 	
       
  2435 	testText[36] = 0x0CB8;
       
  2436 	testText[37] = 0x0CBF;
       
  2437 	
       
  2438 	testText[38] = 0x0CA1;
       
  2439 	testText[39] = 0x0CBF;
       
  2440 	
       
  2441 	testText[40] = 0x0CA6;
       
  2442 	testText[41] = 0x0CBF;
       
  2443 	
       
  2444 	testText[42] = 0x0C9D;
       
  2445 	testText[43] = 0x0CBF;
       
  2446 	
       
  2447 	testText[44] = 0x0C9D;
       
  2448 	testText[45] = 0x0CC1;
       
  2449 	
       
  2450 	testText[46] = 0x0CB5;
       
  2451 	testText[47] = 0x0CC1;
       
  2452 	
       
  2453 	testText[48] = 0x0C95;
       
  2454 	testText[49] = 0x0CC2;
       
  2455 	
       
  2456 	testText[50] = 0x0CAA;
       
  2457 	testText[51] = 0x0CC2;
       
  2458 	
       
  2459 	testText[52] = 0x0CAE;
       
  2460 	testText[53] = 0x0CCC;
       
  2461 	
       
  2462 	testText[54] = 0x0C95;
       
  2463 	
       
  2464 	testText[55] = 0x0CB0;
       
  2465 	testText[56] = 0x200D;
       
  2466 	testText[57] = 0x0CCD;
       
  2467 	testText[58] = 0x0CAE;
       
  2468 	
       
  2469 	testText[59] = 0x0020;
       
  2470 	
       
  2471 	testText[60] = 0x0CB0;
       
  2472 	testText[61] = 0x200D;
       
  2473 	testText[62] = 0x0CCD;
       
  2474 	testText[63] = 0x0CB0;
       
  2475 	testText[64] = 0x200D;
       
  2476 	testText[65] = 0x0CCD;
       
  2477 	
       
  2478 	
       
  2479 	testText[66] = 0x0CB0;
       
  2480 	testText[67] = 0x200D;
       
  2481 	testText[68] = 0x0CCD;
       
  2482 	testText[69] = 0x0CB0;
       
  2483 	testText[70] = 0x0CCD;
       
  2484 	testText[71] = 0x0CB0;
       
  2485 	testText[72] = 0x0CCD;
       
  2486 	testText[73] = 0x0CB0;
       
  2487 	testText[74] = 0x0CCD;
       
  2488 	testText[75] = 0x0CB0;
       
  2489 	
       
  2490 	// DEF103276: Kannada rendering: IcuLayoutEngine does not recongnise 0X0C8E as a vowel
       
  2491 	testText[76] = 0x0020;
       
  2492 	testText[77] = 0x0C8E;
       
  2493 	testText[78] = 0x0C82;
       
  2494 	// End of DEF103276: Kannada rendering: IcuLayoutEngine does not recongnise 0X0C8E as a vowel
       
  2495 
       
  2496 	param.iText.Set(testText);
       
  2497 
       
  2498 	// Do the testing
       
  2499 	
       
  2500 	TBool r;
       
  2501 	param.iPosInText = 0;
       
  2502 	param.iPen.iX = param.iPen.iY = 0;
       
  2503 	RShapeInfo shapeInfo;
       
  2504 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  2505 
       
  2506 	TEST(r && param.iPosInText ==2 
       
  2507 		   && param.iOutputGlyphs == 1 
       
  2508 		   && param.iOutput[0].iCode == 0x80000839);
       
  2509 
       
  2510 	#if defined __WINS__ || defined __WINSCW__
       
  2511 	TEST(r && param.iPen.iX == 16);
       
  2512 	#endif
       
  2513 	
       
  2514 	INFO_PRINTF5(_L("The values of this shaping of Ka + Virama are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
       
  2515     
       
  2516 	param.iPosInText = 3;
       
  2517 	param.iPen.iX = param.iPen.iY = 0;
       
  2518 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  2519 
       
  2520 	TEST(r && param.iPosInText == 5
       
  2521 		   && param.iOutputGlyphs ==1
       
  2522 		   && param.iOutput[0].iCode == 0x80000852 );
       
  2523 
       
  2524 	#if defined __WINS__ || defined __WINSCW__
       
  2525 	TEST(r && param.iPen.iX == 27);
       
  2526 	#endif
       
  2527 	
       
  2528 	INFO_PRINTF5(_L("The values of this shaping Ya + Virama are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
       
  2529 	
       
  2530 	param.iPosInText = 6;
       
  2531 	param.iPen.iX = param.iPen.iY = 0;
       
  2532 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  2533 
       
  2534 	TEST(r && param.iPosInText == 8
       
  2535 		   && param.iOutputGlyphs == 1 
       
  2536 		   && param.iOutput[0].iCode ==0x8000083D);
       
  2537 
       
  2538 	#if defined __WINS__ || defined __WINSCW__
       
  2539 	TEST(r && param.iPen.iX == 19);
       
  2540 	#endif
       
  2541 	
       
  2542 	INFO_PRINTF5(_L("The result of this shaping for Nya + Virama iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
       
  2543 	
       
  2544 	param.iPosInText = 9;
       
  2545 	param.iPen.iX = param.iPen.iY = 0;
       
  2546 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  2547 
       
  2548 	TEST(r && param.iPosInText == 11
       
  2549 		   && param.iOutputGlyphs ==1 
       
  2550 		   && param.iOutput[0].iCode == 0x80000847);
       
  2551 
       
  2552 	#if defined __WINS__ || defined __WINSCW__
       
  2553 	TEST(r && param.iPen.iX == 20);
       
  2554 	#endif
       
  2555 	
       
  2556 	INFO_PRINTF5(_L("The result of this shaping for NNA + Virama iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
       
  2557 	
       
  2558 	param.iPosInText = 12;
       
  2559 	param.iPen.iX = param.iPen.iY = 0;
       
  2560 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  2561 
       
  2562 	TEST(r && param.iPosInText == 14
       
  2563 		   && param.iOutputGlyphs == 2 
       
  2564 		   && param.iOutput[0].iCode == 0x800007A8
       
  2565 		   && param.iOutput[1].iCode == 0x800007D2);
       
  2566 
       
  2567 	#if defined __WINS__ || defined __WINSCW__
       
  2568 	TEST(r && param.iPen.iX == 12);
       
  2569 	#endif
       
  2570 
       
  2571 	INFO_PRINTF6(_L("The result of this shaping for Ka + Matra Vocalic R iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
       
  2572 
       
  2573 	param.iPosInText = 14;
       
  2574 	param.iPen.iX = param.iPen.iY = 0;
       
  2575 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  2576 
       
  2577 	TEST(r && param.iPosInText == 16
       
  2578 		   && param.iOutputGlyphs == 1 
       
  2579 		   && param.iOutput[0].iCode == 0x8000088f);
       
  2580 
       
  2581 	#if defined __WINS__ || defined __WINSCW__
       
  2582 	TEST(r && param.iPen.iX == 11);
       
  2583 	#endif
       
  2584 	
       
  2585 	INFO_PRINTF5(_L("The result of this shaping for Ta + Matra AA iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
       
  2586 
       
  2587 	param.iPosInText = 16;
       
  2588 	param.iPen.iX = param.iPen.iY = 0;
       
  2589 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  2590 
       
  2591 	TEST(r && param.iPosInText == 18
       
  2592 		   && param.iOutputGlyphs == 2
       
  2593 		   && param.iOutput[0].iCode == 0x8000081E 
       
  2594 		   && param.iOutput[1].iCode == 0x800007CD);
       
  2595 
       
  2596 	#if defined __WINS__ || defined __WINSCW__
       
  2597 	TEST(r && param.iPen.iX == 29);
       
  2598 	#endif
       
  2599 	
       
  2600 	INFO_PRINTF6(_L("The result of this shaping  for Jha + Matra AA iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
       
  2601 	
       
  2602 	param.iPosInText = 18;
       
  2603 	param.iPen.iX = param.iPen.iY = 0;
       
  2604 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  2605 
       
  2606 	TEST(r && param.iPosInText == 20
       
  2607 		   && param.iOutputGlyphs == 2
       
  2608 		   && param.iOutput[0].iCode == 0x800007b1
       
  2609 		   && param.iOutput[1].iCode == 0x800007cd);
       
  2610 
       
  2611 	#if defined __WINS__ || defined __WINSCW__
       
  2612 	TEST(r && param.iPen.iX == 23);
       
  2613 	#endif
       
  2614 	
       
  2615 	INFO_PRINTF6(_L("The result of this shaping for Nya + Matra AA iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
       
  2616 	
       
  2617 	
       
  2618 	param.iPosInText = 20;
       
  2619 	param.iPen.iX = param.iPen.iY = 0;
       
  2620 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  2621 
       
  2622 	TEST(r && param.iPosInText == 22
       
  2623 		   && param.iOutputGlyphs == 2 
       
  2624 		   && param.iOutput[0].iCode == 0x80000823
       
  2625 		   && param.iOutput[1].iCode == 0x800007CD );
       
  2626 
       
  2627 	#if defined __WINS__ || defined __WINSCW__
       
  2628 	TEST(r && param.iPen.iX == 21);
       
  2629 	#endif
       
  2630 	    
       
  2631 	INFO_PRINTF6(_L("The result of this shaping for Nna + Matra AA iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
       
  2632 	
       
  2633 	param.iPosInText = 22;
       
  2634 	param.iPen.iX = param.iPen.iY = 0;
       
  2635 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  2636 
       
  2637 	TEST(r && param.iPosInText == 24
       
  2638 		   && param.iOutputGlyphs == 1 
       
  2639 		   && param.iOutput[0].iCode == 0x8000089C);
       
  2640 
       
  2641 	#if defined __WINS__ || defined __WINSCW__
       
  2642 	TEST(r && param.iPen.iX == 12);
       
  2643 	#endif
       
  2644 	
       
  2645 	INFO_PRINTF5(_L("The result of this shaping for  LLa + Matra E iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
       
  2646 	
       
  2647 	param.iPosInText = 24;
       
  2648 	param.iPen.iX = param.iPen.iY = 0;
       
  2649 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  2650 
       
  2651 	TEST(r && param.iPosInText == 26
       
  2652 		   && param.iOutputGlyphs == 1 
       
  2653 		   && param.iOutput[0].iCode == 0x80000889);
       
  2654 
       
  2655 	#if defined __WINS__ || defined __WINSCW__
       
  2656 	TEST(r && param.iPen.iX == 22);
       
  2657 	#endif
       
  2658 	
       
  2659 	INFO_PRINTF5(_L("The result of this shaping for Jha + Matra E iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
       
  2660 	 
       
  2661 	 param.iPosInText = 26;
       
  2662 	param.iPen.iX = param.iPen.iY = 0;
       
  2663 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  2664 
       
  2665 	TEST(r && param.iPosInText == 28
       
  2666 		   && param.iOutputGlyphs == 1
       
  2667 		   && param.iOutput[0].iCode == 0x80000896 );
       
  2668 
       
  2669 	#if defined __WINS__ || defined __WINSCW__
       
  2670 	TEST(r && param.iPen.iX == 13);
       
  2671 	#endif
       
  2672 	
       
  2673 	INFO_PRINTF5(_L("The result of this shaping for Ba + Matra E iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
       
  2674 	
       
  2675 	param.iPosInText = 28;
       
  2676 	param.iPen.iX = param.iPen.iY = 0;
       
  2677 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  2678 
       
  2679 	TEST(r && param.iPosInText == 30
       
  2680 		   && param.iOutputGlyphs == 1 
       
  2681 		   && param.iOutput[0].iCode == 0x8000088a);
       
  2682 
       
  2683 	#if defined __WINS__ || defined __WINSCW__
       
  2684 	TEST(r && param.iPen.iX == 13);
       
  2685 	#endif
       
  2686 	
       
  2687 	INFO_PRINTF5(_L("The result of this shaping for Tta + Matra E iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
       
  2688 	
       
  2689 	param.iPosInText = 30;
       
  2690 	param.iPen.iX = param.iPen.iY = 0;
       
  2691 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  2692 
       
  2693 	TEST(r && param.iPosInText == 32
       
  2694 		   && param.iOutputGlyphs == 2
       
  2695 		   && param.iOutput[0].iCode == 0x800007ac
       
  2696 		   && param.iOutput[1].iCode == 0x800007d4 );
       
  2697 
       
  2698 	#if defined __WINS__ || defined __WINSCW__
       
  2699 	TEST(r && param.iPen.iX == 19);
       
  2700 	#endif
       
  2701 	
       
  2702 	INFO_PRINTF6(_L("The result of this shaping for Nya + Matra E iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
       
  2703 	
       
  2704 	param.iPosInText = 32;
       
  2705 	param.iPen.iX = param.iPen.iY = 0;
       
  2706 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  2707 
       
  2708 	TEST(r && param.iPosInText == 34
       
  2709 		   && param.iOutputGlyphs == 1 
       
  2710 		   && param.iOutput[0].iCode == 0x8000088e);
       
  2711 
       
  2712 	#if defined __WINS__ || defined __WINSCW__
       
  2713 	TEST(r && param.iPen.iX == 14);
       
  2714 	#endif
       
  2715 	
       
  2716 	INFO_PRINTF5(_L("The result of this shaping for Nna + Matra E iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
       
  2717 	
       
  2718 	param.iPosInText = 34;
       
  2719 	param.iPen.iX = param.iPen.iY = 0;
       
  2720 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  2721 
       
  2722 	TEST(r && param.iPosInText == 36
       
  2723 		   && param.iOutputGlyphs == 1
       
  2724 		   && param.iOutput[0].iCode == 0x80000860 );
       
  2725 
       
  2726 	#if defined __WINS__ || defined __WINSCW__
       
  2727 	TEST(r && param.iPen.iX == 10);
       
  2728 	#endif
       
  2729 		
       
  2730 	INFO_PRINTF5(_L("The result of this shaping for Ka + Matra I iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
       
  2731 	
       
  2732 	param.iPosInText = 36;
       
  2733 	param.iPen.iX = param.iPen.iY = 0;
       
  2734 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  2735 
       
  2736 	TEST(r && param.iPosInText == 38
       
  2737 		   && param.iOutputGlyphs == 1
       
  2738 		   && param.iOutput[0].iCode == 0x8000087e );
       
  2739 
       
  2740 	#if defined __WINS__ || defined __WINSCW__
       
  2741 	TEST(r && param.iPen.iX == 11);
       
  2742 	#endif
       
  2743 	
       
  2744 	INFO_PRINTF5(_L("The result of this shaping for Sa + Matra I iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
       
  2745 	
       
  2746 	param.iPosInText = 38;
       
  2747 	param.iPen.iX = param.iPen.iY = 0;
       
  2748 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  2749 
       
  2750 	TEST(r && param.iPosInText == 40
       
  2751 		   && param.iOutputGlyphs == 1
       
  2752 		   && param.iOutput[0].iCode == 0x8000086a);
       
  2753 
       
  2754 	#if defined __WINS__ || defined __WINSCW__
       
  2755 	TEST(r && param.iPen.iX == 12);
       
  2756 	#endif
       
  2757 	
       
  2758 	INFO_PRINTF5(_L("The result of this shaping for Dda + Matra I iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
       
  2759 	
       
  2760 	param.iPosInText = 40;
       
  2761 	param.iPen.iX = param.iPen.iY = 0;
       
  2762 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  2763 
       
  2764 	TEST(r && param.iPosInText == 42
       
  2765 		   && param.iOutputGlyphs == 1 
       
  2766 		   && param.iOutput[0].iCode == 0x8000086f);
       
  2767 
       
  2768 	#if defined __WINS__ || defined __WINSCW__
       
  2769 	TEST(r && param.iPen.iX == 12);
       
  2770 	#endif
       
  2771 	
       
  2772 	INFO_PRINTF5(_L("The result of this shaping for Va + Matra I iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
       
  2773 	
       
  2774 	param.iPosInText = 42;
       
  2775 	param.iPen.iX = param.iPen.iY = 0;
       
  2776 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  2777 
       
  2778 	TEST(r && param.iPosInText == 44
       
  2779 		   && param.iOutputGlyphs == 1 
       
  2780 		   && param.iOutput[0].iCode == 0x80000867 );
       
  2781 
       
  2782 	#if defined __WINS__ || defined __WINSCW__
       
  2783 	TEST(r && param.iPen.iX == 22);
       
  2784 	#endif
       
  2785 	
       
  2786 	INFO_PRINTF5(_L("The result of this shaping for Jha + Matra I iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
       
  2787 	
       
  2788 	param.iPosInText = 44;
       
  2789 	param.iPen.iX = param.iPen.iY = 0;
       
  2790 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  2791 
       
  2792 	TEST(r && param.iPosInText == 46
       
  2793 		   && param.iOutputGlyphs == 2
       
  2794 		   && param.iOutput[0].iCode == 0x800007b0 
       
  2795 		   && param.iOutput[1].iCode == 0x800007d0);
       
  2796 
       
  2797 	#if defined __WINS__ || defined __WINSCW__
       
  2798 	TEST(r && param.iPen.iX == 28);
       
  2799 	#endif
       
  2800 	
       
  2801 	INFO_PRINTF6(_L("The result of this shaping for Jha + Matra U iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
       
  2802 	
       
  2803 	param.iPosInText = 46;
       
  2804 	param.iPen.iX = param.iPen.iY = 0;
       
  2805 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  2806 
       
  2807 	TEST(r && param.iPosInText == 48
       
  2808 		   && param.iOutputGlyphs == 2
       
  2809 		   && param.iOutput[0].iCode == 0x800007c6
       
  2810 		   && param.iOutput[1].iCode == 0x800007d0);
       
  2811 
       
  2812 	#if defined __WINS__ || defined __WINSCW__
       
  2813 	TEST(r && param.iPen.iX == 18);
       
  2814 	#endif
       
  2815 	
       
  2816 	INFO_PRINTF6(_L("The result of this shaping for Va + Matra U iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
       
  2817 
       
  2818 
       
  2819 	param.iPosInText = 48;
       
  2820 	param.iPen.iX = param.iPen.iY = 0;
       
  2821 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  2822 
       
  2823 	TEST(r && param.iPosInText == 50
       
  2824 		   && param.iOutputGlyphs == 2
       
  2825 		   && param.iOutput[0].iCode == 0x800007a8
       
  2826 		   && param.iOutput[1].iCode == 0x800007d1 );
       
  2827 
       
  2828 	#if defined __WINS__ || defined __WINSCW__
       
  2829 	TEST(r && param.iPen.iX == 20);
       
  2830 	#endif
       
  2831 	
       
  2832 	INFO_PRINTF6(_L("The result of this shaping for Ka Matra UU iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode,param.iOutput[1].iCode);	
       
  2833 
       
  2834 	param.iPosInText = 50;
       
  2835 	param.iPen.iX = param.iPen.iY = 0;
       
  2836 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  2837 
       
  2838 	TEST(r && param.iPosInText == 52 
       
  2839 		   && param.iOutputGlyphs == 2
       
  2840 		   && param.iOutput[0].iCode == 0x800007bc
       
  2841 		   && param.iOutput[1].iCode == 0x800008a5);
       
  2842 
       
  2843 	#if defined __WINS__ || defined __WINSCW__
       
  2844 	TEST(r && param.iPen.iX == 21);
       
  2845 	#endif
       
  2846 	
       
  2847 	INFO_PRINTF6(_L("The result of this shaping for Pa + Matra UU iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);	
       
  2848 	
       
  2849 	
       
  2850 	param.iPosInText = 52;
       
  2851 	param.iPen.iX = param.iPen.iY = 0;
       
  2852 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  2853 
       
  2854 	TEST(r && param.iPosInText == 54 
       
  2855 		   && param.iOutputGlyphs == 2
       
  2856 		   && param.iOutput[0].iCode == 0x8000082d  
       
  2857 		   && param.iOutput[1].iCode == 0x800007d9);
       
  2858 
       
  2859 	#if defined __WINS__ || defined __WINSCW__
       
  2860 	TEST(r && param.iPen.iX == 26);
       
  2861 	#endif
       
  2862 
       
  2863 	INFO_PRINTF6(_L("The result of this shaping for Ma + Matra UU iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);	
       
  2864 		
       
  2865 	param.iPosInText = 55;
       
  2866 	param.iPen.iX = param.iPen.iY = 0;
       
  2867 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  2868 
       
  2869 	TEST(r && param.iPosInText == 59 
       
  2870 		   && param.iOutputGlyphs == 2
       
  2871 		   && param.iOutput[0].iCode == 0x800007c2 
       
  2872 		   && param.iOutput[1].iCode == 0x80000809);
       
  2873 
       
  2874 	#if defined __WINS__ || defined __WINSCW__
       
  2875 	TEST(r && param.iPen.iX == 17);
       
  2876 	#endif
       
  2877 	
       
  2878 	INFO_PRINTF6(_L("The result of this shaping for Ma + Matra UU iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[2].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);	
       
  2879 			
       
  2880 	param.iPosInText = 60;
       
  2881 	param.iPen.iX = param.iPen.iY = 0;
       
  2882 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  2883 	TEST(r && param.iPosInText == 64 
       
  2884 		   && param.iOutputGlyphs == 2
       
  2885 		   && param.iOutput[0].iCode == 0x800007c2 
       
  2886 		   && param.iOutput[1].iCode == 0x8000080b);
       
  2887 	INFO_PRINTF6(_L("Results are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x "), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);	
       
  2888 			
       
  2889 	param.iPosInText = 66;
       
  2890 	param.iPen.iX = param.iPen.iY = 0;
       
  2891 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  2892 	TEST(r && param.iPosInText == 75 
       
  2893 		   && param.iOutputGlyphs == 5
       
  2894 		   && param.iOutput[0].iCode == 0x800007c2 
       
  2895 		   && param.iOutput[1].iCode == 0x8000080b
       
  2896 		   && param.iOutput[2].iCode == 0x800008db
       
  2897 		   && param.iOutput[3].iCode == 0x800008db
       
  2898 		   && param.iOutput[4].iCode == 0x800007da);
       
  2899 	INFO_PRINTF7(_L("Results are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x iOutput[2].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode, param.iOutput[2].iCode);
       
  2900 	
       
  2901 	// DEF103276: Kannada rendering: IcuLayoutEngine does not recongnise 0X0C8E as a vowel
       
  2902 	param.iPosInText = 77;
       
  2903 	param.iPen.iX = param.iPen.iY = 0;
       
  2904 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  2905 	TEST(r && param.iPosInText == 79 
       
  2906 		   && param.iOutputGlyphs == 2
       
  2907 		   && param.iOutput[0].iCode == 0x800007A2
       
  2908 		   && param.iOutput[1].iCode == 0x80000798);
       
  2909 
       
  2910 	INFO_PRINTF5(_L("DEF103276 Vowel E + Anusvara: iPosInText=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);	
       
  2911 	//End of DEF103276: Kannada rendering: IcuLayoutEngine does not recongnise 0X0C8E as a vowel
       
  2912 			
       
  2913 	}
       
  2914 	
       
  2915 /**
       
  2916 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-3360
       
  2917 @SYMTestCaseDesc Automated GDI testing for Marathi
       
  2918 @SYMTestPriority High
       
  2919 @SYMTestActions  Attempt to compose various valid and invalid Marathi glyph clusters.
       
  2920 @SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
       
  2921 @SYMPREQ 19: Marathi for Ogmha
       
  2922 */
       
  2923 
       
  2924 void CTGlyphSelection::TestMarathiChars(CFbsFont* aFont)
       
  2925 	{
       
  2926 	INFO_PRINTF1(_L("Test Marathi Glyphs"));	
       
  2927 	
       
  2928 	TBool r;
       
  2929 	TBuf<47> testText(0);
       
  2930 	CFont::TPositionParam param;
       
  2931 	param.iDirection = CFont::EHorizontal;
       
  2932 	param.iFlags = CFont::TPositionParam::EFLogicalOrder;
       
  2933 
       
  2934 	testText.SetLength(47);
       
  2935 	
       
  2936 	//Testdata
       
  2937 	testText[0] = 0x0905; 
       
  2938 	testText[1] = 0x0945;
       
  2939 	
       
  2940 	testText[2] = 0x0931;
       
  2941 	testText[3] = 0x094D;
       
  2942 	testText[4] = 0x0915;
       
  2943 	
       
  2944 	testText[5] = 0x0930;
       
  2945 	testText[6] = 0x094D;
       
  2946 	testText[7] = 0x200D;
       
  2947 	testText[8] = 0x0915;
       
  2948 	
       
  2949 	testText[9] = 0x0905;
       
  2950 	testText[10] = 0x200D;
       
  2951 	testText[11] = 0x0945;
       
  2952 	
       
  2953 	testText[12] = 0x0909;
       
  2954 	testText[13] = 0x0945;
       
  2955 	
       
  2956 	testText[14] = 0x0915;
       
  2957 	testText[15] = 0x200D;
       
  2958 	testText[16] = 0x0945;
       
  2959 	
       
  2960 	// DEF102132: Marathi - Certain sequence of characters does not work correctly
       
  2961 	testText[17] = 0x0905;
       
  2962 	testText[18] = 0x0945;
       
  2963 	testText[19] = 0x0901;
       
  2964 	
       
  2965 	testText[20] = 0x0905;
       
  2966 	testText[21] = 0x200D;
       
  2967 	testText[22] = 0x0945;
       
  2968 	testText[23] = 0x0901;
       
  2969 	// End of DEF102132: Marathi - Certain sequence of characters does not work correctly
       
  2970 
       
  2971 	
       
  2972 	// DEF102858: Marathi - State table does not allow explicit half forms followed by modifiers
       
  2973 	testText[24] = 0x0020;
       
  2974 	
       
  2975 	testText[25] = 0x0930;
       
  2976 	testText[26] = 0x094D;
       
  2977 	testText[27] = 0x200D;
       
  2978 	testText[28] = 0x0901;
       
  2979 	// End of DEF102858: Marathi - State table does not allow explicit half forms followed by modifiers
       
  2980 	
       
  2981 	// INC104705  Marathi input: Incorrect movement of cursor with eyelash ra forming ligature. 
       
  2982 	testText[29] = 0x0020;
       
  2983 	
       
  2984 	testText[30] = 0x0930; 
       
  2985 	testText[31] = 0x094D;
       
  2986 	testText[32] = 0x200D;
       
  2987 	testText[33] = 0x0930; 
       
  2988 	testText[34] = 0x094D;
       
  2989 	testText[35] = 0x200D;
       
  2990 	testText[36] = 0x0930; 
       
  2991 	testText[37] = 0x094D;
       
  2992 	testText[38] = 0x200D;
       
  2993 	testText[39] = 0x0930; 
       
  2994 	testText[40] = 0x094D;
       
  2995 	testText[41] = 0x200D;
       
  2996 	testText[42] = 0x0930; 
       
  2997 	testText[43] = 0x094D;
       
  2998 	testText[44] = 0x200D;
       
  2999 	// End of INC104705  Marathi input: Incorrect movement of cursor with eyelash ra forming ligature. 
       
  3000 
       
  3001 	// INC116507: Halant get attached with an independent vowel.
       
  3002 	testText[45] = 0x0905;
       
  3003 	testText[46] = 0x094D;
       
  3004 	// End of INC116507: Halant get attached with an independent vowel.
       
  3005 	
       
  3006 	//To Do
       
  3007 	
       
  3008 	param.iText.Set(testText); 
       
  3009 	
       
  3010 	// Test CANDRA A: Independent Vowel A + CANDRA E
       
  3011 	param.iPosInText = 0;
       
  3012 	param.iPen.iX = param.iPen.iY = 0;
       
  3013 	RShapeInfo shapeInfo;
       
  3014 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  3015 
       
  3016 	TEST(r && param.iPosInText == 2 
       
  3017 		   && param.iOutputGlyphs == 2
       
  3018 		   && param.iOutput[0].iCode == 0x80000528 
       
  3019 		   && param.iOutput[1].iCode == 0x80000566);
       
  3020 
       
  3021 	#if defined __WINS__ || defined __WINSCW__
       
  3022 	TEST(r && param.iPen.iX == 12);
       
  3023 	#endif
       
  3024 	
       
  3025 	INFO_PRINTF6(_L("The result of shaping CANDRA A is %d %d %d 0x%x 0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
       
  3026 
       
  3027 	
       
  3028 	// Test Eyelash RA post Unicode 3.0: RRA + VIRAMA + CONSONANT
       
  3029 	param.iPosInText = 2 ;
       
  3030 	param.iPen.iX = param.iPen.iY = 0;
       
  3031 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  3032 
       
  3033 	TEST(r && param.iPosInText == 5 
       
  3034 		   && param.iOutputGlyphs == 2
       
  3035 		   && param.iOutput[0].iCode == 0x800005d3
       
  3036 		   && param.iOutput[1].iCode == 0x80000538);
       
  3037 
       
  3038 	#if defined __WINS__ || defined __WINSCW__
       
  3039 	TEST(r && param.iPen.iX == 18);
       
  3040 	#endif
       
  3041 	
       
  3042 	INFO_PRINTF6(_L("The result of shaping post Unicode 3.0 Eyelash RA is %d %d %d 0x%x 0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
       
  3043 	
       
  3044 	// Test Eyelash RA pre Unicode 3.0: RA + VIRAMA + ZWJ + CONSONANT
       
  3045 	param.iPosInText = 5;
       
  3046 	param.iPen.iX = param.iPen.iY = 0;
       
  3047 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  3048 
       
  3049 	TEST(r && param.iPosInText == 9 
       
  3050 		   && param.iOutputGlyphs == 2
       
  3051 		   && param.iOutput[0].iCode == 0x800005d3
       
  3052 		   && param.iOutput[1].iCode == 0x80000538);
       
  3053 
       
  3054 	#if defined __WINS__ || defined __WINSCW__
       
  3055 	TEST(r && param.iPen.iX == 18);
       
  3056 	#endif
       
  3057 	
       
  3058 	INFO_PRINTF6(_L("The result of shaping pre Unicode 3.0 Eyelash RA is %d %d %d 0x%x 0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
       
  3059 	
       
  3060 	// Test second form of CANDRA A: Independent Vowel A + ZWJ + CANDRA E
       
  3061 	param.iPosInText = 9;
       
  3062 	param.iPen.iX = param.iPen.iY = 0;
       
  3063 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  3064 
       
  3065 	TEST(r && param.iPosInText == 12 
       
  3066 		   && param.iOutputGlyphs == 2
       
  3067 		   && param.iOutput[0].iCode == 0x80000528
       
  3068 		   && param.iOutput[1].iCode == 0x80000566 );
       
  3069 
       
  3070 	#if defined __WINS__ || defined __WINSCW__
       
  3071 	TEST(r && param.iPen.iX == 12);
       
  3072 	#endif
       
  3073 	
       
  3074 	INFO_PRINTF6(_L("The result of shaping second form of CANDRA A is %d %d %d 0x%x 0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
       
  3075 	
       
  3076 	// Test that CANDRA E does not join with any other independent vowel
       
  3077 	param.iPosInText = 12;
       
  3078 	param.iPen.iX = param.iPen.iY = 0;
       
  3079 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  3080 
       
  3081 	TEST(r && param.iPosInText == 13 
       
  3082 		   && param.iOutputGlyphs == 1
       
  3083 		   && param.iOutput[0].iCode == 0x8000052c);
       
  3084 
       
  3085 	#if defined __WINS__ || defined __WINSCW__
       
  3086 	TEST(r && param.iPen.iX == 9);
       
  3087 	#endif
       
  3088 
       
  3089 	INFO_PRINTF5(_L("The result of shaping any other Independent Vowel + CANDRA E is %d %d %d 0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
       
  3090 	
       
  3091 	// Test that the second form of CANDRA A (i.e. using ZWJ) doesn't work for CONSONANTS (illegal)
       
  3092 	param.iPosInText = 14;
       
  3093 	param.iPen.iX = param.iPen.iY = 0;
       
  3094 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  3095 
       
  3096 	TEST(r && param.iPosInText == 15 
       
  3097 		   && param.iOutputGlyphs == 1
       
  3098 		   && param.iOutput[0].iCode == 0x80000538);
       
  3099 
       
  3100 	#if defined __WINS__ || defined __WINSCW__
       
  3101 	TEST(r && param.iPen.iX == 11);
       
  3102 	#endif
       
  3103 	
       
  3104 	INFO_PRINTF5(_L("The result of shaping CONSONANT + ZWJ + CANDRA E is %d %d %d 0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
       
  3105 	
       
  3106 	// DEF102132: Marathi - Certain sequence of characters does not work correctly
       
  3107 	param.iPosInText = 17;
       
  3108 	param.iPen.iX = param.iPen.iY = 0;
       
  3109 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  3110 	
       
  3111 	TEST(r && param.iPosInText == 20 
       
  3112 		   && param.iOutputGlyphs == 2
       
  3113 		   && param.iOutput[0].iCode == 0x80000528
       
  3114 		   && param.iOutput[1].iCode == 0x8000069d);
       
  3115 
       
  3116 	
       
  3117 	INFO_PRINTF5(_L("DEF102132 Independent Vowel A + CANDRA E + Vowel Modifier %d %d 0x%x 0x%x"), param.iPosInText, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
       
  3118 	
       
  3119 	param.iPosInText = 20;
       
  3120 	param.iPen.iX = param.iPen.iY = 0;
       
  3121 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  3122 	
       
  3123 	TEST(r && param.iPosInText == 23 
       
  3124 		   && param.iOutputGlyphs == 2
       
  3125 		   && param.iOutput[0].iCode == 0x80000528
       
  3126 		   && param.iOutput[1].iCode == 0x8000069d);
       
  3127 	
       
  3128 	INFO_PRINTF5(_L("DEF102132 Independent Vowel A + ZWJ + CANDRA E + Vowel Modifier %d %d 0x%x 0x%x"), param.iPosInText, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
       
  3129   	// End of DEF102132: Marathi - Certain sequence of characters does not work correctly
       
  3130   	
       
  3131 	// DEF102858: Marathi - State table does not allow explicit half forms followed by modifiers
       
  3132 	param.iPosInText = 25;
       
  3133 	param.iPen.iX = param.iPen.iY = 0;
       
  3134 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  3135 	TEST(r && param.iPosInText == 29 
       
  3136 		   && param.iOutputGlyphs == 2
       
  3137 		   && param.iOutput[0].iCode == 0x800005D3
       
  3138 		   && param.iOutput[1].iCode == 0x80000524);
       
  3139 	
       
  3140 	INFO_PRINTF5(_L("DEF102858 Ra + Virama + ZWJ + Modifier %d %d 0x%x 0x%x"), param.iPosInText, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
       
  3141 	// End of DEF102858: Marathi - State table does not allow explicit half forms followed by modifiers
       
  3142 	
       
  3143 	// INC104705  Marathi input: Incorrect movement of cursor with eyelash ra forming ligature. 
       
  3144 	param.iPosInText = 30;
       
  3145 	param.iPen.iX = param.iPen.iY = 0;
       
  3146 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  3147 	TEST(r && param.iPosInText == 42 
       
  3148 		   && param.iOutputGlyphs == 5
       
  3149 		   && param.iOutput[0].iCode == 0x800005D3
       
  3150 		   && param.iOutput[1].iCode == 0x800005D3
       
  3151 		   && param.iOutput[2].iCode == 0x800005B8
       
  3152 		   && param.iOutput[3].iCode == 0x80000553
       
  3153 		   && param.iOutput[4].iCode == 0x8000056E);
       
  3154 	#if defined __WINS__ || defined __WINSCW__
       
  3155 	TEST(param.iPen.iX == 20);
       
  3156 	#endif
       
  3157 	
       
  3158 	INFO_PRINTF7(_L("INC104705 Ra + Virama + ZWJ + Ra + Virama + ZWJ + Ra + Virama + ZWJ + Ra + Virama + ZWJ + Ra + Virama + ZWJ  %d %d 0x%x 0x%x 0x%x 0x%x"), param.iPosInText, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode, param.iOutput[2].iCode, param.iOutput[3].iCode);
       
  3159 	// End of INC104705  Marathi input: Incorrect movement of cursor with eyelash ra forming ligature. 
       
  3160 	
       
  3161 	// INC116507: Halant get attached with an independent vowel.
       
  3162 	param.iPosInText = 45;
       
  3163 	param.iPen.iX = param.iPen.iY = 0;
       
  3164 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  3165 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  3166 
       
  3167 	TEST(r && param.iPosInText == 47 
       
  3168 		   && param.iOutputGlyphs == 2
       
  3169 		   && param.iOutput[0].iCode == 0x8000058F
       
  3170 		   && param.iOutput[1].iCode == 0x8000056E);
       
  3171 
       
  3172 	#if defined __WINS__ || defined __WINSCW__
       
  3173 	TEST(r && param.iPen.iX == 21);
       
  3174 	#endif
       
  3175 
       
  3176 	INFO_PRINTF6(_L("INC116507: Independent Vowel A + Halant  %d %d %d 0x%x 0x%x"), param.iPosInText, param.iOutputGlyphs, param.iPen.iX, param.iOutput[0].iCode, param.iOutput[1].iCode);
       
  3177 	// End of INC116507: Halant get attached with an independent vowel.
       
  3178 
       
  3179 	}
       
  3180 	
       
  3181 /**
       
  3182 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-3417
       
  3183 @SYMTestCaseDesc Automated GDI testing for Gujarati
       
  3184 @SYMTestPriority High
       
  3185 @SYMTestActions  Attempt to compose various valid and invalid gujarati glyph clusters.
       
  3186 @SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
       
  3187 @SYMPREQ 19: Gujarati for Ogmha
       
  3188 */
       
  3189 	
       
  3190 	
       
  3191 void CTGlyphSelection::TestGujaratiChars(CFbsFont* aFont)
       
  3192 	{
       
  3193 	INFO_PRINTF1(_L("Test Gujarati Glyphs"));
       
  3194 	
       
  3195 	// Do the testing
       
  3196 	
       
  3197 	TBool r;
       
  3198 	TBuf<162> testText(0);
       
  3199 	CFont::TPositionParam param;
       
  3200 	param.iDirection = CFont::EHorizontal;
       
  3201 	param.iFlags = CFont::TPositionParam::EFLogicalOrder;
       
  3202 
       
  3203 	testText.SetLength(162);
       
  3204 	//Testdata for gujarati Langauage
       
  3205 	
       
  3206 	testText[0] = 0x0AAC;
       
  3207 	testText[1] = 0x0ACD;
       
  3208 	testText[2] = 0x200D;
       
  3209 	testText[3] = 0x0020;
       
  3210 	
       
  3211 	testText[4] = 0x0A96;
       
  3212 	testText[5] = 0x0ACD;
       
  3213 	testText[6] = 0x0A97;
       
  3214 	testText[7] = 0x0ACD;
       
  3215 	testText[8] = 0x0A98;
       
  3216 	testText[9] = 0x0ACD;
       
  3217 	testText[10] = 0x0A9A;
       
  3218 	
       
  3219 	testText[11] = 0x0A95;
       
  3220 	testText[12] = 0x0ACD;
       
  3221 	testText[13] = 0x0A9C;	
       
  3222 	testText[14] = 0x200D;
       
  3223 	testText[15] = 0x0020;
       
  3224 
       
  3225 	testText[16] = 0x0A99;
       
  3226 	testText[17] = 0x0ACD;
       
  3227 	testText[18] = 0x0A9B;
       
  3228 	testText[19] = 0x0ACD;
       
  3229 	testText[20] = 0x0A9F;
       
  3230 	testText[21] = 0x0ACD;
       
  3231 	testText[22] = 0x0AA0;
       
  3232 	
       
  3233 	//Requirement (GUJ003)
       
  3234 	
       
  3235 	testText[23] = 0x0A95;
       
  3236 	testText[24] = 0x0ACD;
       
  3237 	testText[25] = 0x0AB7;
       
  3238 	
       
  3239 	
       
  3240 	testText[26] = 0x0A95;
       
  3241 	testText[27] = 0x0ACD;
       
  3242 	testText[28] = 0x0AB7;
       
  3243 	testText[29] = 0x0ACD;
       
  3244 	testText[30] = 0x0AA4;
       
  3245 	
       
  3246 	testText[31] = 0x0A9C;
       
  3247 	testText[32] = 0x0ACD;
       
  3248 	testText[33] = 0x0AB7;
       
  3249 	testText[34] = 0x0ACD;
       
  3250 	testText[35] = 0x0AA4;
       
  3251 	
       
  3252 	testText[36] = 0x0A9C;
       
  3253 	testText[37] = 0x0ACD;
       
  3254 	testText[38] = 0x0A9E;
       
  3255 	testText[39] = 0x0ACD;
       
  3256 	testText[40] = 0x0AA4;
       
  3257 	
       
  3258 	//Requirement (GUJ 005)
       
  3259 	
       
  3260 	testText[41] = 0x0AB0;
       
  3261 	testText[42] = 0x0ACD;
       
  3262 	testText[43] = 0x0A95;
       
  3263 	
       
  3264 	testText[44] = 0x0AB0;
       
  3265 	testText[45] = 0x0ACD;
       
  3266 	testText[46] = 0x0A95;
       
  3267 	testText[47] = 0x0AC9;
       
  3268 	
       
  3269 	testText[48] = 0x0AB0;
       
  3270 	testText[49] = 0x0ACD;
       
  3271 	testText[50] = 0x0A95;
       
  3272 	testText[51] = 0x0A82;
       
  3273 	
       
  3274 	testText[52] = 0x0AB0;
       
  3275 	testText[53] = 0x0ACD;
       
  3276 	testText[54] = 0x0A95;
       
  3277 	testText[55] = 0x0AC9;
       
  3278 	testText[56] = 0x0A82;
       
  3279 	testText[57] = 0x0020;
       
  3280 	
       
  3281 	//Requirement (GUJ 006)
       
  3282 	
       
  3283 	testText[58] = 0x0A97;
       
  3284 	testText[59] = 0x0ACD;
       
  3285 	testText[60] = 0x0AB0;
       
  3286 	
       
  3287 	testText[61] = 0x0A9A;
       
  3288 	testText[62] = 0x0ACD;
       
  3289 	testText[63] = 0x0AB0;
       
  3290 	
       
  3291 	testText[64] = 0x0A97;
       
  3292 	testText[65] = 0x0ACD;
       
  3293 	testText[66] = 0x0AB0;
       
  3294 	testText[67] = 0x0ACD;
       
  3295 	testText[68] = 0x0AA4;
       
  3296 	
       
  3297 	testText[69] = 0x0A9A;
       
  3298 	testText[70] = 0x0ACD;
       
  3299 	testText[71] = 0x0AB0;
       
  3300 	testText[72] = 0x0ACD;
       
  3301 	testText[73] = 0x0AA4;
       
  3302 	
       
  3303 	//Requirement (GUJ 007)
       
  3304 	
       
  3305 	testText[74] = 0x0A95;
       
  3306 	testText[75] = 0x0ACD;
       
  3307 	testText[76] = 0x0AB0;
       
  3308 	
       
  3309 	testText[77] = 0x0A9C;
       
  3310 	testText[78] = 0x0ACD;
       
  3311 	testText[79] = 0x0AB0;
       
  3312 	
       
  3313 	testText[80] = 0x0A95;
       
  3314 	testText[81] = 0x0ACD;
       
  3315 	testText[82] = 0x0AB0;
       
  3316 	testText[83] = 0x0ACD;
       
  3317 	testText[84] = 0x0AA4;
       
  3318 	
       
  3319 	testText[85] = 0x0A9C;
       
  3320 	testText[86] = 0x0ACD;
       
  3321 	testText[87] = 0x0AB0;
       
  3322 	testText[88] = 0x0ACD;
       
  3323 	testText[89] = 0x0AA4;
       
  3324 	
       
  3325 	//Requirement (GUJ 008)
       
  3326 	
       
  3327 	testText[90] = 0x0A9B;
       
  3328 	testText[91] = 0x0ACD;
       
  3329 	testText[92] = 0x0AB0;
       
  3330 	
       
  3331 	testText[93] = 0x0AAF;
       
  3332 	testText[94] = 0x0ACD;
       
  3333 	testText[95] = 0x0AB0;
       
  3334 	
       
  3335 	testText[96] = 0x0A9B;
       
  3336 	testText[97] = 0x0ACD;
       
  3337 	testText[98] = 0x0AB0;
       
  3338 	testText[99] = 0x0ACD;
       
  3339 	testText[100]= 0x0AA4;
       
  3340 	
       
  3341 	testText[101] = 0x0AAF;
       
  3342 	testText[102] = 0x0ACD;
       
  3343 	testText[103] = 0x0AB0;
       
  3344 	
       
  3345 	testText[104] = 0x0AAF;
       
  3346 	testText[105] = 0x0ACD;
       
  3347 	testText[106] = 0x0AB0;
       
  3348 	testText[107] = 0x0ACD;
       
  3349 	testText[108] = 0x0AA4;
       
  3350 	
       
  3351 	testText[109] = 0x0AB0;
       
  3352 	testText[110] = 0x0ACD;
       
  3353 	testText[111] = 0x0AB0;
       
  3354 	testText[112] = 0x0ACD;
       
  3355 	testText[113] = 0x0AB0;
       
  3356 	
       
  3357 	//Requirement (GUJ 009)
       
  3358 	
       
  3359 	testText[114] = 0x0A9F;
       
  3360 	testText[115] = 0x0ACD;
       
  3361 	testText[116] = 0x0AAF;
       
  3362 	
       
  3363 	testText[117] = 0x0A9B;
       
  3364 	testText[118] = 0x0ACD;
       
  3365 	testText[119] = 0x0AAF;
       
  3366 	
       
  3367 	testText[120] = 0x0AA2;
       
  3368 	testText[121] = 0x0ACD;
       
  3369 	testText[122] = 0x0AAF;
       
  3370 	
       
  3371 	testText[123] = 0x0A97;
       
  3372 	testText[124] = 0x0ACD;
       
  3373 	testText[125] = 0x0AAF;
       
  3374 	
       
  3375 	//Requirement (GUJ 010)
       
  3376 	
       
  3377 	testText[126] = 0x0A9F;
       
  3378 	testText[127] = 0x0ACD;
       
  3379 	testText[128] = 0x0AA0;
       
  3380 	
       
  3381 	testText[129] = 0x0AA6;
       
  3382 	testText[130] = 0x0ACD;
       
  3383 	testText[131] = 0x0AB5;
       
  3384 	
       
  3385 	testText[132] = 0x0A9F;
       
  3386 	testText[133] = 0x0ACD;
       
  3387 	testText[134] = 0x0AA0;
       
  3388 	testText[135] = 0x0ACD;
       
  3389 	testText[136] = 0x0AA4;
       
  3390 	
       
  3391 	
       
  3392 	testText[137] = 0x0AA6;
       
  3393 	testText[138] = 0x0ACD;
       
  3394 	testText[139] = 0x0AB5;
       
  3395 	testText[140] = 0x0ACD;
       
  3396 	testText[141] = 0x0AA4;
       
  3397 	
       
  3398 	//Requirement (GUJ 011)
       
  3399 	
       
  3400 	testText[142] = 0x0AB0;
       
  3401 	testText[143] = 0x0AC2;
       
  3402 	
       
  3403 	testText[144] = 0x0AB9;
       
  3404 	testText[145] = 0x0AC3;
       
  3405 	
       
  3406 	testText[146] = 0x0AA6;
       
  3407 	testText[147] = 0x0AC3;
       
  3408 	
       
  3409 	testText[148] = 0x0A9C;
       
  3410 	testText[149] = 0x0AC0;
       
  3411 	
       
  3412 	//Subscript ligutares
       
  3413 	
       
  3414 	
       
  3415 	testText[150] = 0x0A95;
       
  3416 	testText[151] = 0x0A81;
       
  3417 	
       
  3418 	testText[152] = 0x0A95;
       
  3419 	testText[153] = 0x0ABE;
       
  3420 	testText[154] = 0x0A81;
       
  3421 	
       
  3422 	testText[155] = 0x0A95;
       
  3423 	testText[156] = 0x0AC1;
       
  3424 	testText[157] = 0x0A81;
       
  3425 	
       
  3426 	testText[158] = 0x0A8D;
       
  3427 	testText[159] = 0x0A81;
       
  3428 	
       
  3429 	testText[160] = 0x0A88;
       
  3430 	testText[161] = 0x0A81;
       
  3431 	
       
  3432 	
       
  3433 	
       
  3434 	param.iText.Set(testText); 
       
  3435 				
       
  3436 	param.iPosInText = 0;
       
  3437 	param.iPen.iX = param.iPen.iY = 0;
       
  3438 	RShapeInfo shapeInfo;
       
  3439 	
       
  3440 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  3441 
       
  3442 	TEST(r && param.iPosInText ==  3
       
  3443 		   && param.iOutputGlyphs == 1  
       
  3444 		   && param.iOutput[0].iCode == 0x800009ec);
       
  3445 
       
  3446 	#if defined __WINS__ || defined __WINSCW__
       
  3447 	TEST(r && param.iPen.iX == 9);
       
  3448 	#endif
       
  3449 	
       
  3450 	
       
  3451 	INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
       
  3452 	
       
  3453 	param.iPosInText = 	4;
       
  3454 	param.iPen.iX = param.iPen.iY = 0;
       
  3455 		
       
  3456 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  3457 
       
  3458 	TEST(r && param.iPosInText ==  11
       
  3459 		   && param.iOutputGlyphs ==  4
       
  3460 		   && param.iOutput[0].iCode == 0x800009d7
       
  3461 		   && param.iOutput[1].iCode == 0x800009d8
       
  3462 		   && param.iOutput[2].iCode == 0x800009d9
       
  3463 		   && param.iOutput[3].iCode == 0x80000967 );
       
  3464 	
       
  3465 	#if defined __WINS__ || defined __WINSCW__
       
  3466 	TEST(r && param.iPen.iX == 34);
       
  3467 	#endif
       
  3468 
       
  3469 	INFO_PRINTF7(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x iOutput[2].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode, param.iOutput[2].iCode);
       
  3470 	
       
  3471 	param.iPosInText = 11;
       
  3472 	param.iPen.iX = param.iPen.iY = 0;
       
  3473 		
       
  3474 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  3475 
       
  3476 	TEST(r && param.iPosInText ==	14  
       
  3477 		   && param.iOutputGlyphs == 2  
       
  3478 		   && param.iOutput[0].iCode == 0x800009d6
       
  3479 		   && param.iOutput[1].iCode == 0x80000969   );
       
  3480 
       
  3481 	#if defined __WINS__ || defined __WINSCW__
       
  3482 	TEST(r && param.iPen.iX == 22);
       
  3483 	#endif
       
  3484 	
       
  3485 	INFO_PRINTF6(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
       
  3486 	
       
  3487 	param.iPosInText = 16;
       
  3488 	param.iPen.iX = param.iPen.iY = 0;
       
  3489 		
       
  3490 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  3491 
       
  3492 	TEST(r && param.iPosInText ==  23
       
  3493 		   && param.iOutputGlyphs == 3 
       
  3494 		   && param.iOutput[0].iCode == 0x800009da
       
  3495 		   && param.iOutput[1].iCode == 0x800009dc
       
  3496 		   && param.iOutput[2].iCode == 0x80000aad);
       
  3497 	
       
  3498 	#if defined __WINS__ || defined __WINSCW__
       
  3499 	TEST(r && param.iPen.iX == 30);
       
  3500 	#endif
       
  3501 	
       
  3502 		
       
  3503 	INFO_PRINTF7(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x iOutput[2].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode, param.iOutput[2].iCode);
       
  3504 	
       
  3505 	param.iPosInText = 	23;
       
  3506 	param.iPen.iX = param.iPen.iY = 0;
       
  3507 		
       
  3508 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  3509 
       
  3510 	TEST(r && param.iPosInText == 26
       
  3511 		   && param.iOutputGlyphs == 1  
       
  3512 		   && param.iOutput[0].iCode == 0x800009d2 );
       
  3513 
       
  3514 	#if defined __WINS__ || defined __WINSCW__
       
  3515 	TEST(r && param.iPen.iX == 12);
       
  3516 	#endif
       
  3517 		
       
  3518 	INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
       
  3519 
       
  3520 	
       
  3521 	param.iPosInText = 26;
       
  3522 	param.iPen.iX = param.iPen.iY = 0;
       
  3523 		
       
  3524 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  3525 
       
  3526 	TEST(r && param.iPosInText == 31
       
  3527 		   && param.iOutputGlyphs == 2  
       
  3528 		   && param.iOutput[0].iCode == 0x800009f8
       
  3529 		   && param.iOutput[1].iCode == 0x80000971);
       
  3530 
       
  3531 	#if defined __WINS__ || defined __WINSCW__
       
  3532 	TEST(r && param.iPen.iX == 18);
       
  3533 	#endif
       
  3534 	
       
  3535 	INFO_PRINTF6(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
       
  3536 	
       
  3537 	param.iPosInText = 	31;
       
  3538 	param.iPen.iX = param.iPen.iY = 0;
       
  3539 		
       
  3540 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  3541 
       
  3542 	TEST(r && param.iPosInText ==  36
       
  3543 		   && param.iOutputGlyphs == 3
       
  3544 		   && param.iOutput[0].iCode == 0x800009dd
       
  3545 		   && param.iOutput[1].iCode == 0x800009f5
       
  3546 		   && param.iOutput[2].iCode == 0x80000971);
       
  3547 
       
  3548 	#if defined __WINS__ || defined __WINSCW__
       
  3549 	TEST(r && param.iPen.iX == 30);
       
  3550 	#endif
       
  3551 	
       
  3552 	INFO_PRINTF7(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x iOutput[2].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode, param.iOutput[2].iCode);	
       
  3553 	
       
  3554 	param.iPosInText = 36;
       
  3555 	param.iPen.iX = param.iPen.iY = 0;
       
  3556 		
       
  3557 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  3558 
       
  3559 	TEST(r && param.iPosInText == 41
       
  3560 		   && param.iOutputGlyphs == 2
       
  3561 		   && param.iOutput[0].iCode == 0x800009f9
       
  3562 		   && param.iOutput[1].iCode == 0x80000971);
       
  3563 	
       
  3564 	#if defined __WINS__ || defined __WINSCW__
       
  3565 	TEST(r && param.iPen.iX == 17);
       
  3566 	#endif
       
  3567 
       
  3568 	INFO_PRINTF6(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
       
  3569 	
       
  3570 	param.iPosInText = 	41;
       
  3571 	param.iPen.iX = param.iPen.iY = 0;
       
  3572 		
       
  3573 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  3574 	
       
  3575 	TEST(r && param.iPosInText == 44
       
  3576 		   && param.iOutputGlyphs == 2
       
  3577 		   && param.iOutput[0].iCode ==  0x80000962
       
  3578 		   && param.iOutput[1].iCode == 0x800009d4);
       
  3579 	
       
  3580 	#if defined __WINS__ || defined __WINSCW__
       
  3581 	TEST(r && param.iPen.iX == 8);
       
  3582 	#endif
       
  3583 		
       
  3584 	INFO_PRINTF6(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
       
  3585 	
       
  3586 	param.iPosInText = 44;
       
  3587 	param.iPen.iX = param.iPen.iY = 0;
       
  3588 		
       
  3589 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  3590 
       
  3591 	TEST(r && param.iPosInText == 48 
       
  3592 		   && param.iOutputGlyphs == 2
       
  3593 		   && param.iOutput[0].iCode == 0x80000962
       
  3594 		   && param.iOutput[1].iCode == 0x80000ae1 );
       
  3595 
       
  3596 	#if defined __WINS__ || defined __WINSCW__
       
  3597 	TEST(r && param.iPen.iX == 13);
       
  3598 	#endif
       
  3599 	
       
  3600 	INFO_PRINTF6(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
       
  3601 	
       
  3602 	param.iPosInText = 48;
       
  3603 	param.iPen.iX = param.iPen.iY = 0;
       
  3604 		
       
  3605 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  3606 
       
  3607 	TEST(r && param.iPosInText == 52
       
  3608 		   && param.iOutputGlyphs == 2
       
  3609 		   && param.iOutput[0].iCode == 0x80000962
       
  3610 		   && param.iOutput[1].iCode == 0x80000ae9);
       
  3611 
       
  3612 	#if defined __WINS__ || defined __WINSCW__
       
  3613 	TEST(r && param.iPen.iX == 8);
       
  3614 	#endif
       
  3615 	
       
  3616 	INFO_PRINTF6(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
       
  3617 	
       
  3618 	param.iPosInText = 52;
       
  3619 	param.iPen.iX = param.iPen.iY = 0;
       
  3620 		
       
  3621 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  3622 
       
  3623 	TEST(r && param.iPosInText == 57  
       
  3624 		   && param.iOutputGlyphs == 2
       
  3625 		   && param.iOutput[0].iCode == 0x80000962
       
  3626 		   && param.iOutput[1].iCode == 0x80000ae2);
       
  3627 
       
  3628 	#if defined __WINS__ || defined __WINSCW__
       
  3629 	TEST(r && param.iPen.iX == 13);
       
  3630 	#endif
       
  3631 
       
  3632 	INFO_PRINTF6(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
       
  3633 	
       
  3634 	param.iPosInText = 58;
       
  3635 	param.iPen.iX = param.iPen.iY = 0;
       
  3636 		
       
  3637 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  3638 
       
  3639 	TEST(r && param.iPosInText ==  61
       
  3640 		   && param.iOutputGlyphs == 1
       
  3641 		   && param.iOutput[0].iCode ==	0x80000a1e );
       
  3642 
       
  3643 	#if defined __WINS__ || defined __WINSCW__
       
  3644 	TEST(r && param.iPen.iX == 11);
       
  3645 	#endif
       
  3646 		
       
  3647 	INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
       
  3648 	
       
  3649 	param.iPosInText = 	61;
       
  3650 	param.iPen.iX = param.iPen.iY = 0;
       
  3651 		
       
  3652 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  3653 
       
  3654 	TEST(r && param.iPosInText ==  64
       
  3655 		   && param.iOutputGlyphs == 1
       
  3656 		   && param.iOutput[0].iCode == 0x80000a21 );
       
  3657 
       
  3658 	#if defined __WINS__ || defined __WINSCW__
       
  3659 	TEST(r && param.iPen.iX == 10);
       
  3660 	#endif
       
  3661 
       
  3662 	INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
       
  3663 	
       
  3664 	param.iPosInText = 64;
       
  3665 	param.iPen.iX = param.iPen.iY = 0;
       
  3666 		
       
  3667 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  3668 
       
  3669 	TEST(r && param.iPosInText == 69 
       
  3670 		   && param.iOutputGlyphs == 2
       
  3671 		   && param.iOutput[0].iCode == 0x80000a64
       
  3672 		   && param.iOutput[1].iCode == 0x80000971 );
       
  3673 
       
  3674 	#if defined __WINS__ || defined __WINSCW__
       
  3675 	TEST(r && param.iPen.iX == 17);
       
  3676 	#endif
       
  3677 	
       
  3678 	INFO_PRINTF6(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
       
  3679 	
       
  3680 	param.iPosInText = 	69;
       
  3681 	param.iPen.iX = param.iPen.iY = 0;
       
  3682 		
       
  3683 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  3684 
       
  3685 	TEST(r && param.iPosInText == 74
       
  3686 		   && param.iOutputGlyphs == 2
       
  3687 		   && param.iOutput[0].iCode == 0x80000a67
       
  3688 		   && param.iOutput[1].iCode == 0x80000971);
       
  3689 
       
  3690 	#if defined __WINS__ || defined __WINSCW__
       
  3691 	TEST(r && param.iPen.iX == 16);
       
  3692 	#endif
       
  3693 		
       
  3694 	INFO_PRINTF6(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
       
  3695 	
       
  3696 	param.iPosInText = 	74;
       
  3697 	param.iPen.iX = param.iPen.iY = 0;
       
  3698 		
       
  3699 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  3700 
       
  3701 	TEST(r && param.iPosInText ==  77
       
  3702 		   && param.iOutputGlyphs == 1
       
  3703 		   && param.iOutput[0].iCode == 0x80000a1c);
       
  3704 
       
  3705 	#if defined __WINS__ || defined __WINSCW__
       
  3706 	TEST(r && param.iPen.iX == 8);
       
  3707 	#endif
       
  3708 		
       
  3709 	INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
       
  3710 	
       
  3711 	param.iPosInText = 	77;
       
  3712 	param.iPen.iX = param.iPen.iY = 0;
       
  3713 		
       
  3714 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  3715 
       
  3716 	TEST(r && param.iPosInText ==  80
       
  3717 		   && param.iOutputGlyphs == 1
       
  3718 		   && param.iOutput[0].iCode == 0x80000a23);
       
  3719 
       
  3720 	#if defined __WINS__ || defined __WINSCW__
       
  3721 	TEST(r && param.iPen.iX == 15);
       
  3722 	#endif
       
  3723 	
       
  3724 	INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
       
  3725 		
       
  3726 	param.iPosInText = 80;
       
  3727 	param.iPen.iX = param.iPen.iY = 0;
       
  3728 	
       
  3729 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  3730 
       
  3731 	TEST(r && param.iPosInText == 85
       
  3732 		   && param.iOutputGlyphs == 2
       
  3733 		   && param.iOutput[0].iCode == 0x80000a62
       
  3734 		   && param.iOutput[1].iCode == 0x80000971);
       
  3735 
       
  3736 	#if defined __WINS__ || defined __WINSCW__
       
  3737 	TEST(r && param.iPen.iX == 17);
       
  3738 	#endif
       
  3739 		
       
  3740 	INFO_PRINTF6(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
       
  3741 	
       
  3742 	param.iPosInText = 85;
       
  3743 	param.iPen.iX = param.iPen.iY = 0;
       
  3744 	
       
  3745 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  3746 
       
  3747 	TEST(r && param.iPosInText ==  90
       
  3748 		   && param.iOutputGlyphs == 2
       
  3749 		   && param.iOutput[0].iCode == 0x80000a69
       
  3750 		   && param.iOutput[1].iCode == 0x80000971);
       
  3751 
       
  3752 	#if defined __WINS__ || defined __WINSCW__
       
  3753 	TEST(r && param.iPen.iX == 24);
       
  3754 	#endif
       
  3755 	
       
  3756 	INFO_PRINTF6(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
       
  3757 	
       
  3758 	param.iPosInText =90;
       
  3759 	param.iPen.iX = param.iPen.iY = 0;
       
  3760 	
       
  3761 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  3762 
       
  3763 	TEST(r && param.iPosInText == 93
       
  3764 		   && param.iOutputGlyphs == 1
       
  3765 		   && param.iOutput[0].iCode == 0x80000a22 );
       
  3766 
       
  3767 	#if defined __WINS__ || defined __WINSCW__
       
  3768 	TEST(r && param.iPen.iX == 12);
       
  3769 	#endif
       
  3770 	
       
  3771 	INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
       
  3772 	
       
  3773 	param.iPosInText = 93;
       
  3774 	param.iPen.iX = param.iPen.iY = 0;
       
  3775 	
       
  3776 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  3777 
       
  3778 	TEST(r && param.iPosInText == 96
       
  3779 		   && param.iOutputGlyphs == 1
       
  3780 		   && param.iOutput[0].iCode == 0x80000a35 );
       
  3781 
       
  3782 	#if defined __WINS__ || defined __WINSCW__
       
  3783 	TEST(r && param.iPen.iX == 10);
       
  3784 	#endif
       
  3785 	
       
  3786 	INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
       
  3787 	
       
  3788 	param.iPosInText = 96;
       
  3789 	param.iPen.iX = param.iPen.iY = 0;
       
  3790 	
       
  3791 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  3792 
       
  3793 	TEST(r && param.iPosInText ==  101
       
  3794 		   && param.iOutputGlyphs == 2
       
  3795 		   && param.iOutput[0].iCode == 0x80000a68 
       
  3796 		   && param.iOutput[1].iCode == 0x80000971);
       
  3797 	
       
  3798 	#if defined __WINS__ || defined __WINSCW__
       
  3799 	TEST(r && param.iPen.iX == 21);
       
  3800 	#endif
       
  3801 	
       
  3802 	INFO_PRINTF6(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
       
  3803 	
       
  3804 	param.iPosInText = 101;
       
  3805 	param.iPen.iX = param.iPen.iY = 0;
       
  3806 	
       
  3807 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  3808 
       
  3809 	TEST(r && param.iPosInText == 104
       
  3810 		   && param.iOutputGlyphs == 1
       
  3811 		   && param.iOutput[0].iCode == 0x80000a35 );
       
  3812 	#if defined __WINS__ || defined __WINSCW__
       
  3813 	TEST(r && param.iPen.iX == 10);
       
  3814 	#endif
       
  3815 	
       
  3816 	INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
       
  3817 	
       
  3818 	param.iPosInText = 104;
       
  3819 	param.iPen.iX = param.iPen.iY = 0;
       
  3820 	
       
  3821 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  3822 
       
  3823 	TEST(r && param.iPosInText == 109
       
  3824 		   && param.iOutputGlyphs == 2
       
  3825 		   && param.iOutput[0].iCode == 0x80000a7b 
       
  3826 		   && param.iOutput[1].iCode == 0x80000971 );
       
  3827 
       
  3828 	#if defined __WINS__ || defined __WINSCW__
       
  3829 	TEST(r && param.iPen.iX == 16);
       
  3830 	#endif
       
  3831 	
       
  3832 	INFO_PRINTF6(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
       
  3833 	
       
  3834 	param.iPosInText = 109;
       
  3835 	param.iPen.iX = param.iPen.iY = 0;
       
  3836 	
       
  3837 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  3838 
       
  3839 	TEST(r && param.iPosInText ==  114
       
  3840 		   && param.iOutputGlyphs == 2
       
  3841 		   && param.iOutput[0].iCode == 0x80000a36
       
  3842 		   && param.iOutput[1].iCode == 0x800009d4 );
       
  3843 	
       
  3844 	#if defined __WINS__ || defined __WINSCW__
       
  3845 	TEST(r && param.iPen.iX == 7);
       
  3846 	#endif
       
  3847 	
       
  3848 	INFO_PRINTF6(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
       
  3849 	
       
  3850 	param.iPosInText = 114;
       
  3851 	param.iPen.iX = param.iPen.iY = 0;
       
  3852 	
       
  3853 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  3854 
       
  3855 	TEST(r && param.iPosInText ==  117
       
  3856 		   && param.iOutputGlyphs == 1
       
  3857 		   && param.iOutput[0].iCode == 0x80000aae);
       
  3858 
       
  3859 	#if defined __WINS__ || defined __WINSCW__
       
  3860 	TEST(r && param.iPen.iX == 17);
       
  3861 	#endif
       
  3862 		
       
  3863 	INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
       
  3864 	
       
  3865 	param.iPosInText = 117;
       
  3866 	param.iPen.iX = param.iPen.iY = 0;
       
  3867 	
       
  3868 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  3869 
       
  3870 	TEST(r && param.iPosInText ==  120
       
  3871 		   && param.iOutputGlyphs == 1
       
  3872 		   && param.iOutput[0].iCode == 0x80000aab );
       
  3873 
       
  3874 	#if defined __WINS__ || defined __WINSCW__
       
  3875 	TEST(r && param.iPen.iX == 21);
       
  3876 	#endif
       
  3877 	
       
  3878 	INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
       
  3879 	
       
  3880 	param.iPosInText = 120;
       
  3881 	param.iPen.iX = param.iPen.iY = 0;
       
  3882 	
       
  3883 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  3884 
       
  3885 	TEST(r && param.iPosInText ==  123
       
  3886 		   && param.iOutputGlyphs == 1
       
  3887 		   && param.iOutput[0].iCode == 0x80000ab5 );
       
  3888 
       
  3889 	#if defined __WINS__ || defined __WINSCW__
       
  3890 	TEST(r && param.iPen.iX == 18);
       
  3891 	#endif
       
  3892 	
       
  3893 	INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
       
  3894 	
       
  3895 	param.iPosInText = 123;
       
  3896 	param.iPen.iX = param.iPen.iY = 0;
       
  3897 	
       
  3898 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  3899 
       
  3900 	TEST(r && param.iPosInText ==  126
       
  3901 		   && param.iOutputGlyphs == 2
       
  3902 		   && param.iOutput[0].iCode == 0x800009d8
       
  3903 		   && param.iOutput[1].iCode == 0x8000097b);
       
  3904 
       
  3905 	#if defined __WINS__ || defined __WINSCW__
       
  3906 	TEST(r && param.iPen.iX == 17);
       
  3907 	#endif
       
  3908 
       
  3909 	INFO_PRINTF6(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
       
  3910 	
       
  3911 	param.iPosInText = 126;
       
  3912 	param.iPen.iX = param.iPen.iY = 0;
       
  3913 	
       
  3914 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  3915 
       
  3916 	TEST(r && param.iPosInText ==  129
       
  3917 		   && param.iOutputGlyphs == 1
       
  3918 		   && param.iOutput[0].iCode == 0x80000aad);
       
  3919 
       
  3920 	#if defined __WINS__ || defined __WINSCW__
       
  3921 	TEST(r && param.iPen.iX == 9);
       
  3922 	#endif
       
  3923 	
       
  3924 	INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
       
  3925 		
       
  3926 	param.iPosInText = 129;
       
  3927 	param.iPen.iX = param.iPen.iY = 0;
       
  3928 	
       
  3929 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  3930 
       
  3931 	TEST(r && param.iPosInText ==  132
       
  3932 		   && param.iOutputGlyphs == 1
       
  3933 		   && param.iOutput[0].iCode == 0x80000ac0 );
       
  3934 
       
  3935 	#if defined __WINS__ || defined __WINSCW__
       
  3936 	TEST(r && param.iPen.iX == 10);
       
  3937 	#endif
       
  3938 		
       
  3939 	INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
       
  3940 	
       
  3941 	param.iPosInText =132;
       
  3942 	param.iPen.iX = param.iPen.iY = 0;
       
  3943 	
       
  3944 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  3945 
       
  3946 	TEST(r && param.iPosInText ==  137
       
  3947 		   && param.iOutputGlyphs == 3
       
  3948 		   && param.iOutput[0].iCode == 0x800009e0
       
  3949 		   && param.iOutput[1].iCode == 0x800009e1
       
  3950 		   && param.iOutput[2].iCode == 0x80000971);
       
  3951 
       
  3952 	#if defined __WINS__ || defined __WINSCW__
       
  3953 	TEST(r && param.iPen.iX == 26);
       
  3954 	#endif
       
  3955 	
       
  3956 	
       
  3957 	INFO_PRINTF7(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x iOutput[2].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode, param.iOutput[2].iCode);	
       
  3958 	
       
  3959 	param.iPosInText = 137;
       
  3960 	param.iPen.iX = param.iPen.iY = 0;
       
  3961 	
       
  3962 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  3963 	
       
  3964 	TEST(r && param.iPosInText == 142 
       
  3965 		   && param.iOutputGlyphs == 3
       
  3966 		   && param.iOutput[0].iCode == 0x800009e7 
       
  3967 		   && param.iOutput[1].iCode == 0x800009f3
       
  3968 		   && param.iOutput[2].iCode == 0x80000971);
       
  3969 
       
  3970 	#if defined __WINS__ || defined __WINSCW__
       
  3971 	TEST(r && param.iPen.iX == 23);
       
  3972 	#endif
       
  3973 	
       
  3974 	INFO_PRINTF7(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x iOutput[2].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode, param.iOutput[2].iCode);	
       
  3975 	
       
  3976 	param.iPosInText = 142;
       
  3977 	param.iPen.iX = param.iPen.iY = 0;
       
  3978 	
       
  3979 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  3980 	
       
  3981 	TEST(r && param.iPosInText == 144
       
  3982 		   && param.iOutputGlyphs == 1
       
  3983 		   && param.iOutput[0].iCode == 0x80000b04);
       
  3984 
       
  3985 	#if defined __WINS__ || defined __WINSCW__
       
  3986 	TEST(r && param.iPen.iX == 7);
       
  3987 	#endif
       
  3988 	
       
  3989 	INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
       
  3990 	
       
  3991 	param.iPosInText = 144;
       
  3992 	param.iPen.iX = param.iPen.iY = 0;
       
  3993 	
       
  3994 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  3995 	
       
  3996 	TEST(r && param.iPosInText == 146
       
  3997 		   && param.iOutputGlyphs == 1
       
  3998 		   && param.iOutput[0].iCode == 0x80000b05);
       
  3999 
       
  4000 	#if defined __WINS__ || defined __WINSCW__
       
  4001 	TEST(r && param.iPen.iX == 9);
       
  4002 	#endif
       
  4003 	
       
  4004 	INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
       
  4005 	
       
  4006 	param.iPosInText = 146;
       
  4007 	param.iPen.iX = param.iPen.iY = 0;
       
  4008 	
       
  4009 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  4010 	
       
  4011 	TEST(r && param.iPosInText == 148
       
  4012 		   && param.iOutputGlyphs ==  1
       
  4013 		   && param.iOutput[0].iCode == 0x80000b02);
       
  4014 
       
  4015 	#if defined __WINS__ || defined __WINSCW__
       
  4016 	TEST(r && param.iPen.iX == 7);
       
  4017 	#endif
       
  4018 
       
  4019 	INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
       
  4020 	
       
  4021 	param.iPosInText = 148;
       
  4022 	param.iPen.iX = param.iPen.iY = 0;
       
  4023 	
       
  4024 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  4025 	
       
  4026 	TEST(r && param.iPosInText == 150
       
  4027 		   && param.iOutputGlyphs == 1
       
  4028 		   && param.iOutput[0].iCode == 0x80000aff);
       
  4029 
       
  4030 	#if defined __WINS__ || defined __WINSCW__
       
  4031 	TEST(r && param.iPen.iX == 16);
       
  4032 	#endif
       
  4033 
       
  4034 	INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
       
  4035 	
       
  4036 	param.iPosInText = 150;
       
  4037 	param.iPen.iX = param.iPen.iY = 0;
       
  4038 	
       
  4039 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  4040 	
       
  4041 	TEST(r && param.iPosInText == 152 
       
  4042 		   && param.iOutputGlyphs == 2
       
  4043 		   && param.iOutput[0].iCode == 0x80000962
       
  4044 		   && param.iOutput[1].iCode ==0x80000951);
       
  4045 
       
  4046 	#if defined __WINS__ || defined __WINSCW__
       
  4047 	TEST(r && param.iPen.iX == 8);
       
  4048 	#endif
       
  4049 	
       
  4050 	INFO_PRINTF6(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
       
  4051 
       
  4052 	param.iPosInText = 152;
       
  4053 	param.iPen.iX = param.iPen.iY = 0;
       
  4054 	
       
  4055 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  4056 	
       
  4057 	TEST(r && param.iPosInText == 155
       
  4058 		   && param.iOutputGlyphs == 3
       
  4059 		   && param.iOutput[0].iCode == 0x80000962
       
  4060 		   && param.iOutput[1].iCode == 0x80000986
       
  4061 		   && param.iOutput[2].iCode == 0x80000951);
       
  4062 
       
  4063 	#if defined __WINS__ || defined __WINSCW__
       
  4064 	TEST(r && param.iPen.iX == 12);
       
  4065 	#endif
       
  4066 
       
  4067 	
       
  4068 	INFO_PRINTF7(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x iOutput[2].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode, param.iOutput[2].iCode);	
       
  4069 	
       
  4070 	param.iPosInText = 155;
       
  4071 	param.iPen.iX = param.iPen.iY = 0;
       
  4072 	
       
  4073 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  4074 	
       
  4075 	TEST(r && param.iPosInText ==  158
       
  4076 		   && param.iOutputGlyphs == 3
       
  4077 		   && param.iOutput[0].iCode == 0x80000962
       
  4078 		   && param.iOutput[1].iCode == 0x80000989
       
  4079 		   && param.iOutput[2].iCode == 0x80000951);
       
  4080 
       
  4081 	#if defined __WINS__ || defined __WINSCW__
       
  4082 	TEST(r && param.iPen.iX == 8);
       
  4083 	#endif
       
  4084 
       
  4085 	
       
  4086 	INFO_PRINTF7(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x iOutput[2].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode, param.iOutput[2].iCode);	
       
  4087 	param.iPosInText = 158;
       
  4088 	param.iPen.iX = param.iPen.iY = 0;
       
  4089 	
       
  4090 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  4091 	
       
  4092 	TEST(r && param.iPosInText ==  160
       
  4093 		   && param.iOutputGlyphs == 1
       
  4094 		   && param.iOutput[0].iCode == 0x80000aee);
       
  4095 		   
       
  4096 	#if defined __WINS__ || defined __WINSCW__
       
  4097 	TEST(r && param.iPen.iX == 14);
       
  4098 	#endif
       
  4099 	
       
  4100 	INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
       
  4101 	
       
  4102 	param.iPosInText = 160;
       
  4103 	param.iPen.iX = param.iPen.iY = 0;
       
  4104 	
       
  4105 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  4106 	
       
  4107 	TEST(r && param.iPosInText ==  162
       
  4108 		   && param.iOutputGlyphs == 1
       
  4109 		   && param.iOutput[0].iCode == 0x80000aed);
       
  4110 
       
  4111 	#if defined __WINS__ || defined __WINSCW__
       
  4112 	TEST(r && param.iPen.iX == 10);
       
  4113 	#endif
       
  4114 	
       
  4115 	INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
       
  4116 	}
       
  4117 	
       
  4118 	 
       
  4119 void CTGlyphSelection::TestBengaliChars(CFbsFont* aFont)
       
  4120 	{
       
  4121 	INFO_PRINTF1(_L("Test Bengali Glyphs"));
       
  4122 	
       
  4123 	// Do the testing
       
  4124 	
       
  4125 	TBool r;
       
  4126 	TBuf<115> testText(0);
       
  4127 	CFont::TPositionParam param;
       
  4128 	param.iDirection = CFont::EHorizontal;
       
  4129 	param.iFlags = CFont::TPositionParam::EFLogicalOrder;
       
  4130 
       
  4131 	testText.SetLength(115);
       
  4132 	// Make sure there is no garbage values in the memory we are using.
       
  4133 	for (TInt i = 0; i < testText.Length(); i++)
       
  4134 		testText[i]=0xFFFF;
       
  4135 	
       
  4136 	//Testdata for Bengali language
       
  4137 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4002"));
       
  4138 /**
       
  4139 @SYMTestCaseID 				GRAPHICS-SYSLIB-GDI-CIT-4002
       
  4140 @SYMTestCaseDesc 			Automated GDI testing for Bengali
       
  4141 @SYMTestPriority 			High
       
  4142 @SYMTestActions  			Attempt to compose various invalid Bengali glyph clusters to test the requirement.
       
  4143 				 			If any part of stored text (e.g. received or downloaded document) is not properly encoded in logical order, the relevant text handling processes must treat that part as an invalid sequence of text and use appropriate fallback mechanisms. Invalid sequences of characters must be rendered as incomplete syllables and rendering engine must be able to handle invalid coding appropriately	
       
  4144 @SYMTestExpectedResults 	Rendering engine will render as incomplete syllables
       
  4145 @SYMPREQ 					1766 Bengali for Sphinx
       
  4146 @SYMREQ 					8741 Bengali Text Rendering
       
  4147 */
       
  4148 	
       
  4149 	// BEN002: Test invalid sequences
       
  4150 	testText[0] = 0x09C7;
       
  4151 	testText[1] = 0x0995;
       
  4152 	testText[2] = 0x0995;
       
  4153 	testText[3] = 0x09C1;
       
  4154 	testText[4] = 0x09C1;
       
  4155 	testText[5] = 0x0995;
       
  4156 	testText[6] = 0x09CD;
       
  4157 	testText[7] = 0x09C1;
       
  4158 	testText[8] = 0x0995;
       
  4159 	testText[9] = 0x0981;
       
  4160 	testText[10] = 0x09C1;
       
  4161 	
       
  4162 	param.iText.Set(testText);
       
  4163 	RShapeInfo shapeInfo;
       
  4164 	param.iPosInText = 0;
       
  4165 	param.iPen.iX = param.iPen.iY = 0;
       
  4166 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  4167 	
       
  4168 	TEST(r && param.iPosInText == 1
       
  4169 			   && param.iOutputGlyphs == 2
       
  4170 			   && param.iOutput[0].iCode == 0x80000ce5
       
  4171 			   && param.iOutput[1].iCode == 0x8000058f);
       
  4172 
       
  4173 	#if defined __WINS__ || defined __WINSCW__
       
  4174 	TEST(r && param.iPen.iX == 15);
       
  4175 	#endif
       
  4176 	
       
  4177 	INFO_PRINTF6(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
       
  4178 		
       
  4179 	param.iPosInText = 1;
       
  4180 	param.iPen.iX = param.iPen.iY = 0;
       
  4181 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  4182 	
       
  4183 	TEST(r && param.iPosInText == 2
       
  4184 			   && param.iOutputGlyphs == 1
       
  4185 			   && param.iOutput[0].iCode == 0x80000cbc);
       
  4186 	
       
  4187 	#if defined __WINS__ || defined __WINSCW__
       
  4188 	TEST(r && param.iPen.iX == 12);
       
  4189 	#endif
       
  4190 	
       
  4191 	INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
       
  4192 	
       
  4193 	param.iPosInText = 2;
       
  4194 	param.iPen.iX = param.iPen.iY = 0;
       
  4195 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  4196 	
       
  4197 	TEST(r && param.iPosInText == 4
       
  4198 			   && param.iOutputGlyphs == 1
       
  4199 			   && param.iOutput[0].iCode == 0x80000ebe);
       
  4200 
       
  4201 	#if defined __WINS__ || defined __WINSCW__
       
  4202 	TEST(r && param.iPen.iX == 13);
       
  4203 	#endif
       
  4204 	
       
  4205 	INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
       
  4206 		
       
  4207 	param.iPosInText = 4;
       
  4208 	param.iPen.iX = param.iPen.iY = 0;
       
  4209 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  4210 	
       
  4211 	TEST(r && param.iPosInText == 5
       
  4212 			   && param.iOutputGlyphs == 2
       
  4213 			   && param.iOutput[0].iCode == 0x8000058f
       
  4214 			   && param.iOutput[1].iCode == 0x80000ce1
       
  4215 	   );
       
  4216 	#if defined __WINS__ || defined __WINSCW__
       
  4217 	TEST(r && param.iPen.iX == 9);
       
  4218 	#endif
       
  4219 	
       
  4220 	INFO_PRINTF6(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
       
  4221 		
       
  4222 	param.iPosInText = 5;
       
  4223 	param.iPen.iX = param.iPen.iY = 0;
       
  4224 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  4225 	
       
  4226 	TEST(r && param.iPosInText == 7
       
  4227 			   && param.iOutputGlyphs == 2
       
  4228 			   && param.iOutput[0].iCode == 0x80000cbc
       
  4229 			   && param.iOutput[1].iCode == 0x80000ce9
       
  4230 			   );
       
  4231 	
       
  4232 	#if defined __WINS__ || defined __WINSCW__
       
  4233 	TEST(r && param.iPen.iX == 12);
       
  4234 	#endif
       
  4235 	
       
  4236 	INFO_PRINTF6(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
       
  4237 	
       
  4238 	param.iPosInText = 7;
       
  4239 	param.iPen.iX = param.iPen.iY = 0;
       
  4240 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  4241 
       
  4242 	TEST(r && param.iPosInText == 8
       
  4243 			   && param.iOutputGlyphs == 2
       
  4244 			   && param.iOutput[0].iCode == 0x8000058f
       
  4245 			   && param.iOutput[1].iCode == 0x80000ce1
       
  4246 			   );
       
  4247 	
       
  4248 	#if defined __WINS__ || defined __WINSCW__
       
  4249 	TEST(r && param.iPen.iX == 9);
       
  4250 	#endif
       
  4251 	
       
  4252 	INFO_PRINTF6(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
       
  4253 		
       
  4254 	param.iPosInText = 8;
       
  4255 	param.iPen.iX = param.iPen.iY = 0;
       
  4256 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  4257 	
       
  4258 	TEST(r && param.iPosInText == 10
       
  4259 			   && param.iOutputGlyphs == 2
       
  4260 			   && param.iOutput[0].iCode == 0x80000cbc
       
  4261 			   && param.iOutput[1].iCode == 0x80000cad
       
  4262 			   );
       
  4263 	
       
  4264 	#if defined __WINS__ || defined __WINSCW__
       
  4265 	TEST(r && param.iPen.iX == 12);
       
  4266 	#endif
       
  4267 	
       
  4268 	INFO_PRINTF6(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
       
  4269 	
       
  4270 	param.iPosInText = 10;
       
  4271 	param.iPen.iX = param.iPen.iY = 0;
       
  4272 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  4273 	
       
  4274 	TEST(r && param.iPosInText == 11
       
  4275 			   && param.iOutputGlyphs == 2
       
  4276 			   && param.iOutput[0].iCode == 0x8000058f
       
  4277 			   && param.iOutput[1].iCode == 0x80000ce1
       
  4278 			   );
       
  4279 	
       
  4280 	#if defined __WINS__ || defined __WINSCW__
       
  4281 	TEST(r && param.iPen.iX == 9);
       
  4282 	#endif
       
  4283 	
       
  4284 	INFO_PRINTF6(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
       
  4285 	TRAPD(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
       
  4286     	if (err!=KErrNone)
       
  4287     		INFO_PRINTF1(_L("Failed to record test result"));
       
  4288 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4003"));
       
  4289 /**
       
  4290 @SYMTestCaseID 				GRAPHICS-SYSLIB-GDI-CIT-4003
       
  4291 @SYMTestCaseDesc 			Automated GDI testing for Bengali
       
  4292 @SYMTestPriority 			High
       
  4293 @SYMTestActions  
       
  4294 							Passing both Bengali and Latin scripts simultaneously
       
  4295 @SYMTestExpectedResults 	The expected glyph clusters for given Unicode characters must be returned
       
  4296 @SYMPREQ 					1766 Bengali for Sphinx
       
  4297 @SYMREQ 					8741 Bengali Text Rendering
       
  4298 */
       
  4299 	//BEN003
       
  4300 	testText[11] = 0x0995;
       
  4301 	testText[12] = 0x0041; // Unicode value for A
       
  4302 	testText[13] = 0x09E6;	//Bengali digit 1
       
  4303 	
       
  4304 	param.iPosInText = 11;
       
  4305 	param.iPen.iX = param.iPen.iY = 0;
       
  4306 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  4307 	
       
  4308 	TEST(r && param.iPosInText == 12
       
  4309 			   && param.iOutputGlyphs == 1
       
  4310 			   && param.iOutput[0].iCode == 0x80000cbc
       
  4311 			   );
       
  4312 
       
  4313 	#if defined __WINS__ || defined __WINSCW__
       
  4314 	TEST(r && param.iPen.iX == 12);
       
  4315 	#endif
       
  4316 	
       
  4317 	INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
       
  4318 	
       
  4319 	param.iPosInText = 12;
       
  4320 	param.iPen.iX = param.iPen.iY = 0;
       
  4321 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  4322 
       
  4323 	TEST(r && param.iPosInText == 13	
       
  4324 			   && param.iOutputGlyphs == 1
       
  4325 			   && param.iOutput[0].iCode == 0x41
       
  4326 	  	);
       
  4327 	
       
  4328 	#if defined __WINS__ || defined __WINSCW__
       
  4329 	TEST(r && param.iPen.iX == 10);
       
  4330 	#endif
       
  4331 	
       
  4332 	INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x "), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
       
  4333 	
       
  4334 	param.iPosInText = 13;
       
  4335 	param.iPen.iX = param.iPen.iY = 0;
       
  4336 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  4337 	
       
  4338 	TEST(r && param.iPosInText == 14
       
  4339 			   && param.iOutputGlyphs == 1
       
  4340 			   && param.iOutput[0].iCode ==0x80000cf3
       
  4341 			   );
       
  4342 
       
  4343 	#if defined __WINS__ || defined __WINSCW__
       
  4344 	TEST(r && param.iPen.iX == 10);
       
  4345 	#endif
       
  4346 	
       
  4347 	INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
       
  4348 	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
       
  4349     	if (err!=KErrNone)
       
  4350     		INFO_PRINTF1(_L("Failed to record test result"));
       
  4351 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4004"));
       
  4352 /**
       
  4353 @SYMTestCaseID 				GRAPHICS-SYSLIB-GDI-CIT-4004
       
  4354 @SYMTestCaseDesc 			Automated GDI testing for Bengali
       
  4355 @SYMTestPriority 			High
       
  4356 @SYMTestActions  			Attempt to compose various valid  Bengali glyph clusters to test the reequirement.
       
  4357 							Text rendering in Bengali must be based on syllables and the text rendering engine must be capable of handling the Bengali syllabic structure. If a single word is longer than one row, the line can only be broken at syllable border.
       
  4358 							Invalid sequences of characters must be rendered as incomplete syllables
       
  4359 							
       
  4360 @SYMTestExpectedResults 	The expected glyph clusters for given Unicode characters must be returned
       
  4361 @SYMPREQ 					1766: Bengali for Sphinx
       
  4362 @SYMREQ 					8741:  Bengali Text Rendering
       
  4363 */
       
  4364 	// BEN004: 
       
  4365 	testText[14] = 0x0985;
       
  4366 	testText[15] = 0x09A4;
       
  4367 	testText[16] = 0x09CD;
       
  4368 	testText[17] = 0x09AF;
       
  4369 	testText[18] = 0x09A8;
       
  4370 	testText[19] = 0x09CD;
       
  4371 	testText[20] = 0x09A4;
       
  4372 	
       
  4373 	param.iPosInText = 14;
       
  4374 	param.iPen.iX = param.iPen.iY = 0;
       
  4375 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  4376 	
       
  4377 	TEST(r && param.iPosInText == 15
       
  4378 			   && param.iOutputGlyphs == 1
       
  4379 			   && param.iOutput[0].iCode == 0x80000cb0
       
  4380 			   );
       
  4381 	
       
  4382 	#if defined __WINS__ || defined __WINSCW__
       
  4383 	TEST(r && param.iPen.iX == 14);
       
  4384 	#endif
       
  4385 	
       
  4386 	INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
       
  4387 		
       
  4388 	param.iPosInText = 15;
       
  4389 	param.iPen.iX = param.iPen.iY = 0;
       
  4390 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  4391 	
       
  4392 	TEST(r && param.iPosInText == 18
       
  4393 			   && param.iOutputGlyphs == 2
       
  4394 			   && param.iOutput[0].iCode ==0x80000ccb
       
  4395 			   && param.iOutput[1].iCode ==0x80000d6e
       
  4396 			   );
       
  4397 
       
  4398 	#if defined __WINS__ || defined __WINSCW__
       
  4399 	TEST(r && param.iPen.iX == 16);
       
  4400 	#endif
       
  4401 	
       
  4402 	INFO_PRINTF6(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode,param.iOutput[1].iCode);
       
  4403 	
       
  4404 	param.iPosInText = 18;
       
  4405 	param.iPen.iX = param.iPen.iY = 0;
       
  4406 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  4407 
       
  4408 	TEST(r && param.iPosInText == 21
       
  4409 			   && param.iOutputGlyphs == 1
       
  4410 			   && param.iOutput[0].iCode == 0x80000e14
       
  4411 			   );
       
  4412 	
       
  4413 	#if defined __WINS__ || defined __WINSCW__
       
  4414 	TEST(r && param.iPen.iX == 13);
       
  4415 	#endif
       
  4416 	
       
  4417 	INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
       
  4418 	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
       
  4419     	if (err!=KErrNone)
       
  4420     		INFO_PRINTF1(_L("Failed to record test result"));
       
  4421 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4005"));
       
  4422 // BEN005
       
  4423 /**
       
  4424 @SYMTestCaseID 				GRAPHICS-SYSLIB-GDI-CIT-4005
       
  4425 @SYMTestCaseDesc 			Automated GDI testing for Bengali
       
  4426 @SYMTestPriority 			High
       
  4427 @SYMTestActions  			Attempt to compose various valid Bengali glyph clusters to test the requirment
       
  4428 							Text rendering must be able to display specified character sequences using ligatures and set of ligatures (stable/unstable) must be font dependent / configurable.
       
  4429 @SYMTestExpectedResults 	The expected glyph clusters for given Unicode characters must be returned
       
  4430 @SYMPREQ 					1766: Bengali for Sphinx
       
  4431 @SYMREQ 					8741:  Bengali Text Rendering
       
  4432 */
       
  4433 	testText[21] = 0x0995;
       
  4434 	testText[22] = 0x09CD;
       
  4435 	testText[23] = 0x09B7;
       
  4436 	
       
  4437 	testText[24] = 0x09A4;
       
  4438 	testText[25] = 0x09CD;
       
  4439 	testText[26] = 0x09B0;
       
  4440 	
       
  4441 	testText[27] = 0x09A6;
       
  4442 	testText[28] = 0x09CD;
       
  4443 	testText[29] = 0x09A6;
       
  4444 	
       
  4445 	
       
  4446 	param.iPosInText = 21;
       
  4447 	param.iPen.iX = param.iPen.iY = 0;
       
  4448 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  4449 	
       
  4450 	TEST(r && param.iPosInText == 24
       
  4451 			   && param.iOutputGlyphs == 1
       
  4452 			   && param.iOutput[0].iCode == 0x80000d25
       
  4453 			   );
       
  4454 
       
  4455 	#if defined __WINS__ || defined __WINSCW__
       
  4456 	TEST(r && param.iPen.iX == 15);
       
  4457 	#endif
       
  4458 	
       
  4459 	INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
       
  4460 		
       
  4461 	param.iPosInText = 24;
       
  4462 	param.iPen.iX = param.iPen.iY = 0;
       
  4463 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  4464 	
       
  4465 	TEST(r && param.iPosInText == 27
       
  4466 			   && param.iOutputGlyphs == 1
       
  4467 			   && param.iOutput[0].iCode ==0x80000d89
       
  4468 			   );
       
  4469 
       
  4470 	#if defined __WINS__ || defined __WINSCW__
       
  4471 	TEST(r && param.iPen.iX == 12);
       
  4472 	#endif
       
  4473 	
       
  4474 	INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
       
  4475 		
       
  4476 	param.iPosInText = 27;
       
  4477 	param.iPen.iX = param.iPen.iY = 0;
       
  4478 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  4479 	
       
  4480 	TEST(r && param.iPosInText == 30
       
  4481 			   && param.iOutputGlyphs == 1
       
  4482 			   && param.iOutput[0].iCode == 0x80000e0a
       
  4483 			   );
       
  4484 	
       
  4485 	#if defined __WINS__ || defined __WINSCW__
       
  4486 	TEST(r && param.iPen.iX == 13);
       
  4487 	#endif
       
  4488 	
       
  4489 	INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
       
  4490 	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
       
  4491     	if (err!=KErrNone)
       
  4492     		INFO_PRINTF1(_L("Failed to record test result"));
       
  4493 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4006"));
       
  4494 // BEN006
       
  4495 /**
       
  4496 @SYMTestCaseID 				GRAPHICS-SYSLIB-GDI-CIT-4006
       
  4497 @SYMTestCaseDesc 			Automated GDI testing for Bengali
       
  4498 @SYMTestPriority		 	High
       
  4499 @SYMTestActions  			Attempt to compose various valid Bengali glyph clusters to test 
       
  4500 							whether tamil digits are recongized as numerals. 
       
  4501 @SYMTestExpectedResults 	The expected glyph clusters for given Unicode characters must be returned
       
  4502 @SYMPREQ 					1766: Bengali for Sphinx
       
  4503 @SYMREQ 					8741:  Bengali Text Rendering
       
  4504 */
       
  4505 	testText[30] = 0x09E6; // Bengali 1
       
  4506 	testText[31] = 0x0030; //Basic Latin 0
       
  4507 	
       
  4508 	
       
  4509 	param.iPosInText = 30;
       
  4510 	param.iPen.iX = param.iPen.iY = 0;
       
  4511 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  4512 	
       
  4513 	TEST(r && param.iPosInText == 31
       
  4514 			   && param.iOutputGlyphs == 1
       
  4515 			   && param.iOutput[0].iCode == 0x80000cf3
       
  4516 			   );
       
  4517 	
       
  4518 	#if defined __WINS__ || defined __WINSCW__
       
  4519 	TEST(r && param.iPen.iX == 10);
       
  4520 	#endif
       
  4521 	
       
  4522 	INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
       
  4523 	
       
  4524 	param.iPosInText = 31;
       
  4525 	param.iPen.iX = param.iPen.iY = 0;
       
  4526 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  4527 	
       
  4528 	TEST(r && param.iPosInText == 32
       
  4529 			   && param.iOutputGlyphs == 1
       
  4530 			   && param.iOutput[0].iCode == 0x80000774	 
       
  4531 			   );
       
  4532 	
       
  4533 	#if defined __WINS__ || defined __WINSCW__
       
  4534 	TEST(r && param.iPen.iX == 8);
       
  4535 	#endif
       
  4536 	
       
  4537 	INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x "), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
       
  4538 	
       
  4539 	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
       
  4540     	if (err!=KErrNone)
       
  4541     		INFO_PRINTF1(_L("Failed to record test result"));
       
  4542 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4007"));
       
  4543 //BEN 008
       
  4544 /**
       
  4545 @SYMTestCaseID 				GRAPHICS-SYSLIB-GDI-CIT-4007
       
  4546 @SYMTestCaseDesc 			Automated GDI testing for Bengali
       
  4547 @SYMTestPriority 			High
       
  4548 @SYMTestActions  			Attempt to compose various valid
       
  4549 							All text handling processes ((rendering, editing, searching, sorting etc.)  MUST treat the sequence of a base consonant and a nukta equivalently to Nukta consonants
       
  4550 @SYMTestExpectedResults 	The expected glyph clusters for given Unicode characters must be returned
       
  4551 @SYMPREQ 					1766: Bengali for Sphinx
       
  4552 @SYMREQ 					8741:  Bengali Text Rendering
       
  4553 */
       
  4554 	testText[32] = 0x09AF;
       
  4555 	testText[33] = 0x09BC;
       
  4556 	testText[34] = 0x09DF;
       
  4557 	
       
  4558 	param.iPosInText = 32;
       
  4559 	param.iPen.iX = param.iPen.iY = 0;
       
  4560 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  4561 	
       
  4562 	TEST(r && param.iPosInText == 34
       
  4563 			   && param.iOutputGlyphs == 1
       
  4564 			   && param.iOutput[0].iCode == 0x80000cee	 
       
  4565 			   );
       
  4566 
       
  4567 	#if defined __WINS__ || defined __WINSCW__
       
  4568 	TEST(r && param.iPen.iX == 10);
       
  4569 	#endif
       
  4570 	
       
  4571 	INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x "), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
       
  4572 	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
       
  4573     	if (err!=KErrNone)
       
  4574     		INFO_PRINTF1(_L("Failed to record test result"));
       
  4575 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4008"));
       
  4576 // BEN011
       
  4577 /**
       
  4578 @SYMTestCaseID 				GRAPHICS-SYSLIB-GDI-CIT-4008
       
  4579 @SYMTestCaseDesc 			Automated GDI testing for Bengali
       
  4580 @SYMTestPriority 			High
       
  4581 @SYMTestActions  			Attempt to compose various valid Bengali glyph clusters to test 
       
  4582 							Rendering engine must be capable of handling joining formatters.
       
  4583 @SYMTestExpectedResults 	The expected glyph clusters for given Unicode characters must be returned
       
  4584 @SYMPREQ 					1766: Bengali for Sphinx
       
  4585 @SYMREQ 					8741:  Bengali Text Rendering
       
  4586 */
       
  4587 	testText[35] = 0x0995;
       
  4588 	testText[36] = 0x09CD;
       
  4589 	testText[37] = 0x09B7;
       
  4590 	
       
  4591 	testText[38] = 0x0995;
       
  4592 	testText[39] = 0x09CD;
       
  4593 	testText[40] = 0x200C;
       
  4594 	testText[42] = 0x09B7;
       
  4595 	
       
  4596 	testText[43] = 0x0995;
       
  4597 	testText[44] = 0x09CD;
       
  4598 	testText[45] = 0x200D;
       
  4599 	testText[46] = 0x09B7;
       
  4600 	
       
  4601 	
       
  4602 	param.iPosInText = 35;
       
  4603 	param.iPen.iX = param.iPen.iY = 0;
       
  4604 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  4605 
       
  4606 	TEST(r && param.iPosInText == 38
       
  4607 			   && param.iOutputGlyphs == 1
       
  4608 			   && param.iOutput[0].iCode == 0x80000d25
       
  4609 			   );
       
  4610 	
       
  4611 	#if defined __WINS__ || defined __WINSCW__
       
  4612 	TEST(r && param.iPen.iX == 15);
       
  4613 	#endif
       
  4614 	
       
  4615 	INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
       
  4616 		
       
  4617 	param.iPosInText = 38;
       
  4618 	param.iPen.iX = param.iPen.iY = 0;
       
  4619 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  4620 	
       
  4621 	TEST(r && param.iPosInText == 40
       
  4622 			   && param.iOutputGlyphs == 2
       
  4623 			   && param.iOutput[0].iCode == 0x80000cbc
       
  4624 			   && param.iOutput[1].iCode == 0x80000ce9
       
  4625 			   );
       
  4626 
       
  4627 	#if defined __WINS__ || defined __WINSCW__
       
  4628 	TEST(r && param.iPen.iX == 12);
       
  4629 	#endif
       
  4630 	
       
  4631 	INFO_PRINTF6(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode,param.iOutput[1].iCode);
       
  4632 		
       
  4633 	param.iPosInText = 43;
       
  4634 	param.iPen.iX = param.iPen.iY = 0;
       
  4635 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  4636 	
       
  4637 	TEST(r && param.iPosInText == 47
       
  4638 			   && param.iOutputGlyphs == 2
       
  4639 			   && param.iOutput[0].iCode == 0x80000d2a
       
  4640 			   && param.iOutput[1].iCode == 0x80000cd9
       
  4641 			   );
       
  4642 	
       
  4643 	#if defined __WINS__ || defined __WINSCW__
       
  4644 	TEST(r && param.iPen.iX == 22);
       
  4645 	#endif
       
  4646 	
       
  4647 	INFO_PRINTF6(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
       
  4648 		
       
  4649 	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
       
  4650     	if (err!=KErrNone)
       
  4651     		INFO_PRINTF1(_L("Failed to record test result"));
       
  4652 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4009"));
       
  4653 // BEN012
       
  4654 	
       
  4655 /**
       
  4656 @SYMTestCaseID 				GRAPHICS-SYSLIB-GDI-CIT-4009
       
  4657 @SYMTestCaseDesc 			Automated GDI testing for Bengali
       
  4658 @SYMTestPriority 			High
       
  4659 @SYMTestActions  			Attempt to compose various valid Bengali glyph clusters to test
       
  4660  							If consonant /ya/, /ra/, /la/, /ma/, /na/ or /ba/, is the last element of a consonant cluster, the consonant assumes a phala form.
       
  4661 @SYMTestExpectedResults 	The expected glyph clusters for given Unicode characters must be returned
       
  4662 @SYMPREQ 					1766: Bengali for Sphinx
       
  4663 @SYMREQ 					8741:  Bengali Text Rendering
       
  4664 */
       
  4665 	testText[47] = 0x09AA;
       
  4666 	testText[48] = 0x09CD;
       
  4667 	testText[49] = 0x09AF;
       
  4668 	
       
  4669 	testText[50] = 0x09AA;
       
  4670 	testText[51] = 0x09CD;
       
  4671 	testText[52] = 0x09A8;
       
  4672 	
       
  4673 	// Not working with Series60Sans font:
       
  4674 	testText[53] = 0x09AA;
       
  4675 	testText[54] = 0x09CD;
       
  4676 	testText[55] = 0x09AE;
       
  4677 	
       
  4678 	param.iPosInText = 47;
       
  4679 	param.iPen.iX = param.iPen.iY = 0;
       
  4680 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  4681 	
       
  4682 	TEST(r && param.iPosInText == 50
       
  4683 			   && param.iOutputGlyphs == 2
       
  4684 			   && param.iOutput[0].iCode == 0x80000cd0
       
  4685 			   );
       
  4686 	
       
  4687 	#if defined __WINS__ || defined __WINSCW__
       
  4688 	TEST(r && param.iPen.iX == 15);
       
  4689 	#endif
       
  4690 	
       
  4691 	INFO_PRINTF6(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
       
  4692 	
       
  4693 	param.iPosInText = 50;
       
  4694 	param.iPen.iX = param.iPen.iY = 0;
       
  4695 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  4696 	
       
  4697 	TEST(r && param.iPosInText == 53
       
  4698 			   && param.iOutputGlyphs == 1
       
  4699 			   && param.iOutput[0].iCode == 0x80000e25
       
  4700 			   );
       
  4701 	
       
  4702 	#if defined __WINS__ || defined __WINSCW__
       
  4703 	TEST(r && param.iPen.iX == 11);
       
  4704 	#endif
       
  4705 	
       
  4706 	INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
       
  4707 	// Not working with Series60Sans font:
       
  4708 	param.iPosInText = 53;
       
  4709 	param.iPen.iX = param.iPen.iY = 0;
       
  4710 	
       
  4711 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  4712 	
       
  4713 	TEST(r && param.iPosInText == 56
       
  4714 	   && param.iOutputGlyphs == 2
       
  4715 	   && param.iOutput[0].iCode == 0x80000d3e 
       
  4716 	   && param.iOutput[1].iCode == 0x80000cd4
       
  4717 	  	);
       
  4718 
       
  4719 	#if defined __WINS__ || defined __WINSCW__
       
  4720 	TEST(r && param.iPen.iX == 19);
       
  4721 	#endif
       
  4722 	
       
  4723 	INFO_PRINTF6(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);	
       
  4724 	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
       
  4725     	if (err!=KErrNone)
       
  4726     		INFO_PRINTF1(_L("Failed to record test result"));
       
  4727 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4010"));
       
  4728 // BEN013	
       
  4729 /**
       
  4730 @SYMTestCaseID 				GRAPHICS-SYSLIB-GDI-CIT-4010
       
  4731 @SYMTestCaseDesc 			Automated GDI testing for Bengali
       
  4732 @SYMTestPriority 			High
       
  4733 @SYMTestActions  			Attempt to compose various valid Bengali glyph clusters to tet 
       
  4734 							Sequence <virama, ya>, i.e. ya-phala, MUST be allowed after independent vowels /a/ and /e/.
       
  4735 @SYMTestExpectedResults 	The expected glyph clusters for given Unicode characters must be returned
       
  4736 @SYMPREQ 					1766: Bengali for Sphinx
       
  4737 @SYMREQ 					8741:  Bengali Text Rendering
       
  4738 */
       
  4739 	testText[56] = 0x0985;
       
  4740 	testText[57] = 0x09CD;
       
  4741 	testText[58] = 0x09AF;
       
  4742 	testText[59] = 0x09BE;
       
  4743 	
       
  4744 	// Double ya -> Ya, ya-phala
       
  4745 	testText[60] = 0x09AA;
       
  4746 	testText[61] = 0x09CD;
       
  4747 	testText[62] = 0x09AF;
       
  4748 	testText[63] = 0x09CD;
       
  4749 	testText[64] = 0x09AF;
       
  4750 	
       
  4751 	param.iPosInText = 56;
       
  4752 	param.iPen.iX = param.iPen.iY = 0;
       
  4753 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  4754 	#if defined __WINS__ || defined __WINSCW__
       
  4755 	TEST(r && param.iPosInText == 57
       
  4756 			   && param.iPen.iX == 14
       
  4757 			   && param.iOutputGlyphs == 1
       
  4758 			   && param.iOutput[0].iCode == 0x80000cb0
       
  4759 			   );
       
  4760 	#elif defined __ARMCC__
       
  4761 	TEST(r && param.iPosInText == 57
       
  4762 			   && param.iOutputGlyphs == 1
       
  4763 			   && param.iOutput[0].iCode == 0x80000cb0
       
  4764 			   );
       
  4765 	#endif
       
  4766 	INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
       
  4767 	
       
  4768 	param.iPosInText = 57;
       
  4769 	param.iPen.iX = param.iPen.iY = 0;
       
  4770 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  4771 	
       
  4772 	TEST(r && param.iPosInText == 58
       
  4773 			   && param.iOutputGlyphs == 0	
       
  4774 			   );
       
  4775 	
       
  4776 	#if defined __WINS__ || defined __WINSCW__
       
  4777 	TEST(r && param.iPen.iX == 0);
       
  4778 	#endif
       
  4779 	
       
  4780 	INFO_PRINTF6(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
       
  4781 	
       
  4782 	param.iPosInText = 60;
       
  4783 	param.iPen.iX = param.iPen.iY = 0;
       
  4784 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  4785 	
       
  4786 	TEST(r && param.iPosInText == 65
       
  4787 			   && param.iOutputGlyphs == 3
       
  4788 			   && param.iOutput[0].iCode == 0x80000d3e
       
  4789 			   && param.iOutput[1].iCode == 0x80000cd5
       
  4790 			   && param.iOutput[2].iCode == 0x80000d6e
       
  4791 			   );
       
  4792 	
       
  4793 	#if defined __WINS__ || defined __WINSCW__
       
  4794 	TEST(r && param.iPen.iX == 23);
       
  4795 	#endif
       
  4796 	
       
  4797 	INFO_PRINTF7(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x iOutput[2].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode, param.iOutput[2].iCode);
       
  4798 	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
       
  4799     	if (err!=KErrNone)
       
  4800     		INFO_PRINTF1(_L("Failed to record test result"));
       
  4801 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4011"));
       
  4802 	// BEN014
       
  4803 	/**
       
  4804 @SYMTestCaseID 				GRAPHICS-SYSLIB-GDI-CIT-4011
       
  4805 @SYMTestCaseDesc 			Automated GDI testing for Bengali
       
  4806 @SYMTestPriority 			High
       
  4807 @SYMTestActions  			Attempt to compose various valid and glyph clusters to test 
       
  4808 						 	When consonant /ga/, /nna/, /na/, /pa/, /la/, /sha/, /ssa/ or /sa/ is a dead consonant, and none of the other consonant cluster formation rules apply, the consonant MUST be rendered with a stemless half form.
       
  4809 @SYMTestExpectedResults 	The expected glyph clusters for given Unicode characters must be returned
       
  4810 @SYMPREQ 					1766: Bengali for Sphinx
       
  4811 @SYMREQ 					8741:  Bengali Text Rendering
       
  4812 */
       
  4813 	testText[65] = 0x0997;
       
  4814 	testText[66] = 0x09CD;
       
  4815 	testText[67] = 0x099C;
       
  4816 	
       
  4817 	testText[68] = 0x09AA;
       
  4818 	testText[69] = 0x09CD;
       
  4819 	testText[70] = 0x099C;
       
  4820 	
       
  4821 	
       
  4822 	param.iPosInText = 65;
       
  4823 	param.iPen.iX = param.iPen.iY = 0;
       
  4824 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  4825 	
       
  4826 	TEST(r && param.iPosInText == 68
       
  4827 			   && param.iOutputGlyphs == 2
       
  4828 			   && param.iOutput[0].iCode == 0x80000d2c
       
  4829 			   && param.iOutput[1].iCode == 0x80000cc3
       
  4830 			   );
       
  4831 	
       
  4832 	#if defined __WINS__ || defined __WINSCW__
       
  4833 	TEST(r && param.iPen.iX == 21);
       
  4834 	#endif
       
  4835 	
       
  4836 	INFO_PRINTF6(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
       
  4837 		
       
  4838 	param.iPosInText = 68;
       
  4839 	param.iPen.iX = param.iPen.iY = 0;
       
  4840 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  4841 	
       
  4842 	TEST(r && param.iPosInText == 71
       
  4843 			   && param.iOutputGlyphs == 2
       
  4844 			   && param.iOutput[0].iCode == 0x80000d3e
       
  4845 			   );
       
  4846 	
       
  4847 	#if defined __WINS__ || defined __WINSCW__
       
  4848 	TEST(r && param.iPen.iX == 23);
       
  4849 	#endif
       
  4850 	
       
  4851 	INFO_PRINTF6(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
       
  4852 		
       
  4853 	
       
  4854 	// BEN015
       
  4855 	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
       
  4856     	if (err!=KErrNone)
       
  4857     		INFO_PRINTF1(_L("Failed to record test result"));
       
  4858 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4012"));
       
  4859 	/**
       
  4860 @SYMTestCaseID 				GRAPHICS-SYSLIB-GDI-CIT-4012
       
  4861 @SYMTestCaseDesc 			Automated GDI testing for Bengali
       
  4862 @SYMTestPriority 			High
       
  4863 @SYMTestActions  			Attempt to compose various valid Bengali glyph clusters to test 
       
  4864  							When /ka/, /nga/, /ca/, /tta/, /dda/, /ta/ or /da/ is a dead consonant, and none of the other consonant cluster formation rules apply, the consonant MUST be rendered with a miniature half form.
       
  4865 @SYMTestExpectedResults 	The expected glyph clusters for given Unicode characters must be returned
       
  4866 @SYMPREQ 					1766: Bengali for Sphinx
       
  4867 @SYMREQ 					8741:  Bengali Text Rendering
       
  4868 */
       
  4869 	testText[71] = 0x0995;
       
  4870 	testText[72] = 0x09CD;
       
  4871 	testText[73] = 0x099C;
       
  4872 	
       
  4873 	
       
  4874 	param.iPosInText = 71;
       
  4875 	param.iPen.iX = param.iPen.iY = 0;
       
  4876 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  4877 	
       
  4878 	TEST(r && param.iPosInText == 74
       
  4879 			   && param.iOutputGlyphs == 2
       
  4880 			   && param.iOutput[0].iCode == 0x80000d2a  
       
  4881 			   );
       
  4882 	
       
  4883 	#if defined __WINS__ || defined __WINSCW__
       
  4884 	TEST(r && param.iPen.iX == 26);
       
  4885 	#endif
       
  4886 	
       
  4887 	INFO_PRINTF6(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
       
  4888 
       
  4889 	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
       
  4890     	if (err!=KErrNone)
       
  4891     		INFO_PRINTF1(_L("Failed to record test result"));
       
  4892 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4013"));
       
  4893 	// BEN016
       
  4894 	
       
  4895 	/**
       
  4896 @SYMTestCaseID 				GRAPHICS-SYSLIB-GDI-CIT-4013
       
  4897 @SYMTestCaseDesc 			Automated GDI testing for Bengali
       
  4898 @SYMTestPriority 			High
       
  4899 @SYMTestActions  			Attempt to compose various valid Bengali glyph clusters to test
       
  4900  							The consonant pairs /k.ka/, /ng.kha/, /c.nya/, /nn.nna/, /n.tha/, /n.pha/, /m.ta/, /m.tha/, /m.pha/, /m.bha/, /l.ka/, /l.ga/, /l.pa/, /ss.ka/, /ss.pha/, /s.ka/, /s.kha/, /s.ta/, /s.tha/, /s.pha/, /h.nna/ MUST be representend as stacks of two consonants.
       
  4901 @SYMTestExpectedResults 	The expected glyph clusters for given Unicode characters must be returned
       
  4902 @SYMPREQ 					1766: Bengali for Sphinx
       
  4903 @SYMREQ 					8741:  Bengali Text Rendering
       
  4904 */
       
  4905 	// Ma does not stack correctly on top with Series60Sans font, produces half form instead. Font defect.
       
  4906 	testText[74] = 0x09AE;
       
  4907 	testText[75] = 0x09CD;
       
  4908 	testText[76] = 0x09A5;
       
  4909 	
       
  4910 	testText[77] = 0x09AE;
       
  4911 	testText[78] = 0x09CD;
       
  4912 	testText[79] = 0x09AB;
       
  4913 	// Ma does not stack correctly on top, produces half form instead.
       
  4914 	testText[80] = 0x09AE;
       
  4915 	testText[81] = 0x09CD;
       
  4916 	testText[82] = 0x0995;
       
  4917 	
       
  4918 	testText[83] = 0x09A8;
       
  4919 	testText[84] = 0x09CD;
       
  4920 	testText[85] = 0x09A5;
       
  4921 	
       
  4922 	
       
  4923 	//Combination pa,virama,ma produces incorrect glyph mapping: Font defect.
       
  4924 
       
  4925 	param.iPosInText = 74;
       
  4926 	param.iPen.iX = param.iPen.iY = 0;
       
  4927 	
       
  4928 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  4929 	
       
  4930 	TEST(r && param.iPosInText == 77		 
       
  4931 		   && param.iOutputGlyphs == 2
       
  4932 		   && param.iOutput[0].iCode == 0x80000d42 
       
  4933 		   && param.iOutput[1].iCode == 0x80000ccc
       
  4934 	);
       
  4935 	
       
  4936 	#if defined __WINS__ || defined __WINSCW__
       
  4937 	TEST(r && param.iPen.iX == 21);
       
  4938 	#endif
       
  4939 	
       
  4940 	INFO_PRINTF6(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
       
  4941 	
       
  4942 	
       
  4943 	param.iPosInText = 77;
       
  4944 	param.iPen.iX = param.iPen.iY = 0;
       
  4945 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  4946 	
       
  4947 	TEST(r && param.iPosInText == 80
       
  4948 			   && param.iOutputGlyphs == 1
       
  4949 			   && param.iOutput[0].iCode == 0x80000e30
       
  4950 			   );
       
  4951 	
       
  4952 	#if defined __WINS__ || defined __WINSCW__
       
  4953 	TEST(r && param.iPen.iX == 19);
       
  4954 	#endif
       
  4955 	
       
  4956 	INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
       
  4957 	
       
  4958 	// Ma does not stack correctly on top, produces half form instead.
       
  4959 	param.iPosInText = 80;
       
  4960 	param.iPen.iX = param.iPen.iY = 0;
       
  4961 	
       
  4962 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  4963 	
       
  4964 	TEST(r && param.iPosInText == 83
       
  4965 	   && param.iOutputGlyphs == 2
       
  4966 	   && param.iOutput[0].iCode == 0x80000d42
       
  4967 	);
       
  4968 	
       
  4969 	#if defined __WINS__ || defined __WINSCW__
       
  4970 	TEST(r && param.iPen.iX == 22);
       
  4971 	#endif
       
  4972 
       
  4973 	INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
       
  4974 	
       
  4975 	
       
  4976 	param.iPosInText = 83;
       
  4977 	param.iPen.iX = param.iPen.iY = 0;
       
  4978 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  4979 
       
  4980 	TEST(r && param.iPosInText == 86
       
  4981 			   && param.iOutputGlyphs == 1
       
  4982 			   && param.iOutput[0].iCode == 0x80000e15
       
  4983 			   );
       
  4984 	
       
  4985 	#if defined __WINS__ || defined __WINSCW__
       
  4986 	TEST(r && param.iPen.iX == 10);
       
  4987 	#endif
       
  4988 	
       
  4989 	INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
       
  4990 	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
       
  4991     	if (err!=KErrNone)
       
  4992     		INFO_PRINTF1(_L("Failed to record test result"));
       
  4993 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4014"));
       
  4994 	// BEN017
       
  4995 	
       
  4996 	/**
       
  4997 @SYMTestCaseID 				GRAPHICS-SYSLIB-GDI-CIT-4014
       
  4998 @SYMTestCaseDesc 			Automated GDI testing for Bengali
       
  4999 @SYMTestPriority 			High
       
  5000 @SYMTestActions  			Attempt to compose various valid Bengali glyph clusters to test
       
  5001  							Consonant pairs /k.tta/, /k.ta/, /k.ssa/, /k.sa/, /g.ga/, /g.dha/, /ng.ka/, /ng.ga/, /j.ja/, /j.jha/, /j.nya/, /ny.ca/, /ny.cha/, /ny.ja/, /ny.jha/, /tt.tta/, /nn.ttha/, /nn.dda/, /t.ta/, /t.tha/, /d.da/, /d.dha/, /d.ba/, /d.bha/, /n.ta/, /n.dha/, /p.ta/, /b.ja/, /b.da/, /b.dha/, /m.pa/, /ss.tta/, /ss.ttha/, /ss.nna/, /s.pa/, /h.na/ /h.ma/ MUST be displayed as ligatures, if they appear at the end of a consonant cluster.
       
  5002 @SYMTestExpectedResults 	The expected glyph clusters for given Unicode characters must be returned
       
  5003 @SYMPREQ 					1766: Bengali for Sphinx
       
  5004 @SYMREQ 					8741:  Bengali Text Rendering
       
  5005 */
       
  5006 	testText[86] = 0x0995;
       
  5007 	testText[87] = 0x09CD;
       
  5008 	testText[88] = 0x099F;
       
  5009 	
       
  5010 	testText[89] = 0x0995;
       
  5011 	testText[90] = 0x09CD;
       
  5012 	testText[91] = 0x09A4;
       
  5013 	
       
  5014 	// Not sure if this is forming the correct ligature
       
  5015 	testText[92] = 0x09AE;
       
  5016 	testText[93] = 0x09CD;
       
  5017 	testText[94] = 0x09AA;
       
  5018 		
       
  5019 	// Not sure if this is forming the correct ligature
       
  5020 	testText[95] = 0x09B8;
       
  5021 	testText[96] = 0x09CD;
       
  5022 	testText[97] = 0x09AA;
       
  5023 	
       
  5024 	testText[98] = 0x09B9;
       
  5025 	testText[99] = 0x09CD;
       
  5026 	testText[100] = 0x09A8;
       
  5027 	
       
  5028 	param.iPosInText = 86;
       
  5029 	param.iPen.iX = param.iPen.iY = 0;
       
  5030 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  5031 	
       
  5032 	TEST(r && param.iPosInText == 89
       
  5033 			   && param.iOutputGlyphs == 1
       
  5034 			   && param.iOutput[0].iCode == 0x80000dd7
       
  5035 			   );
       
  5036 	
       
  5037 	#if defined __WINS__ || defined __WINSCW__
       
  5038 	TEST(r && param.iPen.iX == 12);
       
  5039 	#endif
       
  5040 	
       
  5041 	INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
       
  5042 	
       
  5043 	param.iPosInText = 89;
       
  5044 	param.iPen.iX = param.iPen.iY = 0;
       
  5045 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  5046 	
       
  5047 	TEST(r && param.iPosInText == 92
       
  5048 			   && param.iOutputGlyphs == 1
       
  5049 			   && param.iOutput[0].iCode == 0x80000dd9
       
  5050 			   );
       
  5051 	
       
  5052 	#if defined __WINS__ || defined __WINSCW__
       
  5053 	TEST(r && param.iPen.iX == 15);
       
  5054 	#endif
       
  5055 	
       
  5056 	INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
       
  5057 	
       
  5058 	param.iPosInText = 92;
       
  5059 	param.iPen.iX = param.iPen.iY = 0;
       
  5060 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  5061 	
       
  5062 	TEST(r && param.iPosInText == 95
       
  5063 			   && param.iOutputGlyphs == 1
       
  5064 			   && param.iOutput[0].iCode == 0x80000e2f
       
  5065 			   );
       
  5066 
       
  5067 	#if defined __WINS__ || defined __WINSCW__
       
  5068 	TEST(r && param.iPen.iX == 19);
       
  5069 	#endif
       
  5070 	
       
  5071 	INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
       
  5072 		
       
  5073 	param.iPosInText = 95;
       
  5074 	param.iPen.iX = param.iPen.iY = 0;
       
  5075 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  5076 	
       
  5077 	TEST(r && param.iPosInText == 98
       
  5078 			   && param.iOutputGlyphs == 1
       
  5079 			   && param.iOutput[0].iCode == 0x80000e56
       
  5080 			   );
       
  5081 	
       
  5082 	#if defined __WINS__ || defined __WINSCW__
       
  5083 	TEST(r && param.iPen.iX == 20);
       
  5084 	#endif
       
  5085 	
       
  5086 	INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);	
       
  5087 	
       
  5088 	param.iPosInText = 98;
       
  5089 	param.iPen.iX = param.iPen.iY = 0;
       
  5090 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  5091 	
       
  5092 	TEST(r && param.iPosInText == 101	
       
  5093 			   && param.iOutputGlyphs == 1
       
  5094 			   && param.iOutput[0].iCode == 0x80000e5d	
       
  5095 			   );
       
  5096 
       
  5097 	#if defined __WINS__ || defined __WINSCW__
       
  5098 	TEST(r && param.iPen.iX == 13);
       
  5099 	#endif
       
  5100 	
       
  5101 	INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
       
  5102 	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
       
  5103     	if (err!=KErrNone)
       
  5104     		INFO_PRINTF1(_L("Failed to record test result"));
       
  5105 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4015"));
       
  5106 // BEN020
       
  5107 /**
       
  5108 @SYMTestCaseID 				GRAPHICS-SYSLIB-GDI-CIT-4015
       
  5109 @SYMTestCaseDesc 			Automated GDI testing for Bengali
       
  5110 @SYMTestPriority 			High
       
  5111 @SYMTestActions  			Attempt to compose various valid Bengali glyph clusters to test that
       
  5112  							If RA is the first consonant cluster, it must assume the form of Repha.
       
  5113 @SYMTestExpectedResults 	The expected glyph clusters for given Unicode characters must be returned
       
  5114 @SYMPREQ 					1766: Bengali for Sphinx
       
  5115 @SYMREQ 					8741:  Bengali Text Rendering
       
  5116 */
       
  5117 	testText[101] = 0x09B0;
       
  5118 	testText[102] = 0x09CD;
       
  5119 	testText[103] = 0x0995;
       
  5120 	
       
  5121 	testText[104] = 0x09B0;
       
  5122 	testText[105] = 0x200C;
       
  5123 	testText[106] = 0x09CD;
       
  5124 	testText[107] = 0x09AF;
       
  5125 	
       
  5126 	param.iPosInText = 101;
       
  5127 	param.iPen.iX = param.iPen.iY = 0;
       
  5128 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  5129 	
       
  5130 	TEST(r && param.iPosInText == 104
       
  5131 			   && param.iOutputGlyphs == 2
       
  5132 			   && param.iOutput[0].iCode == 0x80000cbc
       
  5133 			   && param.iOutput[1].iCode == 0x80000d27
       
  5134 			   );
       
  5135 	
       
  5136 	#if defined __WINS__ || defined __WINSCW__
       
  5137 	TEST(r && param.iPen.iX == 12);
       
  5138 	#endif
       
  5139 	
       
  5140 	INFO_PRINTF6(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
       
  5141 		
       
  5142 	param.iPosInText =104;
       
  5143 	param.iPen.iX = param.iPen.iY = 0;
       
  5144 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  5145 	
       
  5146 	TEST(r && param.iPosInText == 105
       
  5147 			   && param.iOutputGlyphs == 1
       
  5148 			   && param.iOutput[0].iCode == 0x80000cd6
       
  5149 			   );
       
  5150 
       
  5151 	#if defined __WINS__ || defined __WINSCW__
       
  5152 	TEST(r && param.iPen.iX == 9);
       
  5153 	#endif
       
  5154 	
       
  5155 	INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
       
  5156 		
       
  5157 	}
       
  5158 
       
  5159 
       
  5160 void CTGlyphSelection::TestTamilChars(CFbsFont* aFont)
       
  5161 	{
       
  5162 INFO_PRINTF1(_L("Test Tamil Glyphs"));
       
  5163  
       
  5164   	TBool r;
       
  5165 	TBuf<162> testText(0);
       
  5166 	CFont::TPositionParam param;
       
  5167 	param.iDirection = CFont::EHorizontal;
       
  5168 	param.iFlags = CFont::TPositionParam::EFLogicalOrder;
       
  5169 
       
  5170 	testText.SetLength(162);
       
  5171 	// Make sure there is no garbage values in the memory we are using.
       
  5172 	for (TInt i = 0; i < testText.Length(); i++)
       
  5173 		testText[i]=0xFFFF;
       
  5174 	param.iText.Set(testText);
       
  5175 	RShapeInfo shapeInfo;
       
  5176 	//Testdata for Tamil Langauage
       
  5177 	TRAPD(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
       
  5178     	if (err!=KErrNone)
       
  5179     		INFO_PRINTF1(_L("Failed to record test result"));
       
  5180 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4016"));
       
  5181 /*	
       
  5182 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4016
       
  5183 @SYMTestCaseDesc Automated GDI testing for Tamil
       
  5184 @SYMTestPriority High
       
  5185 @SYMTestActions  Attempt to compose various valid Tamil glyph clusters to test 
       
  5186   	 a)The Tamil alphabets are listed in contiguous Unicode range(U+0B80–U+0BFF),  This also contains Tamil Numbers.
       
  5187 	 b)The Tamil alphabets are listed in contiguous Unicode range(U+0B80–U+0BFF),  This also contains Tamil Numbers.
       
  5188 	 c)Internal data storage should always be in the logical order, but the rendering of it may be different to that of the logical order
       
  5189 	 d)Combination of Unicode sequences must be rendered as valid blocks.  In Tamil some character sequences are invalid and therefore only the sequences which follow the logical order as described in Req 1.2.3 should be rendered properly
       
  5190 	 e)If the text being rendered contains a mixture of scripts, the text in each script should be rendered according to the rules of that particular script.
       
  5191 @SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
       
  5192 @SYMPREQ 1766: Tamil for Sphinx
       
  5193 @SYMREQ 8742:Tamil Text Rendering
       
  5194 */
       
  5195 	testText[0] = 0x0B95; //Tamil Ka
       
  5196 	testText[1] = 0x0B8E; //Tamil e
       
  5197 	testText[2] = 0x0061; //Latin A
       
  5198 	testText[3] = 0x0905; // Hindi Ka
       
  5199 	testText[4] = 0x0020;
       
  5200 	// Do the testing
       
  5201 	param.iPosInText = 0 ;
       
  5202 	param.iPen.iX = param.iPen.iY = 0;
       
  5203 	
       
  5204 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  5205 
       
  5206 	TEST(r && param.iPosInText == 1  
       
  5207 		   && param.iOutputGlyphs == 1
       
  5208 		   && param.iOutput[0].iCode == 0x80000bf6);
       
  5209 
       
  5210 	#if defined __WINS__ || defined __WINSCW__
       
  5211 	TEST(r && param.iPen.iX == 13);
       
  5212 	#endif
       
  5213 	
       
  5214 	INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
       
  5215 	
       
  5216 	param.iPosInText = 1 ;
       
  5217 	param.iPen.iX = param.iPen.iY = 0;
       
  5218 	
       
  5219 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  5220 	
       
  5221 	TEST(r && param.iPosInText ==  2 
       
  5222 		   && param.iOutputGlyphs == 1
       
  5223 		   && param.iOutput[0].iCode == 0x80000bf0);
       
  5224 
       
  5225 	#if defined __WINS__ || defined __WINSCW__
       
  5226 	TEST(r && param.iPen.iX == 14);
       
  5227 	#endif
       
  5228 	
       
  5229 	INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
       
  5230 	
       
  5231 	param.iPosInText = 2 ;
       
  5232 	param.iPen.iX = param.iPen.iY = 0;
       
  5233 	
       
  5234 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  5235 	
       
  5236 	TEST(r && param.iPosInText == 3
       
  5237 		   && param.iOutputGlyphs == 1
       
  5238 		   && param.iOutput[0].iCode == 0x61 );
       
  5239 
       
  5240 	#if defined __WINS__ || defined __WINSCW__
       
  5241 	TEST(r && param.iPen.iX == 10);
       
  5242 	#endif
       
  5243 	
       
  5244 	INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
       
  5245 	param.iPosInText = 3 ;
       
  5246 	param.iPen.iX = param.iPen.iY = 0;
       
  5247 	
       
  5248 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  5249 	
       
  5250 	TEST(r && param.iPosInText == 4  
       
  5251 		   && param.iOutputGlyphs == 1
       
  5252 		   && param.iOutput[0].iCode == 0x80000528);
       
  5253 
       
  5254 	#if defined __WINS__ || defined __WINSCW__
       
  5255 	TEST(r && param.iPen.iX == 12);
       
  5256 	#endif
       
  5257 	
       
  5258 	INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
       
  5259 	
       
  5260 	/*Req 02 1.2.3, 1.3.21, 1.3.21.1, 1.3.21.2 1.3.21.3
       
  5261 	
       
  5262 	1.2.3 The attachment presents the logical order used to present Tamil text. In the schematic samples, square brackets are used to presents the components that may be omitted. 
       
  5263 	1.3.21 If the text-rendering engine detects invalid sequences of characters, it should render the invalid sequences using an appropriate fallback rendering mechanism
       
  5264 Please see the attachment for examples
       
  5265 	1.3.21.1 For normal rendering, combining Tamil characters must be preceded by a valid base character. 
       
  5266 	1.3.21.2 Combining Tamil characters that do not follow a valid base character must be rendered using an appropriate fallback rendering.
       
  5267 	1.3.21.3 Device must not hang or crash because of unexpected character sequences.*/
       
  5268 	
       
  5269 	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
       
  5270     	if (err!=KErrNone)
       
  5271     		INFO_PRINTF1(_L("Failed to record test result"));
       
  5272 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4017"));
       
  5273 //Req 03 
       
  5274 	
       
  5275 /**
       
  5276 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4017
       
  5277 @SYMTestCaseDesc Automated GDI testing for Tamil
       
  5278 @SYMTestPriority High
       
  5279 @SYMTestActions  Attempt to compose various valid Tamil glyph clusters to test 
       
  5280 				 It is reasonably common to mix Latin, Tamil as well as other script in texts.  This must include the numerals.
       
  5281 @SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
       
  5282 @SYMPREQ 1766: Tamil for Sphinx
       
  5283 @SYMREQ 8742:Tamil Text Rendering
       
  5284 */
       
  5285 	testText[4] = 0x0036;//Latin 06
       
  5286 	testText[5] = 0x0BEC;//Tamil 06
       
  5287 	
       
  5288 	param.iPosInText = 4 ;
       
  5289 	param.iPen.iX = param.iPen.iY = 0;
       
  5290 	
       
  5291 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  5292 	
       
  5293 	TEST(r && param.iPosInText == 5  
       
  5294 		   && param.iOutputGlyphs == 1
       
  5295 		   && param.iOutput[0].iCode == 0x8000077A);
       
  5296 	
       
  5297 	#if defined __WINS__ || defined __WINSCW__
       
  5298 	TEST(r && param.iPen.iX == 8);
       
  5299 	#endif
       
  5300 
       
  5301 	INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
       
  5302 		
       
  5303 	param.iPosInText = 5 ;
       
  5304 	param.iPen.iX = param.iPen.iY = 0;
       
  5305 	
       
  5306 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  5307 	
       
  5308 	TEST(r && param.iPosInText == 6  
       
  5309 		   && param.iOutputGlyphs == 1
       
  5310 		   && param.iOutput[0].iCode == 0x80000c20);
       
  5311 
       
  5312 	#if defined __WINS__ || defined __WINSCW__
       
  5313 	TEST(r && param.iPen.iX == 16);
       
  5314 	#endif
       
  5315 	
       
  5316 	INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
       
  5317 
       
  5318 	/*Req 04 1.3.4, 1.3.20
       
  5319 	1.3.4   1. Tamil is a semi-syllabic script and in Tamil text rendering the basic unit for handling text must be the orthographic syllable.
       
  5320 			2. Therefore, a text-rendering engine should first identify a syllable and then analyze the syllable. Based on the analysis, text-rendering engine should then be able to select and/or shape the glyphs required for rendering the syllable and to perform contextual positioning of glyphs inside a syllable.
       
  5321 			3. After a syllable has been formed it must be considered an indivisible and invariable unit.
       
  5322 			4. The shape of a syllable is not affected by surrounding syllables.
       
  5323 	1.3.20 Syllable is the smallest unbreakable component in Tamil*/
       
  5324 	
       
  5325 	/*Req 07 1.3.5
       
  5326 	
       
  5327 	1.3.5 	1. In Tamil, when ligatures are used there is a possibility that the shaping of the previous consonant will depend on the next consonant the user enters
       
  5328 			2. In Tamil, there is a possibility that even though the characters are entered one by one the position of the matras change depending on the consonant and the type of the matra
       
  5329 	
       
  5330 	Req 08 1.3.19
       
  5331 	
       
  5332 	1.3.19 In Tamil white space is used as a word boundary. Line breaking should be based on word boundaries
       
  5333 	
       
  5334 	
       
  5335 	Req 09 1.2.4
       
  5336 	
       
  5337 	1.2.4 For compatibility with legacy encodings, split matra and vowel representations must be recognized as identical to the single code representations (preferred)
       
  5338 	*/
       
  5339 	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
       
  5340     	if (err!=KErrNone)
       
  5341     		INFO_PRINTF1(_L("Failed to record test result"));
       
  5342 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4018"));
       
  5343 //Req 10 1.3.6	
       
  5344 /**
       
  5345 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4018
       
  5346 @SYMTestCaseDesc Automated GDI testing for Tamil
       
  5347 @SYMTestPriority High
       
  5348 @SYMTestActions  Attempt to compose various valid Tamil glyph clusters to test the requirement.
       
  5349 				 Tamil character shaping MUST be based on combining character sequences. All shaping processes (splitting, reordering, glyph selection) MUST occur in the context of combining character sequence.
       
  5350 @SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
       
  5351 @SYMPREQ 1766: Tamil for Sphinx
       
  5352 @SYMREQ 8742:Tamil Text Rendering
       
  5353 */
       
  5354 	testText[6] = 0x0BAA; // Pa
       
  5355 	testText[7] = 0x0BCD; //Virama
       
  5356 	testText[8] = 0x0B95; //Ka
       
  5357 	testText[9] = 0x0BCD; //Virama
       
  5358 	testText[10] = 0x0B9F; //Tta
       
  5359 	testText[11] = 0x0BC7; //-e
       
  5360 	
       
  5361 	testText[12] = 0x0BAA;//Pa
       
  5362 	testText[13] = 0x0BCD;//Virama
       
  5363 	testText[14] = 0x0B95;//Ka
       
  5364 	testText[15] = 0x0BCC;//AU
       
  5365 	
       
  5366 	testText[16] = 0x0B95; //Ka
       
  5367 	testText[17] = 0x0BCD; //Virama
       
  5368 	testText[18] = 0x0BB7; //Ssa
       
  5369 	testText[19] = 0x0BCB; //OO
       
  5370 	
       
  5371 	param.iPosInText = 6 ;
       
  5372 	param.iPen.iX = param.iPen.iY = 0;
       
  5373 	
       
  5374 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  5375 	
       
  5376 	TEST(r && param.iPosInText == 12    
       
  5377 		   && param.iOutputGlyphs == 4
       
  5378 		   && param.iOutput[0].iCode == 0x80000c3a
       
  5379 		   && param.iOutput[1].iCode == 0x80000c30  
       
  5380 		   && param.iOutput[2].iCode == 0x80000c13
       
  5381 		   && param.iOutput[3].iCode == 0x80000bfb);
       
  5382 	
       
  5383 	#if defined __WINS__ || defined __WINSCW__
       
  5384 	TEST(r && param.iPen.iX == 51);
       
  5385 	#endif
       
  5386 	
       
  5387 	INFO_PRINTF7(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x iOutput[3].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode, param.iOutput[3].iCode);
       
  5388 	
       
  5389 	param.iPosInText = 12 ;
       
  5390 	param.iPen.iX = param.iPen.iY = 0;
       
  5391 	
       
  5392 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  5393 	
       
  5394 	TEST(r && param.iPosInText ==  16 
       
  5395 		   && param.iOutputGlyphs ==4 
       
  5396 		   && param.iOutput[0].iCode == 0x80000c3a 
       
  5397 		   && param.iOutput[1].iCode == 0x80000c12 
       
  5398 		   && param.iOutput[2].iCode == 0x80000bf6
       
  5399 		   && param.iOutput[3].iCode == 0x80000c19);
       
  5400 	
       
  5401 	#if defined __WINS__ || defined __WINSCW__
       
  5402 	TEST(r && param.iPen.iX == 56);
       
  5403 	#endif
       
  5404 	
       
  5405 	INFO_PRINTF7(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x iOutput[3].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode, param.iOutput[3].iCode);
       
  5406 	
       
  5407 	param.iPosInText = 16 ;
       
  5408 	param.iPen.iX = param.iPen.iY = 0;
       
  5409 	
       
  5410 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  5411 	
       
  5412 	TEST(r && param.iPosInText == 20  
       
  5413 		   && param.iOutputGlyphs == 3
       
  5414 		   && param.iOutput[0].iCode == 0x80000c13
       
  5415 		   && param.iOutput[1].iCode == 0x80000c2f  
       
  5416 		   && param.iOutput[2].iCode == 0x80000c0d);
       
  5417 
       
  5418 	#if defined __WINS__ || defined __WINSCW__
       
  5419 	TEST(r && param.iPen.iX == 54);
       
  5420 	#endif
       
  5421 	
       
  5422 	INFO_PRINTF7(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x iOutput[2].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode, param.iOutput[2].iCode);
       
  5423 	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
       
  5424     	if (err!=KErrNone)
       
  5425     		INFO_PRINTF1(_L("Failed to record test result"));
       
  5426 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4019"));
       
  5427 //Req 11
       
  5428 /**
       
  5429 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4019
       
  5430 @SYMTestCaseDesc Automated GDI testing for Tamil
       
  5431 @SYMTestPriority High
       
  5432 @SYMTestActions  Attempt to compose various valid Tamil glyph clusters to test the requirement
       
  5433 				 Matras /-e/, /-ee/ and /-ai/ are reordered with the consonant they follow in memory order.
       
  5434 @SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
       
  5435 @SYMPREQ 1766: Tamil for Sphinx
       
  5436 @SYMREQ 8742:Tamil Text Rendering
       
  5437 */
       
  5438 
       
  5439 	testText[20] = 0x0B95; //Ka
       
  5440 	testText[21] = 0x0BC7; //-e
       
  5441 	
       
  5442 	param.iPosInText = 20 ;
       
  5443 	param.iPen.iX = param.iPen.iY = 0;
       
  5444 	
       
  5445 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  5446 	
       
  5447 	TEST(r && param.iPosInText == 22  
       
  5448 		   && param.iOutputGlyphs == 2
       
  5449 		   && param.iOutput[0].iCode == 0x80000c13 
       
  5450 		   && param.iOutput[1].iCode == 0x80000bf6 );
       
  5451 	
       
  5452 	#if defined __WINS__ || defined __WINSCW__
       
  5453 	TEST(r && param.iPen.iX == 26);
       
  5454 	#endif
       
  5455 	
       
  5456 	INFO_PRINTF6(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode); 
       
  5457 	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
       
  5458     	if (err!=KErrNone)
       
  5459     		INFO_PRINTF1(_L("Failed to record test result"));
       
  5460 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4020"));
       
  5461 //Req 12 1.3.5.2
       
  5462 /**
       
  5463 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4020
       
  5464 @SYMTestCaseDesc Automated GDI testing for Tamil
       
  5465 @SYMTestPriority High
       
  5466 @SYMTestActions  Attempt to compose various valid Tamil glyph clusters to test the requirment
       
  5467 				 Matras /-o/, /-oo/ and /-au/ are split into two halves that enclose the consonant they follow in memory order.
       
  5468 @SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
       
  5469 @SYMPREQ 1766: Tamil for Sphinx
       
  5470 @SYMREQ 8742:Tamil Text Rendering
       
  5471 */
       
  5472 
       
  5473 	testText[22] = 0x0B95; //Ka
       
  5474 	testText[23] = 0x0BCA; //O
       
  5475 	
       
  5476 	
       
  5477 	param.iPosInText = 22 ;
       
  5478 	param.iPen.iX = param.iPen.iY = 0;
       
  5479 	
       
  5480 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  5481 	
       
  5482 	TEST(r && param.iPosInText ==  24 
       
  5483 		   && param.iOutputGlyphs == 3
       
  5484 		   && param.iOutput[0].iCode == 0x80000c12
       
  5485 		   && param.iOutput[1].iCode == 0x80000bf6   
       
  5486 		   && param.iOutput[2].iCode == 0x80000c0d);
       
  5487 
       
  5488 	#if defined __WINS__ || defined __WINSCW__
       
  5489 	TEST(r && param.iPen.iX == 37);
       
  5490 	#endif
       
  5491 	
       
  5492 	INFO_PRINTF7(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x iOutput[2].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode, param.iOutput[2].iCode);
       
  5493 	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
       
  5494     	if (err!=KErrNone)
       
  5495     		INFO_PRINTF1(_L("Failed to record test result"));
       
  5496 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4021"));
       
  5497 	//Req 13 
       
  5498 /**
       
  5499 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4021
       
  5500 @SYMTestCaseDesc Automated GDI testing for Tamil
       
  5501 @SYMTestPriority High
       
  5502 @SYMTestActions  Attempt to compose various valid Tamil glyph clusters to test the requirment.
       
  5503 				Tamil Modifier "Ayatham" MUST be treated as an independent character
       
  5504 @SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
       
  5505 @SYMPREQ 1766: Tamil for Sphinx
       
  5506 @SYMREQ 8742:Tamil Text Rendering
       
  5507 */
       
  5508 
       
  5509 	testText[24] = 0x0B95; //Ka
       
  5510 	testText[25] = 0x0B83; //Aythem
       
  5511 	testText[26] = 0x0B85; //A
       
  5512 	
       
  5513 	param.iPosInText = 24;
       
  5514 	param.iPen.iX = param.iPen.iY = 0;
       
  5515 	
       
  5516 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  5517 	
       
  5518 	TEST(r && param.iPosInText ==  25 
       
  5519 		   && param.iOutputGlyphs == 1
       
  5520 		   && param.iOutput[0].iCode == 0x80000bf6);
       
  5521 
       
  5522 	#if defined __WINS__ || defined __WINSCW__
       
  5523 	TEST(r && param.iPen.iX == 13);
       
  5524 	#endif
       
  5525 	
       
  5526 	INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
       
  5527 	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
       
  5528     	if (err!=KErrNone)
       
  5529     		INFO_PRINTF1(_L("Failed to record test result"));
       
  5530 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4022"));
       
  5531 //Req 14 
       
  5532 /**
       
  5533 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4022
       
  5534 @SYMTestCaseDesc Automated GDI testing for Tamil
       
  5535 @SYMTestPriority High
       
  5536 @SYMTestActions  Attempt to compose various valid Tamil glyph clusters to test the requirement. 
       
  5537 			 	Rendering Engine MUST be capable of handling TAMIL ANUSVARA
       
  5538 				It has been suggested that this character be deprecated in Unicode
       
  5539 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
       
  5540 @SYMPREQ 1766: Tamil for Sphinx
       
  5541 @SYMREQ 8742:Tamil Text Rendering
       
  5542 */
       
  5543 	
       
  5544 	testText[27] = 0x0B95; //Ka
       
  5545 	testText[28] = 0x0B82; //Anusvara
       
  5546 	testText[29] = 0x0B95; //Ka
       
  5547 	
       
  5548 	param.iPosInText = 27;
       
  5549 	param.iPen.iX = param.iPen.iY = 0;
       
  5550 	
       
  5551 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  5552 	
       
  5553 	TEST(r && param.iPosInText ==  29 
       
  5554 		   && param.iOutputGlyphs == 2 
       
  5555 		   && param.iOutput[0].iCode == 0x80000bf6
       
  5556 		   && param.iOutput[1].iCode == 0x80000be8);
       
  5557 
       
  5558 	#if defined __WINS__ || defined __WINSCW__
       
  5559 	TEST(r && param.iPen.iX == 19);
       
  5560 	#endif
       
  5561 	
       
  5562 	INFO_PRINTF6(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
       
  5563 	param.iPosInText = 29;
       
  5564 	param.iPen.iX = param.iPen.iY = 0;
       
  5565 	
       
  5566 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  5567 	
       
  5568 	TEST(r && param.iPosInText ==  30 
       
  5569 		   && param.iOutputGlyphs == 1
       
  5570 		   && param.iOutput[0].iCode == 0x80000bf6 );
       
  5571 
       
  5572 	#if defined __WINS__ || defined __WINSCW__
       
  5573 	TEST(r && param.iPen.iX == 13);
       
  5574 	#endif 
       
  5575 	
       
  5576 	INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
       
  5577 	
       
  5578 	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
       
  5579     	if (err!=KErrNone)
       
  5580     		INFO_PRINTF1(_L("Failed to record test result"));
       
  5581 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4023"));
       
  5582 //Req 15
       
  5583 /**
       
  5584 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4023
       
  5585 @SYMTestCaseDesc Automated GDI testing for Tamil
       
  5586 @SYMTestPriority High
       
  5587 @SYMTestActions  Attempt to compose various valid Tamil glyph clusters to test the requirment
       
  5588 				 Tamil consonant /ra/ changes its shape, when a virama is applied to it.
       
  5589 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
       
  5590 @SYMPREQ 1766: Tamil for Sphinx
       
  5591 @SYMREQ 8742:Tamil Text Rendering
       
  5592 */
       
  5593 
       
  5594 	testText[30] = 0x0BB0; //Ra
       
  5595 	testText[31] = 0x0BCD; //Virama
       
  5596 	testText[32] = 0x8205; //ZWJ
       
  5597 	
       
  5598 	
       
  5599 	param.iPosInText =  30;
       
  5600 	param.iPen.iX = param.iPen.iY = 0;
       
  5601 	
       
  5602 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  5603 	
       
  5604 	TEST(r && param.iPosInText ==  32 
       
  5605 		   && param.iOutputGlyphs == 2 
       
  5606 		   && param.iOutput[0].iCode == 0x80000c03 );
       
  5607 
       
  5608 	#if defined __WINS__ || defined __WINSCW__
       
  5609 	TEST(r && param.iPen.iX == 10);
       
  5610 	#endif 
       
  5611 	
       
  5612 	INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
       
  5613 	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
       
  5614     	if (err!=KErrNone)
       
  5615     		INFO_PRINTF1(_L("Failed to record test result"));
       
  5616 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4024"));
       
  5617 //Req 16 
       
  5618 /**
       
  5619 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4024
       
  5620 @SYMTestCaseDesc Automated GDI testing for Tamil
       
  5621 @SYMTestPriority High
       
  5622 @SYMTestActions  Attempt to compose various valid Tamil glyph clusters to test 
       
  5623 				Matra /-aa/ is combined to consonants in regular fashion. No extra shaping is required.
       
  5624 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
       
  5625 @SYMPREQ 1766: Tamil for Sphinx
       
  5626 @SYMREQ 8742:Tamil Text Rendering
       
  5627 */
       
  5628 
       
  5629 	testText[33] = 0x0B95; //Ka
       
  5630 	testText[34] = 0x0B82; //Anusvara
       
  5631 	
       
  5632 	param.iPosInText = 33 ;
       
  5633 	param.iPen.iX = param.iPen.iY = 0;
       
  5634 	
       
  5635 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  5636 	
       
  5637 	TEST(r && param.iPosInText == 35  
       
  5638 		   && param.iOutputGlyphs == 2 
       
  5639 		   && param.iOutput[0].iCode == 0x80000bf6 );
       
  5640 
       
  5641 	#if defined __WINS__ || defined __WINSCW__
       
  5642 	TEST(r && param.iPen.iX == 19);
       
  5643 	#endif 
       
  5644 	
       
  5645 	INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
       
  5646 	
       
  5647 	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
       
  5648     	if (err!=KErrNone)
       
  5649     		INFO_PRINTF1(_L("Failed to record test result"));
       
  5650 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4025"));
       
  5651 //Req 17 1.3.11
       
  5652 /**
       
  5653 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4025
       
  5654 @SYMTestCaseDesc Automated GDI testing for Tamil
       
  5655 @SYMTestPriority High
       
  5656 @SYMTestActions  Attempt to compose various valid Tamil glyph clusters to test 
       
  5657 					Matras /-i/ and /-ii/ MUST form a ligature with consonant /tta/.
       
  5658 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
       
  5659 @SYMPREQ 1766: Tamil for Sphinx
       
  5660 @SYMREQ 8742:Tamil Text Rendering
       
  5661 */
       
  5662 
       
  5663 	testText[35] = 0x0B9F; //Tta
       
  5664 	testText[36] = 0x0BBF; //I
       
  5665 	
       
  5666 	testText[37] = 0x0B9F; //Tta
       
  5667 	testText[38] = 0x0BC0; //Ii
       
  5668 	
       
  5669 	param.iPosInText = 35 ;
       
  5670 	param.iPen.iX = param.iPen.iY = 0;
       
  5671 	
       
  5672 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  5673 	
       
  5674 	TEST(r && param.iPosInText ==  37 
       
  5675 		   && param.iOutputGlyphs == 1
       
  5676 		   && param.iOutput[0].iCode == 0x80000c51);
       
  5677 
       
  5678 	#if defined __WINS__ || defined __WINSCW__
       
  5679 	TEST(r && param.iPen.iX == 15);
       
  5680 	#endif
       
  5681 	
       
  5682 	INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
       
  5683 	
       
  5684 	param.iPosInText = 37 ;
       
  5685 	param.iPen.iX = param.iPen.iY = 0;
       
  5686 	
       
  5687 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  5688 	
       
  5689 	TEST(r && param.iPosInText ==  39
       
  5690 		   && param.iOutputGlyphs == 1 
       
  5691 		   && param.iOutput[0].iCode == 0x80000c52);
       
  5692 	
       
  5693 	#if defined __WINS__ || defined __WINSCW__
       
  5694 	TEST(r && param.iPen.iX == 13);
       
  5695 	#endif 
       
  5696 	
       
  5697 	INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
       
  5698 	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
       
  5699     	if (err!=KErrNone)
       
  5700     		INFO_PRINTF1(_L("Failed to record test result"));
       
  5701 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4026"));
       
  5702 //Req 18 	
       
  5703 /**
       
  5704 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4026
       
  5705 @SYMTestCaseDesc Automated GDI testing for Tamil
       
  5706 @SYMTestPriority High
       
  5707 @SYMTestActions  Attempt to compose various valid Tamil glyph clusters to test 
       
  5708 				Consonant /ra/ takes an alternate shape when combined with matras /-i/ and /-ii/.
       
  5709 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
       
  5710 @SYMPREQ 1766: Tamil for Sphinx
       
  5711 @SYMREQ 8742:Tamil Text Rendering
       
  5712 */	
       
  5713 	testText[39] = 0x0BB0; //Ra
       
  5714 	testText[40] = 0x0BBF; //I
       
  5715 	
       
  5716 	testText[41] = 0x0BB0; //Ra
       
  5717 	testText[42] = 0x0BC0; //Ii
       
  5718 	
       
  5719 	param.iPosInText = 39 ;
       
  5720 	param.iPen.iX = param.iPen.iY = 0;
       
  5721 	
       
  5722 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  5723 	
       
  5724 	TEST(r && param.iPosInText == 41  
       
  5725 		   && param.iOutputGlyphs == 2
       
  5726 		   && param.iOutput[0].iCode == 0x80000c0d
       
  5727 		   && param.iOutput[1].iCode == 0x80000c0e );
       
  5728 
       
  5729 	#if defined __WINS__ || defined __WINSCW__
       
  5730 	TEST(r && param.iPen.iX == 13);
       
  5731 	#endif 
       
  5732 	
       
  5733 	INFO_PRINTF6(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
       
  5734 	
       
  5735 	param.iPosInText = 41 ;
       
  5736 	param.iPen.iX = param.iPen.iY = 0;
       
  5737 	
       
  5738 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  5739 	
       
  5740 	TEST(r && param.iPosInText ==  43
       
  5741 		   && param.iOutputGlyphs == 2
       
  5742 		   && param.iOutput[0].iCode == 0x80000c0d 
       
  5743 		   && param.iOutput[1].iCode == 0x80000c0f);
       
  5744 	
       
  5745 	#if defined __WINS__ || defined __WINSCW__
       
  5746 	TEST(r && param.iPen.iX == 13);
       
  5747 	#endif
       
  5748 	
       
  5749 	INFO_PRINTF6(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
       
  5750 	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
       
  5751     	if (err!=KErrNone)
       
  5752     		INFO_PRINTF1(_L("Failed to record test result"));
       
  5753 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4027"));
       
  5754 //Req 19 
       
  5755 /**
       
  5756 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4027
       
  5757 @SYMTestCaseDesc Automated GDI testing for Tamil
       
  5758 @SYMTestPriority High
       
  5759 @SYMTestActions  Attempt to compose various valid Tamil glyph clusters to test the requirement
       
  5760 				 Matras /-i/ and /-ii/ take an alternate form when applied to consonants /nga/, /pa/, /ya/ and /va/.
       
  5761 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
       
  5762 @SYMPREQ 1766: Tamil for Sphinx
       
  5763 @SYMREQ 8742:Tamil Text Rendering
       
  5764 */
       
  5765 	testText[43] = 0x0B99; //Nga
       
  5766 	testText[44] = 0x0BBF; //I
       
  5767 	
       
  5768 	testText[45] = 0x0B99; //Nga
       
  5769 	testText[46] = 0x0BC0; //Ii
       
  5770 	
       
  5771 	param.iPosInText = 43 ;
       
  5772 	param.iPen.iX = param.iPen.iY = 0;
       
  5773 	
       
  5774 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  5775 	
       
  5776 	TEST(r && param.iPosInText ==  45 
       
  5777 		   && param.iOutputGlyphs == 2
       
  5778 		   && param.iOutput[0].iCode == 0x80000bf7
       
  5779 		   && param.iOutput[1].iCode == 0x80000c0e );
       
  5780 
       
  5781 	#if defined __WINS__ || defined __WINSCW__
       
  5782 	TEST(r && param.iPen.iX == 19);
       
  5783 	#endif
       
  5784 	
       
  5785 	INFO_PRINTF6(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
       
  5786 	param.iPosInText = 45 ;
       
  5787 	param.iPen.iX = param.iPen.iY = 0;
       
  5788 	
       
  5789 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  5790 	
       
  5791 	TEST(r && param.iPosInText ==  47
       
  5792 		   && param.iOutputGlyphs == 1
       
  5793 		   && param.iOutput[0].iCode == 0x80000c4a );
       
  5794 
       
  5795 	#if defined __WINS__ || defined __WINSCW__
       
  5796 	TEST(r && param.iPen.iX == 17);
       
  5797 	#endif 
       
  5798 	
       
  5799 	INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
       
  5800 	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
       
  5801     	if (err!=KErrNone)
       
  5802     		INFO_PRINTF1(_L("Failed to record test result"));
       
  5803 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4028"));
       
  5804 	
       
  5805 //Req 20 		
       
  5806 /**
       
  5807 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4028
       
  5808 @SYMTestCaseDesc Automated GDI testing for Tamil
       
  5809 @SYMTestPriority High
       
  5810 @SYMTestActions  Attempt to compose various valid Tamil glyph clusters to test the requirement. 
       
  5811 				 Matras /-u/ and /-uu/ join in ligature form with all other consonants than /ha/, /ja/, /sa/, /ssa/ and /k.ssa/.
       
  5812 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
       
  5813 @SYMPREQ 1766: Tamil for Sphinx
       
  5814 @SYMREQ 8742:Tamil Text Rendering
       
  5815 */
       
  5816 	testText[47] = 0x0B9C; //Ja
       
  5817 	testText[48] = 0x0BC1; //U
       
  5818 	
       
  5819 	testText[49] = 0x0B9C; //Ja
       
  5820 	testText[50] = 0x0BC2; //Uu
       
  5821 	
       
  5822 	param.iPosInText = 47 ;
       
  5823 	param.iPen.iX = param.iPen.iY = 0;
       
  5824 	
       
  5825 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  5826 	
       
  5827 	TEST(r && param.iPosInText == 49  
       
  5828 		   && param.iOutputGlyphs == 2 
       
  5829 		   && param.iOutput[0].iCode == 0x80000bf9
       
  5830 		   && param.iOutput[1].iCode == 0x80000c10);
       
  5831 
       
  5832 	#if defined __WINS__ || defined __WINSCW__
       
  5833 	TEST(r && param.iPen.iX == 26);
       
  5834 	#endif
       
  5835 	
       
  5836 	INFO_PRINTF6(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
       
  5837 	
       
  5838 	param.iPosInText = 49;
       
  5839 	param.iPen.iX = param.iPen.iY = 0;
       
  5840 	
       
  5841 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  5842 	
       
  5843 	TEST(r && param.iPosInText ==  51
       
  5844 		   && param.iOutputGlyphs == 2
       
  5845 		   && param.iOutput[0].iCode == 0x80000bf9
       
  5846 		   && param.iOutput[1].iCode == 0x80000c11 );
       
  5847 
       
  5848 	#if defined __WINS__ || defined __WINSCW__
       
  5849 	TEST(r && param.iPen.iX == 29);
       
  5850 	#endif
       
  5851 	
       
  5852 	INFO_PRINTF6(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
       
  5853 	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
       
  5854     	if (err!=KErrNone)
       
  5855     		INFO_PRINTF1(_L("Failed to record test result"));
       
  5856 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4029"));
       
  5857 //Req 21 1.3.15		
       
  5858 /**
       
  5859 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4029
       
  5860 @SYMTestCaseDesc Automated GDI testing for Tamil
       
  5861 @SYMTestPriority High
       
  5862 @SYMTestActions  Attempt to compose various valid Tamil glyph clusters to test the requirement. 
       
  5863 				 Matra /-ai/ is combined to consonants in regular fashion. No extra shaping is required. 
       
  5864 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
       
  5865 @SYMPREQ 1766: Tamil for Sphinx
       
  5866 @SYMREQ 8742:Tamil Text Rendering
       
  5867 */
       
  5868 	testText[51] = 0x0B95; //Ka
       
  5869 	testText[52] = 0x0BC8; //Ai
       
  5870 	
       
  5871 	param.iPosInText = 51;
       
  5872 	param.iPen.iX = param.iPen.iY = 0;
       
  5873 	
       
  5874 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  5875 	
       
  5876 	TEST(r && param.iPosInText == 53  		   
       
  5877 		   && param.iOutputGlyphs == 2
       
  5878 		   && param.iOutput[0].iCode == 0x80000c14
       
  5879 		   && param.iOutput[1].iCode == 0x80000bf6);
       
  5880 
       
  5881 	#if defined __WINS__ || defined __WINSCW__
       
  5882 	TEST(r && param.iPen.iX == 31);
       
  5883 	#endif
       
  5884 	
       
  5885 	INFO_PRINTF6(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
       
  5886 	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
       
  5887     	if (err!=KErrNone)
       
  5888     		INFO_PRINTF1(_L("Failed to record test result"));
       
  5889 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4030"));
       
  5890 //Req 22
       
  5891 /**
       
  5892 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4030
       
  5893 @SYMTestCaseDesc Automated GDI testing for Tamil
       
  5894 @SYMTestPriority High
       
  5895 @SYMTestActions  Attempt to compose various valid Tamil glyph clusters to test the requirement
       
  5896 				 Consonant cluster <ka, virama, ssa> MUST always form conjunct consonant /k.ssa/, which behaves as if it were a proper consonant of its own
       
  5897 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
       
  5898 @SYMPREQ 1766: Tamil for Sphinx
       
  5899 @SYMREQ 8742:Tamil Text Rendering
       
  5900 */
       
  5901 	testText[53] = 0x0B95; //Ka
       
  5902 	testText[54] = 0x0BCD; //Virama
       
  5903 	testText[55] = 0x0BB7; //Ssa
       
  5904 	
       
  5905 	param.iPosInText =  53;
       
  5906 	param.iPen.iX = param.iPen.iY = 0;
       
  5907 	
       
  5908 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  5909 	
       
  5910 	TEST(r && param.iPosInText == 56  
       
  5911 		   && param.iOutputGlyphs == 1
       
  5912 		   && param.iOutput[0].iCode == 0x80000c2f );
       
  5913 
       
  5914 	#if defined __WINS__ || defined __WINSCW__
       
  5915 	TEST(r && param.iPen.iX == 31);
       
  5916 	#endif
       
  5917 	
       
  5918 	INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
       
  5919 	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
       
  5920     	if (err!=KErrNone)
       
  5921     		INFO_PRINTF1(_L("Failed to record test result"));
       
  5922 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4031"));
       
  5923 //Req 23 1.3.17
       
  5924 /**
       
  5925 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4031
       
  5926 @SYMTestCaseDesc Automated GDI testing for Tamil
       
  5927 @SYMTestPriority High
       
  5928 @SYMTestActions  Attempt to compose various valid Tamil glyph clusters to test 
       
  5929 				Character sequence <sa, virama, ra, matra_ii> MUST be rendered as a ligature form /s.rii/.
       
  5930 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
       
  5931 @SYMPREQ 1766: Tamil for Sphinx
       
  5932 @SYMREQ 8742:Tamil Text Rendering
       
  5933 */
       
  5934 	testText[56] = 0x0BB8; //Sa
       
  5935 	testText[57] = 0x0BCD; //Virama
       
  5936 	testText[58] = 0x0BB0; //Ra
       
  5937 	testText[59] = 0x0BC0; //Matra I
       
  5938 	
       
  5939 	param.iPosInText = 56;
       
  5940 	param.iPen.iX = param.iPen.iY = 0;
       
  5941 	
       
  5942 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  5943 	
       
  5944 	TEST(r && param.iPosInText == 60  
       
  5945 		   && param.iOutputGlyphs == 1 
       
  5946 		   && param.iOutput[0].iCode == 0x80000c79 );
       
  5947 	
       
  5948 	#if defined __WINS__ || defined __WINSCW__
       
  5949 	TEST(r && param.iPen.iX == 27);
       
  5950 	#endif
       
  5951 	
       
  5952 	INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
       
  5953 	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
       
  5954     	if (err!=KErrNone)
       
  5955     		INFO_PRINTF1(_L("Failed to record test result"));
       
  5956 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4032"));
       
  5957 //Req 24 1.3.18
       
  5958 /**
       
  5959 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4032
       
  5960 @SYMTestCaseDesc Automated GDI testing for Tamil
       
  5961 @SYMTestPriority High
       
  5962 @SYMTestActions  Attempt to compose various valid Tamil glyph clusters to test 
       
  5963 				Vertical position of the glyphs for combining characters virama, matras /-i/ and /-ii/ must be determined separately in relation to the relevant base glyph
       
  5964 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
       
  5965 @SYMPREQ 1766: Tamil for Sphinx
       
  5966 @SYMREQ 8742:Tamil Text Rendering
       
  5967 */
       
  5968 	testText[60] = 0x0B95; //Ka
       
  5969 	testText[62] = 0x0BCD; //Virama
       
  5970 	testText[63] = 0x8205; //ZWJ
       
  5971 	
       
  5972 	param.iPosInText = 60;
       
  5973 	param.iPen.iX = param.iPen.iY = 0;
       
  5974 	
       
  5975 	r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  5976 	
       
  5977 	TEST(r && param.iPosInText == 61  
       
  5978 		   && param.iOutputGlyphs == 1 
       
  5979 		   && param.iOutput[0].iCode == 0x80000bf6 );
       
  5980 	
       
  5981 	#if defined __WINS__ || defined __WINSCW__
       
  5982 	TEST(r && param.iPen.iX == 13);
       
  5983 	#endif
       
  5984 	
       
  5985 	INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
       
  5986 	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
       
  5987     	if (err!=KErrNone)
       
  5988     		INFO_PRINTF1(_L("Failed to record test result"));
       
  5989 	}
       
  5990 
       
  5991 /**
       
  5992 @SYMTestCaseID			GRAPHICS-SYSLIB-GDI-CIT-3479
       
  5993 @SYMTestCaseDesc		Automated GDI testing for correct localised punctuation after indic characters
       
  5994 @SYMTestPriority		High
       
  5995 @SYMTestActions			Attempt to compose various valid Indic strings with western punctuation
       
  5996 @SYMTestExpectedResults The expected punctuation glyphs for the implied locale should be returned
       
  5997 @SYMDEF					DEF106651
       
  5998 */
       
  5999 void CTGlyphSelection::TestGlyphs(CFont* aFont, CFont::TPositionParam& aParam,
       
  6000 	const TPtrC16& aText, const TPtrC16& aExpectedGlyphs)
       
  6001 	{
       
  6002 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-3479"));
       
  6003 	TUint16* glyphs = CONST_CAST(TUint16*,aExpectedGlyphs.Ptr());
       
  6004 	const TInt mask = 0x80000000-1;
       
  6005 	TBool r;
       
  6006 	RShapeInfo shapeInfo;
       
  6007 	aParam.iText.Set(aText); 
       
  6008 	aParam.iPosInText = aParam.iPen.iX = aParam.iPen.iY = 0;
       
  6009 	while(aParam.iPosInText < aParam.iText.Length())
       
  6010 		{
       
  6011 		r = aFont->GetCharacterPosition2(aParam,shapeInfo);
       
  6012 		//INFO_PRINTF3(_L("Glyph %d Icode 0x%x"),*glyphs,aParam.iOutput[0].iCode);
       
  6013 		TEST(r && ((aParam.iOutput[0].iCode & mask) == *glyphs++));
       
  6014 		}
       
  6015 	shapeInfo.Close();
       
  6016 	TRAPD(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
       
  6017     	if (err!=KErrNone)
       
  6018     		INFO_PRINTF1(_L("Failed to record test result"));
       
  6019 	}
       
  6020 void CTGlyphSelection::TestTeluguChars(CFbsFont* aFont)
       
  6021 	{
       
  6022 INFO_PRINTF1(_L("Test Telugu Glyphs"));
       
  6023  
       
  6024   	TBool r;
       
  6025 	TBuf<162> testText(0);
       
  6026 	CFont::TPositionParam param;
       
  6027 	param.iDirection = CFont::EHorizontal;
       
  6028 	param.iFlags = CFont::TPositionParam::EFLogicalOrder;
       
  6029 
       
  6030 	testText.SetLength(162);
       
  6031 	// Make sure there is no garbage values in the memory we are using.
       
  6032 	for (TInt i = 0; i < testText.Length(); i++)
       
  6033 		testText[i]=0xFFFF;
       
  6034 	
       
  6035 	param.iText.Set(testText);
       
  6036 	RShapeInfo shapeInfo;
       
  6037 
       
  6038 	//Testdata for Telugu Langauage
       
  6039 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4033"));
       
  6040 /*	
       
  6041 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4033
       
  6042 @SYMTestCaseDesc Automated GDI testing for Telugu
       
  6043 @SYMTestPriority High
       
  6044 @SYMTestActions  Attempt to compose various valid Telugu glyph clusters to test   	 
       
  6045 				 These consonants contain a small tick mark (crest) at the top of the glyph. This graphical detail can be considered to be a vocalic stem that indirectly indicates the inherent vowel /-a/. VIRAMA replaces the vocalic stem.
       
  6046 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
       
  6047 @SYMPREQ 1766: Tamil for Sphinx
       
  6048 @SYMREQ 8743:Tamil Text Rendering
       
  6049 */
       
  6050 //	Req 4.1
       
  6051 	
       
  6052 		testText[0] =  0x0C15;
       
  6053 		testText[1] =  0x0C4D;
       
  6054 		param.iPosInText = 0 ;
       
  6055 		param.iPen.iX = param.iPen.iY = 0;
       
  6056 		r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  6057 		
       
  6058 		TEST(r && param.iPosInText == 2  
       
  6059 			   && param.iOutputGlyphs == 1
       
  6060 			   && param.iOutput[0].iCode == 0x80000f49 );
       
  6061 
       
  6062 		#if defined __WINS__ || defined __WINSCW__
       
  6063 		TEST(r && param.iPen.iX == 9);
       
  6064 		#endif
       
  6065 		
       
  6066 		INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
       
  6067 		TRAPD(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
       
  6068     		if (err!=KErrNone)
       
  6069     			INFO_PRINTF1(_L("Failed to record test result"));
       
  6070 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4034"));
       
  6071 /*	
       
  6072 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4034
       
  6073 @SYMTestCaseDesc Automated GDI testing for Telugu
       
  6074 @SYMTestPriority High
       
  6075 @SYMTestActions  Attempt to compose various valid Telugu glyph clusters to test   	 
       
  6076 				?VIRAMA attaches the upward stroke at the right of the glyph.	
       
  6077 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
       
  6078 @SYMPREQ 1766: Tamil for Sphinx
       
  6079 @SYMREQ 8743:Tamil Text Rendering
       
  6080 */		
       
  6081 		testText[2] =  0x0C16;		
       
  6082 		testText[3] =  0x0C4D;	
       
  6083 		
       
  6084 		param.iPosInText = 2 ;
       
  6085 		
       
  6086 		 param.iPen.iX = param.iPen.iY = 0;
       
  6087 		
       
  6088 		r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  6089 		
       
  6090 		
       
  6091 		TEST(r && param.iPosInText ==  4 
       
  6092 			   && param.iOutputGlyphs == 1
       
  6093 			   && param.iOutput[0].iCode == 0x80000f4a);
       
  6094 
       
  6095 		#if defined __WINS__ || defined __WINSCW__
       
  6096 		TEST(r && param.iPen.iX == 13);
       
  6097 		#endif
       
  6098 		
       
  6099 		INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
       
  6100 		TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
       
  6101     		if (err!=KErrNone)
       
  6102     			INFO_PRINTF1(_L("Failed to record test result"));
       
  6103 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4035"));
       
  6104 /*	
       
  6105 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4035
       
  6106 @SYMTestCaseDesc Automated GDI testing for Telugu
       
  6107 @SYMTestPriority High
       
  6108 @SYMTestActions  Attempt to compose various valid Telugu glyph clusters to test   	 
       
  6109 ?VIRAMA is attached to a stroke at the upper right corner.
       
  6110 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
       
  6111 @SYMPREQ 1766: Tamil for Sphinx
       
  6112 @SYMREQ 8743:Tamil Text Rendering
       
  6113 */
       
  6114 		
       
  6115 		testText[4] =  0x0C23;
       
  6116 		testText[5] =  0x0C4D;
       
  6117 		
       
  6118 		param.iPosInText = 4 ;
       
  6119 		param.iPen.iX = param.iPen.iY = 0;
       
  6120 		r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  6121 		
       
  6122 		TEST(r && param.iPosInText == 6  
       
  6123 			   && param.iOutputGlyphs == 1 
       
  6124 			   && param.iOutput[0].iCode == 0x80000f57 );
       
  6125 
       
  6126 		#if defined __WINS__ || defined __WINSCW__
       
  6127 		TEST(r && param.iPen.iX == 13);
       
  6128 		#endif
       
  6129 		
       
  6130 		INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
       
  6131 		TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
       
  6132     		if (err!=KErrNone)
       
  6133     			INFO_PRINTF1(_L("Failed to record test result"));
       
  6134 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4036"));
       
  6135 /**
       
  6136 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4036
       
  6137 @SYMTestCaseDesc Automated GDI testing for Telugu
       
  6138 @SYMTestPriority High
       
  6139 @SYMTestActions  Attempt to compose various valid Telugu glyph clusters to test   	 
       
  6140 Matras MATRA VOCALIC R and MATRA VOCALIC RR never attach the consonant glyph causing shape changes, but they are always placed at the right of the consonant glyph.
       
  6141 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
       
  6142 @SYMPREQ 1766: Tamil for Sphinx
       
  6143 @SYMREQ 8743:Tamil Text Rendering
       
  6144 */		
       
  6145 	//Req 4.2
       
  6146 		testText[6] =  0x0C2E;
       
  6147 		testText[7] =  0x0C43;
       
  6148 		
       
  6149 		param.iPosInText = 6 ;
       
  6150 		param.iPen.iX = param.iPen.iY = 0;
       
  6151 		r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  6152 		
       
  6153 		TEST(r && param.iPosInText ==  8 
       
  6154 			   && param.iOutputGlyphs == 2 
       
  6155 			   && param.iOutput[0].iCode == 0x80000f21
       
  6156 			   && param.iOutput[1].iCode == 0x80000f31 );
       
  6157 
       
  6158 		#if defined __WINS__ || defined __WINSCW__
       
  6159 		TEST(r && param.iPen.iX == 24);
       
  6160 		#endif
       
  6161 		
       
  6162 		INFO_PRINTF6(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
       
  6163 		TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
       
  6164     		if (err!=KErrNone)
       
  6165     			INFO_PRINTF1(_L("Failed to record test result"));
       
  6166 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4037"));
       
  6167 		/*	
       
  6168 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4037
       
  6169 @SYMTestCaseDesc Automated GDI testing for Telugu
       
  6170 @SYMTestPriority High
       
  6171 @SYMTestActions  Attempt to compose various valid Telugu glyph clusters to test   	 
       
  6172 Matras MATRA VOCALIC R and MATRA VOCALIC RR never attach the consonant glyph causing shape changes, but they are always placed at the right of the consonant glyph.
       
  6173 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
       
  6174 @SYMPREQ 1766: Tamil for Sphinx
       
  6175 @SYMREQ 8743:Tamil Text Rendering
       
  6176 */	
       
  6177 		testText[8] =  0x0C32;
       
  6178 		
       
  6179 		testText[9] =  0x0C44;
       
  6180 		
       
  6181 		param.iPosInText = 8 ;
       
  6182 		param.iPen.iX = param.iPen.iY = 0;
       
  6183 		
       
  6184 		r = aFont->GetCharacterPosition2(param,shapeInfo);	
       
  6185 		
       
  6186 		TEST(r && param.iPosInText ==  10 
       
  6187 			   && param.iOutputGlyphs == 2
       
  6188 			   && param.iOutput[0].iCode == 0x80000f25
       
  6189 			   && param.iOutput[1].iCode == 0x80000f32);
       
  6190 
       
  6191 		#if defined __WINS__ || defined __WINSCW__
       
  6192 		TEST(r && param.iPen.iX == 22);
       
  6193 		#endif
       
  6194 		
       
  6195 		INFO_PRINTF6(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
       
  6196 		TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
       
  6197     		if (err!=KErrNone)
       
  6198     			INFO_PRINTF1(_L("Failed to record test result"));
       
  6199 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4038"));
       
  6200 		/*	
       
  6201 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4038
       
  6202 @SYMTestCaseDesc Automated GDI testing for Telugu
       
  6203 @SYMTestPriority High
       
  6204 @SYMTestActions  Attempt to compose various valid Telugu glyph clusters to test   	 
       
  6205 ?Matras MATRA VOCALIC R and MATRA VOCALIC RR never attach the consonant glyph causing shape changes, but they are always placed at the right of the consonant glyph.
       
  6206 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
       
  6207 @SYMPREQ 1766: Tamil for Sphinx
       
  6208 @SYMREQ 8743:Tamil Text Rendering
       
  6209 */		
       
  6210 	//Req 4.2.1
       
  6211 		testText[10] = 0x0C15; 
       
  6212 		testText[11] = 0x0C3E;
       
  6213 		
       
  6214 		param.iPosInText = 10 ;
       
  6215 		param.iPen.iX = param.iPen.iY = 0;
       
  6216 		r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  6217 		
       
  6218 		TEST(r && param.iPosInText == 12  
       
  6219 			   && param.iOutputGlyphs == 1
       
  6220 			   && param.iOutput[0].iCode == 0x80000f6d );
       
  6221 
       
  6222 		#if defined __WINS__ || defined __WINSCW__
       
  6223 		TEST(r && param.iPen.iX == 13);
       
  6224 		#endif
       
  6225 		
       
  6226 		INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
       
  6227 		TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
       
  6228     		if (err!=KErrNone)
       
  6229     			INFO_PRINTF1(_L("Failed to record test result"));
       
  6230 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4039"));
       
  6231 		/*	
       
  6232 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4039
       
  6233 @SYMTestCaseDesc Automated GDI testing for Telugu
       
  6234 @SYMTestPriority High
       
  6235 @SYMTestActions  Attempt to compose various valid Telugu glyph clusters to test   	 
       
  6236 ?MATRA AA attaches to the upwards left curving stroke
       
  6237 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
       
  6238 @SYMPREQ 1766: Tamil for Sphinx
       
  6239 @SYMREQ 8743:Tamil Text Rendering
       
  6240 */	
       
  6241 		testText[12] = 0x0C1F;
       
  6242 		testText[13] = 0x0C3E;
       
  6243 		param.iPosInText = 12 ;
       
  6244 		param.iPen.iX = param.iPen.iY = 0;
       
  6245 		r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  6246 		
       
  6247 		TEST(r && param.iPosInText == 14  
       
  6248 			   && param.iOutputGlyphs == 1
       
  6249 			   && param.iOutput[0].iCode == 0x80000f77 );
       
  6250 
       
  6251 		#if defined __WINS__ || defined __WINSCW__
       
  6252 		TEST(r && param.iPen.iX == 16);
       
  6253 		#endif
       
  6254 		
       
  6255 		INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
       
  6256 		TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
       
  6257     		if (err!=KErrNone)
       
  6258     			INFO_PRINTF1(_L("Failed to record test result"));
       
  6259 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4040"));
       
  6260 		/*	
       
  6261 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4040
       
  6262 @SYMTestCaseDesc Automated GDI testing for Telugu
       
  6263 @SYMTestPriority High
       
  6264 @SYMTestActions  Attempt to compose various valid Telugu glyph clusters to test   	 
       
  6265 ?MATRA AA attaches the upwards (left curving) stroke at the top of the glyph
       
  6266 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
       
  6267 @SYMPREQ 1766: Tamil for Sphinx
       
  6268 @SYMREQ 8743:Tamil Text Rendering
       
  6269 */
       
  6270 		testText[14] = 0x0C1C;
       
  6271 		testText[15] = 0x0C3E;
       
  6272 		
       
  6273 		param.iPosInText = 14 ;
       
  6274 		param.iPen.iX = param.iPen.iY = 0;
       
  6275 		r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  6276 		
       
  6277 		TEST(r && param.iPosInText == 16  
       
  6278 			   && param.iOutputGlyphs == 1
       
  6279 			   && param.iOutput[0].iCode == 0x80000f74 );
       
  6280 	
       
  6281 		#if defined __WINS__ || defined __WINSCW__
       
  6282 		TEST(r && param.iPen.iX == 15);
       
  6283 		#endif
       
  6284 		
       
  6285 		INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
       
  6286 		TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
       
  6287     		if (err!=KErrNone)
       
  6288     			INFO_PRINTF1(_L("Failed to record test result"));
       
  6289 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4041"));
       
  6290 		/*	
       
  6291 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4041
       
  6292 @SYMTestCaseDesc Automated GDI testing for Telugu
       
  6293 @SYMTestPriority High
       
  6294 @SYMTestActions  Attempt to compose various valid Telugu glyph clusters to test   	 
       
  6295 ?MATRA AA is drawn on top of the glyph
       
  6296 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
       
  6297 @SYMPREQ 1766: Tamil for Sphinx
       
  6298 @SYMREQ 8743:Tamil Text Rendering
       
  6299 */	
       
  6300 		testText[16] = 0x0C23;
       
  6301 		testText[17] = 0x0C3E;
       
  6302 		
       
  6303 		param.iPosInText = 16 ;
       
  6304 		param.iPen.iX = param.iPen.iY = 0;
       
  6305 		r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  6306 		
       
  6307 		TEST(r && param.iPosInText == 18  
       
  6308 			   && param.iOutputGlyphs == 1
       
  6309 			   && param.iOutput[0].iCode == 0x80000f7b );
       
  6310 
       
  6311 		#if defined __WINS__ || defined __WINSCW__
       
  6312 		TEST(r && param.iPen.iX == 16);
       
  6313 		#endif
       
  6314 		
       
  6315 		INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
       
  6316 		TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
       
  6317     		if (err!=KErrNone)
       
  6318     			INFO_PRINTF1(_L("Failed to record test result"));
       
  6319 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4042"));
       
  6320 		/*	
       
  6321 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4042
       
  6322 @SYMTestCaseDesc Automated GDI testing for Telugu
       
  6323 @SYMTestPriority High
       
  6324 @SYMTestActions  Attempt to compose various valid Telugu glyph clusters to test   	 
       
  6325 ?MATRA AA attaches to the upwards left curving stroke, the vowel stem remains intact
       
  6326 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
       
  6327 @SYMPREQ 1766: Tamil for Sphinx
       
  6328 @SYMREQ 8743:Tamil Text Rendering
       
  6329 */	
       
  6330 		testText[18] = 0x0C2B;
       
  6331 		testText[19] = 0x0C3E;
       
  6332 		
       
  6333 		param.iPosInText = 18 ;
       
  6334 		param.iPen.iX = param.iPen.iY = 0;
       
  6335 						
       
  6336 		r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  6337 		
       
  6338 		TEST(r && param.iPosInText == 20  
       
  6339 			   && param.iOutputGlyphs == 1
       
  6340 			   && param.iOutput[0].iCode == 0x80000f82 );
       
  6341 
       
  6342 		#if defined __WINS__ || defined __WINSCW__
       
  6343 		TEST(r && param.iPen.iX == 16);
       
  6344 		#endif
       
  6345 		
       
  6346 		INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
       
  6347 		TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
       
  6348     		if (err!=KErrNone)
       
  6349     			INFO_PRINTF1(_L("Failed to record test result"));
       
  6350 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4043"));
       
  6351 		/*	
       
  6352 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4043
       
  6353 @SYMTestCaseDesc Automated GDI testing for Telugu
       
  6354 @SYMTestPriority High
       
  6355 @SYMTestActions  Attempt to compose various valid Telugu glyph clusters to test   	 
       
  6356 ?MATRA AA replaces the vowel stem, the upwards left curving stroke is extended
       
  6357 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
       
  6358 @SYMPREQ 1766: Tamil for Sphinx
       
  6359 @SYMREQ 8743:Tamil Text Rendering
       
  6360 */	
       
  6361 		testText[20] = 0x0C2A;
       
  6362 		testText[21] = 0x0C3E;
       
  6363 	
       
  6364 		param.iPosInText = 20 ;
       
  6365 		param.iPen.iX = param.iPen.iY = 0;
       
  6366 		
       
  6367 		r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  6368 
       
  6369 		TEST(r && param.iPosInText == 22   
       
  6370 			   && param.iOutputGlyphs == 1
       
  6371 			   && param.iOutput[0].iCode == 0x80000f81);
       
  6372 
       
  6373 		#if defined __WINS__ || defined __WINSCW__
       
  6374 		TEST(r && param.iPen.iX == 16);
       
  6375 		#endif
       
  6376 		
       
  6377 		INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
       
  6378 		TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
       
  6379     		if (err!=KErrNone)
       
  6380     			INFO_PRINTF1(_L("Failed to record test result"));
       
  6381 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4044"));
       
  6382 	//Req 4.2.2
       
  6383 	/*	
       
  6384 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4044
       
  6385 @SYMTestCaseDesc Automated GDI testing for Telugu
       
  6386 @SYMTestPriority High
       
  6387 @SYMTestActions  Attempt to compose various valid Telugu glyph clusters to test   	 
       
  6388 ?Vowel sign replaces the vowel stem
       
  6389 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
       
  6390 @SYMPREQ 1766: Tamil for Sphinx
       
  6391 @SYMREQ 8743:Tamil Text Rendering
       
  6392 */
       
  6393 		testText[22] = 0x0C26;
       
  6394 		testText[23] = 0x0C3F;
       
  6395 		
       
  6396 		param.iPosInText = 22 ;
       
  6397 		param.iPen.iX = param.iPen.iY = 0;
       
  6398 		
       
  6399 		r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  6400 		
       
  6401 		TEST(r && param.iPosInText ==  24 
       
  6402 			   && param.iOutputGlyphs == 1
       
  6403 			   && param.iOutput[0].iCode == 0x80000fa2 );
       
  6404 
       
  6405 		#if defined __WINS__ || defined __WINSCW__
       
  6406 		TEST(r && param.iPen.iX == 11);
       
  6407 		#endif
       
  6408 			
       
  6409 		INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
       
  6410 		TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
       
  6411     		if (err!=KErrNone)
       
  6412     			INFO_PRINTF1(_L("Failed to record test result"));
       
  6413 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4045"));
       
  6414 		/*	
       
  6415 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4045
       
  6416 @SYMTestCaseDesc Automated GDI testing for Telugu
       
  6417 @SYMTestPriority High
       
  6418 @SYMTestActions  Attempt to compose various valid Telugu glyph clusters to test   	 
       
  6419 ?The upwards left curving stroke extends, vowel sign attaches to the extended stroke
       
  6420 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
       
  6421 @SYMPREQ 1766: Tamil for Sphinx
       
  6422 @SYMREQ 8743:Tamil Text Rendering
       
  6423 */
       
  6424 		testText[24] = 0x0C16;
       
  6425 		testText[25] = 0x0C3F;
       
  6426 	
       
  6427 		param.iPosInText = 24 ;
       
  6428 		param.iPen.iX = param.iPen.iY = 0;
       
  6429 		
       
  6430 		r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  6431 		
       
  6432 		TEST(r && param.iPosInText == 26  
       
  6433 			   && param.iOutputGlyphs == 1
       
  6434 			   && param.iOutput[0].iCode == 0x80000f92);
       
  6435 
       
  6436 		#if defined __WINS__ || defined __WINSCW__
       
  6437 		TEST(r && param.iPen.iX == 12);
       
  6438 		#endif
       
  6439 		
       
  6440 		INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
       
  6441 		TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
       
  6442     		if (err!=KErrNone)
       
  6443     			INFO_PRINTF1(_L("Failed to record test result"));
       
  6444 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4046"));
       
  6445 		/*	
       
  6446 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4046
       
  6447 @SYMTestCaseDesc Automated GDI testing for Telugu
       
  6448 @SYMTestPriority High
       
  6449 @SYMTestActions  Attempt to compose various valid Telugu glyph clusters to test   	 
       
  6450 ?Vowel sign attaches the upward stroke at the top of the glyph
       
  6451 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
       
  6452 @SYMPREQ 1766: Tamil for Sphinx
       
  6453 @SYMREQ 8743:Tamil Text Rendering
       
  6454 */	
       
  6455 		testText[26] = 0x0C1C;
       
  6456 		testText[27] = 0x0C3F;
       
  6457 	
       
  6458 		param.iPosInText = 26 ;
       
  6459 		param.iPen.iX = param.iPen.iY = 0;
       
  6460 		
       
  6461 		r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  6462 		
       
  6463 		TEST(r && param.iPosInText == 28  
       
  6464 			   && param.iOutputGlyphs == 1
       
  6465 			   && param.iOutput[0].iCode == 0x80000f98 );
       
  6466 
       
  6467 		#if defined __WINS__ || defined __WINSCW__
       
  6468 		TEST(r && param.iPen.iX == 12);
       
  6469 		#endif
       
  6470 		
       
  6471 		INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
       
  6472 		TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
       
  6473     		if (err!=KErrNone)
       
  6474     			INFO_PRINTF1(_L("Failed to record test result"));
       
  6475 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4047"));
       
  6476 		/*	
       
  6477 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4047
       
  6478 @SYMTestCaseDesc Automated GDI testing for Telugu
       
  6479 @SYMTestPriority High
       
  6480 @SYMTestActions  Attempt to compose various valid Telugu glyph clusters to test   	 
       
  6481 ?Vowel sign attaches the upward stroke at the top of the glyph
       
  6482 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
       
  6483 @SYMPREQ 1766: Tamil for Sphinx
       
  6484 @SYMREQ 8743:Tamil Text Rendering
       
  6485 */		
       
  6486 		testText[28] = 0x0C1E;
       
  6487 		testText[29] = 0x0C40;
       
  6488 		
       
  6489 		param.iPosInText = 28 ;
       
  6490 		param.iPen.iX = param.iPen.iY = 0;
       
  6491 				
       
  6492 		r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  6493 		
       
  6494 		TEST(r && param.iPosInText == 30  
       
  6495 			   && param.iOutputGlyphs == 1
       
  6496 			   && param.iOutput[0].iCode == 0x80000fbe );
       
  6497 
       
  6498 		#if defined __WINS__ || defined __WINSCW__
       
  6499 		TEST(r && param.iPen.iX == 14);
       
  6500 		#endif
       
  6501 		
       
  6502 		INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
       
  6503 		TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
       
  6504     		if (err!=KErrNone)
       
  6505     			INFO_PRINTF1(_L("Failed to record test result"));
       
  6506 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4048"));
       
  6507 		/*	
       
  6508 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4048
       
  6509 @SYMTestCaseDesc Automated GDI testing for Telugu
       
  6510 @SYMTestPriority High
       
  6511 @SYMTestActions  Attempt to compose various valid Telugu glyph clusters to test   	 
       
  6512 ?Vowel sign attaches to the right upper corner of the glyph
       
  6513 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
       
  6514 @SYMPREQ 1766: Tamil for Sphinx
       
  6515 @SYMREQ 8743:Tamil Text Rendering
       
  6516 */		
       
  6517 		testText[30] = 0x0C1F;
       
  6518 		testText[31] = 0x0C3F;
       
  6519 	
       
  6520 		param.iPosInText = 30;
       
  6521 		param.iPen.iX = param.iPen.iY = 0;
       
  6522 		
       
  6523 		r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  6524 
       
  6525 		TEST(r && param.iPosInText == 32  
       
  6526 			   && param.iOutputGlyphs == 1
       
  6527 			   && param.iOutput[0].iCode ==  0x80000f9b );
       
  6528 
       
  6529 		#if defined __WINS__ || defined __WINSCW__
       
  6530 		TEST(r && param.iPen.iX == 12);
       
  6531 		#endif
       
  6532 		
       
  6533 		INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
       
  6534 		TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
       
  6535     		if (err!=KErrNone)
       
  6536     			INFO_PRINTF1(_L("Failed to record test result"));
       
  6537 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4049"));
       
  6538 		/*	
       
  6539 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4049
       
  6540 @SYMTestCaseDesc Automated GDI testing for Telugu
       
  6541 @SYMTestPriority High
       
  6542 @SYMTestActions  Attempt to compose various valid Telugu glyph clusters to test   	 
       
  6543 ?Vowel sign takes a loop form that replaces the vowel stem
       
  6544 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
       
  6545 @SYMPREQ 1766: Tamil for Sphinx
       
  6546 @SYMREQ 8743:Tamil Text Rendering
       
  6547 */		
       
  6548 		testText[32] = 0x0C1D;
       
  6549 		testText[33] = 0x0C3F;
       
  6550 	
       
  6551 		param.iPosInText = 32 ;
       
  6552 		param.iPen.iX = param.iPen.iY = 0;
       
  6553 		
       
  6554 		r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  6555 		
       
  6556 		TEST(r && param.iPosInText ==  34 
       
  6557 			   && param.iOutputGlyphs == 1
       
  6558 			   && param.iOutput[0].iCode ==  0x80000f99 );
       
  6559 	
       
  6560 		#if defined __WINS__ || defined __WINSCW__
       
  6561 		TEST(r && param.iPen.iX == 19);
       
  6562 		#endif
       
  6563 		
       
  6564 		INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
       
  6565 		TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
       
  6566     		if (err!=KErrNone)
       
  6567     			INFO_PRINTF1(_L("Failed to record test result"));
       
  6568 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4050"));
       
  6569 		/*	
       
  6570 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4050
       
  6571 @SYMTestCaseDesc Automated GDI testing for Telugu
       
  6572 @SYMTestPriority High
       
  6573 @SYMTestActions  Attempt to compose various valid Telugu glyph clusters to test   	 
       
  6574 ?The upwards left curving stroke extends, vowel sign replaces the vowel stem at the tip of the extended stroke 
       
  6575 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
       
  6576 @SYMPREQ 1766: Tamil for Sphinx
       
  6577 @SYMREQ 8743:Tamil Text Rendering
       
  6578 */	
       
  6579 		testText[34] = 0x0C1B;
       
  6580 		testText[35] = 0x0C3F;
       
  6581 	
       
  6582 	 	param.iPosInText =34 ;
       
  6583 		param.iPen.iX = param.iPen.iY = 0;
       
  6584 		
       
  6585 		r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  6586 		
       
  6587 		TEST(r && param.iPosInText == 36 
       
  6588 			   && param.iOutputGlyphs == 1
       
  6589 			   && param.iOutput[0].iCode == 0x80000f97 );
       
  6590 
       
  6591 		#if defined __WINS__ || defined __WINSCW__
       
  6592 		TEST(r && param.iPen.iX == 12);
       
  6593 		#endif
       
  6594 		
       
  6595 		INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
       
  6596 		TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
       
  6597     		if (err!=KErrNone)
       
  6598     			INFO_PRINTF1(_L("Failed to record test result"));
       
  6599 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4051"));
       
  6600 		/*	
       
  6601 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4051
       
  6602 @SYMTestCaseDesc Automated GDI testing for Telugu
       
  6603 @SYMTestPriority High
       
  6604 @SYMTestActions  Attempt to compose various valid Telugu glyph clusters to test   	 
       
  6605 ?Vowel sign replaces the upwards curving stroke at the top of the glyph
       
  6606 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
       
  6607 @SYMPREQ 1766: Tamil for Sphinx
       
  6608 @SYMREQ 8743:Tamil Text Rendering
       
  6609 */		
       
  6610 		testText[36] = 0x0C1C;
       
  6611 		testText[37] = 0x0C3F;
       
  6612 	
       
  6613 		param.iPosInText = 36 ;
       
  6614 		param.iPen.iX = param.iPen.iY = 0;
       
  6615 					
       
  6616 		r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  6617 		
       
  6618 		TEST(r && param.iPosInText == 38  
       
  6619 			   && param.iOutputGlyphs == 1
       
  6620 			   && param.iOutput[0].iCode == 0x80000f98 );
       
  6621 		
       
  6622 		#if defined __WINS__ || defined __WINSCW__
       
  6623 		TEST(r && param.iPen.iX == 12);
       
  6624 		#endif
       
  6625 		
       
  6626 		INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
       
  6627 		TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
       
  6628     		if (err!=KErrNone)
       
  6629     			INFO_PRINTF1(_L("Failed to record test result"));
       
  6630 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4052"));
       
  6631 		/*	
       
  6632 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4052
       
  6633 @SYMTestCaseDesc Automated GDI testing for Telugu
       
  6634 @SYMTestPriority High
       
  6635 @SYMTestActions  Attempt to compose various valid Telugu glyph clusters to test   	 
       
  6636 ?Vowel stem is removed.
       
  6637 ?Vowel stem is removed and MATRA II takes a form that looks like MATRA AA
       
  6638 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
       
  6639 @SYMPREQ 1766: Tamil for Sphinx
       
  6640 @SYMREQ 8743:Tamil Text Rendering
       
  6641 */		
       
  6642 		testText[38] = 0x0C2F;
       
  6643 		testText[39] = 0x0C3F;
       
  6644 	
       
  6645 		param.iPosInText = 38 ;
       
  6646 		param.iPen.iX = param.iPen.iY = 0;
       
  6647 		
       
  6648 		r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  6649 		
       
  6650 		TEST(r && param.iPosInText == 40 
       
  6651 			   && param.iOutputGlyphs == 1
       
  6652 			   && param.iOutput[0].iCode == 0x80000faa );
       
  6653 
       
  6654 		#if defined __WINS__ || defined __WINSCW__
       
  6655 		TEST(r && param.iPen.iX == 19);
       
  6656 		#endif
       
  6657 		
       
  6658 		INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
       
  6659 		TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
       
  6660     		if (err!=KErrNone)
       
  6661     			INFO_PRINTF1(_L("Failed to record test result"));
       
  6662 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4053"));
       
  6663 		/*	
       
  6664 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4053
       
  6665 @SYMTestCaseDesc Automated GDI testing for Telugu
       
  6666 @SYMTestPriority High
       
  6667 @SYMTestActions  Attempt to compose various valid Telugu glyph clusters to test   	 
       
  6668 ?Vowel sign attaches to the right of the consonant glyph, vowel stem remains intact
       
  6669 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
       
  6670 @SYMPREQ 1766: Tamil for Sphinx
       
  6671 @SYMREQ 8743:Tamil Text Rendering
       
  6672 */	
       
  6673 		testText[40] = 0x0C15;
       
  6674 		testText[41] = 0x0C41;
       
  6675 	
       
  6676 		param.iPosInText = 40 ;
       
  6677 		param.iPen.iX = param.iPen.iY = 0;
       
  6678 		r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  6679 		
       
  6680 		TEST(r && param.iPosInText ==42   
       
  6681 			   && param.iOutputGlyphs == 1
       
  6682 			   && param.iOutput[0].iCode == 0x80000fd9 );
       
  6683 		
       
  6684 		#if defined __WINS__ || defined __WINSCW__
       
  6685 		TEST(r && param.iPen.iX == 14);
       
  6686 		#endif
       
  6687 		
       
  6688 		INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
       
  6689 		TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
       
  6690     		if (err!=KErrNone)
       
  6691     			INFO_PRINTF1(_L("Failed to record test result"));
       
  6692 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4054"));
       
  6693 		/*	
       
  6694 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4054
       
  6695 @SYMTestCaseDesc Automated GDI testing for Telugu
       
  6696 @SYMTestPriority High
       
  6697 @SYMTestActions  Attempt to compose various valid Telugu glyph clusters to test   	 
       
  6698 ?Vowel sign takes a miniature form which attaches to the stroke at the top of the consonant glyph
       
  6699 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
       
  6700 @SYMPREQ 1766: Tamil for Sphinx
       
  6701 @SYMREQ 8743:Tamil Text Rendering
       
  6702 */	
       
  6703 		testText[42] = 0x0C19;
       
  6704 		testText[43] = 0x0C41;
       
  6705 	
       
  6706 		param.iPosInText = 42 ;
       
  6707 		param.iPen.iX = param.iPen.iY = 0;
       
  6708 						
       
  6709 		r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  6710 		
       
  6711 		TEST(r && param.iPosInText ==  44 
       
  6712 			   && param.iOutputGlyphs == 1
       
  6713 			   && param.iOutput[0].iCode == 0x80000fda );
       
  6714 		
       
  6715 		#if defined __WINS__ || defined __WINSCW__
       
  6716 		TEST(r && param.iPen.iX == 15);
       
  6717 		#endif
       
  6718 		
       
  6719 		INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
       
  6720 		TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
       
  6721     		if (err!=KErrNone)
       
  6722     			INFO_PRINTF1(_L("Failed to record test result"));
       
  6723 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4055"));
       
  6724 		/*	
       
  6725 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4055
       
  6726 @SYMTestCaseDesc Automated GDI testing for Telugu
       
  6727 @SYMTestPriority High
       
  6728 @SYMTestActions  Attempt to compose various valid Telugu glyph clusters to test   	 
       
  6729 ?Vowel sign attaches the consonant sign from below. Vowel stem remains intact.
       
  6730 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
       
  6731 @SYMPREQ 1766: Tamil for Sphinx
       
  6732 @SYMREQ 8743:Tamil Text Rendering
       
  6733 */	
       
  6734 		testText[44] = 0x0C2E;
       
  6735 		testText[45] = 0x0C41;
       
  6736 	
       
  6737 		param.iPosInText = 44 ;
       
  6738 		param.iPen.iX = param.iPen.iY = 0;
       
  6739 		r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  6740 		
       
  6741 		TEST(r && param.iPosInText == 46   
       
  6742 			   && param.iOutputGlyphs == 2
       
  6743 			   && param.iOutput[0].iCode == 0x80000f21 );
       
  6744 
       
  6745 		#if defined __WINS__ || defined __WINSCW__
       
  6746 		TEST(r && param.iPen.iX == 21);
       
  6747 		#endif
       
  6748 		
       
  6749 		INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
       
  6750 		
       
  6751 		testText[46] = 0x0C36;
       
  6752 		testText[47] = 0x0C41;
       
  6753 	
       
  6754 		param.iPosInText = 46 ;
       
  6755 		param.iPen.iX = param.iPen.iY = 0;
       
  6756 		r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  6757 		
       
  6758 		TEST(r && param.iPosInText == 48   
       
  6759 			   && param.iOutputGlyphs == 2 
       
  6760 			   && param.iOutput[0].iCode == 0x80000f28 );
       
  6761 
       
  6762 		#if defined __WINS__ || defined __WINSCW__
       
  6763 		TEST(r && param.iPen.iX == 14);
       
  6764 		#endif
       
  6765 			
       
  6766 		INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
       
  6767 		TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
       
  6768     		if (err!=KErrNone)
       
  6769     			INFO_PRINTF1(_L("Failed to record test result"));
       
  6770 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4056"));
       
  6771 		/*	
       
  6772 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4056
       
  6773 @SYMTestCaseDesc Automated GDI testing for Telugu
       
  6774 @SYMTestPriority High
       
  6775 @SYMTestActions  Attempt to compose various valid Telugu glyph clusters to test   	 
       
  6776 ?Vowel sign replaces the vowel stem
       
  6777 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
       
  6778 @SYMPREQ 1766: Tamil for Sphinx
       
  6779 @SYMREQ 8743:Tamil Text Rendering
       
  6780 */		
       
  6781 //	Req 4.2.4
       
  6782 		testText[48] = 0x0C28;
       
  6783 		testText[49] = 0x0C46;
       
  6784 	
       
  6785 		param.iPosInText = 48 ;
       
  6786 		param.iPen.iX = param.iPen.iY = 0;
       
  6787 		r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  6788 		
       
  6789 		TEST(r && param.iPosInText == 50   
       
  6790 			   && param.iOutputGlyphs == 1
       
  6791 			   && param.iOutput[0].iCode == 0x80001000 );
       
  6792 
       
  6793 		#if defined __WINS__ || defined __WINSCW__
       
  6794 		TEST(r && param.iPen.iX == 11);
       
  6795 		#endif
       
  6796 		
       
  6797 		INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
       
  6798 		TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
       
  6799     		if (err!=KErrNone)
       
  6800     			INFO_PRINTF1(_L("Failed to record test result"));
       
  6801 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4057"));
       
  6802 		/*	
       
  6803 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4057
       
  6804 @SYMTestCaseDesc Automated GDI testing for Telugu
       
  6805 @SYMTestPriority High
       
  6806 @SYMTestActions  Attempt to compose various valid Telugu glyph clusters to test   	 
       
  6807 ?Vowel sign replaces the vowel stem
       
  6808 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
       
  6809 @SYMPREQ 1766: Tamil for Sphinx
       
  6810 @SYMREQ 8743:Tamil Text Rendering
       
  6811 */		
       
  6812 		testText[50] = 0x0C1B;
       
  6813 		testText[51] = 0x0C47;
       
  6814 		
       
  6815 		param.iPosInText = 50 ;
       
  6816 		param.iPen.iX = param.iPen.iY = 0;
       
  6817 		r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  6818 		
       
  6819 		TEST(r && param.iPosInText ==  52 
       
  6820 			   && param.iOutputGlyphs == 1
       
  6821 			   && param.iOutput[0].iCode == 0x80001017 );
       
  6822 
       
  6823 		#if defined __WINS__ || defined __WINSCW__
       
  6824 		TEST(r && param.iPen.iX == 12);
       
  6825 		#endif
       
  6826 		
       
  6827 		INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
       
  6828 		TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
       
  6829     		if (err!=KErrNone)
       
  6830     			INFO_PRINTF1(_L("Failed to record test result"));
       
  6831 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4058"));
       
  6832 		/*	
       
  6833 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4058
       
  6834 @SYMTestCaseDesc Automated GDI testing for Telugu
       
  6835 @SYMTestPriority High
       
  6836 @SYMTestActions  Attempt to compose various valid Telugu glyph clusters to test   	 
       
  6837 ?Vowel sign replaces the vowel stem
       
  6838 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
       
  6839 @SYMPREQ 1766: Tamil for Sphinx
       
  6840 @SYMREQ 8743:Tamil Text Rendering
       
  6841 */		
       
  6842 		testText[52] = 0x0C1D;	
       
  6843 		testText[53] = 0x0C48;
       
  6844 		
       
  6845 		param.iPosInText = 52 ;
       
  6846 		param.iPen.iX = param.iPen.iY = 0;
       
  6847 		r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  6848 		
       
  6849 		TEST(r && param.iPosInText ==  54 
       
  6850 			   && param.iOutputGlyphs == 2
       
  6851 			   && param.iOutput[0].iCode == 0x80000ff5
       
  6852 			   && param.iOutput[1].iCode == 0x80000f3b );
       
  6853 
       
  6854 		#if defined __WINS__ || defined __WINSCW__
       
  6855 		TEST(r && param.iPen.iX == 19);
       
  6856 		#endif
       
  6857 		
       
  6858 		INFO_PRINTF6(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
       
  6859 		TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
       
  6860     		if (err!=KErrNone)
       
  6861     			INFO_PRINTF1(_L("Failed to record test result"));
       
  6862 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4059"));	
       
  6863 		/*	
       
  6864 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4059
       
  6865 @SYMTestCaseDesc Automated GDI testing for Telugu
       
  6866 @SYMTestPriority High
       
  6867 @SYMTestActions  Attempt to compose various valid Telugu glyph clusters to test   	 
       
  6868 ?Vowel sign replaces the vowel stem.
       
  6869 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
       
  6870 @SYMPREQ 1766: Tamil for Sphinx
       
  6871 @SYMREQ 8743:Tamil Text Rendering
       
  6872 */	
       
  6873 	// Req 4.2.5
       
  6874 		testText[54] = 0x0C15;
       
  6875 		testText[55] = 0x0C4A;
       
  6876 		
       
  6877 		param.iPosInText = 54 ;
       
  6878 		param.iPen.iX = param.iPen.iY = 0;
       
  6879 		
       
  6880 		r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  6881 		
       
  6882 		TEST(r && param.iPosInText ==  56 
       
  6883 			   && param.iOutputGlyphs == 1
       
  6884 			   && param.iOutput[0].iCode == 0x80001059 );
       
  6885 
       
  6886 		#if defined __WINS__ || defined __WINSCW__
       
  6887 		TEST(r && param.iPen.iX == 13);
       
  6888 		#endif
       
  6889 		
       
  6890 		INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
       
  6891 		TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
       
  6892     		if (err!=KErrNone)
       
  6893     			INFO_PRINTF1(_L("Failed to record test result"));
       
  6894 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4060"));
       
  6895 		/*	
       
  6896 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4060
       
  6897 @SYMTestCaseDesc Automated GDI testing for Telugu
       
  6898 @SYMTestPriority High
       
  6899 @SYMTestActions  Attempt to compose various valid Telugu glyph clusters to test   	 
       
  6900 ?Vowel sign replaces the vowel stem.
       
  6901 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
       
  6902 @SYMPREQ 1766: Tamil for Sphinx
       
  6903 @SYMREQ 8743:Tamil Text Rendering
       
  6904 */	
       
  6905 	
       
  6906 		testText[56] = 0x0C21;
       
  6907 		testText[57] = 0x0C4B;
       
  6908 		
       
  6909 		param.iPosInText = 56 ;
       
  6910 		param.iPen.iX = param.iPen.iY = 0;
       
  6911 		
       
  6912 		r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  6913 		
       
  6914 		TEST(r && param.iPosInText ==  58 
       
  6915 			   && param.iOutputGlyphs == 1 
       
  6916 			   && param.iOutput[0].iCode == 0x80001089 );
       
  6917 
       
  6918 		#if defined __WINS__ || defined __WINSCW__
       
  6919 		TEST(r && param.iPen.iX == 14);
       
  6920 		#endif
       
  6921 		
       
  6922 		INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
       
  6923 		TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
       
  6924     		if (err!=KErrNone)
       
  6925     			INFO_PRINTF1(_L("Failed to record test result"));
       
  6926 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4061"));
       
  6927 		/*	
       
  6928 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4061
       
  6929 @SYMTestCaseDesc Automated GDI testing for Telugu
       
  6930 @SYMTestPriority High
       
  6931 @SYMTestActions  Attempt to compose various valid Telugu glyph clusters to test   	 
       
  6932 ?Vowel sign replaces the vowel stem.
       
  6933 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
       
  6934 @SYMPREQ 1766: Tamil for Sphinx
       
  6935 @SYMREQ 8743:Tamil Text Rendering
       
  6936 */	
       
  6937 		testText[58] = 0x0C26;
       
  6938 		testText[59] = 0x0C4C;
       
  6939 		
       
  6940 		param.iPosInText = 58 ;
       
  6941 		param.iPen.iX = param.iPen.iY = 0;
       
  6942 		
       
  6943 		r = aFont->GetCharacterPosition2(param,shapeInfo);
       
  6944 		
       
  6945 		TEST(r && param.iPosInText == 60   
       
  6946 			   && param.iOutputGlyphs == 1
       
  6947 			   && param.iOutput[0].iCode == 0x800010b2 );
       
  6948 	
       
  6949 		#if defined __WINS__ || defined __WINSCW__
       
  6950 		TEST(r && param.iPen.iX == 14);
       
  6951 		#endif
       
  6952 		
       
  6953 		INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
       
  6954 	}
       
  6955 	
       
  6956 void CTGlyphSelection::TestIndicPunctuation(CFbsFont* aFont)
       
  6957 	{
       
  6958 	INFO_PRINTF1(_L("Test Indic Punctuation"));
       
  6959 
       
  6960 	CFont::TPositionParam param;
       
  6961 	param.iDirection = CFont::EHorizontal;
       
  6962 	param.iFlags = CFont::TPositionParam::EFLogicalOrder;
       
  6963 	
       
  6964 	//INFO_PRINTF1(_L("// punctuation string after Kannada text"));
       
  6965 	TestGlyphs(aFont,param,_L("\xC95!?#@"),_L("\x7A8\x920\x93C\x922\x23"));
       
  6966 	//INFO_PRINTF1(_L("// punctuation string before Kannada text"));
       
  6967 	TestGlyphs(aFont,param,_L("!?#@\xC95"),_L("\x21\x3F\x23\x40\x7A8"));
       
  6968 	//INFO_PRINTF1(_L("// punctuation string before and after Kannada text"));
       
  6969 	TestGlyphs(aFont,param,_L("  \"\xC95\"  "),_L("\x20\x20\x22\x7A8\x22\x20\x20"));
       
  6970 	//INFO_PRINTF1(_L("// punctuation before and after latin text followed by punctuation before and after kannada text"));
       
  6971 	TestGlyphs(aFont,param,_L("\x201c\x041\x201D (\xc95)"),_L("\x201c\x41\x201d\x20\x28\x7a8\x29"));
       
  6972 	//INFO_PRINTF1(_L("// mixed kannada/ latin with punctuation surrounded by whitespace inbetween"));
       
  6973 	TestGlyphs(aFont,param,_L("\xc95 , \x041"),_L("\x7a8\x20\x929\x20\x41"));
       
  6974 	//INFO_PRINTF1(_L("// mixed kannada/ latin with punctuation surrounded by whitespace inbetween (reversed)"));
       
  6975 	TestGlyphs(aFont,param,_L("\x041 , \xc95"),_L("\x41\x20\x2C\x20\x7a8"));
       
  6976 	//INFO_PRINTF1(_L("// mixed kannada/ latin with punctuation next to latin"));
       
  6977 	TestGlyphs(aFont,param,_L("\x041, \xc95"),_L("\x41\x2C\x20\x7a8"));
       
  6978 	//INFO_PRINTF1(_L("// mixed kannada/ latin with punctuation next to kannada"));
       
  6979 	TestGlyphs(aFont,param,_L("\x041 ,\xc95"),_L("\x41\x20\x2C\x7a8"));
       
  6980 	//INFO_PRINTF1(_L("// mixed kannada/ latin with punctuation next to latin and seperating tab"));
       
  6981 	TestGlyphs(aFont,param,_L("\x041,\t\xc95"),_L("\x41\x2C\x9\x7a8"));
       
  6982 	//INFO_PRINTF1(_L("// mixed kannada/ latin with punctuation next to kannada and seperating tab"));
       
  6983 	TestGlyphs(aFont,param,_L("\x041\t,\xc95"),_L("\x41\x9\x2C\x7a8"));
       
  6984 	//INFO_PRINTF1(_L("// devanagari digits with colons"));
       
  6985 	TestGlyphs(aFont,param,_L("\x966\x03a\x967\x03a\x968\x03a\x969\x03a\x96a\x03a\x96b\x03a\x96c\x03a\x96d\x03a\x96e\x03a\x96f\x03a"),
       
  6986 										_L("\x582\x77e\x583\x77e\x584\x77e\x585\x77e\x586\x77e\x587\x77e\x588\x77e\x589\x77e\x58a\x77e\x58b\x77e"));
       
  6987 	//INFO_PRINTF1(_L("// string of only punctuation"));
       
  6988 	TestGlyphs(aFont,param,_L("\x002D\x002D\x002D\x002D\x002D\x002D"),_L("\x002D\x002D\x002D\x002D\x002D\x002D"));
       
  6989 	//INFO_PRINTF1(_L("// one Kannada character followed my multiple punctuation and non-punctuaion"));
       
  6990 	TestGlyphs(aFont,param,_L("\x0C95!\x0022\x00A3$%^&*()-={}[]:@~;'#<>?,./"),
       
  6991 										_L("\x07A8\x0920\x0022\x00A3\x0024\x0923\x005E\x0009\x0927\x0028\x0029\x092A\x003D\x007B\x007D\x005B\x005D\x0937\x0023\x007E\x0938\x0027\x0922\x003C\x003E\x093C\x0929\x092B\x092C"));
       
  6992 	}
       
  6993 	
       
  6994 
       
  6995 
       
  6996 void CTGlyphSelection::TestIndicCharsL()
       
  6997 	{
       
  6998 	// create a font store for testing
       
  6999 	CFontStore* fontStore = CFontStore::NewL(&User::Heap());
       
  7000 	
       
  7001 	//load all ecom implemented rasterizer dlls. installs the rasterizer.	
       
  7002 	LoadOpenFontLibraries(fontStore);
       
  7003 		// test font preparation
       
  7004 	fontStore->iKPixelWidthInTwips = 11860; //This value is default
       
  7005 
       
  7006 	//add any required font files
       
  7007 	TUid err = fontStore->AddFileL(KTestHindiFontFile);
       
  7008 
       
  7009 	TFontSpec testHindiFontSpec(KTestHindiFontFaceName,200); 
       
  7010 	
       
  7011 	TUid err1 = fontStore->AddFileL(KTestIndicFontFile);
       
  7012 
       
  7013 	TFontSpec testIndicFontSpec(KTestIndicFontFaceName,200);
       
  7014 	 
       
  7015 	CFbsBitmap* bmp = new(ELeave) CFbsBitmap;
       
  7016 	
       
  7017 	TInt ret = bmp->Create(TSize(100,100),EGray2);
       
  7018 	if (ret == KErrNotSupported)
       
  7019 		return;
       
  7020 	else
       
  7021 		User::LeaveIfError(ret);
       
  7022 
       
  7023 	CFbsBitmapDevice* device = NULL;
       
  7024 	TRAPD(err2,device = CFbsBitmapDevice::NewL(bmp));
       
  7025 	TEST(err2 == KErrNone);
       
  7026 
       
  7027 	CFbsBitGc* gc = NULL;
       
  7028 	User::LeaveIfError(device->CreateContext(gc));
       
  7029 	// Font file Creation
       
  7030 	CFbsFont* hindiFont = NULL;
       
  7031 	User::LeaveIfError(device->GetNearestFontToDesignHeightInTwips(hindiFont,testHindiFontSpec));
       
  7032 	gc->UseFont(hindiFont);
       
  7033 	CleanupStack::PushL(hindiFont);
       
  7034 	
       
  7035 	//Testcode for Hindi language
       
  7036 	((CTGlyphSelectionStep*)iStep)->RecordTestResultL();
       
  7037 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-1580"));
       
  7038 	TestHindiChars(hindiFont);
       
  7039 	((CTGlyphSelectionStep*)iStep)->RecordTestResultL();
       
  7040 	
       
  7041 	CleanupStack::Pop(hindiFont);
       
  7042 	
       
  7043 	// Font file Creation
       
  7044 	CFbsFont* indicFont = NULL;
       
  7045 	User::LeaveIfError(device->GetNearestFontToDesignHeightInTwips(indicFont,testIndicFontSpec));
       
  7046 	gc->UseFont(indicFont);
       
  7047 	CleanupStack::PushL(indicFont);
       
  7048 	
       
  7049 	//Testcode for Kannada, Marathi,Gujarati,Bengali language
       
  7050 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-3381"));
       
  7051 	TestKannadaChars(indicFont);
       
  7052 	((CTGlyphSelectionStep*)iStep)->RecordTestResultL();
       
  7053 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-3360"));
       
  7054 	TestMarathiChars(indicFont);
       
  7055 	((CTGlyphSelectionStep*)iStep)->RecordTestResultL();
       
  7056 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-3417"));
       
  7057 	TestGujaratiChars(indicFont);
       
  7058 	TestBengaliChars(indicFont);
       
  7059 	TestTamilChars(indicFont);
       
  7060 	TestTeluguChars(indicFont);
       
  7061 	TestIndicPunctuation(indicFont);
       
  7062 	CleanupStack::Pop(indicFont);
       
  7063 			
       
  7064 	//Cleaning the memory
       
  7065 	delete bmp;
       
  7066 	delete device;
       
  7067 	delete gc;
       
  7068 	fontStore->RemoveFile(err);
       
  7069 	fontStore->RemoveFile(err1);
       
  7070 	delete fontStore;
       
  7071 	REComSession::FinalClose();
       
  7072 	}
       
  7073 
       
  7074 	
       
  7075 /**
       
  7076 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CT-0221
       
  7077 @SYMTestCaseDesc Test support for Vietnamese characters.
       
  7078 @SYMTestPriority High
       
  7079 @SYMTestActions  Attempt to compose various valid and invalid Vietnamese glyph clusters.
       
  7080 @SYMTestExpectedResults The test must not fail.
       
  7081 @SYMPREQ 402: GDI for Bravo.
       
  7082 */
       
  7083 void CTGlyphSelection::TestVietnameseChars()
       
  7084 	{
       
  7085 /**
       
  7086  This method is a test case to test GetCharacterPosition() correctly
       
  7087  processes Vietnamese characters.
       
  7088 */
       
  7089 	TBool r;
       
  7090 	TBuf<41> testText(0);
       
  7091 	CFont::TPositionParam param;
       
  7092 	param.iDirection = CFont::EHorizontal;
       
  7093 	param.iFlags = CFont::TPositionParam::EFLogicalOrder;
       
  7094 
       
  7095 	testText.SetLength(41);
       
  7096 	
       
  7097 	testText[0] = 0x0055; // capital U
       
  7098 	testText[1] = 0x031B; // combining horn - expect 0x01AF (succeed)
       
  7099 
       
  7100 	testText[2] = 0x0055; // capital U
       
  7101 	testText[3] = 0x0027; // apostrophe - expect 0x0055 (fail)
       
  7102 
       
  7103 	testText[4] = 0x0055; // capital U
       
  7104 	testText[5] = 0x02B9; // modifier prime - expect 0x0055 (fail)
       
  7105 
       
  7106 	testText[6] = 0x0055; // capital U
       
  7107 	testText[7] = 0x02BC; // modifier apostrophe - expect 0x0055 (fail)
       
  7108 
       
  7109 	testText[8] = 0x0055; // capital U
       
  7110 	testText[9] = 0x0315; // combining comma above right - expect 0x0055, 0x0315 (fail)
       
  7111 
       
  7112 	testText[10] = 0x0055; // capital U
       
  7113 	testText[11] = 0x2019; // right single quote mark - expect 0x0055 (fail)
       
  7114 
       
  7115 	testText[12] = 0x01AF; // capital U with horn
       
  7116 	testText[13] = 0x0020; // space - expect 0x01AF (succeed)
       
  7117 
       
  7118 	testText[14] = 0x0045; // capital E
       
  7119 	testText[15] = 0x031B; // combining horn - expect 0x0045, 0x031B (fail)
       
  7120 
       
  7121 	testText[16] = 0x0041; // capital A
       
  7122 	testText[17] = 0x0306; // combining breve
       
  7123 	testText[18] = 0x0301; // combining acute - expect 0x1EAE (succeed)
       
  7124 
       
  7125 	testText[19] = 0x0102; // capital A with breve
       
  7126 	testText[20] = 0x0301; // combining acute - expect 0x1EAE (succeed)
       
  7127 
       
  7128 	testText[21] = 0x0041; // capital A
       
  7129 	testText[22] = 0x0301; // combining acute
       
  7130 	testText[23] = 0x0306; // combining breve - expect 0x0041, 0x0301, 0x0306 (fail)
       
  7131 
       
  7132 	testText[24] = 0x0041; // capital A
       
  7133 	testText[25] = 0x0323; // combining dot below
       
  7134 	testText[26] = 0x0306; // combining breve - expect 0x1EB6 (succeed)
       
  7135 
       
  7136 	testText[27] = 0x1EA0; // capital A with dot below
       
  7137 	testText[28] = 0x0306; // combining breve - expect 0x1EB6 (succeed)
       
  7138 
       
  7139 	testText[29] = 0x0102; // capital A with breve
       
  7140 	testText[30] = 0x0323; // combining dot below - expect 0x0102, 0x0323 (fail)
       
  7141 
       
  7142 	testText[31] = 0x0045; // capital A
       
  7143 	testText[32] = 0x0302; // combining circumflex
       
  7144 	testText[33] = 0x0301; // combining acute - expect 0x1EBE (succeed)
       
  7145 
       
  7146 	testText[34] = 0x00CA; // capital A with circumflex
       
  7147 	testText[35] = 0x0301; // combining acute - expect 0x1EBE (succeed)
       
  7148 
       
  7149 	testText[36] = 0x004F; // capital O
       
  7150 	testText[37] = 0x031B; // combining horn
       
  7151 	testText[38] = 0x0309; // combining hook above - expect 0x1EDE (succeed)
       
  7152 
       
  7153 	testText[39] = 0x01A0; // capital O with horn
       
  7154 	testText[40] = 0x0309; // combining hook above - expect 0x1EDE (succeed)
       
  7155 
       
  7156 	param.iText.Set(testText);
       
  7157 
       
  7158 	// 1: Capital U with combining horn
       
  7159 	param.iPosInText = 0;
       
  7160 	param.iPen.iX = param.iPen.iY = 0;
       
  7161 	r = iTestFont->GetCharacterPosition(param);
       
  7162 	TEST(r && param.iPosInText == 2 
       
  7163 		   && param.iPen.iX == 10
       
  7164 		   && param.iOutputGlyphs == 1
       
  7165 		   && param.iOutput[0].iCode == 0x01AF);
       
  7166 
       
  7167 	// 2: Capital U with apostrophe
       
  7168 	param.iPosInText = 2;
       
  7169 	param.iPen.iX = param.iPen.iY = 0;
       
  7170 	r = iTestFont->GetCharacterPosition(param);
       
  7171 	TEST(r && param.iPosInText == 3 
       
  7172 		   && param.iPen.iX == 10
       
  7173 		   && param.iOutputGlyphs == 1
       
  7174 		   && param.iOutput[0].iCode == 0x0055);
       
  7175 
       
  7176 	// 3: Capital U with modifier prime
       
  7177 	param.iPosInText = 4;
       
  7178 	param.iPen.iX = param.iPen.iY = 0;
       
  7179 	r = iTestFont->GetCharacterPosition(param);
       
  7180 	TEST(r && param.iPosInText == 5 
       
  7181 		   && param.iPen.iX == 10
       
  7182 		   && param.iOutputGlyphs == 1
       
  7183 		   && param.iOutput[0].iCode == 0x0055);
       
  7184 
       
  7185 	// 4: Capital U with modifier apostrophe
       
  7186 	param.iPosInText = 6;
       
  7187 	param.iPen.iX = param.iPen.iY = 0;
       
  7188 	r = iTestFont->GetCharacterPosition(param);
       
  7189 	TEST(r && param.iPosInText == 7 
       
  7190 		   && param.iPen.iX == 10
       
  7191 		   && param.iOutputGlyphs == 1
       
  7192 		   && param.iOutput[0].iCode == 0x0055);
       
  7193 
       
  7194 	// 5: Capital U with combining comma above right
       
  7195 	param.iPosInText = 8;
       
  7196 	param.iPen.iX = param.iPen.iY = 0;
       
  7197 	r = iTestFont->GetCharacterPosition(param);
       
  7198 	TEST(r && param.iPosInText == 10 
       
  7199 		   && param.iPen.iX == 10
       
  7200 		   && param.iOutputGlyphs == 2
       
  7201 		   && param.iOutput[0].iCode == 0x0055
       
  7202 		   && param.iOutput[1].iCode == 0x0315);
       
  7203 
       
  7204 	// 6: Capital U with right single quote
       
  7205 	param.iPosInText = 10;
       
  7206 	param.iPen.iX = param.iPen.iY = 0;
       
  7207 	r = iTestFont->GetCharacterPosition(param);
       
  7208 	TEST(r && param.iPosInText == 11 
       
  7209 		   && param.iPen.iX == 10
       
  7210 		   && param.iOutputGlyphs == 1
       
  7211 		   && param.iOutput[0].iCode == 0x0055);
       
  7212 
       
  7213 	// 7: Capital U with horn plus space
       
  7214 	param.iPosInText = 12;
       
  7215 	param.iPen.iX = param.iPen.iY = 0;
       
  7216 	r = iTestFont->GetCharacterPosition(param);
       
  7217 	TEST(r && param.iPosInText == 13 
       
  7218 		   && param.iPen.iX == 10
       
  7219 		   && param.iOutputGlyphs == 1
       
  7220 		   && param.iOutput[0].iCode == 0x01AF);
       
  7221 
       
  7222 	// 8: Capital E with combining horn
       
  7223 	param.iPosInText = 14;
       
  7224 	param.iPen.iX = param.iPen.iY = 0;
       
  7225 	r = iTestFont->GetCharacterPosition(param);
       
  7226 	TEST(r && param.iPosInText == 16 
       
  7227 		   && param.iPen.iX == 10
       
  7228 		   && param.iOutputGlyphs == 2
       
  7229 		   && param.iOutput[0].iCode == 0x0045
       
  7230 		   && param.iOutput[1].iCode == 0x031B);
       
  7231 
       
  7232 	// 9: Capital A with combining breve with combining acute
       
  7233 	param.iPosInText = 16;
       
  7234 	param.iPen.iX = param.iPen.iY = 0;
       
  7235 	r = iTestFont->GetCharacterPosition(param);
       
  7236 	TEST(r && param.iPosInText == 19 
       
  7237 		   && param.iPen.iX == 10
       
  7238 		   && param.iOutputGlyphs == 1
       
  7239 		   && param.iOutput[0].iCode == 0x1EAE);
       
  7240 
       
  7241 	// 10: Capital A with breve with combining acute
       
  7242 	param.iPosInText = 19;
       
  7243 	param.iPen.iX = param.iPen.iY = 0;
       
  7244 	r = iTestFont->GetCharacterPosition(param);
       
  7245 	TEST(r && param.iPosInText == 21 
       
  7246 		   && param.iPen.iX == 10
       
  7247 		   && param.iOutputGlyphs == 1
       
  7248 		   && param.iOutput[0].iCode == 0x1EAE);
       
  7249 
       
  7250 	// 11: Capital A with combining acute with combining breve
       
  7251 	param.iPosInText = 21;
       
  7252 	param.iPen.iX = param.iPen.iY = 0;
       
  7253 	r = iTestFont->GetCharacterPosition(param);
       
  7254 	TEST(r && param.iPosInText == 24 
       
  7255 		   && param.iPen.iX == 10
       
  7256 		   && param.iOutputGlyphs == 3
       
  7257 		   && param.iOutput[0].iCode == 0x0041
       
  7258 		   && param.iOutput[1].iCode == 0x0301
       
  7259 		   && param.iOutput[2].iCode == 0x0306);
       
  7260 
       
  7261 	// 12: Capital A with combining dot below with combining breve
       
  7262 	param.iPosInText = 24;
       
  7263 	param.iPen.iX = param.iPen.iY = 0;
       
  7264 	r = iTestFont->GetCharacterPosition(param);
       
  7265 	TEST(r && param.iPosInText == 27 
       
  7266 		   && param.iPen.iX == 10
       
  7267 		   && param.iOutputGlyphs == 1
       
  7268 		   && param.iOutput[0].iCode == 0x1EB6);
       
  7269 
       
  7270 	// 13: Capital A with dot below with combining breve
       
  7271 	param.iPosInText = 27;
       
  7272 	param.iPen.iX = param.iPen.iY = 0;
       
  7273 	r = iTestFont->GetCharacterPosition(param);
       
  7274 	TEST(r && param.iPosInText == 29 
       
  7275 		   && param.iPen.iX == 10
       
  7276 		   && param.iOutputGlyphs == 1
       
  7277 		   && param.iOutput[0].iCode == 0x1EB6);
       
  7278 
       
  7279 	// 14: Capital A with breve with combining dot below
       
  7280 	param.iPosInText = 29;
       
  7281 	param.iPen.iX = param.iPen.iY = 0;
       
  7282 	r = iTestFont->GetCharacterPosition(param);
       
  7283 	TEST(r && param.iPosInText == 31 
       
  7284 		   && param.iPen.iX == 10
       
  7285 		   && param.iOutputGlyphs == 2
       
  7286 		   && param.iOutput[0].iCode == 0x0102
       
  7287 		   && param.iOutput[1].iCode == 0x0323);
       
  7288 
       
  7289 	// 15: Capital A with combining circumflex with combining acute
       
  7290 	param.iPosInText = 31;
       
  7291 	param.iPen.iX = param.iPen.iY = 0;
       
  7292 	r = iTestFont->GetCharacterPosition(param);
       
  7293 	TEST(r && param.iPosInText == 34 
       
  7294 		   && param.iPen.iX == 10
       
  7295 		   && param.iOutputGlyphs == 1
       
  7296 		   && param.iOutput[0].iCode == 0x1EBE);
       
  7297 
       
  7298 	// 16: Capital A with circumflex with combining acute
       
  7299 	param.iPosInText = 34;
       
  7300 	param.iPen.iX = param.iPen.iY = 0;
       
  7301 	r = iTestFont->GetCharacterPosition(param);
       
  7302 	TEST(r && param.iPosInText == 36 
       
  7303 		   && param.iPen.iX == 10
       
  7304 		   && param.iOutputGlyphs == 1
       
  7305 		   && param.iOutput[0].iCode == 0x1EBE);
       
  7306 
       
  7307 	// 17: Capital O with combining horn with combing hook above
       
  7308 	param.iPosInText = 36;
       
  7309 	param.iPen.iX = param.iPen.iY = 0;
       
  7310 	r = iTestFont->GetCharacterPosition(param);
       
  7311 	TEST(r && param.iPosInText == 39 
       
  7312 		   && param.iPen.iX == 10
       
  7313 		   && param.iOutputGlyphs == 1
       
  7314 		   && param.iOutput[0].iCode == 0x1EDE);
       
  7315 
       
  7316 	// 18: Capital O with horn with combing hook above
       
  7317 	param.iPosInText = 39;
       
  7318 	param.iPen.iX = param.iPen.iY = 0;
       
  7319 	r = iTestFont->GetCharacterPosition(param);
       
  7320 	TEST(r && param.iPosInText == 41 
       
  7321 		   && param.iPen.iX == 10
       
  7322 		   && param.iOutputGlyphs == 1
       
  7323 		   && param.iOutput[0].iCode == 0x1EDE);
       
  7324 	}
       
  7325 
       
  7326 
       
  7327 void CTGlyphSelection::TestNonBmpCharsL()
       
  7328 	{
       
  7329 	// create a font store for testing
       
  7330 	CFontStore* fontStore = CFontStore::NewL(&User::Heap());
       
  7331 	
       
  7332 	//load all ecom implemented rasterizer dlls. installs the rasterizer.	
       
  7333 	LoadOpenFontLibraries(fontStore);
       
  7334 		// test font preparation
       
  7335 	fontStore->iKPixelWidthInTwips = 11860; //This value is default
       
  7336 
       
  7337 	//add any required font files
       
  7338 	TUid err = fontStore->AddFileL(KTestGB18030FontFile);
       
  7339 
       
  7340 	TFontSpec testGB18030FontSpec(KTestGB18030FontFaceName,200); 
       
  7341 	 
       
  7342 	CFbsBitmap* bmp = new(ELeave) CFbsBitmap;
       
  7343 	
       
  7344 	TInt ret = bmp->Create(TSize(100,100),EGray2);
       
  7345 	if (ret == KErrNotSupported)
       
  7346 		return;
       
  7347 	else
       
  7348 		User::LeaveIfError(ret);
       
  7349 
       
  7350 	CFbsBitmapDevice* device = NULL;
       
  7351 	TRAPD(err2,device = CFbsBitmapDevice::NewL(bmp));
       
  7352 	TEST(err2 == KErrNone);
       
  7353 
       
  7354 	CFbsBitGc* gc = NULL;
       
  7355 	User::LeaveIfError(device->CreateContext(gc));
       
  7356 	// Font file Creation
       
  7357 	CFbsFont* gb18030Font = NULL;
       
  7358 	User::LeaveIfError(device->GetNearestFontToDesignHeightInTwips(gb18030Font,testGB18030FontSpec));
       
  7359 	gc->UseFont(gb18030Font);
       
  7360 	CleanupStack::PushL(gb18030Font);
       
  7361 	
       
  7362 	//Testcode for GB18030
       
  7363 	((CTGlyphSelectionStep*)iStep)->RecordTestResultL();
       
  7364 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("TI18N-GDI-CIT-4077"));
       
  7365 	TestNonBmpCharsInGB18030(gb18030Font);
       
  7366 	((CTGlyphSelectionStep*)iStep)->RecordTestResultL();
       
  7367 	
       
  7368 	CleanupStack::Pop(gb18030Font);
       
  7369 	
       
  7370 	//Cleaning the memory
       
  7371 	delete bmp;
       
  7372 	delete device;
       
  7373 	delete gc;
       
  7374 	fontStore->RemoveFile(err);
       
  7375 	delete fontStore;
       
  7376 	REComSession::FinalClose();
       
  7377 	}
       
  7378 
       
  7379 
       
  7380 void CTGlyphSelection::TestTextDirection()
       
  7381 /**
       
  7382  This method is a test case to test GetCharacterPosition() correctly
       
  7383  produces glyph bounding boxes and utilizes various pen offsets in
       
  7384  a horizontal and vertical context.
       
  7385 */
       
  7386 	{
       
  7387 	TBool r;
       
  7388 	TBuf<20> testText(0);
       
  7389 	CFont::TPositionParam param;
       
  7390 	param.iFlags = CFont::TPositionParam::EFLogicalOrder;
       
  7391 
       
  7392 	testText.SetLength(5);
       
  7393 	testText[0] = 'a';
       
  7394 	testText[1] = 'B';
       
  7395 	testText[2] = 'c';
       
  7396 	testText[3] = ' ';
       
  7397 	testText[4] = '1';
       
  7398 	param.iText.Set(testText);
       
  7399 
       
  7400 	// 1: Test horizontal text pen advancement & bounds
       
  7401 	param.iDirection = CFont::EHorizontal;
       
  7402 	param.iPosInText = 0;
       
  7403 	param.iPen.iX = param.iPen.iY = 0;
       
  7404 	r = iTestFont->GetCharacterPosition(param);
       
  7405 	TEST(r && param.iPosInText == 1 
       
  7406 		   && param.iPen == TPoint(10,0)
       
  7407 		   && param.iOutputGlyphs == 1 
       
  7408 		   && param.iOutput[0].iCode == 'a'
       
  7409 		   && param.iOutput[0].iBounds.iTl == TPoint(0,-10)
       
  7410 		   && param.iOutput[0].iBounds.iBr == TPoint(10,2));
       
  7411 		   // add check for bounds
       
  7412 
       
  7413 	// 2: Test horizontal text pen advancement with +ve pen offset
       
  7414 	param.iPosInText = 4;
       
  7415 	param.iPen.iX = 20;
       
  7416 	param.iPen.iY = 12;
       
  7417 	r = iTestFont->GetCharacterPosition(param);
       
  7418 	TEST(r && param.iPosInText == 5 
       
  7419 		   && param.iPen == TPoint(30,12)
       
  7420 		   && param.iOutputGlyphs == 1 
       
  7421 		   && param.iOutput[0].iCode == '1'
       
  7422 		   && param.iOutput[0].iBounds.iTl == TPoint(20,2)
       
  7423 		   && param.iOutput[0].iBounds.iBr == TPoint(30,14));
       
  7424 
       
  7425 	// 3: Test horizontal text pen advancement with -ve pen offset
       
  7426 	param.iPosInText = 4;
       
  7427 	param.iPen.iX = -10;
       
  7428 	param.iPen.iY = -24;
       
  7429 	r = iTestFont->GetCharacterPosition(param);
       
  7430 	TEST(r && param.iPosInText == 5 
       
  7431 		   && param.iPen == TPoint(0,-24)
       
  7432 		   && param.iOutputGlyphs == 1 
       
  7433 		   && param.iOutput[0].iCode == '1'
       
  7434 		   && param.iOutput[0].iBounds.iTl == TPoint(-10,-34)
       
  7435 		   && param.iOutput[0].iBounds.iBr == TPoint(0,-22));
       
  7436 
       
  7437 	// 4: Test vertical text pen advancement & bounds
       
  7438 	param.iDirection = CFont::EVertical;
       
  7439 	param.iPosInText = 1;
       
  7440 	param.iPen.iX = param.iPen.iY = 0;
       
  7441 	r = iTestFont->GetCharacterPosition(param);
       
  7442 	TEST(r && param.iPosInText == 2 
       
  7443 		   && param.iPen == TPoint(0,12)
       
  7444 		   && param.iOutputGlyphs == 1 
       
  7445 		   && param.iOutput[0].iCode == 'B'
       
  7446 		   && param.iOutput[0].iBounds.iTl == TPoint(0,0)
       
  7447 		   && param.iOutput[0].iBounds.iBr == TPoint(10,12));
       
  7448 
       
  7449 	// 5: Test vertical text pen advancement with +ve pen offset
       
  7450 	param.iPosInText = 4;
       
  7451 	param.iPen.iX = 20;
       
  7452 	param.iPen.iY = 12;
       
  7453 	r = iTestFont->GetCharacterPosition(param);
       
  7454 	TEST(r && param.iPosInText == 5 
       
  7455 		   && param.iPen == TPoint(20,24)
       
  7456 		   && param.iOutputGlyphs == 1 
       
  7457 		   && param.iOutput[0].iCode == '1'
       
  7458 		   && param.iOutput[0].iBounds.iTl == TPoint(20,12)
       
  7459 		   && param.iOutput[0].iBounds.iBr == TPoint(30,24));
       
  7460 
       
  7461 	// 6: Test vertical text pen advancement with -ve pen offset
       
  7462 	param.iPosInText = 4;
       
  7463 	param.iPen.iX = -10;
       
  7464 	param.iPen.iY = -24;
       
  7465 	r = iTestFont->GetCharacterPosition(param);
       
  7466 	TEST(r && param.iPosInText == 5 
       
  7467 		   && param.iPen == TPoint(-10,-12)
       
  7468 		   && param.iOutputGlyphs == 1 
       
  7469 		   && param.iOutput[0].iCode == '1'
       
  7470 		   && param.iOutput[0].iBounds.iTl == TPoint(-10,-24)
       
  7471 		   && param.iOutput[0].iBounds.iBr == TPoint(0,-12));
       
  7472 	}
       
  7473 
       
  7474 void CTGlyphSelection::TestAllUnicodeChars()
       
  7475 /**
       
  7476  This method is a test case to test GetCharacterPosition() correctly
       
  7477  processes all the characters in the Unicode code space 0x0000 to 
       
  7478  0xffff.
       
  7479 */
       
  7480 	{
       
  7481 	TBool r;
       
  7482 	TBuf<8> testText(0);
       
  7483 	CFont::TPositionParam param;
       
  7484 	param.iFlags = CFont::TPositionParam::EFLogicalOrder;
       
  7485 
       
  7486 	TInt errors = 0;
       
  7487 	testText.SetLength(1);
       
  7488 	for (TUint i = 0xd802; i <= 0xffff; i++)
       
  7489 		{
       
  7490 		testText[0] = (TText16) i;
       
  7491 		if (i==0x1b) continue; // Skip as CTestFont designed to fail here r==0.
       
  7492 		param.iText.Set(testText);
       
  7493 		param.iDirection = CFont::EHorizontal;
       
  7494 		param.iPosInText = 0;
       
  7495 		param.iPen.iX = param.iPen.iY = 0;
       
  7496 		r = iTestFont->GetCharacterPosition(param);
       
  7497 		if (!r || param.iPosInText != 1)
       
  7498 			{
       
  7499 			errors++;
       
  7500 			//RDebug::Print(_L("%04x(%d,%d,%d), "), i, r, param.iPosInText, param.iOutputGlyphs );
       
  7501 			//if (errors%8 == 0)
       
  7502 			//	RDebug::Print(_L("\n"));
       
  7503 			}
       
  7504 		}
       
  7505 
       
  7506 	TEST (errors == 0);
       
  7507 	}
       
  7508 
       
  7509 /** Tests that ligatures (presently just Lam-Alef in Arabic) work correctly
       
  7510 when diacritics are required on one, both or neither character comprising the
       
  7511 ligature. */
       
  7512 void CTGlyphSelection::TestLigaturesWithDiacritics()
       
  7513 	{
       
  7514 	// independent letters
       
  7515 	const TText KAlef = 0x627;
       
  7516 	const TText KLam = 0x644;
       
  7517 	const TText KBeh = 0x628;
       
  7518 	// dependent marks
       
  7519 	const TText KFatha = 0x64E;
       
  7520 	const TText KDamma = 0x64F;
       
  7521 	// ligature forms
       
  7522 	const TText KLamAlefIsolated = 0xFEFB;
       
  7523 	const TText KLamAlefFinal = 0xFEFC;
       
  7524 
       
  7525 	struct TTestCase
       
  7526 		{
       
  7527 		// Logical order input.
       
  7528 		TText iInputL[8];
       
  7529 		// Visual order input, should be equivalent to iInputL.
       
  7530 		TText iInputV[8];
       
  7531 		// Which cluster to test
       
  7532 		TInt iClusterUnderTestStartL;
       
  7533 		TInt iClusterUnderTestStartV;
       
  7534 		// Expected glyphs to appear (in any order, but...)
       
  7535 		TInt iGlyphs[8];
       
  7536 		// ...number of glyphs from the start of iGlyphs that
       
  7537 		// are in order of their expected x-coordinates (of their
       
  7538 		// centres)
       
  7539 		TInt iGlyphsInOrder;
       
  7540 		};
       
  7541 	const TTestCase KTestCases[] =
       
  7542 		{
       
  7543 		{{KLam, KAlef, 0}, {KAlef, KLam, 0},
       
  7544 			0, 0, {KLamAlefIsolated, 0}, 1},
       
  7545 		{{KBeh, KLam, KAlef, KBeh, 0}, {KBeh, KAlef, KLam, KBeh, 0},
       
  7546 			1, 1, {KLamAlefFinal, 0}, 1},
       
  7547 		{{KLam, KFatha, KAlef, 0}, {KAlef, KLam, KFatha, 0},
       
  7548 			0, 0, {KLamAlefIsolated, KFatha, 0}, 1},
       
  7549 		{{KBeh, KLam, KFatha, KAlef, KBeh, 0}, {KBeh, KAlef, KLam, KFatha, KBeh, 0},
       
  7550 			1, 1, {KLamAlefFinal, KFatha, 0}, 1},
       
  7551 		{{KLam, KAlef, KDamma, 0}, {KAlef, KDamma, KLam, 0},
       
  7552 			0, 0, {KLamAlefIsolated, KDamma, 0}, 1},
       
  7553 		{{KBeh, KLam, KAlef, KDamma, KBeh, 0}, {KBeh, KAlef, KDamma, KLam, KBeh, 0},
       
  7554 			1, 1, {KLamAlefFinal, KDamma, 0}, 1},
       
  7555 		{{KLam, KFatha, KAlef, KDamma, 0}, {KAlef, KDamma, KLam, KFatha, 0},
       
  7556 			0, 0, {KDamma, KFatha, KLamAlefIsolated, 0}, 2},
       
  7557 		{{KBeh, KLam, KFatha, KAlef, KDamma, KBeh, 0},
       
  7558 			{KBeh, KAlef, KDamma, KLam, KFatha, KBeh, 0},
       
  7559 			1, 1, {KDamma, KFatha, KLamAlefFinal, 0}, 2},
       
  7560 		};
       
  7561 	TBuf<8> input;
       
  7562 	CFont::TPositionParam param;
       
  7563 	for (TInt testCase = 0;
       
  7564 		testCase != sizeof(KTestCases)/sizeof(KTestCases[0]);
       
  7565 		++testCase)
       
  7566 		{
       
  7567 		const TTestCase& t = KTestCases[testCase];
       
  7568 		for (TInt logical = 0; logical != 2; ++logical)
       
  7569 			{
       
  7570 			const TText* in = logical?
       
  7571 				t.iInputL : t.iInputV;
       
  7572 			input.Zero();
       
  7573 			while (*in)
       
  7574 				input.Append(*in++);
       
  7575 			param.iText.Set(input);
       
  7576 			param.iPosInText = logical?
       
  7577 				t.iClusterUnderTestStartL : t.iClusterUnderTestStartV;
       
  7578 			param.iFlags = static_cast<TUint16>(logical?
       
  7579 				CFont::TPositionParam::EFLogicalOrder : 0);
       
  7580 			param.iPen.SetXY(0, 0);
       
  7581 			TBool r = iTestFont->GetCharacterPosition(param);
       
  7582 			TEST(r);
       
  7583 			TInt currentX = KMinTInt;
       
  7584 			TInt expectedGlyphNo = 0;
       
  7585 			while (t.iGlyphs[expectedGlyphNo] != 0)
       
  7586 				{
       
  7587 				// FInd the expected glyph in the output.
       
  7588 				TInt outputGlyph = 0;
       
  7589 				while (outputGlyph != param.iOutputGlyphs
       
  7590 					&& static_cast<TInt>(param.iOutput[outputGlyph].iCode)
       
  7591 					!= t.iGlyphs[expectedGlyphNo])
       
  7592 					{
       
  7593 					++outputGlyph;
       
  7594 					}
       
  7595 				TEST(outputGlyph < param.iOutputGlyphs);
       
  7596 				TInt x = param.iOutput[outputGlyph].iBounds.Center().iX;
       
  7597 				TEST(t.iGlyphsInOrder <= expectedGlyphNo
       
  7598 					|| currentX < x);
       
  7599 				currentX = x;
       
  7600 				++expectedGlyphNo;
       
  7601 				}
       
  7602 			TEST(expectedGlyphNo == param.iOutputGlyphs);
       
  7603 			}
       
  7604 		}
       
  7605 	}
       
  7606 	
       
  7607  #if defined(__GCC32__)
       
  7608  typedef wchar_t __TText;
       
  7609  #elif defined(__VC32__)
       
  7610  typedef TUint16 __TText;
       
  7611  #elif defined(__CW32__)
       
  7612  typedef TUint16 __TText;
       
  7613  #elif !defined(__TText_defined)
       
  7614  #error  no typedef for __TText
       
  7615  #endif
       
  7616  const __TText* KLatinNoSideBearings = L"ABCDE";
       
  7617  const __TText* KLatinLeftSideBearing = L"WABCD";
       
  7618  const __TText* KLatinRightSideBearing = L"ABCDW";
       
  7619  const __TText* KLatinBothSideBearings = L"WABCW";
       
  7620  const __TText* KArabicAlefWaw = L"\x627\x648";
       
  7621  const __TText* KArabicWawAlef = L"\x648\x627";
       
  7622  const __TText* KGb18030NoSideBearings = L"\xD840\xDC00xyz\xD87E\xDE1D";
       
  7623  const __TText* KGb18030LeftSideBearings = L"W\xD840\xDC00xy\xD87E\xDE1D";
       
  7624  const __TText* KGb18030RightSideBearings = L"\xD840\xDC00xy\xD87E\xDE1DW";
       
  7625  const __TText* KGb18030BothSideBearings = L"W\xD840\xDC00x\xD87E\xDE1DW";
       
  7626  struct TMeasureTextTest
       
  7627  	{
       
  7628  	const __TText* iText;
       
  7629  	TInt iExpectedAdvanceLogical;
       
  7630  	TInt iExpectedAdvanceL2R;
       
  7631  	TInt iExpectedBoundsL2RLeft;
       
  7632  	TInt iExpectedBoundsL2RRight;
       
  7633  	TInt iExpectedBoundsL2RTop;
       
  7634  	TInt iExpectedBoundsL2RBottom;
       
  7635  	TInt iExpectedAdvanceR2L;
       
  7636  	TInt iExpectedBoundsR2LLeft;
       
  7637  	TInt iExpectedBoundsR2LRight;
       
  7638  	TInt iExpectedBoundsR2LTop;
       
  7639  	TInt iExpectedBoundsR2LBottom;
       
  7640  	};
       
  7641  const TMeasureTextTest KMeasureTextResults[] =
       
  7642  	{
       
  7643  	{KLatinNoSideBearings, 50, 50, 0, 50, -10, 2, 50, 0, 50, -10, 2},
       
  7644  	{KLatinLeftSideBearing, 50, 50, -1, 50, -10, 2, 50, 0, 51, -10, 2},
       
  7645  	{KLatinRightSideBearing, 50, 50, 0, 51, -10, 2, 50, -1, 50, -10, 2},
       
  7646  	{KLatinBothSideBearings, 50, 50, -1, 51, -10, 2, 50, -1, 51, -10, 2},
       
  7647  	{KArabicAlefWaw, 20, 20, 0, 20, -10, 2, 20, -5, 20, -10, 2},
       
  7648  	{KArabicWawAlef, 20, 20, -5, 20, -10, 2, 20, 0, 20, -10, 2},
       
  7649  	// ones containing surrogate pairs
       
  7650  	{KGb18030NoSideBearings, 50, 50, 0, 50, -10, 2, 50, 0, 50, -10, 2},
       
  7651  	{KGb18030LeftSideBearings, 50, 50, -1, 50, -10, 2, 50, 0, 51, -10, 2},
       
  7652  	{KGb18030RightSideBearings, 50, 50, 0, 51, -10, 2, 50, -1, 50, -10, 2},
       
  7653  	{KGb18030BothSideBearings, 50, 50, -1, 51, -10, 2, 50, -1, 51, -10, 2},
       
  7654  	};
       
  7655  /** Tests CFont::MeasureText */
       
  7656  void CTGlyphSelection::TestMeasureText()
       
  7657  	{
       
  7658  	CFont::TMeasureTextInput input;
       
  7659  	CFont::TMeasureTextOutput output;
       
  7660  	TInt advance;
       
  7661  	for (TInt i = 0;
       
  7662  		i != sizeof(KMeasureTextResults)/sizeof(KMeasureTextResults[0]); ++i)
       
  7663  		{
       
  7664  		TPtrC text(reinterpret_cast<const TText16*>(
       
  7665  			KMeasureTextResults[i].iText));
       
  7666  		advance = iTestFont->MeasureText(text, &input, &output);
       
  7667  		TEST(advance == KMeasureTextResults[i].iExpectedAdvanceLogical);
       
  7668  		input.iFlags = CFont::TMeasureTextInput::EFVisualOrder;
       
  7669  		advance = iTestFont->MeasureText(text, &input, &output);
       
  7670  		TEST(advance == KMeasureTextResults[i].iExpectedAdvanceL2R);
       
  7671  		TEST(output.iBounds.iTl.iX == KMeasureTextResults[i].iExpectedBoundsL2RLeft);
       
  7672  		TEST(output.iBounds.iBr.iX == KMeasureTextResults[i].iExpectedBoundsL2RRight);
       
  7673  		TEST(output.iBounds.iTl.iY == KMeasureTextResults[i].iExpectedBoundsL2RTop);
       
  7674  		TEST(output.iBounds.iBr.iY == KMeasureTextResults[i].iExpectedBoundsL2RBottom);
       
  7675  		input.iFlags = CFont::TMeasureTextInput::EFVisualOrderRightToLeft;
       
  7676  		advance = iTestFont->MeasureText(text, &input, &output);
       
  7677  		TEST(advance == KMeasureTextResults[i].iExpectedAdvanceR2L);
       
  7678  		TEST(output.iBounds.iTl.iX == KMeasureTextResults[i].iExpectedBoundsR2LLeft);
       
  7679  		TEST(output.iBounds.iBr.iX == KMeasureTextResults[i].iExpectedBoundsR2LRight);
       
  7680  		TEST(output.iBounds.iTl.iY == KMeasureTextResults[i].iExpectedBoundsR2LTop);
       
  7681  		TEST(output.iBounds.iBr.iY == KMeasureTextResults[i].iExpectedBoundsR2LBottom);
       
  7682  		}
       
  7683 
       
  7684 	INFO_PRINTF1(_L("Test fix for INC086257 - EFIncludePenPositionInBoundsCheck"));
       
  7685 	// left-to-right w/o flag and bounds set to just fit string disregarding sidebearings
       
  7686 	input.iFlags = 0;
       
  7687 	input.iMaxBounds = 50;
       
  7688 	iTestFont->MeasureText(_L("XXXXX"), &input, &output);
       
  7689 	TEST(output.iChars == 5);
       
  7690 	// set flag, string should no longer fit (break happens)
       
  7691 	input.iFlags = CFont::TMeasureTextInput::EFIncludePenPositionInBoundsCheck;
       
  7692 	iTestFont->MeasureText(_L("XXXXX"), &input, &output);
       
  7693 	TEST(output.iChars == 4);
       
  7694 	// right-to-left w/o flag and bounds set to just fit string disregarding sidebearings
       
  7695 	input.iFlags = CFont::TMeasureTextInput::EFVisualOrderRightToLeft;
       
  7696 	iTestFont->MeasureText(_L("\x5EA\x5EA\x5EA\x5EA\x5EA"), &input, &output);
       
  7697 	TEST(output.iChars == 5);
       
  7698 	// set flag, string should no longer fit (break happens)
       
  7699 	input.iFlags |= CFont::TMeasureTextInput::EFIncludePenPositionInBoundsCheck;
       
  7700 	iTestFont->MeasureText(_L("\x5EA\x5EA\x5EA\x5EA\x5EA"), &input, &output);
       
  7701 	TEST(output.iChars == 4);
       
  7702 	// top-to-bottom w/o flag and bounds set to just fit string disregarding endbearings
       
  7703 	input.iFlags = 0;
       
  7704 	input.iMaxBounds = 60;
       
  7705 	input.iDirection = CFont::EVertical;
       
  7706 	iTestFont->MeasureText(_L("\x304B\x304B\x304B\x304B\x304B"), &input, &output);
       
  7707 	TEST(output.iChars == 5);
       
  7708 	// set flag, string should no longer fit (break happens)
       
  7709 	input.iFlags = CFont::TMeasureTextInput::EFIncludePenPositionInBoundsCheck;
       
  7710 	iTestFont->MeasureText(_L("\x304B\x304B\x304B\x304B\x304B"), &input, &output);
       
  7711 	TEST(output.iChars == 4);
       
  7712  	}
       
  7713  
       
  7714 void CTGlyphSelection::RunTestCaseL(TInt aCurTestCase)
       
  7715 /**
       
  7716  This method will execute each test case method in the class
       
  7717  logging its progress as it does so.
       
  7718 */
       
  7719 	{
       
  7720 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(KUnknownSYMTestCaseIDName);
       
  7721 	switch(aCurTestCase)
       
  7722 		{
       
  7723 	case 1:
       
  7724 /**
       
  7725 @SYMTestCaseID 				GRAPHICS-SYSLIB-GDI-CIT-0200
       
  7726 */
       
  7727         ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-0200"));
       
  7728 		INFO_PRINTF1(_L("Test API Boundaries"));
       
  7729 		TestApiBoundaries();
       
  7730 		break;
       
  7731 	case 2:
       
  7732 /**
       
  7733 @SYMTestCaseID 				GRAPHICS-SYSLIB-GDI-CIT-0201
       
  7734 */
       
  7735 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-0201"));
       
  7736 		INFO_PRINTF1(_L("Test CTRL Chars"));
       
  7737 		TestCtrlCharsIgnored();
       
  7738 		break;
       
  7739 	case 3:
       
  7740 /**
       
  7741 @SYMTestCaseID 				GRAPHICS-SYSLIB-GDI-CIT-0202
       
  7742 */
       
  7743 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-0202"));
       
  7744 		INFO_PRINTF1(_L("Test Latin Chars"));
       
  7745 		TestLatinChars();
       
  7746 		break;
       
  7747 	case 4:
       
  7748 /**
       
  7749 @SYMTestCaseID 				GRAPHICS-SYSLIB-GDI-CIT-0203
       
  7750 */
       
  7751 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-0203"));
       
  7752 		INFO_PRINTF1(_L("Test Soft Hypen Char"));
       
  7753 		TestSoftHyphen();
       
  7754 		break;
       
  7755 	case 5:
       
  7756 /**
       
  7757 @SYMTestCaseID 				GRAPHICS-SYSLIB-GDI-CIT-0204
       
  7758 */
       
  7759 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-0204"));
       
  7760 		INFO_PRINTF1(_L("Test Surrogate Pairs"));
       
  7761 		TestSurrogates();
       
  7762 		INFO_PRINTF1(_L("Test Supplementary Chars"));
       
  7763 		TestNonBmpCharsL();
       
  7764 		break;
       
  7765 	case 6:
       
  7766 /**
       
  7767 @SYMTestCaseID 				GRAPHICS-SYSLIB-GDI-CIT-0205
       
  7768 */
       
  7769 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-0205"));
       
  7770 		INFO_PRINTF1(_L("Test Combining Latin Chars"));
       
  7771 		TestCombiningLatinChars();
       
  7772 		break;
       
  7773 	case 7:
       
  7774 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-0221"));
       
  7775 		INFO_PRINTF1(_L("Test Vietnamese Chars"));
       
  7776 		TestVietnameseChars();
       
  7777 		break;
       
  7778 	case 8:
       
  7779 /**
       
  7780 @SYMTestCaseID 				GRAPHICS-SYSLIB-GDI-CIT-0206
       
  7781 */
       
  7782 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-0206"));
       
  7783    		INFO_PRINTF1(_L("Test Vertical/Horizontal Text Bounds"));
       
  7784    		TestTextDirection();
       
  7785    		break;
       
  7786  	case 9:
       
  7787 /**
       
  7788 @SYMTestCaseID 				GRAPHICS-SYSLIB-GDI-CIT-0207
       
  7789 */
       
  7790 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-0207"));
       
  7791    		INFO_PRINTF1(_L("Test All Unicode Characters"));
       
  7792    		TestAllUnicodeChars();
       
  7793    		break;
       
  7794  	case 10:
       
  7795 /**
       
  7796 @SYMTestCaseID 				GRAPHICS-SYSLIB-GDI-CIT-0208
       
  7797 */
       
  7798 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-0208"));
       
  7799    		INFO_PRINTF1(_L("Test Ligatures with Diacritics"));
       
  7800    		TestLigaturesWithDiacritics();
       
  7801    		break;
       
  7802  	case 11:
       
  7803 /**
       
  7804 @SYMTestCaseID 				GRAPHICS-SYSLIB-GDI-CIT-0209
       
  7805 */
       
  7806 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-0209"));
       
  7807  		INFO_PRINTF1(_L("Test CFont::MeasureText()"));
       
  7808  		TestMeasureText();
       
  7809  		break;
       
  7810   	case 12:
       
  7811 /**
       
  7812 @SYMTestCaseID 				GRAPHICS-SYSLIB-GDI-CIT-0210
       
  7813 */
       
  7814 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-0210"));
       
  7815   		INFO_PRINTF1(_L("Test Indic Glyphs"));
       
  7816   		TestIndicCharsL();	
       
  7817 		break;
       
  7818    	case 13:
       
  7819 /**
       
  7820 @SYMTestCaseID 				GRAPHICS-SYSLIB-GDI-CIT-0211
       
  7821 */
       
  7822 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-0211"));
       
  7823   		INFO_PRINTF1(_L("Test Thai Rendering"));
       
  7824    		ExecuteThaiTests();	
       
  7825    		break;
       
  7826    	case 14:
       
  7827 /**
       
  7828 @SYMTestCaseID 				GRAPHICS-SYSLIB-GDI-CIT-0212
       
  7829 */
       
  7830 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-0212"));
       
  7831 		INFO_PRINTF1(_L("Test isolated Combining Latin Chars"));
       
  7832 		TestIsolatedCombiningLatinChars();
       
  7833 		break;
       
  7834    	case 15:
       
  7835 /**
       
  7836 @SYMTestCaseID 				GRAPHICS-SYSLIB-GDI-CIT-0213
       
  7837 */
       
  7838    		INFO_PRINTF1(_L("Test Indic Gurmukhi and Malayalam Chars"));
       
  7839 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-0213"));
       
  7840    		ExecuteIndicGurmukhiMalayalamTests();
       
  7841    		break;
       
  7842    	case 16:
       
  7843 /**
       
  7844 @SYMTestCaseID 				GRAPHICS-SYSLIB-GDI-CIT-0214
       
  7845 */
       
  7846    		INFO_PRINTF1(_L("Test Rendering Context"));
       
  7847 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-0214"));
       
  7848    		TestContextInShapeInfo();
       
  7849    		break;
       
  7850    	case 17:
       
  7851    		TestComplete();
       
  7852 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(KNotATestSYMTestCaseIDName);
       
  7853 		((CTGlyphSelectionStep*)iStep)->CloseTMSGraphicsStep();
       
  7854    		break;	
       
  7855    		}
       
  7856 	((CTGlyphSelectionStep*)iStep)->RecordTestResultL();
       
  7857 	}
       
  7858 
       
  7859 void CTGlyphSelection::TestPerformance()
       
  7860 /**
       
  7861  This method tests the performance of the API under test
       
  7862  by executing a 10000 cycles of each test case.
       
  7863 **/
       
  7864 	{
       
  7865 	TStopWatch profile;
       
  7866 	INFO_PRINTF1(_L("Test Performance..."));
       
  7867 
       
  7868 	profile.Start();
       
  7869 	for (TInt i = 0; i < 10000; i++)
       
  7870 		{
       
  7871 		TestCtrlCharsIgnored();
       
  7872 		TestLatinChars();
       
  7873 		TestSoftHyphen();
       
  7874 		TestSurrogates();
       
  7875 		TestCombiningLatinChars();
       
  7876 		TestTextDirection();
       
  7877 		
       
  7878 		}
       
  7879 	TUint numMilliSecs = profile.Stop();
       
  7880 
       
  7881 	INFO_PRINTF3(_L("Performance test end %d.%d s\n"),numMilliSecs/1000,numMilliSecs%1000);
       
  7882 	}
       
  7883 
       
  7884 
       
  7885 void CTGlyphSelection::TestThai_SimpleChars()
       
  7886 /**
       
  7887  This routine tests individual Thai base characters pumping them 
       
  7888  through the CFont::GetCharacterPosition() API.
       
  7889 */
       
  7890 	{
       
  7891 	TBool r;
       
  7892 	CFont::TPositionParam param;
       
  7893 	param.iDirection = CFont::EHorizontal;
       
  7894 	param.iFlags = CFont::TPositionParam::EFLogicalOrder;
       
  7895 	TBuf<5> testText(0);
       
  7896 	testText.SetLength(1);
       
  7897 	param.iText.Set(testText);
       
  7898 
       
  7899 	for (TUint i=0; Thai_SimpleChars[i] != 0xFFFF; i++)
       
  7900 		{
       
  7901 		testText[0] = Thai_SimpleChars[i];
       
  7902 		param.iPosInText = 0;
       
  7903 		param.iPen.iX = param.iPen.iY = 0;
       
  7904 
       
  7905 		r = iTestFont->GetCharacterPosition(param);
       
  7906 
       
  7907 		TEST(r && param.iPosInText == 1 
       
  7908 			   && param.iPen.iX == 10
       
  7909 			   && param.iOutputGlyphs == 1 
       
  7910 			   && param.iOutput[0].iCode == Thai_SimpleChars[i]);
       
  7911 		}
       
  7912 	}
       
  7913 
       
  7914 
       
  7915 void CTGlyphSelection::TestThai_ValidGlyphClusters()
       
  7916 /**
       
  7917  This routine tests combining sequences of Thai base & mark 
       
  7918  characters pumping them through the CFont::GetCharacterPosition() API.
       
  7919  The sequences mainly test the correct formation of Thay Glyph clusters
       
  7920  and the PUA substutions that take place.
       
  7921 */
       
  7922 	{
       
  7923 	TInt failures=0;
       
  7924 	TBool r;
       
  7925 	CFont::TPositionParam param;
       
  7926 	param.iDirection = CFont::EHorizontal;
       
  7927 	param.iFlags = CFont::TPositionParam::EFLogicalOrder;
       
  7928 
       
  7929 	for (TUint i=0; Thai_ValidGlyphClusters[i].iTextLen != -1; i++)
       
  7930 		{
       
  7931 		TBuf<8> testText(Thai_ValidGlyphClusters[i].iText);
       
  7932 		param.iText.Set(testText);
       
  7933 		param.iPosInText = Thai_ValidGlyphClusters[i].iPosInText;
       
  7934 		param.iPen.iX = param.iPen.iY = 0;
       
  7935 
       
  7936 		r = iTestFont->GetCharacterPosition(param);
       
  7937 
       
  7938 		if (r && param.iPosInText == Thai_ValidGlyphClusters[i].oPosInText
       
  7939 			   && param.iOutputGlyphs == Thai_ValidGlyphClusters[i].oOutputLen)
       
  7940 			{
       
  7941 			for (TInt j=0; j<Thai_ValidGlyphClusters[i].oOutputLen; j++)
       
  7942 				{
       
  7943 				if (param.iOutput[j].iCode != Thai_ValidGlyphClusters[i].oOutput[j])
       
  7944 					{
       
  7945 					INFO_PRINTF4(_L("FAILURE: Glyph code invariance, Complex TEST(%d), %x != %x\n"), i, param.iOutput[j].iCode, Thai_ValidGlyphClusters[i].oOutput[j]);
       
  7946 					failures++;
       
  7947 					break;
       
  7948 					}
       
  7949 				}
       
  7950 			}
       
  7951 		else
       
  7952 			{
       
  7953 			INFO_PRINTF2(_L("FAILURE: Bad output result from GetCharacterPosition, Complex TEST(%d)\n"), i);
       
  7954 			failures++;
       
  7955 			}
       
  7956 		}
       
  7957 
       
  7958 	TEST(failures == 0);
       
  7959 	}
       
  7960 
       
  7961 
       
  7962 void CTGlyphSelection::TestThai_InvalidGlyphClusters()
       
  7963 /**
       
  7964  This routine tests Thai base & mark cluster boundaries to ensure where 
       
  7965  requried the KUnicodeDottedCircle char is used when an invalid sequence is 
       
  7966  processed. Test data from the global Thai_GlyphClusterBoundaries 
       
  7967  variable is pumped through the CFont::GetCharacterPosition() API.
       
  7968 */
       
  7969 	{
       
  7970 	TInt failures=0;
       
  7971 	TBool r;
       
  7972 	CFont::TPositionParam param;
       
  7973 	param.iDirection = CFont::EHorizontal;
       
  7974 	param.iFlags = CFont::TPositionParam::EFLogicalOrder;
       
  7975 
       
  7976 	for (TUint i=0; Thai_GlyphClusterBoundaries[i].iTextLen != -1; i++)
       
  7977 		{
       
  7978 		TBuf<8> testText(Thai_GlyphClusterBoundaries[i].iText);
       
  7979 		param.iText.Set(testText);
       
  7980 
       
  7981 		for (TUint k=0; k<2; k++)
       
  7982 			{
       
  7983 			if (Thai_GlyphClusterBoundaries[i].oOut[k].iPosInText == -1)
       
  7984 				continue;
       
  7985 
       
  7986 			param.iPosInText = Thai_GlyphClusterBoundaries[i].oOut[k].iPosInText;
       
  7987 			param.iPen.iX = param.iPen.iY = 0;
       
  7988 
       
  7989 			r = iTestFont->GetCharacterPosition(param);
       
  7990 
       
  7991 			if (r && param.iPosInText == Thai_GlyphClusterBoundaries[i].oOut[k].oPosInText
       
  7992 				   && param.iOutputGlyphs == Thai_GlyphClusterBoundaries[i].oOut[k].oOutputLen)
       
  7993 				{
       
  7994 				for (TInt j=0; j<Thai_GlyphClusterBoundaries[i].oOut[k].oOutputLen; j++)
       
  7995 					{
       
  7996 					if (!(param.iOutput[j].iCode == Thai_GlyphClusterBoundaries[i].oOut[k].oOutput[j]))
       
  7997 						{
       
  7998 						INFO_PRINTF5(_L("FAILURE: Glyph code invariance, Complex TEST(%d,%d), %x != %x\n"), i, k, param.iOutput[j].iCode, Thai_GlyphClusterBoundaries[i].oOut[k].oOutput[j]);
       
  7999 						failures++;
       
  8000 						break;
       
  8001 						}
       
  8002 					}
       
  8003 				}
       
  8004 			else
       
  8005 				{
       
  8006 				INFO_PRINTF3(_L("FAILURE: Bad output result from GetCharacterPosition, Complex TEST(%d,%d)\n"), i, k);
       
  8007 				failures++;
       
  8008 				}
       
  8009 
       
  8010 			}
       
  8011 		}
       
  8012 
       
  8013 	if (failures)
       
  8014 		RDebug::Print(_L("TOTAL FAILURES: %d\n"), failures);
       
  8015 	TEST(failures == 0);
       
  8016 	}
       
  8017 
       
  8018 /**
       
  8019 @SYMTestCaseID          GRAPHICS-SYSLIB-GDI-CT-4062
       
  8020 @SYMTestCaseDesc        Tests that a punctuation character following the special-case
       
  8021                         character Thai SaraAm is rendered as a punctuation, not
       
  8022                         another SaraAm character.
       
  8023 @SYMTestPriority        High
       
  8024 @SYMTestActions         Compare input string and corresponding output glyph codes
       
  8025 @SYMTestExpectedResults In this case, the string and the codes should match.
       
  8026 @SYMDEF                 INC118424
       
  8027 */
       
  8028 void CTGlyphSelection::TestThai_INC118424()
       
  8029 	{
       
  8030 	CFont::TPositionParam param;
       
  8031 	param.iDirection = CFont::EHorizontal;
       
  8032 	param.iFlags = CFont::TPositionParam::EFLogicalOrder;
       
  8033 	
       
  8034 	//punctuation after SaraAm
       
  8035 	TestGlyphs(iTestFont,param,_L("\xE04\xE33:\?>"),_L("\xE04\xE33:\?>"));
       
  8036 	}
       
  8037 
       
  8038 /**
       
  8039  This fuction tests Indic Gurmukhi and Malayalam support
       
  8040 */
       
  8041 void CTGlyphSelection::ExecuteIndicGurmukhiMalayalamTests()
       
  8042 	{
       
  8043 	// create a font store for testing
       
  8044 	CFontStore* fontStore = CFontStore::NewL(&User::Heap());
       
  8045 	
       
  8046 	//load all ecom implemented rasterizer dlls. installs the rasterizer.	
       
  8047 	LoadOpenFontLibraries(fontStore);
       
  8048 		// test font preparation
       
  8049 	fontStore->iKPixelWidthInTwips = 11860; //This value is default
       
  8050 
       
  8051 	//add any required font files
       
  8052 	TUid err1 = fontStore->AddFileL(KTestIndicFontFile);
       
  8053 
       
  8054 	TFontSpec testIndicFontSpec(KTestIndicFontFaceName,200);
       
  8055 	 
       
  8056 	CFbsBitmap* bmp = new(ELeave) CFbsBitmap;
       
  8057 	
       
  8058 	TInt ret = bmp->Create(TSize(100,100),EGray2);
       
  8059 	if (ret == KErrNotSupported)
       
  8060 		return;
       
  8061 	else
       
  8062 		User::LeaveIfError(ret);
       
  8063 
       
  8064 	CFbsBitmapDevice* device = NULL;
       
  8065 	TRAPD(err2,device = CFbsBitmapDevice::NewL(bmp));
       
  8066 	TEST(err2 == KErrNone);
       
  8067 
       
  8068 	CFbsBitGc* gc = NULL;
       
  8069 	User::LeaveIfError(device->CreateContext(gc));
       
  8070 	
       
  8071 	// Font file Creation
       
  8072 	CFbsFont* indicFont = NULL;
       
  8073 	User::LeaveIfError(device->GetNearestFontToDesignHeightInTwips(indicFont,testIndicFontSpec));
       
  8074 	gc->UseFont(indicFont);
       
  8075 	CleanupStack::PushL(indicFont);
       
  8076 	
       
  8077 	//Testcode for Kannada, Marathi,Gujarati,Bengali language
       
  8078 	// Test Indic Gurmukhi digit.
       
  8079 	TInt err;
       
  8080 	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
       
  8081     	if (err!=KErrNone)
       
  8082     		INFO_PRINTF1(_L("Failed to record test result"));
       
  8083 	INFO_PRINTF1(_L("Test Indic Gurmukhi digits"));
       
  8084 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-TI18N-GDI-CIT-4063"));
       
  8085 	TestGurmukhiDigit( *indicFont );
       
  8086 	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
       
  8087     	if (err!=KErrNone)
       
  8088     		INFO_PRINTF1(_L("Failed to record test result"));
       
  8089 	INFO_PRINTF1(_L("Test Indic Gurmukhi and Latin"));
       
  8090 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-TI18N-GDI-CIT-4064"));
       
  8091 	TestGurmukhiAndLatin( *indicFont );
       
  8092 	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
       
  8093     	if (err!=KErrNone)
       
  8094     		INFO_PRINTF1(_L("Failed to record test result"));
       
  8095 	INFO_PRINTF1(_L("Test Indic DEF102858 on Gurmukhi"));
       
  8096 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-TI18N-GDI-CIT-4065"));
       
  8097 	TestGurmukhiModifierAfterConsonantViramaZWJ( *indicFont );
       
  8098 	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
       
  8099     	if (err!=KErrNone)
       
  8100     		INFO_PRINTF1(_L("Failed to record test result"));
       
  8101 	INFO_PRINTF1(_L("Test Indic Gurmukhi consonant leading"));
       
  8102 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-TI18N-GDI-CIT-4066"));
       
  8103 	TestGurmukhiWithConsonantInitial( *indicFont );
       
  8104 	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
       
  8105     	if (err!=KErrNone)
       
  8106     		INFO_PRINTF1(_L("Failed to record test result"));
       
  8107 	INFO_PRINTF1(_L("Test Indic Gurmukhi vowel leading"));
       
  8108 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-TI18N-GDI-CIT-4068"));
       
  8109 	TestGurmukhiWithVowelInitial( *indicFont );
       
  8110 	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
       
  8111     	if (err!=KErrNone)
       
  8112     		INFO_PRINTF1(_L("Failed to record test result"));
       
  8113 	INFO_PRINTF1(_L("Test Indic Malayalam digits"));
       
  8114 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-TI18N-GDI-CIT-4067"));
       
  8115 	TestMalayalamDigit( *indicFont );
       
  8116 	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
       
  8117     	if (err!=KErrNone)
       
  8118     		INFO_PRINTF1(_L("Failed to record test result"));
       
  8119 	INFO_PRINTF1(_L("Test Indic Malayalam and Latin"));
       
  8120 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-TI18N-GDI-CIT-4069"));
       
  8121 	TestMalayalamAndLatin( *indicFont );
       
  8122 	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
       
  8123     	if (err!=KErrNone)
       
  8124     		INFO_PRINTF1(_L("Failed to record test result"));
       
  8125 	INFO_PRINTF1(_L("Test Indic DEF102858 on Malayalam"));
       
  8126 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-TI18N-GDI-CIT-4070"));
       
  8127 	TestMalayalamModifierAfterConsonantViramaZWJ( *indicFont );
       
  8128 	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
       
  8129     	if (err!=KErrNone)
       
  8130     		INFO_PRINTF1(_L("Failed to record test result"));
       
  8131 	INFO_PRINTF1(_L("Test Indic Malayalam consonant leading"));
       
  8132 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-TI18N-GDI-CIT-4071"));
       
  8133 	TestMalayalamWithConsonantInitial( *indicFont );
       
  8134 	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
       
  8135     	if (err!=KErrNone)
       
  8136     		INFO_PRINTF1(_L("Failed to record test result"));
       
  8137 	INFO_PRINTF1(_L("Test Indic Malayalam vowel leading"));
       
  8138 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-TI18N-GDI-CIT-4072"));
       
  8139 	TestMalayalamWithVowelInitial( *indicFont );
       
  8140 	CleanupStack::Pop(indicFont);
       
  8141 			
       
  8142 	//Cleaning the memory
       
  8143 	delete bmp;
       
  8144 	delete device;
       
  8145 	delete gc;
       
  8146 	fontStore->RemoveFile(err1);
       
  8147 	delete fontStore;
       
  8148 	REComSession::FinalClose();
       
  8149 	}
       
  8150 /**
       
  8151  This function tests the Thai Font Rendering feature of the CFont class
       
  8152  in the GDI.dll and in particular the modifications made to 
       
  8153  CFont::GetCharacterPosition() to support the Unicocde Thai code page.
       
  8154  First introduced during the Sirocco project (A3.1.1)
       
  8155 @SYMFssID Graphics/GDI/GDI/1
       
  8156 @SYMFssID Graphics/GDI/GDI/2
       
  8157 */
       
  8158 
       
  8159 void CTGlyphSelection::ExecuteThaiTests()
       
  8160 	{
       
  8161 	// Test individual Thai digits, letters and sign characters.
       
  8162 	INFO_PRINTF1(_L("Test Thai simple charecters"));
       
  8163 	TestThai_SimpleChars();
       
  8164 
       
  8165 	// Test complex Thai char sequences.
       
  8166 	INFO_PRINTF1(_L("Test valid Thai glyph clusters"));
       
  8167 	TestThai_ValidGlyphClusters();
       
  8168 
       
  8169 	// Test Thai glyph cluster boundaries.
       
  8170 	INFO_PRINTF1(_L("Test invalid Thai glyph clusters"));
       
  8171 	TestThai_InvalidGlyphClusters();
       
  8172 
       
  8173 	// Test Thai SaraAm-punctuation exception.
       
  8174 	INFO_PRINTF1(_L("Test fix for INC118424"));
       
  8175 	TestThai_INC118424();
       
  8176 	}
       
  8177 
       
  8178 
       
  8179 /*  
       
  8180  * Note:
       
  8181  *       This is just a easy way to help generate the test data info
       
  8182  *       Any new added test data should do manually check firstly to check the correction before using this function
       
  8183  */
       
  8184 // #define GEN_GURMUKHIMALAYALAMTESTDATA
       
  8185 void CTGlyphSelection::GenerateGurmukhiMalayalamData( const TDesC& filename, const TTestInput_PositionParam6* testArray, const CFbsFont& aFont )
       
  8186     {
       
  8187     RFile file;
       
  8188     file.Replace( iFs, filename, EFileWrite );
       
  8189     
       
  8190     CFont::TPositionParam param;
       
  8191     param.iDirection = CFont::EHorizontal;
       
  8192     param.iFlags = CFont::TPositionParam::EFLogicalOrder;
       
  8193     RShapeInfo shapeInfo;
       
  8194 
       
  8195     if (!testArray)
       
  8196         {
       
  8197         return;
       
  8198         }
       
  8199 
       
  8200     for (TUint i = 0; testArray[i].iTextLen != -1; i++)
       
  8201         {
       
  8202         TTestInput_PositionParam6 currentArray = testArray[i];
       
  8203         TBuf<8> testText(testArray[i].iText);
       
  8204         param.iText.Set(testText);
       
  8205         
       
  8206         TBuf8<256> datatext;
       
  8207         datatext.SetLength(0);
       
  8208         //{ 1, {0x0a66}, { {0, 1, 1, {0x12fe} }, {-1, 1, 1, {0} } } },
       
  8209         datatext.Format(_L8("{ %d, {"), testArray[i].iTextLen);  // 1, 
       
  8210         
       
  8211         for (TUint i = 0; i<testText.Length(); i++)
       
  8212             {
       
  8213             TBuf8<8> tmp;
       
  8214             tmp.Format(_L8("0x%x, "), currentArray.iText[i]); // {0x0a66},
       
  8215             datatext.Append(tmp);
       
  8216             }
       
  8217         datatext = datatext.Left(datatext.Length()-2);
       
  8218         datatext.Append(_L8("}, { "));
       
  8219 
       
  8220         if (shapeInfo.IsOpen())
       
  8221             shapeInfo.Close();
       
  8222 
       
  8223         for (TUint k = 0; k < 6; k++)
       
  8224             {
       
  8225             param.iPosInText = k;
       
  8226             param.iPen.iX = param.iPen.iY = 0;
       
  8227             TBool ret = aFont.GetCharacterPosition2(param, shapeInfo);
       
  8228             if (0 == param.iOutputGlyphs)
       
  8229                 continue;
       
  8230             
       
  8231             TBuf8<16> tmp;
       
  8232             tmp.Format(_L8("{%d, %d, %d, {"), k, param.iPosInText, param.iOutputGlyphs);
       
  8233             datatext.Append(tmp);
       
  8234             
       
  8235             for (TInt j = 0; j < param.iOutputGlyphs; j++)
       
  8236                 {
       
  8237                 TText16 aCode = param.iOutput[j].iCode;
       
  8238                 TBuf8<128> tmp;
       
  8239                 tmp.Format(_L8("0x%x, "), aCode);
       
  8240                 datatext.Append(tmp);
       
  8241                 } //end for
       
  8242             datatext = datatext.Left(datatext.Length()-2);
       
  8243             datatext.Append(_L8("}}, "));
       
  8244             } //end for
       
  8245         datatext.Append(_L8(" {-1, 1, 1, {0}} } }, \n"));
       
  8246         
       
  8247         file.Write(datatext);
       
  8248         } //end for
       
  8249     
       
  8250     file.Close();
       
  8251     return;
       
  8252     }
       
  8253 
       
  8254 void CTGlyphSelection::DoEachGurmukhiMalayalamCase( const TTestInput_PositionParam6* testArray, const CFbsFont& aFont )
       
  8255 	{
       
  8256 	TInt failures=0;
       
  8257 	TBool r;
       
  8258 	CFont::TPositionParam param;
       
  8259 	param.iDirection = CFont::EHorizontal;
       
  8260 	param.iFlags = CFont::TPositionParam::EFLogicalOrder;
       
  8261 	RShapeInfo shapeInfo;
       
  8262 	
       
  8263 	if ( !testArray )
       
  8264 		{
       
  8265 		return;
       
  8266 		}
       
  8267 	
       
  8268 	for (TUint i=0; testArray[i].iTextLen != -1; i++)
       
  8269 		{
       
  8270 		TBuf<8> testText(testArray[i].iText);
       
  8271 		param.iText.Set(testText);
       
  8272 		if(shapeInfo.IsOpen())
       
  8273 		    shapeInfo.Close();
       
  8274 		
       
  8275 		for (TUint k=0; k<6; k++)
       
  8276 			{
       
  8277 			//	If it's end of sequence
       
  8278 			if ( testArray[i].oOut[k].iPosInText == -1)
       
  8279 				break;
       
  8280 	
       
  8281 			param.iPosInText = testArray[i].oOut[k].iPosInText;
       
  8282 			param.iPen.iX = param.iPen.iY = 0;
       
  8283 	
       
  8284 			r = aFont.GetCharacterPosition2(param, shapeInfo);
       
  8285 			
       
  8286 			if (r && param.iPosInText == testArray[i].oOut[k].oPosInText
       
  8287 				   && param.iOutputGlyphs == testArray[i].oOut[k].oOutputLen)
       
  8288 				{
       
  8289 				for (TInt j=0; j<testArray[i].oOut[k].oOutputLen; j++)
       
  8290 					{
       
  8291 					//	Trim off the highest bit
       
  8292 					TText16 aCode = param.iOutput[j].iCode;
       
  8293 					if (!( aCode == testArray[i].oOut[k].oOutput[j]))
       
  8294 						{
       
  8295 						INFO_PRINTF5(_L("FAILURE: Glyph code invariance, Complex TEST(%d,%d), %x != %x\n"), i, k, param.iOutput[j].iCode, testArray[i].oOut[k].oOutput[j]);
       
  8296 						failures++;
       
  8297 						break;
       
  8298 						}
       
  8299 					}
       
  8300 				}
       
  8301 			else
       
  8302 				{
       
  8303 				INFO_PRINTF4(_L("FAILURE: Bad output result from GetCharacterPosition, Complex TEST(%d,%d,%d)\n"), i, k, param.iOutputGlyphs);
       
  8304 				failures++;
       
  8305 				}
       
  8306 	
       
  8307 			}
       
  8308 		}
       
  8309 	
       
  8310 	if (failures)
       
  8311 		RDebug::Print(_L("TOTAL FAILURES: %d\n"), failures);
       
  8312 	TEST(failures == 0);
       
  8313 	}
       
  8314 /**
       
  8315 @SYMTestCaseID          GRAPHICS-TI18N-GDI-CIT-4063
       
  8316 @SYMTestCaseDesc        Case to check Gurmukhi digit support
       
  8317 @SYMTestPriority        High
       
  8318 @SYMTestActions         Call to CFont::GetCharacterPosition2/CFont::MeasureText to check the following
       
  8319 						1.Pass Gurmukhi digit (0xa66 ~ 0x0a6f) sequence
       
  8320 						2.Pass any Consonant + Gurmukhi digit sequence 
       
  8321 						3.Pass any Consonant + Gurmukhi digit + Matra sequence
       
  8322 						4.Repetitive callss with Unicode sequence from the first 3 action items 
       
  8323 						5.Pass Modifer + digit sequence
       
  8324 						6.Pass Vowel and digit sequence
       
  8325 						7.Pass Virama and digit sequence 
       
  8326 @SYMTestExpectedResults 1.Glyph count, character count for digit is 1 for each digit, and glyph indices depends on font
       
  8327 						2.Digit is recognized as a separate syllable
       
  8328 						3.Matra and digit is not combined together
       
  8329 						4.The shaper returned the same result as first 3 results
       
  8330 						5.digit is recognized, and not combined with Modifier
       
  8331 						6.digit is recognized, and not combined with Vowel.
       
  8332 						7.digit is recognized, and not combined with Virama.
       
  8333 @SYMPREQ 1922: Gurmukhi support
       
  8334 */
       
  8335 void CTGlyphSelection::TestGurmukhiDigit( const CFbsFont& aFont )
       
  8336 	{
       
  8337 	DoEachGurmukhiMalayalamCase( (TTestInput_PositionParam6*)Indic_GurmukhiDigit, aFont );
       
  8338 	
       
  8339 #ifdef GEN_GURMUKHIMALAYALAMTESTDATA
       
  8340 	_LIT(KValidFontPath, "c:\\GurmukhiDigit.txt");
       
  8341 	GenerateGurmukhiMalayalamData(KValidFontPath, (TTestInput_PositionParam6*)Indic_GurmukhiDigit, aFont );
       
  8342 #endif
       
  8343 	}
       
  8344 
       
  8345 /**
       
  8346 @SYMTestCaseID          GRAPHICS-TI18N-GDI-CIT-4064
       
  8347 @SYMTestCaseDesc        case to check if shaper can render Gurmukhi with other implemented Indic scripts and Latin
       
  8348 @SYMTestPriority        High
       
  8349 @SYMTestActions         Call to CFont::GetCharacterPosition2/CFont::MeasureText to check the following
       
  8350 						1.Pass Gurmukhi sentence and Latin to the function
       
  8351 						2.Pass Latin and Gurmukhi setence.
       
  8352 						3.Pass syllable, Latin and syllable
       
  8353 						4.Pass phoneme, Latin and phoneme
       
  8354 						5.Pass Gurmukhi syllable and other Indic scripts together.
       
  8355 						6.Pass Gurmukhi phoneme and other Indic script phoneme
       
  8356 @SYMTestExpectedResults Gurumuki and Latin characters donĄ¯t mess up. Gurmukhi phoneme doesnĄ¯t combine with Latin into a new syllable, 
       
  8357 						Gurmukhi phoneme doesnĄ¯t form a syllable with other Indic script.
       
  8358 @SYMPREQ 1922: Gurmukhi support
       
  8359 */
       
  8360 void CTGlyphSelection::TestGurmukhiAndLatin( const CFbsFont& aFont )
       
  8361 	{
       
  8362 	DoEachGurmukhiMalayalamCase( (TTestInput_PositionParam6*)Indic_GurmukhiAndLatin, aFont );
       
  8363 
       
  8364 #ifdef GEN_GURMUKHIMALAYALAMTESTDATA
       
  8365     _LIT(KValidFontPath, "c:\\GurmukhiAndLatin.txt");
       
  8366     GenerateGurmukhiMalayalamData(KValidFontPath, (TTestInput_PositionParam6*)Indic_GurmukhiDigit, aFont );
       
  8367 #endif
       
  8368 	}
       
  8369 
       
  8370 /**
       
  8371 @SYMTestCaseID          GRAPHICS-TI18N-GDI-CIT-4065
       
  8372 @SYMTestCaseDesc        case to check Gurmukhi modifier after Consonant, Virama, ZWJ
       
  8373 @SYMTestPriority        High
       
  8374 @SYMTestActions         Call to CFont::GetCharacterPosition2/CFont::MeasureText to check the following
       
  8375 						1.Pass Consonant + Virama + ZWJ + Modifier
       
  8376 @SYMTestExpectedResults Modifier is part of the syllable.
       
  8377 @SYMPREQ 1922: Gurmukhi support, make sure DEF102858 fixing does not cause side effect
       
  8378 */
       
  8379 void CTGlyphSelection::TestGurmukhiModifierAfterConsonantViramaZWJ( const CFbsFont& aFont )
       
  8380 	{
       
  8381 	DoEachGurmukhiMalayalamCase( (TTestInput_PositionParam6*)Indic_GurmukhiModifierAfterConsonantViramaZWJ, aFont );
       
  8382 	
       
  8383 #ifdef GEN_GURMUKHIMALAYALAMTESTDATA
       
  8384     _LIT(KValidFontPath, "c:\\GurmukhiModifierAfterConsonantViramaZWJ.txt");
       
  8385     GenerateGurmukhiMalayalamData(KValidFontPath, (TTestInput_PositionParam6*)Indic_GurmukhiDigit, aFont );
       
  8386 #endif
       
  8387 	}
       
  8388 
       
  8389 /**
       
  8390 @SYMTestCaseID          GRAPHICS-TI18N-GDI-CIT-4066
       
  8391 @SYMTestCaseDesc        case to check syllable with consonant in initial position
       
  8392 @SYMTestPriority        High
       
  8393 @SYMTestActions         Call to CFont::GetCharacterPosition2/CFont::MeasureText to check the following using data from above requirements, each requirement above gives a consonant leading Unicode sequence. Each sequence falls into one of the following structure, then pass it to the calling.
       
  8394 						1.Pass  consonant and Nukta sequence
       
  8395 						2.Pass two consonant and dependent vowel sequences to shaper, save both returned results. The consonant is first sequence is difference with that of the second sequence..
       
  8396 						3.Pass consonant and matra /i/ t sequence 
       
  8397 						4.Pass the following Consonant, Virama and HA sequence 
       
  8398 						  Another sequence:  Consonant , Virama and RA
       
  8399 						  Another sequence:  Consonant, Virama and VA
       
  8400 						  Another sequence:  Consonant, Virama and YA
       
  8401 						5.Pass Consonant  and Addak sequence to shaper 
       
  8402 						  Pass Consonant, Addak and Consonant to shaper
       
  8403 						6.Pass Consonant and BINDI sequence:  
       
  8404 						  Sequence1:Consonant and BINDI,
       
  8405 						  Sequence2: Consonant, dependent vowel which is shown to the right of base consonant and BINDI,
       
  8406 						  Sequence3: Consonant, dependent vowel which is shown to the top of the base consonant and BINDI
       
  8407 						  Pass Consonant and TIPPI sequence:
       
  8408 						  Sequence1: Consonant and TIPPI, 
       
  8409 						  Sequence2: Consonant, dependent vowel which is shown to the left of the base consonant and TIPPI.
       
  8410 						  Sequence3: Consonant, dependent vowel which is shown to the bottom of the base consonant and TIPPI.
       
  8411 						7.Pass Nukta, equavalent consonant, Nukta sequence to shaper sepeartely, save both result
       
  8412 @SYMTestExpectedResults 1.nukta is combined to the base consonant according to the returned shape info
       
  8413 						2.The matra position is different between two ShapeText calls according to the returned shaped info.
       
  8414 						3.matra /i/ is combined to the left of the base consonant in position
       
  8415 						4.HA, RA, VA is on bottom of the base consonant and subscripted, YA in final form according to the returned shape info.
       
  8416 						5.Addak is on top of consonant, addak belongs to the consonant precedes it.
       
  8417 						6.BINDI is on top,  TIPPI is on bottom
       
  8418 						7.The combinationĄ¯s character count, glyph count, glyph indices info is the same as  the single nuktaĄ¯s
       
  8419 @SYMPREQ 1922: Gurmukhi support
       
  8420 */
       
  8421 void CTGlyphSelection::TestGurmukhiWithConsonantInitial( const CFbsFont& aFont )
       
  8422 	{
       
  8423 	DoEachGurmukhiMalayalamCase( (TTestInput_PositionParam6*)Indic_GurmukhiConsonantLeading, aFont );
       
  8424 	
       
  8425 #ifdef GEN_GURMUKHIMALAYALAMTESTDATA
       
  8426     _LIT(KValidFontPath, "c:\\GurmukhiWithConsonantInitial.txt");
       
  8427     GenerateGurmukhiMalayalamData(KValidFontPath, (TTestInput_PositionParam6*)Indic_GurmukhiDigit, aFont );
       
  8428 #endif
       
  8429 	}
       
  8430 
       
  8431 
       
  8432 /**
       
  8433 @SYMTestCaseID          GRAPHICS-TI18N-GDI-CIT-4067
       
  8434 @SYMTestCaseDesc        Case to check Malayalam digit support
       
  8435 @SYMTestPriority        High
       
  8436 @SYMTestActions         Call to CFont::GetCharacterPosition2/CFont::MeasureText to check the following
       
  8437 						1.Pass Malayalam digit (0xd66 ~ 0x0d6f) sequence
       
  8438 						2.Pass any Consonant + Malayalam digit sequence 
       
  8439 						3.Pass any Consonant + Malayalam digit + Matra sequence
       
  8440 						4.Repetitive callss with Unicode sequence from the first 3 action items 
       
  8441 						5.Pass Modifer + digit sequence
       
  8442 						6.Pass Vowel and digit sequence
       
  8443 						7.Pass Virama and digit sequence 
       
  8444 @SYMTestExpectedResults 1.Glyph count, character count for digit is 1 for each digit, and glyph indices depends on font
       
  8445 						2.Digit is recognized as a separate syllable
       
  8446 						3.Matra and digit is not combined together
       
  8447 						4.The shaper returned the same result as first 3 results
       
  8448 						5.digit is recognized, and not combined with Modifier
       
  8449 						6.digit is recognized, and not combined with Vowel.
       
  8450 						7.digit is recognized, and not combined with Virama.
       
  8451 @SYMPREQ 1922: Malayalam support
       
  8452 */
       
  8453 void CTGlyphSelection::TestMalayalamDigit( const CFbsFont& aFont )
       
  8454 	{
       
  8455 	DoEachGurmukhiMalayalamCase( (TTestInput_PositionParam6*)Indic_MalayalamDigit, aFont );
       
  8456 	
       
  8457 #ifdef GEN_GURMUKHIMALAYALAMTESTDATA
       
  8458     _LIT(KValidFontPath, "c:\\MalayalamDigit.txt");
       
  8459     GenerateGurmukhiMalayalamData(KValidFontPath, (TTestInput_PositionParam6*)Indic_GurmukhiDigit, aFont );
       
  8460 #endif	
       
  8461 	}
       
  8462 
       
  8463 /**
       
  8464 @SYMTestCaseID          GRAPHICS-TI18N-GDI-CIT-4068
       
  8465 @SYMTestCaseDesc        case to check syllable with vowel in initial position
       
  8466 @SYMTestPriority        High
       
  8467 @SYMTestActions         Call to CFont::GetCharacterPosition2/CFont::MeasureText to check the following using data from above requirements, 
       
  8468 						each requirement above gives a vowel leading Unicode sequence. Each sequence falls into one of the following structure, 
       
  8469 						then pass it to the calling.
       
  8470 						1.Pass ARA, IRI to shaper, pass URA sequence
       
  8471 						2.Pass valid bearer  and vowel pair sequence
       
  8472 						  Pass invalid bearer and vowel pair sequence
       
  8473 @SYMTestExpectedResults 1.ARA character count is 1, IRI, URA character count is 0
       
  8474 						2.valid combination is combined together, invalid is not combined together
       
  8475 @SYMPREQ 1922: Gurmukhi support
       
  8476 */
       
  8477 void CTGlyphSelection::TestGurmukhiWithVowelInitial( const CFbsFont& aFont )
       
  8478 	{
       
  8479 	DoEachGurmukhiMalayalamCase( (TTestInput_PositionParam6*)Indic_GurmukhiVowelLeading, aFont );
       
  8480 	
       
  8481 #ifdef GEN_GURMUKHIMALAYALAMTESTDATA
       
  8482     _LIT(KValidFontPath, "c:\\GurmukhiWithVowelInitial.txt");
       
  8483     GenerateGurmukhiMalayalamData(KValidFontPath, (TTestInput_PositionParam6*)Indic_GurmukhiDigit, aFont );
       
  8484 #endif  
       
  8485 	}
       
  8486 
       
  8487 /**
       
  8488 @SYMTestCaseID          GRAPHICS-TI18N-GDI-CIT-4069
       
  8489 @SYMTestCaseDesc        case to check if shaper can render Malayalam with other implemented Indic scripts and Latin
       
  8490 @SYMTestPriority        High
       
  8491 @SYMTestActions         Call to CFont::GetCharacterPosition2/CFont::MeasureText to check the following
       
  8492 						1.Pass Malayalam sentence and Latin to the function
       
  8493 						2.Pass Latin and Gurmukhi setence.
       
  8494 						3.Pass syllable, Latin and syllable
       
  8495 						4.Pass phoneme, Latin and phoneme
       
  8496 						5.Pass Malayalam syllable and other Indic scripts together.
       
  8497 						6.Pass Malayalam phoneme and other Indic script phoneme
       
  8498 @SYMTestExpectedResults Malayalam and Latin characters donĄ¯t mess up. Malayalam phoneme doesnĄ¯t combine with Latin into a new syllable, 
       
  8499 						Malayalam phoneme doesnĄ¯t form a syllable with other Indic script.
       
  8500 @SYMPREQ 1922: Malayalam support
       
  8501 */
       
  8502 void CTGlyphSelection::TestMalayalamAndLatin( const CFbsFont& aFont )
       
  8503 	{
       
  8504 	DoEachGurmukhiMalayalamCase( (TTestInput_PositionParam6*)Indic_MalayalamAndLatin, aFont );
       
  8505 	
       
  8506 #ifdef GEN_GURMUKHIMALAYALAMTESTDATA
       
  8507     _LIT(KValidFontPath, "c:\\MalayalamAndLatin.txt");
       
  8508     GenerateGurmukhiMalayalamData(KValidFontPath, (TTestInput_PositionParam6*)Indic_GurmukhiDigit, aFont );
       
  8509 #endif  
       
  8510 	}
       
  8511 
       
  8512 /**
       
  8513 @SYMTestCaseID          GRAPHICS-TI18N-GDI-CIT-4070
       
  8514 @SYMTestCaseDesc        case to check  Malayalam modifier after Consonant, Virama, ZWJ
       
  8515 @SYMTestPriority        High
       
  8516 @SYMTestActions         Call to CFont::GetCharacterPosition2/CFont::MeasureText to check the following
       
  8517 						1. Pass Consonant + Virama + ZWJ + Modifier
       
  8518 @SYMTestExpectedResults Modifier is part of the syllable.
       
  8519 @SYMPREQ 1922: Malayalam support, make sure DEF102858 fixing does not cause side effect 
       
  8520 */
       
  8521 void CTGlyphSelection::TestMalayalamModifierAfterConsonantViramaZWJ( const CFbsFont& aFont )
       
  8522 	{
       
  8523 	DoEachGurmukhiMalayalamCase( (TTestInput_PositionParam6*)Indic_MalayalamModifierAfterConsonantViramaZWJ, aFont );
       
  8524 	
       
  8525 #ifdef GEN_GURMUKHIMALAYALAMTESTDATA
       
  8526     _LIT(KValidFontPath, "c:\\MalayalamModifierAfterConsonantViramaZWJ.txt");
       
  8527     GenerateGurmukhiMalayalamData(KValidFontPath, (TTestInput_PositionParam6*)Indic_GurmukhiDigit, aFont );
       
  8528 #endif  
       
  8529 	}
       
  8530 
       
  8531 /**
       
  8532 @SYMTestCaseID          GRAPHICS-TI18N-GDI-CIT-4071
       
  8533 @SYMTestCaseDesc        case to check syllable with consonant in initial position
       
  8534 @SYMTestPriority        High
       
  8535 @SYMTestActions         Call to CFont::GetCharacterPosition2/CFont::MeasureText to check the following using data from above requirements, 
       
  8536 						each requirement above gives a consonant leading Unicode sequence. Each sequence falls into one of the following structure, 
       
  8537 						then pass it to the calling.
       
  8538 						1.Pass consonant + vowel single code, and  consonant + its split representation to shaper
       
  8539 						  The following Single representation /Split representation is passed to shaper
       
  8540 						  0x0d14/0x0d12 + 0x0d57, 0x0d4a/0x0d46 + 0x0d3e, 0x0d4b/0x0d47 + 0x0d3e
       
  8541 						  0x0d4c/0x0d46 + 0x0d57
       
  8542 						2.Pass two Consonant and dependent Vowel sequences to shaper, save both returned results. 
       
  8543 						  The Consonant is first sequence is difference with that of the second sequence, and the dependent Vowel is identical.
       
  8544 						3.Pass Consonant and Matras /-e/, /-ee/, /-ai/ to shaper. 
       
  8545 						4.Pass Consonant and Matras /-o/, /-oo/, /-au/ to shaper
       
  8546 						  Pass Consonant and 0x0d4c (first form of Matra /-au/ ) to shaper,
       
  8547 						  Pass Consonant, 0x0d46 and 0x0d57 (second form of Matra /-au/) to shaper002E
       
  8548 						5.Pass Consonant + 0x0d4d + Consonant to shaper
       
  8549 						  Pass Consonant + Virama + Consonant + 0x0d4d to shaper
       
  8550 						6.Pass Consonant (NNA, NA, RA, LA, LLA) + Virama + ZWJ to shaper
       
  8551 						  Pass KA + Virama + ZWJ to shaper.
       
  8552 						  Pass other Consonant + Virama + ZWJ to shaper.
       
  8553 						7.Pass RA + Virama + ZWJ to shaper,
       
  8554 						  Pass RRA + Viram + ZWJ to shaper.
       
  8555 						8.Pass Chillu ( one of 6 special consontants + Virama + ZWJ) and Vowel to shaper
       
  8556 						  Pass Chillu and Modifier to shaper
       
  8557 						  Pass Chillu and Virama to shaper
       
  8558 						9.Pass one of (KA, GA, PA, BA, MA, LA, SHA, SA, HA), Virama and LA to shaper
       
  8559 						10.Pass CA, Virama and CA to shaper
       
  8560 						   Pass BA, Virama and BA to shaper
       
  8561 						   Pass YA, Virama and YA to shaper
       
  8562 						   Pass VA, Virama and VA to shaper
       
  8563 						   PASS other Consonant, Virama and the same Consonant to shaper.
       
  8564 						11.Pass G.GA, C.CHA, K.TTA, SS.TTA, DD.DDA, NN.NNA, B.DA, B.DHA, P.PA, RR.RRA, SH.SHA, S.SA clusters to shaper.
       
  8565 						12.Pass Consonant clusters from REQ1.3.11 to shaper.
       
  8566 						13.Pass S.RR.RRA to shaper,
       
  8567 						   Pass N.RR.RRA to shaper
       
  8568 @SYMTestExpectedResults 1.First sequence is equivalent to the second sequence 
       
  8569 						2.The dependent vowel position is different between the two sequence
       
  8570 						3.The visual position of the Matras is different with the logical order (The same as Keyboard input order).
       
  8571 						4.The Matra is split into halves from visual effect. And the second form of Matra /-au/ is recognized the same as the first form of it.
       
  8572 						5.0x0d4d is recognized as a Virama in first sequence, itĄ¯s recognized as MATRA (mid-u sound) in the second sequence
       
  8573 						6.Virama and ZWJ is interpreted as Chillaksharam for the 6 consonants, for others itĄ¯s not interpreted that way.
       
  8574 						7.Both sequences will interprete RA Chillu.
       
  8575 						8.The combining character should not combine with Chillu.
       
  8576 						9.LA takes subscript shape.
       
  8577 						10.CA, BA, YA, VA double should result in a ligature, other consonants donĄ¯t.
       
  8578 						11.The latter consonant in the cluster becomes a miniature subscript.
       
  8579 						12.sequence forms a ligature.
       
  8580 						13.sequence forms a ligature
       
  8581 @SYMPREQ 1922: Malayalam support
       
  8582 */
       
  8583 void CTGlyphSelection::TestMalayalamWithConsonantInitial( const CFbsFont& aFont )
       
  8584 	{
       
  8585 	DoEachGurmukhiMalayalamCase( (TTestInput_PositionParam6*)Indic_MalayalamConsonantLeading, aFont );
       
  8586 	
       
  8587 #ifdef GEN_GURMUKHIMALAYALAMTESTDATA
       
  8588     _LIT(KValidFontPath, "c:\\MalayalamWithConsonantInitial.txt");
       
  8589     GenerateGurmukhiMalayalamData(KValidFontPath, (TTestInput_PositionParam6*)Indic_GurmukhiDigit, aFont );
       
  8590 #endif  
       
  8591 	}
       
  8592 
       
  8593 /**
       
  8594 @SYMTestCaseID          GRAPHICS-TI18N-GDI-CIT-4072
       
  8595 @SYMTestCaseDesc        case to check if shaper can render Malayalam with other implemented Indic scripts and Latin
       
  8596 @SYMTestPriority        High
       
  8597 @SYMTestActions         Call to CFont::GetCharacterPosition2/CFont::MeasureText to check the following
       
  8598 						1.Pass Malayalam sentence and Latin to the function
       
  8599 						2.Pass Latin and Malayalam setence.
       
  8600 						3.Pass syllable, Latin and syllable
       
  8601 						4.Pass phoneme, Latin and phoneme
       
  8602 						5.Pass Malayalam syllable and other Indic scripts together.
       
  8603 						6.Pass Malayalam phoneme and other Indic script phoneme
       
  8604 @SYMTestExpectedResults Malayalam and Latin characters donĄ¯t mess up. Malayalam phoneme doesnĄ¯t combine with Latin into a new syllable, 
       
  8605 						Malayalam phoneme doesnĄ¯t form a syllable with other Indic script.
       
  8606 @SYMPREQ 1922: Malayalam support
       
  8607 */
       
  8608 void CTGlyphSelection::TestMalayalamWithVowelInitial( const CFbsFont& aFont )
       
  8609 	{
       
  8610 	DoEachGurmukhiMalayalamCase( (TTestInput_PositionParam6*)Indic_MalayalamVowelLeading, aFont );
       
  8611 	
       
  8612 #ifdef GEN_GURMUKHIMALAYALAMTESTDATA
       
  8613     _LIT(KValidFontPath, "c:\\MalayalamWithVowelInitial.txt");
       
  8614     GenerateGurmukhiMalayalamData(KValidFontPath, (TTestInput_PositionParam6*)Indic_GurmukhiDigit, aFont );
       
  8615 #endif 
       
  8616 	}
       
  8617 
       
  8618 
       
  8619 //--------------
       
  8620 
       
  8621 __CONSTRUCT_STEP__(GlyphSelection)
       
  8622 
       
  8623 void CTGlyphSelectionStep::TestSetupL()
       
  8624 	{
       
  8625 #ifdef _GLOWCODE_LAUNCH_DELAY
       
  8626 	INFO_PRINTF1(_L("Time delay...."));
       
  8627 	TTime t1, t2;
       
  8628 	t1.UniversalTime();
       
  8629 	t1 += TTimeIntervalSeconds(15);
       
  8630 	do 
       
  8631 		{
       
  8632 		t2.UniversalTime();
       
  8633 		}
       
  8634 	while (t2 < t1);
       
  8635 #endif
       
  8636 	}