os/textandloc/fontservices/textbase/tgdi/TGlyphSel.cpp
author sl
Tue, 10 Jun 2014 14:32:02 +0200
changeset 1 260cb5ec6c19
permissions -rw-r--r--
Update contrib.
     1 // Copyright (c) 2007-2010 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() == ETextBasePanic_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() == ETextBasePanic_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-CT-0221
  2171 @SYMTestCaseDesc Test support for Vietnamese characters.
  2172 @SYMTestPriority High
  2173 @SYMTestActions  Attempt to compose various valid and invalid Vietnamese glyph clusters.
  2174 @SYMTestExpectedResults The test must not fail.
  2175 @SYMPREQ 402: GDI for Bravo.
  2176 */
  2177 void CTGlyphSelection::TestVietnameseChars()
  2178     {
  2179 /**
  2180  This method is a test case to test GetCharacterPosition() correctly
  2181  processes Vietnamese characters.
  2182 */
  2183     TBool r;
  2184     TBuf<41> testText(0);
  2185     CFont::TPositionParam param;
  2186     param.iDirection = CFont::EHorizontal;
  2187     param.iFlags = CFont::TPositionParam::EFLogicalOrder;
  2188 
  2189     testText.SetLength(41);
  2190     
  2191     testText[0] = 0x0055; // capital U
  2192     testText[1] = 0x031B; // combining horn - expect 0x01AF (succeed)
  2193 
  2194     testText[2] = 0x0055; // capital U
  2195     testText[3] = 0x0027; // apostrophe - expect 0x0055 (fail)
  2196 
  2197     testText[4] = 0x0055; // capital U
  2198     testText[5] = 0x02B9; // modifier prime - expect 0x0055 (fail)
  2199 
  2200     testText[6] = 0x0055; // capital U
  2201     testText[7] = 0x02BC; // modifier apostrophe - expect 0x0055 (fail)
  2202 
  2203     testText[8] = 0x0055; // capital U
  2204     testText[9] = 0x0315; // combining comma above right - expect 0x0055, 0x0315 (fail)
  2205 
  2206     testText[10] = 0x0055; // capital U
  2207     testText[11] = 0x2019; // right single quote mark - expect 0x0055 (fail)
  2208 
  2209     testText[12] = 0x01AF; // capital U with horn
  2210     testText[13] = 0x0020; // space - expect 0x01AF (succeed)
  2211 
  2212     testText[14] = 0x0045; // capital E
  2213     testText[15] = 0x031B; // combining horn - expect 0x0045, 0x031B (fail)
  2214 
  2215     testText[16] = 0x0041; // capital A
  2216     testText[17] = 0x0306; // combining breve
  2217     testText[18] = 0x0301; // combining acute - expect 0x1EAE (succeed)
  2218 
  2219     testText[19] = 0x0102; // capital A with breve
  2220     testText[20] = 0x0301; // combining acute - expect 0x1EAE (succeed)
  2221 
  2222     testText[21] = 0x0041; // capital A
  2223     testText[22] = 0x0301; // combining acute
  2224     testText[23] = 0x0306; // combining breve - expect 0x0041, 0x0301, 0x0306 (fail)
  2225 
  2226     testText[24] = 0x0041; // capital A
  2227     testText[25] = 0x0323; // combining dot below
  2228     testText[26] = 0x0306; // combining breve - expect 0x1EB6 (succeed)
  2229 
  2230     testText[27] = 0x1EA0; // capital A with dot below
  2231     testText[28] = 0x0306; // combining breve - expect 0x1EB6 (succeed)
  2232 
  2233     testText[29] = 0x0102; // capital A with breve
  2234     testText[30] = 0x0323; // combining dot below - expect 0x0102, 0x0323 (fail)
  2235 
  2236     testText[31] = 0x0045; // capital A
  2237     testText[32] = 0x0302; // combining circumflex
  2238     testText[33] = 0x0301; // combining acute - expect 0x1EBE (succeed)
  2239 
  2240     testText[34] = 0x00CA; // capital A with circumflex
  2241     testText[35] = 0x0301; // combining acute - expect 0x1EBE (succeed)
  2242 
  2243     testText[36] = 0x004F; // capital O
  2244     testText[37] = 0x031B; // combining horn
  2245     testText[38] = 0x0309; // combining hook above - expect 0x1EDE (succeed)
  2246 
  2247     testText[39] = 0x01A0; // capital O with horn
  2248     testText[40] = 0x0309; // combining hook above - expect 0x1EDE (succeed)
  2249 
  2250     param.iText.Set(testText);
  2251 
  2252     // 1: Capital U with combining horn
  2253     param.iPosInText = 0;
  2254     param.iPen.iX = param.iPen.iY = 0;
  2255     r = iTestFont->GetCharacterPosition(param);
  2256     TEST(r && param.iPosInText == 2 
  2257            && param.iPen.iX == 10
  2258            && param.iOutputGlyphs == 1
  2259            && param.iOutput[0].iCode == 0x01AF);
  2260 
  2261     // 2: Capital U with apostrophe
  2262     param.iPosInText = 2;
  2263     param.iPen.iX = param.iPen.iY = 0;
  2264     r = iTestFont->GetCharacterPosition(param);
  2265     TEST(r && param.iPosInText == 3 
  2266            && param.iPen.iX == 10
  2267            && param.iOutputGlyphs == 1
  2268            && param.iOutput[0].iCode == 0x0055);
  2269 
  2270     // 3: Capital U with modifier prime
  2271     param.iPosInText = 4;
  2272     param.iPen.iX = param.iPen.iY = 0;
  2273     r = iTestFont->GetCharacterPosition(param);
  2274     TEST(r && param.iPosInText == 5 
  2275            && param.iPen.iX == 10
  2276            && param.iOutputGlyphs == 1
  2277            && param.iOutput[0].iCode == 0x0055);
  2278 
  2279     // 4: Capital U with modifier apostrophe
  2280     param.iPosInText = 6;
  2281     param.iPen.iX = param.iPen.iY = 0;
  2282     r = iTestFont->GetCharacterPosition(param);
  2283     TEST(r && param.iPosInText == 7 
  2284            && param.iPen.iX == 10
  2285            && param.iOutputGlyphs == 1
  2286            && param.iOutput[0].iCode == 0x0055);
  2287 
  2288     // 5: Capital U with combining comma above right
  2289     param.iPosInText = 8;
  2290     param.iPen.iX = param.iPen.iY = 0;
  2291     r = iTestFont->GetCharacterPosition(param);
  2292     TEST(r && param.iPosInText == 10 
  2293            && param.iPen.iX == 10
  2294            && param.iOutputGlyphs == 2
  2295            && param.iOutput[0].iCode == 0x0055
  2296            && param.iOutput[1].iCode == 0x0315);
  2297 
  2298     // 6: Capital U with right single quote
  2299     param.iPosInText = 10;
  2300     param.iPen.iX = param.iPen.iY = 0;
  2301     r = iTestFont->GetCharacterPosition(param);
  2302     TEST(r && param.iPosInText == 11 
  2303            && param.iPen.iX == 10
  2304            && param.iOutputGlyphs == 1
  2305            && param.iOutput[0].iCode == 0x0055);
  2306 
  2307     // 7: Capital U with horn plus space
  2308     param.iPosInText = 12;
  2309     param.iPen.iX = param.iPen.iY = 0;
  2310     r = iTestFont->GetCharacterPosition(param);
  2311     TEST(r && param.iPosInText == 13 
  2312            && param.iPen.iX == 10
  2313            && param.iOutputGlyphs == 1
  2314            && param.iOutput[0].iCode == 0x01AF);
  2315 
  2316     // 8: Capital E with combining horn
  2317     param.iPosInText = 14;
  2318     param.iPen.iX = param.iPen.iY = 0;
  2319     r = iTestFont->GetCharacterPosition(param);
  2320     TEST(r && param.iPosInText == 16 
  2321            && param.iPen.iX == 10
  2322            && param.iOutputGlyphs == 2
  2323            && param.iOutput[0].iCode == 0x0045
  2324            && param.iOutput[1].iCode == 0x031B);
  2325 
  2326     // 9: Capital A with combining breve with combining acute
  2327     param.iPosInText = 16;
  2328     param.iPen.iX = param.iPen.iY = 0;
  2329     r = iTestFont->GetCharacterPosition(param);
  2330     TEST(r && param.iPosInText == 19 
  2331            && param.iPen.iX == 10
  2332            && param.iOutputGlyphs == 1
  2333            && param.iOutput[0].iCode == 0x1EAE);
  2334 
  2335     // 10: Capital A with breve with combining acute
  2336     param.iPosInText = 19;
  2337     param.iPen.iX = param.iPen.iY = 0;
  2338     r = iTestFont->GetCharacterPosition(param);
  2339     TEST(r && param.iPosInText == 21 
  2340            && param.iPen.iX == 10
  2341            && param.iOutputGlyphs == 1
  2342            && param.iOutput[0].iCode == 0x1EAE);
  2343 
  2344     // 11: Capital A with combining acute with combining breve
  2345     param.iPosInText = 21;
  2346     param.iPen.iX = param.iPen.iY = 0;
  2347     r = iTestFont->GetCharacterPosition(param);
  2348     TEST(r && param.iPosInText == 24 
  2349            && param.iPen.iX == 10
  2350            && param.iOutputGlyphs == 3
  2351            && param.iOutput[0].iCode == 0x0041
  2352            && param.iOutput[1].iCode == 0x0301
  2353            && param.iOutput[2].iCode == 0x0306);
  2354 
  2355     // 12: Capital A with combining dot below with combining breve
  2356     param.iPosInText = 24;
  2357     param.iPen.iX = param.iPen.iY = 0;
  2358     r = iTestFont->GetCharacterPosition(param);
  2359     TEST(r && param.iPosInText == 27 
  2360            && param.iPen.iX == 10
  2361            && param.iOutputGlyphs == 1
  2362            && param.iOutput[0].iCode == 0x1EB6);
  2363 
  2364     // 13: Capital A with dot below with combining breve
  2365     param.iPosInText = 27;
  2366     param.iPen.iX = param.iPen.iY = 0;
  2367     r = iTestFont->GetCharacterPosition(param);
  2368     TEST(r && param.iPosInText == 29 
  2369            && param.iPen.iX == 10
  2370            && param.iOutputGlyphs == 1
  2371            && param.iOutput[0].iCode == 0x1EB6);
  2372 
  2373     // 14: Capital A with breve with combining dot below
  2374     param.iPosInText = 29;
  2375     param.iPen.iX = param.iPen.iY = 0;
  2376     r = iTestFont->GetCharacterPosition(param);
  2377     TEST(r && param.iPosInText == 31 
  2378            && param.iPen.iX == 10
  2379            && param.iOutputGlyphs == 2
  2380            && param.iOutput[0].iCode == 0x0102
  2381            && param.iOutput[1].iCode == 0x0323);
  2382 
  2383     // 15: Capital A with combining circumflex with combining acute
  2384     param.iPosInText = 31;
  2385     param.iPen.iX = param.iPen.iY = 0;
  2386     r = iTestFont->GetCharacterPosition(param);
  2387     TEST(r && param.iPosInText == 34 
  2388            && param.iPen.iX == 10
  2389            && param.iOutputGlyphs == 1
  2390            && param.iOutput[0].iCode == 0x1EBE);
  2391 
  2392     // 16: Capital A with circumflex with combining acute
  2393     param.iPosInText = 34;
  2394     param.iPen.iX = param.iPen.iY = 0;
  2395     r = iTestFont->GetCharacterPosition(param);
  2396     TEST(r && param.iPosInText == 36 
  2397            && param.iPen.iX == 10
  2398            && param.iOutputGlyphs == 1
  2399            && param.iOutput[0].iCode == 0x1EBE);
  2400 
  2401     // 17: Capital O with combining horn with combing hook above
  2402     param.iPosInText = 36;
  2403     param.iPen.iX = param.iPen.iY = 0;
  2404     r = iTestFont->GetCharacterPosition(param);
  2405     TEST(r && param.iPosInText == 39 
  2406            && param.iPen.iX == 10
  2407            && param.iOutputGlyphs == 1
  2408            && param.iOutput[0].iCode == 0x1EDE);
  2409 
  2410     // 18: Capital O with horn with combing hook above
  2411     param.iPosInText = 39;
  2412     param.iPen.iX = param.iPen.iY = 0;
  2413     r = iTestFont->GetCharacterPosition(param);
  2414     TEST(r && param.iPosInText == 41 
  2415            && param.iPen.iX == 10
  2416            && param.iOutputGlyphs == 1
  2417            && param.iOutput[0].iCode == 0x1EDE);
  2418     }
  2419 
  2420 
  2421 void CTGlyphSelection::TestNonBmpCharsL()
  2422     {
  2423     // create a font store for testing
  2424     CFontStore* fontStore = CFontStore::NewL(&User::Heap());
  2425     
  2426     //load all ecom implemented rasterizer dlls. installs the rasterizer.   
  2427     LoadOpenFontLibraries(fontStore);
  2428         // test font preparation
  2429     fontStore->iKPixelWidthInTwips = 11860; //This value is default
  2430 
  2431     //add any required font files
  2432     TUid err = fontStore->AddFileL(KTestGB18030FontFile);
  2433 
  2434     TFontSpec testGB18030FontSpec(KTestGB18030FontFaceName,200); 
  2435      
  2436     CFbsBitmap* bmp = new(ELeave) CFbsBitmap;
  2437     
  2438     TInt ret = bmp->Create(TSize(100,100),EGray2);
  2439     if (ret == KErrNotSupported)
  2440         return;
  2441     else
  2442         User::LeaveIfError(ret);
  2443 
  2444     CFbsBitmapDevice* device = NULL;
  2445     TRAPD(err2,device = CFbsBitmapDevice::NewL(bmp));
  2446     TEST(err2 == KErrNone);
  2447 
  2448     CFbsBitGc* gc = NULL;
  2449     User::LeaveIfError(device->CreateContext(gc));
  2450     // Font file Creation
  2451     CFbsFont* gb18030Font = NULL;
  2452     User::LeaveIfError(device->GetNearestFontToDesignHeightInTwips(gb18030Font,testGB18030FontSpec));
  2453     gc->UseFont(gb18030Font);
  2454     CleanupStack::PushL(gb18030Font);
  2455     
  2456     //Testcode for GB18030
  2457     ((CTGlyphSelectionStep*)iStep)->RecordTestResultL();
  2458     ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("TI18N-GDI-CIT-4077"));
  2459     TestNonBmpCharsInGB18030(gb18030Font);
  2460     ((CTGlyphSelectionStep*)iStep)->RecordTestResultL();
  2461     
  2462     CleanupStack::Pop(gb18030Font);
  2463     
  2464     //Cleaning the memory
  2465     delete bmp;
  2466     delete device;
  2467     delete gc;
  2468     fontStore->RemoveFile(err);
  2469     delete fontStore;
  2470     REComSession::FinalClose();
  2471     }
  2472 
  2473 
  2474 void CTGlyphSelection::TestTextDirection()
  2475 /**
  2476  This method is a test case to test GetCharacterPosition() correctly
  2477  produces glyph bounding boxes and utilizes various pen offsets in
  2478  a horizontal and vertical context.
  2479 */
  2480     {
  2481     TBool r;
  2482     TBuf<20> testText(0);
  2483     CFont::TPositionParam param;
  2484     param.iFlags = CFont::TPositionParam::EFLogicalOrder;
  2485 
  2486     testText.SetLength(5);
  2487     testText[0] = 'a';
  2488     testText[1] = 'B';
  2489     testText[2] = 'c';
  2490     testText[3] = ' ';
  2491     testText[4] = '1';
  2492     param.iText.Set(testText);
  2493 
  2494     // 1: Test horizontal text pen advancement & bounds
  2495     param.iDirection = CFont::EHorizontal;
  2496     param.iPosInText = 0;
  2497     param.iPen.iX = param.iPen.iY = 0;
  2498     r = iTestFont->GetCharacterPosition(param);
  2499     TEST(r && param.iPosInText == 1 
  2500            && param.iPen == TPoint(10,0)
  2501            && param.iOutputGlyphs == 1 
  2502            && param.iOutput[0].iCode == 'a'
  2503            && param.iOutput[0].iBounds.iTl == TPoint(0,-10)
  2504            && param.iOutput[0].iBounds.iBr == TPoint(10,2));
  2505            // add check for bounds
  2506 
  2507     // 2: Test horizontal text pen advancement with +ve pen offset
  2508     param.iPosInText = 4;
  2509     param.iPen.iX = 20;
  2510     param.iPen.iY = 12;
  2511     r = iTestFont->GetCharacterPosition(param);
  2512     TEST(r && param.iPosInText == 5 
  2513            && param.iPen == TPoint(30,12)
  2514            && param.iOutputGlyphs == 1 
  2515            && param.iOutput[0].iCode == '1'
  2516            && param.iOutput[0].iBounds.iTl == TPoint(20,2)
  2517            && param.iOutput[0].iBounds.iBr == TPoint(30,14));
  2518 
  2519     // 3: Test horizontal text pen advancement with -ve pen offset
  2520     param.iPosInText = 4;
  2521     param.iPen.iX = -10;
  2522     param.iPen.iY = -24;
  2523     r = iTestFont->GetCharacterPosition(param);
  2524     TEST(r && param.iPosInText == 5 
  2525            && param.iPen == TPoint(0,-24)
  2526            && param.iOutputGlyphs == 1 
  2527            && param.iOutput[0].iCode == '1'
  2528            && param.iOutput[0].iBounds.iTl == TPoint(-10,-34)
  2529            && param.iOutput[0].iBounds.iBr == TPoint(0,-22));
  2530 
  2531     // 4: Test vertical text pen advancement & bounds
  2532     param.iDirection = CFont::EVertical;
  2533     param.iPosInText = 1;
  2534     param.iPen.iX = param.iPen.iY = 0;
  2535     r = iTestFont->GetCharacterPosition(param);
  2536     TEST(r && param.iPosInText == 2 
  2537            && param.iPen == TPoint(0,12)
  2538            && param.iOutputGlyphs == 1 
  2539            && param.iOutput[0].iCode == 'B'
  2540            && param.iOutput[0].iBounds.iTl == TPoint(0,0)
  2541            && param.iOutput[0].iBounds.iBr == TPoint(10,12));
  2542 
  2543     // 5: Test vertical text pen advancement with +ve pen offset
  2544     param.iPosInText = 4;
  2545     param.iPen.iX = 20;
  2546     param.iPen.iY = 12;
  2547     r = iTestFont->GetCharacterPosition(param);
  2548     TEST(r && param.iPosInText == 5 
  2549            && param.iPen == TPoint(20,24)
  2550            && param.iOutputGlyphs == 1 
  2551            && param.iOutput[0].iCode == '1'
  2552            && param.iOutput[0].iBounds.iTl == TPoint(20,12)
  2553            && param.iOutput[0].iBounds.iBr == TPoint(30,24));
  2554 
  2555     // 6: Test vertical text pen advancement with -ve pen offset
  2556     param.iPosInText = 4;
  2557     param.iPen.iX = -10;
  2558     param.iPen.iY = -24;
  2559     r = iTestFont->GetCharacterPosition(param);
  2560     TEST(r && param.iPosInText == 5 
  2561            && param.iPen == TPoint(-10,-12)
  2562            && param.iOutputGlyphs == 1 
  2563            && param.iOutput[0].iCode == '1'
  2564            && param.iOutput[0].iBounds.iTl == TPoint(-10,-24)
  2565            && param.iOutput[0].iBounds.iBr == TPoint(0,-12));
  2566     }
  2567 
  2568 void CTGlyphSelection::TestAllUnicodeChars()
  2569 /**
  2570  This method is a test case to test GetCharacterPosition() correctly
  2571  processes all the characters in the Unicode code space 0x0000 to 
  2572  0xffff.
  2573 */
  2574     {
  2575     TBool r;
  2576     TBuf<8> testText(0);
  2577     CFont::TPositionParam param;
  2578     param.iFlags = CFont::TPositionParam::EFLogicalOrder;
  2579 
  2580     TInt errors = 0;
  2581     testText.SetLength(1);
  2582     for (TUint i = 0xd802; i <= 0xffff; i++)
  2583         {
  2584         testText[0] = (TText16) i;
  2585         if (i==0x1b) continue; // Skip as CTestFont designed to fail here r==0.
  2586         param.iText.Set(testText);
  2587         param.iDirection = CFont::EHorizontal;
  2588         param.iPosInText = 0;
  2589         param.iPen.iX = param.iPen.iY = 0;
  2590         r = iTestFont->GetCharacterPosition(param);
  2591         if (!r || param.iPosInText != 1)
  2592             {
  2593             errors++;
  2594             //RDebug::Print(_L("%04x(%d,%d,%d), "), i, r, param.iPosInText, param.iOutputGlyphs );
  2595             //if (errors%8 == 0)
  2596             //  RDebug::Print(_L("\n"));
  2597             }
  2598         }
  2599 
  2600     TEST (errors == 0);
  2601     }
  2602 
  2603 #ifdef TEST
  2604 #undef TEST
  2605 #define TEST(a) (void)(a)
  2606 #endif
  2607 
  2608 /**
  2609 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-1580
  2610 @SYMTestCaseDesc Automated GDI testing for Hindi
  2611 @SYMTestPriority High
  2612 @SYMTestActions  Attempt to compose various valid and invalid Hindi glyph clusters.
  2613 @SYMTestExpectedResults The expected glyph clusters for given Unicode charactors must be returned
  2614 @SYMPREQ 18: Hindi for Bravo
  2615 */
  2616 void CTGlyphSelection::TestHindiChars(CFbsFont* aFont)
  2617 	{
  2618 	INFO_PRINTF1(_L("Test Hindi Glyphs"));	
  2619 	// Do the testing
  2620 	
  2621 	TBool r;
  2622 	TBuf<30> testText(0);
  2623 	CFont::TPositionParam param;
  2624 	param.iDirection = CFont::EHorizontal;
  2625 	param.iFlags = CFont::TPositionParam::EFLogicalOrder;
  2626 
  2627 	testText.SetLength(30);
  2628 	
  2629 	testText[0] = 0x0930;
  2630 	testText[1] = 0x093C;
  2631 	testText[2] = 0x094D;
  2632 	testText[3] = 0x0915;
  2633 	
  2634 	testText[4] = 0x0915;
  2635 	testText[5] = 0x094D;
  2636 	testText[6] = 0x0915;
  2637 	
  2638 	testText[7] = 0x0930;
  2639 	testText[8] = 0x094D;
  2640 	testText[9] = 0x0915;
  2641 	
  2642 	testText[10] = 0x0915;
  2643 	testText[11] = 0x094D;
  2644 	testText[12] = 0x0930;
  2645 	
  2646 	testText[13] = 0x0915;
  2647 	testText[14] = 0x094D;
  2648 	testText[15] = 0x0937;
  2649 	
  2650 	testText[16] = 0x0915;
  2651 	testText[17] = 0x094D;
  2652 	testText[18] = 0x0930;
  2653 	testText[19] = 0x094D;
  2654 	testText[20] = 0x092A;
  2655 	
  2656 	/*	When the following character 0x0036 is shaped, the context will be taken into consideration when
  2657 		determining the glyph for 0x0036 
  2658 		The context for 0x0036 is the Devanagari character 0x092A at position (iPosInText) 20
  2659 	**/
  2660 	testText[21] = 0x0036;
  2661 	testText[22] = 0x094D;
  2662 	
  2663 	testText[23] = 0x0020;
  2664 	
  2665 	// INC101103: Strings containing ZWJ do not get rendered properly for Hindi 
  2666 	testText[24] = 0x092E;
  2667 	testText[25] = 0x094D;
  2668 	testText[26] = 0x200D;
  2669 	testText[27] = 0x092E; 
  2670 	testText[28] = 0x093F;
  2671 	testText[29] = 0x200D;
  2672 		
  2673 	param.iText.Set(testText);
  2674 	
  2675 	RShapeInfo aShapeInfo;
  2676 
  2677 	// Do the testing
  2678 	
  2679 	param.iPosInText = 0;
  2680 	param.iPen.iX = param.iPen.iY = 0;
  2681 	r = aFont->GetCharacterPosition2(param, aShapeInfo);
  2682 
  2683 	TEST(r && param.iPosInText == 4 
  2684 		   && param.iOutputGlyphs == 2
  2685 		   && param.iOutput[0].iCode == 0x80000108
  2686 		   && param.iOutput[1].iCode == 0x80000072);
  2687 
  2688 	#if defined __WINS__ || defined __WINSCW__
  2689 	TEST(r && param.iPen.iX == 17);
  2690 	#endif
  2691 	
  2692 	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);
  2693 
  2694 	param.iPosInText = 4;
  2695 	param.iPen.iX = param.iPen.iY = 0;
  2696 	r = aFont->GetCharacterPosition2(param, aShapeInfo);
  2697 
  2698 	TEST(r && param.iPosInText == 7 
  2699 		   && param.iOutputGlyphs == 1
  2700 		   && param.iOutput[0].iCode == 0x800001C2);
  2701 
  2702 	#if defined __WINS__ || defined __WINSCW__
  2703 	TEST(r && param.iPen.iX == 12);
  2704 	#endif
  2705 	
  2706 	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);
  2707 	
  2708 	param.iPosInText = 7;
  2709 	param.iPen.iX = param.iPen.iY = 0;
  2710 	r = aFont->GetCharacterPosition2(param, aShapeInfo);
  2711 
  2712 	TEST(r && param.iPosInText == 10 
  2713 		   && param.iOutputGlyphs == 2
  2714 		   && param.iOutput[0].iCode == 0x80000072
  2715 		   && param.iOutput[1].iCode == 0x80000130);
  2716 
  2717 	#if defined __WINS__ || defined __WINSCW__
  2718 	TEST(r && param.iPen.iX == 11);
  2719 	#endif
  2720 	
  2721 	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);
  2722 	
  2723 	param.iPosInText = 10;
  2724 	param.iPen.iX = param.iPen.iY = 0;
  2725 	r = aFont->GetCharacterPosition2(param, aShapeInfo);
  2726 
  2727 	TEST(r && param.iPosInText == 13 
  2728 		   && param.iOutputGlyphs == 1
  2729 		   && param.iOutput[0].iCode == 0x80000136);
  2730 
  2731 	#if defined __WINS__ || defined __WINSCW__
  2732 	TEST(r && param.iPen.iX == 12);
  2733 	#endif
  2734 	
  2735 	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);
  2736 	
  2737 	param.iPosInText = 13;
  2738 	param.iPen.iX = param.iPen.iY = 0;
  2739 	r = aFont->GetCharacterPosition2(param, aShapeInfo);
  2740 
  2741 	TEST(r && param.iPosInText == 16 
  2742 		   && param.iOutputGlyphs == 1
  2743 		   && param.iOutput[0].iCode == 0x800001BE);
  2744 
  2745 	#if defined __WINS__ || defined __WINSCW__
  2746 	TEST(r && param.iPen.iX == 12);
  2747 	#endif
  2748 	
  2749 	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);
  2750 
  2751 	param.iPosInText = 16;
  2752 	param.iPen.iX = param.iPen.iY = 0;
  2753 	r = aFont->GetCharacterPosition2(param, aShapeInfo);
  2754 
  2755 	TEST(r && param.iPosInText == 21 
  2756 		   && param.iOutputGlyphs == 2
  2757 		   && param.iOutput[0].iCode == 0x8000017A
  2758 		   && param.iOutput[1].iCode == 0x80000087);
  2759 	
  2760 	#if defined __WINS__ || defined __WINSCW__
  2761 	TEST(r && param.iPen.iX == 18);
  2762 	#endif
  2763 	
  2764 	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);
  2765 
  2766 	/*	The following shaping will consider the context when determining the glyph for 0x0036 Digit character 
  2767 		The context for 0x0036 is the Devanagari character 0x092A at position (iPosInText) 20
  2768 	**/
  2769 	param.iPosInText = 21;
  2770 	param.iPen.iX = param.iPen.iY = 0;
  2771 	r = aFont->GetCharacterPosition2(param, aShapeInfo);
  2772 
  2773 	TEST(r && param.iPosInText == 22 
  2774 		   && param.iOutputGlyphs == 1
  2775 		   && param.iOutput[0].iCode == 0x80000016);
  2776 	
  2777 	#if defined __WINS__ || defined __WINSCW__
  2778 	TEST(r && param.iPen.iX == 9);
  2779 	#endif
  2780 	
  2781 	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);
  2782 
  2783 	// INC101103: Strings containing ZWJ do not get rendered properly for Hindi 
  2784 	param.iPosInText = 24;
  2785 	param.iPen.iX = param.iPen.iY = 0;
  2786 	r = aFont->GetCharacterPosition2(param, aShapeInfo);
  2787 	// We are mainly testing the position in text after rendering, which should be at the end of the syllable
  2788 	// that should include the ZWJ and any consonant that follows it
  2789 	TEST(r && param.iPosInText == 29 
  2790 		   && param.iOutputGlyphs == 3
  2791 		   && param.iOutput[0].iCode == 0x80000272
  2792 		   && param.iOutput[1].iCode == 0x80000105
  2793 		   && param.iOutput[2].iCode == 0x8000008B);
  2794 		   
  2795 	// Close aShapeInfo which releases any memory it is occupying
  2796 	if (aShapeInfo.IsOpen())
  2797 		aShapeInfo.Close();
  2798 		   
  2799 	}
  2800 	
  2801 /**
  2802 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-3381
  2803 @SYMTestCaseDesc Automated GDI testing for Kannada
  2804 @SYMTestPriority High
  2805 @SYMTestActions  Attempt to compose various valid and invalid Kannada glyph clusters.
  2806 @SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
  2807 @SYMPREQ 19: Kannada for Ogmha
  2808 */
  2809 	
  2810 void CTGlyphSelection::TestKannadaChars(CFbsFont* aFont)
  2811 	{
  2812 INFO_PRINTF1(_L("Test Kannada Glyphs"));
  2813 	
  2814 	TBuf<79> testText(0);
  2815 	CFont::TPositionParam param;
  2816 	param.iDirection = CFont::EHorizontal;
  2817 	param.iFlags = CFont::TPositionParam::EFLogicalOrder;
  2818 
  2819 	testText.SetLength(79);
  2820 	//Testdata for kannada Langauage
  2821 	
  2822 	testText[0] = 0x0C95;
  2823 	testText[1] = 0x0CCD;
  2824 	testText[2] = 0x0020; 
  2825 	
  2826 	testText[3] = 0x0CAF;
  2827 	testText[4] = 0x0CCD;
  2828 	testText[5] = 0x0020;
  2829 	
  2830 	testText[6] = 0x0C99;
  2831 	testText[7] = 0x0CCD;
  2832 	testText[8] = 0x0020;
  2833 	
  2834 	testText[9] = 0x0CA3;
  2835 	testText[10] = 0x0CCD;
  2836 	testText[11] = 0x0020;
  2837 	
  2838 	testText[12] = 0x0C95;
  2839 	testText[13] = 0x0CC3;
  2840 	
  2841 	testText[14] = 0x0CA4;
  2842 	testText[15] = 0x0CC6;
  2843 	
  2844 	testText[16] = 0x0C9D;
  2845 	testText[17] = 0x0CBE;
  2846 	
  2847 	testText[18] = 0x0C9E;
  2848 	testText[19] = 0x0CBE;
  2849 	
  2850 	testText[20] = 0x0CA3;
  2851 	testText[21] = 0x0CBE;
  2852 	
  2853 	testText[22] = 0x0CB3;
  2854 	testText[23] = 0x0CC6;
  2855 	
  2856 	testText[24] = 0x0C9D;
  2857 	testText[25] = 0x0CC6;
  2858 	
  2859 	testText[26] = 0x0CAC;
  2860 	testText[27] = 0x0CC6;
  2861 	
  2862 	testText[28] = 0x0C9F;
  2863 	testText[29] = 0x0CC6;
  2864 	
  2865 	testText[30] = 0x0C99;
  2866 	testText[31] = 0x0CC6;
  2867 	
  2868 	testText[32] = 0x0CA3;
  2869 	testText[33] = 0x0CC6;
  2870 	
  2871 	testText[34] = 0x0C95;
  2872 	testText[35] = 0x0CBF;
  2873 	
  2874 	testText[36] = 0x0CB8;
  2875 	testText[37] = 0x0CBF;
  2876 	
  2877 	testText[38] = 0x0CA1;
  2878 	testText[39] = 0x0CBF;
  2879 	
  2880 	testText[40] = 0x0CA6;
  2881 	testText[41] = 0x0CBF;
  2882 	
  2883 	testText[42] = 0x0C9D;
  2884 	testText[43] = 0x0CBF;
  2885 	
  2886 	testText[44] = 0x0C9D;
  2887 	testText[45] = 0x0CC1;
  2888 	
  2889 	testText[46] = 0x0CB5;
  2890 	testText[47] = 0x0CC1;
  2891 	
  2892 	testText[48] = 0x0C95;
  2893 	testText[49] = 0x0CC2;
  2894 	
  2895 	testText[50] = 0x0CAA;
  2896 	testText[51] = 0x0CC2;
  2897 	
  2898 	testText[52] = 0x0CAE;
  2899 	testText[53] = 0x0CCC;
  2900 	
  2901 	testText[54] = 0x0C95;
  2902 	
  2903 	testText[55] = 0x0CB0;
  2904 	testText[56] = 0x200D;
  2905 	testText[57] = 0x0CCD;
  2906 	testText[58] = 0x0CAE;
  2907 	
  2908 	testText[59] = 0x0020;
  2909 	
  2910 	testText[60] = 0x0CB0;
  2911 	testText[61] = 0x200D;
  2912 	testText[62] = 0x0CCD;
  2913 	testText[63] = 0x0CB0;
  2914 	testText[64] = 0x200D;
  2915 	testText[65] = 0x0CCD;
  2916 	
  2917 	
  2918 	testText[66] = 0x0CB0;
  2919 	testText[67] = 0x200D;
  2920 	testText[68] = 0x0CCD;
  2921 	testText[69] = 0x0CB0;
  2922 	testText[70] = 0x0CCD;
  2923 	testText[71] = 0x0CB0;
  2924 	testText[72] = 0x0CCD;
  2925 	testText[73] = 0x0CB0;
  2926 	testText[74] = 0x0CCD;
  2927 	testText[75] = 0x0CB0;
  2928 	
  2929 	// DEF103276: Kannada rendering: IcuLayoutEngine does not recongnise 0X0C8E as a vowel
  2930 	testText[76] = 0x0020;
  2931 	testText[77] = 0x0C8E;
  2932 	testText[78] = 0x0C82;
  2933 	// End of DEF103276: Kannada rendering: IcuLayoutEngine does not recongnise 0X0C8E as a vowel
  2934 
  2935 	param.iText.Set(testText);
  2936 
  2937 	// Do the testing
  2938 	
  2939 	TBool r;
  2940 	param.iPosInText = 0;
  2941 	param.iPen.iX = param.iPen.iY = 0;
  2942 	RShapeInfo shapeInfo;
  2943 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  2944 
  2945 	TEST(r && param.iPosInText ==2 
  2946 		   && param.iOutputGlyphs == 1 
  2947 		   && param.iOutput[0].iCode == 0x80000839);
  2948 
  2949 	#if defined __WINS__ || defined __WINSCW__
  2950 	TEST(r && param.iPen.iX == 16);
  2951 	#endif
  2952 	
  2953 	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);
  2954     
  2955 	param.iPosInText = 3;
  2956 	param.iPen.iX = param.iPen.iY = 0;
  2957 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  2958 
  2959 	TEST(r && param.iPosInText == 5
  2960 		   && param.iOutputGlyphs ==1
  2961 		   && param.iOutput[0].iCode == 0x80000852 );
  2962 
  2963 	#if defined __WINS__ || defined __WINSCW__
  2964 	TEST(r && param.iPen.iX == 27);
  2965 	#endif
  2966 	
  2967 	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);
  2968 	
  2969 	param.iPosInText = 6;
  2970 	param.iPen.iX = param.iPen.iY = 0;
  2971 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  2972 
  2973 	TEST(r && param.iPosInText == 8
  2974 		   && param.iOutputGlyphs == 1 
  2975 		   && param.iOutput[0].iCode ==0x8000083D);
  2976 
  2977 	#if defined __WINS__ || defined __WINSCW__
  2978 	TEST(r && param.iPen.iX == 19);
  2979 	#endif
  2980 	
  2981 	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);
  2982 	
  2983 	param.iPosInText = 9;
  2984 	param.iPen.iX = param.iPen.iY = 0;
  2985 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  2986 
  2987 	TEST(r && param.iPosInText == 11
  2988 		   && param.iOutputGlyphs ==1 
  2989 		   && param.iOutput[0].iCode == 0x80000847);
  2990 
  2991 	#if defined __WINS__ || defined __WINSCW__
  2992 	TEST(r && param.iPen.iX == 20);
  2993 	#endif
  2994 	
  2995 	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);
  2996 	
  2997 	param.iPosInText = 12;
  2998 	param.iPen.iX = param.iPen.iY = 0;
  2999 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  3000 
  3001 	TEST(r && param.iPosInText == 14
  3002 		   && param.iOutputGlyphs == 2 
  3003 		   && param.iOutput[0].iCode == 0x800007A8
  3004 		   && param.iOutput[1].iCode == 0x800007D2);
  3005 
  3006 	#if defined __WINS__ || defined __WINSCW__
  3007 	TEST(r && param.iPen.iX == 12);
  3008 	#endif
  3009 
  3010 	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);
  3011 
  3012 	param.iPosInText = 14;
  3013 	param.iPen.iX = param.iPen.iY = 0;
  3014 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  3015 
  3016 	TEST(r && param.iPosInText == 16
  3017 		   && param.iOutputGlyphs == 1 
  3018 		   && param.iOutput[0].iCode == 0x8000088f);
  3019 
  3020 	#if defined __WINS__ || defined __WINSCW__
  3021 	TEST(r && param.iPen.iX == 11);
  3022 	#endif
  3023 	
  3024 	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);
  3025 
  3026 	param.iPosInText = 16;
  3027 	param.iPen.iX = param.iPen.iY = 0;
  3028 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  3029 
  3030 	TEST(r && param.iPosInText == 18
  3031 		   && param.iOutputGlyphs == 2
  3032 		   && param.iOutput[0].iCode == 0x8000081E 
  3033 		   && param.iOutput[1].iCode == 0x800007CD);
  3034 
  3035 	#if defined __WINS__ || defined __WINSCW__
  3036 	TEST(r && param.iPen.iX == 29);
  3037 	#endif
  3038 	
  3039 	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);
  3040 	
  3041 	param.iPosInText = 18;
  3042 	param.iPen.iX = param.iPen.iY = 0;
  3043 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  3044 
  3045 	TEST(r && param.iPosInText == 20
  3046 		   && param.iOutputGlyphs == 2
  3047 		   && param.iOutput[0].iCode == 0x800007b1
  3048 		   && param.iOutput[1].iCode == 0x800007cd);
  3049 
  3050 	#if defined __WINS__ || defined __WINSCW__
  3051 	TEST(r && param.iPen.iX == 23);
  3052 	#endif
  3053 	
  3054 	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);
  3055 	
  3056 	
  3057 	param.iPosInText = 20;
  3058 	param.iPen.iX = param.iPen.iY = 0;
  3059 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  3060 
  3061 	TEST(r && param.iPosInText == 22
  3062 		   && param.iOutputGlyphs == 2 
  3063 		   && param.iOutput[0].iCode == 0x80000823
  3064 		   && param.iOutput[1].iCode == 0x800007CD );
  3065 
  3066 	#if defined __WINS__ || defined __WINSCW__
  3067 	TEST(r && param.iPen.iX == 21);
  3068 	#endif
  3069 	    
  3070 	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);
  3071 	
  3072 	param.iPosInText = 22;
  3073 	param.iPen.iX = param.iPen.iY = 0;
  3074 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  3075 
  3076 	TEST(r && param.iPosInText == 24
  3077 		   && param.iOutputGlyphs == 1 
  3078 		   && param.iOutput[0].iCode == 0x8000089C);
  3079 
  3080 	#if defined __WINS__ || defined __WINSCW__
  3081 	TEST(r && param.iPen.iX == 12);
  3082 	#endif
  3083 	
  3084 	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);
  3085 	
  3086 	param.iPosInText = 24;
  3087 	param.iPen.iX = param.iPen.iY = 0;
  3088 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  3089 
  3090 	TEST(r && param.iPosInText == 26
  3091 		   && param.iOutputGlyphs == 1 
  3092 		   && param.iOutput[0].iCode == 0x80000889);
  3093 
  3094 	#if defined __WINS__ || defined __WINSCW__
  3095 	TEST(r && param.iPen.iX == 22);
  3096 	#endif
  3097 	
  3098 	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);
  3099 	 
  3100 	 param.iPosInText = 26;
  3101 	param.iPen.iX = param.iPen.iY = 0;
  3102 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  3103 
  3104 	TEST(r && param.iPosInText == 28
  3105 		   && param.iOutputGlyphs == 1
  3106 		   && param.iOutput[0].iCode == 0x80000896 );
  3107 
  3108 	#if defined __WINS__ || defined __WINSCW__
  3109 	TEST(r && param.iPen.iX == 13);
  3110 	#endif
  3111 	
  3112 	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);
  3113 	
  3114 	param.iPosInText = 28;
  3115 	param.iPen.iX = param.iPen.iY = 0;
  3116 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  3117 
  3118 	TEST(r && param.iPosInText == 30
  3119 		   && param.iOutputGlyphs == 1 
  3120 		   && param.iOutput[0].iCode == 0x8000088a);
  3121 
  3122 	#if defined __WINS__ || defined __WINSCW__
  3123 	TEST(r && param.iPen.iX == 13);
  3124 	#endif
  3125 	
  3126 	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);
  3127 	
  3128 	param.iPosInText = 30;
  3129 	param.iPen.iX = param.iPen.iY = 0;
  3130 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  3131 
  3132 	TEST(r && param.iPosInText == 32
  3133 		   && param.iOutputGlyphs == 2
  3134 		   && param.iOutput[0].iCode == 0x800007ac
  3135 		   && param.iOutput[1].iCode == 0x800007d4 );
  3136 
  3137 	#if defined __WINS__ || defined __WINSCW__
  3138 	TEST(r && param.iPen.iX == 19);
  3139 	#endif
  3140 	
  3141 	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);
  3142 	
  3143 	param.iPosInText = 32;
  3144 	param.iPen.iX = param.iPen.iY = 0;
  3145 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  3146 
  3147 	TEST(r && param.iPosInText == 34
  3148 		   && param.iOutputGlyphs == 1 
  3149 		   && param.iOutput[0].iCode == 0x8000088e);
  3150 
  3151 	#if defined __WINS__ || defined __WINSCW__
  3152 	TEST(r && param.iPen.iX == 14);
  3153 	#endif
  3154 	
  3155 	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);
  3156 	
  3157 	param.iPosInText = 34;
  3158 	param.iPen.iX = param.iPen.iY = 0;
  3159 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  3160 
  3161 	TEST(r && param.iPosInText == 36
  3162 		   && param.iOutputGlyphs == 1
  3163 		   && param.iOutput[0].iCode == 0x80000860 );
  3164 
  3165 	#if defined __WINS__ || defined __WINSCW__
  3166 	TEST(r && param.iPen.iX == 10);
  3167 	#endif
  3168 		
  3169 	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);
  3170 	
  3171 	param.iPosInText = 36;
  3172 	param.iPen.iX = param.iPen.iY = 0;
  3173 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  3174 
  3175 	TEST(r && param.iPosInText == 38
  3176 		   && param.iOutputGlyphs == 1
  3177 		   && param.iOutput[0].iCode == 0x8000087e );
  3178 
  3179 	#if defined __WINS__ || defined __WINSCW__
  3180 	TEST(r && param.iPen.iX == 11);
  3181 	#endif
  3182 	
  3183 	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);
  3184 	
  3185 	param.iPosInText = 38;
  3186 	param.iPen.iX = param.iPen.iY = 0;
  3187 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  3188 
  3189 	TEST(r && param.iPosInText == 40
  3190 		   && param.iOutputGlyphs == 1
  3191 		   && param.iOutput[0].iCode == 0x8000086a);
  3192 
  3193 	#if defined __WINS__ || defined __WINSCW__
  3194 	TEST(r && param.iPen.iX == 12);
  3195 	#endif
  3196 	
  3197 	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);
  3198 	
  3199 	param.iPosInText = 40;
  3200 	param.iPen.iX = param.iPen.iY = 0;
  3201 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  3202 
  3203 	TEST(r && param.iPosInText == 42
  3204 		   && param.iOutputGlyphs == 1 
  3205 		   && param.iOutput[0].iCode == 0x8000086f);
  3206 
  3207 	#if defined __WINS__ || defined __WINSCW__
  3208 	TEST(r && param.iPen.iX == 12);
  3209 	#endif
  3210 	
  3211 	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);
  3212 	
  3213 	param.iPosInText = 42;
  3214 	param.iPen.iX = param.iPen.iY = 0;
  3215 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  3216 
  3217 	TEST(r && param.iPosInText == 44
  3218 		   && param.iOutputGlyphs == 1 
  3219 		   && param.iOutput[0].iCode == 0x80000867 );
  3220 
  3221 	#if defined __WINS__ || defined __WINSCW__
  3222 	TEST(r && param.iPen.iX == 22);
  3223 	#endif
  3224 	
  3225 	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);
  3226 	
  3227 	param.iPosInText = 44;
  3228 	param.iPen.iX = param.iPen.iY = 0;
  3229 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  3230 
  3231 	TEST(r && param.iPosInText == 46
  3232 		   && param.iOutputGlyphs == 2
  3233 		   && param.iOutput[0].iCode == 0x800007b0 
  3234 		   && param.iOutput[1].iCode == 0x800007d0);
  3235 
  3236 	#if defined __WINS__ || defined __WINSCW__
  3237 	TEST(r && param.iPen.iX == 28);
  3238 	#endif
  3239 	
  3240 	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);
  3241 	
  3242 	param.iPosInText = 46;
  3243 	param.iPen.iX = param.iPen.iY = 0;
  3244 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  3245 
  3246 	TEST(r && param.iPosInText == 48
  3247 		   && param.iOutputGlyphs == 2
  3248 		   && param.iOutput[0].iCode == 0x800007c6
  3249 		   && param.iOutput[1].iCode == 0x800007d0);
  3250 
  3251 	#if defined __WINS__ || defined __WINSCW__
  3252 	TEST(r && param.iPen.iX == 18);
  3253 	#endif
  3254 	
  3255 	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);
  3256 
  3257 
  3258 	param.iPosInText = 48;
  3259 	param.iPen.iX = param.iPen.iY = 0;
  3260 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  3261 
  3262 	TEST(r && param.iPosInText == 50
  3263 		   && param.iOutputGlyphs == 2
  3264 		   && param.iOutput[0].iCode == 0x800007a8
  3265 		   && param.iOutput[1].iCode == 0x800007d1 );
  3266 
  3267 	#if defined __WINS__ || defined __WINSCW__
  3268 	TEST(r && param.iPen.iX == 20);
  3269 	#endif
  3270 	
  3271 	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);	
  3272 
  3273 	param.iPosInText = 50;
  3274 	param.iPen.iX = param.iPen.iY = 0;
  3275 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  3276 
  3277 	TEST(r && param.iPosInText == 52 
  3278 		   && param.iOutputGlyphs == 2
  3279 		   && param.iOutput[0].iCode == 0x800007bc
  3280 		   && param.iOutput[1].iCode == 0x800008a5);
  3281 
  3282 	#if defined __WINS__ || defined __WINSCW__
  3283 	TEST(r && param.iPen.iX == 21);
  3284 	#endif
  3285 	
  3286 	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);	
  3287 	
  3288 	
  3289 	param.iPosInText = 52;
  3290 	param.iPen.iX = param.iPen.iY = 0;
  3291 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  3292 
  3293 	TEST(r && param.iPosInText == 54 
  3294 		   && param.iOutputGlyphs == 2
  3295 		   && param.iOutput[0].iCode == 0x8000082d  
  3296 		   && param.iOutput[1].iCode == 0x800007d9);
  3297 
  3298 	#if defined __WINS__ || defined __WINSCW__
  3299 	TEST(r && param.iPen.iX == 26);
  3300 	#endif
  3301 
  3302 	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);	
  3303 		
  3304 	param.iPosInText = 55;
  3305 	param.iPen.iX = param.iPen.iY = 0;
  3306 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  3307 
  3308 	TEST(r && param.iPosInText == 59 
  3309 		   && param.iOutputGlyphs == 2
  3310 		   && param.iOutput[0].iCode == 0x800007c2 
  3311 		   && param.iOutput[1].iCode == 0x80000809);
  3312 
  3313 	#if defined __WINS__ || defined __WINSCW__
  3314 	TEST(r && param.iPen.iX == 17);
  3315 	#endif
  3316 	
  3317 	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);	
  3318 			
  3319 	param.iPosInText = 60;
  3320 	param.iPen.iX = param.iPen.iY = 0;
  3321 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  3322 	TEST(r && param.iPosInText == 64 
  3323 		   && param.iOutputGlyphs == 2
  3324 		   && param.iOutput[0].iCode == 0x800007c2 
  3325 		   && param.iOutput[1].iCode == 0x8000080b);
  3326 	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);	
  3327 			
  3328 	param.iPosInText = 66;
  3329 	param.iPen.iX = param.iPen.iY = 0;
  3330 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  3331 	TEST(r && param.iPosInText == 75 
  3332 		   && param.iOutputGlyphs == 5
  3333 		   && param.iOutput[0].iCode == 0x800007c2 
  3334 		   && param.iOutput[1].iCode == 0x8000080b
  3335 		   && param.iOutput[2].iCode == 0x800008db
  3336 		   && param.iOutput[3].iCode == 0x800008db
  3337 		   && param.iOutput[4].iCode == 0x800007da);
  3338 	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);
  3339 	
  3340 	// DEF103276: Kannada rendering: IcuLayoutEngine does not recongnise 0X0C8E as a vowel
  3341 	param.iPosInText = 77;
  3342 	param.iPen.iX = param.iPen.iY = 0;
  3343 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  3344 	TEST(r && param.iPosInText == 79 
  3345 		   && param.iOutputGlyphs == 2
  3346 		   && param.iOutput[0].iCode == 0x800007A2
  3347 		   && param.iOutput[1].iCode == 0x80000798);
  3348 
  3349 	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);	
  3350 	//End of DEF103276: Kannada rendering: IcuLayoutEngine does not recongnise 0X0C8E as a vowel
  3351 			
  3352 	}
  3353 	
  3354 /**
  3355 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-3360
  3356 @SYMTestCaseDesc Automated GDI testing for Marathi
  3357 @SYMTestPriority High
  3358 @SYMTestActions  Attempt to compose various valid and invalid Marathi glyph clusters.
  3359 @SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
  3360 @SYMPREQ 19: Marathi for Ogmha
  3361 */
  3362 
  3363 void CTGlyphSelection::TestMarathiChars(CFbsFont* aFont)
  3364 	{
  3365 	INFO_PRINTF1(_L("Test Marathi Glyphs"));	
  3366 	
  3367 	TBool r;
  3368 	TBuf<47> testText(0);
  3369 	CFont::TPositionParam param;
  3370 	param.iDirection = CFont::EHorizontal;
  3371 	param.iFlags = CFont::TPositionParam::EFLogicalOrder;
  3372 
  3373 	testText.SetLength(47);
  3374 	
  3375 	//Testdata
  3376 	testText[0] = 0x0905; 
  3377 	testText[1] = 0x0945;
  3378 	
  3379 	testText[2] = 0x0931;
  3380 	testText[3] = 0x094D;
  3381 	testText[4] = 0x0915;
  3382 	
  3383 	testText[5] = 0x0930;
  3384 	testText[6] = 0x094D;
  3385 	testText[7] = 0x200D;
  3386 	testText[8] = 0x0915;
  3387 	
  3388 	testText[9] = 0x0905;
  3389 	testText[10] = 0x200D;
  3390 	testText[11] = 0x0945;
  3391 	
  3392 	testText[12] = 0x0909;
  3393 	testText[13] = 0x0945;
  3394 	
  3395 	testText[14] = 0x0915;
  3396 	testText[15] = 0x200D;
  3397 	testText[16] = 0x0945;
  3398 	
  3399 	// DEF102132: Marathi - Certain sequence of characters does not work correctly
  3400 	testText[17] = 0x0905;
  3401 	testText[18] = 0x0945;
  3402 	testText[19] = 0x0901;
  3403 	
  3404 	testText[20] = 0x0905;
  3405 	testText[21] = 0x200D;
  3406 	testText[22] = 0x0945;
  3407 	testText[23] = 0x0901;
  3408 	// End of DEF102132: Marathi - Certain sequence of characters does not work correctly
  3409 
  3410 	
  3411 	// DEF102858: Marathi - State table does not allow explicit half forms followed by modifiers
  3412 	testText[24] = 0x0020;
  3413 	
  3414 	testText[25] = 0x0930;
  3415 	testText[26] = 0x094D;
  3416 	testText[27] = 0x200D;
  3417 	testText[28] = 0x0901;
  3418 	// End of DEF102858: Marathi - State table does not allow explicit half forms followed by modifiers
  3419 	
  3420 	// INC104705  Marathi input: Incorrect movement of cursor with eyelash ra forming ligature. 
  3421 	testText[29] = 0x0020;
  3422 	
  3423 	testText[30] = 0x0930; 
  3424 	testText[31] = 0x094D;
  3425 	testText[32] = 0x200D;
  3426 	testText[33] = 0x0930; 
  3427 	testText[34] = 0x094D;
  3428 	testText[35] = 0x200D;
  3429 	testText[36] = 0x0930; 
  3430 	testText[37] = 0x094D;
  3431 	testText[38] = 0x200D;
  3432 	testText[39] = 0x0930; 
  3433 	testText[40] = 0x094D;
  3434 	testText[41] = 0x200D;
  3435 	testText[42] = 0x0930; 
  3436 	testText[43] = 0x094D;
  3437 	testText[44] = 0x200D;
  3438 	// End of INC104705  Marathi input: Incorrect movement of cursor with eyelash ra forming ligature. 
  3439 
  3440 	// INC116507: Halant get attached with an independent vowel.
  3441 	testText[45] = 0x0905;
  3442 	testText[46] = 0x094D;
  3443 	// End of INC116507: Halant get attached with an independent vowel.
  3444 	
  3445 	//To Do
  3446 	
  3447 	param.iText.Set(testText); 
  3448 	
  3449 	// Test CANDRA A: Independent Vowel A + CANDRA E
  3450 	param.iPosInText = 0;
  3451 	param.iPen.iX = param.iPen.iY = 0;
  3452 	RShapeInfo shapeInfo;
  3453 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  3454 
  3455 	TEST(r && param.iPosInText == 2 
  3456 		   && param.iOutputGlyphs == 2
  3457 		   && param.iOutput[0].iCode == 0x80000528 
  3458 		   && param.iOutput[1].iCode == 0x80000566);
  3459 
  3460 	#if defined __WINS__ || defined __WINSCW__
  3461 	TEST(r && param.iPen.iX == 12);
  3462 	#endif
  3463 	
  3464 	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);
  3465 
  3466 	
  3467 	// Test Eyelash RA post Unicode 3.0: RRA + VIRAMA + CONSONANT
  3468 	param.iPosInText = 2 ;
  3469 	param.iPen.iX = param.iPen.iY = 0;
  3470 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  3471 
  3472 	TEST(r && param.iPosInText == 5 
  3473 		   && param.iOutputGlyphs == 2
  3474 		   && param.iOutput[0].iCode == 0x800005d3
  3475 		   && param.iOutput[1].iCode == 0x80000538);
  3476 
  3477 	#if defined __WINS__ || defined __WINSCW__
  3478 	TEST(r && param.iPen.iX == 18);
  3479 	#endif
  3480 	
  3481 	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);
  3482 	
  3483 	// Test Eyelash RA pre Unicode 3.0: RA + VIRAMA + ZWJ + CONSONANT
  3484 	param.iPosInText = 5;
  3485 	param.iPen.iX = param.iPen.iY = 0;
  3486 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  3487 
  3488 	TEST(r && param.iPosInText == 9 
  3489 		   && param.iOutputGlyphs == 2
  3490 		   && param.iOutput[0].iCode == 0x800005d3
  3491 		   && param.iOutput[1].iCode == 0x80000538);
  3492 
  3493 	#if defined __WINS__ || defined __WINSCW__
  3494 	TEST(r && param.iPen.iX == 18);
  3495 	#endif
  3496 	
  3497 	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);
  3498 	
  3499 	// Test second form of CANDRA A: Independent Vowel A + ZWJ + CANDRA E
  3500 	param.iPosInText = 9;
  3501 	param.iPen.iX = param.iPen.iY = 0;
  3502 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  3503 
  3504 	TEST(r && param.iPosInText == 12 
  3505 		   && param.iOutputGlyphs == 2
  3506 		   && param.iOutput[0].iCode == 0x80000528
  3507 		   && param.iOutput[1].iCode == 0x80000566 );
  3508 
  3509 	#if defined __WINS__ || defined __WINSCW__
  3510 	TEST(r && param.iPen.iX == 12);
  3511 	#endif
  3512 	
  3513 	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);
  3514 	
  3515 	// Test that CANDRA E does not join with any other independent vowel
  3516 	param.iPosInText = 12;
  3517 	param.iPen.iX = param.iPen.iY = 0;
  3518 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  3519 
  3520 	TEST(r && param.iPosInText == 13 
  3521 		   && param.iOutputGlyphs == 1
  3522 		   && param.iOutput[0].iCode == 0x8000052c);
  3523 
  3524 	#if defined __WINS__ || defined __WINSCW__
  3525 	TEST(r && param.iPen.iX == 9);
  3526 	#endif
  3527 
  3528 	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);
  3529 	
  3530 	// Test that the second form of CANDRA A (i.e. using ZWJ) doesn't work for CONSONANTS (illegal)
  3531 	param.iPosInText = 14;
  3532 	param.iPen.iX = param.iPen.iY = 0;
  3533 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  3534 
  3535 	TEST(r && param.iPosInText == 15 
  3536 		   && param.iOutputGlyphs == 1
  3537 		   && param.iOutput[0].iCode == 0x80000538);
  3538 
  3539 	#if defined __WINS__ || defined __WINSCW__
  3540 	TEST(r && param.iPen.iX == 11);
  3541 	#endif
  3542 	
  3543 	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);
  3544 	
  3545 	// DEF102132: Marathi - Certain sequence of characters does not work correctly
  3546 	param.iPosInText = 17;
  3547 	param.iPen.iX = param.iPen.iY = 0;
  3548 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  3549 	
  3550 	TEST(r && param.iPosInText == 20 
  3551 		   && param.iOutputGlyphs == 2
  3552 		   && param.iOutput[0].iCode == 0x80000528
  3553 		   && param.iOutput[1].iCode == 0x8000069d);
  3554 
  3555 	
  3556 	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);
  3557 	
  3558 	param.iPosInText = 20;
  3559 	param.iPen.iX = param.iPen.iY = 0;
  3560 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  3561 	
  3562 	TEST(r && param.iPosInText == 23 
  3563 		   && param.iOutputGlyphs == 2
  3564 		   && param.iOutput[0].iCode == 0x80000528
  3565 		   && param.iOutput[1].iCode == 0x8000069d);
  3566 	
  3567 	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);
  3568   	// End of DEF102132: Marathi - Certain sequence of characters does not work correctly
  3569   	
  3570 	// DEF102858: Marathi - State table does not allow explicit half forms followed by modifiers
  3571 	param.iPosInText = 25;
  3572 	param.iPen.iX = param.iPen.iY = 0;
  3573 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  3574 	TEST(r && param.iPosInText == 29 
  3575 		   && param.iOutputGlyphs == 2
  3576 		   && param.iOutput[0].iCode == 0x800005D3
  3577 		   && param.iOutput[1].iCode == 0x80000524);
  3578 	
  3579 	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);
  3580 	// End of DEF102858: Marathi - State table does not allow explicit half forms followed by modifiers
  3581 	
  3582 	// INC104705  Marathi input: Incorrect movement of cursor with eyelash ra forming ligature. 
  3583 	param.iPosInText = 30;
  3584 	param.iPen.iX = param.iPen.iY = 0;
  3585 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  3586 	TEST(r && param.iPosInText == 42 
  3587 		   && param.iOutputGlyphs == 5
  3588 		   && param.iOutput[0].iCode == 0x800005D3
  3589 		   && param.iOutput[1].iCode == 0x800005D3
  3590 		   && param.iOutput[2].iCode == 0x800005B8
  3591 		   && param.iOutput[3].iCode == 0x80000553
  3592 		   && param.iOutput[4].iCode == 0x8000056E);
  3593 	#if defined __WINS__ || defined __WINSCW__
  3594 	TEST(param.iPen.iX == 20);
  3595 	#endif
  3596 	
  3597 	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);
  3598 	// End of INC104705  Marathi input: Incorrect movement of cursor with eyelash ra forming ligature. 
  3599 	
  3600 	// INC116507: Halant get attached with an independent vowel.
  3601 	param.iPosInText = 45;
  3602 	param.iPen.iX = param.iPen.iY = 0;
  3603 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  3604 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  3605 
  3606 	TEST(r && param.iPosInText == 47 
  3607 		   && param.iOutputGlyphs == 2
  3608 		   && param.iOutput[0].iCode == 0x8000058F
  3609 		   && param.iOutput[1].iCode == 0x8000056E);
  3610 
  3611 	#if defined __WINS__ || defined __WINSCW__
  3612 	TEST(r && param.iPen.iX == 21);
  3613 	#endif
  3614 
  3615 	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);
  3616 	// End of INC116507: Halant get attached with an independent vowel.
  3617 
  3618 	}
  3619 	
  3620 /**
  3621 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-3417
  3622 @SYMTestCaseDesc Automated GDI testing for Gujarati
  3623 @SYMTestPriority High
  3624 @SYMTestActions  Attempt to compose various valid and invalid gujarati glyph clusters.
  3625 @SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
  3626 @SYMPREQ 19: Gujarati for Ogmha
  3627 */
  3628 	
  3629 	
  3630 void CTGlyphSelection::TestGujaratiChars(CFbsFont* aFont)
  3631 	{
  3632 	INFO_PRINTF1(_L("Test Gujarati Glyphs"));
  3633 	
  3634 	// Do the testing
  3635 	
  3636 	TBool r;
  3637 	TBuf<162> testText(0);
  3638 	CFont::TPositionParam param;
  3639 	param.iDirection = CFont::EHorizontal;
  3640 	param.iFlags = CFont::TPositionParam::EFLogicalOrder;
  3641 
  3642 	testText.SetLength(162);
  3643 	//Testdata for gujarati Langauage
  3644 	
  3645 	testText[0] = 0x0AAC;
  3646 	testText[1] = 0x0ACD;
  3647 	testText[2] = 0x200D;
  3648 	testText[3] = 0x0020;
  3649 	
  3650 	testText[4] = 0x0A96;
  3651 	testText[5] = 0x0ACD;
  3652 	testText[6] = 0x0A97;
  3653 	testText[7] = 0x0ACD;
  3654 	testText[8] = 0x0A98;
  3655 	testText[9] = 0x0ACD;
  3656 	testText[10] = 0x0A9A;
  3657 	
  3658 	testText[11] = 0x0A95;
  3659 	testText[12] = 0x0ACD;
  3660 	testText[13] = 0x0A9C;	
  3661 	testText[14] = 0x200D;
  3662 	testText[15] = 0x0020;
  3663 
  3664 	testText[16] = 0x0A99;
  3665 	testText[17] = 0x0ACD;
  3666 	testText[18] = 0x0A9B;
  3667 	testText[19] = 0x0ACD;
  3668 	testText[20] = 0x0A9F;
  3669 	testText[21] = 0x0ACD;
  3670 	testText[22] = 0x0AA0;
  3671 	
  3672 	//Requirement (GUJ003)
  3673 	
  3674 	testText[23] = 0x0A95;
  3675 	testText[24] = 0x0ACD;
  3676 	testText[25] = 0x0AB7;
  3677 	
  3678 	
  3679 	testText[26] = 0x0A95;
  3680 	testText[27] = 0x0ACD;
  3681 	testText[28] = 0x0AB7;
  3682 	testText[29] = 0x0ACD;
  3683 	testText[30] = 0x0AA4;
  3684 	
  3685 	testText[31] = 0x0A9C;
  3686 	testText[32] = 0x0ACD;
  3687 	testText[33] = 0x0AB7;
  3688 	testText[34] = 0x0ACD;
  3689 	testText[35] = 0x0AA4;
  3690 	
  3691 	testText[36] = 0x0A9C;
  3692 	testText[37] = 0x0ACD;
  3693 	testText[38] = 0x0A9E;
  3694 	testText[39] = 0x0ACD;
  3695 	testText[40] = 0x0AA4;
  3696 	
  3697 	//Requirement (GUJ 005)
  3698 	
  3699 	testText[41] = 0x0AB0;
  3700 	testText[42] = 0x0ACD;
  3701 	testText[43] = 0x0A95;
  3702 	
  3703 	testText[44] = 0x0AB0;
  3704 	testText[45] = 0x0ACD;
  3705 	testText[46] = 0x0A95;
  3706 	testText[47] = 0x0AC9;
  3707 	
  3708 	testText[48] = 0x0AB0;
  3709 	testText[49] = 0x0ACD;
  3710 	testText[50] = 0x0A95;
  3711 	testText[51] = 0x0A82;
  3712 	
  3713 	testText[52] = 0x0AB0;
  3714 	testText[53] = 0x0ACD;
  3715 	testText[54] = 0x0A95;
  3716 	testText[55] = 0x0AC9;
  3717 	testText[56] = 0x0A82;
  3718 	testText[57] = 0x0020;
  3719 	
  3720 	//Requirement (GUJ 006)
  3721 	
  3722 	testText[58] = 0x0A97;
  3723 	testText[59] = 0x0ACD;
  3724 	testText[60] = 0x0AB0;
  3725 	
  3726 	testText[61] = 0x0A9A;
  3727 	testText[62] = 0x0ACD;
  3728 	testText[63] = 0x0AB0;
  3729 	
  3730 	testText[64] = 0x0A97;
  3731 	testText[65] = 0x0ACD;
  3732 	testText[66] = 0x0AB0;
  3733 	testText[67] = 0x0ACD;
  3734 	testText[68] = 0x0AA4;
  3735 	
  3736 	testText[69] = 0x0A9A;
  3737 	testText[70] = 0x0ACD;
  3738 	testText[71] = 0x0AB0;
  3739 	testText[72] = 0x0ACD;
  3740 	testText[73] = 0x0AA4;
  3741 	
  3742 	//Requirement (GUJ 007)
  3743 	
  3744 	testText[74] = 0x0A95;
  3745 	testText[75] = 0x0ACD;
  3746 	testText[76] = 0x0AB0;
  3747 	
  3748 	testText[77] = 0x0A9C;
  3749 	testText[78] = 0x0ACD;
  3750 	testText[79] = 0x0AB0;
  3751 	
  3752 	testText[80] = 0x0A95;
  3753 	testText[81] = 0x0ACD;
  3754 	testText[82] = 0x0AB0;
  3755 	testText[83] = 0x0ACD;
  3756 	testText[84] = 0x0AA4;
  3757 	
  3758 	testText[85] = 0x0A9C;
  3759 	testText[86] = 0x0ACD;
  3760 	testText[87] = 0x0AB0;
  3761 	testText[88] = 0x0ACD;
  3762 	testText[89] = 0x0AA4;
  3763 	
  3764 	//Requirement (GUJ 008)
  3765 	
  3766 	testText[90] = 0x0A9B;
  3767 	testText[91] = 0x0ACD;
  3768 	testText[92] = 0x0AB0;
  3769 	
  3770 	testText[93] = 0x0AAF;
  3771 	testText[94] = 0x0ACD;
  3772 	testText[95] = 0x0AB0;
  3773 	
  3774 	testText[96] = 0x0A9B;
  3775 	testText[97] = 0x0ACD;
  3776 	testText[98] = 0x0AB0;
  3777 	testText[99] = 0x0ACD;
  3778 	testText[100]= 0x0AA4;
  3779 	
  3780 	testText[101] = 0x0AAF;
  3781 	testText[102] = 0x0ACD;
  3782 	testText[103] = 0x0AB0;
  3783 	
  3784 	testText[104] = 0x0AAF;
  3785 	testText[105] = 0x0ACD;
  3786 	testText[106] = 0x0AB0;
  3787 	testText[107] = 0x0ACD;
  3788 	testText[108] = 0x0AA4;
  3789 	
  3790 	testText[109] = 0x0AB0;
  3791 	testText[110] = 0x0ACD;
  3792 	testText[111] = 0x0AB0;
  3793 	testText[112] = 0x0ACD;
  3794 	testText[113] = 0x0AB0;
  3795 	
  3796 	//Requirement (GUJ 009)
  3797 	
  3798 	testText[114] = 0x0A9F;
  3799 	testText[115] = 0x0ACD;
  3800 	testText[116] = 0x0AAF;
  3801 	
  3802 	testText[117] = 0x0A9B;
  3803 	testText[118] = 0x0ACD;
  3804 	testText[119] = 0x0AAF;
  3805 	
  3806 	testText[120] = 0x0AA2;
  3807 	testText[121] = 0x0ACD;
  3808 	testText[122] = 0x0AAF;
  3809 	
  3810 	testText[123] = 0x0A97;
  3811 	testText[124] = 0x0ACD;
  3812 	testText[125] = 0x0AAF;
  3813 	
  3814 	//Requirement (GUJ 010)
  3815 	
  3816 	testText[126] = 0x0A9F;
  3817 	testText[127] = 0x0ACD;
  3818 	testText[128] = 0x0AA0;
  3819 	
  3820 	testText[129] = 0x0AA6;
  3821 	testText[130] = 0x0ACD;
  3822 	testText[131] = 0x0AB5;
  3823 	
  3824 	testText[132] = 0x0A9F;
  3825 	testText[133] = 0x0ACD;
  3826 	testText[134] = 0x0AA0;
  3827 	testText[135] = 0x0ACD;
  3828 	testText[136] = 0x0AA4;
  3829 	
  3830 	
  3831 	testText[137] = 0x0AA6;
  3832 	testText[138] = 0x0ACD;
  3833 	testText[139] = 0x0AB5;
  3834 	testText[140] = 0x0ACD;
  3835 	testText[141] = 0x0AA4;
  3836 	
  3837 	//Requirement (GUJ 011)
  3838 	
  3839 	testText[142] = 0x0AB0;
  3840 	testText[143] = 0x0AC2;
  3841 	
  3842 	testText[144] = 0x0AB9;
  3843 	testText[145] = 0x0AC3;
  3844 	
  3845 	testText[146] = 0x0AA6;
  3846 	testText[147] = 0x0AC3;
  3847 	
  3848 	testText[148] = 0x0A9C;
  3849 	testText[149] = 0x0AC0;
  3850 	
  3851 	//Subscript ligutares
  3852 	
  3853 	
  3854 	testText[150] = 0x0A95;
  3855 	testText[151] = 0x0A81;
  3856 	
  3857 	testText[152] = 0x0A95;
  3858 	testText[153] = 0x0ABE;
  3859 	testText[154] = 0x0A81;
  3860 	
  3861 	testText[155] = 0x0A95;
  3862 	testText[156] = 0x0AC1;
  3863 	testText[157] = 0x0A81;
  3864 	
  3865 	testText[158] = 0x0A8D;
  3866 	testText[159] = 0x0A81;
  3867 	
  3868 	testText[160] = 0x0A88;
  3869 	testText[161] = 0x0A81;
  3870 	
  3871 	
  3872 	
  3873 	param.iText.Set(testText); 
  3874 				
  3875 	param.iPosInText = 0;
  3876 	param.iPen.iX = param.iPen.iY = 0;
  3877 	RShapeInfo shapeInfo;
  3878 	
  3879 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  3880 
  3881 	TEST(r && param.iPosInText ==  3
  3882 		   && param.iOutputGlyphs == 1  
  3883 		   && param.iOutput[0].iCode == 0x800009ec);
  3884 
  3885 	#if defined __WINS__ || defined __WINSCW__
  3886 	TEST(r && param.iPen.iX == 9);
  3887 	#endif
  3888 	
  3889 	
  3890 	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);
  3891 	
  3892 	param.iPosInText = 	4;
  3893 	param.iPen.iX = param.iPen.iY = 0;
  3894 		
  3895 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  3896 
  3897 	TEST(r && param.iPosInText ==  11
  3898 		   && param.iOutputGlyphs ==  4
  3899 		   && param.iOutput[0].iCode == 0x800009d7
  3900 		   && param.iOutput[1].iCode == 0x800009d8
  3901 		   && param.iOutput[2].iCode == 0x800009d9
  3902 		   && param.iOutput[3].iCode == 0x80000967 );
  3903 	
  3904 	#if defined __WINS__ || defined __WINSCW__
  3905 	TEST(r && param.iPen.iX == 34);
  3906 	#endif
  3907 
  3908 	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);
  3909 	
  3910 	param.iPosInText = 11;
  3911 	param.iPen.iX = param.iPen.iY = 0;
  3912 		
  3913 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  3914 
  3915 	TEST(r && param.iPosInText ==	14  
  3916 		   && param.iOutputGlyphs == 2  
  3917 		   && param.iOutput[0].iCode == 0x800009d6
  3918 		   && param.iOutput[1].iCode == 0x80000969   );
  3919 
  3920 	#if defined __WINS__ || defined __WINSCW__
  3921 	TEST(r && param.iPen.iX == 22);
  3922 	#endif
  3923 	
  3924 	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);
  3925 	
  3926 	param.iPosInText = 16;
  3927 	param.iPen.iX = param.iPen.iY = 0;
  3928 		
  3929 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  3930 
  3931 	TEST(r && param.iPosInText ==  23
  3932 		   && param.iOutputGlyphs == 3 
  3933 		   && param.iOutput[0].iCode == 0x800009da
  3934 		   && param.iOutput[1].iCode == 0x800009dc
  3935 		   && param.iOutput[2].iCode == 0x80000aad);
  3936 	
  3937 	#if defined __WINS__ || defined __WINSCW__
  3938 	TEST(r && param.iPen.iX == 30);
  3939 	#endif
  3940 	
  3941 		
  3942 	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);
  3943 	
  3944 	param.iPosInText = 	23;
  3945 	param.iPen.iX = param.iPen.iY = 0;
  3946 		
  3947 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  3948 
  3949 	TEST(r && param.iPosInText == 26
  3950 		   && param.iOutputGlyphs == 1  
  3951 		   && param.iOutput[0].iCode == 0x800009d2 );
  3952 
  3953 	#if defined __WINS__ || defined __WINSCW__
  3954 	TEST(r && param.iPen.iX == 12);
  3955 	#endif
  3956 		
  3957 	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);
  3958 
  3959 	
  3960 	param.iPosInText = 26;
  3961 	param.iPen.iX = param.iPen.iY = 0;
  3962 		
  3963 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  3964 
  3965 	TEST(r && param.iPosInText == 31
  3966 		   && param.iOutputGlyphs == 2  
  3967 		   && param.iOutput[0].iCode == 0x800009f8
  3968 		   && param.iOutput[1].iCode == 0x80000971);
  3969 
  3970 	#if defined __WINS__ || defined __WINSCW__
  3971 	TEST(r && param.iPen.iX == 18);
  3972 	#endif
  3973 	
  3974 	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);
  3975 	
  3976 	param.iPosInText = 	31;
  3977 	param.iPen.iX = param.iPen.iY = 0;
  3978 		
  3979 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  3980 
  3981 	TEST(r && param.iPosInText ==  36
  3982 		   && param.iOutputGlyphs == 3
  3983 		   && param.iOutput[0].iCode == 0x800009dd
  3984 		   && param.iOutput[1].iCode == 0x800009f5
  3985 		   && param.iOutput[2].iCode == 0x80000971);
  3986 
  3987 	#if defined __WINS__ || defined __WINSCW__
  3988 	TEST(r && param.iPen.iX == 30);
  3989 	#endif
  3990 	
  3991 	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);	
  3992 	
  3993 	param.iPosInText = 36;
  3994 	param.iPen.iX = param.iPen.iY = 0;
  3995 		
  3996 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  3997 
  3998 	TEST(r && param.iPosInText == 41
  3999 		   && param.iOutputGlyphs == 2
  4000 		   && param.iOutput[0].iCode == 0x800009f9
  4001 		   && param.iOutput[1].iCode == 0x80000971);
  4002 	
  4003 	#if defined __WINS__ || defined __WINSCW__
  4004 	TEST(r && param.iPen.iX == 17);
  4005 	#endif
  4006 
  4007 	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);
  4008 	
  4009 	param.iPosInText = 	41;
  4010 	param.iPen.iX = param.iPen.iY = 0;
  4011 		
  4012 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  4013 	
  4014 	TEST(r && param.iPosInText == 44
  4015 		   && param.iOutputGlyphs == 2
  4016 		   && param.iOutput[0].iCode ==  0x80000962
  4017 		   && param.iOutput[1].iCode == 0x800009d4);
  4018 	
  4019 	#if defined __WINS__ || defined __WINSCW__
  4020 	TEST(r && param.iPen.iX == 8);
  4021 	#endif
  4022 		
  4023 	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);
  4024 	
  4025 	param.iPosInText = 44;
  4026 	param.iPen.iX = param.iPen.iY = 0;
  4027 		
  4028 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  4029 
  4030 	TEST(r && param.iPosInText == 48 
  4031 		   && param.iOutputGlyphs == 2
  4032 		   && param.iOutput[0].iCode == 0x80000962
  4033 		   && param.iOutput[1].iCode == 0x80000ae1 );
  4034 
  4035 	#if defined __WINS__ || defined __WINSCW__
  4036 	TEST(r && param.iPen.iX == 13);
  4037 	#endif
  4038 	
  4039 	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);
  4040 	
  4041 	param.iPosInText = 48;
  4042 	param.iPen.iX = param.iPen.iY = 0;
  4043 		
  4044 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  4045 
  4046 	TEST(r && param.iPosInText == 52
  4047 		   && param.iOutputGlyphs == 2
  4048 		   && param.iOutput[0].iCode == 0x80000962
  4049 		   && param.iOutput[1].iCode == 0x80000ae9);
  4050 
  4051 	#if defined __WINS__ || defined __WINSCW__
  4052 	TEST(r && param.iPen.iX == 8);
  4053 	#endif
  4054 	
  4055 	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);
  4056 	
  4057 	param.iPosInText = 52;
  4058 	param.iPen.iX = param.iPen.iY = 0;
  4059 		
  4060 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  4061 
  4062 	TEST(r && param.iPosInText == 57  
  4063 		   && param.iOutputGlyphs == 2
  4064 		   && param.iOutput[0].iCode == 0x80000962
  4065 		   && param.iOutput[1].iCode == 0x80000ae2);
  4066 
  4067 	#if defined __WINS__ || defined __WINSCW__
  4068 	TEST(r && param.iPen.iX == 13);
  4069 	#endif
  4070 
  4071 	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);
  4072 	
  4073 	param.iPosInText = 58;
  4074 	param.iPen.iX = param.iPen.iY = 0;
  4075 		
  4076 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  4077 
  4078 	TEST(r && param.iPosInText ==  61
  4079 		   && param.iOutputGlyphs == 1
  4080 		   && param.iOutput[0].iCode ==	0x80000a1e );
  4081 
  4082 	#if defined __WINS__ || defined __WINSCW__
  4083 	TEST(r && param.iPen.iX == 11);
  4084 	#endif
  4085 		
  4086 	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);
  4087 	
  4088 	param.iPosInText = 	61;
  4089 	param.iPen.iX = param.iPen.iY = 0;
  4090 		
  4091 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  4092 
  4093 	TEST(r && param.iPosInText ==  64
  4094 		   && param.iOutputGlyphs == 1
  4095 		   && param.iOutput[0].iCode == 0x80000a21 );
  4096 
  4097 	#if defined __WINS__ || defined __WINSCW__
  4098 	TEST(r && param.iPen.iX == 10);
  4099 	#endif
  4100 
  4101 	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);
  4102 	
  4103 	param.iPosInText = 64;
  4104 	param.iPen.iX = param.iPen.iY = 0;
  4105 		
  4106 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  4107 
  4108 	TEST(r && param.iPosInText == 69 
  4109 		   && param.iOutputGlyphs == 2
  4110 		   && param.iOutput[0].iCode == 0x80000a64
  4111 		   && param.iOutput[1].iCode == 0x80000971 );
  4112 
  4113 	#if defined __WINS__ || defined __WINSCW__
  4114 	TEST(r && param.iPen.iX == 17);
  4115 	#endif
  4116 	
  4117 	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);
  4118 	
  4119 	param.iPosInText = 	69;
  4120 	param.iPen.iX = param.iPen.iY = 0;
  4121 		
  4122 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  4123 
  4124 	TEST(r && param.iPosInText == 74
  4125 		   && param.iOutputGlyphs == 2
  4126 		   && param.iOutput[0].iCode == 0x80000a67
  4127 		   && param.iOutput[1].iCode == 0x80000971);
  4128 
  4129 	#if defined __WINS__ || defined __WINSCW__
  4130 	TEST(r && param.iPen.iX == 16);
  4131 	#endif
  4132 		
  4133 	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);
  4134 	
  4135 	param.iPosInText = 	74;
  4136 	param.iPen.iX = param.iPen.iY = 0;
  4137 		
  4138 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  4139 
  4140 	TEST(r && param.iPosInText ==  77
  4141 		   && param.iOutputGlyphs == 1
  4142 		   && param.iOutput[0].iCode == 0x80000a1c);
  4143 
  4144 	#if defined __WINS__ || defined __WINSCW__
  4145 	TEST(r && param.iPen.iX == 8);
  4146 	#endif
  4147 		
  4148 	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);
  4149 	
  4150 	param.iPosInText = 	77;
  4151 	param.iPen.iX = param.iPen.iY = 0;
  4152 		
  4153 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  4154 
  4155 	TEST(r && param.iPosInText ==  80
  4156 		   && param.iOutputGlyphs == 1
  4157 		   && param.iOutput[0].iCode == 0x80000a23);
  4158 
  4159 	#if defined __WINS__ || defined __WINSCW__
  4160 	TEST(r && param.iPen.iX == 15);
  4161 	#endif
  4162 	
  4163 	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);
  4164 		
  4165 	param.iPosInText = 80;
  4166 	param.iPen.iX = param.iPen.iY = 0;
  4167 	
  4168 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  4169 
  4170 	TEST(r && param.iPosInText == 85
  4171 		   && param.iOutputGlyphs == 2
  4172 		   && param.iOutput[0].iCode == 0x80000a62
  4173 		   && param.iOutput[1].iCode == 0x80000971);
  4174 
  4175 	#if defined __WINS__ || defined __WINSCW__
  4176 	TEST(r && param.iPen.iX == 17);
  4177 	#endif
  4178 		
  4179 	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);
  4180 	
  4181 	param.iPosInText = 85;
  4182 	param.iPen.iX = param.iPen.iY = 0;
  4183 	
  4184 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  4185 
  4186 	TEST(r && param.iPosInText ==  90
  4187 		   && param.iOutputGlyphs == 2
  4188 		   && param.iOutput[0].iCode == 0x80000a69
  4189 		   && param.iOutput[1].iCode == 0x80000971);
  4190 
  4191 	#if defined __WINS__ || defined __WINSCW__
  4192 	TEST(r && param.iPen.iX == 24);
  4193 	#endif
  4194 	
  4195 	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);
  4196 	
  4197 	param.iPosInText =90;
  4198 	param.iPen.iX = param.iPen.iY = 0;
  4199 	
  4200 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  4201 
  4202 	TEST(r && param.iPosInText == 93
  4203 		   && param.iOutputGlyphs == 1
  4204 		   && param.iOutput[0].iCode == 0x80000a22 );
  4205 
  4206 	#if defined __WINS__ || defined __WINSCW__
  4207 	TEST(r && param.iPen.iX == 12);
  4208 	#endif
  4209 	
  4210 	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);
  4211 	
  4212 	param.iPosInText = 93;
  4213 	param.iPen.iX = param.iPen.iY = 0;
  4214 	
  4215 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  4216 
  4217 	TEST(r && param.iPosInText == 96
  4218 		   && param.iOutputGlyphs == 1
  4219 		   && param.iOutput[0].iCode == 0x80000a35 );
  4220 
  4221 	#if defined __WINS__ || defined __WINSCW__
  4222 	TEST(r && param.iPen.iX == 10);
  4223 	#endif
  4224 	
  4225 	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);
  4226 	
  4227 	param.iPosInText = 96;
  4228 	param.iPen.iX = param.iPen.iY = 0;
  4229 	
  4230 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  4231 
  4232 	TEST(r && param.iPosInText ==  101
  4233 		   && param.iOutputGlyphs == 2
  4234 		   && param.iOutput[0].iCode == 0x80000a68 
  4235 		   && param.iOutput[1].iCode == 0x80000971);
  4236 	
  4237 	#if defined __WINS__ || defined __WINSCW__
  4238 	TEST(r && param.iPen.iX == 21);
  4239 	#endif
  4240 	
  4241 	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);
  4242 	
  4243 	param.iPosInText = 101;
  4244 	param.iPen.iX = param.iPen.iY = 0;
  4245 	
  4246 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  4247 
  4248 	TEST(r && param.iPosInText == 104
  4249 		   && param.iOutputGlyphs == 1
  4250 		   && param.iOutput[0].iCode == 0x80000a35 );
  4251 	#if defined __WINS__ || defined __WINSCW__
  4252 	TEST(r && param.iPen.iX == 10);
  4253 	#endif
  4254 	
  4255 	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);
  4256 	
  4257 	param.iPosInText = 104;
  4258 	param.iPen.iX = param.iPen.iY = 0;
  4259 	
  4260 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  4261 
  4262 	TEST(r && param.iPosInText == 109
  4263 		   && param.iOutputGlyphs == 2
  4264 		   && param.iOutput[0].iCode == 0x80000a7b 
  4265 		   && param.iOutput[1].iCode == 0x80000971 );
  4266 
  4267 	#if defined __WINS__ || defined __WINSCW__
  4268 	TEST(r && param.iPen.iX == 16);
  4269 	#endif
  4270 	
  4271 	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);
  4272 	
  4273 	param.iPosInText = 109;
  4274 	param.iPen.iX = param.iPen.iY = 0;
  4275 	
  4276 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  4277 
  4278 	TEST(r && param.iPosInText ==  114
  4279 		   && param.iOutputGlyphs == 2
  4280 		   && param.iOutput[0].iCode == 0x80000a36
  4281 		   && param.iOutput[1].iCode == 0x800009d4 );
  4282 	
  4283 	#if defined __WINS__ || defined __WINSCW__
  4284 	TEST(r && param.iPen.iX == 7);
  4285 	#endif
  4286 	
  4287 	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);
  4288 	
  4289 	param.iPosInText = 114;
  4290 	param.iPen.iX = param.iPen.iY = 0;
  4291 	
  4292 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  4293 
  4294 	TEST(r && param.iPosInText ==  117
  4295 		   && param.iOutputGlyphs == 1
  4296 		   && param.iOutput[0].iCode == 0x80000aae);
  4297 
  4298 	#if defined __WINS__ || defined __WINSCW__
  4299 	TEST(r && param.iPen.iX == 17);
  4300 	#endif
  4301 		
  4302 	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);
  4303 	
  4304 	param.iPosInText = 117;
  4305 	param.iPen.iX = param.iPen.iY = 0;
  4306 	
  4307 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  4308 
  4309 	TEST(r && param.iPosInText ==  120
  4310 		   && param.iOutputGlyphs == 1
  4311 		   && param.iOutput[0].iCode == 0x80000aab );
  4312 
  4313 	#if defined __WINS__ || defined __WINSCW__
  4314 	TEST(r && param.iPen.iX == 21);
  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 = 120;
  4320 	param.iPen.iX = param.iPen.iY = 0;
  4321 	
  4322 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  4323 
  4324 	TEST(r && param.iPosInText ==  123
  4325 		   && param.iOutputGlyphs == 1
  4326 		   && param.iOutput[0].iCode == 0x80000ab5 );
  4327 
  4328 	#if defined __WINS__ || defined __WINSCW__
  4329 	TEST(r && param.iPen.iX == 18);
  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 = 123;
  4335 	param.iPen.iX = param.iPen.iY = 0;
  4336 	
  4337 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  4338 
  4339 	TEST(r && param.iPosInText ==  126
  4340 		   && param.iOutputGlyphs == 2
  4341 		   && param.iOutput[0].iCode == 0x800009d8
  4342 		   && param.iOutput[1].iCode == 0x8000097b);
  4343 
  4344 	#if defined __WINS__ || defined __WINSCW__
  4345 	TEST(r && param.iPen.iX == 17);
  4346 	#endif
  4347 
  4348 	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);
  4349 	
  4350 	param.iPosInText = 126;
  4351 	param.iPen.iX = param.iPen.iY = 0;
  4352 	
  4353 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  4354 
  4355 	TEST(r && param.iPosInText ==  129
  4356 		   && param.iOutputGlyphs == 1
  4357 		   && param.iOutput[0].iCode == 0x80000aad);
  4358 
  4359 	#if defined __WINS__ || defined __WINSCW__
  4360 	TEST(r && param.iPen.iX == 9);
  4361 	#endif
  4362 	
  4363 	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);
  4364 		
  4365 	param.iPosInText = 129;
  4366 	param.iPen.iX = param.iPen.iY = 0;
  4367 	
  4368 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  4369 
  4370 	TEST(r && param.iPosInText ==  132
  4371 		   && param.iOutputGlyphs == 1
  4372 		   && param.iOutput[0].iCode == 0x80000ac0 );
  4373 
  4374 	#if defined __WINS__ || defined __WINSCW__
  4375 	TEST(r && param.iPen.iX == 10);
  4376 	#endif
  4377 		
  4378 	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);
  4379 	
  4380 	param.iPosInText =132;
  4381 	param.iPen.iX = param.iPen.iY = 0;
  4382 	
  4383 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  4384 
  4385 	TEST(r && param.iPosInText ==  137
  4386 		   && param.iOutputGlyphs == 3
  4387 		   && param.iOutput[0].iCode == 0x800009e0
  4388 		   && param.iOutput[1].iCode == 0x800009e1
  4389 		   && param.iOutput[2].iCode == 0x80000971);
  4390 
  4391 	#if defined __WINS__ || defined __WINSCW__
  4392 	TEST(r && param.iPen.iX == 26);
  4393 	#endif
  4394 	
  4395 	
  4396 	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);	
  4397 	
  4398 	param.iPosInText = 137;
  4399 	param.iPen.iX = param.iPen.iY = 0;
  4400 	
  4401 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  4402 	
  4403 	TEST(r && param.iPosInText == 142 
  4404 		   && param.iOutputGlyphs == 3
  4405 		   && param.iOutput[0].iCode == 0x800009e7 
  4406 		   && param.iOutput[1].iCode == 0x800009f3
  4407 		   && param.iOutput[2].iCode == 0x80000971);
  4408 
  4409 	#if defined __WINS__ || defined __WINSCW__
  4410 	TEST(r && param.iPen.iX == 23);
  4411 	#endif
  4412 	
  4413 	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);	
  4414 	
  4415 	param.iPosInText = 142;
  4416 	param.iPen.iX = param.iPen.iY = 0;
  4417 	
  4418 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  4419 	
  4420 	TEST(r && param.iPosInText == 144
  4421 		   && param.iOutputGlyphs == 1
  4422 		   && param.iOutput[0].iCode == 0x80000b04);
  4423 
  4424 	#if defined __WINS__ || defined __WINSCW__
  4425 	TEST(r && param.iPen.iX == 7);
  4426 	#endif
  4427 	
  4428 	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);
  4429 	
  4430 	param.iPosInText = 144;
  4431 	param.iPen.iX = param.iPen.iY = 0;
  4432 	
  4433 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  4434 	
  4435 	TEST(r && param.iPosInText == 146
  4436 		   && param.iOutputGlyphs == 1
  4437 		   && param.iOutput[0].iCode == 0x80000b05);
  4438 
  4439 	#if defined __WINS__ || defined __WINSCW__
  4440 	TEST(r && param.iPen.iX == 9);
  4441 	#endif
  4442 	
  4443 	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);
  4444 	
  4445 	param.iPosInText = 146;
  4446 	param.iPen.iX = param.iPen.iY = 0;
  4447 	
  4448 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  4449 	
  4450 	TEST(r && param.iPosInText == 148
  4451 		   && param.iOutputGlyphs ==  1
  4452 		   && param.iOutput[0].iCode == 0x80000b02);
  4453 
  4454 	#if defined __WINS__ || defined __WINSCW__
  4455 	TEST(r && param.iPen.iX == 7);
  4456 	#endif
  4457 
  4458 	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);
  4459 	
  4460 	param.iPosInText = 148;
  4461 	param.iPen.iX = param.iPen.iY = 0;
  4462 	
  4463 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  4464 	
  4465 	TEST(r && param.iPosInText == 150
  4466 		   && param.iOutputGlyphs == 1
  4467 		   && param.iOutput[0].iCode == 0x80000aff);
  4468 
  4469 	#if defined __WINS__ || defined __WINSCW__
  4470 	TEST(r && param.iPen.iX == 16);
  4471 	#endif
  4472 
  4473 	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);
  4474 	
  4475 	param.iPosInText = 150;
  4476 	param.iPen.iX = param.iPen.iY = 0;
  4477 	
  4478 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  4479 	
  4480 	TEST(r && param.iPosInText == 152 
  4481 		   && param.iOutputGlyphs == 2
  4482 		   && param.iOutput[0].iCode == 0x80000962
  4483 		   && param.iOutput[1].iCode ==0x80000951);
  4484 
  4485 	#if defined __WINS__ || defined __WINSCW__
  4486 	TEST(r && param.iPen.iX == 8);
  4487 	#endif
  4488 	
  4489 	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);
  4490 
  4491 	param.iPosInText = 152;
  4492 	param.iPen.iX = param.iPen.iY = 0;
  4493 	
  4494 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  4495 	
  4496 	TEST(r && param.iPosInText == 155
  4497 		   && param.iOutputGlyphs == 3
  4498 		   && param.iOutput[0].iCode == 0x80000962
  4499 		   && param.iOutput[1].iCode == 0x80000986
  4500 		   && param.iOutput[2].iCode == 0x80000951);
  4501 
  4502 	#if defined __WINS__ || defined __WINSCW__
  4503 	TEST(r && param.iPen.iX == 12);
  4504 	#endif
  4505 
  4506 	
  4507 	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);	
  4508 	
  4509 	param.iPosInText = 155;
  4510 	param.iPen.iX = param.iPen.iY = 0;
  4511 	
  4512 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  4513 	
  4514 	TEST(r && param.iPosInText ==  158
  4515 		   && param.iOutputGlyphs == 3
  4516 		   && param.iOutput[0].iCode == 0x80000962
  4517 		   && param.iOutput[1].iCode == 0x80000989
  4518 		   && param.iOutput[2].iCode == 0x80000951);
  4519 
  4520 	#if defined __WINS__ || defined __WINSCW__
  4521 	TEST(r && param.iPen.iX == 8);
  4522 	#endif
  4523 
  4524 	
  4525 	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);	
  4526 	param.iPosInText = 158;
  4527 	param.iPen.iX = param.iPen.iY = 0;
  4528 	
  4529 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  4530 	
  4531 	TEST(r && param.iPosInText ==  160
  4532 		   && param.iOutputGlyphs == 1
  4533 		   && param.iOutput[0].iCode == 0x80000aee);
  4534 		   
  4535 	#if defined __WINS__ || defined __WINSCW__
  4536 	TEST(r && param.iPen.iX == 14);
  4537 	#endif
  4538 	
  4539 	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);
  4540 	
  4541 	param.iPosInText = 160;
  4542 	param.iPen.iX = param.iPen.iY = 0;
  4543 	
  4544 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  4545 	
  4546 	TEST(r && param.iPosInText ==  162
  4547 		   && param.iOutputGlyphs == 1
  4548 		   && param.iOutput[0].iCode == 0x80000aed);
  4549 
  4550 	#if defined __WINS__ || defined __WINSCW__
  4551 	TEST(r && param.iPen.iX == 10);
  4552 	#endif
  4553 	
  4554 	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);
  4555 	}
  4556 	
  4557 	 
  4558 void CTGlyphSelection::TestBengaliChars(CFbsFont* aFont)
  4559 	{
  4560 	INFO_PRINTF1(_L("Test Bengali Glyphs"));
  4561 	
  4562 	// Do the testing
  4563 	
  4564 	TBool r;
  4565 	TBuf<115> testText(0);
  4566 	CFont::TPositionParam param;
  4567 	param.iDirection = CFont::EHorizontal;
  4568 	param.iFlags = CFont::TPositionParam::EFLogicalOrder;
  4569 
  4570 	testText.SetLength(115);
  4571 	// Make sure there is no garbage values in the memory we are using.
  4572 	for (TInt i = 0; i < testText.Length(); i++)
  4573 		testText[i]=0xFFFF;
  4574 	
  4575 	//Testdata for Bengali language
  4576 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4002"));
  4577 /**
  4578 @SYMTestCaseID 				GRAPHICS-SYSLIB-GDI-CIT-4002
  4579 @SYMTestCaseDesc 			Automated GDI testing for Bengali
  4580 @SYMTestPriority 			High
  4581 @SYMTestActions  			Attempt to compose various invalid Bengali glyph clusters to test the requirement.
  4582 				 			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	
  4583 @SYMTestExpectedResults 	Rendering engine will render as incomplete syllables
  4584 @SYMPREQ 					1766 Bengali for Sphinx
  4585 @SYMREQ 					8741 Bengali Text Rendering
  4586 */
  4587 	
  4588 	// BEN002: Test invalid sequences
  4589 	testText[0] = 0x09C7;
  4590 	testText[1] = 0x0995;
  4591 	testText[2] = 0x0995;
  4592 	testText[3] = 0x09C1;
  4593 	testText[4] = 0x09C1;
  4594 	testText[5] = 0x0995;
  4595 	testText[6] = 0x09CD;
  4596 	testText[7] = 0x09C1;
  4597 	testText[8] = 0x0995;
  4598 	testText[9] = 0x0981;
  4599 	testText[10] = 0x09C1;
  4600 	
  4601 	param.iText.Set(testText);
  4602 	RShapeInfo shapeInfo;
  4603 	param.iPosInText = 0;
  4604 	param.iPen.iX = param.iPen.iY = 0;
  4605 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  4606 	
  4607 	TEST(r && param.iPosInText == 1
  4608 			   && param.iOutputGlyphs == 2
  4609 			   && param.iOutput[0].iCode == 0x80000ce5
  4610 			   && param.iOutput[1].iCode == 0x8000058f);
  4611 
  4612 	#if defined __WINS__ || defined __WINSCW__
  4613 	TEST(r && param.iPen.iX == 15);
  4614 	#endif
  4615 	
  4616 	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);
  4617 		
  4618 	param.iPosInText = 1;
  4619 	param.iPen.iX = param.iPen.iY = 0;
  4620 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  4621 	
  4622 	TEST(r && param.iPosInText == 2
  4623 			   && param.iOutputGlyphs == 1
  4624 			   && param.iOutput[0].iCode == 0x80000cbc);
  4625 	
  4626 	#if defined __WINS__ || defined __WINSCW__
  4627 	TEST(r && param.iPen.iX == 12);
  4628 	#endif
  4629 	
  4630 	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);
  4631 	
  4632 	param.iPosInText = 2;
  4633 	param.iPen.iX = param.iPen.iY = 0;
  4634 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  4635 	
  4636 	TEST(r && param.iPosInText == 4
  4637 			   && param.iOutputGlyphs == 1
  4638 			   && param.iOutput[0].iCode == 0x80000ebe);
  4639 
  4640 	#if defined __WINS__ || defined __WINSCW__
  4641 	TEST(r && param.iPen.iX == 13);
  4642 	#endif
  4643 	
  4644 	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);
  4645 		
  4646 	param.iPosInText = 4;
  4647 	param.iPen.iX = param.iPen.iY = 0;
  4648 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  4649 	
  4650 	TEST(r && param.iPosInText == 5
  4651 			   && param.iOutputGlyphs == 2
  4652 			   && param.iOutput[0].iCode == 0x8000058f
  4653 			   && param.iOutput[1].iCode == 0x80000ce1
  4654 	   );
  4655 	#if defined __WINS__ || defined __WINSCW__
  4656 	TEST(r && param.iPen.iX == 9);
  4657 	#endif
  4658 	
  4659 	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);
  4660 		
  4661 	param.iPosInText = 5;
  4662 	param.iPen.iX = param.iPen.iY = 0;
  4663 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  4664 	
  4665 	TEST(r && param.iPosInText == 7
  4666 			   && param.iOutputGlyphs == 2
  4667 			   && param.iOutput[0].iCode == 0x80000cbc
  4668 			   && param.iOutput[1].iCode == 0x80000ce9
  4669 			   );
  4670 	
  4671 	#if defined __WINS__ || defined __WINSCW__
  4672 	TEST(r && param.iPen.iX == 12);
  4673 	#endif
  4674 	
  4675 	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);
  4676 	
  4677 	param.iPosInText = 7;
  4678 	param.iPen.iX = param.iPen.iY = 0;
  4679 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  4680 
  4681 	TEST(r && param.iPosInText == 8
  4682 			   && param.iOutputGlyphs == 2
  4683 			   && param.iOutput[0].iCode == 0x8000058f
  4684 			   && param.iOutput[1].iCode == 0x80000ce1
  4685 			   );
  4686 	
  4687 	#if defined __WINS__ || defined __WINSCW__
  4688 	TEST(r && param.iPen.iX == 9);
  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 = 8;
  4694 	param.iPen.iX = param.iPen.iY = 0;
  4695 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  4696 	
  4697 	TEST(r && param.iPosInText == 10
  4698 			   && param.iOutputGlyphs == 2
  4699 			   && param.iOutput[0].iCode == 0x80000cbc
  4700 			   && param.iOutput[1].iCode == 0x80000cad
  4701 			   );
  4702 	
  4703 	#if defined __WINS__ || defined __WINSCW__
  4704 	TEST(r && param.iPen.iX == 12);
  4705 	#endif
  4706 	
  4707 	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);
  4708 	
  4709 	param.iPosInText = 10;
  4710 	param.iPen.iX = param.iPen.iY = 0;
  4711 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  4712 	
  4713 	TEST(r && param.iPosInText == 11
  4714 			   && param.iOutputGlyphs == 2
  4715 			   && param.iOutput[0].iCode == 0x8000058f
  4716 			   && param.iOutput[1].iCode == 0x80000ce1
  4717 			   );
  4718 	
  4719 	#if defined __WINS__ || defined __WINSCW__
  4720 	TEST(r && param.iPen.iX == 9);
  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 	TRAPD(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-4003"));
  4728 /**
  4729 @SYMTestCaseID 				GRAPHICS-SYSLIB-GDI-CIT-4003
  4730 @SYMTestCaseDesc 			Automated GDI testing for Bengali
  4731 @SYMTestPriority 			High
  4732 @SYMTestActions  
  4733 							Passing both Bengali and Latin scripts simultaneously
  4734 @SYMTestExpectedResults 	The expected glyph clusters for given Unicode characters must be returned
  4735 @SYMPREQ 					1766 Bengali for Sphinx
  4736 @SYMREQ 					8741 Bengali Text Rendering
  4737 */
  4738 	//BEN003
  4739 	testText[11] = 0x0995;
  4740 	testText[12] = 0x0041; // Unicode value for A
  4741 	testText[13] = 0x09E6;	//Bengali digit 1
  4742 	
  4743 	param.iPosInText = 11;
  4744 	param.iPen.iX = param.iPen.iY = 0;
  4745 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  4746 	
  4747 	TEST(r && param.iPosInText == 12
  4748 			   && param.iOutputGlyphs == 1
  4749 			   && param.iOutput[0].iCode == 0x80000cbc
  4750 			   );
  4751 
  4752 	#if defined __WINS__ || defined __WINSCW__
  4753 	TEST(r && param.iPen.iX == 12);
  4754 	#endif
  4755 	
  4756 	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);
  4757 	
  4758 	param.iPosInText = 12;
  4759 	param.iPen.iX = param.iPen.iY = 0;
  4760 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  4761 
  4762 	TEST(r && param.iPosInText == 13	
  4763 			   && param.iOutputGlyphs == 1
  4764 			   && param.iOutput[0].iCode == 0x41
  4765 	  	);
  4766 	
  4767 	#if defined __WINS__ || defined __WINSCW__
  4768 	TEST(r && param.iPen.iX == 10);
  4769 	#endif
  4770 	
  4771 	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);
  4772 	
  4773 	param.iPosInText = 13;
  4774 	param.iPen.iX = param.iPen.iY = 0;
  4775 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  4776 	
  4777 	TEST(r && param.iPosInText == 14
  4778 			   && param.iOutputGlyphs == 1
  4779 			   && param.iOutput[0].iCode ==0x80000cf3
  4780 			   );
  4781 
  4782 	#if defined __WINS__ || defined __WINSCW__
  4783 	TEST(r && param.iPen.iX == 10);
  4784 	#endif
  4785 	
  4786 	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);
  4787 	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  4788     	if (err!=KErrNone)
  4789     		INFO_PRINTF1(_L("Failed to record test result"));
  4790 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4004"));
  4791 /**
  4792 @SYMTestCaseID 				GRAPHICS-SYSLIB-GDI-CIT-4004
  4793 @SYMTestCaseDesc 			Automated GDI testing for Bengali
  4794 @SYMTestPriority 			High
  4795 @SYMTestActions  			Attempt to compose various valid  Bengali glyph clusters to test the reequirement.
  4796 							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.
  4797 							Invalid sequences of characters must be rendered as incomplete syllables
  4798 							
  4799 @SYMTestExpectedResults 	The expected glyph clusters for given Unicode characters must be returned
  4800 @SYMPREQ 					1766: Bengali for Sphinx
  4801 @SYMREQ 					8741:  Bengali Text Rendering
  4802 */
  4803 	// BEN004: 
  4804 	testText[14] = 0x0985;
  4805 	testText[15] = 0x09A4;
  4806 	testText[16] = 0x09CD;
  4807 	testText[17] = 0x09AF;
  4808 	testText[18] = 0x09A8;
  4809 	testText[19] = 0x09CD;
  4810 	testText[20] = 0x09A4;
  4811 	
  4812 	param.iPosInText = 14;
  4813 	param.iPen.iX = param.iPen.iY = 0;
  4814 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  4815 	
  4816 	TEST(r && param.iPosInText == 15
  4817 			   && param.iOutputGlyphs == 1
  4818 			   && param.iOutput[0].iCode == 0x80000cb0
  4819 			   );
  4820 	
  4821 	#if defined __WINS__ || defined __WINSCW__
  4822 	TEST(r && param.iPen.iX == 14);
  4823 	#endif
  4824 	
  4825 	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);
  4826 		
  4827 	param.iPosInText = 15;
  4828 	param.iPen.iX = param.iPen.iY = 0;
  4829 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  4830 	
  4831 	TEST(r && param.iPosInText == 18
  4832 			   && param.iOutputGlyphs == 2
  4833 			   && param.iOutput[0].iCode ==0x80000ccb
  4834 			   && param.iOutput[1].iCode ==0x80000d6e
  4835 			   );
  4836 
  4837 	#if defined __WINS__ || defined __WINSCW__
  4838 	TEST(r && param.iPen.iX == 16);
  4839 	#endif
  4840 	
  4841 	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);
  4842 	
  4843 	param.iPosInText = 18;
  4844 	param.iPen.iX = param.iPen.iY = 0;
  4845 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  4846 
  4847 	TEST(r && param.iPosInText == 21
  4848 			   && param.iOutputGlyphs == 1
  4849 			   && param.iOutput[0].iCode == 0x80000e14
  4850 			   );
  4851 	
  4852 	#if defined __WINS__ || defined __WINSCW__
  4853 	TEST(r && param.iPen.iX == 13);
  4854 	#endif
  4855 	
  4856 	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);
  4857 	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  4858     	if (err!=KErrNone)
  4859     		INFO_PRINTF1(_L("Failed to record test result"));
  4860 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4005"));
  4861 // BEN005
  4862 /**
  4863 @SYMTestCaseID 				GRAPHICS-SYSLIB-GDI-CIT-4005
  4864 @SYMTestCaseDesc 			Automated GDI testing for Bengali
  4865 @SYMTestPriority 			High
  4866 @SYMTestActions  			Attempt to compose various valid Bengali glyph clusters to test the requirment
  4867 							Text rendering must be able to display specified character sequences using ligatures and set of ligatures (stable/unstable) must be font dependent / configurable.
  4868 @SYMTestExpectedResults 	The expected glyph clusters for given Unicode characters must be returned
  4869 @SYMPREQ 					1766: Bengali for Sphinx
  4870 @SYMREQ 					8741:  Bengali Text Rendering
  4871 */
  4872 	testText[21] = 0x0995;
  4873 	testText[22] = 0x09CD;
  4874 	testText[23] = 0x09B7;
  4875 	
  4876 	testText[24] = 0x09A4;
  4877 	testText[25] = 0x09CD;
  4878 	testText[26] = 0x09B0;
  4879 	
  4880 	testText[27] = 0x09A6;
  4881 	testText[28] = 0x09CD;
  4882 	testText[29] = 0x09A6;
  4883 	
  4884 	
  4885 	param.iPosInText = 21;
  4886 	param.iPen.iX = param.iPen.iY = 0;
  4887 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  4888 	
  4889 	TEST(r && param.iPosInText == 24
  4890 			   && param.iOutputGlyphs == 1
  4891 			   && param.iOutput[0].iCode == 0x80000d25
  4892 			   );
  4893 
  4894 	#if defined __WINS__ || defined __WINSCW__
  4895 	TEST(r && param.iPen.iX == 15);
  4896 	#endif
  4897 	
  4898 	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);
  4899 		
  4900 	param.iPosInText = 24;
  4901 	param.iPen.iX = param.iPen.iY = 0;
  4902 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  4903 	
  4904 	TEST(r && param.iPosInText == 27
  4905 			   && param.iOutputGlyphs == 1
  4906 			   && param.iOutput[0].iCode ==0x80000d89
  4907 			   );
  4908 
  4909 	#if defined __WINS__ || defined __WINSCW__
  4910 	TEST(r && param.iPen.iX == 12);
  4911 	#endif
  4912 	
  4913 	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);
  4914 		
  4915 	param.iPosInText = 27;
  4916 	param.iPen.iX = param.iPen.iY = 0;
  4917 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  4918 	
  4919 	TEST(r && param.iPosInText == 30
  4920 			   && param.iOutputGlyphs == 1
  4921 			   && param.iOutput[0].iCode == 0x80000e0a
  4922 			   );
  4923 	
  4924 	#if defined __WINS__ || defined __WINSCW__
  4925 	TEST(r && param.iPen.iX == 13);
  4926 	#endif
  4927 	
  4928 	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);
  4929 	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  4930     	if (err!=KErrNone)
  4931     		INFO_PRINTF1(_L("Failed to record test result"));
  4932 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4006"));
  4933 // BEN006
  4934 /**
  4935 @SYMTestCaseID 				GRAPHICS-SYSLIB-GDI-CIT-4006
  4936 @SYMTestCaseDesc 			Automated GDI testing for Bengali
  4937 @SYMTestPriority		 	High
  4938 @SYMTestActions  			Attempt to compose various valid Bengali glyph clusters to test 
  4939 							whether tamil digits are recongized as numerals. 
  4940 @SYMTestExpectedResults 	The expected glyph clusters for given Unicode characters must be returned
  4941 @SYMPREQ 					1766: Bengali for Sphinx
  4942 @SYMREQ 					8741:  Bengali Text Rendering
  4943 */
  4944 	testText[30] = 0x09E6; // Bengali 1
  4945 	testText[31] = 0x0030; //Basic Latin 0
  4946 	
  4947 	
  4948 	param.iPosInText = 30;
  4949 	param.iPen.iX = param.iPen.iY = 0;
  4950 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  4951 	
  4952 	TEST(r && param.iPosInText == 31
  4953 			   && param.iOutputGlyphs == 1
  4954 			   && param.iOutput[0].iCode == 0x80000cf3
  4955 			   );
  4956 	
  4957 	#if defined __WINS__ || defined __WINSCW__
  4958 	TEST(r && param.iPen.iX == 10);
  4959 	#endif
  4960 	
  4961 	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);
  4962 	
  4963 	param.iPosInText = 31;
  4964 	param.iPen.iX = param.iPen.iY = 0;
  4965 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  4966 	
  4967 	TEST(r && param.iPosInText == 32
  4968 			   && param.iOutputGlyphs == 1
  4969 			   && param.iOutput[0].iCode == 0x80000774	 
  4970 			   );
  4971 	
  4972 	#if defined __WINS__ || defined __WINSCW__
  4973 	TEST(r && param.iPen.iX == 8);
  4974 	#endif
  4975 	
  4976 	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);
  4977 	
  4978 	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  4979     	if (err!=KErrNone)
  4980     		INFO_PRINTF1(_L("Failed to record test result"));
  4981 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4007"));
  4982 //BEN 008
  4983 /**
  4984 @SYMTestCaseID 				GRAPHICS-SYSLIB-GDI-CIT-4007
  4985 @SYMTestCaseDesc 			Automated GDI testing for Bengali
  4986 @SYMTestPriority 			High
  4987 @SYMTestActions  			Attempt to compose various valid
  4988 							All text handling processes ((rendering, editing, searching, sorting etc.)  MUST treat the sequence of a base consonant and a nukta equivalently to Nukta consonants
  4989 @SYMTestExpectedResults 	The expected glyph clusters for given Unicode characters must be returned
  4990 @SYMPREQ 					1766: Bengali for Sphinx
  4991 @SYMREQ 					8741:  Bengali Text Rendering
  4992 */
  4993 	testText[32] = 0x09AF;
  4994 	testText[33] = 0x09BC;
  4995 	testText[34] = 0x09DF;
  4996 	
  4997 	param.iPosInText = 32;
  4998 	param.iPen.iX = param.iPen.iY = 0;
  4999 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  5000 	
  5001 	TEST(r && param.iPosInText == 34
  5002 			   && param.iOutputGlyphs == 1
  5003 			   && param.iOutput[0].iCode == 0x80000cee	 
  5004 			   );
  5005 
  5006 	#if defined __WINS__ || defined __WINSCW__
  5007 	TEST(r && param.iPen.iX == 10);
  5008 	#endif
  5009 	
  5010 	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);
  5011 	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  5012     	if (err!=KErrNone)
  5013     		INFO_PRINTF1(_L("Failed to record test result"));
  5014 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4008"));
  5015 // BEN011
  5016 /**
  5017 @SYMTestCaseID 				GRAPHICS-SYSLIB-GDI-CIT-4008
  5018 @SYMTestCaseDesc 			Automated GDI testing for Bengali
  5019 @SYMTestPriority 			High
  5020 @SYMTestActions  			Attempt to compose various valid Bengali glyph clusters to test 
  5021 							Rendering engine must be capable of handling joining formatters.
  5022 @SYMTestExpectedResults 	The expected glyph clusters for given Unicode characters must be returned
  5023 @SYMPREQ 					1766: Bengali for Sphinx
  5024 @SYMREQ 					8741:  Bengali Text Rendering
  5025 */
  5026 	testText[35] = 0x0995;
  5027 	testText[36] = 0x09CD;
  5028 	testText[37] = 0x09B7;
  5029 	
  5030 	testText[38] = 0x0995;
  5031 	testText[39] = 0x09CD;
  5032 	testText[40] = 0x200C;
  5033 	testText[42] = 0x09B7;
  5034 	
  5035 	testText[43] = 0x0995;
  5036 	testText[44] = 0x09CD;
  5037 	testText[45] = 0x200D;
  5038 	testText[46] = 0x09B7;
  5039 	
  5040 	
  5041 	param.iPosInText = 35;
  5042 	param.iPen.iX = param.iPen.iY = 0;
  5043 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  5044 
  5045 	TEST(r && param.iPosInText == 38
  5046 			   && param.iOutputGlyphs == 1
  5047 			   && param.iOutput[0].iCode == 0x80000d25
  5048 			   );
  5049 	
  5050 	#if defined __WINS__ || defined __WINSCW__
  5051 	TEST(r && param.iPen.iX == 15);
  5052 	#endif
  5053 	
  5054 	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);
  5055 		
  5056 	param.iPosInText = 38;
  5057 	param.iPen.iX = param.iPen.iY = 0;
  5058 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  5059 	
  5060 	TEST(r && param.iPosInText == 40
  5061 			   && param.iOutputGlyphs == 2
  5062 			   && param.iOutput[0].iCode == 0x80000cbc
  5063 			   && param.iOutput[1].iCode == 0x80000ce9
  5064 			   );
  5065 
  5066 	#if defined __WINS__ || defined __WINSCW__
  5067 	TEST(r && param.iPen.iX == 12);
  5068 	#endif
  5069 	
  5070 	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);
  5071 		
  5072 	param.iPosInText = 43;
  5073 	param.iPen.iX = param.iPen.iY = 0;
  5074 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  5075 	
  5076 	TEST(r && param.iPosInText == 47
  5077 			   && param.iOutputGlyphs == 2
  5078 			   && param.iOutput[0].iCode == 0x80000d2a
  5079 			   && param.iOutput[1].iCode == 0x80000cd9
  5080 			   );
  5081 	
  5082 	#if defined __WINS__ || defined __WINSCW__
  5083 	TEST(r && param.iPen.iX == 22);
  5084 	#endif
  5085 	
  5086 	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);
  5087 		
  5088 	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  5089     	if (err!=KErrNone)
  5090     		INFO_PRINTF1(_L("Failed to record test result"));
  5091 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4009"));
  5092 // BEN012
  5093 	
  5094 /**
  5095 @SYMTestCaseID 				GRAPHICS-SYSLIB-GDI-CIT-4009
  5096 @SYMTestCaseDesc 			Automated GDI testing for Bengali
  5097 @SYMTestPriority 			High
  5098 @SYMTestActions  			Attempt to compose various valid Bengali glyph clusters to test
  5099  							If consonant /ya/, /ra/, /la/, /ma/, /na/ or /ba/, is the last element of a consonant cluster, the consonant assumes a phala form.
  5100 @SYMTestExpectedResults 	The expected glyph clusters for given Unicode characters must be returned
  5101 @SYMPREQ 					1766: Bengali for Sphinx
  5102 @SYMREQ 					8741:  Bengali Text Rendering
  5103 */
  5104 	testText[47] = 0x09AA;
  5105 	testText[48] = 0x09CD;
  5106 	testText[49] = 0x09AF;
  5107 	
  5108 	testText[50] = 0x09AA;
  5109 	testText[51] = 0x09CD;
  5110 	testText[52] = 0x09A8;
  5111 	
  5112 	// Not working with Series60Sans font:
  5113 	testText[53] = 0x09AA;
  5114 	testText[54] = 0x09CD;
  5115 	testText[55] = 0x09AE;
  5116 	
  5117 	param.iPosInText = 47;
  5118 	param.iPen.iX = param.iPen.iY = 0;
  5119 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  5120 	
  5121 	TEST(r && param.iPosInText == 50
  5122 			   && param.iOutputGlyphs == 2
  5123 			   && param.iOutput[0].iCode == 0x80000cd0
  5124 			   );
  5125 	
  5126 	#if defined __WINS__ || defined __WINSCW__
  5127 	TEST(r && param.iPen.iX == 15);
  5128 	#endif
  5129 	
  5130 	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);
  5131 	
  5132 	param.iPosInText = 50;
  5133 	param.iPen.iX = param.iPen.iY = 0;
  5134 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  5135 	
  5136 	TEST(r && param.iPosInText == 53
  5137 			   && param.iOutputGlyphs == 1
  5138 			   && param.iOutput[0].iCode == 0x80000e25
  5139 			   );
  5140 	
  5141 	#if defined __WINS__ || defined __WINSCW__
  5142 	TEST(r && param.iPen.iX == 11);
  5143 	#endif
  5144 	
  5145 	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);
  5146 	// Not working with Series60Sans font:
  5147 	param.iPosInText = 53;
  5148 	param.iPen.iX = param.iPen.iY = 0;
  5149 	
  5150 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  5151 	
  5152 	TEST(r && param.iPosInText == 56
  5153 	   && param.iOutputGlyphs == 2
  5154 	   && param.iOutput[0].iCode == 0x80000d3e 
  5155 	   && param.iOutput[1].iCode == 0x80000cd4
  5156 	  	);
  5157 
  5158 	#if defined __WINS__ || defined __WINSCW__
  5159 	TEST(r && param.iPen.iX == 19);
  5160 	#endif
  5161 	
  5162 	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);	
  5163 	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  5164     	if (err!=KErrNone)
  5165     		INFO_PRINTF1(_L("Failed to record test result"));
  5166 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4010"));
  5167 // BEN013	
  5168 /**
  5169 @SYMTestCaseID 				GRAPHICS-SYSLIB-GDI-CIT-4010
  5170 @SYMTestCaseDesc 			Automated GDI testing for Bengali
  5171 @SYMTestPriority 			High
  5172 @SYMTestActions  			Attempt to compose various valid Bengali glyph clusters to tet 
  5173 							Sequence <virama, ya>, i.e. ya-phala, MUST be allowed after independent vowels /a/ and /e/.
  5174 @SYMTestExpectedResults 	The expected glyph clusters for given Unicode characters must be returned
  5175 @SYMPREQ 					1766: Bengali for Sphinx
  5176 @SYMREQ 					8741:  Bengali Text Rendering
  5177 */
  5178 	testText[56] = 0x0985;
  5179 	testText[57] = 0x09CD;
  5180 	testText[58] = 0x09AF;
  5181 	testText[59] = 0x09BE;
  5182 	
  5183 	// Double ya -> Ya, ya-phala
  5184 	testText[60] = 0x09AA;
  5185 	testText[61] = 0x09CD;
  5186 	testText[62] = 0x09AF;
  5187 	testText[63] = 0x09CD;
  5188 	testText[64] = 0x09AF;
  5189 	
  5190 	param.iPosInText = 56;
  5191 	param.iPen.iX = param.iPen.iY = 0;
  5192 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  5193 	#if defined __WINS__ || defined __WINSCW__
  5194 	TEST(r && param.iPosInText == 57
  5195 			   && param.iPen.iX == 14
  5196 			   && param.iOutputGlyphs == 1
  5197 			   && param.iOutput[0].iCode == 0x80000cb0
  5198 			   );
  5199 	#elif defined __ARMCC__
  5200 	TEST(r && param.iPosInText == 57
  5201 			   && param.iOutputGlyphs == 1
  5202 			   && param.iOutput[0].iCode == 0x80000cb0
  5203 			   );
  5204 	#endif
  5205 	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);
  5206 	
  5207 	param.iPosInText = 57;
  5208 	param.iPen.iX = param.iPen.iY = 0;
  5209 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  5210 	
  5211 	TEST(r && param.iPosInText == 58
  5212 			   && param.iOutputGlyphs == 0	
  5213 			   );
  5214 	
  5215 	#if defined __WINS__ || defined __WINSCW__
  5216 	TEST(r && param.iPen.iX == 0);
  5217 	#endif
  5218 	
  5219 	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);
  5220 	
  5221 	param.iPosInText = 60;
  5222 	param.iPen.iX = param.iPen.iY = 0;
  5223 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  5224 	
  5225 	TEST(r && param.iPosInText == 65
  5226 			   && param.iOutputGlyphs == 3
  5227 			   && param.iOutput[0].iCode == 0x80000d3e
  5228 			   && param.iOutput[1].iCode == 0x80000cd5
  5229 			   && param.iOutput[2].iCode == 0x80000d6e
  5230 			   );
  5231 	
  5232 	#if defined __WINS__ || defined __WINSCW__
  5233 	TEST(r && param.iPen.iX == 23);
  5234 	#endif
  5235 	
  5236 	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);
  5237 	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  5238     	if (err!=KErrNone)
  5239     		INFO_PRINTF1(_L("Failed to record test result"));
  5240 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4011"));
  5241 	// BEN014
  5242 	/**
  5243 @SYMTestCaseID 				GRAPHICS-SYSLIB-GDI-CIT-4011
  5244 @SYMTestCaseDesc 			Automated GDI testing for Bengali
  5245 @SYMTestPriority 			High
  5246 @SYMTestActions  			Attempt to compose various valid and glyph clusters to test 
  5247 						 	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.
  5248 @SYMTestExpectedResults 	The expected glyph clusters for given Unicode characters must be returned
  5249 @SYMPREQ 					1766: Bengali for Sphinx
  5250 @SYMREQ 					8741:  Bengali Text Rendering
  5251 */
  5252 	testText[65] = 0x0997;
  5253 	testText[66] = 0x09CD;
  5254 	testText[67] = 0x099C;
  5255 	
  5256 	testText[68] = 0x09AA;
  5257 	testText[69] = 0x09CD;
  5258 	testText[70] = 0x099C;
  5259 	
  5260 	
  5261 	param.iPosInText = 65;
  5262 	param.iPen.iX = param.iPen.iY = 0;
  5263 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  5264 	
  5265 	TEST(r && param.iPosInText == 68
  5266 			   && param.iOutputGlyphs == 2
  5267 			   && param.iOutput[0].iCode == 0x80000d2c
  5268 			   && param.iOutput[1].iCode == 0x80000cc3
  5269 			   );
  5270 	
  5271 	#if defined __WINS__ || defined __WINSCW__
  5272 	TEST(r && param.iPen.iX == 21);
  5273 	#endif
  5274 	
  5275 	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);
  5276 		
  5277 	param.iPosInText = 68;
  5278 	param.iPen.iX = param.iPen.iY = 0;
  5279 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  5280 	
  5281 	TEST(r && param.iPosInText == 71
  5282 			   && param.iOutputGlyphs == 2
  5283 			   && param.iOutput[0].iCode == 0x80000d3e
  5284 			   );
  5285 	
  5286 	#if defined __WINS__ || defined __WINSCW__
  5287 	TEST(r && param.iPen.iX == 23);
  5288 	#endif
  5289 	
  5290 	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);
  5291 		
  5292 	
  5293 	// BEN015
  5294 	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  5295     	if (err!=KErrNone)
  5296     		INFO_PRINTF1(_L("Failed to record test result"));
  5297 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4012"));
  5298 	/**
  5299 @SYMTestCaseID 				GRAPHICS-SYSLIB-GDI-CIT-4012
  5300 @SYMTestCaseDesc 			Automated GDI testing for Bengali
  5301 @SYMTestPriority 			High
  5302 @SYMTestActions  			Attempt to compose various valid Bengali glyph clusters to test 
  5303  							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.
  5304 @SYMTestExpectedResults 	The expected glyph clusters for given Unicode characters must be returned
  5305 @SYMPREQ 					1766: Bengali for Sphinx
  5306 @SYMREQ 					8741:  Bengali Text Rendering
  5307 */
  5308 	testText[71] = 0x0995;
  5309 	testText[72] = 0x09CD;
  5310 	testText[73] = 0x099C;
  5311 	
  5312 	
  5313 	param.iPosInText = 71;
  5314 	param.iPen.iX = param.iPen.iY = 0;
  5315 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  5316 	
  5317 	TEST(r && param.iPosInText == 74
  5318 			   && param.iOutputGlyphs == 2
  5319 			   && param.iOutput[0].iCode == 0x80000d2a  
  5320 			   );
  5321 	
  5322 	#if defined __WINS__ || defined __WINSCW__
  5323 	TEST(r && param.iPen.iX == 26);
  5324 	#endif
  5325 	
  5326 	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);
  5327 
  5328 	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  5329     	if (err!=KErrNone)
  5330     		INFO_PRINTF1(_L("Failed to record test result"));
  5331 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4013"));
  5332 	// BEN016
  5333 	
  5334 	/**
  5335 @SYMTestCaseID 				GRAPHICS-SYSLIB-GDI-CIT-4013
  5336 @SYMTestCaseDesc 			Automated GDI testing for Bengali
  5337 @SYMTestPriority 			High
  5338 @SYMTestActions  			Attempt to compose various valid Bengali glyph clusters to test
  5339  							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.
  5340 @SYMTestExpectedResults 	The expected glyph clusters for given Unicode characters must be returned
  5341 @SYMPREQ 					1766: Bengali for Sphinx
  5342 @SYMREQ 					8741:  Bengali Text Rendering
  5343 */
  5344 	// Ma does not stack correctly on top with Series60Sans font, produces half form instead. Font defect.
  5345 	testText[74] = 0x09AE;
  5346 	testText[75] = 0x09CD;
  5347 	testText[76] = 0x09A5;
  5348 	
  5349 	testText[77] = 0x09AE;
  5350 	testText[78] = 0x09CD;
  5351 	testText[79] = 0x09AB;
  5352 	// Ma does not stack correctly on top, produces half form instead.
  5353 	testText[80] = 0x09AE;
  5354 	testText[81] = 0x09CD;
  5355 	testText[82] = 0x0995;
  5356 	
  5357 	testText[83] = 0x09A8;
  5358 	testText[84] = 0x09CD;
  5359 	testText[85] = 0x09A5;
  5360 	
  5361 	
  5362 	//Combination pa,virama,ma produces incorrect glyph mapping: Font defect.
  5363 
  5364 	param.iPosInText = 74;
  5365 	param.iPen.iX = param.iPen.iY = 0;
  5366 	
  5367 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  5368 	
  5369 	TEST(r && param.iPosInText == 77		 
  5370 		   && param.iOutputGlyphs == 2
  5371 		   && param.iOutput[0].iCode == 0x80000d42 
  5372 		   && param.iOutput[1].iCode == 0x80000ccc
  5373 	);
  5374 	
  5375 	#if defined __WINS__ || defined __WINSCW__
  5376 	TEST(r && param.iPen.iX == 21);
  5377 	#endif
  5378 	
  5379 	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);
  5380 	
  5381 	
  5382 	param.iPosInText = 77;
  5383 	param.iPen.iX = param.iPen.iY = 0;
  5384 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  5385 	
  5386 	TEST(r && param.iPosInText == 80
  5387 			   && param.iOutputGlyphs == 1
  5388 			   && param.iOutput[0].iCode == 0x80000e30
  5389 			   );
  5390 	
  5391 	#if defined __WINS__ || defined __WINSCW__
  5392 	TEST(r && param.iPen.iX == 19);
  5393 	#endif
  5394 	
  5395 	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);
  5396 	
  5397 	// Ma does not stack correctly on top, produces half form instead.
  5398 	param.iPosInText = 80;
  5399 	param.iPen.iX = param.iPen.iY = 0;
  5400 	
  5401 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  5402 	
  5403 	TEST(r && param.iPosInText == 83
  5404 	   && param.iOutputGlyphs == 2
  5405 	   && param.iOutput[0].iCode == 0x80000d42
  5406 	);
  5407 	
  5408 	#if defined __WINS__ || defined __WINSCW__
  5409 	TEST(r && param.iPen.iX == 22);
  5410 	#endif
  5411 
  5412 	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);
  5413 	
  5414 	
  5415 	param.iPosInText = 83;
  5416 	param.iPen.iX = param.iPen.iY = 0;
  5417 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  5418 
  5419 	TEST(r && param.iPosInText == 86
  5420 			   && param.iOutputGlyphs == 1
  5421 			   && param.iOutput[0].iCode == 0x80000e15
  5422 			   );
  5423 	
  5424 	#if defined __WINS__ || defined __WINSCW__
  5425 	TEST(r && param.iPen.iX == 10);
  5426 	#endif
  5427 	
  5428 	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);
  5429 	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  5430     	if (err!=KErrNone)
  5431     		INFO_PRINTF1(_L("Failed to record test result"));
  5432 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4014"));
  5433 	// BEN017
  5434 	
  5435 	/**
  5436 @SYMTestCaseID 				GRAPHICS-SYSLIB-GDI-CIT-4014
  5437 @SYMTestCaseDesc 			Automated GDI testing for Bengali
  5438 @SYMTestPriority 			High
  5439 @SYMTestActions  			Attempt to compose various valid Bengali glyph clusters to test
  5440  							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.
  5441 @SYMTestExpectedResults 	The expected glyph clusters for given Unicode characters must be returned
  5442 @SYMPREQ 					1766: Bengali for Sphinx
  5443 @SYMREQ 					8741:  Bengali Text Rendering
  5444 */
  5445 	testText[86] = 0x0995;
  5446 	testText[87] = 0x09CD;
  5447 	testText[88] = 0x099F;
  5448 	
  5449 	testText[89] = 0x0995;
  5450 	testText[90] = 0x09CD;
  5451 	testText[91] = 0x09A4;
  5452 	
  5453 	// Not sure if this is forming the correct ligature
  5454 	testText[92] = 0x09AE;
  5455 	testText[93] = 0x09CD;
  5456 	testText[94] = 0x09AA;
  5457 		
  5458 	// Not sure if this is forming the correct ligature
  5459 	testText[95] = 0x09B8;
  5460 	testText[96] = 0x09CD;
  5461 	testText[97] = 0x09AA;
  5462 	
  5463 	testText[98] = 0x09B9;
  5464 	testText[99] = 0x09CD;
  5465 	testText[100] = 0x09A8;
  5466 	
  5467 	param.iPosInText = 86;
  5468 	param.iPen.iX = param.iPen.iY = 0;
  5469 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  5470 	
  5471 	TEST(r && param.iPosInText == 89
  5472 			   && param.iOutputGlyphs == 1
  5473 			   && param.iOutput[0].iCode == 0x80000dd7
  5474 			   );
  5475 	
  5476 	#if defined __WINS__ || defined __WINSCW__
  5477 	TEST(r && param.iPen.iX == 12);
  5478 	#endif
  5479 	
  5480 	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);
  5481 	
  5482 	param.iPosInText = 89;
  5483 	param.iPen.iX = param.iPen.iY = 0;
  5484 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  5485 	
  5486 	TEST(r && param.iPosInText == 92
  5487 			   && param.iOutputGlyphs == 1
  5488 			   && param.iOutput[0].iCode == 0x80000dd9
  5489 			   );
  5490 	
  5491 	#if defined __WINS__ || defined __WINSCW__
  5492 	TEST(r && param.iPen.iX == 15);
  5493 	#endif
  5494 	
  5495 	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);
  5496 	
  5497 	param.iPosInText = 92;
  5498 	param.iPen.iX = param.iPen.iY = 0;
  5499 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  5500 	
  5501 	TEST(r && param.iPosInText == 95
  5502 			   && param.iOutputGlyphs == 1
  5503 			   && param.iOutput[0].iCode == 0x80000e2f
  5504 			   );
  5505 
  5506 	#if defined __WINS__ || defined __WINSCW__
  5507 	TEST(r && param.iPen.iX == 19);
  5508 	#endif
  5509 	
  5510 	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);
  5511 		
  5512 	param.iPosInText = 95;
  5513 	param.iPen.iX = param.iPen.iY = 0;
  5514 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  5515 	
  5516 	TEST(r && param.iPosInText == 98
  5517 			   && param.iOutputGlyphs == 1
  5518 			   && param.iOutput[0].iCode == 0x80000e56
  5519 			   );
  5520 	
  5521 	#if defined __WINS__ || defined __WINSCW__
  5522 	TEST(r && param.iPen.iX == 20);
  5523 	#endif
  5524 	
  5525 	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);	
  5526 	
  5527 	param.iPosInText = 98;
  5528 	param.iPen.iX = param.iPen.iY = 0;
  5529 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  5530 	
  5531 	TEST(r && param.iPosInText == 101	
  5532 			   && param.iOutputGlyphs == 1
  5533 			   && param.iOutput[0].iCode == 0x80000e5d	
  5534 			   );
  5535 
  5536 	#if defined __WINS__ || defined __WINSCW__
  5537 	TEST(r && param.iPen.iX == 13);
  5538 	#endif
  5539 	
  5540 	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);
  5541 	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  5542     	if (err!=KErrNone)
  5543     		INFO_PRINTF1(_L("Failed to record test result"));
  5544 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4015"));
  5545 // BEN020
  5546 /**
  5547 @SYMTestCaseID 				GRAPHICS-SYSLIB-GDI-CIT-4015
  5548 @SYMTestCaseDesc 			Automated GDI testing for Bengali
  5549 @SYMTestPriority 			High
  5550 @SYMTestActions  			Attempt to compose various valid Bengali glyph clusters to test that
  5551  							If RA is the first consonant cluster, it must assume the form of Repha.
  5552 @SYMTestExpectedResults 	The expected glyph clusters for given Unicode characters must be returned
  5553 @SYMPREQ 					1766: Bengali for Sphinx
  5554 @SYMREQ 					8741:  Bengali Text Rendering
  5555 */
  5556 	testText[101] = 0x09B0;
  5557 	testText[102] = 0x09CD;
  5558 	testText[103] = 0x0995;
  5559 	
  5560 	testText[104] = 0x09B0;
  5561 	testText[105] = 0x200C;
  5562 	testText[106] = 0x09CD;
  5563 	testText[107] = 0x09AF;
  5564 	
  5565 	param.iPosInText = 101;
  5566 	param.iPen.iX = param.iPen.iY = 0;
  5567 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  5568 	
  5569 	TEST(r && param.iPosInText == 104
  5570 			   && param.iOutputGlyphs == 2
  5571 			   && param.iOutput[0].iCode == 0x80000cbc
  5572 			   && param.iOutput[1].iCode == 0x80000d27
  5573 			   );
  5574 	
  5575 	#if defined __WINS__ || defined __WINSCW__
  5576 	TEST(r && param.iPen.iX == 12);
  5577 	#endif
  5578 	
  5579 	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);
  5580 		
  5581 	param.iPosInText =104;
  5582 	param.iPen.iX = param.iPen.iY = 0;
  5583 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  5584 	
  5585 	TEST(r && param.iPosInText == 105
  5586 			   && param.iOutputGlyphs == 1
  5587 			   && param.iOutput[0].iCode == 0x80000cd6
  5588 			   );
  5589 
  5590 	#if defined __WINS__ || defined __WINSCW__
  5591 	TEST(r && param.iPen.iX == 9);
  5592 	#endif
  5593 	
  5594 	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);
  5595 		
  5596 	}
  5597 
  5598 
  5599 void CTGlyphSelection::TestTamilChars(CFbsFont* aFont)
  5600 	{
  5601 INFO_PRINTF1(_L("Test Tamil Glyphs"));
  5602  
  5603   	TBool r;
  5604 	TBuf<162> testText(0);
  5605 	CFont::TPositionParam param;
  5606 	param.iDirection = CFont::EHorizontal;
  5607 	param.iFlags = CFont::TPositionParam::EFLogicalOrder;
  5608 
  5609 	testText.SetLength(162);
  5610 	// Make sure there is no garbage values in the memory we are using.
  5611 	for (TInt i = 0; i < testText.Length(); i++)
  5612 		testText[i]=0xFFFF;
  5613 	param.iText.Set(testText);
  5614 	RShapeInfo shapeInfo;
  5615 	//Testdata for Tamil Langauage
  5616 	TRAPD(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  5617     	if (err!=KErrNone)
  5618     		INFO_PRINTF1(_L("Failed to record test result"));
  5619 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4016"));
  5620 /*	
  5621 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4016
  5622 @SYMTestCaseDesc Automated GDI testing for Tamil
  5623 @SYMTestPriority High
  5624 @SYMTestActions  Attempt to compose various valid Tamil glyph clusters to test 
  5625   	 a)The Tamil alphabets are listed in contiguous Unicode range(U+0B80–U+0BFF),  This also contains Tamil Numbers.
  5626 	 b)The Tamil alphabets are listed in contiguous Unicode range(U+0B80–U+0BFF),  This also contains Tamil Numbers.
  5627 	 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
  5628 	 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
  5629 	 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.
  5630 @SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
  5631 @SYMPREQ 1766: Tamil for Sphinx
  5632 @SYMREQ 8742:Tamil Text Rendering
  5633 */
  5634 	testText[0] = 0x0B95; //Tamil Ka
  5635 	testText[1] = 0x0B8E; //Tamil e
  5636 	testText[2] = 0x0061; //Latin A
  5637 	testText[3] = 0x0905; // Hindi Ka
  5638 	testText[4] = 0x0020;
  5639 	// Do the testing
  5640 	param.iPosInText = 0 ;
  5641 	param.iPen.iX = param.iPen.iY = 0;
  5642 	
  5643 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  5644 
  5645 	TEST(r && param.iPosInText == 1  
  5646 		   && param.iOutputGlyphs == 1
  5647 		   && param.iOutput[0].iCode == 0x80000bf6);
  5648 
  5649 	#if defined __WINS__ || defined __WINSCW__
  5650 	TEST(r && param.iPen.iX == 13);
  5651 	#endif
  5652 	
  5653 	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);
  5654 	
  5655 	param.iPosInText = 1 ;
  5656 	param.iPen.iX = param.iPen.iY = 0;
  5657 	
  5658 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  5659 	
  5660 	TEST(r && param.iPosInText ==  2 
  5661 		   && param.iOutputGlyphs == 1
  5662 		   && param.iOutput[0].iCode == 0x80000bf0);
  5663 
  5664 	#if defined __WINS__ || defined __WINSCW__
  5665 	TEST(r && param.iPen.iX == 14);
  5666 	#endif
  5667 	
  5668 	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);
  5669 	
  5670 	param.iPosInText = 2 ;
  5671 	param.iPen.iX = param.iPen.iY = 0;
  5672 	
  5673 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  5674 	
  5675 	TEST(r && param.iPosInText == 3
  5676 		   && param.iOutputGlyphs == 1
  5677 		   && param.iOutput[0].iCode == 0x61 );
  5678 
  5679 	#if defined __WINS__ || defined __WINSCW__
  5680 	TEST(r && param.iPen.iX == 10);
  5681 	#endif
  5682 	
  5683 	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);
  5684 	param.iPosInText = 3 ;
  5685 	param.iPen.iX = param.iPen.iY = 0;
  5686 	
  5687 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  5688 	
  5689 	TEST(r && param.iPosInText == 4  
  5690 		   && param.iOutputGlyphs == 1
  5691 		   && param.iOutput[0].iCode == 0x80000528);
  5692 
  5693 	#if defined __WINS__ || defined __WINSCW__
  5694 	TEST(r && param.iPen.iX == 12);
  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 	
  5699 	/*Req 02 1.2.3, 1.3.21, 1.3.21.1, 1.3.21.2 1.3.21.3
  5700 	
  5701 	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. 
  5702 	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
  5703 Please see the attachment for examples
  5704 	1.3.21.1 For normal rendering, combining Tamil characters must be preceded by a valid base character. 
  5705 	1.3.21.2 Combining Tamil characters that do not follow a valid base character must be rendered using an appropriate fallback rendering.
  5706 	1.3.21.3 Device must not hang or crash because of unexpected character sequences.*/
  5707 	
  5708 	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  5709     	if (err!=KErrNone)
  5710     		INFO_PRINTF1(_L("Failed to record test result"));
  5711 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4017"));
  5712 //Req 03 
  5713 	
  5714 /**
  5715 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4017
  5716 @SYMTestCaseDesc Automated GDI testing for Tamil
  5717 @SYMTestPriority High
  5718 @SYMTestActions  Attempt to compose various valid Tamil glyph clusters to test 
  5719 				 It is reasonably common to mix Latin, Tamil as well as other script in texts.  This must include the numerals.
  5720 @SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
  5721 @SYMPREQ 1766: Tamil for Sphinx
  5722 @SYMREQ 8742:Tamil Text Rendering
  5723 */
  5724 	testText[4] = 0x0036;//Latin 06
  5725 	testText[5] = 0x0BEC;//Tamil 06
  5726 	
  5727 	param.iPosInText = 4 ;
  5728 	param.iPen.iX = param.iPen.iY = 0;
  5729 	
  5730 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  5731 	
  5732 	TEST(r && param.iPosInText == 5  
  5733 		   && param.iOutputGlyphs == 1
  5734 		   && param.iOutput[0].iCode == 0x8000077A);
  5735 	
  5736 	#if defined __WINS__ || defined __WINSCW__
  5737 	TEST(r && param.iPen.iX == 8);
  5738 	#endif
  5739 
  5740 	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);
  5741 		
  5742 	param.iPosInText = 5 ;
  5743 	param.iPen.iX = param.iPen.iY = 0;
  5744 	
  5745 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  5746 	
  5747 	TEST(r && param.iPosInText == 6  
  5748 		   && param.iOutputGlyphs == 1
  5749 		   && param.iOutput[0].iCode == 0x80000c20);
  5750 
  5751 	#if defined __WINS__ || defined __WINSCW__
  5752 	TEST(r && param.iPen.iX == 16);
  5753 	#endif
  5754 	
  5755 	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);
  5756 
  5757 	/*Req 04 1.3.4, 1.3.20
  5758 	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.
  5759 			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.
  5760 			3. After a syllable has been formed it must be considered an indivisible and invariable unit.
  5761 			4. The shape of a syllable is not affected by surrounding syllables.
  5762 	1.3.20 Syllable is the smallest unbreakable component in Tamil*/
  5763 	
  5764 	/*Req 07 1.3.5
  5765 	
  5766 	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
  5767 			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
  5768 	
  5769 	Req 08 1.3.19
  5770 	
  5771 	1.3.19 In Tamil white space is used as a word boundary. Line breaking should be based on word boundaries
  5772 	
  5773 	
  5774 	Req 09 1.2.4
  5775 	
  5776 	1.2.4 For compatibility with legacy encodings, split matra and vowel representations must be recognized as identical to the single code representations (preferred)
  5777 	*/
  5778 	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  5779     	if (err!=KErrNone)
  5780     		INFO_PRINTF1(_L("Failed to record test result"));
  5781 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4018"));
  5782 //Req 10 1.3.6	
  5783 /**
  5784 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4018
  5785 @SYMTestCaseDesc Automated GDI testing for Tamil
  5786 @SYMTestPriority High
  5787 @SYMTestActions  Attempt to compose various valid Tamil glyph clusters to test the requirement.
  5788 				 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.
  5789 @SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
  5790 @SYMPREQ 1766: Tamil for Sphinx
  5791 @SYMREQ 8742:Tamil Text Rendering
  5792 */
  5793 	testText[6] = 0x0BAA; // Pa
  5794 	testText[7] = 0x0BCD; //Virama
  5795 	testText[8] = 0x0B95; //Ka
  5796 	testText[9] = 0x0BCD; //Virama
  5797 	testText[10] = 0x0B9F; //Tta
  5798 	testText[11] = 0x0BC7; //-e
  5799 	
  5800 	testText[12] = 0x0BAA;//Pa
  5801 	testText[13] = 0x0BCD;//Virama
  5802 	testText[14] = 0x0B95;//Ka
  5803 	testText[15] = 0x0BCC;//AU
  5804 	
  5805 	testText[16] = 0x0B95; //Ka
  5806 	testText[17] = 0x0BCD; //Virama
  5807 	testText[18] = 0x0BB7; //Ssa
  5808 	testText[19] = 0x0BCB; //OO
  5809 	
  5810 	param.iPosInText = 6 ;
  5811 	param.iPen.iX = param.iPen.iY = 0;
  5812 	
  5813 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  5814 	
  5815 	TEST(r && param.iPosInText == 12    
  5816 		   && param.iOutputGlyphs == 4
  5817 		   && param.iOutput[0].iCode == 0x80000c3a
  5818 		   && param.iOutput[1].iCode == 0x80000c30  
  5819 		   && param.iOutput[2].iCode == 0x80000c13
  5820 		   && param.iOutput[3].iCode == 0x80000bfb);
  5821 	
  5822 	#if defined __WINS__ || defined __WINSCW__
  5823 	TEST(r && param.iPen.iX == 51);
  5824 	#endif
  5825 	
  5826 	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);
  5827 	
  5828 	param.iPosInText = 12 ;
  5829 	param.iPen.iX = param.iPen.iY = 0;
  5830 	
  5831 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  5832 	
  5833 	TEST(r && param.iPosInText ==  16 
  5834 		   && param.iOutputGlyphs ==4 
  5835 		   && param.iOutput[0].iCode == 0x80000c3a 
  5836 		   && param.iOutput[1].iCode == 0x80000c12 
  5837 		   && param.iOutput[2].iCode == 0x80000bf6
  5838 		   && param.iOutput[3].iCode == 0x80000c19);
  5839 	
  5840 	#if defined __WINS__ || defined __WINSCW__
  5841 	TEST(r && param.iPen.iX == 56);
  5842 	#endif
  5843 	
  5844 	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);
  5845 	
  5846 	param.iPosInText = 16 ;
  5847 	param.iPen.iX = param.iPen.iY = 0;
  5848 	
  5849 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  5850 	
  5851 	TEST(r && param.iPosInText == 20  
  5852 		   && param.iOutputGlyphs == 3
  5853 		   && param.iOutput[0].iCode == 0x80000c13
  5854 		   && param.iOutput[1].iCode == 0x80000c2f  
  5855 		   && param.iOutput[2].iCode == 0x80000c0d);
  5856 
  5857 	#if defined __WINS__ || defined __WINSCW__
  5858 	TEST(r && param.iPen.iX == 54);
  5859 	#endif
  5860 	
  5861 	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);
  5862 	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  5863     	if (err!=KErrNone)
  5864     		INFO_PRINTF1(_L("Failed to record test result"));
  5865 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4019"));
  5866 //Req 11
  5867 /**
  5868 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4019
  5869 @SYMTestCaseDesc Automated GDI testing for Tamil
  5870 @SYMTestPriority High
  5871 @SYMTestActions  Attempt to compose various valid Tamil glyph clusters to test the requirement
  5872 				 Matras /-e/, /-ee/ and /-ai/ are reordered with the consonant they follow in memory order.
  5873 @SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
  5874 @SYMPREQ 1766: Tamil for Sphinx
  5875 @SYMREQ 8742:Tamil Text Rendering
  5876 */
  5877 
  5878 	testText[20] = 0x0B95; //Ka
  5879 	testText[21] = 0x0BC7; //-e
  5880 	
  5881 	param.iPosInText = 20 ;
  5882 	param.iPen.iX = param.iPen.iY = 0;
  5883 	
  5884 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  5885 	
  5886 	TEST(r && param.iPosInText == 22  
  5887 		   && param.iOutputGlyphs == 2
  5888 		   && param.iOutput[0].iCode == 0x80000c13 
  5889 		   && param.iOutput[1].iCode == 0x80000bf6 );
  5890 	
  5891 	#if defined __WINS__ || defined __WINSCW__
  5892 	TEST(r && param.iPen.iX == 26);
  5893 	#endif
  5894 	
  5895 	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); 
  5896 	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  5897     	if (err!=KErrNone)
  5898     		INFO_PRINTF1(_L("Failed to record test result"));
  5899 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4020"));
  5900 //Req 12 1.3.5.2
  5901 /**
  5902 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4020
  5903 @SYMTestCaseDesc Automated GDI testing for Tamil
  5904 @SYMTestPriority High
  5905 @SYMTestActions  Attempt to compose various valid Tamil glyph clusters to test the requirment
  5906 				 Matras /-o/, /-oo/ and /-au/ are split into two halves that enclose the consonant they follow in memory order.
  5907 @SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
  5908 @SYMPREQ 1766: Tamil for Sphinx
  5909 @SYMREQ 8742:Tamil Text Rendering
  5910 */
  5911 
  5912 	testText[22] = 0x0B95; //Ka
  5913 	testText[23] = 0x0BCA; //O
  5914 	
  5915 	
  5916 	param.iPosInText = 22 ;
  5917 	param.iPen.iX = param.iPen.iY = 0;
  5918 	
  5919 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  5920 	
  5921 	TEST(r && param.iPosInText ==  24 
  5922 		   && param.iOutputGlyphs == 3
  5923 		   && param.iOutput[0].iCode == 0x80000c12
  5924 		   && param.iOutput[1].iCode == 0x80000bf6   
  5925 		   && param.iOutput[2].iCode == 0x80000c0d);
  5926 
  5927 	#if defined __WINS__ || defined __WINSCW__
  5928 	TEST(r && param.iPen.iX == 37);
  5929 	#endif
  5930 	
  5931 	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);
  5932 	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  5933     	if (err!=KErrNone)
  5934     		INFO_PRINTF1(_L("Failed to record test result"));
  5935 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4021"));
  5936 	//Req 13 
  5937 /**
  5938 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4021
  5939 @SYMTestCaseDesc Automated GDI testing for Tamil
  5940 @SYMTestPriority High
  5941 @SYMTestActions  Attempt to compose various valid Tamil glyph clusters to test the requirment.
  5942 				Tamil Modifier "Ayatham" MUST be treated as an independent character
  5943 @SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
  5944 @SYMPREQ 1766: Tamil for Sphinx
  5945 @SYMREQ 8742:Tamil Text Rendering
  5946 */
  5947 
  5948 	testText[24] = 0x0B95; //Ka
  5949 	testText[25] = 0x0B83; //Aythem
  5950 	testText[26] = 0x0B85; //A
  5951 	
  5952 	param.iPosInText = 24;
  5953 	param.iPen.iX = param.iPen.iY = 0;
  5954 	
  5955 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  5956 	
  5957 	TEST(r && param.iPosInText ==  25 
  5958 		   && param.iOutputGlyphs == 1
  5959 		   && param.iOutput[0].iCode == 0x80000bf6);
  5960 
  5961 	#if defined __WINS__ || defined __WINSCW__
  5962 	TEST(r && param.iPen.iX == 13);
  5963 	#endif
  5964 	
  5965 	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);
  5966 	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  5967     	if (err!=KErrNone)
  5968     		INFO_PRINTF1(_L("Failed to record test result"));
  5969 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4022"));
  5970 //Req 14 
  5971 /**
  5972 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4022
  5973 @SYMTestCaseDesc Automated GDI testing for Tamil
  5974 @SYMTestPriority High
  5975 @SYMTestActions  Attempt to compose various valid Tamil glyph clusters to test the requirement. 
  5976 			 	Rendering Engine MUST be capable of handling TAMIL ANUSVARA
  5977 				It has been suggested that this character be deprecated in Unicode
  5978 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
  5979 @SYMPREQ 1766: Tamil for Sphinx
  5980 @SYMREQ 8742:Tamil Text Rendering
  5981 */
  5982 	
  5983 	testText[27] = 0x0B95; //Ka
  5984 	testText[28] = 0x0B82; //Anusvara
  5985 	testText[29] = 0x0B95; //Ka
  5986 	
  5987 	param.iPosInText = 27;
  5988 	param.iPen.iX = param.iPen.iY = 0;
  5989 	
  5990 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  5991 	
  5992 	TEST(r && param.iPosInText ==  29 
  5993 		   && param.iOutputGlyphs == 2 
  5994 		   && param.iOutput[0].iCode == 0x80000bf6
  5995 		   && param.iOutput[1].iCode == 0x80000be8);
  5996 
  5997 	#if defined __WINS__ || defined __WINSCW__
  5998 	TEST(r && param.iPen.iX == 19);
  5999 	#endif
  6000 	
  6001 	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);
  6002 	param.iPosInText = 29;
  6003 	param.iPen.iX = param.iPen.iY = 0;
  6004 	
  6005 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  6006 	
  6007 	TEST(r && param.iPosInText ==  30 
  6008 		   && param.iOutputGlyphs == 1
  6009 		   && param.iOutput[0].iCode == 0x80000bf6 );
  6010 
  6011 	#if defined __WINS__ || defined __WINSCW__
  6012 	TEST(r && param.iPen.iX == 13);
  6013 	#endif 
  6014 	
  6015 	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);
  6016 	
  6017 	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  6018     	if (err!=KErrNone)
  6019     		INFO_PRINTF1(_L("Failed to record test result"));
  6020 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4023"));
  6021 //Req 15
  6022 /**
  6023 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4023
  6024 @SYMTestCaseDesc Automated GDI testing for Tamil
  6025 @SYMTestPriority High
  6026 @SYMTestActions  Attempt to compose various valid Tamil glyph clusters to test the requirment
  6027 				 Tamil consonant /ra/ changes its shape, when a virama is applied to it.
  6028 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
  6029 @SYMPREQ 1766: Tamil for Sphinx
  6030 @SYMREQ 8742:Tamil Text Rendering
  6031 */
  6032 
  6033 	testText[30] = 0x0BB0; //Ra
  6034 	testText[31] = 0x0BCD; //Virama
  6035 	testText[32] = 0x8205; //ZWJ
  6036 	
  6037 	
  6038 	param.iPosInText =  30;
  6039 	param.iPen.iX = param.iPen.iY = 0;
  6040 	
  6041 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  6042 	
  6043 	TEST(r && param.iPosInText ==  32 
  6044 		   && param.iOutputGlyphs == 2 
  6045 		   && param.iOutput[0].iCode == 0x80000c03 );
  6046 
  6047 	#if defined __WINS__ || defined __WINSCW__
  6048 	TEST(r && param.iPen.iX == 10);
  6049 	#endif 
  6050 	
  6051 	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);
  6052 	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  6053     	if (err!=KErrNone)
  6054     		INFO_PRINTF1(_L("Failed to record test result"));
  6055 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4024"));
  6056 //Req 16 
  6057 /**
  6058 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4024
  6059 @SYMTestCaseDesc Automated GDI testing for Tamil
  6060 @SYMTestPriority High
  6061 @SYMTestActions  Attempt to compose various valid Tamil glyph clusters to test 
  6062 				Matra /-aa/ is combined to consonants in regular fashion. No extra shaping is required.
  6063 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
  6064 @SYMPREQ 1766: Tamil for Sphinx
  6065 @SYMREQ 8742:Tamil Text Rendering
  6066 */
  6067 
  6068 	testText[33] = 0x0B95; //Ka
  6069 	testText[34] = 0x0B82; //Anusvara
  6070 	
  6071 	param.iPosInText = 33 ;
  6072 	param.iPen.iX = param.iPen.iY = 0;
  6073 	
  6074 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  6075 	
  6076 	TEST(r && param.iPosInText == 35  
  6077 		   && param.iOutputGlyphs == 2 
  6078 		   && param.iOutput[0].iCode == 0x80000bf6 );
  6079 
  6080 	#if defined __WINS__ || defined __WINSCW__
  6081 	TEST(r && param.iPen.iX == 19);
  6082 	#endif 
  6083 	
  6084 	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);
  6085 	
  6086 	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  6087     	if (err!=KErrNone)
  6088     		INFO_PRINTF1(_L("Failed to record test result"));
  6089 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4025"));
  6090 //Req 17 1.3.11
  6091 /**
  6092 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4025
  6093 @SYMTestCaseDesc Automated GDI testing for Tamil
  6094 @SYMTestPriority High
  6095 @SYMTestActions  Attempt to compose various valid Tamil glyph clusters to test 
  6096 					Matras /-i/ and /-ii/ MUST form a ligature with consonant /tta/.
  6097 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
  6098 @SYMPREQ 1766: Tamil for Sphinx
  6099 @SYMREQ 8742:Tamil Text Rendering
  6100 */
  6101 
  6102 	testText[35] = 0x0B9F; //Tta
  6103 	testText[36] = 0x0BBF; //I
  6104 	
  6105 	testText[37] = 0x0B9F; //Tta
  6106 	testText[38] = 0x0BC0; //Ii
  6107 	
  6108 	param.iPosInText = 35 ;
  6109 	param.iPen.iX = param.iPen.iY = 0;
  6110 	
  6111 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  6112 	
  6113 	TEST(r && param.iPosInText ==  37 
  6114 		   && param.iOutputGlyphs == 1
  6115 		   && param.iOutput[0].iCode == 0x80000c51);
  6116 
  6117 	#if defined __WINS__ || defined __WINSCW__
  6118 	TEST(r && param.iPen.iX == 15);
  6119 	#endif
  6120 	
  6121 	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);
  6122 	
  6123 	param.iPosInText = 37 ;
  6124 	param.iPen.iX = param.iPen.iY = 0;
  6125 	
  6126 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  6127 	
  6128 	TEST(r && param.iPosInText ==  39
  6129 		   && param.iOutputGlyphs == 1 
  6130 		   && param.iOutput[0].iCode == 0x80000c52);
  6131 	
  6132 	#if defined __WINS__ || defined __WINSCW__
  6133 	TEST(r && param.iPen.iX == 13);
  6134 	#endif 
  6135 	
  6136 	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);
  6137 	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  6138     	if (err!=KErrNone)
  6139     		INFO_PRINTF1(_L("Failed to record test result"));
  6140 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4026"));
  6141 //Req 18 	
  6142 /**
  6143 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4026
  6144 @SYMTestCaseDesc Automated GDI testing for Tamil
  6145 @SYMTestPriority High
  6146 @SYMTestActions  Attempt to compose various valid Tamil glyph clusters to test 
  6147 				Consonant /ra/ takes an alternate shape when combined with matras /-i/ and /-ii/.
  6148 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
  6149 @SYMPREQ 1766: Tamil for Sphinx
  6150 @SYMREQ 8742:Tamil Text Rendering
  6151 */	
  6152 	testText[39] = 0x0BB0; //Ra
  6153 	testText[40] = 0x0BBF; //I
  6154 	
  6155 	testText[41] = 0x0BB0; //Ra
  6156 	testText[42] = 0x0BC0; //Ii
  6157 	
  6158 	param.iPosInText = 39 ;
  6159 	param.iPen.iX = param.iPen.iY = 0;
  6160 	
  6161 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  6162 	
  6163 	TEST(r && param.iPosInText == 41  
  6164 		   && param.iOutputGlyphs == 2
  6165 		   && param.iOutput[0].iCode == 0x80000c0d
  6166 		   && param.iOutput[1].iCode == 0x80000c0e );
  6167 
  6168 	#if defined __WINS__ || defined __WINSCW__
  6169 	TEST(r && param.iPen.iX == 13);
  6170 	#endif 
  6171 	
  6172 	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);
  6173 	
  6174 	param.iPosInText = 41 ;
  6175 	param.iPen.iX = param.iPen.iY = 0;
  6176 	
  6177 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  6178 	
  6179 	TEST(r && param.iPosInText ==  43
  6180 		   && param.iOutputGlyphs == 2
  6181 		   && param.iOutput[0].iCode == 0x80000c0d 
  6182 		   && param.iOutput[1].iCode == 0x80000c0f);
  6183 	
  6184 	#if defined __WINS__ || defined __WINSCW__
  6185 	TEST(r && param.iPen.iX == 13);
  6186 	#endif
  6187 	
  6188 	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);
  6189 	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  6190     	if (err!=KErrNone)
  6191     		INFO_PRINTF1(_L("Failed to record test result"));
  6192 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4027"));
  6193 //Req 19 
  6194 /**
  6195 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4027
  6196 @SYMTestCaseDesc Automated GDI testing for Tamil
  6197 @SYMTestPriority High
  6198 @SYMTestActions  Attempt to compose various valid Tamil glyph clusters to test the requirement
  6199 				 Matras /-i/ and /-ii/ take an alternate form when applied to consonants /nga/, /pa/, /ya/ and /va/.
  6200 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
  6201 @SYMPREQ 1766: Tamil for Sphinx
  6202 @SYMREQ 8742:Tamil Text Rendering
  6203 */
  6204 	testText[43] = 0x0B99; //Nga
  6205 	testText[44] = 0x0BBF; //I
  6206 	
  6207 	testText[45] = 0x0B99; //Nga
  6208 	testText[46] = 0x0BC0; //Ii
  6209 	
  6210 	param.iPosInText = 43 ;
  6211 	param.iPen.iX = param.iPen.iY = 0;
  6212 	
  6213 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  6214 	
  6215 	TEST(r && param.iPosInText ==  45 
  6216 		   && param.iOutputGlyphs == 2
  6217 		   && param.iOutput[0].iCode == 0x80000bf7
  6218 		   && param.iOutput[1].iCode == 0x80000c0e );
  6219 
  6220 	#if defined __WINS__ || defined __WINSCW__
  6221 	TEST(r && param.iPen.iX == 19);
  6222 	#endif
  6223 	
  6224 	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);
  6225 	param.iPosInText = 45 ;
  6226 	param.iPen.iX = param.iPen.iY = 0;
  6227 	
  6228 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  6229 	
  6230 	TEST(r && param.iPosInText ==  47
  6231 		   && param.iOutputGlyphs == 1
  6232 		   && param.iOutput[0].iCode == 0x80000c4a );
  6233 
  6234 	#if defined __WINS__ || defined __WINSCW__
  6235 	TEST(r && param.iPen.iX == 17);
  6236 	#endif 
  6237 	
  6238 	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);
  6239 	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  6240     	if (err!=KErrNone)
  6241     		INFO_PRINTF1(_L("Failed to record test result"));
  6242 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4028"));
  6243 	
  6244 //Req 20 		
  6245 /**
  6246 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4028
  6247 @SYMTestCaseDesc Automated GDI testing for Tamil
  6248 @SYMTestPriority High
  6249 @SYMTestActions  Attempt to compose various valid Tamil glyph clusters to test the requirement. 
  6250 				 Matras /-u/ and /-uu/ join in ligature form with all other consonants than /ha/, /ja/, /sa/, /ssa/ and /k.ssa/.
  6251 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
  6252 @SYMPREQ 1766: Tamil for Sphinx
  6253 @SYMREQ 8742:Tamil Text Rendering
  6254 */
  6255 	testText[47] = 0x0B9C; //Ja
  6256 	testText[48] = 0x0BC1; //U
  6257 	
  6258 	testText[49] = 0x0B9C; //Ja
  6259 	testText[50] = 0x0BC2; //Uu
  6260 	
  6261 	param.iPosInText = 47 ;
  6262 	param.iPen.iX = param.iPen.iY = 0;
  6263 	
  6264 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  6265 	
  6266 	TEST(r && param.iPosInText == 49  
  6267 		   && param.iOutputGlyphs == 2 
  6268 		   && param.iOutput[0].iCode == 0x80000bf9
  6269 		   && param.iOutput[1].iCode == 0x80000c10);
  6270 
  6271 	#if defined __WINS__ || defined __WINSCW__
  6272 	TEST(r && param.iPen.iX == 26);
  6273 	#endif
  6274 	
  6275 	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);
  6276 	
  6277 	param.iPosInText = 49;
  6278 	param.iPen.iX = param.iPen.iY = 0;
  6279 	
  6280 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  6281 	
  6282 	TEST(r && param.iPosInText ==  51
  6283 		   && param.iOutputGlyphs == 2
  6284 		   && param.iOutput[0].iCode == 0x80000bf9
  6285 		   && param.iOutput[1].iCode == 0x80000c11 );
  6286 
  6287 	#if defined __WINS__ || defined __WINSCW__
  6288 	TEST(r && param.iPen.iX == 29);
  6289 	#endif
  6290 	
  6291 	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);
  6292 	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  6293     	if (err!=KErrNone)
  6294     		INFO_PRINTF1(_L("Failed to record test result"));
  6295 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4029"));
  6296 //Req 21 1.3.15		
  6297 /**
  6298 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4029
  6299 @SYMTestCaseDesc Automated GDI testing for Tamil
  6300 @SYMTestPriority High
  6301 @SYMTestActions  Attempt to compose various valid Tamil glyph clusters to test the requirement. 
  6302 				 Matra /-ai/ is combined to consonants in regular fashion. No extra shaping is required. 
  6303 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
  6304 @SYMPREQ 1766: Tamil for Sphinx
  6305 @SYMREQ 8742:Tamil Text Rendering
  6306 */
  6307 	testText[51] = 0x0B95; //Ka
  6308 	testText[52] = 0x0BC8; //Ai
  6309 	
  6310 	param.iPosInText = 51;
  6311 	param.iPen.iX = param.iPen.iY = 0;
  6312 	
  6313 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  6314 	
  6315 	TEST(r && param.iPosInText == 53  		   
  6316 		   && param.iOutputGlyphs == 2
  6317 		   && param.iOutput[0].iCode == 0x80000c14
  6318 		   && param.iOutput[1].iCode == 0x80000bf6);
  6319 
  6320 	#if defined __WINS__ || defined __WINSCW__
  6321 	TEST(r && param.iPen.iX == 31);
  6322 	#endif
  6323 	
  6324 	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);
  6325 	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  6326     	if (err!=KErrNone)
  6327     		INFO_PRINTF1(_L("Failed to record test result"));
  6328 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4030"));
  6329 //Req 22
  6330 /**
  6331 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4030
  6332 @SYMTestCaseDesc Automated GDI testing for Tamil
  6333 @SYMTestPriority High
  6334 @SYMTestActions  Attempt to compose various valid Tamil glyph clusters to test the requirement
  6335 				 Consonant cluster <ka, virama, ssa> MUST always form conjunct consonant /k.ssa/, which behaves as if it were a proper consonant of its own
  6336 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
  6337 @SYMPREQ 1766: Tamil for Sphinx
  6338 @SYMREQ 8742:Tamil Text Rendering
  6339 */
  6340 	testText[53] = 0x0B95; //Ka
  6341 	testText[54] = 0x0BCD; //Virama
  6342 	testText[55] = 0x0BB7; //Ssa
  6343 	
  6344 	param.iPosInText =  53;
  6345 	param.iPen.iX = param.iPen.iY = 0;
  6346 	
  6347 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  6348 	
  6349 	TEST(r && param.iPosInText == 56  
  6350 		   && param.iOutputGlyphs == 1
  6351 		   && param.iOutput[0].iCode == 0x80000c2f );
  6352 
  6353 	#if defined __WINS__ || defined __WINSCW__
  6354 	TEST(r && param.iPen.iX == 31);
  6355 	#endif
  6356 	
  6357 	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);
  6358 	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  6359     	if (err!=KErrNone)
  6360     		INFO_PRINTF1(_L("Failed to record test result"));
  6361 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4031"));
  6362 //Req 23 1.3.17
  6363 /**
  6364 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4031
  6365 @SYMTestCaseDesc Automated GDI testing for Tamil
  6366 @SYMTestPriority High
  6367 @SYMTestActions  Attempt to compose various valid Tamil glyph clusters to test 
  6368 				Character sequence <sa, virama, ra, matra_ii> MUST be rendered as a ligature form /s.rii/.
  6369 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
  6370 @SYMPREQ 1766: Tamil for Sphinx
  6371 @SYMREQ 8742:Tamil Text Rendering
  6372 */
  6373 	testText[56] = 0x0BB8; //Sa
  6374 	testText[57] = 0x0BCD; //Virama
  6375 	testText[58] = 0x0BB0; //Ra
  6376 	testText[59] = 0x0BC0; //Matra I
  6377 	
  6378 	param.iPosInText = 56;
  6379 	param.iPen.iX = param.iPen.iY = 0;
  6380 	
  6381 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  6382 	
  6383 	TEST(r && param.iPosInText == 60  
  6384 		   && param.iOutputGlyphs == 1 
  6385 		   && param.iOutput[0].iCode == 0x80000c79 );
  6386 	
  6387 	#if defined __WINS__ || defined __WINSCW__
  6388 	TEST(r && param.iPen.iX == 27);
  6389 	#endif
  6390 	
  6391 	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);
  6392 	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  6393     	if (err!=KErrNone)
  6394     		INFO_PRINTF1(_L("Failed to record test result"));
  6395 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4032"));
  6396 //Req 24 1.3.18
  6397 /**
  6398 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4032
  6399 @SYMTestCaseDesc Automated GDI testing for Tamil
  6400 @SYMTestPriority High
  6401 @SYMTestActions  Attempt to compose various valid Tamil glyph clusters to test 
  6402 				Vertical position of the glyphs for combining characters virama, matras /-i/ and /-ii/ must be determined separately in relation to the relevant base glyph
  6403 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
  6404 @SYMPREQ 1766: Tamil for Sphinx
  6405 @SYMREQ 8742:Tamil Text Rendering
  6406 */
  6407 	testText[60] = 0x0B95; //Ka
  6408 	testText[62] = 0x0BCD; //Virama
  6409 	testText[63] = 0x8205; //ZWJ
  6410 	
  6411 	param.iPosInText = 60;
  6412 	param.iPen.iX = param.iPen.iY = 0;
  6413 	
  6414 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  6415 	
  6416 	TEST(r && param.iPosInText == 61  
  6417 		   && param.iOutputGlyphs == 1 
  6418 		   && param.iOutput[0].iCode == 0x80000bf6 );
  6419 	
  6420 	#if defined __WINS__ || defined __WINSCW__
  6421 	TEST(r && param.iPen.iX == 13);
  6422 	#endif
  6423 	
  6424 	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);
  6425 	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  6426     	if (err!=KErrNone)
  6427     		INFO_PRINTF1(_L("Failed to record test result"));
  6428 	}
  6429 
  6430 /**
  6431 @SYMTestCaseID			GRAPHICS-SYSLIB-GDI-CIT-3479
  6432 @SYMTestCaseDesc		Automated GDI testing for correct localised punctuation after indic characters
  6433 @SYMTestPriority		High
  6434 @SYMTestActions			Attempt to compose various valid Indic strings with western punctuation
  6435 @SYMTestExpectedResults The expected punctuation glyphs for the implied locale should be returned
  6436 @SYMDEF					DEF106651
  6437 */
  6438 void CTGlyphSelection::TestGlyphs(CFont* aFont, CFont::TPositionParam& aParam,
  6439 	const TPtrC16& aText, const TPtrC16& aExpectedGlyphs)
  6440 	{
  6441 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-3479"));
  6442 	TUint16* glyphs = CONST_CAST(TUint16*,aExpectedGlyphs.Ptr());
  6443 	const TInt mask = 0x80000000-1;
  6444 	TBool r;
  6445 	RShapeInfo shapeInfo;
  6446 	aParam.iText.Set(aText); 
  6447 	aParam.iPosInText = aParam.iPen.iX = aParam.iPen.iY = 0;
  6448 	while(aParam.iPosInText < aParam.iText.Length())
  6449 		{
  6450 		r = aFont->GetCharacterPosition2(aParam,shapeInfo);
  6451 		//INFO_PRINTF3(_L("Glyph %d Icode 0x%x"),*glyphs,aParam.iOutput[0].iCode);
  6452 		TEST(r && ((aParam.iOutput[0].iCode & mask) == *glyphs++));
  6453 		}
  6454 	shapeInfo.Close();
  6455 	TRAPD(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  6456     	if (err!=KErrNone)
  6457     		INFO_PRINTF1(_L("Failed to record test result"));
  6458 	}
  6459 void CTGlyphSelection::TestTeluguChars(CFbsFont* aFont)
  6460 	{
  6461 INFO_PRINTF1(_L("Test Telugu Glyphs"));
  6462  
  6463   	TBool r;
  6464 	TBuf<162> testText(0);
  6465 	CFont::TPositionParam param;
  6466 	param.iDirection = CFont::EHorizontal;
  6467 	param.iFlags = CFont::TPositionParam::EFLogicalOrder;
  6468 
  6469 	testText.SetLength(162);
  6470 	// Make sure there is no garbage values in the memory we are using.
  6471 	for (TInt i = 0; i < testText.Length(); i++)
  6472 		testText[i]=0xFFFF;
  6473 	
  6474 	param.iText.Set(testText);
  6475 	RShapeInfo shapeInfo;
  6476 
  6477 	//Testdata for Telugu Langauage
  6478 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4033"));
  6479 /*	
  6480 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4033
  6481 @SYMTestCaseDesc Automated GDI testing for Telugu
  6482 @SYMTestPriority High
  6483 @SYMTestActions  Attempt to compose various valid Telugu glyph clusters to test   	 
  6484 				 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.
  6485 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
  6486 @SYMPREQ 1766: Tamil for Sphinx
  6487 @SYMREQ 8743:Tamil Text Rendering
  6488 */
  6489 //	Req 4.1
  6490 	
  6491 		testText[0] =  0x0C15;
  6492 		testText[1] =  0x0C4D;
  6493 		param.iPosInText = 0 ;
  6494 		param.iPen.iX = param.iPen.iY = 0;
  6495 		r = aFont->GetCharacterPosition2(param,shapeInfo);
  6496 		
  6497 		TEST(r && param.iPosInText == 2  
  6498 			   && param.iOutputGlyphs == 1
  6499 			   && param.iOutput[0].iCode == 0x80000f49 );
  6500 
  6501 		#if defined __WINS__ || defined __WINSCW__
  6502 		TEST(r && param.iPen.iX == 9);
  6503 		#endif
  6504 		
  6505 		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);
  6506 		TRAPD(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  6507     		if (err!=KErrNone)
  6508     			INFO_PRINTF1(_L("Failed to record test result"));
  6509 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4034"));
  6510 /*	
  6511 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4034
  6512 @SYMTestCaseDesc Automated GDI testing for Telugu
  6513 @SYMTestPriority High
  6514 @SYMTestActions  Attempt to compose various valid Telugu glyph clusters to test   	 
  6515 				?VIRAMA attaches the upward stroke at the right of the glyph.	
  6516 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
  6517 @SYMPREQ 1766: Tamil for Sphinx
  6518 @SYMREQ 8743:Tamil Text Rendering
  6519 */		
  6520 		testText[2] =  0x0C16;		
  6521 		testText[3] =  0x0C4D;	
  6522 		
  6523 		param.iPosInText = 2 ;
  6524 		
  6525 		 param.iPen.iX = param.iPen.iY = 0;
  6526 		
  6527 		r = aFont->GetCharacterPosition2(param,shapeInfo);
  6528 		
  6529 		
  6530 		TEST(r && param.iPosInText ==  4 
  6531 			   && param.iOutputGlyphs == 1
  6532 			   && param.iOutput[0].iCode == 0x80000f4a);
  6533 
  6534 		#if defined __WINS__ || defined __WINSCW__
  6535 		TEST(r && param.iPen.iX == 13);
  6536 		#endif
  6537 		
  6538 		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);
  6539 		TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  6540     		if (err!=KErrNone)
  6541     			INFO_PRINTF1(_L("Failed to record test result"));
  6542 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4035"));
  6543 /*	
  6544 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4035
  6545 @SYMTestCaseDesc Automated GDI testing for Telugu
  6546 @SYMTestPriority High
  6547 @SYMTestActions  Attempt to compose various valid Telugu glyph clusters to test   	 
  6548 ?VIRAMA is attached to a stroke at the upper right corner.
  6549 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
  6550 @SYMPREQ 1766: Tamil for Sphinx
  6551 @SYMREQ 8743:Tamil Text Rendering
  6552 */
  6553 		
  6554 		testText[4] =  0x0C23;
  6555 		testText[5] =  0x0C4D;
  6556 		
  6557 		param.iPosInText = 4 ;
  6558 		param.iPen.iX = param.iPen.iY = 0;
  6559 		r = aFont->GetCharacterPosition2(param,shapeInfo);
  6560 		
  6561 		TEST(r && param.iPosInText == 6  
  6562 			   && param.iOutputGlyphs == 1 
  6563 			   && param.iOutput[0].iCode == 0x80000f57 );
  6564 
  6565 		#if defined __WINS__ || defined __WINSCW__
  6566 		TEST(r && param.iPen.iX == 13);
  6567 		#endif
  6568 		
  6569 		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);
  6570 		TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  6571     		if (err!=KErrNone)
  6572     			INFO_PRINTF1(_L("Failed to record test result"));
  6573 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4036"));
  6574 /**
  6575 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4036
  6576 @SYMTestCaseDesc Automated GDI testing for Telugu
  6577 @SYMTestPriority High
  6578 @SYMTestActions  Attempt to compose various valid Telugu glyph clusters to test   	 
  6579 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.
  6580 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
  6581 @SYMPREQ 1766: Tamil for Sphinx
  6582 @SYMREQ 8743:Tamil Text Rendering
  6583 */		
  6584 	//Req 4.2
  6585 		testText[6] =  0x0C2E;
  6586 		testText[7] =  0x0C43;
  6587 		
  6588 		param.iPosInText = 6 ;
  6589 		param.iPen.iX = param.iPen.iY = 0;
  6590 		r = aFont->GetCharacterPosition2(param,shapeInfo);
  6591 		
  6592 		TEST(r && param.iPosInText ==  8 
  6593 			   && param.iOutputGlyphs == 2 
  6594 			   && param.iOutput[0].iCode == 0x80000f21
  6595 			   && param.iOutput[1].iCode == 0x80000f31 );
  6596 
  6597 		#if defined __WINS__ || defined __WINSCW__
  6598 		TEST(r && param.iPen.iX == 24);
  6599 		#endif
  6600 		
  6601 		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);
  6602 		TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  6603     		if (err!=KErrNone)
  6604     			INFO_PRINTF1(_L("Failed to record test result"));
  6605 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4037"));
  6606 		/*	
  6607 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4037
  6608 @SYMTestCaseDesc Automated GDI testing for Telugu
  6609 @SYMTestPriority High
  6610 @SYMTestActions  Attempt to compose various valid Telugu glyph clusters to test   	 
  6611 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.
  6612 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
  6613 @SYMPREQ 1766: Tamil for Sphinx
  6614 @SYMREQ 8743:Tamil Text Rendering
  6615 */	
  6616 		testText[8] =  0x0C32;
  6617 		
  6618 		testText[9] =  0x0C44;
  6619 		
  6620 		param.iPosInText = 8 ;
  6621 		param.iPen.iX = param.iPen.iY = 0;
  6622 		
  6623 		r = aFont->GetCharacterPosition2(param,shapeInfo);	
  6624 		
  6625 		TEST(r && param.iPosInText ==  10 
  6626 			   && param.iOutputGlyphs == 2
  6627 			   && param.iOutput[0].iCode == 0x80000f25
  6628 			   && param.iOutput[1].iCode == 0x80000f32);
  6629 
  6630 		#if defined __WINS__ || defined __WINSCW__
  6631 		TEST(r && param.iPen.iX == 22);
  6632 		#endif
  6633 		
  6634 		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);
  6635 		TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  6636     		if (err!=KErrNone)
  6637     			INFO_PRINTF1(_L("Failed to record test result"));
  6638 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4038"));
  6639 		/*	
  6640 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4038
  6641 @SYMTestCaseDesc Automated GDI testing for Telugu
  6642 @SYMTestPriority High
  6643 @SYMTestActions  Attempt to compose various valid Telugu glyph clusters to test   	 
  6644 ?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.
  6645 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
  6646 @SYMPREQ 1766: Tamil for Sphinx
  6647 @SYMREQ 8743:Tamil Text Rendering
  6648 */		
  6649 	//Req 4.2.1
  6650 		testText[10] = 0x0C15; 
  6651 		testText[11] = 0x0C3E;
  6652 		
  6653 		param.iPosInText = 10 ;
  6654 		param.iPen.iX = param.iPen.iY = 0;
  6655 		r = aFont->GetCharacterPosition2(param,shapeInfo);
  6656 		
  6657 		TEST(r && param.iPosInText == 12  
  6658 			   && param.iOutputGlyphs == 1
  6659 			   && param.iOutput[0].iCode == 0x80000f6d );
  6660 
  6661 		#if defined __WINS__ || defined __WINSCW__
  6662 		TEST(r && param.iPen.iX == 13);
  6663 		#endif
  6664 		
  6665 		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);
  6666 		TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  6667     		if (err!=KErrNone)
  6668     			INFO_PRINTF1(_L("Failed to record test result"));
  6669 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4039"));
  6670 		/*	
  6671 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4039
  6672 @SYMTestCaseDesc Automated GDI testing for Telugu
  6673 @SYMTestPriority High
  6674 @SYMTestActions  Attempt to compose various valid Telugu glyph clusters to test   	 
  6675 ?MATRA AA attaches to the upwards left curving stroke
  6676 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
  6677 @SYMPREQ 1766: Tamil for Sphinx
  6678 @SYMREQ 8743:Tamil Text Rendering
  6679 */	
  6680 		testText[12] = 0x0C1F;
  6681 		testText[13] = 0x0C3E;
  6682 		param.iPosInText = 12 ;
  6683 		param.iPen.iX = param.iPen.iY = 0;
  6684 		r = aFont->GetCharacterPosition2(param,shapeInfo);
  6685 		
  6686 		TEST(r && param.iPosInText == 14  
  6687 			   && param.iOutputGlyphs == 1
  6688 			   && param.iOutput[0].iCode == 0x80000f77 );
  6689 
  6690 		#if defined __WINS__ || defined __WINSCW__
  6691 		TEST(r && param.iPen.iX == 16);
  6692 		#endif
  6693 		
  6694 		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);
  6695 		TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  6696     		if (err!=KErrNone)
  6697     			INFO_PRINTF1(_L("Failed to record test result"));
  6698 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4040"));
  6699 		/*	
  6700 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4040
  6701 @SYMTestCaseDesc Automated GDI testing for Telugu
  6702 @SYMTestPriority High
  6703 @SYMTestActions  Attempt to compose various valid Telugu glyph clusters to test   	 
  6704 ?MATRA AA attaches the upwards (left curving) stroke at the top of the glyph
  6705 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
  6706 @SYMPREQ 1766: Tamil for Sphinx
  6707 @SYMREQ 8743:Tamil Text Rendering
  6708 */
  6709 		testText[14] = 0x0C1C;
  6710 		testText[15] = 0x0C3E;
  6711 		
  6712 		param.iPosInText = 14 ;
  6713 		param.iPen.iX = param.iPen.iY = 0;
  6714 		r = aFont->GetCharacterPosition2(param,shapeInfo);
  6715 		
  6716 		TEST(r && param.iPosInText == 16  
  6717 			   && param.iOutputGlyphs == 1
  6718 			   && param.iOutput[0].iCode == 0x80000f74 );
  6719 	
  6720 		#if defined __WINS__ || defined __WINSCW__
  6721 		TEST(r && param.iPen.iX == 15);
  6722 		#endif
  6723 		
  6724 		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);
  6725 		TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  6726     		if (err!=KErrNone)
  6727     			INFO_PRINTF1(_L("Failed to record test result"));
  6728 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4041"));
  6729 		/*	
  6730 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4041
  6731 @SYMTestCaseDesc Automated GDI testing for Telugu
  6732 @SYMTestPriority High
  6733 @SYMTestActions  Attempt to compose various valid Telugu glyph clusters to test   	 
  6734 ?MATRA AA is drawn on top of the glyph
  6735 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
  6736 @SYMPREQ 1766: Tamil for Sphinx
  6737 @SYMREQ 8743:Tamil Text Rendering
  6738 */	
  6739 		testText[16] = 0x0C23;
  6740 		testText[17] = 0x0C3E;
  6741 		
  6742 		param.iPosInText = 16 ;
  6743 		param.iPen.iX = param.iPen.iY = 0;
  6744 		r = aFont->GetCharacterPosition2(param,shapeInfo);
  6745 		
  6746 		TEST(r && param.iPosInText == 18  
  6747 			   && param.iOutputGlyphs == 1
  6748 			   && param.iOutput[0].iCode == 0x80000f7b );
  6749 
  6750 		#if defined __WINS__ || defined __WINSCW__
  6751 		TEST(r && param.iPen.iX == 16);
  6752 		#endif
  6753 		
  6754 		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);
  6755 		TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  6756     		if (err!=KErrNone)
  6757     			INFO_PRINTF1(_L("Failed to record test result"));
  6758 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4042"));
  6759 		/*	
  6760 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4042
  6761 @SYMTestCaseDesc Automated GDI testing for Telugu
  6762 @SYMTestPriority High
  6763 @SYMTestActions  Attempt to compose various valid Telugu glyph clusters to test   	 
  6764 ?MATRA AA attaches to the upwards left curving stroke, the vowel stem remains intact
  6765 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
  6766 @SYMPREQ 1766: Tamil for Sphinx
  6767 @SYMREQ 8743:Tamil Text Rendering
  6768 */	
  6769 		testText[18] = 0x0C2B;
  6770 		testText[19] = 0x0C3E;
  6771 		
  6772 		param.iPosInText = 18 ;
  6773 		param.iPen.iX = param.iPen.iY = 0;
  6774 						
  6775 		r = aFont->GetCharacterPosition2(param,shapeInfo);
  6776 		
  6777 		TEST(r && param.iPosInText == 20  
  6778 			   && param.iOutputGlyphs == 1
  6779 			   && param.iOutput[0].iCode == 0x80000f82 );
  6780 
  6781 		#if defined __WINS__ || defined __WINSCW__
  6782 		TEST(r && param.iPen.iX == 16);
  6783 		#endif
  6784 		
  6785 		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);
  6786 		TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  6787     		if (err!=KErrNone)
  6788     			INFO_PRINTF1(_L("Failed to record test result"));
  6789 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4043"));
  6790 		/*	
  6791 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4043
  6792 @SYMTestCaseDesc Automated GDI testing for Telugu
  6793 @SYMTestPriority High
  6794 @SYMTestActions  Attempt to compose various valid Telugu glyph clusters to test   	 
  6795 ?MATRA AA replaces the vowel stem, the upwards left curving stroke is extended
  6796 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
  6797 @SYMPREQ 1766: Tamil for Sphinx
  6798 @SYMREQ 8743:Tamil Text Rendering
  6799 */	
  6800 		testText[20] = 0x0C2A;
  6801 		testText[21] = 0x0C3E;
  6802 	
  6803 		param.iPosInText = 20 ;
  6804 		param.iPen.iX = param.iPen.iY = 0;
  6805 		
  6806 		r = aFont->GetCharacterPosition2(param,shapeInfo);
  6807 
  6808 		TEST(r && param.iPosInText == 22   
  6809 			   && param.iOutputGlyphs == 1
  6810 			   && param.iOutput[0].iCode == 0x80000f81);
  6811 
  6812 		#if defined __WINS__ || defined __WINSCW__
  6813 		TEST(r && param.iPen.iX == 16);
  6814 		#endif
  6815 		
  6816 		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);
  6817 		TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  6818     		if (err!=KErrNone)
  6819     			INFO_PRINTF1(_L("Failed to record test result"));
  6820 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4044"));
  6821 	//Req 4.2.2
  6822 	/*	
  6823 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4044
  6824 @SYMTestCaseDesc Automated GDI testing for Telugu
  6825 @SYMTestPriority High
  6826 @SYMTestActions  Attempt to compose various valid Telugu glyph clusters to test   	 
  6827 ?Vowel sign replaces the vowel stem
  6828 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
  6829 @SYMPREQ 1766: Tamil for Sphinx
  6830 @SYMREQ 8743:Tamil Text Rendering
  6831 */
  6832 		testText[22] = 0x0C26;
  6833 		testText[23] = 0x0C3F;
  6834 		
  6835 		param.iPosInText = 22 ;
  6836 		param.iPen.iX = param.iPen.iY = 0;
  6837 		
  6838 		r = aFont->GetCharacterPosition2(param,shapeInfo);
  6839 		
  6840 		TEST(r && param.iPosInText ==  24 
  6841 			   && param.iOutputGlyphs == 1
  6842 			   && param.iOutput[0].iCode == 0x80000fa2 );
  6843 
  6844 		#if defined __WINS__ || defined __WINSCW__
  6845 		TEST(r && param.iPen.iX == 11);
  6846 		#endif
  6847 			
  6848 		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);
  6849 		TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  6850     		if (err!=KErrNone)
  6851     			INFO_PRINTF1(_L("Failed to record test result"));
  6852 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4045"));
  6853 		/*	
  6854 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4045
  6855 @SYMTestCaseDesc Automated GDI testing for Telugu
  6856 @SYMTestPriority High
  6857 @SYMTestActions  Attempt to compose various valid Telugu glyph clusters to test   	 
  6858 ?The upwards left curving stroke extends, vowel sign attaches to the extended stroke
  6859 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
  6860 @SYMPREQ 1766: Tamil for Sphinx
  6861 @SYMREQ 8743:Tamil Text Rendering
  6862 */
  6863 		testText[24] = 0x0C16;
  6864 		testText[25] = 0x0C3F;
  6865 	
  6866 		param.iPosInText = 24 ;
  6867 		param.iPen.iX = param.iPen.iY = 0;
  6868 		
  6869 		r = aFont->GetCharacterPosition2(param,shapeInfo);
  6870 		
  6871 		TEST(r && param.iPosInText == 26  
  6872 			   && param.iOutputGlyphs == 1
  6873 			   && param.iOutput[0].iCode == 0x80000f92);
  6874 
  6875 		#if defined __WINS__ || defined __WINSCW__
  6876 		TEST(r && param.iPen.iX == 12);
  6877 		#endif
  6878 		
  6879 		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);
  6880 		TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  6881     		if (err!=KErrNone)
  6882     			INFO_PRINTF1(_L("Failed to record test result"));
  6883 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4046"));
  6884 		/*	
  6885 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4046
  6886 @SYMTestCaseDesc Automated GDI testing for Telugu
  6887 @SYMTestPriority High
  6888 @SYMTestActions  Attempt to compose various valid Telugu glyph clusters to test   	 
  6889 ?Vowel sign attaches the upward stroke at the top of the glyph
  6890 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
  6891 @SYMPREQ 1766: Tamil for Sphinx
  6892 @SYMREQ 8743:Tamil Text Rendering
  6893 */	
  6894 		testText[26] = 0x0C1C;
  6895 		testText[27] = 0x0C3F;
  6896 	
  6897 		param.iPosInText = 26 ;
  6898 		param.iPen.iX = param.iPen.iY = 0;
  6899 		
  6900 		r = aFont->GetCharacterPosition2(param,shapeInfo);
  6901 		
  6902 		TEST(r && param.iPosInText == 28  
  6903 			   && param.iOutputGlyphs == 1
  6904 			   && param.iOutput[0].iCode == 0x80000f98 );
  6905 
  6906 		#if defined __WINS__ || defined __WINSCW__
  6907 		TEST(r && param.iPen.iX == 12);
  6908 		#endif
  6909 		
  6910 		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);
  6911 		TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  6912     		if (err!=KErrNone)
  6913     			INFO_PRINTF1(_L("Failed to record test result"));
  6914 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4047"));
  6915 		/*	
  6916 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4047
  6917 @SYMTestCaseDesc Automated GDI testing for Telugu
  6918 @SYMTestPriority High
  6919 @SYMTestActions  Attempt to compose various valid Telugu glyph clusters to test   	 
  6920 ?Vowel sign attaches the upward stroke at the top of the glyph
  6921 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
  6922 @SYMPREQ 1766: Tamil for Sphinx
  6923 @SYMREQ 8743:Tamil Text Rendering
  6924 */		
  6925 		testText[28] = 0x0C1E;
  6926 		testText[29] = 0x0C40;
  6927 		
  6928 		param.iPosInText = 28 ;
  6929 		param.iPen.iX = param.iPen.iY = 0;
  6930 				
  6931 		r = aFont->GetCharacterPosition2(param,shapeInfo);
  6932 		
  6933 		TEST(r && param.iPosInText == 30  
  6934 			   && param.iOutputGlyphs == 1
  6935 			   && param.iOutput[0].iCode == 0x80000fbe );
  6936 
  6937 		#if defined __WINS__ || defined __WINSCW__
  6938 		TEST(r && param.iPen.iX == 14);
  6939 		#endif
  6940 		
  6941 		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);
  6942 		TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  6943     		if (err!=KErrNone)
  6944     			INFO_PRINTF1(_L("Failed to record test result"));
  6945 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4048"));
  6946 		/*	
  6947 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4048
  6948 @SYMTestCaseDesc Automated GDI testing for Telugu
  6949 @SYMTestPriority High
  6950 @SYMTestActions  Attempt to compose various valid Telugu glyph clusters to test   	 
  6951 ?Vowel sign attaches to the right upper corner of the glyph
  6952 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
  6953 @SYMPREQ 1766: Tamil for Sphinx
  6954 @SYMREQ 8743:Tamil Text Rendering
  6955 */		
  6956 		testText[30] = 0x0C1F;
  6957 		testText[31] = 0x0C3F;
  6958 	
  6959 		param.iPosInText = 30;
  6960 		param.iPen.iX = param.iPen.iY = 0;
  6961 		
  6962 		r = aFont->GetCharacterPosition2(param,shapeInfo);
  6963 
  6964 		TEST(r && param.iPosInText == 32  
  6965 			   && param.iOutputGlyphs == 1
  6966 			   && param.iOutput[0].iCode ==  0x80000f9b );
  6967 
  6968 		#if defined __WINS__ || defined __WINSCW__
  6969 		TEST(r && param.iPen.iX == 12);
  6970 		#endif
  6971 		
  6972 		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);
  6973 		TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  6974     		if (err!=KErrNone)
  6975     			INFO_PRINTF1(_L("Failed to record test result"));
  6976 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4049"));
  6977 		/*	
  6978 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4049
  6979 @SYMTestCaseDesc Automated GDI testing for Telugu
  6980 @SYMTestPriority High
  6981 @SYMTestActions  Attempt to compose various valid Telugu glyph clusters to test   	 
  6982 ?Vowel sign takes a loop form that replaces the vowel stem
  6983 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
  6984 @SYMPREQ 1766: Tamil for Sphinx
  6985 @SYMREQ 8743:Tamil Text Rendering
  6986 */		
  6987 		testText[32] = 0x0C1D;
  6988 		testText[33] = 0x0C3F;
  6989 	
  6990 		param.iPosInText = 32 ;
  6991 		param.iPen.iX = param.iPen.iY = 0;
  6992 		
  6993 		r = aFont->GetCharacterPosition2(param,shapeInfo);
  6994 		
  6995 		TEST(r && param.iPosInText ==  34 
  6996 			   && param.iOutputGlyphs == 1
  6997 			   && param.iOutput[0].iCode ==  0x80000f99 );
  6998 	
  6999 		#if defined __WINS__ || defined __WINSCW__
  7000 		TEST(r && param.iPen.iX == 19);
  7001 		#endif
  7002 		
  7003 		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);
  7004 		TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  7005     		if (err!=KErrNone)
  7006     			INFO_PRINTF1(_L("Failed to record test result"));
  7007 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4050"));
  7008 		/*	
  7009 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4050
  7010 @SYMTestCaseDesc Automated GDI testing for Telugu
  7011 @SYMTestPriority High
  7012 @SYMTestActions  Attempt to compose various valid Telugu glyph clusters to test   	 
  7013 ?The upwards left curving stroke extends, vowel sign replaces the vowel stem at the tip of the extended stroke 
  7014 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
  7015 @SYMPREQ 1766: Tamil for Sphinx
  7016 @SYMREQ 8743:Tamil Text Rendering
  7017 */	
  7018 		testText[34] = 0x0C1B;
  7019 		testText[35] = 0x0C3F;
  7020 	
  7021 	 	param.iPosInText =34 ;
  7022 		param.iPen.iX = param.iPen.iY = 0;
  7023 		
  7024 		r = aFont->GetCharacterPosition2(param,shapeInfo);
  7025 		
  7026 		TEST(r && param.iPosInText == 36 
  7027 			   && param.iOutputGlyphs == 1
  7028 			   && param.iOutput[0].iCode == 0x80000f97 );
  7029 
  7030 		#if defined __WINS__ || defined __WINSCW__
  7031 		TEST(r && param.iPen.iX == 12);
  7032 		#endif
  7033 		
  7034 		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);
  7035 		TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  7036     		if (err!=KErrNone)
  7037     			INFO_PRINTF1(_L("Failed to record test result"));
  7038 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4051"));
  7039 		/*	
  7040 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4051
  7041 @SYMTestCaseDesc Automated GDI testing for Telugu
  7042 @SYMTestPriority High
  7043 @SYMTestActions  Attempt to compose various valid Telugu glyph clusters to test   	 
  7044 ?Vowel sign replaces the upwards curving stroke at the top of the glyph
  7045 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
  7046 @SYMPREQ 1766: Tamil for Sphinx
  7047 @SYMREQ 8743:Tamil Text Rendering
  7048 */		
  7049 		testText[36] = 0x0C1C;
  7050 		testText[37] = 0x0C3F;
  7051 	
  7052 		param.iPosInText = 36 ;
  7053 		param.iPen.iX = param.iPen.iY = 0;
  7054 					
  7055 		r = aFont->GetCharacterPosition2(param,shapeInfo);
  7056 		
  7057 		TEST(r && param.iPosInText == 38  
  7058 			   && param.iOutputGlyphs == 1
  7059 			   && param.iOutput[0].iCode == 0x80000f98 );
  7060 		
  7061 		#if defined __WINS__ || defined __WINSCW__
  7062 		TEST(r && param.iPen.iX == 12);
  7063 		#endif
  7064 		
  7065 		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);
  7066 		TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  7067     		if (err!=KErrNone)
  7068     			INFO_PRINTF1(_L("Failed to record test result"));
  7069 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4052"));
  7070 		/*	
  7071 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4052
  7072 @SYMTestCaseDesc Automated GDI testing for Telugu
  7073 @SYMTestPriority High
  7074 @SYMTestActions  Attempt to compose various valid Telugu glyph clusters to test   	 
  7075 ?Vowel stem is removed.
  7076 ?Vowel stem is removed and MATRA II takes a form that looks like MATRA AA
  7077 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
  7078 @SYMPREQ 1766: Tamil for Sphinx
  7079 @SYMREQ 8743:Tamil Text Rendering
  7080 */		
  7081 		testText[38] = 0x0C2F;
  7082 		testText[39] = 0x0C3F;
  7083 	
  7084 		param.iPosInText = 38 ;
  7085 		param.iPen.iX = param.iPen.iY = 0;
  7086 		
  7087 		r = aFont->GetCharacterPosition2(param,shapeInfo);
  7088 		
  7089 		TEST(r && param.iPosInText == 40 
  7090 			   && param.iOutputGlyphs == 1
  7091 			   && param.iOutput[0].iCode == 0x80000faa );
  7092 
  7093 		#if defined __WINS__ || defined __WINSCW__
  7094 		TEST(r && param.iPen.iX == 19);
  7095 		#endif
  7096 		
  7097 		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);
  7098 		TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  7099     		if (err!=KErrNone)
  7100     			INFO_PRINTF1(_L("Failed to record test result"));
  7101 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4053"));
  7102 		/*	
  7103 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4053
  7104 @SYMTestCaseDesc Automated GDI testing for Telugu
  7105 @SYMTestPriority High
  7106 @SYMTestActions  Attempt to compose various valid Telugu glyph clusters to test   	 
  7107 ?Vowel sign attaches to the right of the consonant glyph, vowel stem remains intact
  7108 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
  7109 @SYMPREQ 1766: Tamil for Sphinx
  7110 @SYMREQ 8743:Tamil Text Rendering
  7111 */	
  7112 		testText[40] = 0x0C15;
  7113 		testText[41] = 0x0C41;
  7114 	
  7115 		param.iPosInText = 40 ;
  7116 		param.iPen.iX = param.iPen.iY = 0;
  7117 		r = aFont->GetCharacterPosition2(param,shapeInfo);
  7118 		
  7119 		TEST(r && param.iPosInText ==42   
  7120 			   && param.iOutputGlyphs == 1
  7121 			   && param.iOutput[0].iCode == 0x80000fd9 );
  7122 		
  7123 		#if defined __WINS__ || defined __WINSCW__
  7124 		TEST(r && param.iPen.iX == 14);
  7125 		#endif
  7126 		
  7127 		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);
  7128 		TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  7129     		if (err!=KErrNone)
  7130     			INFO_PRINTF1(_L("Failed to record test result"));
  7131 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4054"));
  7132 		/*	
  7133 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4054
  7134 @SYMTestCaseDesc Automated GDI testing for Telugu
  7135 @SYMTestPriority High
  7136 @SYMTestActions  Attempt to compose various valid Telugu glyph clusters to test   	 
  7137 ?Vowel sign takes a miniature form which attaches to the stroke at the top of the consonant glyph
  7138 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
  7139 @SYMPREQ 1766: Tamil for Sphinx
  7140 @SYMREQ 8743:Tamil Text Rendering
  7141 */	
  7142 		testText[42] = 0x0C19;
  7143 		testText[43] = 0x0C41;
  7144 	
  7145 		param.iPosInText = 42 ;
  7146 		param.iPen.iX = param.iPen.iY = 0;
  7147 						
  7148 		r = aFont->GetCharacterPosition2(param,shapeInfo);
  7149 		
  7150 		TEST(r && param.iPosInText ==  44 
  7151 			   && param.iOutputGlyphs == 1
  7152 			   && param.iOutput[0].iCode == 0x80000fda );
  7153 		
  7154 		#if defined __WINS__ || defined __WINSCW__
  7155 		TEST(r && param.iPen.iX == 15);
  7156 		#endif
  7157 		
  7158 		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);
  7159 		TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  7160     		if (err!=KErrNone)
  7161     			INFO_PRINTF1(_L("Failed to record test result"));
  7162 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4055"));
  7163 		/*	
  7164 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4055
  7165 @SYMTestCaseDesc Automated GDI testing for Telugu
  7166 @SYMTestPriority High
  7167 @SYMTestActions  Attempt to compose various valid Telugu glyph clusters to test   	 
  7168 ?Vowel sign attaches the consonant sign from below. Vowel stem remains intact.
  7169 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
  7170 @SYMPREQ 1766: Tamil for Sphinx
  7171 @SYMREQ 8743:Tamil Text Rendering
  7172 */	
  7173 		testText[44] = 0x0C2E;
  7174 		testText[45] = 0x0C41;
  7175 	
  7176 		param.iPosInText = 44 ;
  7177 		param.iPen.iX = param.iPen.iY = 0;
  7178 		r = aFont->GetCharacterPosition2(param,shapeInfo);
  7179 		
  7180 		TEST(r && param.iPosInText == 46   
  7181 			   && param.iOutputGlyphs == 2
  7182 			   && param.iOutput[0].iCode == 0x80000f21 );
  7183 
  7184 		#if defined __WINS__ || defined __WINSCW__
  7185 		TEST(r && param.iPen.iX == 21);
  7186 		#endif
  7187 		
  7188 		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);
  7189 		
  7190 		testText[46] = 0x0C36;
  7191 		testText[47] = 0x0C41;
  7192 	
  7193 		param.iPosInText = 46 ;
  7194 		param.iPen.iX = param.iPen.iY = 0;
  7195 		r = aFont->GetCharacterPosition2(param,shapeInfo);
  7196 		
  7197 		TEST(r && param.iPosInText == 48   
  7198 			   && param.iOutputGlyphs == 2 
  7199 			   && param.iOutput[0].iCode == 0x80000f28 );
  7200 
  7201 		#if defined __WINS__ || defined __WINSCW__
  7202 		TEST(r && param.iPen.iX == 14);
  7203 		#endif
  7204 			
  7205 		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);
  7206 		TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  7207     		if (err!=KErrNone)
  7208     			INFO_PRINTF1(_L("Failed to record test result"));
  7209 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4056"));
  7210 		/*	
  7211 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4056
  7212 @SYMTestCaseDesc Automated GDI testing for Telugu
  7213 @SYMTestPriority High
  7214 @SYMTestActions  Attempt to compose various valid Telugu glyph clusters to test   	 
  7215 ?Vowel sign replaces the vowel stem
  7216 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
  7217 @SYMPREQ 1766: Tamil for Sphinx
  7218 @SYMREQ 8743:Tamil Text Rendering
  7219 */		
  7220 //	Req 4.2.4
  7221 		testText[48] = 0x0C28;
  7222 		testText[49] = 0x0C46;
  7223 	
  7224 		param.iPosInText = 48 ;
  7225 		param.iPen.iX = param.iPen.iY = 0;
  7226 		r = aFont->GetCharacterPosition2(param,shapeInfo);
  7227 		
  7228 		TEST(r && param.iPosInText == 50   
  7229 			   && param.iOutputGlyphs == 1
  7230 			   && param.iOutput[0].iCode == 0x80001000 );
  7231 
  7232 		#if defined __WINS__ || defined __WINSCW__
  7233 		TEST(r && param.iPen.iX == 11);
  7234 		#endif
  7235 		
  7236 		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);
  7237 		TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  7238     		if (err!=KErrNone)
  7239     			INFO_PRINTF1(_L("Failed to record test result"));
  7240 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4057"));
  7241 		/*	
  7242 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4057
  7243 @SYMTestCaseDesc Automated GDI testing for Telugu
  7244 @SYMTestPriority High
  7245 @SYMTestActions  Attempt to compose various valid Telugu glyph clusters to test   	 
  7246 ?Vowel sign replaces the vowel stem
  7247 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
  7248 @SYMPREQ 1766: Tamil for Sphinx
  7249 @SYMREQ 8743:Tamil Text Rendering
  7250 */		
  7251 		testText[50] = 0x0C1B;
  7252 		testText[51] = 0x0C47;
  7253 		
  7254 		param.iPosInText = 50 ;
  7255 		param.iPen.iX = param.iPen.iY = 0;
  7256 		r = aFont->GetCharacterPosition2(param,shapeInfo);
  7257 		
  7258 		TEST(r && param.iPosInText ==  52 
  7259 			   && param.iOutputGlyphs == 1
  7260 			   && param.iOutput[0].iCode == 0x80001017 );
  7261 
  7262 		#if defined __WINS__ || defined __WINSCW__
  7263 		TEST(r && param.iPen.iX == 12);
  7264 		#endif
  7265 		
  7266 		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);
  7267 		TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  7268     		if (err!=KErrNone)
  7269     			INFO_PRINTF1(_L("Failed to record test result"));
  7270 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4058"));
  7271 		/*	
  7272 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4058
  7273 @SYMTestCaseDesc Automated GDI testing for Telugu
  7274 @SYMTestPriority High
  7275 @SYMTestActions  Attempt to compose various valid Telugu glyph clusters to test   	 
  7276 ?Vowel sign replaces the vowel stem
  7277 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
  7278 @SYMPREQ 1766: Tamil for Sphinx
  7279 @SYMREQ 8743:Tamil Text Rendering
  7280 */		
  7281 		testText[52] = 0x0C1D;	
  7282 		testText[53] = 0x0C48;
  7283 		
  7284 		param.iPosInText = 52 ;
  7285 		param.iPen.iX = param.iPen.iY = 0;
  7286 		r = aFont->GetCharacterPosition2(param,shapeInfo);
  7287 		
  7288 		TEST(r && param.iPosInText ==  54 
  7289 			   && param.iOutputGlyphs == 2
  7290 			   && param.iOutput[0].iCode == 0x80000ff5
  7291 			   && param.iOutput[1].iCode == 0x80000f3b );
  7292 
  7293 		#if defined __WINS__ || defined __WINSCW__
  7294 		TEST(r && param.iPen.iX == 19);
  7295 		#endif
  7296 		
  7297 		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);
  7298 		TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  7299     		if (err!=KErrNone)
  7300     			INFO_PRINTF1(_L("Failed to record test result"));
  7301 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4059"));	
  7302 		/*	
  7303 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4059
  7304 @SYMTestCaseDesc Automated GDI testing for Telugu
  7305 @SYMTestPriority High
  7306 @SYMTestActions  Attempt to compose various valid Telugu glyph clusters to test   	 
  7307 ?Vowel sign replaces the vowel stem.
  7308 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
  7309 @SYMPREQ 1766: Tamil for Sphinx
  7310 @SYMREQ 8743:Tamil Text Rendering
  7311 */	
  7312 	// Req 4.2.5
  7313 		testText[54] = 0x0C15;
  7314 		testText[55] = 0x0C4A;
  7315 		
  7316 		param.iPosInText = 54 ;
  7317 		param.iPen.iX = param.iPen.iY = 0;
  7318 		
  7319 		r = aFont->GetCharacterPosition2(param,shapeInfo);
  7320 		
  7321 		TEST(r && param.iPosInText ==  56 
  7322 			   && param.iOutputGlyphs == 1
  7323 			   && param.iOutput[0].iCode == 0x80001059 );
  7324 
  7325 		#if defined __WINS__ || defined __WINSCW__
  7326 		TEST(r && param.iPen.iX == 13);
  7327 		#endif
  7328 		
  7329 		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);
  7330 		TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  7331     		if (err!=KErrNone)
  7332     			INFO_PRINTF1(_L("Failed to record test result"));
  7333 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4060"));
  7334 		/*	
  7335 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4060
  7336 @SYMTestCaseDesc Automated GDI testing for Telugu
  7337 @SYMTestPriority High
  7338 @SYMTestActions  Attempt to compose various valid Telugu glyph clusters to test   	 
  7339 ?Vowel sign replaces the vowel stem.
  7340 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
  7341 @SYMPREQ 1766: Tamil for Sphinx
  7342 @SYMREQ 8743:Tamil Text Rendering
  7343 */	
  7344 	
  7345 		testText[56] = 0x0C21;
  7346 		testText[57] = 0x0C4B;
  7347 		
  7348 		param.iPosInText = 56 ;
  7349 		param.iPen.iX = param.iPen.iY = 0;
  7350 		
  7351 		r = aFont->GetCharacterPosition2(param,shapeInfo);
  7352 		
  7353 		TEST(r && param.iPosInText ==  58 
  7354 			   && param.iOutputGlyphs == 1 
  7355 			   && param.iOutput[0].iCode == 0x80001089 );
  7356 
  7357 		#if defined __WINS__ || defined __WINSCW__
  7358 		TEST(r && param.iPen.iX == 14);
  7359 		#endif
  7360 		
  7361 		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);
  7362 		TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  7363     		if (err!=KErrNone)
  7364     			INFO_PRINTF1(_L("Failed to record test result"));
  7365 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4061"));
  7366 		/*	
  7367 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4061
  7368 @SYMTestCaseDesc Automated GDI testing for Telugu
  7369 @SYMTestPriority High
  7370 @SYMTestActions  Attempt to compose various valid Telugu glyph clusters to test   	 
  7371 ?Vowel sign replaces the vowel stem.
  7372 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
  7373 @SYMPREQ 1766: Tamil for Sphinx
  7374 @SYMREQ 8743:Tamil Text Rendering
  7375 */	
  7376 		testText[58] = 0x0C26;
  7377 		testText[59] = 0x0C4C;
  7378 		
  7379 		param.iPosInText = 58 ;
  7380 		param.iPen.iX = param.iPen.iY = 0;
  7381 		
  7382 		r = aFont->GetCharacterPosition2(param,shapeInfo);
  7383 		
  7384 		TEST(r && param.iPosInText == 60   
  7385 			   && param.iOutputGlyphs == 1
  7386 			   && param.iOutput[0].iCode == 0x800010b2 );
  7387 	
  7388 		#if defined __WINS__ || defined __WINSCW__
  7389 		TEST(r && param.iPen.iX == 14);
  7390 		#endif
  7391 		
  7392 		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);
  7393 	}
  7394 	
  7395 void CTGlyphSelection::TestIndicPunctuation(CFbsFont* aFont)
  7396 	{
  7397 	INFO_PRINTF1(_L("Test Indic Punctuation"));
  7398 
  7399 	CFont::TPositionParam param;
  7400 	param.iDirection = CFont::EHorizontal;
  7401 	param.iFlags = CFont::TPositionParam::EFLogicalOrder;
  7402 	
  7403 	//INFO_PRINTF1(_L("// punctuation string after Kannada text"));
  7404 	TestGlyphs(aFont,param,_L("\xC95!?#@"),_L("\x7A8\x920\x93C\x922\x23"));
  7405 	//INFO_PRINTF1(_L("// punctuation string before Kannada text"));
  7406 	TestGlyphs(aFont,param,_L("!?#@\xC95"),_L("\x21\x3F\x23\x40\x7A8"));
  7407 	//INFO_PRINTF1(_L("// punctuation string before and after Kannada text"));
  7408 	TestGlyphs(aFont,param,_L("  \"\xC95\"  "),_L("\x20\x20\x22\x7A8\x22\x20\x20"));
  7409 	//INFO_PRINTF1(_L("// punctuation before and after latin text followed by punctuation before and after kannada text"));
  7410 	TestGlyphs(aFont,param,_L("\x201c\x041\x201D (\xc95)"),_L("\x201c\x41\x201d\x20\x28\x7a8\x29"));
  7411 	//INFO_PRINTF1(_L("// mixed kannada/ latin with punctuation surrounded by whitespace inbetween"));
  7412 	TestGlyphs(aFont,param,_L("\xc95 , \x041"),_L("\x7a8\x20\x929\x20\x41"));
  7413 	//INFO_PRINTF1(_L("// mixed kannada/ latin with punctuation surrounded by whitespace inbetween (reversed)"));
  7414 	TestGlyphs(aFont,param,_L("\x041 , \xc95"),_L("\x41\x20\x2C\x20\x7a8"));
  7415 	//INFO_PRINTF1(_L("// mixed kannada/ latin with punctuation next to latin"));
  7416 	TestGlyphs(aFont,param,_L("\x041, \xc95"),_L("\x41\x2C\x20\x7a8"));
  7417 	//INFO_PRINTF1(_L("// mixed kannada/ latin with punctuation next to kannada"));
  7418 	TestGlyphs(aFont,param,_L("\x041 ,\xc95"),_L("\x41\x20\x2C\x7a8"));
  7419 	//INFO_PRINTF1(_L("// mixed kannada/ latin with punctuation next to latin and seperating tab"));
  7420 	TestGlyphs(aFont,param,_L("\x041,\t\xc95"),_L("\x41\x2C\x9\x7a8"));
  7421 	//INFO_PRINTF1(_L("// mixed kannada/ latin with punctuation next to kannada and seperating tab"));
  7422 	TestGlyphs(aFont,param,_L("\x041\t,\xc95"),_L("\x41\x9\x2C\x7a8"));
  7423 	//INFO_PRINTF1(_L("// devanagari digits with colons"));
  7424 	TestGlyphs(aFont,param,_L("\x966\x03a\x967\x03a\x968\x03a\x969\x03a\x96a\x03a\x96b\x03a\x96c\x03a\x96d\x03a\x96e\x03a\x96f\x03a"),
  7425 										_L("\x582\x77e\x583\x77e\x584\x77e\x585\x77e\x586\x77e\x587\x77e\x588\x77e\x589\x77e\x58a\x77e\x58b\x77e"));
  7426 	//INFO_PRINTF1(_L("// string of only punctuation"));
  7427 	TestGlyphs(aFont,param,_L("\x002D\x002D\x002D\x002D\x002D\x002D"),_L("\x002D\x002D\x002D\x002D\x002D\x002D"));
  7428 	//INFO_PRINTF1(_L("// one Kannada character followed my multiple punctuation and non-punctuaion"));
  7429 	TestGlyphs(aFont,param,_L("\x0C95!\x0022\x00A3$%^&*()-={}[]:@~;'#<>?,./"),
  7430 										_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"));
  7431 	}
  7432 	
  7433 
  7434 
  7435 void CTGlyphSelection::TestIndicCharsL()
  7436 	{
  7437 	// create a font store for testing
  7438 	CFontStore* fontStore = CFontStore::NewL(&User::Heap());
  7439 	
  7440 	//load all ecom implemented rasterizer dlls. installs the rasterizer.	
  7441 	LoadOpenFontLibraries(fontStore);
  7442 		// test font preparation
  7443 	fontStore->iKPixelWidthInTwips = 11860; //This value is default
  7444 
  7445 	//add any required font files
  7446 	TUid err = fontStore->AddFileL(KTestHindiFontFile);
  7447 
  7448 	TFontSpec testHindiFontSpec(KTestHindiFontFaceName,200); 
  7449 	
  7450 	TUid err1 = fontStore->AddFileL(KTestIndicFontFile);
  7451 
  7452 	TFontSpec testIndicFontSpec(KTestIndicFontFaceName,200);
  7453 	 
  7454 	CFbsBitmap* bmp = new(ELeave) CFbsBitmap;
  7455 	
  7456 	TInt ret = bmp->Create(TSize(100,100),EGray2);
  7457 	if (ret == KErrNotSupported)
  7458 		return;
  7459 	else
  7460 		User::LeaveIfError(ret);
  7461 
  7462 	CFbsBitmapDevice* device = NULL;
  7463 	TRAPD(err2,device = CFbsBitmapDevice::NewL(bmp));
  7464 	TEST(err2 == KErrNone);
  7465 
  7466 	CFbsBitGc* gc = NULL;
  7467 	User::LeaveIfError(device->CreateContext(gc));
  7468 	// Font file Creation
  7469 	CFbsFont* hindiFont = NULL;
  7470 	User::LeaveIfError(device->GetNearestFontToDesignHeightInTwips(hindiFont,testHindiFontSpec));
  7471 	gc->UseFont(hindiFont);
  7472 	CleanupStack::PushL(hindiFont);
  7473 	
  7474 	//Testcode for Hindi language
  7475 	((CTGlyphSelectionStep*)iStep)->RecordTestResultL();
  7476 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-1580"));
  7477 	TestHindiChars(hindiFont);
  7478 	((CTGlyphSelectionStep*)iStep)->RecordTestResultL();
  7479 	
  7480 	CleanupStack::Pop(hindiFont);
  7481 	
  7482 	// Font file Creation
  7483 	CFbsFont* indicFont = NULL;
  7484 	User::LeaveIfError(device->GetNearestFontToDesignHeightInTwips(indicFont,testIndicFontSpec));
  7485 	gc->UseFont(indicFont);
  7486 	CleanupStack::PushL(indicFont);
  7487 	
  7488 	//Testcode for Kannada, Marathi,Gujarati,Bengali language
  7489 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-3381"));
  7490 	TestKannadaChars(indicFont);
  7491 	((CTGlyphSelectionStep*)iStep)->RecordTestResultL();
  7492 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-3360"));
  7493 	TestMarathiChars(indicFont);
  7494 	((CTGlyphSelectionStep*)iStep)->RecordTestResultL();
  7495 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-3417"));
  7496 	TestGujaratiChars(indicFont);
  7497 	TestBengaliChars(indicFont);
  7498 	TestTamilChars(indicFont);
  7499 	TestTeluguChars(indicFont);
  7500 	TestIndicPunctuation(indicFont);
  7501 	CleanupStack::Pop(indicFont);
  7502 			
  7503 	//Cleaning the memory
  7504 	delete bmp;
  7505 	delete device;
  7506 	delete gc;
  7507 	fontStore->RemoveFile(err);
  7508 	fontStore->RemoveFile(err1);
  7509 	delete fontStore;
  7510 	REComSession::FinalClose();
  7511 	}
  7512 
  7513 	
  7514 
  7515 /** Tests that ligatures (presently just Lam-Alef in Arabic) work correctly
  7516 when diacritics are required on one, both or neither character comprising the
  7517 ligature. */
  7518 void CTGlyphSelection::TestLigaturesWithDiacritics()
  7519 	{
  7520 	// independent letters
  7521 	const TText KAlef = 0x627;
  7522 	const TText KLam = 0x644;
  7523 	const TText KBeh = 0x628;
  7524 	// dependent marks
  7525 	const TText KFatha = 0x64E;
  7526 	const TText KDamma = 0x64F;
  7527 	// ligature forms
  7528 	const TText KLamAlefIsolated = 0xFEFB;
  7529 	const TText KLamAlefFinal = 0xFEFC;
  7530 
  7531 	struct TTestCase
  7532 		{
  7533 		// Logical order input.
  7534 		TText iInputL[8];
  7535 		// Visual order input, should be equivalent to iInputL.
  7536 		TText iInputV[8];
  7537 		// Which cluster to test
  7538 		TInt iClusterUnderTestStartL;
  7539 		TInt iClusterUnderTestStartV;
  7540 		// Expected glyphs to appear (in any order, but...)
  7541 		TInt iGlyphs[8];
  7542 		// ...number of glyphs from the start of iGlyphs that
  7543 		// are in order of their expected x-coordinates (of their
  7544 		// centres)
  7545 		TInt iGlyphsInOrder;
  7546 		};
  7547 	const TTestCase KTestCases[] =
  7548 		{
  7549 		{{KLam, KAlef, 0}, {KAlef, KLam, 0},
  7550 			0, 0, {KLamAlefIsolated, 0}, 1},
  7551 		{{KBeh, KLam, KAlef, KBeh, 0}, {KBeh, KAlef, KLam, KBeh, 0},
  7552 			1, 1, {KLamAlefFinal, 0}, 1},
  7553 		{{KLam, KFatha, KAlef, 0}, {KAlef, KLam, KFatha, 0},
  7554 			0, 0, {KLamAlefIsolated, KFatha, 0}, 1},
  7555 		{{KBeh, KLam, KFatha, KAlef, KBeh, 0}, {KBeh, KAlef, KLam, KFatha, KBeh, 0},
  7556 			1, 1, {KLamAlefFinal, KFatha, 0}, 1},
  7557 		{{KLam, KAlef, KDamma, 0}, {KAlef, KDamma, KLam, 0},
  7558 			0, 0, {KLamAlefIsolated, KDamma, 0}, 1},
  7559 		{{KBeh, KLam, KAlef, KDamma, KBeh, 0}, {KBeh, KAlef, KDamma, KLam, KBeh, 0},
  7560 			1, 1, {KLamAlefFinal, KDamma, 0}, 1},
  7561 		{{KLam, KFatha, KAlef, KDamma, 0}, {KAlef, KDamma, KLam, KFatha, 0},
  7562 			0, 0, {KDamma, KFatha, KLamAlefIsolated, 0}, 2},
  7563 		{{KBeh, KLam, KFatha, KAlef, KDamma, KBeh, 0},
  7564 			{KBeh, KAlef, KDamma, KLam, KFatha, KBeh, 0},
  7565 			1, 1, {KDamma, KFatha, KLamAlefFinal, 0}, 2},
  7566 		};
  7567 	TBuf<8> input;
  7568 	CFont::TPositionParam param;
  7569 	for (TInt testCase = 0;
  7570 		testCase != sizeof(KTestCases)/sizeof(KTestCases[0]);
  7571 		++testCase)
  7572 		{
  7573 		const TTestCase& t = KTestCases[testCase];
  7574 		for (TInt logical = 0; logical != 2; ++logical)
  7575 			{
  7576 			const TText* in = logical?
  7577 				t.iInputL : t.iInputV;
  7578 			input.Zero();
  7579 			while (*in)
  7580 				input.Append(*in++);
  7581 			param.iText.Set(input);
  7582 			param.iPosInText = logical?
  7583 				t.iClusterUnderTestStartL : t.iClusterUnderTestStartV;
  7584 			param.iFlags = static_cast<TUint16>(logical?
  7585 				CFont::TPositionParam::EFLogicalOrder : 0);
  7586 			param.iPen.SetXY(0, 0);
  7587 			TBool r = iTestFont->GetCharacterPosition(param);
  7588 			TEST(r);
  7589 			TInt currentX = KMinTInt;
  7590 			TInt expectedGlyphNo = 0;
  7591 			while (t.iGlyphs[expectedGlyphNo] != 0)
  7592 				{
  7593 				// FInd the expected glyph in the output.
  7594 				TInt outputGlyph = 0;
  7595 				while (outputGlyph != param.iOutputGlyphs
  7596 					&& static_cast<TInt>(param.iOutput[outputGlyph].iCode)
  7597 					!= t.iGlyphs[expectedGlyphNo])
  7598 					{
  7599 					++outputGlyph;
  7600 					}
  7601 				TEST(outputGlyph < param.iOutputGlyphs);
  7602 				TInt x = param.iOutput[outputGlyph].iBounds.Center().iX;
  7603 				TEST(t.iGlyphsInOrder <= expectedGlyphNo
  7604 					|| currentX < x);
  7605 				currentX = x;
  7606 				++expectedGlyphNo;
  7607 				}
  7608 			TEST(expectedGlyphNo == param.iOutputGlyphs);
  7609 			}
  7610 		}
  7611 	}
  7612 	
  7613  #if defined(__GCC32__)
  7614  typedef wchar_t __TText;
  7615  #elif defined(__VC32__)
  7616  typedef TUint16 __TText;
  7617  #elif defined(__CW32__)
  7618  typedef TUint16 __TText;
  7619  #elif !defined(__TText_defined)
  7620  #error  no typedef for __TText
  7621  #endif
  7622  const __TText* KLatinNoSideBearings = L"ABCDE";
  7623  const __TText* KLatinLeftSideBearing = L"WABCD";
  7624  const __TText* KLatinRightSideBearing = L"ABCDW";
  7625  const __TText* KLatinBothSideBearings = L"WABCW";
  7626  const __TText* KArabicAlefWaw = L"\x627\x648";
  7627  const __TText* KArabicWawAlef = L"\x648\x627";
  7628  const __TText* KGb18030NoSideBearings = L"\xD840\xDC00xyz\xD87E\xDE1D";
  7629  const __TText* KGb18030LeftSideBearings = L"W\xD840\xDC00xy\xD87E\xDE1D";
  7630  const __TText* KGb18030RightSideBearings = L"\xD840\xDC00xy\xD87E\xDE1DW";
  7631  const __TText* KGb18030BothSideBearings = L"W\xD840\xDC00x\xD87E\xDE1DW";
  7632  struct TMeasureTextTest
  7633  	{
  7634  	const __TText* iText;
  7635  	TInt iExpectedAdvanceLogical;
  7636  	TInt iExpectedAdvanceL2R;
  7637  	TInt iExpectedBoundsL2RLeft;
  7638  	TInt iExpectedBoundsL2RRight;
  7639  	TInt iExpectedBoundsL2RTop;
  7640  	TInt iExpectedBoundsL2RBottom;
  7641  	TInt iExpectedAdvanceR2L;
  7642  	TInt iExpectedBoundsR2LLeft;
  7643  	TInt iExpectedBoundsR2LRight;
  7644  	TInt iExpectedBoundsR2LTop;
  7645  	TInt iExpectedBoundsR2LBottom;
  7646  	};
  7647  const TMeasureTextTest KMeasureTextResults[] =
  7648  	{
  7649  	{KLatinNoSideBearings, 50, 50, 0, 50, -10, 2, 50, 0, 50, -10, 2},
  7650  	{KLatinLeftSideBearing, 50, 50, -1, 50, -10, 2, 50, 0, 51, -10, 2},
  7651  	{KLatinRightSideBearing, 50, 50, 0, 51, -10, 2, 50, -1, 50, -10, 2},
  7652  	{KLatinBothSideBearings, 50, 50, -1, 51, -10, 2, 50, -1, 51, -10, 2},
  7653  	{KArabicAlefWaw, 20, 20, 0, 20, -10, 2, 20, -5, 20, -10, 2},
  7654  	{KArabicWawAlef, 20, 20, -5, 20, -10, 2, 20, 0, 20, -10, 2},
  7655  	// ones containing surrogate pairs
  7656  	{KGb18030NoSideBearings, 50, 50, 0, 50, -10, 2, 50, 0, 50, -10, 2},
  7657  	{KGb18030LeftSideBearings, 50, 50, -1, 50, -10, 2, 50, 0, 51, -10, 2},
  7658  	{KGb18030RightSideBearings, 50, 50, 0, 51, -10, 2, 50, -1, 50, -10, 2},
  7659  	{KGb18030BothSideBearings, 50, 50, -1, 51, -10, 2, 50, -1, 51, -10, 2},
  7660  	};
  7661  /** Tests CFont::MeasureText */
  7662  void CTGlyphSelection::TestMeasureText()
  7663  	{
  7664  	CFont::TMeasureTextInput input;
  7665  	CFont::TMeasureTextOutput output;
  7666  	TInt advance;
  7667  	for (TInt i = 0;
  7668  		i != sizeof(KMeasureTextResults)/sizeof(KMeasureTextResults[0]); ++i)
  7669  		{
  7670  		TPtrC text(reinterpret_cast<const TText16*>(
  7671  			KMeasureTextResults[i].iText));
  7672  		advance = iTestFont->MeasureText(text, &input, &output);
  7673  		TEST(advance == KMeasureTextResults[i].iExpectedAdvanceLogical);
  7674  		input.iFlags = CFont::TMeasureTextInput::EFVisualOrder;
  7675  		advance = iTestFont->MeasureText(text, &input, &output);
  7676  		TEST(advance == KMeasureTextResults[i].iExpectedAdvanceL2R);
  7677  		TEST(output.iBounds.iTl.iX == KMeasureTextResults[i].iExpectedBoundsL2RLeft);
  7678  		TEST(output.iBounds.iBr.iX == KMeasureTextResults[i].iExpectedBoundsL2RRight);
  7679  		TEST(output.iBounds.iTl.iY == KMeasureTextResults[i].iExpectedBoundsL2RTop);
  7680  		TEST(output.iBounds.iBr.iY == KMeasureTextResults[i].iExpectedBoundsL2RBottom);
  7681  		input.iFlags = CFont::TMeasureTextInput::EFVisualOrderRightToLeft;
  7682  		advance = iTestFont->MeasureText(text, &input, &output);
  7683  		TEST(advance == KMeasureTextResults[i].iExpectedAdvanceR2L);
  7684  		TEST(output.iBounds.iTl.iX == KMeasureTextResults[i].iExpectedBoundsR2LLeft);
  7685  		TEST(output.iBounds.iBr.iX == KMeasureTextResults[i].iExpectedBoundsR2LRight);
  7686  		TEST(output.iBounds.iTl.iY == KMeasureTextResults[i].iExpectedBoundsR2LTop);
  7687  		TEST(output.iBounds.iBr.iY == KMeasureTextResults[i].iExpectedBoundsR2LBottom);
  7688  		}
  7689 
  7690 	INFO_PRINTF1(_L("Test fix for INC086257 - EFIncludePenPositionInBoundsCheck"));
  7691 	// left-to-right w/o flag and bounds set to just fit string disregarding sidebearings
  7692 	input.iFlags = 0;
  7693 	input.iMaxBounds = 50;
  7694 	iTestFont->MeasureText(_L("XXXXX"), &input, &output);
  7695 	TEST(output.iChars == 5);
  7696 	// set flag, string should no longer fit (break happens)
  7697 	input.iFlags = CFont::TMeasureTextInput::EFIncludePenPositionInBoundsCheck;
  7698 	iTestFont->MeasureText(_L("XXXXX"), &input, &output);
  7699 	TEST(output.iChars == 4);
  7700 	// right-to-left w/o flag and bounds set to just fit string disregarding sidebearings
  7701 	input.iFlags = CFont::TMeasureTextInput::EFVisualOrderRightToLeft;
  7702 	iTestFont->MeasureText(_L("\x5EA\x5EA\x5EA\x5EA\x5EA"), &input, &output);
  7703 	TEST(output.iChars == 5);
  7704 	// set flag, string should no longer fit (break happens)
  7705 	input.iFlags |= CFont::TMeasureTextInput::EFIncludePenPositionInBoundsCheck;
  7706 	iTestFont->MeasureText(_L("\x5EA\x5EA\x5EA\x5EA\x5EA"), &input, &output);
  7707 	TEST(output.iChars == 4);
  7708 	// top-to-bottom w/o flag and bounds set to just fit string disregarding endbearings
  7709 	input.iFlags = 0;
  7710 	input.iMaxBounds = 60;
  7711 	input.iDirection = CFont::EVertical;
  7712 	iTestFont->MeasureText(_L("\x304B\x304B\x304B\x304B\x304B"), &input, &output);
  7713 	TEST(output.iChars == 5);
  7714 	// set flag, string should no longer fit (break happens)
  7715 	input.iFlags = CFont::TMeasureTextInput::EFIncludePenPositionInBoundsCheck;
  7716 	iTestFont->MeasureText(_L("\x304B\x304B\x304B\x304B\x304B"), &input, &output);
  7717 	TEST(output.iChars == 4);
  7718  	}
  7719  
  7720 void CTGlyphSelection::RunTestCaseL(TInt aCurTestCase)
  7721 /**
  7722  This method will execute each test case method in the class
  7723  logging its progress as it does so.
  7724 */
  7725 	{
  7726 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(KUnknownSYMTestCaseIDName);
  7727 	switch(aCurTestCase)
  7728 		{
  7729 	case 1:
  7730 /**
  7731 @SYMTestCaseID 				GRAPHICS-SYSLIB-GDI-CIT-0200
  7732 */
  7733         ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-0200"));
  7734 		INFO_PRINTF1(_L("Test API Boundaries"));
  7735 		TestApiBoundaries();
  7736 		break;
  7737 	case 2:
  7738 /**
  7739 @SYMTestCaseID 				GRAPHICS-SYSLIB-GDI-CIT-0201
  7740 */
  7741 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-0201"));
  7742 		INFO_PRINTF1(_L("Test CTRL Chars"));
  7743 		TestCtrlCharsIgnored();
  7744 		break;
  7745 	case 3:
  7746 /**
  7747 @SYMTestCaseID 				GRAPHICS-SYSLIB-GDI-CIT-0202
  7748 */
  7749 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-0202"));
  7750 		INFO_PRINTF1(_L("Test Latin Chars"));
  7751 		TestLatinChars();
  7752 		break;
  7753 	case 4:
  7754 /**
  7755 @SYMTestCaseID 				GRAPHICS-SYSLIB-GDI-CIT-0203
  7756 */
  7757 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-0203"));
  7758 		INFO_PRINTF1(_L("Test Soft Hypen Char"));
  7759 		TestSoftHyphen();
  7760 		break;
  7761 	case 5:
  7762 /**
  7763 @SYMTestCaseID 				GRAPHICS-SYSLIB-GDI-CIT-0204
  7764 */
  7765 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-0204"));
  7766 		INFO_PRINTF1(_L("Test Surrogate Pairs"));
  7767 		TestSurrogates();
  7768 		INFO_PRINTF1(_L("Test Supplementary Chars"));
  7769 		TestNonBmpCharsL();
  7770 		break;
  7771 	case 6:
  7772 /**
  7773 @SYMTestCaseID 				GRAPHICS-SYSLIB-GDI-CIT-0205
  7774 */
  7775 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-0205"));
  7776 		INFO_PRINTF1(_L("Test Combining Latin Chars"));
  7777 		TestCombiningLatinChars();
  7778 		break;
  7779 	case 7:
  7780 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-0221"));
  7781 		INFO_PRINTF1(_L("Test Vietnamese Chars"));
  7782 		TestVietnameseChars();
  7783 		break;
  7784 	case 8:
  7785 /**
  7786 @SYMTestCaseID 				GRAPHICS-SYSLIB-GDI-CIT-0206
  7787 */
  7788 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-0206"));
  7789    		INFO_PRINTF1(_L("Test Vertical/Horizontal Text Bounds"));
  7790    		TestTextDirection();
  7791    		break;
  7792  	case 9:
  7793 /**
  7794 @SYMTestCaseID 				GRAPHICS-SYSLIB-GDI-CIT-0207
  7795 */
  7796 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-0207"));
  7797    		INFO_PRINTF1(_L("Test All Unicode Characters"));
  7798    		TestAllUnicodeChars();
  7799    		break;
  7800  	case 10:
  7801 /**
  7802 @SYMTestCaseID 				GRAPHICS-SYSLIB-GDI-CIT-0208
  7803 */
  7804 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-0208"));
  7805    		INFO_PRINTF1(_L("Test Ligatures with Diacritics"));
  7806    		TestLigaturesWithDiacritics();
  7807    		break;
  7808  	case 11:
  7809 /**
  7810 @SYMTestCaseID 				GRAPHICS-SYSLIB-GDI-CIT-0209
  7811 */
  7812 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-0209"));
  7813  		INFO_PRINTF1(_L("Test CFont::MeasureText()"));
  7814  		TestMeasureText();
  7815  		break;
  7816   	case 12:
  7817 /**
  7818 @SYMTestCaseID 				GRAPHICS-SYSLIB-GDI-CIT-0210
  7819 */
  7820 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-0210"));
  7821   		INFO_PRINTF1(_L("Test Indic Glyphs"));
  7822   		TestIndicCharsL();	
  7823 		break;
  7824    	case 13:
  7825 /**
  7826 @SYMTestCaseID 				GRAPHICS-SYSLIB-GDI-CIT-0211
  7827 */
  7828 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-0211"));
  7829   		INFO_PRINTF1(_L("Test Thai Rendering"));
  7830    		ExecuteThaiTests();	
  7831    		break;
  7832    	case 14:
  7833 /**
  7834 @SYMTestCaseID 				GRAPHICS-SYSLIB-GDI-CIT-0212
  7835 */
  7836 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-0212"));
  7837 		INFO_PRINTF1(_L("Test isolated Combining Latin Chars"));
  7838 		TestIsolatedCombiningLatinChars();
  7839 		break;
  7840    	case 15:
  7841 /**
  7842 @SYMTestCaseID 				GRAPHICS-SYSLIB-GDI-CIT-0213
  7843 */
  7844    		INFO_PRINTF1(_L("Test Indic Gurmukhi and Malayalam Chars"));
  7845 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-0213"));
  7846    		ExecuteIndicGurmukhiMalayalamTests();
  7847    		break;
  7848    	case 16:
  7849 /**
  7850 @SYMTestCaseID 				GRAPHICS-SYSLIB-GDI-CIT-0214
  7851 */
  7852    		INFO_PRINTF1(_L("Test Rendering Context"));
  7853 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-0214"));
  7854    		TestContextInShapeInfo();
  7855    		break;
  7856    	case 17:
  7857    		TestComplete();
  7858 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(KNotATestSYMTestCaseIDName);
  7859 		((CTGlyphSelectionStep*)iStep)->CloseTMSGraphicsStep();
  7860    		break;	
  7861    		}
  7862 	((CTGlyphSelectionStep*)iStep)->RecordTestResultL();
  7863 	}
  7864 
  7865 void CTGlyphSelection::TestPerformance()
  7866 /**
  7867  This method tests the performance of the API under test
  7868  by executing a 10000 cycles of each test case.
  7869 **/
  7870 	{
  7871 	TStopWatch profile;
  7872 	INFO_PRINTF1(_L("Test Performance..."));
  7873 
  7874 	profile.Start();
  7875 	for (TInt i = 0; i < 10000; i++)
  7876 		{
  7877 		TestCtrlCharsIgnored();
  7878 		TestLatinChars();
  7879 		TestSoftHyphen();
  7880 		TestSurrogates();
  7881 		TestCombiningLatinChars();
  7882 		TestTextDirection();
  7883 		
  7884 		}
  7885 	TUint numMilliSecs = profile.Stop();
  7886 
  7887 	INFO_PRINTF3(_L("Performance test end %d.%d s\n"),numMilliSecs/1000,numMilliSecs%1000);
  7888 	}
  7889 
  7890 
  7891 void CTGlyphSelection::TestThai_SimpleChars()
  7892 /**
  7893  This routine tests individual Thai base characters pumping them 
  7894  through the CFont::GetCharacterPosition() API.
  7895 */
  7896 	{
  7897 	TBool r;
  7898 	CFont::TPositionParam param;
  7899 	param.iDirection = CFont::EHorizontal;
  7900 	param.iFlags = CFont::TPositionParam::EFLogicalOrder;
  7901 	TBuf<5> testText(0);
  7902 	testText.SetLength(1);
  7903 	param.iText.Set(testText);
  7904 
  7905 	for (TUint i=0; Thai_SimpleChars[i] != 0xFFFF; i++)
  7906 		{
  7907 		testText[0] = Thai_SimpleChars[i];
  7908 		param.iPosInText = 0;
  7909 		param.iPen.iX = param.iPen.iY = 0;
  7910 
  7911 		r = iTestFont->GetCharacterPosition(param);
  7912 
  7913 		TEST(r && param.iPosInText == 1 
  7914 			   && param.iPen.iX == 10
  7915 			   && param.iOutputGlyphs == 1 
  7916 			   && param.iOutput[0].iCode == Thai_SimpleChars[i]);
  7917 		}
  7918 	}
  7919 
  7920 
  7921 void CTGlyphSelection::TestThai_ValidGlyphClusters()
  7922 /**
  7923  This routine tests combining sequences of Thai base & mark 
  7924  characters pumping them through the CFont::GetCharacterPosition() API.
  7925  The sequences mainly test the correct formation of Thay Glyph clusters
  7926  and the PUA substutions that take place.
  7927 */
  7928 	{
  7929 	TInt failures=0;
  7930 	TBool r;
  7931 	CFont::TPositionParam param;
  7932 	param.iDirection = CFont::EHorizontal;
  7933 	param.iFlags = CFont::TPositionParam::EFLogicalOrder;
  7934 
  7935 	for (TUint i=0; Thai_ValidGlyphClusters[i].iTextLen != -1; i++)
  7936 		{
  7937 		TBuf<8> testText(Thai_ValidGlyphClusters[i].iText);
  7938 		param.iText.Set(testText);
  7939 		param.iPosInText = Thai_ValidGlyphClusters[i].iPosInText;
  7940 		param.iPen.iX = param.iPen.iY = 0;
  7941 
  7942 		r = iTestFont->GetCharacterPosition(param);
  7943 
  7944 		if (r && param.iPosInText == Thai_ValidGlyphClusters[i].oPosInText
  7945 			   && param.iOutputGlyphs == Thai_ValidGlyphClusters[i].oOutputLen)
  7946 			{
  7947 			for (TInt j=0; j<Thai_ValidGlyphClusters[i].oOutputLen; j++)
  7948 				{
  7949 				if (param.iOutput[j].iCode != Thai_ValidGlyphClusters[i].oOutput[j])
  7950 					{
  7951 					INFO_PRINTF4(_L("FAILURE: Glyph code invariance, Complex TEST(%d), %x != %x\n"), i, param.iOutput[j].iCode, Thai_ValidGlyphClusters[i].oOutput[j]);
  7952 					failures++;
  7953 					break;
  7954 					}
  7955 				}
  7956 			}
  7957 		else
  7958 			{
  7959 			INFO_PRINTF2(_L("FAILURE: Bad output result from GetCharacterPosition, Complex TEST(%d)\n"), i);
  7960 			failures++;
  7961 			}
  7962 		}
  7963 
  7964 	TEST(failures == 0);
  7965 	}
  7966 
  7967 
  7968 void CTGlyphSelection::TestThai_InvalidGlyphClusters()
  7969 /**
  7970  This routine tests Thai base & mark cluster boundaries to ensure where 
  7971  requried the KUnicodeDottedCircle char is used when an invalid sequence is 
  7972  processed. Test data from the global Thai_GlyphClusterBoundaries 
  7973  variable is pumped through the CFont::GetCharacterPosition() API.
  7974 */
  7975 	{
  7976 	TInt failures=0;
  7977 	TBool r;
  7978 	CFont::TPositionParam param;
  7979 	param.iDirection = CFont::EHorizontal;
  7980 	param.iFlags = CFont::TPositionParam::EFLogicalOrder;
  7981 
  7982 	for (TUint i=0; Thai_GlyphClusterBoundaries[i].iTextLen != -1; i++)
  7983 		{
  7984 		TBuf<8> testText(Thai_GlyphClusterBoundaries[i].iText);
  7985 		param.iText.Set(testText);
  7986 
  7987 		for (TUint k=0; k<2; k++)
  7988 			{
  7989 			if (Thai_GlyphClusterBoundaries[i].oOut[k].iPosInText == -1)
  7990 				continue;
  7991 
  7992 			param.iPosInText = Thai_GlyphClusterBoundaries[i].oOut[k].iPosInText;
  7993 			param.iPen.iX = param.iPen.iY = 0;
  7994 
  7995 			r = iTestFont->GetCharacterPosition(param);
  7996 
  7997 			if (r && param.iPosInText == Thai_GlyphClusterBoundaries[i].oOut[k].oPosInText
  7998 				   && param.iOutputGlyphs == Thai_GlyphClusterBoundaries[i].oOut[k].oOutputLen)
  7999 				{
  8000 				for (TInt j=0; j<Thai_GlyphClusterBoundaries[i].oOut[k].oOutputLen; j++)
  8001 					{
  8002 					if (!(param.iOutput[j].iCode == Thai_GlyphClusterBoundaries[i].oOut[k].oOutput[j]))
  8003 						{
  8004 						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]);
  8005 						failures++;
  8006 						break;
  8007 						}
  8008 					}
  8009 				}
  8010 			else
  8011 				{
  8012 				INFO_PRINTF3(_L("FAILURE: Bad output result from GetCharacterPosition, Complex TEST(%d,%d)\n"), i, k);
  8013 				failures++;
  8014 				}
  8015 
  8016 			}
  8017 		}
  8018 
  8019 	if (failures)
  8020 		RDebug::Print(_L("TOTAL FAILURES: %d\n"), failures);
  8021 	TEST(failures == 0);
  8022 	}
  8023 
  8024 /**
  8025 @SYMTestCaseID          GRAPHICS-SYSLIB-GDI-CT-4062
  8026 @SYMTestCaseDesc        Tests that a punctuation character following the special-case
  8027                         character Thai SaraAm is rendered as a punctuation, not
  8028                         another SaraAm character.
  8029 @SYMTestPriority        High
  8030 @SYMTestActions         Compare input string and corresponding output glyph codes
  8031 @SYMTestExpectedResults In this case, the string and the codes should match.
  8032 @SYMDEF                 INC118424
  8033 */
  8034 void CTGlyphSelection::TestThai_INC118424()
  8035 	{
  8036 	CFont::TPositionParam param;
  8037 	param.iDirection = CFont::EHorizontal;
  8038 	param.iFlags = CFont::TPositionParam::EFLogicalOrder;
  8039 	
  8040 	//punctuation after SaraAm
  8041 	TestGlyphs(iTestFont,param,_L("\xE04\xE33:\?>"),_L("\xE04\xE33:\?>"));
  8042 	}
  8043 
  8044 /**
  8045  This fuction tests Indic Gurmukhi and Malayalam support
  8046 */
  8047 void CTGlyphSelection::ExecuteIndicGurmukhiMalayalamTests()
  8048 	{
  8049 	// create a font store for testing
  8050 	CFontStore* fontStore = CFontStore::NewL(&User::Heap());
  8051 	
  8052 	//load all ecom implemented rasterizer dlls. installs the rasterizer.	
  8053 	LoadOpenFontLibraries(fontStore);
  8054 		// test font preparation
  8055 	fontStore->iKPixelWidthInTwips = 11860; //This value is default
  8056 
  8057 	//add any required font files
  8058 	TUid err1 = fontStore->AddFileL(KTestIndicFontFile);
  8059 
  8060 	TFontSpec testIndicFontSpec(KTestIndicFontFaceName,200);
  8061 	 
  8062 	CFbsBitmap* bmp = new(ELeave) CFbsBitmap;
  8063 	
  8064 	TInt ret = bmp->Create(TSize(100,100),EGray2);
  8065 	if (ret == KErrNotSupported)
  8066 		return;
  8067 	else
  8068 		User::LeaveIfError(ret);
  8069 
  8070 	CFbsBitmapDevice* device = NULL;
  8071 	TRAPD(err2,device = CFbsBitmapDevice::NewL(bmp));
  8072 	TEST(err2 == KErrNone);
  8073 
  8074 	CFbsBitGc* gc = NULL;
  8075 	User::LeaveIfError(device->CreateContext(gc));
  8076 	
  8077 	// Font file Creation
  8078 	CFbsFont* indicFont = NULL;
  8079 	User::LeaveIfError(device->GetNearestFontToDesignHeightInTwips(indicFont,testIndicFontSpec));
  8080 	gc->UseFont(indicFont);
  8081 	CleanupStack::PushL(indicFont);
  8082 	
  8083 	//Testcode for Kannada, Marathi,Gujarati,Bengali language
  8084 	// Test Indic Gurmukhi digit.
  8085 	TInt err;
  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 digits"));
  8090 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-TI18N-GDI-CIT-4063"));
  8091 	TestGurmukhiDigit( *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 Gurmukhi and Latin"));
  8096 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-TI18N-GDI-CIT-4064"));
  8097 	TestGurmukhiAndLatin( *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 DEF102858 on Gurmukhi"));
  8102 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-TI18N-GDI-CIT-4065"));
  8103 	TestGurmukhiModifierAfterConsonantViramaZWJ( *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 consonant leading"));
  8108 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-TI18N-GDI-CIT-4066"));
  8109 	TestGurmukhiWithConsonantInitial( *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 Gurmukhi vowel leading"));
  8114 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-TI18N-GDI-CIT-4068"));
  8115 	TestGurmukhiWithVowelInitial( *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 digits"));
  8120 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-TI18N-GDI-CIT-4067"));
  8121 	TestMalayalamDigit( *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 Malayalam and Latin"));
  8126 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-TI18N-GDI-CIT-4069"));
  8127 	TestMalayalamAndLatin( *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 DEF102858 on Malayalam"));
  8132 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-TI18N-GDI-CIT-4070"));
  8133 	TestMalayalamModifierAfterConsonantViramaZWJ( *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 consonant leading"));
  8138 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-TI18N-GDI-CIT-4071"));
  8139 	TestMalayalamWithConsonantInitial( *indicFont );
  8140 	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  8141     	if (err!=KErrNone)
  8142     		INFO_PRINTF1(_L("Failed to record test result"));
  8143 	INFO_PRINTF1(_L("Test Indic Malayalam vowel leading"));
  8144 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-TI18N-GDI-CIT-4072"));
  8145 	TestMalayalamWithVowelInitial( *indicFont );
  8146 	CleanupStack::Pop(indicFont);
  8147 			
  8148 	//Cleaning the memory
  8149 	delete bmp;
  8150 	delete device;
  8151 	delete gc;
  8152 	fontStore->RemoveFile(err1);
  8153 	delete fontStore;
  8154 	REComSession::FinalClose();
  8155 	}
  8156 /**
  8157  This function tests the Thai Font Rendering feature of the CFont class
  8158  in the GDI.dll and in particular the modifications made to 
  8159  CFont::GetCharacterPosition() to support the Unicocde Thai code page.
  8160  First introduced during the Sirocco project (A3.1.1)
  8161 @SYMFssID Graphics/GDI/GDI/1
  8162 @SYMFssID Graphics/GDI/GDI/2
  8163 */
  8164 
  8165 void CTGlyphSelection::ExecuteThaiTests()
  8166 	{
  8167 	// Test individual Thai digits, letters and sign characters.
  8168 	INFO_PRINTF1(_L("Test Thai simple charecters"));
  8169 	TestThai_SimpleChars();
  8170 
  8171 	// Test complex Thai char sequences.
  8172 	INFO_PRINTF1(_L("Test valid Thai glyph clusters"));
  8173 	TestThai_ValidGlyphClusters();
  8174 
  8175 	// Test Thai glyph cluster boundaries.
  8176 	INFO_PRINTF1(_L("Test invalid Thai glyph clusters"));
  8177 	TestThai_InvalidGlyphClusters();
  8178 
  8179 	// Test Thai SaraAm-punctuation exception.
  8180 	INFO_PRINTF1(_L("Test fix for INC118424"));
  8181 	TestThai_INC118424();
  8182 	}
  8183 
  8184 
  8185 /*  
  8186  * Note:
  8187  *       This is just a easy way to help generate the test data info
  8188  *       Any new added test data should do manually check firstly to check the correction before using this function
  8189  */
  8190 // #define GEN_GURMUKHIMALAYALAMTESTDATA
  8191 void CTGlyphSelection::GenerateGurmukhiMalayalamData( const TDesC& filename, const TTestInput_PositionParam6* testArray, const CFbsFont& aFont )
  8192     {
  8193     RFile file;
  8194     file.Replace( iFs, filename, EFileWrite );
  8195     
  8196     CFont::TPositionParam param;
  8197     param.iDirection = CFont::EHorizontal;
  8198     param.iFlags = CFont::TPositionParam::EFLogicalOrder;
  8199     RShapeInfo shapeInfo;
  8200 
  8201     if (!testArray)
  8202         {
  8203         return;
  8204         }
  8205 
  8206     for (TUint i = 0; testArray[i].iTextLen != -1; i++)
  8207         {
  8208         TTestInput_PositionParam6 currentArray = testArray[i];
  8209         TBuf<8> testText(testArray[i].iText);
  8210         param.iText.Set(testText);
  8211         
  8212         TBuf8<256> datatext;
  8213         datatext.SetLength(0);
  8214         //{ 1, {0x0a66}, { {0, 1, 1, {0x12fe} }, {-1, 1, 1, {0} } } },
  8215         datatext.Format(_L8("{ %d, {"), testArray[i].iTextLen);  // 1, 
  8216         
  8217         for (TUint i = 0; i<testText.Length(); i++)
  8218             {
  8219             TBuf8<8> tmp;
  8220             tmp.Format(_L8("0x%x, "), currentArray.iText[i]); // {0x0a66},
  8221             datatext.Append(tmp);
  8222             }
  8223         datatext = datatext.Left(datatext.Length()-2);
  8224         datatext.Append(_L8("}, { "));
  8225 
  8226         if (shapeInfo.IsOpen())
  8227             shapeInfo.Close();
  8228 
  8229         for (TUint k = 0; k < 6; k++)
  8230             {
  8231             param.iPosInText = k;
  8232             param.iPen.iX = param.iPen.iY = 0;
  8233             TBool ret = aFont.GetCharacterPosition2(param, shapeInfo);
  8234             if (0 == param.iOutputGlyphs)
  8235                 continue;
  8236             
  8237             TBuf8<16> tmp;
  8238             tmp.Format(_L8("{%d, %d, %d, {"), k, param.iPosInText, param.iOutputGlyphs);
  8239             datatext.Append(tmp);
  8240             
  8241             for (TInt j = 0; j < param.iOutputGlyphs; j++)
  8242                 {
  8243                 TText16 aCode = param.iOutput[j].iCode;
  8244                 TBuf8<128> tmp;
  8245                 tmp.Format(_L8("0x%x, "), aCode);
  8246                 datatext.Append(tmp);
  8247                 } //end for
  8248             datatext = datatext.Left(datatext.Length()-2);
  8249             datatext.Append(_L8("}}, "));
  8250             } //end for
  8251         datatext.Append(_L8(" {-1, 1, 1, {0}} } }, \n"));
  8252         
  8253         file.Write(datatext);
  8254         } //end for
  8255     
  8256     file.Close();
  8257     return;
  8258     }
  8259 
  8260 void CTGlyphSelection::DoEachGurmukhiMalayalamCase( const TTestInput_PositionParam6* testArray, const CFbsFont& aFont )
  8261 	{
  8262 	TInt failures=0;
  8263 	TBool r;
  8264 	CFont::TPositionParam param;
  8265 	param.iDirection = CFont::EHorizontal;
  8266 	param.iFlags = CFont::TPositionParam::EFLogicalOrder;
  8267 	RShapeInfo shapeInfo;
  8268 	
  8269 	if ( !testArray )
  8270 		{
  8271 		return;
  8272 		}
  8273 	
  8274 	for (TUint i=0; testArray[i].iTextLen != -1; i++)
  8275 		{
  8276 		TBuf<8> testText(testArray[i].iText);
  8277 		param.iText.Set(testText);
  8278 		if(shapeInfo.IsOpen())
  8279 		    shapeInfo.Close();
  8280 		
  8281 		for (TUint k=0; k<6; k++)
  8282 			{
  8283 			//	If it's end of sequence
  8284 			if ( testArray[i].oOut[k].iPosInText == -1)
  8285 				break;
  8286 	
  8287 			param.iPosInText = testArray[i].oOut[k].iPosInText;
  8288 			param.iPen.iX = param.iPen.iY = 0;
  8289 	
  8290 			r = aFont.GetCharacterPosition2(param, shapeInfo);
  8291 			
  8292 			if (r && param.iPosInText == testArray[i].oOut[k].oPosInText
  8293 				   && param.iOutputGlyphs == testArray[i].oOut[k].oOutputLen)
  8294 				{
  8295 				for (TInt j=0; j<testArray[i].oOut[k].oOutputLen; j++)
  8296 					{
  8297 					//	Trim off the highest bit
  8298 					TText16 aCode = param.iOutput[j].iCode;
  8299 					if (!( aCode == testArray[i].oOut[k].oOutput[j]))
  8300 						{
  8301 						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]);
  8302 						failures++;
  8303 						break;
  8304 						}
  8305 					}
  8306 				}
  8307 			else
  8308 				{
  8309 				INFO_PRINTF4(_L("FAILURE: Bad output result from GetCharacterPosition, Complex TEST(%d,%d,%d)\n"), i, k, param.iOutputGlyphs);
  8310 				failures++;
  8311 				}
  8312 	
  8313 			}
  8314 		}
  8315 	
  8316 	if (failures)
  8317 		RDebug::Print(_L("TOTAL FAILURES: %d\n"), failures);
  8318 	TEST(failures == 0);
  8319 	}
  8320 /**
  8321 @SYMTestCaseID          GRAPHICS-TI18N-GDI-CIT-4063
  8322 @SYMTestCaseDesc        Case to check Gurmukhi digit support
  8323 @SYMTestPriority        High
  8324 @SYMTestActions         Call to CFont::GetCharacterPosition2/CFont::MeasureText to check the following
  8325 						1.Pass Gurmukhi digit (0xa66 ~ 0x0a6f) sequence
  8326 						2.Pass any Consonant + Gurmukhi digit sequence 
  8327 						3.Pass any Consonant + Gurmukhi digit + Matra sequence
  8328 						4.Repetitive callss with Unicode sequence from the first 3 action items 
  8329 						5.Pass Modifer + digit sequence
  8330 						6.Pass Vowel and digit sequence
  8331 						7.Pass Virama and digit sequence 
  8332 @SYMTestExpectedResults 1.Glyph count, character count for digit is 1 for each digit, and glyph indices depends on font
  8333 						2.Digit is recognized as a separate syllable
  8334 						3.Matra and digit is not combined together
  8335 						4.The shaper returned the same result as first 3 results
  8336 						5.digit is recognized, and not combined with Modifier
  8337 						6.digit is recognized, and not combined with Vowel.
  8338 						7.digit is recognized, and not combined with Virama.
  8339 @SYMPREQ 1922: Gurmukhi support
  8340 */
  8341 void CTGlyphSelection::TestGurmukhiDigit( const CFbsFont& aFont )
  8342 	{
  8343 	DoEachGurmukhiMalayalamCase( (TTestInput_PositionParam6*)Indic_GurmukhiDigit, aFont );
  8344 	
  8345 #ifdef GEN_GURMUKHIMALAYALAMTESTDATA
  8346 	_LIT(KValidFontPath, "c:\\GurmukhiDigit.txt");
  8347 	GenerateGurmukhiMalayalamData(KValidFontPath, (TTestInput_PositionParam6*)Indic_GurmukhiDigit, aFont );
  8348 #endif
  8349 	}
  8350 
  8351 /**
  8352 @SYMTestCaseID          GRAPHICS-TI18N-GDI-CIT-4064
  8353 @SYMTestCaseDesc        case to check if shaper can render Gurmukhi with other implemented Indic scripts and Latin
  8354 @SYMTestPriority        High
  8355 @SYMTestActions         Call to CFont::GetCharacterPosition2/CFont::MeasureText to check the following
  8356 						1.Pass Gurmukhi sentence and Latin to the function
  8357 						2.Pass Latin and Gurmukhi setence.
  8358 						3.Pass syllable, Latin and syllable
  8359 						4.Pass phoneme, Latin and phoneme
  8360 						5.Pass Gurmukhi syllable and other Indic scripts together.
  8361 						6.Pass Gurmukhi phoneme and other Indic script phoneme
  8362 @SYMTestExpectedResults Gurumuki and Latin characters donĄ¯t mess up. Gurmukhi phoneme doesnĄ¯t combine with Latin into a new syllable, 
  8363 						Gurmukhi phoneme doesnĄ¯t form a syllable with other Indic script.
  8364 @SYMPREQ 1922: Gurmukhi support
  8365 */
  8366 void CTGlyphSelection::TestGurmukhiAndLatin( const CFbsFont& aFont )
  8367 	{
  8368 	DoEachGurmukhiMalayalamCase( (TTestInput_PositionParam6*)Indic_GurmukhiAndLatin, aFont );
  8369 
  8370 #ifdef GEN_GURMUKHIMALAYALAMTESTDATA
  8371     _LIT(KValidFontPath, "c:\\GurmukhiAndLatin.txt");
  8372     GenerateGurmukhiMalayalamData(KValidFontPath, (TTestInput_PositionParam6*)Indic_GurmukhiDigit, aFont );
  8373 #endif
  8374 	}
  8375 
  8376 /**
  8377 @SYMTestCaseID          GRAPHICS-TI18N-GDI-CIT-4065
  8378 @SYMTestCaseDesc        case to check Gurmukhi modifier after Consonant, Virama, ZWJ
  8379 @SYMTestPriority        High
  8380 @SYMTestActions         Call to CFont::GetCharacterPosition2/CFont::MeasureText to check the following
  8381 						1.Pass Consonant + Virama + ZWJ + Modifier
  8382 @SYMTestExpectedResults Modifier is part of the syllable.
  8383 @SYMPREQ 1922: Gurmukhi support, make sure DEF102858 fixing does not cause side effect
  8384 */
  8385 void CTGlyphSelection::TestGurmukhiModifierAfterConsonantViramaZWJ( const CFbsFont& aFont )
  8386 	{
  8387 	DoEachGurmukhiMalayalamCase( (TTestInput_PositionParam6*)Indic_GurmukhiModifierAfterConsonantViramaZWJ, aFont );
  8388 	
  8389 #ifdef GEN_GURMUKHIMALAYALAMTESTDATA
  8390     _LIT(KValidFontPath, "c:\\GurmukhiModifierAfterConsonantViramaZWJ.txt");
  8391     GenerateGurmukhiMalayalamData(KValidFontPath, (TTestInput_PositionParam6*)Indic_GurmukhiDigit, aFont );
  8392 #endif
  8393 	}
  8394 
  8395 /**
  8396 @SYMTestCaseID          GRAPHICS-TI18N-GDI-CIT-4066
  8397 @SYMTestCaseDesc        case to check syllable with consonant in initial position
  8398 @SYMTestPriority        High
  8399 @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.
  8400 						1.Pass  consonant and Nukta sequence
  8401 						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..
  8402 						3.Pass consonant and matra /i/ t sequence 
  8403 						4.Pass the following Consonant, Virama and HA sequence 
  8404 						  Another sequence:  Consonant , Virama and RA
  8405 						  Another sequence:  Consonant, Virama and VA
  8406 						  Another sequence:  Consonant, Virama and YA
  8407 						5.Pass Consonant  and Addak sequence to shaper 
  8408 						  Pass Consonant, Addak and Consonant to shaper
  8409 						6.Pass Consonant and BINDI sequence:  
  8410 						  Sequence1:Consonant and BINDI,
  8411 						  Sequence2: Consonant, dependent vowel which is shown to the right of base consonant and BINDI,
  8412 						  Sequence3: Consonant, dependent vowel which is shown to the top of the base consonant and BINDI
  8413 						  Pass Consonant and TIPPI sequence:
  8414 						  Sequence1: Consonant and TIPPI, 
  8415 						  Sequence2: Consonant, dependent vowel which is shown to the left of the base consonant and TIPPI.
  8416 						  Sequence3: Consonant, dependent vowel which is shown to the bottom of the base consonant and TIPPI.
  8417 						7.Pass Nukta, equavalent consonant, Nukta sequence to shaper sepeartely, save both result
  8418 @SYMTestExpectedResults 1.nukta is combined to the base consonant according to the returned shape info
  8419 						2.The matra position is different between two ShapeText calls according to the returned shaped info.
  8420 						3.matra /i/ is combined to the left of the base consonant in position
  8421 						4.HA, RA, VA is on bottom of the base consonant and subscripted, YA in final form according to the returned shape info.
  8422 						5.Addak is on top of consonant, addak belongs to the consonant precedes it.
  8423 						6.BINDI is on top,  TIPPI is on bottom
  8424 						7.The combinationĄ¯s character count, glyph count, glyph indices info is the same as  the single nuktaĄ¯s
  8425 @SYMPREQ 1922: Gurmukhi support
  8426 */
  8427 void CTGlyphSelection::TestGurmukhiWithConsonantInitial( const CFbsFont& aFont )
  8428 	{
  8429 	DoEachGurmukhiMalayalamCase( (TTestInput_PositionParam6*)Indic_GurmukhiConsonantLeading, aFont );
  8430 	
  8431 #ifdef GEN_GURMUKHIMALAYALAMTESTDATA
  8432     _LIT(KValidFontPath, "c:\\GurmukhiWithConsonantInitial.txt");
  8433     GenerateGurmukhiMalayalamData(KValidFontPath, (TTestInput_PositionParam6*)Indic_GurmukhiDigit, aFont );
  8434 #endif
  8435 	}
  8436 
  8437 
  8438 /**
  8439 @SYMTestCaseID          GRAPHICS-TI18N-GDI-CIT-4067
  8440 @SYMTestCaseDesc        Case to check Malayalam digit support
  8441 @SYMTestPriority        High
  8442 @SYMTestActions         Call to CFont::GetCharacterPosition2/CFont::MeasureText to check the following
  8443 						1.Pass Malayalam digit (0xd66 ~ 0x0d6f) sequence
  8444 						2.Pass any Consonant + Malayalam digit sequence 
  8445 						3.Pass any Consonant + Malayalam digit + Matra sequence
  8446 						4.Repetitive callss with Unicode sequence from the first 3 action items 
  8447 						5.Pass Modifer + digit sequence
  8448 						6.Pass Vowel and digit sequence
  8449 						7.Pass Virama and digit sequence 
  8450 @SYMTestExpectedResults 1.Glyph count, character count for digit is 1 for each digit, and glyph indices depends on font
  8451 						2.Digit is recognized as a separate syllable
  8452 						3.Matra and digit is not combined together
  8453 						4.The shaper returned the same result as first 3 results
  8454 						5.digit is recognized, and not combined with Modifier
  8455 						6.digit is recognized, and not combined with Vowel.
  8456 						7.digit is recognized, and not combined with Virama.
  8457 @SYMPREQ 1922: Malayalam support
  8458 */
  8459 void CTGlyphSelection::TestMalayalamDigit( const CFbsFont& aFont )
  8460 	{
  8461 	DoEachGurmukhiMalayalamCase( (TTestInput_PositionParam6*)Indic_MalayalamDigit, aFont );
  8462 	
  8463 #ifdef GEN_GURMUKHIMALAYALAMTESTDATA
  8464     _LIT(KValidFontPath, "c:\\MalayalamDigit.txt");
  8465     GenerateGurmukhiMalayalamData(KValidFontPath, (TTestInput_PositionParam6*)Indic_GurmukhiDigit, aFont );
  8466 #endif	
  8467 	}
  8468 
  8469 /**
  8470 @SYMTestCaseID          GRAPHICS-TI18N-GDI-CIT-4068
  8471 @SYMTestCaseDesc        case to check syllable with vowel in initial position
  8472 @SYMTestPriority        High
  8473 @SYMTestActions         Call to CFont::GetCharacterPosition2/CFont::MeasureText to check the following using data from above requirements, 
  8474 						each requirement above gives a vowel leading Unicode sequence. Each sequence falls into one of the following structure, 
  8475 						then pass it to the calling.
  8476 						1.Pass ARA, IRI to shaper, pass URA sequence
  8477 						2.Pass valid bearer  and vowel pair sequence
  8478 						  Pass invalid bearer and vowel pair sequence
  8479 @SYMTestExpectedResults 1.ARA character count is 1, IRI, URA character count is 0
  8480 						2.valid combination is combined together, invalid is not combined together
  8481 @SYMPREQ 1922: Gurmukhi support
  8482 */
  8483 void CTGlyphSelection::TestGurmukhiWithVowelInitial( const CFbsFont& aFont )
  8484 	{
  8485 	DoEachGurmukhiMalayalamCase( (TTestInput_PositionParam6*)Indic_GurmukhiVowelLeading, aFont );
  8486 	
  8487 #ifdef GEN_GURMUKHIMALAYALAMTESTDATA
  8488     _LIT(KValidFontPath, "c:\\GurmukhiWithVowelInitial.txt");
  8489     GenerateGurmukhiMalayalamData(KValidFontPath, (TTestInput_PositionParam6*)Indic_GurmukhiDigit, aFont );
  8490 #endif  
  8491 	}
  8492 
  8493 /**
  8494 @SYMTestCaseID          GRAPHICS-TI18N-GDI-CIT-4069
  8495 @SYMTestCaseDesc        case to check if shaper can render Malayalam with other implemented Indic scripts and Latin
  8496 @SYMTestPriority        High
  8497 @SYMTestActions         Call to CFont::GetCharacterPosition2/CFont::MeasureText to check the following
  8498 						1.Pass Malayalam sentence and Latin to the function
  8499 						2.Pass Latin and Gurmukhi setence.
  8500 						3.Pass syllable, Latin and syllable
  8501 						4.Pass phoneme, Latin and phoneme
  8502 						5.Pass Malayalam syllable and other Indic scripts together.
  8503 						6.Pass Malayalam phoneme and other Indic script phoneme
  8504 @SYMTestExpectedResults Malayalam and Latin characters donĄ¯t mess up. Malayalam phoneme doesnĄ¯t combine with Latin into a new syllable, 
  8505 						Malayalam phoneme doesnĄ¯t form a syllable with other Indic script.
  8506 @SYMPREQ 1922: Malayalam support
  8507 */
  8508 void CTGlyphSelection::TestMalayalamAndLatin( const CFbsFont& aFont )
  8509 	{
  8510 	DoEachGurmukhiMalayalamCase( (TTestInput_PositionParam6*)Indic_MalayalamAndLatin, aFont );
  8511 	
  8512 #ifdef GEN_GURMUKHIMALAYALAMTESTDATA
  8513     _LIT(KValidFontPath, "c:\\MalayalamAndLatin.txt");
  8514     GenerateGurmukhiMalayalamData(KValidFontPath, (TTestInput_PositionParam6*)Indic_GurmukhiDigit, aFont );
  8515 #endif  
  8516 	}
  8517 
  8518 /**
  8519 @SYMTestCaseID          GRAPHICS-TI18N-GDI-CIT-4070
  8520 @SYMTestCaseDesc        case to check  Malayalam modifier after Consonant, Virama, ZWJ
  8521 @SYMTestPriority        High
  8522 @SYMTestActions         Call to CFont::GetCharacterPosition2/CFont::MeasureText to check the following
  8523 						1. Pass Consonant + Virama + ZWJ + Modifier
  8524 @SYMTestExpectedResults Modifier is part of the syllable.
  8525 @SYMPREQ 1922: Malayalam support, make sure DEF102858 fixing does not cause side effect 
  8526 */
  8527 void CTGlyphSelection::TestMalayalamModifierAfterConsonantViramaZWJ( const CFbsFont& aFont )
  8528 	{
  8529 	DoEachGurmukhiMalayalamCase( (TTestInput_PositionParam6*)Indic_MalayalamModifierAfterConsonantViramaZWJ, aFont );
  8530 	
  8531 #ifdef GEN_GURMUKHIMALAYALAMTESTDATA
  8532     _LIT(KValidFontPath, "c:\\MalayalamModifierAfterConsonantViramaZWJ.txt");
  8533     GenerateGurmukhiMalayalamData(KValidFontPath, (TTestInput_PositionParam6*)Indic_GurmukhiDigit, aFont );
  8534 #endif  
  8535 	}
  8536 
  8537 /**
  8538 @SYMTestCaseID          GRAPHICS-TI18N-GDI-CIT-4071
  8539 @SYMTestCaseDesc        case to check syllable with consonant in initial position
  8540 @SYMTestPriority        High
  8541 @SYMTestActions         Call to CFont::GetCharacterPosition2/CFont::MeasureText to check the following using data from above requirements, 
  8542 						each requirement above gives a consonant leading Unicode sequence. Each sequence falls into one of the following structure, 
  8543 						then pass it to the calling.
  8544 						1.Pass consonant + vowel single code, and  consonant + its split representation to shaper
  8545 						  The following Single representation /Split representation is passed to shaper
  8546 						  0x0d14/0x0d12 + 0x0d57, 0x0d4a/0x0d46 + 0x0d3e, 0x0d4b/0x0d47 + 0x0d3e
  8547 						  0x0d4c/0x0d46 + 0x0d57
  8548 						2.Pass two Consonant and dependent Vowel sequences to shaper, save both returned results. 
  8549 						  The Consonant is first sequence is difference with that of the second sequence, and the dependent Vowel is identical.
  8550 						3.Pass Consonant and Matras /-e/, /-ee/, /-ai/ to shaper. 
  8551 						4.Pass Consonant and Matras /-o/, /-oo/, /-au/ to shaper
  8552 						  Pass Consonant and 0x0d4c (first form of Matra /-au/ ) to shaper,
  8553 						  Pass Consonant, 0x0d46 and 0x0d57 (second form of Matra /-au/) to shaper002E
  8554 						5.Pass Consonant + 0x0d4d + Consonant to shaper
  8555 						  Pass Consonant + Virama + Consonant + 0x0d4d to shaper
  8556 						6.Pass Consonant (NNA, NA, RA, LA, LLA) + Virama + ZWJ to shaper
  8557 						  Pass KA + Virama + ZWJ to shaper.
  8558 						  Pass other Consonant + Virama + ZWJ to shaper.
  8559 						7.Pass RA + Virama + ZWJ to shaper,
  8560 						  Pass RRA + Viram + ZWJ to shaper.
  8561 						8.Pass Chillu ( one of 6 special consontants + Virama + ZWJ) and Vowel to shaper
  8562 						  Pass Chillu and Modifier to shaper
  8563 						  Pass Chillu and Virama to shaper
  8564 						9.Pass one of (KA, GA, PA, BA, MA, LA, SHA, SA, HA), Virama and LA to shaper
  8565 						10.Pass CA, Virama and CA to shaper
  8566 						   Pass BA, Virama and BA to shaper
  8567 						   Pass YA, Virama and YA to shaper
  8568 						   Pass VA, Virama and VA to shaper
  8569 						   PASS other Consonant, Virama and the same Consonant to shaper.
  8570 						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.
  8571 						12.Pass Consonant clusters from REQ1.3.11 to shaper.
  8572 						13.Pass S.RR.RRA to shaper,
  8573 						   Pass N.RR.RRA to shaper
  8574 @SYMTestExpectedResults 1.First sequence is equivalent to the second sequence 
  8575 						2.The dependent vowel position is different between the two sequence
  8576 						3.The visual position of the Matras is different with the logical order (The same as Keyboard input order).
  8577 						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.
  8578 						5.0x0d4d is recognized as a Virama in first sequence, itĄ¯s recognized as MATRA (mid-u sound) in the second sequence
  8579 						6.Virama and ZWJ is interpreted as Chillaksharam for the 6 consonants, for others itĄ¯s not interpreted that way.
  8580 						7.Both sequences will interprete RA Chillu.
  8581 						8.The combining character should not combine with Chillu.
  8582 						9.LA takes subscript shape.
  8583 						10.CA, BA, YA, VA double should result in a ligature, other consonants donĄ¯t.
  8584 						11.The latter consonant in the cluster becomes a miniature subscript.
  8585 						12.sequence forms a ligature.
  8586 						13.sequence forms a ligature
  8587 @SYMPREQ 1922: Malayalam support
  8588 */
  8589 void CTGlyphSelection::TestMalayalamWithConsonantInitial( const CFbsFont& aFont )
  8590 	{
  8591 	DoEachGurmukhiMalayalamCase( (TTestInput_PositionParam6*)Indic_MalayalamConsonantLeading, aFont );
  8592 	
  8593 #ifdef GEN_GURMUKHIMALAYALAMTESTDATA
  8594     _LIT(KValidFontPath, "c:\\MalayalamWithConsonantInitial.txt");
  8595     GenerateGurmukhiMalayalamData(KValidFontPath, (TTestInput_PositionParam6*)Indic_GurmukhiDigit, aFont );
  8596 #endif  
  8597 	}
  8598 
  8599 /**
  8600 @SYMTestCaseID          GRAPHICS-TI18N-GDI-CIT-4072
  8601 @SYMTestCaseDesc        case to check if shaper can render Malayalam with other implemented Indic scripts and Latin
  8602 @SYMTestPriority        High
  8603 @SYMTestActions         Call to CFont::GetCharacterPosition2/CFont::MeasureText to check the following
  8604 						1.Pass Malayalam sentence and Latin to the function
  8605 						2.Pass Latin and Malayalam setence.
  8606 						3.Pass syllable, Latin and syllable
  8607 						4.Pass phoneme, Latin and phoneme
  8608 						5.Pass Malayalam syllable and other Indic scripts together.
  8609 						6.Pass Malayalam phoneme and other Indic script phoneme
  8610 @SYMTestExpectedResults Malayalam and Latin characters donĄ¯t mess up. Malayalam phoneme doesnĄ¯t combine with Latin into a new syllable, 
  8611 						Malayalam phoneme doesnĄ¯t form a syllable with other Indic script.
  8612 @SYMPREQ 1922: Malayalam support
  8613 */
  8614 void CTGlyphSelection::TestMalayalamWithVowelInitial( const CFbsFont& aFont )
  8615 	{
  8616 	DoEachGurmukhiMalayalamCase( (TTestInput_PositionParam6*)Indic_MalayalamVowelLeading, aFont );
  8617 	
  8618 #ifdef GEN_GURMUKHIMALAYALAMTESTDATA
  8619     _LIT(KValidFontPath, "c:\\MalayalamWithVowelInitial.txt");
  8620     GenerateGurmukhiMalayalamData(KValidFontPath, (TTestInput_PositionParam6*)Indic_GurmukhiDigit, aFont );
  8621 #endif 
  8622 	}
  8623 
  8624 #ifdef TEST
  8625 #undef TEST
  8626 #define TEST(a)  testBooleanTrue((a), (TText8*)__FILE__, __LINE__)
  8627 #endif
  8628 
  8629 //--------------
  8630 
  8631 __CONSTRUCT_STEP__(GlyphSelection)
  8632 
  8633 void CTGlyphSelectionStep::TestSetupL()
  8634 	{
  8635 #ifdef _GLOWCODE_LAUNCH_DELAY
  8636 	INFO_PRINTF1(_L("Time delay...."));
  8637 	TTime t1, t2;
  8638 	t1.UniversalTime();
  8639 	t1 += TTimeIntervalSeconds(15);
  8640 	do 
  8641 		{
  8642 		t2.UniversalTime();
  8643 		}
  8644 	while (t2 < t1);
  8645 #endif
  8646 	}