os/graphics/graphicsdeviceinterface/gdi/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-2009 Nokia Corporation and/or its subsidiary(-ies).
     2 // All rights reserved.
     3 // This component and the accompanying materials are made available
     4 // under the terms of "Eclipse Public License v1.0"
     5 // which accompanies this distribution, and is available
     6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
     7 //
     8 // Initial Contributors:
     9 // Nokia Corporation - initial contribution.
    10 //
    11 // Contributors:
    12 //
    13 // Description:
    14 // This is a unit test module which defines the test code that 
    15 // exercise CFont::GetCharacterPosition() functionality.
    16 // 
    17 //
    18 
    19 /**
    20  @file
    21  @test
    22  @internalComponent
    23 */
    24 
    25 
    26 //
    27 // -- INCLUDE FILES ---------------------------------------------------------
    28 //
    29 
    30 
    31 #include <e32std.h>
    32 #include <biditext.h>
    33 #include <bidi.h>
    34 #include <linebreak.h>
    35 #include <bidivisual.h>
    36 #include "GlyphSel.h"
    37 #include "TGlyphSel.h"
    38 #include <graphics/openfontconstants.h>
    39 #include <graphics/openfontrasterizer.h>
    40 
    41 
    42 //
    43 // -- CONSTANTS -------------------------------------------------------------
    44 //
    45 
    46 /**
    47  This define when set introduces a delay to start up to allow Glowcode to
    48  be set up to collect statistics.
    49 */
    50 //#define _GLOWCODE_LAUNCH_DELAY 1
    51 
    52 
    53 /** RTest object for unit test output */
    54 //RTest TEST(_L("TGlyphSel - CFont Glyph Selection"));
    55 
    56 /** Thread name for test cases involving a new thread. */
    57 _LIT(KThread2NameFirst, "GlyphSelPanicTest_First");
    58 _LIT(KThread2NameSecond, "GlyphSelPanicTest_Second");
    59 
    60 /*Beginning of Indic language font file constants declaration*/
    61 
    62 _LIT16(KTestHindiFontFile, "C:\\TNR_Dev_OT.ttf");
    63 _LIT16(KTestHindiFontFaceName, "Devanagari OT Eval");
    64 
    65 //_LIT16(KTestIndicFontFile, "C:\\s60ssb_v435.ttf");
    66 _LIT16(KTestIndicFontFile, "C:\\s60ssb_v500.ttf");
    67 _LIT16(KTestIndicFontFaceName, "Series 60 Sans");
    68 
    69 //_LIT16(KTestTeluguFontFile, "C:\\s60ssb_v500.ttf");
    70 //_LIT16(KTestTeluguFontFaceName, "Series 60 Sans");
    71 
    72 _LIT16(KTestGB18030FontFile, "C:\\TestExtB.ttf");
    73 _LIT16(KTestGB18030FontFaceName, "Test Font for CJK ExtB");
    74 
    75 /*End of Indic language font file constants declaration*/
    76 //
    77 // -- THAI TEST DATA --------------------------------------------------------
    78 //
    79 
    80 
    81 /**
    82  An array of Thai characters each of which is individually passed into
    83  GetCharacterPosition() for testing.
    84 */
    85 LOCAL_D const TText16 Thai_SimpleChars[] = {
    86 	 // Digits test 0..9
    87 	0x0E50, 0x0E51, 0x0E52, 0x0E53, 0x0E54,
    88 	0x0E55, 0x0E56, 0x0E57, 0x0E58, 0x0E59,
    89 
    90 	// Consonants
    91 	0x0E01, 0x0E02, 0x0E03, 0x0E04, 0x0E05, 0x0E06, 0x0E07, 
    92 	0x0E08, 0x0E09, 0x0E0A, 0x0E0B, 0x0E0C, 0x0E0D, 0x0E0E, 0x0E0F, 
    93 	0x0E10, 0x0E11, 0x0E12, 0x0E13, 0x0E14, 0x0E15, 0x0E16, 0x0E17, 
    94 	0x0E18, 0x0E19, 0x0E1A, 0x0E1B, 0x0E1C, 0x0E1D, 0x0E1E, 0x0E1F, 
    95 	0x0E20, 0x0E21, 0x0E22, 0x0E23, 0x0E24, 0x0E25, 0x0E26, 0x0E27, 
    96 	0x0E28, 0x0E29, 0x0E2A, 0x0E2B, 0x0E2C, 0x0E2D, 0x0E2E, 
    97 
    98 	// Independent vowels
    99 	0x0E30, 0x0E32, // 0x0E33, Sara Am decomposed, not simple
   100 	0x0E40, 0x0E41, 0x0E42, 0x0E43, 0x0E44, 
   101 
   102 	// Independent signs
   103 	0x0E2F, 0x0E3F, 0x0E45, 0x0E46, 0x0E4F, 0x0E5A, 0x0E5B, 
   104 
   105 	// Array end
   106 	0xFFFF,
   107 	};
   108 
   109 /**
   110  Data structure used to hold the in and out data of one invoke
   111  of the CFont::GetCharacterPosition() API.
   112 */
   113 struct TTestInput_PositionParam
   114 	{
   115 	TInt	iTextLen;
   116 	TText16	iText[4];
   117 	TInt	iPosInText;
   118 	TInt	oPosInText;
   119 	TInt	oOutputLen;
   120 	TText16	oOutput[CFont::TPositionParam::EMaxOutputGlyphs];
   121 	};
   122 
   123 /**
   124  This array of structs is used in the test routine 
   125  CTGlyphSelection::TestThai_ValidGlyphClusters() for verifying
   126  GetCharacterPosition() constructs Thai PUA glyph clusters correctly.
   127 */
   128 LOCAL_D const TTestInput_PositionParam Thai_ValidGlyphClusters[] = {
   129 //    --INPUT----------------			--OUTPUT----------------------
   130 
   131 //  TEST A1..A8 handled in Thai_SimpleChars table.
   132 
   133 //0.TEST A9 - Decomposed SARA AM
   134 	{ 2, {0x0E01, 0x0E33}, 1,			2, 1, {0x0E33}},
   135 	{ 2, {0x0E1B, 0x0E33}, 1,			2, 2, {0xF711, 0x0E32}},
   136 	{ 2, {0x0E41, 0x0E33}, 1,			2, 2, {KUnicodeDottedCircle, 0x0E33}},
   137 	{ 1, {0x0E33}, 0,					1, 2, {KUnicodeDottedCircle, 0x0E33}},
   138 	{ 3, {0x0E19, 0x0E49, 0x0E33}, 0,	3, 4, {0x0E19, 0x0E4D, 0x0E49, 0x0E32}},
   139 
   140 //5.TEST A9.1 - SARA AM exlcuded from cluster when vowel present
   141 	{ 3, {0x0E19, 0x0E35, 0x0E33}, 0,           2, 2, {0x0E19, 0x0E35}},
   142 	{ 3, {0x0E19, 0x0E39, 0x0E33}, 0,           2, 2, {0x0E19, 0x0E39}},
   143 	{ 4, {0x0E19, 0x0E35, 0x0E48, 0x0E33}, 0,   3, 3, {0x0E19, 0x0E35, 0x0E48}},
   144 
   145 //8.TEST B1 - Normal right aligned vowel/sign above short consonant
   146 	{ 2, {0x0E04, 0x0E35}, 0,			2, 2, {0x0E04, 0x0E35}},
   147 	{ 2, {0x0E01, 0x0E4D}, 0,			2, 2, {0x0E01, 0x0E4D}},
   148 
   149 //10.TEST B2 - Left aligned vowel/sign above tall consonant
   150 	{ 2, {0x0E1B, 0x0E34}, 0,			2, 2, {0x0E1B, 0xF701}},
   151 	{ 2, {0x0E1D, 0x0E35}, 0,			2, 2, {0x0E1D, 0xF702}},
   152 	{ 2, {0x0E1F, 0x0E36}, 0,			2, 2, {0x0E1F, 0xF703}},
   153 	{ 2, {0x0E2C, 0x0E37}, 0,			2, 2, {0x0E2C, 0xF704}},
   154 	{ 2, {0x0E1B, 0x0E31}, 0,			2, 2, {0x0E1B, 0xF710}},
   155 	{ 2, {0x0E1D, 0x0E4D}, 0,			2, 2, {0x0E1D, 0xF711}},
   156 	{ 2, {0x0E1F, 0x0E47}, 0,			2, 2, {0x0E1F, 0xF712}},
   157 	
   158 //17.TEST B3 - Normal right aligned vowel below short consonant
   159 	{ 2, {0x0E2C, 0x0E3A}, 0,			2, 2, {0x0E2C, 0x0E3A}},
   160 	{ 2, {0x0E0C, 0x0E38}, 0,			2, 2, {0x0E0C, 0x0E38}},
   161 
   162 //19.TEST B4 - Vowel below consonant with joint decender 
   163 	{ 2, {0x0E0E, 0x0E38}, 0,			2, 2, {0x0E0E, 0xF718}},
   164 	{ 2, {0x0E0F, 0x0E39}, 0,			2, 2, {0x0E0F, 0xF719}},
   165 	{ 2, {0x0E0F, 0x0E3A}, 0,			2, 2, {0x0E0F, 0xF71A}},
   166 	{ 2, {0x0E24, 0x0E38}, 0,			2, 2, {0x0E24, 0xF718}},
   167 	{ 2, {0x0E26, 0x0E39}, 0,			2, 2, {0x0E26, 0xF719}},
   168 
   169 //24.TEST B5 - Vowel below consonant with disjoint decender
   170 	{ 2, {0x0E10, 0x0E38}, 0,			2, 2, {0xF700, 0x0E38}},
   171 	{ 2, {0x0E0D, 0x0E39}, 0,			2, 2, {0xF70F, 0x0E39}},
   172 	{ 2, {0x0E10, 0x0E3A}, 0,			2, 2, {0xF700, 0x0E3A}},
   173  
   174 //27.TEST C1 - Tone mark/sign above short consonant
   175 	{ 2, {0x0E14, 0x0E48}, 0,			2, 2, {0x0E14, 0xF70A}},
   176 	{ 2, {0x0E16, 0x0E49}, 0,			2, 2, {0x0E16, 0xF70B}},
   177 	{ 2, {0x0E17, 0x0E4A}, 0,			2, 2, {0x0E17, 0xF70C}},
   178 	{ 2, {0x0E19, 0x0E4B}, 0,			2, 2, {0x0E19, 0xF70D}},
   179 	{ 2, {0x0E20, 0x0E4C}, 0,			2, 2, {0x0E20, 0xF70E}},
   180 	// with lower vowel char in between the two?
   181 	{ 3, {0x0E16, 0x0E39, 0x0E49}, 0,	3, 3, {0x0E16, 0x0E39, 0xF70B}},
   182 
   183 //33.TEST C2 - Upper Vowel & tone makr/sign above short consonant
   184 	{ 3, {0x0E01, 0x0E34, 0x0E48}, 0,	3, 3, {0x0E01, 0x0E34, 0x0E48}},
   185 	{ 3, {0x0E02, 0x0E35, 0x0E49}, 0,	3, 3, {0x0E02, 0x0E35, 0x0E49}},
   186 	{ 3, {0x0E04, 0x0E36, 0x0E4A}, 0,	3, 3, {0x0E04, 0x0E36, 0x0E4A}},
   187 	{ 3, {0x0E08, 0x0E37, 0x0E4B}, 0,	3, 3, {0x0E08, 0x0E37, 0x0E4B}},
   188 	{ 3, {0x0E09, 0x0E34, 0x0E4C}, 0,	3, 3, {0x0E09, 0x0E34, 0x0E4C}},
   189 	{ 3, {0x0E11, 0x0E47, 0x0E4C}, 0,	2, 2, {0x0E11, 0x0E47}},
   190 
   191 //39.TEST C2.1 - Lower Vowel & tone makr/sign above short consonant
   192 	{ 3, {0x0E01, 0x0E38, 0x0E48}, 0,	3, 3, {0x0E01, 0x0E38, 0xF70A}},
   193 	{ 3, {0x0E02, 0x0E39, 0x0E49}, 0,	3, 3, {0x0E02, 0x0E39, 0xF70B}},
   194 	{ 3, {0x0E04, 0x0E38, 0x0E4A}, 0,	3, 3, {0x0E04, 0x0E38, 0xF70C}},
   195 	{ 3, {0x0E08, 0x0E39, 0x0E4B}, 0,	3, 3, {0x0E08, 0x0E39, 0xF70D}},
   196 	{ 3, {0x0E09, 0x0E38, 0x0E4C}, 0,	3, 3, {0x0E09, 0x0E38, 0xF70E}},
   197 	{ 3, {0x0E09, 0x0E39, 0x0E4C}, 0,	2, 2, {0x0E09, 0x0E39}},
   198 
   199 //45.TEST C3 - Left aligned tone mark/sign above tall consonant
   200 	{ 2, {0x0E1B, 0x0E48}, 0,			2, 2, {0x0E1B, 0xF705}},
   201 	{ 2, {0x0E1D, 0x0E49}, 0,			2, 2, {0x0E1D, 0xF706}},
   202 	{ 2, {0x0E1F, 0x0E4A}, 0,			2, 2, {0x0E1F, 0xF707}},
   203 	{ 2, {0x0E2C, 0x0E4B}, 0,			2, 2, {0x0E2C, 0xF708}},
   204 	{ 2, {0x0E1B, 0x0E4C}, 0,			2, 2, {0x0E1B, 0xF709}},
   205 
   206 //50.TEST C4 - Left aligned vowel & tone mark/sign above tall consonant
   207 	{ 3, {0x0E1B, 0x0E34, 0x0E48}, 0,	3, 3, {0x0E1B, 0xF701, 0xF713}},
   208 	{ 3, {0x0E1D, 0x0E35, 0x0E49}, 0,	3, 3, {0x0E1D, 0xF702, 0xF714}},
   209 	{ 3, {0x0E1F, 0x0E36, 0x0E4A}, 0,	3, 3, {0x0E1F, 0xF703, 0xF715}},
   210 	{ 3, {0x0E2C, 0x0E37, 0x0E4B}, 0,	3, 3, {0x0E2C, 0xF704, 0xF716}},
   211 	{ 3, {0x0E1B, 0x0E34, 0x0E4C}, 0,	3, 3, {0x0E1B, 0xF701, 0xF717}},
   212 
   213 //55. INC043221 - Tone marks are not readable with tall consonants and Sara Am
   214 // Test that the nikhahit part of a sara am causes the same effects as top
   215 // vowels.
   216 // Test 4 already does one suitable test.
   217 	{ 3, {0x0E1B, 0x0E49, 0x0E33}, 0,	3, 4, {0x0E1B, 0xF711, 0xF714, 0x0E32}},
   218 
   219 //56. INC127996 - Tone mark/diacritic displayed incorrectly when combinded 
   220 //	with long tail consonanat and below vowel. Test that in context 
   221 //	'short consonanat + below vowel + Tone Mark/diacritic', mark/diacritic
   222 //	can be replaced by corresonding PUA code.
   223 	{ 3, {0x0E0D, 0x0E39, 0x0E49}, 0, 	3, 3, {0xF70F, 0x0E39, 0xF70B}},
   224 	{ 3, {0x0E0E, 0x0E38, 0x0E48}, 0,	3, 3, {0x0E0E, 0xF718, 0xF70A}},
   225 	{ 3, {0x0E0F, 0x0E39, 0x0E4A}, 0,	3, 3, {0x0E0F, 0xF719, 0xF70C}},
   226 	{ 3, {0x0E26, 0x0E39, 0x0E4B}, 0,	3, 3, {0x0E26, 0xF719, 0xF70D}},
   227 	{ 3, {0x0E24, 0x0E38, 0x0E49}, 0,	3, 3, {0x0E24, 0xF718, 0xF70B}},
   228 	{ 3, {0x0E10, 0x0E38, 0x0E4C}, 0,	3, 3, {0xF700, 0x0E38, 0xF70E}},
   229 
   230 //62.TABLE END
   231 	{ -1, {0}, -1,						-1, 0, {0}}
   232 	};
   233 
   234 /**
   235  Data structure used to hold the in and out data of two invokes
   236  of the CFont::GetCharacterPosition() API.
   237 */
   238 struct TTestInput_Invoke
   239 	{
   240 	TInt                iPosInText;
   241 	TInt				oPosInText;
   242 	TInt				oOutputLen;
   243 	TText16				oOutput[CFont::TPositionParam::EMaxOutputGlyphs];
   244 	};
   245 
   246 /**
   247  Data structure used to hold the in and out data of two invokes
   248  of the CFont::GetCharacterPosition() API.
   249 */
   250 struct TTestInput_PositionParam2
   251 	{
   252 	TInt				iTextLen;
   253 	TText16				iText[4];
   254 	TTestInput_Invoke   oOut[2];
   255 	};
   256 
   257 /**
   258  Data structure used to hold the in and out data of two invokes
   259  of the CFont::GetCharacterPosition() API.
   260 */
   261 struct TTestInput_PositionParam6
   262 	{
   263 	TInt				iTextLen;
   264 	TText16				iText[6];
   265 	TTestInput_Invoke   oOut[6];
   266 	};
   267 
   268 //	{-1, 1, 1, {0} } } indicate end of sequence
   269 //	The most significant bit of glyph index is trimmed off when stored
   270 LOCAL_D const TTestInput_PositionParam6 Indic_GurmukhiDigit[] = {
   271 		{ 1, {0x0a66}, { {0, 1, 1, {0x12fe} }, {-1, 1, 1, {0} } } },
   272 		{ 1, {0x0a67}, { {0, 1, 1, {0x12ff} }, {-1, 1, 1, {0} } } },
   273 		{ 1, {0x0a68}, { {0, 1, 1, {0x1300} }, {-1, 1, 1, {0} } } },
   274 		{ 1, {0x0a69}, { {0, 1, 1, {0x1301} }, {-1, 1, 1, {0} } } },
   275 		{ 1, {0x0a6a}, { {0, 1, 1, {0x1302} }, {-1, 1, 1, {0} } } },
   276 		{ 1, {0x0a6b}, { {0, 1, 1, {0x1303} }, {-1, 1, 1, {0} } } },
   277 		{ 1, {0x0a6c}, { {0, 1, 1, {0x1304} }, {-1, 1, 1, {0} } } },
   278 		{ 1, {0x0a6d}, { {0, 1, 1, {0x1305} }, {-1, 1, 1, {0} } } },
   279 		{ 1, {0x0a6e}, { {0, 1, 1, {0x1306} }, {-1, 1, 1, {0} } } },
   280 		{ 1, {0x0a6f}, { {0, 1, 1, {0x1307} }, {-1, 1, 1, {0} } } },
   281 		//	Consonant + digit
   282 		{ 2, {0x0a15, 0x0a66}, { {0, 1, 1, {0x12cd}}, {1, 2, 1, {0x12fe}}, {-1, 1, 1, {0} } } },
   283 		{ 2, {0x0a17, 0x0a67}, { {0, 1, 1, {0x12cf}}, {1, 2, 1, {0x12ff}}, {-1, 1, 1, {0} } } },
   284 		{ 2, {0x0a19, 0x0a68}, { {0, 1, 1, {0x12d1}}, {1, 2, 1, {0x1300}}, {-1, 1, 1, {0} } } },
   285 		{ 2, {0x0a25, 0x0a69}, { {0, 1, 1, {0x12dd}}, {1, 2, 1, {0x1301}}, {-1, 1, 1, {0} } } },
   286 		{ 2, {0x0a27, 0x0a6a}, { {0, 1, 1, {0x12df}}, {1, 2, 1, {0x1302}}, {-1, 1, 1, {0} } } },
   287 		{ 2, {0x0a28, 0x0a6b}, { {0, 1, 1, {0x12e0}}, {1, 2, 1, {0x1303}}, {-1, 1, 1, {0} } } },
   288 		{ 2, {0x0a29, 0x0a6c}, { {0, 1, 1, {0x0000}}, {1, 2, 1, {0x1304}}, {-1, 1, 1, {0} } } },
   289 		{ 2, {0x0a3a, 0x0a6d}, { {0, 1, 1, {0x0000}}, {1, 2, 1, {0x1305}}, {-1, 1, 1, {0} } } },
   290 		{ 2, {0x0a3b, 0x0a6e}, { {0, 1, 1, {0x0000}}, {1, 2, 1, {0x1306}}, {-1, 1, 1, {0} } } },
   291 		{ 2, {0x0a3c, 0x0a6f}, { {0, 1, 2, {0x058f, 0x12ee}}, {1, 2, 1, {0x1307}}, {-1, 1, 1, {0} } } },
   292 		//	Modifier + digit
   293 		{ 2, {0x0a3e, 0x0a66}, { {0, 1, 2, {0x058f, 0x12ef}}, {1, 2, 1, {0x12fe}}, {-1, 1, 1, {0} } } },
   294 		{ 2, {0x0a3e, 0x0a67}, { {0, 1, 2, {0x058f, 0x12ef}}, {1, 2, 1, {0x12ff}}, {-1, 1, 1, {0} } } },
   295 		{ 2, {0x0a3e, 0x0a68}, { {0, 1, 2, {0x058f, 0x12ef}}, {1, 2, 1, {0x1300}}, {-1, 1, 1, {0} } } },
   296 		{ 2, {0x0a3e, 0x0a69}, { {0, 1, 2, {0x058f, 0x12ef}}, {1, 2, 1, {0x1301}}, {-1, 1, 1, {0} } } },
   297 		{ 2, {0x0a3e, 0x0a6a}, { {0, 1, 2, {0x058f, 0x12ef}}, {1, 2, 1, {0x1302}}, {-1, 1, 1, {0} } } },
   298 		{ 2, {0x0a3e, 0x0a6b}, { {0, 1, 2, {0x058f, 0x12ef}}, {1, 2, 1, {0x1303}}, {-1, 1, 1, {0} } } },
   299 		{ 2, {0x0a3e, 0x0a6c}, { {0, 1, 2, {0x058f, 0x12ef}}, {1, 2, 1, {0x1304}}, {-1, 1, 1, {0} } } },
   300 		{ 2, {0x0a3e, 0x0a6d}, { {0, 1, 2, {0x058f, 0x12ef}}, {1, 2, 1, {0x1305}}, {-1, 1, 1, {0} } } },
   301 		{ 2, {0x0a3e, 0x0a6e}, { {0, 1, 2, {0x058f, 0x12ef}}, {1, 2, 1, {0x1306}}, {-1, 1, 1, {0} } } },
   302 		{ 2, {0x0a3e, 0x0a6f}, { {0, 1, 2, {0x058f, 0x12ef}}, {1, 2, 1, {0x1307}}, {-1, 1, 1, {0} } } },
   303 		//	Vowel + digit
   304 		{ 2, {0x0a73, 0x0a66}, { {0, 1, 1, {0x130b}}, {1, 2, 1, {0x12fe}}, {-1, 1, 1, {0} } } },
   305 		{ 2, {0x0a73, 0x0a67}, { {0, 1, 1, {0x130b}}, {1, 2, 1, {0x12ff}}, {-1, 1, 1, {0} } } },
   306 		{ 2, {0x0a73, 0x0a68}, { {0, 1, 1, {0x130b}}, {1, 2, 1, {0x1300}}, {-1, 1, 1, {0} } } },
   307 		{ 2, {0x0a73, 0x0a69}, { {0, 1, 1, {0x130b}}, {1, 2, 1, {0x1301}}, {-1, 1, 1, {0} } } },
   308 		{ 2, {0x0a73, 0x0a6a}, { {0, 1, 1, {0x130b}}, {1, 2, 1, {0x1302}}, {-1, 1, 1, {0} } } },
   309 		{ 2, {0x0a73, 0x0a6b}, { {0, 1, 1, {0x130b}}, {1, 2, 1, {0x1303}}, {-1, 1, 1, {0} } } },
   310 		{ 2, {0x0a73, 0x0a6c}, { {0, 1, 1, {0x130b}}, {1, 2, 1, {0x1304}}, {-1, 1, 1, {0} } } },
   311 		{ 2, {0x0a73, 0x0a6d}, { {0, 1, 1, {0x130b}}, {1, 2, 1, {0x1305}}, {-1, 1, 1, {0} } } },
   312 		{ 2, {0x0a73, 0x0a6e}, { {0, 1, 1, {0x130b}}, {1, 2, 1, {0x1306}}, {-1, 1, 1, {0} } } },
   313 		{ 2, {0x0a73, 0x0a6f}, { {0, 1, 1, {0x130b}}, {1, 2, 1, {0x1307}}, {-1, 1, 1, {0} } } },
   314 		//	Virama + digit
   315 		{ 2, {0x0a4d, 0x0a66}, { {0, 1, 2, {0x058f, 0x12f8}}, {1, 2, 1, {0x12fe}}, {-1, 1, 1, {0} } } },
   316 		{ 2, {0x0a4d, 0x0a67}, { {0, 1, 2, {0x058f, 0x12f8}}, {1, 2, 1, {0x12ff}}, {-1, 1, 1, {0} } } },
   317 		{ 2, {0x0a4d, 0x0a68}, { {0, 1, 2, {0x058f, 0x12f8}}, {1, 2, 1, {0x1300}}, {-1, 1, 1, {0} } } },
   318 		{ 2, {0x0a4d, 0x0a69}, { {0, 1, 2, {0x058f, 0x12f8}}, {1, 2, 1, {0x1301}}, {-1, 1, 1, {0} } } },
   319 		{ 2, {0x0a4d, 0x0a6a}, { {0, 1, 2, {0x058f, 0x12f8}}, {1, 2, 1, {0x1302}}, {-1, 1, 1, {0} } } },
   320 		{ 2, {0x0a4d, 0x0a6b}, { {0, 1, 2, {0x058f, 0x12f8}}, {1, 2, 1, {0x1303}}, {-1, 1, 1, {0} } } },
   321 		{ 2, {0x0a4d, 0x0a6c}, { {0, 1, 2, {0x058f, 0x12f8}}, {1, 2, 1, {0x1304}}, {-1, 1, 1, {0} } } },
   322 		{ 2, {0x0a4d, 0x0a6d}, { {0, 1, 2, {0x058f, 0x12f8}}, {1, 2, 1, {0x1305}}, {-1, 1, 1, {0} } } },
   323 		{ 2, {0x0a4d, 0x0a6e}, { {0, 1, 2, {0x058f, 0x12f8}}, {1, 2, 1, {0x1306}}, {-1, 1, 1, {0} } } },
   324 		{ 2, {0x0a4d, 0x0a6f}, { {0, 1, 2, {0x058f, 0x12f8}}, {1, 2, 1, {0x1307}}, {-1, 1, 1, {0} } } },
   325 		//	Consonant + digit + Matra
   326 		{ 3, {0x0a15, 0x0a66, 0x0a3e}, { {0, 1, 1, {0x12cd}}, {1, 2, 1, {0x12fe}}, {2, 3, 2, {0x058f, 0x12ef}}, {-1, 1, 1, {0} } } },
   327 		{ 3, {0x0a16, 0x0a67, 0x0a3e}, { {0, 1, 1, {0x12ce}}, {1, 2, 1, {0x12ff}}, {2, 3, 2, {0x058f, 0x12ef}}, {-1, 1, 1, {0} } } },
   328 		{ 3, {0x0a17, 0x0a68, 0x0a3e}, { {0, 1, 1, {0x12cf}}, {1, 2, 1, {0x1300}}, {2, 3, 2, {0x058f, 0x12ef}}, {-1, 1, 1, {0} } } },
   329 		{ 3, {0x0a18, 0x0a69, 0x0a3e}, { {0, 1, 1, {0x12d0}}, {1, 2, 1, {0x1301}}, {2, 3, 2, {0x058f, 0x12ef}}, {-1, 1, 1, {0} } } },
   330 		{ 3, {0x0a19, 0x0a6a, 0x0a3e}, { {0, 1, 1, {0x12d1}}, {1, 2, 1, {0x1302}}, {2, 3, 2, {0x058f, 0x12ef}}, {-1, 1, 1, {0} } } },
   331 		{ 3, {0x0a25, 0x0a6b, 0x0a3e}, { {0, 1, 1, {0x12dd}}, {1, 2, 1, {0x1303}}, {2, 3, 2, {0x058f, 0x12ef}}, {-1, 1, 1, {0} } } },
   332 		{ 3, {0x0a2a, 0x0a6c, 0x0a3e}, { {0, 1, 1, {0x12e1}}, {1, 2, 1, {0x1304}}, {2, 3, 2, {0x058f, 0x12ef}}, {-1, 1, 1, {0} } } },
   333 		{ 3, {0x0a2d, 0x0a6d, 0x0a3e}, { {0, 1, 1, {0x12e4}}, {1, 2, 1, {0x1305}}, {2, 3, 2, {0x058f, 0x12ef}}, {-1, 1, 1, {0} } } },
   334 		{ 3, {0x0a30, 0x0a6e, 0x0a3e}, { {0, 1, 1, {0x12e7}}, {1, 2, 1, {0x1306}}, {2, 3, 2, {0x058f, 0x12ef}}, {-1, 1, 1, {0} } } },
   335 		{ 3, {0x0a33, 0x0a6f, 0x0a3e}, { {0, 1, 1, {0x12e9}}, {1, 2, 1, {0x1307}}, {2, 3, 2, {0x058f, 0x12ef}}, {-1, 1, 1, {0} } } },
   336 		{ -1, {0}, -1,						-1, 0, {0}}
   337 };
   338 
   339 
   340 LOCAL_D const TTestInput_PositionParam6 Indic_MalayalamDigit[] = {
   341 		{ 1, {0x0d66}, { {0, 1, 1, {0x123e} }, {-1, 1, 1, {0} } }  },
   342 		{ 1, {0x0d67}, { {0, 1, 1, {0x123f} }, {-1, 1, 1, {0} }  } },
   343 		{ 1, {0x0d68}, { {0, 1, 1, {0x1240} }, {-1, 1, 1, {0} } } },
   344 		{ 1, {0x0d69}, { {0, 1, 1, {0x1241} }, {-1, 1, 1, {0} } } },
   345 		{ 1, {0x0d6a}, { {0, 1, 1, {0x1242} }, {-1, 1, 1, {0} } } },
   346 		{ 1, {0x0d6b}, { {0, 1, 1, {0x1243} }, {-1, 1, 1, {0} } } },
   347 		{ 1, {0x0d6c}, { {0, 1, 1, {0x1244} }, {-1, 1, 1, {0} } } },
   348 		{ 1, {0x0d6d}, { {0, 1, 1, {0x1245} }, {-1, 1, 1, {0} } } },
   349 		{ 1, {0x0d6e}, { {0, 1, 1, {0x1246} }, {-1, 1, 1, {0} } } },
   350 		{ 1, {0x0d6f}, { {0, 1, 1, {0x1247} }, {-1, 1, 1, {0} } } },
   351 		//	Consonant + digit
   352 		{ 2, {0x0d15, 0x0d66}, { {0, 1, 1, {0x120a}}, {1, 2, 1, {0x123e}}, {-1, 1, 1, {0} }  } },
   353 		{ 2, {0x0d15, 0x0d67}, { {0, 1, 1, {0x120a}}, {1, 2, 1, {0x123f}}, {-1, 1, 1, {0} }  } },
   354 		{ 2, {0x0d17, 0x0d68}, { {0, 1, 1, {0x120c}}, {1, 2, 1, {0x1240}}, {-1, 1, 1, {0} }  } },
   355 		{ 2, {0x0d19, 0x0d69}, { {0, 1, 1, {0x120e}}, {1, 2, 1, {0x1241}}, {-1, 1, 1, {0} }  } },
   356 		{ 2, {0x0d25, 0x0d6a}, { {0, 1, 1, {0x121a}}, {1, 2, 1, {0x1242}}, {-1, 1, 1, {0} }  } },
   357 		{ 2, {0x0d26, 0x0d6b}, { {0, 1, 1, {0x121b}}, {1, 2, 1, {0x1243}}, {-1, 1, 1, {0} }  } },
   358 		{ 2, {0x0d15, 0x0d6c}, { {0, 1, 1, {0x120a}}, {1, 2, 1, {0x1244}}, {-1, 1, 1, {0} }  } },
   359 		{ 2, {0x0d30, 0x0d6d}, { {0, 1, 1, {0x1224}}, {1, 2, 1, {0x1245}}, {-1, 1, 1, {0} }  } },
   360 		{ 2, {0x0d31, 0x0d6e}, { {0, 1, 1, {0x1225}}, {1, 2, 1, {0x1246}}, {-1, 1, 1, {0} }  } },
   361 		{ 2, {0x0d32, 0x0d6f}, { {0, 1, 1, {0x1226}}, {1, 2, 1, {0x1247}}, {-1, 1, 1, {0} }  } },
   362 		//	Modifier + digit
   363 		{ 2, {0x0d03, 0x0d66}, { {0, 1, 2, {0x058f, 0x11fb}}, {1, 2, 1, {0x123e}}, {-1, 1, 1, {0} }  } },
   364 		{ 2, {0x0d03, 0x0d67}, { {0, 1, 2, {0x058f, 0x11fb}}, {1, 2, 1, {0x123f}}, {-1, 1, 1, {0} }  } },
   365 		{ 2, {0x0d03, 0x0d68}, { {0, 1, 2, {0x058f, 0x11fb}}, {1, 2, 1, {0x1240}}, {-1, 1, 1, {0} }  } },
   366 		{ 2, {0x0d03, 0x0d69}, { {0, 1, 2, {0x058f, 0x11fb}}, {1, 2, 1, {0x1241}}, {-1, 1, 1, {0} }  } },
   367 		{ 2, {0x0d03, 0x0d6a}, { {0, 1, 2, {0x058f, 0x11fb}}, {1, 2, 1, {0x1242}}, {-1, 1, 1, {0} }  } },
   368 		{ 2, {0x0d02, 0x0d6b}, { {0, 1, 2, {0x058f, 0x11fa}}, {1, 2, 1, {0x1243}}, {-1, 1, 1, {0} }  } },
   369 		{ 2, {0x0d02, 0x0d6c}, { {0, 1, 2, {0x058f, 0x11fa}}, {1, 2, 1, {0x1244}}, {-1, 1, 1, {0} }  } },
   370 		{ 2, {0x0d02, 0x0d6d}, { {0, 1, 2, {0x058f, 0x11fa}}, {1, 2, 1, {0x1245}}, {-1, 1, 1, {0} }  } },
   371 		{ 2, {0x0d02, 0x0d6e}, { {0, 1, 2, {0x058f, 0x11fa}}, {1, 2, 1, {0x1246}}, {-1, 1, 1, {0} }  } },
   372 		{ 2, {0x0d02, 0x0d6f}, { {0, 1, 2, {0x058f, 0x11fa}}, {1, 2, 1, {0x1247}}, {-1, 1, 1, {0} }  } },
   373 		//	Vowel + digit
   374 		{ 2, {0x0d3e, 0x0d66}, { {0, 1, 2, {0x058f, 0x122e}}, {1, 2, 1, {0x123e}}, {-1, 1, 1, {0} }  } },
   375 		{ 2, {0x0d3f, 0x0d67}, { {0, 1, 2, {0x058f, 0x122f}}, {1, 2, 1, {0x123f}}, {-1, 1, 1, {0} }  } },
   376 		{ 2, {0x0d40, 0x0d68}, { {0, 1, 2, {0x058f, 0x1230}}, {1, 2, 1, {0x1240}}, {-1, 1, 1, {0} }  } },
   377 		{ 2, {0x0d41, 0x0d69}, { {0, 1, 2, {0x058f, 0x1231}}, {1, 2, 1, {0x1241}}, {-1, 1, 1, {0} }  } },
   378 		{ 2, {0x0d42, 0x0d6a}, { {0, 1, 2, {0x058f, 0x1232}}, {1, 2, 1, {0x1242}}, {-1, 1, 1, {0} }  } },
   379 		{ 2, {0x0d43, 0x0d6b}, { {0, 1, 2, {0x058f, 0x1233}}, {1, 2, 1, {0x1243}}, {-1, 1, 1, {0} }  } },
   380 		{ 2, {0x0d46, 0x0d6c}, { {0, 1, 2, {0x1234, 0x058f}}, {1, 2, 1, {0x1244}}, {-1, 1, 1, {0} }  } },
   381 		{ 2, {0x0d47, 0x0d6d}, { {0, 1, 2, {0x1235, 0x058f}}, {1, 2, 1, {0x1245}}, {-1, 1, 1, {0} }  } },
   382 		{ 2, {0x0d48, 0x0d6e}, { {0, 1, 2, {0x1236, 0x058f}}, {1, 2, 1, {0x1246}}, {-1, 1, 1, {0} }  } },
   383 		{ 2, {0x0d4c, 0x0d6f}, { {0, 1, 2, {0x058f, 0x123b}}, {1, 2, 1, {0x1247}}, {-1, 1, 1, {0} }  } },
   384 		//	Virama + digit
   385 		{ 2, {0x0d4d, 0x0d66}, { {0, 1, 2, {0x058f, 0x123a}}, {1, 2, 1, {0x123e}}, {-1, 1, 1, {0} }  } },
   386 		{ 2, {0x0d4d, 0x0d67}, { {0, 1, 2, {0x058f, 0x123a}}, {1, 2, 1, {0x123f}}, {-1, 1, 1, {0} }  } },
   387 		{ 2, {0x0d4d, 0x0d68}, { {0, 1, 2, {0x058f, 0x123a}}, {1, 2, 1, {0x1240}}, {-1, 1, 1, {0} }  } },
   388 		{ 2, {0x0d4d, 0x0d69}, { {0, 1, 2, {0x058f, 0x123a}}, {1, 2, 1, {0x1241}}, {-1, 1, 1, {0} }  } },
   389 		{ 2, {0x0d4d, 0x0d6a}, { {0, 1, 2, {0x058f, 0x123a}}, {1, 2, 1, {0x1242}}, {-1, 1, 1, {0} }  } },
   390 		{ 2, {0x0d4d, 0x0d6b}, { {0, 1, 2, {0x058f, 0x123a}}, {1, 2, 1, {0x1243}}, {-1, 1, 1, {0} }  } },
   391 		{ 2, {0x0d4d, 0x0d6c}, { {0, 1, 2, {0x058f, 0x123a}}, {1, 2, 1, {0x1244}}, {-1, 1, 1, {0} }  } },
   392 		{ 2, {0x0d4d, 0x0d6d}, { {0, 1, 2, {0x058f, 0x123a}}, {1, 2, 1, {0x1245}}, {-1, 1, 1, {0} }  } },
   393 		{ 2, {0x0d4d, 0x0d6e}, { {0, 1, 2, {0x058f, 0x123a}}, {1, 2, 1, {0x1246}}, {-1, 1, 1, {0} }  } },
   394 		{ 2, {0x0d4d, 0x0d6f}, { {0, 1, 2, {0x058f, 0x123a}}, {1, 2, 1, {0x1247}}, {-1, 1, 1, {0} }  } },
   395 		//	Consonant + digit + Matra
   396 		{ 3, {0x0d15, 0x0d66, 0x0d3e}, { {0, 1, 1, {0x120a}}, {1, 2, 1, {0x123e}}, {2, 3, 2, {0x058f, 0x122e}}, {-1, 1, 1, {0} }  } },
   397 		{ 3, {0x0d20, 0x0d67, 0x0d3f}, { {0, 1, 1, {0x1215}}, {1, 2, 1, {0x123f}}, {2, 3, 2, {0x058f, 0x122f}}, {-1, 1, 1, {0} }  } },
   398 		{ 3, {0x0d22, 0x0d68, 0x0d40}, { {0, 1, 1, {0x1217}}, {1, 2, 1, {0x1240}}, {2, 3, 2, {0x058f, 0x1230}}, {-1, 1, 1, {0} }  } },
   399 		{ 3, {0x0d27, 0x0d69, 0x0d41}, { {0, 1, 1, {0x121c}}, {1, 2, 1, {0x1241}}, {2, 3, 2, {0x058f, 0x1231}}, {-1, 1, 1, {0} }  } },
   400 		{ 3, {0x0d28, 0x0d6a, 0x0d42}, { {0, 1, 1, {0x121d}}, {1, 2, 1, {0x1242}}, {2, 3, 2, {0x058f, 0x1232}}, {-1, 1, 1, {0} }  } },
   401 		{ 3, {0x0d2A, 0x0d6b, 0x0d43}, { {0, 1, 1, {0x121e}}, {1, 2, 1, {0x1243}}, {2, 3, 2, {0x058f, 0x1233}}, {-1, 1, 1, {0} }  } },
   402 		{ 3, {0x0d2D, 0x0d6c, 0x0d46}, { {0, 1, 1, {0x1221}}, {1, 2, 1, {0x1244}}, {2, 3, 2, {0x1234, 0x058f}}, {-1, 1, 1, {0} }  } },
   403 		{ 3, {0x0d32, 0x0d6d, 0x0d47}, { {0, 1, 1, {0x1226}}, {1, 2, 1, {0x1245}}, {2, 3, 2, {0x1235, 0x058f}}, {-1, 1, 1, {0} }  } },
   404 		{ 3, {0x0d34, 0x0d6e, 0x0d48}, { {0, 1, 1, {0x1228}}, {1, 2, 1, {0x1246}}, {2, 3, 2, {0x1236, 0x058f}}, {-1, 1, 1, {0} }  } },
   405 		{ 3, {0x0d39, 0x0d6f, 0x0d4a}, { {0, 1, 1, {0x122d}}, {1, 2, 1, {0x1247}}, {2, 3, 3, {0x1234, 0x058f, 0x122e}}, {-1, 1, 1, {0} }  } },
   406 		{ -1, {0}, -1,						-1, 0, {0}}
   407 };
   408 
   409 LOCAL_D const TTestInput_PositionParam6 Indic_GurmukhiAndLatin[] = {
   410 		//	Gurmukhi sequence + Latin
   411 		{ 3, {0x0a05, 0x0a70, 0x0077}, { {0, 2, 2, {0x12c3, 0x1308}}, {1, 2, 1, {0x1308}}, {2, 3, 1, {0x0077}}, {-1, 1, 1, {0} } } },
   412 		//	Latin + Gurmukhi sequence
   413 		{ 3, {0x0063, 0x0a19, 0x0a48}, { {0, 1, 1, {0x0063}}, {1, 3, 2, {0x12d1, 0x12f5}}, {2, 3, 1, {0x12f5}}, {-1, 1, 1, {0} } } },
   414 		{ 3, {0x0064, 0x0a3f, 0x0a71}, { {0, 1, 1, {0x0064}}, {1, 2, 2, {0x12f0, 0x058f}}, {2, 3, 2, {0x058f, 0x1309}}, {-1, 1, 1, {0} } } },
   415 		{ 3, {0x0066, 0x0a69, 0x0a3e}, { {0, 1, 1, {0x0066}}, {1, 2, 1, {0x1301}}, {2, 3, 2, {0x058f, 0x12ef}}, {-1, 1, 1, {0} } } },
   416 		{ 3, {0x0068, 0x0a6a, 0x0a3e}, { {0, 1, 1, {0x0068}}, {1, 2, 1, {0x1302}}, {2, 3, 2, {0x058f, 0x12ef}}, {-1, 1, 1, {0} } } },
   417 		{ 3, {0x002e, 0x0a6b, 0x0a3e}, { {0, 1, 1, {0x0772}}, {1, 2, 1, {0x1303}}, {2, 3, 2, {0x058f, 0x12ef}}, {-1, 1, 1, {0} } } },
   418 		{ 3, {0x0074, 0x0a6c, 0x0a3e}, { {0, 1, 1, {0x0074}}, {1, 2, 1, {0x1304}}, {2, 3, 2, {0x058f, 0x12ef}}, {-1, 1, 1, {0} } } },
   419 		{ 3, {0x002c, 0x0a6d, 0x0a3e}, { {0, 1, 1, {0x0770}}, {1, 2, 1, {0x1305}}, {2, 3, 2, {0x058f, 0x12ef}}, {-1, 1, 1, {0} } } },
   420 		{ 3, {0x0078, 0x0a6e, 0x0a3e}, { {0, 1, 1, {0x0078}}, {1, 2, 1, {0x1306}}, {2, 3, 2, {0x058f, 0x12ef}}, {-1, 1, 1, {0} } } },
   421 		{ 3, {0x007a, 0x0a6f, 0x0a3e}, { {0, 1, 1, {0x007a}}, {1, 2, 1, {0x1307}}, {2, 3, 2, {0x058f, 0x12ef}}, {-1, 1, 1, {0} } } },
   422 		{ 3, {0x0a6f, 0x0a3e, 0x0078}, { {0, 1, 1, {0x1307}}, {1, 2, 2, {0x058f, 0x12ef}}, {2, 3, 1, {0x0078}}, {-1, 1, 1, {0} } } },
   423 		{ 3, {0x0a6f, 0x0a3e, 0x002e}, { {0, 1, 1, {0x1307}}, {1, 2, 2, {0x058f, 0x12ef}}, {2, 3, 1, {0x0772}}, {-1, 1, 1, {0} } } },
   424 		{ 3, {0x0a6f, 0x0a3e, 0x0066}, { {0, 1, 1, {0x1307}}, {1, 2, 2, {0x058f, 0x12ef}}, {2, 3, 1, {0x0066}}, {-1, 1, 1, {0} } } },
   425 		{ -1, {0}, -1,						-1, 0, {0}}
   426 };
   427 
   428 
   429 LOCAL_D const TTestInput_PositionParam6 Indic_MalayalamAndLatin[] = {
   430 		//	Malayalam sequence + Latin
   431 		//{ 3, {0x0d05, 0x0d70, 0x0077}, { {0, 1, 1, {0x11fc}}, {1, 2, 1, {0x0000}}, {2, 3, 1, {0x0077}}, {-1, 1, 1, {0} }  } },
   432 		//	Latin + Malayalam sequence
   433 		{ 3, {0x0063, 0x0d19, 0x0d48}, { {0, 1, 1, {0x0063}}, {1, 3, 2, {0x1236, 0x120e}}, {2, 3, 1, {0x1236}}, {-1, 1, 1, {0} }  } },
   434 		{ 3, {0x0066, 0x0d69, 0x0d3e}, { {0, 1, 1, {0x0066}}, {1, 2, 1, {0x1241}}, {2, 3, 2, {0x058f, 0x122e}}, {-1, 1, 1, {0} }  } },
   435 		{ 3, {0x0068, 0x0d6a, 0x0d3e}, { {0, 1, 1, {0x0068}}, {1, 2, 1, {0x1242}}, {2, 3, 2, {0x058f, 0x122e}}, {-1, 1, 1, {0} }  } },
   436 		{ 3, {0x002e, 0x0d6b, 0x0d3e}, { {0, 1, 1, {0x0c87}}, {1, 2, 1, {0x1243}}, {2, 3, 2, {0x058f, 0x122e}}, {-1, 1, 1, {0} }  } },
   437 		{ 3, {0x0074, 0x0d6c, 0x0d3e}, { {0, 1, 1, {0x0074}}, {1, 2, 1, {0x1244}}, {2, 3, 2, {0x058f, 0x122e}}, {-1, 1, 1, {0} }  } },
   438 		{ 3, {0x002c, 0x0d6d, 0x0d3e}, { {0, 1, 1, {0x0c85}}, {1, 2, 1, {0x1245}}, {2, 3, 2, {0x058f, 0x122e}}, {-1, 1, 1, {0} }  } },
   439 		{ 3, {0x0078, 0x0d6e, 0x0d3e}, { {0, 1, 1, {0x0078}}, {1, 2, 1, {0x1246}}, {2, 3, 2, {0x058f, 0x122e}}, {-1, 1, 1, {0} }  } },
   440 		{ 3, {0x007a, 0x0d6f, 0x0d3e}, { {0, 1, 1, {0x007a}}, {1, 2, 1, {0x1247}}, {2, 3, 2, {0x058f, 0x122e}}, {-1, 1, 1, {0} }  } },
   441 		{ -1, {0}, -1,						-1, 0, {0}}
   442 };
   443 
   444 
   445 LOCAL_D const TTestInput_PositionParam6 Indic_GurmukhiModifierAfterConsonantViramaZWJ[] = {
   446 		//	Consonant + Virama + ZWJ + Modifier
   447 		{ 4, {0x0a15, 0x0a4d, 0x200d, 0x0A01}, { {0, 4, 2, {0x1335, 0x12c0}}, {1, 2, 0, {0x0000}}, {2, 4, 1, {0x12c0}}, {3, 4, 1, {0x12c0}}, {-1, 1, 1, {0} } } },
   448 		{ 4, {0x0a16, 0x0a4d, 0x200d, 0x0A02}, { {0, 4, 2, {0x1336, 0x12c1}}, {1, 2, 0, {0x0000}}, {2, 4, 1, {0x12c1}}, {3, 4, 1, {0x12c1}}, {-1, 1, 1, {0} } } },
   449 		{ 4, {0x0a17, 0x0a4d, 0x200d, 0x0A03}, { {0, 4, 2, {0x1337, 0x12c2}}, {1, 2, 0, {0x0000}}, {2, 4, 1, {0x12c2}}, {3, 4, 1, {0x12c2}}, {-1, 1, 1, {0} } } },
   450 		{ 4, {0x0a18, 0x0a4d, 0x200d, 0x0A70}, { {0, 4, 2, {0x1338, 0x1308}}, {1, 2, 0, {0x0000}}, {2, 4, 1, {0x1308}}, {3, 4, 1, {0x1308}}, {-1, 1, 1, {0} } } },
   451 		{ -1, {0}, -1,						-1, 0, {0}}
   452 };
   453 
   454 
   455 LOCAL_D const TTestInput_PositionParam6 Indic_MalayalamModifierAfterConsonantViramaZWJ[] = {
   456 		//	Consonant + Virama + ZWJ + Modifier
   457 		{ 4, {0x0d15, 0x0d4d, 0x200d, 0x0d02}, { {0, 4, 2, {0x1248, 0x11fa}}, {1, 2, 0, {0x0000}}, {2, 4, 1, {0x11fa}}, {3, 4, 1, {0x11fa}}, {-1, 1, 1, {0} }  } },
   458 		{ 4, {0x0d25, 0x0d4d, 0x200d, 0x0d02}, { {0, 4, 2, {0x1258, 0x11fa}}, {1, 2, 0, {0x0000}}, {2, 4, 1, {0x11fa}}, {3, 4, 1, {0x11fa}}, {-1, 1, 1, {0} }  } },
   459 		{ 4, {0x0d33, 0x0d4d, 0x200d, 0x0d03}, { {0, 3, 1, {0x1275}}, {1, 2, 0, {0x0000}}, {2, 4, 1, {0x11fb}}, {3, 4, 1, {0x11fb}}, {-1, 1, 1, {0} }  } },
   460 		{ 4, {0x0d34, 0x0d4d, 0x200d, 0x0d03}, { {0, 4, 2, {0x1266, 0x11fb}}, {1, 2, 0, {0x0000}}, {2, 4, 1, {0x11fb}}, {3, 4, 1, {0x11fb}}, {-1, 1, 1, {0} }  } },
   461 		{ -1, {0}, -1,						-1, 0, {0}}
   462 };
   463 
   464 LOCAL_D const TTestInput_PositionParam6 Indic_GurmukhiConsonantLeading[] = {
   465 		//	Consonant + Nukta
   466 		{ 2, {0x0a17, 0x0A3C}, { {0, 2, 1, {0x12fa}}, {-1, 1, 1, {0} } } },
   467 		//	Consonant + dependent vowel, two sequences to check context shaping
   468 		{ 2, {0x0a15, 0x0A4C}, { {0, 2, 2, {0x12cd, 0x12f7}}, {1, 2, 1, {0x12f7}}, {-1, 1, 1, {0} } } },
   469 		{ 2, {0x0a16, 0x0A4C}, { {0, 2, 2, {0x12ce, 0x12f7}}, {1, 2, 1, {0x12f7}}, {-1, 1, 1, {0} } } },
   470 		//	Consonant + Matra /i/, and other Matras
   471 		{ 2, {0x0a16, 0x0A3f}, { {0, 2, 2, {0x12f0, 0x12ce}}, {1, 2, 1, {0x12f0}}, {-1, 1, 1, {0} } } },
   472 		{ 2, {0x0a16, 0x0A3e}, { {0, 2, 2, {0x12ce, 0x12ef}}, {1, 2, 1, {0x12ef}}, {-1, 1, 1, {0} } } },
   473 		{ 2, {0x0a16, 0x0A40}, { {0, 2, 2, {0x12ce, 0x12f1}}, {1, 2, 1, {0x12f1}}, {-1, 1, 1, {0} } } },
   474 		{ 2, {0x0a16, 0x0A41}, { {0, 2, 2, {0x12ce, 0x12f2}}, {1, 2, 1, {0x12f2}}, {-1, 1, 1, {0} } } },
   475 		{ 2, {0x0a16, 0x0A42}, { {0, 2, 2, {0x12ce, 0x12f3}}, {1, 2, 1, {0x12f3}}, {-1, 1, 1, {0} } } },
   476 		{ 2, {0x0a16, 0x0A43}, { {0, 1, 1, {0x12ce}}, {1, 2, 1, {0x0000}}, {-1, 1, 1, {0} } } },
   477 		{ 2, {0x0a16, 0x0A44}, { {0, 1, 1, {0x12ce}}, {1, 2, 1, {0x0000}}, {-1, 1, 1, {0} } } },
   478 		{ 2, {0x0a16, 0x0A45}, { {0, 1, 1, {0x12ce}}, {1, 2, 1, {0x0000}}, {-1, 1, 1, {0} } } },
   479 		{ 2, {0x0a16, 0x0A46}, { {0, 1, 1, {0x12ce}}, {1, 2, 1, {0x0000}}, {-1, 1, 1, {0} } } },
   480 		{ 2, {0x0a16, 0x0A47}, { {0, 2, 2, {0x12ce, 0x12f4}}, {1, 2, 1, {0x12f4}}, {-1, 1, 1, {0} } } },
   481 		{ 2, {0x0a16, 0x0A48}, { {0, 2, 2, {0x12ce, 0x12f5}}, {1, 2, 1, {0x12f5}}, {-1, 1, 1, {0} } } },
   482 		{ 2, {0x0a16, 0x0A49}, { {0, 1, 1, {0x12ce}}, {1, 2, 1, {0x0000}}, {-1, 1, 1, {0} } } },
   483 		{ 2, {0x0a16, 0x0A4a}, { {0, 1, 1, {0x12ce}}, {1, 2, 1, {0x0000}}, {-1, 1, 1, {0} } } },
   484 		{ 2, {0x0a16, 0x0A4b}, { {0, 2, 2, {0x12ce, 0x12f6}}, {1, 2, 1, {0x12f6}}, {-1, 1, 1, {0} } } },
   485 		{ 2, {0x0a16, 0x0A4c}, { {0, 2, 2, {0x12ce, 0x12f7}}, {1, 2, 1, {0x12f7}}, {-1, 1, 1, {0} } } },
   486 		//0d24 + 0d4d + 0d30
   487 		//0d28 + 0d4d + //0d24 + 0d4d + 0d30
   488 		//0d38 + 0d4d + //0d15 + 0d4d + 0d30
   489 		//	Consonant + Virama + HA(RA/VA/YA)
   490 		{ 3, {0x0a15, 0x0a4d, 0x0a39}, { {0, 3, 2, {0x12cd, 0x1331}}, {1, 2, 0, {0x0000}}, {2, 3, 1, {0x1331}}, {-1, 1, 1, {0} } } },
   491 		{ 3, {0x0a15, 0x0a4d, 0x0a30}, { {0, 3, 1, {0x13e7}}, {-1, 1, 1, {0} } } },
   492 		{ 3, {0x0a15, 0x0a4d, 0x0a35}, { {0, 3, 2, {0x1399, 0x1333}}, {1, 2, 0, {0x0000}}, {2, 3, 1, {0x1333}}, {-1, 1, 1, {0} } } },
   493 		{ 3, {0x0a15, 0x0a4d, 0x0a2f}, { {0, 3, 2, {0x12cd, 0x1373}}, {1, 2, 0, {0x0000}}, {2, 3, 1, {0x1373}}, {-1, 1, 1, {0} } } },
   494 		//	Consonant + Addak
   495 		{ 2, {0x0a16, 0x0A71}, { {0, 2, 2, {0x12ce, 0x1309}}, {1, 2, 1, {0x1309}}, {-1, 1, 1, {0} } } },
   496 		//	Consonant + bindi
   497 		{ 2, {0x0a16, 0x0A02}, { {0, 2, 2, {0x12ce, 0x12c1}}, {1, 2, 1, {0x12c1}}, {-1, 1, 1, {0} } } },
   498 		{ 3, {0x0a16, 0x0a40, 0x0A02}, { {0, 3, 2, {0x12ce, 0x13f0}}, {1, 2, 1, {0x13f0}}, {-1, 1, 1, {0} } } },
   499 		{ 3, {0x0a16, 0x0a4b, 0x0A02}, { {0, 3, 2, {0x12ce, 0x13f3}}, {1, 2, 1, {0x13f3}}, {-1, 1, 1, {0} } } },
   500 		//	Consonant + Tippi
   501 		{ 2, {0x0a25, 0x0A70}, { {0, 2, 2, {0x12dd, 0x1308}}, {1, 2, 1, {0x1308}}, {-1, 1, 1, {0} } } },
   502 		{ 3, {0x0a25, 0x0a3f, 0x0A70}, { {0, 3, 3, {0x12f0, 0x12dd, 0x1308}}, {1, 2, 1, {0x12f0}}, {2, 3, 1, {0x1308}}, {-1, 1, 1, {0} } } },
   503 		{ 3, {0x0a25, 0x0a41, 0x0A70}, { {0, 3, 3, {0x12dd, 0x12f2, 0x1308}}, {1, 2, 1, {0x12f2}}, {2, 3, 1, {0x1308}}, {-1, 1, 1, {0} } } },
   504 		//	Nukta, corresponding consonant, Nukta pair
   505 		{ 1, {0x0a33}, { {0, 1, 1, {0x12e9}}, {-1, 1, 1, {0} } } },
   506 		{ 2, {0x0a32, 0x0A3c}, { {0, 2, 1, {0x12e9}}, {-1, 1, 1, {0} } } },
   507 		{ 1, {0x0a36}, { {0, 1, 1, {0x12eb}},{-1, 1, 1, {0} } } },
   508 		{ 2, {0x0a38, 0x0A3c}, { {0, 2, 1, {0x12eb}}, {-1, 1, 1, {0} } } },
   509 		{ 1, {0x0a59}, { {0, 1, 1, {0x12f9}}, {-1, 1, 1, {0} } } },
   510 		{ 2, {0x0aa1, 0x0A3c}, { {0, 1, 1, {0x096e}}, {1, 2, 2, {0x058f, 0x12ee}}, {-1, 1, 1, {0} } } },
   511 		{ 1, {0x0a5a}, { {0, 1, 1, {0x12fa}}, {-1, 1, 1, {0} } } },
   512 		{ 2, {0x0a17, 0x0A3c}, { {0, 2, 1, {0x12fa}}, {-1, 1, 1, {0} } } },
   513 		{ 1, {0x0a5b}, { {0, 1, 1, {0x12fb}}, {-1, 1, 1, {0} } } },
   514 		{ 2, {0x0a1c, 0x0A3c}, { {0, 2, 1, {0x12fb}}, {-1, 1, 1, {0} } } },
   515 		{ 1, {0x0a5e}, { {0, 1, 1, {0x12fd}}, {-1, 1, 1, {0} } } },
   516 		{ 2, {0x0a2b, 0x0A3c}, { {0, 2, 1, {0x12fd}}, {-1, 1, 1, {0} } } },
   517 		{ -1, {0}, -1,						-1, 0, {0}}
   518 };
   519 
   520 
   521 
   522 LOCAL_D const TTestInput_PositionParam6 Indic_MalayalamConsonantLeading[] = {
   523 		//	Consonant, and its split representation
   524 		{ 2, {0x0d15, 0x0d14}, { {0, 1, 1, {0x120a}}, {1, 2, 1, {0x1209}}, {-1, 1, 1, {0} }  } },
   525 		{ 3, {0x0d15, 0x0d12, 0x0d57}, { {0, 1, 1, {0x120a}}, {1, 3, 3, {0x1207, 0x058f, 0x123b}}, {2, 3, 2, {0x058f, 0x123b}}, {-1, 1, 1, {0} }  } },
   526 		
   527 		{ 2, {0x0d15, 0x0d4a}, { {0, 2, 3, {0x1234, 0x120a, 0x122e}}, {1, 2, 2, {0x1234, 0x122e}}, {-1, 1, 1, {0} }  } },
   528 		{ 3, {0x0d15, 0x0d46, 0x0d3e}, { {0, 3, 3, {0x1234, 0x120a, 0x122e}}, {1, 2, 1, {0x1234}}, {2, 3, 1, {0x122e}}, {-1, 1, 1, {0} }  } },
   529 
   530 		{ 2, {0x0d17, 0x0d4b}, { {0, 2, 3, {0x1235, 0x120c, 0x122e}}, {1, 2, 2, {0x1235, 0x122e}}, {-1, 1, 1, {0} } } },
   531 		{ 3, {0x0d17, 0x0d47, 0x0d3e}, { {0, 3, 3, {0x1235, 0x120c, 0x122e}}, {1, 2, 1, {0x1235}}, {2, 3, 1, {0x122e}}, {-1, 1, 1, {0} }  } },
   532 
   533 		{ 2, {0x0d19, 0x0d4c}, { {0, 2, 2, {0x120e, 0x123b}}, {1, 2, 1, {0x123b}}, {-1, 1, 1, {0} } } },
   534 		{ 3, {0x0d19, 0x0d46, 0x0d57}, { {0, 3, 2, {0x120e, 0x123b}}, {1, 2, 0, {0x0000}}, {2, 3, 1, {0x123b}}, {-1, 1, 1, {0} }  } },
   535 
   536 		//	Consonant + dependent vowel, two sequences to check context shaping
   537 		{ 2, {0x0d15, 0x0d0a}, { {0, 1, 1, {0x120a}}, {1, 2, 1, {0x1201}}, {-1, 1, 1, {0} }  } },
   538 		{ 2, {0x0d16, 0x0d0a}, { {0, 1, 1, {0x120b}}, {1, 2, 1, {0x1201}}, {-1, 1, 1, {0} }  } },
   539 		
   540 		//	Consonant + Matra /-e/, /-ee/, /-ai/ 
   541 		{ 2, {0x0d16, 0x0d46}, { {0, 2, 2, {0x1234, 0x120b}}, {1, 2, 1, {0x1234}}, {-1, 1, 1, {0} }  } },
   542 		{ 2, {0x0d17, 0x0d47}, { {0, 2, 2, {0x1235, 0x120c}}, {1, 2, 1, {0x1235}}, {-1, 1, 1, {0} }  } },
   543 		{ 2, {0x0d18, 0x0d48}, { {0, 2, 2, {0x1236, 0x120d}}, {1, 2, 1, {0x1236}}, {-1, 1, 1, {0} }  } },
   544 		
   545 		//	Consonant and Matras /-o/, /-oo/, /-au/ to shaper
   546 		//	Consonant and 0x0d4c (first form of Matra /-au/ ) to shaper,
   547 		//	Consonant, 0x0d46 and 0x0d57 (second form of Matra /-au/) to shaper002E
   548 		{ 2, {0x0d16, 0x0d4A}, { {0, 2, 3, {0x1234, 0x120b, 0x122e}}, {1, 2, 2, {0x1234, 0x122e}}, {-1, 1, 1, {0} }  } },
   549 		{ 2, {0x0d17, 0x0d4B}, { {0, 2, 3, {0x1235, 0x120c, 0x122e}}, {1, 2, 2, {0x1235, 0x122e}}, {-1, 1, 1, {0} }  } },
   550 		{ 2, {0x0d18, 0x0d4C}, { {0, 2, 2, {0x120d, 0x123b}}, {1, 2, 1, {0x123b}}, {-1, 1, 1, {0} }  } },
   551 		{ 3, {0x0d15, 0x0d46, 0x0d57}, { {0, 3, 2, {0x120a, 0x123b}}, {1, 2, 0, {0x0000}}, {2, 3, 1, {0x123b}}, {-1, 1, 1, {0} }  } },
   552 		
   553 		//	Consonant + 0x0d4d + Consonant
   554 		{ 3, {0x0d15, 0x0d4d, 0x0d15}, { {0, 3, 1, {0x1277}}, {-1, 1, 1, {0} }  } },
   555 		{ 4, {0x0d31, 0x0d4d, 0x0d31, 0x0d4d}, { {0, 4, 2, {0x12a7, 0x123a}}, {1, 2, 0, {0x0000}}, {2, 4, 1, {0x123a}}, {3, 4, 1, {0x123a}}, {-1, 1, 1, {0} }  } },
   556 		
   557 		//	Consonant (NNA, NA, RA, LA, LLA) + Virama + ZWJ to shaper
   558 		//	KA + Virama + ZWJ to shaper.
   559 		// 	other Consonant + Virama + ZWJ to shaper.
   560 		{ 3, {0x0d23, 0x0d4d, 0x200d}, { {0, 3, 1, {0x1272}}, {-1, 1, 1, {0} }  } },
   561 		{ 3, {0x0d28, 0x0d4d, 0x200d}, { {0, 3, 1, {0x1273}}, {-1, 1, 1, {0} }  } },
   562 		{ 3, {0x0d32, 0x0d4d, 0x200d}, { {0, 3, 1, {0x1276}}, {-1, 1, 1, {0} }  } },
   563 		{ 3, {0x0d33, 0x0d4d, 0x200d}, { {0, 3, 1, {0x1275}}, {-1, 1, 1, {0} }  } },
   564 		{ 3, {0x0d15, 0x0d4d, 0x200d}, { {0, 3, 1, {0x1248}}, {-1, 1, 1, {0} }  } },
   565 		{ 3, {0x0d16, 0x0d4d, 0x200d}, { {0, 3, 1, {0x1249}}, {-1, 1, 1, {0} }  } },
   566 		
   567 		//	RA + Virama + ZWJ to shaper,
   568 		//	RRA + Viram + ZWJ to shaper.
   569 		{ 3, {0x0d30, 0x0d4d, 0x200d}, { {0, 3, 1, {0x1274}}, {-1, 1, 1, {0} }  } },
   570 		{ 3, {0x0d31, 0x0d4d, 0x200d}, { {0, 3, 1, {0x1263}}, {-1, 1, 1, {0} }  } },
   571 		
   572 		//	Chillu and Modifier to shaper
   573 		//	Chillu and Virama to shaper
   574 		{ 4, {0x0d31, 0x0d4d, 0x200d, 0x0d05}, { {0, 3, 1, {0x1263}}, {1, 2, 0, {0x0000}}, {2, 3, 0, {0x0000}}, {3, 4, 1, {0x11fc}}, {-1, 1, 1, {0} } } },
   575 		{ 4, {0x0d15, 0x0d4d, 0x200d, 0x0d14}, { {0, 3, 1, {0x1248}}, {1, 2, 0, {0x0000}}, {2, 3, 0, {0x0000}}, {3, 4, 1, {0x1209}}, {-1, 1, 1, {0} } } },
   576 		{ 4, {0x0d31, 0x0d4d, 0x200d, 0x0d4d}, { {0, 3, 1, {0x1263}}, {1, 2, 0, {0x0000}}, {2, 4, 2, {0x058f, 0x123a}}, {3, 4, 2, {0x058f, 0x123a}}, {-1, 1, 1, {0} } } },
   577 		{ 4, {0x0d15, 0x0d4d, 0x200d, 0x0d4d}, { {0, 3, 1, {0x1248}}, {1, 2, 0, {0x0000}}, {2, 4, 2, {0x058f, 0x123a}}, {3, 4, 2, {0x058f, 0x123a}}, {-1, 1, 1, {0} } } },
   578 
   579 		//	AAR
   580 		{ 3, {0x0d06, 0x0d4d, 0x200d}, { {0, 1, 1, {0x11fd}}, {1, 2, 2, {0x058f, 0x123a}}, {-1, 1, 1, {0} }  } },
   581 		{ 2, {0x0d06, 0x0d4d}, { {0, 1, 1, {0x11fd}}, {1, 2, 2, {0x058f, 0x123a}}, {-1, 1, 1, {0} }  } },
   582 
   583 		//	K.KA, K.TA, K.SSA, G.NA, G.MA, 
   584 		//	NG.KA, NG.NGA, J.JA, J.NYA, NY.NYA, TT.TTA, NN.MA, T.BHA, T.MA, 
   585 		//	T.SA, D.DA, D.DHA, 
   586 		//	N.TA, N.DA, N.DHA, N.NA, 
   587 		//	M.PA, M.MA, 
   588 		//	SH.CA, S.THA, 
   589 		//	H.NA, H.MA and LL.LLA
   590 		{ 3, {0x0d15, 0x0d4d, 0x0d15}, { {0, 3, 1, {0x1277}}, {-1, 1, 1, {0} } } },
   591 		{ 3, {0x0d15, 0x0d4d, 0x0d24}, { {0, 3, 1, {0x1278}}, {-1, 1, 1, {0} } } },
   592 		{ 3, {0x0d15, 0x0d4d, 0x0d37}, { {0, 3, 1, {0x127b}}, {-1, 1, 1, {0} } } },
   593 		{ 3, {0x0d17, 0x0d4d, 0x0d28}, { {0, 3, 1, {0x127e}}, {-1, 1, 1, {0} } } },
   594 		{ 3, {0x0d17, 0x0d4d, 0x0d2e}, { {0, 3, 1, {0x127d}}, {-1, 1, 1, {0} } } },
   595 		{ 3, {0x0d19, 0x0d4d, 0x0d15}, { {0, 3, 1, {0x1280}}, {-1, 1, 1, {0} } } },
   596 		{ 3, {0x0d19, 0x0d4d, 0x0d19}, { {0, 3, 1, {0x1281}}, {-1, 1, 1, {0} } } },
   597 		{ 3, {0x0d1c, 0x0d4d, 0x0d1c}, { {0, 3, 1, {0x1284}}, {-1, 1, 1, {0} } } },
   598 		{ 3, {0x0d1c, 0x0d4d, 0x0d1e}, { {0, 3, 1, {0x1285}}, {-1, 1, 1, {0} } } },
   599 		{ 3, {0x0d1f, 0x0d4d, 0x0d1f}, { {0, 3, 1, {0x1288}}, {-1, 1, 1, {0} } } },
   600 		{ 3, {0x0d23, 0x0d4d, 0x0d2e}, { {0, 3, 1, {0x128b}}, {-1, 1, 1, {0} } } },
   601 		{ 3, {0x0d24, 0x0d4d, 0x0d2d}, { {0, 3, 1, {0x128e}}, {-1, 1, 1, {0} } } },
   602 		{ 3, {0x0d24, 0x0d4d, 0x0d2e}, { {0, 3, 1, {0x128f}}, {-1, 1, 1, {0} } } },
   603 		{ 3, {0x0d24, 0x0d4d, 0x0d38}, { {0, 3, 1, {0x1290}}, {-1, 1, 1, {0} } } },
   604 		{ 3, {0x0d26, 0x0d4d, 0x0d26}, { {0, 3, 1, {0x1293}}, {-1, 1, 1, {0} } } },
   605 		{ 3, {0x0d26, 0x0d4d, 0x0d27}, { {0, 3, 1, {0x1294}}, {-1, 1, 1, {0} } } },
   606 		{ 3, {0x0d28, 0x0d4d, 0x0d24}, { {0, 3, 1, {0x129a}}, {-1, 1, 1, {0} } } },
   607 		{ 3, {0x0d28, 0x0d4d, 0x0d26}, { {0, 3, 1, {0x1295}}, {-1, 1, 1, {0} } } },
   608 		{ 3, {0x0d28, 0x0d4d, 0x0d27}, { {0, 3, 1, {0x1296}}, {-1, 1, 1, {0} } } },
   609 		{ 3, {0x0d28, 0x0d4d, 0x0d28}, { {0, 3, 1, {0x1297}}, {-1, 1, 1, {0} } } },
   610 		{ 3, {0x0d2e, 0x0d4d, 0x0d2a}, { {0, 3, 1, {0x12a4}}, {-1, 1, 1, {0} } } },
   611 		{ 3, {0x0d2e, 0x0d4d, 0x0d2e}, { {0, 3, 1, {0x12a3}}, {-1, 1, 1, {0} } } },
   612 		{ 3, {0x0d36, 0x0d4d, 0x0d1a}, { {0, 3, 1, {0x12ab}}, {-1, 1, 1, {0} } } },
   613 		{ 3, {0x0d38, 0x0d4d, 0x0d25}, { {0, 3, 1, {0x12b1}}, {-1, 1, 1, {0} } } },
   614 		{ 3, {0x0d39, 0x0d4d, 0x0d28}, { {0, 3, 1, {0x12b4}}, {-1, 1, 1, {0} } } },
   615 		{ 3, {0x0d39, 0x0d4d, 0x0d2e}, { {0, 3, 1, {0x12b3}}, {-1, 1, 1, {0} } } },
   616 		{ 3, {0x0d33, 0x0d4d, 0x0d23}, { {0, 3, 2, {0x1265, 0x1218}}, {1, 2, 0, {0x0000}}, {2, 3, 1, {0x1218}}, {-1, 1, 1, {0} } } },
   617 		
   618 		//	One of (KA, GA, PA, BA, MA, LA, SHA, SA, HA), Virama and LA to shaper
   619 		{ 3, {0x0d15, 0x0d4d, 0x0d32}, { {0, 3, 1, {0x127a}}, {-1, 1, 1, {0} } } },
   620 		{ 3, {0x0d17, 0x0d4d, 0x0d32}, { {0, 3, 1, {0x127f}}, {-1, 1, 1, {0} } } },
   621 		{ 3, {0x0d2a, 0x0d4d, 0x0d32}, { {0, 3, 1, {0x129d}}, {-1, 1, 1, {0} } } },
   622 		{ 3, {0x0d2c, 0x0d4d, 0x0d32}, { {0, 3, 1, {0x12a2}}, {-1, 1, 1, {0} } } },
   623 		{ 3, {0x0d2e, 0x0d4d, 0x0d32}, { {0, 3, 1, {0x12a5}}, {-1, 1, 1, {0} } } },
   624 		{ 3, {0x0d32, 0x0d4d, 0x0d32}, { {0, 3, 1, {0x12a8}}, {-1, 1, 1, {0} } } },
   625 		{ 3, {0x0d36, 0x0d4d, 0x0d32}, { {0, 3, 1, {0x12ad}}, {-1, 1, 1, {0} } } },
   626 		{ 3, {0x0d38, 0x0d4d, 0x0d32}, { {0, 3, 1, {0x12b2}}, {-1, 1, 1, {0} } } },
   627 		{ 3, {0x0d39, 0x0d4d, 0x0d32}, { {0, 3, 1, {0x12b5}}, {-1, 1, 1, {0} } } },
   628 		
   629 		//	CA, Virama and CA to shaper
   630 		//	BA, Virama and BA to shaper
   631 		//	YA, Virama and YA to shaper
   632 		//	VA, Virama and VA to shaper
   633 		//	other Consonant, Virama and the same Consonant to shaper.
   634 		{ 3, {0x0d1a, 0x0d4d, 0x0d1a}, { {0, 3, 1, {0x1282}}, {-1, 1, 1, {0} } } },
   635 		{ 3, {0x0d2c, 0x0d4d, 0x0d2c}, { {0, 3, 1, {0x129f}}, {-1, 1, 1, {0} } } },
   636 		{ 3, {0x0d2f, 0x0d4d, 0x0d2f}, { {0, 3, 1, {0x12a6}}, {-1, 1, 1, {0} } } },
   637 		{ 3, {0x0d35, 0x0d4d, 0x0d35}, { {0, 3, 1, {0x12aa}}, {-1, 1, 1, {0} } } },
   638 		{ 3, {0x0d15, 0x0d4d, 0x0d15}, { {0, 3, 1, {0x1277}}, {-1, 1, 1, {0} } } },
   639 
   640 		//	G.GA, C.CHA, K.TTA, SS.TTA, DD.DDA, NN.NNA, B.DA, B.DHA, P.PA, RR.RRA, SH.SHA, S.SA clusters to shaper
   641 		{ 3, {0x0d17, 0x0d4d, 0x0d17}, { {0, 3, 1, {0x127c}}, {-1, 1, 1, {0} } } },
   642 		{ 3, {0x0d2c, 0x0d4d, 0x0d26}, { {0, 3, 1, {0x12a0}}, {-1, 1, 1, {0} } } },
   643 		{ 3, {0x0d1a, 0x0d4d, 0x0d1b}, { {0, 3, 1, {0x1283}}, {-1, 1, 1, {0} } } },
   644 		{ 3, {0x0d2c, 0x0d4d, 0x0d27}, { {0, 3, 1, {0x12a1}}, {-1, 1, 1, {0} } } },
   645 		{ 3, {0x0d15, 0x0d4d, 0x0d1f}, { {0, 3, 1, {0x1279}}, {-1, 1, 1, {0} } } },
   646 		{ 3, {0x0d2a, 0x0d4d, 0x0d2a}, { {0, 3, 1, {0x129c}}, {-1, 1, 1, {0} } } },
   647 		{ 3, {0x0d37, 0x0d4d, 0x0d1f}, { {0, 3, 1, {0x12ae}}, {-1, 1, 1, {0} } } },
   648 		{ 3, {0x0d31, 0x0d4d, 0x0d31}, { {0, 3, 1, {0x12a7}}, {-1, 1, 1, {0} } } },
   649 		{ 3, {0x0d21, 0x0d4d, 0x0d21}, { {0, 3, 1, {0x1289}}, {-1, 1, 1, {0} } } },
   650 		{ 3, {0x0d36, 0x0d4d, 0x0d36}, { {0, 3, 1, {0x12ac}}, {-1, 1, 1, {0} } } },
   651 		{ 3, {0x0d23, 0x0d4d, 0x0d23}, { {0, 3, 1, {0x128c}}, {-1, 1, 1, {0} } } },
   652 		{ 3, {0x0d38, 0x0d4d, 0x0d38}, { {0, 3, 1, {0x12b0}}, {-1, 1, 1, {0} } } },
   653 		
   654 		
   655 		//	Consonant clusters from REQ1.3.11 to shaper.
   656 		//	Already covered in other sequence
   657 		//	S.RR.RRA to shaper,
   658 		//	N.RR.RRA to shaper
   659 		{ 5, {0x0d38, 0x0d4d, 0x0d31, 0x0d4d, 0x0d31}, { {0, 5, 1, {0x12af}}, {-1, 1, 1, {0} } } },
   660 		{ 4, {0x0d28, 0x0d4d, 0x0d31, 0x0d31}, { {0, 3, 2, {0x125b, 0x1225}}, {1, 2, 0, {0x0000}}, {2, 3, 1, {0x1225}}, {3, 4, 1, {0x1225}}, {-1, 1, 1, {0} } } },
   661 		
   662 		//	N.RRA
   663 		{ 4, {0x0d28, 0x0d4d, 0x200d, 0x0d31}, { {0, 4, 1, {0x1299}}, {-1, 1, 1, {0} } } },
   664 		
   665 		//	NA, Virama, ZWJ, RRA to shaper
   666 		//	NA, Virama, ZWJ, ZWNJ, RRA to shaper
   667 		{ 4, {0x0d28, 0x0d4d, 0x200d, 0x0d31}, { {0, 4, 1, {0x1299}}, {-1, 1, 1, {0} } } },
   668 		{ 5, {0x0d28, 0x0d4d, 0x200d, 0x200c, 0x0d31}, { {0, 3, 1, {0x1273}}, {1, 2, 0, {0x0000}}, {2, 3, 0, {0x0000}}, {3, 4, 0, {0x0000}}, {4, 5, 1, {0x1225}}, {-1, 1, 1, {0} } } },
   669 		
   670 		//	Consonant cluster and YA to shaper
   671 		//	Consonant cluster and VA to shaper
   672 		{ 4, {0x0d15, 0x0d4d, 0x0d30, 0x0d3f}, { {0, 4, 3, {0x1271, 0x120a, 0x122f}}, {1, 2, 0, {0x0000}}, {2, 4, 2, {0x1271, 0x122f}}, {3, 4, 1, {0x122f}}, {-1, 1, 1, {0} } } },
   673 		{ 4, {0x0d15, 0x0d4d, 0x0d30, 0x0d35}, { {0, 3, 2, {0x1271, 0x120a}}, {1, 2, 0, {0x0000}}, {2, 3, 1, {0x1271}}, {3, 4, 1, {0x1229}}, {-1, 1, 1, {0} } } },
   674 		
   675 		//	YA, YAKAR to shaper
   676 		//	VA, VAKAR to shaper
   677 		{ 3, {0x0d15, 0x0d4d, 0x0d2f}, { {0, 3, 2, {0x120a, 0x126f}}, {1, 2, 0, {0x0000}}, {2, 3, 1, {0x126f}}, {-1, 1, 1, {0} } } },
   678 		{ 3, {0x0d15, 0x0d4d, 0x0d35}, { {0, 3, 2, {0x120a, 0x1270}}, {1, 2, 0, {0x0000}}, {2, 3, 1, {0x1270}}, {-1, 1, 1, {0} } } },
   679 		{ 5, {0x0d15, 0x0d4d, 0x0d30, 0x0d4d, 0x0d2f}, { {0, 5, 3, {0x1271, 0x120a, 0x126f}}, {1, 2, 0, {0x0000}}, {2, 5, 2, {0x1271, 0x126f}}, {3, 4, 0, {0x0000}}, {4, 5, 1, {0x126f}}, {-1, 1, 1, {0} } } },
   680 		{ 5, {0x0d15, 0x0d4d, 0x0d30, 0x0d4d, 0x0d35}, { {0, 5, 3, {0x1271, 0x120a, 0x1270}}, {1, 2, 0, {0x0000}}, {2, 5, 2, {0x1271, 0x1270}}, {3, 4, 0, {0x0000}}, {4, 5, 1, {0x1270}}, {-1, 1, 1, {0} } } },
   681 		{ 5, {0x0d15, 0x0d4d, 0x0d2f, 0x0d4d, 0x0d30}, { {0, 5, 3, {0x1248, 0x1271, 0x1223}}, {1, 2, 0, {0x0000}}, {2, 5, 2, {0x1271, 0x1223}}, {3, 4, 0, {0x0000}}, {4, 5, 1, {0x1271}}, {-1, 1, 1, {0} } } },
   682 		{ 5, {0x0d15, 0x0d4d, 0x0d35, 0x0d4d, 0x0d30}, { {0, 5, 3, {0x1248, 0x1271, 0x1229}}, {1, 2, 0, {0x0000}}, {2, 5, 2, {0x1271, 0x1229}}, {3, 4, 0, {0x0000}}, {4, 5, 1, {0x1271}}, {-1, 1, 1, {0} } } },
   683 
   684 		//	one of (LLA, LLLA, RRA) and YA to shaper
   685 		//	one of (LLA, LLLA, RRA) and VA to shaper
   686 		{ 2, {0x0d33, 0x0d2f}, { {0, 1, 1, {0x1227}}, {1, 2, 1, {0x1223}}, {-1, 1, 1, {0} } } },
   687 		{ 2, {0x0d34, 0x0d2f}, { {0, 1, 1, {0x1228}}, {1, 2, 1, {0x1223}}, {-1, 1, 1, {0} } } },
   688 		{ 2, {0x0d31, 0x0d2f}, { {0, 1, 1, {0x1225}}, {1, 2, 1, {0x1223}}, {-1, 1, 1, {0} } } },
   689 		{ 2, {0x0d33, 0x0d35}, { {0, 1, 1, {0x1227}}, {1, 2, 1, {0x1229}}, {-1, 1, 1, {0} } } },
   690 		{ 2, {0x0d34, 0x0d35}, { {0, 1, 1, {0x1228}}, {1, 2, 1, {0x1229}}, {-1, 1, 1, {0} } } },
   691 		{ 2, {0x0d31, 0x0d35}, { {0, 1, 1, {0x1225}}, {1, 2, 1, {0x1229}}, {-1, 1, 1, {0} } } },
   692 		//	KSSA
   693 		//0d15, 0d4d, 0d37
   694 		//	Consonant cluster and RA to shaper
   695 		{ 4, {0x0d15, 0x0d4d, 0x0d30, 0x0d30}, { {0, 3, 2, {0x1271, 0x120a}}, {1, 2, 0, {0x0000}}, {2, 3, 1, {0x1271}}, {3, 4, 1, {0x1224}}, {-1, 1, 1, {0} } } },
   696 
   697 		//	one of (LLA, LLLA, RRA) and RA to shaper
   698 		{ 2, {0x0d33, 0x0d30}, { {0, 1, 1, {0x1227}}, {1, 2, 1, {0x1224}}, {-1, 1, 1, {0} } } },
   699 		{ 2, {0x0d34, 0x0d30}, { {0, 1, 1, {0x1228}}, {1, 2, 1, {0x1224}}, {-1, 1, 1, {0} } } },
   700 		{ 2, {0x0d31, 0x0d30}, { {0, 1, 1, {0x1225}}, {1, 2, 1, {0x1224}}, {-1, 1, 1, {0} } } },
   701 		
   702 		//	YAKAR/VAKAR and RA to shaper.
   703 		{ 4, {0x0d15, 0x0d4d, 0x0d2f, 0x0d30}, { {0, 3, 2, {0x120a, 0x126f}}, {1, 2, 0, {0x0000}}, {2, 3, 1, {0x126f}}, {3, 4, 1, {0x1224}}, {-1, 1, 1, {0} } } },
   704 		{ 4, {0x0d15, 0x0d4d, 0x0d35, 0x0d30}, { {0, 3, 2, {0x120a, 0x1270}}, {1, 2, 0, {0x0000}}, {2, 3, 1, {0x1270}}, {3, 4, 1, {0x1224}}, {-1, 1, 1, {0} } } },
   705 
   706 		//	Chillu
   707 		//	Chillu and Vowel to shaper
   708 		//	Chillu and Consonant to shaper
   709 		//	Chillu and Modifier to shaper
   710 		//	Chillu and Virama to shaper
   711 		{ 4, {0x0d06, 0x0d23, 0x0d4d, 0x200d}, { {0, 1, 1, {0x11fd}}, {1, 4, 1, {0x1272}}, {2, 3, 0, {0x058f, 0x123a}}, {3, 4, 0, {0x0d30}}, {-1, 1, 1, {0} } } },
   712 		{ 4, {0x0d06, 0x0d28, 0x0d4d, 0x200d}, { {0, 1, 1, {0x11fd}}, {1, 4, 1, {0x1273}}, {2, 3, 0, {0x058f, 0x123a}}, {3, 4, 0, {0x0d30}}, {-1, 1, 1, {0} } } },
   713 		{ 4, {0x0d06, 0x0d30, 0x0d4d, 0x200d}, { {0, 1, 1, {0x11fd}}, {1, 4, 1, {0x1274}}, {2, 3, 0, {0x058f, 0x123a}}, {3, 4, 0, {0x0d30}}, {-1, 1, 1, {0} } } },
   714 		{ 4, {0x0d06, 0x0d32, 0x0d4d, 0x200d}, { {0, 1, 1, {0x11fd}}, {1, 4, 1, {0x1276}}, {2, 3, 0, {0x058f, 0x123a}}, {3, 4, 0, {0x0d30}}, {-1, 1, 1, {0} } } },
   715 		{ 4, {0x0d06, 0x0d33, 0x0d4d, 0x200d}, { {0, 1, 1, {0x11fd}}, {1, 4, 1, {0x1275}}, {2, 3, 0, {0x058f, 0x123a}}, {3, 4, 0, {0x0d30}}, {-1, 1, 1, {0} } } },
   716 
   717 		{ 4, {0x0d23, 0x0d4d, 0x200d, 0x0d06}, { {0, 3, 1, {0x1272}}, {1, 2, 0, {0x0000}}, {2, 3, 0, {0x0000}}, {3, 4, 1, {0x11fd}}, {-1, 1, 1, {0} } } },
   718 		{ 4, {0x0d28, 0x0d4d, 0x200d, 0x0d09}, { {0, 3, 1, {0x1273}}, {1, 2, 0, {0x0000}}, {2, 3, 0, {0x0000}}, {3, 4, 1, {0x1200}}, {-1, 1, 1, {0} } } },
   719 		{ 4, {0x0d30, 0x0d4d, 0x200d, 0x0d0a}, { {0, 3, 1, {0x1274}}, {1, 2, 0, {0x0000}}, {2, 3, 0, {0x0000}}, {3, 4, 1, {0x1201}}, {-1, 1, 1, {0} } } },
   720 		{ 4, {0x0d32, 0x0d4d, 0x200d, 0x0d0f}, { {0, 3, 1, {0x1276}}, {1, 2, 0, {0x0000}}, {2, 3, 0, {0x0000}}, {3, 4, 1, {0x1205}}, {-1, 1, 1, {0} } } },
   721 		{ 4, {0x0d33, 0x0d4d, 0x200d, 0x0d13}, { {0, 3, 1, {0x1275}}, {1, 2, 0, {0x0000}}, {2, 3, 0, {0x0000}}, {3, 4, 1, {0x1208}}, {-1, 1, 1, {0} } } },
   722 
   723 		{ 4, {0x0d23, 0x0d4d, 0x200d, 0x0d16}, { {0, 3, 1, {0x1272}}, {1, 2, 0, {0x0000}}, {2, 3, 0, {0x0000}}, {3, 4, 1, {0x120b}}, {-1, 1, 1, {0} } } },
   724 		{ 4, {0x0d28, 0x0d4d, 0x200d, 0x0d19}, { {0, 3, 1, {0x1273}}, {1, 2, 0, {0x0000}}, {2, 3, 0, {0x0000}}, {3, 4, 1, {0x120e}}, {-1, 1, 1, {0} } } },
   725 		{ 4, {0x0d30, 0x0d4d, 0x200d, 0x0d1a}, { {0, 3, 1, {0x1274}}, {1, 2, 0, {0x0000}}, {2, 3, 0, {0x0000}}, {3, 4, 1, {0x120f}}, {-1, 1, 1, {0} } } },
   726 		{ 4, {0x0d32, 0x0d4d, 0x200d, 0x0d1f}, { {0, 3, 1, {0x1276}}, {1, 2, 0, {0x0000}}, {2, 3, 0, {0x0000}}, {3, 4, 1, {0x1214}}, {-1, 1, 1, {0} } } },
   727 		{ 4, {0x0d33, 0x0d4d, 0x200d, 0x0d31}, { {0, 3, 1, {0x1275}}, {1, 2, 0, {0x0000}}, {2, 3, 0, {0x0000}}, {3, 4, 1, {0x1225}}, {-1, 1, 1, {0} } } },
   728 
   729 		{ 4, {0x0d23, 0x0d4d, 0x200d, 0x0d02}, { {0, 3, 1, {0x1272}}, {1, 2, 0, {0x0000}}, {2, 4, 1, {0x11fa}}, {3, 4, 1, {0x11fa}}, {-1, 1, 1, {0} } } },
   730 		{ 4, {0x0d28, 0x0d4d, 0x200d, 0x0d02}, { {0, 3, 1, {0x1273}}, {1, 2, 0, {0x0000}}, {2, 4, 1, {0x11fa}}, {3, 4, 1, {0x11fa}}, {-1, 1, 1, {0} } } },
   731 		{ 4, {0x0d30, 0x0d4d, 0x200d, 0x0d03}, { {0, 3, 1, {0x1274}}, {1, 2, 0, {0x0000}}, {2, 4, 1, {0x11fb}}, {3, 4, 1, {0x11fb}}, {-1, 1, 1, {0} } } },
   732 		{ 4, {0x0d32, 0x0d4d, 0x200d, 0x0d03}, { {0, 3, 1, {0x1276}}, {1, 2, 0, {0x0000}}, {2, 4, 1, {0x11fb}}, {3, 4, 1, {0x11fb}}, {-1, 1, 1, {0} } } },
   733 		{ 4, {0x0d33, 0x0d4d, 0x200d, 0x0d03}, { {0, 3, 1, {0x1275}}, {1, 2, 0, {0x0000}}, {2, 4, 1, {0x11fb}}, {3, 4, 1, {0x11fb}}, {-1, 1, 1, {0} } } },
   734 
   735 		{ 4, {0x0d23, 0x0d4d, 0x200d, 0x0d4d}, { {0, 3, 1, {0x1272}}, {1, 2, 0, {0x0000}}, {2, 4, 2, {0x058f, 0x123a}}, {3, 4, 2, {0x058f, 0x123a}}, {-1, 1, 1, {0} } } },
   736 		{ 4, {0x0d28, 0x0d4d, 0x200d, 0x0d4d}, { {0, 3, 1, {0x1273}}, {1, 2, 0, {0x0000}}, {2, 4, 2, {0x058f, 0x123a}}, {3, 4, 2, {0x058f, 0x123a}}, {-1, 1, 1, {0} } } },
   737 		{ 4, {0x0d30, 0x0d4d, 0x200d, 0x0d4d}, { {0, 3, 1, {0x1274}}, {1, 2, 0, {0x0000}}, {2, 4, 2, {0x058f, 0x123a}}, {3, 4, 2, {0x058f, 0x123a}}, {-1, 1, 1, {0} } } },
   738 		{ 4, {0x0d32, 0x0d4d, 0x200d, 0x0d4d}, { {0, 3, 1, {0x1276}}, {1, 2, 0, {0x0000}}, {2, 4, 2, {0x058f, 0x123a}}, {3, 4, 2, {0x058f, 0x123a}}, {-1, 1, 1, {0} } } },
   739 		{ 4, {0x0d33, 0x0d4d, 0x200d, 0x0d4d}, { {0, 3, 1, {0x1275}}, {1, 2, 0, {0x0000}}, {2, 4, 2, {0x058f, 0x123a}}, {3, 4, 2, {0x058f, 0x123a}}, {-1, 1, 1, {0} } } },
   740 		{ -1, {0}, -1,						-1, 0, {0}}
   741 };
   742 
   743 LOCAL_D const TTestInput_PositionParam6 Indic_GurmukhiVowelLeading[] = {
   744 		//	ARA, IRI, URA, independent vowel to shaper
   745 		{ 1, {0x0a05}, { {0, 1, 1, {0x12c3}}, {-1, 1, 1, {0} } } },
   746 		{ 1, {0x0a06}, { {0, 1, 1, {0x12c4}}, {-1, 1, 1, {0} } } },
   747 		{ 1, {0x0a07}, { {0, 1, 1, {0x12c5}}, {-1, 1, 1, {0} } } },
   748 		{ 1, {0x0a08}, { {0, 1, 1, {0x12c6}}, {-1, 1, 1, {0} } } },		
   749 		{ 1, {0x0a09}, { {0, 1, 1, {0x12c7}}, {-1, 1, 1, {0} } } },
   750 		{ 1, {0x0a0a}, { {0, 1, 1, {0x12c8}}, {-1, 1, 1, {0} } } },
   751 		{ 1, {0x0a0b}, { {0, 1, 1, {0x0000}}, {-1, 1, 1, {0} } } },
   752 		{ 1, {0x0a0c}, { {0, 1, 1, {0x0000}}, {-1, 1, 1, {0} } } },
   753 		{ 1, {0x0a0d}, { {0, 1, 1, {0x0000}}, {-1, 1, 1, {0} } } },
   754 		{ 1, {0x0a0e}, { {0, 1, 1, {0x0000}}, {-1, 1, 1, {0} } } },
   755 		{ 1, {0x0a0f}, { {0, 1, 1, {0x12c9}}, {-1, 1, 1, {0} } } },
   756 		{ 1, {0x0a10}, { {0, 1, 1, {0x12ca}}, {-1, 1, 1, {0} } } },
   757 		{ 1, {0x0a11}, { {0, 1, 1, {0x0000}}, {-1, 1, 1, {0} } } },
   758 		{ 1, {0x0a12}, { {0, 1, 1, {0x0000}}, {-1, 1, 1, {0} } } },
   759 		{ 1, {0x0a13}, { {0, 1, 1, {0x12cb}}, {-1, 1, 1, {0} } } },
   760 		{ 1, {0x0a14}, { {0, 1, 1, {0x12cc}}, {-1, 1, 1, {0} } } },
   761 		{ 1, {0x0a72}, { {0, 1, 1, {0x130a}}, {-1, 1, 1, {0} } } },
   762 		{ 1, {0x0a73}, { {0, 1, 1, {0x130b}}, {-1, 1, 1, {0} } } },
   763 		//	Valid bear + vowel
   764 		{ 2, {0x0a05, 0x0a3e}, { {0, 2, 2, {0x12c3, 0x12ef}}, {1, 2, 1, {0x12ef}}, {-1, 1, 1, {0} } } },
   765 		{ 2, {0x0a05, 0x0a48}, { {0, 2, 2, {0x12c3, 0x12f5}}, {1, 2, 1, {0x12f5}}, {-1, 1, 1, {0} } } },
   766 		{ 2, {0x0a05, 0x0a4c}, { {0, 2, 2, {0x12c3, 0x12f7}}, {1, 2, 1, {0x12f7}}, {-1, 1, 1, {0} } } },
   767 		{ 2, {0x0a72, 0x0a3f}, { {0, 2, 2, {0x12f0, 0x130a}}, {1, 2, 1, {0x12f0}}, {-1, 1, 1, {0} } } },
   768 		{ 2, {0x0a72, 0x0a40}, { {0, 2, 2, {0x130a, 0x12f1}}, {1, 2, 1, {0x12f1}}, {-1, 1, 1, {0} } } },
   769 		{ 2, {0x0a72, 0x0a47}, { {0, 2, 2, {0x130a, 0x12f4}}, {1, 2, 1, {0x12f4}}, {-1, 1, 1, {0} } } },
   770 		{ 2, {0x0a73, 0x0a41}, { {0, 2, 1, {0x12c7}}, {-1, 1, 1, {0} } } },
   771 		{ 2, {0x0a73, 0x0a42}, { {0, 2, 1, {0x12c8}}, {-1, 1, 1, {0} } } },
   772 		{ 2, {0x0a73, 0x0a4b}, { {0, 2, 1, {0x12cb}}, {-1, 1, 1, {0} } } },
   773 		//	Invalid bear + vowel sequence
   774 		{ 2, {0x0a72, 0x0a4b}, { {0, 1, 1, {0x130a}}, {1, 2, 2, {0x058f, 0x12f6}}, {-1, 1, 1, {0} } } },
   775 		{ 2, {0x0a05, 0x0a4b}, { {0, 1, 1, {0x12c3}}, {1, 2, 2, {0x058f, 0x12f6}}, {-1, 1, 1, {0} } } },
   776 		{ 2, {0x0a73, 0x0a3f}, { {0, 1, 1, {0x130b}}, {1, 2, 2, {0x12f0, 0x058f}}, {-1, 1, 1, {0} } } },
   777 		{ -1, {0}, -1,						-1, 0, {0}}
   778 };
   779 
   780 
   781 LOCAL_D const TTestInput_PositionParam6 Indic_MalayalamVowelLeading[] = {
   782 		//	Vowel
   783 		{ 1, {0x0d05}, { {0, 1, 1, {0x11fc}}, {-1, 1, 1, {0} } } },
   784 		{ 1, {0x0d06}, { {0, 1, 1, {0x11fd}}, {-1, 1, 1, {0} } } },
   785 		{ 1, {0x0d07}, { {0, 1, 1, {0x11fe}}, {-1, 1, 1, {0} } } },
   786 		{ 1, {0x0d08}, { {0, 1, 1, {0x11ff}}, {-1, 1, 1, {0} } } },
   787 		{ 1, {0x0d09}, { {0, 1, 1, {0x1200}}, {-1, 1, 1, {0} } } },
   788 		{ 1, {0x0d0a}, { {0, 1, 1, {0x1201}}, {-1, 1, 1, {0} } } },
   789 		{ 1, {0x0d0b}, { {0, 1, 1, {0x1202}}, {-1, 1, 1, {0} } } },
   790 		{ 1, {0x0d60}, { {0, 1, 1, {0x123c}}, {-1, 1, 1, {0} } } },
   791 		{ 1, {0x0d0c}, { {0, 1, 1, {0x1203}}, {-1, 1, 1, {0} } } },
   792 		{ 1, {0x0d61}, { {0, 1, 1, {0x123d}}, {-1, 1, 1, {0} } } },
   793 		{ 1, {0x0d0e}, { {0, 1, 1, {0x1204}}, {-1, 1, 1, {0} } } },
   794 		{ 1, {0x0d0f}, { {0, 1, 1, {0x1205}}, {-1, 1, 1, {0} } } },
   795 		{ 1, {0x0d10}, { {0, 1, 1, {0x1206}}, {-1, 1, 1, {0} } } },
   796 		{ 1, {0x0d12}, { {0, 1, 1, {0x1207}}, {-1, 1, 1, {0} } } },
   797 		{ 1, {0x0d13}, { {0, 1, 1, {0x1208}}, {-1, 1, 1, {0} } } },
   798 		{ 1, {0x0d14}, { {0, 1, 1, {0x1209}}, {-1, 1, 1, {0} } } },
   799 		//	Vowel + modifer 
   800 		{ 2, {0x0d05, 0x0d02}, { {0, 2, 2, {0x11fc, 0x11fa}}, {1, 2, 1, {0x11fa}}, {-1, 1, 1, {0} } } },
   801 		{ 2, {0x0d06, 0x0d02}, { {0, 2, 2, {0x11fd, 0x11fa}}, {1, 2, 1, {0x11fa}}, {-1, 1, 1, {0} } } },
   802 		{ 2, {0x0d07, 0x0d02}, { {0, 2, 2, {0x11fe, 0x11fa}}, {1, 2, 1, {0x11fa}}, {-1, 1, 1, {0} } } },
   803 		{ 2, {0x0d08, 0x0d02}, { {0, 2, 2, {0x11ff, 0x11fa}}, {1, 2, 1, {0x11fa}}, {-1, 1, 1, {0} } } },
   804 		{ 2, {0x0d09, 0x0d02}, { {0, 2, 2, {0x1200, 0x11fa}}, {1, 2, 1, {0x11fa}}, {-1, 1, 1, {0} } } },
   805 		{ 2, {0x0d0a, 0x0d02}, { {0, 2, 2, {0x1201, 0x11fa}}, {1, 2, 1, {0x11fa}}, {-1, 1, 1, {0} } } },
   806 		{ 2, {0x0d0b, 0x0d02}, { {0, 2, 2, {0x1202, 0x11fa}}, {1, 2, 1, {0x11fa}}, {-1, 1, 1, {0} } } },
   807 		{ 2, {0x0d60, 0x0d02}, { {0, 2, 2, {0x123c, 0x11fa}}, {1, 2, 1, {0x11fa}}, {-1, 1, 1, {0} } } },
   808 		{ 2, {0x0d0c, 0x0d03}, { {0, 2, 2, {0x1203, 0x11fb}}, {1, 2, 1, {0x11fb}}, {-1, 1, 1, {0} } } },
   809 		{ 2, {0x0d61, 0x0d03}, { {0, 2, 2, {0x123d, 0x11fb}}, {1, 2, 1, {0x11fb}}, {-1, 1, 1, {0} } } },
   810 		{ 2, {0x0d0e, 0x0d03}, { {0, 2, 2, {0x1204, 0x11fb}}, {1, 2, 1, {0x11fb}}, {-1, 1, 1, {0} } } },
   811 		{ 2, {0x0d0f, 0x0d03}, { {0, 2, 2, {0x1205, 0x11fb}}, {1, 2, 1, {0x11fb}}, {-1, 1, 1, {0} } } },
   812 		{ 2, {0x0d10, 0x0d03}, { {0, 2, 2, {0x1206, 0x11fb}}, {1, 2, 1, {0x11fb}}, {-1, 1, 1, {0} } } },
   813 		{ 2, {0x0d12, 0x0d03}, { {0, 2, 2, {0x1207, 0x11fb}}, {1, 2, 1, {0x11fb}}, {-1, 1, 1, {0} } } },
   814 		{ 2, {0x0d13, 0x0d03}, { {0, 2, 2, {0x1208, 0x11fb}}, {1, 2, 1, {0x11fb}}, {-1, 1, 1, {0} } } },
   815 		{ 2, {0x0d14, 0x0d03}, { {0, 2, 2, {0x1209, 0x11fb}}, {1, 2, 1, {0x11fb}}, {-1, 1, 1, {0} } } },
   816 		//	Vowel, Modifier, Matra
   817 		{ 3, {0x0d05, 0x0d02, 0x0d3e}, { {0, 2, 2, {0x11fc, 0x11fa}}, {1, 2, 1, {0x11fa}}, {2, 3, 2, {0x058f, 0x122e}}, {-1, 1, 1, {0} } } },
   818 		{ 3, {0x0d06, 0x0d02, 0x0d3f}, { {0, 2, 2, {0x11fd, 0x11fa}}, {1, 2, 1, {0x11fa}}, {2, 3, 2, {0x058f, 0x122f}}, {-1, 1, 1, {0} } } },
   819 		{ 3, {0x0d07, 0x0d02, 0x0d40}, { {0, 2, 2, {0x11fe, 0x11fa}}, {1, 2, 1, {0x11fa}}, {2, 3, 2, {0x058f, 0x1230}}, {-1, 1, 1, {0} } } },
   820 		{ 3, {0x0d08, 0x0d02, 0x0d41}, { {0, 2, 2, {0x11ff, 0x11fa}}, {1, 2, 1, {0x11fa}}, {2, 3, 2, {0x058f, 0x1231}}, {-1, 1, 1, {0} } } },
   821 		{ 3, {0x0d09, 0x0d02, 0x0d42}, { {0, 2, 2, {0x1200, 0x11fa}}, {1, 2, 1, {0x11fa}}, {2, 3, 2, {0x058f, 0x1232}}, {-1, 1, 1, {0} } } },
   822 		{ 3, {0x0d0a, 0x0d02, 0x0d43}, { {0, 2, 2, {0x1201, 0x11fa}}, {1, 2, 1, {0x11fa}}, {2, 3, 2, {0x058f, 0x1233}}, {-1, 1, 1, {0} } } },
   823 		{ 3, {0x0d0b, 0x0d02, 0x0d46}, { {0, 2, 2, {0x1202, 0x11fa}}, {1, 2, 1, {0x11fa}}, {2, 3, 2, {0x1234, 0x058f}}, {-1, 1, 1, {0} } } },
   824 		{ 3, {0x0d60, 0x0d02, 0x0d47}, { {0, 2, 2, {0x123c, 0x11fa}}, {1, 2, 1, {0x11fa}}, {2, 3, 2, {0x1235, 0x058f}}, {-1, 1, 1, {0} } } },
   825 		{ 3, {0x0d0c, 0x0d03, 0x0d48}, { {0, 2, 2, {0x1203, 0x11fb}}, {1, 2, 1, {0x11fb}}, {2, 3, 2, {0x1236, 0x058f}}, {-1, 1, 1, {0} } } },
   826 		{ 3, {0x0d61, 0x0d03, 0x0d4a}, { {0, 2, 2, {0x123d, 0x11fb}}, {1, 2, 1, {0x11fb}}, {2, 3, 3, {0x1234, 0x058f, 0x122e}}, {-1, 1, 1, {0} } } },
   827 		{ 3, {0x0d0e, 0x0d03, 0x0d4b}, { {0, 2, 2, {0x1204, 0x11fb}}, {1, 2, 1, {0x11fb}}, {2, 3, 3, {0x1235, 0x058f, 0x122e}}, {-1, 1, 1, {0} } } },
   828 		{ 3, {0x0d0f, 0x0d03, 0x0d4c}, { {0, 2, 2, {0x1205, 0x11fb}}, {1, 2, 1, {0x11fb}}, {2, 3, 2, {0x058f, 0x123b}}, {-1, 1, 1, {0} } } },
   829 		{ 3, {0x0d10, 0x0d03, 0x0d3e}, { {0, 2, 2, {0x1206, 0x11fb}}, {1, 2, 1, {0x11fb}}, {2, 3, 2, {0x058f, 0x122e}}, {-1, 1, 1, {0} } } },
   830 		{ 3, {0x0d12, 0x0d03, 0x0d3f}, { {0, 2, 2, {0x1207, 0x11fb}}, {1, 2, 1, {0x11fb}}, {2, 3, 2, {0x058f, 0x122f}}, {-1, 1, 1, {0} } } },
   831 		{ 3, {0x0d13, 0x0d03, 0x0d40}, { {0, 2, 2, {0x1208, 0x11fb}}, {1, 2, 1, {0x11fb}}, {2, 3, 2, {0x058f, 0x1230}}, {-1, 1, 1, {0} } } },
   832 		{ 3, {0x0d14, 0x0d03, 0x0d4c}, { {0, 2, 2, {0x1209, 0x11fb}}, {1, 2, 1, {0x11fb}}, {2, 3, 2, {0x058f, 0x123b}}, {-1, 1, 1, {0} } } },
   833 		
   834 		//	Vowel, Virama,
   835 		{ 2, {0x0d05, 0x0d4d}, { {0, 1, 1, {0x11fc}}, {1, 2, 2, {0x058f, 0x123a}}, {-1, 1, 1, {0} } } },
   836 		{ 2, {0x0d06, 0x0d4d}, { {0, 1, 1, {0x11fd}}, {1, 2, 2, {0x058f, 0x123a}}, {-1, 1, 1, {0} } } },
   837 		{ 2, {0x0d07, 0x0d4d}, { {0, 1, 1, {0x11fe}}, {1, 2, 2, {0x058f, 0x123a}}, {-1, 1, 1, {0} } } },
   838 		{ 2, {0x0d08, 0x0d4d}, { {0, 1, 1, {0x11ff}}, {1, 2, 2, {0x058f, 0x123a}}, {-1, 1, 1, {0} } } },
   839 		{ 2, {0x0d09, 0x0d4d}, { {0, 1, 1, {0x1200}}, {1, 2, 2, {0x058f, 0x123a}}, {-1, 1, 1, {0} } } },
   840 		{ 2, {0x0d0a, 0x0d4d}, { {0, 1, 1, {0x1201}}, {1, 2, 2, {0x058f, 0x123a}}, {-1, 1, 1, {0} } } },
   841 		{ 2, {0x0d0b, 0x0d4d}, { {0, 1, 1, {0x1202}}, {1, 2, 2, {0x058f, 0x123a}}, {-1, 1, 1, {0} } } },
   842 		{ 2, {0x0d60, 0x0d4d}, { {0, 1, 1, {0x123c}}, {1, 2, 2, {0x058f, 0x123a}}, {-1, 1, 1, {0} } } },
   843 		{ 2, {0x0d0c, 0x0d4d}, { {0, 1, 1, {0x1203}}, {1, 2, 2, {0x058f, 0x123a}}, {-1, 1, 1, {0} } } },
   844 		{ 2, {0x0d61, 0x0d4d}, { {0, 1, 1, {0x123d}}, {1, 2, 2, {0x058f, 0x123a}}, {-1, 1, 1, {0} } } },
   845 		{ 2, {0x0d0e, 0x0d4d}, { {0, 1, 1, {0x1204}}, {1, 2, 2, {0x058f, 0x123a}}, {-1, 1, 1, {0} } } },
   846 		{ 2, {0x0d0f, 0x0d4d}, { {0, 1, 1, {0x1205}}, {1, 2, 2, {0x058f, 0x123a}}, {-1, 1, 1, {0} } } },
   847 		{ 2, {0x0d10, 0x0d4d}, { {0, 1, 1, {0x1206}}, {1, 2, 2, {0x058f, 0x123a}}, {-1, 1, 1, {0} } } },
   848 		{ 2, {0x0d12, 0x0d4d}, { {0, 1, 1, {0x1207}}, {1, 2, 2, {0x058f, 0x123a}}, {-1, 1, 1, {0} } } },
   849 		{ 2, {0x0d13, 0x0d4d}, { {0, 1, 1, {0x1208}}, {1, 2, 2, {0x058f, 0x123a}}, {-1, 1, 1, {0} } } },
   850 		{ 2, {0x0d14, 0x0d4d}, { {0, 1, 1, {0x1209}}, {1, 2, 2, {0x058f, 0x123a}}, {-1, 1, 1, {0} } } },
   851 
   852 		//	Vowel, Matra,
   853 		{ 2, {0x0d05, 0x0d3e}, { {0, 1, 1, {0x11fc}}, {1, 2, 2, {0x058f, 0x122e}}, {-1, 1, 1, {0} } } },
   854 		{ 2, {0x0d06, 0x0d3f}, { {0, 1, 1, {0x11fd}}, {1, 2, 2, {0x058f, 0x122f}}, {-1, 1, 1, {0} } } },
   855 		{ 2, {0x0d07, 0x0d40}, { {0, 1, 1, {0x11fe}}, {1, 2, 2, {0x058f, 0x1230}}, {-1, 1, 1, {0} } } },
   856 		{ 2, {0x0d08, 0x0d41}, { {0, 1, 1, {0x11ff}}, {1, 2, 2, {0x058f, 0x1231}}, {-1, 1, 1, {0} } } },
   857 		{ 2, {0x0d09, 0x0d42}, { {0, 1, 1, {0x1200}}, {1, 2, 2, {0x058f, 0x1232}}, {-1, 1, 1, {0} } } },
   858 		{ 2, {0x0d0a, 0x0d43}, { {0, 1, 1, {0x1201}}, {1, 2, 2, {0x058f, 0x1233}}, {-1, 1, 1, {0} } } },
   859 		{ 2, {0x0d0b, 0x0d46}, { {0, 1, 1, {0x1202}}, {1, 2, 2, {0x1234, 0x058f}}, {-1, 1, 1, {0} } } },
   860 		{ 2, {0x0d60, 0x0d47}, { {0, 1, 1, {0x123c}}, {1, 2, 2, {0x1235, 0x058f}}, {-1, 1, 1, {0} } } },
   861 		{ 2, {0x0d0c, 0x0d48}, { {0, 1, 1, {0x1203}}, {1, 2, 2, {0x1236, 0x058f}}, {-1, 1, 1, {0} } } },
   862 		{ 2, {0x0d61, 0x0d4a}, { {0, 1, 1, {0x123d}}, {1, 2, 3, {0x1234, 0x058f, 0x122e}}, {-1, 1, 1, {0} } } },
   863 		{ 2, {0x0d0e, 0x0d4b}, { {0, 1, 1, {0x1204}}, {1, 2, 3, {0x1235, 0x058f, 0x122e}}, {-1, 1, 1, {0} } } },
   864 		{ 2, {0x0d0f, 0x0d4c}, { {0, 1, 1, {0x1205}}, {1, 2, 2, {0x058f, 0x123b}}, {-1, 1, 1, {0} } } },
   865 		{ 2, {0x0d10, 0x0d3e}, { {0, 1, 1, {0x1206}}, {1, 2, 2, {0x058f, 0x122e}}, {-1, 1, 1, {0} } } },
   866 		{ 2, {0x0d12, 0x0d3f}, { {0, 1, 1, {0x1207}}, {1, 2, 2, {0x058f, 0x122f}}, {-1, 1, 1, {0} } } },
   867 		{ 2, {0x0d13, 0x0d40}, { {0, 1, 1, {0x1208}}, {1, 2, 2, {0x058f, 0x1230}}, {-1, 1, 1, {0} } } },
   868 		{ 2, {0x0d14, 0x0d4c}, { {0, 1, 1, {0x1209}}, {1, 2, 2, {0x058f, 0x123b}}, {-1, 1, 1, {0} } } },
   869 		//	Vowel Virma, Matra
   870 		{ 3, {0x0d05, 0x0d4d, 0x0d3e}, { {0, 1, 1, {0x11fc}}, {1, 2, 2, {0x058f, 0x123a}}, {2, 3, 2, {0x058f, 0x122e}}, {-1, 1, 1, {0} } } },
   871 		{ 3, {0x0d06, 0x0d4d, 0x0d3f}, { {0, 1, 1, {0x11fd}}, {1, 2, 2, {0x058f, 0x123a}}, {2, 3, 2, {0x058f, 0x122f}}, {-1, 1, 1, {0} } } },
   872 		{ 3, {0x0d07, 0x0d4d, 0x0d40}, { {0, 1, 1, {0x11fe}}, {1, 2, 2, {0x058f, 0x123a}}, {2, 3, 2, {0x058f, 0x1230}}, {-1, 1, 1, {0} } } },
   873 		{ 3, {0x0d08, 0x0d4d, 0x0d41}, { {0, 1, 1, {0x11ff}}, {1, 2, 2, {0x058f, 0x123a}}, {2, 3, 2, {0x058f, 0x1231}}, {-1, 1, 1, {0} } } },
   874 		{ 3, {0x0d09, 0x0d4d, 0x0d42}, { {0, 1, 1, {0x1200}}, {1, 2, 2, {0x058f, 0x123a}}, {2, 3, 2, {0x058f, 0x1232}}, {-1, 1, 1, {0} } } },
   875 		{ 3, {0x0d0a, 0x0d4d, 0x0d43}, { {0, 1, 1, {0x1201}}, {1, 2, 2, {0x058f, 0x123a}}, {2, 3, 2, {0x058f, 0x1233}}, {-1, 1, 1, {0} } } },
   876 		{ 3, {0x0d0b, 0x0d4d, 0x0d46}, { {0, 1, 1, {0x1202}}, {1, 2, 2, {0x058f, 0x123a}}, {2, 3, 2, {0x1234, 0x058f}}, {-1, 1, 1, {0} } } },
   877 		{ 3, {0x0d60, 0x0d4d, 0x0d47}, { {0, 1, 1, {0x123c}}, {1, 2, 2, {0x058f, 0x123a}}, {2, 3, 2, {0x1235, 0x058f}}, {-1, 1, 1, {0} } } },
   878 		{ 3, {0x0d0c, 0x0d4d, 0x0d48}, { {0, 1, 1, {0x1203}}, {1, 2, 2, {0x058f, 0x123a}}, {2, 3, 2, {0x1236, 0x058f}}, {-1, 1, 1, {0} } } },
   879 		{ 3, {0x0d61, 0x0d4d, 0x0d4a}, { {0, 1, 1, {0x123d}}, {1, 2, 2, {0x058f, 0x123a}}, {2, 3, 3, {0x1234, 0x058f, 0x122e}}, {-1, 1, 1, {0} } } },
   880 		{ 3, {0x0d0e, 0x0d4d, 0x0d4b}, { {0, 1, 1, {0x1204}}, {1, 2, 2, {0x058f, 0x123a}}, {2, 3, 3, {0x1235, 0x058f, 0x122e}}, {-1, 1, 1, {0} } } },
   881 		{ 3, {0x0d0f, 0x0d4d, 0x0d4c}, { {0, 1, 1, {0x1205}}, {1, 2, 2, {0x058f, 0x123a}}, {2, 3, 2, {0x058f, 0x123b}}, {-1, 1, 1, {0} } } },
   882 		{ 3, {0x0d10, 0x0d4d, 0x0d3e}, { {0, 1, 1, {0x1206}}, {1, 2, 2, {0x058f, 0x123a}}, {2, 3, 2, {0x058f, 0x122e}}, {-1, 1, 1, {0} } } },
   883 		{ 3, {0x0d12, 0x0d4d, 0x0d3f}, { {0, 1, 1, {0x1207}}, {1, 2, 2, {0x058f, 0x123a}}, {2, 3, 2, {0x058f, 0x122f}}, {-1, 1, 1, {0} } } },
   884 		{ 3, {0x0d13, 0x0d4d, 0x0d40}, { {0, 1, 1, {0x1208}}, {1, 2, 2, {0x058f, 0x123a}}, {2, 3, 2, {0x058f, 0x1230}}, {-1, 1, 1, {0} } } },
   885 		{ 3, {0x0d14, 0x0d4d, 0x0d4c}, { {0, 1, 1, {0x1209}}, {1, 2, 2, {0x058f, 0x123a}}, {2, 3, 2, {0x058f, 0x123b}}, {-1, 1, 1, {0} } } },
   886 		{ -1, {0}, -1,						-1, 0, {0}}
   887 };
   888 
   889 /**
   890  This array of structs is used in the test routine 
   891  CTGlyphSelection::TestThai_InvalidGlyphClusters() to verify that
   892  GetCharacterPosition() correctly uses the dotted circle character
   893  when it crosses a glyph cluster boundary and finds invalid combining
   894  characters.
   895 */
   896 LOCAL_D const TTestInput_PositionParam2 Thai_GlyphClusterBoundaries[] = {
   897 //    --TEXT----------------	--INVOKE 1---------------		--INVOKE 2----------------
   898 
   899 //0.TEST D1 - Control character - skipped
   900 
   901 //0.TEST D2 - Non Thai letter
   902 	{ 2, {0x0E3F, 0x0E5B}, 	 	{{0, 1, 1, {0x0E3F}},			{1, 2, 1, {0x0E5B}}}},
   903 	{ 2, {0x0041, 0x0E03}, 	 	{{0, 1, 1, {0x0041}},			{1, 2, 1, {0x0E03}}}},
   904 	{ 2, {0x0E2F, 0x0E40}, 	 	{{0, 1, 1, {0x0E2F}},			{1, 2, 1, {0x0E40}}}},
   905 	{ 2, {0x0E3F, 0x0E30}, 	 	{{0, 1, 1, {0x0E3F}},			{1, 2, 1, {0x0E30}}}},
   906 	{ 2, {0x0E46, 0x0E45}, 	 	{{0, 1, 1, {0x0E46}},			{1, 2, 1, {0x0E45}}}},
   907 	{ 2, {0x0E4F, 0x0E24}, 	 	{{0, 1, 1, {0x0E4F}},			{1, 2, 1, {0x0E24}}}},
   908 
   909 	{ 2, {0x0E50, 0x0E38}, 	 	{{0, 1, 1, {0x0E50}},			{1, 2, 2, {KUnicodeDottedCircle, 0x0E38}}}},
   910 	{ 2, {0x0E51, 0x0E39}, 	 	{{0, 1, 1, {0x0E51}},			{1, 2, 2, {KUnicodeDottedCircle, 0x0E39}}}},
   911 	{ 2, {0x0E52, 0x0E3A}, 	 	{{0, 1, 1, {0x0E52}},			{1, 2, 2, {KUnicodeDottedCircle, 0x0E3A}}}},
   912 	{ 2, {0x0E55, 0x0E49}, 	 	{{0, 1, 1, {0x0E55}},			{1, 2, 2, {KUnicodeDottedCircle, 0xF70B}}}},
   913 	{ 2, {0x0E56, 0x0E4C}, 	 	{{0, 1, 1, {0x0E56}},			{1, 2, 2, {KUnicodeDottedCircle, 0xF70E}}}},
   914 	{ 2, {0x0E58, 0x0E47}, 	 	{{0, 1, 1, {0x0E58}},			{1, 2, 2, {KUnicodeDottedCircle, 0x0E47}}}},
   915 	{ 2, {0x0E59, 0x0E4E}, 	 	{{0, 1, 1, {0x0E59}},			{1, 2, 2, {KUnicodeDottedCircle, 0x0E4E}}}},
   916 	{ 2, {0x0E5A, 0x0E34}, 	 	{{0, 1, 1, {0x0E5A}},			{1, 2, 2, {KUnicodeDottedCircle, 0x0E34}}}},
   917 	{ 2, {0x0E5B, 0x0E31}, 	 	{{0, 1, 1, {0x0E5B}},			{1, 2, 2, {KUnicodeDottedCircle, 0x0E31}}}},
   918 	{ 2, {0x005A, 0x0E37}, 	 	{{0, 1, 1, {0x005A}},			{1, 2, 2, {KUnicodeDottedCircle, 0x0E37}}}},
   919 
   920 //16.TEST D3 - Thai consonant
   921 	{ 2, {0x0E01, 0x0E3F},	 	{{0, 1, 1, {0x0E01}},			{1, 2, 1, {0x0E3F}}}},
   922 	{ 2, {0x0E01, 0x0E03}, 	 	{{0, 1, 1, {0x0E01}},			{1, 2, 1, {0x0E03}}}},
   923 	{ 2, {0x0E02, 0x0E40}, 	 	{{0, 1, 1, {0x0E02}},			{1, 2, 1, {0x0E40}}}},
   924 	{ 2, {0x0E03, 0x0E30}, 	 	{{0, 1, 1, {0x0E03}},			{1, 2, 1, {0x0E30}}}},
   925 	{ 2, {0x0E04, 0x0E45}, 	 	{{0, 1, 1, {0x0E04}},			{1, 2, 1, {0x0E45}}}},
   926 	{ 2, {0x0E05, 0x0E24}, 	 	{{0, 1, 1, {0x0E05}},			{1, 2, 1, {0x0E24}}}},
   927 
   928 	{ 2, {0x0E06, 0x0E38}, 	 	{{0, 2, 2, {0x0E06, 0x0E38}},	{-1, -1, 0, {0}}}},
   929 	{ 2, {0x0E07, 0x0E39}, 	 	{{0, 2, 2, {0x0E07, 0x0E39}},	{-1, -1, 0, {0}}}},
   930 	{ 2, {0x0E23, 0x0E3A}, 	 	{{0, 2, 2, {0x0E23, 0x0E3A}},	{-1, -1, 0, {0}}}},
   931 	{ 2, {0x0E25, 0x0E49}, 	 	{{0, 2, 2, {0x0E25, 0xF70B}},	{-1, -1, 0, {0}}}},
   932 	{ 2, {0x0E27, 0x0E4C}, 	 	{{0, 2, 2, {0x0E27, 0xF70E}},	{-1, -1, 0, {0}}}},
   933 	{ 2, {0x0E28, 0x0E47}, 	 	{{0, 2, 2, {0x0E28, 0x0E47}},	{-1, -1, 0, {0}}}},
   934 	{ 2, {0x0E29, 0x0E4E}, 	 	{{0, 2, 2, {0x0E29, 0x0E4E}},	{-1, -1, 0, {0}}}},
   935 	{ 2, {0x0E2A, 0x0E34}, 	 	{{0, 2, 2, {0x0E2A, 0x0E34}},	{-1, -1, 0, {0}}}},
   936 	{ 2, {0x0E2D, 0x0E31}, 	 	{{0, 2, 2, {0x0E2D, 0x0E31}},	{-1, -1, 0, {0}}}},
   937 	{ 2, {0x0E2E, 0x0E37}, 	 	{{0, 2, 2, {0x0E2E, 0x0E37}},	{-1, -1, 0, {0}}}},
   938 
   939 //32.TEST D4 - Thai leading vowel
   940 	{ 2, {0x0E40, 0x0E3F}, 	 	{{0, 1, 1, {0x0E40}},			{1, 2, 1, {0x0E3F}}}},
   941 	{ 2, {0x0E41, 0x0E03}, 	 	{{0, 1, 1, {0x0E41}},			{1, 2, 1, {0x0E03}}}},
   942 	{ 2, {0x0E42, 0x0E40}, 	 	{{0, 1, 1, {0x0E42}},			{1, 2, 1, {0x0E40}}}},
   943 	{ 2, {0x0E43, 0x0E30}, 	 	{{0, 1, 1, {0x0E43}},			{1, 2, 1, {0x0E30}}}},
   944 	{ 2, {0x0E44, 0x0E45}, 	 	{{0, 1, 1, {0x0E44}},			{1, 2, 1, {0x0E45}}}},
   945 	{ 2, {0x0E44, 0x0E24}, 	 	{{0, 1, 1, {0x0E44}},			{1, 2, 1, {0x0E24}}}},
   946 
   947 	{ 2, {0x0E40, 0x0E38},		{{0, 1, 1, {0x0E40}},			{1, 2, 2, {KUnicodeDottedCircle, 0x0E38}}}},
   948 	{ 2, {0x0E41, 0x0E39}, 	 	{{0, 1, 1, {0x0E41}},			{1, 2, 2, {KUnicodeDottedCircle, 0x0E39}}}},
   949 	{ 2, {0x0E42, 0x0E3A}, 	 	{{0, 1, 1, {0x0E42}},			{1, 2, 2, {KUnicodeDottedCircle, 0x0E3A}}}},
   950 	{ 2, {0x0E43, 0x0E49}, 	 	{{0, 1, 1, {0x0E43}},			{1, 2, 2, {KUnicodeDottedCircle, 0xF70B}}}},
   951 	{ 2, {0x0E44, 0x0E4C}, 	 	{{0, 1, 1, {0x0E44}},			{1, 2, 2, {KUnicodeDottedCircle, 0xF70E}}}},
   952 	{ 2, {0x0E40, 0x0E47}, 	 	{{0, 1, 1, {0x0E40}},			{1, 2, 2, {KUnicodeDottedCircle, 0x0E47}}}},
   953 	{ 2, {0x0E41, 0x0E4E}, 	 	{{0, 1, 1, {0x0E41}},			{1, 2, 2, {KUnicodeDottedCircle, 0x0E4E}}}},
   954 	{ 2, {0x0E42, 0x0E34}, 	 	{{0, 1, 1, {0x0E42}},			{1, 2, 2, {KUnicodeDottedCircle, 0x0E34}}}},
   955 	{ 2, {0x0E43, 0x0E31}, 	 	{{0, 1, 1, {0x0E43}},			{1, 2, 2, {KUnicodeDottedCircle, 0x0E31}}}},
   956 	{ 2, {0x0E44, 0x0E37}, 	 	{{0, 1, 1, {0x0E44}},			{1, 2, 2, {KUnicodeDottedCircle, 0x0E37}}}},
   957 
   958 //48.TEST D5 - Thai following vowel 1
   959 	{ 2, {0x0E30, 0x0E3F}, 	 	{{0, 1, 1, {0x0E30}},				{1, 2, 1, {0x0E3F}}}},
   960 	{ 2, {0x0E32, 0x0E03}, 	 	{{0, 1, 1, {0x0E32}},				{1, 2, 1, {0x0E03}}}},
   961 	{ 2, {0x0E33, 0x0E40}, 	 	{{0, 1, 2, {KUnicodeDottedCircle, 0x0E33}},{1, 2, 1, {0x0E40}}}},
   962 	{ 2, {0x0E30, 0x0E30}, 	 	{{0, 1, 1, {0x0E30}},				{1, 2, 1, {0x0E30}}}},
   963 	{ 2, {0x0E32, 0x0E45}, 	 	{{0, 1, 1, {0x0E32}},				{1, 2, 1, {0x0E45}}}},
   964 	{ 2, {0x0E33, 0x0E24}, 	 	{{0, 1, 2, {KUnicodeDottedCircle, 0x0E33}},{1, 2, 1, {0x0E24}}}},
   965 
   966 	{ 2, {0x0E30, 0x0E38},		{{0, 1, 1, {0x0E30}},				{1, 2, 2, {KUnicodeDottedCircle, 0x0E38}}}},
   967 	{ 2, {0x0E32, 0x0E39}, 	 	{{0, 1, 1, {0x0E32}},				{1, 2, 2, {KUnicodeDottedCircle, 0x0E39}}}},
   968 	{ 2, {0x0E33, 0x0E3A}, 	 	{{0, 1, 2, {KUnicodeDottedCircle, 0x0E33}},{1, 2, 2, {KUnicodeDottedCircle, 0x0E3A}}}},
   969 	{ 2, {0x0E30, 0x0E49}, 	 	{{0, 1, 1, {0x0E30}},				{1, 2, 2, {KUnicodeDottedCircle, 0xF70B}}}},
   970 	{ 2, {0x0E32, 0x0E4C}, 	 	{{0, 1, 1, {0x0E32}},				{1, 2, 2, {KUnicodeDottedCircle, 0xF70E}}}},
   971 	{ 2, {0x0E33, 0x0E47}, 	 	{{0, 1, 2, {KUnicodeDottedCircle, 0x0E33}},{1, 2, 2, {KUnicodeDottedCircle, 0x0E47}}}},
   972 	{ 2, {0x0E30, 0x0E4E}, 	 	{{0, 1, 1, {0x0E30}},				{1, 2, 2, {KUnicodeDottedCircle, 0x0E4E}}}},
   973 	{ 2, {0x0E32, 0x0E34}, 	 	{{0, 1, 1, {0x0E32}},				{1, 2, 2, {KUnicodeDottedCircle, 0x0E34}}}},
   974 	{ 2, {0x0E33, 0x0E31}, 	 	{{0, 1, 2, {KUnicodeDottedCircle, 0x0E33}},{1, 2, 2, {KUnicodeDottedCircle, 0x0E31}}}},
   975 	{ 2, {0x0E30, 0x0E37}, 	 	{{0, 1, 1, {0x0E30}},				{1, 2, 2, {KUnicodeDottedCircle, 0x0E37}}}},
   976 
   977 //64.TEST D6 - Thai following vowel 2
   978 	{ 2, {0x0E45, 0x0E3F}, 	 	{{0, 1, 1, {0x0E45}},			{1, 2, 1, {0x0E3F}}}},
   979 	{ 2, {0x0E45, 0x0E03}, 	 	{{0, 1, 1, {0x0E45}},			{1, 2, 1, {0x0E03}}}},
   980 	{ 2, {0x0E45, 0x0E40}, 	 	{{0, 1, 1, {0x0E45}},			{1, 2, 1, {0x0E40}}}},
   981 	{ 2, {0x0E45, 0x0E30}, 	 	{{0, 1, 1, {0x0E45}},			{1, 2, 1, {0x0E30}}}},
   982 	{ 2, {0x0E45, 0x0E45}, 	 	{{0, 1, 1, {0x0E45}},			{1, 2, 1, {0x0E45}}}},
   983 	{ 2, {0x0E45, 0x0E24}, 	 	{{0, 1, 1, {0x0E45}},			{1, 2, 1, {0x0E24}}}},
   984 
   985 	{ 2, {0x0E45, 0x0E38},		{{0, 1, 1, {0x0E45}},			{1, 2, 2, {KUnicodeDottedCircle, 0x0E38}}}},
   986 	{ 2, {0x0E45, 0x0E39}, 	 	{{0, 1, 1, {0x0E45}},			{1, 2, 2, {KUnicodeDottedCircle, 0x0E39}}}},
   987 	{ 2, {0x0E45, 0x0E3A}, 	 	{{0, 1, 1, {0x0E45}},			{1, 2, 2, {KUnicodeDottedCircle, 0x0E3A}}}},
   988 	{ 2, {0x0E45, 0x0E49}, 	 	{{0, 1, 1, {0x0E45}},			{1, 2, 2, {KUnicodeDottedCircle, 0xF70B}}}},
   989 	{ 2, {0x0E45, 0x0E4C}, 	 	{{0, 1, 1, {0x0E45}},			{1, 2, 2, {KUnicodeDottedCircle, 0xF70E}}}},
   990 	{ 2, {0x0E45, 0x0E47}, 	 	{{0, 1, 1, {0x0E45}},			{1, 2, 2, {KUnicodeDottedCircle, 0x0E47}}}},
   991 	{ 2, {0x0E45, 0x0E4E}, 	 	{{0, 1, 1, {0x0E45}},			{1, 2, 2, {KUnicodeDottedCircle, 0x0E4E}}}},
   992 	{ 2, {0x0E45, 0x0E34}, 	 	{{0, 1, 1, {0x0E45}},			{1, 2, 2, {KUnicodeDottedCircle, 0x0E34}}}},
   993 	{ 2, {0x0E45, 0x0E31}, 	 	{{0, 1, 1, {0x0E45}},			{1, 2, 2, {KUnicodeDottedCircle, 0x0E31}}}},
   994 	{ 2, {0x0E45, 0x0E37}, 	 	{{0, 1, 1, {0x0E45}},			{1, 2, 2, {KUnicodeDottedCircle, 0x0E37}}}},
   995 
   996 //80.TEST D7 - Thai following vowel 3
   997 	{ 2, {0x0E24, 0x0E3F}, 	 	{{0, 1, 1, {0x0E24}},			{1, 2, 1, {0x0E3F}}}},
   998 	{ 2, {0x0E26, 0x0E03}, 	 	{{0, 1, 1, {0x0E26}},			{1, 2, 1, {0x0E03}}}},
   999 	{ 2, {0x0E24, 0x0E40}, 	 	{{0, 1, 1, {0x0E24}},			{1, 2, 1, {0x0E40}}}},
  1000 	{ 2, {0x0E26, 0x0E30}, 	 	{{0, 1, 1, {0x0E26}},			{1, 2, 1, {0x0E30}}}},
  1001 	{ 2, {0x0E24, 0x0E45}, 	 	{{0, 1, 1, {0x0E24}},			{1, 2, 1, {0x0E45}}}},
  1002 	{ 2, {0x0E26, 0x0E24}, 	 	{{0, 1, 1, {0x0E26}},			{1, 2, 1, {0x0E24}}}},
  1003 
  1004 	{ 2, {0x0E24, 0x0E38},		{{0, 2, 2, {0x0E24, 0xF718}},	{-1, -1, 0, {0}}}},
  1005 	{ 2, {0x0E26, 0x0E39}, 	 	{{0, 2, 2, {0x0E26, 0xF719}},	{-1, -1, 0, {0}}}},
  1006 	{ 2, {0x0E24, 0x0E3A}, 	 	{{0, 2, 2, {0x0E24, 0xF71A}},	{-1, -1, 0, {0}}}},
  1007 	{ 2, {0x0E26, 0x0E49}, 	 	{{0, 2, 2, {0x0E26, 0xF70B}},	{-1, -1, 0, {0}}}},
  1008 	{ 2, {0x0E24, 0x0E4C}, 	 	{{0, 2, 2, {0x0E24, 0xF70E}},	{-1, -1, 0, {0}}}},
  1009 	{ 2, {0x0E26, 0x0E47}, 	 	{{0, 2, 2, {0x0E26, 0x0E47}},	{-1, -1, 0, {0}}}},
  1010 	{ 2, {0x0E24, 0x0E4E}, 	 	{{0, 2, 2, {0x0E24, 0x0E4E}},	{-1, -1, 0, {0}}}},
  1011 	{ 2, {0x0E26, 0x0E34}, 	 	{{0, 2, 2, {0x0E26, 0x0E34}},	{-1, -1, 0, {0}}}},
  1012 	{ 2, {0x0E24, 0x0E31}, 	 	{{0, 2, 2, {0x0E24, 0x0E31}},	{-1, -1, 0, {0}}}},
  1013 	{ 2, {0x0E26, 0x0E37}, 	 	{{0, 2, 2, {0x0E26, 0x0E37}},	{-1, -1, 0, {0}}}},
  1014 
  1015 //96.TEST D8 - Thai NO NU & Below Vowel 1
  1016 	{ 3, {0x0E19, 0x0E38, 0x0E3F}, 	 	{{0, 2, 2, {0x0E19, 0x0E38}},			{2, 3, 1, {0x0E3F}}}},
  1017 	{ 3, {0x0E19, 0x0E38, 0x0E03}, 	 	{{0, 2, 2, {0x0E19, 0x0E38}},			{2, 3, 1, {0x0E03}}}},
  1018 	{ 3, {0x0E19, 0x0E38, 0x0E40}, 	 	{{0, 2, 2, {0x0E19, 0x0E38}},			{2, 3, 1, {0x0E40}}}},
  1019 	{ 3, {0x0E19, 0x0E38, 0x0E30}, 	 	{{0, 2, 2, {0x0E19, 0x0E38}},			{2, 3, 1, {0x0E30}}}},
  1020 	{ 3, {0x0E19, 0x0E38, 0x0E45}, 	 	{{0, 2, 2, {0x0E19, 0x0E38}},			{2, 3, 1, {0x0E45}}}},
  1021 	{ 3, {0x0E19, 0x0E38, 0x0E24}, 	 	{{0, 2, 2, {0x0E19, 0x0E38}},			{2, 3, 1, {0x0E24}}}},
  1022 
  1023 	{ 3, {0x0E19, 0x0E38, 0x0E38},		{{0, 2, 2, {0x0E19, 0x0E38}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E38}}}},
  1024 	{ 3, {0x0E19, 0x0E38, 0x0E39}, 	 	{{0, 2, 2, {0x0E19, 0x0E38}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E39}}}},
  1025 	{ 3, {0x0E19, 0x0E38, 0x0E3A}, 	 	{{0, 2, 2, {0x0E19, 0x0E38}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E3A}}}},
  1026 	{ 3, {0x0E19, 0x0E38, 0x0E49}, 	 	{{0, 3, 3, {0x0E19, 0x0E38, 0xF70B}},	{-1, -1, 0, {0}}}},
  1027 	{ 3, {0x0E19, 0x0E38, 0x0E4C}, 	 	{{0, 3, 3, {0x0E19, 0x0E38, 0xF70E}},	{-1, -1, 0, {0}}}},
  1028 	{ 3, {0x0E19, 0x0E38, 0x0E47}, 	 	{{0, 2, 2, {0x0E19, 0x0E38}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E47}}}},
  1029 	{ 3, {0x0E19, 0x0E38, 0x0E4E}, 	 	{{0, 2, 2, {0x0E19, 0x0E38}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E4E}}}},
  1030 	{ 3, {0x0E19, 0x0E38, 0x0E34}, 	 	{{0, 2, 2, {0x0E19, 0x0E38}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E34}}}},
  1031 	{ 3, {0x0E19, 0x0E38, 0x0E31}, 	 	{{0, 2, 2, {0x0E19, 0x0E38}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E31}}}},
  1032 	{ 3, {0x0E19, 0x0E38, 0x0E37}, 	 	{{0, 2, 2, {0x0E19, 0x0E38}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E37}}}},
  1033 
  1034 //112.TEST D9 - Thai NO NU & Below Vowel 2
  1035 	{ 3, {0x0E19, 0x0E39, 0x0E3F}, 	 	{{0, 2, 2, {0x0E19, 0x0E39}},			{2, 3, 1, {0x0E3F}}}},
  1036 	{ 3, {0x0E19, 0x0E39, 0x0E03}, 	 	{{0, 2, 2, {0x0E19, 0x0E39}},			{2, 3, 1, {0x0E03}}}},
  1037 	{ 3, {0x0E19, 0x0E39, 0x0E40}, 	 	{{0, 2, 2, {0x0E19, 0x0E39}},			{2, 3, 1, {0x0E40}}}},
  1038 	{ 3, {0x0E19, 0x0E39, 0x0E30}, 	 	{{0, 2, 2, {0x0E19, 0x0E39}},			{2, 3, 1, {0x0E30}}}},
  1039 	{ 3, {0x0E19, 0x0E39, 0x0E45}, 	 	{{0, 2, 2, {0x0E19, 0x0E39}},			{2, 3, 1, {0x0E45}}}},
  1040 	{ 3, {0x0E19, 0x0E39, 0x0E24}, 	 	{{0, 2, 2, {0x0E19, 0x0E39}},			{2, 3, 1, {0x0E24}}}},
  1041 
  1042 	{ 3, {0x0E19, 0x0E39, 0x0E38},		{{0, 2, 2, {0x0E19, 0x0E39}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E38}}}},
  1043 	{ 3, {0x0E19, 0x0E39, 0x0E39}, 	 	{{0, 2, 2, {0x0E19, 0x0E39}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E39}}}},
  1044 	{ 3, {0x0E19, 0x0E39, 0x0E3A}, 	 	{{0, 2, 2, {0x0E19, 0x0E39}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E3A}}}},
  1045 	{ 3, {0x0E19, 0x0E39, 0x0E49}, 	 	{{0, 3, 3, {0x0E19, 0x0E39, 0xF70B}},	{-1, -1, 0, {0}}}},
  1046 	{ 3, {0x0E19, 0x0E39, 0x0E4C}, 	 	{{0, 2, 2, {0x0E19, 0x0E39}},			{2, 3, 2, {KUnicodeDottedCircle, 0xF70E}}}},
  1047 	{ 3, {0x0E19, 0x0E39, 0x0E47}, 	 	{{0, 2, 2, {0x0E19, 0x0E39}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E47}}}},
  1048 	{ 3, {0x0E19, 0x0E39, 0x0E4E}, 	 	{{0, 2, 2, {0x0E19, 0x0E39}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E4E}}}},
  1049 	{ 3, {0x0E19, 0x0E39, 0x0E34}, 	 	{{0, 2, 2, {0x0E19, 0x0E39}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E34}}}},
  1050 	{ 3, {0x0E19, 0x0E39, 0x0E31}, 	 	{{0, 2, 2, {0x0E19, 0x0E39}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E31}}}},
  1051 	{ 3, {0x0E19, 0x0E39, 0x0E37}, 	 	{{0, 2, 2, {0x0E19, 0x0E39}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E37}}}},
  1052 
  1053 //128.TEST D10 - Thai NO NU & Below Diacritic
  1054 	{ 3, {0x0E19, 0x0E3A, 0x0E3F}, 	 	{{0, 2, 2, {0x0E19, 0x0E3A}},			{2, 3, 1, {0x0E3F}}}},
  1055 	{ 3, {0x0E19, 0x0E3A, 0x0E03}, 	 	{{0, 2, 2, {0x0E19, 0x0E3A}},			{2, 3, 1, {0x0E03}}}},
  1056 	{ 3, {0x0E19, 0x0E3A, 0x0E40}, 	 	{{0, 2, 2, {0x0E19, 0x0E3A}},			{2, 3, 1, {0x0E40}}}},
  1057 	{ 3, {0x0E19, 0x0E3A, 0x0E30}, 	 	{{0, 2, 2, {0x0E19, 0x0E3A}},			{2, 3, 1, {0x0E30}}}},
  1058 	{ 3, {0x0E19, 0x0E3A, 0x0E45}, 	 	{{0, 2, 2, {0x0E19, 0x0E3A}},			{2, 3, 1, {0x0E45}}}},
  1059 	{ 3, {0x0E19, 0x0E3A, 0x0E24}, 	 	{{0, 2, 2, {0x0E19, 0x0E3A}},			{2, 3, 1, {0x0E24}}}},
  1060 
  1061 	{ 3, {0x0E19, 0x0E3A, 0x0E38},		{{0, 2, 2, {0x0E19, 0x0E3A}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E38}}}},
  1062 	{ 3, {0x0E19, 0x0E3A, 0x0E39}, 	 	{{0, 2, 2, {0x0E19, 0x0E3A}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E39}}}},
  1063 	{ 3, {0x0E19, 0x0E3A, 0x0E3A}, 	 	{{0, 2, 2, {0x0E19, 0x0E3A}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E3A}}}},
  1064 	{ 3, {0x0E19, 0x0E3A, 0x0E49}, 	 	{{0, 2, 2, {0x0E19, 0x0E3A}},			{2, 3, 2, {KUnicodeDottedCircle, 0xF70B}}}},
  1065 	{ 3, {0x0E19, 0x0E3A, 0x0E4C}, 	 	{{0, 2, 2, {0x0E19, 0x0E3A}},			{2, 3, 2, {KUnicodeDottedCircle, 0xF70E}}}},
  1066 	{ 3, {0x0E19, 0x0E3A, 0x0E47}, 	 	{{0, 2, 2, {0x0E19, 0x0E3A}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E47}}}},
  1067 	{ 3, {0x0E19, 0x0E3A, 0x0E4E}, 	 	{{0, 2, 2, {0x0E19, 0x0E3A}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E4E}}}},
  1068 	{ 3, {0x0E19, 0x0E3A, 0x0E34}, 	 	{{0, 2, 2, {0x0E19, 0x0E3A}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E34}}}},
  1069 	{ 3, {0x0E19, 0x0E3A, 0x0E31}, 	 	{{0, 2, 2, {0x0E19, 0x0E3A}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E31}}}},
  1070 	{ 3, {0x0E19, 0x0E3A, 0x0E37}, 	 	{{0, 2, 2, {0x0E19, 0x0E3A}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E37}}}},
  1071 
  1072 //144.TEST D11 - Thai NO NU & Tone mark
  1073 	{ 3, {0x0E19, 0x0E48, 0x0E3F}, 	 	{{0, 2, 2, {0x0E19, 0xF70A}},			{2, 3, 1, {0x0E3F}}}},
  1074 	{ 3, {0x0E19, 0x0E49, 0x0E03}, 	 	{{0, 2, 2, {0x0E19, 0xF70B}},			{2, 3, 1, {0x0E03}}}},
  1075 	{ 3, {0x0E19, 0x0E4A, 0x0E40}, 	 	{{0, 2, 2, {0x0E19, 0xF70C}},			{2, 3, 1, {0x0E40}}}},
  1076 	{ 3, {0x0E19, 0x0E4B, 0x0E30}, 	 	{{0, 2, 2, {0x0E19, 0xF70D}},			{2, 3, 1, {0x0E30}}}},
  1077 	{ 3, {0x0E19, 0x0E48, 0x0E45}, 	 	{{0, 2, 2, {0x0E19, 0xF70A}},			{2, 3, 1, {0x0E45}}}},
  1078 	{ 3, {0x0E19, 0x0E49, 0x0E24}, 	 	{{0, 2, 2, {0x0E19, 0xF70B}},			{2, 3, 1, {0x0E24}}}},
  1079 
  1080 	{ 3, {0x0E19, 0x0E4A, 0x0E38},		{{0, 2, 2, {0x0E19, 0xF70C}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E38}}}},
  1081 	{ 3, {0x0E19, 0x0E4B, 0x0E39}, 	 	{{0, 2, 2, {0x0E19, 0xF70D}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E39}}}},
  1082 	{ 3, {0x0E19, 0x0E48, 0x0E3A}, 	 	{{0, 2, 2, {0x0E19, 0xF70A}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E3A}}}},
  1083 	{ 3, {0x0E19, 0x0E49, 0x0E49}, 	 	{{0, 2, 2, {0x0E19, 0xF70B}},			{2, 3, 2, {KUnicodeDottedCircle, 0xF70B}}}},
  1084 	{ 3, {0x0E19, 0x0E4A, 0x0E4C}, 	 	{{0, 2, 2, {0x0E19, 0xF70C}},			{2, 3, 2, {KUnicodeDottedCircle, 0xF70E}}}},
  1085 	{ 3, {0x0E19, 0x0E4B, 0x0E47}, 	 	{{0, 2, 2, {0x0E19, 0xF70D}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E47}}}},
  1086 	{ 3, {0x0E19, 0x0E48, 0x0E4E}, 	 	{{0, 2, 2, {0x0E19, 0xF70A}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E4E}}}},
  1087 	{ 3, {0x0E19, 0x0E49, 0x0E34}, 	 	{{0, 2, 2, {0x0E19, 0xF70B}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E34}}}},
  1088 	{ 3, {0x0E19, 0x0E4A, 0x0E31}, 	 	{{0, 2, 2, {0x0E19, 0xF70C}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E31}}}},
  1089 	{ 3, {0x0E19, 0x0E4B, 0x0E37}, 	 	{{0, 2, 2, {0x0E19, 0xF70D}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E37}}}},
  1090 
  1091 //160.TEST D12 - Thai NO NU & Above Diacritic 1
  1092 	{ 3, {0x0E19, 0x0E4C, 0x0E3F}, 	 	{{0, 2, 2, {0x0E19, 0xF70E}},			{2, 3, 1, {0x0E3F}}}},
  1093 	{ 3, {0x0E19, 0x0E4D, 0x0E03}, 	 	{{0, 2, 2, {0x0E19, 0x0E4D}},			{2, 3, 1, {0x0E03}}}},
  1094 	{ 3, {0x0E19, 0x0E4C, 0x0E40}, 	 	{{0, 2, 2, {0x0E19, 0xF70E}},			{2, 3, 1, {0x0E40}}}},
  1095 	{ 3, {0x0E19, 0x0E4D, 0x0E30}, 	 	{{0, 2, 2, {0x0E19, 0x0E4D}},			{2, 3, 1, {0x0E30}}}},
  1096 	{ 3, {0x0E19, 0x0E4C, 0x0E45}, 	 	{{0, 2, 2, {0x0E19, 0xF70E}},			{2, 3, 1, {0x0E45}}}},
  1097 	{ 3, {0x0E19, 0x0E4D, 0x0E24}, 	 	{{0, 2, 2, {0x0E19, 0x0E4D}},			{2, 3, 1, {0x0E24}}}},
  1098 
  1099 	{ 3, {0x0E19, 0x0E4C, 0x0E38},		{{0, 2, 2, {0x0E19, 0xF70E}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E38}}}},
  1100 	{ 3, {0x0E19, 0x0E4D, 0x0E39}, 	 	{{0, 2, 2, {0x0E19, 0x0E4D}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E39}}}},
  1101 	{ 3, {0x0E19, 0x0E4C, 0x0E3A}, 	 	{{0, 2, 2, {0x0E19, 0xF70E}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E3A}}}},
  1102 	{ 3, {0x0E19, 0x0E4D, 0x0E49}, 	 	{{0, 2, 2, {0x0E19, 0x0E4D}},			{2, 3, 2, {KUnicodeDottedCircle, 0xF70B}}}},
  1103 	{ 3, {0x0E19, 0x0E4C, 0x0E4C}, 	 	{{0, 2, 2, {0x0E19, 0xF70E}},			{2, 3, 2, {KUnicodeDottedCircle, 0xF70E}}}},
  1104 	{ 3, {0x0E19, 0x0E4D, 0x0E47}, 	 	{{0, 2, 2, {0x0E19, 0x0E4D}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E47}}}},
  1105 	{ 3, {0x0E19, 0x0E4C, 0x0E4E}, 	 	{{0, 2, 2, {0x0E19, 0xF70E}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E4E}}}},
  1106 	{ 3, {0x0E19, 0x0E4D, 0x0E34}, 	 	{{0, 2, 2, {0x0E19, 0x0E4D}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E34}}}},
  1107 	{ 3, {0x0E19, 0x0E4C, 0x0E31}, 	 	{{0, 2, 2, {0x0E19, 0xF70E}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E31}}}},
  1108 	{ 3, {0x0E19, 0x0E4D, 0x0E37}, 	 	{{0, 2, 2, {0x0E19, 0x0E4D}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E37}}}},
  1109 
  1110 //176.TEST D13 - Thai NO NU & Above Diacritic 2
  1111 	{ 3, {0x0E19, 0x0E47, 0x0E3F}, 	 	{{0, 2, 2, {0x0E19, 0x0E47}},			{2, 3, 1, {0x0E3F}}}},
  1112 	{ 3, {0x0E19, 0x0E47, 0x0E03}, 	 	{{0, 2, 2, {0x0E19, 0x0E47}},			{2, 3, 1, {0x0E03}}}},
  1113 	{ 3, {0x0E19, 0x0E47, 0x0E40}, 	 	{{0, 2, 2, {0x0E19, 0x0E47}},			{2, 3, 1, {0x0E40}}}},
  1114 	{ 3, {0x0E19, 0x0E47, 0x0E30}, 	 	{{0, 2, 2, {0x0E19, 0x0E47}},			{2, 3, 1, {0x0E30}}}},
  1115 	{ 3, {0x0E19, 0x0E47, 0x0E45}, 	 	{{0, 2, 2, {0x0E19, 0x0E47}},			{2, 3, 1, {0x0E45}}}},
  1116 	{ 3, {0x0E19, 0x0E47, 0x0E24}, 	 	{{0, 2, 2, {0x0E19, 0x0E47}},			{2, 3, 1, {0x0E24}}}},
  1117 
  1118 	{ 3, {0x0E19, 0x0E47, 0x0E38},		{{0, 2, 2, {0x0E19, 0x0E47}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E38}}}},
  1119 	{ 3, {0x0E19, 0x0E47, 0x0E39}, 	 	{{0, 2, 2, {0x0E19, 0x0E47}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E39}}}},
  1120 	{ 3, {0x0E19, 0x0E47, 0x0E3A}, 	 	{{0, 2, 2, {0x0E19, 0x0E47}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E3A}}}},
  1121 	{ 3, {0x0E19, 0x0E47, 0x0E49}, 	 	{{0, 2, 2, {0x0E19, 0x0E47}},			{2, 3, 2, {KUnicodeDottedCircle, 0xF70B}}}},
  1122 	{ 3, {0x0E19, 0x0E47, 0x0E4C}, 	 	{{0, 2, 2, {0x0E19, 0x0E47}},			{2, 3, 2, {KUnicodeDottedCircle, 0xF70E}}}},
  1123 	{ 3, {0x0E19, 0x0E47, 0x0E47}, 	 	{{0, 2, 2, {0x0E19, 0x0E47}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E47}}}},
  1124 	{ 3, {0x0E19, 0x0E47, 0x0E4E}, 	 	{{0, 2, 2, {0x0E19, 0x0E47}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E4E}}}},
  1125 	{ 3, {0x0E19, 0x0E47, 0x0E34}, 	 	{{0, 2, 2, {0x0E19, 0x0E47}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E34}}}},
  1126 	{ 3, {0x0E19, 0x0E47, 0x0E31}, 	 	{{0, 2, 2, {0x0E19, 0x0E47}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E31}}}},
  1127 	{ 3, {0x0E19, 0x0E47, 0x0E37}, 	 	{{0, 2, 2, {0x0E19, 0x0E47}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E37}}}},
  1128 
  1129 //176.TEST D14 - Thai NO NU & Above Diacritic 3
  1130 	{ 3, {0x0E19, 0x0E4E, 0x0E3F}, 	 	{{0, 2, 2, {0x0E19, 0x0E4E}},			{2, 3, 1, {0x0E3F}}}},
  1131 	{ 3, {0x0E19, 0x0E4E, 0x0E03}, 	 	{{0, 2, 2, {0x0E19, 0x0E4E}},			{2, 3, 1, {0x0E03}}}},
  1132 	{ 3, {0x0E19, 0x0E4E, 0x0E40}, 	 	{{0, 2, 2, {0x0E19, 0x0E4E}},			{2, 3, 1, {0x0E40}}}},
  1133 	{ 3, {0x0E19, 0x0E4E, 0x0E30}, 	 	{{0, 2, 2, {0x0E19, 0x0E4E}},			{2, 3, 1, {0x0E30}}}},
  1134 	{ 3, {0x0E19, 0x0E4E, 0x0E45}, 	 	{{0, 2, 2, {0x0E19, 0x0E4E}},			{2, 3, 1, {0x0E45}}}},
  1135 	{ 3, {0x0E19, 0x0E4E, 0x0E24}, 	 	{{0, 2, 2, {0x0E19, 0x0E4E}},			{2, 3, 1, {0x0E24}}}},
  1136 
  1137 	{ 3, {0x0E19, 0x0E4E, 0x0E38},		{{0, 2, 2, {0x0E19, 0x0E4E}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E38}}}},
  1138 	{ 3, {0x0E19, 0x0E4E, 0x0E39}, 	 	{{0, 2, 2, {0x0E19, 0x0E4E}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E39}}}},
  1139 	{ 3, {0x0E19, 0x0E4E, 0x0E3A}, 	 	{{0, 2, 2, {0x0E19, 0x0E4E}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E3A}}}},
  1140 	{ 3, {0x0E19, 0x0E4E, 0x0E49}, 	 	{{0, 2, 2, {0x0E19, 0x0E4E}},			{2, 3, 2, {KUnicodeDottedCircle, 0xF70B}}}},
  1141 	{ 3, {0x0E19, 0x0E4E, 0x0E4C}, 	 	{{0, 2, 2, {0x0E19, 0x0E4E}},			{2, 3, 2, {KUnicodeDottedCircle, 0xF70E}}}},
  1142 	{ 3, {0x0E19, 0x0E4E, 0x0E47}, 	 	{{0, 2, 2, {0x0E19, 0x0E4E}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E47}}}},
  1143 	{ 3, {0x0E19, 0x0E4E, 0x0E4E}, 	 	{{0, 2, 2, {0x0E19, 0x0E4E}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E4E}}}},
  1144 	{ 3, {0x0E19, 0x0E4E, 0x0E34}, 	 	{{0, 2, 2, {0x0E19, 0x0E4E}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E34}}}},
  1145 	{ 3, {0x0E19, 0x0E4E, 0x0E31}, 	 	{{0, 2, 2, {0x0E19, 0x0E4E}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E31}}}},
  1146 	{ 3, {0x0E19, 0x0E4E, 0x0E37}, 	 	{{0, 2, 2, {0x0E19, 0x0E4E}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E37}}}},
  1147 
  1148 //192.TEST D15 - Thai NO NU & Above Vowel 1
  1149 	{ 3, {0x0E19, 0x0E34, 0x0E3F}, 	 	{{0, 2, 2, {0x0E19, 0x0E34}},			{2, 3, 1, {0x0E3F}}}},
  1150 	{ 3, {0x0E19, 0x0E34, 0x0E03}, 	 	{{0, 2, 2, {0x0E19, 0x0E34}},			{2, 3, 1, {0x0E03}}}},
  1151 	{ 3, {0x0E19, 0x0E34, 0x0E40}, 	 	{{0, 2, 2, {0x0E19, 0x0E34}},			{2, 3, 1, {0x0E40}}}},
  1152 	{ 3, {0x0E19, 0x0E34, 0x0E30}, 	 	{{0, 2, 2, {0x0E19, 0x0E34}},			{2, 3, 1, {0x0E30}}}},
  1153 	{ 3, {0x0E19, 0x0E34, 0x0E45}, 	 	{{0, 2, 2, {0x0E19, 0x0E34}},			{2, 3, 1, {0x0E45}}}},
  1154 	{ 3, {0x0E19, 0x0E34, 0x0E24}, 	 	{{0, 2, 2, {0x0E19, 0x0E34}},			{2, 3, 1, {0x0E24}}}},
  1155 
  1156 	{ 3, {0x0E19, 0x0E34, 0x0E38},		{{0, 2, 2, {0x0E19, 0x0E34}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E38}}}},
  1157 	{ 3, {0x0E19, 0x0E34, 0x0E39}, 	 	{{0, 2, 2, {0x0E19, 0x0E34}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E39}}}},
  1158 	{ 3, {0x0E19, 0x0E34, 0x0E3A}, 	 	{{0, 2, 2, {0x0E19, 0x0E34}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E3A}}}},
  1159 	{ 3, {0x0E19, 0x0E34, 0x0E49}, 	 	{{0, 3, 3, {0x0E19, 0x0E34, 0x0E49}},	{-1, -1, 0, {0}}}},
  1160 	{ 3, {0x0E19, 0x0E34, 0x0E4C}, 	 	{{0, 3, 3, {0x0E19, 0x0E34, 0x0E4C}},	{-1, -1, 0, {0}}}},
  1161 	{ 3, {0x0E19, 0x0E34, 0x0E47}, 	 	{{0, 2, 2, {0x0E19, 0x0E34}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E47}}}},
  1162 	{ 3, {0x0E19, 0x0E34, 0x0E4E}, 	 	{{0, 2, 2, {0x0E19, 0x0E34}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E4E}}}},
  1163 	{ 3, {0x0E19, 0x0E34, 0x0E34}, 	 	{{0, 2, 2, {0x0E19, 0x0E34}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E34}}}},
  1164 	{ 3, {0x0E19, 0x0E34, 0x0E31}, 	 	{{0, 2, 2, {0x0E19, 0x0E34}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E31}}}},
  1165 	{ 3, {0x0E19, 0x0E34, 0x0E37}, 	 	{{0, 2, 2, {0x0E19, 0x0E34}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E37}}}},
  1166 
  1167 //208.TEST D16 - Thai NO NU & Above Vowel 2
  1168 	{ 3, {0x0E19, 0x0E31, 0x0E3F}, 	 	{{0, 2, 2, {0x0E19, 0x0E31}},			{2, 3, 1, {0x0E3F}}}},
  1169 	{ 3, {0x0E19, 0x0E36, 0x0E03}, 	 	{{0, 2, 2, {0x0E19, 0x0E36}},			{2, 3, 1, {0x0E03}}}},
  1170 	{ 3, {0x0E19, 0x0E31, 0x0E40}, 	 	{{0, 2, 2, {0x0E19, 0x0E31}},			{2, 3, 1, {0x0E40}}}},
  1171 	{ 3, {0x0E19, 0x0E36, 0x0E30}, 	 	{{0, 2, 2, {0x0E19, 0x0E36}},			{2, 3, 1, {0x0E30}}}},
  1172 	{ 3, {0x0E19, 0x0E31, 0x0E45}, 	 	{{0, 2, 2, {0x0E19, 0x0E31}},			{2, 3, 1, {0x0E45}}}},
  1173 	{ 3, {0x0E19, 0x0E36, 0x0E24}, 	 	{{0, 2, 2, {0x0E19, 0x0E36}},			{2, 3, 1, {0x0E24}}}},
  1174 
  1175 	{ 3, {0x0E19, 0x0E31, 0x0E38},		{{0, 2, 2, {0x0E19, 0x0E31}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E38}}}},
  1176 	{ 3, {0x0E19, 0x0E36, 0x0E39}, 	 	{{0, 2, 2, {0x0E19, 0x0E36}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E39}}}},
  1177 	{ 3, {0x0E19, 0x0E31, 0x0E3A}, 	 	{{0, 2, 2, {0x0E19, 0x0E31}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E3A}}}},
  1178 	{ 3, {0x0E19, 0x0E36, 0x0E49}, 	 	{{0, 3, 3, {0x0E19, 0x0E36, 0x0E49}},	{-1, -1, 0, {0}}}},
  1179 	{ 3, {0x0E19, 0x0E31, 0x0E4C}, 	 	{{0, 2, 2, {0x0E19, 0x0E31}},			{2, 3, 2, {KUnicodeDottedCircle, 0xF70E}}}},
  1180 	{ 3, {0x0E19, 0x0E36, 0x0E47}, 	 	{{0, 2, 2, {0x0E19, 0x0E36}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E47}}}},
  1181 	{ 3, {0x0E19, 0x0E31, 0x0E4E}, 	 	{{0, 2, 2, {0x0E19, 0x0E31}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E4E}}}},
  1182 	{ 3, {0x0E19, 0x0E36, 0x0E34}, 	 	{{0, 2, 2, {0x0E19, 0x0E36}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E34}}}},
  1183 	{ 3, {0x0E19, 0x0E31, 0x0E31}, 	 	{{0, 2, 2, {0x0E19, 0x0E31}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E31}}}},
  1184 	{ 3, {0x0E19, 0x0E36, 0x0E37}, 	 	{{0, 2, 2, {0x0E19, 0x0E36}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E37}}}},
  1185 
  1186 //240.TEST D17 - Thai NO NU & Above Vowel 3
  1187 	{ 3, {0x0E19, 0x0E35, 0x0E3F}, 	 	{{0, 2, 2, {0x0E19, 0x0E35}},			{2, 3, 1, {0x0E3F}}}},
  1188 	{ 3, {0x0E19, 0x0E37, 0x0E03}, 	 	{{0, 2, 2, {0x0E19, 0x0E37}},			{2, 3, 1, {0x0E03}}}},
  1189 	{ 3, {0x0E19, 0x0E35, 0x0E40}, 	 	{{0, 2, 2, {0x0E19, 0x0E35}},			{2, 3, 1, {0x0E40}}}},
  1190 	{ 3, {0x0E19, 0x0E37, 0x0E30}, 	 	{{0, 2, 2, {0x0E19, 0x0E37}},			{2, 3, 1, {0x0E30}}}},
  1191 	{ 3, {0x0E19, 0x0E35, 0x0E45}, 	 	{{0, 2, 2, {0x0E19, 0x0E35}},			{2, 3, 1, {0x0E45}}}},
  1192 	{ 3, {0x0E19, 0x0E37, 0x0E24}, 	 	{{0, 2, 2, {0x0E19, 0x0E37}},			{2, 3, 1, {0x0E24}}}},
  1193 
  1194 	{ 3, {0x0E19, 0x0E35, 0x0E38},		{{0, 2, 2, {0x0E19, 0x0E35}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E38}}}},
  1195 	{ 3, {0x0E19, 0x0E37, 0x0E39}, 	 	{{0, 2, 2, {0x0E19, 0x0E37}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E39}}}},
  1196 	{ 3, {0x0E19, 0x0E35, 0x0E3A}, 	 	{{0, 2, 2, {0x0E19, 0x0E35}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E3A}}}},
  1197 	{ 3, {0x0E19, 0x0E37, 0x0E49}, 	 	{{0, 3, 3, {0x0E19, 0x0E37, 0x0E49}},	{-1, -1, 0, {0}}}},
  1198 	{ 3, {0x0E19, 0x0E35, 0x0E4C}, 	 	{{0, 2, 2, {0x0E19, 0x0E35}},			{2, 3, 2, {KUnicodeDottedCircle, 0xF70E}}}},
  1199 	{ 3, {0x0E19, 0x0E37, 0x0E47},		{{0, 2, 2, {0x0E19, 0x0E37}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E47}}}},
  1200 	{ 3, {0x0E19, 0x0E35, 0x0E4E}, 	 	{{0, 2, 2, {0x0E19, 0x0E35}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E4E}}}},
  1201 	{ 3, {0x0E19, 0x0E37, 0x0E34}, 	 	{{0, 2, 2, {0x0E19, 0x0E37}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E34}}}},
  1202 	{ 3, {0x0E19, 0x0E35, 0x0E31}, 	 	{{0, 2, 2, {0x0E19, 0x0E35}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E31}}}},
  1203 	{ 3, {0x0E19, 0x0E37, 0x0E37}, 	 	{{0, 2, 2, {0x0E19, 0x0E37}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E37}}}},
  1204 
  1205 //256.TEST D18a - Test Thai combining marks stack over a dotted circle.
  1206 	{ 2, {0x0E36, 0x0E48}, 	 			{{0, 2, 3, {KUnicodeDottedCircle, 0x0E36, 0x0E48}},	{-1, -1, 0, {0}}}},
  1207 
  1208 //257.TEST D18b - Test non-thai consonant preceding two tone/signs in a row
  1209 	{ 2, {0x0041, 0x0E48, 0x0E49},		{{1, 2, 2, {KUnicodeDottedCircle, 0xF70A}},	{2, 3, 2, {KUnicodeDottedCircle, 0xF70B}}}},
  1210 
  1211 //258. TEST DEF038524 - Test WTT2.0 Rare 4 optional combinations 0xBE, 0xDE, 0xE7, 0xF7
  1212 //3 Not supported, but render should degrade display to not overstrike at a minimum. 1 is supported.
  1213 	{ 3, {0x0E01, 0x0E35, 0x0E47},		{{0, 2, 2, {0x0E01, 0x0E35}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E47}}}},
  1214 	{ 3, {0x0E01, 0x0E37, 0x0E47},		{{0, 2, 2, {0x0E01, 0x0E37}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E47}}}},
  1215 	{ 3, {0x0E01, 0x0E38, 0x0E4D},		{{0, 3, 3, {0x0E01, 0x0E38, 0x0E4D}},	{-1, -1, 0, {0}}}},
  1216 	{ 3, {0x0E01, 0x0E34, 0x0E4D},		{{0, 2, 2, {0x0E01, 0x0E34}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E4D}}}},
  1217 
  1218 //246.TABLE END
  1219 	{ -1, {0}, 	 				{{-1, -1, 0, {0}},				{-1, -1, 0, {0}}}}
  1220 	};
  1221 
  1222 
  1223 //
  1224 // --- CLASS CTGlyphSelection --------------------------------------------
  1225 //
  1226 
  1227 
  1228 CTGlyphSelection::CTGlyphSelection(CTestStep* aStep) :
  1229 	CTGraphicsBase(aStep),
  1230 	iTestFont(NULL),
  1231 	iTestGraphicsDevice(NULL),
  1232 	iTestGraphicsContext(NULL)
  1233 	{
  1234 	}
  1235 
  1236 
  1237 CTGlyphSelection::~CTGlyphSelection()
  1238 /**
  1239  This method cleans up after testing is finished. It releases memory
  1240  allocated by the test obejct at a point before object destruction.
  1241 */
  1242 	{
  1243 	delete iTestGraphicsContext;
  1244 	delete iTestGraphicsDevice;
  1245 	delete iTestFont;
  1246 	iFs.Close();
  1247 	}
  1248 
  1249 void CTGlyphSelection::ConstructL()
  1250 	{
  1251 	CreateTestGraphicsContextL();
  1252 	User::LeaveIfError(iFs.Connect());
  1253 	}
  1254 
  1255 void CTGlyphSelection::CreateTestGraphicsContextL()
  1256 /**
  1257  This method sets-up the context data for the proceeding test cases.
  1258 */
  1259 	{
  1260 	// Setup 400 pixel dummy graphics test device.
  1261 	TSize windowSize(400, 400);
  1262 	iTestGraphicsDevice = CTestGraphicsDevice::NewL(windowSize);
  1263 
  1264 	// Create a dummy graphics test context.
  1265 	CGraphicsContext* tContext = NULL;	
  1266 	TEST(iTestGraphicsDevice->CreateContext(tContext) == KErrNone);
  1267 	iTestGraphicsContext = static_cast<CTestGraphicsContext*>(tContext);
  1268 
  1269 	// Allocate the dummy test font to be used.
  1270 	iTestFont = new (ELeave) CTestFont;
  1271 	}
  1272 
  1273 
  1274 LOCAL_C TInt TestApiBoundaries_TC2(TAny* aData)
  1275 /**
  1276  This is a root thread function which runs as part of the test case
  1277  CTGlyphSelection::TestApiBoundaries(). It tests a panic
  1278  is produced when an invalid text descriptor is supplied in the
  1279  TPositionParam argument.
  1280 */
  1281 	{
  1282 	CTGlyphSelection* testPtr = (CTGlyphSelection*)aData;
  1283 
  1284 	CFont::TPositionParam param;
  1285 	param.iDirection = CFont::EHorizontal;
  1286 	param.iFlags = CFont::TPositionParam::EFLogicalOrder;
  1287 	param.iPosInText = 0;
  1288 	param.iPen.iX = param.iPen.iY = 0;
  1289 
  1290 	testPtr->iTestFont->GetCharacterPosition(param);
  1291 
  1292 	// Line above panics if component in UDEB is working OK; 
  1293 	// should never get here if component is in UDEB.
  1294 
  1295 	// If component is in UREL, then could reach here.
  1296 	
  1297 	return (0);
  1298 	}
  1299 
  1300 
  1301 LOCAL_C TInt TestApiBoundaries_TC5(TAny* aData)
  1302 /**
  1303  This is a root thread function which runs as part of the test case
  1304  CTGlyphSelection::TestApiBoundaries(). It tests a panic
  1305  is produced when a negative text position is supplied in the
  1306  TPositionParam argument.
  1307 */
  1308 	{
  1309 	CTGlyphSelection* testPtr = (CTGlyphSelection*)aData;
  1310 
  1311 	CFont::TPositionParam param;
  1312 	param.iDirection = CFont::EHorizontal;
  1313 	param.iFlags = CFont::TPositionParam::EFLogicalOrder;
  1314 	_LIT16(KText_aaaa, "aaaa");
  1315 	param.iText.Set(KText_aaaa);
  1316 	param.iPosInText = -10;
  1317 	param.iPen.iX = param.iPen.iY = 0;
  1318 
  1319 	testPtr->iTestFont->GetCharacterPosition(param);
  1320 
  1321 	// Line above panics if component in UDEB is working OK; 
  1322 	// should never get here if component is in UDEB.
  1323 
  1324 	// If component is in UREL, then could reach here.
  1325 
  1326 	return (0);
  1327 	}
  1328 
  1329 
  1330 void CTGlyphSelection::TestApiBoundaries()
  1331 /**
  1332  This method is a test case to exercise GetCharacterPosition() with
  1333  parameter values at range boundaries and in some cases out-or-raange.
  1334 */
  1335 	{
  1336 	TBool r;
  1337 	TBuf<20> testText(0);
  1338 
  1339 	CFont::TPositionParam param;
  1340 	param.iDirection = CFont::EHorizontal;
  1341 	param.iFlags = CFont::TPositionParam::EFLogicalOrder;
  1342 
  1343 	// 1: Check input arguments in paramter not modified
  1344 	testText = _L16("a");
  1345 	param.iText.Set(testText);
  1346 	param.iPosInText = 0;
  1347 	param.iPen.iX = param.iPen.iY = 0;
  1348 	r = iTestFont->GetCharacterPosition(param);
  1349 	TEST(r && param.iDirection == CFont::EHorizontal
  1350 		   && param.iFlags == CFont::TPositionParam::EFLogicalOrder
  1351 		   && param.iText.Ptr() == testText.Ptr());
  1352 
  1353 	// 2: Check invalid iText descriptor panics (when component in UDEB)
  1354 	//    When component built in UREL, behaviour is undefined, so do not test.
  1355 	TRequestStatus threadStatus;
  1356 	RThread thread;
  1357 	TInt rc;
  1358 	TBool jit;
  1359 	jit = User::JustInTime();
  1360 	User::SetJustInTime(EFalse);
  1361 	rc = thread.Create(KThread2NameFirst, TestApiBoundaries_TC2, 
  1362 		KDefaultStackSize, KMinHeapSize, KMinHeapSize*4, this);
  1363 	TEST(KErrNone == rc);
  1364 	thread.Logon(threadStatus);
  1365 	thread.Resume();
  1366 	User::WaitForRequest(threadStatus);
  1367 	
  1368 	if (thread.ExitType() == EExitPanic)
  1369 		{
  1370 		TEST (thread.ExitReason() == EGdiPanic_InvalidInputParam);
  1371 		INFO_PRINTF2(_L("Exit reason %d"), thread.ExitReason());
  1372 		TExitCategoryName exitCategory = thread.ExitCategory();
  1373 		INFO_PRINTF2(_L("Exit category %S"), &exitCategory);			
  1374 		}
  1375 	else
  1376 		{
  1377 		// Function does not panic on invalid input; 
  1378 		// Warn that this is only valid behaviour if the GDI component being tested is built in UREL mode
  1379 		// and there is a problem if the function has not panicked if the GDI component is build in UDEB mode
  1380 		INFO_PRINTF1(_L("Warning: GetCharacterPosition() when given invalid iText descriptor has not panicked - this is only ok if the GDI component is built in UREL mode. If the GDI component is built in UDEB mode, then there is a problem."));
  1381 		}	
  1382 	thread.Close();
  1383 	User::SetJustInTime(jit);
  1384 
  1385 	// 3: Zero length text descriptor
  1386 	testText = _L("");
  1387 	param.iText.Set(testText);
  1388 	param.iPosInText = 0;
  1389 	param.iPen.iX = param.iPen.iY = 0;
  1390 	r = iTestFont->GetCharacterPosition(param);
  1391 	TEST(!r && param.iPen.iX == 0 
  1392 		    && param.iOutputGlyphs == 0);
  1393 
  1394 	// 4: Position in text beyond descriptor length
  1395 	testText = _L16("a");
  1396 	param.iText.Set(testText);
  1397 	param.iPosInText = 5;
  1398 	param.iPen.iX = param.iPen.iY = 0;
  1399 	r = iTestFont->GetCharacterPosition(param);
  1400 	TEST(!r && param.iPen.iX == 0 
  1401 		   && param.iOutputGlyphs == 0);
  1402 
  1403 	// 5: Position in text is negative, should panic (when component in UDEB)
  1404 	//    When component built in UREL, behaviour is undefined, so do not test.
  1405 	jit = User::JustInTime();
  1406 	User::SetJustInTime(EFalse);
  1407 	rc = thread.Create(KThread2NameSecond, TestApiBoundaries_TC5, 
  1408 		KDefaultStackSize, KMinHeapSize, KMinHeapSize*4, this);
  1409 	TEST(KErrNone == rc);
  1410 	thread.Logon(threadStatus);
  1411 	thread.Resume();
  1412 	User::WaitForRequest(threadStatus);
  1413 
  1414 	if (thread.ExitType() == EExitPanic)
  1415 		{
  1416 		TEST (thread.ExitReason() == EGdiPanic_InvalidInputParam);
  1417 		INFO_PRINTF2(_L("Exit reason %d"), thread.ExitReason());
  1418 		TExitCategoryName exitCategory = thread.ExitCategory();
  1419 		INFO_PRINTF2(_L("Exit category %S"), &exitCategory);			
  1420 		}
  1421 	else
  1422 		{
  1423 		// Function does not panic on invalid input; 
  1424 		// Warn that this is only valid behaviour if the GDI component being tested is built in UREL mode
  1425 		// and there is a problem if the function has not panicked if the GDI component is build in UDEB mode
  1426 		INFO_PRINTF1(_L("Warning: GetCharacterPosition() when given negative iPosInText has not panicked - this is only ok if the GDI component is built in UREL mode. If the GDI component is built in UDEB mode, then there is a problem."));
  1427 		}	
  1428 
  1429 	thread.Close();
  1430 	User::SetJustInTime(jit);
  1431 
  1432 	// 6: Check 'No-char-data' condition handled
  1433 	testText = _L16("A\033C");
  1434 	param.iText.Set(testText);
  1435 	param.iPosInText = 1;
  1436 	param.iPen.iX = param.iPen.iY = 0;
  1437 	r = iTestFont->GetCharacterPosition(param);
  1438 	TEST( !r
  1439 		   && param.iPosInText == 2
  1440 		   && param.iPen.iX == 0 
  1441 		   && param.iOutputGlyphs == 0);
  1442 
  1443 	// 7: Check "Not-a-Char" condition handled
  1444 	testText = _L16("\xFFFF\xFFFE\xFFFF\xFFFF\xFFFF\xFFFE\xFFFF\xFFFF\xFFFF\xFFFE\xFFFF\xFFFF");
  1445 	param.iText.Set(testText);
  1446 	param.iPosInText = 0;
  1447 	param.iPen.iX = param.iPen.iY = 0;
  1448 	r = iTestFont->GetCharacterPosition(param);
  1449 	TEST(  r
  1450 		   && param.iPosInText == 1
  1451 		   && param.iPen.iX == 0 
  1452 		   && param.iOutputGlyphs == 0);
  1453 
  1454 	param.iPosInText = 5;
  1455 	param.iPen.iX = param.iPen.iY = 0;
  1456 	r = iTestFont->GetCharacterPosition(param);
  1457 	TEST(  r
  1458 		   && param.iPosInText == 6
  1459 		   && param.iPen.iX == 0 
  1460 		   && param.iOutputGlyphs == 0);
  1461 
  1462 	// 8. Check that a cluster cannot be made from heterogeneous elements
  1463 	// (in this case a 6 with a Hindi virama)
  1464 	testText = _L16("6\x94D");
  1465 	param.iText.Set(testText);
  1466 	param.iPosInText = 0;
  1467 	param.iPen.iX = param.iPen.iY = 0;
  1468 	r = iTestFont->GetCharacterPosition(param);
  1469 	TEST(r && param.iOutputGlyphs == 1);
  1470 	}
  1471 
  1472 inline TBool IsSupplementary(TUint aChar)
  1473 /**
  1474 @param aChar The 32-bit code point value of a Unicode character.
  1475 
  1476 @return True, if aChar is supplementary character; false, otherwise.
  1477 */
  1478 	{
  1479 	return (aChar > 0xFFFF);
  1480 	}
  1481 
  1482 inline TBool IsSurrogate(TText16 aInt16)
  1483 /**
  1484 @return True, if aText16 is high surrogate or low surrogate; false, otherwise.
  1485 */
  1486 	{
  1487 	return (aInt16 & 0xF800) == 0xD800;
  1488 	}
  1489 
  1490 inline TText16 GetHighSurrogate(TUint aChar)
  1491 /**
  1492 Retrieve the high surrogate of a supplementary character.
  1493 
  1494 @param aChar The 32-bit code point value of a Unicode character.
  1495 
  1496 @return High surrogate of aChar, if aChar is a supplementary character; 
  1497         aChar itself, if aChar is not a supplementary character.
  1498 */
  1499 	{
  1500 	return STATIC_CAST(TText16, 0xD7C0 + (aChar >> 10));
  1501 	}
  1502 
  1503 inline TText16 GetLowSurrogate(TUint aChar)
  1504 /**
  1505 Retrieve the low surrogate of a supplementary character.
  1506 
  1507 @param aChar The 32-bit code point value of a Unicode character.
  1508 
  1509 @return Low surrogate of aChar, if aChar is a supplementary character; 
  1510         zero, if aChar is not a supplementary character.
  1511 */
  1512 	{
  1513 	return STATIC_CAST(TText16, 0xDC00 | (aChar & 0x3FF));
  1514 	}
  1515 
  1516 void CTGlyphSelection::TestCodepoint(TUint aCodepoint, CFont* aFont)
  1517 /**
  1518  This helper routine is used by the test case 
  1519  CTGlyphSelection::TestCtrlCharsIgnored().
  1520 @param aCodepoint
  1521  The Unicode character to test.
  1522 @param aFont
  1523  The font to use in the test.
  1524 */
  1525 	{
  1526 	TInt expectResultPosInText;
  1527 
  1528 	const TInt KTestTextLen = 5;
  1529 	TBuf<16> testText(KTestTextLen);
  1530 	testText[0] = 'a';
  1531 	testText[1] = 'b';
  1532 	if (IsSupplementary(aCodepoint))
  1533 		{
  1534 		testText[2] = GetHighSurrogate(aCodepoint);
  1535 		testText[3] = GetLowSurrogate(aCodepoint);
  1536 		expectResultPosInText = 4;
  1537 		}
  1538 	else
  1539 		{
  1540 		testText[2] = aCodepoint;
  1541 		testText[3] = 'c';
  1542 		expectResultPosInText = 3;
  1543 		}
  1544 	testText[4] = 'd';
  1545 
  1546 	CFont::TPositionParam param;
  1547 	param.iDirection = CFont::EHorizontal;
  1548 	param.iFlags = CFont::TPositionParam::EFLogicalOrder;
  1549 	param.iText.Set(testText);
  1550 	param.iPen.iX = param.iPen.iY = 0;
  1551 	param.iPosInText = 2; 
  1552 	TBool r = aFont->GetCharacterPosition(param);
  1553 
  1554 	TEST(r && param.iPosInText == expectResultPosInText
  1555 		   && param.iPen.iX == 0 
  1556 		   && param.iOutputGlyphs == 0);
  1557 	}
  1558 
  1559 
  1560 void CTGlyphSelection::TestCtrlCharsIgnored()
  1561 /**
  1562  This method is a test case to test GetCharacterPosition() copes
  1563  with formatting and control characters in the text supplied by
  1564  ignoring them.
  1565 */
  1566 	{
  1567 	static const TUint testData[] = {
  1568 		// 1: Formatting control codes Unicode3-p499&p500
  1569 		0x200C, 0x200D, 0x200E, 0x200F,
  1570 		0x202A, 0x202B, 0x202C, 0x202D, 0x202E,
  1571 		// 3: Non-character codes Unicode3-p846 U+FFFE?
  1572 		// Original:
  1573 		// 0xFFFF 
  1574 		// 4: Latin Ctrl codes U+0000..U+001F, U+007F Unicode3-p???
  1575 		// 5: Latin Supplement Ctrl code U+0080..U+009F Unicode3-p???
  1576 		// 6: Supplementary characters (scripts outside BMP still not supported)
  1577 		};
  1578 	static const TUint testDataLength = sizeof(testData)/sizeof(testData[0]);
  1579 
  1580 	for (TUint i = 0; i < testDataLength; i++)
  1581 		TestCodepoint(testData[i], iTestFont);
  1582 	}
  1583 
  1584 
  1585 void CTGlyphSelection::TestLatinChars()
  1586 /**
  1587  This method is a test case to test GetCharacterPosition() correctly
  1588  processes characters from the Latin code page returning appropriate glyphs
  1589  codes.
  1590 */
  1591 	{
  1592 	TBool r;
  1593 	CFont::TPositionParam param;
  1594 	param.iDirection = CFont::EHorizontal;
  1595 	param.iFlags = CFont::TPositionParam::EFLogicalOrder;
  1596 	_LIT16(KText_aBc_1, "aBc 1");
  1597 	param.iText.Set(KText_aBc_1);
  1598 
  1599 	// 1: Latin glyph at start of text
  1600 	param.iPosInText = 0;
  1601 	param.iPen.iX = param.iPen.iY = 0;
  1602 	r = iTestFont->GetCharacterPosition(param);
  1603 	TEST(r && param.iPosInText == 1 
  1604 		   && param.iPen.iX == 10
  1605 		   && param.iOutputGlyphs == 1 
  1606 		   && param.iOutput[0].iCode == 'a');
  1607 
  1608 	// 2: Latin glyph in middle of text
  1609 	param.iPosInText = 1;
  1610 	param.iPen.iX = param.iPen.iY = 0;
  1611 	r = iTestFont->GetCharacterPosition(param);
  1612 	TEST(r && param.iPosInText == 2 
  1613 		   && param.iPen.iX == 10
  1614 		   && param.iOutputGlyphs == 1 
  1615 		   && param.iOutput[0].iCode == 'B');
  1616 
  1617 	// 3: Latin glyph at end of text
  1618 	param.iPosInText = 4;
  1619 	param.iPen.iX = param.iPen.iY = 0;
  1620 	r = iTestFont->GetCharacterPosition(param);
  1621 	TEST(r && param.iPosInText == 5 
  1622 		   && param.iPen.iX == 10
  1623 		   && param.iOutputGlyphs == 1 
  1624 		   && param.iOutput[0].iCode == '1');
  1625 
  1626 	// 4: Latin space glyph 
  1627 	param.iPosInText = 3;
  1628 	param.iPen.iX = param.iPen.iY = 0;
  1629 	r = iTestFont->GetCharacterPosition(param);
  1630 	TEST(r && param.iPosInText == 4 
  1631 		   && param.iPen.iX == 10
  1632 		   && param.iOutputGlyphs == 1 
  1633 		   && param.iOutput[0].iCode == ' ');
  1634 	}	
  1635 
  1636 
  1637 void CTGlyphSelection::TestSoftHyphen()
  1638 /**
  1639  This method is a test case to test GetCharacterPosition() correctly
  1640  processes soft hyphen chars by ignoring them if they are NOT at the
  1641  end of the text (aka end of the line).
  1642 */
  1643 	{
  1644 	TBool r;
  1645 	CFont::TPositionParam param;
  1646 	param.iDirection = CFont::EHorizontal;
  1647 	param.iFlags = CFont::TPositionParam::EFLogicalOrder;
  1648 	_LIT16(KText_DKNY, "DK\xadNY\xad");
  1649 	param.iText.Set(KText_DKNY);
  1650 
  1651 	// 1: Invoke on char before hyphen position 
  1652 	// This test returns only the glyph of the char before the hyphen
  1653 	// treating the hyphen as another base char which end scanning. 
  1654 	param.iPosInText = 1;
  1655 	param.iPen.iX = param.iPen.iY = 0;
  1656 	r = iTestFont->GetCharacterPosition(param);
  1657 	TEST(r && param.iPosInText == 2 
  1658 		   && param.iPen.iX == 10
  1659 		   && param.iOutputGlyphs == 1 
  1660 		   && param.iOutput[0].iCode == 'K');
  1661 
  1662 	// 2: Invoke on hyphen position
  1663 	// This test should show it ignores and skips soft hyphens returning
  1664 	// no hyphen glyph. This is because soft hyphen are not visible when
  1665 	// in middle of lines.
  1666 	param.iPosInText = 2;
  1667 	param.iPen.iX = param.iPen.iY = 0;
  1668 	r = iTestFont->GetCharacterPosition(param);
  1669 	TEST(r && param.iPosInText == 3 
  1670 		   && param.iPen.iX == 0
  1671 		   && param.iOutputGlyphs == 0);
  1672 
  1673 	// 3: Invoke on hyphen position when hyphen at end of text
  1674 	// This test should result in the hyphen glyph being returned as it
  1675 	// is expect to be visible when it is at the end of the text supplied.
  1676 	param.iPosInText = 5;
  1677 	param.iPen.iX = param.iPen.iY = 0;
  1678 	r = iTestFont->GetCharacterPosition(param);
  1679 	TEST(r && param.iPosInText == 6 
  1680 		   && param.iPen.iX == 10
  1681 		   && param.iOutputGlyphs == 1 
  1682 		   && param.iOutput[0].iCode == 0x00AD);
  1683 
  1684 	}	
  1685 
  1686 
  1687 void CTGlyphSelection::TestSurrogates()
  1688 /**
  1689  This method is a test case to test GetCharacterPosition() correctly
  1690  processes surrogate pairs.
  1691 */
  1692 	{
  1693 	static const TUint validPairs[] = {
  1694 	//  Hi		Lo		Code		Hi		Lo		Code		Hi		Lo		Code
  1695 		0xD800, 0xDC00, 0x00010000, 0xD800, 0xDE9A, 0x0001029A, 0xD800, 0xDFFF, 0x000103FF,
  1696 		0xD89A, 0xDC00, 0x00036800, 0xD89A, 0xDE9A, 0x00036A9A, 0xD89A, 0xDFFF, 0x00036BFF,
  1697 		0xDBFF, 0xDC00, 0x0010FC00, 0xDBFF, 0xDE9A, 0x0010FE9A, 0xDBFF, 0xDFFF, 0x0010FFFF
  1698 		};
  1699 	static const TUint validPairsLength = sizeof(validPairs)/sizeof(TText16);
  1700 
  1701 	TBool r;
  1702 	TBuf<20> testText(0);
  1703 	CFont::TPositionParam param;
  1704 	param.iDirection = CFont::EHorizontal;
  1705 	param.iFlags = CFont::TPositionParam::EFLogicalOrder;
  1706 
  1707 	// 1: Test valid surrogate pair chars
  1708 	testText.SetLength(5);
  1709 	testText[0] = 'a';
  1710 	testText[3] = 'D';
  1711 	testText[4] = '1';
  1712 	param.iText.Set(testText);
  1713 	for (TUint i = 0; i < validPairsLength/3; i+=3)
  1714 		{
  1715 		testText[1] = (TText16) validPairs[i];
  1716 		testText[2] = (TText16) validPairs[i+1];
  1717 		param.iPosInText = 1;
  1718 		param.iPen.iX = param.iPen.iY = 0;
  1719 		r = iTestFont->GetCharacterPosition(param);
  1720 		TEST(r && param.iPosInText == 3
  1721 				&& param.iPen.iX == 10
  1722 				&& param.iOutputGlyphs == 1
  1723 				&& param.iOutput[0].iCode == validPairs[i+2]);
  1724 		}
  1725 
  1726 	// 2: Test unpaired high surrogate chars
  1727 	testText[1] = 0xD809;
  1728 	testText[2] = 'a';
  1729 	param.iPosInText = 1;
  1730 	param.iPen.iX = param.iPen.iY = 0;
  1731 	r = iTestFont->GetCharacterPosition(param);
  1732 	TEST(r && param.iPosInText == 2
  1733 		   && param.iPen.iX == 0
  1734 		   && param.iOutputGlyphs == 0);
  1735 
  1736 	// 3: Test unpaired low surrogate chars
  1737 	testText[1] = 'a';
  1738 	testText[2] = 0xDC09;
  1739 	param.iPosInText = 2;
  1740 	param.iPen.iX = param.iPen.iY = 0;
  1741 	r = iTestFont->GetCharacterPosition(param);
  1742 	TEST(r && param.iPosInText == 3
  1743 		   && param.iPen.iX == 0
  1744 		   && param.iOutputGlyphs == 0);
  1745 
  1746 	// 4: Test latin/surrogate boundry ensuring surrogate not skipped!
  1747 	testText[1] = (TText16) validPairs[0];
  1748 	testText[2] = (TText16) validPairs[1];
  1749 	param.iPosInText = 0;
  1750 	param.iPen.iX = param.iPen.iY = 0;
  1751 	r = iTestFont->GetCharacterPosition(param);
  1752 	TEST(r && param.iPosInText == 1
  1753 		   && param.iPen.iX == 10
  1754 		   && param.iOutputGlyphs == 1
  1755 		   && param.iOutput[0].iCode =='a');
  1756 	}
  1757 
  1758 
  1759 /**
  1760 @SYMTestCaseID TI18N-GDI-CIT-4077
  1761 @SYMTestCaseDesc Automated GDI testing for GB18030 ExtB
  1762 @SYMTestPriority High
  1763 @SYMTestActions  Attempt to get glyph information for GB18030 ExtB characters.
  1764 @SYMTestExpectedResults The expected glyph clusters for given Unicode charactors must be returned
  1765 @SYMPREQ 2471: UTF-16 compliant text handling
  1766 */
  1767 void CTGlyphSelection::TestNonBmpCharsInGB18030(CFbsFont* aFont)
  1768 	{
  1769 	INFO_PRINTF1(_L("Test GB18030 non-BMP Glyphs"));	
  1770 	// Do the testing
  1771 	
  1772 	TBool r;
  1773 	TBuf<30> testText(0);
  1774 	CFont::TPositionParam param;
  1775 	param.iDirection = CFont::EHorizontal;
  1776 	param.iFlags = CFont::TPositionParam::EFLogicalOrder;
  1777 
  1778 	testText.SetLength(4);
  1779 	
  1780 	// 201AD = D840, DDAD
  1781 	testText[0] = 0xD840;
  1782 	testText[1] = 0xDDAD;
  1783 	
  1784 	// 253BB = D854, DFBB
  1785 	testText[2] = 0xD854;
  1786 	testText[3] = 0xDFBB;
  1787 		
  1788 	param.iText.Set(testText);
  1789 	
  1790 	RShapeInfo aShapeInfo;
  1791 
  1792 	// Do the testing
  1793 	
  1794 	param.iPosInText = 0;
  1795 	param.iPen.iX = param.iPen.iY = 0;
  1796 	r = aFont->GetCharacterPosition2(param, aShapeInfo);
  1797 
  1798 	TEST(r && param.iPosInText == 2 
  1799 		   && param.iOutputGlyphs == 1
  1800 		   && param.iOutput[0].iCode == 0x000201AD);
  1801 
  1802 	INFO_PRINTF5(_L("The result of this shaping is %d %d %d 0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
  1803 
  1804 	param.iPosInText = 2;
  1805 	param.iPen.iX = param.iPen.iY = 0;
  1806 	r = aFont->GetCharacterPosition2(param, aShapeInfo);
  1807 
  1808 	TEST(r && param.iPosInText == 4 
  1809 		   && param.iOutputGlyphs == 1
  1810 		   && param.iOutput[0].iCode == 0x000253BB);
  1811 
  1812 	
  1813 	INFO_PRINTF5(_L("The result of this shaping is %d %d %d 0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
  1814 	
  1815 	// Close aShapeInfo which releases any memory it is occupying
  1816 	if (aShapeInfo.IsOpen())
  1817 		aShapeInfo.Close();
  1818 		   
  1819 	}
  1820 
  1821 
  1822 void CTGlyphSelection::TestCombiningLatinChars()
  1823 /**
  1824  This method is a test case to test GetCharacterPosition() correctly
  1825  processes regular latin characters with diacritics.
  1826 */
  1827 	{
  1828 	TBool r;
  1829 	TBuf<20> testText(0);
  1830 	CFont::TPositionParam param;
  1831 	param.iDirection = CFont::EHorizontal;
  1832 	param.iFlags = CFont::TPositionParam::EFLogicalOrder;
  1833 
  1834 	testText.SetLength(10);
  1835 	testText[0] = 'A';
  1836 	testText[1] = ' ';
  1837 	testText[2] = 'A';
  1838 	testText[3] = 0x0300; // Above Grave Acent
  1839 	testText[4] = 'I';
  1840 	testText[5] = 0x0330; // Below Tidle 
  1841 	testText[6] = 'o';
  1842 	testText[7] = 0x0308; // Above Diaeresis
  1843 	testText[8] = 0x032F; // Below Inverted Breve
  1844 	testText[9] = 'M';
  1845 	param.iText.Set(testText);
  1846 
  1847 	// 1: Latin base with following space
  1848 	param.iPosInText = 0;
  1849 	param.iPen.iX = param.iPen.iY = 0;
  1850 	r = iTestFont->GetCharacterPosition(param);
  1851 	TEST(r && param.iPosInText == 1 
  1852 		   && param.iPen.iX == 10
  1853 		   && param.iOutputGlyphs == 1
  1854 		   && param.iOutput[0].iCode == 'A');
  1855 
  1856 	// 2: Latin base with 1 combining above diacritic
  1857 	param.iPosInText = 2;
  1858 	param.iPen.iX = param.iPen.iY = 0;
  1859 	r = iTestFont->GetCharacterPosition(param);
  1860 	// Will Compose A (0x41) followed by grave accent (0x300) into A grave (0xC0)
  1861 	TEST(r && param.iPosInText == 4 
  1862 		   && param.iPen.iX == 10
  1863 		   && param.iOutputGlyphs == 1
  1864 		   && param.iOutput[0].iCode == 0xC0
  1865 		   && param.iOutput[0].iBounds.iTl == TPoint(0,-10)
  1866 		   && param.iOutput[0].iBounds.iBr == TPoint(10,2));
  1867 
  1868 	// 3: Latin base with 1 combining below diacritic
  1869 	param.iPosInText = 4;
  1870 	param.iPen.iX = param.iPen.iY = 0;
  1871 	r = iTestFont->GetCharacterPosition(param);
  1872 	// Will compose I (0x49) with tilde below (0x330) into I with tilde below (0x1E2C)
  1873 	TEST(r && param.iPosInText == 6 
  1874 		   && param.iPen.iX == 10
  1875 		   && param.iOutputGlyphs == 1
  1876 		   && param.iOutput[0].iCode == 0x1E2C
  1877 		   && param.iOutput[0].iBounds.iTl == TPoint(0,-10)
  1878 		   && param.iOutput[0].iBounds.iBr == TPoint(10,2));
  1879 
  1880 	// 4: Latin base with 2 combining diacritic
  1881 	param.iPosInText = 6;
  1882 	param.iPen.iX = param.iPen.iY = 0;
  1883 	r = iTestFont->GetCharacterPosition(param);
  1884 	TEST(r && param.iPosInText == 9 
  1885 		   && param.iPen.iX == 10
  1886 		   && param.iOutputGlyphs == 3
  1887 		   && param.iOutput[0].iCode == 'o'
  1888 		   && param.iOutput[0].iBounds.iTl == TPoint(0,-10)
  1889 		   && param.iOutput[0].iBounds.iBr == TPoint(10,2)
  1890 		   && param.iOutput[1].iCode == 0x0308
  1891 		   && param.iOutput[1].iBounds.iTl == TPoint(0,-23)
  1892 		   && param.iOutput[1].iBounds.iBr == TPoint(10,-11)
  1893 		   && param.iOutput[2].iCode == 0x032F
  1894 		   && param.iOutput[2].iBounds.iTl == TPoint(0,3)
  1895 		   && param.iOutput[2].iBounds.iBr == TPoint(10,15));
  1896 
  1897 	// 5: Latin base with 9 combining chars, should exceed max output!
  1898 	testText[0] = 'a';
  1899 	testText[1] = 0x0300; // Above Grave Acent
  1900 	testText[2] = 0x0330; // Below Tidle 
  1901 	testText[3] = 0x0308; // Above Diaeresis
  1902 	testText[4] = 0x032F; // Below Inverted Breve
  1903 	testText[5] = 0x0300; // Above Grave Acent
  1904 	testText[6] = 0x0330; // Below Tidle 
  1905 	testText[7] = 0x0308; // Above Diaeresis
  1906 	testText[8] = 0x032F; // Below Inverted Breve
  1907 	testText[9] = 0x0300; // Above Grave Acent
  1908 	param.iPosInText = 0;
  1909 	param.iPen.iX = param.iPen.iY = 0;
  1910 	r = iTestFont->GetCharacterPosition(param);
  1911 	TEST(r && param.iPosInText == 8 
  1912 		   && param.iPen.iX == 10
  1913 		   && param.iOutputGlyphs == 8
  1914 		   && param.iOutput[0].iCode == 'a'
  1915 		   && param.iOutput[7].iCode == 0x0308);
  1916 	}
  1917 
  1918 /* 
  1919 Used for cleanup of RImplInfoArray implementationArray below 
  1920 This method is stolen from FbsTop.cpp
  1921 */
  1922 
  1923 LOCAL_C void ResetAndDestroyRImplInfoPtrArray(TAny* aPtr)
  1924 	{
  1925 	RImplInfoPtrArray* array = reinterpret_cast <RImplInfoPtrArray*> (aPtr);
  1926 	array->ResetAndDestroy();
  1927 	}
  1928 	
  1929 LOCAL_C void LoadOpenFontLibraries(CFontStore* aFontStore)
  1930 	{
  1931 
  1932 	RImplInfoPtrArray implementationArray;
  1933 	TCleanupItem cleanup(ResetAndDestroyRImplInfoPtrArray, &implementationArray);
  1934 	CleanupStack::PushL(cleanup);
  1935 	TInt error;
  1936 	TInt ecomerror;
  1937 	TInt ecomnotready;
  1938 	TUid uid = {KUidOpenFontRasterizerPlunginInterface};
  1939 
  1940 	// Making sure that no race situation arises
  1941 	// If ECom is not ready, give it another chance and try again. if it still doesn't work 
  1942 	// after the third try, then it just carries on quietly and fails... 
  1943 	for (ecomnotready =0; ecomnotready <3; ecomnotready++)
  1944 		{
  1945 		TRAP(ecomerror,REComSession::ListImplementationsL(uid,implementationArray));
  1946 		if (!ecomerror)
  1947 			{
  1948 			break;
  1949 			}
  1950 		else
  1951 			{
  1952 			ecomerror = 0; 	
  1953 			User::After(0);
  1954 			}
  1955 		}
  1956 
  1957 	const TInt availCount = implementationArray.Count();
  1958 	for (TInt count=0;count<availCount;++count)
  1959 		{
  1960 		const CImplementationInformation* info = implementationArray[count];
  1961 		TUid rasterizerUid = info->ImplementationUid();
  1962  		// Create a rasterizer
  1963  		COpenFontRasterizer* rasterizer=0;
  1964  		TRAP(error,rasterizer = COpenFontRasterizer::NewL(rasterizerUid));
  1965  		if (!error)
  1966    			{
  1967    			// Install it in the font store.
  1968    			TRAP(error,aFontStore->InstallRasterizerL(rasterizer));
  1969    			if (error)
  1970    				delete rasterizer;
  1971    			}
  1972 		}
  1973 	CleanupStack::PopAndDestroy(&implementationArray); 
  1974 
  1975 	}
  1976 	
  1977 void CTGlyphSelection::TestIsolatedCombiningLatinChars()
  1978 /**
  1979  This method is a test case to test GetCharacterPosition() correctly
  1980  processes isloated combining marks.
  1981 */
  1982 	{
  1983 	// Need to use a valid font so that GetCharacterPosition will be able to find the necessary glyph information.
  1984 	_LIT16(KTestFontFile, "C:\\s60ssb_v500.ttf");
  1985 	_LIT16(KTestFontFaceName, "Series 60 Sans");
  1986 	
  1987 	// create a font store for testing
  1988 	CFontStore* fontStore = CFontStore::NewL(&User::Heap());
  1989 	//load all ecom implemented rasterizer dlls. installs the rasterizer.	
  1990 	LoadOpenFontLibraries(fontStore);
  1991 	// test font preparation
  1992 	fontStore->iKPixelWidthInTwips = 11860; //This value is default
  1993 	//add any required font files
  1994 	TUid err = fontStore->AddFileL(KTestFontFile);
  1995 	TFontSpec testFontSpec(KTestFontFaceName,200); 
  1996 	 
  1997 	CFbsBitmap* bmp = new(ELeave) CFbsBitmap;
  1998 	
  1999 	TInt ret = bmp->Create(TSize(100,100),EGray2);
  2000 	if (ret == KErrNotSupported)
  2001 		return;
  2002 	else
  2003 		User::LeaveIfError(ret);
  2004 
  2005 	CFbsBitmapDevice* device = NULL;
  2006 	TRAPD(err2,device = CFbsBitmapDevice::NewL(bmp));
  2007 	TEST(err2 == KErrNone);
  2008 
  2009 	CFbsBitGc* gc = NULL;
  2010 	User::LeaveIfError(device->CreateContext(gc));
  2011 	// Font file Creation
  2012 	CFbsFont* testFont = NULL;
  2013 	User::LeaveIfError(device->GetNearestFontToDesignHeightInTwips(testFont,testFontSpec));
  2014 	gc->UseFont(testFont);
  2015 	CleanupStack::PushL(testFont);
  2016 	
  2017 	// Now start the test case:
  2018 	
  2019 	TBool r;
  2020 	TBuf<20> testText(0);
  2021 	CFont::TPositionParam param;
  2022 	param.iFlags = CFont::TPositionParam::EFLogicalOrder;
  2023 	
  2024 	testText.SetLength(7);
  2025 	testText[0] = 0x0323; 	//Below Dot
  2026 	testText[1] = ' ';
  2027 	testText[2] = 0x0300;   //Above Grave Acent
  2028 	testText[3] = ' ';
  2029 	testText[4] = 0x0323;	//Below Dot
  2030 	testText[5] = 0x0300;	//Above Grave Acent
  2031 	testText[6] = 0x0301; 	//Above Acute Acent
  2032 	param.iText.Set(testText);
  2033 	
  2034 	// 1: Test the bounds for combining below mark in isolation
  2035 	param.iPosInText = 0;
  2036 	param.iPen.iX = param.iPen.iY = 0;
  2037 	r = testFont->GetCharacterPosition(param);
  2038 
  2039 	TEST(r && param.iPosInText == 1 
  2040 		   && param.iOutputGlyphs == 1 
  2041 		   && param.iOutput[0].iCode == 0x0323);
  2042 	
  2043 	#if defined __WINS__ || defined __WINSCW__
  2044 	TEST(r && param.iPen == TPoint(0,0)
  2045 		   && param.iOutput[0].iBounds.iTl == TPoint(-6,1)
  2046 		   && param.iOutput[0].iBounds.iBr == TPoint(-4,3));
  2047 	#endif
  2048 	
  2049 	// 2: Test the bounds for combining above mark in isolation
  2050 	param.iPosInText = 1;
  2051 	param.iPen.iX = param.iPen.iY = 0;
  2052 	r = testFont->GetCharacterPosition(param);
  2053 
  2054 	TEST(r && param.iPosInText == 3
  2055 		   && param.iOutputGlyphs == 2 
  2056 		   && param.iOutput[1].iCode == 0x0300);
  2057 
  2058 	#if defined __WINS__ || defined __WINSCW__
  2059 	TEST(r && param.iPen == TPoint(4,0) 
  2060 		   && param.iOutput[1].iBounds.iTl == TPoint(-2,-15)
  2061 		   && param.iOutput[1].iBounds.iBr == TPoint(2,-12));
  2062 	#endif
  2063 		
  2064 	// 3: Test the bounds for multiple combing marks in isolation
  2065 	param.iPosInText = 3;
  2066 	param.iPen.iX = param.iPen.iY = 0;
  2067 	r = testFont->GetCharacterPosition(param);
  2068 
  2069 	TEST(r && param.iPosInText == 7 
  2070 		   && param.iOutputGlyphs == 4
  2071 		   && param.iOutput[1].iCode == 0x0323
  2072 		   && param.iOutput[2].iCode == 0x0300
  2073 		   && param.iOutput[3].iCode == 0x0301);
  2074 
  2075 	#if defined __WINS__ || defined __WINSCW__
  2076 	TEST(r && param.iPen == TPoint(4,0)
  2077 		   && param.iOutput[1].iBounds.iTl == TPoint(-1,1)
  2078 		   && param.iOutput[1].iBounds.iBr == TPoint(1,3)
  2079            && param.iOutput[2].iBounds.iTl == TPoint(-2,-16)
  2080            && param.iOutput[2].iBounds.iBr == TPoint(2,-13)
  2081            && param.iOutput[3].iBounds.iTl == TPoint(-2,-20)
  2082            && param.iOutput[3].iBounds.iBr == TPoint(2,-17));
  2083 	#endif
  2084 	
  2085 	// Done with the font, pop it off.
  2086 	CleanupStack::Pop(testFont);
  2087 	
  2088 	//Cleaning the memory
  2089 	delete bmp;
  2090 	delete device;
  2091 	delete gc;
  2092 	fontStore->RemoveFile(err);
  2093 	delete fontStore;
  2094 	REComSession::FinalClose();
  2095 	}
  2096 
  2097 
  2098 void CTGlyphSelection::TestContextInShapeInfo()
  2099 /**
  2100  This method is a test case to test GetCharacterPosition2() correctly
  2101  handle context.
  2102 */
  2103 	{
  2104 	TBool r;
  2105 	TBuf<20> testText(0);
  2106 	CFont::TPositionParam param;
  2107 	param.iFlags = CFont::TPositionParam::EFLogicalOrder;
  2108 	RShapeInfo shapeInfo;
  2109 	
  2110 	//test control characters which has not defined processFun in TTableEntry
  2111 	testText.SetLength(7);
  2112 	testText[0] = 0xffff; 	//control character, test for the range { 0xFFFE,   0xFFFF,   0}
  2113 	testText[1] = '1';
  2114 	testText[2] = 0x200E;   //control character, test for the range { 0x200C,   0x200F,   0}
  2115 	testText[3] = '.';  
  2116 	testText[4] = 'a';
  2117 	testText[5] = 0x202A;   //control character, test for the range { 0x202A,   0x202E,   0}
  2118 	testText[6] = ',';
  2119 		
  2120 	param.iText.Set(testText);
  2121 	
  2122 	// 1. Test '0xffff' as NULL context at position zero - 
  2123 	// 0xffff should not be taken as context, and character '1' can be rendered correctly 
  2124 	param.iPosInText = 1;
  2125 	param.iPen.iX = param.iPen.iY = 0;
  2126 	r = iTestFont->GetCharacterPosition2(param, shapeInfo);
  2127 	TEST(r && param.iPosInText == 2 
  2128 		   && param.iOutputGlyphs == 1 
  2129 		   && param.iOutput[0].iCode == 49);
  2130 	
  2131 	// 2. Test '0x200E' - 0x200E is not rendered, either not treated as context.
  2132 	// character '.' and 'a' should be rendered correctly.
  2133 	param.iPosInText = 2;
  2134 	param.iPen.iX = param.iPen.iY = 0;
  2135 	r = iTestFont->GetCharacterPosition2(param, shapeInfo);
  2136 	TEST(r && param.iPosInText == 3 
  2137 		   && param.iOutputGlyphs == 0);
  2138 			
  2139 	param.iPosInText = 3;
  2140 	param.iPen.iX = param.iPen.iY = 0;
  2141 	r = iTestFont->GetCharacterPosition2(param, shapeInfo);
  2142 	TEST(r && param.iPosInText == 4 
  2143 		   && param.iOutputGlyphs == 1
  2144 		   && param.iOutput[0].iCode == 46);
  2145 
  2146 	param.iPosInText = 4;
  2147 	param.iPen.iX = param.iPen.iY = 0;
  2148 	r = iTestFont->GetCharacterPosition2(param, shapeInfo);
  2149 	TEST(r && param.iPosInText == 5 
  2150 		   && param.iOutputGlyphs == 1
  2151 		   && param.iOutput[0].iCode == 'a');
  2152 	
  2153 	// 3. Test '0x202A' - 0x202A is not rendered, either not treated as context.
  2154 	// character ',' should be rendered correctly. 
  2155 	param.iPosInText = 5;
  2156 	param.iPen.iX = param.iPen.iY = 0;
  2157 	r = iTestFont->GetCharacterPosition2(param, shapeInfo);
  2158 	TEST(r && param.iPosInText == 6 
  2159 		   && param.iOutputGlyphs == 0);
  2160 	
  2161 	param.iPosInText = 6;
  2162 	param.iPen.iX = param.iPen.iY = 0;
  2163 	r = iTestFont->GetCharacterPosition2(param, shapeInfo);
  2164 	TEST(r && param.iPosInText == 7 
  2165 		   && param.iOutputGlyphs == 1
  2166 		   && param.iOutput[0].iCode == 44);
  2167 	}
  2168 
  2169 /**
  2170 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-1580
  2171 @SYMTestCaseDesc Automated GDI testing for Hindi
  2172 @SYMTestPriority High
  2173 @SYMTestActions  Attempt to compose various valid and invalid Hindi glyph clusters.
  2174 @SYMTestExpectedResults The expected glyph clusters for given Unicode charactors must be returned
  2175 @SYMPREQ 18: Hindi for Bravo
  2176 */
  2177 void CTGlyphSelection::TestHindiChars(CFbsFont* aFont)
  2178 	{
  2179 	INFO_PRINTF1(_L("Test Hindi Glyphs"));	
  2180 	// Do the testing
  2181 	
  2182 	TBool r;
  2183 	TBuf<30> testText(0);
  2184 	CFont::TPositionParam param;
  2185 	param.iDirection = CFont::EHorizontal;
  2186 	param.iFlags = CFont::TPositionParam::EFLogicalOrder;
  2187 
  2188 	testText.SetLength(30);
  2189 	
  2190 	testText[0] = 0x0930;
  2191 	testText[1] = 0x093C;
  2192 	testText[2] = 0x094D;
  2193 	testText[3] = 0x0915;
  2194 	
  2195 	testText[4] = 0x0915;
  2196 	testText[5] = 0x094D;
  2197 	testText[6] = 0x0915;
  2198 	
  2199 	testText[7] = 0x0930;
  2200 	testText[8] = 0x094D;
  2201 	testText[9] = 0x0915;
  2202 	
  2203 	testText[10] = 0x0915;
  2204 	testText[11] = 0x094D;
  2205 	testText[12] = 0x0930;
  2206 	
  2207 	testText[13] = 0x0915;
  2208 	testText[14] = 0x094D;
  2209 	testText[15] = 0x0937;
  2210 	
  2211 	testText[16] = 0x0915;
  2212 	testText[17] = 0x094D;
  2213 	testText[18] = 0x0930;
  2214 	testText[19] = 0x094D;
  2215 	testText[20] = 0x092A;
  2216 	
  2217 	/*	When the following character 0x0036 is shaped, the context will be taken into consideration when
  2218 		determining the glyph for 0x0036 
  2219 		The context for 0x0036 is the Devanagari character 0x092A at position (iPosInText) 20
  2220 	**/
  2221 	testText[21] = 0x0036;
  2222 	testText[22] = 0x094D;
  2223 	
  2224 	testText[23] = 0x0020;
  2225 	
  2226 	// INC101103: Strings containing ZWJ do not get rendered properly for Hindi 
  2227 	testText[24] = 0x092E;
  2228 	testText[25] = 0x094D;
  2229 	testText[26] = 0x200D;
  2230 	testText[27] = 0x092E; 
  2231 	testText[28] = 0x093F;
  2232 	testText[29] = 0x200D;
  2233 		
  2234 	param.iText.Set(testText);
  2235 	
  2236 	RShapeInfo aShapeInfo;
  2237 
  2238 	// Do the testing
  2239 	
  2240 	param.iPosInText = 0;
  2241 	param.iPen.iX = param.iPen.iY = 0;
  2242 	r = aFont->GetCharacterPosition2(param, aShapeInfo);
  2243 
  2244 	TEST(r && param.iPosInText == 4 
  2245 		   && param.iOutputGlyphs == 2
  2246 		   && param.iOutput[0].iCode == 0x80000108
  2247 		   && param.iOutput[1].iCode == 0x80000072);
  2248 
  2249 	#if defined __WINS__ || defined __WINSCW__
  2250 	TEST(r && param.iPen.iX == 17);
  2251 	#endif
  2252 	
  2253 	INFO_PRINTF6(_L("The result of this shaping is %d %d %d 0x%x 0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
  2254 
  2255 	param.iPosInText = 4;
  2256 	param.iPen.iX = param.iPen.iY = 0;
  2257 	r = aFont->GetCharacterPosition2(param, aShapeInfo);
  2258 
  2259 	TEST(r && param.iPosInText == 7 
  2260 		   && param.iOutputGlyphs == 1
  2261 		   && param.iOutput[0].iCode == 0x800001C2);
  2262 
  2263 	#if defined __WINS__ || defined __WINSCW__
  2264 	TEST(r && param.iPen.iX == 12);
  2265 	#endif
  2266 	
  2267 	INFO_PRINTF5(_L("The result of this shaping is %d %d %d 0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
  2268 	
  2269 	param.iPosInText = 7;
  2270 	param.iPen.iX = param.iPen.iY = 0;
  2271 	r = aFont->GetCharacterPosition2(param, aShapeInfo);
  2272 
  2273 	TEST(r && param.iPosInText == 10 
  2274 		   && param.iOutputGlyphs == 2
  2275 		   && param.iOutput[0].iCode == 0x80000072
  2276 		   && param.iOutput[1].iCode == 0x80000130);
  2277 
  2278 	#if defined __WINS__ || defined __WINSCW__
  2279 	TEST(r && param.iPen.iX == 11);
  2280 	#endif
  2281 	
  2282 	INFO_PRINTF6(_L("The result of this shaping is %d %d %d 0x%x 0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
  2283 	
  2284 	param.iPosInText = 10;
  2285 	param.iPen.iX = param.iPen.iY = 0;
  2286 	r = aFont->GetCharacterPosition2(param, aShapeInfo);
  2287 
  2288 	TEST(r && param.iPosInText == 13 
  2289 		   && param.iOutputGlyphs == 1
  2290 		   && param.iOutput[0].iCode == 0x80000136);
  2291 
  2292 	#if defined __WINS__ || defined __WINSCW__
  2293 	TEST(r && param.iPen.iX == 12);
  2294 	#endif
  2295 	
  2296 	INFO_PRINTF5(_L("The result of this shaping is %d %d %d 0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
  2297 	
  2298 	param.iPosInText = 13;
  2299 	param.iPen.iX = param.iPen.iY = 0;
  2300 	r = aFont->GetCharacterPosition2(param, aShapeInfo);
  2301 
  2302 	TEST(r && param.iPosInText == 16 
  2303 		   && param.iOutputGlyphs == 1
  2304 		   && param.iOutput[0].iCode == 0x800001BE);
  2305 
  2306 	#if defined __WINS__ || defined __WINSCW__
  2307 	TEST(r && param.iPen.iX == 12);
  2308 	#endif
  2309 	
  2310 	INFO_PRINTF5(_L("The result of this shaping is %d %d %d 0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
  2311 
  2312 	param.iPosInText = 16;
  2313 	param.iPen.iX = param.iPen.iY = 0;
  2314 	r = aFont->GetCharacterPosition2(param, aShapeInfo);
  2315 
  2316 	TEST(r && param.iPosInText == 21 
  2317 		   && param.iOutputGlyphs == 2
  2318 		   && param.iOutput[0].iCode == 0x8000017A
  2319 		   && param.iOutput[1].iCode == 0x80000087);
  2320 	
  2321 	#if defined __WINS__ || defined __WINSCW__
  2322 	TEST(r && param.iPen.iX == 18);
  2323 	#endif
  2324 	
  2325 	INFO_PRINTF6(_L("The result of this shaping is %d %d %d 0x%x 0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
  2326 
  2327 	/*	The following shaping will consider the context when determining the glyph for 0x0036 Digit character 
  2328 		The context for 0x0036 is the Devanagari character 0x092A at position (iPosInText) 20
  2329 	**/
  2330 	param.iPosInText = 21;
  2331 	param.iPen.iX = param.iPen.iY = 0;
  2332 	r = aFont->GetCharacterPosition2(param, aShapeInfo);
  2333 
  2334 	TEST(r && param.iPosInText == 22 
  2335 		   && param.iOutputGlyphs == 1
  2336 		   && param.iOutput[0].iCode == 0x80000016);
  2337 	
  2338 	#if defined __WINS__ || defined __WINSCW__
  2339 	TEST(r && param.iPen.iX == 9);
  2340 	#endif
  2341 	
  2342 	INFO_PRINTF5(_L("The result of this shaping is %d %d %d 0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
  2343 
  2344 	// INC101103: Strings containing ZWJ do not get rendered properly for Hindi 
  2345 	param.iPosInText = 24;
  2346 	param.iPen.iX = param.iPen.iY = 0;
  2347 	r = aFont->GetCharacterPosition2(param, aShapeInfo);
  2348 	// We are mainly testing the position in text after rendering, which should be at the end of the syllable
  2349 	// that should include the ZWJ and any consonant that follows it
  2350 	TEST(r && param.iPosInText == 29 
  2351 		   && param.iOutputGlyphs == 3
  2352 		   && param.iOutput[0].iCode == 0x80000272
  2353 		   && param.iOutput[1].iCode == 0x80000105
  2354 		   && param.iOutput[2].iCode == 0x8000008B);
  2355 		   
  2356 	// Close aShapeInfo which releases any memory it is occupying
  2357 	if (aShapeInfo.IsOpen())
  2358 		aShapeInfo.Close();
  2359 		   
  2360 	}
  2361 	
  2362 /**
  2363 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-3381
  2364 @SYMTestCaseDesc Automated GDI testing for Kannada
  2365 @SYMTestPriority High
  2366 @SYMTestActions  Attempt to compose various valid and invalid Kannada glyph clusters.
  2367 @SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
  2368 @SYMPREQ 19: Kannada for Ogmha
  2369 */
  2370 	
  2371 void CTGlyphSelection::TestKannadaChars(CFbsFont* aFont)
  2372 	{
  2373 INFO_PRINTF1(_L("Test Kannada Glyphs"));
  2374 	
  2375 	TBuf<79> testText(0);
  2376 	CFont::TPositionParam param;
  2377 	param.iDirection = CFont::EHorizontal;
  2378 	param.iFlags = CFont::TPositionParam::EFLogicalOrder;
  2379 
  2380 	testText.SetLength(79);
  2381 	//Testdata for kannada Langauage
  2382 	
  2383 	testText[0] = 0x0C95;
  2384 	testText[1] = 0x0CCD;
  2385 	testText[2] = 0x0020; 
  2386 	
  2387 	testText[3] = 0x0CAF;
  2388 	testText[4] = 0x0CCD;
  2389 	testText[5] = 0x0020;
  2390 	
  2391 	testText[6] = 0x0C99;
  2392 	testText[7] = 0x0CCD;
  2393 	testText[8] = 0x0020;
  2394 	
  2395 	testText[9] = 0x0CA3;
  2396 	testText[10] = 0x0CCD;
  2397 	testText[11] = 0x0020;
  2398 	
  2399 	testText[12] = 0x0C95;
  2400 	testText[13] = 0x0CC3;
  2401 	
  2402 	testText[14] = 0x0CA4;
  2403 	testText[15] = 0x0CC6;
  2404 	
  2405 	testText[16] = 0x0C9D;
  2406 	testText[17] = 0x0CBE;
  2407 	
  2408 	testText[18] = 0x0C9E;
  2409 	testText[19] = 0x0CBE;
  2410 	
  2411 	testText[20] = 0x0CA3;
  2412 	testText[21] = 0x0CBE;
  2413 	
  2414 	testText[22] = 0x0CB3;
  2415 	testText[23] = 0x0CC6;
  2416 	
  2417 	testText[24] = 0x0C9D;
  2418 	testText[25] = 0x0CC6;
  2419 	
  2420 	testText[26] = 0x0CAC;
  2421 	testText[27] = 0x0CC6;
  2422 	
  2423 	testText[28] = 0x0C9F;
  2424 	testText[29] = 0x0CC6;
  2425 	
  2426 	testText[30] = 0x0C99;
  2427 	testText[31] = 0x0CC6;
  2428 	
  2429 	testText[32] = 0x0CA3;
  2430 	testText[33] = 0x0CC6;
  2431 	
  2432 	testText[34] = 0x0C95;
  2433 	testText[35] = 0x0CBF;
  2434 	
  2435 	testText[36] = 0x0CB8;
  2436 	testText[37] = 0x0CBF;
  2437 	
  2438 	testText[38] = 0x0CA1;
  2439 	testText[39] = 0x0CBF;
  2440 	
  2441 	testText[40] = 0x0CA6;
  2442 	testText[41] = 0x0CBF;
  2443 	
  2444 	testText[42] = 0x0C9D;
  2445 	testText[43] = 0x0CBF;
  2446 	
  2447 	testText[44] = 0x0C9D;
  2448 	testText[45] = 0x0CC1;
  2449 	
  2450 	testText[46] = 0x0CB5;
  2451 	testText[47] = 0x0CC1;
  2452 	
  2453 	testText[48] = 0x0C95;
  2454 	testText[49] = 0x0CC2;
  2455 	
  2456 	testText[50] = 0x0CAA;
  2457 	testText[51] = 0x0CC2;
  2458 	
  2459 	testText[52] = 0x0CAE;
  2460 	testText[53] = 0x0CCC;
  2461 	
  2462 	testText[54] = 0x0C95;
  2463 	
  2464 	testText[55] = 0x0CB0;
  2465 	testText[56] = 0x200D;
  2466 	testText[57] = 0x0CCD;
  2467 	testText[58] = 0x0CAE;
  2468 	
  2469 	testText[59] = 0x0020;
  2470 	
  2471 	testText[60] = 0x0CB0;
  2472 	testText[61] = 0x200D;
  2473 	testText[62] = 0x0CCD;
  2474 	testText[63] = 0x0CB0;
  2475 	testText[64] = 0x200D;
  2476 	testText[65] = 0x0CCD;
  2477 	
  2478 	
  2479 	testText[66] = 0x0CB0;
  2480 	testText[67] = 0x200D;
  2481 	testText[68] = 0x0CCD;
  2482 	testText[69] = 0x0CB0;
  2483 	testText[70] = 0x0CCD;
  2484 	testText[71] = 0x0CB0;
  2485 	testText[72] = 0x0CCD;
  2486 	testText[73] = 0x0CB0;
  2487 	testText[74] = 0x0CCD;
  2488 	testText[75] = 0x0CB0;
  2489 	
  2490 	// DEF103276: Kannada rendering: IcuLayoutEngine does not recongnise 0X0C8E as a vowel
  2491 	testText[76] = 0x0020;
  2492 	testText[77] = 0x0C8E;
  2493 	testText[78] = 0x0C82;
  2494 	// End of DEF103276: Kannada rendering: IcuLayoutEngine does not recongnise 0X0C8E as a vowel
  2495 
  2496 	param.iText.Set(testText);
  2497 
  2498 	// Do the testing
  2499 	
  2500 	TBool r;
  2501 	param.iPosInText = 0;
  2502 	param.iPen.iX = param.iPen.iY = 0;
  2503 	RShapeInfo shapeInfo;
  2504 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  2505 
  2506 	TEST(r && param.iPosInText ==2 
  2507 		   && param.iOutputGlyphs == 1 
  2508 		   && param.iOutput[0].iCode == 0x80000839);
  2509 
  2510 	#if defined __WINS__ || defined __WINSCW__
  2511 	TEST(r && param.iPen.iX == 16);
  2512 	#endif
  2513 	
  2514 	INFO_PRINTF5(_L("The values of this shaping of Ka + Virama are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
  2515     
  2516 	param.iPosInText = 3;
  2517 	param.iPen.iX = param.iPen.iY = 0;
  2518 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  2519 
  2520 	TEST(r && param.iPosInText == 5
  2521 		   && param.iOutputGlyphs ==1
  2522 		   && param.iOutput[0].iCode == 0x80000852 );
  2523 
  2524 	#if defined __WINS__ || defined __WINSCW__
  2525 	TEST(r && param.iPen.iX == 27);
  2526 	#endif
  2527 	
  2528 	INFO_PRINTF5(_L("The values of this shaping Ya + Virama are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
  2529 	
  2530 	param.iPosInText = 6;
  2531 	param.iPen.iX = param.iPen.iY = 0;
  2532 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  2533 
  2534 	TEST(r && param.iPosInText == 8
  2535 		   && param.iOutputGlyphs == 1 
  2536 		   && param.iOutput[0].iCode ==0x8000083D);
  2537 
  2538 	#if defined __WINS__ || defined __WINSCW__
  2539 	TEST(r && param.iPen.iX == 19);
  2540 	#endif
  2541 	
  2542 	INFO_PRINTF5(_L("The result of this shaping for Nya + Virama iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
  2543 	
  2544 	param.iPosInText = 9;
  2545 	param.iPen.iX = param.iPen.iY = 0;
  2546 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  2547 
  2548 	TEST(r && param.iPosInText == 11
  2549 		   && param.iOutputGlyphs ==1 
  2550 		   && param.iOutput[0].iCode == 0x80000847);
  2551 
  2552 	#if defined __WINS__ || defined __WINSCW__
  2553 	TEST(r && param.iPen.iX == 20);
  2554 	#endif
  2555 	
  2556 	INFO_PRINTF5(_L("The result of this shaping for NNA + Virama iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
  2557 	
  2558 	param.iPosInText = 12;
  2559 	param.iPen.iX = param.iPen.iY = 0;
  2560 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  2561 
  2562 	TEST(r && param.iPosInText == 14
  2563 		   && param.iOutputGlyphs == 2 
  2564 		   && param.iOutput[0].iCode == 0x800007A8
  2565 		   && param.iOutput[1].iCode == 0x800007D2);
  2566 
  2567 	#if defined __WINS__ || defined __WINSCW__
  2568 	TEST(r && param.iPen.iX == 12);
  2569 	#endif
  2570 
  2571 	INFO_PRINTF6(_L("The result of this shaping for Ka + Matra Vocalic R iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
  2572 
  2573 	param.iPosInText = 14;
  2574 	param.iPen.iX = param.iPen.iY = 0;
  2575 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  2576 
  2577 	TEST(r && param.iPosInText == 16
  2578 		   && param.iOutputGlyphs == 1 
  2579 		   && param.iOutput[0].iCode == 0x8000088f);
  2580 
  2581 	#if defined __WINS__ || defined __WINSCW__
  2582 	TEST(r && param.iPen.iX == 11);
  2583 	#endif
  2584 	
  2585 	INFO_PRINTF5(_L("The result of this shaping for Ta + Matra AA iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
  2586 
  2587 	param.iPosInText = 16;
  2588 	param.iPen.iX = param.iPen.iY = 0;
  2589 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  2590 
  2591 	TEST(r && param.iPosInText == 18
  2592 		   && param.iOutputGlyphs == 2
  2593 		   && param.iOutput[0].iCode == 0x8000081E 
  2594 		   && param.iOutput[1].iCode == 0x800007CD);
  2595 
  2596 	#if defined __WINS__ || defined __WINSCW__
  2597 	TEST(r && param.iPen.iX == 29);
  2598 	#endif
  2599 	
  2600 	INFO_PRINTF6(_L("The result of this shaping  for Jha + Matra AA iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
  2601 	
  2602 	param.iPosInText = 18;
  2603 	param.iPen.iX = param.iPen.iY = 0;
  2604 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  2605 
  2606 	TEST(r && param.iPosInText == 20
  2607 		   && param.iOutputGlyphs == 2
  2608 		   && param.iOutput[0].iCode == 0x800007b1
  2609 		   && param.iOutput[1].iCode == 0x800007cd);
  2610 
  2611 	#if defined __WINS__ || defined __WINSCW__
  2612 	TEST(r && param.iPen.iX == 23);
  2613 	#endif
  2614 	
  2615 	INFO_PRINTF6(_L("The result of this shaping for Nya + Matra AA iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
  2616 	
  2617 	
  2618 	param.iPosInText = 20;
  2619 	param.iPen.iX = param.iPen.iY = 0;
  2620 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  2621 
  2622 	TEST(r && param.iPosInText == 22
  2623 		   && param.iOutputGlyphs == 2 
  2624 		   && param.iOutput[0].iCode == 0x80000823
  2625 		   && param.iOutput[1].iCode == 0x800007CD );
  2626 
  2627 	#if defined __WINS__ || defined __WINSCW__
  2628 	TEST(r && param.iPen.iX == 21);
  2629 	#endif
  2630 	    
  2631 	INFO_PRINTF6(_L("The result of this shaping for Nna + Matra AA iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
  2632 	
  2633 	param.iPosInText = 22;
  2634 	param.iPen.iX = param.iPen.iY = 0;
  2635 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  2636 
  2637 	TEST(r && param.iPosInText == 24
  2638 		   && param.iOutputGlyphs == 1 
  2639 		   && param.iOutput[0].iCode == 0x8000089C);
  2640 
  2641 	#if defined __WINS__ || defined __WINSCW__
  2642 	TEST(r && param.iPen.iX == 12);
  2643 	#endif
  2644 	
  2645 	INFO_PRINTF5(_L("The result of this shaping for  LLa + Matra E iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
  2646 	
  2647 	param.iPosInText = 24;
  2648 	param.iPen.iX = param.iPen.iY = 0;
  2649 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  2650 
  2651 	TEST(r && param.iPosInText == 26
  2652 		   && param.iOutputGlyphs == 1 
  2653 		   && param.iOutput[0].iCode == 0x80000889);
  2654 
  2655 	#if defined __WINS__ || defined __WINSCW__
  2656 	TEST(r && param.iPen.iX == 22);
  2657 	#endif
  2658 	
  2659 	INFO_PRINTF5(_L("The result of this shaping for Jha + Matra E iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
  2660 	 
  2661 	 param.iPosInText = 26;
  2662 	param.iPen.iX = param.iPen.iY = 0;
  2663 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  2664 
  2665 	TEST(r && param.iPosInText == 28
  2666 		   && param.iOutputGlyphs == 1
  2667 		   && param.iOutput[0].iCode == 0x80000896 );
  2668 
  2669 	#if defined __WINS__ || defined __WINSCW__
  2670 	TEST(r && param.iPen.iX == 13);
  2671 	#endif
  2672 	
  2673 	INFO_PRINTF5(_L("The result of this shaping for Ba + Matra E iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
  2674 	
  2675 	param.iPosInText = 28;
  2676 	param.iPen.iX = param.iPen.iY = 0;
  2677 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  2678 
  2679 	TEST(r && param.iPosInText == 30
  2680 		   && param.iOutputGlyphs == 1 
  2681 		   && param.iOutput[0].iCode == 0x8000088a);
  2682 
  2683 	#if defined __WINS__ || defined __WINSCW__
  2684 	TEST(r && param.iPen.iX == 13);
  2685 	#endif
  2686 	
  2687 	INFO_PRINTF5(_L("The result of this shaping for Tta + Matra E iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
  2688 	
  2689 	param.iPosInText = 30;
  2690 	param.iPen.iX = param.iPen.iY = 0;
  2691 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  2692 
  2693 	TEST(r && param.iPosInText == 32
  2694 		   && param.iOutputGlyphs == 2
  2695 		   && param.iOutput[0].iCode == 0x800007ac
  2696 		   && param.iOutput[1].iCode == 0x800007d4 );
  2697 
  2698 	#if defined __WINS__ || defined __WINSCW__
  2699 	TEST(r && param.iPen.iX == 19);
  2700 	#endif
  2701 	
  2702 	INFO_PRINTF6(_L("The result of this shaping for Nya + Matra E iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
  2703 	
  2704 	param.iPosInText = 32;
  2705 	param.iPen.iX = param.iPen.iY = 0;
  2706 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  2707 
  2708 	TEST(r && param.iPosInText == 34
  2709 		   && param.iOutputGlyphs == 1 
  2710 		   && param.iOutput[0].iCode == 0x8000088e);
  2711 
  2712 	#if defined __WINS__ || defined __WINSCW__
  2713 	TEST(r && param.iPen.iX == 14);
  2714 	#endif
  2715 	
  2716 	INFO_PRINTF5(_L("The result of this shaping for Nna + Matra E iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
  2717 	
  2718 	param.iPosInText = 34;
  2719 	param.iPen.iX = param.iPen.iY = 0;
  2720 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  2721 
  2722 	TEST(r && param.iPosInText == 36
  2723 		   && param.iOutputGlyphs == 1
  2724 		   && param.iOutput[0].iCode == 0x80000860 );
  2725 
  2726 	#if defined __WINS__ || defined __WINSCW__
  2727 	TEST(r && param.iPen.iX == 10);
  2728 	#endif
  2729 		
  2730 	INFO_PRINTF5(_L("The result of this shaping for Ka + Matra I iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
  2731 	
  2732 	param.iPosInText = 36;
  2733 	param.iPen.iX = param.iPen.iY = 0;
  2734 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  2735 
  2736 	TEST(r && param.iPosInText == 38
  2737 		   && param.iOutputGlyphs == 1
  2738 		   && param.iOutput[0].iCode == 0x8000087e );
  2739 
  2740 	#if defined __WINS__ || defined __WINSCW__
  2741 	TEST(r && param.iPen.iX == 11);
  2742 	#endif
  2743 	
  2744 	INFO_PRINTF5(_L("The result of this shaping for Sa + Matra I iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
  2745 	
  2746 	param.iPosInText = 38;
  2747 	param.iPen.iX = param.iPen.iY = 0;
  2748 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  2749 
  2750 	TEST(r && param.iPosInText == 40
  2751 		   && param.iOutputGlyphs == 1
  2752 		   && param.iOutput[0].iCode == 0x8000086a);
  2753 
  2754 	#if defined __WINS__ || defined __WINSCW__
  2755 	TEST(r && param.iPen.iX == 12);
  2756 	#endif
  2757 	
  2758 	INFO_PRINTF5(_L("The result of this shaping for Dda + Matra I iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
  2759 	
  2760 	param.iPosInText = 40;
  2761 	param.iPen.iX = param.iPen.iY = 0;
  2762 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  2763 
  2764 	TEST(r && param.iPosInText == 42
  2765 		   && param.iOutputGlyphs == 1 
  2766 		   && param.iOutput[0].iCode == 0x8000086f);
  2767 
  2768 	#if defined __WINS__ || defined __WINSCW__
  2769 	TEST(r && param.iPen.iX == 12);
  2770 	#endif
  2771 	
  2772 	INFO_PRINTF5(_L("The result of this shaping for Va + Matra I iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
  2773 	
  2774 	param.iPosInText = 42;
  2775 	param.iPen.iX = param.iPen.iY = 0;
  2776 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  2777 
  2778 	TEST(r && param.iPosInText == 44
  2779 		   && param.iOutputGlyphs == 1 
  2780 		   && param.iOutput[0].iCode == 0x80000867 );
  2781 
  2782 	#if defined __WINS__ || defined __WINSCW__
  2783 	TEST(r && param.iPen.iX == 22);
  2784 	#endif
  2785 	
  2786 	INFO_PRINTF5(_L("The result of this shaping for Jha + Matra I iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
  2787 	
  2788 	param.iPosInText = 44;
  2789 	param.iPen.iX = param.iPen.iY = 0;
  2790 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  2791 
  2792 	TEST(r && param.iPosInText == 46
  2793 		   && param.iOutputGlyphs == 2
  2794 		   && param.iOutput[0].iCode == 0x800007b0 
  2795 		   && param.iOutput[1].iCode == 0x800007d0);
  2796 
  2797 	#if defined __WINS__ || defined __WINSCW__
  2798 	TEST(r && param.iPen.iX == 28);
  2799 	#endif
  2800 	
  2801 	INFO_PRINTF6(_L("The result of this shaping for Jha + Matra U iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
  2802 	
  2803 	param.iPosInText = 46;
  2804 	param.iPen.iX = param.iPen.iY = 0;
  2805 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  2806 
  2807 	TEST(r && param.iPosInText == 48
  2808 		   && param.iOutputGlyphs == 2
  2809 		   && param.iOutput[0].iCode == 0x800007c6
  2810 		   && param.iOutput[1].iCode == 0x800007d0);
  2811 
  2812 	#if defined __WINS__ || defined __WINSCW__
  2813 	TEST(r && param.iPen.iX == 18);
  2814 	#endif
  2815 	
  2816 	INFO_PRINTF6(_L("The result of this shaping for Va + Matra U iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
  2817 
  2818 
  2819 	param.iPosInText = 48;
  2820 	param.iPen.iX = param.iPen.iY = 0;
  2821 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  2822 
  2823 	TEST(r && param.iPosInText == 50
  2824 		   && param.iOutputGlyphs == 2
  2825 		   && param.iOutput[0].iCode == 0x800007a8
  2826 		   && param.iOutput[1].iCode == 0x800007d1 );
  2827 
  2828 	#if defined __WINS__ || defined __WINSCW__
  2829 	TEST(r && param.iPen.iX == 20);
  2830 	#endif
  2831 	
  2832 	INFO_PRINTF6(_L("The result of this shaping for Ka Matra UU iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode,param.iOutput[1].iCode);	
  2833 
  2834 	param.iPosInText = 50;
  2835 	param.iPen.iX = param.iPen.iY = 0;
  2836 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  2837 
  2838 	TEST(r && param.iPosInText == 52 
  2839 		   && param.iOutputGlyphs == 2
  2840 		   && param.iOutput[0].iCode == 0x800007bc
  2841 		   && param.iOutput[1].iCode == 0x800008a5);
  2842 
  2843 	#if defined __WINS__ || defined __WINSCW__
  2844 	TEST(r && param.iPen.iX == 21);
  2845 	#endif
  2846 	
  2847 	INFO_PRINTF6(_L("The result of this shaping for Pa + Matra UU iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);	
  2848 	
  2849 	
  2850 	param.iPosInText = 52;
  2851 	param.iPen.iX = param.iPen.iY = 0;
  2852 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  2853 
  2854 	TEST(r && param.iPosInText == 54 
  2855 		   && param.iOutputGlyphs == 2
  2856 		   && param.iOutput[0].iCode == 0x8000082d  
  2857 		   && param.iOutput[1].iCode == 0x800007d9);
  2858 
  2859 	#if defined __WINS__ || defined __WINSCW__
  2860 	TEST(r && param.iPen.iX == 26);
  2861 	#endif
  2862 
  2863 	INFO_PRINTF6(_L("The result of this shaping for Ma + Matra UU iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);	
  2864 		
  2865 	param.iPosInText = 55;
  2866 	param.iPen.iX = param.iPen.iY = 0;
  2867 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  2868 
  2869 	TEST(r && param.iPosInText == 59 
  2870 		   && param.iOutputGlyphs == 2
  2871 		   && param.iOutput[0].iCode == 0x800007c2 
  2872 		   && param.iOutput[1].iCode == 0x80000809);
  2873 
  2874 	#if defined __WINS__ || defined __WINSCW__
  2875 	TEST(r && param.iPen.iX == 17);
  2876 	#endif
  2877 	
  2878 	INFO_PRINTF6(_L("The result of this shaping for Ma + Matra UU iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[2].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);	
  2879 			
  2880 	param.iPosInText = 60;
  2881 	param.iPen.iX = param.iPen.iY = 0;
  2882 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  2883 	TEST(r && param.iPosInText == 64 
  2884 		   && param.iOutputGlyphs == 2
  2885 		   && param.iOutput[0].iCode == 0x800007c2 
  2886 		   && param.iOutput[1].iCode == 0x8000080b);
  2887 	INFO_PRINTF6(_L("Results are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x "), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);	
  2888 			
  2889 	param.iPosInText = 66;
  2890 	param.iPen.iX = param.iPen.iY = 0;
  2891 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  2892 	TEST(r && param.iPosInText == 75 
  2893 		   && param.iOutputGlyphs == 5
  2894 		   && param.iOutput[0].iCode == 0x800007c2 
  2895 		   && param.iOutput[1].iCode == 0x8000080b
  2896 		   && param.iOutput[2].iCode == 0x800008db
  2897 		   && param.iOutput[3].iCode == 0x800008db
  2898 		   && param.iOutput[4].iCode == 0x800007da);
  2899 	INFO_PRINTF7(_L("Results are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x iOutput[2].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode, param.iOutput[2].iCode);
  2900 	
  2901 	// DEF103276: Kannada rendering: IcuLayoutEngine does not recongnise 0X0C8E as a vowel
  2902 	param.iPosInText = 77;
  2903 	param.iPen.iX = param.iPen.iY = 0;
  2904 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  2905 	TEST(r && param.iPosInText == 79 
  2906 		   && param.iOutputGlyphs == 2
  2907 		   && param.iOutput[0].iCode == 0x800007A2
  2908 		   && param.iOutput[1].iCode == 0x80000798);
  2909 
  2910 	INFO_PRINTF5(_L("DEF103276 Vowel E + Anusvara: iPosInText=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);	
  2911 	//End of DEF103276: Kannada rendering: IcuLayoutEngine does not recongnise 0X0C8E as a vowel
  2912 			
  2913 	}
  2914 	
  2915 /**
  2916 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-3360
  2917 @SYMTestCaseDesc Automated GDI testing for Marathi
  2918 @SYMTestPriority High
  2919 @SYMTestActions  Attempt to compose various valid and invalid Marathi glyph clusters.
  2920 @SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
  2921 @SYMPREQ 19: Marathi for Ogmha
  2922 */
  2923 
  2924 void CTGlyphSelection::TestMarathiChars(CFbsFont* aFont)
  2925 	{
  2926 	INFO_PRINTF1(_L("Test Marathi Glyphs"));	
  2927 	
  2928 	TBool r;
  2929 	TBuf<47> testText(0);
  2930 	CFont::TPositionParam param;
  2931 	param.iDirection = CFont::EHorizontal;
  2932 	param.iFlags = CFont::TPositionParam::EFLogicalOrder;
  2933 
  2934 	testText.SetLength(47);
  2935 	
  2936 	//Testdata
  2937 	testText[0] = 0x0905; 
  2938 	testText[1] = 0x0945;
  2939 	
  2940 	testText[2] = 0x0931;
  2941 	testText[3] = 0x094D;
  2942 	testText[4] = 0x0915;
  2943 	
  2944 	testText[5] = 0x0930;
  2945 	testText[6] = 0x094D;
  2946 	testText[7] = 0x200D;
  2947 	testText[8] = 0x0915;
  2948 	
  2949 	testText[9] = 0x0905;
  2950 	testText[10] = 0x200D;
  2951 	testText[11] = 0x0945;
  2952 	
  2953 	testText[12] = 0x0909;
  2954 	testText[13] = 0x0945;
  2955 	
  2956 	testText[14] = 0x0915;
  2957 	testText[15] = 0x200D;
  2958 	testText[16] = 0x0945;
  2959 	
  2960 	// DEF102132: Marathi - Certain sequence of characters does not work correctly
  2961 	testText[17] = 0x0905;
  2962 	testText[18] = 0x0945;
  2963 	testText[19] = 0x0901;
  2964 	
  2965 	testText[20] = 0x0905;
  2966 	testText[21] = 0x200D;
  2967 	testText[22] = 0x0945;
  2968 	testText[23] = 0x0901;
  2969 	// End of DEF102132: Marathi - Certain sequence of characters does not work correctly
  2970 
  2971 	
  2972 	// DEF102858: Marathi - State table does not allow explicit half forms followed by modifiers
  2973 	testText[24] = 0x0020;
  2974 	
  2975 	testText[25] = 0x0930;
  2976 	testText[26] = 0x094D;
  2977 	testText[27] = 0x200D;
  2978 	testText[28] = 0x0901;
  2979 	// End of DEF102858: Marathi - State table does not allow explicit half forms followed by modifiers
  2980 	
  2981 	// INC104705  Marathi input: Incorrect movement of cursor with eyelash ra forming ligature. 
  2982 	testText[29] = 0x0020;
  2983 	
  2984 	testText[30] = 0x0930; 
  2985 	testText[31] = 0x094D;
  2986 	testText[32] = 0x200D;
  2987 	testText[33] = 0x0930; 
  2988 	testText[34] = 0x094D;
  2989 	testText[35] = 0x200D;
  2990 	testText[36] = 0x0930; 
  2991 	testText[37] = 0x094D;
  2992 	testText[38] = 0x200D;
  2993 	testText[39] = 0x0930; 
  2994 	testText[40] = 0x094D;
  2995 	testText[41] = 0x200D;
  2996 	testText[42] = 0x0930; 
  2997 	testText[43] = 0x094D;
  2998 	testText[44] = 0x200D;
  2999 	// End of INC104705  Marathi input: Incorrect movement of cursor with eyelash ra forming ligature. 
  3000 
  3001 	// INC116507: Halant get attached with an independent vowel.
  3002 	testText[45] = 0x0905;
  3003 	testText[46] = 0x094D;
  3004 	// End of INC116507: Halant get attached with an independent vowel.
  3005 	
  3006 	//To Do
  3007 	
  3008 	param.iText.Set(testText); 
  3009 	
  3010 	// Test CANDRA A: Independent Vowel A + CANDRA E
  3011 	param.iPosInText = 0;
  3012 	param.iPen.iX = param.iPen.iY = 0;
  3013 	RShapeInfo shapeInfo;
  3014 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  3015 
  3016 	TEST(r && param.iPosInText == 2 
  3017 		   && param.iOutputGlyphs == 2
  3018 		   && param.iOutput[0].iCode == 0x80000528 
  3019 		   && param.iOutput[1].iCode == 0x80000566);
  3020 
  3021 	#if defined __WINS__ || defined __WINSCW__
  3022 	TEST(r && param.iPen.iX == 12);
  3023 	#endif
  3024 	
  3025 	INFO_PRINTF6(_L("The result of shaping CANDRA A is %d %d %d 0x%x 0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
  3026 
  3027 	
  3028 	// Test Eyelash RA post Unicode 3.0: RRA + VIRAMA + CONSONANT
  3029 	param.iPosInText = 2 ;
  3030 	param.iPen.iX = param.iPen.iY = 0;
  3031 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  3032 
  3033 	TEST(r && param.iPosInText == 5 
  3034 		   && param.iOutputGlyphs == 2
  3035 		   && param.iOutput[0].iCode == 0x800005d3
  3036 		   && param.iOutput[1].iCode == 0x80000538);
  3037 
  3038 	#if defined __WINS__ || defined __WINSCW__
  3039 	TEST(r && param.iPen.iX == 18);
  3040 	#endif
  3041 	
  3042 	INFO_PRINTF6(_L("The result of shaping post Unicode 3.0 Eyelash RA is %d %d %d 0x%x 0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
  3043 	
  3044 	// Test Eyelash RA pre Unicode 3.0: RA + VIRAMA + ZWJ + CONSONANT
  3045 	param.iPosInText = 5;
  3046 	param.iPen.iX = param.iPen.iY = 0;
  3047 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  3048 
  3049 	TEST(r && param.iPosInText == 9 
  3050 		   && param.iOutputGlyphs == 2
  3051 		   && param.iOutput[0].iCode == 0x800005d3
  3052 		   && param.iOutput[1].iCode == 0x80000538);
  3053 
  3054 	#if defined __WINS__ || defined __WINSCW__
  3055 	TEST(r && param.iPen.iX == 18);
  3056 	#endif
  3057 	
  3058 	INFO_PRINTF6(_L("The result of shaping pre Unicode 3.0 Eyelash RA is %d %d %d 0x%x 0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
  3059 	
  3060 	// Test second form of CANDRA A: Independent Vowel A + ZWJ + CANDRA E
  3061 	param.iPosInText = 9;
  3062 	param.iPen.iX = param.iPen.iY = 0;
  3063 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  3064 
  3065 	TEST(r && param.iPosInText == 12 
  3066 		   && param.iOutputGlyphs == 2
  3067 		   && param.iOutput[0].iCode == 0x80000528
  3068 		   && param.iOutput[1].iCode == 0x80000566 );
  3069 
  3070 	#if defined __WINS__ || defined __WINSCW__
  3071 	TEST(r && param.iPen.iX == 12);
  3072 	#endif
  3073 	
  3074 	INFO_PRINTF6(_L("The result of shaping second form of CANDRA A is %d %d %d 0x%x 0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
  3075 	
  3076 	// Test that CANDRA E does not join with any other independent vowel
  3077 	param.iPosInText = 12;
  3078 	param.iPen.iX = param.iPen.iY = 0;
  3079 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  3080 
  3081 	TEST(r && param.iPosInText == 13 
  3082 		   && param.iOutputGlyphs == 1
  3083 		   && param.iOutput[0].iCode == 0x8000052c);
  3084 
  3085 	#if defined __WINS__ || defined __WINSCW__
  3086 	TEST(r && param.iPen.iX == 9);
  3087 	#endif
  3088 
  3089 	INFO_PRINTF5(_L("The result of shaping any other Independent Vowel + CANDRA E is %d %d %d 0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
  3090 	
  3091 	// Test that the second form of CANDRA A (i.e. using ZWJ) doesn't work for CONSONANTS (illegal)
  3092 	param.iPosInText = 14;
  3093 	param.iPen.iX = param.iPen.iY = 0;
  3094 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  3095 
  3096 	TEST(r && param.iPosInText == 15 
  3097 		   && param.iOutputGlyphs == 1
  3098 		   && param.iOutput[0].iCode == 0x80000538);
  3099 
  3100 	#if defined __WINS__ || defined __WINSCW__
  3101 	TEST(r && param.iPen.iX == 11);
  3102 	#endif
  3103 	
  3104 	INFO_PRINTF5(_L("The result of shaping CONSONANT + ZWJ + CANDRA E is %d %d %d 0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
  3105 	
  3106 	// DEF102132: Marathi - Certain sequence of characters does not work correctly
  3107 	param.iPosInText = 17;
  3108 	param.iPen.iX = param.iPen.iY = 0;
  3109 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  3110 	
  3111 	TEST(r && param.iPosInText == 20 
  3112 		   && param.iOutputGlyphs == 2
  3113 		   && param.iOutput[0].iCode == 0x80000528
  3114 		   && param.iOutput[1].iCode == 0x8000069d);
  3115 
  3116 	
  3117 	INFO_PRINTF5(_L("DEF102132 Independent Vowel A + CANDRA E + Vowel Modifier %d %d 0x%x 0x%x"), param.iPosInText, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
  3118 	
  3119 	param.iPosInText = 20;
  3120 	param.iPen.iX = param.iPen.iY = 0;
  3121 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  3122 	
  3123 	TEST(r && param.iPosInText == 23 
  3124 		   && param.iOutputGlyphs == 2
  3125 		   && param.iOutput[0].iCode == 0x80000528
  3126 		   && param.iOutput[1].iCode == 0x8000069d);
  3127 	
  3128 	INFO_PRINTF5(_L("DEF102132 Independent Vowel A + ZWJ + CANDRA E + Vowel Modifier %d %d 0x%x 0x%x"), param.iPosInText, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
  3129   	// End of DEF102132: Marathi - Certain sequence of characters does not work correctly
  3130   	
  3131 	// DEF102858: Marathi - State table does not allow explicit half forms followed by modifiers
  3132 	param.iPosInText = 25;
  3133 	param.iPen.iX = param.iPen.iY = 0;
  3134 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  3135 	TEST(r && param.iPosInText == 29 
  3136 		   && param.iOutputGlyphs == 2
  3137 		   && param.iOutput[0].iCode == 0x800005D3
  3138 		   && param.iOutput[1].iCode == 0x80000524);
  3139 	
  3140 	INFO_PRINTF5(_L("DEF102858 Ra + Virama + ZWJ + Modifier %d %d 0x%x 0x%x"), param.iPosInText, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
  3141 	// End of DEF102858: Marathi - State table does not allow explicit half forms followed by modifiers
  3142 	
  3143 	// INC104705  Marathi input: Incorrect movement of cursor with eyelash ra forming ligature. 
  3144 	param.iPosInText = 30;
  3145 	param.iPen.iX = param.iPen.iY = 0;
  3146 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  3147 	TEST(r && param.iPosInText == 42 
  3148 		   && param.iOutputGlyphs == 5
  3149 		   && param.iOutput[0].iCode == 0x800005D3
  3150 		   && param.iOutput[1].iCode == 0x800005D3
  3151 		   && param.iOutput[2].iCode == 0x800005B8
  3152 		   && param.iOutput[3].iCode == 0x80000553
  3153 		   && param.iOutput[4].iCode == 0x8000056E);
  3154 	#if defined __WINS__ || defined __WINSCW__
  3155 	TEST(param.iPen.iX == 20);
  3156 	#endif
  3157 	
  3158 	INFO_PRINTF7(_L("INC104705 Ra + Virama + ZWJ + Ra + Virama + ZWJ + Ra + Virama + ZWJ + Ra + Virama + ZWJ + Ra + Virama + ZWJ  %d %d 0x%x 0x%x 0x%x 0x%x"), param.iPosInText, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode, param.iOutput[2].iCode, param.iOutput[3].iCode);
  3159 	// End of INC104705  Marathi input: Incorrect movement of cursor with eyelash ra forming ligature. 
  3160 	
  3161 	// INC116507: Halant get attached with an independent vowel.
  3162 	param.iPosInText = 45;
  3163 	param.iPen.iX = param.iPen.iY = 0;
  3164 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  3165 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  3166 
  3167 	TEST(r && param.iPosInText == 47 
  3168 		   && param.iOutputGlyphs == 2
  3169 		   && param.iOutput[0].iCode == 0x8000058F
  3170 		   && param.iOutput[1].iCode == 0x8000056E);
  3171 
  3172 	#if defined __WINS__ || defined __WINSCW__
  3173 	TEST(r && param.iPen.iX == 21);
  3174 	#endif
  3175 
  3176 	INFO_PRINTF6(_L("INC116507: Independent Vowel A + Halant  %d %d %d 0x%x 0x%x"), param.iPosInText, param.iOutputGlyphs, param.iPen.iX, param.iOutput[0].iCode, param.iOutput[1].iCode);
  3177 	// End of INC116507: Halant get attached with an independent vowel.
  3178 
  3179 	}
  3180 	
  3181 /**
  3182 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-3417
  3183 @SYMTestCaseDesc Automated GDI testing for Gujarati
  3184 @SYMTestPriority High
  3185 @SYMTestActions  Attempt to compose various valid and invalid gujarati glyph clusters.
  3186 @SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
  3187 @SYMPREQ 19: Gujarati for Ogmha
  3188 */
  3189 	
  3190 	
  3191 void CTGlyphSelection::TestGujaratiChars(CFbsFont* aFont)
  3192 	{
  3193 	INFO_PRINTF1(_L("Test Gujarati Glyphs"));
  3194 	
  3195 	// Do the testing
  3196 	
  3197 	TBool r;
  3198 	TBuf<162> testText(0);
  3199 	CFont::TPositionParam param;
  3200 	param.iDirection = CFont::EHorizontal;
  3201 	param.iFlags = CFont::TPositionParam::EFLogicalOrder;
  3202 
  3203 	testText.SetLength(162);
  3204 	//Testdata for gujarati Langauage
  3205 	
  3206 	testText[0] = 0x0AAC;
  3207 	testText[1] = 0x0ACD;
  3208 	testText[2] = 0x200D;
  3209 	testText[3] = 0x0020;
  3210 	
  3211 	testText[4] = 0x0A96;
  3212 	testText[5] = 0x0ACD;
  3213 	testText[6] = 0x0A97;
  3214 	testText[7] = 0x0ACD;
  3215 	testText[8] = 0x0A98;
  3216 	testText[9] = 0x0ACD;
  3217 	testText[10] = 0x0A9A;
  3218 	
  3219 	testText[11] = 0x0A95;
  3220 	testText[12] = 0x0ACD;
  3221 	testText[13] = 0x0A9C;	
  3222 	testText[14] = 0x200D;
  3223 	testText[15] = 0x0020;
  3224 
  3225 	testText[16] = 0x0A99;
  3226 	testText[17] = 0x0ACD;
  3227 	testText[18] = 0x0A9B;
  3228 	testText[19] = 0x0ACD;
  3229 	testText[20] = 0x0A9F;
  3230 	testText[21] = 0x0ACD;
  3231 	testText[22] = 0x0AA0;
  3232 	
  3233 	//Requirement (GUJ003)
  3234 	
  3235 	testText[23] = 0x0A95;
  3236 	testText[24] = 0x0ACD;
  3237 	testText[25] = 0x0AB7;
  3238 	
  3239 	
  3240 	testText[26] = 0x0A95;
  3241 	testText[27] = 0x0ACD;
  3242 	testText[28] = 0x0AB7;
  3243 	testText[29] = 0x0ACD;
  3244 	testText[30] = 0x0AA4;
  3245 	
  3246 	testText[31] = 0x0A9C;
  3247 	testText[32] = 0x0ACD;
  3248 	testText[33] = 0x0AB7;
  3249 	testText[34] = 0x0ACD;
  3250 	testText[35] = 0x0AA4;
  3251 	
  3252 	testText[36] = 0x0A9C;
  3253 	testText[37] = 0x0ACD;
  3254 	testText[38] = 0x0A9E;
  3255 	testText[39] = 0x0ACD;
  3256 	testText[40] = 0x0AA4;
  3257 	
  3258 	//Requirement (GUJ 005)
  3259 	
  3260 	testText[41] = 0x0AB0;
  3261 	testText[42] = 0x0ACD;
  3262 	testText[43] = 0x0A95;
  3263 	
  3264 	testText[44] = 0x0AB0;
  3265 	testText[45] = 0x0ACD;
  3266 	testText[46] = 0x0A95;
  3267 	testText[47] = 0x0AC9;
  3268 	
  3269 	testText[48] = 0x0AB0;
  3270 	testText[49] = 0x0ACD;
  3271 	testText[50] = 0x0A95;
  3272 	testText[51] = 0x0A82;
  3273 	
  3274 	testText[52] = 0x0AB0;
  3275 	testText[53] = 0x0ACD;
  3276 	testText[54] = 0x0A95;
  3277 	testText[55] = 0x0AC9;
  3278 	testText[56] = 0x0A82;
  3279 	testText[57] = 0x0020;
  3280 	
  3281 	//Requirement (GUJ 006)
  3282 	
  3283 	testText[58] = 0x0A97;
  3284 	testText[59] = 0x0ACD;
  3285 	testText[60] = 0x0AB0;
  3286 	
  3287 	testText[61] = 0x0A9A;
  3288 	testText[62] = 0x0ACD;
  3289 	testText[63] = 0x0AB0;
  3290 	
  3291 	testText[64] = 0x0A97;
  3292 	testText[65] = 0x0ACD;
  3293 	testText[66] = 0x0AB0;
  3294 	testText[67] = 0x0ACD;
  3295 	testText[68] = 0x0AA4;
  3296 	
  3297 	testText[69] = 0x0A9A;
  3298 	testText[70] = 0x0ACD;
  3299 	testText[71] = 0x0AB0;
  3300 	testText[72] = 0x0ACD;
  3301 	testText[73] = 0x0AA4;
  3302 	
  3303 	//Requirement (GUJ 007)
  3304 	
  3305 	testText[74] = 0x0A95;
  3306 	testText[75] = 0x0ACD;
  3307 	testText[76] = 0x0AB0;
  3308 	
  3309 	testText[77] = 0x0A9C;
  3310 	testText[78] = 0x0ACD;
  3311 	testText[79] = 0x0AB0;
  3312 	
  3313 	testText[80] = 0x0A95;
  3314 	testText[81] = 0x0ACD;
  3315 	testText[82] = 0x0AB0;
  3316 	testText[83] = 0x0ACD;
  3317 	testText[84] = 0x0AA4;
  3318 	
  3319 	testText[85] = 0x0A9C;
  3320 	testText[86] = 0x0ACD;
  3321 	testText[87] = 0x0AB0;
  3322 	testText[88] = 0x0ACD;
  3323 	testText[89] = 0x0AA4;
  3324 	
  3325 	//Requirement (GUJ 008)
  3326 	
  3327 	testText[90] = 0x0A9B;
  3328 	testText[91] = 0x0ACD;
  3329 	testText[92] = 0x0AB0;
  3330 	
  3331 	testText[93] = 0x0AAF;
  3332 	testText[94] = 0x0ACD;
  3333 	testText[95] = 0x0AB0;
  3334 	
  3335 	testText[96] = 0x0A9B;
  3336 	testText[97] = 0x0ACD;
  3337 	testText[98] = 0x0AB0;
  3338 	testText[99] = 0x0ACD;
  3339 	testText[100]= 0x0AA4;
  3340 	
  3341 	testText[101] = 0x0AAF;
  3342 	testText[102] = 0x0ACD;
  3343 	testText[103] = 0x0AB0;
  3344 	
  3345 	testText[104] = 0x0AAF;
  3346 	testText[105] = 0x0ACD;
  3347 	testText[106] = 0x0AB0;
  3348 	testText[107] = 0x0ACD;
  3349 	testText[108] = 0x0AA4;
  3350 	
  3351 	testText[109] = 0x0AB0;
  3352 	testText[110] = 0x0ACD;
  3353 	testText[111] = 0x0AB0;
  3354 	testText[112] = 0x0ACD;
  3355 	testText[113] = 0x0AB0;
  3356 	
  3357 	//Requirement (GUJ 009)
  3358 	
  3359 	testText[114] = 0x0A9F;
  3360 	testText[115] = 0x0ACD;
  3361 	testText[116] = 0x0AAF;
  3362 	
  3363 	testText[117] = 0x0A9B;
  3364 	testText[118] = 0x0ACD;
  3365 	testText[119] = 0x0AAF;
  3366 	
  3367 	testText[120] = 0x0AA2;
  3368 	testText[121] = 0x0ACD;
  3369 	testText[122] = 0x0AAF;
  3370 	
  3371 	testText[123] = 0x0A97;
  3372 	testText[124] = 0x0ACD;
  3373 	testText[125] = 0x0AAF;
  3374 	
  3375 	//Requirement (GUJ 010)
  3376 	
  3377 	testText[126] = 0x0A9F;
  3378 	testText[127] = 0x0ACD;
  3379 	testText[128] = 0x0AA0;
  3380 	
  3381 	testText[129] = 0x0AA6;
  3382 	testText[130] = 0x0ACD;
  3383 	testText[131] = 0x0AB5;
  3384 	
  3385 	testText[132] = 0x0A9F;
  3386 	testText[133] = 0x0ACD;
  3387 	testText[134] = 0x0AA0;
  3388 	testText[135] = 0x0ACD;
  3389 	testText[136] = 0x0AA4;
  3390 	
  3391 	
  3392 	testText[137] = 0x0AA6;
  3393 	testText[138] = 0x0ACD;
  3394 	testText[139] = 0x0AB5;
  3395 	testText[140] = 0x0ACD;
  3396 	testText[141] = 0x0AA4;
  3397 	
  3398 	//Requirement (GUJ 011)
  3399 	
  3400 	testText[142] = 0x0AB0;
  3401 	testText[143] = 0x0AC2;
  3402 	
  3403 	testText[144] = 0x0AB9;
  3404 	testText[145] = 0x0AC3;
  3405 	
  3406 	testText[146] = 0x0AA6;
  3407 	testText[147] = 0x0AC3;
  3408 	
  3409 	testText[148] = 0x0A9C;
  3410 	testText[149] = 0x0AC0;
  3411 	
  3412 	//Subscript ligutares
  3413 	
  3414 	
  3415 	testText[150] = 0x0A95;
  3416 	testText[151] = 0x0A81;
  3417 	
  3418 	testText[152] = 0x0A95;
  3419 	testText[153] = 0x0ABE;
  3420 	testText[154] = 0x0A81;
  3421 	
  3422 	testText[155] = 0x0A95;
  3423 	testText[156] = 0x0AC1;
  3424 	testText[157] = 0x0A81;
  3425 	
  3426 	testText[158] = 0x0A8D;
  3427 	testText[159] = 0x0A81;
  3428 	
  3429 	testText[160] = 0x0A88;
  3430 	testText[161] = 0x0A81;
  3431 	
  3432 	
  3433 	
  3434 	param.iText.Set(testText); 
  3435 				
  3436 	param.iPosInText = 0;
  3437 	param.iPen.iX = param.iPen.iY = 0;
  3438 	RShapeInfo shapeInfo;
  3439 	
  3440 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  3441 
  3442 	TEST(r && param.iPosInText ==  3
  3443 		   && param.iOutputGlyphs == 1  
  3444 		   && param.iOutput[0].iCode == 0x800009ec);
  3445 
  3446 	#if defined __WINS__ || defined __WINSCW__
  3447 	TEST(r && param.iPen.iX == 9);
  3448 	#endif
  3449 	
  3450 	
  3451 	INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
  3452 	
  3453 	param.iPosInText = 	4;
  3454 	param.iPen.iX = param.iPen.iY = 0;
  3455 		
  3456 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  3457 
  3458 	TEST(r && param.iPosInText ==  11
  3459 		   && param.iOutputGlyphs ==  4
  3460 		   && param.iOutput[0].iCode == 0x800009d7
  3461 		   && param.iOutput[1].iCode == 0x800009d8
  3462 		   && param.iOutput[2].iCode == 0x800009d9
  3463 		   && param.iOutput[3].iCode == 0x80000967 );
  3464 	
  3465 	#if defined __WINS__ || defined __WINSCW__
  3466 	TEST(r && param.iPen.iX == 34);
  3467 	#endif
  3468 
  3469 	INFO_PRINTF7(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x iOutput[2].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode, param.iOutput[2].iCode);
  3470 	
  3471 	param.iPosInText = 11;
  3472 	param.iPen.iX = param.iPen.iY = 0;
  3473 		
  3474 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  3475 
  3476 	TEST(r && param.iPosInText ==	14  
  3477 		   && param.iOutputGlyphs == 2  
  3478 		   && param.iOutput[0].iCode == 0x800009d6
  3479 		   && param.iOutput[1].iCode == 0x80000969   );
  3480 
  3481 	#if defined __WINS__ || defined __WINSCW__
  3482 	TEST(r && param.iPen.iX == 22);
  3483 	#endif
  3484 	
  3485 	INFO_PRINTF6(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
  3486 	
  3487 	param.iPosInText = 16;
  3488 	param.iPen.iX = param.iPen.iY = 0;
  3489 		
  3490 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  3491 
  3492 	TEST(r && param.iPosInText ==  23
  3493 		   && param.iOutputGlyphs == 3 
  3494 		   && param.iOutput[0].iCode == 0x800009da
  3495 		   && param.iOutput[1].iCode == 0x800009dc
  3496 		   && param.iOutput[2].iCode == 0x80000aad);
  3497 	
  3498 	#if defined __WINS__ || defined __WINSCW__
  3499 	TEST(r && param.iPen.iX == 30);
  3500 	#endif
  3501 	
  3502 		
  3503 	INFO_PRINTF7(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x iOutput[2].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode, param.iOutput[2].iCode);
  3504 	
  3505 	param.iPosInText = 	23;
  3506 	param.iPen.iX = param.iPen.iY = 0;
  3507 		
  3508 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  3509 
  3510 	TEST(r && param.iPosInText == 26
  3511 		   && param.iOutputGlyphs == 1  
  3512 		   && param.iOutput[0].iCode == 0x800009d2 );
  3513 
  3514 	#if defined __WINS__ || defined __WINSCW__
  3515 	TEST(r && param.iPen.iX == 12);
  3516 	#endif
  3517 		
  3518 	INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
  3519 
  3520 	
  3521 	param.iPosInText = 26;
  3522 	param.iPen.iX = param.iPen.iY = 0;
  3523 		
  3524 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  3525 
  3526 	TEST(r && param.iPosInText == 31
  3527 		   && param.iOutputGlyphs == 2  
  3528 		   && param.iOutput[0].iCode == 0x800009f8
  3529 		   && param.iOutput[1].iCode == 0x80000971);
  3530 
  3531 	#if defined __WINS__ || defined __WINSCW__
  3532 	TEST(r && param.iPen.iX == 18);
  3533 	#endif
  3534 	
  3535 	INFO_PRINTF6(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
  3536 	
  3537 	param.iPosInText = 	31;
  3538 	param.iPen.iX = param.iPen.iY = 0;
  3539 		
  3540 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  3541 
  3542 	TEST(r && param.iPosInText ==  36
  3543 		   && param.iOutputGlyphs == 3
  3544 		   && param.iOutput[0].iCode == 0x800009dd
  3545 		   && param.iOutput[1].iCode == 0x800009f5
  3546 		   && param.iOutput[2].iCode == 0x80000971);
  3547 
  3548 	#if defined __WINS__ || defined __WINSCW__
  3549 	TEST(r && param.iPen.iX == 30);
  3550 	#endif
  3551 	
  3552 	INFO_PRINTF7(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x iOutput[2].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode, param.iOutput[2].iCode);	
  3553 	
  3554 	param.iPosInText = 36;
  3555 	param.iPen.iX = param.iPen.iY = 0;
  3556 		
  3557 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  3558 
  3559 	TEST(r && param.iPosInText == 41
  3560 		   && param.iOutputGlyphs == 2
  3561 		   && param.iOutput[0].iCode == 0x800009f9
  3562 		   && param.iOutput[1].iCode == 0x80000971);
  3563 	
  3564 	#if defined __WINS__ || defined __WINSCW__
  3565 	TEST(r && param.iPen.iX == 17);
  3566 	#endif
  3567 
  3568 	INFO_PRINTF6(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
  3569 	
  3570 	param.iPosInText = 	41;
  3571 	param.iPen.iX = param.iPen.iY = 0;
  3572 		
  3573 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  3574 	
  3575 	TEST(r && param.iPosInText == 44
  3576 		   && param.iOutputGlyphs == 2
  3577 		   && param.iOutput[0].iCode ==  0x80000962
  3578 		   && param.iOutput[1].iCode == 0x800009d4);
  3579 	
  3580 	#if defined __WINS__ || defined __WINSCW__
  3581 	TEST(r && param.iPen.iX == 8);
  3582 	#endif
  3583 		
  3584 	INFO_PRINTF6(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
  3585 	
  3586 	param.iPosInText = 44;
  3587 	param.iPen.iX = param.iPen.iY = 0;
  3588 		
  3589 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  3590 
  3591 	TEST(r && param.iPosInText == 48 
  3592 		   && param.iOutputGlyphs == 2
  3593 		   && param.iOutput[0].iCode == 0x80000962
  3594 		   && param.iOutput[1].iCode == 0x80000ae1 );
  3595 
  3596 	#if defined __WINS__ || defined __WINSCW__
  3597 	TEST(r && param.iPen.iX == 13);
  3598 	#endif
  3599 	
  3600 	INFO_PRINTF6(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
  3601 	
  3602 	param.iPosInText = 48;
  3603 	param.iPen.iX = param.iPen.iY = 0;
  3604 		
  3605 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  3606 
  3607 	TEST(r && param.iPosInText == 52
  3608 		   && param.iOutputGlyphs == 2
  3609 		   && param.iOutput[0].iCode == 0x80000962
  3610 		   && param.iOutput[1].iCode == 0x80000ae9);
  3611 
  3612 	#if defined __WINS__ || defined __WINSCW__
  3613 	TEST(r && param.iPen.iX == 8);
  3614 	#endif
  3615 	
  3616 	INFO_PRINTF6(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
  3617 	
  3618 	param.iPosInText = 52;
  3619 	param.iPen.iX = param.iPen.iY = 0;
  3620 		
  3621 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  3622 
  3623 	TEST(r && param.iPosInText == 57  
  3624 		   && param.iOutputGlyphs == 2
  3625 		   && param.iOutput[0].iCode == 0x80000962
  3626 		   && param.iOutput[1].iCode == 0x80000ae2);
  3627 
  3628 	#if defined __WINS__ || defined __WINSCW__
  3629 	TEST(r && param.iPen.iX == 13);
  3630 	#endif
  3631 
  3632 	INFO_PRINTF6(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
  3633 	
  3634 	param.iPosInText = 58;
  3635 	param.iPen.iX = param.iPen.iY = 0;
  3636 		
  3637 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  3638 
  3639 	TEST(r && param.iPosInText ==  61
  3640 		   && param.iOutputGlyphs == 1
  3641 		   && param.iOutput[0].iCode ==	0x80000a1e );
  3642 
  3643 	#if defined __WINS__ || defined __WINSCW__
  3644 	TEST(r && param.iPen.iX == 11);
  3645 	#endif
  3646 		
  3647 	INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
  3648 	
  3649 	param.iPosInText = 	61;
  3650 	param.iPen.iX = param.iPen.iY = 0;
  3651 		
  3652 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  3653 
  3654 	TEST(r && param.iPosInText ==  64
  3655 		   && param.iOutputGlyphs == 1
  3656 		   && param.iOutput[0].iCode == 0x80000a21 );
  3657 
  3658 	#if defined __WINS__ || defined __WINSCW__
  3659 	TEST(r && param.iPen.iX == 10);
  3660 	#endif
  3661 
  3662 	INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
  3663 	
  3664 	param.iPosInText = 64;
  3665 	param.iPen.iX = param.iPen.iY = 0;
  3666 		
  3667 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  3668 
  3669 	TEST(r && param.iPosInText == 69 
  3670 		   && param.iOutputGlyphs == 2
  3671 		   && param.iOutput[0].iCode == 0x80000a64
  3672 		   && param.iOutput[1].iCode == 0x80000971 );
  3673 
  3674 	#if defined __WINS__ || defined __WINSCW__
  3675 	TEST(r && param.iPen.iX == 17);
  3676 	#endif
  3677 	
  3678 	INFO_PRINTF6(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
  3679 	
  3680 	param.iPosInText = 	69;
  3681 	param.iPen.iX = param.iPen.iY = 0;
  3682 		
  3683 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  3684 
  3685 	TEST(r && param.iPosInText == 74
  3686 		   && param.iOutputGlyphs == 2
  3687 		   && param.iOutput[0].iCode == 0x80000a67
  3688 		   && param.iOutput[1].iCode == 0x80000971);
  3689 
  3690 	#if defined __WINS__ || defined __WINSCW__
  3691 	TEST(r && param.iPen.iX == 16);
  3692 	#endif
  3693 		
  3694 	INFO_PRINTF6(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
  3695 	
  3696 	param.iPosInText = 	74;
  3697 	param.iPen.iX = param.iPen.iY = 0;
  3698 		
  3699 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  3700 
  3701 	TEST(r && param.iPosInText ==  77
  3702 		   && param.iOutputGlyphs == 1
  3703 		   && param.iOutput[0].iCode == 0x80000a1c);
  3704 
  3705 	#if defined __WINS__ || defined __WINSCW__
  3706 	TEST(r && param.iPen.iX == 8);
  3707 	#endif
  3708 		
  3709 	INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
  3710 	
  3711 	param.iPosInText = 	77;
  3712 	param.iPen.iX = param.iPen.iY = 0;
  3713 		
  3714 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  3715 
  3716 	TEST(r && param.iPosInText ==  80
  3717 		   && param.iOutputGlyphs == 1
  3718 		   && param.iOutput[0].iCode == 0x80000a23);
  3719 
  3720 	#if defined __WINS__ || defined __WINSCW__
  3721 	TEST(r && param.iPen.iX == 15);
  3722 	#endif
  3723 	
  3724 	INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
  3725 		
  3726 	param.iPosInText = 80;
  3727 	param.iPen.iX = param.iPen.iY = 0;
  3728 	
  3729 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  3730 
  3731 	TEST(r && param.iPosInText == 85
  3732 		   && param.iOutputGlyphs == 2
  3733 		   && param.iOutput[0].iCode == 0x80000a62
  3734 		   && param.iOutput[1].iCode == 0x80000971);
  3735 
  3736 	#if defined __WINS__ || defined __WINSCW__
  3737 	TEST(r && param.iPen.iX == 17);
  3738 	#endif
  3739 		
  3740 	INFO_PRINTF6(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
  3741 	
  3742 	param.iPosInText = 85;
  3743 	param.iPen.iX = param.iPen.iY = 0;
  3744 	
  3745 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  3746 
  3747 	TEST(r && param.iPosInText ==  90
  3748 		   && param.iOutputGlyphs == 2
  3749 		   && param.iOutput[0].iCode == 0x80000a69
  3750 		   && param.iOutput[1].iCode == 0x80000971);
  3751 
  3752 	#if defined __WINS__ || defined __WINSCW__
  3753 	TEST(r && param.iPen.iX == 24);
  3754 	#endif
  3755 	
  3756 	INFO_PRINTF6(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
  3757 	
  3758 	param.iPosInText =90;
  3759 	param.iPen.iX = param.iPen.iY = 0;
  3760 	
  3761 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  3762 
  3763 	TEST(r && param.iPosInText == 93
  3764 		   && param.iOutputGlyphs == 1
  3765 		   && param.iOutput[0].iCode == 0x80000a22 );
  3766 
  3767 	#if defined __WINS__ || defined __WINSCW__
  3768 	TEST(r && param.iPen.iX == 12);
  3769 	#endif
  3770 	
  3771 	INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
  3772 	
  3773 	param.iPosInText = 93;
  3774 	param.iPen.iX = param.iPen.iY = 0;
  3775 	
  3776 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  3777 
  3778 	TEST(r && param.iPosInText == 96
  3779 		   && param.iOutputGlyphs == 1
  3780 		   && param.iOutput[0].iCode == 0x80000a35 );
  3781 
  3782 	#if defined __WINS__ || defined __WINSCW__
  3783 	TEST(r && param.iPen.iX == 10);
  3784 	#endif
  3785 	
  3786 	INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
  3787 	
  3788 	param.iPosInText = 96;
  3789 	param.iPen.iX = param.iPen.iY = 0;
  3790 	
  3791 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  3792 
  3793 	TEST(r && param.iPosInText ==  101
  3794 		   && param.iOutputGlyphs == 2
  3795 		   && param.iOutput[0].iCode == 0x80000a68 
  3796 		   && param.iOutput[1].iCode == 0x80000971);
  3797 	
  3798 	#if defined __WINS__ || defined __WINSCW__
  3799 	TEST(r && param.iPen.iX == 21);
  3800 	#endif
  3801 	
  3802 	INFO_PRINTF6(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
  3803 	
  3804 	param.iPosInText = 101;
  3805 	param.iPen.iX = param.iPen.iY = 0;
  3806 	
  3807 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  3808 
  3809 	TEST(r && param.iPosInText == 104
  3810 		   && param.iOutputGlyphs == 1
  3811 		   && param.iOutput[0].iCode == 0x80000a35 );
  3812 	#if defined __WINS__ || defined __WINSCW__
  3813 	TEST(r && param.iPen.iX == 10);
  3814 	#endif
  3815 	
  3816 	INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
  3817 	
  3818 	param.iPosInText = 104;
  3819 	param.iPen.iX = param.iPen.iY = 0;
  3820 	
  3821 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  3822 
  3823 	TEST(r && param.iPosInText == 109
  3824 		   && param.iOutputGlyphs == 2
  3825 		   && param.iOutput[0].iCode == 0x80000a7b 
  3826 		   && param.iOutput[1].iCode == 0x80000971 );
  3827 
  3828 	#if defined __WINS__ || defined __WINSCW__
  3829 	TEST(r && param.iPen.iX == 16);
  3830 	#endif
  3831 	
  3832 	INFO_PRINTF6(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
  3833 	
  3834 	param.iPosInText = 109;
  3835 	param.iPen.iX = param.iPen.iY = 0;
  3836 	
  3837 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  3838 
  3839 	TEST(r && param.iPosInText ==  114
  3840 		   && param.iOutputGlyphs == 2
  3841 		   && param.iOutput[0].iCode == 0x80000a36
  3842 		   && param.iOutput[1].iCode == 0x800009d4 );
  3843 	
  3844 	#if defined __WINS__ || defined __WINSCW__
  3845 	TEST(r && param.iPen.iX == 7);
  3846 	#endif
  3847 	
  3848 	INFO_PRINTF6(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
  3849 	
  3850 	param.iPosInText = 114;
  3851 	param.iPen.iX = param.iPen.iY = 0;
  3852 	
  3853 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  3854 
  3855 	TEST(r && param.iPosInText ==  117
  3856 		   && param.iOutputGlyphs == 1
  3857 		   && param.iOutput[0].iCode == 0x80000aae);
  3858 
  3859 	#if defined __WINS__ || defined __WINSCW__
  3860 	TEST(r && param.iPen.iX == 17);
  3861 	#endif
  3862 		
  3863 	INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
  3864 	
  3865 	param.iPosInText = 117;
  3866 	param.iPen.iX = param.iPen.iY = 0;
  3867 	
  3868 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  3869 
  3870 	TEST(r && param.iPosInText ==  120
  3871 		   && param.iOutputGlyphs == 1
  3872 		   && param.iOutput[0].iCode == 0x80000aab );
  3873 
  3874 	#if defined __WINS__ || defined __WINSCW__
  3875 	TEST(r && param.iPen.iX == 21);
  3876 	#endif
  3877 	
  3878 	INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
  3879 	
  3880 	param.iPosInText = 120;
  3881 	param.iPen.iX = param.iPen.iY = 0;
  3882 	
  3883 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  3884 
  3885 	TEST(r && param.iPosInText ==  123
  3886 		   && param.iOutputGlyphs == 1
  3887 		   && param.iOutput[0].iCode == 0x80000ab5 );
  3888 
  3889 	#if defined __WINS__ || defined __WINSCW__
  3890 	TEST(r && param.iPen.iX == 18);
  3891 	#endif
  3892 	
  3893 	INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
  3894 	
  3895 	param.iPosInText = 123;
  3896 	param.iPen.iX = param.iPen.iY = 0;
  3897 	
  3898 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  3899 
  3900 	TEST(r && param.iPosInText ==  126
  3901 		   && param.iOutputGlyphs == 2
  3902 		   && param.iOutput[0].iCode == 0x800009d8
  3903 		   && param.iOutput[1].iCode == 0x8000097b);
  3904 
  3905 	#if defined __WINS__ || defined __WINSCW__
  3906 	TEST(r && param.iPen.iX == 17);
  3907 	#endif
  3908 
  3909 	INFO_PRINTF6(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
  3910 	
  3911 	param.iPosInText = 126;
  3912 	param.iPen.iX = param.iPen.iY = 0;
  3913 	
  3914 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  3915 
  3916 	TEST(r && param.iPosInText ==  129
  3917 		   && param.iOutputGlyphs == 1
  3918 		   && param.iOutput[0].iCode == 0x80000aad);
  3919 
  3920 	#if defined __WINS__ || defined __WINSCW__
  3921 	TEST(r && param.iPen.iX == 9);
  3922 	#endif
  3923 	
  3924 	INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
  3925 		
  3926 	param.iPosInText = 129;
  3927 	param.iPen.iX = param.iPen.iY = 0;
  3928 	
  3929 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  3930 
  3931 	TEST(r && param.iPosInText ==  132
  3932 		   && param.iOutputGlyphs == 1
  3933 		   && param.iOutput[0].iCode == 0x80000ac0 );
  3934 
  3935 	#if defined __WINS__ || defined __WINSCW__
  3936 	TEST(r && param.iPen.iX == 10);
  3937 	#endif
  3938 		
  3939 	INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
  3940 	
  3941 	param.iPosInText =132;
  3942 	param.iPen.iX = param.iPen.iY = 0;
  3943 	
  3944 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  3945 
  3946 	TEST(r && param.iPosInText ==  137
  3947 		   && param.iOutputGlyphs == 3
  3948 		   && param.iOutput[0].iCode == 0x800009e0
  3949 		   && param.iOutput[1].iCode == 0x800009e1
  3950 		   && param.iOutput[2].iCode == 0x80000971);
  3951 
  3952 	#if defined __WINS__ || defined __WINSCW__
  3953 	TEST(r && param.iPen.iX == 26);
  3954 	#endif
  3955 	
  3956 	
  3957 	INFO_PRINTF7(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x iOutput[2].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode, param.iOutput[2].iCode);	
  3958 	
  3959 	param.iPosInText = 137;
  3960 	param.iPen.iX = param.iPen.iY = 0;
  3961 	
  3962 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  3963 	
  3964 	TEST(r && param.iPosInText == 142 
  3965 		   && param.iOutputGlyphs == 3
  3966 		   && param.iOutput[0].iCode == 0x800009e7 
  3967 		   && param.iOutput[1].iCode == 0x800009f3
  3968 		   && param.iOutput[2].iCode == 0x80000971);
  3969 
  3970 	#if defined __WINS__ || defined __WINSCW__
  3971 	TEST(r && param.iPen.iX == 23);
  3972 	#endif
  3973 	
  3974 	INFO_PRINTF7(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x iOutput[2].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode, param.iOutput[2].iCode);	
  3975 	
  3976 	param.iPosInText = 142;
  3977 	param.iPen.iX = param.iPen.iY = 0;
  3978 	
  3979 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  3980 	
  3981 	TEST(r && param.iPosInText == 144
  3982 		   && param.iOutputGlyphs == 1
  3983 		   && param.iOutput[0].iCode == 0x80000b04);
  3984 
  3985 	#if defined __WINS__ || defined __WINSCW__
  3986 	TEST(r && param.iPen.iX == 7);
  3987 	#endif
  3988 	
  3989 	INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
  3990 	
  3991 	param.iPosInText = 144;
  3992 	param.iPen.iX = param.iPen.iY = 0;
  3993 	
  3994 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  3995 	
  3996 	TEST(r && param.iPosInText == 146
  3997 		   && param.iOutputGlyphs == 1
  3998 		   && param.iOutput[0].iCode == 0x80000b05);
  3999 
  4000 	#if defined __WINS__ || defined __WINSCW__
  4001 	TEST(r && param.iPen.iX == 9);
  4002 	#endif
  4003 	
  4004 	INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
  4005 	
  4006 	param.iPosInText = 146;
  4007 	param.iPen.iX = param.iPen.iY = 0;
  4008 	
  4009 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  4010 	
  4011 	TEST(r && param.iPosInText == 148
  4012 		   && param.iOutputGlyphs ==  1
  4013 		   && param.iOutput[0].iCode == 0x80000b02);
  4014 
  4015 	#if defined __WINS__ || defined __WINSCW__
  4016 	TEST(r && param.iPen.iX == 7);
  4017 	#endif
  4018 
  4019 	INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
  4020 	
  4021 	param.iPosInText = 148;
  4022 	param.iPen.iX = param.iPen.iY = 0;
  4023 	
  4024 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  4025 	
  4026 	TEST(r && param.iPosInText == 150
  4027 		   && param.iOutputGlyphs == 1
  4028 		   && param.iOutput[0].iCode == 0x80000aff);
  4029 
  4030 	#if defined __WINS__ || defined __WINSCW__
  4031 	TEST(r && param.iPen.iX == 16);
  4032 	#endif
  4033 
  4034 	INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
  4035 	
  4036 	param.iPosInText = 150;
  4037 	param.iPen.iX = param.iPen.iY = 0;
  4038 	
  4039 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  4040 	
  4041 	TEST(r && param.iPosInText == 152 
  4042 		   && param.iOutputGlyphs == 2
  4043 		   && param.iOutput[0].iCode == 0x80000962
  4044 		   && param.iOutput[1].iCode ==0x80000951);
  4045 
  4046 	#if defined __WINS__ || defined __WINSCW__
  4047 	TEST(r && param.iPen.iX == 8);
  4048 	#endif
  4049 	
  4050 	INFO_PRINTF6(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
  4051 
  4052 	param.iPosInText = 152;
  4053 	param.iPen.iX = param.iPen.iY = 0;
  4054 	
  4055 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  4056 	
  4057 	TEST(r && param.iPosInText == 155
  4058 		   && param.iOutputGlyphs == 3
  4059 		   && param.iOutput[0].iCode == 0x80000962
  4060 		   && param.iOutput[1].iCode == 0x80000986
  4061 		   && param.iOutput[2].iCode == 0x80000951);
  4062 
  4063 	#if defined __WINS__ || defined __WINSCW__
  4064 	TEST(r && param.iPen.iX == 12);
  4065 	#endif
  4066 
  4067 	
  4068 	INFO_PRINTF7(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x iOutput[2].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode, param.iOutput[2].iCode);	
  4069 	
  4070 	param.iPosInText = 155;
  4071 	param.iPen.iX = param.iPen.iY = 0;
  4072 	
  4073 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  4074 	
  4075 	TEST(r && param.iPosInText ==  158
  4076 		   && param.iOutputGlyphs == 3
  4077 		   && param.iOutput[0].iCode == 0x80000962
  4078 		   && param.iOutput[1].iCode == 0x80000989
  4079 		   && param.iOutput[2].iCode == 0x80000951);
  4080 
  4081 	#if defined __WINS__ || defined __WINSCW__
  4082 	TEST(r && param.iPen.iX == 8);
  4083 	#endif
  4084 
  4085 	
  4086 	INFO_PRINTF7(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x iOutput[2].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode, param.iOutput[2].iCode);	
  4087 	param.iPosInText = 158;
  4088 	param.iPen.iX = param.iPen.iY = 0;
  4089 	
  4090 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  4091 	
  4092 	TEST(r && param.iPosInText ==  160
  4093 		   && param.iOutputGlyphs == 1
  4094 		   && param.iOutput[0].iCode == 0x80000aee);
  4095 		   
  4096 	#if defined __WINS__ || defined __WINSCW__
  4097 	TEST(r && param.iPen.iX == 14);
  4098 	#endif
  4099 	
  4100 	INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
  4101 	
  4102 	param.iPosInText = 160;
  4103 	param.iPen.iX = param.iPen.iY = 0;
  4104 	
  4105 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  4106 	
  4107 	TEST(r && param.iPosInText ==  162
  4108 		   && param.iOutputGlyphs == 1
  4109 		   && param.iOutput[0].iCode == 0x80000aed);
  4110 
  4111 	#if defined __WINS__ || defined __WINSCW__
  4112 	TEST(r && param.iPen.iX == 10);
  4113 	#endif
  4114 	
  4115 	INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
  4116 	}
  4117 	
  4118 	 
  4119 void CTGlyphSelection::TestBengaliChars(CFbsFont* aFont)
  4120 	{
  4121 	INFO_PRINTF1(_L("Test Bengali Glyphs"));
  4122 	
  4123 	// Do the testing
  4124 	
  4125 	TBool r;
  4126 	TBuf<115> testText(0);
  4127 	CFont::TPositionParam param;
  4128 	param.iDirection = CFont::EHorizontal;
  4129 	param.iFlags = CFont::TPositionParam::EFLogicalOrder;
  4130 
  4131 	testText.SetLength(115);
  4132 	// Make sure there is no garbage values in the memory we are using.
  4133 	for (TInt i = 0; i < testText.Length(); i++)
  4134 		testText[i]=0xFFFF;
  4135 	
  4136 	//Testdata for Bengali language
  4137 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4002"));
  4138 /**
  4139 @SYMTestCaseID 				GRAPHICS-SYSLIB-GDI-CIT-4002
  4140 @SYMTestCaseDesc 			Automated GDI testing for Bengali
  4141 @SYMTestPriority 			High
  4142 @SYMTestActions  			Attempt to compose various invalid Bengali glyph clusters to test the requirement.
  4143 				 			If any part of stored text (e.g. received or downloaded document) is not properly encoded in logical order, the relevant text handling processes must treat that part as an invalid sequence of text and use appropriate fallback mechanisms. Invalid sequences of characters must be rendered as incomplete syllables and rendering engine must be able to handle invalid coding appropriately	
  4144 @SYMTestExpectedResults 	Rendering engine will render as incomplete syllables
  4145 @SYMPREQ 					1766 Bengali for Sphinx
  4146 @SYMREQ 					8741 Bengali Text Rendering
  4147 */
  4148 	
  4149 	// BEN002: Test invalid sequences
  4150 	testText[0] = 0x09C7;
  4151 	testText[1] = 0x0995;
  4152 	testText[2] = 0x0995;
  4153 	testText[3] = 0x09C1;
  4154 	testText[4] = 0x09C1;
  4155 	testText[5] = 0x0995;
  4156 	testText[6] = 0x09CD;
  4157 	testText[7] = 0x09C1;
  4158 	testText[8] = 0x0995;
  4159 	testText[9] = 0x0981;
  4160 	testText[10] = 0x09C1;
  4161 	
  4162 	param.iText.Set(testText);
  4163 	RShapeInfo shapeInfo;
  4164 	param.iPosInText = 0;
  4165 	param.iPen.iX = param.iPen.iY = 0;
  4166 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  4167 	
  4168 	TEST(r && param.iPosInText == 1
  4169 			   && param.iOutputGlyphs == 2
  4170 			   && param.iOutput[0].iCode == 0x80000ce5
  4171 			   && param.iOutput[1].iCode == 0x8000058f);
  4172 
  4173 	#if defined __WINS__ || defined __WINSCW__
  4174 	TEST(r && param.iPen.iX == 15);
  4175 	#endif
  4176 	
  4177 	INFO_PRINTF6(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
  4178 		
  4179 	param.iPosInText = 1;
  4180 	param.iPen.iX = param.iPen.iY = 0;
  4181 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  4182 	
  4183 	TEST(r && param.iPosInText == 2
  4184 			   && param.iOutputGlyphs == 1
  4185 			   && param.iOutput[0].iCode == 0x80000cbc);
  4186 	
  4187 	#if defined __WINS__ || defined __WINSCW__
  4188 	TEST(r && param.iPen.iX == 12);
  4189 	#endif
  4190 	
  4191 	INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
  4192 	
  4193 	param.iPosInText = 2;
  4194 	param.iPen.iX = param.iPen.iY = 0;
  4195 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  4196 	
  4197 	TEST(r && param.iPosInText == 4
  4198 			   && param.iOutputGlyphs == 1
  4199 			   && param.iOutput[0].iCode == 0x80000ebe);
  4200 
  4201 	#if defined __WINS__ || defined __WINSCW__
  4202 	TEST(r && param.iPen.iX == 13);
  4203 	#endif
  4204 	
  4205 	INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
  4206 		
  4207 	param.iPosInText = 4;
  4208 	param.iPen.iX = param.iPen.iY = 0;
  4209 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  4210 	
  4211 	TEST(r && param.iPosInText == 5
  4212 			   && param.iOutputGlyphs == 2
  4213 			   && param.iOutput[0].iCode == 0x8000058f
  4214 			   && param.iOutput[1].iCode == 0x80000ce1
  4215 	   );
  4216 	#if defined __WINS__ || defined __WINSCW__
  4217 	TEST(r && param.iPen.iX == 9);
  4218 	#endif
  4219 	
  4220 	INFO_PRINTF6(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
  4221 		
  4222 	param.iPosInText = 5;
  4223 	param.iPen.iX = param.iPen.iY = 0;
  4224 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  4225 	
  4226 	TEST(r && param.iPosInText == 7
  4227 			   && param.iOutputGlyphs == 2
  4228 			   && param.iOutput[0].iCode == 0x80000cbc
  4229 			   && param.iOutput[1].iCode == 0x80000ce9
  4230 			   );
  4231 	
  4232 	#if defined __WINS__ || defined __WINSCW__
  4233 	TEST(r && param.iPen.iX == 12);
  4234 	#endif
  4235 	
  4236 	INFO_PRINTF6(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
  4237 	
  4238 	param.iPosInText = 7;
  4239 	param.iPen.iX = param.iPen.iY = 0;
  4240 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  4241 
  4242 	TEST(r && param.iPosInText == 8
  4243 			   && param.iOutputGlyphs == 2
  4244 			   && param.iOutput[0].iCode == 0x8000058f
  4245 			   && param.iOutput[1].iCode == 0x80000ce1
  4246 			   );
  4247 	
  4248 	#if defined __WINS__ || defined __WINSCW__
  4249 	TEST(r && param.iPen.iX == 9);
  4250 	#endif
  4251 	
  4252 	INFO_PRINTF6(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
  4253 		
  4254 	param.iPosInText = 8;
  4255 	param.iPen.iX = param.iPen.iY = 0;
  4256 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  4257 	
  4258 	TEST(r && param.iPosInText == 10
  4259 			   && param.iOutputGlyphs == 2
  4260 			   && param.iOutput[0].iCode == 0x80000cbc
  4261 			   && param.iOutput[1].iCode == 0x80000cad
  4262 			   );
  4263 	
  4264 	#if defined __WINS__ || defined __WINSCW__
  4265 	TEST(r && param.iPen.iX == 12);
  4266 	#endif
  4267 	
  4268 	INFO_PRINTF6(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
  4269 	
  4270 	param.iPosInText = 10;
  4271 	param.iPen.iX = param.iPen.iY = 0;
  4272 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  4273 	
  4274 	TEST(r && param.iPosInText == 11
  4275 			   && param.iOutputGlyphs == 2
  4276 			   && param.iOutput[0].iCode == 0x8000058f
  4277 			   && param.iOutput[1].iCode == 0x80000ce1
  4278 			   );
  4279 	
  4280 	#if defined __WINS__ || defined __WINSCW__
  4281 	TEST(r && param.iPen.iX == 9);
  4282 	#endif
  4283 	
  4284 	INFO_PRINTF6(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
  4285 	TRAPD(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  4286     	if (err!=KErrNone)
  4287     		INFO_PRINTF1(_L("Failed to record test result"));
  4288 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4003"));
  4289 /**
  4290 @SYMTestCaseID 				GRAPHICS-SYSLIB-GDI-CIT-4003
  4291 @SYMTestCaseDesc 			Automated GDI testing for Bengali
  4292 @SYMTestPriority 			High
  4293 @SYMTestActions  
  4294 							Passing both Bengali and Latin scripts simultaneously
  4295 @SYMTestExpectedResults 	The expected glyph clusters for given Unicode characters must be returned
  4296 @SYMPREQ 					1766 Bengali for Sphinx
  4297 @SYMREQ 					8741 Bengali Text Rendering
  4298 */
  4299 	//BEN003
  4300 	testText[11] = 0x0995;
  4301 	testText[12] = 0x0041; // Unicode value for A
  4302 	testText[13] = 0x09E6;	//Bengali digit 1
  4303 	
  4304 	param.iPosInText = 11;
  4305 	param.iPen.iX = param.iPen.iY = 0;
  4306 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  4307 	
  4308 	TEST(r && param.iPosInText == 12
  4309 			   && param.iOutputGlyphs == 1
  4310 			   && param.iOutput[0].iCode == 0x80000cbc
  4311 			   );
  4312 
  4313 	#if defined __WINS__ || defined __WINSCW__
  4314 	TEST(r && param.iPen.iX == 12);
  4315 	#endif
  4316 	
  4317 	INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
  4318 	
  4319 	param.iPosInText = 12;
  4320 	param.iPen.iX = param.iPen.iY = 0;
  4321 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  4322 
  4323 	TEST(r && param.iPosInText == 13	
  4324 			   && param.iOutputGlyphs == 1
  4325 			   && param.iOutput[0].iCode == 0x41
  4326 	  	);
  4327 	
  4328 	#if defined __WINS__ || defined __WINSCW__
  4329 	TEST(r && param.iPen.iX == 10);
  4330 	#endif
  4331 	
  4332 	INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x "), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
  4333 	
  4334 	param.iPosInText = 13;
  4335 	param.iPen.iX = param.iPen.iY = 0;
  4336 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  4337 	
  4338 	TEST(r && param.iPosInText == 14
  4339 			   && param.iOutputGlyphs == 1
  4340 			   && param.iOutput[0].iCode ==0x80000cf3
  4341 			   );
  4342 
  4343 	#if defined __WINS__ || defined __WINSCW__
  4344 	TEST(r && param.iPen.iX == 10);
  4345 	#endif
  4346 	
  4347 	INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
  4348 	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  4349     	if (err!=KErrNone)
  4350     		INFO_PRINTF1(_L("Failed to record test result"));
  4351 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4004"));
  4352 /**
  4353 @SYMTestCaseID 				GRAPHICS-SYSLIB-GDI-CIT-4004
  4354 @SYMTestCaseDesc 			Automated GDI testing for Bengali
  4355 @SYMTestPriority 			High
  4356 @SYMTestActions  			Attempt to compose various valid  Bengali glyph clusters to test the reequirement.
  4357 							Text rendering in Bengali must be based on syllables and the text rendering engine must be capable of handling the Bengali syllabic structure. If a single word is longer than one row, the line can only be broken at syllable border.
  4358 							Invalid sequences of characters must be rendered as incomplete syllables
  4359 							
  4360 @SYMTestExpectedResults 	The expected glyph clusters for given Unicode characters must be returned
  4361 @SYMPREQ 					1766: Bengali for Sphinx
  4362 @SYMREQ 					8741:  Bengali Text Rendering
  4363 */
  4364 	// BEN004: 
  4365 	testText[14] = 0x0985;
  4366 	testText[15] = 0x09A4;
  4367 	testText[16] = 0x09CD;
  4368 	testText[17] = 0x09AF;
  4369 	testText[18] = 0x09A8;
  4370 	testText[19] = 0x09CD;
  4371 	testText[20] = 0x09A4;
  4372 	
  4373 	param.iPosInText = 14;
  4374 	param.iPen.iX = param.iPen.iY = 0;
  4375 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  4376 	
  4377 	TEST(r && param.iPosInText == 15
  4378 			   && param.iOutputGlyphs == 1
  4379 			   && param.iOutput[0].iCode == 0x80000cb0
  4380 			   );
  4381 	
  4382 	#if defined __WINS__ || defined __WINSCW__
  4383 	TEST(r && param.iPen.iX == 14);
  4384 	#endif
  4385 	
  4386 	INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
  4387 		
  4388 	param.iPosInText = 15;
  4389 	param.iPen.iX = param.iPen.iY = 0;
  4390 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  4391 	
  4392 	TEST(r && param.iPosInText == 18
  4393 			   && param.iOutputGlyphs == 2
  4394 			   && param.iOutput[0].iCode ==0x80000ccb
  4395 			   && param.iOutput[1].iCode ==0x80000d6e
  4396 			   );
  4397 
  4398 	#if defined __WINS__ || defined __WINSCW__
  4399 	TEST(r && param.iPen.iX == 16);
  4400 	#endif
  4401 	
  4402 	INFO_PRINTF6(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode,param.iOutput[1].iCode);
  4403 	
  4404 	param.iPosInText = 18;
  4405 	param.iPen.iX = param.iPen.iY = 0;
  4406 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  4407 
  4408 	TEST(r && param.iPosInText == 21
  4409 			   && param.iOutputGlyphs == 1
  4410 			   && param.iOutput[0].iCode == 0x80000e14
  4411 			   );
  4412 	
  4413 	#if defined __WINS__ || defined __WINSCW__
  4414 	TEST(r && param.iPen.iX == 13);
  4415 	#endif
  4416 	
  4417 	INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
  4418 	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  4419     	if (err!=KErrNone)
  4420     		INFO_PRINTF1(_L("Failed to record test result"));
  4421 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4005"));
  4422 // BEN005
  4423 /**
  4424 @SYMTestCaseID 				GRAPHICS-SYSLIB-GDI-CIT-4005
  4425 @SYMTestCaseDesc 			Automated GDI testing for Bengali
  4426 @SYMTestPriority 			High
  4427 @SYMTestActions  			Attempt to compose various valid Bengali glyph clusters to test the requirment
  4428 							Text rendering must be able to display specified character sequences using ligatures and set of ligatures (stable/unstable) must be font dependent / configurable.
  4429 @SYMTestExpectedResults 	The expected glyph clusters for given Unicode characters must be returned
  4430 @SYMPREQ 					1766: Bengali for Sphinx
  4431 @SYMREQ 					8741:  Bengali Text Rendering
  4432 */
  4433 	testText[21] = 0x0995;
  4434 	testText[22] = 0x09CD;
  4435 	testText[23] = 0x09B7;
  4436 	
  4437 	testText[24] = 0x09A4;
  4438 	testText[25] = 0x09CD;
  4439 	testText[26] = 0x09B0;
  4440 	
  4441 	testText[27] = 0x09A6;
  4442 	testText[28] = 0x09CD;
  4443 	testText[29] = 0x09A6;
  4444 	
  4445 	
  4446 	param.iPosInText = 21;
  4447 	param.iPen.iX = param.iPen.iY = 0;
  4448 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  4449 	
  4450 	TEST(r && param.iPosInText == 24
  4451 			   && param.iOutputGlyphs == 1
  4452 			   && param.iOutput[0].iCode == 0x80000d25
  4453 			   );
  4454 
  4455 	#if defined __WINS__ || defined __WINSCW__
  4456 	TEST(r && param.iPen.iX == 15);
  4457 	#endif
  4458 	
  4459 	INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
  4460 		
  4461 	param.iPosInText = 24;
  4462 	param.iPen.iX = param.iPen.iY = 0;
  4463 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  4464 	
  4465 	TEST(r && param.iPosInText == 27
  4466 			   && param.iOutputGlyphs == 1
  4467 			   && param.iOutput[0].iCode ==0x80000d89
  4468 			   );
  4469 
  4470 	#if defined __WINS__ || defined __WINSCW__
  4471 	TEST(r && param.iPen.iX == 12);
  4472 	#endif
  4473 	
  4474 	INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
  4475 		
  4476 	param.iPosInText = 27;
  4477 	param.iPen.iX = param.iPen.iY = 0;
  4478 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  4479 	
  4480 	TEST(r && param.iPosInText == 30
  4481 			   && param.iOutputGlyphs == 1
  4482 			   && param.iOutput[0].iCode == 0x80000e0a
  4483 			   );
  4484 	
  4485 	#if defined __WINS__ || defined __WINSCW__
  4486 	TEST(r && param.iPen.iX == 13);
  4487 	#endif
  4488 	
  4489 	INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
  4490 	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  4491     	if (err!=KErrNone)
  4492     		INFO_PRINTF1(_L("Failed to record test result"));
  4493 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4006"));
  4494 // BEN006
  4495 /**
  4496 @SYMTestCaseID 				GRAPHICS-SYSLIB-GDI-CIT-4006
  4497 @SYMTestCaseDesc 			Automated GDI testing for Bengali
  4498 @SYMTestPriority		 	High
  4499 @SYMTestActions  			Attempt to compose various valid Bengali glyph clusters to test 
  4500 							whether tamil digits are recongized as numerals. 
  4501 @SYMTestExpectedResults 	The expected glyph clusters for given Unicode characters must be returned
  4502 @SYMPREQ 					1766: Bengali for Sphinx
  4503 @SYMREQ 					8741:  Bengali Text Rendering
  4504 */
  4505 	testText[30] = 0x09E6; // Bengali 1
  4506 	testText[31] = 0x0030; //Basic Latin 0
  4507 	
  4508 	
  4509 	param.iPosInText = 30;
  4510 	param.iPen.iX = param.iPen.iY = 0;
  4511 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  4512 	
  4513 	TEST(r && param.iPosInText == 31
  4514 			   && param.iOutputGlyphs == 1
  4515 			   && param.iOutput[0].iCode == 0x80000cf3
  4516 			   );
  4517 	
  4518 	#if defined __WINS__ || defined __WINSCW__
  4519 	TEST(r && param.iPen.iX == 10);
  4520 	#endif
  4521 	
  4522 	INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
  4523 	
  4524 	param.iPosInText = 31;
  4525 	param.iPen.iX = param.iPen.iY = 0;
  4526 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  4527 	
  4528 	TEST(r && param.iPosInText == 32
  4529 			   && param.iOutputGlyphs == 1
  4530 			   && param.iOutput[0].iCode == 0x80000774	 
  4531 			   );
  4532 	
  4533 	#if defined __WINS__ || defined __WINSCW__
  4534 	TEST(r && param.iPen.iX == 8);
  4535 	#endif
  4536 	
  4537 	INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x "), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
  4538 	
  4539 	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  4540     	if (err!=KErrNone)
  4541     		INFO_PRINTF1(_L("Failed to record test result"));
  4542 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4007"));
  4543 //BEN 008
  4544 /**
  4545 @SYMTestCaseID 				GRAPHICS-SYSLIB-GDI-CIT-4007
  4546 @SYMTestCaseDesc 			Automated GDI testing for Bengali
  4547 @SYMTestPriority 			High
  4548 @SYMTestActions  			Attempt to compose various valid
  4549 							All text handling processes ((rendering, editing, searching, sorting etc.)  MUST treat the sequence of a base consonant and a nukta equivalently to Nukta consonants
  4550 @SYMTestExpectedResults 	The expected glyph clusters for given Unicode characters must be returned
  4551 @SYMPREQ 					1766: Bengali for Sphinx
  4552 @SYMREQ 					8741:  Bengali Text Rendering
  4553 */
  4554 	testText[32] = 0x09AF;
  4555 	testText[33] = 0x09BC;
  4556 	testText[34] = 0x09DF;
  4557 	
  4558 	param.iPosInText = 32;
  4559 	param.iPen.iX = param.iPen.iY = 0;
  4560 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  4561 	
  4562 	TEST(r && param.iPosInText == 34
  4563 			   && param.iOutputGlyphs == 1
  4564 			   && param.iOutput[0].iCode == 0x80000cee	 
  4565 			   );
  4566 
  4567 	#if defined __WINS__ || defined __WINSCW__
  4568 	TEST(r && param.iPen.iX == 10);
  4569 	#endif
  4570 	
  4571 	INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x "), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
  4572 	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  4573     	if (err!=KErrNone)
  4574     		INFO_PRINTF1(_L("Failed to record test result"));
  4575 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4008"));
  4576 // BEN011
  4577 /**
  4578 @SYMTestCaseID 				GRAPHICS-SYSLIB-GDI-CIT-4008
  4579 @SYMTestCaseDesc 			Automated GDI testing for Bengali
  4580 @SYMTestPriority 			High
  4581 @SYMTestActions  			Attempt to compose various valid Bengali glyph clusters to test 
  4582 							Rendering engine must be capable of handling joining formatters.
  4583 @SYMTestExpectedResults 	The expected glyph clusters for given Unicode characters must be returned
  4584 @SYMPREQ 					1766: Bengali for Sphinx
  4585 @SYMREQ 					8741:  Bengali Text Rendering
  4586 */
  4587 	testText[35] = 0x0995;
  4588 	testText[36] = 0x09CD;
  4589 	testText[37] = 0x09B7;
  4590 	
  4591 	testText[38] = 0x0995;
  4592 	testText[39] = 0x09CD;
  4593 	testText[40] = 0x200C;
  4594 	testText[42] = 0x09B7;
  4595 	
  4596 	testText[43] = 0x0995;
  4597 	testText[44] = 0x09CD;
  4598 	testText[45] = 0x200D;
  4599 	testText[46] = 0x09B7;
  4600 	
  4601 	
  4602 	param.iPosInText = 35;
  4603 	param.iPen.iX = param.iPen.iY = 0;
  4604 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  4605 
  4606 	TEST(r && param.iPosInText == 38
  4607 			   && param.iOutputGlyphs == 1
  4608 			   && param.iOutput[0].iCode == 0x80000d25
  4609 			   );
  4610 	
  4611 	#if defined __WINS__ || defined __WINSCW__
  4612 	TEST(r && param.iPen.iX == 15);
  4613 	#endif
  4614 	
  4615 	INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
  4616 		
  4617 	param.iPosInText = 38;
  4618 	param.iPen.iX = param.iPen.iY = 0;
  4619 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  4620 	
  4621 	TEST(r && param.iPosInText == 40
  4622 			   && param.iOutputGlyphs == 2
  4623 			   && param.iOutput[0].iCode == 0x80000cbc
  4624 			   && param.iOutput[1].iCode == 0x80000ce9
  4625 			   );
  4626 
  4627 	#if defined __WINS__ || defined __WINSCW__
  4628 	TEST(r && param.iPen.iX == 12);
  4629 	#endif
  4630 	
  4631 	INFO_PRINTF6(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode,param.iOutput[1].iCode);
  4632 		
  4633 	param.iPosInText = 43;
  4634 	param.iPen.iX = param.iPen.iY = 0;
  4635 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  4636 	
  4637 	TEST(r && param.iPosInText == 47
  4638 			   && param.iOutputGlyphs == 2
  4639 			   && param.iOutput[0].iCode == 0x80000d2a
  4640 			   && param.iOutput[1].iCode == 0x80000cd9
  4641 			   );
  4642 	
  4643 	#if defined __WINS__ || defined __WINSCW__
  4644 	TEST(r && param.iPen.iX == 22);
  4645 	#endif
  4646 	
  4647 	INFO_PRINTF6(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
  4648 		
  4649 	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  4650     	if (err!=KErrNone)
  4651     		INFO_PRINTF1(_L("Failed to record test result"));
  4652 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4009"));
  4653 // BEN012
  4654 	
  4655 /**
  4656 @SYMTestCaseID 				GRAPHICS-SYSLIB-GDI-CIT-4009
  4657 @SYMTestCaseDesc 			Automated GDI testing for Bengali
  4658 @SYMTestPriority 			High
  4659 @SYMTestActions  			Attempt to compose various valid Bengali glyph clusters to test
  4660  							If consonant /ya/, /ra/, /la/, /ma/, /na/ or /ba/, is the last element of a consonant cluster, the consonant assumes a phala form.
  4661 @SYMTestExpectedResults 	The expected glyph clusters for given Unicode characters must be returned
  4662 @SYMPREQ 					1766: Bengali for Sphinx
  4663 @SYMREQ 					8741:  Bengali Text Rendering
  4664 */
  4665 	testText[47] = 0x09AA;
  4666 	testText[48] = 0x09CD;
  4667 	testText[49] = 0x09AF;
  4668 	
  4669 	testText[50] = 0x09AA;
  4670 	testText[51] = 0x09CD;
  4671 	testText[52] = 0x09A8;
  4672 	
  4673 	// Not working with Series60Sans font:
  4674 	testText[53] = 0x09AA;
  4675 	testText[54] = 0x09CD;
  4676 	testText[55] = 0x09AE;
  4677 	
  4678 	param.iPosInText = 47;
  4679 	param.iPen.iX = param.iPen.iY = 0;
  4680 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  4681 	
  4682 	TEST(r && param.iPosInText == 50
  4683 			   && param.iOutputGlyphs == 2
  4684 			   && param.iOutput[0].iCode == 0x80000cd0
  4685 			   );
  4686 	
  4687 	#if defined __WINS__ || defined __WINSCW__
  4688 	TEST(r && param.iPen.iX == 15);
  4689 	#endif
  4690 	
  4691 	INFO_PRINTF6(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
  4692 	
  4693 	param.iPosInText = 50;
  4694 	param.iPen.iX = param.iPen.iY = 0;
  4695 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  4696 	
  4697 	TEST(r && param.iPosInText == 53
  4698 			   && param.iOutputGlyphs == 1
  4699 			   && param.iOutput[0].iCode == 0x80000e25
  4700 			   );
  4701 	
  4702 	#if defined __WINS__ || defined __WINSCW__
  4703 	TEST(r && param.iPen.iX == 11);
  4704 	#endif
  4705 	
  4706 	INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
  4707 	// Not working with Series60Sans font:
  4708 	param.iPosInText = 53;
  4709 	param.iPen.iX = param.iPen.iY = 0;
  4710 	
  4711 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  4712 	
  4713 	TEST(r && param.iPosInText == 56
  4714 	   && param.iOutputGlyphs == 2
  4715 	   && param.iOutput[0].iCode == 0x80000d3e 
  4716 	   && param.iOutput[1].iCode == 0x80000cd4
  4717 	  	);
  4718 
  4719 	#if defined __WINS__ || defined __WINSCW__
  4720 	TEST(r && param.iPen.iX == 19);
  4721 	#endif
  4722 	
  4723 	INFO_PRINTF6(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);	
  4724 	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  4725     	if (err!=KErrNone)
  4726     		INFO_PRINTF1(_L("Failed to record test result"));
  4727 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4010"));
  4728 // BEN013	
  4729 /**
  4730 @SYMTestCaseID 				GRAPHICS-SYSLIB-GDI-CIT-4010
  4731 @SYMTestCaseDesc 			Automated GDI testing for Bengali
  4732 @SYMTestPriority 			High
  4733 @SYMTestActions  			Attempt to compose various valid Bengali glyph clusters to tet 
  4734 							Sequence <virama, ya>, i.e. ya-phala, MUST be allowed after independent vowels /a/ and /e/.
  4735 @SYMTestExpectedResults 	The expected glyph clusters for given Unicode characters must be returned
  4736 @SYMPREQ 					1766: Bengali for Sphinx
  4737 @SYMREQ 					8741:  Bengali Text Rendering
  4738 */
  4739 	testText[56] = 0x0985;
  4740 	testText[57] = 0x09CD;
  4741 	testText[58] = 0x09AF;
  4742 	testText[59] = 0x09BE;
  4743 	
  4744 	// Double ya -> Ya, ya-phala
  4745 	testText[60] = 0x09AA;
  4746 	testText[61] = 0x09CD;
  4747 	testText[62] = 0x09AF;
  4748 	testText[63] = 0x09CD;
  4749 	testText[64] = 0x09AF;
  4750 	
  4751 	param.iPosInText = 56;
  4752 	param.iPen.iX = param.iPen.iY = 0;
  4753 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  4754 	#if defined __WINS__ || defined __WINSCW__
  4755 	TEST(r && param.iPosInText == 57
  4756 			   && param.iPen.iX == 14
  4757 			   && param.iOutputGlyphs == 1
  4758 			   && param.iOutput[0].iCode == 0x80000cb0
  4759 			   );
  4760 	#elif defined __ARMCC__
  4761 	TEST(r && param.iPosInText == 57
  4762 			   && param.iOutputGlyphs == 1
  4763 			   && param.iOutput[0].iCode == 0x80000cb0
  4764 			   );
  4765 	#endif
  4766 	INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
  4767 	
  4768 	param.iPosInText = 57;
  4769 	param.iPen.iX = param.iPen.iY = 0;
  4770 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  4771 	
  4772 	TEST(r && param.iPosInText == 58
  4773 			   && param.iOutputGlyphs == 0	
  4774 			   );
  4775 	
  4776 	#if defined __WINS__ || defined __WINSCW__
  4777 	TEST(r && param.iPen.iX == 0);
  4778 	#endif
  4779 	
  4780 	INFO_PRINTF6(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
  4781 	
  4782 	param.iPosInText = 60;
  4783 	param.iPen.iX = param.iPen.iY = 0;
  4784 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  4785 	
  4786 	TEST(r && param.iPosInText == 65
  4787 			   && param.iOutputGlyphs == 3
  4788 			   && param.iOutput[0].iCode == 0x80000d3e
  4789 			   && param.iOutput[1].iCode == 0x80000cd5
  4790 			   && param.iOutput[2].iCode == 0x80000d6e
  4791 			   );
  4792 	
  4793 	#if defined __WINS__ || defined __WINSCW__
  4794 	TEST(r && param.iPen.iX == 23);
  4795 	#endif
  4796 	
  4797 	INFO_PRINTF7(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x iOutput[2].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode, param.iOutput[2].iCode);
  4798 	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  4799     	if (err!=KErrNone)
  4800     		INFO_PRINTF1(_L("Failed to record test result"));
  4801 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4011"));
  4802 	// BEN014
  4803 	/**
  4804 @SYMTestCaseID 				GRAPHICS-SYSLIB-GDI-CIT-4011
  4805 @SYMTestCaseDesc 			Automated GDI testing for Bengali
  4806 @SYMTestPriority 			High
  4807 @SYMTestActions  			Attempt to compose various valid and glyph clusters to test 
  4808 						 	When consonant /ga/, /nna/, /na/, /pa/, /la/, /sha/, /ssa/ or /sa/ is a dead consonant, and none of the other consonant cluster formation rules apply, the consonant MUST be rendered with a stemless half form.
  4809 @SYMTestExpectedResults 	The expected glyph clusters for given Unicode characters must be returned
  4810 @SYMPREQ 					1766: Bengali for Sphinx
  4811 @SYMREQ 					8741:  Bengali Text Rendering
  4812 */
  4813 	testText[65] = 0x0997;
  4814 	testText[66] = 0x09CD;
  4815 	testText[67] = 0x099C;
  4816 	
  4817 	testText[68] = 0x09AA;
  4818 	testText[69] = 0x09CD;
  4819 	testText[70] = 0x099C;
  4820 	
  4821 	
  4822 	param.iPosInText = 65;
  4823 	param.iPen.iX = param.iPen.iY = 0;
  4824 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  4825 	
  4826 	TEST(r && param.iPosInText == 68
  4827 			   && param.iOutputGlyphs == 2
  4828 			   && param.iOutput[0].iCode == 0x80000d2c
  4829 			   && param.iOutput[1].iCode == 0x80000cc3
  4830 			   );
  4831 	
  4832 	#if defined __WINS__ || defined __WINSCW__
  4833 	TEST(r && param.iPen.iX == 21);
  4834 	#endif
  4835 	
  4836 	INFO_PRINTF6(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
  4837 		
  4838 	param.iPosInText = 68;
  4839 	param.iPen.iX = param.iPen.iY = 0;
  4840 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  4841 	
  4842 	TEST(r && param.iPosInText == 71
  4843 			   && param.iOutputGlyphs == 2
  4844 			   && param.iOutput[0].iCode == 0x80000d3e
  4845 			   );
  4846 	
  4847 	#if defined __WINS__ || defined __WINSCW__
  4848 	TEST(r && param.iPen.iX == 23);
  4849 	#endif
  4850 	
  4851 	INFO_PRINTF6(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
  4852 		
  4853 	
  4854 	// BEN015
  4855 	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  4856     	if (err!=KErrNone)
  4857     		INFO_PRINTF1(_L("Failed to record test result"));
  4858 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4012"));
  4859 	/**
  4860 @SYMTestCaseID 				GRAPHICS-SYSLIB-GDI-CIT-4012
  4861 @SYMTestCaseDesc 			Automated GDI testing for Bengali
  4862 @SYMTestPriority 			High
  4863 @SYMTestActions  			Attempt to compose various valid Bengali glyph clusters to test 
  4864  							When /ka/, /nga/, /ca/, /tta/, /dda/, /ta/ or /da/ is a dead consonant, and none of the other consonant cluster formation rules apply, the consonant MUST be rendered with a miniature half form.
  4865 @SYMTestExpectedResults 	The expected glyph clusters for given Unicode characters must be returned
  4866 @SYMPREQ 					1766: Bengali for Sphinx
  4867 @SYMREQ 					8741:  Bengali Text Rendering
  4868 */
  4869 	testText[71] = 0x0995;
  4870 	testText[72] = 0x09CD;
  4871 	testText[73] = 0x099C;
  4872 	
  4873 	
  4874 	param.iPosInText = 71;
  4875 	param.iPen.iX = param.iPen.iY = 0;
  4876 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  4877 	
  4878 	TEST(r && param.iPosInText == 74
  4879 			   && param.iOutputGlyphs == 2
  4880 			   && param.iOutput[0].iCode == 0x80000d2a  
  4881 			   );
  4882 	
  4883 	#if defined __WINS__ || defined __WINSCW__
  4884 	TEST(r && param.iPen.iX == 26);
  4885 	#endif
  4886 	
  4887 	INFO_PRINTF6(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
  4888 
  4889 	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  4890     	if (err!=KErrNone)
  4891     		INFO_PRINTF1(_L("Failed to record test result"));
  4892 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4013"));
  4893 	// BEN016
  4894 	
  4895 	/**
  4896 @SYMTestCaseID 				GRAPHICS-SYSLIB-GDI-CIT-4013
  4897 @SYMTestCaseDesc 			Automated GDI testing for Bengali
  4898 @SYMTestPriority 			High
  4899 @SYMTestActions  			Attempt to compose various valid Bengali glyph clusters to test
  4900  							The consonant pairs /k.ka/, /ng.kha/, /c.nya/, /nn.nna/, /n.tha/, /n.pha/, /m.ta/, /m.tha/, /m.pha/, /m.bha/, /l.ka/, /l.ga/, /l.pa/, /ss.ka/, /ss.pha/, /s.ka/, /s.kha/, /s.ta/, /s.tha/, /s.pha/, /h.nna/ MUST be representend as stacks of two consonants.
  4901 @SYMTestExpectedResults 	The expected glyph clusters for given Unicode characters must be returned
  4902 @SYMPREQ 					1766: Bengali for Sphinx
  4903 @SYMREQ 					8741:  Bengali Text Rendering
  4904 */
  4905 	// Ma does not stack correctly on top with Series60Sans font, produces half form instead. Font defect.
  4906 	testText[74] = 0x09AE;
  4907 	testText[75] = 0x09CD;
  4908 	testText[76] = 0x09A5;
  4909 	
  4910 	testText[77] = 0x09AE;
  4911 	testText[78] = 0x09CD;
  4912 	testText[79] = 0x09AB;
  4913 	// Ma does not stack correctly on top, produces half form instead.
  4914 	testText[80] = 0x09AE;
  4915 	testText[81] = 0x09CD;
  4916 	testText[82] = 0x0995;
  4917 	
  4918 	testText[83] = 0x09A8;
  4919 	testText[84] = 0x09CD;
  4920 	testText[85] = 0x09A5;
  4921 	
  4922 	
  4923 	//Combination pa,virama,ma produces incorrect glyph mapping: Font defect.
  4924 
  4925 	param.iPosInText = 74;
  4926 	param.iPen.iX = param.iPen.iY = 0;
  4927 	
  4928 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  4929 	
  4930 	TEST(r && param.iPosInText == 77		 
  4931 		   && param.iOutputGlyphs == 2
  4932 		   && param.iOutput[0].iCode == 0x80000d42 
  4933 		   && param.iOutput[1].iCode == 0x80000ccc
  4934 	);
  4935 	
  4936 	#if defined __WINS__ || defined __WINSCW__
  4937 	TEST(r && param.iPen.iX == 21);
  4938 	#endif
  4939 	
  4940 	INFO_PRINTF6(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
  4941 	
  4942 	
  4943 	param.iPosInText = 77;
  4944 	param.iPen.iX = param.iPen.iY = 0;
  4945 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  4946 	
  4947 	TEST(r && param.iPosInText == 80
  4948 			   && param.iOutputGlyphs == 1
  4949 			   && param.iOutput[0].iCode == 0x80000e30
  4950 			   );
  4951 	
  4952 	#if defined __WINS__ || defined __WINSCW__
  4953 	TEST(r && param.iPen.iX == 19);
  4954 	#endif
  4955 	
  4956 	INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
  4957 	
  4958 	// Ma does not stack correctly on top, produces half form instead.
  4959 	param.iPosInText = 80;
  4960 	param.iPen.iX = param.iPen.iY = 0;
  4961 	
  4962 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  4963 	
  4964 	TEST(r && param.iPosInText == 83
  4965 	   && param.iOutputGlyphs == 2
  4966 	   && param.iOutput[0].iCode == 0x80000d42
  4967 	);
  4968 	
  4969 	#if defined __WINS__ || defined __WINSCW__
  4970 	TEST(r && param.iPen.iX == 22);
  4971 	#endif
  4972 
  4973 	INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
  4974 	
  4975 	
  4976 	param.iPosInText = 83;
  4977 	param.iPen.iX = param.iPen.iY = 0;
  4978 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  4979 
  4980 	TEST(r && param.iPosInText == 86
  4981 			   && param.iOutputGlyphs == 1
  4982 			   && param.iOutput[0].iCode == 0x80000e15
  4983 			   );
  4984 	
  4985 	#if defined __WINS__ || defined __WINSCW__
  4986 	TEST(r && param.iPen.iX == 10);
  4987 	#endif
  4988 	
  4989 	INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
  4990 	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  4991     	if (err!=KErrNone)
  4992     		INFO_PRINTF1(_L("Failed to record test result"));
  4993 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4014"));
  4994 	// BEN017
  4995 	
  4996 	/**
  4997 @SYMTestCaseID 				GRAPHICS-SYSLIB-GDI-CIT-4014
  4998 @SYMTestCaseDesc 			Automated GDI testing for Bengali
  4999 @SYMTestPriority 			High
  5000 @SYMTestActions  			Attempt to compose various valid Bengali glyph clusters to test
  5001  							Consonant pairs /k.tta/, /k.ta/, /k.ssa/, /k.sa/, /g.ga/, /g.dha/, /ng.ka/, /ng.ga/, /j.ja/, /j.jha/, /j.nya/, /ny.ca/, /ny.cha/, /ny.ja/, /ny.jha/, /tt.tta/, /nn.ttha/, /nn.dda/, /t.ta/, /t.tha/, /d.da/, /d.dha/, /d.ba/, /d.bha/, /n.ta/, /n.dha/, /p.ta/, /b.ja/, /b.da/, /b.dha/, /m.pa/, /ss.tta/, /ss.ttha/, /ss.nna/, /s.pa/, /h.na/ /h.ma/ MUST be displayed as ligatures, if they appear at the end of a consonant cluster.
  5002 @SYMTestExpectedResults 	The expected glyph clusters for given Unicode characters must be returned
  5003 @SYMPREQ 					1766: Bengali for Sphinx
  5004 @SYMREQ 					8741:  Bengali Text Rendering
  5005 */
  5006 	testText[86] = 0x0995;
  5007 	testText[87] = 0x09CD;
  5008 	testText[88] = 0x099F;
  5009 	
  5010 	testText[89] = 0x0995;
  5011 	testText[90] = 0x09CD;
  5012 	testText[91] = 0x09A4;
  5013 	
  5014 	// Not sure if this is forming the correct ligature
  5015 	testText[92] = 0x09AE;
  5016 	testText[93] = 0x09CD;
  5017 	testText[94] = 0x09AA;
  5018 		
  5019 	// Not sure if this is forming the correct ligature
  5020 	testText[95] = 0x09B8;
  5021 	testText[96] = 0x09CD;
  5022 	testText[97] = 0x09AA;
  5023 	
  5024 	testText[98] = 0x09B9;
  5025 	testText[99] = 0x09CD;
  5026 	testText[100] = 0x09A8;
  5027 	
  5028 	param.iPosInText = 86;
  5029 	param.iPen.iX = param.iPen.iY = 0;
  5030 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  5031 	
  5032 	TEST(r && param.iPosInText == 89
  5033 			   && param.iOutputGlyphs == 1
  5034 			   && param.iOutput[0].iCode == 0x80000dd7
  5035 			   );
  5036 	
  5037 	#if defined __WINS__ || defined __WINSCW__
  5038 	TEST(r && param.iPen.iX == 12);
  5039 	#endif
  5040 	
  5041 	INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
  5042 	
  5043 	param.iPosInText = 89;
  5044 	param.iPen.iX = param.iPen.iY = 0;
  5045 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  5046 	
  5047 	TEST(r && param.iPosInText == 92
  5048 			   && param.iOutputGlyphs == 1
  5049 			   && param.iOutput[0].iCode == 0x80000dd9
  5050 			   );
  5051 	
  5052 	#if defined __WINS__ || defined __WINSCW__
  5053 	TEST(r && param.iPen.iX == 15);
  5054 	#endif
  5055 	
  5056 	INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
  5057 	
  5058 	param.iPosInText = 92;
  5059 	param.iPen.iX = param.iPen.iY = 0;
  5060 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  5061 	
  5062 	TEST(r && param.iPosInText == 95
  5063 			   && param.iOutputGlyphs == 1
  5064 			   && param.iOutput[0].iCode == 0x80000e2f
  5065 			   );
  5066 
  5067 	#if defined __WINS__ || defined __WINSCW__
  5068 	TEST(r && param.iPen.iX == 19);
  5069 	#endif
  5070 	
  5071 	INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
  5072 		
  5073 	param.iPosInText = 95;
  5074 	param.iPen.iX = param.iPen.iY = 0;
  5075 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  5076 	
  5077 	TEST(r && param.iPosInText == 98
  5078 			   && param.iOutputGlyphs == 1
  5079 			   && param.iOutput[0].iCode == 0x80000e56
  5080 			   );
  5081 	
  5082 	#if defined __WINS__ || defined __WINSCW__
  5083 	TEST(r && param.iPen.iX == 20);
  5084 	#endif
  5085 	
  5086 	INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);	
  5087 	
  5088 	param.iPosInText = 98;
  5089 	param.iPen.iX = param.iPen.iY = 0;
  5090 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  5091 	
  5092 	TEST(r && param.iPosInText == 101	
  5093 			   && param.iOutputGlyphs == 1
  5094 			   && param.iOutput[0].iCode == 0x80000e5d	
  5095 			   );
  5096 
  5097 	#if defined __WINS__ || defined __WINSCW__
  5098 	TEST(r && param.iPen.iX == 13);
  5099 	#endif
  5100 	
  5101 	INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
  5102 	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  5103     	if (err!=KErrNone)
  5104     		INFO_PRINTF1(_L("Failed to record test result"));
  5105 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4015"));
  5106 // BEN020
  5107 /**
  5108 @SYMTestCaseID 				GRAPHICS-SYSLIB-GDI-CIT-4015
  5109 @SYMTestCaseDesc 			Automated GDI testing for Bengali
  5110 @SYMTestPriority 			High
  5111 @SYMTestActions  			Attempt to compose various valid Bengali glyph clusters to test that
  5112  							If RA is the first consonant cluster, it must assume the form of Repha.
  5113 @SYMTestExpectedResults 	The expected glyph clusters for given Unicode characters must be returned
  5114 @SYMPREQ 					1766: Bengali for Sphinx
  5115 @SYMREQ 					8741:  Bengali Text Rendering
  5116 */
  5117 	testText[101] = 0x09B0;
  5118 	testText[102] = 0x09CD;
  5119 	testText[103] = 0x0995;
  5120 	
  5121 	testText[104] = 0x09B0;
  5122 	testText[105] = 0x200C;
  5123 	testText[106] = 0x09CD;
  5124 	testText[107] = 0x09AF;
  5125 	
  5126 	param.iPosInText = 101;
  5127 	param.iPen.iX = param.iPen.iY = 0;
  5128 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  5129 	
  5130 	TEST(r && param.iPosInText == 104
  5131 			   && param.iOutputGlyphs == 2
  5132 			   && param.iOutput[0].iCode == 0x80000cbc
  5133 			   && param.iOutput[1].iCode == 0x80000d27
  5134 			   );
  5135 	
  5136 	#if defined __WINS__ || defined __WINSCW__
  5137 	TEST(r && param.iPen.iX == 12);
  5138 	#endif
  5139 	
  5140 	INFO_PRINTF6(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
  5141 		
  5142 	param.iPosInText =104;
  5143 	param.iPen.iX = param.iPen.iY = 0;
  5144 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  5145 	
  5146 	TEST(r && param.iPosInText == 105
  5147 			   && param.iOutputGlyphs == 1
  5148 			   && param.iOutput[0].iCode == 0x80000cd6
  5149 			   );
  5150 
  5151 	#if defined __WINS__ || defined __WINSCW__
  5152 	TEST(r && param.iPen.iX == 9);
  5153 	#endif
  5154 	
  5155 	INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
  5156 		
  5157 	}
  5158 
  5159 
  5160 void CTGlyphSelection::TestTamilChars(CFbsFont* aFont)
  5161 	{
  5162 INFO_PRINTF1(_L("Test Tamil Glyphs"));
  5163  
  5164   	TBool r;
  5165 	TBuf<162> testText(0);
  5166 	CFont::TPositionParam param;
  5167 	param.iDirection = CFont::EHorizontal;
  5168 	param.iFlags = CFont::TPositionParam::EFLogicalOrder;
  5169 
  5170 	testText.SetLength(162);
  5171 	// Make sure there is no garbage values in the memory we are using.
  5172 	for (TInt i = 0; i < testText.Length(); i++)
  5173 		testText[i]=0xFFFF;
  5174 	param.iText.Set(testText);
  5175 	RShapeInfo shapeInfo;
  5176 	//Testdata for Tamil Langauage
  5177 	TRAPD(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  5178     	if (err!=KErrNone)
  5179     		INFO_PRINTF1(_L("Failed to record test result"));
  5180 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4016"));
  5181 /*	
  5182 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4016
  5183 @SYMTestCaseDesc Automated GDI testing for Tamil
  5184 @SYMTestPriority High
  5185 @SYMTestActions  Attempt to compose various valid Tamil glyph clusters to test 
  5186   	 a)The Tamil alphabets are listed in contiguous Unicode range(U+0B80–U+0BFF),  This also contains Tamil Numbers.
  5187 	 b)The Tamil alphabets are listed in contiguous Unicode range(U+0B80–U+0BFF),  This also contains Tamil Numbers.
  5188 	 c)Internal data storage should always be in the logical order, but the rendering of it may be different to that of the logical order
  5189 	 d)Combination of Unicode sequences must be rendered as valid blocks.  In Tamil some character sequences are invalid and therefore only the sequences which follow the logical order as described in Req 1.2.3 should be rendered properly
  5190 	 e)If the text being rendered contains a mixture of scripts, the text in each script should be rendered according to the rules of that particular script.
  5191 @SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
  5192 @SYMPREQ 1766: Tamil for Sphinx
  5193 @SYMREQ 8742:Tamil Text Rendering
  5194 */
  5195 	testText[0] = 0x0B95; //Tamil Ka
  5196 	testText[1] = 0x0B8E; //Tamil e
  5197 	testText[2] = 0x0061; //Latin A
  5198 	testText[3] = 0x0905; // Hindi Ka
  5199 	testText[4] = 0x0020;
  5200 	// Do the testing
  5201 	param.iPosInText = 0 ;
  5202 	param.iPen.iX = param.iPen.iY = 0;
  5203 	
  5204 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  5205 
  5206 	TEST(r && param.iPosInText == 1  
  5207 		   && param.iOutputGlyphs == 1
  5208 		   && param.iOutput[0].iCode == 0x80000bf6);
  5209 
  5210 	#if defined __WINS__ || defined __WINSCW__
  5211 	TEST(r && param.iPen.iX == 13);
  5212 	#endif
  5213 	
  5214 	INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
  5215 	
  5216 	param.iPosInText = 1 ;
  5217 	param.iPen.iX = param.iPen.iY = 0;
  5218 	
  5219 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  5220 	
  5221 	TEST(r && param.iPosInText ==  2 
  5222 		   && param.iOutputGlyphs == 1
  5223 		   && param.iOutput[0].iCode == 0x80000bf0);
  5224 
  5225 	#if defined __WINS__ || defined __WINSCW__
  5226 	TEST(r && param.iPen.iX == 14);
  5227 	#endif
  5228 	
  5229 	INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
  5230 	
  5231 	param.iPosInText = 2 ;
  5232 	param.iPen.iX = param.iPen.iY = 0;
  5233 	
  5234 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  5235 	
  5236 	TEST(r && param.iPosInText == 3
  5237 		   && param.iOutputGlyphs == 1
  5238 		   && param.iOutput[0].iCode == 0x61 );
  5239 
  5240 	#if defined __WINS__ || defined __WINSCW__
  5241 	TEST(r && param.iPen.iX == 10);
  5242 	#endif
  5243 	
  5244 	INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
  5245 	param.iPosInText = 3 ;
  5246 	param.iPen.iX = param.iPen.iY = 0;
  5247 	
  5248 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  5249 	
  5250 	TEST(r && param.iPosInText == 4  
  5251 		   && param.iOutputGlyphs == 1
  5252 		   && param.iOutput[0].iCode == 0x80000528);
  5253 
  5254 	#if defined __WINS__ || defined __WINSCW__
  5255 	TEST(r && param.iPen.iX == 12);
  5256 	#endif
  5257 	
  5258 	INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
  5259 	
  5260 	/*Req 02 1.2.3, 1.3.21, 1.3.21.1, 1.3.21.2 1.3.21.3
  5261 	
  5262 	1.2.3 The attachment presents the logical order used to present Tamil text. In the schematic samples, square brackets are used to presents the components that may be omitted. 
  5263 	1.3.21 If the text-rendering engine detects invalid sequences of characters, it should render the invalid sequences using an appropriate fallback rendering mechanism
  5264 Please see the attachment for examples
  5265 	1.3.21.1 For normal rendering, combining Tamil characters must be preceded by a valid base character. 
  5266 	1.3.21.2 Combining Tamil characters that do not follow a valid base character must be rendered using an appropriate fallback rendering.
  5267 	1.3.21.3 Device must not hang or crash because of unexpected character sequences.*/
  5268 	
  5269 	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  5270     	if (err!=KErrNone)
  5271     		INFO_PRINTF1(_L("Failed to record test result"));
  5272 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4017"));
  5273 //Req 03 
  5274 	
  5275 /**
  5276 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4017
  5277 @SYMTestCaseDesc Automated GDI testing for Tamil
  5278 @SYMTestPriority High
  5279 @SYMTestActions  Attempt to compose various valid Tamil glyph clusters to test 
  5280 				 It is reasonably common to mix Latin, Tamil as well as other script in texts.  This must include the numerals.
  5281 @SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
  5282 @SYMPREQ 1766: Tamil for Sphinx
  5283 @SYMREQ 8742:Tamil Text Rendering
  5284 */
  5285 	testText[4] = 0x0036;//Latin 06
  5286 	testText[5] = 0x0BEC;//Tamil 06
  5287 	
  5288 	param.iPosInText = 4 ;
  5289 	param.iPen.iX = param.iPen.iY = 0;
  5290 	
  5291 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  5292 	
  5293 	TEST(r && param.iPosInText == 5  
  5294 		   && param.iOutputGlyphs == 1
  5295 		   && param.iOutput[0].iCode == 0x8000077A);
  5296 	
  5297 	#if defined __WINS__ || defined __WINSCW__
  5298 	TEST(r && param.iPen.iX == 8);
  5299 	#endif
  5300 
  5301 	INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
  5302 		
  5303 	param.iPosInText = 5 ;
  5304 	param.iPen.iX = param.iPen.iY = 0;
  5305 	
  5306 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  5307 	
  5308 	TEST(r && param.iPosInText == 6  
  5309 		   && param.iOutputGlyphs == 1
  5310 		   && param.iOutput[0].iCode == 0x80000c20);
  5311 
  5312 	#if defined __WINS__ || defined __WINSCW__
  5313 	TEST(r && param.iPen.iX == 16);
  5314 	#endif
  5315 	
  5316 	INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
  5317 
  5318 	/*Req 04 1.3.4, 1.3.20
  5319 	1.3.4   1. Tamil is a semi-syllabic script and in Tamil text rendering the basic unit for handling text must be the orthographic syllable.
  5320 			2. Therefore, a text-rendering engine should first identify a syllable and then analyze the syllable. Based on the analysis, text-rendering engine should then be able to select and/or shape the glyphs required for rendering the syllable and to perform contextual positioning of glyphs inside a syllable.
  5321 			3. After a syllable has been formed it must be considered an indivisible and invariable unit.
  5322 			4. The shape of a syllable is not affected by surrounding syllables.
  5323 	1.3.20 Syllable is the smallest unbreakable component in Tamil*/
  5324 	
  5325 	/*Req 07 1.3.5
  5326 	
  5327 	1.3.5 	1. In Tamil, when ligatures are used there is a possibility that the shaping of the previous consonant will depend on the next consonant the user enters
  5328 			2. In Tamil, there is a possibility that even though the characters are entered one by one the position of the matras change depending on the consonant and the type of the matra
  5329 	
  5330 	Req 08 1.3.19
  5331 	
  5332 	1.3.19 In Tamil white space is used as a word boundary. Line breaking should be based on word boundaries
  5333 	
  5334 	
  5335 	Req 09 1.2.4
  5336 	
  5337 	1.2.4 For compatibility with legacy encodings, split matra and vowel representations must be recognized as identical to the single code representations (preferred)
  5338 	*/
  5339 	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  5340     	if (err!=KErrNone)
  5341     		INFO_PRINTF1(_L("Failed to record test result"));
  5342 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4018"));
  5343 //Req 10 1.3.6	
  5344 /**
  5345 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4018
  5346 @SYMTestCaseDesc Automated GDI testing for Tamil
  5347 @SYMTestPriority High
  5348 @SYMTestActions  Attempt to compose various valid Tamil glyph clusters to test the requirement.
  5349 				 Tamil character shaping MUST be based on combining character sequences. All shaping processes (splitting, reordering, glyph selection) MUST occur in the context of combining character sequence.
  5350 @SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
  5351 @SYMPREQ 1766: Tamil for Sphinx
  5352 @SYMREQ 8742:Tamil Text Rendering
  5353 */
  5354 	testText[6] = 0x0BAA; // Pa
  5355 	testText[7] = 0x0BCD; //Virama
  5356 	testText[8] = 0x0B95; //Ka
  5357 	testText[9] = 0x0BCD; //Virama
  5358 	testText[10] = 0x0B9F; //Tta
  5359 	testText[11] = 0x0BC7; //-e
  5360 	
  5361 	testText[12] = 0x0BAA;//Pa
  5362 	testText[13] = 0x0BCD;//Virama
  5363 	testText[14] = 0x0B95;//Ka
  5364 	testText[15] = 0x0BCC;//AU
  5365 	
  5366 	testText[16] = 0x0B95; //Ka
  5367 	testText[17] = 0x0BCD; //Virama
  5368 	testText[18] = 0x0BB7; //Ssa
  5369 	testText[19] = 0x0BCB; //OO
  5370 	
  5371 	param.iPosInText = 6 ;
  5372 	param.iPen.iX = param.iPen.iY = 0;
  5373 	
  5374 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  5375 	
  5376 	TEST(r && param.iPosInText == 12    
  5377 		   && param.iOutputGlyphs == 4
  5378 		   && param.iOutput[0].iCode == 0x80000c3a
  5379 		   && param.iOutput[1].iCode == 0x80000c30  
  5380 		   && param.iOutput[2].iCode == 0x80000c13
  5381 		   && param.iOutput[3].iCode == 0x80000bfb);
  5382 	
  5383 	#if defined __WINS__ || defined __WINSCW__
  5384 	TEST(r && param.iPen.iX == 51);
  5385 	#endif
  5386 	
  5387 	INFO_PRINTF7(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x iOutput[3].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode, param.iOutput[3].iCode);
  5388 	
  5389 	param.iPosInText = 12 ;
  5390 	param.iPen.iX = param.iPen.iY = 0;
  5391 	
  5392 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  5393 	
  5394 	TEST(r && param.iPosInText ==  16 
  5395 		   && param.iOutputGlyphs ==4 
  5396 		   && param.iOutput[0].iCode == 0x80000c3a 
  5397 		   && param.iOutput[1].iCode == 0x80000c12 
  5398 		   && param.iOutput[2].iCode == 0x80000bf6
  5399 		   && param.iOutput[3].iCode == 0x80000c19);
  5400 	
  5401 	#if defined __WINS__ || defined __WINSCW__
  5402 	TEST(r && param.iPen.iX == 56);
  5403 	#endif
  5404 	
  5405 	INFO_PRINTF7(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x iOutput[3].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode, param.iOutput[3].iCode);
  5406 	
  5407 	param.iPosInText = 16 ;
  5408 	param.iPen.iX = param.iPen.iY = 0;
  5409 	
  5410 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  5411 	
  5412 	TEST(r && param.iPosInText == 20  
  5413 		   && param.iOutputGlyphs == 3
  5414 		   && param.iOutput[0].iCode == 0x80000c13
  5415 		   && param.iOutput[1].iCode == 0x80000c2f  
  5416 		   && param.iOutput[2].iCode == 0x80000c0d);
  5417 
  5418 	#if defined __WINS__ || defined __WINSCW__
  5419 	TEST(r && param.iPen.iX == 54);
  5420 	#endif
  5421 	
  5422 	INFO_PRINTF7(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x iOutput[2].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode, param.iOutput[2].iCode);
  5423 	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  5424     	if (err!=KErrNone)
  5425     		INFO_PRINTF1(_L("Failed to record test result"));
  5426 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4019"));
  5427 //Req 11
  5428 /**
  5429 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4019
  5430 @SYMTestCaseDesc Automated GDI testing for Tamil
  5431 @SYMTestPriority High
  5432 @SYMTestActions  Attempt to compose various valid Tamil glyph clusters to test the requirement
  5433 				 Matras /-e/, /-ee/ and /-ai/ are reordered with the consonant they follow in memory order.
  5434 @SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
  5435 @SYMPREQ 1766: Tamil for Sphinx
  5436 @SYMREQ 8742:Tamil Text Rendering
  5437 */
  5438 
  5439 	testText[20] = 0x0B95; //Ka
  5440 	testText[21] = 0x0BC7; //-e
  5441 	
  5442 	param.iPosInText = 20 ;
  5443 	param.iPen.iX = param.iPen.iY = 0;
  5444 	
  5445 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  5446 	
  5447 	TEST(r && param.iPosInText == 22  
  5448 		   && param.iOutputGlyphs == 2
  5449 		   && param.iOutput[0].iCode == 0x80000c13 
  5450 		   && param.iOutput[1].iCode == 0x80000bf6 );
  5451 	
  5452 	#if defined __WINS__ || defined __WINSCW__
  5453 	TEST(r && param.iPen.iX == 26);
  5454 	#endif
  5455 	
  5456 	INFO_PRINTF6(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode); 
  5457 	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  5458     	if (err!=KErrNone)
  5459     		INFO_PRINTF1(_L("Failed to record test result"));
  5460 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4020"));
  5461 //Req 12 1.3.5.2
  5462 /**
  5463 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4020
  5464 @SYMTestCaseDesc Automated GDI testing for Tamil
  5465 @SYMTestPriority High
  5466 @SYMTestActions  Attempt to compose various valid Tamil glyph clusters to test the requirment
  5467 				 Matras /-o/, /-oo/ and /-au/ are split into two halves that enclose the consonant they follow in memory order.
  5468 @SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
  5469 @SYMPREQ 1766: Tamil for Sphinx
  5470 @SYMREQ 8742:Tamil Text Rendering
  5471 */
  5472 
  5473 	testText[22] = 0x0B95; //Ka
  5474 	testText[23] = 0x0BCA; //O
  5475 	
  5476 	
  5477 	param.iPosInText = 22 ;
  5478 	param.iPen.iX = param.iPen.iY = 0;
  5479 	
  5480 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  5481 	
  5482 	TEST(r && param.iPosInText ==  24 
  5483 		   && param.iOutputGlyphs == 3
  5484 		   && param.iOutput[0].iCode == 0x80000c12
  5485 		   && param.iOutput[1].iCode == 0x80000bf6   
  5486 		   && param.iOutput[2].iCode == 0x80000c0d);
  5487 
  5488 	#if defined __WINS__ || defined __WINSCW__
  5489 	TEST(r && param.iPen.iX == 37);
  5490 	#endif
  5491 	
  5492 	INFO_PRINTF7(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x iOutput[2].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode, param.iOutput[2].iCode);
  5493 	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  5494     	if (err!=KErrNone)
  5495     		INFO_PRINTF1(_L("Failed to record test result"));
  5496 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4021"));
  5497 	//Req 13 
  5498 /**
  5499 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4021
  5500 @SYMTestCaseDesc Automated GDI testing for Tamil
  5501 @SYMTestPriority High
  5502 @SYMTestActions  Attempt to compose various valid Tamil glyph clusters to test the requirment.
  5503 				Tamil Modifier "Ayatham" MUST be treated as an independent character
  5504 @SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
  5505 @SYMPREQ 1766: Tamil for Sphinx
  5506 @SYMREQ 8742:Tamil Text Rendering
  5507 */
  5508 
  5509 	testText[24] = 0x0B95; //Ka
  5510 	testText[25] = 0x0B83; //Aythem
  5511 	testText[26] = 0x0B85; //A
  5512 	
  5513 	param.iPosInText = 24;
  5514 	param.iPen.iX = param.iPen.iY = 0;
  5515 	
  5516 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  5517 	
  5518 	TEST(r && param.iPosInText ==  25 
  5519 		   && param.iOutputGlyphs == 1
  5520 		   && param.iOutput[0].iCode == 0x80000bf6);
  5521 
  5522 	#if defined __WINS__ || defined __WINSCW__
  5523 	TEST(r && param.iPen.iX == 13);
  5524 	#endif
  5525 	
  5526 	INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
  5527 	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  5528     	if (err!=KErrNone)
  5529     		INFO_PRINTF1(_L("Failed to record test result"));
  5530 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4022"));
  5531 //Req 14 
  5532 /**
  5533 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4022
  5534 @SYMTestCaseDesc Automated GDI testing for Tamil
  5535 @SYMTestPriority High
  5536 @SYMTestActions  Attempt to compose various valid Tamil glyph clusters to test the requirement. 
  5537 			 	Rendering Engine MUST be capable of handling TAMIL ANUSVARA
  5538 				It has been suggested that this character be deprecated in Unicode
  5539 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
  5540 @SYMPREQ 1766: Tamil for Sphinx
  5541 @SYMREQ 8742:Tamil Text Rendering
  5542 */
  5543 	
  5544 	testText[27] = 0x0B95; //Ka
  5545 	testText[28] = 0x0B82; //Anusvara
  5546 	testText[29] = 0x0B95; //Ka
  5547 	
  5548 	param.iPosInText = 27;
  5549 	param.iPen.iX = param.iPen.iY = 0;
  5550 	
  5551 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  5552 	
  5553 	TEST(r && param.iPosInText ==  29 
  5554 		   && param.iOutputGlyphs == 2 
  5555 		   && param.iOutput[0].iCode == 0x80000bf6
  5556 		   && param.iOutput[1].iCode == 0x80000be8);
  5557 
  5558 	#if defined __WINS__ || defined __WINSCW__
  5559 	TEST(r && param.iPen.iX == 19);
  5560 	#endif
  5561 	
  5562 	INFO_PRINTF6(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
  5563 	param.iPosInText = 29;
  5564 	param.iPen.iX = param.iPen.iY = 0;
  5565 	
  5566 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  5567 	
  5568 	TEST(r && param.iPosInText ==  30 
  5569 		   && param.iOutputGlyphs == 1
  5570 		   && param.iOutput[0].iCode == 0x80000bf6 );
  5571 
  5572 	#if defined __WINS__ || defined __WINSCW__
  5573 	TEST(r && param.iPen.iX == 13);
  5574 	#endif 
  5575 	
  5576 	INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
  5577 	
  5578 	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  5579     	if (err!=KErrNone)
  5580     		INFO_PRINTF1(_L("Failed to record test result"));
  5581 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4023"));
  5582 //Req 15
  5583 /**
  5584 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4023
  5585 @SYMTestCaseDesc Automated GDI testing for Tamil
  5586 @SYMTestPriority High
  5587 @SYMTestActions  Attempt to compose various valid Tamil glyph clusters to test the requirment
  5588 				 Tamil consonant /ra/ changes its shape, when a virama is applied to it.
  5589 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
  5590 @SYMPREQ 1766: Tamil for Sphinx
  5591 @SYMREQ 8742:Tamil Text Rendering
  5592 */
  5593 
  5594 	testText[30] = 0x0BB0; //Ra
  5595 	testText[31] = 0x0BCD; //Virama
  5596 	testText[32] = 0x8205; //ZWJ
  5597 	
  5598 	
  5599 	param.iPosInText =  30;
  5600 	param.iPen.iX = param.iPen.iY = 0;
  5601 	
  5602 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  5603 	
  5604 	TEST(r && param.iPosInText ==  32 
  5605 		   && param.iOutputGlyphs == 2 
  5606 		   && param.iOutput[0].iCode == 0x80000c03 );
  5607 
  5608 	#if defined __WINS__ || defined __WINSCW__
  5609 	TEST(r && param.iPen.iX == 10);
  5610 	#endif 
  5611 	
  5612 	INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
  5613 	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  5614     	if (err!=KErrNone)
  5615     		INFO_PRINTF1(_L("Failed to record test result"));
  5616 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4024"));
  5617 //Req 16 
  5618 /**
  5619 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4024
  5620 @SYMTestCaseDesc Automated GDI testing for Tamil
  5621 @SYMTestPriority High
  5622 @SYMTestActions  Attempt to compose various valid Tamil glyph clusters to test 
  5623 				Matra /-aa/ is combined to consonants in regular fashion. No extra shaping is required.
  5624 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
  5625 @SYMPREQ 1766: Tamil for Sphinx
  5626 @SYMREQ 8742:Tamil Text Rendering
  5627 */
  5628 
  5629 	testText[33] = 0x0B95; //Ka
  5630 	testText[34] = 0x0B82; //Anusvara
  5631 	
  5632 	param.iPosInText = 33 ;
  5633 	param.iPen.iX = param.iPen.iY = 0;
  5634 	
  5635 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  5636 	
  5637 	TEST(r && param.iPosInText == 35  
  5638 		   && param.iOutputGlyphs == 2 
  5639 		   && param.iOutput[0].iCode == 0x80000bf6 );
  5640 
  5641 	#if defined __WINS__ || defined __WINSCW__
  5642 	TEST(r && param.iPen.iX == 19);
  5643 	#endif 
  5644 	
  5645 	INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
  5646 	
  5647 	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  5648     	if (err!=KErrNone)
  5649     		INFO_PRINTF1(_L("Failed to record test result"));
  5650 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4025"));
  5651 //Req 17 1.3.11
  5652 /**
  5653 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4025
  5654 @SYMTestCaseDesc Automated GDI testing for Tamil
  5655 @SYMTestPriority High
  5656 @SYMTestActions  Attempt to compose various valid Tamil glyph clusters to test 
  5657 					Matras /-i/ and /-ii/ MUST form a ligature with consonant /tta/.
  5658 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
  5659 @SYMPREQ 1766: Tamil for Sphinx
  5660 @SYMREQ 8742:Tamil Text Rendering
  5661 */
  5662 
  5663 	testText[35] = 0x0B9F; //Tta
  5664 	testText[36] = 0x0BBF; //I
  5665 	
  5666 	testText[37] = 0x0B9F; //Tta
  5667 	testText[38] = 0x0BC0; //Ii
  5668 	
  5669 	param.iPosInText = 35 ;
  5670 	param.iPen.iX = param.iPen.iY = 0;
  5671 	
  5672 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  5673 	
  5674 	TEST(r && param.iPosInText ==  37 
  5675 		   && param.iOutputGlyphs == 1
  5676 		   && param.iOutput[0].iCode == 0x80000c51);
  5677 
  5678 	#if defined __WINS__ || defined __WINSCW__
  5679 	TEST(r && param.iPen.iX == 15);
  5680 	#endif
  5681 	
  5682 	INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
  5683 	
  5684 	param.iPosInText = 37 ;
  5685 	param.iPen.iX = param.iPen.iY = 0;
  5686 	
  5687 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  5688 	
  5689 	TEST(r && param.iPosInText ==  39
  5690 		   && param.iOutputGlyphs == 1 
  5691 		   && param.iOutput[0].iCode == 0x80000c52);
  5692 	
  5693 	#if defined __WINS__ || defined __WINSCW__
  5694 	TEST(r && param.iPen.iX == 13);
  5695 	#endif 
  5696 	
  5697 	INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
  5698 	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  5699     	if (err!=KErrNone)
  5700     		INFO_PRINTF1(_L("Failed to record test result"));
  5701 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4026"));
  5702 //Req 18 	
  5703 /**
  5704 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4026
  5705 @SYMTestCaseDesc Automated GDI testing for Tamil
  5706 @SYMTestPriority High
  5707 @SYMTestActions  Attempt to compose various valid Tamil glyph clusters to test 
  5708 				Consonant /ra/ takes an alternate shape when combined with matras /-i/ and /-ii/.
  5709 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
  5710 @SYMPREQ 1766: Tamil for Sphinx
  5711 @SYMREQ 8742:Tamil Text Rendering
  5712 */	
  5713 	testText[39] = 0x0BB0; //Ra
  5714 	testText[40] = 0x0BBF; //I
  5715 	
  5716 	testText[41] = 0x0BB0; //Ra
  5717 	testText[42] = 0x0BC0; //Ii
  5718 	
  5719 	param.iPosInText = 39 ;
  5720 	param.iPen.iX = param.iPen.iY = 0;
  5721 	
  5722 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  5723 	
  5724 	TEST(r && param.iPosInText == 41  
  5725 		   && param.iOutputGlyphs == 2
  5726 		   && param.iOutput[0].iCode == 0x80000c0d
  5727 		   && param.iOutput[1].iCode == 0x80000c0e );
  5728 
  5729 	#if defined __WINS__ || defined __WINSCW__
  5730 	TEST(r && param.iPen.iX == 13);
  5731 	#endif 
  5732 	
  5733 	INFO_PRINTF6(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
  5734 	
  5735 	param.iPosInText = 41 ;
  5736 	param.iPen.iX = param.iPen.iY = 0;
  5737 	
  5738 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  5739 	
  5740 	TEST(r && param.iPosInText ==  43
  5741 		   && param.iOutputGlyphs == 2
  5742 		   && param.iOutput[0].iCode == 0x80000c0d 
  5743 		   && param.iOutput[1].iCode == 0x80000c0f);
  5744 	
  5745 	#if defined __WINS__ || defined __WINSCW__
  5746 	TEST(r && param.iPen.iX == 13);
  5747 	#endif
  5748 	
  5749 	INFO_PRINTF6(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
  5750 	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  5751     	if (err!=KErrNone)
  5752     		INFO_PRINTF1(_L("Failed to record test result"));
  5753 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4027"));
  5754 //Req 19 
  5755 /**
  5756 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4027
  5757 @SYMTestCaseDesc Automated GDI testing for Tamil
  5758 @SYMTestPriority High
  5759 @SYMTestActions  Attempt to compose various valid Tamil glyph clusters to test the requirement
  5760 				 Matras /-i/ and /-ii/ take an alternate form when applied to consonants /nga/, /pa/, /ya/ and /va/.
  5761 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
  5762 @SYMPREQ 1766: Tamil for Sphinx
  5763 @SYMREQ 8742:Tamil Text Rendering
  5764 */
  5765 	testText[43] = 0x0B99; //Nga
  5766 	testText[44] = 0x0BBF; //I
  5767 	
  5768 	testText[45] = 0x0B99; //Nga
  5769 	testText[46] = 0x0BC0; //Ii
  5770 	
  5771 	param.iPosInText = 43 ;
  5772 	param.iPen.iX = param.iPen.iY = 0;
  5773 	
  5774 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  5775 	
  5776 	TEST(r && param.iPosInText ==  45 
  5777 		   && param.iOutputGlyphs == 2
  5778 		   && param.iOutput[0].iCode == 0x80000bf7
  5779 		   && param.iOutput[1].iCode == 0x80000c0e );
  5780 
  5781 	#if defined __WINS__ || defined __WINSCW__
  5782 	TEST(r && param.iPen.iX == 19);
  5783 	#endif
  5784 	
  5785 	INFO_PRINTF6(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
  5786 	param.iPosInText = 45 ;
  5787 	param.iPen.iX = param.iPen.iY = 0;
  5788 	
  5789 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  5790 	
  5791 	TEST(r && param.iPosInText ==  47
  5792 		   && param.iOutputGlyphs == 1
  5793 		   && param.iOutput[0].iCode == 0x80000c4a );
  5794 
  5795 	#if defined __WINS__ || defined __WINSCW__
  5796 	TEST(r && param.iPen.iX == 17);
  5797 	#endif 
  5798 	
  5799 	INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
  5800 	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  5801     	if (err!=KErrNone)
  5802     		INFO_PRINTF1(_L("Failed to record test result"));
  5803 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4028"));
  5804 	
  5805 //Req 20 		
  5806 /**
  5807 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4028
  5808 @SYMTestCaseDesc Automated GDI testing for Tamil
  5809 @SYMTestPriority High
  5810 @SYMTestActions  Attempt to compose various valid Tamil glyph clusters to test the requirement. 
  5811 				 Matras /-u/ and /-uu/ join in ligature form with all other consonants than /ha/, /ja/, /sa/, /ssa/ and /k.ssa/.
  5812 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
  5813 @SYMPREQ 1766: Tamil for Sphinx
  5814 @SYMREQ 8742:Tamil Text Rendering
  5815 */
  5816 	testText[47] = 0x0B9C; //Ja
  5817 	testText[48] = 0x0BC1; //U
  5818 	
  5819 	testText[49] = 0x0B9C; //Ja
  5820 	testText[50] = 0x0BC2; //Uu
  5821 	
  5822 	param.iPosInText = 47 ;
  5823 	param.iPen.iX = param.iPen.iY = 0;
  5824 	
  5825 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  5826 	
  5827 	TEST(r && param.iPosInText == 49  
  5828 		   && param.iOutputGlyphs == 2 
  5829 		   && param.iOutput[0].iCode == 0x80000bf9
  5830 		   && param.iOutput[1].iCode == 0x80000c10);
  5831 
  5832 	#if defined __WINS__ || defined __WINSCW__
  5833 	TEST(r && param.iPen.iX == 26);
  5834 	#endif
  5835 	
  5836 	INFO_PRINTF6(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
  5837 	
  5838 	param.iPosInText = 49;
  5839 	param.iPen.iX = param.iPen.iY = 0;
  5840 	
  5841 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  5842 	
  5843 	TEST(r && param.iPosInText ==  51
  5844 		   && param.iOutputGlyphs == 2
  5845 		   && param.iOutput[0].iCode == 0x80000bf9
  5846 		   && param.iOutput[1].iCode == 0x80000c11 );
  5847 
  5848 	#if defined __WINS__ || defined __WINSCW__
  5849 	TEST(r && param.iPen.iX == 29);
  5850 	#endif
  5851 	
  5852 	INFO_PRINTF6(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
  5853 	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  5854     	if (err!=KErrNone)
  5855     		INFO_PRINTF1(_L("Failed to record test result"));
  5856 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4029"));
  5857 //Req 21 1.3.15		
  5858 /**
  5859 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4029
  5860 @SYMTestCaseDesc Automated GDI testing for Tamil
  5861 @SYMTestPriority High
  5862 @SYMTestActions  Attempt to compose various valid Tamil glyph clusters to test the requirement. 
  5863 				 Matra /-ai/ is combined to consonants in regular fashion. No extra shaping is required. 
  5864 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
  5865 @SYMPREQ 1766: Tamil for Sphinx
  5866 @SYMREQ 8742:Tamil Text Rendering
  5867 */
  5868 	testText[51] = 0x0B95; //Ka
  5869 	testText[52] = 0x0BC8; //Ai
  5870 	
  5871 	param.iPosInText = 51;
  5872 	param.iPen.iX = param.iPen.iY = 0;
  5873 	
  5874 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  5875 	
  5876 	TEST(r && param.iPosInText == 53  		   
  5877 		   && param.iOutputGlyphs == 2
  5878 		   && param.iOutput[0].iCode == 0x80000c14
  5879 		   && param.iOutput[1].iCode == 0x80000bf6);
  5880 
  5881 	#if defined __WINS__ || defined __WINSCW__
  5882 	TEST(r && param.iPen.iX == 31);
  5883 	#endif
  5884 	
  5885 	INFO_PRINTF6(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
  5886 	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  5887     	if (err!=KErrNone)
  5888     		INFO_PRINTF1(_L("Failed to record test result"));
  5889 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4030"));
  5890 //Req 22
  5891 /**
  5892 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4030
  5893 @SYMTestCaseDesc Automated GDI testing for Tamil
  5894 @SYMTestPriority High
  5895 @SYMTestActions  Attempt to compose various valid Tamil glyph clusters to test the requirement
  5896 				 Consonant cluster <ka, virama, ssa> MUST always form conjunct consonant /k.ssa/, which behaves as if it were a proper consonant of its own
  5897 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
  5898 @SYMPREQ 1766: Tamil for Sphinx
  5899 @SYMREQ 8742:Tamil Text Rendering
  5900 */
  5901 	testText[53] = 0x0B95; //Ka
  5902 	testText[54] = 0x0BCD; //Virama
  5903 	testText[55] = 0x0BB7; //Ssa
  5904 	
  5905 	param.iPosInText =  53;
  5906 	param.iPen.iX = param.iPen.iY = 0;
  5907 	
  5908 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  5909 	
  5910 	TEST(r && param.iPosInText == 56  
  5911 		   && param.iOutputGlyphs == 1
  5912 		   && param.iOutput[0].iCode == 0x80000c2f );
  5913 
  5914 	#if defined __WINS__ || defined __WINSCW__
  5915 	TEST(r && param.iPen.iX == 31);
  5916 	#endif
  5917 	
  5918 	INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
  5919 	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  5920     	if (err!=KErrNone)
  5921     		INFO_PRINTF1(_L("Failed to record test result"));
  5922 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4031"));
  5923 //Req 23 1.3.17
  5924 /**
  5925 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4031
  5926 @SYMTestCaseDesc Automated GDI testing for Tamil
  5927 @SYMTestPriority High
  5928 @SYMTestActions  Attempt to compose various valid Tamil glyph clusters to test 
  5929 				Character sequence <sa, virama, ra, matra_ii> MUST be rendered as a ligature form /s.rii/.
  5930 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
  5931 @SYMPREQ 1766: Tamil for Sphinx
  5932 @SYMREQ 8742:Tamil Text Rendering
  5933 */
  5934 	testText[56] = 0x0BB8; //Sa
  5935 	testText[57] = 0x0BCD; //Virama
  5936 	testText[58] = 0x0BB0; //Ra
  5937 	testText[59] = 0x0BC0; //Matra I
  5938 	
  5939 	param.iPosInText = 56;
  5940 	param.iPen.iX = param.iPen.iY = 0;
  5941 	
  5942 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  5943 	
  5944 	TEST(r && param.iPosInText == 60  
  5945 		   && param.iOutputGlyphs == 1 
  5946 		   && param.iOutput[0].iCode == 0x80000c79 );
  5947 	
  5948 	#if defined __WINS__ || defined __WINSCW__
  5949 	TEST(r && param.iPen.iX == 27);
  5950 	#endif
  5951 	
  5952 	INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
  5953 	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  5954     	if (err!=KErrNone)
  5955     		INFO_PRINTF1(_L("Failed to record test result"));
  5956 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4032"));
  5957 //Req 24 1.3.18
  5958 /**
  5959 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4032
  5960 @SYMTestCaseDesc Automated GDI testing for Tamil
  5961 @SYMTestPriority High
  5962 @SYMTestActions  Attempt to compose various valid Tamil glyph clusters to test 
  5963 				Vertical position of the glyphs for combining characters virama, matras /-i/ and /-ii/ must be determined separately in relation to the relevant base glyph
  5964 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
  5965 @SYMPREQ 1766: Tamil for Sphinx
  5966 @SYMREQ 8742:Tamil Text Rendering
  5967 */
  5968 	testText[60] = 0x0B95; //Ka
  5969 	testText[62] = 0x0BCD; //Virama
  5970 	testText[63] = 0x8205; //ZWJ
  5971 	
  5972 	param.iPosInText = 60;
  5973 	param.iPen.iX = param.iPen.iY = 0;
  5974 	
  5975 	r = aFont->GetCharacterPosition2(param,shapeInfo);
  5976 	
  5977 	TEST(r && param.iPosInText == 61  
  5978 		   && param.iOutputGlyphs == 1 
  5979 		   && param.iOutput[0].iCode == 0x80000bf6 );
  5980 	
  5981 	#if defined __WINS__ || defined __WINSCW__
  5982 	TEST(r && param.iPen.iX == 13);
  5983 	#endif
  5984 	
  5985 	INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
  5986 	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  5987     	if (err!=KErrNone)
  5988     		INFO_PRINTF1(_L("Failed to record test result"));
  5989 	}
  5990 
  5991 /**
  5992 @SYMTestCaseID			GRAPHICS-SYSLIB-GDI-CIT-3479
  5993 @SYMTestCaseDesc		Automated GDI testing for correct localised punctuation after indic characters
  5994 @SYMTestPriority		High
  5995 @SYMTestActions			Attempt to compose various valid Indic strings with western punctuation
  5996 @SYMTestExpectedResults The expected punctuation glyphs for the implied locale should be returned
  5997 @SYMDEF					DEF106651
  5998 */
  5999 void CTGlyphSelection::TestGlyphs(CFont* aFont, CFont::TPositionParam& aParam,
  6000 	const TPtrC16& aText, const TPtrC16& aExpectedGlyphs)
  6001 	{
  6002 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-3479"));
  6003 	TUint16* glyphs = CONST_CAST(TUint16*,aExpectedGlyphs.Ptr());
  6004 	const TInt mask = 0x80000000-1;
  6005 	TBool r;
  6006 	RShapeInfo shapeInfo;
  6007 	aParam.iText.Set(aText); 
  6008 	aParam.iPosInText = aParam.iPen.iX = aParam.iPen.iY = 0;
  6009 	while(aParam.iPosInText < aParam.iText.Length())
  6010 		{
  6011 		r = aFont->GetCharacterPosition2(aParam,shapeInfo);
  6012 		//INFO_PRINTF3(_L("Glyph %d Icode 0x%x"),*glyphs,aParam.iOutput[0].iCode);
  6013 		TEST(r && ((aParam.iOutput[0].iCode & mask) == *glyphs++));
  6014 		}
  6015 	shapeInfo.Close();
  6016 	TRAPD(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  6017     	if (err!=KErrNone)
  6018     		INFO_PRINTF1(_L("Failed to record test result"));
  6019 	}
  6020 void CTGlyphSelection::TestTeluguChars(CFbsFont* aFont)
  6021 	{
  6022 INFO_PRINTF1(_L("Test Telugu Glyphs"));
  6023  
  6024   	TBool r;
  6025 	TBuf<162> testText(0);
  6026 	CFont::TPositionParam param;
  6027 	param.iDirection = CFont::EHorizontal;
  6028 	param.iFlags = CFont::TPositionParam::EFLogicalOrder;
  6029 
  6030 	testText.SetLength(162);
  6031 	// Make sure there is no garbage values in the memory we are using.
  6032 	for (TInt i = 0; i < testText.Length(); i++)
  6033 		testText[i]=0xFFFF;
  6034 	
  6035 	param.iText.Set(testText);
  6036 	RShapeInfo shapeInfo;
  6037 
  6038 	//Testdata for Telugu Langauage
  6039 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4033"));
  6040 /*	
  6041 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4033
  6042 @SYMTestCaseDesc Automated GDI testing for Telugu
  6043 @SYMTestPriority High
  6044 @SYMTestActions  Attempt to compose various valid Telugu glyph clusters to test   	 
  6045 				 These consonants contain a small tick mark (crest) at the top of the glyph. This graphical detail can be considered to be a vocalic stem that indirectly indicates the inherent vowel /-a/. VIRAMA replaces the vocalic stem.
  6046 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
  6047 @SYMPREQ 1766: Tamil for Sphinx
  6048 @SYMREQ 8743:Tamil Text Rendering
  6049 */
  6050 //	Req 4.1
  6051 	
  6052 		testText[0] =  0x0C15;
  6053 		testText[1] =  0x0C4D;
  6054 		param.iPosInText = 0 ;
  6055 		param.iPen.iX = param.iPen.iY = 0;
  6056 		r = aFont->GetCharacterPosition2(param,shapeInfo);
  6057 		
  6058 		TEST(r && param.iPosInText == 2  
  6059 			   && param.iOutputGlyphs == 1
  6060 			   && param.iOutput[0].iCode == 0x80000f49 );
  6061 
  6062 		#if defined __WINS__ || defined __WINSCW__
  6063 		TEST(r && param.iPen.iX == 9);
  6064 		#endif
  6065 		
  6066 		INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
  6067 		TRAPD(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  6068     		if (err!=KErrNone)
  6069     			INFO_PRINTF1(_L("Failed to record test result"));
  6070 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4034"));
  6071 /*	
  6072 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4034
  6073 @SYMTestCaseDesc Automated GDI testing for Telugu
  6074 @SYMTestPriority High
  6075 @SYMTestActions  Attempt to compose various valid Telugu glyph clusters to test   	 
  6076 				?VIRAMA attaches the upward stroke at the right of the glyph.	
  6077 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
  6078 @SYMPREQ 1766: Tamil for Sphinx
  6079 @SYMREQ 8743:Tamil Text Rendering
  6080 */		
  6081 		testText[2] =  0x0C16;		
  6082 		testText[3] =  0x0C4D;	
  6083 		
  6084 		param.iPosInText = 2 ;
  6085 		
  6086 		 param.iPen.iX = param.iPen.iY = 0;
  6087 		
  6088 		r = aFont->GetCharacterPosition2(param,shapeInfo);
  6089 		
  6090 		
  6091 		TEST(r && param.iPosInText ==  4 
  6092 			   && param.iOutputGlyphs == 1
  6093 			   && param.iOutput[0].iCode == 0x80000f4a);
  6094 
  6095 		#if defined __WINS__ || defined __WINSCW__
  6096 		TEST(r && param.iPen.iX == 13);
  6097 		#endif
  6098 		
  6099 		INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
  6100 		TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  6101     		if (err!=KErrNone)
  6102     			INFO_PRINTF1(_L("Failed to record test result"));
  6103 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4035"));
  6104 /*	
  6105 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4035
  6106 @SYMTestCaseDesc Automated GDI testing for Telugu
  6107 @SYMTestPriority High
  6108 @SYMTestActions  Attempt to compose various valid Telugu glyph clusters to test   	 
  6109 ?VIRAMA is attached to a stroke at the upper right corner.
  6110 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
  6111 @SYMPREQ 1766: Tamil for Sphinx
  6112 @SYMREQ 8743:Tamil Text Rendering
  6113 */
  6114 		
  6115 		testText[4] =  0x0C23;
  6116 		testText[5] =  0x0C4D;
  6117 		
  6118 		param.iPosInText = 4 ;
  6119 		param.iPen.iX = param.iPen.iY = 0;
  6120 		r = aFont->GetCharacterPosition2(param,shapeInfo);
  6121 		
  6122 		TEST(r && param.iPosInText == 6  
  6123 			   && param.iOutputGlyphs == 1 
  6124 			   && param.iOutput[0].iCode == 0x80000f57 );
  6125 
  6126 		#if defined __WINS__ || defined __WINSCW__
  6127 		TEST(r && param.iPen.iX == 13);
  6128 		#endif
  6129 		
  6130 		INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
  6131 		TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  6132     		if (err!=KErrNone)
  6133     			INFO_PRINTF1(_L("Failed to record test result"));
  6134 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4036"));
  6135 /**
  6136 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4036
  6137 @SYMTestCaseDesc Automated GDI testing for Telugu
  6138 @SYMTestPriority High
  6139 @SYMTestActions  Attempt to compose various valid Telugu glyph clusters to test   	 
  6140 Matras MATRA VOCALIC R and MATRA VOCALIC RR never attach the consonant glyph causing shape changes, but they are always placed at the right of the consonant glyph.
  6141 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
  6142 @SYMPREQ 1766: Tamil for Sphinx
  6143 @SYMREQ 8743:Tamil Text Rendering
  6144 */		
  6145 	//Req 4.2
  6146 		testText[6] =  0x0C2E;
  6147 		testText[7] =  0x0C43;
  6148 		
  6149 		param.iPosInText = 6 ;
  6150 		param.iPen.iX = param.iPen.iY = 0;
  6151 		r = aFont->GetCharacterPosition2(param,shapeInfo);
  6152 		
  6153 		TEST(r && param.iPosInText ==  8 
  6154 			   && param.iOutputGlyphs == 2 
  6155 			   && param.iOutput[0].iCode == 0x80000f21
  6156 			   && param.iOutput[1].iCode == 0x80000f31 );
  6157 
  6158 		#if defined __WINS__ || defined __WINSCW__
  6159 		TEST(r && param.iPen.iX == 24);
  6160 		#endif
  6161 		
  6162 		INFO_PRINTF6(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
  6163 		TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  6164     		if (err!=KErrNone)
  6165     			INFO_PRINTF1(_L("Failed to record test result"));
  6166 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4037"));
  6167 		/*	
  6168 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4037
  6169 @SYMTestCaseDesc Automated GDI testing for Telugu
  6170 @SYMTestPriority High
  6171 @SYMTestActions  Attempt to compose various valid Telugu glyph clusters to test   	 
  6172 Matras MATRA VOCALIC R and MATRA VOCALIC RR never attach the consonant glyph causing shape changes, but they are always placed at the right of the consonant glyph.
  6173 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
  6174 @SYMPREQ 1766: Tamil for Sphinx
  6175 @SYMREQ 8743:Tamil Text Rendering
  6176 */	
  6177 		testText[8] =  0x0C32;
  6178 		
  6179 		testText[9] =  0x0C44;
  6180 		
  6181 		param.iPosInText = 8 ;
  6182 		param.iPen.iX = param.iPen.iY = 0;
  6183 		
  6184 		r = aFont->GetCharacterPosition2(param,shapeInfo);	
  6185 		
  6186 		TEST(r && param.iPosInText ==  10 
  6187 			   && param.iOutputGlyphs == 2
  6188 			   && param.iOutput[0].iCode == 0x80000f25
  6189 			   && param.iOutput[1].iCode == 0x80000f32);
  6190 
  6191 		#if defined __WINS__ || defined __WINSCW__
  6192 		TEST(r && param.iPen.iX == 22);
  6193 		#endif
  6194 		
  6195 		INFO_PRINTF6(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
  6196 		TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  6197     		if (err!=KErrNone)
  6198     			INFO_PRINTF1(_L("Failed to record test result"));
  6199 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4038"));
  6200 		/*	
  6201 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4038
  6202 @SYMTestCaseDesc Automated GDI testing for Telugu
  6203 @SYMTestPriority High
  6204 @SYMTestActions  Attempt to compose various valid Telugu glyph clusters to test   	 
  6205 ?Matras MATRA VOCALIC R and MATRA VOCALIC RR never attach the consonant glyph causing shape changes, but they are always placed at the right of the consonant glyph.
  6206 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
  6207 @SYMPREQ 1766: Tamil for Sphinx
  6208 @SYMREQ 8743:Tamil Text Rendering
  6209 */		
  6210 	//Req 4.2.1
  6211 		testText[10] = 0x0C15; 
  6212 		testText[11] = 0x0C3E;
  6213 		
  6214 		param.iPosInText = 10 ;
  6215 		param.iPen.iX = param.iPen.iY = 0;
  6216 		r = aFont->GetCharacterPosition2(param,shapeInfo);
  6217 		
  6218 		TEST(r && param.iPosInText == 12  
  6219 			   && param.iOutputGlyphs == 1
  6220 			   && param.iOutput[0].iCode == 0x80000f6d );
  6221 
  6222 		#if defined __WINS__ || defined __WINSCW__
  6223 		TEST(r && param.iPen.iX == 13);
  6224 		#endif
  6225 		
  6226 		INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
  6227 		TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  6228     		if (err!=KErrNone)
  6229     			INFO_PRINTF1(_L("Failed to record test result"));
  6230 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4039"));
  6231 		/*	
  6232 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4039
  6233 @SYMTestCaseDesc Automated GDI testing for Telugu
  6234 @SYMTestPriority High
  6235 @SYMTestActions  Attempt to compose various valid Telugu glyph clusters to test   	 
  6236 ?MATRA AA attaches to the upwards left curving stroke
  6237 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
  6238 @SYMPREQ 1766: Tamil for Sphinx
  6239 @SYMREQ 8743:Tamil Text Rendering
  6240 */	
  6241 		testText[12] = 0x0C1F;
  6242 		testText[13] = 0x0C3E;
  6243 		param.iPosInText = 12 ;
  6244 		param.iPen.iX = param.iPen.iY = 0;
  6245 		r = aFont->GetCharacterPosition2(param,shapeInfo);
  6246 		
  6247 		TEST(r && param.iPosInText == 14  
  6248 			   && param.iOutputGlyphs == 1
  6249 			   && param.iOutput[0].iCode == 0x80000f77 );
  6250 
  6251 		#if defined __WINS__ || defined __WINSCW__
  6252 		TEST(r && param.iPen.iX == 16);
  6253 		#endif
  6254 		
  6255 		INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
  6256 		TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  6257     		if (err!=KErrNone)
  6258     			INFO_PRINTF1(_L("Failed to record test result"));
  6259 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4040"));
  6260 		/*	
  6261 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4040
  6262 @SYMTestCaseDesc Automated GDI testing for Telugu
  6263 @SYMTestPriority High
  6264 @SYMTestActions  Attempt to compose various valid Telugu glyph clusters to test   	 
  6265 ?MATRA AA attaches the upwards (left curving) stroke at the top of the glyph
  6266 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
  6267 @SYMPREQ 1766: Tamil for Sphinx
  6268 @SYMREQ 8743:Tamil Text Rendering
  6269 */
  6270 		testText[14] = 0x0C1C;
  6271 		testText[15] = 0x0C3E;
  6272 		
  6273 		param.iPosInText = 14 ;
  6274 		param.iPen.iX = param.iPen.iY = 0;
  6275 		r = aFont->GetCharacterPosition2(param,shapeInfo);
  6276 		
  6277 		TEST(r && param.iPosInText == 16  
  6278 			   && param.iOutputGlyphs == 1
  6279 			   && param.iOutput[0].iCode == 0x80000f74 );
  6280 	
  6281 		#if defined __WINS__ || defined __WINSCW__
  6282 		TEST(r && param.iPen.iX == 15);
  6283 		#endif
  6284 		
  6285 		INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
  6286 		TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  6287     		if (err!=KErrNone)
  6288     			INFO_PRINTF1(_L("Failed to record test result"));
  6289 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4041"));
  6290 		/*	
  6291 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4041
  6292 @SYMTestCaseDesc Automated GDI testing for Telugu
  6293 @SYMTestPriority High
  6294 @SYMTestActions  Attempt to compose various valid Telugu glyph clusters to test   	 
  6295 ?MATRA AA is drawn on top of the glyph
  6296 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
  6297 @SYMPREQ 1766: Tamil for Sphinx
  6298 @SYMREQ 8743:Tamil Text Rendering
  6299 */	
  6300 		testText[16] = 0x0C23;
  6301 		testText[17] = 0x0C3E;
  6302 		
  6303 		param.iPosInText = 16 ;
  6304 		param.iPen.iX = param.iPen.iY = 0;
  6305 		r = aFont->GetCharacterPosition2(param,shapeInfo);
  6306 		
  6307 		TEST(r && param.iPosInText == 18  
  6308 			   && param.iOutputGlyphs == 1
  6309 			   && param.iOutput[0].iCode == 0x80000f7b );
  6310 
  6311 		#if defined __WINS__ || defined __WINSCW__
  6312 		TEST(r && param.iPen.iX == 16);
  6313 		#endif
  6314 		
  6315 		INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
  6316 		TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  6317     		if (err!=KErrNone)
  6318     			INFO_PRINTF1(_L("Failed to record test result"));
  6319 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4042"));
  6320 		/*	
  6321 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4042
  6322 @SYMTestCaseDesc Automated GDI testing for Telugu
  6323 @SYMTestPriority High
  6324 @SYMTestActions  Attempt to compose various valid Telugu glyph clusters to test   	 
  6325 ?MATRA AA attaches to the upwards left curving stroke, the vowel stem remains intact
  6326 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
  6327 @SYMPREQ 1766: Tamil for Sphinx
  6328 @SYMREQ 8743:Tamil Text Rendering
  6329 */	
  6330 		testText[18] = 0x0C2B;
  6331 		testText[19] = 0x0C3E;
  6332 		
  6333 		param.iPosInText = 18 ;
  6334 		param.iPen.iX = param.iPen.iY = 0;
  6335 						
  6336 		r = aFont->GetCharacterPosition2(param,shapeInfo);
  6337 		
  6338 		TEST(r && param.iPosInText == 20  
  6339 			   && param.iOutputGlyphs == 1
  6340 			   && param.iOutput[0].iCode == 0x80000f82 );
  6341 
  6342 		#if defined __WINS__ || defined __WINSCW__
  6343 		TEST(r && param.iPen.iX == 16);
  6344 		#endif
  6345 		
  6346 		INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
  6347 		TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  6348     		if (err!=KErrNone)
  6349     			INFO_PRINTF1(_L("Failed to record test result"));
  6350 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4043"));
  6351 		/*	
  6352 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4043
  6353 @SYMTestCaseDesc Automated GDI testing for Telugu
  6354 @SYMTestPriority High
  6355 @SYMTestActions  Attempt to compose various valid Telugu glyph clusters to test   	 
  6356 ?MATRA AA replaces the vowel stem, the upwards left curving stroke is extended
  6357 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
  6358 @SYMPREQ 1766: Tamil for Sphinx
  6359 @SYMREQ 8743:Tamil Text Rendering
  6360 */	
  6361 		testText[20] = 0x0C2A;
  6362 		testText[21] = 0x0C3E;
  6363 	
  6364 		param.iPosInText = 20 ;
  6365 		param.iPen.iX = param.iPen.iY = 0;
  6366 		
  6367 		r = aFont->GetCharacterPosition2(param,shapeInfo);
  6368 
  6369 		TEST(r && param.iPosInText == 22   
  6370 			   && param.iOutputGlyphs == 1
  6371 			   && param.iOutput[0].iCode == 0x80000f81);
  6372 
  6373 		#if defined __WINS__ || defined __WINSCW__
  6374 		TEST(r && param.iPen.iX == 16);
  6375 		#endif
  6376 		
  6377 		INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
  6378 		TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  6379     		if (err!=KErrNone)
  6380     			INFO_PRINTF1(_L("Failed to record test result"));
  6381 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4044"));
  6382 	//Req 4.2.2
  6383 	/*	
  6384 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4044
  6385 @SYMTestCaseDesc Automated GDI testing for Telugu
  6386 @SYMTestPriority High
  6387 @SYMTestActions  Attempt to compose various valid Telugu glyph clusters to test   	 
  6388 ?Vowel sign replaces the vowel stem
  6389 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
  6390 @SYMPREQ 1766: Tamil for Sphinx
  6391 @SYMREQ 8743:Tamil Text Rendering
  6392 */
  6393 		testText[22] = 0x0C26;
  6394 		testText[23] = 0x0C3F;
  6395 		
  6396 		param.iPosInText = 22 ;
  6397 		param.iPen.iX = param.iPen.iY = 0;
  6398 		
  6399 		r = aFont->GetCharacterPosition2(param,shapeInfo);
  6400 		
  6401 		TEST(r && param.iPosInText ==  24 
  6402 			   && param.iOutputGlyphs == 1
  6403 			   && param.iOutput[0].iCode == 0x80000fa2 );
  6404 
  6405 		#if defined __WINS__ || defined __WINSCW__
  6406 		TEST(r && param.iPen.iX == 11);
  6407 		#endif
  6408 			
  6409 		INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
  6410 		TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  6411     		if (err!=KErrNone)
  6412     			INFO_PRINTF1(_L("Failed to record test result"));
  6413 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4045"));
  6414 		/*	
  6415 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4045
  6416 @SYMTestCaseDesc Automated GDI testing for Telugu
  6417 @SYMTestPriority High
  6418 @SYMTestActions  Attempt to compose various valid Telugu glyph clusters to test   	 
  6419 ?The upwards left curving stroke extends, vowel sign attaches to the extended stroke
  6420 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
  6421 @SYMPREQ 1766: Tamil for Sphinx
  6422 @SYMREQ 8743:Tamil Text Rendering
  6423 */
  6424 		testText[24] = 0x0C16;
  6425 		testText[25] = 0x0C3F;
  6426 	
  6427 		param.iPosInText = 24 ;
  6428 		param.iPen.iX = param.iPen.iY = 0;
  6429 		
  6430 		r = aFont->GetCharacterPosition2(param,shapeInfo);
  6431 		
  6432 		TEST(r && param.iPosInText == 26  
  6433 			   && param.iOutputGlyphs == 1
  6434 			   && param.iOutput[0].iCode == 0x80000f92);
  6435 
  6436 		#if defined __WINS__ || defined __WINSCW__
  6437 		TEST(r && param.iPen.iX == 12);
  6438 		#endif
  6439 		
  6440 		INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
  6441 		TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  6442     		if (err!=KErrNone)
  6443     			INFO_PRINTF1(_L("Failed to record test result"));
  6444 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4046"));
  6445 		/*	
  6446 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4046
  6447 @SYMTestCaseDesc Automated GDI testing for Telugu
  6448 @SYMTestPriority High
  6449 @SYMTestActions  Attempt to compose various valid Telugu glyph clusters to test   	 
  6450 ?Vowel sign attaches the upward stroke at the top of the glyph
  6451 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
  6452 @SYMPREQ 1766: Tamil for Sphinx
  6453 @SYMREQ 8743:Tamil Text Rendering
  6454 */	
  6455 		testText[26] = 0x0C1C;
  6456 		testText[27] = 0x0C3F;
  6457 	
  6458 		param.iPosInText = 26 ;
  6459 		param.iPen.iX = param.iPen.iY = 0;
  6460 		
  6461 		r = aFont->GetCharacterPosition2(param,shapeInfo);
  6462 		
  6463 		TEST(r && param.iPosInText == 28  
  6464 			   && param.iOutputGlyphs == 1
  6465 			   && param.iOutput[0].iCode == 0x80000f98 );
  6466 
  6467 		#if defined __WINS__ || defined __WINSCW__
  6468 		TEST(r && param.iPen.iX == 12);
  6469 		#endif
  6470 		
  6471 		INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
  6472 		TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  6473     		if (err!=KErrNone)
  6474     			INFO_PRINTF1(_L("Failed to record test result"));
  6475 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4047"));
  6476 		/*	
  6477 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4047
  6478 @SYMTestCaseDesc Automated GDI testing for Telugu
  6479 @SYMTestPriority High
  6480 @SYMTestActions  Attempt to compose various valid Telugu glyph clusters to test   	 
  6481 ?Vowel sign attaches the upward stroke at the top of the glyph
  6482 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
  6483 @SYMPREQ 1766: Tamil for Sphinx
  6484 @SYMREQ 8743:Tamil Text Rendering
  6485 */		
  6486 		testText[28] = 0x0C1E;
  6487 		testText[29] = 0x0C40;
  6488 		
  6489 		param.iPosInText = 28 ;
  6490 		param.iPen.iX = param.iPen.iY = 0;
  6491 				
  6492 		r = aFont->GetCharacterPosition2(param,shapeInfo);
  6493 		
  6494 		TEST(r && param.iPosInText == 30  
  6495 			   && param.iOutputGlyphs == 1
  6496 			   && param.iOutput[0].iCode == 0x80000fbe );
  6497 
  6498 		#if defined __WINS__ || defined __WINSCW__
  6499 		TEST(r && param.iPen.iX == 14);
  6500 		#endif
  6501 		
  6502 		INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
  6503 		TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  6504     		if (err!=KErrNone)
  6505     			INFO_PRINTF1(_L("Failed to record test result"));
  6506 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4048"));
  6507 		/*	
  6508 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4048
  6509 @SYMTestCaseDesc Automated GDI testing for Telugu
  6510 @SYMTestPriority High
  6511 @SYMTestActions  Attempt to compose various valid Telugu glyph clusters to test   	 
  6512 ?Vowel sign attaches to the right upper corner of the glyph
  6513 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
  6514 @SYMPREQ 1766: Tamil for Sphinx
  6515 @SYMREQ 8743:Tamil Text Rendering
  6516 */		
  6517 		testText[30] = 0x0C1F;
  6518 		testText[31] = 0x0C3F;
  6519 	
  6520 		param.iPosInText = 30;
  6521 		param.iPen.iX = param.iPen.iY = 0;
  6522 		
  6523 		r = aFont->GetCharacterPosition2(param,shapeInfo);
  6524 
  6525 		TEST(r && param.iPosInText == 32  
  6526 			   && param.iOutputGlyphs == 1
  6527 			   && param.iOutput[0].iCode ==  0x80000f9b );
  6528 
  6529 		#if defined __WINS__ || defined __WINSCW__
  6530 		TEST(r && param.iPen.iX == 12);
  6531 		#endif
  6532 		
  6533 		INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
  6534 		TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  6535     		if (err!=KErrNone)
  6536     			INFO_PRINTF1(_L("Failed to record test result"));
  6537 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4049"));
  6538 		/*	
  6539 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4049
  6540 @SYMTestCaseDesc Automated GDI testing for Telugu
  6541 @SYMTestPriority High
  6542 @SYMTestActions  Attempt to compose various valid Telugu glyph clusters to test   	 
  6543 ?Vowel sign takes a loop form that replaces the vowel stem
  6544 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
  6545 @SYMPREQ 1766: Tamil for Sphinx
  6546 @SYMREQ 8743:Tamil Text Rendering
  6547 */		
  6548 		testText[32] = 0x0C1D;
  6549 		testText[33] = 0x0C3F;
  6550 	
  6551 		param.iPosInText = 32 ;
  6552 		param.iPen.iX = param.iPen.iY = 0;
  6553 		
  6554 		r = aFont->GetCharacterPosition2(param,shapeInfo);
  6555 		
  6556 		TEST(r && param.iPosInText ==  34 
  6557 			   && param.iOutputGlyphs == 1
  6558 			   && param.iOutput[0].iCode ==  0x80000f99 );
  6559 	
  6560 		#if defined __WINS__ || defined __WINSCW__
  6561 		TEST(r && param.iPen.iX == 19);
  6562 		#endif
  6563 		
  6564 		INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
  6565 		TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  6566     		if (err!=KErrNone)
  6567     			INFO_PRINTF1(_L("Failed to record test result"));
  6568 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4050"));
  6569 		/*	
  6570 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4050
  6571 @SYMTestCaseDesc Automated GDI testing for Telugu
  6572 @SYMTestPriority High
  6573 @SYMTestActions  Attempt to compose various valid Telugu glyph clusters to test   	 
  6574 ?The upwards left curving stroke extends, vowel sign replaces the vowel stem at the tip of the extended stroke 
  6575 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
  6576 @SYMPREQ 1766: Tamil for Sphinx
  6577 @SYMREQ 8743:Tamil Text Rendering
  6578 */	
  6579 		testText[34] = 0x0C1B;
  6580 		testText[35] = 0x0C3F;
  6581 	
  6582 	 	param.iPosInText =34 ;
  6583 		param.iPen.iX = param.iPen.iY = 0;
  6584 		
  6585 		r = aFont->GetCharacterPosition2(param,shapeInfo);
  6586 		
  6587 		TEST(r && param.iPosInText == 36 
  6588 			   && param.iOutputGlyphs == 1
  6589 			   && param.iOutput[0].iCode == 0x80000f97 );
  6590 
  6591 		#if defined __WINS__ || defined __WINSCW__
  6592 		TEST(r && param.iPen.iX == 12);
  6593 		#endif
  6594 		
  6595 		INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
  6596 		TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  6597     		if (err!=KErrNone)
  6598     			INFO_PRINTF1(_L("Failed to record test result"));
  6599 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4051"));
  6600 		/*	
  6601 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4051
  6602 @SYMTestCaseDesc Automated GDI testing for Telugu
  6603 @SYMTestPriority High
  6604 @SYMTestActions  Attempt to compose various valid Telugu glyph clusters to test   	 
  6605 ?Vowel sign replaces the upwards curving stroke at the top of the glyph
  6606 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
  6607 @SYMPREQ 1766: Tamil for Sphinx
  6608 @SYMREQ 8743:Tamil Text Rendering
  6609 */		
  6610 		testText[36] = 0x0C1C;
  6611 		testText[37] = 0x0C3F;
  6612 	
  6613 		param.iPosInText = 36 ;
  6614 		param.iPen.iX = param.iPen.iY = 0;
  6615 					
  6616 		r = aFont->GetCharacterPosition2(param,shapeInfo);
  6617 		
  6618 		TEST(r && param.iPosInText == 38  
  6619 			   && param.iOutputGlyphs == 1
  6620 			   && param.iOutput[0].iCode == 0x80000f98 );
  6621 		
  6622 		#if defined __WINS__ || defined __WINSCW__
  6623 		TEST(r && param.iPen.iX == 12);
  6624 		#endif
  6625 		
  6626 		INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
  6627 		TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  6628     		if (err!=KErrNone)
  6629     			INFO_PRINTF1(_L("Failed to record test result"));
  6630 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4052"));
  6631 		/*	
  6632 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4052
  6633 @SYMTestCaseDesc Automated GDI testing for Telugu
  6634 @SYMTestPriority High
  6635 @SYMTestActions  Attempt to compose various valid Telugu glyph clusters to test   	 
  6636 ?Vowel stem is removed.
  6637 ?Vowel stem is removed and MATRA II takes a form that looks like MATRA AA
  6638 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
  6639 @SYMPREQ 1766: Tamil for Sphinx
  6640 @SYMREQ 8743:Tamil Text Rendering
  6641 */		
  6642 		testText[38] = 0x0C2F;
  6643 		testText[39] = 0x0C3F;
  6644 	
  6645 		param.iPosInText = 38 ;
  6646 		param.iPen.iX = param.iPen.iY = 0;
  6647 		
  6648 		r = aFont->GetCharacterPosition2(param,shapeInfo);
  6649 		
  6650 		TEST(r && param.iPosInText == 40 
  6651 			   && param.iOutputGlyphs == 1
  6652 			   && param.iOutput[0].iCode == 0x80000faa );
  6653 
  6654 		#if defined __WINS__ || defined __WINSCW__
  6655 		TEST(r && param.iPen.iX == 19);
  6656 		#endif
  6657 		
  6658 		INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
  6659 		TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  6660     		if (err!=KErrNone)
  6661     			INFO_PRINTF1(_L("Failed to record test result"));
  6662 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4053"));
  6663 		/*	
  6664 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4053
  6665 @SYMTestCaseDesc Automated GDI testing for Telugu
  6666 @SYMTestPriority High
  6667 @SYMTestActions  Attempt to compose various valid Telugu glyph clusters to test   	 
  6668 ?Vowel sign attaches to the right of the consonant glyph, vowel stem remains intact
  6669 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
  6670 @SYMPREQ 1766: Tamil for Sphinx
  6671 @SYMREQ 8743:Tamil Text Rendering
  6672 */	
  6673 		testText[40] = 0x0C15;
  6674 		testText[41] = 0x0C41;
  6675 	
  6676 		param.iPosInText = 40 ;
  6677 		param.iPen.iX = param.iPen.iY = 0;
  6678 		r = aFont->GetCharacterPosition2(param,shapeInfo);
  6679 		
  6680 		TEST(r && param.iPosInText ==42   
  6681 			   && param.iOutputGlyphs == 1
  6682 			   && param.iOutput[0].iCode == 0x80000fd9 );
  6683 		
  6684 		#if defined __WINS__ || defined __WINSCW__
  6685 		TEST(r && param.iPen.iX == 14);
  6686 		#endif
  6687 		
  6688 		INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
  6689 		TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  6690     		if (err!=KErrNone)
  6691     			INFO_PRINTF1(_L("Failed to record test result"));
  6692 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4054"));
  6693 		/*	
  6694 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4054
  6695 @SYMTestCaseDesc Automated GDI testing for Telugu
  6696 @SYMTestPriority High
  6697 @SYMTestActions  Attempt to compose various valid Telugu glyph clusters to test   	 
  6698 ?Vowel sign takes a miniature form which attaches to the stroke at the top of the consonant glyph
  6699 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
  6700 @SYMPREQ 1766: Tamil for Sphinx
  6701 @SYMREQ 8743:Tamil Text Rendering
  6702 */	
  6703 		testText[42] = 0x0C19;
  6704 		testText[43] = 0x0C41;
  6705 	
  6706 		param.iPosInText = 42 ;
  6707 		param.iPen.iX = param.iPen.iY = 0;
  6708 						
  6709 		r = aFont->GetCharacterPosition2(param,shapeInfo);
  6710 		
  6711 		TEST(r && param.iPosInText ==  44 
  6712 			   && param.iOutputGlyphs == 1
  6713 			   && param.iOutput[0].iCode == 0x80000fda );
  6714 		
  6715 		#if defined __WINS__ || defined __WINSCW__
  6716 		TEST(r && param.iPen.iX == 15);
  6717 		#endif
  6718 		
  6719 		INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
  6720 		TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  6721     		if (err!=KErrNone)
  6722     			INFO_PRINTF1(_L("Failed to record test result"));
  6723 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4055"));
  6724 		/*	
  6725 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4055
  6726 @SYMTestCaseDesc Automated GDI testing for Telugu
  6727 @SYMTestPriority High
  6728 @SYMTestActions  Attempt to compose various valid Telugu glyph clusters to test   	 
  6729 ?Vowel sign attaches the consonant sign from below. Vowel stem remains intact.
  6730 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
  6731 @SYMPREQ 1766: Tamil for Sphinx
  6732 @SYMREQ 8743:Tamil Text Rendering
  6733 */	
  6734 		testText[44] = 0x0C2E;
  6735 		testText[45] = 0x0C41;
  6736 	
  6737 		param.iPosInText = 44 ;
  6738 		param.iPen.iX = param.iPen.iY = 0;
  6739 		r = aFont->GetCharacterPosition2(param,shapeInfo);
  6740 		
  6741 		TEST(r && param.iPosInText == 46   
  6742 			   && param.iOutputGlyphs == 2
  6743 			   && param.iOutput[0].iCode == 0x80000f21 );
  6744 
  6745 		#if defined __WINS__ || defined __WINSCW__
  6746 		TEST(r && param.iPen.iX == 21);
  6747 		#endif
  6748 		
  6749 		INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
  6750 		
  6751 		testText[46] = 0x0C36;
  6752 		testText[47] = 0x0C41;
  6753 	
  6754 		param.iPosInText = 46 ;
  6755 		param.iPen.iX = param.iPen.iY = 0;
  6756 		r = aFont->GetCharacterPosition2(param,shapeInfo);
  6757 		
  6758 		TEST(r && param.iPosInText == 48   
  6759 			   && param.iOutputGlyphs == 2 
  6760 			   && param.iOutput[0].iCode == 0x80000f28 );
  6761 
  6762 		#if defined __WINS__ || defined __WINSCW__
  6763 		TEST(r && param.iPen.iX == 14);
  6764 		#endif
  6765 			
  6766 		INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
  6767 		TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  6768     		if (err!=KErrNone)
  6769     			INFO_PRINTF1(_L("Failed to record test result"));
  6770 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4056"));
  6771 		/*	
  6772 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4056
  6773 @SYMTestCaseDesc Automated GDI testing for Telugu
  6774 @SYMTestPriority High
  6775 @SYMTestActions  Attempt to compose various valid Telugu glyph clusters to test   	 
  6776 ?Vowel sign replaces the vowel stem
  6777 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
  6778 @SYMPREQ 1766: Tamil for Sphinx
  6779 @SYMREQ 8743:Tamil Text Rendering
  6780 */		
  6781 //	Req 4.2.4
  6782 		testText[48] = 0x0C28;
  6783 		testText[49] = 0x0C46;
  6784 	
  6785 		param.iPosInText = 48 ;
  6786 		param.iPen.iX = param.iPen.iY = 0;
  6787 		r = aFont->GetCharacterPosition2(param,shapeInfo);
  6788 		
  6789 		TEST(r && param.iPosInText == 50   
  6790 			   && param.iOutputGlyphs == 1
  6791 			   && param.iOutput[0].iCode == 0x80001000 );
  6792 
  6793 		#if defined __WINS__ || defined __WINSCW__
  6794 		TEST(r && param.iPen.iX == 11);
  6795 		#endif
  6796 		
  6797 		INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
  6798 		TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  6799     		if (err!=KErrNone)
  6800     			INFO_PRINTF1(_L("Failed to record test result"));
  6801 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4057"));
  6802 		/*	
  6803 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4057
  6804 @SYMTestCaseDesc Automated GDI testing for Telugu
  6805 @SYMTestPriority High
  6806 @SYMTestActions  Attempt to compose various valid Telugu glyph clusters to test   	 
  6807 ?Vowel sign replaces the vowel stem
  6808 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
  6809 @SYMPREQ 1766: Tamil for Sphinx
  6810 @SYMREQ 8743:Tamil Text Rendering
  6811 */		
  6812 		testText[50] = 0x0C1B;
  6813 		testText[51] = 0x0C47;
  6814 		
  6815 		param.iPosInText = 50 ;
  6816 		param.iPen.iX = param.iPen.iY = 0;
  6817 		r = aFont->GetCharacterPosition2(param,shapeInfo);
  6818 		
  6819 		TEST(r && param.iPosInText ==  52 
  6820 			   && param.iOutputGlyphs == 1
  6821 			   && param.iOutput[0].iCode == 0x80001017 );
  6822 
  6823 		#if defined __WINS__ || defined __WINSCW__
  6824 		TEST(r && param.iPen.iX == 12);
  6825 		#endif
  6826 		
  6827 		INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
  6828 		TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  6829     		if (err!=KErrNone)
  6830     			INFO_PRINTF1(_L("Failed to record test result"));
  6831 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4058"));
  6832 		/*	
  6833 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4058
  6834 @SYMTestCaseDesc Automated GDI testing for Telugu
  6835 @SYMTestPriority High
  6836 @SYMTestActions  Attempt to compose various valid Telugu glyph clusters to test   	 
  6837 ?Vowel sign replaces the vowel stem
  6838 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
  6839 @SYMPREQ 1766: Tamil for Sphinx
  6840 @SYMREQ 8743:Tamil Text Rendering
  6841 */		
  6842 		testText[52] = 0x0C1D;	
  6843 		testText[53] = 0x0C48;
  6844 		
  6845 		param.iPosInText = 52 ;
  6846 		param.iPen.iX = param.iPen.iY = 0;
  6847 		r = aFont->GetCharacterPosition2(param,shapeInfo);
  6848 		
  6849 		TEST(r && param.iPosInText ==  54 
  6850 			   && param.iOutputGlyphs == 2
  6851 			   && param.iOutput[0].iCode == 0x80000ff5
  6852 			   && param.iOutput[1].iCode == 0x80000f3b );
  6853 
  6854 		#if defined __WINS__ || defined __WINSCW__
  6855 		TEST(r && param.iPen.iX == 19);
  6856 		#endif
  6857 		
  6858 		INFO_PRINTF6(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
  6859 		TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  6860     		if (err!=KErrNone)
  6861     			INFO_PRINTF1(_L("Failed to record test result"));
  6862 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4059"));	
  6863 		/*	
  6864 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4059
  6865 @SYMTestCaseDesc Automated GDI testing for Telugu
  6866 @SYMTestPriority High
  6867 @SYMTestActions  Attempt to compose various valid Telugu glyph clusters to test   	 
  6868 ?Vowel sign replaces the vowel stem.
  6869 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
  6870 @SYMPREQ 1766: Tamil for Sphinx
  6871 @SYMREQ 8743:Tamil Text Rendering
  6872 */	
  6873 	// Req 4.2.5
  6874 		testText[54] = 0x0C15;
  6875 		testText[55] = 0x0C4A;
  6876 		
  6877 		param.iPosInText = 54 ;
  6878 		param.iPen.iX = param.iPen.iY = 0;
  6879 		
  6880 		r = aFont->GetCharacterPosition2(param,shapeInfo);
  6881 		
  6882 		TEST(r && param.iPosInText ==  56 
  6883 			   && param.iOutputGlyphs == 1
  6884 			   && param.iOutput[0].iCode == 0x80001059 );
  6885 
  6886 		#if defined __WINS__ || defined __WINSCW__
  6887 		TEST(r && param.iPen.iX == 13);
  6888 		#endif
  6889 		
  6890 		INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
  6891 		TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  6892     		if (err!=KErrNone)
  6893     			INFO_PRINTF1(_L("Failed to record test result"));
  6894 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4060"));
  6895 		/*	
  6896 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4060
  6897 @SYMTestCaseDesc Automated GDI testing for Telugu
  6898 @SYMTestPriority High
  6899 @SYMTestActions  Attempt to compose various valid Telugu glyph clusters to test   	 
  6900 ?Vowel sign replaces the vowel stem.
  6901 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
  6902 @SYMPREQ 1766: Tamil for Sphinx
  6903 @SYMREQ 8743:Tamil Text Rendering
  6904 */	
  6905 	
  6906 		testText[56] = 0x0C21;
  6907 		testText[57] = 0x0C4B;
  6908 		
  6909 		param.iPosInText = 56 ;
  6910 		param.iPen.iX = param.iPen.iY = 0;
  6911 		
  6912 		r = aFont->GetCharacterPosition2(param,shapeInfo);
  6913 		
  6914 		TEST(r && param.iPosInText ==  58 
  6915 			   && param.iOutputGlyphs == 1 
  6916 			   && param.iOutput[0].iCode == 0x80001089 );
  6917 
  6918 		#if defined __WINS__ || defined __WINSCW__
  6919 		TEST(r && param.iPen.iX == 14);
  6920 		#endif
  6921 		
  6922 		INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
  6923 		TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  6924     		if (err!=KErrNone)
  6925     			INFO_PRINTF1(_L("Failed to record test result"));
  6926 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4061"));
  6927 		/*	
  6928 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4061
  6929 @SYMTestCaseDesc Automated GDI testing for Telugu
  6930 @SYMTestPriority High
  6931 @SYMTestActions  Attempt to compose various valid Telugu glyph clusters to test   	 
  6932 ?Vowel sign replaces the vowel stem.
  6933 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
  6934 @SYMPREQ 1766: Tamil for Sphinx
  6935 @SYMREQ 8743:Tamil Text Rendering
  6936 */	
  6937 		testText[58] = 0x0C26;
  6938 		testText[59] = 0x0C4C;
  6939 		
  6940 		param.iPosInText = 58 ;
  6941 		param.iPen.iX = param.iPen.iY = 0;
  6942 		
  6943 		r = aFont->GetCharacterPosition2(param,shapeInfo);
  6944 		
  6945 		TEST(r && param.iPosInText == 60   
  6946 			   && param.iOutputGlyphs == 1
  6947 			   && param.iOutput[0].iCode == 0x800010b2 );
  6948 	
  6949 		#if defined __WINS__ || defined __WINSCW__
  6950 		TEST(r && param.iPen.iX == 14);
  6951 		#endif
  6952 		
  6953 		INFO_PRINTF5(_L("The values are  iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
  6954 	}
  6955 	
  6956 void CTGlyphSelection::TestIndicPunctuation(CFbsFont* aFont)
  6957 	{
  6958 	INFO_PRINTF1(_L("Test Indic Punctuation"));
  6959 
  6960 	CFont::TPositionParam param;
  6961 	param.iDirection = CFont::EHorizontal;
  6962 	param.iFlags = CFont::TPositionParam::EFLogicalOrder;
  6963 	
  6964 	//INFO_PRINTF1(_L("// punctuation string after Kannada text"));
  6965 	TestGlyphs(aFont,param,_L("\xC95!?#@"),_L("\x7A8\x920\x93C\x922\x23"));
  6966 	//INFO_PRINTF1(_L("// punctuation string before Kannada text"));
  6967 	TestGlyphs(aFont,param,_L("!?#@\xC95"),_L("\x21\x3F\x23\x40\x7A8"));
  6968 	//INFO_PRINTF1(_L("// punctuation string before and after Kannada text"));
  6969 	TestGlyphs(aFont,param,_L("  \"\xC95\"  "),_L("\x20\x20\x22\x7A8\x22\x20\x20"));
  6970 	//INFO_PRINTF1(_L("// punctuation before and after latin text followed by punctuation before and after kannada text"));
  6971 	TestGlyphs(aFont,param,_L("\x201c\x041\x201D (\xc95)"),_L("\x201c\x41\x201d\x20\x28\x7a8\x29"));
  6972 	//INFO_PRINTF1(_L("// mixed kannada/ latin with punctuation surrounded by whitespace inbetween"));
  6973 	TestGlyphs(aFont,param,_L("\xc95 , \x041"),_L("\x7a8\x20\x929\x20\x41"));
  6974 	//INFO_PRINTF1(_L("// mixed kannada/ latin with punctuation surrounded by whitespace inbetween (reversed)"));
  6975 	TestGlyphs(aFont,param,_L("\x041 , \xc95"),_L("\x41\x20\x2C\x20\x7a8"));
  6976 	//INFO_PRINTF1(_L("// mixed kannada/ latin with punctuation next to latin"));
  6977 	TestGlyphs(aFont,param,_L("\x041, \xc95"),_L("\x41\x2C\x20\x7a8"));
  6978 	//INFO_PRINTF1(_L("// mixed kannada/ latin with punctuation next to kannada"));
  6979 	TestGlyphs(aFont,param,_L("\x041 ,\xc95"),_L("\x41\x20\x2C\x7a8"));
  6980 	//INFO_PRINTF1(_L("// mixed kannada/ latin with punctuation next to latin and seperating tab"));
  6981 	TestGlyphs(aFont,param,_L("\x041,\t\xc95"),_L("\x41\x2C\x9\x7a8"));
  6982 	//INFO_PRINTF1(_L("// mixed kannada/ latin with punctuation next to kannada and seperating tab"));
  6983 	TestGlyphs(aFont,param,_L("\x041\t,\xc95"),_L("\x41\x9\x2C\x7a8"));
  6984 	//INFO_PRINTF1(_L("// devanagari digits with colons"));
  6985 	TestGlyphs(aFont,param,_L("\x966\x03a\x967\x03a\x968\x03a\x969\x03a\x96a\x03a\x96b\x03a\x96c\x03a\x96d\x03a\x96e\x03a\x96f\x03a"),
  6986 										_L("\x582\x77e\x583\x77e\x584\x77e\x585\x77e\x586\x77e\x587\x77e\x588\x77e\x589\x77e\x58a\x77e\x58b\x77e"));
  6987 	//INFO_PRINTF1(_L("// string of only punctuation"));
  6988 	TestGlyphs(aFont,param,_L("\x002D\x002D\x002D\x002D\x002D\x002D"),_L("\x002D\x002D\x002D\x002D\x002D\x002D"));
  6989 	//INFO_PRINTF1(_L("// one Kannada character followed my multiple punctuation and non-punctuaion"));
  6990 	TestGlyphs(aFont,param,_L("\x0C95!\x0022\x00A3$%^&*()-={}[]:@~;'#<>?,./"),
  6991 										_L("\x07A8\x0920\x0022\x00A3\x0024\x0923\x005E\x0009\x0927\x0028\x0029\x092A\x003D\x007B\x007D\x005B\x005D\x0937\x0023\x007E\x0938\x0027\x0922\x003C\x003E\x093C\x0929\x092B\x092C"));
  6992 	}
  6993 	
  6994 
  6995 
  6996 void CTGlyphSelection::TestIndicCharsL()
  6997 	{
  6998 	// create a font store for testing
  6999 	CFontStore* fontStore = CFontStore::NewL(&User::Heap());
  7000 	
  7001 	//load all ecom implemented rasterizer dlls. installs the rasterizer.	
  7002 	LoadOpenFontLibraries(fontStore);
  7003 		// test font preparation
  7004 	fontStore->iKPixelWidthInTwips = 11860; //This value is default
  7005 
  7006 	//add any required font files
  7007 	TUid err = fontStore->AddFileL(KTestHindiFontFile);
  7008 
  7009 	TFontSpec testHindiFontSpec(KTestHindiFontFaceName,200); 
  7010 	
  7011 	TUid err1 = fontStore->AddFileL(KTestIndicFontFile);
  7012 
  7013 	TFontSpec testIndicFontSpec(KTestIndicFontFaceName,200);
  7014 	 
  7015 	CFbsBitmap* bmp = new(ELeave) CFbsBitmap;
  7016 	
  7017 	TInt ret = bmp->Create(TSize(100,100),EGray2);
  7018 	if (ret == KErrNotSupported)
  7019 		return;
  7020 	else
  7021 		User::LeaveIfError(ret);
  7022 
  7023 	CFbsBitmapDevice* device = NULL;
  7024 	TRAPD(err2,device = CFbsBitmapDevice::NewL(bmp));
  7025 	TEST(err2 == KErrNone);
  7026 
  7027 	CFbsBitGc* gc = NULL;
  7028 	User::LeaveIfError(device->CreateContext(gc));
  7029 	// Font file Creation
  7030 	CFbsFont* hindiFont = NULL;
  7031 	User::LeaveIfError(device->GetNearestFontToDesignHeightInTwips(hindiFont,testHindiFontSpec));
  7032 	gc->UseFont(hindiFont);
  7033 	CleanupStack::PushL(hindiFont);
  7034 	
  7035 	//Testcode for Hindi language
  7036 	((CTGlyphSelectionStep*)iStep)->RecordTestResultL();
  7037 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-1580"));
  7038 	TestHindiChars(hindiFont);
  7039 	((CTGlyphSelectionStep*)iStep)->RecordTestResultL();
  7040 	
  7041 	CleanupStack::Pop(hindiFont);
  7042 	
  7043 	// Font file Creation
  7044 	CFbsFont* indicFont = NULL;
  7045 	User::LeaveIfError(device->GetNearestFontToDesignHeightInTwips(indicFont,testIndicFontSpec));
  7046 	gc->UseFont(indicFont);
  7047 	CleanupStack::PushL(indicFont);
  7048 	
  7049 	//Testcode for Kannada, Marathi,Gujarati,Bengali language
  7050 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-3381"));
  7051 	TestKannadaChars(indicFont);
  7052 	((CTGlyphSelectionStep*)iStep)->RecordTestResultL();
  7053 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-3360"));
  7054 	TestMarathiChars(indicFont);
  7055 	((CTGlyphSelectionStep*)iStep)->RecordTestResultL();
  7056 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-3417"));
  7057 	TestGujaratiChars(indicFont);
  7058 	TestBengaliChars(indicFont);
  7059 	TestTamilChars(indicFont);
  7060 	TestTeluguChars(indicFont);
  7061 	TestIndicPunctuation(indicFont);
  7062 	CleanupStack::Pop(indicFont);
  7063 			
  7064 	//Cleaning the memory
  7065 	delete bmp;
  7066 	delete device;
  7067 	delete gc;
  7068 	fontStore->RemoveFile(err);
  7069 	fontStore->RemoveFile(err1);
  7070 	delete fontStore;
  7071 	REComSession::FinalClose();
  7072 	}
  7073 
  7074 	
  7075 /**
  7076 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CT-0221
  7077 @SYMTestCaseDesc Test support for Vietnamese characters.
  7078 @SYMTestPriority High
  7079 @SYMTestActions  Attempt to compose various valid and invalid Vietnamese glyph clusters.
  7080 @SYMTestExpectedResults The test must not fail.
  7081 @SYMPREQ 402: GDI for Bravo.
  7082 */
  7083 void CTGlyphSelection::TestVietnameseChars()
  7084 	{
  7085 /**
  7086  This method is a test case to test GetCharacterPosition() correctly
  7087  processes Vietnamese characters.
  7088 */
  7089 	TBool r;
  7090 	TBuf<41> testText(0);
  7091 	CFont::TPositionParam param;
  7092 	param.iDirection = CFont::EHorizontal;
  7093 	param.iFlags = CFont::TPositionParam::EFLogicalOrder;
  7094 
  7095 	testText.SetLength(41);
  7096 	
  7097 	testText[0] = 0x0055; // capital U
  7098 	testText[1] = 0x031B; // combining horn - expect 0x01AF (succeed)
  7099 
  7100 	testText[2] = 0x0055; // capital U
  7101 	testText[3] = 0x0027; // apostrophe - expect 0x0055 (fail)
  7102 
  7103 	testText[4] = 0x0055; // capital U
  7104 	testText[5] = 0x02B9; // modifier prime - expect 0x0055 (fail)
  7105 
  7106 	testText[6] = 0x0055; // capital U
  7107 	testText[7] = 0x02BC; // modifier apostrophe - expect 0x0055 (fail)
  7108 
  7109 	testText[8] = 0x0055; // capital U
  7110 	testText[9] = 0x0315; // combining comma above right - expect 0x0055, 0x0315 (fail)
  7111 
  7112 	testText[10] = 0x0055; // capital U
  7113 	testText[11] = 0x2019; // right single quote mark - expect 0x0055 (fail)
  7114 
  7115 	testText[12] = 0x01AF; // capital U with horn
  7116 	testText[13] = 0x0020; // space - expect 0x01AF (succeed)
  7117 
  7118 	testText[14] = 0x0045; // capital E
  7119 	testText[15] = 0x031B; // combining horn - expect 0x0045, 0x031B (fail)
  7120 
  7121 	testText[16] = 0x0041; // capital A
  7122 	testText[17] = 0x0306; // combining breve
  7123 	testText[18] = 0x0301; // combining acute - expect 0x1EAE (succeed)
  7124 
  7125 	testText[19] = 0x0102; // capital A with breve
  7126 	testText[20] = 0x0301; // combining acute - expect 0x1EAE (succeed)
  7127 
  7128 	testText[21] = 0x0041; // capital A
  7129 	testText[22] = 0x0301; // combining acute
  7130 	testText[23] = 0x0306; // combining breve - expect 0x0041, 0x0301, 0x0306 (fail)
  7131 
  7132 	testText[24] = 0x0041; // capital A
  7133 	testText[25] = 0x0323; // combining dot below
  7134 	testText[26] = 0x0306; // combining breve - expect 0x1EB6 (succeed)
  7135 
  7136 	testText[27] = 0x1EA0; // capital A with dot below
  7137 	testText[28] = 0x0306; // combining breve - expect 0x1EB6 (succeed)
  7138 
  7139 	testText[29] = 0x0102; // capital A with breve
  7140 	testText[30] = 0x0323; // combining dot below - expect 0x0102, 0x0323 (fail)
  7141 
  7142 	testText[31] = 0x0045; // capital A
  7143 	testText[32] = 0x0302; // combining circumflex
  7144 	testText[33] = 0x0301; // combining acute - expect 0x1EBE (succeed)
  7145 
  7146 	testText[34] = 0x00CA; // capital A with circumflex
  7147 	testText[35] = 0x0301; // combining acute - expect 0x1EBE (succeed)
  7148 
  7149 	testText[36] = 0x004F; // capital O
  7150 	testText[37] = 0x031B; // combining horn
  7151 	testText[38] = 0x0309; // combining hook above - expect 0x1EDE (succeed)
  7152 
  7153 	testText[39] = 0x01A0; // capital O with horn
  7154 	testText[40] = 0x0309; // combining hook above - expect 0x1EDE (succeed)
  7155 
  7156 	param.iText.Set(testText);
  7157 
  7158 	// 1: Capital U with combining horn
  7159 	param.iPosInText = 0;
  7160 	param.iPen.iX = param.iPen.iY = 0;
  7161 	r = iTestFont->GetCharacterPosition(param);
  7162 	TEST(r && param.iPosInText == 2 
  7163 		   && param.iPen.iX == 10
  7164 		   && param.iOutputGlyphs == 1
  7165 		   && param.iOutput[0].iCode == 0x01AF);
  7166 
  7167 	// 2: Capital U with apostrophe
  7168 	param.iPosInText = 2;
  7169 	param.iPen.iX = param.iPen.iY = 0;
  7170 	r = iTestFont->GetCharacterPosition(param);
  7171 	TEST(r && param.iPosInText == 3 
  7172 		   && param.iPen.iX == 10
  7173 		   && param.iOutputGlyphs == 1
  7174 		   && param.iOutput[0].iCode == 0x0055);
  7175 
  7176 	// 3: Capital U with modifier prime
  7177 	param.iPosInText = 4;
  7178 	param.iPen.iX = param.iPen.iY = 0;
  7179 	r = iTestFont->GetCharacterPosition(param);
  7180 	TEST(r && param.iPosInText == 5 
  7181 		   && param.iPen.iX == 10
  7182 		   && param.iOutputGlyphs == 1
  7183 		   && param.iOutput[0].iCode == 0x0055);
  7184 
  7185 	// 4: Capital U with modifier apostrophe
  7186 	param.iPosInText = 6;
  7187 	param.iPen.iX = param.iPen.iY = 0;
  7188 	r = iTestFont->GetCharacterPosition(param);
  7189 	TEST(r && param.iPosInText == 7 
  7190 		   && param.iPen.iX == 10
  7191 		   && param.iOutputGlyphs == 1
  7192 		   && param.iOutput[0].iCode == 0x0055);
  7193 
  7194 	// 5: Capital U with combining comma above right
  7195 	param.iPosInText = 8;
  7196 	param.iPen.iX = param.iPen.iY = 0;
  7197 	r = iTestFont->GetCharacterPosition(param);
  7198 	TEST(r && param.iPosInText == 10 
  7199 		   && param.iPen.iX == 10
  7200 		   && param.iOutputGlyphs == 2
  7201 		   && param.iOutput[0].iCode == 0x0055
  7202 		   && param.iOutput[1].iCode == 0x0315);
  7203 
  7204 	// 6: Capital U with right single quote
  7205 	param.iPosInText = 10;
  7206 	param.iPen.iX = param.iPen.iY = 0;
  7207 	r = iTestFont->GetCharacterPosition(param);
  7208 	TEST(r && param.iPosInText == 11 
  7209 		   && param.iPen.iX == 10
  7210 		   && param.iOutputGlyphs == 1
  7211 		   && param.iOutput[0].iCode == 0x0055);
  7212 
  7213 	// 7: Capital U with horn plus space
  7214 	param.iPosInText = 12;
  7215 	param.iPen.iX = param.iPen.iY = 0;
  7216 	r = iTestFont->GetCharacterPosition(param);
  7217 	TEST(r && param.iPosInText == 13 
  7218 		   && param.iPen.iX == 10
  7219 		   && param.iOutputGlyphs == 1
  7220 		   && param.iOutput[0].iCode == 0x01AF);
  7221 
  7222 	// 8: Capital E with combining horn
  7223 	param.iPosInText = 14;
  7224 	param.iPen.iX = param.iPen.iY = 0;
  7225 	r = iTestFont->GetCharacterPosition(param);
  7226 	TEST(r && param.iPosInText == 16 
  7227 		   && param.iPen.iX == 10
  7228 		   && param.iOutputGlyphs == 2
  7229 		   && param.iOutput[0].iCode == 0x0045
  7230 		   && param.iOutput[1].iCode == 0x031B);
  7231 
  7232 	// 9: Capital A with combining breve with combining acute
  7233 	param.iPosInText = 16;
  7234 	param.iPen.iX = param.iPen.iY = 0;
  7235 	r = iTestFont->GetCharacterPosition(param);
  7236 	TEST(r && param.iPosInText == 19 
  7237 		   && param.iPen.iX == 10
  7238 		   && param.iOutputGlyphs == 1
  7239 		   && param.iOutput[0].iCode == 0x1EAE);
  7240 
  7241 	// 10: Capital A with breve with combining acute
  7242 	param.iPosInText = 19;
  7243 	param.iPen.iX = param.iPen.iY = 0;
  7244 	r = iTestFont->GetCharacterPosition(param);
  7245 	TEST(r && param.iPosInText == 21 
  7246 		   && param.iPen.iX == 10
  7247 		   && param.iOutputGlyphs == 1
  7248 		   && param.iOutput[0].iCode == 0x1EAE);
  7249 
  7250 	// 11: Capital A with combining acute with combining breve
  7251 	param.iPosInText = 21;
  7252 	param.iPen.iX = param.iPen.iY = 0;
  7253 	r = iTestFont->GetCharacterPosition(param);
  7254 	TEST(r && param.iPosInText == 24 
  7255 		   && param.iPen.iX == 10
  7256 		   && param.iOutputGlyphs == 3
  7257 		   && param.iOutput[0].iCode == 0x0041
  7258 		   && param.iOutput[1].iCode == 0x0301
  7259 		   && param.iOutput[2].iCode == 0x0306);
  7260 
  7261 	// 12: Capital A with combining dot below with combining breve
  7262 	param.iPosInText = 24;
  7263 	param.iPen.iX = param.iPen.iY = 0;
  7264 	r = iTestFont->GetCharacterPosition(param);
  7265 	TEST(r && param.iPosInText == 27 
  7266 		   && param.iPen.iX == 10
  7267 		   && param.iOutputGlyphs == 1
  7268 		   && param.iOutput[0].iCode == 0x1EB6);
  7269 
  7270 	// 13: Capital A with dot below with combining breve
  7271 	param.iPosInText = 27;
  7272 	param.iPen.iX = param.iPen.iY = 0;
  7273 	r = iTestFont->GetCharacterPosition(param);
  7274 	TEST(r && param.iPosInText == 29 
  7275 		   && param.iPen.iX == 10
  7276 		   && param.iOutputGlyphs == 1
  7277 		   && param.iOutput[0].iCode == 0x1EB6);
  7278 
  7279 	// 14: Capital A with breve with combining dot below
  7280 	param.iPosInText = 29;
  7281 	param.iPen.iX = param.iPen.iY = 0;
  7282 	r = iTestFont->GetCharacterPosition(param);
  7283 	TEST(r && param.iPosInText == 31 
  7284 		   && param.iPen.iX == 10
  7285 		   && param.iOutputGlyphs == 2
  7286 		   && param.iOutput[0].iCode == 0x0102
  7287 		   && param.iOutput[1].iCode == 0x0323);
  7288 
  7289 	// 15: Capital A with combining circumflex with combining acute
  7290 	param.iPosInText = 31;
  7291 	param.iPen.iX = param.iPen.iY = 0;
  7292 	r = iTestFont->GetCharacterPosition(param);
  7293 	TEST(r && param.iPosInText == 34 
  7294 		   && param.iPen.iX == 10
  7295 		   && param.iOutputGlyphs == 1
  7296 		   && param.iOutput[0].iCode == 0x1EBE);
  7297 
  7298 	// 16: Capital A with circumflex with combining acute
  7299 	param.iPosInText = 34;
  7300 	param.iPen.iX = param.iPen.iY = 0;
  7301 	r = iTestFont->GetCharacterPosition(param);
  7302 	TEST(r && param.iPosInText == 36 
  7303 		   && param.iPen.iX == 10
  7304 		   && param.iOutputGlyphs == 1
  7305 		   && param.iOutput[0].iCode == 0x1EBE);
  7306 
  7307 	// 17: Capital O with combining horn with combing hook above
  7308 	param.iPosInText = 36;
  7309 	param.iPen.iX = param.iPen.iY = 0;
  7310 	r = iTestFont->GetCharacterPosition(param);
  7311 	TEST(r && param.iPosInText == 39 
  7312 		   && param.iPen.iX == 10
  7313 		   && param.iOutputGlyphs == 1
  7314 		   && param.iOutput[0].iCode == 0x1EDE);
  7315 
  7316 	// 18: Capital O with horn with combing hook above
  7317 	param.iPosInText = 39;
  7318 	param.iPen.iX = param.iPen.iY = 0;
  7319 	r = iTestFont->GetCharacterPosition(param);
  7320 	TEST(r && param.iPosInText == 41 
  7321 		   && param.iPen.iX == 10
  7322 		   && param.iOutputGlyphs == 1
  7323 		   && param.iOutput[0].iCode == 0x1EDE);
  7324 	}
  7325 
  7326 
  7327 void CTGlyphSelection::TestNonBmpCharsL()
  7328 	{
  7329 	// create a font store for testing
  7330 	CFontStore* fontStore = CFontStore::NewL(&User::Heap());
  7331 	
  7332 	//load all ecom implemented rasterizer dlls. installs the rasterizer.	
  7333 	LoadOpenFontLibraries(fontStore);
  7334 		// test font preparation
  7335 	fontStore->iKPixelWidthInTwips = 11860; //This value is default
  7336 
  7337 	//add any required font files
  7338 	TUid err = fontStore->AddFileL(KTestGB18030FontFile);
  7339 
  7340 	TFontSpec testGB18030FontSpec(KTestGB18030FontFaceName,200); 
  7341 	 
  7342 	CFbsBitmap* bmp = new(ELeave) CFbsBitmap;
  7343 	
  7344 	TInt ret = bmp->Create(TSize(100,100),EGray2);
  7345 	if (ret == KErrNotSupported)
  7346 		return;
  7347 	else
  7348 		User::LeaveIfError(ret);
  7349 
  7350 	CFbsBitmapDevice* device = NULL;
  7351 	TRAPD(err2,device = CFbsBitmapDevice::NewL(bmp));
  7352 	TEST(err2 == KErrNone);
  7353 
  7354 	CFbsBitGc* gc = NULL;
  7355 	User::LeaveIfError(device->CreateContext(gc));
  7356 	// Font file Creation
  7357 	CFbsFont* gb18030Font = NULL;
  7358 	User::LeaveIfError(device->GetNearestFontToDesignHeightInTwips(gb18030Font,testGB18030FontSpec));
  7359 	gc->UseFont(gb18030Font);
  7360 	CleanupStack::PushL(gb18030Font);
  7361 	
  7362 	//Testcode for GB18030
  7363 	((CTGlyphSelectionStep*)iStep)->RecordTestResultL();
  7364 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("TI18N-GDI-CIT-4077"));
  7365 	TestNonBmpCharsInGB18030(gb18030Font);
  7366 	((CTGlyphSelectionStep*)iStep)->RecordTestResultL();
  7367 	
  7368 	CleanupStack::Pop(gb18030Font);
  7369 	
  7370 	//Cleaning the memory
  7371 	delete bmp;
  7372 	delete device;
  7373 	delete gc;
  7374 	fontStore->RemoveFile(err);
  7375 	delete fontStore;
  7376 	REComSession::FinalClose();
  7377 	}
  7378 
  7379 
  7380 void CTGlyphSelection::TestTextDirection()
  7381 /**
  7382  This method is a test case to test GetCharacterPosition() correctly
  7383  produces glyph bounding boxes and utilizes various pen offsets in
  7384  a horizontal and vertical context.
  7385 */
  7386 	{
  7387 	TBool r;
  7388 	TBuf<20> testText(0);
  7389 	CFont::TPositionParam param;
  7390 	param.iFlags = CFont::TPositionParam::EFLogicalOrder;
  7391 
  7392 	testText.SetLength(5);
  7393 	testText[0] = 'a';
  7394 	testText[1] = 'B';
  7395 	testText[2] = 'c';
  7396 	testText[3] = ' ';
  7397 	testText[4] = '1';
  7398 	param.iText.Set(testText);
  7399 
  7400 	// 1: Test horizontal text pen advancement & bounds
  7401 	param.iDirection = CFont::EHorizontal;
  7402 	param.iPosInText = 0;
  7403 	param.iPen.iX = param.iPen.iY = 0;
  7404 	r = iTestFont->GetCharacterPosition(param);
  7405 	TEST(r && param.iPosInText == 1 
  7406 		   && param.iPen == TPoint(10,0)
  7407 		   && param.iOutputGlyphs == 1 
  7408 		   && param.iOutput[0].iCode == 'a'
  7409 		   && param.iOutput[0].iBounds.iTl == TPoint(0,-10)
  7410 		   && param.iOutput[0].iBounds.iBr == TPoint(10,2));
  7411 		   // add check for bounds
  7412 
  7413 	// 2: Test horizontal text pen advancement with +ve pen offset
  7414 	param.iPosInText = 4;
  7415 	param.iPen.iX = 20;
  7416 	param.iPen.iY = 12;
  7417 	r = iTestFont->GetCharacterPosition(param);
  7418 	TEST(r && param.iPosInText == 5 
  7419 		   && param.iPen == TPoint(30,12)
  7420 		   && param.iOutputGlyphs == 1 
  7421 		   && param.iOutput[0].iCode == '1'
  7422 		   && param.iOutput[0].iBounds.iTl == TPoint(20,2)
  7423 		   && param.iOutput[0].iBounds.iBr == TPoint(30,14));
  7424 
  7425 	// 3: Test horizontal text pen advancement with -ve pen offset
  7426 	param.iPosInText = 4;
  7427 	param.iPen.iX = -10;
  7428 	param.iPen.iY = -24;
  7429 	r = iTestFont->GetCharacterPosition(param);
  7430 	TEST(r && param.iPosInText == 5 
  7431 		   && param.iPen == TPoint(0,-24)
  7432 		   && param.iOutputGlyphs == 1 
  7433 		   && param.iOutput[0].iCode == '1'
  7434 		   && param.iOutput[0].iBounds.iTl == TPoint(-10,-34)
  7435 		   && param.iOutput[0].iBounds.iBr == TPoint(0,-22));
  7436 
  7437 	// 4: Test vertical text pen advancement & bounds
  7438 	param.iDirection = CFont::EVertical;
  7439 	param.iPosInText = 1;
  7440 	param.iPen.iX = param.iPen.iY = 0;
  7441 	r = iTestFont->GetCharacterPosition(param);
  7442 	TEST(r && param.iPosInText == 2 
  7443 		   && param.iPen == TPoint(0,12)
  7444 		   && param.iOutputGlyphs == 1 
  7445 		   && param.iOutput[0].iCode == 'B'
  7446 		   && param.iOutput[0].iBounds.iTl == TPoint(0,0)
  7447 		   && param.iOutput[0].iBounds.iBr == TPoint(10,12));
  7448 
  7449 	// 5: Test vertical text pen advancement with +ve pen offset
  7450 	param.iPosInText = 4;
  7451 	param.iPen.iX = 20;
  7452 	param.iPen.iY = 12;
  7453 	r = iTestFont->GetCharacterPosition(param);
  7454 	TEST(r && param.iPosInText == 5 
  7455 		   && param.iPen == TPoint(20,24)
  7456 		   && param.iOutputGlyphs == 1 
  7457 		   && param.iOutput[0].iCode == '1'
  7458 		   && param.iOutput[0].iBounds.iTl == TPoint(20,12)
  7459 		   && param.iOutput[0].iBounds.iBr == TPoint(30,24));
  7460 
  7461 	// 6: Test vertical text pen advancement with -ve pen offset
  7462 	param.iPosInText = 4;
  7463 	param.iPen.iX = -10;
  7464 	param.iPen.iY = -24;
  7465 	r = iTestFont->GetCharacterPosition(param);
  7466 	TEST(r && param.iPosInText == 5 
  7467 		   && param.iPen == TPoint(-10,-12)
  7468 		   && param.iOutputGlyphs == 1 
  7469 		   && param.iOutput[0].iCode == '1'
  7470 		   && param.iOutput[0].iBounds.iTl == TPoint(-10,-24)
  7471 		   && param.iOutput[0].iBounds.iBr == TPoint(0,-12));
  7472 	}
  7473 
  7474 void CTGlyphSelection::TestAllUnicodeChars()
  7475 /**
  7476  This method is a test case to test GetCharacterPosition() correctly
  7477  processes all the characters in the Unicode code space 0x0000 to 
  7478  0xffff.
  7479 */
  7480 	{
  7481 	TBool r;
  7482 	TBuf<8> testText(0);
  7483 	CFont::TPositionParam param;
  7484 	param.iFlags = CFont::TPositionParam::EFLogicalOrder;
  7485 
  7486 	TInt errors = 0;
  7487 	testText.SetLength(1);
  7488 	for (TUint i = 0xd802; i <= 0xffff; i++)
  7489 		{
  7490 		testText[0] = (TText16) i;
  7491 		if (i==0x1b) continue; // Skip as CTestFont designed to fail here r==0.
  7492 		param.iText.Set(testText);
  7493 		param.iDirection = CFont::EHorizontal;
  7494 		param.iPosInText = 0;
  7495 		param.iPen.iX = param.iPen.iY = 0;
  7496 		r = iTestFont->GetCharacterPosition(param);
  7497 		if (!r || param.iPosInText != 1)
  7498 			{
  7499 			errors++;
  7500 			//RDebug::Print(_L("%04x(%d,%d,%d), "), i, r, param.iPosInText, param.iOutputGlyphs );
  7501 			//if (errors%8 == 0)
  7502 			//	RDebug::Print(_L("\n"));
  7503 			}
  7504 		}
  7505 
  7506 	TEST (errors == 0);
  7507 	}
  7508 
  7509 /** Tests that ligatures (presently just Lam-Alef in Arabic) work correctly
  7510 when diacritics are required on one, both or neither character comprising the
  7511 ligature. */
  7512 void CTGlyphSelection::TestLigaturesWithDiacritics()
  7513 	{
  7514 	// independent letters
  7515 	const TText KAlef = 0x627;
  7516 	const TText KLam = 0x644;
  7517 	const TText KBeh = 0x628;
  7518 	// dependent marks
  7519 	const TText KFatha = 0x64E;
  7520 	const TText KDamma = 0x64F;
  7521 	// ligature forms
  7522 	const TText KLamAlefIsolated = 0xFEFB;
  7523 	const TText KLamAlefFinal = 0xFEFC;
  7524 
  7525 	struct TTestCase
  7526 		{
  7527 		// Logical order input.
  7528 		TText iInputL[8];
  7529 		// Visual order input, should be equivalent to iInputL.
  7530 		TText iInputV[8];
  7531 		// Which cluster to test
  7532 		TInt iClusterUnderTestStartL;
  7533 		TInt iClusterUnderTestStartV;
  7534 		// Expected glyphs to appear (in any order, but...)
  7535 		TInt iGlyphs[8];
  7536 		// ...number of glyphs from the start of iGlyphs that
  7537 		// are in order of their expected x-coordinates (of their
  7538 		// centres)
  7539 		TInt iGlyphsInOrder;
  7540 		};
  7541 	const TTestCase KTestCases[] =
  7542 		{
  7543 		{{KLam, KAlef, 0}, {KAlef, KLam, 0},
  7544 			0, 0, {KLamAlefIsolated, 0}, 1},
  7545 		{{KBeh, KLam, KAlef, KBeh, 0}, {KBeh, KAlef, KLam, KBeh, 0},
  7546 			1, 1, {KLamAlefFinal, 0}, 1},
  7547 		{{KLam, KFatha, KAlef, 0}, {KAlef, KLam, KFatha, 0},
  7548 			0, 0, {KLamAlefIsolated, KFatha, 0}, 1},
  7549 		{{KBeh, KLam, KFatha, KAlef, KBeh, 0}, {KBeh, KAlef, KLam, KFatha, KBeh, 0},
  7550 			1, 1, {KLamAlefFinal, KFatha, 0}, 1},
  7551 		{{KLam, KAlef, KDamma, 0}, {KAlef, KDamma, KLam, 0},
  7552 			0, 0, {KLamAlefIsolated, KDamma, 0}, 1},
  7553 		{{KBeh, KLam, KAlef, KDamma, KBeh, 0}, {KBeh, KAlef, KDamma, KLam, KBeh, 0},
  7554 			1, 1, {KLamAlefFinal, KDamma, 0}, 1},
  7555 		{{KLam, KFatha, KAlef, KDamma, 0}, {KAlef, KDamma, KLam, KFatha, 0},
  7556 			0, 0, {KDamma, KFatha, KLamAlefIsolated, 0}, 2},
  7557 		{{KBeh, KLam, KFatha, KAlef, KDamma, KBeh, 0},
  7558 			{KBeh, KAlef, KDamma, KLam, KFatha, KBeh, 0},
  7559 			1, 1, {KDamma, KFatha, KLamAlefFinal, 0}, 2},
  7560 		};
  7561 	TBuf<8> input;
  7562 	CFont::TPositionParam param;
  7563 	for (TInt testCase = 0;
  7564 		testCase != sizeof(KTestCases)/sizeof(KTestCases[0]);
  7565 		++testCase)
  7566 		{
  7567 		const TTestCase& t = KTestCases[testCase];
  7568 		for (TInt logical = 0; logical != 2; ++logical)
  7569 			{
  7570 			const TText* in = logical?
  7571 				t.iInputL : t.iInputV;
  7572 			input.Zero();
  7573 			while (*in)
  7574 				input.Append(*in++);
  7575 			param.iText.Set(input);
  7576 			param.iPosInText = logical?
  7577 				t.iClusterUnderTestStartL : t.iClusterUnderTestStartV;
  7578 			param.iFlags = static_cast<TUint16>(logical?
  7579 				CFont::TPositionParam::EFLogicalOrder : 0);
  7580 			param.iPen.SetXY(0, 0);
  7581 			TBool r = iTestFont->GetCharacterPosition(param);
  7582 			TEST(r);
  7583 			TInt currentX = KMinTInt;
  7584 			TInt expectedGlyphNo = 0;
  7585 			while (t.iGlyphs[expectedGlyphNo] != 0)
  7586 				{
  7587 				// FInd the expected glyph in the output.
  7588 				TInt outputGlyph = 0;
  7589 				while (outputGlyph != param.iOutputGlyphs
  7590 					&& static_cast<TInt>(param.iOutput[outputGlyph].iCode)
  7591 					!= t.iGlyphs[expectedGlyphNo])
  7592 					{
  7593 					++outputGlyph;
  7594 					}
  7595 				TEST(outputGlyph < param.iOutputGlyphs);
  7596 				TInt x = param.iOutput[outputGlyph].iBounds.Center().iX;
  7597 				TEST(t.iGlyphsInOrder <= expectedGlyphNo
  7598 					|| currentX < x);
  7599 				currentX = x;
  7600 				++expectedGlyphNo;
  7601 				}
  7602 			TEST(expectedGlyphNo == param.iOutputGlyphs);
  7603 			}
  7604 		}
  7605 	}
  7606 	
  7607  #if defined(__GCC32__)
  7608  typedef wchar_t __TText;
  7609  #elif defined(__VC32__)
  7610  typedef TUint16 __TText;
  7611  #elif defined(__CW32__)
  7612  typedef TUint16 __TText;
  7613  #elif !defined(__TText_defined)
  7614  #error  no typedef for __TText
  7615  #endif
  7616  const __TText* KLatinNoSideBearings = L"ABCDE";
  7617  const __TText* KLatinLeftSideBearing = L"WABCD";
  7618  const __TText* KLatinRightSideBearing = L"ABCDW";
  7619  const __TText* KLatinBothSideBearings = L"WABCW";
  7620  const __TText* KArabicAlefWaw = L"\x627\x648";
  7621  const __TText* KArabicWawAlef = L"\x648\x627";
  7622  const __TText* KGb18030NoSideBearings = L"\xD840\xDC00xyz\xD87E\xDE1D";
  7623  const __TText* KGb18030LeftSideBearings = L"W\xD840\xDC00xy\xD87E\xDE1D";
  7624  const __TText* KGb18030RightSideBearings = L"\xD840\xDC00xy\xD87E\xDE1DW";
  7625  const __TText* KGb18030BothSideBearings = L"W\xD840\xDC00x\xD87E\xDE1DW";
  7626  struct TMeasureTextTest
  7627  	{
  7628  	const __TText* iText;
  7629  	TInt iExpectedAdvanceLogical;
  7630  	TInt iExpectedAdvanceL2R;
  7631  	TInt iExpectedBoundsL2RLeft;
  7632  	TInt iExpectedBoundsL2RRight;
  7633  	TInt iExpectedBoundsL2RTop;
  7634  	TInt iExpectedBoundsL2RBottom;
  7635  	TInt iExpectedAdvanceR2L;
  7636  	TInt iExpectedBoundsR2LLeft;
  7637  	TInt iExpectedBoundsR2LRight;
  7638  	TInt iExpectedBoundsR2LTop;
  7639  	TInt iExpectedBoundsR2LBottom;
  7640  	};
  7641  const TMeasureTextTest KMeasureTextResults[] =
  7642  	{
  7643  	{KLatinNoSideBearings, 50, 50, 0, 50, -10, 2, 50, 0, 50, -10, 2},
  7644  	{KLatinLeftSideBearing, 50, 50, -1, 50, -10, 2, 50, 0, 51, -10, 2},
  7645  	{KLatinRightSideBearing, 50, 50, 0, 51, -10, 2, 50, -1, 50, -10, 2},
  7646  	{KLatinBothSideBearings, 50, 50, -1, 51, -10, 2, 50, -1, 51, -10, 2},
  7647  	{KArabicAlefWaw, 20, 20, 0, 20, -10, 2, 20, -5, 20, -10, 2},
  7648  	{KArabicWawAlef, 20, 20, -5, 20, -10, 2, 20, 0, 20, -10, 2},
  7649  	// ones containing surrogate pairs
  7650  	{KGb18030NoSideBearings, 50, 50, 0, 50, -10, 2, 50, 0, 50, -10, 2},
  7651  	{KGb18030LeftSideBearings, 50, 50, -1, 50, -10, 2, 50, 0, 51, -10, 2},
  7652  	{KGb18030RightSideBearings, 50, 50, 0, 51, -10, 2, 50, -1, 50, -10, 2},
  7653  	{KGb18030BothSideBearings, 50, 50, -1, 51, -10, 2, 50, -1, 51, -10, 2},
  7654  	};
  7655  /** Tests CFont::MeasureText */
  7656  void CTGlyphSelection::TestMeasureText()
  7657  	{
  7658  	CFont::TMeasureTextInput input;
  7659  	CFont::TMeasureTextOutput output;
  7660  	TInt advance;
  7661  	for (TInt i = 0;
  7662  		i != sizeof(KMeasureTextResults)/sizeof(KMeasureTextResults[0]); ++i)
  7663  		{
  7664  		TPtrC text(reinterpret_cast<const TText16*>(
  7665  			KMeasureTextResults[i].iText));
  7666  		advance = iTestFont->MeasureText(text, &input, &output);
  7667  		TEST(advance == KMeasureTextResults[i].iExpectedAdvanceLogical);
  7668  		input.iFlags = CFont::TMeasureTextInput::EFVisualOrder;
  7669  		advance = iTestFont->MeasureText(text, &input, &output);
  7670  		TEST(advance == KMeasureTextResults[i].iExpectedAdvanceL2R);
  7671  		TEST(output.iBounds.iTl.iX == KMeasureTextResults[i].iExpectedBoundsL2RLeft);
  7672  		TEST(output.iBounds.iBr.iX == KMeasureTextResults[i].iExpectedBoundsL2RRight);
  7673  		TEST(output.iBounds.iTl.iY == KMeasureTextResults[i].iExpectedBoundsL2RTop);
  7674  		TEST(output.iBounds.iBr.iY == KMeasureTextResults[i].iExpectedBoundsL2RBottom);
  7675  		input.iFlags = CFont::TMeasureTextInput::EFVisualOrderRightToLeft;
  7676  		advance = iTestFont->MeasureText(text, &input, &output);
  7677  		TEST(advance == KMeasureTextResults[i].iExpectedAdvanceR2L);
  7678  		TEST(output.iBounds.iTl.iX == KMeasureTextResults[i].iExpectedBoundsR2LLeft);
  7679  		TEST(output.iBounds.iBr.iX == KMeasureTextResults[i].iExpectedBoundsR2LRight);
  7680  		TEST(output.iBounds.iTl.iY == KMeasureTextResults[i].iExpectedBoundsR2LTop);
  7681  		TEST(output.iBounds.iBr.iY == KMeasureTextResults[i].iExpectedBoundsR2LBottom);
  7682  		}
  7683 
  7684 	INFO_PRINTF1(_L("Test fix for INC086257 - EFIncludePenPositionInBoundsCheck"));
  7685 	// left-to-right w/o flag and bounds set to just fit string disregarding sidebearings
  7686 	input.iFlags = 0;
  7687 	input.iMaxBounds = 50;
  7688 	iTestFont->MeasureText(_L("XXXXX"), &input, &output);
  7689 	TEST(output.iChars == 5);
  7690 	// set flag, string should no longer fit (break happens)
  7691 	input.iFlags = CFont::TMeasureTextInput::EFIncludePenPositionInBoundsCheck;
  7692 	iTestFont->MeasureText(_L("XXXXX"), &input, &output);
  7693 	TEST(output.iChars == 4);
  7694 	// right-to-left w/o flag and bounds set to just fit string disregarding sidebearings
  7695 	input.iFlags = CFont::TMeasureTextInput::EFVisualOrderRightToLeft;
  7696 	iTestFont->MeasureText(_L("\x5EA\x5EA\x5EA\x5EA\x5EA"), &input, &output);
  7697 	TEST(output.iChars == 5);
  7698 	// set flag, string should no longer fit (break happens)
  7699 	input.iFlags |= CFont::TMeasureTextInput::EFIncludePenPositionInBoundsCheck;
  7700 	iTestFont->MeasureText(_L("\x5EA\x5EA\x5EA\x5EA\x5EA"), &input, &output);
  7701 	TEST(output.iChars == 4);
  7702 	// top-to-bottom w/o flag and bounds set to just fit string disregarding endbearings
  7703 	input.iFlags = 0;
  7704 	input.iMaxBounds = 60;
  7705 	input.iDirection = CFont::EVertical;
  7706 	iTestFont->MeasureText(_L("\x304B\x304B\x304B\x304B\x304B"), &input, &output);
  7707 	TEST(output.iChars == 5);
  7708 	// set flag, string should no longer fit (break happens)
  7709 	input.iFlags = CFont::TMeasureTextInput::EFIncludePenPositionInBoundsCheck;
  7710 	iTestFont->MeasureText(_L("\x304B\x304B\x304B\x304B\x304B"), &input, &output);
  7711 	TEST(output.iChars == 4);
  7712  	}
  7713  
  7714 void CTGlyphSelection::RunTestCaseL(TInt aCurTestCase)
  7715 /**
  7716  This method will execute each test case method in the class
  7717  logging its progress as it does so.
  7718 */
  7719 	{
  7720 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(KUnknownSYMTestCaseIDName);
  7721 	switch(aCurTestCase)
  7722 		{
  7723 	case 1:
  7724 /**
  7725 @SYMTestCaseID 				GRAPHICS-SYSLIB-GDI-CIT-0200
  7726 */
  7727         ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-0200"));
  7728 		INFO_PRINTF1(_L("Test API Boundaries"));
  7729 		TestApiBoundaries();
  7730 		break;
  7731 	case 2:
  7732 /**
  7733 @SYMTestCaseID 				GRAPHICS-SYSLIB-GDI-CIT-0201
  7734 */
  7735 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-0201"));
  7736 		INFO_PRINTF1(_L("Test CTRL Chars"));
  7737 		TestCtrlCharsIgnored();
  7738 		break;
  7739 	case 3:
  7740 /**
  7741 @SYMTestCaseID 				GRAPHICS-SYSLIB-GDI-CIT-0202
  7742 */
  7743 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-0202"));
  7744 		INFO_PRINTF1(_L("Test Latin Chars"));
  7745 		TestLatinChars();
  7746 		break;
  7747 	case 4:
  7748 /**
  7749 @SYMTestCaseID 				GRAPHICS-SYSLIB-GDI-CIT-0203
  7750 */
  7751 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-0203"));
  7752 		INFO_PRINTF1(_L("Test Soft Hypen Char"));
  7753 		TestSoftHyphen();
  7754 		break;
  7755 	case 5:
  7756 /**
  7757 @SYMTestCaseID 				GRAPHICS-SYSLIB-GDI-CIT-0204
  7758 */
  7759 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-0204"));
  7760 		INFO_PRINTF1(_L("Test Surrogate Pairs"));
  7761 		TestSurrogates();
  7762 		INFO_PRINTF1(_L("Test Supplementary Chars"));
  7763 		TestNonBmpCharsL();
  7764 		break;
  7765 	case 6:
  7766 /**
  7767 @SYMTestCaseID 				GRAPHICS-SYSLIB-GDI-CIT-0205
  7768 */
  7769 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-0205"));
  7770 		INFO_PRINTF1(_L("Test Combining Latin Chars"));
  7771 		TestCombiningLatinChars();
  7772 		break;
  7773 	case 7:
  7774 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-0221"));
  7775 		INFO_PRINTF1(_L("Test Vietnamese Chars"));
  7776 		TestVietnameseChars();
  7777 		break;
  7778 	case 8:
  7779 /**
  7780 @SYMTestCaseID 				GRAPHICS-SYSLIB-GDI-CIT-0206
  7781 */
  7782 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-0206"));
  7783    		INFO_PRINTF1(_L("Test Vertical/Horizontal Text Bounds"));
  7784    		TestTextDirection();
  7785    		break;
  7786  	case 9:
  7787 /**
  7788 @SYMTestCaseID 				GRAPHICS-SYSLIB-GDI-CIT-0207
  7789 */
  7790 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-0207"));
  7791    		INFO_PRINTF1(_L("Test All Unicode Characters"));
  7792    		TestAllUnicodeChars();
  7793    		break;
  7794  	case 10:
  7795 /**
  7796 @SYMTestCaseID 				GRAPHICS-SYSLIB-GDI-CIT-0208
  7797 */
  7798 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-0208"));
  7799    		INFO_PRINTF1(_L("Test Ligatures with Diacritics"));
  7800    		TestLigaturesWithDiacritics();
  7801    		break;
  7802  	case 11:
  7803 /**
  7804 @SYMTestCaseID 				GRAPHICS-SYSLIB-GDI-CIT-0209
  7805 */
  7806 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-0209"));
  7807  		INFO_PRINTF1(_L("Test CFont::MeasureText()"));
  7808  		TestMeasureText();
  7809  		break;
  7810   	case 12:
  7811 /**
  7812 @SYMTestCaseID 				GRAPHICS-SYSLIB-GDI-CIT-0210
  7813 */
  7814 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-0210"));
  7815   		INFO_PRINTF1(_L("Test Indic Glyphs"));
  7816   		TestIndicCharsL();	
  7817 		break;
  7818    	case 13:
  7819 /**
  7820 @SYMTestCaseID 				GRAPHICS-SYSLIB-GDI-CIT-0211
  7821 */
  7822 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-0211"));
  7823   		INFO_PRINTF1(_L("Test Thai Rendering"));
  7824    		ExecuteThaiTests();	
  7825    		break;
  7826    	case 14:
  7827 /**
  7828 @SYMTestCaseID 				GRAPHICS-SYSLIB-GDI-CIT-0212
  7829 */
  7830 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-0212"));
  7831 		INFO_PRINTF1(_L("Test isolated Combining Latin Chars"));
  7832 		TestIsolatedCombiningLatinChars();
  7833 		break;
  7834    	case 15:
  7835 /**
  7836 @SYMTestCaseID 				GRAPHICS-SYSLIB-GDI-CIT-0213
  7837 */
  7838    		INFO_PRINTF1(_L("Test Indic Gurmukhi and Malayalam Chars"));
  7839 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-0213"));
  7840    		ExecuteIndicGurmukhiMalayalamTests();
  7841    		break;
  7842    	case 16:
  7843 /**
  7844 @SYMTestCaseID 				GRAPHICS-SYSLIB-GDI-CIT-0214
  7845 */
  7846    		INFO_PRINTF1(_L("Test Rendering Context"));
  7847 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-0214"));
  7848    		TestContextInShapeInfo();
  7849    		break;
  7850    	case 17:
  7851    		TestComplete();
  7852 		((CTGlyphSelectionStep*)iStep)->SetTestStepID(KNotATestSYMTestCaseIDName);
  7853 		((CTGlyphSelectionStep*)iStep)->CloseTMSGraphicsStep();
  7854    		break;	
  7855    		}
  7856 	((CTGlyphSelectionStep*)iStep)->RecordTestResultL();
  7857 	}
  7858 
  7859 void CTGlyphSelection::TestPerformance()
  7860 /**
  7861  This method tests the performance of the API under test
  7862  by executing a 10000 cycles of each test case.
  7863 **/
  7864 	{
  7865 	TStopWatch profile;
  7866 	INFO_PRINTF1(_L("Test Performance..."));
  7867 
  7868 	profile.Start();
  7869 	for (TInt i = 0; i < 10000; i++)
  7870 		{
  7871 		TestCtrlCharsIgnored();
  7872 		TestLatinChars();
  7873 		TestSoftHyphen();
  7874 		TestSurrogates();
  7875 		TestCombiningLatinChars();
  7876 		TestTextDirection();
  7877 		
  7878 		}
  7879 	TUint numMilliSecs = profile.Stop();
  7880 
  7881 	INFO_PRINTF3(_L("Performance test end %d.%d s\n"),numMilliSecs/1000,numMilliSecs%1000);
  7882 	}
  7883 
  7884 
  7885 void CTGlyphSelection::TestThai_SimpleChars()
  7886 /**
  7887  This routine tests individual Thai base characters pumping them 
  7888  through the CFont::GetCharacterPosition() API.
  7889 */
  7890 	{
  7891 	TBool r;
  7892 	CFont::TPositionParam param;
  7893 	param.iDirection = CFont::EHorizontal;
  7894 	param.iFlags = CFont::TPositionParam::EFLogicalOrder;
  7895 	TBuf<5> testText(0);
  7896 	testText.SetLength(1);
  7897 	param.iText.Set(testText);
  7898 
  7899 	for (TUint i=0; Thai_SimpleChars[i] != 0xFFFF; i++)
  7900 		{
  7901 		testText[0] = Thai_SimpleChars[i];
  7902 		param.iPosInText = 0;
  7903 		param.iPen.iX = param.iPen.iY = 0;
  7904 
  7905 		r = iTestFont->GetCharacterPosition(param);
  7906 
  7907 		TEST(r && param.iPosInText == 1 
  7908 			   && param.iPen.iX == 10
  7909 			   && param.iOutputGlyphs == 1 
  7910 			   && param.iOutput[0].iCode == Thai_SimpleChars[i]);
  7911 		}
  7912 	}
  7913 
  7914 
  7915 void CTGlyphSelection::TestThai_ValidGlyphClusters()
  7916 /**
  7917  This routine tests combining sequences of Thai base & mark 
  7918  characters pumping them through the CFont::GetCharacterPosition() API.
  7919  The sequences mainly test the correct formation of Thay Glyph clusters
  7920  and the PUA substutions that take place.
  7921 */
  7922 	{
  7923 	TInt failures=0;
  7924 	TBool r;
  7925 	CFont::TPositionParam param;
  7926 	param.iDirection = CFont::EHorizontal;
  7927 	param.iFlags = CFont::TPositionParam::EFLogicalOrder;
  7928 
  7929 	for (TUint i=0; Thai_ValidGlyphClusters[i].iTextLen != -1; i++)
  7930 		{
  7931 		TBuf<8> testText(Thai_ValidGlyphClusters[i].iText);
  7932 		param.iText.Set(testText);
  7933 		param.iPosInText = Thai_ValidGlyphClusters[i].iPosInText;
  7934 		param.iPen.iX = param.iPen.iY = 0;
  7935 
  7936 		r = iTestFont->GetCharacterPosition(param);
  7937 
  7938 		if (r && param.iPosInText == Thai_ValidGlyphClusters[i].oPosInText
  7939 			   && param.iOutputGlyphs == Thai_ValidGlyphClusters[i].oOutputLen)
  7940 			{
  7941 			for (TInt j=0; j<Thai_ValidGlyphClusters[i].oOutputLen; j++)
  7942 				{
  7943 				if (param.iOutput[j].iCode != Thai_ValidGlyphClusters[i].oOutput[j])
  7944 					{
  7945 					INFO_PRINTF4(_L("FAILURE: Glyph code invariance, Complex TEST(%d), %x != %x\n"), i, param.iOutput[j].iCode, Thai_ValidGlyphClusters[i].oOutput[j]);
  7946 					failures++;
  7947 					break;
  7948 					}
  7949 				}
  7950 			}
  7951 		else
  7952 			{
  7953 			INFO_PRINTF2(_L("FAILURE: Bad output result from GetCharacterPosition, Complex TEST(%d)\n"), i);
  7954 			failures++;
  7955 			}
  7956 		}
  7957 
  7958 	TEST(failures == 0);
  7959 	}
  7960 
  7961 
  7962 void CTGlyphSelection::TestThai_InvalidGlyphClusters()
  7963 /**
  7964  This routine tests Thai base & mark cluster boundaries to ensure where 
  7965  requried the KUnicodeDottedCircle char is used when an invalid sequence is 
  7966  processed. Test data from the global Thai_GlyphClusterBoundaries 
  7967  variable is pumped through the CFont::GetCharacterPosition() API.
  7968 */
  7969 	{
  7970 	TInt failures=0;
  7971 	TBool r;
  7972 	CFont::TPositionParam param;
  7973 	param.iDirection = CFont::EHorizontal;
  7974 	param.iFlags = CFont::TPositionParam::EFLogicalOrder;
  7975 
  7976 	for (TUint i=0; Thai_GlyphClusterBoundaries[i].iTextLen != -1; i++)
  7977 		{
  7978 		TBuf<8> testText(Thai_GlyphClusterBoundaries[i].iText);
  7979 		param.iText.Set(testText);
  7980 
  7981 		for (TUint k=0; k<2; k++)
  7982 			{
  7983 			if (Thai_GlyphClusterBoundaries[i].oOut[k].iPosInText == -1)
  7984 				continue;
  7985 
  7986 			param.iPosInText = Thai_GlyphClusterBoundaries[i].oOut[k].iPosInText;
  7987 			param.iPen.iX = param.iPen.iY = 0;
  7988 
  7989 			r = iTestFont->GetCharacterPosition(param);
  7990 
  7991 			if (r && param.iPosInText == Thai_GlyphClusterBoundaries[i].oOut[k].oPosInText
  7992 				   && param.iOutputGlyphs == Thai_GlyphClusterBoundaries[i].oOut[k].oOutputLen)
  7993 				{
  7994 				for (TInt j=0; j<Thai_GlyphClusterBoundaries[i].oOut[k].oOutputLen; j++)
  7995 					{
  7996 					if (!(param.iOutput[j].iCode == Thai_GlyphClusterBoundaries[i].oOut[k].oOutput[j]))
  7997 						{
  7998 						INFO_PRINTF5(_L("FAILURE: Glyph code invariance, Complex TEST(%d,%d), %x != %x\n"), i, k, param.iOutput[j].iCode, Thai_GlyphClusterBoundaries[i].oOut[k].oOutput[j]);
  7999 						failures++;
  8000 						break;
  8001 						}
  8002 					}
  8003 				}
  8004 			else
  8005 				{
  8006 				INFO_PRINTF3(_L("FAILURE: Bad output result from GetCharacterPosition, Complex TEST(%d,%d)\n"), i, k);
  8007 				failures++;
  8008 				}
  8009 
  8010 			}
  8011 		}
  8012 
  8013 	if (failures)
  8014 		RDebug::Print(_L("TOTAL FAILURES: %d\n"), failures);
  8015 	TEST(failures == 0);
  8016 	}
  8017 
  8018 /**
  8019 @SYMTestCaseID          GRAPHICS-SYSLIB-GDI-CT-4062
  8020 @SYMTestCaseDesc        Tests that a punctuation character following the special-case
  8021                         character Thai SaraAm is rendered as a punctuation, not
  8022                         another SaraAm character.
  8023 @SYMTestPriority        High
  8024 @SYMTestActions         Compare input string and corresponding output glyph codes
  8025 @SYMTestExpectedResults In this case, the string and the codes should match.
  8026 @SYMDEF                 INC118424
  8027 */
  8028 void CTGlyphSelection::TestThai_INC118424()
  8029 	{
  8030 	CFont::TPositionParam param;
  8031 	param.iDirection = CFont::EHorizontal;
  8032 	param.iFlags = CFont::TPositionParam::EFLogicalOrder;
  8033 	
  8034 	//punctuation after SaraAm
  8035 	TestGlyphs(iTestFont,param,_L("\xE04\xE33:\?>"),_L("\xE04\xE33:\?>"));
  8036 	}
  8037 
  8038 /**
  8039  This fuction tests Indic Gurmukhi and Malayalam support
  8040 */
  8041 void CTGlyphSelection::ExecuteIndicGurmukhiMalayalamTests()
  8042 	{
  8043 	// create a font store for testing
  8044 	CFontStore* fontStore = CFontStore::NewL(&User::Heap());
  8045 	
  8046 	//load all ecom implemented rasterizer dlls. installs the rasterizer.	
  8047 	LoadOpenFontLibraries(fontStore);
  8048 		// test font preparation
  8049 	fontStore->iKPixelWidthInTwips = 11860; //This value is default
  8050 
  8051 	//add any required font files
  8052 	TUid err1 = fontStore->AddFileL(KTestIndicFontFile);
  8053 
  8054 	TFontSpec testIndicFontSpec(KTestIndicFontFaceName,200);
  8055 	 
  8056 	CFbsBitmap* bmp = new(ELeave) CFbsBitmap;
  8057 	
  8058 	TInt ret = bmp->Create(TSize(100,100),EGray2);
  8059 	if (ret == KErrNotSupported)
  8060 		return;
  8061 	else
  8062 		User::LeaveIfError(ret);
  8063 
  8064 	CFbsBitmapDevice* device = NULL;
  8065 	TRAPD(err2,device = CFbsBitmapDevice::NewL(bmp));
  8066 	TEST(err2 == KErrNone);
  8067 
  8068 	CFbsBitGc* gc = NULL;
  8069 	User::LeaveIfError(device->CreateContext(gc));
  8070 	
  8071 	// Font file Creation
  8072 	CFbsFont* indicFont = NULL;
  8073 	User::LeaveIfError(device->GetNearestFontToDesignHeightInTwips(indicFont,testIndicFontSpec));
  8074 	gc->UseFont(indicFont);
  8075 	CleanupStack::PushL(indicFont);
  8076 	
  8077 	//Testcode for Kannada, Marathi,Gujarati,Bengali language
  8078 	// Test Indic Gurmukhi digit.
  8079 	TInt err;
  8080 	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  8081     	if (err!=KErrNone)
  8082     		INFO_PRINTF1(_L("Failed to record test result"));
  8083 	INFO_PRINTF1(_L("Test Indic Gurmukhi digits"));
  8084 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-TI18N-GDI-CIT-4063"));
  8085 	TestGurmukhiDigit( *indicFont );
  8086 	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  8087     	if (err!=KErrNone)
  8088     		INFO_PRINTF1(_L("Failed to record test result"));
  8089 	INFO_PRINTF1(_L("Test Indic Gurmukhi and Latin"));
  8090 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-TI18N-GDI-CIT-4064"));
  8091 	TestGurmukhiAndLatin( *indicFont );
  8092 	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  8093     	if (err!=KErrNone)
  8094     		INFO_PRINTF1(_L("Failed to record test result"));
  8095 	INFO_PRINTF1(_L("Test Indic DEF102858 on Gurmukhi"));
  8096 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-TI18N-GDI-CIT-4065"));
  8097 	TestGurmukhiModifierAfterConsonantViramaZWJ( *indicFont );
  8098 	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  8099     	if (err!=KErrNone)
  8100     		INFO_PRINTF1(_L("Failed to record test result"));
  8101 	INFO_PRINTF1(_L("Test Indic Gurmukhi consonant leading"));
  8102 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-TI18N-GDI-CIT-4066"));
  8103 	TestGurmukhiWithConsonantInitial( *indicFont );
  8104 	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  8105     	if (err!=KErrNone)
  8106     		INFO_PRINTF1(_L("Failed to record test result"));
  8107 	INFO_PRINTF1(_L("Test Indic Gurmukhi vowel leading"));
  8108 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-TI18N-GDI-CIT-4068"));
  8109 	TestGurmukhiWithVowelInitial( *indicFont );
  8110 	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  8111     	if (err!=KErrNone)
  8112     		INFO_PRINTF1(_L("Failed to record test result"));
  8113 	INFO_PRINTF1(_L("Test Indic Malayalam digits"));
  8114 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-TI18N-GDI-CIT-4067"));
  8115 	TestMalayalamDigit( *indicFont );
  8116 	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  8117     	if (err!=KErrNone)
  8118     		INFO_PRINTF1(_L("Failed to record test result"));
  8119 	INFO_PRINTF1(_L("Test Indic Malayalam and Latin"));
  8120 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-TI18N-GDI-CIT-4069"));
  8121 	TestMalayalamAndLatin( *indicFont );
  8122 	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  8123     	if (err!=KErrNone)
  8124     		INFO_PRINTF1(_L("Failed to record test result"));
  8125 	INFO_PRINTF1(_L("Test Indic DEF102858 on Malayalam"));
  8126 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-TI18N-GDI-CIT-4070"));
  8127 	TestMalayalamModifierAfterConsonantViramaZWJ( *indicFont );
  8128 	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  8129     	if (err!=KErrNone)
  8130     		INFO_PRINTF1(_L("Failed to record test result"));
  8131 	INFO_PRINTF1(_L("Test Indic Malayalam consonant leading"));
  8132 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-TI18N-GDI-CIT-4071"));
  8133 	TestMalayalamWithConsonantInitial( *indicFont );
  8134 	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
  8135     	if (err!=KErrNone)
  8136     		INFO_PRINTF1(_L("Failed to record test result"));
  8137 	INFO_PRINTF1(_L("Test Indic Malayalam vowel leading"));
  8138 	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-TI18N-GDI-CIT-4072"));
  8139 	TestMalayalamWithVowelInitial( *indicFont );
  8140 	CleanupStack::Pop(indicFont);
  8141 			
  8142 	//Cleaning the memory
  8143 	delete bmp;
  8144 	delete device;
  8145 	delete gc;
  8146 	fontStore->RemoveFile(err1);
  8147 	delete fontStore;
  8148 	REComSession::FinalClose();
  8149 	}
  8150 /**
  8151  This function tests the Thai Font Rendering feature of the CFont class
  8152  in the GDI.dll and in particular the modifications made to 
  8153  CFont::GetCharacterPosition() to support the Unicocde Thai code page.
  8154  First introduced during the Sirocco project (A3.1.1)
  8155 @SYMFssID Graphics/GDI/GDI/1
  8156 @SYMFssID Graphics/GDI/GDI/2
  8157 */
  8158 
  8159 void CTGlyphSelection::ExecuteThaiTests()
  8160 	{
  8161 	// Test individual Thai digits, letters and sign characters.
  8162 	INFO_PRINTF1(_L("Test Thai simple charecters"));
  8163 	TestThai_SimpleChars();
  8164 
  8165 	// Test complex Thai char sequences.
  8166 	INFO_PRINTF1(_L("Test valid Thai glyph clusters"));
  8167 	TestThai_ValidGlyphClusters();
  8168 
  8169 	// Test Thai glyph cluster boundaries.
  8170 	INFO_PRINTF1(_L("Test invalid Thai glyph clusters"));
  8171 	TestThai_InvalidGlyphClusters();
  8172 
  8173 	// Test Thai SaraAm-punctuation exception.
  8174 	INFO_PRINTF1(_L("Test fix for INC118424"));
  8175 	TestThai_INC118424();
  8176 	}
  8177 
  8178 
  8179 /*  
  8180  * Note:
  8181  *       This is just a easy way to help generate the test data info
  8182  *       Any new added test data should do manually check firstly to check the correction before using this function
  8183  */
  8184 // #define GEN_GURMUKHIMALAYALAMTESTDATA
  8185 void CTGlyphSelection::GenerateGurmukhiMalayalamData( const TDesC& filename, const TTestInput_PositionParam6* testArray, const CFbsFont& aFont )
  8186     {
  8187     RFile file;
  8188     file.Replace( iFs, filename, EFileWrite );
  8189     
  8190     CFont::TPositionParam param;
  8191     param.iDirection = CFont::EHorizontal;
  8192     param.iFlags = CFont::TPositionParam::EFLogicalOrder;
  8193     RShapeInfo shapeInfo;
  8194 
  8195     if (!testArray)
  8196         {
  8197         return;
  8198         }
  8199 
  8200     for (TUint i = 0; testArray[i].iTextLen != -1; i++)
  8201         {
  8202         TTestInput_PositionParam6 currentArray = testArray[i];
  8203         TBuf<8> testText(testArray[i].iText);
  8204         param.iText.Set(testText);
  8205         
  8206         TBuf8<256> datatext;
  8207         datatext.SetLength(0);
  8208         //{ 1, {0x0a66}, { {0, 1, 1, {0x12fe} }, {-1, 1, 1, {0} } } },
  8209         datatext.Format(_L8("{ %d, {"), testArray[i].iTextLen);  // 1, 
  8210         
  8211         for (TUint i = 0; i<testText.Length(); i++)
  8212             {
  8213             TBuf8<8> tmp;
  8214             tmp.Format(_L8("0x%x, "), currentArray.iText[i]); // {0x0a66},
  8215             datatext.Append(tmp);
  8216             }
  8217         datatext = datatext.Left(datatext.Length()-2);
  8218         datatext.Append(_L8("}, { "));
  8219 
  8220         if (shapeInfo.IsOpen())
  8221             shapeInfo.Close();
  8222 
  8223         for (TUint k = 0; k < 6; k++)
  8224             {
  8225             param.iPosInText = k;
  8226             param.iPen.iX = param.iPen.iY = 0;
  8227             TBool ret = aFont.GetCharacterPosition2(param, shapeInfo);
  8228             if (0 == param.iOutputGlyphs)
  8229                 continue;
  8230             
  8231             TBuf8<16> tmp;
  8232             tmp.Format(_L8("{%d, %d, %d, {"), k, param.iPosInText, param.iOutputGlyphs);
  8233             datatext.Append(tmp);
  8234             
  8235             for (TInt j = 0; j < param.iOutputGlyphs; j++)
  8236                 {
  8237                 TText16 aCode = param.iOutput[j].iCode;
  8238                 TBuf8<128> tmp;
  8239                 tmp.Format(_L8("0x%x, "), aCode);
  8240                 datatext.Append(tmp);
  8241                 } //end for
  8242             datatext = datatext.Left(datatext.Length()-2);
  8243             datatext.Append(_L8("}}, "));
  8244             } //end for
  8245         datatext.Append(_L8(" {-1, 1, 1, {0}} } }, \n"));
  8246         
  8247         file.Write(datatext);
  8248         } //end for
  8249     
  8250     file.Close();
  8251     return;
  8252     }
  8253 
  8254 void CTGlyphSelection::DoEachGurmukhiMalayalamCase( const TTestInput_PositionParam6* testArray, const CFbsFont& aFont )
  8255 	{
  8256 	TInt failures=0;
  8257 	TBool r;
  8258 	CFont::TPositionParam param;
  8259 	param.iDirection = CFont::EHorizontal;
  8260 	param.iFlags = CFont::TPositionParam::EFLogicalOrder;
  8261 	RShapeInfo shapeInfo;
  8262 	
  8263 	if ( !testArray )
  8264 		{
  8265 		return;
  8266 		}
  8267 	
  8268 	for (TUint i=0; testArray[i].iTextLen != -1; i++)
  8269 		{
  8270 		TBuf<8> testText(testArray[i].iText);
  8271 		param.iText.Set(testText);
  8272 		if(shapeInfo.IsOpen())
  8273 		    shapeInfo.Close();
  8274 		
  8275 		for (TUint k=0; k<6; k++)
  8276 			{
  8277 			//	If it's end of sequence
  8278 			if ( testArray[i].oOut[k].iPosInText == -1)
  8279 				break;
  8280 	
  8281 			param.iPosInText = testArray[i].oOut[k].iPosInText;
  8282 			param.iPen.iX = param.iPen.iY = 0;
  8283 	
  8284 			r = aFont.GetCharacterPosition2(param, shapeInfo);
  8285 			
  8286 			if (r && param.iPosInText == testArray[i].oOut[k].oPosInText
  8287 				   && param.iOutputGlyphs == testArray[i].oOut[k].oOutputLen)
  8288 				{
  8289 				for (TInt j=0; j<testArray[i].oOut[k].oOutputLen; j++)
  8290 					{
  8291 					//	Trim off the highest bit
  8292 					TText16 aCode = param.iOutput[j].iCode;
  8293 					if (!( aCode == testArray[i].oOut[k].oOutput[j]))
  8294 						{
  8295 						INFO_PRINTF5(_L("FAILURE: Glyph code invariance, Complex TEST(%d,%d), %x != %x\n"), i, k, param.iOutput[j].iCode, testArray[i].oOut[k].oOutput[j]);
  8296 						failures++;
  8297 						break;
  8298 						}
  8299 					}
  8300 				}
  8301 			else
  8302 				{
  8303 				INFO_PRINTF4(_L("FAILURE: Bad output result from GetCharacterPosition, Complex TEST(%d,%d,%d)\n"), i, k, param.iOutputGlyphs);
  8304 				failures++;
  8305 				}
  8306 	
  8307 			}
  8308 		}
  8309 	
  8310 	if (failures)
  8311 		RDebug::Print(_L("TOTAL FAILURES: %d\n"), failures);
  8312 	TEST(failures == 0);
  8313 	}
  8314 /**
  8315 @SYMTestCaseID          GRAPHICS-TI18N-GDI-CIT-4063
  8316 @SYMTestCaseDesc        Case to check Gurmukhi digit support
  8317 @SYMTestPriority        High
  8318 @SYMTestActions         Call to CFont::GetCharacterPosition2/CFont::MeasureText to check the following
  8319 						1.Pass Gurmukhi digit (0xa66 ~ 0x0a6f) sequence
  8320 						2.Pass any Consonant + Gurmukhi digit sequence 
  8321 						3.Pass any Consonant + Gurmukhi digit + Matra sequence
  8322 						4.Repetitive callss with Unicode sequence from the first 3 action items 
  8323 						5.Pass Modifer + digit sequence
  8324 						6.Pass Vowel and digit sequence
  8325 						7.Pass Virama and digit sequence 
  8326 @SYMTestExpectedResults 1.Glyph count, character count for digit is 1 for each digit, and glyph indices depends on font
  8327 						2.Digit is recognized as a separate syllable
  8328 						3.Matra and digit is not combined together
  8329 						4.The shaper returned the same result as first 3 results
  8330 						5.digit is recognized, and not combined with Modifier
  8331 						6.digit is recognized, and not combined with Vowel.
  8332 						7.digit is recognized, and not combined with Virama.
  8333 @SYMPREQ 1922: Gurmukhi support
  8334 */
  8335 void CTGlyphSelection::TestGurmukhiDigit( const CFbsFont& aFont )
  8336 	{
  8337 	DoEachGurmukhiMalayalamCase( (TTestInput_PositionParam6*)Indic_GurmukhiDigit, aFont );
  8338 	
  8339 #ifdef GEN_GURMUKHIMALAYALAMTESTDATA
  8340 	_LIT(KValidFontPath, "c:\\GurmukhiDigit.txt");
  8341 	GenerateGurmukhiMalayalamData(KValidFontPath, (TTestInput_PositionParam6*)Indic_GurmukhiDigit, aFont );
  8342 #endif
  8343 	}
  8344 
  8345 /**
  8346 @SYMTestCaseID          GRAPHICS-TI18N-GDI-CIT-4064
  8347 @SYMTestCaseDesc        case to check if shaper can render Gurmukhi with other implemented Indic scripts and Latin
  8348 @SYMTestPriority        High
  8349 @SYMTestActions         Call to CFont::GetCharacterPosition2/CFont::MeasureText to check the following
  8350 						1.Pass Gurmukhi sentence and Latin to the function
  8351 						2.Pass Latin and Gurmukhi setence.
  8352 						3.Pass syllable, Latin and syllable
  8353 						4.Pass phoneme, Latin and phoneme
  8354 						5.Pass Gurmukhi syllable and other Indic scripts together.
  8355 						6.Pass Gurmukhi phoneme and other Indic script phoneme
  8356 @SYMTestExpectedResults Gurumuki and Latin characters donĄ¯t mess up. Gurmukhi phoneme doesnĄ¯t combine with Latin into a new syllable, 
  8357 						Gurmukhi phoneme doesnĄ¯t form a syllable with other Indic script.
  8358 @SYMPREQ 1922: Gurmukhi support
  8359 */
  8360 void CTGlyphSelection::TestGurmukhiAndLatin( const CFbsFont& aFont )
  8361 	{
  8362 	DoEachGurmukhiMalayalamCase( (TTestInput_PositionParam6*)Indic_GurmukhiAndLatin, aFont );
  8363 
  8364 #ifdef GEN_GURMUKHIMALAYALAMTESTDATA
  8365     _LIT(KValidFontPath, "c:\\GurmukhiAndLatin.txt");
  8366     GenerateGurmukhiMalayalamData(KValidFontPath, (TTestInput_PositionParam6*)Indic_GurmukhiDigit, aFont );
  8367 #endif
  8368 	}
  8369 
  8370 /**
  8371 @SYMTestCaseID          GRAPHICS-TI18N-GDI-CIT-4065
  8372 @SYMTestCaseDesc        case to check Gurmukhi modifier after Consonant, Virama, ZWJ
  8373 @SYMTestPriority        High
  8374 @SYMTestActions         Call to CFont::GetCharacterPosition2/CFont::MeasureText to check the following
  8375 						1.Pass Consonant + Virama + ZWJ + Modifier
  8376 @SYMTestExpectedResults Modifier is part of the syllable.
  8377 @SYMPREQ 1922: Gurmukhi support, make sure DEF102858 fixing does not cause side effect
  8378 */
  8379 void CTGlyphSelection::TestGurmukhiModifierAfterConsonantViramaZWJ( const CFbsFont& aFont )
  8380 	{
  8381 	DoEachGurmukhiMalayalamCase( (TTestInput_PositionParam6*)Indic_GurmukhiModifierAfterConsonantViramaZWJ, aFont );
  8382 	
  8383 #ifdef GEN_GURMUKHIMALAYALAMTESTDATA
  8384     _LIT(KValidFontPath, "c:\\GurmukhiModifierAfterConsonantViramaZWJ.txt");
  8385     GenerateGurmukhiMalayalamData(KValidFontPath, (TTestInput_PositionParam6*)Indic_GurmukhiDigit, aFont );
  8386 #endif
  8387 	}
  8388 
  8389 /**
  8390 @SYMTestCaseID          GRAPHICS-TI18N-GDI-CIT-4066
  8391 @SYMTestCaseDesc        case to check syllable with consonant in initial position
  8392 @SYMTestPriority        High
  8393 @SYMTestActions         Call to CFont::GetCharacterPosition2/CFont::MeasureText to check the following using data from above requirements, each requirement above gives a consonant leading Unicode sequence. Each sequence falls into one of the following structure, then pass it to the calling.
  8394 						1.Pass  consonant and Nukta sequence
  8395 						2.Pass two consonant and dependent vowel sequences to shaper, save both returned results. The consonant is first sequence is difference with that of the second sequence..
  8396 						3.Pass consonant and matra /i/ t sequence 
  8397 						4.Pass the following Consonant, Virama and HA sequence 
  8398 						  Another sequence:  Consonant , Virama and RA
  8399 						  Another sequence:  Consonant, Virama and VA
  8400 						  Another sequence:  Consonant, Virama and YA
  8401 						5.Pass Consonant  and Addak sequence to shaper 
  8402 						  Pass Consonant, Addak and Consonant to shaper
  8403 						6.Pass Consonant and BINDI sequence:  
  8404 						  Sequence1:Consonant and BINDI,
  8405 						  Sequence2: Consonant, dependent vowel which is shown to the right of base consonant and BINDI,
  8406 						  Sequence3: Consonant, dependent vowel which is shown to the top of the base consonant and BINDI
  8407 						  Pass Consonant and TIPPI sequence:
  8408 						  Sequence1: Consonant and TIPPI, 
  8409 						  Sequence2: Consonant, dependent vowel which is shown to the left of the base consonant and TIPPI.
  8410 						  Sequence3: Consonant, dependent vowel which is shown to the bottom of the base consonant and TIPPI.
  8411 						7.Pass Nukta, equavalent consonant, Nukta sequence to shaper sepeartely, save both result
  8412 @SYMTestExpectedResults 1.nukta is combined to the base consonant according to the returned shape info
  8413 						2.The matra position is different between two ShapeText calls according to the returned shaped info.
  8414 						3.matra /i/ is combined to the left of the base consonant in position
  8415 						4.HA, RA, VA is on bottom of the base consonant and subscripted, YA in final form according to the returned shape info.
  8416 						5.Addak is on top of consonant, addak belongs to the consonant precedes it.
  8417 						6.BINDI is on top,  TIPPI is on bottom
  8418 						7.The combinationĄ¯s character count, glyph count, glyph indices info is the same as  the single nuktaĄ¯s
  8419 @SYMPREQ 1922: Gurmukhi support
  8420 */
  8421 void CTGlyphSelection::TestGurmukhiWithConsonantInitial( const CFbsFont& aFont )
  8422 	{
  8423 	DoEachGurmukhiMalayalamCase( (TTestInput_PositionParam6*)Indic_GurmukhiConsonantLeading, aFont );
  8424 	
  8425 #ifdef GEN_GURMUKHIMALAYALAMTESTDATA
  8426     _LIT(KValidFontPath, "c:\\GurmukhiWithConsonantInitial.txt");
  8427     GenerateGurmukhiMalayalamData(KValidFontPath, (TTestInput_PositionParam6*)Indic_GurmukhiDigit, aFont );
  8428 #endif
  8429 	}
  8430 
  8431 
  8432 /**
  8433 @SYMTestCaseID          GRAPHICS-TI18N-GDI-CIT-4067
  8434 @SYMTestCaseDesc        Case to check Malayalam digit support
  8435 @SYMTestPriority        High
  8436 @SYMTestActions         Call to CFont::GetCharacterPosition2/CFont::MeasureText to check the following
  8437 						1.Pass Malayalam digit (0xd66 ~ 0x0d6f) sequence
  8438 						2.Pass any Consonant + Malayalam digit sequence 
  8439 						3.Pass any Consonant + Malayalam digit + Matra sequence
  8440 						4.Repetitive callss with Unicode sequence from the first 3 action items 
  8441 						5.Pass Modifer + digit sequence
  8442 						6.Pass Vowel and digit sequence
  8443 						7.Pass Virama and digit sequence 
  8444 @SYMTestExpectedResults 1.Glyph count, character count for digit is 1 for each digit, and glyph indices depends on font
  8445 						2.Digit is recognized as a separate syllable
  8446 						3.Matra and digit is not combined together
  8447 						4.The shaper returned the same result as first 3 results
  8448 						5.digit is recognized, and not combined with Modifier
  8449 						6.digit is recognized, and not combined with Vowel.
  8450 						7.digit is recognized, and not combined with Virama.
  8451 @SYMPREQ 1922: Malayalam support
  8452 */
  8453 void CTGlyphSelection::TestMalayalamDigit( const CFbsFont& aFont )
  8454 	{
  8455 	DoEachGurmukhiMalayalamCase( (TTestInput_PositionParam6*)Indic_MalayalamDigit, aFont );
  8456 	
  8457 #ifdef GEN_GURMUKHIMALAYALAMTESTDATA
  8458     _LIT(KValidFontPath, "c:\\MalayalamDigit.txt");
  8459     GenerateGurmukhiMalayalamData(KValidFontPath, (TTestInput_PositionParam6*)Indic_GurmukhiDigit, aFont );
  8460 #endif	
  8461 	}
  8462 
  8463 /**
  8464 @SYMTestCaseID          GRAPHICS-TI18N-GDI-CIT-4068
  8465 @SYMTestCaseDesc        case to check syllable with vowel in initial position
  8466 @SYMTestPriority        High
  8467 @SYMTestActions         Call to CFont::GetCharacterPosition2/CFont::MeasureText to check the following using data from above requirements, 
  8468 						each requirement above gives a vowel leading Unicode sequence. Each sequence falls into one of the following structure, 
  8469 						then pass it to the calling.
  8470 						1.Pass ARA, IRI to shaper, pass URA sequence
  8471 						2.Pass valid bearer  and vowel pair sequence
  8472 						  Pass invalid bearer and vowel pair sequence
  8473 @SYMTestExpectedResults 1.ARA character count is 1, IRI, URA character count is 0
  8474 						2.valid combination is combined together, invalid is not combined together
  8475 @SYMPREQ 1922: Gurmukhi support
  8476 */
  8477 void CTGlyphSelection::TestGurmukhiWithVowelInitial( const CFbsFont& aFont )
  8478 	{
  8479 	DoEachGurmukhiMalayalamCase( (TTestInput_PositionParam6*)Indic_GurmukhiVowelLeading, aFont );
  8480 	
  8481 #ifdef GEN_GURMUKHIMALAYALAMTESTDATA
  8482     _LIT(KValidFontPath, "c:\\GurmukhiWithVowelInitial.txt");
  8483     GenerateGurmukhiMalayalamData(KValidFontPath, (TTestInput_PositionParam6*)Indic_GurmukhiDigit, aFont );
  8484 #endif  
  8485 	}
  8486 
  8487 /**
  8488 @SYMTestCaseID          GRAPHICS-TI18N-GDI-CIT-4069
  8489 @SYMTestCaseDesc        case to check if shaper can render Malayalam with other implemented Indic scripts and Latin
  8490 @SYMTestPriority        High
  8491 @SYMTestActions         Call to CFont::GetCharacterPosition2/CFont::MeasureText to check the following
  8492 						1.Pass Malayalam sentence and Latin to the function
  8493 						2.Pass Latin and Gurmukhi setence.
  8494 						3.Pass syllable, Latin and syllable
  8495 						4.Pass phoneme, Latin and phoneme
  8496 						5.Pass Malayalam syllable and other Indic scripts together.
  8497 						6.Pass Malayalam phoneme and other Indic script phoneme
  8498 @SYMTestExpectedResults Malayalam and Latin characters donĄ¯t mess up. Malayalam phoneme doesnĄ¯t combine with Latin into a new syllable, 
  8499 						Malayalam phoneme doesnĄ¯t form a syllable with other Indic script.
  8500 @SYMPREQ 1922: Malayalam support
  8501 */
  8502 void CTGlyphSelection::TestMalayalamAndLatin( const CFbsFont& aFont )
  8503 	{
  8504 	DoEachGurmukhiMalayalamCase( (TTestInput_PositionParam6*)Indic_MalayalamAndLatin, aFont );
  8505 	
  8506 #ifdef GEN_GURMUKHIMALAYALAMTESTDATA
  8507     _LIT(KValidFontPath, "c:\\MalayalamAndLatin.txt");
  8508     GenerateGurmukhiMalayalamData(KValidFontPath, (TTestInput_PositionParam6*)Indic_GurmukhiDigit, aFont );
  8509 #endif  
  8510 	}
  8511 
  8512 /**
  8513 @SYMTestCaseID          GRAPHICS-TI18N-GDI-CIT-4070
  8514 @SYMTestCaseDesc        case to check  Malayalam modifier after Consonant, Virama, ZWJ
  8515 @SYMTestPriority        High
  8516 @SYMTestActions         Call to CFont::GetCharacterPosition2/CFont::MeasureText to check the following
  8517 						1. Pass Consonant + Virama + ZWJ + Modifier
  8518 @SYMTestExpectedResults Modifier is part of the syllable.
  8519 @SYMPREQ 1922: Malayalam support, make sure DEF102858 fixing does not cause side effect 
  8520 */
  8521 void CTGlyphSelection::TestMalayalamModifierAfterConsonantViramaZWJ( const CFbsFont& aFont )
  8522 	{
  8523 	DoEachGurmukhiMalayalamCase( (TTestInput_PositionParam6*)Indic_MalayalamModifierAfterConsonantViramaZWJ, aFont );
  8524 	
  8525 #ifdef GEN_GURMUKHIMALAYALAMTESTDATA
  8526     _LIT(KValidFontPath, "c:\\MalayalamModifierAfterConsonantViramaZWJ.txt");
  8527     GenerateGurmukhiMalayalamData(KValidFontPath, (TTestInput_PositionParam6*)Indic_GurmukhiDigit, aFont );
  8528 #endif  
  8529 	}
  8530 
  8531 /**
  8532 @SYMTestCaseID          GRAPHICS-TI18N-GDI-CIT-4071
  8533 @SYMTestCaseDesc        case to check syllable with consonant in initial position
  8534 @SYMTestPriority        High
  8535 @SYMTestActions         Call to CFont::GetCharacterPosition2/CFont::MeasureText to check the following using data from above requirements, 
  8536 						each requirement above gives a consonant leading Unicode sequence. Each sequence falls into one of the following structure, 
  8537 						then pass it to the calling.
  8538 						1.Pass consonant + vowel single code, and  consonant + its split representation to shaper
  8539 						  The following Single representation /Split representation is passed to shaper
  8540 						  0x0d14/0x0d12 + 0x0d57, 0x0d4a/0x0d46 + 0x0d3e, 0x0d4b/0x0d47 + 0x0d3e
  8541 						  0x0d4c/0x0d46 + 0x0d57
  8542 						2.Pass two Consonant and dependent Vowel sequences to shaper, save both returned results. 
  8543 						  The Consonant is first sequence is difference with that of the second sequence, and the dependent Vowel is identical.
  8544 						3.Pass Consonant and Matras /-e/, /-ee/, /-ai/ to shaper. 
  8545 						4.Pass Consonant and Matras /-o/, /-oo/, /-au/ to shaper
  8546 						  Pass Consonant and 0x0d4c (first form of Matra /-au/ ) to shaper,
  8547 						  Pass Consonant, 0x0d46 and 0x0d57 (second form of Matra /-au/) to shaper002E
  8548 						5.Pass Consonant + 0x0d4d + Consonant to shaper
  8549 						  Pass Consonant + Virama + Consonant + 0x0d4d to shaper
  8550 						6.Pass Consonant (NNA, NA, RA, LA, LLA) + Virama + ZWJ to shaper
  8551 						  Pass KA + Virama + ZWJ to shaper.
  8552 						  Pass other Consonant + Virama + ZWJ to shaper.
  8553 						7.Pass RA + Virama + ZWJ to shaper,
  8554 						  Pass RRA + Viram + ZWJ to shaper.
  8555 						8.Pass Chillu ( one of 6 special consontants + Virama + ZWJ) and Vowel to shaper
  8556 						  Pass Chillu and Modifier to shaper
  8557 						  Pass Chillu and Virama to shaper
  8558 						9.Pass one of (KA, GA, PA, BA, MA, LA, SHA, SA, HA), Virama and LA to shaper
  8559 						10.Pass CA, Virama and CA to shaper
  8560 						   Pass BA, Virama and BA to shaper
  8561 						   Pass YA, Virama and YA to shaper
  8562 						   Pass VA, Virama and VA to shaper
  8563 						   PASS other Consonant, Virama and the same Consonant to shaper.
  8564 						11.Pass G.GA, C.CHA, K.TTA, SS.TTA, DD.DDA, NN.NNA, B.DA, B.DHA, P.PA, RR.RRA, SH.SHA, S.SA clusters to shaper.
  8565 						12.Pass Consonant clusters from REQ1.3.11 to shaper.
  8566 						13.Pass S.RR.RRA to shaper,
  8567 						   Pass N.RR.RRA to shaper
  8568 @SYMTestExpectedResults 1.First sequence is equivalent to the second sequence 
  8569 						2.The dependent vowel position is different between the two sequence
  8570 						3.The visual position of the Matras is different with the logical order (The same as Keyboard input order).
  8571 						4.The Matra is split into halves from visual effect. And the second form of Matra /-au/ is recognized the same as the first form of it.
  8572 						5.0x0d4d is recognized as a Virama in first sequence, itĄ¯s recognized as MATRA (mid-u sound) in the second sequence
  8573 						6.Virama and ZWJ is interpreted as Chillaksharam for the 6 consonants, for others itĄ¯s not interpreted that way.
  8574 						7.Both sequences will interprete RA Chillu.
  8575 						8.The combining character should not combine with Chillu.
  8576 						9.LA takes subscript shape.
  8577 						10.CA, BA, YA, VA double should result in a ligature, other consonants donĄ¯t.
  8578 						11.The latter consonant in the cluster becomes a miniature subscript.
  8579 						12.sequence forms a ligature.
  8580 						13.sequence forms a ligature
  8581 @SYMPREQ 1922: Malayalam support
  8582 */
  8583 void CTGlyphSelection::TestMalayalamWithConsonantInitial( const CFbsFont& aFont )
  8584 	{
  8585 	DoEachGurmukhiMalayalamCase( (TTestInput_PositionParam6*)Indic_MalayalamConsonantLeading, aFont );
  8586 	
  8587 #ifdef GEN_GURMUKHIMALAYALAMTESTDATA
  8588     _LIT(KValidFontPath, "c:\\MalayalamWithConsonantInitial.txt");
  8589     GenerateGurmukhiMalayalamData(KValidFontPath, (TTestInput_PositionParam6*)Indic_GurmukhiDigit, aFont );
  8590 #endif  
  8591 	}
  8592 
  8593 /**
  8594 @SYMTestCaseID          GRAPHICS-TI18N-GDI-CIT-4072
  8595 @SYMTestCaseDesc        case to check if shaper can render Malayalam with other implemented Indic scripts and Latin
  8596 @SYMTestPriority        High
  8597 @SYMTestActions         Call to CFont::GetCharacterPosition2/CFont::MeasureText to check the following
  8598 						1.Pass Malayalam sentence and Latin to the function
  8599 						2.Pass Latin and Malayalam setence.
  8600 						3.Pass syllable, Latin and syllable
  8601 						4.Pass phoneme, Latin and phoneme
  8602 						5.Pass Malayalam syllable and other Indic scripts together.
  8603 						6.Pass Malayalam phoneme and other Indic script phoneme
  8604 @SYMTestExpectedResults Malayalam and Latin characters donĄ¯t mess up. Malayalam phoneme doesnĄ¯t combine with Latin into a new syllable, 
  8605 						Malayalam phoneme doesnĄ¯t form a syllable with other Indic script.
  8606 @SYMPREQ 1922: Malayalam support
  8607 */
  8608 void CTGlyphSelection::TestMalayalamWithVowelInitial( const CFbsFont& aFont )
  8609 	{
  8610 	DoEachGurmukhiMalayalamCase( (TTestInput_PositionParam6*)Indic_MalayalamVowelLeading, aFont );
  8611 	
  8612 #ifdef GEN_GURMUKHIMALAYALAMTESTDATA
  8613     _LIT(KValidFontPath, "c:\\MalayalamWithVowelInitial.txt");
  8614     GenerateGurmukhiMalayalamData(KValidFontPath, (TTestInput_PositionParam6*)Indic_GurmukhiDigit, aFont );
  8615 #endif 
  8616 	}
  8617 
  8618 
  8619 //--------------
  8620 
  8621 __CONSTRUCT_STEP__(GlyphSelection)
  8622 
  8623 void CTGlyphSelectionStep::TestSetupL()
  8624 	{
  8625 #ifdef _GLOWCODE_LAUNCH_DELAY
  8626 	INFO_PRINTF1(_L("Time delay...."));
  8627 	TTime t1, t2;
  8628 	t1.UniversalTime();
  8629 	t1 += TTimeIntervalSeconds(15);
  8630 	do 
  8631 		{
  8632 		t2.UniversalTime();
  8633 		}
  8634 	while (t2 < t1);
  8635 #endif
  8636 	}