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.
sl@0
     1
// Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
sl@0
     2
// All rights reserved.
sl@0
     3
// This component and the accompanying materials are made available
sl@0
     4
// under the terms of "Eclipse Public License v1.0"
sl@0
     5
// which accompanies this distribution, and is available
sl@0
     6
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
sl@0
     7
//
sl@0
     8
// Initial Contributors:
sl@0
     9
// Nokia Corporation - initial contribution.
sl@0
    10
//
sl@0
    11
// Contributors:
sl@0
    12
//
sl@0
    13
// Description:
sl@0
    14
// This is a unit test module which defines the test code that 
sl@0
    15
// exercise CFont::GetCharacterPosition() functionality.
sl@0
    16
// 
sl@0
    17
//
sl@0
    18
sl@0
    19
/**
sl@0
    20
 @file
sl@0
    21
 @test
sl@0
    22
 @internalComponent
sl@0
    23
*/
sl@0
    24
sl@0
    25
sl@0
    26
//
sl@0
    27
// -- INCLUDE FILES ---------------------------------------------------------
sl@0
    28
//
sl@0
    29
sl@0
    30
sl@0
    31
#include <e32std.h>
sl@0
    32
#include <biditext.h>
sl@0
    33
#include <bidi.h>
sl@0
    34
#include <linebreak.h>
sl@0
    35
#include <bidivisual.h>
sl@0
    36
#include "GlyphSel.h"
sl@0
    37
#include "TGlyphSel.h"
sl@0
    38
#include <graphics/openfontconstants.h>
sl@0
    39
#include <graphics/openfontrasterizer.h>
sl@0
    40
sl@0
    41
sl@0
    42
//
sl@0
    43
// -- CONSTANTS -------------------------------------------------------------
sl@0
    44
//
sl@0
    45
sl@0
    46
/**
sl@0
    47
 This define when set introduces a delay to start up to allow Glowcode to
sl@0
    48
 be set up to collect statistics.
sl@0
    49
*/
sl@0
    50
//#define _GLOWCODE_LAUNCH_DELAY 1
sl@0
    51
sl@0
    52
sl@0
    53
/** RTest object for unit test output */
sl@0
    54
//RTest TEST(_L("TGlyphSel - CFont Glyph Selection"));
sl@0
    55
sl@0
    56
/** Thread name for test cases involving a new thread. */
sl@0
    57
_LIT(KThread2NameFirst, "GlyphSelPanicTest_First");
sl@0
    58
_LIT(KThread2NameSecond, "GlyphSelPanicTest_Second");
sl@0
    59
sl@0
    60
/*Beginning of Indic language font file constants declaration*/
sl@0
    61
sl@0
    62
_LIT16(KTestHindiFontFile, "C:\\TNR_Dev_OT.ttf");
sl@0
    63
_LIT16(KTestHindiFontFaceName, "Devanagari OT Eval");
sl@0
    64
sl@0
    65
//_LIT16(KTestIndicFontFile, "C:\\s60ssb_v435.ttf");
sl@0
    66
_LIT16(KTestIndicFontFile, "C:\\s60ssb_v500.ttf");
sl@0
    67
_LIT16(KTestIndicFontFaceName, "Series 60 Sans");
sl@0
    68
sl@0
    69
//_LIT16(KTestTeluguFontFile, "C:\\s60ssb_v500.ttf");
sl@0
    70
//_LIT16(KTestTeluguFontFaceName, "Series 60 Sans");
sl@0
    71
sl@0
    72
_LIT16(KTestGB18030FontFile, "C:\\TestExtB.ttf");
sl@0
    73
_LIT16(KTestGB18030FontFaceName, "Test Font for CJK ExtB");
sl@0
    74
sl@0
    75
/*End of Indic language font file constants declaration*/
sl@0
    76
//
sl@0
    77
// -- THAI TEST DATA --------------------------------------------------------
sl@0
    78
//
sl@0
    79
sl@0
    80
sl@0
    81
/**
sl@0
    82
 An array of Thai characters each of which is individually passed into
sl@0
    83
 GetCharacterPosition() for testing.
sl@0
    84
*/
sl@0
    85
LOCAL_D const TText16 Thai_SimpleChars[] = {
sl@0
    86
	 // Digits test 0..9
sl@0
    87
	0x0E50, 0x0E51, 0x0E52, 0x0E53, 0x0E54,
sl@0
    88
	0x0E55, 0x0E56, 0x0E57, 0x0E58, 0x0E59,
sl@0
    89
sl@0
    90
	// Consonants
sl@0
    91
	0x0E01, 0x0E02, 0x0E03, 0x0E04, 0x0E05, 0x0E06, 0x0E07, 
sl@0
    92
	0x0E08, 0x0E09, 0x0E0A, 0x0E0B, 0x0E0C, 0x0E0D, 0x0E0E, 0x0E0F, 
sl@0
    93
	0x0E10, 0x0E11, 0x0E12, 0x0E13, 0x0E14, 0x0E15, 0x0E16, 0x0E17, 
sl@0
    94
	0x0E18, 0x0E19, 0x0E1A, 0x0E1B, 0x0E1C, 0x0E1D, 0x0E1E, 0x0E1F, 
sl@0
    95
	0x0E20, 0x0E21, 0x0E22, 0x0E23, 0x0E24, 0x0E25, 0x0E26, 0x0E27, 
sl@0
    96
	0x0E28, 0x0E29, 0x0E2A, 0x0E2B, 0x0E2C, 0x0E2D, 0x0E2E, 
sl@0
    97
sl@0
    98
	// Independent vowels
sl@0
    99
	0x0E30, 0x0E32, // 0x0E33, Sara Am decomposed, not simple
sl@0
   100
	0x0E40, 0x0E41, 0x0E42, 0x0E43, 0x0E44, 
sl@0
   101
sl@0
   102
	// Independent signs
sl@0
   103
	0x0E2F, 0x0E3F, 0x0E45, 0x0E46, 0x0E4F, 0x0E5A, 0x0E5B, 
sl@0
   104
sl@0
   105
	// Array end
sl@0
   106
	0xFFFF,
sl@0
   107
	};
sl@0
   108
sl@0
   109
/**
sl@0
   110
 Data structure used to hold the in and out data of one invoke
sl@0
   111
 of the CFont::GetCharacterPosition() API.
sl@0
   112
*/
sl@0
   113
struct TTestInput_PositionParam
sl@0
   114
	{
sl@0
   115
	TInt	iTextLen;
sl@0
   116
	TText16	iText[4];
sl@0
   117
	TInt	iPosInText;
sl@0
   118
	TInt	oPosInText;
sl@0
   119
	TInt	oOutputLen;
sl@0
   120
	TText16	oOutput[CFont::TPositionParam::EMaxOutputGlyphs];
sl@0
   121
	};
sl@0
   122
sl@0
   123
/**
sl@0
   124
 This array of structs is used in the test routine 
sl@0
   125
 CTGlyphSelection::TestThai_ValidGlyphClusters() for verifying
sl@0
   126
 GetCharacterPosition() constructs Thai PUA glyph clusters correctly.
sl@0
   127
*/
sl@0
   128
LOCAL_D const TTestInput_PositionParam Thai_ValidGlyphClusters[] = {
sl@0
   129
//    --INPUT----------------			--OUTPUT----------------------
sl@0
   130
sl@0
   131
//  TEST A1..A8 handled in Thai_SimpleChars table.
sl@0
   132
sl@0
   133
//0.TEST A9 - Decomposed SARA AM
sl@0
   134
	{ 2, {0x0E01, 0x0E33}, 1,			2, 1, {0x0E33}},
sl@0
   135
	{ 2, {0x0E1B, 0x0E33}, 1,			2, 2, {0xF711, 0x0E32}},
sl@0
   136
	{ 2, {0x0E41, 0x0E33}, 1,			2, 2, {KUnicodeDottedCircle, 0x0E33}},
sl@0
   137
	{ 1, {0x0E33}, 0,					1, 2, {KUnicodeDottedCircle, 0x0E33}},
sl@0
   138
	{ 3, {0x0E19, 0x0E49, 0x0E33}, 0,	3, 4, {0x0E19, 0x0E4D, 0x0E49, 0x0E32}},
sl@0
   139
sl@0
   140
//5.TEST A9.1 - SARA AM exlcuded from cluster when vowel present
sl@0
   141
	{ 3, {0x0E19, 0x0E35, 0x0E33}, 0,           2, 2, {0x0E19, 0x0E35}},
sl@0
   142
	{ 3, {0x0E19, 0x0E39, 0x0E33}, 0,           2, 2, {0x0E19, 0x0E39}},
sl@0
   143
	{ 4, {0x0E19, 0x0E35, 0x0E48, 0x0E33}, 0,   3, 3, {0x0E19, 0x0E35, 0x0E48}},
sl@0
   144
sl@0
   145
//8.TEST B1 - Normal right aligned vowel/sign above short consonant
sl@0
   146
	{ 2, {0x0E04, 0x0E35}, 0,			2, 2, {0x0E04, 0x0E35}},
sl@0
   147
	{ 2, {0x0E01, 0x0E4D}, 0,			2, 2, {0x0E01, 0x0E4D}},
sl@0
   148
sl@0
   149
//10.TEST B2 - Left aligned vowel/sign above tall consonant
sl@0
   150
	{ 2, {0x0E1B, 0x0E34}, 0,			2, 2, {0x0E1B, 0xF701}},
sl@0
   151
	{ 2, {0x0E1D, 0x0E35}, 0,			2, 2, {0x0E1D, 0xF702}},
sl@0
   152
	{ 2, {0x0E1F, 0x0E36}, 0,			2, 2, {0x0E1F, 0xF703}},
sl@0
   153
	{ 2, {0x0E2C, 0x0E37}, 0,			2, 2, {0x0E2C, 0xF704}},
sl@0
   154
	{ 2, {0x0E1B, 0x0E31}, 0,			2, 2, {0x0E1B, 0xF710}},
sl@0
   155
	{ 2, {0x0E1D, 0x0E4D}, 0,			2, 2, {0x0E1D, 0xF711}},
sl@0
   156
	{ 2, {0x0E1F, 0x0E47}, 0,			2, 2, {0x0E1F, 0xF712}},
sl@0
   157
	
sl@0
   158
//17.TEST B3 - Normal right aligned vowel below short consonant
sl@0
   159
	{ 2, {0x0E2C, 0x0E3A}, 0,			2, 2, {0x0E2C, 0x0E3A}},
sl@0
   160
	{ 2, {0x0E0C, 0x0E38}, 0,			2, 2, {0x0E0C, 0x0E38}},
sl@0
   161
sl@0
   162
//19.TEST B4 - Vowel below consonant with joint decender 
sl@0
   163
	{ 2, {0x0E0E, 0x0E38}, 0,			2, 2, {0x0E0E, 0xF718}},
sl@0
   164
	{ 2, {0x0E0F, 0x0E39}, 0,			2, 2, {0x0E0F, 0xF719}},
sl@0
   165
	{ 2, {0x0E0F, 0x0E3A}, 0,			2, 2, {0x0E0F, 0xF71A}},
sl@0
   166
	{ 2, {0x0E24, 0x0E38}, 0,			2, 2, {0x0E24, 0xF718}},
sl@0
   167
	{ 2, {0x0E26, 0x0E39}, 0,			2, 2, {0x0E26, 0xF719}},
sl@0
   168
sl@0
   169
//24.TEST B5 - Vowel below consonant with disjoint decender
sl@0
   170
	{ 2, {0x0E10, 0x0E38}, 0,			2, 2, {0xF700, 0x0E38}},
sl@0
   171
	{ 2, {0x0E0D, 0x0E39}, 0,			2, 2, {0xF70F, 0x0E39}},
sl@0
   172
	{ 2, {0x0E10, 0x0E3A}, 0,			2, 2, {0xF700, 0x0E3A}},
sl@0
   173
 
sl@0
   174
//27.TEST C1 - Tone mark/sign above short consonant
sl@0
   175
	{ 2, {0x0E14, 0x0E48}, 0,			2, 2, {0x0E14, 0xF70A}},
sl@0
   176
	{ 2, {0x0E16, 0x0E49}, 0,			2, 2, {0x0E16, 0xF70B}},
sl@0
   177
	{ 2, {0x0E17, 0x0E4A}, 0,			2, 2, {0x0E17, 0xF70C}},
sl@0
   178
	{ 2, {0x0E19, 0x0E4B}, 0,			2, 2, {0x0E19, 0xF70D}},
sl@0
   179
	{ 2, {0x0E20, 0x0E4C}, 0,			2, 2, {0x0E20, 0xF70E}},
sl@0
   180
	// with lower vowel char in between the two?
sl@0
   181
	{ 3, {0x0E16, 0x0E39, 0x0E49}, 0,	3, 3, {0x0E16, 0x0E39, 0xF70B}},
sl@0
   182
sl@0
   183
//33.TEST C2 - Upper Vowel & tone makr/sign above short consonant
sl@0
   184
	{ 3, {0x0E01, 0x0E34, 0x0E48}, 0,	3, 3, {0x0E01, 0x0E34, 0x0E48}},
sl@0
   185
	{ 3, {0x0E02, 0x0E35, 0x0E49}, 0,	3, 3, {0x0E02, 0x0E35, 0x0E49}},
sl@0
   186
	{ 3, {0x0E04, 0x0E36, 0x0E4A}, 0,	3, 3, {0x0E04, 0x0E36, 0x0E4A}},
sl@0
   187
	{ 3, {0x0E08, 0x0E37, 0x0E4B}, 0,	3, 3, {0x0E08, 0x0E37, 0x0E4B}},
sl@0
   188
	{ 3, {0x0E09, 0x0E34, 0x0E4C}, 0,	3, 3, {0x0E09, 0x0E34, 0x0E4C}},
sl@0
   189
	{ 3, {0x0E11, 0x0E47, 0x0E4C}, 0,	2, 2, {0x0E11, 0x0E47}},
sl@0
   190
sl@0
   191
//39.TEST C2.1 - Lower Vowel & tone makr/sign above short consonant
sl@0
   192
	{ 3, {0x0E01, 0x0E38, 0x0E48}, 0,	3, 3, {0x0E01, 0x0E38, 0xF70A}},
sl@0
   193
	{ 3, {0x0E02, 0x0E39, 0x0E49}, 0,	3, 3, {0x0E02, 0x0E39, 0xF70B}},
sl@0
   194
	{ 3, {0x0E04, 0x0E38, 0x0E4A}, 0,	3, 3, {0x0E04, 0x0E38, 0xF70C}},
sl@0
   195
	{ 3, {0x0E08, 0x0E39, 0x0E4B}, 0,	3, 3, {0x0E08, 0x0E39, 0xF70D}},
sl@0
   196
	{ 3, {0x0E09, 0x0E38, 0x0E4C}, 0,	3, 3, {0x0E09, 0x0E38, 0xF70E}},
sl@0
   197
	{ 3, {0x0E09, 0x0E39, 0x0E4C}, 0,	2, 2, {0x0E09, 0x0E39}},
sl@0
   198
sl@0
   199
//45.TEST C3 - Left aligned tone mark/sign above tall consonant
sl@0
   200
	{ 2, {0x0E1B, 0x0E48}, 0,			2, 2, {0x0E1B, 0xF705}},
sl@0
   201
	{ 2, {0x0E1D, 0x0E49}, 0,			2, 2, {0x0E1D, 0xF706}},
sl@0
   202
	{ 2, {0x0E1F, 0x0E4A}, 0,			2, 2, {0x0E1F, 0xF707}},
sl@0
   203
	{ 2, {0x0E2C, 0x0E4B}, 0,			2, 2, {0x0E2C, 0xF708}},
sl@0
   204
	{ 2, {0x0E1B, 0x0E4C}, 0,			2, 2, {0x0E1B, 0xF709}},
sl@0
   205
sl@0
   206
//50.TEST C4 - Left aligned vowel & tone mark/sign above tall consonant
sl@0
   207
	{ 3, {0x0E1B, 0x0E34, 0x0E48}, 0,	3, 3, {0x0E1B, 0xF701, 0xF713}},
sl@0
   208
	{ 3, {0x0E1D, 0x0E35, 0x0E49}, 0,	3, 3, {0x0E1D, 0xF702, 0xF714}},
sl@0
   209
	{ 3, {0x0E1F, 0x0E36, 0x0E4A}, 0,	3, 3, {0x0E1F, 0xF703, 0xF715}},
sl@0
   210
	{ 3, {0x0E2C, 0x0E37, 0x0E4B}, 0,	3, 3, {0x0E2C, 0xF704, 0xF716}},
sl@0
   211
	{ 3, {0x0E1B, 0x0E34, 0x0E4C}, 0,	3, 3, {0x0E1B, 0xF701, 0xF717}},
sl@0
   212
sl@0
   213
//55. INC043221 - Tone marks are not readable with tall consonants and Sara Am
sl@0
   214
// Test that the nikhahit part of a sara am causes the same effects as top
sl@0
   215
// vowels.
sl@0
   216
// Test 4 already does one suitable test.
sl@0
   217
	{ 3, {0x0E1B, 0x0E49, 0x0E33}, 0,	3, 4, {0x0E1B, 0xF711, 0xF714, 0x0E32}},
sl@0
   218
sl@0
   219
//56. INC127996 - Tone mark/diacritic displayed incorrectly when combinded 
sl@0
   220
//	with long tail consonanat and below vowel. Test that in context 
sl@0
   221
//	'short consonanat + below vowel + Tone Mark/diacritic', mark/diacritic
sl@0
   222
//	can be replaced by corresonding PUA code.
sl@0
   223
	{ 3, {0x0E0D, 0x0E39, 0x0E49}, 0, 	3, 3, {0xF70F, 0x0E39, 0xF70B}},
sl@0
   224
	{ 3, {0x0E0E, 0x0E38, 0x0E48}, 0,	3, 3, {0x0E0E, 0xF718, 0xF70A}},
sl@0
   225
	{ 3, {0x0E0F, 0x0E39, 0x0E4A}, 0,	3, 3, {0x0E0F, 0xF719, 0xF70C}},
sl@0
   226
	{ 3, {0x0E26, 0x0E39, 0x0E4B}, 0,	3, 3, {0x0E26, 0xF719, 0xF70D}},
sl@0
   227
	{ 3, {0x0E24, 0x0E38, 0x0E49}, 0,	3, 3, {0x0E24, 0xF718, 0xF70B}},
sl@0
   228
	{ 3, {0x0E10, 0x0E38, 0x0E4C}, 0,	3, 3, {0xF700, 0x0E38, 0xF70E}},
sl@0
   229
sl@0
   230
//62.TABLE END
sl@0
   231
	{ -1, {0}, -1,						-1, 0, {0}}
sl@0
   232
	};
sl@0
   233
sl@0
   234
/**
sl@0
   235
 Data structure used to hold the in and out data of two invokes
sl@0
   236
 of the CFont::GetCharacterPosition() API.
sl@0
   237
*/
sl@0
   238
struct TTestInput_Invoke
sl@0
   239
	{
sl@0
   240
	TInt                iPosInText;
sl@0
   241
	TInt				oPosInText;
sl@0
   242
	TInt				oOutputLen;
sl@0
   243
	TText16				oOutput[CFont::TPositionParam::EMaxOutputGlyphs];
sl@0
   244
	};
sl@0
   245
sl@0
   246
/**
sl@0
   247
 Data structure used to hold the in and out data of two invokes
sl@0
   248
 of the CFont::GetCharacterPosition() API.
sl@0
   249
*/
sl@0
   250
struct TTestInput_PositionParam2
sl@0
   251
	{
sl@0
   252
	TInt				iTextLen;
sl@0
   253
	TText16				iText[4];
sl@0
   254
	TTestInput_Invoke   oOut[2];
sl@0
   255
	};
sl@0
   256
sl@0
   257
/**
sl@0
   258
 Data structure used to hold the in and out data of two invokes
sl@0
   259
 of the CFont::GetCharacterPosition() API.
sl@0
   260
*/
sl@0
   261
struct TTestInput_PositionParam6
sl@0
   262
	{
sl@0
   263
	TInt				iTextLen;
sl@0
   264
	TText16				iText[6];
sl@0
   265
	TTestInput_Invoke   oOut[6];
sl@0
   266
	};
sl@0
   267
sl@0
   268
//	{-1, 1, 1, {0} } } indicate end of sequence
sl@0
   269
//	The most significant bit of glyph index is trimmed off when stored
sl@0
   270
LOCAL_D const TTestInput_PositionParam6 Indic_GurmukhiDigit[] = {
sl@0
   271
		{ 1, {0x0a66}, { {0, 1, 1, {0x12fe} }, {-1, 1, 1, {0} } } },
sl@0
   272
		{ 1, {0x0a67}, { {0, 1, 1, {0x12ff} }, {-1, 1, 1, {0} } } },
sl@0
   273
		{ 1, {0x0a68}, { {0, 1, 1, {0x1300} }, {-1, 1, 1, {0} } } },
sl@0
   274
		{ 1, {0x0a69}, { {0, 1, 1, {0x1301} }, {-1, 1, 1, {0} } } },
sl@0
   275
		{ 1, {0x0a6a}, { {0, 1, 1, {0x1302} }, {-1, 1, 1, {0} } } },
sl@0
   276
		{ 1, {0x0a6b}, { {0, 1, 1, {0x1303} }, {-1, 1, 1, {0} } } },
sl@0
   277
		{ 1, {0x0a6c}, { {0, 1, 1, {0x1304} }, {-1, 1, 1, {0} } } },
sl@0
   278
		{ 1, {0x0a6d}, { {0, 1, 1, {0x1305} }, {-1, 1, 1, {0} } } },
sl@0
   279
		{ 1, {0x0a6e}, { {0, 1, 1, {0x1306} }, {-1, 1, 1, {0} } } },
sl@0
   280
		{ 1, {0x0a6f}, { {0, 1, 1, {0x1307} }, {-1, 1, 1, {0} } } },
sl@0
   281
		//	Consonant + digit
sl@0
   282
		{ 2, {0x0a15, 0x0a66}, { {0, 1, 1, {0x12cd}}, {1, 2, 1, {0x12fe}}, {-1, 1, 1, {0} } } },
sl@0
   283
		{ 2, {0x0a17, 0x0a67}, { {0, 1, 1, {0x12cf}}, {1, 2, 1, {0x12ff}}, {-1, 1, 1, {0} } } },
sl@0
   284
		{ 2, {0x0a19, 0x0a68}, { {0, 1, 1, {0x12d1}}, {1, 2, 1, {0x1300}}, {-1, 1, 1, {0} } } },
sl@0
   285
		{ 2, {0x0a25, 0x0a69}, { {0, 1, 1, {0x12dd}}, {1, 2, 1, {0x1301}}, {-1, 1, 1, {0} } } },
sl@0
   286
		{ 2, {0x0a27, 0x0a6a}, { {0, 1, 1, {0x12df}}, {1, 2, 1, {0x1302}}, {-1, 1, 1, {0} } } },
sl@0
   287
		{ 2, {0x0a28, 0x0a6b}, { {0, 1, 1, {0x12e0}}, {1, 2, 1, {0x1303}}, {-1, 1, 1, {0} } } },
sl@0
   288
		{ 2, {0x0a29, 0x0a6c}, { {0, 1, 1, {0x0000}}, {1, 2, 1, {0x1304}}, {-1, 1, 1, {0} } } },
sl@0
   289
		{ 2, {0x0a3a, 0x0a6d}, { {0, 1, 1, {0x0000}}, {1, 2, 1, {0x1305}}, {-1, 1, 1, {0} } } },
sl@0
   290
		{ 2, {0x0a3b, 0x0a6e}, { {0, 1, 1, {0x0000}}, {1, 2, 1, {0x1306}}, {-1, 1, 1, {0} } } },
sl@0
   291
		{ 2, {0x0a3c, 0x0a6f}, { {0, 1, 2, {0x058f, 0x12ee}}, {1, 2, 1, {0x1307}}, {-1, 1, 1, {0} } } },
sl@0
   292
		//	Modifier + digit
sl@0
   293
		{ 2, {0x0a3e, 0x0a66}, { {0, 1, 2, {0x058f, 0x12ef}}, {1, 2, 1, {0x12fe}}, {-1, 1, 1, {0} } } },
sl@0
   294
		{ 2, {0x0a3e, 0x0a67}, { {0, 1, 2, {0x058f, 0x12ef}}, {1, 2, 1, {0x12ff}}, {-1, 1, 1, {0} } } },
sl@0
   295
		{ 2, {0x0a3e, 0x0a68}, { {0, 1, 2, {0x058f, 0x12ef}}, {1, 2, 1, {0x1300}}, {-1, 1, 1, {0} } } },
sl@0
   296
		{ 2, {0x0a3e, 0x0a69}, { {0, 1, 2, {0x058f, 0x12ef}}, {1, 2, 1, {0x1301}}, {-1, 1, 1, {0} } } },
sl@0
   297
		{ 2, {0x0a3e, 0x0a6a}, { {0, 1, 2, {0x058f, 0x12ef}}, {1, 2, 1, {0x1302}}, {-1, 1, 1, {0} } } },
sl@0
   298
		{ 2, {0x0a3e, 0x0a6b}, { {0, 1, 2, {0x058f, 0x12ef}}, {1, 2, 1, {0x1303}}, {-1, 1, 1, {0} } } },
sl@0
   299
		{ 2, {0x0a3e, 0x0a6c}, { {0, 1, 2, {0x058f, 0x12ef}}, {1, 2, 1, {0x1304}}, {-1, 1, 1, {0} } } },
sl@0
   300
		{ 2, {0x0a3e, 0x0a6d}, { {0, 1, 2, {0x058f, 0x12ef}}, {1, 2, 1, {0x1305}}, {-1, 1, 1, {0} } } },
sl@0
   301
		{ 2, {0x0a3e, 0x0a6e}, { {0, 1, 2, {0x058f, 0x12ef}}, {1, 2, 1, {0x1306}}, {-1, 1, 1, {0} } } },
sl@0
   302
		{ 2, {0x0a3e, 0x0a6f}, { {0, 1, 2, {0x058f, 0x12ef}}, {1, 2, 1, {0x1307}}, {-1, 1, 1, {0} } } },
sl@0
   303
		//	Vowel + digit
sl@0
   304
		{ 2, {0x0a73, 0x0a66}, { {0, 1, 1, {0x130b}}, {1, 2, 1, {0x12fe}}, {-1, 1, 1, {0} } } },
sl@0
   305
		{ 2, {0x0a73, 0x0a67}, { {0, 1, 1, {0x130b}}, {1, 2, 1, {0x12ff}}, {-1, 1, 1, {0} } } },
sl@0
   306
		{ 2, {0x0a73, 0x0a68}, { {0, 1, 1, {0x130b}}, {1, 2, 1, {0x1300}}, {-1, 1, 1, {0} } } },
sl@0
   307
		{ 2, {0x0a73, 0x0a69}, { {0, 1, 1, {0x130b}}, {1, 2, 1, {0x1301}}, {-1, 1, 1, {0} } } },
sl@0
   308
		{ 2, {0x0a73, 0x0a6a}, { {0, 1, 1, {0x130b}}, {1, 2, 1, {0x1302}}, {-1, 1, 1, {0} } } },
sl@0
   309
		{ 2, {0x0a73, 0x0a6b}, { {0, 1, 1, {0x130b}}, {1, 2, 1, {0x1303}}, {-1, 1, 1, {0} } } },
sl@0
   310
		{ 2, {0x0a73, 0x0a6c}, { {0, 1, 1, {0x130b}}, {1, 2, 1, {0x1304}}, {-1, 1, 1, {0} } } },
sl@0
   311
		{ 2, {0x0a73, 0x0a6d}, { {0, 1, 1, {0x130b}}, {1, 2, 1, {0x1305}}, {-1, 1, 1, {0} } } },
sl@0
   312
		{ 2, {0x0a73, 0x0a6e}, { {0, 1, 1, {0x130b}}, {1, 2, 1, {0x1306}}, {-1, 1, 1, {0} } } },
sl@0
   313
		{ 2, {0x0a73, 0x0a6f}, { {0, 1, 1, {0x130b}}, {1, 2, 1, {0x1307}}, {-1, 1, 1, {0} } } },
sl@0
   314
		//	Virama + digit
sl@0
   315
		{ 2, {0x0a4d, 0x0a66}, { {0, 1, 2, {0x058f, 0x12f8}}, {1, 2, 1, {0x12fe}}, {-1, 1, 1, {0} } } },
sl@0
   316
		{ 2, {0x0a4d, 0x0a67}, { {0, 1, 2, {0x058f, 0x12f8}}, {1, 2, 1, {0x12ff}}, {-1, 1, 1, {0} } } },
sl@0
   317
		{ 2, {0x0a4d, 0x0a68}, { {0, 1, 2, {0x058f, 0x12f8}}, {1, 2, 1, {0x1300}}, {-1, 1, 1, {0} } } },
sl@0
   318
		{ 2, {0x0a4d, 0x0a69}, { {0, 1, 2, {0x058f, 0x12f8}}, {1, 2, 1, {0x1301}}, {-1, 1, 1, {0} } } },
sl@0
   319
		{ 2, {0x0a4d, 0x0a6a}, { {0, 1, 2, {0x058f, 0x12f8}}, {1, 2, 1, {0x1302}}, {-1, 1, 1, {0} } } },
sl@0
   320
		{ 2, {0x0a4d, 0x0a6b}, { {0, 1, 2, {0x058f, 0x12f8}}, {1, 2, 1, {0x1303}}, {-1, 1, 1, {0} } } },
sl@0
   321
		{ 2, {0x0a4d, 0x0a6c}, { {0, 1, 2, {0x058f, 0x12f8}}, {1, 2, 1, {0x1304}}, {-1, 1, 1, {0} } } },
sl@0
   322
		{ 2, {0x0a4d, 0x0a6d}, { {0, 1, 2, {0x058f, 0x12f8}}, {1, 2, 1, {0x1305}}, {-1, 1, 1, {0} } } },
sl@0
   323
		{ 2, {0x0a4d, 0x0a6e}, { {0, 1, 2, {0x058f, 0x12f8}}, {1, 2, 1, {0x1306}}, {-1, 1, 1, {0} } } },
sl@0
   324
		{ 2, {0x0a4d, 0x0a6f}, { {0, 1, 2, {0x058f, 0x12f8}}, {1, 2, 1, {0x1307}}, {-1, 1, 1, {0} } } },
sl@0
   325
		//	Consonant + digit + Matra
sl@0
   326
		{ 3, {0x0a15, 0x0a66, 0x0a3e}, { {0, 1, 1, {0x12cd}}, {1, 2, 1, {0x12fe}}, {2, 3, 2, {0x058f, 0x12ef}}, {-1, 1, 1, {0} } } },
sl@0
   327
		{ 3, {0x0a16, 0x0a67, 0x0a3e}, { {0, 1, 1, {0x12ce}}, {1, 2, 1, {0x12ff}}, {2, 3, 2, {0x058f, 0x12ef}}, {-1, 1, 1, {0} } } },
sl@0
   328
		{ 3, {0x0a17, 0x0a68, 0x0a3e}, { {0, 1, 1, {0x12cf}}, {1, 2, 1, {0x1300}}, {2, 3, 2, {0x058f, 0x12ef}}, {-1, 1, 1, {0} } } },
sl@0
   329
		{ 3, {0x0a18, 0x0a69, 0x0a3e}, { {0, 1, 1, {0x12d0}}, {1, 2, 1, {0x1301}}, {2, 3, 2, {0x058f, 0x12ef}}, {-1, 1, 1, {0} } } },
sl@0
   330
		{ 3, {0x0a19, 0x0a6a, 0x0a3e}, { {0, 1, 1, {0x12d1}}, {1, 2, 1, {0x1302}}, {2, 3, 2, {0x058f, 0x12ef}}, {-1, 1, 1, {0} } } },
sl@0
   331
		{ 3, {0x0a25, 0x0a6b, 0x0a3e}, { {0, 1, 1, {0x12dd}}, {1, 2, 1, {0x1303}}, {2, 3, 2, {0x058f, 0x12ef}}, {-1, 1, 1, {0} } } },
sl@0
   332
		{ 3, {0x0a2a, 0x0a6c, 0x0a3e}, { {0, 1, 1, {0x12e1}}, {1, 2, 1, {0x1304}}, {2, 3, 2, {0x058f, 0x12ef}}, {-1, 1, 1, {0} } } },
sl@0
   333
		{ 3, {0x0a2d, 0x0a6d, 0x0a3e}, { {0, 1, 1, {0x12e4}}, {1, 2, 1, {0x1305}}, {2, 3, 2, {0x058f, 0x12ef}}, {-1, 1, 1, {0} } } },
sl@0
   334
		{ 3, {0x0a30, 0x0a6e, 0x0a3e}, { {0, 1, 1, {0x12e7}}, {1, 2, 1, {0x1306}}, {2, 3, 2, {0x058f, 0x12ef}}, {-1, 1, 1, {0} } } },
sl@0
   335
		{ 3, {0x0a33, 0x0a6f, 0x0a3e}, { {0, 1, 1, {0x12e9}}, {1, 2, 1, {0x1307}}, {2, 3, 2, {0x058f, 0x12ef}}, {-1, 1, 1, {0} } } },
sl@0
   336
		{ -1, {0}, -1,						-1, 0, {0}}
sl@0
   337
};
sl@0
   338
sl@0
   339
sl@0
   340
LOCAL_D const TTestInput_PositionParam6 Indic_MalayalamDigit[] = {
sl@0
   341
		{ 1, {0x0d66}, { {0, 1, 1, {0x123e} }, {-1, 1, 1, {0} } }  },
sl@0
   342
		{ 1, {0x0d67}, { {0, 1, 1, {0x123f} }, {-1, 1, 1, {0} }  } },
sl@0
   343
		{ 1, {0x0d68}, { {0, 1, 1, {0x1240} }, {-1, 1, 1, {0} } } },
sl@0
   344
		{ 1, {0x0d69}, { {0, 1, 1, {0x1241} }, {-1, 1, 1, {0} } } },
sl@0
   345
		{ 1, {0x0d6a}, { {0, 1, 1, {0x1242} }, {-1, 1, 1, {0} } } },
sl@0
   346
		{ 1, {0x0d6b}, { {0, 1, 1, {0x1243} }, {-1, 1, 1, {0} } } },
sl@0
   347
		{ 1, {0x0d6c}, { {0, 1, 1, {0x1244} }, {-1, 1, 1, {0} } } },
sl@0
   348
		{ 1, {0x0d6d}, { {0, 1, 1, {0x1245} }, {-1, 1, 1, {0} } } },
sl@0
   349
		{ 1, {0x0d6e}, { {0, 1, 1, {0x1246} }, {-1, 1, 1, {0} } } },
sl@0
   350
		{ 1, {0x0d6f}, { {0, 1, 1, {0x1247} }, {-1, 1, 1, {0} } } },
sl@0
   351
		//	Consonant + digit
sl@0
   352
		{ 2, {0x0d15, 0x0d66}, { {0, 1, 1, {0x120a}}, {1, 2, 1, {0x123e}}, {-1, 1, 1, {0} }  } },
sl@0
   353
		{ 2, {0x0d15, 0x0d67}, { {0, 1, 1, {0x120a}}, {1, 2, 1, {0x123f}}, {-1, 1, 1, {0} }  } },
sl@0
   354
		{ 2, {0x0d17, 0x0d68}, { {0, 1, 1, {0x120c}}, {1, 2, 1, {0x1240}}, {-1, 1, 1, {0} }  } },
sl@0
   355
		{ 2, {0x0d19, 0x0d69}, { {0, 1, 1, {0x120e}}, {1, 2, 1, {0x1241}}, {-1, 1, 1, {0} }  } },
sl@0
   356
		{ 2, {0x0d25, 0x0d6a}, { {0, 1, 1, {0x121a}}, {1, 2, 1, {0x1242}}, {-1, 1, 1, {0} }  } },
sl@0
   357
		{ 2, {0x0d26, 0x0d6b}, { {0, 1, 1, {0x121b}}, {1, 2, 1, {0x1243}}, {-1, 1, 1, {0} }  } },
sl@0
   358
		{ 2, {0x0d15, 0x0d6c}, { {0, 1, 1, {0x120a}}, {1, 2, 1, {0x1244}}, {-1, 1, 1, {0} }  } },
sl@0
   359
		{ 2, {0x0d30, 0x0d6d}, { {0, 1, 1, {0x1224}}, {1, 2, 1, {0x1245}}, {-1, 1, 1, {0} }  } },
sl@0
   360
		{ 2, {0x0d31, 0x0d6e}, { {0, 1, 1, {0x1225}}, {1, 2, 1, {0x1246}}, {-1, 1, 1, {0} }  } },
sl@0
   361
		{ 2, {0x0d32, 0x0d6f}, { {0, 1, 1, {0x1226}}, {1, 2, 1, {0x1247}}, {-1, 1, 1, {0} }  } },
sl@0
   362
		//	Modifier + digit
sl@0
   363
		{ 2, {0x0d03, 0x0d66}, { {0, 1, 2, {0x058f, 0x11fb}}, {1, 2, 1, {0x123e}}, {-1, 1, 1, {0} }  } },
sl@0
   364
		{ 2, {0x0d03, 0x0d67}, { {0, 1, 2, {0x058f, 0x11fb}}, {1, 2, 1, {0x123f}}, {-1, 1, 1, {0} }  } },
sl@0
   365
		{ 2, {0x0d03, 0x0d68}, { {0, 1, 2, {0x058f, 0x11fb}}, {1, 2, 1, {0x1240}}, {-1, 1, 1, {0} }  } },
sl@0
   366
		{ 2, {0x0d03, 0x0d69}, { {0, 1, 2, {0x058f, 0x11fb}}, {1, 2, 1, {0x1241}}, {-1, 1, 1, {0} }  } },
sl@0
   367
		{ 2, {0x0d03, 0x0d6a}, { {0, 1, 2, {0x058f, 0x11fb}}, {1, 2, 1, {0x1242}}, {-1, 1, 1, {0} }  } },
sl@0
   368
		{ 2, {0x0d02, 0x0d6b}, { {0, 1, 2, {0x058f, 0x11fa}}, {1, 2, 1, {0x1243}}, {-1, 1, 1, {0} }  } },
sl@0
   369
		{ 2, {0x0d02, 0x0d6c}, { {0, 1, 2, {0x058f, 0x11fa}}, {1, 2, 1, {0x1244}}, {-1, 1, 1, {0} }  } },
sl@0
   370
		{ 2, {0x0d02, 0x0d6d}, { {0, 1, 2, {0x058f, 0x11fa}}, {1, 2, 1, {0x1245}}, {-1, 1, 1, {0} }  } },
sl@0
   371
		{ 2, {0x0d02, 0x0d6e}, { {0, 1, 2, {0x058f, 0x11fa}}, {1, 2, 1, {0x1246}}, {-1, 1, 1, {0} }  } },
sl@0
   372
		{ 2, {0x0d02, 0x0d6f}, { {0, 1, 2, {0x058f, 0x11fa}}, {1, 2, 1, {0x1247}}, {-1, 1, 1, {0} }  } },
sl@0
   373
		//	Vowel + digit
sl@0
   374
		{ 2, {0x0d3e, 0x0d66}, { {0, 1, 2, {0x058f, 0x122e}}, {1, 2, 1, {0x123e}}, {-1, 1, 1, {0} }  } },
sl@0
   375
		{ 2, {0x0d3f, 0x0d67}, { {0, 1, 2, {0x058f, 0x122f}}, {1, 2, 1, {0x123f}}, {-1, 1, 1, {0} }  } },
sl@0
   376
		{ 2, {0x0d40, 0x0d68}, { {0, 1, 2, {0x058f, 0x1230}}, {1, 2, 1, {0x1240}}, {-1, 1, 1, {0} }  } },
sl@0
   377
		{ 2, {0x0d41, 0x0d69}, { {0, 1, 2, {0x058f, 0x1231}}, {1, 2, 1, {0x1241}}, {-1, 1, 1, {0} }  } },
sl@0
   378
		{ 2, {0x0d42, 0x0d6a}, { {0, 1, 2, {0x058f, 0x1232}}, {1, 2, 1, {0x1242}}, {-1, 1, 1, {0} }  } },
sl@0
   379
		{ 2, {0x0d43, 0x0d6b}, { {0, 1, 2, {0x058f, 0x1233}}, {1, 2, 1, {0x1243}}, {-1, 1, 1, {0} }  } },
sl@0
   380
		{ 2, {0x0d46, 0x0d6c}, { {0, 1, 2, {0x1234, 0x058f}}, {1, 2, 1, {0x1244}}, {-1, 1, 1, {0} }  } },
sl@0
   381
		{ 2, {0x0d47, 0x0d6d}, { {0, 1, 2, {0x1235, 0x058f}}, {1, 2, 1, {0x1245}}, {-1, 1, 1, {0} }  } },
sl@0
   382
		{ 2, {0x0d48, 0x0d6e}, { {0, 1, 2, {0x1236, 0x058f}}, {1, 2, 1, {0x1246}}, {-1, 1, 1, {0} }  } },
sl@0
   383
		{ 2, {0x0d4c, 0x0d6f}, { {0, 1, 2, {0x058f, 0x123b}}, {1, 2, 1, {0x1247}}, {-1, 1, 1, {0} }  } },
sl@0
   384
		//	Virama + digit
sl@0
   385
		{ 2, {0x0d4d, 0x0d66}, { {0, 1, 2, {0x058f, 0x123a}}, {1, 2, 1, {0x123e}}, {-1, 1, 1, {0} }  } },
sl@0
   386
		{ 2, {0x0d4d, 0x0d67}, { {0, 1, 2, {0x058f, 0x123a}}, {1, 2, 1, {0x123f}}, {-1, 1, 1, {0} }  } },
sl@0
   387
		{ 2, {0x0d4d, 0x0d68}, { {0, 1, 2, {0x058f, 0x123a}}, {1, 2, 1, {0x1240}}, {-1, 1, 1, {0} }  } },
sl@0
   388
		{ 2, {0x0d4d, 0x0d69}, { {0, 1, 2, {0x058f, 0x123a}}, {1, 2, 1, {0x1241}}, {-1, 1, 1, {0} }  } },
sl@0
   389
		{ 2, {0x0d4d, 0x0d6a}, { {0, 1, 2, {0x058f, 0x123a}}, {1, 2, 1, {0x1242}}, {-1, 1, 1, {0} }  } },
sl@0
   390
		{ 2, {0x0d4d, 0x0d6b}, { {0, 1, 2, {0x058f, 0x123a}}, {1, 2, 1, {0x1243}}, {-1, 1, 1, {0} }  } },
sl@0
   391
		{ 2, {0x0d4d, 0x0d6c}, { {0, 1, 2, {0x058f, 0x123a}}, {1, 2, 1, {0x1244}}, {-1, 1, 1, {0} }  } },
sl@0
   392
		{ 2, {0x0d4d, 0x0d6d}, { {0, 1, 2, {0x058f, 0x123a}}, {1, 2, 1, {0x1245}}, {-1, 1, 1, {0} }  } },
sl@0
   393
		{ 2, {0x0d4d, 0x0d6e}, { {0, 1, 2, {0x058f, 0x123a}}, {1, 2, 1, {0x1246}}, {-1, 1, 1, {0} }  } },
sl@0
   394
		{ 2, {0x0d4d, 0x0d6f}, { {0, 1, 2, {0x058f, 0x123a}}, {1, 2, 1, {0x1247}}, {-1, 1, 1, {0} }  } },
sl@0
   395
		//	Consonant + digit + Matra
sl@0
   396
		{ 3, {0x0d15, 0x0d66, 0x0d3e}, { {0, 1, 1, {0x120a}}, {1, 2, 1, {0x123e}}, {2, 3, 2, {0x058f, 0x122e}}, {-1, 1, 1, {0} }  } },
sl@0
   397
		{ 3, {0x0d20, 0x0d67, 0x0d3f}, { {0, 1, 1, {0x1215}}, {1, 2, 1, {0x123f}}, {2, 3, 2, {0x058f, 0x122f}}, {-1, 1, 1, {0} }  } },
sl@0
   398
		{ 3, {0x0d22, 0x0d68, 0x0d40}, { {0, 1, 1, {0x1217}}, {1, 2, 1, {0x1240}}, {2, 3, 2, {0x058f, 0x1230}}, {-1, 1, 1, {0} }  } },
sl@0
   399
		{ 3, {0x0d27, 0x0d69, 0x0d41}, { {0, 1, 1, {0x121c}}, {1, 2, 1, {0x1241}}, {2, 3, 2, {0x058f, 0x1231}}, {-1, 1, 1, {0} }  } },
sl@0
   400
		{ 3, {0x0d28, 0x0d6a, 0x0d42}, { {0, 1, 1, {0x121d}}, {1, 2, 1, {0x1242}}, {2, 3, 2, {0x058f, 0x1232}}, {-1, 1, 1, {0} }  } },
sl@0
   401
		{ 3, {0x0d2A, 0x0d6b, 0x0d43}, { {0, 1, 1, {0x121e}}, {1, 2, 1, {0x1243}}, {2, 3, 2, {0x058f, 0x1233}}, {-1, 1, 1, {0} }  } },
sl@0
   402
		{ 3, {0x0d2D, 0x0d6c, 0x0d46}, { {0, 1, 1, {0x1221}}, {1, 2, 1, {0x1244}}, {2, 3, 2, {0x1234, 0x058f}}, {-1, 1, 1, {0} }  } },
sl@0
   403
		{ 3, {0x0d32, 0x0d6d, 0x0d47}, { {0, 1, 1, {0x1226}}, {1, 2, 1, {0x1245}}, {2, 3, 2, {0x1235, 0x058f}}, {-1, 1, 1, {0} }  } },
sl@0
   404
		{ 3, {0x0d34, 0x0d6e, 0x0d48}, { {0, 1, 1, {0x1228}}, {1, 2, 1, {0x1246}}, {2, 3, 2, {0x1236, 0x058f}}, {-1, 1, 1, {0} }  } },
sl@0
   405
		{ 3, {0x0d39, 0x0d6f, 0x0d4a}, { {0, 1, 1, {0x122d}}, {1, 2, 1, {0x1247}}, {2, 3, 3, {0x1234, 0x058f, 0x122e}}, {-1, 1, 1, {0} }  } },
sl@0
   406
		{ -1, {0}, -1,						-1, 0, {0}}
sl@0
   407
};
sl@0
   408
sl@0
   409
LOCAL_D const TTestInput_PositionParam6 Indic_GurmukhiAndLatin[] = {
sl@0
   410
		//	Gurmukhi sequence + Latin
sl@0
   411
		{ 3, {0x0a05, 0x0a70, 0x0077}, { {0, 2, 2, {0x12c3, 0x1308}}, {1, 2, 1, {0x1308}}, {2, 3, 1, {0x0077}}, {-1, 1, 1, {0} } } },
sl@0
   412
		//	Latin + Gurmukhi sequence
sl@0
   413
		{ 3, {0x0063, 0x0a19, 0x0a48}, { {0, 1, 1, {0x0063}}, {1, 3, 2, {0x12d1, 0x12f5}}, {2, 3, 1, {0x12f5}}, {-1, 1, 1, {0} } } },
sl@0
   414
		{ 3, {0x0064, 0x0a3f, 0x0a71}, { {0, 1, 1, {0x0064}}, {1, 2, 2, {0x12f0, 0x058f}}, {2, 3, 2, {0x058f, 0x1309}}, {-1, 1, 1, {0} } } },
sl@0
   415
		{ 3, {0x0066, 0x0a69, 0x0a3e}, { {0, 1, 1, {0x0066}}, {1, 2, 1, {0x1301}}, {2, 3, 2, {0x058f, 0x12ef}}, {-1, 1, 1, {0} } } },
sl@0
   416
		{ 3, {0x0068, 0x0a6a, 0x0a3e}, { {0, 1, 1, {0x0068}}, {1, 2, 1, {0x1302}}, {2, 3, 2, {0x058f, 0x12ef}}, {-1, 1, 1, {0} } } },
sl@0
   417
		{ 3, {0x002e, 0x0a6b, 0x0a3e}, { {0, 1, 1, {0x0772}}, {1, 2, 1, {0x1303}}, {2, 3, 2, {0x058f, 0x12ef}}, {-1, 1, 1, {0} } } },
sl@0
   418
		{ 3, {0x0074, 0x0a6c, 0x0a3e}, { {0, 1, 1, {0x0074}}, {1, 2, 1, {0x1304}}, {2, 3, 2, {0x058f, 0x12ef}}, {-1, 1, 1, {0} } } },
sl@0
   419
		{ 3, {0x002c, 0x0a6d, 0x0a3e}, { {0, 1, 1, {0x0770}}, {1, 2, 1, {0x1305}}, {2, 3, 2, {0x058f, 0x12ef}}, {-1, 1, 1, {0} } } },
sl@0
   420
		{ 3, {0x0078, 0x0a6e, 0x0a3e}, { {0, 1, 1, {0x0078}}, {1, 2, 1, {0x1306}}, {2, 3, 2, {0x058f, 0x12ef}}, {-1, 1, 1, {0} } } },
sl@0
   421
		{ 3, {0x007a, 0x0a6f, 0x0a3e}, { {0, 1, 1, {0x007a}}, {1, 2, 1, {0x1307}}, {2, 3, 2, {0x058f, 0x12ef}}, {-1, 1, 1, {0} } } },
sl@0
   422
		{ 3, {0x0a6f, 0x0a3e, 0x0078}, { {0, 1, 1, {0x1307}}, {1, 2, 2, {0x058f, 0x12ef}}, {2, 3, 1, {0x0078}}, {-1, 1, 1, {0} } } },
sl@0
   423
		{ 3, {0x0a6f, 0x0a3e, 0x002e}, { {0, 1, 1, {0x1307}}, {1, 2, 2, {0x058f, 0x12ef}}, {2, 3, 1, {0x0772}}, {-1, 1, 1, {0} } } },
sl@0
   424
		{ 3, {0x0a6f, 0x0a3e, 0x0066}, { {0, 1, 1, {0x1307}}, {1, 2, 2, {0x058f, 0x12ef}}, {2, 3, 1, {0x0066}}, {-1, 1, 1, {0} } } },
sl@0
   425
		{ -1, {0}, -1,						-1, 0, {0}}
sl@0
   426
};
sl@0
   427
sl@0
   428
sl@0
   429
LOCAL_D const TTestInput_PositionParam6 Indic_MalayalamAndLatin[] = {
sl@0
   430
		//	Malayalam sequence + Latin
sl@0
   431
		//{ 3, {0x0d05, 0x0d70, 0x0077}, { {0, 1, 1, {0x11fc}}, {1, 2, 1, {0x0000}}, {2, 3, 1, {0x0077}}, {-1, 1, 1, {0} }  } },
sl@0
   432
		//	Latin + Malayalam sequence
sl@0
   433
		{ 3, {0x0063, 0x0d19, 0x0d48}, { {0, 1, 1, {0x0063}}, {1, 3, 2, {0x1236, 0x120e}}, {2, 3, 1, {0x1236}}, {-1, 1, 1, {0} }  } },
sl@0
   434
		{ 3, {0x0066, 0x0d69, 0x0d3e}, { {0, 1, 1, {0x0066}}, {1, 2, 1, {0x1241}}, {2, 3, 2, {0x058f, 0x122e}}, {-1, 1, 1, {0} }  } },
sl@0
   435
		{ 3, {0x0068, 0x0d6a, 0x0d3e}, { {0, 1, 1, {0x0068}}, {1, 2, 1, {0x1242}}, {2, 3, 2, {0x058f, 0x122e}}, {-1, 1, 1, {0} }  } },
sl@0
   436
		{ 3, {0x002e, 0x0d6b, 0x0d3e}, { {0, 1, 1, {0x0c87}}, {1, 2, 1, {0x1243}}, {2, 3, 2, {0x058f, 0x122e}}, {-1, 1, 1, {0} }  } },
sl@0
   437
		{ 3, {0x0074, 0x0d6c, 0x0d3e}, { {0, 1, 1, {0x0074}}, {1, 2, 1, {0x1244}}, {2, 3, 2, {0x058f, 0x122e}}, {-1, 1, 1, {0} }  } },
sl@0
   438
		{ 3, {0x002c, 0x0d6d, 0x0d3e}, { {0, 1, 1, {0x0c85}}, {1, 2, 1, {0x1245}}, {2, 3, 2, {0x058f, 0x122e}}, {-1, 1, 1, {0} }  } },
sl@0
   439
		{ 3, {0x0078, 0x0d6e, 0x0d3e}, { {0, 1, 1, {0x0078}}, {1, 2, 1, {0x1246}}, {2, 3, 2, {0x058f, 0x122e}}, {-1, 1, 1, {0} }  } },
sl@0
   440
		{ 3, {0x007a, 0x0d6f, 0x0d3e}, { {0, 1, 1, {0x007a}}, {1, 2, 1, {0x1247}}, {2, 3, 2, {0x058f, 0x122e}}, {-1, 1, 1, {0} }  } },
sl@0
   441
		{ -1, {0}, -1,						-1, 0, {0}}
sl@0
   442
};
sl@0
   443
sl@0
   444
sl@0
   445
LOCAL_D const TTestInput_PositionParam6 Indic_GurmukhiModifierAfterConsonantViramaZWJ[] = {
sl@0
   446
		//	Consonant + Virama + ZWJ + Modifier
sl@0
   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} } } },
sl@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} } } },
sl@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} } } },
sl@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} } } },
sl@0
   451
		{ -1, {0}, -1,						-1, 0, {0}}
sl@0
   452
};
sl@0
   453
sl@0
   454
sl@0
   455
LOCAL_D const TTestInput_PositionParam6 Indic_MalayalamModifierAfterConsonantViramaZWJ[] = {
sl@0
   456
		//	Consonant + Virama + ZWJ + Modifier
sl@0
   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} }  } },
sl@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} }  } },
sl@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} }  } },
sl@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} }  } },
sl@0
   461
		{ -1, {0}, -1,						-1, 0, {0}}
sl@0
   462
};
sl@0
   463
sl@0
   464
LOCAL_D const TTestInput_PositionParam6 Indic_GurmukhiConsonantLeading[] = {
sl@0
   465
		//	Consonant + Nukta
sl@0
   466
		{ 2, {0x0a17, 0x0A3C}, { {0, 2, 1, {0x12fa}}, {-1, 1, 1, {0} } } },
sl@0
   467
		//	Consonant + dependent vowel, two sequences to check context shaping
sl@0
   468
		{ 2, {0x0a15, 0x0A4C}, { {0, 2, 2, {0x12cd, 0x12f7}}, {1, 2, 1, {0x12f7}}, {-1, 1, 1, {0} } } },
sl@0
   469
		{ 2, {0x0a16, 0x0A4C}, { {0, 2, 2, {0x12ce, 0x12f7}}, {1, 2, 1, {0x12f7}}, {-1, 1, 1, {0} } } },
sl@0
   470
		//	Consonant + Matra /i/, and other Matras
sl@0
   471
		{ 2, {0x0a16, 0x0A3f}, { {0, 2, 2, {0x12f0, 0x12ce}}, {1, 2, 1, {0x12f0}}, {-1, 1, 1, {0} } } },
sl@0
   472
		{ 2, {0x0a16, 0x0A3e}, { {0, 2, 2, {0x12ce, 0x12ef}}, {1, 2, 1, {0x12ef}}, {-1, 1, 1, {0} } } },
sl@0
   473
		{ 2, {0x0a16, 0x0A40}, { {0, 2, 2, {0x12ce, 0x12f1}}, {1, 2, 1, {0x12f1}}, {-1, 1, 1, {0} } } },
sl@0
   474
		{ 2, {0x0a16, 0x0A41}, { {0, 2, 2, {0x12ce, 0x12f2}}, {1, 2, 1, {0x12f2}}, {-1, 1, 1, {0} } } },
sl@0
   475
		{ 2, {0x0a16, 0x0A42}, { {0, 2, 2, {0x12ce, 0x12f3}}, {1, 2, 1, {0x12f3}}, {-1, 1, 1, {0} } } },
sl@0
   476
		{ 2, {0x0a16, 0x0A43}, { {0, 1, 1, {0x12ce}}, {1, 2, 1, {0x0000}}, {-1, 1, 1, {0} } } },
sl@0
   477
		{ 2, {0x0a16, 0x0A44}, { {0, 1, 1, {0x12ce}}, {1, 2, 1, {0x0000}}, {-1, 1, 1, {0} } } },
sl@0
   478
		{ 2, {0x0a16, 0x0A45}, { {0, 1, 1, {0x12ce}}, {1, 2, 1, {0x0000}}, {-1, 1, 1, {0} } } },
sl@0
   479
		{ 2, {0x0a16, 0x0A46}, { {0, 1, 1, {0x12ce}}, {1, 2, 1, {0x0000}}, {-1, 1, 1, {0} } } },
sl@0
   480
		{ 2, {0x0a16, 0x0A47}, { {0, 2, 2, {0x12ce, 0x12f4}}, {1, 2, 1, {0x12f4}}, {-1, 1, 1, {0} } } },
sl@0
   481
		{ 2, {0x0a16, 0x0A48}, { {0, 2, 2, {0x12ce, 0x12f5}}, {1, 2, 1, {0x12f5}}, {-1, 1, 1, {0} } } },
sl@0
   482
		{ 2, {0x0a16, 0x0A49}, { {0, 1, 1, {0x12ce}}, {1, 2, 1, {0x0000}}, {-1, 1, 1, {0} } } },
sl@0
   483
		{ 2, {0x0a16, 0x0A4a}, { {0, 1, 1, {0x12ce}}, {1, 2, 1, {0x0000}}, {-1, 1, 1, {0} } } },
sl@0
   484
		{ 2, {0x0a16, 0x0A4b}, { {0, 2, 2, {0x12ce, 0x12f6}}, {1, 2, 1, {0x12f6}}, {-1, 1, 1, {0} } } },
sl@0
   485
		{ 2, {0x0a16, 0x0A4c}, { {0, 2, 2, {0x12ce, 0x12f7}}, {1, 2, 1, {0x12f7}}, {-1, 1, 1, {0} } } },
sl@0
   486
		//0d24 + 0d4d + 0d30
sl@0
   487
		//0d28 + 0d4d + //0d24 + 0d4d + 0d30
sl@0
   488
		//0d38 + 0d4d + //0d15 + 0d4d + 0d30
sl@0
   489
		//	Consonant + Virama + HA(RA/VA/YA)
sl@0
   490
		{ 3, {0x0a15, 0x0a4d, 0x0a39}, { {0, 3, 2, {0x12cd, 0x1331}}, {1, 2, 0, {0x0000}}, {2, 3, 1, {0x1331}}, {-1, 1, 1, {0} } } },
sl@0
   491
		{ 3, {0x0a15, 0x0a4d, 0x0a30}, { {0, 3, 1, {0x13e7}}, {-1, 1, 1, {0} } } },
sl@0
   492
		{ 3, {0x0a15, 0x0a4d, 0x0a35}, { {0, 3, 2, {0x1399, 0x1333}}, {1, 2, 0, {0x0000}}, {2, 3, 1, {0x1333}}, {-1, 1, 1, {0} } } },
sl@0
   493
		{ 3, {0x0a15, 0x0a4d, 0x0a2f}, { {0, 3, 2, {0x12cd, 0x1373}}, {1, 2, 0, {0x0000}}, {2, 3, 1, {0x1373}}, {-1, 1, 1, {0} } } },
sl@0
   494
		//	Consonant + Addak
sl@0
   495
		{ 2, {0x0a16, 0x0A71}, { {0, 2, 2, {0x12ce, 0x1309}}, {1, 2, 1, {0x1309}}, {-1, 1, 1, {0} } } },
sl@0
   496
		//	Consonant + bindi
sl@0
   497
		{ 2, {0x0a16, 0x0A02}, { {0, 2, 2, {0x12ce, 0x12c1}}, {1, 2, 1, {0x12c1}}, {-1, 1, 1, {0} } } },
sl@0
   498
		{ 3, {0x0a16, 0x0a40, 0x0A02}, { {0, 3, 2, {0x12ce, 0x13f0}}, {1, 2, 1, {0x13f0}}, {-1, 1, 1, {0} } } },
sl@0
   499
		{ 3, {0x0a16, 0x0a4b, 0x0A02}, { {0, 3, 2, {0x12ce, 0x13f3}}, {1, 2, 1, {0x13f3}}, {-1, 1, 1, {0} } } },
sl@0
   500
		//	Consonant + Tippi
sl@0
   501
		{ 2, {0x0a25, 0x0A70}, { {0, 2, 2, {0x12dd, 0x1308}}, {1, 2, 1, {0x1308}}, {-1, 1, 1, {0} } } },
sl@0
   502
		{ 3, {0x0a25, 0x0a3f, 0x0A70}, { {0, 3, 3, {0x12f0, 0x12dd, 0x1308}}, {1, 2, 1, {0x12f0}}, {2, 3, 1, {0x1308}}, {-1, 1, 1, {0} } } },
sl@0
   503
		{ 3, {0x0a25, 0x0a41, 0x0A70}, { {0, 3, 3, {0x12dd, 0x12f2, 0x1308}}, {1, 2, 1, {0x12f2}}, {2, 3, 1, {0x1308}}, {-1, 1, 1, {0} } } },
sl@0
   504
		//	Nukta, corresponding consonant, Nukta pair
sl@0
   505
		{ 1, {0x0a33}, { {0, 1, 1, {0x12e9}}, {-1, 1, 1, {0} } } },
sl@0
   506
		{ 2, {0x0a32, 0x0A3c}, { {0, 2, 1, {0x12e9}}, {-1, 1, 1, {0} } } },
sl@0
   507
		{ 1, {0x0a36}, { {0, 1, 1, {0x12eb}},{-1, 1, 1, {0} } } },
sl@0
   508
		{ 2, {0x0a38, 0x0A3c}, { {0, 2, 1, {0x12eb}}, {-1, 1, 1, {0} } } },
sl@0
   509
		{ 1, {0x0a59}, { {0, 1, 1, {0x12f9}}, {-1, 1, 1, {0} } } },
sl@0
   510
		{ 2, {0x0aa1, 0x0A3c}, { {0, 1, 1, {0x096e}}, {1, 2, 2, {0x058f, 0x12ee}}, {-1, 1, 1, {0} } } },
sl@0
   511
		{ 1, {0x0a5a}, { {0, 1, 1, {0x12fa}}, {-1, 1, 1, {0} } } },
sl@0
   512
		{ 2, {0x0a17, 0x0A3c}, { {0, 2, 1, {0x12fa}}, {-1, 1, 1, {0} } } },
sl@0
   513
		{ 1, {0x0a5b}, { {0, 1, 1, {0x12fb}}, {-1, 1, 1, {0} } } },
sl@0
   514
		{ 2, {0x0a1c, 0x0A3c}, { {0, 2, 1, {0x12fb}}, {-1, 1, 1, {0} } } },
sl@0
   515
		{ 1, {0x0a5e}, { {0, 1, 1, {0x12fd}}, {-1, 1, 1, {0} } } },
sl@0
   516
		{ 2, {0x0a2b, 0x0A3c}, { {0, 2, 1, {0x12fd}}, {-1, 1, 1, {0} } } },
sl@0
   517
		{ -1, {0}, -1,						-1, 0, {0}}
sl@0
   518
};
sl@0
   519
sl@0
   520
sl@0
   521
sl@0
   522
LOCAL_D const TTestInput_PositionParam6 Indic_MalayalamConsonantLeading[] = {
sl@0
   523
		//	Consonant, and its split representation
sl@0
   524
		{ 2, {0x0d15, 0x0d14}, { {0, 1, 1, {0x120a}}, {1, 2, 1, {0x1209}}, {-1, 1, 1, {0} }  } },
sl@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} }  } },
sl@0
   526
		
sl@0
   527
		{ 2, {0x0d15, 0x0d4a}, { {0, 2, 3, {0x1234, 0x120a, 0x122e}}, {1, 2, 2, {0x1234, 0x122e}}, {-1, 1, 1, {0} }  } },
sl@0
   528
		{ 3, {0x0d15, 0x0d46, 0x0d3e}, { {0, 3, 3, {0x1234, 0x120a, 0x122e}}, {1, 2, 1, {0x1234}}, {2, 3, 1, {0x122e}}, {-1, 1, 1, {0} }  } },
sl@0
   529
sl@0
   530
		{ 2, {0x0d17, 0x0d4b}, { {0, 2, 3, {0x1235, 0x120c, 0x122e}}, {1, 2, 2, {0x1235, 0x122e}}, {-1, 1, 1, {0} } } },
sl@0
   531
		{ 3, {0x0d17, 0x0d47, 0x0d3e}, { {0, 3, 3, {0x1235, 0x120c, 0x122e}}, {1, 2, 1, {0x1235}}, {2, 3, 1, {0x122e}}, {-1, 1, 1, {0} }  } },
sl@0
   532
sl@0
   533
		{ 2, {0x0d19, 0x0d4c}, { {0, 2, 2, {0x120e, 0x123b}}, {1, 2, 1, {0x123b}}, {-1, 1, 1, {0} } } },
sl@0
   534
		{ 3, {0x0d19, 0x0d46, 0x0d57}, { {0, 3, 2, {0x120e, 0x123b}}, {1, 2, 0, {0x0000}}, {2, 3, 1, {0x123b}}, {-1, 1, 1, {0} }  } },
sl@0
   535
sl@0
   536
		//	Consonant + dependent vowel, two sequences to check context shaping
sl@0
   537
		{ 2, {0x0d15, 0x0d0a}, { {0, 1, 1, {0x120a}}, {1, 2, 1, {0x1201}}, {-1, 1, 1, {0} }  } },
sl@0
   538
		{ 2, {0x0d16, 0x0d0a}, { {0, 1, 1, {0x120b}}, {1, 2, 1, {0x1201}}, {-1, 1, 1, {0} }  } },
sl@0
   539
		
sl@0
   540
		//	Consonant + Matra /-e/, /-ee/, /-ai/ 
sl@0
   541
		{ 2, {0x0d16, 0x0d46}, { {0, 2, 2, {0x1234, 0x120b}}, {1, 2, 1, {0x1234}}, {-1, 1, 1, {0} }  } },
sl@0
   542
		{ 2, {0x0d17, 0x0d47}, { {0, 2, 2, {0x1235, 0x120c}}, {1, 2, 1, {0x1235}}, {-1, 1, 1, {0} }  } },
sl@0
   543
		{ 2, {0x0d18, 0x0d48}, { {0, 2, 2, {0x1236, 0x120d}}, {1, 2, 1, {0x1236}}, {-1, 1, 1, {0} }  } },
sl@0
   544
		
sl@0
   545
		//	Consonant and Matras /-o/, /-oo/, /-au/ to shaper
sl@0
   546
		//	Consonant and 0x0d4c (first form of Matra /-au/ ) to shaper,
sl@0
   547
		//	Consonant, 0x0d46 and 0x0d57 (second form of Matra /-au/) to shaper002E
sl@0
   548
		{ 2, {0x0d16, 0x0d4A}, { {0, 2, 3, {0x1234, 0x120b, 0x122e}}, {1, 2, 2, {0x1234, 0x122e}}, {-1, 1, 1, {0} }  } },
sl@0
   549
		{ 2, {0x0d17, 0x0d4B}, { {0, 2, 3, {0x1235, 0x120c, 0x122e}}, {1, 2, 2, {0x1235, 0x122e}}, {-1, 1, 1, {0} }  } },
sl@0
   550
		{ 2, {0x0d18, 0x0d4C}, { {0, 2, 2, {0x120d, 0x123b}}, {1, 2, 1, {0x123b}}, {-1, 1, 1, {0} }  } },
sl@0
   551
		{ 3, {0x0d15, 0x0d46, 0x0d57}, { {0, 3, 2, {0x120a, 0x123b}}, {1, 2, 0, {0x0000}}, {2, 3, 1, {0x123b}}, {-1, 1, 1, {0} }  } },
sl@0
   552
		
sl@0
   553
		//	Consonant + 0x0d4d + Consonant
sl@0
   554
		{ 3, {0x0d15, 0x0d4d, 0x0d15}, { {0, 3, 1, {0x1277}}, {-1, 1, 1, {0} }  } },
sl@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} }  } },
sl@0
   556
		
sl@0
   557
		//	Consonant (NNA, NA, RA, LA, LLA) + Virama + ZWJ to shaper
sl@0
   558
		//	KA + Virama + ZWJ to shaper.
sl@0
   559
		// 	other Consonant + Virama + ZWJ to shaper.
sl@0
   560
		{ 3, {0x0d23, 0x0d4d, 0x200d}, { {0, 3, 1, {0x1272}}, {-1, 1, 1, {0} }  } },
sl@0
   561
		{ 3, {0x0d28, 0x0d4d, 0x200d}, { {0, 3, 1, {0x1273}}, {-1, 1, 1, {0} }  } },
sl@0
   562
		{ 3, {0x0d32, 0x0d4d, 0x200d}, { {0, 3, 1, {0x1276}}, {-1, 1, 1, {0} }  } },
sl@0
   563
		{ 3, {0x0d33, 0x0d4d, 0x200d}, { {0, 3, 1, {0x1275}}, {-1, 1, 1, {0} }  } },
sl@0
   564
		{ 3, {0x0d15, 0x0d4d, 0x200d}, { {0, 3, 1, {0x1248}}, {-1, 1, 1, {0} }  } },
sl@0
   565
		{ 3, {0x0d16, 0x0d4d, 0x200d}, { {0, 3, 1, {0x1249}}, {-1, 1, 1, {0} }  } },
sl@0
   566
		
sl@0
   567
		//	RA + Virama + ZWJ to shaper,
sl@0
   568
		//	RRA + Viram + ZWJ to shaper.
sl@0
   569
		{ 3, {0x0d30, 0x0d4d, 0x200d}, { {0, 3, 1, {0x1274}}, {-1, 1, 1, {0} }  } },
sl@0
   570
		{ 3, {0x0d31, 0x0d4d, 0x200d}, { {0, 3, 1, {0x1263}}, {-1, 1, 1, {0} }  } },
sl@0
   571
		
sl@0
   572
		//	Chillu and Modifier to shaper
sl@0
   573
		//	Chillu and Virama to shaper
sl@0
   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} } } },
sl@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} } } },
sl@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} } } },
sl@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} } } },
sl@0
   578
sl@0
   579
		//	AAR
sl@0
   580
		{ 3, {0x0d06, 0x0d4d, 0x200d}, { {0, 1, 1, {0x11fd}}, {1, 2, 2, {0x058f, 0x123a}}, {-1, 1, 1, {0} }  } },
sl@0
   581
		{ 2, {0x0d06, 0x0d4d}, { {0, 1, 1, {0x11fd}}, {1, 2, 2, {0x058f, 0x123a}}, {-1, 1, 1, {0} }  } },
sl@0
   582
sl@0
   583
		//	K.KA, K.TA, K.SSA, G.NA, G.MA, 
sl@0
   584
		//	NG.KA, NG.NGA, J.JA, J.NYA, NY.NYA, TT.TTA, NN.MA, T.BHA, T.MA, 
sl@0
   585
		//	T.SA, D.DA, D.DHA, 
sl@0
   586
		//	N.TA, N.DA, N.DHA, N.NA, 
sl@0
   587
		//	M.PA, M.MA, 
sl@0
   588
		//	SH.CA, S.THA, 
sl@0
   589
		//	H.NA, H.MA and LL.LLA
sl@0
   590
		{ 3, {0x0d15, 0x0d4d, 0x0d15}, { {0, 3, 1, {0x1277}}, {-1, 1, 1, {0} } } },
sl@0
   591
		{ 3, {0x0d15, 0x0d4d, 0x0d24}, { {0, 3, 1, {0x1278}}, {-1, 1, 1, {0} } } },
sl@0
   592
		{ 3, {0x0d15, 0x0d4d, 0x0d37}, { {0, 3, 1, {0x127b}}, {-1, 1, 1, {0} } } },
sl@0
   593
		{ 3, {0x0d17, 0x0d4d, 0x0d28}, { {0, 3, 1, {0x127e}}, {-1, 1, 1, {0} } } },
sl@0
   594
		{ 3, {0x0d17, 0x0d4d, 0x0d2e}, { {0, 3, 1, {0x127d}}, {-1, 1, 1, {0} } } },
sl@0
   595
		{ 3, {0x0d19, 0x0d4d, 0x0d15}, { {0, 3, 1, {0x1280}}, {-1, 1, 1, {0} } } },
sl@0
   596
		{ 3, {0x0d19, 0x0d4d, 0x0d19}, { {0, 3, 1, {0x1281}}, {-1, 1, 1, {0} } } },
sl@0
   597
		{ 3, {0x0d1c, 0x0d4d, 0x0d1c}, { {0, 3, 1, {0x1284}}, {-1, 1, 1, {0} } } },
sl@0
   598
		{ 3, {0x0d1c, 0x0d4d, 0x0d1e}, { {0, 3, 1, {0x1285}}, {-1, 1, 1, {0} } } },
sl@0
   599
		{ 3, {0x0d1f, 0x0d4d, 0x0d1f}, { {0, 3, 1, {0x1288}}, {-1, 1, 1, {0} } } },
sl@0
   600
		{ 3, {0x0d23, 0x0d4d, 0x0d2e}, { {0, 3, 1, {0x128b}}, {-1, 1, 1, {0} } } },
sl@0
   601
		{ 3, {0x0d24, 0x0d4d, 0x0d2d}, { {0, 3, 1, {0x128e}}, {-1, 1, 1, {0} } } },
sl@0
   602
		{ 3, {0x0d24, 0x0d4d, 0x0d2e}, { {0, 3, 1, {0x128f}}, {-1, 1, 1, {0} } } },
sl@0
   603
		{ 3, {0x0d24, 0x0d4d, 0x0d38}, { {0, 3, 1, {0x1290}}, {-1, 1, 1, {0} } } },
sl@0
   604
		{ 3, {0x0d26, 0x0d4d, 0x0d26}, { {0, 3, 1, {0x1293}}, {-1, 1, 1, {0} } } },
sl@0
   605
		{ 3, {0x0d26, 0x0d4d, 0x0d27}, { {0, 3, 1, {0x1294}}, {-1, 1, 1, {0} } } },
sl@0
   606
		{ 3, {0x0d28, 0x0d4d, 0x0d24}, { {0, 3, 1, {0x129a}}, {-1, 1, 1, {0} } } },
sl@0
   607
		{ 3, {0x0d28, 0x0d4d, 0x0d26}, { {0, 3, 1, {0x1295}}, {-1, 1, 1, {0} } } },
sl@0
   608
		{ 3, {0x0d28, 0x0d4d, 0x0d27}, { {0, 3, 1, {0x1296}}, {-1, 1, 1, {0} } } },
sl@0
   609
		{ 3, {0x0d28, 0x0d4d, 0x0d28}, { {0, 3, 1, {0x1297}}, {-1, 1, 1, {0} } } },
sl@0
   610
		{ 3, {0x0d2e, 0x0d4d, 0x0d2a}, { {0, 3, 1, {0x12a4}}, {-1, 1, 1, {0} } } },
sl@0
   611
		{ 3, {0x0d2e, 0x0d4d, 0x0d2e}, { {0, 3, 1, {0x12a3}}, {-1, 1, 1, {0} } } },
sl@0
   612
		{ 3, {0x0d36, 0x0d4d, 0x0d1a}, { {0, 3, 1, {0x12ab}}, {-1, 1, 1, {0} } } },
sl@0
   613
		{ 3, {0x0d38, 0x0d4d, 0x0d25}, { {0, 3, 1, {0x12b1}}, {-1, 1, 1, {0} } } },
sl@0
   614
		{ 3, {0x0d39, 0x0d4d, 0x0d28}, { {0, 3, 1, {0x12b4}}, {-1, 1, 1, {0} } } },
sl@0
   615
		{ 3, {0x0d39, 0x0d4d, 0x0d2e}, { {0, 3, 1, {0x12b3}}, {-1, 1, 1, {0} } } },
sl@0
   616
		{ 3, {0x0d33, 0x0d4d, 0x0d23}, { {0, 3, 2, {0x1265, 0x1218}}, {1, 2, 0, {0x0000}}, {2, 3, 1, {0x1218}}, {-1, 1, 1, {0} } } },
sl@0
   617
		
sl@0
   618
		//	One of (KA, GA, PA, BA, MA, LA, SHA, SA, HA), Virama and LA to shaper
sl@0
   619
		{ 3, {0x0d15, 0x0d4d, 0x0d32}, { {0, 3, 1, {0x127a}}, {-1, 1, 1, {0} } } },
sl@0
   620
		{ 3, {0x0d17, 0x0d4d, 0x0d32}, { {0, 3, 1, {0x127f}}, {-1, 1, 1, {0} } } },
sl@0
   621
		{ 3, {0x0d2a, 0x0d4d, 0x0d32}, { {0, 3, 1, {0x129d}}, {-1, 1, 1, {0} } } },
sl@0
   622
		{ 3, {0x0d2c, 0x0d4d, 0x0d32}, { {0, 3, 1, {0x12a2}}, {-1, 1, 1, {0} } } },
sl@0
   623
		{ 3, {0x0d2e, 0x0d4d, 0x0d32}, { {0, 3, 1, {0x12a5}}, {-1, 1, 1, {0} } } },
sl@0
   624
		{ 3, {0x0d32, 0x0d4d, 0x0d32}, { {0, 3, 1, {0x12a8}}, {-1, 1, 1, {0} } } },
sl@0
   625
		{ 3, {0x0d36, 0x0d4d, 0x0d32}, { {0, 3, 1, {0x12ad}}, {-1, 1, 1, {0} } } },
sl@0
   626
		{ 3, {0x0d38, 0x0d4d, 0x0d32}, { {0, 3, 1, {0x12b2}}, {-1, 1, 1, {0} } } },
sl@0
   627
		{ 3, {0x0d39, 0x0d4d, 0x0d32}, { {0, 3, 1, {0x12b5}}, {-1, 1, 1, {0} } } },
sl@0
   628
		
sl@0
   629
		//	CA, Virama and CA to shaper
sl@0
   630
		//	BA, Virama and BA to shaper
sl@0
   631
		//	YA, Virama and YA to shaper
sl@0
   632
		//	VA, Virama and VA to shaper
sl@0
   633
		//	other Consonant, Virama and the same Consonant to shaper.
sl@0
   634
		{ 3, {0x0d1a, 0x0d4d, 0x0d1a}, { {0, 3, 1, {0x1282}}, {-1, 1, 1, {0} } } },
sl@0
   635
		{ 3, {0x0d2c, 0x0d4d, 0x0d2c}, { {0, 3, 1, {0x129f}}, {-1, 1, 1, {0} } } },
sl@0
   636
		{ 3, {0x0d2f, 0x0d4d, 0x0d2f}, { {0, 3, 1, {0x12a6}}, {-1, 1, 1, {0} } } },
sl@0
   637
		{ 3, {0x0d35, 0x0d4d, 0x0d35}, { {0, 3, 1, {0x12aa}}, {-1, 1, 1, {0} } } },
sl@0
   638
		{ 3, {0x0d15, 0x0d4d, 0x0d15}, { {0, 3, 1, {0x1277}}, {-1, 1, 1, {0} } } },
sl@0
   639
sl@0
   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
sl@0
   641
		{ 3, {0x0d17, 0x0d4d, 0x0d17}, { {0, 3, 1, {0x127c}}, {-1, 1, 1, {0} } } },
sl@0
   642
		{ 3, {0x0d2c, 0x0d4d, 0x0d26}, { {0, 3, 1, {0x12a0}}, {-1, 1, 1, {0} } } },
sl@0
   643
		{ 3, {0x0d1a, 0x0d4d, 0x0d1b}, { {0, 3, 1, {0x1283}}, {-1, 1, 1, {0} } } },
sl@0
   644
		{ 3, {0x0d2c, 0x0d4d, 0x0d27}, { {0, 3, 1, {0x12a1}}, {-1, 1, 1, {0} } } },
sl@0
   645
		{ 3, {0x0d15, 0x0d4d, 0x0d1f}, { {0, 3, 1, {0x1279}}, {-1, 1, 1, {0} } } },
sl@0
   646
		{ 3, {0x0d2a, 0x0d4d, 0x0d2a}, { {0, 3, 1, {0x129c}}, {-1, 1, 1, {0} } } },
sl@0
   647
		{ 3, {0x0d37, 0x0d4d, 0x0d1f}, { {0, 3, 1, {0x12ae}}, {-1, 1, 1, {0} } } },
sl@0
   648
		{ 3, {0x0d31, 0x0d4d, 0x0d31}, { {0, 3, 1, {0x12a7}}, {-1, 1, 1, {0} } } },
sl@0
   649
		{ 3, {0x0d21, 0x0d4d, 0x0d21}, { {0, 3, 1, {0x1289}}, {-1, 1, 1, {0} } } },
sl@0
   650
		{ 3, {0x0d36, 0x0d4d, 0x0d36}, { {0, 3, 1, {0x12ac}}, {-1, 1, 1, {0} } } },
sl@0
   651
		{ 3, {0x0d23, 0x0d4d, 0x0d23}, { {0, 3, 1, {0x128c}}, {-1, 1, 1, {0} } } },
sl@0
   652
		{ 3, {0x0d38, 0x0d4d, 0x0d38}, { {0, 3, 1, {0x12b0}}, {-1, 1, 1, {0} } } },
sl@0
   653
		
sl@0
   654
		
sl@0
   655
		//	Consonant clusters from REQ1.3.11 to shaper.
sl@0
   656
		//	Already covered in other sequence
sl@0
   657
		//	S.RR.RRA to shaper,
sl@0
   658
		//	N.RR.RRA to shaper
sl@0
   659
		{ 5, {0x0d38, 0x0d4d, 0x0d31, 0x0d4d, 0x0d31}, { {0, 5, 1, {0x12af}}, {-1, 1, 1, {0} } } },
sl@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} } } },
sl@0
   661
		
sl@0
   662
		//	N.RRA
sl@0
   663
		{ 4, {0x0d28, 0x0d4d, 0x200d, 0x0d31}, { {0, 4, 1, {0x1299}}, {-1, 1, 1, {0} } } },
sl@0
   664
		
sl@0
   665
		//	NA, Virama, ZWJ, RRA to shaper
sl@0
   666
		//	NA, Virama, ZWJ, ZWNJ, RRA to shaper
sl@0
   667
		{ 4, {0x0d28, 0x0d4d, 0x200d, 0x0d31}, { {0, 4, 1, {0x1299}}, {-1, 1, 1, {0} } } },
sl@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} } } },
sl@0
   669
		
sl@0
   670
		//	Consonant cluster and YA to shaper
sl@0
   671
		//	Consonant cluster and VA to shaper
sl@0
   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} } } },
sl@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} } } },
sl@0
   674
		
sl@0
   675
		//	YA, YAKAR to shaper
sl@0
   676
		//	VA, VAKAR to shaper
sl@0
   677
		{ 3, {0x0d15, 0x0d4d, 0x0d2f}, { {0, 3, 2, {0x120a, 0x126f}}, {1, 2, 0, {0x0000}}, {2, 3, 1, {0x126f}}, {-1, 1, 1, {0} } } },
sl@0
   678
		{ 3, {0x0d15, 0x0d4d, 0x0d35}, { {0, 3, 2, {0x120a, 0x1270}}, {1, 2, 0, {0x0000}}, {2, 3, 1, {0x1270}}, {-1, 1, 1, {0} } } },
sl@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} } } },
sl@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} } } },
sl@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} } } },
sl@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} } } },
sl@0
   683
sl@0
   684
		//	one of (LLA, LLLA, RRA) and YA to shaper
sl@0
   685
		//	one of (LLA, LLLA, RRA) and VA to shaper
sl@0
   686
		{ 2, {0x0d33, 0x0d2f}, { {0, 1, 1, {0x1227}}, {1, 2, 1, {0x1223}}, {-1, 1, 1, {0} } } },
sl@0
   687
		{ 2, {0x0d34, 0x0d2f}, { {0, 1, 1, {0x1228}}, {1, 2, 1, {0x1223}}, {-1, 1, 1, {0} } } },
sl@0
   688
		{ 2, {0x0d31, 0x0d2f}, { {0, 1, 1, {0x1225}}, {1, 2, 1, {0x1223}}, {-1, 1, 1, {0} } } },
sl@0
   689
		{ 2, {0x0d33, 0x0d35}, { {0, 1, 1, {0x1227}}, {1, 2, 1, {0x1229}}, {-1, 1, 1, {0} } } },
sl@0
   690
		{ 2, {0x0d34, 0x0d35}, { {0, 1, 1, {0x1228}}, {1, 2, 1, {0x1229}}, {-1, 1, 1, {0} } } },
sl@0
   691
		{ 2, {0x0d31, 0x0d35}, { {0, 1, 1, {0x1225}}, {1, 2, 1, {0x1229}}, {-1, 1, 1, {0} } } },
sl@0
   692
		//	KSSA
sl@0
   693
		//0d15, 0d4d, 0d37
sl@0
   694
		//	Consonant cluster and RA to shaper
sl@0
   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} } } },
sl@0
   696
sl@0
   697
		//	one of (LLA, LLLA, RRA) and RA to shaper
sl@0
   698
		{ 2, {0x0d33, 0x0d30}, { {0, 1, 1, {0x1227}}, {1, 2, 1, {0x1224}}, {-1, 1, 1, {0} } } },
sl@0
   699
		{ 2, {0x0d34, 0x0d30}, { {0, 1, 1, {0x1228}}, {1, 2, 1, {0x1224}}, {-1, 1, 1, {0} } } },
sl@0
   700
		{ 2, {0x0d31, 0x0d30}, { {0, 1, 1, {0x1225}}, {1, 2, 1, {0x1224}}, {-1, 1, 1, {0} } } },
sl@0
   701
		
sl@0
   702
		//	YAKAR/VAKAR and RA to shaper.
sl@0
   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} } } },
sl@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} } } },
sl@0
   705
sl@0
   706
		//	Chillu
sl@0
   707
		//	Chillu and Vowel to shaper
sl@0
   708
		//	Chillu and Consonant to shaper
sl@0
   709
		//	Chillu and Modifier to shaper
sl@0
   710
		//	Chillu and Virama to shaper
sl@0
   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} } } },
sl@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} } } },
sl@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} } } },
sl@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} } } },
sl@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} } } },
sl@0
   716
sl@0
   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} } } },
sl@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} } } },
sl@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} } } },
sl@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} } } },
sl@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} } } },
sl@0
   722
sl@0
   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} } } },
sl@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} } } },
sl@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} } } },
sl@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} } } },
sl@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} } } },
sl@0
   728
sl@0
   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} } } },
sl@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} } } },
sl@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} } } },
sl@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} } } },
sl@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} } } },
sl@0
   734
sl@0
   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} } } },
sl@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} } } },
sl@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} } } },
sl@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} } } },
sl@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} } } },
sl@0
   740
		{ -1, {0}, -1,						-1, 0, {0}}
sl@0
   741
};
sl@0
   742
sl@0
   743
LOCAL_D const TTestInput_PositionParam6 Indic_GurmukhiVowelLeading[] = {
sl@0
   744
		//	ARA, IRI, URA, independent vowel to shaper
sl@0
   745
		{ 1, {0x0a05}, { {0, 1, 1, {0x12c3}}, {-1, 1, 1, {0} } } },
sl@0
   746
		{ 1, {0x0a06}, { {0, 1, 1, {0x12c4}}, {-1, 1, 1, {0} } } },
sl@0
   747
		{ 1, {0x0a07}, { {0, 1, 1, {0x12c5}}, {-1, 1, 1, {0} } } },
sl@0
   748
		{ 1, {0x0a08}, { {0, 1, 1, {0x12c6}}, {-1, 1, 1, {0} } } },		
sl@0
   749
		{ 1, {0x0a09}, { {0, 1, 1, {0x12c7}}, {-1, 1, 1, {0} } } },
sl@0
   750
		{ 1, {0x0a0a}, { {0, 1, 1, {0x12c8}}, {-1, 1, 1, {0} } } },
sl@0
   751
		{ 1, {0x0a0b}, { {0, 1, 1, {0x0000}}, {-1, 1, 1, {0} } } },
sl@0
   752
		{ 1, {0x0a0c}, { {0, 1, 1, {0x0000}}, {-1, 1, 1, {0} } } },
sl@0
   753
		{ 1, {0x0a0d}, { {0, 1, 1, {0x0000}}, {-1, 1, 1, {0} } } },
sl@0
   754
		{ 1, {0x0a0e}, { {0, 1, 1, {0x0000}}, {-1, 1, 1, {0} } } },
sl@0
   755
		{ 1, {0x0a0f}, { {0, 1, 1, {0x12c9}}, {-1, 1, 1, {0} } } },
sl@0
   756
		{ 1, {0x0a10}, { {0, 1, 1, {0x12ca}}, {-1, 1, 1, {0} } } },
sl@0
   757
		{ 1, {0x0a11}, { {0, 1, 1, {0x0000}}, {-1, 1, 1, {0} } } },
sl@0
   758
		{ 1, {0x0a12}, { {0, 1, 1, {0x0000}}, {-1, 1, 1, {0} } } },
sl@0
   759
		{ 1, {0x0a13}, { {0, 1, 1, {0x12cb}}, {-1, 1, 1, {0} } } },
sl@0
   760
		{ 1, {0x0a14}, { {0, 1, 1, {0x12cc}}, {-1, 1, 1, {0} } } },
sl@0
   761
		{ 1, {0x0a72}, { {0, 1, 1, {0x130a}}, {-1, 1, 1, {0} } } },
sl@0
   762
		{ 1, {0x0a73}, { {0, 1, 1, {0x130b}}, {-1, 1, 1, {0} } } },
sl@0
   763
		//	Valid bear + vowel
sl@0
   764
		{ 2, {0x0a05, 0x0a3e}, { {0, 2, 2, {0x12c3, 0x12ef}}, {1, 2, 1, {0x12ef}}, {-1, 1, 1, {0} } } },
sl@0
   765
		{ 2, {0x0a05, 0x0a48}, { {0, 2, 2, {0x12c3, 0x12f5}}, {1, 2, 1, {0x12f5}}, {-1, 1, 1, {0} } } },
sl@0
   766
		{ 2, {0x0a05, 0x0a4c}, { {0, 2, 2, {0x12c3, 0x12f7}}, {1, 2, 1, {0x12f7}}, {-1, 1, 1, {0} } } },
sl@0
   767
		{ 2, {0x0a72, 0x0a3f}, { {0, 2, 2, {0x12f0, 0x130a}}, {1, 2, 1, {0x12f0}}, {-1, 1, 1, {0} } } },
sl@0
   768
		{ 2, {0x0a72, 0x0a40}, { {0, 2, 2, {0x130a, 0x12f1}}, {1, 2, 1, {0x12f1}}, {-1, 1, 1, {0} } } },
sl@0
   769
		{ 2, {0x0a72, 0x0a47}, { {0, 2, 2, {0x130a, 0x12f4}}, {1, 2, 1, {0x12f4}}, {-1, 1, 1, {0} } } },
sl@0
   770
		{ 2, {0x0a73, 0x0a41}, { {0, 2, 1, {0x12c7}}, {-1, 1, 1, {0} } } },
sl@0
   771
		{ 2, {0x0a73, 0x0a42}, { {0, 2, 1, {0x12c8}}, {-1, 1, 1, {0} } } },
sl@0
   772
		{ 2, {0x0a73, 0x0a4b}, { {0, 2, 1, {0x12cb}}, {-1, 1, 1, {0} } } },
sl@0
   773
		//	Invalid bear + vowel sequence
sl@0
   774
		{ 2, {0x0a72, 0x0a4b}, { {0, 1, 1, {0x130a}}, {1, 2, 2, {0x058f, 0x12f6}}, {-1, 1, 1, {0} } } },
sl@0
   775
		{ 2, {0x0a05, 0x0a4b}, { {0, 1, 1, {0x12c3}}, {1, 2, 2, {0x058f, 0x12f6}}, {-1, 1, 1, {0} } } },
sl@0
   776
		{ 2, {0x0a73, 0x0a3f}, { {0, 1, 1, {0x130b}}, {1, 2, 2, {0x12f0, 0x058f}}, {-1, 1, 1, {0} } } },
sl@0
   777
		{ -1, {0}, -1,						-1, 0, {0}}
sl@0
   778
};
sl@0
   779
sl@0
   780
sl@0
   781
LOCAL_D const TTestInput_PositionParam6 Indic_MalayalamVowelLeading[] = {
sl@0
   782
		//	Vowel
sl@0
   783
		{ 1, {0x0d05}, { {0, 1, 1, {0x11fc}}, {-1, 1, 1, {0} } } },
sl@0
   784
		{ 1, {0x0d06}, { {0, 1, 1, {0x11fd}}, {-1, 1, 1, {0} } } },
sl@0
   785
		{ 1, {0x0d07}, { {0, 1, 1, {0x11fe}}, {-1, 1, 1, {0} } } },
sl@0
   786
		{ 1, {0x0d08}, { {0, 1, 1, {0x11ff}}, {-1, 1, 1, {0} } } },
sl@0
   787
		{ 1, {0x0d09}, { {0, 1, 1, {0x1200}}, {-1, 1, 1, {0} } } },
sl@0
   788
		{ 1, {0x0d0a}, { {0, 1, 1, {0x1201}}, {-1, 1, 1, {0} } } },
sl@0
   789
		{ 1, {0x0d0b}, { {0, 1, 1, {0x1202}}, {-1, 1, 1, {0} } } },
sl@0
   790
		{ 1, {0x0d60}, { {0, 1, 1, {0x123c}}, {-1, 1, 1, {0} } } },
sl@0
   791
		{ 1, {0x0d0c}, { {0, 1, 1, {0x1203}}, {-1, 1, 1, {0} } } },
sl@0
   792
		{ 1, {0x0d61}, { {0, 1, 1, {0x123d}}, {-1, 1, 1, {0} } } },
sl@0
   793
		{ 1, {0x0d0e}, { {0, 1, 1, {0x1204}}, {-1, 1, 1, {0} } } },
sl@0
   794
		{ 1, {0x0d0f}, { {0, 1, 1, {0x1205}}, {-1, 1, 1, {0} } } },
sl@0
   795
		{ 1, {0x0d10}, { {0, 1, 1, {0x1206}}, {-1, 1, 1, {0} } } },
sl@0
   796
		{ 1, {0x0d12}, { {0, 1, 1, {0x1207}}, {-1, 1, 1, {0} } } },
sl@0
   797
		{ 1, {0x0d13}, { {0, 1, 1, {0x1208}}, {-1, 1, 1, {0} } } },
sl@0
   798
		{ 1, {0x0d14}, { {0, 1, 1, {0x1209}}, {-1, 1, 1, {0} } } },
sl@0
   799
		//	Vowel + modifer 
sl@0
   800
		{ 2, {0x0d05, 0x0d02}, { {0, 2, 2, {0x11fc, 0x11fa}}, {1, 2, 1, {0x11fa}}, {-1, 1, 1, {0} } } },
sl@0
   801
		{ 2, {0x0d06, 0x0d02}, { {0, 2, 2, {0x11fd, 0x11fa}}, {1, 2, 1, {0x11fa}}, {-1, 1, 1, {0} } } },
sl@0
   802
		{ 2, {0x0d07, 0x0d02}, { {0, 2, 2, {0x11fe, 0x11fa}}, {1, 2, 1, {0x11fa}}, {-1, 1, 1, {0} } } },
sl@0
   803
		{ 2, {0x0d08, 0x0d02}, { {0, 2, 2, {0x11ff, 0x11fa}}, {1, 2, 1, {0x11fa}}, {-1, 1, 1, {0} } } },
sl@0
   804
		{ 2, {0x0d09, 0x0d02}, { {0, 2, 2, {0x1200, 0x11fa}}, {1, 2, 1, {0x11fa}}, {-1, 1, 1, {0} } } },
sl@0
   805
		{ 2, {0x0d0a, 0x0d02}, { {0, 2, 2, {0x1201, 0x11fa}}, {1, 2, 1, {0x11fa}}, {-1, 1, 1, {0} } } },
sl@0
   806
		{ 2, {0x0d0b, 0x0d02}, { {0, 2, 2, {0x1202, 0x11fa}}, {1, 2, 1, {0x11fa}}, {-1, 1, 1, {0} } } },
sl@0
   807
		{ 2, {0x0d60, 0x0d02}, { {0, 2, 2, {0x123c, 0x11fa}}, {1, 2, 1, {0x11fa}}, {-1, 1, 1, {0} } } },
sl@0
   808
		{ 2, {0x0d0c, 0x0d03}, { {0, 2, 2, {0x1203, 0x11fb}}, {1, 2, 1, {0x11fb}}, {-1, 1, 1, {0} } } },
sl@0
   809
		{ 2, {0x0d61, 0x0d03}, { {0, 2, 2, {0x123d, 0x11fb}}, {1, 2, 1, {0x11fb}}, {-1, 1, 1, {0} } } },
sl@0
   810
		{ 2, {0x0d0e, 0x0d03}, { {0, 2, 2, {0x1204, 0x11fb}}, {1, 2, 1, {0x11fb}}, {-1, 1, 1, {0} } } },
sl@0
   811
		{ 2, {0x0d0f, 0x0d03}, { {0, 2, 2, {0x1205, 0x11fb}}, {1, 2, 1, {0x11fb}}, {-1, 1, 1, {0} } } },
sl@0
   812
		{ 2, {0x0d10, 0x0d03}, { {0, 2, 2, {0x1206, 0x11fb}}, {1, 2, 1, {0x11fb}}, {-1, 1, 1, {0} } } },
sl@0
   813
		{ 2, {0x0d12, 0x0d03}, { {0, 2, 2, {0x1207, 0x11fb}}, {1, 2, 1, {0x11fb}}, {-1, 1, 1, {0} } } },
sl@0
   814
		{ 2, {0x0d13, 0x0d03}, { {0, 2, 2, {0x1208, 0x11fb}}, {1, 2, 1, {0x11fb}}, {-1, 1, 1, {0} } } },
sl@0
   815
		{ 2, {0x0d14, 0x0d03}, { {0, 2, 2, {0x1209, 0x11fb}}, {1, 2, 1, {0x11fb}}, {-1, 1, 1, {0} } } },
sl@0
   816
		//	Vowel, Modifier, Matra
sl@0
   817
		{ 3, {0x0d05, 0x0d02, 0x0d3e}, { {0, 2, 2, {0x11fc, 0x11fa}}, {1, 2, 1, {0x11fa}}, {2, 3, 2, {0x058f, 0x122e}}, {-1, 1, 1, {0} } } },
sl@0
   818
		{ 3, {0x0d06, 0x0d02, 0x0d3f}, { {0, 2, 2, {0x11fd, 0x11fa}}, {1, 2, 1, {0x11fa}}, {2, 3, 2, {0x058f, 0x122f}}, {-1, 1, 1, {0} } } },
sl@0
   819
		{ 3, {0x0d07, 0x0d02, 0x0d40}, { {0, 2, 2, {0x11fe, 0x11fa}}, {1, 2, 1, {0x11fa}}, {2, 3, 2, {0x058f, 0x1230}}, {-1, 1, 1, {0} } } },
sl@0
   820
		{ 3, {0x0d08, 0x0d02, 0x0d41}, { {0, 2, 2, {0x11ff, 0x11fa}}, {1, 2, 1, {0x11fa}}, {2, 3, 2, {0x058f, 0x1231}}, {-1, 1, 1, {0} } } },
sl@0
   821
		{ 3, {0x0d09, 0x0d02, 0x0d42}, { {0, 2, 2, {0x1200, 0x11fa}}, {1, 2, 1, {0x11fa}}, {2, 3, 2, {0x058f, 0x1232}}, {-1, 1, 1, {0} } } },
sl@0
   822
		{ 3, {0x0d0a, 0x0d02, 0x0d43}, { {0, 2, 2, {0x1201, 0x11fa}}, {1, 2, 1, {0x11fa}}, {2, 3, 2, {0x058f, 0x1233}}, {-1, 1, 1, {0} } } },
sl@0
   823
		{ 3, {0x0d0b, 0x0d02, 0x0d46}, { {0, 2, 2, {0x1202, 0x11fa}}, {1, 2, 1, {0x11fa}}, {2, 3, 2, {0x1234, 0x058f}}, {-1, 1, 1, {0} } } },
sl@0
   824
		{ 3, {0x0d60, 0x0d02, 0x0d47}, { {0, 2, 2, {0x123c, 0x11fa}}, {1, 2, 1, {0x11fa}}, {2, 3, 2, {0x1235, 0x058f}}, {-1, 1, 1, {0} } } },
sl@0
   825
		{ 3, {0x0d0c, 0x0d03, 0x0d48}, { {0, 2, 2, {0x1203, 0x11fb}}, {1, 2, 1, {0x11fb}}, {2, 3, 2, {0x1236, 0x058f}}, {-1, 1, 1, {0} } } },
sl@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} } } },
sl@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} } } },
sl@0
   828
		{ 3, {0x0d0f, 0x0d03, 0x0d4c}, { {0, 2, 2, {0x1205, 0x11fb}}, {1, 2, 1, {0x11fb}}, {2, 3, 2, {0x058f, 0x123b}}, {-1, 1, 1, {0} } } },
sl@0
   829
		{ 3, {0x0d10, 0x0d03, 0x0d3e}, { {0, 2, 2, {0x1206, 0x11fb}}, {1, 2, 1, {0x11fb}}, {2, 3, 2, {0x058f, 0x122e}}, {-1, 1, 1, {0} } } },
sl@0
   830
		{ 3, {0x0d12, 0x0d03, 0x0d3f}, { {0, 2, 2, {0x1207, 0x11fb}}, {1, 2, 1, {0x11fb}}, {2, 3, 2, {0x058f, 0x122f}}, {-1, 1, 1, {0} } } },
sl@0
   831
		{ 3, {0x0d13, 0x0d03, 0x0d40}, { {0, 2, 2, {0x1208, 0x11fb}}, {1, 2, 1, {0x11fb}}, {2, 3, 2, {0x058f, 0x1230}}, {-1, 1, 1, {0} } } },
sl@0
   832
		{ 3, {0x0d14, 0x0d03, 0x0d4c}, { {0, 2, 2, {0x1209, 0x11fb}}, {1, 2, 1, {0x11fb}}, {2, 3, 2, {0x058f, 0x123b}}, {-1, 1, 1, {0} } } },
sl@0
   833
		
sl@0
   834
		//	Vowel, Virama,
sl@0
   835
		{ 2, {0x0d05, 0x0d4d}, { {0, 1, 1, {0x11fc}}, {1, 2, 2, {0x058f, 0x123a}}, {-1, 1, 1, {0} } } },
sl@0
   836
		{ 2, {0x0d06, 0x0d4d}, { {0, 1, 1, {0x11fd}}, {1, 2, 2, {0x058f, 0x123a}}, {-1, 1, 1, {0} } } },
sl@0
   837
		{ 2, {0x0d07, 0x0d4d}, { {0, 1, 1, {0x11fe}}, {1, 2, 2, {0x058f, 0x123a}}, {-1, 1, 1, {0} } } },
sl@0
   838
		{ 2, {0x0d08, 0x0d4d}, { {0, 1, 1, {0x11ff}}, {1, 2, 2, {0x058f, 0x123a}}, {-1, 1, 1, {0} } } },
sl@0
   839
		{ 2, {0x0d09, 0x0d4d}, { {0, 1, 1, {0x1200}}, {1, 2, 2, {0x058f, 0x123a}}, {-1, 1, 1, {0} } } },
sl@0
   840
		{ 2, {0x0d0a, 0x0d4d}, { {0, 1, 1, {0x1201}}, {1, 2, 2, {0x058f, 0x123a}}, {-1, 1, 1, {0} } } },
sl@0
   841
		{ 2, {0x0d0b, 0x0d4d}, { {0, 1, 1, {0x1202}}, {1, 2, 2, {0x058f, 0x123a}}, {-1, 1, 1, {0} } } },
sl@0
   842
		{ 2, {0x0d60, 0x0d4d}, { {0, 1, 1, {0x123c}}, {1, 2, 2, {0x058f, 0x123a}}, {-1, 1, 1, {0} } } },
sl@0
   843
		{ 2, {0x0d0c, 0x0d4d}, { {0, 1, 1, {0x1203}}, {1, 2, 2, {0x058f, 0x123a}}, {-1, 1, 1, {0} } } },
sl@0
   844
		{ 2, {0x0d61, 0x0d4d}, { {0, 1, 1, {0x123d}}, {1, 2, 2, {0x058f, 0x123a}}, {-1, 1, 1, {0} } } },
sl@0
   845
		{ 2, {0x0d0e, 0x0d4d}, { {0, 1, 1, {0x1204}}, {1, 2, 2, {0x058f, 0x123a}}, {-1, 1, 1, {0} } } },
sl@0
   846
		{ 2, {0x0d0f, 0x0d4d}, { {0, 1, 1, {0x1205}}, {1, 2, 2, {0x058f, 0x123a}}, {-1, 1, 1, {0} } } },
sl@0
   847
		{ 2, {0x0d10, 0x0d4d}, { {0, 1, 1, {0x1206}}, {1, 2, 2, {0x058f, 0x123a}}, {-1, 1, 1, {0} } } },
sl@0
   848
		{ 2, {0x0d12, 0x0d4d}, { {0, 1, 1, {0x1207}}, {1, 2, 2, {0x058f, 0x123a}}, {-1, 1, 1, {0} } } },
sl@0
   849
		{ 2, {0x0d13, 0x0d4d}, { {0, 1, 1, {0x1208}}, {1, 2, 2, {0x058f, 0x123a}}, {-1, 1, 1, {0} } } },
sl@0
   850
		{ 2, {0x0d14, 0x0d4d}, { {0, 1, 1, {0x1209}}, {1, 2, 2, {0x058f, 0x123a}}, {-1, 1, 1, {0} } } },
sl@0
   851
sl@0
   852
		//	Vowel, Matra,
sl@0
   853
		{ 2, {0x0d05, 0x0d3e}, { {0, 1, 1, {0x11fc}}, {1, 2, 2, {0x058f, 0x122e}}, {-1, 1, 1, {0} } } },
sl@0
   854
		{ 2, {0x0d06, 0x0d3f}, { {0, 1, 1, {0x11fd}}, {1, 2, 2, {0x058f, 0x122f}}, {-1, 1, 1, {0} } } },
sl@0
   855
		{ 2, {0x0d07, 0x0d40}, { {0, 1, 1, {0x11fe}}, {1, 2, 2, {0x058f, 0x1230}}, {-1, 1, 1, {0} } } },
sl@0
   856
		{ 2, {0x0d08, 0x0d41}, { {0, 1, 1, {0x11ff}}, {1, 2, 2, {0x058f, 0x1231}}, {-1, 1, 1, {0} } } },
sl@0
   857
		{ 2, {0x0d09, 0x0d42}, { {0, 1, 1, {0x1200}}, {1, 2, 2, {0x058f, 0x1232}}, {-1, 1, 1, {0} } } },
sl@0
   858
		{ 2, {0x0d0a, 0x0d43}, { {0, 1, 1, {0x1201}}, {1, 2, 2, {0x058f, 0x1233}}, {-1, 1, 1, {0} } } },
sl@0
   859
		{ 2, {0x0d0b, 0x0d46}, { {0, 1, 1, {0x1202}}, {1, 2, 2, {0x1234, 0x058f}}, {-1, 1, 1, {0} } } },
sl@0
   860
		{ 2, {0x0d60, 0x0d47}, { {0, 1, 1, {0x123c}}, {1, 2, 2, {0x1235, 0x058f}}, {-1, 1, 1, {0} } } },
sl@0
   861
		{ 2, {0x0d0c, 0x0d48}, { {0, 1, 1, {0x1203}}, {1, 2, 2, {0x1236, 0x058f}}, {-1, 1, 1, {0} } } },
sl@0
   862
		{ 2, {0x0d61, 0x0d4a}, { {0, 1, 1, {0x123d}}, {1, 2, 3, {0x1234, 0x058f, 0x122e}}, {-1, 1, 1, {0} } } },
sl@0
   863
		{ 2, {0x0d0e, 0x0d4b}, { {0, 1, 1, {0x1204}}, {1, 2, 3, {0x1235, 0x058f, 0x122e}}, {-1, 1, 1, {0} } } },
sl@0
   864
		{ 2, {0x0d0f, 0x0d4c}, { {0, 1, 1, {0x1205}}, {1, 2, 2, {0x058f, 0x123b}}, {-1, 1, 1, {0} } } },
sl@0
   865
		{ 2, {0x0d10, 0x0d3e}, { {0, 1, 1, {0x1206}}, {1, 2, 2, {0x058f, 0x122e}}, {-1, 1, 1, {0} } } },
sl@0
   866
		{ 2, {0x0d12, 0x0d3f}, { {0, 1, 1, {0x1207}}, {1, 2, 2, {0x058f, 0x122f}}, {-1, 1, 1, {0} } } },
sl@0
   867
		{ 2, {0x0d13, 0x0d40}, { {0, 1, 1, {0x1208}}, {1, 2, 2, {0x058f, 0x1230}}, {-1, 1, 1, {0} } } },
sl@0
   868
		{ 2, {0x0d14, 0x0d4c}, { {0, 1, 1, {0x1209}}, {1, 2, 2, {0x058f, 0x123b}}, {-1, 1, 1, {0} } } },
sl@0
   869
		//	Vowel Virma, Matra
sl@0
   870
		{ 3, {0x0d05, 0x0d4d, 0x0d3e}, { {0, 1, 1, {0x11fc}}, {1, 2, 2, {0x058f, 0x123a}}, {2, 3, 2, {0x058f, 0x122e}}, {-1, 1, 1, {0} } } },
sl@0
   871
		{ 3, {0x0d06, 0x0d4d, 0x0d3f}, { {0, 1, 1, {0x11fd}}, {1, 2, 2, {0x058f, 0x123a}}, {2, 3, 2, {0x058f, 0x122f}}, {-1, 1, 1, {0} } } },
sl@0
   872
		{ 3, {0x0d07, 0x0d4d, 0x0d40}, { {0, 1, 1, {0x11fe}}, {1, 2, 2, {0x058f, 0x123a}}, {2, 3, 2, {0x058f, 0x1230}}, {-1, 1, 1, {0} } } },
sl@0
   873
		{ 3, {0x0d08, 0x0d4d, 0x0d41}, { {0, 1, 1, {0x11ff}}, {1, 2, 2, {0x058f, 0x123a}}, {2, 3, 2, {0x058f, 0x1231}}, {-1, 1, 1, {0} } } },
sl@0
   874
		{ 3, {0x0d09, 0x0d4d, 0x0d42}, { {0, 1, 1, {0x1200}}, {1, 2, 2, {0x058f, 0x123a}}, {2, 3, 2, {0x058f, 0x1232}}, {-1, 1, 1, {0} } } },
sl@0
   875
		{ 3, {0x0d0a, 0x0d4d, 0x0d43}, { {0, 1, 1, {0x1201}}, {1, 2, 2, {0x058f, 0x123a}}, {2, 3, 2, {0x058f, 0x1233}}, {-1, 1, 1, {0} } } },
sl@0
   876
		{ 3, {0x0d0b, 0x0d4d, 0x0d46}, { {0, 1, 1, {0x1202}}, {1, 2, 2, {0x058f, 0x123a}}, {2, 3, 2, {0x1234, 0x058f}}, {-1, 1, 1, {0} } } },
sl@0
   877
		{ 3, {0x0d60, 0x0d4d, 0x0d47}, { {0, 1, 1, {0x123c}}, {1, 2, 2, {0x058f, 0x123a}}, {2, 3, 2, {0x1235, 0x058f}}, {-1, 1, 1, {0} } } },
sl@0
   878
		{ 3, {0x0d0c, 0x0d4d, 0x0d48}, { {0, 1, 1, {0x1203}}, {1, 2, 2, {0x058f, 0x123a}}, {2, 3, 2, {0x1236, 0x058f}}, {-1, 1, 1, {0} } } },
sl@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} } } },
sl@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} } } },
sl@0
   881
		{ 3, {0x0d0f, 0x0d4d, 0x0d4c}, { {0, 1, 1, {0x1205}}, {1, 2, 2, {0x058f, 0x123a}}, {2, 3, 2, {0x058f, 0x123b}}, {-1, 1, 1, {0} } } },
sl@0
   882
		{ 3, {0x0d10, 0x0d4d, 0x0d3e}, { {0, 1, 1, {0x1206}}, {1, 2, 2, {0x058f, 0x123a}}, {2, 3, 2, {0x058f, 0x122e}}, {-1, 1, 1, {0} } } },
sl@0
   883
		{ 3, {0x0d12, 0x0d4d, 0x0d3f}, { {0, 1, 1, {0x1207}}, {1, 2, 2, {0x058f, 0x123a}}, {2, 3, 2, {0x058f, 0x122f}}, {-1, 1, 1, {0} } } },
sl@0
   884
		{ 3, {0x0d13, 0x0d4d, 0x0d40}, { {0, 1, 1, {0x1208}}, {1, 2, 2, {0x058f, 0x123a}}, {2, 3, 2, {0x058f, 0x1230}}, {-1, 1, 1, {0} } } },
sl@0
   885
		{ 3, {0x0d14, 0x0d4d, 0x0d4c}, { {0, 1, 1, {0x1209}}, {1, 2, 2, {0x058f, 0x123a}}, {2, 3, 2, {0x058f, 0x123b}}, {-1, 1, 1, {0} } } },
sl@0
   886
		{ -1, {0}, -1,						-1, 0, {0}}
sl@0
   887
};
sl@0
   888
sl@0
   889
/**
sl@0
   890
 This array of structs is used in the test routine 
sl@0
   891
 CTGlyphSelection::TestThai_InvalidGlyphClusters() to verify that
sl@0
   892
 GetCharacterPosition() correctly uses the dotted circle character
sl@0
   893
 when it crosses a glyph cluster boundary and finds invalid combining
sl@0
   894
 characters.
sl@0
   895
*/
sl@0
   896
LOCAL_D const TTestInput_PositionParam2 Thai_GlyphClusterBoundaries[] = {
sl@0
   897
//    --TEXT----------------	--INVOKE 1---------------		--INVOKE 2----------------
sl@0
   898
sl@0
   899
//0.TEST D1 - Control character - skipped
sl@0
   900
sl@0
   901
//0.TEST D2 - Non Thai letter
sl@0
   902
	{ 2, {0x0E3F, 0x0E5B}, 	 	{{0, 1, 1, {0x0E3F}},			{1, 2, 1, {0x0E5B}}}},
sl@0
   903
	{ 2, {0x0041, 0x0E03}, 	 	{{0, 1, 1, {0x0041}},			{1, 2, 1, {0x0E03}}}},
sl@0
   904
	{ 2, {0x0E2F, 0x0E40}, 	 	{{0, 1, 1, {0x0E2F}},			{1, 2, 1, {0x0E40}}}},
sl@0
   905
	{ 2, {0x0E3F, 0x0E30}, 	 	{{0, 1, 1, {0x0E3F}},			{1, 2, 1, {0x0E30}}}},
sl@0
   906
	{ 2, {0x0E46, 0x0E45}, 	 	{{0, 1, 1, {0x0E46}},			{1, 2, 1, {0x0E45}}}},
sl@0
   907
	{ 2, {0x0E4F, 0x0E24}, 	 	{{0, 1, 1, {0x0E4F}},			{1, 2, 1, {0x0E24}}}},
sl@0
   908
sl@0
   909
	{ 2, {0x0E50, 0x0E38}, 	 	{{0, 1, 1, {0x0E50}},			{1, 2, 2, {KUnicodeDottedCircle, 0x0E38}}}},
sl@0
   910
	{ 2, {0x0E51, 0x0E39}, 	 	{{0, 1, 1, {0x0E51}},			{1, 2, 2, {KUnicodeDottedCircle, 0x0E39}}}},
sl@0
   911
	{ 2, {0x0E52, 0x0E3A}, 	 	{{0, 1, 1, {0x0E52}},			{1, 2, 2, {KUnicodeDottedCircle, 0x0E3A}}}},
sl@0
   912
	{ 2, {0x0E55, 0x0E49}, 	 	{{0, 1, 1, {0x0E55}},			{1, 2, 2, {KUnicodeDottedCircle, 0xF70B}}}},
sl@0
   913
	{ 2, {0x0E56, 0x0E4C}, 	 	{{0, 1, 1, {0x0E56}},			{1, 2, 2, {KUnicodeDottedCircle, 0xF70E}}}},
sl@0
   914
	{ 2, {0x0E58, 0x0E47}, 	 	{{0, 1, 1, {0x0E58}},			{1, 2, 2, {KUnicodeDottedCircle, 0x0E47}}}},
sl@0
   915
	{ 2, {0x0E59, 0x0E4E}, 	 	{{0, 1, 1, {0x0E59}},			{1, 2, 2, {KUnicodeDottedCircle, 0x0E4E}}}},
sl@0
   916
	{ 2, {0x0E5A, 0x0E34}, 	 	{{0, 1, 1, {0x0E5A}},			{1, 2, 2, {KUnicodeDottedCircle, 0x0E34}}}},
sl@0
   917
	{ 2, {0x0E5B, 0x0E31}, 	 	{{0, 1, 1, {0x0E5B}},			{1, 2, 2, {KUnicodeDottedCircle, 0x0E31}}}},
sl@0
   918
	{ 2, {0x005A, 0x0E37}, 	 	{{0, 1, 1, {0x005A}},			{1, 2, 2, {KUnicodeDottedCircle, 0x0E37}}}},
sl@0
   919
sl@0
   920
//16.TEST D3 - Thai consonant
sl@0
   921
	{ 2, {0x0E01, 0x0E3F},	 	{{0, 1, 1, {0x0E01}},			{1, 2, 1, {0x0E3F}}}},
sl@0
   922
	{ 2, {0x0E01, 0x0E03}, 	 	{{0, 1, 1, {0x0E01}},			{1, 2, 1, {0x0E03}}}},
sl@0
   923
	{ 2, {0x0E02, 0x0E40}, 	 	{{0, 1, 1, {0x0E02}},			{1, 2, 1, {0x0E40}}}},
sl@0
   924
	{ 2, {0x0E03, 0x0E30}, 	 	{{0, 1, 1, {0x0E03}},			{1, 2, 1, {0x0E30}}}},
sl@0
   925
	{ 2, {0x0E04, 0x0E45}, 	 	{{0, 1, 1, {0x0E04}},			{1, 2, 1, {0x0E45}}}},
sl@0
   926
	{ 2, {0x0E05, 0x0E24}, 	 	{{0, 1, 1, {0x0E05}},			{1, 2, 1, {0x0E24}}}},
sl@0
   927
sl@0
   928
	{ 2, {0x0E06, 0x0E38}, 	 	{{0, 2, 2, {0x0E06, 0x0E38}},	{-1, -1, 0, {0}}}},
sl@0
   929
	{ 2, {0x0E07, 0x0E39}, 	 	{{0, 2, 2, {0x0E07, 0x0E39}},	{-1, -1, 0, {0}}}},
sl@0
   930
	{ 2, {0x0E23, 0x0E3A}, 	 	{{0, 2, 2, {0x0E23, 0x0E3A}},	{-1, -1, 0, {0}}}},
sl@0
   931
	{ 2, {0x0E25, 0x0E49}, 	 	{{0, 2, 2, {0x0E25, 0xF70B}},	{-1, -1, 0, {0}}}},
sl@0
   932
	{ 2, {0x0E27, 0x0E4C}, 	 	{{0, 2, 2, {0x0E27, 0xF70E}},	{-1, -1, 0, {0}}}},
sl@0
   933
	{ 2, {0x0E28, 0x0E47}, 	 	{{0, 2, 2, {0x0E28, 0x0E47}},	{-1, -1, 0, {0}}}},
sl@0
   934
	{ 2, {0x0E29, 0x0E4E}, 	 	{{0, 2, 2, {0x0E29, 0x0E4E}},	{-1, -1, 0, {0}}}},
sl@0
   935
	{ 2, {0x0E2A, 0x0E34}, 	 	{{0, 2, 2, {0x0E2A, 0x0E34}},	{-1, -1, 0, {0}}}},
sl@0
   936
	{ 2, {0x0E2D, 0x0E31}, 	 	{{0, 2, 2, {0x0E2D, 0x0E31}},	{-1, -1, 0, {0}}}},
sl@0
   937
	{ 2, {0x0E2E, 0x0E37}, 	 	{{0, 2, 2, {0x0E2E, 0x0E37}},	{-1, -1, 0, {0}}}},
sl@0
   938
sl@0
   939
//32.TEST D4 - Thai leading vowel
sl@0
   940
	{ 2, {0x0E40, 0x0E3F}, 	 	{{0, 1, 1, {0x0E40}},			{1, 2, 1, {0x0E3F}}}},
sl@0
   941
	{ 2, {0x0E41, 0x0E03}, 	 	{{0, 1, 1, {0x0E41}},			{1, 2, 1, {0x0E03}}}},
sl@0
   942
	{ 2, {0x0E42, 0x0E40}, 	 	{{0, 1, 1, {0x0E42}},			{1, 2, 1, {0x0E40}}}},
sl@0
   943
	{ 2, {0x0E43, 0x0E30}, 	 	{{0, 1, 1, {0x0E43}},			{1, 2, 1, {0x0E30}}}},
sl@0
   944
	{ 2, {0x0E44, 0x0E45}, 	 	{{0, 1, 1, {0x0E44}},			{1, 2, 1, {0x0E45}}}},
sl@0
   945
	{ 2, {0x0E44, 0x0E24}, 	 	{{0, 1, 1, {0x0E44}},			{1, 2, 1, {0x0E24}}}},
sl@0
   946
sl@0
   947
	{ 2, {0x0E40, 0x0E38},		{{0, 1, 1, {0x0E40}},			{1, 2, 2, {KUnicodeDottedCircle, 0x0E38}}}},
sl@0
   948
	{ 2, {0x0E41, 0x0E39}, 	 	{{0, 1, 1, {0x0E41}},			{1, 2, 2, {KUnicodeDottedCircle, 0x0E39}}}},
sl@0
   949
	{ 2, {0x0E42, 0x0E3A}, 	 	{{0, 1, 1, {0x0E42}},			{1, 2, 2, {KUnicodeDottedCircle, 0x0E3A}}}},
sl@0
   950
	{ 2, {0x0E43, 0x0E49}, 	 	{{0, 1, 1, {0x0E43}},			{1, 2, 2, {KUnicodeDottedCircle, 0xF70B}}}},
sl@0
   951
	{ 2, {0x0E44, 0x0E4C}, 	 	{{0, 1, 1, {0x0E44}},			{1, 2, 2, {KUnicodeDottedCircle, 0xF70E}}}},
sl@0
   952
	{ 2, {0x0E40, 0x0E47}, 	 	{{0, 1, 1, {0x0E40}},			{1, 2, 2, {KUnicodeDottedCircle, 0x0E47}}}},
sl@0
   953
	{ 2, {0x0E41, 0x0E4E}, 	 	{{0, 1, 1, {0x0E41}},			{1, 2, 2, {KUnicodeDottedCircle, 0x0E4E}}}},
sl@0
   954
	{ 2, {0x0E42, 0x0E34}, 	 	{{0, 1, 1, {0x0E42}},			{1, 2, 2, {KUnicodeDottedCircle, 0x0E34}}}},
sl@0
   955
	{ 2, {0x0E43, 0x0E31}, 	 	{{0, 1, 1, {0x0E43}},			{1, 2, 2, {KUnicodeDottedCircle, 0x0E31}}}},
sl@0
   956
	{ 2, {0x0E44, 0x0E37}, 	 	{{0, 1, 1, {0x0E44}},			{1, 2, 2, {KUnicodeDottedCircle, 0x0E37}}}},
sl@0
   957
sl@0
   958
//48.TEST D5 - Thai following vowel 1
sl@0
   959
	{ 2, {0x0E30, 0x0E3F}, 	 	{{0, 1, 1, {0x0E30}},				{1, 2, 1, {0x0E3F}}}},
sl@0
   960
	{ 2, {0x0E32, 0x0E03}, 	 	{{0, 1, 1, {0x0E32}},				{1, 2, 1, {0x0E03}}}},
sl@0
   961
	{ 2, {0x0E33, 0x0E40}, 	 	{{0, 1, 2, {KUnicodeDottedCircle, 0x0E33}},{1, 2, 1, {0x0E40}}}},
sl@0
   962
	{ 2, {0x0E30, 0x0E30}, 	 	{{0, 1, 1, {0x0E30}},				{1, 2, 1, {0x0E30}}}},
sl@0
   963
	{ 2, {0x0E32, 0x0E45}, 	 	{{0, 1, 1, {0x0E32}},				{1, 2, 1, {0x0E45}}}},
sl@0
   964
	{ 2, {0x0E33, 0x0E24}, 	 	{{0, 1, 2, {KUnicodeDottedCircle, 0x0E33}},{1, 2, 1, {0x0E24}}}},
sl@0
   965
sl@0
   966
	{ 2, {0x0E30, 0x0E38},		{{0, 1, 1, {0x0E30}},				{1, 2, 2, {KUnicodeDottedCircle, 0x0E38}}}},
sl@0
   967
	{ 2, {0x0E32, 0x0E39}, 	 	{{0, 1, 1, {0x0E32}},				{1, 2, 2, {KUnicodeDottedCircle, 0x0E39}}}},
sl@0
   968
	{ 2, {0x0E33, 0x0E3A}, 	 	{{0, 1, 2, {KUnicodeDottedCircle, 0x0E33}},{1, 2, 2, {KUnicodeDottedCircle, 0x0E3A}}}},
sl@0
   969
	{ 2, {0x0E30, 0x0E49}, 	 	{{0, 1, 1, {0x0E30}},				{1, 2, 2, {KUnicodeDottedCircle, 0xF70B}}}},
sl@0
   970
	{ 2, {0x0E32, 0x0E4C}, 	 	{{0, 1, 1, {0x0E32}},				{1, 2, 2, {KUnicodeDottedCircle, 0xF70E}}}},
sl@0
   971
	{ 2, {0x0E33, 0x0E47}, 	 	{{0, 1, 2, {KUnicodeDottedCircle, 0x0E33}},{1, 2, 2, {KUnicodeDottedCircle, 0x0E47}}}},
sl@0
   972
	{ 2, {0x0E30, 0x0E4E}, 	 	{{0, 1, 1, {0x0E30}},				{1, 2, 2, {KUnicodeDottedCircle, 0x0E4E}}}},
sl@0
   973
	{ 2, {0x0E32, 0x0E34}, 	 	{{0, 1, 1, {0x0E32}},				{1, 2, 2, {KUnicodeDottedCircle, 0x0E34}}}},
sl@0
   974
	{ 2, {0x0E33, 0x0E31}, 	 	{{0, 1, 2, {KUnicodeDottedCircle, 0x0E33}},{1, 2, 2, {KUnicodeDottedCircle, 0x0E31}}}},
sl@0
   975
	{ 2, {0x0E30, 0x0E37}, 	 	{{0, 1, 1, {0x0E30}},				{1, 2, 2, {KUnicodeDottedCircle, 0x0E37}}}},
sl@0
   976
sl@0
   977
//64.TEST D6 - Thai following vowel 2
sl@0
   978
	{ 2, {0x0E45, 0x0E3F}, 	 	{{0, 1, 1, {0x0E45}},			{1, 2, 1, {0x0E3F}}}},
sl@0
   979
	{ 2, {0x0E45, 0x0E03}, 	 	{{0, 1, 1, {0x0E45}},			{1, 2, 1, {0x0E03}}}},
sl@0
   980
	{ 2, {0x0E45, 0x0E40}, 	 	{{0, 1, 1, {0x0E45}},			{1, 2, 1, {0x0E40}}}},
sl@0
   981
	{ 2, {0x0E45, 0x0E30}, 	 	{{0, 1, 1, {0x0E45}},			{1, 2, 1, {0x0E30}}}},
sl@0
   982
	{ 2, {0x0E45, 0x0E45}, 	 	{{0, 1, 1, {0x0E45}},			{1, 2, 1, {0x0E45}}}},
sl@0
   983
	{ 2, {0x0E45, 0x0E24}, 	 	{{0, 1, 1, {0x0E45}},			{1, 2, 1, {0x0E24}}}},
sl@0
   984
sl@0
   985
	{ 2, {0x0E45, 0x0E38},		{{0, 1, 1, {0x0E45}},			{1, 2, 2, {KUnicodeDottedCircle, 0x0E38}}}},
sl@0
   986
	{ 2, {0x0E45, 0x0E39}, 	 	{{0, 1, 1, {0x0E45}},			{1, 2, 2, {KUnicodeDottedCircle, 0x0E39}}}},
sl@0
   987
	{ 2, {0x0E45, 0x0E3A}, 	 	{{0, 1, 1, {0x0E45}},			{1, 2, 2, {KUnicodeDottedCircle, 0x0E3A}}}},
sl@0
   988
	{ 2, {0x0E45, 0x0E49}, 	 	{{0, 1, 1, {0x0E45}},			{1, 2, 2, {KUnicodeDottedCircle, 0xF70B}}}},
sl@0
   989
	{ 2, {0x0E45, 0x0E4C}, 	 	{{0, 1, 1, {0x0E45}},			{1, 2, 2, {KUnicodeDottedCircle, 0xF70E}}}},
sl@0
   990
	{ 2, {0x0E45, 0x0E47}, 	 	{{0, 1, 1, {0x0E45}},			{1, 2, 2, {KUnicodeDottedCircle, 0x0E47}}}},
sl@0
   991
	{ 2, {0x0E45, 0x0E4E}, 	 	{{0, 1, 1, {0x0E45}},			{1, 2, 2, {KUnicodeDottedCircle, 0x0E4E}}}},
sl@0
   992
	{ 2, {0x0E45, 0x0E34}, 	 	{{0, 1, 1, {0x0E45}},			{1, 2, 2, {KUnicodeDottedCircle, 0x0E34}}}},
sl@0
   993
	{ 2, {0x0E45, 0x0E31}, 	 	{{0, 1, 1, {0x0E45}},			{1, 2, 2, {KUnicodeDottedCircle, 0x0E31}}}},
sl@0
   994
	{ 2, {0x0E45, 0x0E37}, 	 	{{0, 1, 1, {0x0E45}},			{1, 2, 2, {KUnicodeDottedCircle, 0x0E37}}}},
sl@0
   995
sl@0
   996
//80.TEST D7 - Thai following vowel 3
sl@0
   997
	{ 2, {0x0E24, 0x0E3F}, 	 	{{0, 1, 1, {0x0E24}},			{1, 2, 1, {0x0E3F}}}},
sl@0
   998
	{ 2, {0x0E26, 0x0E03}, 	 	{{0, 1, 1, {0x0E26}},			{1, 2, 1, {0x0E03}}}},
sl@0
   999
	{ 2, {0x0E24, 0x0E40}, 	 	{{0, 1, 1, {0x0E24}},			{1, 2, 1, {0x0E40}}}},
sl@0
  1000
	{ 2, {0x0E26, 0x0E30}, 	 	{{0, 1, 1, {0x0E26}},			{1, 2, 1, {0x0E30}}}},
sl@0
  1001
	{ 2, {0x0E24, 0x0E45}, 	 	{{0, 1, 1, {0x0E24}},			{1, 2, 1, {0x0E45}}}},
sl@0
  1002
	{ 2, {0x0E26, 0x0E24}, 	 	{{0, 1, 1, {0x0E26}},			{1, 2, 1, {0x0E24}}}},
sl@0
  1003
sl@0
  1004
	{ 2, {0x0E24, 0x0E38},		{{0, 2, 2, {0x0E24, 0xF718}},	{-1, -1, 0, {0}}}},
sl@0
  1005
	{ 2, {0x0E26, 0x0E39}, 	 	{{0, 2, 2, {0x0E26, 0xF719}},	{-1, -1, 0, {0}}}},
sl@0
  1006
	{ 2, {0x0E24, 0x0E3A}, 	 	{{0, 2, 2, {0x0E24, 0xF71A}},	{-1, -1, 0, {0}}}},
sl@0
  1007
	{ 2, {0x0E26, 0x0E49}, 	 	{{0, 2, 2, {0x0E26, 0xF70B}},	{-1, -1, 0, {0}}}},
sl@0
  1008
	{ 2, {0x0E24, 0x0E4C}, 	 	{{0, 2, 2, {0x0E24, 0xF70E}},	{-1, -1, 0, {0}}}},
sl@0
  1009
	{ 2, {0x0E26, 0x0E47}, 	 	{{0, 2, 2, {0x0E26, 0x0E47}},	{-1, -1, 0, {0}}}},
sl@0
  1010
	{ 2, {0x0E24, 0x0E4E}, 	 	{{0, 2, 2, {0x0E24, 0x0E4E}},	{-1, -1, 0, {0}}}},
sl@0
  1011
	{ 2, {0x0E26, 0x0E34}, 	 	{{0, 2, 2, {0x0E26, 0x0E34}},	{-1, -1, 0, {0}}}},
sl@0
  1012
	{ 2, {0x0E24, 0x0E31}, 	 	{{0, 2, 2, {0x0E24, 0x0E31}},	{-1, -1, 0, {0}}}},
sl@0
  1013
	{ 2, {0x0E26, 0x0E37}, 	 	{{0, 2, 2, {0x0E26, 0x0E37}},	{-1, -1, 0, {0}}}},
sl@0
  1014
sl@0
  1015
//96.TEST D8 - Thai NO NU & Below Vowel 1
sl@0
  1016
	{ 3, {0x0E19, 0x0E38, 0x0E3F}, 	 	{{0, 2, 2, {0x0E19, 0x0E38}},			{2, 3, 1, {0x0E3F}}}},
sl@0
  1017
	{ 3, {0x0E19, 0x0E38, 0x0E03}, 	 	{{0, 2, 2, {0x0E19, 0x0E38}},			{2, 3, 1, {0x0E03}}}},
sl@0
  1018
	{ 3, {0x0E19, 0x0E38, 0x0E40}, 	 	{{0, 2, 2, {0x0E19, 0x0E38}},			{2, 3, 1, {0x0E40}}}},
sl@0
  1019
	{ 3, {0x0E19, 0x0E38, 0x0E30}, 	 	{{0, 2, 2, {0x0E19, 0x0E38}},			{2, 3, 1, {0x0E30}}}},
sl@0
  1020
	{ 3, {0x0E19, 0x0E38, 0x0E45}, 	 	{{0, 2, 2, {0x0E19, 0x0E38}},			{2, 3, 1, {0x0E45}}}},
sl@0
  1021
	{ 3, {0x0E19, 0x0E38, 0x0E24}, 	 	{{0, 2, 2, {0x0E19, 0x0E38}},			{2, 3, 1, {0x0E24}}}},
sl@0
  1022
sl@0
  1023
	{ 3, {0x0E19, 0x0E38, 0x0E38},		{{0, 2, 2, {0x0E19, 0x0E38}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E38}}}},
sl@0
  1024
	{ 3, {0x0E19, 0x0E38, 0x0E39}, 	 	{{0, 2, 2, {0x0E19, 0x0E38}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E39}}}},
sl@0
  1025
	{ 3, {0x0E19, 0x0E38, 0x0E3A}, 	 	{{0, 2, 2, {0x0E19, 0x0E38}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E3A}}}},
sl@0
  1026
	{ 3, {0x0E19, 0x0E38, 0x0E49}, 	 	{{0, 3, 3, {0x0E19, 0x0E38, 0xF70B}},	{-1, -1, 0, {0}}}},
sl@0
  1027
	{ 3, {0x0E19, 0x0E38, 0x0E4C}, 	 	{{0, 3, 3, {0x0E19, 0x0E38, 0xF70E}},	{-1, -1, 0, {0}}}},
sl@0
  1028
	{ 3, {0x0E19, 0x0E38, 0x0E47}, 	 	{{0, 2, 2, {0x0E19, 0x0E38}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E47}}}},
sl@0
  1029
	{ 3, {0x0E19, 0x0E38, 0x0E4E}, 	 	{{0, 2, 2, {0x0E19, 0x0E38}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E4E}}}},
sl@0
  1030
	{ 3, {0x0E19, 0x0E38, 0x0E34}, 	 	{{0, 2, 2, {0x0E19, 0x0E38}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E34}}}},
sl@0
  1031
	{ 3, {0x0E19, 0x0E38, 0x0E31}, 	 	{{0, 2, 2, {0x0E19, 0x0E38}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E31}}}},
sl@0
  1032
	{ 3, {0x0E19, 0x0E38, 0x0E37}, 	 	{{0, 2, 2, {0x0E19, 0x0E38}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E37}}}},
sl@0
  1033
sl@0
  1034
//112.TEST D9 - Thai NO NU & Below Vowel 2
sl@0
  1035
	{ 3, {0x0E19, 0x0E39, 0x0E3F}, 	 	{{0, 2, 2, {0x0E19, 0x0E39}},			{2, 3, 1, {0x0E3F}}}},
sl@0
  1036
	{ 3, {0x0E19, 0x0E39, 0x0E03}, 	 	{{0, 2, 2, {0x0E19, 0x0E39}},			{2, 3, 1, {0x0E03}}}},
sl@0
  1037
	{ 3, {0x0E19, 0x0E39, 0x0E40}, 	 	{{0, 2, 2, {0x0E19, 0x0E39}},			{2, 3, 1, {0x0E40}}}},
sl@0
  1038
	{ 3, {0x0E19, 0x0E39, 0x0E30}, 	 	{{0, 2, 2, {0x0E19, 0x0E39}},			{2, 3, 1, {0x0E30}}}},
sl@0
  1039
	{ 3, {0x0E19, 0x0E39, 0x0E45}, 	 	{{0, 2, 2, {0x0E19, 0x0E39}},			{2, 3, 1, {0x0E45}}}},
sl@0
  1040
	{ 3, {0x0E19, 0x0E39, 0x0E24}, 	 	{{0, 2, 2, {0x0E19, 0x0E39}},			{2, 3, 1, {0x0E24}}}},
sl@0
  1041
sl@0
  1042
	{ 3, {0x0E19, 0x0E39, 0x0E38},		{{0, 2, 2, {0x0E19, 0x0E39}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E38}}}},
sl@0
  1043
	{ 3, {0x0E19, 0x0E39, 0x0E39}, 	 	{{0, 2, 2, {0x0E19, 0x0E39}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E39}}}},
sl@0
  1044
	{ 3, {0x0E19, 0x0E39, 0x0E3A}, 	 	{{0, 2, 2, {0x0E19, 0x0E39}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E3A}}}},
sl@0
  1045
	{ 3, {0x0E19, 0x0E39, 0x0E49}, 	 	{{0, 3, 3, {0x0E19, 0x0E39, 0xF70B}},	{-1, -1, 0, {0}}}},
sl@0
  1046
	{ 3, {0x0E19, 0x0E39, 0x0E4C}, 	 	{{0, 2, 2, {0x0E19, 0x0E39}},			{2, 3, 2, {KUnicodeDottedCircle, 0xF70E}}}},
sl@0
  1047
	{ 3, {0x0E19, 0x0E39, 0x0E47}, 	 	{{0, 2, 2, {0x0E19, 0x0E39}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E47}}}},
sl@0
  1048
	{ 3, {0x0E19, 0x0E39, 0x0E4E}, 	 	{{0, 2, 2, {0x0E19, 0x0E39}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E4E}}}},
sl@0
  1049
	{ 3, {0x0E19, 0x0E39, 0x0E34}, 	 	{{0, 2, 2, {0x0E19, 0x0E39}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E34}}}},
sl@0
  1050
	{ 3, {0x0E19, 0x0E39, 0x0E31}, 	 	{{0, 2, 2, {0x0E19, 0x0E39}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E31}}}},
sl@0
  1051
	{ 3, {0x0E19, 0x0E39, 0x0E37}, 	 	{{0, 2, 2, {0x0E19, 0x0E39}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E37}}}},
sl@0
  1052
sl@0
  1053
//128.TEST D10 - Thai NO NU & Below Diacritic
sl@0
  1054
	{ 3, {0x0E19, 0x0E3A, 0x0E3F}, 	 	{{0, 2, 2, {0x0E19, 0x0E3A}},			{2, 3, 1, {0x0E3F}}}},
sl@0
  1055
	{ 3, {0x0E19, 0x0E3A, 0x0E03}, 	 	{{0, 2, 2, {0x0E19, 0x0E3A}},			{2, 3, 1, {0x0E03}}}},
sl@0
  1056
	{ 3, {0x0E19, 0x0E3A, 0x0E40}, 	 	{{0, 2, 2, {0x0E19, 0x0E3A}},			{2, 3, 1, {0x0E40}}}},
sl@0
  1057
	{ 3, {0x0E19, 0x0E3A, 0x0E30}, 	 	{{0, 2, 2, {0x0E19, 0x0E3A}},			{2, 3, 1, {0x0E30}}}},
sl@0
  1058
	{ 3, {0x0E19, 0x0E3A, 0x0E45}, 	 	{{0, 2, 2, {0x0E19, 0x0E3A}},			{2, 3, 1, {0x0E45}}}},
sl@0
  1059
	{ 3, {0x0E19, 0x0E3A, 0x0E24}, 	 	{{0, 2, 2, {0x0E19, 0x0E3A}},			{2, 3, 1, {0x0E24}}}},
sl@0
  1060
sl@0
  1061
	{ 3, {0x0E19, 0x0E3A, 0x0E38},		{{0, 2, 2, {0x0E19, 0x0E3A}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E38}}}},
sl@0
  1062
	{ 3, {0x0E19, 0x0E3A, 0x0E39}, 	 	{{0, 2, 2, {0x0E19, 0x0E3A}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E39}}}},
sl@0
  1063
	{ 3, {0x0E19, 0x0E3A, 0x0E3A}, 	 	{{0, 2, 2, {0x0E19, 0x0E3A}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E3A}}}},
sl@0
  1064
	{ 3, {0x0E19, 0x0E3A, 0x0E49}, 	 	{{0, 2, 2, {0x0E19, 0x0E3A}},			{2, 3, 2, {KUnicodeDottedCircle, 0xF70B}}}},
sl@0
  1065
	{ 3, {0x0E19, 0x0E3A, 0x0E4C}, 	 	{{0, 2, 2, {0x0E19, 0x0E3A}},			{2, 3, 2, {KUnicodeDottedCircle, 0xF70E}}}},
sl@0
  1066
	{ 3, {0x0E19, 0x0E3A, 0x0E47}, 	 	{{0, 2, 2, {0x0E19, 0x0E3A}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E47}}}},
sl@0
  1067
	{ 3, {0x0E19, 0x0E3A, 0x0E4E}, 	 	{{0, 2, 2, {0x0E19, 0x0E3A}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E4E}}}},
sl@0
  1068
	{ 3, {0x0E19, 0x0E3A, 0x0E34}, 	 	{{0, 2, 2, {0x0E19, 0x0E3A}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E34}}}},
sl@0
  1069
	{ 3, {0x0E19, 0x0E3A, 0x0E31}, 	 	{{0, 2, 2, {0x0E19, 0x0E3A}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E31}}}},
sl@0
  1070
	{ 3, {0x0E19, 0x0E3A, 0x0E37}, 	 	{{0, 2, 2, {0x0E19, 0x0E3A}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E37}}}},
sl@0
  1071
sl@0
  1072
//144.TEST D11 - Thai NO NU & Tone mark
sl@0
  1073
	{ 3, {0x0E19, 0x0E48, 0x0E3F}, 	 	{{0, 2, 2, {0x0E19, 0xF70A}},			{2, 3, 1, {0x0E3F}}}},
sl@0
  1074
	{ 3, {0x0E19, 0x0E49, 0x0E03}, 	 	{{0, 2, 2, {0x0E19, 0xF70B}},			{2, 3, 1, {0x0E03}}}},
sl@0
  1075
	{ 3, {0x0E19, 0x0E4A, 0x0E40}, 	 	{{0, 2, 2, {0x0E19, 0xF70C}},			{2, 3, 1, {0x0E40}}}},
sl@0
  1076
	{ 3, {0x0E19, 0x0E4B, 0x0E30}, 	 	{{0, 2, 2, {0x0E19, 0xF70D}},			{2, 3, 1, {0x0E30}}}},
sl@0
  1077
	{ 3, {0x0E19, 0x0E48, 0x0E45}, 	 	{{0, 2, 2, {0x0E19, 0xF70A}},			{2, 3, 1, {0x0E45}}}},
sl@0
  1078
	{ 3, {0x0E19, 0x0E49, 0x0E24}, 	 	{{0, 2, 2, {0x0E19, 0xF70B}},			{2, 3, 1, {0x0E24}}}},
sl@0
  1079
sl@0
  1080
	{ 3, {0x0E19, 0x0E4A, 0x0E38},		{{0, 2, 2, {0x0E19, 0xF70C}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E38}}}},
sl@0
  1081
	{ 3, {0x0E19, 0x0E4B, 0x0E39}, 	 	{{0, 2, 2, {0x0E19, 0xF70D}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E39}}}},
sl@0
  1082
	{ 3, {0x0E19, 0x0E48, 0x0E3A}, 	 	{{0, 2, 2, {0x0E19, 0xF70A}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E3A}}}},
sl@0
  1083
	{ 3, {0x0E19, 0x0E49, 0x0E49}, 	 	{{0, 2, 2, {0x0E19, 0xF70B}},			{2, 3, 2, {KUnicodeDottedCircle, 0xF70B}}}},
sl@0
  1084
	{ 3, {0x0E19, 0x0E4A, 0x0E4C}, 	 	{{0, 2, 2, {0x0E19, 0xF70C}},			{2, 3, 2, {KUnicodeDottedCircle, 0xF70E}}}},
sl@0
  1085
	{ 3, {0x0E19, 0x0E4B, 0x0E47}, 	 	{{0, 2, 2, {0x0E19, 0xF70D}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E47}}}},
sl@0
  1086
	{ 3, {0x0E19, 0x0E48, 0x0E4E}, 	 	{{0, 2, 2, {0x0E19, 0xF70A}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E4E}}}},
sl@0
  1087
	{ 3, {0x0E19, 0x0E49, 0x0E34}, 	 	{{0, 2, 2, {0x0E19, 0xF70B}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E34}}}},
sl@0
  1088
	{ 3, {0x0E19, 0x0E4A, 0x0E31}, 	 	{{0, 2, 2, {0x0E19, 0xF70C}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E31}}}},
sl@0
  1089
	{ 3, {0x0E19, 0x0E4B, 0x0E37}, 	 	{{0, 2, 2, {0x0E19, 0xF70D}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E37}}}},
sl@0
  1090
sl@0
  1091
//160.TEST D12 - Thai NO NU & Above Diacritic 1
sl@0
  1092
	{ 3, {0x0E19, 0x0E4C, 0x0E3F}, 	 	{{0, 2, 2, {0x0E19, 0xF70E}},			{2, 3, 1, {0x0E3F}}}},
sl@0
  1093
	{ 3, {0x0E19, 0x0E4D, 0x0E03}, 	 	{{0, 2, 2, {0x0E19, 0x0E4D}},			{2, 3, 1, {0x0E03}}}},
sl@0
  1094
	{ 3, {0x0E19, 0x0E4C, 0x0E40}, 	 	{{0, 2, 2, {0x0E19, 0xF70E}},			{2, 3, 1, {0x0E40}}}},
sl@0
  1095
	{ 3, {0x0E19, 0x0E4D, 0x0E30}, 	 	{{0, 2, 2, {0x0E19, 0x0E4D}},			{2, 3, 1, {0x0E30}}}},
sl@0
  1096
	{ 3, {0x0E19, 0x0E4C, 0x0E45}, 	 	{{0, 2, 2, {0x0E19, 0xF70E}},			{2, 3, 1, {0x0E45}}}},
sl@0
  1097
	{ 3, {0x0E19, 0x0E4D, 0x0E24}, 	 	{{0, 2, 2, {0x0E19, 0x0E4D}},			{2, 3, 1, {0x0E24}}}},
sl@0
  1098
sl@0
  1099
	{ 3, {0x0E19, 0x0E4C, 0x0E38},		{{0, 2, 2, {0x0E19, 0xF70E}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E38}}}},
sl@0
  1100
	{ 3, {0x0E19, 0x0E4D, 0x0E39}, 	 	{{0, 2, 2, {0x0E19, 0x0E4D}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E39}}}},
sl@0
  1101
	{ 3, {0x0E19, 0x0E4C, 0x0E3A}, 	 	{{0, 2, 2, {0x0E19, 0xF70E}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E3A}}}},
sl@0
  1102
	{ 3, {0x0E19, 0x0E4D, 0x0E49}, 	 	{{0, 2, 2, {0x0E19, 0x0E4D}},			{2, 3, 2, {KUnicodeDottedCircle, 0xF70B}}}},
sl@0
  1103
	{ 3, {0x0E19, 0x0E4C, 0x0E4C}, 	 	{{0, 2, 2, {0x0E19, 0xF70E}},			{2, 3, 2, {KUnicodeDottedCircle, 0xF70E}}}},
sl@0
  1104
	{ 3, {0x0E19, 0x0E4D, 0x0E47}, 	 	{{0, 2, 2, {0x0E19, 0x0E4D}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E47}}}},
sl@0
  1105
	{ 3, {0x0E19, 0x0E4C, 0x0E4E}, 	 	{{0, 2, 2, {0x0E19, 0xF70E}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E4E}}}},
sl@0
  1106
	{ 3, {0x0E19, 0x0E4D, 0x0E34}, 	 	{{0, 2, 2, {0x0E19, 0x0E4D}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E34}}}},
sl@0
  1107
	{ 3, {0x0E19, 0x0E4C, 0x0E31}, 	 	{{0, 2, 2, {0x0E19, 0xF70E}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E31}}}},
sl@0
  1108
	{ 3, {0x0E19, 0x0E4D, 0x0E37}, 	 	{{0, 2, 2, {0x0E19, 0x0E4D}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E37}}}},
sl@0
  1109
sl@0
  1110
//176.TEST D13 - Thai NO NU & Above Diacritic 2
sl@0
  1111
	{ 3, {0x0E19, 0x0E47, 0x0E3F}, 	 	{{0, 2, 2, {0x0E19, 0x0E47}},			{2, 3, 1, {0x0E3F}}}},
sl@0
  1112
	{ 3, {0x0E19, 0x0E47, 0x0E03}, 	 	{{0, 2, 2, {0x0E19, 0x0E47}},			{2, 3, 1, {0x0E03}}}},
sl@0
  1113
	{ 3, {0x0E19, 0x0E47, 0x0E40}, 	 	{{0, 2, 2, {0x0E19, 0x0E47}},			{2, 3, 1, {0x0E40}}}},
sl@0
  1114
	{ 3, {0x0E19, 0x0E47, 0x0E30}, 	 	{{0, 2, 2, {0x0E19, 0x0E47}},			{2, 3, 1, {0x0E30}}}},
sl@0
  1115
	{ 3, {0x0E19, 0x0E47, 0x0E45}, 	 	{{0, 2, 2, {0x0E19, 0x0E47}},			{2, 3, 1, {0x0E45}}}},
sl@0
  1116
	{ 3, {0x0E19, 0x0E47, 0x0E24}, 	 	{{0, 2, 2, {0x0E19, 0x0E47}},			{2, 3, 1, {0x0E24}}}},
sl@0
  1117
sl@0
  1118
	{ 3, {0x0E19, 0x0E47, 0x0E38},		{{0, 2, 2, {0x0E19, 0x0E47}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E38}}}},
sl@0
  1119
	{ 3, {0x0E19, 0x0E47, 0x0E39}, 	 	{{0, 2, 2, {0x0E19, 0x0E47}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E39}}}},
sl@0
  1120
	{ 3, {0x0E19, 0x0E47, 0x0E3A}, 	 	{{0, 2, 2, {0x0E19, 0x0E47}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E3A}}}},
sl@0
  1121
	{ 3, {0x0E19, 0x0E47, 0x0E49}, 	 	{{0, 2, 2, {0x0E19, 0x0E47}},			{2, 3, 2, {KUnicodeDottedCircle, 0xF70B}}}},
sl@0
  1122
	{ 3, {0x0E19, 0x0E47, 0x0E4C}, 	 	{{0, 2, 2, {0x0E19, 0x0E47}},			{2, 3, 2, {KUnicodeDottedCircle, 0xF70E}}}},
sl@0
  1123
	{ 3, {0x0E19, 0x0E47, 0x0E47}, 	 	{{0, 2, 2, {0x0E19, 0x0E47}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E47}}}},
sl@0
  1124
	{ 3, {0x0E19, 0x0E47, 0x0E4E}, 	 	{{0, 2, 2, {0x0E19, 0x0E47}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E4E}}}},
sl@0
  1125
	{ 3, {0x0E19, 0x0E47, 0x0E34}, 	 	{{0, 2, 2, {0x0E19, 0x0E47}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E34}}}},
sl@0
  1126
	{ 3, {0x0E19, 0x0E47, 0x0E31}, 	 	{{0, 2, 2, {0x0E19, 0x0E47}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E31}}}},
sl@0
  1127
	{ 3, {0x0E19, 0x0E47, 0x0E37}, 	 	{{0, 2, 2, {0x0E19, 0x0E47}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E37}}}},
sl@0
  1128
sl@0
  1129
//176.TEST D14 - Thai NO NU & Above Diacritic 3
sl@0
  1130
	{ 3, {0x0E19, 0x0E4E, 0x0E3F}, 	 	{{0, 2, 2, {0x0E19, 0x0E4E}},			{2, 3, 1, {0x0E3F}}}},
sl@0
  1131
	{ 3, {0x0E19, 0x0E4E, 0x0E03}, 	 	{{0, 2, 2, {0x0E19, 0x0E4E}},			{2, 3, 1, {0x0E03}}}},
sl@0
  1132
	{ 3, {0x0E19, 0x0E4E, 0x0E40}, 	 	{{0, 2, 2, {0x0E19, 0x0E4E}},			{2, 3, 1, {0x0E40}}}},
sl@0
  1133
	{ 3, {0x0E19, 0x0E4E, 0x0E30}, 	 	{{0, 2, 2, {0x0E19, 0x0E4E}},			{2, 3, 1, {0x0E30}}}},
sl@0
  1134
	{ 3, {0x0E19, 0x0E4E, 0x0E45}, 	 	{{0, 2, 2, {0x0E19, 0x0E4E}},			{2, 3, 1, {0x0E45}}}},
sl@0
  1135
	{ 3, {0x0E19, 0x0E4E, 0x0E24}, 	 	{{0, 2, 2, {0x0E19, 0x0E4E}},			{2, 3, 1, {0x0E24}}}},
sl@0
  1136
sl@0
  1137
	{ 3, {0x0E19, 0x0E4E, 0x0E38},		{{0, 2, 2, {0x0E19, 0x0E4E}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E38}}}},
sl@0
  1138
	{ 3, {0x0E19, 0x0E4E, 0x0E39}, 	 	{{0, 2, 2, {0x0E19, 0x0E4E}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E39}}}},
sl@0
  1139
	{ 3, {0x0E19, 0x0E4E, 0x0E3A}, 	 	{{0, 2, 2, {0x0E19, 0x0E4E}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E3A}}}},
sl@0
  1140
	{ 3, {0x0E19, 0x0E4E, 0x0E49}, 	 	{{0, 2, 2, {0x0E19, 0x0E4E}},			{2, 3, 2, {KUnicodeDottedCircle, 0xF70B}}}},
sl@0
  1141
	{ 3, {0x0E19, 0x0E4E, 0x0E4C}, 	 	{{0, 2, 2, {0x0E19, 0x0E4E}},			{2, 3, 2, {KUnicodeDottedCircle, 0xF70E}}}},
sl@0
  1142
	{ 3, {0x0E19, 0x0E4E, 0x0E47}, 	 	{{0, 2, 2, {0x0E19, 0x0E4E}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E47}}}},
sl@0
  1143
	{ 3, {0x0E19, 0x0E4E, 0x0E4E}, 	 	{{0, 2, 2, {0x0E19, 0x0E4E}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E4E}}}},
sl@0
  1144
	{ 3, {0x0E19, 0x0E4E, 0x0E34}, 	 	{{0, 2, 2, {0x0E19, 0x0E4E}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E34}}}},
sl@0
  1145
	{ 3, {0x0E19, 0x0E4E, 0x0E31}, 	 	{{0, 2, 2, {0x0E19, 0x0E4E}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E31}}}},
sl@0
  1146
	{ 3, {0x0E19, 0x0E4E, 0x0E37}, 	 	{{0, 2, 2, {0x0E19, 0x0E4E}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E37}}}},
sl@0
  1147
sl@0
  1148
//192.TEST D15 - Thai NO NU & Above Vowel 1
sl@0
  1149
	{ 3, {0x0E19, 0x0E34, 0x0E3F}, 	 	{{0, 2, 2, {0x0E19, 0x0E34}},			{2, 3, 1, {0x0E3F}}}},
sl@0
  1150
	{ 3, {0x0E19, 0x0E34, 0x0E03}, 	 	{{0, 2, 2, {0x0E19, 0x0E34}},			{2, 3, 1, {0x0E03}}}},
sl@0
  1151
	{ 3, {0x0E19, 0x0E34, 0x0E40}, 	 	{{0, 2, 2, {0x0E19, 0x0E34}},			{2, 3, 1, {0x0E40}}}},
sl@0
  1152
	{ 3, {0x0E19, 0x0E34, 0x0E30}, 	 	{{0, 2, 2, {0x0E19, 0x0E34}},			{2, 3, 1, {0x0E30}}}},
sl@0
  1153
	{ 3, {0x0E19, 0x0E34, 0x0E45}, 	 	{{0, 2, 2, {0x0E19, 0x0E34}},			{2, 3, 1, {0x0E45}}}},
sl@0
  1154
	{ 3, {0x0E19, 0x0E34, 0x0E24}, 	 	{{0, 2, 2, {0x0E19, 0x0E34}},			{2, 3, 1, {0x0E24}}}},
sl@0
  1155
sl@0
  1156
	{ 3, {0x0E19, 0x0E34, 0x0E38},		{{0, 2, 2, {0x0E19, 0x0E34}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E38}}}},
sl@0
  1157
	{ 3, {0x0E19, 0x0E34, 0x0E39}, 	 	{{0, 2, 2, {0x0E19, 0x0E34}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E39}}}},
sl@0
  1158
	{ 3, {0x0E19, 0x0E34, 0x0E3A}, 	 	{{0, 2, 2, {0x0E19, 0x0E34}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E3A}}}},
sl@0
  1159
	{ 3, {0x0E19, 0x0E34, 0x0E49}, 	 	{{0, 3, 3, {0x0E19, 0x0E34, 0x0E49}},	{-1, -1, 0, {0}}}},
sl@0
  1160
	{ 3, {0x0E19, 0x0E34, 0x0E4C}, 	 	{{0, 3, 3, {0x0E19, 0x0E34, 0x0E4C}},	{-1, -1, 0, {0}}}},
sl@0
  1161
	{ 3, {0x0E19, 0x0E34, 0x0E47}, 	 	{{0, 2, 2, {0x0E19, 0x0E34}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E47}}}},
sl@0
  1162
	{ 3, {0x0E19, 0x0E34, 0x0E4E}, 	 	{{0, 2, 2, {0x0E19, 0x0E34}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E4E}}}},
sl@0
  1163
	{ 3, {0x0E19, 0x0E34, 0x0E34}, 	 	{{0, 2, 2, {0x0E19, 0x0E34}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E34}}}},
sl@0
  1164
	{ 3, {0x0E19, 0x0E34, 0x0E31}, 	 	{{0, 2, 2, {0x0E19, 0x0E34}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E31}}}},
sl@0
  1165
	{ 3, {0x0E19, 0x0E34, 0x0E37}, 	 	{{0, 2, 2, {0x0E19, 0x0E34}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E37}}}},
sl@0
  1166
sl@0
  1167
//208.TEST D16 - Thai NO NU & Above Vowel 2
sl@0
  1168
	{ 3, {0x0E19, 0x0E31, 0x0E3F}, 	 	{{0, 2, 2, {0x0E19, 0x0E31}},			{2, 3, 1, {0x0E3F}}}},
sl@0
  1169
	{ 3, {0x0E19, 0x0E36, 0x0E03}, 	 	{{0, 2, 2, {0x0E19, 0x0E36}},			{2, 3, 1, {0x0E03}}}},
sl@0
  1170
	{ 3, {0x0E19, 0x0E31, 0x0E40}, 	 	{{0, 2, 2, {0x0E19, 0x0E31}},			{2, 3, 1, {0x0E40}}}},
sl@0
  1171
	{ 3, {0x0E19, 0x0E36, 0x0E30}, 	 	{{0, 2, 2, {0x0E19, 0x0E36}},			{2, 3, 1, {0x0E30}}}},
sl@0
  1172
	{ 3, {0x0E19, 0x0E31, 0x0E45}, 	 	{{0, 2, 2, {0x0E19, 0x0E31}},			{2, 3, 1, {0x0E45}}}},
sl@0
  1173
	{ 3, {0x0E19, 0x0E36, 0x0E24}, 	 	{{0, 2, 2, {0x0E19, 0x0E36}},			{2, 3, 1, {0x0E24}}}},
sl@0
  1174
sl@0
  1175
	{ 3, {0x0E19, 0x0E31, 0x0E38},		{{0, 2, 2, {0x0E19, 0x0E31}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E38}}}},
sl@0
  1176
	{ 3, {0x0E19, 0x0E36, 0x0E39}, 	 	{{0, 2, 2, {0x0E19, 0x0E36}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E39}}}},
sl@0
  1177
	{ 3, {0x0E19, 0x0E31, 0x0E3A}, 	 	{{0, 2, 2, {0x0E19, 0x0E31}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E3A}}}},
sl@0
  1178
	{ 3, {0x0E19, 0x0E36, 0x0E49}, 	 	{{0, 3, 3, {0x0E19, 0x0E36, 0x0E49}},	{-1, -1, 0, {0}}}},
sl@0
  1179
	{ 3, {0x0E19, 0x0E31, 0x0E4C}, 	 	{{0, 2, 2, {0x0E19, 0x0E31}},			{2, 3, 2, {KUnicodeDottedCircle, 0xF70E}}}},
sl@0
  1180
	{ 3, {0x0E19, 0x0E36, 0x0E47}, 	 	{{0, 2, 2, {0x0E19, 0x0E36}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E47}}}},
sl@0
  1181
	{ 3, {0x0E19, 0x0E31, 0x0E4E}, 	 	{{0, 2, 2, {0x0E19, 0x0E31}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E4E}}}},
sl@0
  1182
	{ 3, {0x0E19, 0x0E36, 0x0E34}, 	 	{{0, 2, 2, {0x0E19, 0x0E36}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E34}}}},
sl@0
  1183
	{ 3, {0x0E19, 0x0E31, 0x0E31}, 	 	{{0, 2, 2, {0x0E19, 0x0E31}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E31}}}},
sl@0
  1184
	{ 3, {0x0E19, 0x0E36, 0x0E37}, 	 	{{0, 2, 2, {0x0E19, 0x0E36}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E37}}}},
sl@0
  1185
sl@0
  1186
//240.TEST D17 - Thai NO NU & Above Vowel 3
sl@0
  1187
	{ 3, {0x0E19, 0x0E35, 0x0E3F}, 	 	{{0, 2, 2, {0x0E19, 0x0E35}},			{2, 3, 1, {0x0E3F}}}},
sl@0
  1188
	{ 3, {0x0E19, 0x0E37, 0x0E03}, 	 	{{0, 2, 2, {0x0E19, 0x0E37}},			{2, 3, 1, {0x0E03}}}},
sl@0
  1189
	{ 3, {0x0E19, 0x0E35, 0x0E40}, 	 	{{0, 2, 2, {0x0E19, 0x0E35}},			{2, 3, 1, {0x0E40}}}},
sl@0
  1190
	{ 3, {0x0E19, 0x0E37, 0x0E30}, 	 	{{0, 2, 2, {0x0E19, 0x0E37}},			{2, 3, 1, {0x0E30}}}},
sl@0
  1191
	{ 3, {0x0E19, 0x0E35, 0x0E45}, 	 	{{0, 2, 2, {0x0E19, 0x0E35}},			{2, 3, 1, {0x0E45}}}},
sl@0
  1192
	{ 3, {0x0E19, 0x0E37, 0x0E24}, 	 	{{0, 2, 2, {0x0E19, 0x0E37}},			{2, 3, 1, {0x0E24}}}},
sl@0
  1193
sl@0
  1194
	{ 3, {0x0E19, 0x0E35, 0x0E38},		{{0, 2, 2, {0x0E19, 0x0E35}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E38}}}},
sl@0
  1195
	{ 3, {0x0E19, 0x0E37, 0x0E39}, 	 	{{0, 2, 2, {0x0E19, 0x0E37}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E39}}}},
sl@0
  1196
	{ 3, {0x0E19, 0x0E35, 0x0E3A}, 	 	{{0, 2, 2, {0x0E19, 0x0E35}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E3A}}}},
sl@0
  1197
	{ 3, {0x0E19, 0x0E37, 0x0E49}, 	 	{{0, 3, 3, {0x0E19, 0x0E37, 0x0E49}},	{-1, -1, 0, {0}}}},
sl@0
  1198
	{ 3, {0x0E19, 0x0E35, 0x0E4C}, 	 	{{0, 2, 2, {0x0E19, 0x0E35}},			{2, 3, 2, {KUnicodeDottedCircle, 0xF70E}}}},
sl@0
  1199
	{ 3, {0x0E19, 0x0E37, 0x0E47},		{{0, 2, 2, {0x0E19, 0x0E37}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E47}}}},
sl@0
  1200
	{ 3, {0x0E19, 0x0E35, 0x0E4E}, 	 	{{0, 2, 2, {0x0E19, 0x0E35}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E4E}}}},
sl@0
  1201
	{ 3, {0x0E19, 0x0E37, 0x0E34}, 	 	{{0, 2, 2, {0x0E19, 0x0E37}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E34}}}},
sl@0
  1202
	{ 3, {0x0E19, 0x0E35, 0x0E31}, 	 	{{0, 2, 2, {0x0E19, 0x0E35}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E31}}}},
sl@0
  1203
	{ 3, {0x0E19, 0x0E37, 0x0E37}, 	 	{{0, 2, 2, {0x0E19, 0x0E37}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E37}}}},
sl@0
  1204
sl@0
  1205
//256.TEST D18a - Test Thai combining marks stack over a dotted circle.
sl@0
  1206
	{ 2, {0x0E36, 0x0E48}, 	 			{{0, 2, 3, {KUnicodeDottedCircle, 0x0E36, 0x0E48}},	{-1, -1, 0, {0}}}},
sl@0
  1207
sl@0
  1208
//257.TEST D18b - Test non-thai consonant preceding two tone/signs in a row
sl@0
  1209
	{ 2, {0x0041, 0x0E48, 0x0E49},		{{1, 2, 2, {KUnicodeDottedCircle, 0xF70A}},	{2, 3, 2, {KUnicodeDottedCircle, 0xF70B}}}},
sl@0
  1210
sl@0
  1211
//258. TEST DEF038524 - Test WTT2.0 Rare 4 optional combinations 0xBE, 0xDE, 0xE7, 0xF7
sl@0
  1212
//3 Not supported, but render should degrade display to not overstrike at a minimum. 1 is supported.
sl@0
  1213
	{ 3, {0x0E01, 0x0E35, 0x0E47},		{{0, 2, 2, {0x0E01, 0x0E35}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E47}}}},
sl@0
  1214
	{ 3, {0x0E01, 0x0E37, 0x0E47},		{{0, 2, 2, {0x0E01, 0x0E37}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E47}}}},
sl@0
  1215
	{ 3, {0x0E01, 0x0E38, 0x0E4D},		{{0, 3, 3, {0x0E01, 0x0E38, 0x0E4D}},	{-1, -1, 0, {0}}}},
sl@0
  1216
	{ 3, {0x0E01, 0x0E34, 0x0E4D},		{{0, 2, 2, {0x0E01, 0x0E34}},			{2, 3, 2, {KUnicodeDottedCircle, 0x0E4D}}}},
sl@0
  1217
sl@0
  1218
//246.TABLE END
sl@0
  1219
	{ -1, {0}, 	 				{{-1, -1, 0, {0}},				{-1, -1, 0, {0}}}}
sl@0
  1220
	};
sl@0
  1221
sl@0
  1222
sl@0
  1223
//
sl@0
  1224
// --- CLASS CTGlyphSelection --------------------------------------------
sl@0
  1225
//
sl@0
  1226
sl@0
  1227
sl@0
  1228
CTGlyphSelection::CTGlyphSelection(CTestStep* aStep) :
sl@0
  1229
	CTGraphicsBase(aStep),
sl@0
  1230
	iTestFont(NULL),
sl@0
  1231
	iTestGraphicsDevice(NULL),
sl@0
  1232
	iTestGraphicsContext(NULL)
sl@0
  1233
	{
sl@0
  1234
	}
sl@0
  1235
sl@0
  1236
sl@0
  1237
CTGlyphSelection::~CTGlyphSelection()
sl@0
  1238
/**
sl@0
  1239
 This method cleans up after testing is finished. It releases memory
sl@0
  1240
 allocated by the test obejct at a point before object destruction.
sl@0
  1241
*/
sl@0
  1242
	{
sl@0
  1243
	delete iTestGraphicsContext;
sl@0
  1244
	delete iTestGraphicsDevice;
sl@0
  1245
	delete iTestFont;
sl@0
  1246
	iFs.Close();
sl@0
  1247
	}
sl@0
  1248
sl@0
  1249
void CTGlyphSelection::ConstructL()
sl@0
  1250
	{
sl@0
  1251
	CreateTestGraphicsContextL();
sl@0
  1252
	User::LeaveIfError(iFs.Connect());
sl@0
  1253
	}
sl@0
  1254
sl@0
  1255
void CTGlyphSelection::CreateTestGraphicsContextL()
sl@0
  1256
/**
sl@0
  1257
 This method sets-up the context data for the proceeding test cases.
sl@0
  1258
*/
sl@0
  1259
	{
sl@0
  1260
	// Setup 400 pixel dummy graphics test device.
sl@0
  1261
	TSize windowSize(400, 400);
sl@0
  1262
	iTestGraphicsDevice = CTestGraphicsDevice::NewL(windowSize);
sl@0
  1263
sl@0
  1264
	// Create a dummy graphics test context.
sl@0
  1265
	CGraphicsContext* tContext = NULL;	
sl@0
  1266
	TEST(iTestGraphicsDevice->CreateContext(tContext) == KErrNone);
sl@0
  1267
	iTestGraphicsContext = static_cast<CTestGraphicsContext*>(tContext);
sl@0
  1268
sl@0
  1269
	// Allocate the dummy test font to be used.
sl@0
  1270
	iTestFont = new (ELeave) CTestFont;
sl@0
  1271
	}
sl@0
  1272
sl@0
  1273
sl@0
  1274
LOCAL_C TInt TestApiBoundaries_TC2(TAny* aData)
sl@0
  1275
/**
sl@0
  1276
 This is a root thread function which runs as part of the test case
sl@0
  1277
 CTGlyphSelection::TestApiBoundaries(). It tests a panic
sl@0
  1278
 is produced when an invalid text descriptor is supplied in the
sl@0
  1279
 TPositionParam argument.
sl@0
  1280
*/
sl@0
  1281
	{
sl@0
  1282
	CTGlyphSelection* testPtr = (CTGlyphSelection*)aData;
sl@0
  1283
sl@0
  1284
	CFont::TPositionParam param;
sl@0
  1285
	param.iDirection = CFont::EHorizontal;
sl@0
  1286
	param.iFlags = CFont::TPositionParam::EFLogicalOrder;
sl@0
  1287
	param.iPosInText = 0;
sl@0
  1288
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  1289
sl@0
  1290
	testPtr->iTestFont->GetCharacterPosition(param);
sl@0
  1291
sl@0
  1292
	// Line above panics if component in UDEB is working OK; 
sl@0
  1293
	// should never get here if component is in UDEB.
sl@0
  1294
sl@0
  1295
	// If component is in UREL, then could reach here.
sl@0
  1296
	
sl@0
  1297
	return (0);
sl@0
  1298
	}
sl@0
  1299
sl@0
  1300
sl@0
  1301
LOCAL_C TInt TestApiBoundaries_TC5(TAny* aData)
sl@0
  1302
/**
sl@0
  1303
 This is a root thread function which runs as part of the test case
sl@0
  1304
 CTGlyphSelection::TestApiBoundaries(). It tests a panic
sl@0
  1305
 is produced when a negative text position is supplied in the
sl@0
  1306
 TPositionParam argument.
sl@0
  1307
*/
sl@0
  1308
	{
sl@0
  1309
	CTGlyphSelection* testPtr = (CTGlyphSelection*)aData;
sl@0
  1310
sl@0
  1311
	CFont::TPositionParam param;
sl@0
  1312
	param.iDirection = CFont::EHorizontal;
sl@0
  1313
	param.iFlags = CFont::TPositionParam::EFLogicalOrder;
sl@0
  1314
	_LIT16(KText_aaaa, "aaaa");
sl@0
  1315
	param.iText.Set(KText_aaaa);
sl@0
  1316
	param.iPosInText = -10;
sl@0
  1317
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  1318
sl@0
  1319
	testPtr->iTestFont->GetCharacterPosition(param);
sl@0
  1320
sl@0
  1321
	// Line above panics if component in UDEB is working OK; 
sl@0
  1322
	// should never get here if component is in UDEB.
sl@0
  1323
sl@0
  1324
	// If component is in UREL, then could reach here.
sl@0
  1325
sl@0
  1326
	return (0);
sl@0
  1327
	}
sl@0
  1328
sl@0
  1329
sl@0
  1330
void CTGlyphSelection::TestApiBoundaries()
sl@0
  1331
/**
sl@0
  1332
 This method is a test case to exercise GetCharacterPosition() with
sl@0
  1333
 parameter values at range boundaries and in some cases out-or-raange.
sl@0
  1334
*/
sl@0
  1335
	{
sl@0
  1336
	TBool r;
sl@0
  1337
	TBuf<20> testText(0);
sl@0
  1338
sl@0
  1339
	CFont::TPositionParam param;
sl@0
  1340
	param.iDirection = CFont::EHorizontal;
sl@0
  1341
	param.iFlags = CFont::TPositionParam::EFLogicalOrder;
sl@0
  1342
sl@0
  1343
	// 1: Check input arguments in paramter not modified
sl@0
  1344
	testText = _L16("a");
sl@0
  1345
	param.iText.Set(testText);
sl@0
  1346
	param.iPosInText = 0;
sl@0
  1347
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  1348
	r = iTestFont->GetCharacterPosition(param);
sl@0
  1349
	TEST(r && param.iDirection == CFont::EHorizontal
sl@0
  1350
		   && param.iFlags == CFont::TPositionParam::EFLogicalOrder
sl@0
  1351
		   && param.iText.Ptr() == testText.Ptr());
sl@0
  1352
sl@0
  1353
	// 2: Check invalid iText descriptor panics (when component in UDEB)
sl@0
  1354
	//    When component built in UREL, behaviour is undefined, so do not test.
sl@0
  1355
	TRequestStatus threadStatus;
sl@0
  1356
	RThread thread;
sl@0
  1357
	TInt rc;
sl@0
  1358
	TBool jit;
sl@0
  1359
	jit = User::JustInTime();
sl@0
  1360
	User::SetJustInTime(EFalse);
sl@0
  1361
	rc = thread.Create(KThread2NameFirst, TestApiBoundaries_TC2, 
sl@0
  1362
		KDefaultStackSize, KMinHeapSize, KMinHeapSize*4, this);
sl@0
  1363
	TEST(KErrNone == rc);
sl@0
  1364
	thread.Logon(threadStatus);
sl@0
  1365
	thread.Resume();
sl@0
  1366
	User::WaitForRequest(threadStatus);
sl@0
  1367
	
sl@0
  1368
	if (thread.ExitType() == EExitPanic)
sl@0
  1369
		{
sl@0
  1370
		TEST (thread.ExitReason() == EGdiPanic_InvalidInputParam);
sl@0
  1371
		INFO_PRINTF2(_L("Exit reason %d"), thread.ExitReason());
sl@0
  1372
		TExitCategoryName exitCategory = thread.ExitCategory();
sl@0
  1373
		INFO_PRINTF2(_L("Exit category %S"), &exitCategory);			
sl@0
  1374
		}
sl@0
  1375
	else
sl@0
  1376
		{
sl@0
  1377
		// Function does not panic on invalid input; 
sl@0
  1378
		// Warn that this is only valid behaviour if the GDI component being tested is built in UREL mode
sl@0
  1379
		// and there is a problem if the function has not panicked if the GDI component is build in UDEB mode
sl@0
  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."));
sl@0
  1381
		}	
sl@0
  1382
	thread.Close();
sl@0
  1383
	User::SetJustInTime(jit);
sl@0
  1384
sl@0
  1385
	// 3: Zero length text descriptor
sl@0
  1386
	testText = _L("");
sl@0
  1387
	param.iText.Set(testText);
sl@0
  1388
	param.iPosInText = 0;
sl@0
  1389
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  1390
	r = iTestFont->GetCharacterPosition(param);
sl@0
  1391
	TEST(!r && param.iPen.iX == 0 
sl@0
  1392
		    && param.iOutputGlyphs == 0);
sl@0
  1393
sl@0
  1394
	// 4: Position in text beyond descriptor length
sl@0
  1395
	testText = _L16("a");
sl@0
  1396
	param.iText.Set(testText);
sl@0
  1397
	param.iPosInText = 5;
sl@0
  1398
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  1399
	r = iTestFont->GetCharacterPosition(param);
sl@0
  1400
	TEST(!r && param.iPen.iX == 0 
sl@0
  1401
		   && param.iOutputGlyphs == 0);
sl@0
  1402
sl@0
  1403
	// 5: Position in text is negative, should panic (when component in UDEB)
sl@0
  1404
	//    When component built in UREL, behaviour is undefined, so do not test.
sl@0
  1405
	jit = User::JustInTime();
sl@0
  1406
	User::SetJustInTime(EFalse);
sl@0
  1407
	rc = thread.Create(KThread2NameSecond, TestApiBoundaries_TC5, 
sl@0
  1408
		KDefaultStackSize, KMinHeapSize, KMinHeapSize*4, this);
sl@0
  1409
	TEST(KErrNone == rc);
sl@0
  1410
	thread.Logon(threadStatus);
sl@0
  1411
	thread.Resume();
sl@0
  1412
	User::WaitForRequest(threadStatus);
sl@0
  1413
sl@0
  1414
	if (thread.ExitType() == EExitPanic)
sl@0
  1415
		{
sl@0
  1416
		TEST (thread.ExitReason() == EGdiPanic_InvalidInputParam);
sl@0
  1417
		INFO_PRINTF2(_L("Exit reason %d"), thread.ExitReason());
sl@0
  1418
		TExitCategoryName exitCategory = thread.ExitCategory();
sl@0
  1419
		INFO_PRINTF2(_L("Exit category %S"), &exitCategory);			
sl@0
  1420
		}
sl@0
  1421
	else
sl@0
  1422
		{
sl@0
  1423
		// Function does not panic on invalid input; 
sl@0
  1424
		// Warn that this is only valid behaviour if the GDI component being tested is built in UREL mode
sl@0
  1425
		// and there is a problem if the function has not panicked if the GDI component is build in UDEB mode
sl@0
  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."));
sl@0
  1427
		}	
sl@0
  1428
sl@0
  1429
	thread.Close();
sl@0
  1430
	User::SetJustInTime(jit);
sl@0
  1431
sl@0
  1432
	// 6: Check 'No-char-data' condition handled
sl@0
  1433
	testText = _L16("A\033C");
sl@0
  1434
	param.iText.Set(testText);
sl@0
  1435
	param.iPosInText = 1;
sl@0
  1436
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  1437
	r = iTestFont->GetCharacterPosition(param);
sl@0
  1438
	TEST( !r
sl@0
  1439
		   && param.iPosInText == 2
sl@0
  1440
		   && param.iPen.iX == 0 
sl@0
  1441
		   && param.iOutputGlyphs == 0);
sl@0
  1442
sl@0
  1443
	// 7: Check "Not-a-Char" condition handled
sl@0
  1444
	testText = _L16("\xFFFF\xFFFE\xFFFF\xFFFF\xFFFF\xFFFE\xFFFF\xFFFF\xFFFF\xFFFE\xFFFF\xFFFF");
sl@0
  1445
	param.iText.Set(testText);
sl@0
  1446
	param.iPosInText = 0;
sl@0
  1447
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  1448
	r = iTestFont->GetCharacterPosition(param);
sl@0
  1449
	TEST(  r
sl@0
  1450
		   && param.iPosInText == 1
sl@0
  1451
		   && param.iPen.iX == 0 
sl@0
  1452
		   && param.iOutputGlyphs == 0);
sl@0
  1453
sl@0
  1454
	param.iPosInText = 5;
sl@0
  1455
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  1456
	r = iTestFont->GetCharacterPosition(param);
sl@0
  1457
	TEST(  r
sl@0
  1458
		   && param.iPosInText == 6
sl@0
  1459
		   && param.iPen.iX == 0 
sl@0
  1460
		   && param.iOutputGlyphs == 0);
sl@0
  1461
sl@0
  1462
	// 8. Check that a cluster cannot be made from heterogeneous elements
sl@0
  1463
	// (in this case a 6 with a Hindi virama)
sl@0
  1464
	testText = _L16("6\x94D");
sl@0
  1465
	param.iText.Set(testText);
sl@0
  1466
	param.iPosInText = 0;
sl@0
  1467
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  1468
	r = iTestFont->GetCharacterPosition(param);
sl@0
  1469
	TEST(r && param.iOutputGlyphs == 1);
sl@0
  1470
	}
sl@0
  1471
sl@0
  1472
inline TBool IsSupplementary(TUint aChar)
sl@0
  1473
/**
sl@0
  1474
@param aChar The 32-bit code point value of a Unicode character.
sl@0
  1475
sl@0
  1476
@return True, if aChar is supplementary character; false, otherwise.
sl@0
  1477
*/
sl@0
  1478
	{
sl@0
  1479
	return (aChar > 0xFFFF);
sl@0
  1480
	}
sl@0
  1481
sl@0
  1482
inline TBool IsSurrogate(TText16 aInt16)
sl@0
  1483
/**
sl@0
  1484
@return True, if aText16 is high surrogate or low surrogate; false, otherwise.
sl@0
  1485
*/
sl@0
  1486
	{
sl@0
  1487
	return (aInt16 & 0xF800) == 0xD800;
sl@0
  1488
	}
sl@0
  1489
sl@0
  1490
inline TText16 GetHighSurrogate(TUint aChar)
sl@0
  1491
/**
sl@0
  1492
Retrieve the high surrogate of a supplementary character.
sl@0
  1493
sl@0
  1494
@param aChar The 32-bit code point value of a Unicode character.
sl@0
  1495
sl@0
  1496
@return High surrogate of aChar, if aChar is a supplementary character; 
sl@0
  1497
        aChar itself, if aChar is not a supplementary character.
sl@0
  1498
*/
sl@0
  1499
	{
sl@0
  1500
	return STATIC_CAST(TText16, 0xD7C0 + (aChar >> 10));
sl@0
  1501
	}
sl@0
  1502
sl@0
  1503
inline TText16 GetLowSurrogate(TUint aChar)
sl@0
  1504
/**
sl@0
  1505
Retrieve the low surrogate of a supplementary character.
sl@0
  1506
sl@0
  1507
@param aChar The 32-bit code point value of a Unicode character.
sl@0
  1508
sl@0
  1509
@return Low surrogate of aChar, if aChar is a supplementary character; 
sl@0
  1510
        zero, if aChar is not a supplementary character.
sl@0
  1511
*/
sl@0
  1512
	{
sl@0
  1513
	return STATIC_CAST(TText16, 0xDC00 | (aChar & 0x3FF));
sl@0
  1514
	}
sl@0
  1515
sl@0
  1516
void CTGlyphSelection::TestCodepoint(TUint aCodepoint, CFont* aFont)
sl@0
  1517
/**
sl@0
  1518
 This helper routine is used by the test case 
sl@0
  1519
 CTGlyphSelection::TestCtrlCharsIgnored().
sl@0
  1520
@param aCodepoint
sl@0
  1521
 The Unicode character to test.
sl@0
  1522
@param aFont
sl@0
  1523
 The font to use in the test.
sl@0
  1524
*/
sl@0
  1525
	{
sl@0
  1526
	TInt expectResultPosInText;
sl@0
  1527
sl@0
  1528
	const TInt KTestTextLen = 5;
sl@0
  1529
	TBuf<16> testText(KTestTextLen);
sl@0
  1530
	testText[0] = 'a';
sl@0
  1531
	testText[1] = 'b';
sl@0
  1532
	if (IsSupplementary(aCodepoint))
sl@0
  1533
		{
sl@0
  1534
		testText[2] = GetHighSurrogate(aCodepoint);
sl@0
  1535
		testText[3] = GetLowSurrogate(aCodepoint);
sl@0
  1536
		expectResultPosInText = 4;
sl@0
  1537
		}
sl@0
  1538
	else
sl@0
  1539
		{
sl@0
  1540
		testText[2] = aCodepoint;
sl@0
  1541
		testText[3] = 'c';
sl@0
  1542
		expectResultPosInText = 3;
sl@0
  1543
		}
sl@0
  1544
	testText[4] = 'd';
sl@0
  1545
sl@0
  1546
	CFont::TPositionParam param;
sl@0
  1547
	param.iDirection = CFont::EHorizontal;
sl@0
  1548
	param.iFlags = CFont::TPositionParam::EFLogicalOrder;
sl@0
  1549
	param.iText.Set(testText);
sl@0
  1550
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  1551
	param.iPosInText = 2; 
sl@0
  1552
	TBool r = aFont->GetCharacterPosition(param);
sl@0
  1553
sl@0
  1554
	TEST(r && param.iPosInText == expectResultPosInText
sl@0
  1555
		   && param.iPen.iX == 0 
sl@0
  1556
		   && param.iOutputGlyphs == 0);
sl@0
  1557
	}
sl@0
  1558
sl@0
  1559
sl@0
  1560
void CTGlyphSelection::TestCtrlCharsIgnored()
sl@0
  1561
/**
sl@0
  1562
 This method is a test case to test GetCharacterPosition() copes
sl@0
  1563
 with formatting and control characters in the text supplied by
sl@0
  1564
 ignoring them.
sl@0
  1565
*/
sl@0
  1566
	{
sl@0
  1567
	static const TUint testData[] = {
sl@0
  1568
		// 1: Formatting control codes Unicode3-p499&p500
sl@0
  1569
		0x200C, 0x200D, 0x200E, 0x200F,
sl@0
  1570
		0x202A, 0x202B, 0x202C, 0x202D, 0x202E,
sl@0
  1571
		// 3: Non-character codes Unicode3-p846 U+FFFE?
sl@0
  1572
		// Original:
sl@0
  1573
		// 0xFFFF 
sl@0
  1574
		// 4: Latin Ctrl codes U+0000..U+001F, U+007F Unicode3-p???
sl@0
  1575
		// 5: Latin Supplement Ctrl code U+0080..U+009F Unicode3-p???
sl@0
  1576
		// 6: Supplementary characters (scripts outside BMP still not supported)
sl@0
  1577
		};
sl@0
  1578
	static const TUint testDataLength = sizeof(testData)/sizeof(testData[0]);
sl@0
  1579
sl@0
  1580
	for (TUint i = 0; i < testDataLength; i++)
sl@0
  1581
		TestCodepoint(testData[i], iTestFont);
sl@0
  1582
	}
sl@0
  1583
sl@0
  1584
sl@0
  1585
void CTGlyphSelection::TestLatinChars()
sl@0
  1586
/**
sl@0
  1587
 This method is a test case to test GetCharacterPosition() correctly
sl@0
  1588
 processes characters from the Latin code page returning appropriate glyphs
sl@0
  1589
 codes.
sl@0
  1590
*/
sl@0
  1591
	{
sl@0
  1592
	TBool r;
sl@0
  1593
	CFont::TPositionParam param;
sl@0
  1594
	param.iDirection = CFont::EHorizontal;
sl@0
  1595
	param.iFlags = CFont::TPositionParam::EFLogicalOrder;
sl@0
  1596
	_LIT16(KText_aBc_1, "aBc 1");
sl@0
  1597
	param.iText.Set(KText_aBc_1);
sl@0
  1598
sl@0
  1599
	// 1: Latin glyph at start of text
sl@0
  1600
	param.iPosInText = 0;
sl@0
  1601
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  1602
	r = iTestFont->GetCharacterPosition(param);
sl@0
  1603
	TEST(r && param.iPosInText == 1 
sl@0
  1604
		   && param.iPen.iX == 10
sl@0
  1605
		   && param.iOutputGlyphs == 1 
sl@0
  1606
		   && param.iOutput[0].iCode == 'a');
sl@0
  1607
sl@0
  1608
	// 2: Latin glyph in middle of text
sl@0
  1609
	param.iPosInText = 1;
sl@0
  1610
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  1611
	r = iTestFont->GetCharacterPosition(param);
sl@0
  1612
	TEST(r && param.iPosInText == 2 
sl@0
  1613
		   && param.iPen.iX == 10
sl@0
  1614
		   && param.iOutputGlyphs == 1 
sl@0
  1615
		   && param.iOutput[0].iCode == 'B');
sl@0
  1616
sl@0
  1617
	// 3: Latin glyph at end of text
sl@0
  1618
	param.iPosInText = 4;
sl@0
  1619
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  1620
	r = iTestFont->GetCharacterPosition(param);
sl@0
  1621
	TEST(r && param.iPosInText == 5 
sl@0
  1622
		   && param.iPen.iX == 10
sl@0
  1623
		   && param.iOutputGlyphs == 1 
sl@0
  1624
		   && param.iOutput[0].iCode == '1');
sl@0
  1625
sl@0
  1626
	// 4: Latin space glyph 
sl@0
  1627
	param.iPosInText = 3;
sl@0
  1628
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  1629
	r = iTestFont->GetCharacterPosition(param);
sl@0
  1630
	TEST(r && param.iPosInText == 4 
sl@0
  1631
		   && param.iPen.iX == 10
sl@0
  1632
		   && param.iOutputGlyphs == 1 
sl@0
  1633
		   && param.iOutput[0].iCode == ' ');
sl@0
  1634
	}	
sl@0
  1635
sl@0
  1636
sl@0
  1637
void CTGlyphSelection::TestSoftHyphen()
sl@0
  1638
/**
sl@0
  1639
 This method is a test case to test GetCharacterPosition() correctly
sl@0
  1640
 processes soft hyphen chars by ignoring them if they are NOT at the
sl@0
  1641
 end of the text (aka end of the line).
sl@0
  1642
*/
sl@0
  1643
	{
sl@0
  1644
	TBool r;
sl@0
  1645
	CFont::TPositionParam param;
sl@0
  1646
	param.iDirection = CFont::EHorizontal;
sl@0
  1647
	param.iFlags = CFont::TPositionParam::EFLogicalOrder;
sl@0
  1648
	_LIT16(KText_DKNY, "DK\xadNY\xad");
sl@0
  1649
	param.iText.Set(KText_DKNY);
sl@0
  1650
sl@0
  1651
	// 1: Invoke on char before hyphen position 
sl@0
  1652
	// This test returns only the glyph of the char before the hyphen
sl@0
  1653
	// treating the hyphen as another base char which end scanning. 
sl@0
  1654
	param.iPosInText = 1;
sl@0
  1655
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  1656
	r = iTestFont->GetCharacterPosition(param);
sl@0
  1657
	TEST(r && param.iPosInText == 2 
sl@0
  1658
		   && param.iPen.iX == 10
sl@0
  1659
		   && param.iOutputGlyphs == 1 
sl@0
  1660
		   && param.iOutput[0].iCode == 'K');
sl@0
  1661
sl@0
  1662
	// 2: Invoke on hyphen position
sl@0
  1663
	// This test should show it ignores and skips soft hyphens returning
sl@0
  1664
	// no hyphen glyph. This is because soft hyphen are not visible when
sl@0
  1665
	// in middle of lines.
sl@0
  1666
	param.iPosInText = 2;
sl@0
  1667
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  1668
	r = iTestFont->GetCharacterPosition(param);
sl@0
  1669
	TEST(r && param.iPosInText == 3 
sl@0
  1670
		   && param.iPen.iX == 0
sl@0
  1671
		   && param.iOutputGlyphs == 0);
sl@0
  1672
sl@0
  1673
	// 3: Invoke on hyphen position when hyphen at end of text
sl@0
  1674
	// This test should result in the hyphen glyph being returned as it
sl@0
  1675
	// is expect to be visible when it is at the end of the text supplied.
sl@0
  1676
	param.iPosInText = 5;
sl@0
  1677
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  1678
	r = iTestFont->GetCharacterPosition(param);
sl@0
  1679
	TEST(r && param.iPosInText == 6 
sl@0
  1680
		   && param.iPen.iX == 10
sl@0
  1681
		   && param.iOutputGlyphs == 1 
sl@0
  1682
		   && param.iOutput[0].iCode == 0x00AD);
sl@0
  1683
sl@0
  1684
	}	
sl@0
  1685
sl@0
  1686
sl@0
  1687
void CTGlyphSelection::TestSurrogates()
sl@0
  1688
/**
sl@0
  1689
 This method is a test case to test GetCharacterPosition() correctly
sl@0
  1690
 processes surrogate pairs.
sl@0
  1691
*/
sl@0
  1692
	{
sl@0
  1693
	static const TUint validPairs[] = {
sl@0
  1694
	//  Hi		Lo		Code		Hi		Lo		Code		Hi		Lo		Code
sl@0
  1695
		0xD800, 0xDC00, 0x00010000, 0xD800, 0xDE9A, 0x0001029A, 0xD800, 0xDFFF, 0x000103FF,
sl@0
  1696
		0xD89A, 0xDC00, 0x00036800, 0xD89A, 0xDE9A, 0x00036A9A, 0xD89A, 0xDFFF, 0x00036BFF,
sl@0
  1697
		0xDBFF, 0xDC00, 0x0010FC00, 0xDBFF, 0xDE9A, 0x0010FE9A, 0xDBFF, 0xDFFF, 0x0010FFFF
sl@0
  1698
		};
sl@0
  1699
	static const TUint validPairsLength = sizeof(validPairs)/sizeof(TText16);
sl@0
  1700
sl@0
  1701
	TBool r;
sl@0
  1702
	TBuf<20> testText(0);
sl@0
  1703
	CFont::TPositionParam param;
sl@0
  1704
	param.iDirection = CFont::EHorizontal;
sl@0
  1705
	param.iFlags = CFont::TPositionParam::EFLogicalOrder;
sl@0
  1706
sl@0
  1707
	// 1: Test valid surrogate pair chars
sl@0
  1708
	testText.SetLength(5);
sl@0
  1709
	testText[0] = 'a';
sl@0
  1710
	testText[3] = 'D';
sl@0
  1711
	testText[4] = '1';
sl@0
  1712
	param.iText.Set(testText);
sl@0
  1713
	for (TUint i = 0; i < validPairsLength/3; i+=3)
sl@0
  1714
		{
sl@0
  1715
		testText[1] = (TText16) validPairs[i];
sl@0
  1716
		testText[2] = (TText16) validPairs[i+1];
sl@0
  1717
		param.iPosInText = 1;
sl@0
  1718
		param.iPen.iX = param.iPen.iY = 0;
sl@0
  1719
		r = iTestFont->GetCharacterPosition(param);
sl@0
  1720
		TEST(r && param.iPosInText == 3
sl@0
  1721
				&& param.iPen.iX == 10
sl@0
  1722
				&& param.iOutputGlyphs == 1
sl@0
  1723
				&& param.iOutput[0].iCode == validPairs[i+2]);
sl@0
  1724
		}
sl@0
  1725
sl@0
  1726
	// 2: Test unpaired high surrogate chars
sl@0
  1727
	testText[1] = 0xD809;
sl@0
  1728
	testText[2] = 'a';
sl@0
  1729
	param.iPosInText = 1;
sl@0
  1730
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  1731
	r = iTestFont->GetCharacterPosition(param);
sl@0
  1732
	TEST(r && param.iPosInText == 2
sl@0
  1733
		   && param.iPen.iX == 0
sl@0
  1734
		   && param.iOutputGlyphs == 0);
sl@0
  1735
sl@0
  1736
	// 3: Test unpaired low surrogate chars
sl@0
  1737
	testText[1] = 'a';
sl@0
  1738
	testText[2] = 0xDC09;
sl@0
  1739
	param.iPosInText = 2;
sl@0
  1740
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  1741
	r = iTestFont->GetCharacterPosition(param);
sl@0
  1742
	TEST(r && param.iPosInText == 3
sl@0
  1743
		   && param.iPen.iX == 0
sl@0
  1744
		   && param.iOutputGlyphs == 0);
sl@0
  1745
sl@0
  1746
	// 4: Test latin/surrogate boundry ensuring surrogate not skipped!
sl@0
  1747
	testText[1] = (TText16) validPairs[0];
sl@0
  1748
	testText[2] = (TText16) validPairs[1];
sl@0
  1749
	param.iPosInText = 0;
sl@0
  1750
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  1751
	r = iTestFont->GetCharacterPosition(param);
sl@0
  1752
	TEST(r && param.iPosInText == 1
sl@0
  1753
		   && param.iPen.iX == 10
sl@0
  1754
		   && param.iOutputGlyphs == 1
sl@0
  1755
		   && param.iOutput[0].iCode =='a');
sl@0
  1756
	}
sl@0
  1757
sl@0
  1758
sl@0
  1759
/**
sl@0
  1760
@SYMTestCaseID TI18N-GDI-CIT-4077
sl@0
  1761
@SYMTestCaseDesc Automated GDI testing for GB18030 ExtB
sl@0
  1762
@SYMTestPriority High
sl@0
  1763
@SYMTestActions  Attempt to get glyph information for GB18030 ExtB characters.
sl@0
  1764
@SYMTestExpectedResults The expected glyph clusters for given Unicode charactors must be returned
sl@0
  1765
@SYMPREQ 2471: UTF-16 compliant text handling
sl@0
  1766
*/
sl@0
  1767
void CTGlyphSelection::TestNonBmpCharsInGB18030(CFbsFont* aFont)
sl@0
  1768
	{
sl@0
  1769
	INFO_PRINTF1(_L("Test GB18030 non-BMP Glyphs"));	
sl@0
  1770
	// Do the testing
sl@0
  1771
	
sl@0
  1772
	TBool r;
sl@0
  1773
	TBuf<30> testText(0);
sl@0
  1774
	CFont::TPositionParam param;
sl@0
  1775
	param.iDirection = CFont::EHorizontal;
sl@0
  1776
	param.iFlags = CFont::TPositionParam::EFLogicalOrder;
sl@0
  1777
sl@0
  1778
	testText.SetLength(4);
sl@0
  1779
	
sl@0
  1780
	// 201AD = D840, DDAD
sl@0
  1781
	testText[0] = 0xD840;
sl@0
  1782
	testText[1] = 0xDDAD;
sl@0
  1783
	
sl@0
  1784
	// 253BB = D854, DFBB
sl@0
  1785
	testText[2] = 0xD854;
sl@0
  1786
	testText[3] = 0xDFBB;
sl@0
  1787
		
sl@0
  1788
	param.iText.Set(testText);
sl@0
  1789
	
sl@0
  1790
	RShapeInfo aShapeInfo;
sl@0
  1791
sl@0
  1792
	// Do the testing
sl@0
  1793
	
sl@0
  1794
	param.iPosInText = 0;
sl@0
  1795
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  1796
	r = aFont->GetCharacterPosition2(param, aShapeInfo);
sl@0
  1797
sl@0
  1798
	TEST(r && param.iPosInText == 2 
sl@0
  1799
		   && param.iOutputGlyphs == 1
sl@0
  1800
		   && param.iOutput[0].iCode == 0x000201AD);
sl@0
  1801
sl@0
  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);
sl@0
  1803
sl@0
  1804
	param.iPosInText = 2;
sl@0
  1805
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  1806
	r = aFont->GetCharacterPosition2(param, aShapeInfo);
sl@0
  1807
sl@0
  1808
	TEST(r && param.iPosInText == 4 
sl@0
  1809
		   && param.iOutputGlyphs == 1
sl@0
  1810
		   && param.iOutput[0].iCode == 0x000253BB);
sl@0
  1811
sl@0
  1812
	
sl@0
  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);
sl@0
  1814
	
sl@0
  1815
	// Close aShapeInfo which releases any memory it is occupying
sl@0
  1816
	if (aShapeInfo.IsOpen())
sl@0
  1817
		aShapeInfo.Close();
sl@0
  1818
		   
sl@0
  1819
	}
sl@0
  1820
sl@0
  1821
sl@0
  1822
void CTGlyphSelection::TestCombiningLatinChars()
sl@0
  1823
/**
sl@0
  1824
 This method is a test case to test GetCharacterPosition() correctly
sl@0
  1825
 processes regular latin characters with diacritics.
sl@0
  1826
*/
sl@0
  1827
	{
sl@0
  1828
	TBool r;
sl@0
  1829
	TBuf<20> testText(0);
sl@0
  1830
	CFont::TPositionParam param;
sl@0
  1831
	param.iDirection = CFont::EHorizontal;
sl@0
  1832
	param.iFlags = CFont::TPositionParam::EFLogicalOrder;
sl@0
  1833
sl@0
  1834
	testText.SetLength(10);
sl@0
  1835
	testText[0] = 'A';
sl@0
  1836
	testText[1] = ' ';
sl@0
  1837
	testText[2] = 'A';
sl@0
  1838
	testText[3] = 0x0300; // Above Grave Acent
sl@0
  1839
	testText[4] = 'I';
sl@0
  1840
	testText[5] = 0x0330; // Below Tidle 
sl@0
  1841
	testText[6] = 'o';
sl@0
  1842
	testText[7] = 0x0308; // Above Diaeresis
sl@0
  1843
	testText[8] = 0x032F; // Below Inverted Breve
sl@0
  1844
	testText[9] = 'M';
sl@0
  1845
	param.iText.Set(testText);
sl@0
  1846
sl@0
  1847
	// 1: Latin base with following space
sl@0
  1848
	param.iPosInText = 0;
sl@0
  1849
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  1850
	r = iTestFont->GetCharacterPosition(param);
sl@0
  1851
	TEST(r && param.iPosInText == 1 
sl@0
  1852
		   && param.iPen.iX == 10
sl@0
  1853
		   && param.iOutputGlyphs == 1
sl@0
  1854
		   && param.iOutput[0].iCode == 'A');
sl@0
  1855
sl@0
  1856
	// 2: Latin base with 1 combining above diacritic
sl@0
  1857
	param.iPosInText = 2;
sl@0
  1858
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  1859
	r = iTestFont->GetCharacterPosition(param);
sl@0
  1860
	// Will Compose A (0x41) followed by grave accent (0x300) into A grave (0xC0)
sl@0
  1861
	TEST(r && param.iPosInText == 4 
sl@0
  1862
		   && param.iPen.iX == 10
sl@0
  1863
		   && param.iOutputGlyphs == 1
sl@0
  1864
		   && param.iOutput[0].iCode == 0xC0
sl@0
  1865
		   && param.iOutput[0].iBounds.iTl == TPoint(0,-10)
sl@0
  1866
		   && param.iOutput[0].iBounds.iBr == TPoint(10,2));
sl@0
  1867
sl@0
  1868
	// 3: Latin base with 1 combining below diacritic
sl@0
  1869
	param.iPosInText = 4;
sl@0
  1870
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  1871
	r = iTestFont->GetCharacterPosition(param);
sl@0
  1872
	// Will compose I (0x49) with tilde below (0x330) into I with tilde below (0x1E2C)
sl@0
  1873
	TEST(r && param.iPosInText == 6 
sl@0
  1874
		   && param.iPen.iX == 10
sl@0
  1875
		   && param.iOutputGlyphs == 1
sl@0
  1876
		   && param.iOutput[0].iCode == 0x1E2C
sl@0
  1877
		   && param.iOutput[0].iBounds.iTl == TPoint(0,-10)
sl@0
  1878
		   && param.iOutput[0].iBounds.iBr == TPoint(10,2));
sl@0
  1879
sl@0
  1880
	// 4: Latin base with 2 combining diacritic
sl@0
  1881
	param.iPosInText = 6;
sl@0
  1882
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  1883
	r = iTestFont->GetCharacterPosition(param);
sl@0
  1884
	TEST(r && param.iPosInText == 9 
sl@0
  1885
		   && param.iPen.iX == 10
sl@0
  1886
		   && param.iOutputGlyphs == 3
sl@0
  1887
		   && param.iOutput[0].iCode == 'o'
sl@0
  1888
		   && param.iOutput[0].iBounds.iTl == TPoint(0,-10)
sl@0
  1889
		   && param.iOutput[0].iBounds.iBr == TPoint(10,2)
sl@0
  1890
		   && param.iOutput[1].iCode == 0x0308
sl@0
  1891
		   && param.iOutput[1].iBounds.iTl == TPoint(0,-23)
sl@0
  1892
		   && param.iOutput[1].iBounds.iBr == TPoint(10,-11)
sl@0
  1893
		   && param.iOutput[2].iCode == 0x032F
sl@0
  1894
		   && param.iOutput[2].iBounds.iTl == TPoint(0,3)
sl@0
  1895
		   && param.iOutput[2].iBounds.iBr == TPoint(10,15));
sl@0
  1896
sl@0
  1897
	// 5: Latin base with 9 combining chars, should exceed max output!
sl@0
  1898
	testText[0] = 'a';
sl@0
  1899
	testText[1] = 0x0300; // Above Grave Acent
sl@0
  1900
	testText[2] = 0x0330; // Below Tidle 
sl@0
  1901
	testText[3] = 0x0308; // Above Diaeresis
sl@0
  1902
	testText[4] = 0x032F; // Below Inverted Breve
sl@0
  1903
	testText[5] = 0x0300; // Above Grave Acent
sl@0
  1904
	testText[6] = 0x0330; // Below Tidle 
sl@0
  1905
	testText[7] = 0x0308; // Above Diaeresis
sl@0
  1906
	testText[8] = 0x032F; // Below Inverted Breve
sl@0
  1907
	testText[9] = 0x0300; // Above Grave Acent
sl@0
  1908
	param.iPosInText = 0;
sl@0
  1909
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  1910
	r = iTestFont->GetCharacterPosition(param);
sl@0
  1911
	TEST(r && param.iPosInText == 8 
sl@0
  1912
		   && param.iPen.iX == 10
sl@0
  1913
		   && param.iOutputGlyphs == 8
sl@0
  1914
		   && param.iOutput[0].iCode == 'a'
sl@0
  1915
		   && param.iOutput[7].iCode == 0x0308);
sl@0
  1916
	}
sl@0
  1917
sl@0
  1918
/* 
sl@0
  1919
Used for cleanup of RImplInfoArray implementationArray below 
sl@0
  1920
This method is stolen from FbsTop.cpp
sl@0
  1921
*/
sl@0
  1922
sl@0
  1923
LOCAL_C void ResetAndDestroyRImplInfoPtrArray(TAny* aPtr)
sl@0
  1924
	{
sl@0
  1925
	RImplInfoPtrArray* array = reinterpret_cast <RImplInfoPtrArray*> (aPtr);
sl@0
  1926
	array->ResetAndDestroy();
sl@0
  1927
	}
sl@0
  1928
	
sl@0
  1929
LOCAL_C void LoadOpenFontLibraries(CFontStore* aFontStore)
sl@0
  1930
	{
sl@0
  1931
sl@0
  1932
	RImplInfoPtrArray implementationArray;
sl@0
  1933
	TCleanupItem cleanup(ResetAndDestroyRImplInfoPtrArray, &implementationArray);
sl@0
  1934
	CleanupStack::PushL(cleanup);
sl@0
  1935
	TInt error;
sl@0
  1936
	TInt ecomerror;
sl@0
  1937
	TInt ecomnotready;
sl@0
  1938
	TUid uid = {KUidOpenFontRasterizerPlunginInterface};
sl@0
  1939
sl@0
  1940
	// Making sure that no race situation arises
sl@0
  1941
	// If ECom is not ready, give it another chance and try again. if it still doesn't work 
sl@0
  1942
	// after the third try, then it just carries on quietly and fails... 
sl@0
  1943
	for (ecomnotready =0; ecomnotready <3; ecomnotready++)
sl@0
  1944
		{
sl@0
  1945
		TRAP(ecomerror,REComSession::ListImplementationsL(uid,implementationArray));
sl@0
  1946
		if (!ecomerror)
sl@0
  1947
			{
sl@0
  1948
			break;
sl@0
  1949
			}
sl@0
  1950
		else
sl@0
  1951
			{
sl@0
  1952
			ecomerror = 0; 	
sl@0
  1953
			User::After(0);
sl@0
  1954
			}
sl@0
  1955
		}
sl@0
  1956
sl@0
  1957
	const TInt availCount = implementationArray.Count();
sl@0
  1958
	for (TInt count=0;count<availCount;++count)
sl@0
  1959
		{
sl@0
  1960
		const CImplementationInformation* info = implementationArray[count];
sl@0
  1961
		TUid rasterizerUid = info->ImplementationUid();
sl@0
  1962
 		// Create a rasterizer
sl@0
  1963
 		COpenFontRasterizer* rasterizer=0;
sl@0
  1964
 		TRAP(error,rasterizer = COpenFontRasterizer::NewL(rasterizerUid));
sl@0
  1965
 		if (!error)
sl@0
  1966
   			{
sl@0
  1967
   			// Install it in the font store.
sl@0
  1968
   			TRAP(error,aFontStore->InstallRasterizerL(rasterizer));
sl@0
  1969
   			if (error)
sl@0
  1970
   				delete rasterizer;
sl@0
  1971
   			}
sl@0
  1972
		}
sl@0
  1973
	CleanupStack::PopAndDestroy(&implementationArray); 
sl@0
  1974
sl@0
  1975
	}
sl@0
  1976
	
sl@0
  1977
void CTGlyphSelection::TestIsolatedCombiningLatinChars()
sl@0
  1978
/**
sl@0
  1979
 This method is a test case to test GetCharacterPosition() correctly
sl@0
  1980
 processes isloated combining marks.
sl@0
  1981
*/
sl@0
  1982
	{
sl@0
  1983
	// Need to use a valid font so that GetCharacterPosition will be able to find the necessary glyph information.
sl@0
  1984
	_LIT16(KTestFontFile, "C:\\s60ssb_v500.ttf");
sl@0
  1985
	_LIT16(KTestFontFaceName, "Series 60 Sans");
sl@0
  1986
	
sl@0
  1987
	// create a font store for testing
sl@0
  1988
	CFontStore* fontStore = CFontStore::NewL(&User::Heap());
sl@0
  1989
	//load all ecom implemented rasterizer dlls. installs the rasterizer.	
sl@0
  1990
	LoadOpenFontLibraries(fontStore);
sl@0
  1991
	// test font preparation
sl@0
  1992
	fontStore->iKPixelWidthInTwips = 11860; //This value is default
sl@0
  1993
	//add any required font files
sl@0
  1994
	TUid err = fontStore->AddFileL(KTestFontFile);
sl@0
  1995
	TFontSpec testFontSpec(KTestFontFaceName,200); 
sl@0
  1996
	 
sl@0
  1997
	CFbsBitmap* bmp = new(ELeave) CFbsBitmap;
sl@0
  1998
	
sl@0
  1999
	TInt ret = bmp->Create(TSize(100,100),EGray2);
sl@0
  2000
	if (ret == KErrNotSupported)
sl@0
  2001
		return;
sl@0
  2002
	else
sl@0
  2003
		User::LeaveIfError(ret);
sl@0
  2004
sl@0
  2005
	CFbsBitmapDevice* device = NULL;
sl@0
  2006
	TRAPD(err2,device = CFbsBitmapDevice::NewL(bmp));
sl@0
  2007
	TEST(err2 == KErrNone);
sl@0
  2008
sl@0
  2009
	CFbsBitGc* gc = NULL;
sl@0
  2010
	User::LeaveIfError(device->CreateContext(gc));
sl@0
  2011
	// Font file Creation
sl@0
  2012
	CFbsFont* testFont = NULL;
sl@0
  2013
	User::LeaveIfError(device->GetNearestFontToDesignHeightInTwips(testFont,testFontSpec));
sl@0
  2014
	gc->UseFont(testFont);
sl@0
  2015
	CleanupStack::PushL(testFont);
sl@0
  2016
	
sl@0
  2017
	// Now start the test case:
sl@0
  2018
	
sl@0
  2019
	TBool r;
sl@0
  2020
	TBuf<20> testText(0);
sl@0
  2021
	CFont::TPositionParam param;
sl@0
  2022
	param.iFlags = CFont::TPositionParam::EFLogicalOrder;
sl@0
  2023
	
sl@0
  2024
	testText.SetLength(7);
sl@0
  2025
	testText[0] = 0x0323; 	//Below Dot
sl@0
  2026
	testText[1] = ' ';
sl@0
  2027
	testText[2] = 0x0300;   //Above Grave Acent
sl@0
  2028
	testText[3] = ' ';
sl@0
  2029
	testText[4] = 0x0323;	//Below Dot
sl@0
  2030
	testText[5] = 0x0300;	//Above Grave Acent
sl@0
  2031
	testText[6] = 0x0301; 	//Above Acute Acent
sl@0
  2032
	param.iText.Set(testText);
sl@0
  2033
	
sl@0
  2034
	// 1: Test the bounds for combining below mark in isolation
sl@0
  2035
	param.iPosInText = 0;
sl@0
  2036
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  2037
	r = testFont->GetCharacterPosition(param);
sl@0
  2038
sl@0
  2039
	TEST(r && param.iPosInText == 1 
sl@0
  2040
		   && param.iOutputGlyphs == 1 
sl@0
  2041
		   && param.iOutput[0].iCode == 0x0323);
sl@0
  2042
	
sl@0
  2043
	#if defined __WINS__ || defined __WINSCW__
sl@0
  2044
	TEST(r && param.iPen == TPoint(0,0)
sl@0
  2045
		   && param.iOutput[0].iBounds.iTl == TPoint(-6,1)
sl@0
  2046
		   && param.iOutput[0].iBounds.iBr == TPoint(-4,3));
sl@0
  2047
	#endif
sl@0
  2048
	
sl@0
  2049
	// 2: Test the bounds for combining above mark in isolation
sl@0
  2050
	param.iPosInText = 1;
sl@0
  2051
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  2052
	r = testFont->GetCharacterPosition(param);
sl@0
  2053
sl@0
  2054
	TEST(r && param.iPosInText == 3
sl@0
  2055
		   && param.iOutputGlyphs == 2 
sl@0
  2056
		   && param.iOutput[1].iCode == 0x0300);
sl@0
  2057
sl@0
  2058
	#if defined __WINS__ || defined __WINSCW__
sl@0
  2059
	TEST(r && param.iPen == TPoint(4,0) 
sl@0
  2060
		   && param.iOutput[1].iBounds.iTl == TPoint(-2,-15)
sl@0
  2061
		   && param.iOutput[1].iBounds.iBr == TPoint(2,-12));
sl@0
  2062
	#endif
sl@0
  2063
		
sl@0
  2064
	// 3: Test the bounds for multiple combing marks in isolation
sl@0
  2065
	param.iPosInText = 3;
sl@0
  2066
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  2067
	r = testFont->GetCharacterPosition(param);
sl@0
  2068
sl@0
  2069
	TEST(r && param.iPosInText == 7 
sl@0
  2070
		   && param.iOutputGlyphs == 4
sl@0
  2071
		   && param.iOutput[1].iCode == 0x0323
sl@0
  2072
		   && param.iOutput[2].iCode == 0x0300
sl@0
  2073
		   && param.iOutput[3].iCode == 0x0301);
sl@0
  2074
sl@0
  2075
	#if defined __WINS__ || defined __WINSCW__
sl@0
  2076
	TEST(r && param.iPen == TPoint(4,0)
sl@0
  2077
		   && param.iOutput[1].iBounds.iTl == TPoint(-1,1)
sl@0
  2078
		   && param.iOutput[1].iBounds.iBr == TPoint(1,3)
sl@0
  2079
           && param.iOutput[2].iBounds.iTl == TPoint(-2,-16)
sl@0
  2080
           && param.iOutput[2].iBounds.iBr == TPoint(2,-13)
sl@0
  2081
           && param.iOutput[3].iBounds.iTl == TPoint(-2,-20)
sl@0
  2082
           && param.iOutput[3].iBounds.iBr == TPoint(2,-17));
sl@0
  2083
	#endif
sl@0
  2084
	
sl@0
  2085
	// Done with the font, pop it off.
sl@0
  2086
	CleanupStack::Pop(testFont);
sl@0
  2087
	
sl@0
  2088
	//Cleaning the memory
sl@0
  2089
	delete bmp;
sl@0
  2090
	delete device;
sl@0
  2091
	delete gc;
sl@0
  2092
	fontStore->RemoveFile(err);
sl@0
  2093
	delete fontStore;
sl@0
  2094
	REComSession::FinalClose();
sl@0
  2095
	}
sl@0
  2096
sl@0
  2097
sl@0
  2098
void CTGlyphSelection::TestContextInShapeInfo()
sl@0
  2099
/**
sl@0
  2100
 This method is a test case to test GetCharacterPosition2() correctly
sl@0
  2101
 handle context.
sl@0
  2102
*/
sl@0
  2103
	{
sl@0
  2104
	TBool r;
sl@0
  2105
	TBuf<20> testText(0);
sl@0
  2106
	CFont::TPositionParam param;
sl@0
  2107
	param.iFlags = CFont::TPositionParam::EFLogicalOrder;
sl@0
  2108
	RShapeInfo shapeInfo;
sl@0
  2109
	
sl@0
  2110
	//test control characters which has not defined processFun in TTableEntry
sl@0
  2111
	testText.SetLength(7);
sl@0
  2112
	testText[0] = 0xffff; 	//control character, test for the range { 0xFFFE,   0xFFFF,   0}
sl@0
  2113
	testText[1] = '1';
sl@0
  2114
	testText[2] = 0x200E;   //control character, test for the range { 0x200C,   0x200F,   0}
sl@0
  2115
	testText[3] = '.';  
sl@0
  2116
	testText[4] = 'a';
sl@0
  2117
	testText[5] = 0x202A;   //control character, test for the range { 0x202A,   0x202E,   0}
sl@0
  2118
	testText[6] = ',';
sl@0
  2119
		
sl@0
  2120
	param.iText.Set(testText);
sl@0
  2121
	
sl@0
  2122
	// 1. Test '0xffff' as NULL context at position zero - 
sl@0
  2123
	// 0xffff should not be taken as context, and character '1' can be rendered correctly 
sl@0
  2124
	param.iPosInText = 1;
sl@0
  2125
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  2126
	r = iTestFont->GetCharacterPosition2(param, shapeInfo);
sl@0
  2127
	TEST(r && param.iPosInText == 2 
sl@0
  2128
		   && param.iOutputGlyphs == 1 
sl@0
  2129
		   && param.iOutput[0].iCode == 49);
sl@0
  2130
	
sl@0
  2131
	// 2. Test '0x200E' - 0x200E is not rendered, either not treated as context.
sl@0
  2132
	// character '.' and 'a' should be rendered correctly.
sl@0
  2133
	param.iPosInText = 2;
sl@0
  2134
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  2135
	r = iTestFont->GetCharacterPosition2(param, shapeInfo);
sl@0
  2136
	TEST(r && param.iPosInText == 3 
sl@0
  2137
		   && param.iOutputGlyphs == 0);
sl@0
  2138
			
sl@0
  2139
	param.iPosInText = 3;
sl@0
  2140
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  2141
	r = iTestFont->GetCharacterPosition2(param, shapeInfo);
sl@0
  2142
	TEST(r && param.iPosInText == 4 
sl@0
  2143
		   && param.iOutputGlyphs == 1
sl@0
  2144
		   && param.iOutput[0].iCode == 46);
sl@0
  2145
sl@0
  2146
	param.iPosInText = 4;
sl@0
  2147
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  2148
	r = iTestFont->GetCharacterPosition2(param, shapeInfo);
sl@0
  2149
	TEST(r && param.iPosInText == 5 
sl@0
  2150
		   && param.iOutputGlyphs == 1
sl@0
  2151
		   && param.iOutput[0].iCode == 'a');
sl@0
  2152
	
sl@0
  2153
	// 3. Test '0x202A' - 0x202A is not rendered, either not treated as context.
sl@0
  2154
	// character ',' should be rendered correctly. 
sl@0
  2155
	param.iPosInText = 5;
sl@0
  2156
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  2157
	r = iTestFont->GetCharacterPosition2(param, shapeInfo);
sl@0
  2158
	TEST(r && param.iPosInText == 6 
sl@0
  2159
		   && param.iOutputGlyphs == 0);
sl@0
  2160
	
sl@0
  2161
	param.iPosInText = 6;
sl@0
  2162
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  2163
	r = iTestFont->GetCharacterPosition2(param, shapeInfo);
sl@0
  2164
	TEST(r && param.iPosInText == 7 
sl@0
  2165
		   && param.iOutputGlyphs == 1
sl@0
  2166
		   && param.iOutput[0].iCode == 44);
sl@0
  2167
	}
sl@0
  2168
sl@0
  2169
/**
sl@0
  2170
@SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-1580
sl@0
  2171
@SYMTestCaseDesc Automated GDI testing for Hindi
sl@0
  2172
@SYMTestPriority High
sl@0
  2173
@SYMTestActions  Attempt to compose various valid and invalid Hindi glyph clusters.
sl@0
  2174
@SYMTestExpectedResults The expected glyph clusters for given Unicode charactors must be returned
sl@0
  2175
@SYMPREQ 18: Hindi for Bravo
sl@0
  2176
*/
sl@0
  2177
void CTGlyphSelection::TestHindiChars(CFbsFont* aFont)
sl@0
  2178
	{
sl@0
  2179
	INFO_PRINTF1(_L("Test Hindi Glyphs"));	
sl@0
  2180
	// Do the testing
sl@0
  2181
	
sl@0
  2182
	TBool r;
sl@0
  2183
	TBuf<30> testText(0);
sl@0
  2184
	CFont::TPositionParam param;
sl@0
  2185
	param.iDirection = CFont::EHorizontal;
sl@0
  2186
	param.iFlags = CFont::TPositionParam::EFLogicalOrder;
sl@0
  2187
sl@0
  2188
	testText.SetLength(30);
sl@0
  2189
	
sl@0
  2190
	testText[0] = 0x0930;
sl@0
  2191
	testText[1] = 0x093C;
sl@0
  2192
	testText[2] = 0x094D;
sl@0
  2193
	testText[3] = 0x0915;
sl@0
  2194
	
sl@0
  2195
	testText[4] = 0x0915;
sl@0
  2196
	testText[5] = 0x094D;
sl@0
  2197
	testText[6] = 0x0915;
sl@0
  2198
	
sl@0
  2199
	testText[7] = 0x0930;
sl@0
  2200
	testText[8] = 0x094D;
sl@0
  2201
	testText[9] = 0x0915;
sl@0
  2202
	
sl@0
  2203
	testText[10] = 0x0915;
sl@0
  2204
	testText[11] = 0x094D;
sl@0
  2205
	testText[12] = 0x0930;
sl@0
  2206
	
sl@0
  2207
	testText[13] = 0x0915;
sl@0
  2208
	testText[14] = 0x094D;
sl@0
  2209
	testText[15] = 0x0937;
sl@0
  2210
	
sl@0
  2211
	testText[16] = 0x0915;
sl@0
  2212
	testText[17] = 0x094D;
sl@0
  2213
	testText[18] = 0x0930;
sl@0
  2214
	testText[19] = 0x094D;
sl@0
  2215
	testText[20] = 0x092A;
sl@0
  2216
	
sl@0
  2217
	/*	When the following character 0x0036 is shaped, the context will be taken into consideration when
sl@0
  2218
		determining the glyph for 0x0036 
sl@0
  2219
		The context for 0x0036 is the Devanagari character 0x092A at position (iPosInText) 20
sl@0
  2220
	**/
sl@0
  2221
	testText[21] = 0x0036;
sl@0
  2222
	testText[22] = 0x094D;
sl@0
  2223
	
sl@0
  2224
	testText[23] = 0x0020;
sl@0
  2225
	
sl@0
  2226
	// INC101103: Strings containing ZWJ do not get rendered properly for Hindi 
sl@0
  2227
	testText[24] = 0x092E;
sl@0
  2228
	testText[25] = 0x094D;
sl@0
  2229
	testText[26] = 0x200D;
sl@0
  2230
	testText[27] = 0x092E; 
sl@0
  2231
	testText[28] = 0x093F;
sl@0
  2232
	testText[29] = 0x200D;
sl@0
  2233
		
sl@0
  2234
	param.iText.Set(testText);
sl@0
  2235
	
sl@0
  2236
	RShapeInfo aShapeInfo;
sl@0
  2237
sl@0
  2238
	// Do the testing
sl@0
  2239
	
sl@0
  2240
	param.iPosInText = 0;
sl@0
  2241
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  2242
	r = aFont->GetCharacterPosition2(param, aShapeInfo);
sl@0
  2243
sl@0
  2244
	TEST(r && param.iPosInText == 4 
sl@0
  2245
		   && param.iOutputGlyphs == 2
sl@0
  2246
		   && param.iOutput[0].iCode == 0x80000108
sl@0
  2247
		   && param.iOutput[1].iCode == 0x80000072);
sl@0
  2248
sl@0
  2249
	#if defined __WINS__ || defined __WINSCW__
sl@0
  2250
	TEST(r && param.iPen.iX == 17);
sl@0
  2251
	#endif
sl@0
  2252
	
sl@0
  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);
sl@0
  2254
sl@0
  2255
	param.iPosInText = 4;
sl@0
  2256
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  2257
	r = aFont->GetCharacterPosition2(param, aShapeInfo);
sl@0
  2258
sl@0
  2259
	TEST(r && param.iPosInText == 7 
sl@0
  2260
		   && param.iOutputGlyphs == 1
sl@0
  2261
		   && param.iOutput[0].iCode == 0x800001C2);
sl@0
  2262
sl@0
  2263
	#if defined __WINS__ || defined __WINSCW__
sl@0
  2264
	TEST(r && param.iPen.iX == 12);
sl@0
  2265
	#endif
sl@0
  2266
	
sl@0
  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);
sl@0
  2268
	
sl@0
  2269
	param.iPosInText = 7;
sl@0
  2270
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  2271
	r = aFont->GetCharacterPosition2(param, aShapeInfo);
sl@0
  2272
sl@0
  2273
	TEST(r && param.iPosInText == 10 
sl@0
  2274
		   && param.iOutputGlyphs == 2
sl@0
  2275
		   && param.iOutput[0].iCode == 0x80000072
sl@0
  2276
		   && param.iOutput[1].iCode == 0x80000130);
sl@0
  2277
sl@0
  2278
	#if defined __WINS__ || defined __WINSCW__
sl@0
  2279
	TEST(r && param.iPen.iX == 11);
sl@0
  2280
	#endif
sl@0
  2281
	
sl@0
  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);
sl@0
  2283
	
sl@0
  2284
	param.iPosInText = 10;
sl@0
  2285
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  2286
	r = aFont->GetCharacterPosition2(param, aShapeInfo);
sl@0
  2287
sl@0
  2288
	TEST(r && param.iPosInText == 13 
sl@0
  2289
		   && param.iOutputGlyphs == 1
sl@0
  2290
		   && param.iOutput[0].iCode == 0x80000136);
sl@0
  2291
sl@0
  2292
	#if defined __WINS__ || defined __WINSCW__
sl@0
  2293
	TEST(r && param.iPen.iX == 12);
sl@0
  2294
	#endif
sl@0
  2295
	
sl@0
  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);
sl@0
  2297
	
sl@0
  2298
	param.iPosInText = 13;
sl@0
  2299
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  2300
	r = aFont->GetCharacterPosition2(param, aShapeInfo);
sl@0
  2301
sl@0
  2302
	TEST(r && param.iPosInText == 16 
sl@0
  2303
		   && param.iOutputGlyphs == 1
sl@0
  2304
		   && param.iOutput[0].iCode == 0x800001BE);
sl@0
  2305
sl@0
  2306
	#if defined __WINS__ || defined __WINSCW__
sl@0
  2307
	TEST(r && param.iPen.iX == 12);
sl@0
  2308
	#endif
sl@0
  2309
	
sl@0
  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);
sl@0
  2311
sl@0
  2312
	param.iPosInText = 16;
sl@0
  2313
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  2314
	r = aFont->GetCharacterPosition2(param, aShapeInfo);
sl@0
  2315
sl@0
  2316
	TEST(r && param.iPosInText == 21 
sl@0
  2317
		   && param.iOutputGlyphs == 2
sl@0
  2318
		   && param.iOutput[0].iCode == 0x8000017A
sl@0
  2319
		   && param.iOutput[1].iCode == 0x80000087);
sl@0
  2320
	
sl@0
  2321
	#if defined __WINS__ || defined __WINSCW__
sl@0
  2322
	TEST(r && param.iPen.iX == 18);
sl@0
  2323
	#endif
sl@0
  2324
	
sl@0
  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);
sl@0
  2326
sl@0
  2327
	/*	The following shaping will consider the context when determining the glyph for 0x0036 Digit character 
sl@0
  2328
		The context for 0x0036 is the Devanagari character 0x092A at position (iPosInText) 20
sl@0
  2329
	**/
sl@0
  2330
	param.iPosInText = 21;
sl@0
  2331
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  2332
	r = aFont->GetCharacterPosition2(param, aShapeInfo);
sl@0
  2333
sl@0
  2334
	TEST(r && param.iPosInText == 22 
sl@0
  2335
		   && param.iOutputGlyphs == 1
sl@0
  2336
		   && param.iOutput[0].iCode == 0x80000016);
sl@0
  2337
	
sl@0
  2338
	#if defined __WINS__ || defined __WINSCW__
sl@0
  2339
	TEST(r && param.iPen.iX == 9);
sl@0
  2340
	#endif
sl@0
  2341
	
sl@0
  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);
sl@0
  2343
sl@0
  2344
	// INC101103: Strings containing ZWJ do not get rendered properly for Hindi 
sl@0
  2345
	param.iPosInText = 24;
sl@0
  2346
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  2347
	r = aFont->GetCharacterPosition2(param, aShapeInfo);
sl@0
  2348
	// We are mainly testing the position in text after rendering, which should be at the end of the syllable
sl@0
  2349
	// that should include the ZWJ and any consonant that follows it
sl@0
  2350
	TEST(r && param.iPosInText == 29 
sl@0
  2351
		   && param.iOutputGlyphs == 3
sl@0
  2352
		   && param.iOutput[0].iCode == 0x80000272
sl@0
  2353
		   && param.iOutput[1].iCode == 0x80000105
sl@0
  2354
		   && param.iOutput[2].iCode == 0x8000008B);
sl@0
  2355
		   
sl@0
  2356
	// Close aShapeInfo which releases any memory it is occupying
sl@0
  2357
	if (aShapeInfo.IsOpen())
sl@0
  2358
		aShapeInfo.Close();
sl@0
  2359
		   
sl@0
  2360
	}
sl@0
  2361
	
sl@0
  2362
/**
sl@0
  2363
@SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-3381
sl@0
  2364
@SYMTestCaseDesc Automated GDI testing for Kannada
sl@0
  2365
@SYMTestPriority High
sl@0
  2366
@SYMTestActions  Attempt to compose various valid and invalid Kannada glyph clusters.
sl@0
  2367
@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
sl@0
  2368
@SYMPREQ 19: Kannada for Ogmha
sl@0
  2369
*/
sl@0
  2370
	
sl@0
  2371
void CTGlyphSelection::TestKannadaChars(CFbsFont* aFont)
sl@0
  2372
	{
sl@0
  2373
INFO_PRINTF1(_L("Test Kannada Glyphs"));
sl@0
  2374
	
sl@0
  2375
	TBuf<79> testText(0);
sl@0
  2376
	CFont::TPositionParam param;
sl@0
  2377
	param.iDirection = CFont::EHorizontal;
sl@0
  2378
	param.iFlags = CFont::TPositionParam::EFLogicalOrder;
sl@0
  2379
sl@0
  2380
	testText.SetLength(79);
sl@0
  2381
	//Testdata for kannada Langauage
sl@0
  2382
	
sl@0
  2383
	testText[0] = 0x0C95;
sl@0
  2384
	testText[1] = 0x0CCD;
sl@0
  2385
	testText[2] = 0x0020; 
sl@0
  2386
	
sl@0
  2387
	testText[3] = 0x0CAF;
sl@0
  2388
	testText[4] = 0x0CCD;
sl@0
  2389
	testText[5] = 0x0020;
sl@0
  2390
	
sl@0
  2391
	testText[6] = 0x0C99;
sl@0
  2392
	testText[7] = 0x0CCD;
sl@0
  2393
	testText[8] = 0x0020;
sl@0
  2394
	
sl@0
  2395
	testText[9] = 0x0CA3;
sl@0
  2396
	testText[10] = 0x0CCD;
sl@0
  2397
	testText[11] = 0x0020;
sl@0
  2398
	
sl@0
  2399
	testText[12] = 0x0C95;
sl@0
  2400
	testText[13] = 0x0CC3;
sl@0
  2401
	
sl@0
  2402
	testText[14] = 0x0CA4;
sl@0
  2403
	testText[15] = 0x0CC6;
sl@0
  2404
	
sl@0
  2405
	testText[16] = 0x0C9D;
sl@0
  2406
	testText[17] = 0x0CBE;
sl@0
  2407
	
sl@0
  2408
	testText[18] = 0x0C9E;
sl@0
  2409
	testText[19] = 0x0CBE;
sl@0
  2410
	
sl@0
  2411
	testText[20] = 0x0CA3;
sl@0
  2412
	testText[21] = 0x0CBE;
sl@0
  2413
	
sl@0
  2414
	testText[22] = 0x0CB3;
sl@0
  2415
	testText[23] = 0x0CC6;
sl@0
  2416
	
sl@0
  2417
	testText[24] = 0x0C9D;
sl@0
  2418
	testText[25] = 0x0CC6;
sl@0
  2419
	
sl@0
  2420
	testText[26] = 0x0CAC;
sl@0
  2421
	testText[27] = 0x0CC6;
sl@0
  2422
	
sl@0
  2423
	testText[28] = 0x0C9F;
sl@0
  2424
	testText[29] = 0x0CC6;
sl@0
  2425
	
sl@0
  2426
	testText[30] = 0x0C99;
sl@0
  2427
	testText[31] = 0x0CC6;
sl@0
  2428
	
sl@0
  2429
	testText[32] = 0x0CA3;
sl@0
  2430
	testText[33] = 0x0CC6;
sl@0
  2431
	
sl@0
  2432
	testText[34] = 0x0C95;
sl@0
  2433
	testText[35] = 0x0CBF;
sl@0
  2434
	
sl@0
  2435
	testText[36] = 0x0CB8;
sl@0
  2436
	testText[37] = 0x0CBF;
sl@0
  2437
	
sl@0
  2438
	testText[38] = 0x0CA1;
sl@0
  2439
	testText[39] = 0x0CBF;
sl@0
  2440
	
sl@0
  2441
	testText[40] = 0x0CA6;
sl@0
  2442
	testText[41] = 0x0CBF;
sl@0
  2443
	
sl@0
  2444
	testText[42] = 0x0C9D;
sl@0
  2445
	testText[43] = 0x0CBF;
sl@0
  2446
	
sl@0
  2447
	testText[44] = 0x0C9D;
sl@0
  2448
	testText[45] = 0x0CC1;
sl@0
  2449
	
sl@0
  2450
	testText[46] = 0x0CB5;
sl@0
  2451
	testText[47] = 0x0CC1;
sl@0
  2452
	
sl@0
  2453
	testText[48] = 0x0C95;
sl@0
  2454
	testText[49] = 0x0CC2;
sl@0
  2455
	
sl@0
  2456
	testText[50] = 0x0CAA;
sl@0
  2457
	testText[51] = 0x0CC2;
sl@0
  2458
	
sl@0
  2459
	testText[52] = 0x0CAE;
sl@0
  2460
	testText[53] = 0x0CCC;
sl@0
  2461
	
sl@0
  2462
	testText[54] = 0x0C95;
sl@0
  2463
	
sl@0
  2464
	testText[55] = 0x0CB0;
sl@0
  2465
	testText[56] = 0x200D;
sl@0
  2466
	testText[57] = 0x0CCD;
sl@0
  2467
	testText[58] = 0x0CAE;
sl@0
  2468
	
sl@0
  2469
	testText[59] = 0x0020;
sl@0
  2470
	
sl@0
  2471
	testText[60] = 0x0CB0;
sl@0
  2472
	testText[61] = 0x200D;
sl@0
  2473
	testText[62] = 0x0CCD;
sl@0
  2474
	testText[63] = 0x0CB0;
sl@0
  2475
	testText[64] = 0x200D;
sl@0
  2476
	testText[65] = 0x0CCD;
sl@0
  2477
	
sl@0
  2478
	
sl@0
  2479
	testText[66] = 0x0CB0;
sl@0
  2480
	testText[67] = 0x200D;
sl@0
  2481
	testText[68] = 0x0CCD;
sl@0
  2482
	testText[69] = 0x0CB0;
sl@0
  2483
	testText[70] = 0x0CCD;
sl@0
  2484
	testText[71] = 0x0CB0;
sl@0
  2485
	testText[72] = 0x0CCD;
sl@0
  2486
	testText[73] = 0x0CB0;
sl@0
  2487
	testText[74] = 0x0CCD;
sl@0
  2488
	testText[75] = 0x0CB0;
sl@0
  2489
	
sl@0
  2490
	// DEF103276: Kannada rendering: IcuLayoutEngine does not recongnise 0X0C8E as a vowel
sl@0
  2491
	testText[76] = 0x0020;
sl@0
  2492
	testText[77] = 0x0C8E;
sl@0
  2493
	testText[78] = 0x0C82;
sl@0
  2494
	// End of DEF103276: Kannada rendering: IcuLayoutEngine does not recongnise 0X0C8E as a vowel
sl@0
  2495
sl@0
  2496
	param.iText.Set(testText);
sl@0
  2497
sl@0
  2498
	// Do the testing
sl@0
  2499
	
sl@0
  2500
	TBool r;
sl@0
  2501
	param.iPosInText = 0;
sl@0
  2502
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  2503
	RShapeInfo shapeInfo;
sl@0
  2504
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  2505
sl@0
  2506
	TEST(r && param.iPosInText ==2 
sl@0
  2507
		   && param.iOutputGlyphs == 1 
sl@0
  2508
		   && param.iOutput[0].iCode == 0x80000839);
sl@0
  2509
sl@0
  2510
	#if defined __WINS__ || defined __WINSCW__
sl@0
  2511
	TEST(r && param.iPen.iX == 16);
sl@0
  2512
	#endif
sl@0
  2513
	
sl@0
  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);
sl@0
  2515
    
sl@0
  2516
	param.iPosInText = 3;
sl@0
  2517
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  2518
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  2519
sl@0
  2520
	TEST(r && param.iPosInText == 5
sl@0
  2521
		   && param.iOutputGlyphs ==1
sl@0
  2522
		   && param.iOutput[0].iCode == 0x80000852 );
sl@0
  2523
sl@0
  2524
	#if defined __WINS__ || defined __WINSCW__
sl@0
  2525
	TEST(r && param.iPen.iX == 27);
sl@0
  2526
	#endif
sl@0
  2527
	
sl@0
  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);
sl@0
  2529
	
sl@0
  2530
	param.iPosInText = 6;
sl@0
  2531
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  2532
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  2533
sl@0
  2534
	TEST(r && param.iPosInText == 8
sl@0
  2535
		   && param.iOutputGlyphs == 1 
sl@0
  2536
		   && param.iOutput[0].iCode ==0x8000083D);
sl@0
  2537
sl@0
  2538
	#if defined __WINS__ || defined __WINSCW__
sl@0
  2539
	TEST(r && param.iPen.iX == 19);
sl@0
  2540
	#endif
sl@0
  2541
	
sl@0
  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);
sl@0
  2543
	
sl@0
  2544
	param.iPosInText = 9;
sl@0
  2545
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  2546
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  2547
sl@0
  2548
	TEST(r && param.iPosInText == 11
sl@0
  2549
		   && param.iOutputGlyphs ==1 
sl@0
  2550
		   && param.iOutput[0].iCode == 0x80000847);
sl@0
  2551
sl@0
  2552
	#if defined __WINS__ || defined __WINSCW__
sl@0
  2553
	TEST(r && param.iPen.iX == 20);
sl@0
  2554
	#endif
sl@0
  2555
	
sl@0
  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);
sl@0
  2557
	
sl@0
  2558
	param.iPosInText = 12;
sl@0
  2559
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  2560
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  2561
sl@0
  2562
	TEST(r && param.iPosInText == 14
sl@0
  2563
		   && param.iOutputGlyphs == 2 
sl@0
  2564
		   && param.iOutput[0].iCode == 0x800007A8
sl@0
  2565
		   && param.iOutput[1].iCode == 0x800007D2);
sl@0
  2566
sl@0
  2567
	#if defined __WINS__ || defined __WINSCW__
sl@0
  2568
	TEST(r && param.iPen.iX == 12);
sl@0
  2569
	#endif
sl@0
  2570
sl@0
  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);
sl@0
  2572
sl@0
  2573
	param.iPosInText = 14;
sl@0
  2574
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  2575
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  2576
sl@0
  2577
	TEST(r && param.iPosInText == 16
sl@0
  2578
		   && param.iOutputGlyphs == 1 
sl@0
  2579
		   && param.iOutput[0].iCode == 0x8000088f);
sl@0
  2580
sl@0
  2581
	#if defined __WINS__ || defined __WINSCW__
sl@0
  2582
	TEST(r && param.iPen.iX == 11);
sl@0
  2583
	#endif
sl@0
  2584
	
sl@0
  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);
sl@0
  2586
sl@0
  2587
	param.iPosInText = 16;
sl@0
  2588
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  2589
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  2590
sl@0
  2591
	TEST(r && param.iPosInText == 18
sl@0
  2592
		   && param.iOutputGlyphs == 2
sl@0
  2593
		   && param.iOutput[0].iCode == 0x8000081E 
sl@0
  2594
		   && param.iOutput[1].iCode == 0x800007CD);
sl@0
  2595
sl@0
  2596
	#if defined __WINS__ || defined __WINSCW__
sl@0
  2597
	TEST(r && param.iPen.iX == 29);
sl@0
  2598
	#endif
sl@0
  2599
	
sl@0
  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);
sl@0
  2601
	
sl@0
  2602
	param.iPosInText = 18;
sl@0
  2603
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  2604
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  2605
sl@0
  2606
	TEST(r && param.iPosInText == 20
sl@0
  2607
		   && param.iOutputGlyphs == 2
sl@0
  2608
		   && param.iOutput[0].iCode == 0x800007b1
sl@0
  2609
		   && param.iOutput[1].iCode == 0x800007cd);
sl@0
  2610
sl@0
  2611
	#if defined __WINS__ || defined __WINSCW__
sl@0
  2612
	TEST(r && param.iPen.iX == 23);
sl@0
  2613
	#endif
sl@0
  2614
	
sl@0
  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);
sl@0
  2616
	
sl@0
  2617
	
sl@0
  2618
	param.iPosInText = 20;
sl@0
  2619
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  2620
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  2621
sl@0
  2622
	TEST(r && param.iPosInText == 22
sl@0
  2623
		   && param.iOutputGlyphs == 2 
sl@0
  2624
		   && param.iOutput[0].iCode == 0x80000823
sl@0
  2625
		   && param.iOutput[1].iCode == 0x800007CD );
sl@0
  2626
sl@0
  2627
	#if defined __WINS__ || defined __WINSCW__
sl@0
  2628
	TEST(r && param.iPen.iX == 21);
sl@0
  2629
	#endif
sl@0
  2630
	    
sl@0
  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);
sl@0
  2632
	
sl@0
  2633
	param.iPosInText = 22;
sl@0
  2634
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  2635
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  2636
sl@0
  2637
	TEST(r && param.iPosInText == 24
sl@0
  2638
		   && param.iOutputGlyphs == 1 
sl@0
  2639
		   && param.iOutput[0].iCode == 0x8000089C);
sl@0
  2640
sl@0
  2641
	#if defined __WINS__ || defined __WINSCW__
sl@0
  2642
	TEST(r && param.iPen.iX == 12);
sl@0
  2643
	#endif
sl@0
  2644
	
sl@0
  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);
sl@0
  2646
	
sl@0
  2647
	param.iPosInText = 24;
sl@0
  2648
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  2649
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  2650
sl@0
  2651
	TEST(r && param.iPosInText == 26
sl@0
  2652
		   && param.iOutputGlyphs == 1 
sl@0
  2653
		   && param.iOutput[0].iCode == 0x80000889);
sl@0
  2654
sl@0
  2655
	#if defined __WINS__ || defined __WINSCW__
sl@0
  2656
	TEST(r && param.iPen.iX == 22);
sl@0
  2657
	#endif
sl@0
  2658
	
sl@0
  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);
sl@0
  2660
	 
sl@0
  2661
	 param.iPosInText = 26;
sl@0
  2662
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  2663
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  2664
sl@0
  2665
	TEST(r && param.iPosInText == 28
sl@0
  2666
		   && param.iOutputGlyphs == 1
sl@0
  2667
		   && param.iOutput[0].iCode == 0x80000896 );
sl@0
  2668
sl@0
  2669
	#if defined __WINS__ || defined __WINSCW__
sl@0
  2670
	TEST(r && param.iPen.iX == 13);
sl@0
  2671
	#endif
sl@0
  2672
	
sl@0
  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);
sl@0
  2674
	
sl@0
  2675
	param.iPosInText = 28;
sl@0
  2676
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  2677
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  2678
sl@0
  2679
	TEST(r && param.iPosInText == 30
sl@0
  2680
		   && param.iOutputGlyphs == 1 
sl@0
  2681
		   && param.iOutput[0].iCode == 0x8000088a);
sl@0
  2682
sl@0
  2683
	#if defined __WINS__ || defined __WINSCW__
sl@0
  2684
	TEST(r && param.iPen.iX == 13);
sl@0
  2685
	#endif
sl@0
  2686
	
sl@0
  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);
sl@0
  2688
	
sl@0
  2689
	param.iPosInText = 30;
sl@0
  2690
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  2691
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  2692
sl@0
  2693
	TEST(r && param.iPosInText == 32
sl@0
  2694
		   && param.iOutputGlyphs == 2
sl@0
  2695
		   && param.iOutput[0].iCode == 0x800007ac
sl@0
  2696
		   && param.iOutput[1].iCode == 0x800007d4 );
sl@0
  2697
sl@0
  2698
	#if defined __WINS__ || defined __WINSCW__
sl@0
  2699
	TEST(r && param.iPen.iX == 19);
sl@0
  2700
	#endif
sl@0
  2701
	
sl@0
  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);
sl@0
  2703
	
sl@0
  2704
	param.iPosInText = 32;
sl@0
  2705
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  2706
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  2707
sl@0
  2708
	TEST(r && param.iPosInText == 34
sl@0
  2709
		   && param.iOutputGlyphs == 1 
sl@0
  2710
		   && param.iOutput[0].iCode == 0x8000088e);
sl@0
  2711
sl@0
  2712
	#if defined __WINS__ || defined __WINSCW__
sl@0
  2713
	TEST(r && param.iPen.iX == 14);
sl@0
  2714
	#endif
sl@0
  2715
	
sl@0
  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);
sl@0
  2717
	
sl@0
  2718
	param.iPosInText = 34;
sl@0
  2719
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  2720
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  2721
sl@0
  2722
	TEST(r && param.iPosInText == 36
sl@0
  2723
		   && param.iOutputGlyphs == 1
sl@0
  2724
		   && param.iOutput[0].iCode == 0x80000860 );
sl@0
  2725
sl@0
  2726
	#if defined __WINS__ || defined __WINSCW__
sl@0
  2727
	TEST(r && param.iPen.iX == 10);
sl@0
  2728
	#endif
sl@0
  2729
		
sl@0
  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);
sl@0
  2731
	
sl@0
  2732
	param.iPosInText = 36;
sl@0
  2733
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  2734
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  2735
sl@0
  2736
	TEST(r && param.iPosInText == 38
sl@0
  2737
		   && param.iOutputGlyphs == 1
sl@0
  2738
		   && param.iOutput[0].iCode == 0x8000087e );
sl@0
  2739
sl@0
  2740
	#if defined __WINS__ || defined __WINSCW__
sl@0
  2741
	TEST(r && param.iPen.iX == 11);
sl@0
  2742
	#endif
sl@0
  2743
	
sl@0
  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);
sl@0
  2745
	
sl@0
  2746
	param.iPosInText = 38;
sl@0
  2747
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  2748
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  2749
sl@0
  2750
	TEST(r && param.iPosInText == 40
sl@0
  2751
		   && param.iOutputGlyphs == 1
sl@0
  2752
		   && param.iOutput[0].iCode == 0x8000086a);
sl@0
  2753
sl@0
  2754
	#if defined __WINS__ || defined __WINSCW__
sl@0
  2755
	TEST(r && param.iPen.iX == 12);
sl@0
  2756
	#endif
sl@0
  2757
	
sl@0
  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);
sl@0
  2759
	
sl@0
  2760
	param.iPosInText = 40;
sl@0
  2761
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  2762
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  2763
sl@0
  2764
	TEST(r && param.iPosInText == 42
sl@0
  2765
		   && param.iOutputGlyphs == 1 
sl@0
  2766
		   && param.iOutput[0].iCode == 0x8000086f);
sl@0
  2767
sl@0
  2768
	#if defined __WINS__ || defined __WINSCW__
sl@0
  2769
	TEST(r && param.iPen.iX == 12);
sl@0
  2770
	#endif
sl@0
  2771
	
sl@0
  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);
sl@0
  2773
	
sl@0
  2774
	param.iPosInText = 42;
sl@0
  2775
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  2776
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  2777
sl@0
  2778
	TEST(r && param.iPosInText == 44
sl@0
  2779
		   && param.iOutputGlyphs == 1 
sl@0
  2780
		   && param.iOutput[0].iCode == 0x80000867 );
sl@0
  2781
sl@0
  2782
	#if defined __WINS__ || defined __WINSCW__
sl@0
  2783
	TEST(r && param.iPen.iX == 22);
sl@0
  2784
	#endif
sl@0
  2785
	
sl@0
  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);
sl@0
  2787
	
sl@0
  2788
	param.iPosInText = 44;
sl@0
  2789
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  2790
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  2791
sl@0
  2792
	TEST(r && param.iPosInText == 46
sl@0
  2793
		   && param.iOutputGlyphs == 2
sl@0
  2794
		   && param.iOutput[0].iCode == 0x800007b0 
sl@0
  2795
		   && param.iOutput[1].iCode == 0x800007d0);
sl@0
  2796
sl@0
  2797
	#if defined __WINS__ || defined __WINSCW__
sl@0
  2798
	TEST(r && param.iPen.iX == 28);
sl@0
  2799
	#endif
sl@0
  2800
	
sl@0
  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);
sl@0
  2802
	
sl@0
  2803
	param.iPosInText = 46;
sl@0
  2804
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  2805
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  2806
sl@0
  2807
	TEST(r && param.iPosInText == 48
sl@0
  2808
		   && param.iOutputGlyphs == 2
sl@0
  2809
		   && param.iOutput[0].iCode == 0x800007c6
sl@0
  2810
		   && param.iOutput[1].iCode == 0x800007d0);
sl@0
  2811
sl@0
  2812
	#if defined __WINS__ || defined __WINSCW__
sl@0
  2813
	TEST(r && param.iPen.iX == 18);
sl@0
  2814
	#endif
sl@0
  2815
	
sl@0
  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);
sl@0
  2817
sl@0
  2818
sl@0
  2819
	param.iPosInText = 48;
sl@0
  2820
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  2821
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  2822
sl@0
  2823
	TEST(r && param.iPosInText == 50
sl@0
  2824
		   && param.iOutputGlyphs == 2
sl@0
  2825
		   && param.iOutput[0].iCode == 0x800007a8
sl@0
  2826
		   && param.iOutput[1].iCode == 0x800007d1 );
sl@0
  2827
sl@0
  2828
	#if defined __WINS__ || defined __WINSCW__
sl@0
  2829
	TEST(r && param.iPen.iX == 20);
sl@0
  2830
	#endif
sl@0
  2831
	
sl@0
  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);	
sl@0
  2833
sl@0
  2834
	param.iPosInText = 50;
sl@0
  2835
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  2836
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  2837
sl@0
  2838
	TEST(r && param.iPosInText == 52 
sl@0
  2839
		   && param.iOutputGlyphs == 2
sl@0
  2840
		   && param.iOutput[0].iCode == 0x800007bc
sl@0
  2841
		   && param.iOutput[1].iCode == 0x800008a5);
sl@0
  2842
sl@0
  2843
	#if defined __WINS__ || defined __WINSCW__
sl@0
  2844
	TEST(r && param.iPen.iX == 21);
sl@0
  2845
	#endif
sl@0
  2846
	
sl@0
  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);	
sl@0
  2848
	
sl@0
  2849
	
sl@0
  2850
	param.iPosInText = 52;
sl@0
  2851
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  2852
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  2853
sl@0
  2854
	TEST(r && param.iPosInText == 54 
sl@0
  2855
		   && param.iOutputGlyphs == 2
sl@0
  2856
		   && param.iOutput[0].iCode == 0x8000082d  
sl@0
  2857
		   && param.iOutput[1].iCode == 0x800007d9);
sl@0
  2858
sl@0
  2859
	#if defined __WINS__ || defined __WINSCW__
sl@0
  2860
	TEST(r && param.iPen.iX == 26);
sl@0
  2861
	#endif
sl@0
  2862
sl@0
  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);	
sl@0
  2864
		
sl@0
  2865
	param.iPosInText = 55;
sl@0
  2866
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  2867
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  2868
sl@0
  2869
	TEST(r && param.iPosInText == 59 
sl@0
  2870
		   && param.iOutputGlyphs == 2
sl@0
  2871
		   && param.iOutput[0].iCode == 0x800007c2 
sl@0
  2872
		   && param.iOutput[1].iCode == 0x80000809);
sl@0
  2873
sl@0
  2874
	#if defined __WINS__ || defined __WINSCW__
sl@0
  2875
	TEST(r && param.iPen.iX == 17);
sl@0
  2876
	#endif
sl@0
  2877
	
sl@0
  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);	
sl@0
  2879
			
sl@0
  2880
	param.iPosInText = 60;
sl@0
  2881
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  2882
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  2883
	TEST(r && param.iPosInText == 64 
sl@0
  2884
		   && param.iOutputGlyphs == 2
sl@0
  2885
		   && param.iOutput[0].iCode == 0x800007c2 
sl@0
  2886
		   && param.iOutput[1].iCode == 0x8000080b);
sl@0
  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);	
sl@0
  2888
			
sl@0
  2889
	param.iPosInText = 66;
sl@0
  2890
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  2891
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  2892
	TEST(r && param.iPosInText == 75 
sl@0
  2893
		   && param.iOutputGlyphs == 5
sl@0
  2894
		   && param.iOutput[0].iCode == 0x800007c2 
sl@0
  2895
		   && param.iOutput[1].iCode == 0x8000080b
sl@0
  2896
		   && param.iOutput[2].iCode == 0x800008db
sl@0
  2897
		   && param.iOutput[3].iCode == 0x800008db
sl@0
  2898
		   && param.iOutput[4].iCode == 0x800007da);
sl@0
  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);
sl@0
  2900
	
sl@0
  2901
	// DEF103276: Kannada rendering: IcuLayoutEngine does not recongnise 0X0C8E as a vowel
sl@0
  2902
	param.iPosInText = 77;
sl@0
  2903
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  2904
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  2905
	TEST(r && param.iPosInText == 79 
sl@0
  2906
		   && param.iOutputGlyphs == 2
sl@0
  2907
		   && param.iOutput[0].iCode == 0x800007A2
sl@0
  2908
		   && param.iOutput[1].iCode == 0x80000798);
sl@0
  2909
sl@0
  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);	
sl@0
  2911
	//End of DEF103276: Kannada rendering: IcuLayoutEngine does not recongnise 0X0C8E as a vowel
sl@0
  2912
			
sl@0
  2913
	}
sl@0
  2914
	
sl@0
  2915
/**
sl@0
  2916
@SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-3360
sl@0
  2917
@SYMTestCaseDesc Automated GDI testing for Marathi
sl@0
  2918
@SYMTestPriority High
sl@0
  2919
@SYMTestActions  Attempt to compose various valid and invalid Marathi glyph clusters.
sl@0
  2920
@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
sl@0
  2921
@SYMPREQ 19: Marathi for Ogmha
sl@0
  2922
*/
sl@0
  2923
sl@0
  2924
void CTGlyphSelection::TestMarathiChars(CFbsFont* aFont)
sl@0
  2925
	{
sl@0
  2926
	INFO_PRINTF1(_L("Test Marathi Glyphs"));	
sl@0
  2927
	
sl@0
  2928
	TBool r;
sl@0
  2929
	TBuf<47> testText(0);
sl@0
  2930
	CFont::TPositionParam param;
sl@0
  2931
	param.iDirection = CFont::EHorizontal;
sl@0
  2932
	param.iFlags = CFont::TPositionParam::EFLogicalOrder;
sl@0
  2933
sl@0
  2934
	testText.SetLength(47);
sl@0
  2935
	
sl@0
  2936
	//Testdata
sl@0
  2937
	testText[0] = 0x0905; 
sl@0
  2938
	testText[1] = 0x0945;
sl@0
  2939
	
sl@0
  2940
	testText[2] = 0x0931;
sl@0
  2941
	testText[3] = 0x094D;
sl@0
  2942
	testText[4] = 0x0915;
sl@0
  2943
	
sl@0
  2944
	testText[5] = 0x0930;
sl@0
  2945
	testText[6] = 0x094D;
sl@0
  2946
	testText[7] = 0x200D;
sl@0
  2947
	testText[8] = 0x0915;
sl@0
  2948
	
sl@0
  2949
	testText[9] = 0x0905;
sl@0
  2950
	testText[10] = 0x200D;
sl@0
  2951
	testText[11] = 0x0945;
sl@0
  2952
	
sl@0
  2953
	testText[12] = 0x0909;
sl@0
  2954
	testText[13] = 0x0945;
sl@0
  2955
	
sl@0
  2956
	testText[14] = 0x0915;
sl@0
  2957
	testText[15] = 0x200D;
sl@0
  2958
	testText[16] = 0x0945;
sl@0
  2959
	
sl@0
  2960
	// DEF102132: Marathi - Certain sequence of characters does not work correctly
sl@0
  2961
	testText[17] = 0x0905;
sl@0
  2962
	testText[18] = 0x0945;
sl@0
  2963
	testText[19] = 0x0901;
sl@0
  2964
	
sl@0
  2965
	testText[20] = 0x0905;
sl@0
  2966
	testText[21] = 0x200D;
sl@0
  2967
	testText[22] = 0x0945;
sl@0
  2968
	testText[23] = 0x0901;
sl@0
  2969
	// End of DEF102132: Marathi - Certain sequence of characters does not work correctly
sl@0
  2970
sl@0
  2971
	
sl@0
  2972
	// DEF102858: Marathi - State table does not allow explicit half forms followed by modifiers
sl@0
  2973
	testText[24] = 0x0020;
sl@0
  2974
	
sl@0
  2975
	testText[25] = 0x0930;
sl@0
  2976
	testText[26] = 0x094D;
sl@0
  2977
	testText[27] = 0x200D;
sl@0
  2978
	testText[28] = 0x0901;
sl@0
  2979
	// End of DEF102858: Marathi - State table does not allow explicit half forms followed by modifiers
sl@0
  2980
	
sl@0
  2981
	// INC104705  Marathi input: Incorrect movement of cursor with eyelash ra forming ligature. 
sl@0
  2982
	testText[29] = 0x0020;
sl@0
  2983
	
sl@0
  2984
	testText[30] = 0x0930; 
sl@0
  2985
	testText[31] = 0x094D;
sl@0
  2986
	testText[32] = 0x200D;
sl@0
  2987
	testText[33] = 0x0930; 
sl@0
  2988
	testText[34] = 0x094D;
sl@0
  2989
	testText[35] = 0x200D;
sl@0
  2990
	testText[36] = 0x0930; 
sl@0
  2991
	testText[37] = 0x094D;
sl@0
  2992
	testText[38] = 0x200D;
sl@0
  2993
	testText[39] = 0x0930; 
sl@0
  2994
	testText[40] = 0x094D;
sl@0
  2995
	testText[41] = 0x200D;
sl@0
  2996
	testText[42] = 0x0930; 
sl@0
  2997
	testText[43] = 0x094D;
sl@0
  2998
	testText[44] = 0x200D;
sl@0
  2999
	// End of INC104705  Marathi input: Incorrect movement of cursor with eyelash ra forming ligature. 
sl@0
  3000
sl@0
  3001
	// INC116507: Halant get attached with an independent vowel.
sl@0
  3002
	testText[45] = 0x0905;
sl@0
  3003
	testText[46] = 0x094D;
sl@0
  3004
	// End of INC116507: Halant get attached with an independent vowel.
sl@0
  3005
	
sl@0
  3006
	//To Do
sl@0
  3007
	
sl@0
  3008
	param.iText.Set(testText); 
sl@0
  3009
	
sl@0
  3010
	// Test CANDRA A: Independent Vowel A + CANDRA E
sl@0
  3011
	param.iPosInText = 0;
sl@0
  3012
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  3013
	RShapeInfo shapeInfo;
sl@0
  3014
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  3015
sl@0
  3016
	TEST(r && param.iPosInText == 2 
sl@0
  3017
		   && param.iOutputGlyphs == 2
sl@0
  3018
		   && param.iOutput[0].iCode == 0x80000528 
sl@0
  3019
		   && param.iOutput[1].iCode == 0x80000566);
sl@0
  3020
sl@0
  3021
	#if defined __WINS__ || defined __WINSCW__
sl@0
  3022
	TEST(r && param.iPen.iX == 12);
sl@0
  3023
	#endif
sl@0
  3024
	
sl@0
  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);
sl@0
  3026
sl@0
  3027
	
sl@0
  3028
	// Test Eyelash RA post Unicode 3.0: RRA + VIRAMA + CONSONANT
sl@0
  3029
	param.iPosInText = 2 ;
sl@0
  3030
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  3031
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  3032
sl@0
  3033
	TEST(r && param.iPosInText == 5 
sl@0
  3034
		   && param.iOutputGlyphs == 2
sl@0
  3035
		   && param.iOutput[0].iCode == 0x800005d3
sl@0
  3036
		   && param.iOutput[1].iCode == 0x80000538);
sl@0
  3037
sl@0
  3038
	#if defined __WINS__ || defined __WINSCW__
sl@0
  3039
	TEST(r && param.iPen.iX == 18);
sl@0
  3040
	#endif
sl@0
  3041
	
sl@0
  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);
sl@0
  3043
	
sl@0
  3044
	// Test Eyelash RA pre Unicode 3.0: RA + VIRAMA + ZWJ + CONSONANT
sl@0
  3045
	param.iPosInText = 5;
sl@0
  3046
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  3047
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  3048
sl@0
  3049
	TEST(r && param.iPosInText == 9 
sl@0
  3050
		   && param.iOutputGlyphs == 2
sl@0
  3051
		   && param.iOutput[0].iCode == 0x800005d3
sl@0
  3052
		   && param.iOutput[1].iCode == 0x80000538);
sl@0
  3053
sl@0
  3054
	#if defined __WINS__ || defined __WINSCW__
sl@0
  3055
	TEST(r && param.iPen.iX == 18);
sl@0
  3056
	#endif
sl@0
  3057
	
sl@0
  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);
sl@0
  3059
	
sl@0
  3060
	// Test second form of CANDRA A: Independent Vowel A + ZWJ + CANDRA E
sl@0
  3061
	param.iPosInText = 9;
sl@0
  3062
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  3063
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  3064
sl@0
  3065
	TEST(r && param.iPosInText == 12 
sl@0
  3066
		   && param.iOutputGlyphs == 2
sl@0
  3067
		   && param.iOutput[0].iCode == 0x80000528
sl@0
  3068
		   && param.iOutput[1].iCode == 0x80000566 );
sl@0
  3069
sl@0
  3070
	#if defined __WINS__ || defined __WINSCW__
sl@0
  3071
	TEST(r && param.iPen.iX == 12);
sl@0
  3072
	#endif
sl@0
  3073
	
sl@0
  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);
sl@0
  3075
	
sl@0
  3076
	// Test that CANDRA E does not join with any other independent vowel
sl@0
  3077
	param.iPosInText = 12;
sl@0
  3078
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  3079
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  3080
sl@0
  3081
	TEST(r && param.iPosInText == 13 
sl@0
  3082
		   && param.iOutputGlyphs == 1
sl@0
  3083
		   && param.iOutput[0].iCode == 0x8000052c);
sl@0
  3084
sl@0
  3085
	#if defined __WINS__ || defined __WINSCW__
sl@0
  3086
	TEST(r && param.iPen.iX == 9);
sl@0
  3087
	#endif
sl@0
  3088
sl@0
  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);
sl@0
  3090
	
sl@0
  3091
	// Test that the second form of CANDRA A (i.e. using ZWJ) doesn't work for CONSONANTS (illegal)
sl@0
  3092
	param.iPosInText = 14;
sl@0
  3093
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  3094
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  3095
sl@0
  3096
	TEST(r && param.iPosInText == 15 
sl@0
  3097
		   && param.iOutputGlyphs == 1
sl@0
  3098
		   && param.iOutput[0].iCode == 0x80000538);
sl@0
  3099
sl@0
  3100
	#if defined __WINS__ || defined __WINSCW__
sl@0
  3101
	TEST(r && param.iPen.iX == 11);
sl@0
  3102
	#endif
sl@0
  3103
	
sl@0
  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);
sl@0
  3105
	
sl@0
  3106
	// DEF102132: Marathi - Certain sequence of characters does not work correctly
sl@0
  3107
	param.iPosInText = 17;
sl@0
  3108
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  3109
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  3110
	
sl@0
  3111
	TEST(r && param.iPosInText == 20 
sl@0
  3112
		   && param.iOutputGlyphs == 2
sl@0
  3113
		   && param.iOutput[0].iCode == 0x80000528
sl@0
  3114
		   && param.iOutput[1].iCode == 0x8000069d);
sl@0
  3115
sl@0
  3116
	
sl@0
  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);
sl@0
  3118
	
sl@0
  3119
	param.iPosInText = 20;
sl@0
  3120
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  3121
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  3122
	
sl@0
  3123
	TEST(r && param.iPosInText == 23 
sl@0
  3124
		   && param.iOutputGlyphs == 2
sl@0
  3125
		   && param.iOutput[0].iCode == 0x80000528
sl@0
  3126
		   && param.iOutput[1].iCode == 0x8000069d);
sl@0
  3127
	
sl@0
  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);
sl@0
  3129
  	// End of DEF102132: Marathi - Certain sequence of characters does not work correctly
sl@0
  3130
  	
sl@0
  3131
	// DEF102858: Marathi - State table does not allow explicit half forms followed by modifiers
sl@0
  3132
	param.iPosInText = 25;
sl@0
  3133
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  3134
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  3135
	TEST(r && param.iPosInText == 29 
sl@0
  3136
		   && param.iOutputGlyphs == 2
sl@0
  3137
		   && param.iOutput[0].iCode == 0x800005D3
sl@0
  3138
		   && param.iOutput[1].iCode == 0x80000524);
sl@0
  3139
	
sl@0
  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);
sl@0
  3141
	// End of DEF102858: Marathi - State table does not allow explicit half forms followed by modifiers
sl@0
  3142
	
sl@0
  3143
	// INC104705  Marathi input: Incorrect movement of cursor with eyelash ra forming ligature. 
sl@0
  3144
	param.iPosInText = 30;
sl@0
  3145
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  3146
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  3147
	TEST(r && param.iPosInText == 42 
sl@0
  3148
		   && param.iOutputGlyphs == 5
sl@0
  3149
		   && param.iOutput[0].iCode == 0x800005D3
sl@0
  3150
		   && param.iOutput[1].iCode == 0x800005D3
sl@0
  3151
		   && param.iOutput[2].iCode == 0x800005B8
sl@0
  3152
		   && param.iOutput[3].iCode == 0x80000553
sl@0
  3153
		   && param.iOutput[4].iCode == 0x8000056E);
sl@0
  3154
	#if defined __WINS__ || defined __WINSCW__
sl@0
  3155
	TEST(param.iPen.iX == 20);
sl@0
  3156
	#endif
sl@0
  3157
	
sl@0
  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);
sl@0
  3159
	// End of INC104705  Marathi input: Incorrect movement of cursor with eyelash ra forming ligature. 
sl@0
  3160
	
sl@0
  3161
	// INC116507: Halant get attached with an independent vowel.
sl@0
  3162
	param.iPosInText = 45;
sl@0
  3163
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  3164
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  3165
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  3166
sl@0
  3167
	TEST(r && param.iPosInText == 47 
sl@0
  3168
		   && param.iOutputGlyphs == 2
sl@0
  3169
		   && param.iOutput[0].iCode == 0x8000058F
sl@0
  3170
		   && param.iOutput[1].iCode == 0x8000056E);
sl@0
  3171
sl@0
  3172
	#if defined __WINS__ || defined __WINSCW__
sl@0
  3173
	TEST(r && param.iPen.iX == 21);
sl@0
  3174
	#endif
sl@0
  3175
sl@0
  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);
sl@0
  3177
	// End of INC116507: Halant get attached with an independent vowel.
sl@0
  3178
sl@0
  3179
	}
sl@0
  3180
	
sl@0
  3181
/**
sl@0
  3182
@SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-3417
sl@0
  3183
@SYMTestCaseDesc Automated GDI testing for Gujarati
sl@0
  3184
@SYMTestPriority High
sl@0
  3185
@SYMTestActions  Attempt to compose various valid and invalid gujarati glyph clusters.
sl@0
  3186
@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
sl@0
  3187
@SYMPREQ 19: Gujarati for Ogmha
sl@0
  3188
*/
sl@0
  3189
	
sl@0
  3190
	
sl@0
  3191
void CTGlyphSelection::TestGujaratiChars(CFbsFont* aFont)
sl@0
  3192
	{
sl@0
  3193
	INFO_PRINTF1(_L("Test Gujarati Glyphs"));
sl@0
  3194
	
sl@0
  3195
	// Do the testing
sl@0
  3196
	
sl@0
  3197
	TBool r;
sl@0
  3198
	TBuf<162> testText(0);
sl@0
  3199
	CFont::TPositionParam param;
sl@0
  3200
	param.iDirection = CFont::EHorizontal;
sl@0
  3201
	param.iFlags = CFont::TPositionParam::EFLogicalOrder;
sl@0
  3202
sl@0
  3203
	testText.SetLength(162);
sl@0
  3204
	//Testdata for gujarati Langauage
sl@0
  3205
	
sl@0
  3206
	testText[0] = 0x0AAC;
sl@0
  3207
	testText[1] = 0x0ACD;
sl@0
  3208
	testText[2] = 0x200D;
sl@0
  3209
	testText[3] = 0x0020;
sl@0
  3210
	
sl@0
  3211
	testText[4] = 0x0A96;
sl@0
  3212
	testText[5] = 0x0ACD;
sl@0
  3213
	testText[6] = 0x0A97;
sl@0
  3214
	testText[7] = 0x0ACD;
sl@0
  3215
	testText[8] = 0x0A98;
sl@0
  3216
	testText[9] = 0x0ACD;
sl@0
  3217
	testText[10] = 0x0A9A;
sl@0
  3218
	
sl@0
  3219
	testText[11] = 0x0A95;
sl@0
  3220
	testText[12] = 0x0ACD;
sl@0
  3221
	testText[13] = 0x0A9C;	
sl@0
  3222
	testText[14] = 0x200D;
sl@0
  3223
	testText[15] = 0x0020;
sl@0
  3224
sl@0
  3225
	testText[16] = 0x0A99;
sl@0
  3226
	testText[17] = 0x0ACD;
sl@0
  3227
	testText[18] = 0x0A9B;
sl@0
  3228
	testText[19] = 0x0ACD;
sl@0
  3229
	testText[20] = 0x0A9F;
sl@0
  3230
	testText[21] = 0x0ACD;
sl@0
  3231
	testText[22] = 0x0AA0;
sl@0
  3232
	
sl@0
  3233
	//Requirement (GUJ003)
sl@0
  3234
	
sl@0
  3235
	testText[23] = 0x0A95;
sl@0
  3236
	testText[24] = 0x0ACD;
sl@0
  3237
	testText[25] = 0x0AB7;
sl@0
  3238
	
sl@0
  3239
	
sl@0
  3240
	testText[26] = 0x0A95;
sl@0
  3241
	testText[27] = 0x0ACD;
sl@0
  3242
	testText[28] = 0x0AB7;
sl@0
  3243
	testText[29] = 0x0ACD;
sl@0
  3244
	testText[30] = 0x0AA4;
sl@0
  3245
	
sl@0
  3246
	testText[31] = 0x0A9C;
sl@0
  3247
	testText[32] = 0x0ACD;
sl@0
  3248
	testText[33] = 0x0AB7;
sl@0
  3249
	testText[34] = 0x0ACD;
sl@0
  3250
	testText[35] = 0x0AA4;
sl@0
  3251
	
sl@0
  3252
	testText[36] = 0x0A9C;
sl@0
  3253
	testText[37] = 0x0ACD;
sl@0
  3254
	testText[38] = 0x0A9E;
sl@0
  3255
	testText[39] = 0x0ACD;
sl@0
  3256
	testText[40] = 0x0AA4;
sl@0
  3257
	
sl@0
  3258
	//Requirement (GUJ 005)
sl@0
  3259
	
sl@0
  3260
	testText[41] = 0x0AB0;
sl@0
  3261
	testText[42] = 0x0ACD;
sl@0
  3262
	testText[43] = 0x0A95;
sl@0
  3263
	
sl@0
  3264
	testText[44] = 0x0AB0;
sl@0
  3265
	testText[45] = 0x0ACD;
sl@0
  3266
	testText[46] = 0x0A95;
sl@0
  3267
	testText[47] = 0x0AC9;
sl@0
  3268
	
sl@0
  3269
	testText[48] = 0x0AB0;
sl@0
  3270
	testText[49] = 0x0ACD;
sl@0
  3271
	testText[50] = 0x0A95;
sl@0
  3272
	testText[51] = 0x0A82;
sl@0
  3273
	
sl@0
  3274
	testText[52] = 0x0AB0;
sl@0
  3275
	testText[53] = 0x0ACD;
sl@0
  3276
	testText[54] = 0x0A95;
sl@0
  3277
	testText[55] = 0x0AC9;
sl@0
  3278
	testText[56] = 0x0A82;
sl@0
  3279
	testText[57] = 0x0020;
sl@0
  3280
	
sl@0
  3281
	//Requirement (GUJ 006)
sl@0
  3282
	
sl@0
  3283
	testText[58] = 0x0A97;
sl@0
  3284
	testText[59] = 0x0ACD;
sl@0
  3285
	testText[60] = 0x0AB0;
sl@0
  3286
	
sl@0
  3287
	testText[61] = 0x0A9A;
sl@0
  3288
	testText[62] = 0x0ACD;
sl@0
  3289
	testText[63] = 0x0AB0;
sl@0
  3290
	
sl@0
  3291
	testText[64] = 0x0A97;
sl@0
  3292
	testText[65] = 0x0ACD;
sl@0
  3293
	testText[66] = 0x0AB0;
sl@0
  3294
	testText[67] = 0x0ACD;
sl@0
  3295
	testText[68] = 0x0AA4;
sl@0
  3296
	
sl@0
  3297
	testText[69] = 0x0A9A;
sl@0
  3298
	testText[70] = 0x0ACD;
sl@0
  3299
	testText[71] = 0x0AB0;
sl@0
  3300
	testText[72] = 0x0ACD;
sl@0
  3301
	testText[73] = 0x0AA4;
sl@0
  3302
	
sl@0
  3303
	//Requirement (GUJ 007)
sl@0
  3304
	
sl@0
  3305
	testText[74] = 0x0A95;
sl@0
  3306
	testText[75] = 0x0ACD;
sl@0
  3307
	testText[76] = 0x0AB0;
sl@0
  3308
	
sl@0
  3309
	testText[77] = 0x0A9C;
sl@0
  3310
	testText[78] = 0x0ACD;
sl@0
  3311
	testText[79] = 0x0AB0;
sl@0
  3312
	
sl@0
  3313
	testText[80] = 0x0A95;
sl@0
  3314
	testText[81] = 0x0ACD;
sl@0
  3315
	testText[82] = 0x0AB0;
sl@0
  3316
	testText[83] = 0x0ACD;
sl@0
  3317
	testText[84] = 0x0AA4;
sl@0
  3318
	
sl@0
  3319
	testText[85] = 0x0A9C;
sl@0
  3320
	testText[86] = 0x0ACD;
sl@0
  3321
	testText[87] = 0x0AB0;
sl@0
  3322
	testText[88] = 0x0ACD;
sl@0
  3323
	testText[89] = 0x0AA4;
sl@0
  3324
	
sl@0
  3325
	//Requirement (GUJ 008)
sl@0
  3326
	
sl@0
  3327
	testText[90] = 0x0A9B;
sl@0
  3328
	testText[91] = 0x0ACD;
sl@0
  3329
	testText[92] = 0x0AB0;
sl@0
  3330
	
sl@0
  3331
	testText[93] = 0x0AAF;
sl@0
  3332
	testText[94] = 0x0ACD;
sl@0
  3333
	testText[95] = 0x0AB0;
sl@0
  3334
	
sl@0
  3335
	testText[96] = 0x0A9B;
sl@0
  3336
	testText[97] = 0x0ACD;
sl@0
  3337
	testText[98] = 0x0AB0;
sl@0
  3338
	testText[99] = 0x0ACD;
sl@0
  3339
	testText[100]= 0x0AA4;
sl@0
  3340
	
sl@0
  3341
	testText[101] = 0x0AAF;
sl@0
  3342
	testText[102] = 0x0ACD;
sl@0
  3343
	testText[103] = 0x0AB0;
sl@0
  3344
	
sl@0
  3345
	testText[104] = 0x0AAF;
sl@0
  3346
	testText[105] = 0x0ACD;
sl@0
  3347
	testText[106] = 0x0AB0;
sl@0
  3348
	testText[107] = 0x0ACD;
sl@0
  3349
	testText[108] = 0x0AA4;
sl@0
  3350
	
sl@0
  3351
	testText[109] = 0x0AB0;
sl@0
  3352
	testText[110] = 0x0ACD;
sl@0
  3353
	testText[111] = 0x0AB0;
sl@0
  3354
	testText[112] = 0x0ACD;
sl@0
  3355
	testText[113] = 0x0AB0;
sl@0
  3356
	
sl@0
  3357
	//Requirement (GUJ 009)
sl@0
  3358
	
sl@0
  3359
	testText[114] = 0x0A9F;
sl@0
  3360
	testText[115] = 0x0ACD;
sl@0
  3361
	testText[116] = 0x0AAF;
sl@0
  3362
	
sl@0
  3363
	testText[117] = 0x0A9B;
sl@0
  3364
	testText[118] = 0x0ACD;
sl@0
  3365
	testText[119] = 0x0AAF;
sl@0
  3366
	
sl@0
  3367
	testText[120] = 0x0AA2;
sl@0
  3368
	testText[121] = 0x0ACD;
sl@0
  3369
	testText[122] = 0x0AAF;
sl@0
  3370
	
sl@0
  3371
	testText[123] = 0x0A97;
sl@0
  3372
	testText[124] = 0x0ACD;
sl@0
  3373
	testText[125] = 0x0AAF;
sl@0
  3374
	
sl@0
  3375
	//Requirement (GUJ 010)
sl@0
  3376
	
sl@0
  3377
	testText[126] = 0x0A9F;
sl@0
  3378
	testText[127] = 0x0ACD;
sl@0
  3379
	testText[128] = 0x0AA0;
sl@0
  3380
	
sl@0
  3381
	testText[129] = 0x0AA6;
sl@0
  3382
	testText[130] = 0x0ACD;
sl@0
  3383
	testText[131] = 0x0AB5;
sl@0
  3384
	
sl@0
  3385
	testText[132] = 0x0A9F;
sl@0
  3386
	testText[133] = 0x0ACD;
sl@0
  3387
	testText[134] = 0x0AA0;
sl@0
  3388
	testText[135] = 0x0ACD;
sl@0
  3389
	testText[136] = 0x0AA4;
sl@0
  3390
	
sl@0
  3391
	
sl@0
  3392
	testText[137] = 0x0AA6;
sl@0
  3393
	testText[138] = 0x0ACD;
sl@0
  3394
	testText[139] = 0x0AB5;
sl@0
  3395
	testText[140] = 0x0ACD;
sl@0
  3396
	testText[141] = 0x0AA4;
sl@0
  3397
	
sl@0
  3398
	//Requirement (GUJ 011)
sl@0
  3399
	
sl@0
  3400
	testText[142] = 0x0AB0;
sl@0
  3401
	testText[143] = 0x0AC2;
sl@0
  3402
	
sl@0
  3403
	testText[144] = 0x0AB9;
sl@0
  3404
	testText[145] = 0x0AC3;
sl@0
  3405
	
sl@0
  3406
	testText[146] = 0x0AA6;
sl@0
  3407
	testText[147] = 0x0AC3;
sl@0
  3408
	
sl@0
  3409
	testText[148] = 0x0A9C;
sl@0
  3410
	testText[149] = 0x0AC0;
sl@0
  3411
	
sl@0
  3412
	//Subscript ligutares
sl@0
  3413
	
sl@0
  3414
	
sl@0
  3415
	testText[150] = 0x0A95;
sl@0
  3416
	testText[151] = 0x0A81;
sl@0
  3417
	
sl@0
  3418
	testText[152] = 0x0A95;
sl@0
  3419
	testText[153] = 0x0ABE;
sl@0
  3420
	testText[154] = 0x0A81;
sl@0
  3421
	
sl@0
  3422
	testText[155] = 0x0A95;
sl@0
  3423
	testText[156] = 0x0AC1;
sl@0
  3424
	testText[157] = 0x0A81;
sl@0
  3425
	
sl@0
  3426
	testText[158] = 0x0A8D;
sl@0
  3427
	testText[159] = 0x0A81;
sl@0
  3428
	
sl@0
  3429
	testText[160] = 0x0A88;
sl@0
  3430
	testText[161] = 0x0A81;
sl@0
  3431
	
sl@0
  3432
	
sl@0
  3433
	
sl@0
  3434
	param.iText.Set(testText); 
sl@0
  3435
				
sl@0
  3436
	param.iPosInText = 0;
sl@0
  3437
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  3438
	RShapeInfo shapeInfo;
sl@0
  3439
	
sl@0
  3440
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  3441
sl@0
  3442
	TEST(r && param.iPosInText ==  3
sl@0
  3443
		   && param.iOutputGlyphs == 1  
sl@0
  3444
		   && param.iOutput[0].iCode == 0x800009ec);
sl@0
  3445
sl@0
  3446
	#if defined __WINS__ || defined __WINSCW__
sl@0
  3447
	TEST(r && param.iPen.iX == 9);
sl@0
  3448
	#endif
sl@0
  3449
	
sl@0
  3450
	
sl@0
  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);
sl@0
  3452
	
sl@0
  3453
	param.iPosInText = 	4;
sl@0
  3454
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  3455
		
sl@0
  3456
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  3457
sl@0
  3458
	TEST(r && param.iPosInText ==  11
sl@0
  3459
		   && param.iOutputGlyphs ==  4
sl@0
  3460
		   && param.iOutput[0].iCode == 0x800009d7
sl@0
  3461
		   && param.iOutput[1].iCode == 0x800009d8
sl@0
  3462
		   && param.iOutput[2].iCode == 0x800009d9
sl@0
  3463
		   && param.iOutput[3].iCode == 0x80000967 );
sl@0
  3464
	
sl@0
  3465
	#if defined __WINS__ || defined __WINSCW__
sl@0
  3466
	TEST(r && param.iPen.iX == 34);
sl@0
  3467
	#endif
sl@0
  3468
sl@0
  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);
sl@0
  3470
	
sl@0
  3471
	param.iPosInText = 11;
sl@0
  3472
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  3473
		
sl@0
  3474
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  3475
sl@0
  3476
	TEST(r && param.iPosInText ==	14  
sl@0
  3477
		   && param.iOutputGlyphs == 2  
sl@0
  3478
		   && param.iOutput[0].iCode == 0x800009d6
sl@0
  3479
		   && param.iOutput[1].iCode == 0x80000969   );
sl@0
  3480
sl@0
  3481
	#if defined __WINS__ || defined __WINSCW__
sl@0
  3482
	TEST(r && param.iPen.iX == 22);
sl@0
  3483
	#endif
sl@0
  3484
	
sl@0
  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);
sl@0
  3486
	
sl@0
  3487
	param.iPosInText = 16;
sl@0
  3488
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  3489
		
sl@0
  3490
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  3491
sl@0
  3492
	TEST(r && param.iPosInText ==  23
sl@0
  3493
		   && param.iOutputGlyphs == 3 
sl@0
  3494
		   && param.iOutput[0].iCode == 0x800009da
sl@0
  3495
		   && param.iOutput[1].iCode == 0x800009dc
sl@0
  3496
		   && param.iOutput[2].iCode == 0x80000aad);
sl@0
  3497
	
sl@0
  3498
	#if defined __WINS__ || defined __WINSCW__
sl@0
  3499
	TEST(r && param.iPen.iX == 30);
sl@0
  3500
	#endif
sl@0
  3501
	
sl@0
  3502
		
sl@0
  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);
sl@0
  3504
	
sl@0
  3505
	param.iPosInText = 	23;
sl@0
  3506
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  3507
		
sl@0
  3508
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  3509
sl@0
  3510
	TEST(r && param.iPosInText == 26
sl@0
  3511
		   && param.iOutputGlyphs == 1  
sl@0
  3512
		   && param.iOutput[0].iCode == 0x800009d2 );
sl@0
  3513
sl@0
  3514
	#if defined __WINS__ || defined __WINSCW__
sl@0
  3515
	TEST(r && param.iPen.iX == 12);
sl@0
  3516
	#endif
sl@0
  3517
		
sl@0
  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);
sl@0
  3519
sl@0
  3520
	
sl@0
  3521
	param.iPosInText = 26;
sl@0
  3522
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  3523
		
sl@0
  3524
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  3525
sl@0
  3526
	TEST(r && param.iPosInText == 31
sl@0
  3527
		   && param.iOutputGlyphs == 2  
sl@0
  3528
		   && param.iOutput[0].iCode == 0x800009f8
sl@0
  3529
		   && param.iOutput[1].iCode == 0x80000971);
sl@0
  3530
sl@0
  3531
	#if defined __WINS__ || defined __WINSCW__
sl@0
  3532
	TEST(r && param.iPen.iX == 18);
sl@0
  3533
	#endif
sl@0
  3534
	
sl@0
  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);
sl@0
  3536
	
sl@0
  3537
	param.iPosInText = 	31;
sl@0
  3538
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  3539
		
sl@0
  3540
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  3541
sl@0
  3542
	TEST(r && param.iPosInText ==  36
sl@0
  3543
		   && param.iOutputGlyphs == 3
sl@0
  3544
		   && param.iOutput[0].iCode == 0x800009dd
sl@0
  3545
		   && param.iOutput[1].iCode == 0x800009f5
sl@0
  3546
		   && param.iOutput[2].iCode == 0x80000971);
sl@0
  3547
sl@0
  3548
	#if defined __WINS__ || defined __WINSCW__
sl@0
  3549
	TEST(r && param.iPen.iX == 30);
sl@0
  3550
	#endif
sl@0
  3551
	
sl@0
  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);	
sl@0
  3553
	
sl@0
  3554
	param.iPosInText = 36;
sl@0
  3555
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  3556
		
sl@0
  3557
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  3558
sl@0
  3559
	TEST(r && param.iPosInText == 41
sl@0
  3560
		   && param.iOutputGlyphs == 2
sl@0
  3561
		   && param.iOutput[0].iCode == 0x800009f9
sl@0
  3562
		   && param.iOutput[1].iCode == 0x80000971);
sl@0
  3563
	
sl@0
  3564
	#if defined __WINS__ || defined __WINSCW__
sl@0
  3565
	TEST(r && param.iPen.iX == 17);
sl@0
  3566
	#endif
sl@0
  3567
sl@0
  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);
sl@0
  3569
	
sl@0
  3570
	param.iPosInText = 	41;
sl@0
  3571
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  3572
		
sl@0
  3573
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  3574
	
sl@0
  3575
	TEST(r && param.iPosInText == 44
sl@0
  3576
		   && param.iOutputGlyphs == 2
sl@0
  3577
		   && param.iOutput[0].iCode ==  0x80000962
sl@0
  3578
		   && param.iOutput[1].iCode == 0x800009d4);
sl@0
  3579
	
sl@0
  3580
	#if defined __WINS__ || defined __WINSCW__
sl@0
  3581
	TEST(r && param.iPen.iX == 8);
sl@0
  3582
	#endif
sl@0
  3583
		
sl@0
  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);
sl@0
  3585
	
sl@0
  3586
	param.iPosInText = 44;
sl@0
  3587
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  3588
		
sl@0
  3589
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  3590
sl@0
  3591
	TEST(r && param.iPosInText == 48 
sl@0
  3592
		   && param.iOutputGlyphs == 2
sl@0
  3593
		   && param.iOutput[0].iCode == 0x80000962
sl@0
  3594
		   && param.iOutput[1].iCode == 0x80000ae1 );
sl@0
  3595
sl@0
  3596
	#if defined __WINS__ || defined __WINSCW__
sl@0
  3597
	TEST(r && param.iPen.iX == 13);
sl@0
  3598
	#endif
sl@0
  3599
	
sl@0
  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);
sl@0
  3601
	
sl@0
  3602
	param.iPosInText = 48;
sl@0
  3603
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  3604
		
sl@0
  3605
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  3606
sl@0
  3607
	TEST(r && param.iPosInText == 52
sl@0
  3608
		   && param.iOutputGlyphs == 2
sl@0
  3609
		   && param.iOutput[0].iCode == 0x80000962
sl@0
  3610
		   && param.iOutput[1].iCode == 0x80000ae9);
sl@0
  3611
sl@0
  3612
	#if defined __WINS__ || defined __WINSCW__
sl@0
  3613
	TEST(r && param.iPen.iX == 8);
sl@0
  3614
	#endif
sl@0
  3615
	
sl@0
  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);
sl@0
  3617
	
sl@0
  3618
	param.iPosInText = 52;
sl@0
  3619
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  3620
		
sl@0
  3621
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  3622
sl@0
  3623
	TEST(r && param.iPosInText == 57  
sl@0
  3624
		   && param.iOutputGlyphs == 2
sl@0
  3625
		   && param.iOutput[0].iCode == 0x80000962
sl@0
  3626
		   && param.iOutput[1].iCode == 0x80000ae2);
sl@0
  3627
sl@0
  3628
	#if defined __WINS__ || defined __WINSCW__
sl@0
  3629
	TEST(r && param.iPen.iX == 13);
sl@0
  3630
	#endif
sl@0
  3631
sl@0
  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);
sl@0
  3633
	
sl@0
  3634
	param.iPosInText = 58;
sl@0
  3635
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  3636
		
sl@0
  3637
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  3638
sl@0
  3639
	TEST(r && param.iPosInText ==  61
sl@0
  3640
		   && param.iOutputGlyphs == 1
sl@0
  3641
		   && param.iOutput[0].iCode ==	0x80000a1e );
sl@0
  3642
sl@0
  3643
	#if defined __WINS__ || defined __WINSCW__
sl@0
  3644
	TEST(r && param.iPen.iX == 11);
sl@0
  3645
	#endif
sl@0
  3646
		
sl@0
  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);
sl@0
  3648
	
sl@0
  3649
	param.iPosInText = 	61;
sl@0
  3650
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  3651
		
sl@0
  3652
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  3653
sl@0
  3654
	TEST(r && param.iPosInText ==  64
sl@0
  3655
		   && param.iOutputGlyphs == 1
sl@0
  3656
		   && param.iOutput[0].iCode == 0x80000a21 );
sl@0
  3657
sl@0
  3658
	#if defined __WINS__ || defined __WINSCW__
sl@0
  3659
	TEST(r && param.iPen.iX == 10);
sl@0
  3660
	#endif
sl@0
  3661
sl@0
  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);
sl@0
  3663
	
sl@0
  3664
	param.iPosInText = 64;
sl@0
  3665
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  3666
		
sl@0
  3667
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  3668
sl@0
  3669
	TEST(r && param.iPosInText == 69 
sl@0
  3670
		   && param.iOutputGlyphs == 2
sl@0
  3671
		   && param.iOutput[0].iCode == 0x80000a64
sl@0
  3672
		   && param.iOutput[1].iCode == 0x80000971 );
sl@0
  3673
sl@0
  3674
	#if defined __WINS__ || defined __WINSCW__
sl@0
  3675
	TEST(r && param.iPen.iX == 17);
sl@0
  3676
	#endif
sl@0
  3677
	
sl@0
  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);
sl@0
  3679
	
sl@0
  3680
	param.iPosInText = 	69;
sl@0
  3681
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  3682
		
sl@0
  3683
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  3684
sl@0
  3685
	TEST(r && param.iPosInText == 74
sl@0
  3686
		   && param.iOutputGlyphs == 2
sl@0
  3687
		   && param.iOutput[0].iCode == 0x80000a67
sl@0
  3688
		   && param.iOutput[1].iCode == 0x80000971);
sl@0
  3689
sl@0
  3690
	#if defined __WINS__ || defined __WINSCW__
sl@0
  3691
	TEST(r && param.iPen.iX == 16);
sl@0
  3692
	#endif
sl@0
  3693
		
sl@0
  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);
sl@0
  3695
	
sl@0
  3696
	param.iPosInText = 	74;
sl@0
  3697
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  3698
		
sl@0
  3699
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  3700
sl@0
  3701
	TEST(r && param.iPosInText ==  77
sl@0
  3702
		   && param.iOutputGlyphs == 1
sl@0
  3703
		   && param.iOutput[0].iCode == 0x80000a1c);
sl@0
  3704
sl@0
  3705
	#if defined __WINS__ || defined __WINSCW__
sl@0
  3706
	TEST(r && param.iPen.iX == 8);
sl@0
  3707
	#endif
sl@0
  3708
		
sl@0
  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);
sl@0
  3710
	
sl@0
  3711
	param.iPosInText = 	77;
sl@0
  3712
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  3713
		
sl@0
  3714
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  3715
sl@0
  3716
	TEST(r && param.iPosInText ==  80
sl@0
  3717
		   && param.iOutputGlyphs == 1
sl@0
  3718
		   && param.iOutput[0].iCode == 0x80000a23);
sl@0
  3719
sl@0
  3720
	#if defined __WINS__ || defined __WINSCW__
sl@0
  3721
	TEST(r && param.iPen.iX == 15);
sl@0
  3722
	#endif
sl@0
  3723
	
sl@0
  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);
sl@0
  3725
		
sl@0
  3726
	param.iPosInText = 80;
sl@0
  3727
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  3728
	
sl@0
  3729
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  3730
sl@0
  3731
	TEST(r && param.iPosInText == 85
sl@0
  3732
		   && param.iOutputGlyphs == 2
sl@0
  3733
		   && param.iOutput[0].iCode == 0x80000a62
sl@0
  3734
		   && param.iOutput[1].iCode == 0x80000971);
sl@0
  3735
sl@0
  3736
	#if defined __WINS__ || defined __WINSCW__
sl@0
  3737
	TEST(r && param.iPen.iX == 17);
sl@0
  3738
	#endif
sl@0
  3739
		
sl@0
  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);
sl@0
  3741
	
sl@0
  3742
	param.iPosInText = 85;
sl@0
  3743
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  3744
	
sl@0
  3745
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  3746
sl@0
  3747
	TEST(r && param.iPosInText ==  90
sl@0
  3748
		   && param.iOutputGlyphs == 2
sl@0
  3749
		   && param.iOutput[0].iCode == 0x80000a69
sl@0
  3750
		   && param.iOutput[1].iCode == 0x80000971);
sl@0
  3751
sl@0
  3752
	#if defined __WINS__ || defined __WINSCW__
sl@0
  3753
	TEST(r && param.iPen.iX == 24);
sl@0
  3754
	#endif
sl@0
  3755
	
sl@0
  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);
sl@0
  3757
	
sl@0
  3758
	param.iPosInText =90;
sl@0
  3759
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  3760
	
sl@0
  3761
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  3762
sl@0
  3763
	TEST(r && param.iPosInText == 93
sl@0
  3764
		   && param.iOutputGlyphs == 1
sl@0
  3765
		   && param.iOutput[0].iCode == 0x80000a22 );
sl@0
  3766
sl@0
  3767
	#if defined __WINS__ || defined __WINSCW__
sl@0
  3768
	TEST(r && param.iPen.iX == 12);
sl@0
  3769
	#endif
sl@0
  3770
	
sl@0
  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);
sl@0
  3772
	
sl@0
  3773
	param.iPosInText = 93;
sl@0
  3774
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  3775
	
sl@0
  3776
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  3777
sl@0
  3778
	TEST(r && param.iPosInText == 96
sl@0
  3779
		   && param.iOutputGlyphs == 1
sl@0
  3780
		   && param.iOutput[0].iCode == 0x80000a35 );
sl@0
  3781
sl@0
  3782
	#if defined __WINS__ || defined __WINSCW__
sl@0
  3783
	TEST(r && param.iPen.iX == 10);
sl@0
  3784
	#endif
sl@0
  3785
	
sl@0
  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);
sl@0
  3787
	
sl@0
  3788
	param.iPosInText = 96;
sl@0
  3789
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  3790
	
sl@0
  3791
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  3792
sl@0
  3793
	TEST(r && param.iPosInText ==  101
sl@0
  3794
		   && param.iOutputGlyphs == 2
sl@0
  3795
		   && param.iOutput[0].iCode == 0x80000a68 
sl@0
  3796
		   && param.iOutput[1].iCode == 0x80000971);
sl@0
  3797
	
sl@0
  3798
	#if defined __WINS__ || defined __WINSCW__
sl@0
  3799
	TEST(r && param.iPen.iX == 21);
sl@0
  3800
	#endif
sl@0
  3801
	
sl@0
  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);
sl@0
  3803
	
sl@0
  3804
	param.iPosInText = 101;
sl@0
  3805
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  3806
	
sl@0
  3807
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  3808
sl@0
  3809
	TEST(r && param.iPosInText == 104
sl@0
  3810
		   && param.iOutputGlyphs == 1
sl@0
  3811
		   && param.iOutput[0].iCode == 0x80000a35 );
sl@0
  3812
	#if defined __WINS__ || defined __WINSCW__
sl@0
  3813
	TEST(r && param.iPen.iX == 10);
sl@0
  3814
	#endif
sl@0
  3815
	
sl@0
  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);
sl@0
  3817
	
sl@0
  3818
	param.iPosInText = 104;
sl@0
  3819
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  3820
	
sl@0
  3821
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  3822
sl@0
  3823
	TEST(r && param.iPosInText == 109
sl@0
  3824
		   && param.iOutputGlyphs == 2
sl@0
  3825
		   && param.iOutput[0].iCode == 0x80000a7b 
sl@0
  3826
		   && param.iOutput[1].iCode == 0x80000971 );
sl@0
  3827
sl@0
  3828
	#if defined __WINS__ || defined __WINSCW__
sl@0
  3829
	TEST(r && param.iPen.iX == 16);
sl@0
  3830
	#endif
sl@0
  3831
	
sl@0
  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);
sl@0
  3833
	
sl@0
  3834
	param.iPosInText = 109;
sl@0
  3835
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  3836
	
sl@0
  3837
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  3838
sl@0
  3839
	TEST(r && param.iPosInText ==  114
sl@0
  3840
		   && param.iOutputGlyphs == 2
sl@0
  3841
		   && param.iOutput[0].iCode == 0x80000a36
sl@0
  3842
		   && param.iOutput[1].iCode == 0x800009d4 );
sl@0
  3843
	
sl@0
  3844
	#if defined __WINS__ || defined __WINSCW__
sl@0
  3845
	TEST(r && param.iPen.iX == 7);
sl@0
  3846
	#endif
sl@0
  3847
	
sl@0
  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);
sl@0
  3849
	
sl@0
  3850
	param.iPosInText = 114;
sl@0
  3851
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  3852
	
sl@0
  3853
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  3854
sl@0
  3855
	TEST(r && param.iPosInText ==  117
sl@0
  3856
		   && param.iOutputGlyphs == 1
sl@0
  3857
		   && param.iOutput[0].iCode == 0x80000aae);
sl@0
  3858
sl@0
  3859
	#if defined __WINS__ || defined __WINSCW__
sl@0
  3860
	TEST(r && param.iPen.iX == 17);
sl@0
  3861
	#endif
sl@0
  3862
		
sl@0
  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);
sl@0
  3864
	
sl@0
  3865
	param.iPosInText = 117;
sl@0
  3866
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  3867
	
sl@0
  3868
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  3869
sl@0
  3870
	TEST(r && param.iPosInText ==  120
sl@0
  3871
		   && param.iOutputGlyphs == 1
sl@0
  3872
		   && param.iOutput[0].iCode == 0x80000aab );
sl@0
  3873
sl@0
  3874
	#if defined __WINS__ || defined __WINSCW__
sl@0
  3875
	TEST(r && param.iPen.iX == 21);
sl@0
  3876
	#endif
sl@0
  3877
	
sl@0
  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);
sl@0
  3879
	
sl@0
  3880
	param.iPosInText = 120;
sl@0
  3881
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  3882
	
sl@0
  3883
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  3884
sl@0
  3885
	TEST(r && param.iPosInText ==  123
sl@0
  3886
		   && param.iOutputGlyphs == 1
sl@0
  3887
		   && param.iOutput[0].iCode == 0x80000ab5 );
sl@0
  3888
sl@0
  3889
	#if defined __WINS__ || defined __WINSCW__
sl@0
  3890
	TEST(r && param.iPen.iX == 18);
sl@0
  3891
	#endif
sl@0
  3892
	
sl@0
  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);
sl@0
  3894
	
sl@0
  3895
	param.iPosInText = 123;
sl@0
  3896
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  3897
	
sl@0
  3898
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  3899
sl@0
  3900
	TEST(r && param.iPosInText ==  126
sl@0
  3901
		   && param.iOutputGlyphs == 2
sl@0
  3902
		   && param.iOutput[0].iCode == 0x800009d8
sl@0
  3903
		   && param.iOutput[1].iCode == 0x8000097b);
sl@0
  3904
sl@0
  3905
	#if defined __WINS__ || defined __WINSCW__
sl@0
  3906
	TEST(r && param.iPen.iX == 17);
sl@0
  3907
	#endif
sl@0
  3908
sl@0
  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);
sl@0
  3910
	
sl@0
  3911
	param.iPosInText = 126;
sl@0
  3912
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  3913
	
sl@0
  3914
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  3915
sl@0
  3916
	TEST(r && param.iPosInText ==  129
sl@0
  3917
		   && param.iOutputGlyphs == 1
sl@0
  3918
		   && param.iOutput[0].iCode == 0x80000aad);
sl@0
  3919
sl@0
  3920
	#if defined __WINS__ || defined __WINSCW__
sl@0
  3921
	TEST(r && param.iPen.iX == 9);
sl@0
  3922
	#endif
sl@0
  3923
	
sl@0
  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);
sl@0
  3925
		
sl@0
  3926
	param.iPosInText = 129;
sl@0
  3927
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  3928
	
sl@0
  3929
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  3930
sl@0
  3931
	TEST(r && param.iPosInText ==  132
sl@0
  3932
		   && param.iOutputGlyphs == 1
sl@0
  3933
		   && param.iOutput[0].iCode == 0x80000ac0 );
sl@0
  3934
sl@0
  3935
	#if defined __WINS__ || defined __WINSCW__
sl@0
  3936
	TEST(r && param.iPen.iX == 10);
sl@0
  3937
	#endif
sl@0
  3938
		
sl@0
  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);
sl@0
  3940
	
sl@0
  3941
	param.iPosInText =132;
sl@0
  3942
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  3943
	
sl@0
  3944
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  3945
sl@0
  3946
	TEST(r && param.iPosInText ==  137
sl@0
  3947
		   && param.iOutputGlyphs == 3
sl@0
  3948
		   && param.iOutput[0].iCode == 0x800009e0
sl@0
  3949
		   && param.iOutput[1].iCode == 0x800009e1
sl@0
  3950
		   && param.iOutput[2].iCode == 0x80000971);
sl@0
  3951
sl@0
  3952
	#if defined __WINS__ || defined __WINSCW__
sl@0
  3953
	TEST(r && param.iPen.iX == 26);
sl@0
  3954
	#endif
sl@0
  3955
	
sl@0
  3956
	
sl@0
  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);	
sl@0
  3958
	
sl@0
  3959
	param.iPosInText = 137;
sl@0
  3960
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  3961
	
sl@0
  3962
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  3963
	
sl@0
  3964
	TEST(r && param.iPosInText == 142 
sl@0
  3965
		   && param.iOutputGlyphs == 3
sl@0
  3966
		   && param.iOutput[0].iCode == 0x800009e7 
sl@0
  3967
		   && param.iOutput[1].iCode == 0x800009f3
sl@0
  3968
		   && param.iOutput[2].iCode == 0x80000971);
sl@0
  3969
sl@0
  3970
	#if defined __WINS__ || defined __WINSCW__
sl@0
  3971
	TEST(r && param.iPen.iX == 23);
sl@0
  3972
	#endif
sl@0
  3973
	
sl@0
  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);	
sl@0
  3975
	
sl@0
  3976
	param.iPosInText = 142;
sl@0
  3977
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  3978
	
sl@0
  3979
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  3980
	
sl@0
  3981
	TEST(r && param.iPosInText == 144
sl@0
  3982
		   && param.iOutputGlyphs == 1
sl@0
  3983
		   && param.iOutput[0].iCode == 0x80000b04);
sl@0
  3984
sl@0
  3985
	#if defined __WINS__ || defined __WINSCW__
sl@0
  3986
	TEST(r && param.iPen.iX == 7);
sl@0
  3987
	#endif
sl@0
  3988
	
sl@0
  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);
sl@0
  3990
	
sl@0
  3991
	param.iPosInText = 144;
sl@0
  3992
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  3993
	
sl@0
  3994
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  3995
	
sl@0
  3996
	TEST(r && param.iPosInText == 146
sl@0
  3997
		   && param.iOutputGlyphs == 1
sl@0
  3998
		   && param.iOutput[0].iCode == 0x80000b05);
sl@0
  3999
sl@0
  4000
	#if defined __WINS__ || defined __WINSCW__
sl@0
  4001
	TEST(r && param.iPen.iX == 9);
sl@0
  4002
	#endif
sl@0
  4003
	
sl@0
  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);
sl@0
  4005
	
sl@0
  4006
	param.iPosInText = 146;
sl@0
  4007
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  4008
	
sl@0
  4009
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  4010
	
sl@0
  4011
	TEST(r && param.iPosInText == 148
sl@0
  4012
		   && param.iOutputGlyphs ==  1
sl@0
  4013
		   && param.iOutput[0].iCode == 0x80000b02);
sl@0
  4014
sl@0
  4015
	#if defined __WINS__ || defined __WINSCW__
sl@0
  4016
	TEST(r && param.iPen.iX == 7);
sl@0
  4017
	#endif
sl@0
  4018
sl@0
  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);
sl@0
  4020
	
sl@0
  4021
	param.iPosInText = 148;
sl@0
  4022
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  4023
	
sl@0
  4024
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  4025
	
sl@0
  4026
	TEST(r && param.iPosInText == 150
sl@0
  4027
		   && param.iOutputGlyphs == 1
sl@0
  4028
		   && param.iOutput[0].iCode == 0x80000aff);
sl@0
  4029
sl@0
  4030
	#if defined __WINS__ || defined __WINSCW__
sl@0
  4031
	TEST(r && param.iPen.iX == 16);
sl@0
  4032
	#endif
sl@0
  4033
sl@0
  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);
sl@0
  4035
	
sl@0
  4036
	param.iPosInText = 150;
sl@0
  4037
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  4038
	
sl@0
  4039
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  4040
	
sl@0
  4041
	TEST(r && param.iPosInText == 152 
sl@0
  4042
		   && param.iOutputGlyphs == 2
sl@0
  4043
		   && param.iOutput[0].iCode == 0x80000962
sl@0
  4044
		   && param.iOutput[1].iCode ==0x80000951);
sl@0
  4045
sl@0
  4046
	#if defined __WINS__ || defined __WINSCW__
sl@0
  4047
	TEST(r && param.iPen.iX == 8);
sl@0
  4048
	#endif
sl@0
  4049
	
sl@0
  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);
sl@0
  4051
sl@0
  4052
	param.iPosInText = 152;
sl@0
  4053
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  4054
	
sl@0
  4055
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  4056
	
sl@0
  4057
	TEST(r && param.iPosInText == 155
sl@0
  4058
		   && param.iOutputGlyphs == 3
sl@0
  4059
		   && param.iOutput[0].iCode == 0x80000962
sl@0
  4060
		   && param.iOutput[1].iCode == 0x80000986
sl@0
  4061
		   && param.iOutput[2].iCode == 0x80000951);
sl@0
  4062
sl@0
  4063
	#if defined __WINS__ || defined __WINSCW__
sl@0
  4064
	TEST(r && param.iPen.iX == 12);
sl@0
  4065
	#endif
sl@0
  4066
sl@0
  4067
	
sl@0
  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);	
sl@0
  4069
	
sl@0
  4070
	param.iPosInText = 155;
sl@0
  4071
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  4072
	
sl@0
  4073
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  4074
	
sl@0
  4075
	TEST(r && param.iPosInText ==  158
sl@0
  4076
		   && param.iOutputGlyphs == 3
sl@0
  4077
		   && param.iOutput[0].iCode == 0x80000962
sl@0
  4078
		   && param.iOutput[1].iCode == 0x80000989
sl@0
  4079
		   && param.iOutput[2].iCode == 0x80000951);
sl@0
  4080
sl@0
  4081
	#if defined __WINS__ || defined __WINSCW__
sl@0
  4082
	TEST(r && param.iPen.iX == 8);
sl@0
  4083
	#endif
sl@0
  4084
sl@0
  4085
	
sl@0
  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);	
sl@0
  4087
	param.iPosInText = 158;
sl@0
  4088
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  4089
	
sl@0
  4090
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  4091
	
sl@0
  4092
	TEST(r && param.iPosInText ==  160
sl@0
  4093
		   && param.iOutputGlyphs == 1
sl@0
  4094
		   && param.iOutput[0].iCode == 0x80000aee);
sl@0
  4095
		   
sl@0
  4096
	#if defined __WINS__ || defined __WINSCW__
sl@0
  4097
	TEST(r && param.iPen.iX == 14);
sl@0
  4098
	#endif
sl@0
  4099
	
sl@0
  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);
sl@0
  4101
	
sl@0
  4102
	param.iPosInText = 160;
sl@0
  4103
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  4104
	
sl@0
  4105
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  4106
	
sl@0
  4107
	TEST(r && param.iPosInText ==  162
sl@0
  4108
		   && param.iOutputGlyphs == 1
sl@0
  4109
		   && param.iOutput[0].iCode == 0x80000aed);
sl@0
  4110
sl@0
  4111
	#if defined __WINS__ || defined __WINSCW__
sl@0
  4112
	TEST(r && param.iPen.iX == 10);
sl@0
  4113
	#endif
sl@0
  4114
	
sl@0
  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);
sl@0
  4116
	}
sl@0
  4117
	
sl@0
  4118
	 
sl@0
  4119
void CTGlyphSelection::TestBengaliChars(CFbsFont* aFont)
sl@0
  4120
	{
sl@0
  4121
	INFO_PRINTF1(_L("Test Bengali Glyphs"));
sl@0
  4122
	
sl@0
  4123
	// Do the testing
sl@0
  4124
	
sl@0
  4125
	TBool r;
sl@0
  4126
	TBuf<115> testText(0);
sl@0
  4127
	CFont::TPositionParam param;
sl@0
  4128
	param.iDirection = CFont::EHorizontal;
sl@0
  4129
	param.iFlags = CFont::TPositionParam::EFLogicalOrder;
sl@0
  4130
sl@0
  4131
	testText.SetLength(115);
sl@0
  4132
	// Make sure there is no garbage values in the memory we are using.
sl@0
  4133
	for (TInt i = 0; i < testText.Length(); i++)
sl@0
  4134
		testText[i]=0xFFFF;
sl@0
  4135
	
sl@0
  4136
	//Testdata for Bengali language
sl@0
  4137
	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4002"));
sl@0
  4138
/**
sl@0
  4139
@SYMTestCaseID 				GRAPHICS-SYSLIB-GDI-CIT-4002
sl@0
  4140
@SYMTestCaseDesc 			Automated GDI testing for Bengali
sl@0
  4141
@SYMTestPriority 			High
sl@0
  4142
@SYMTestActions  			Attempt to compose various invalid Bengali glyph clusters to test the requirement.
sl@0
  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	
sl@0
  4144
@SYMTestExpectedResults 	Rendering engine will render as incomplete syllables
sl@0
  4145
@SYMPREQ 					1766 Bengali for Sphinx
sl@0
  4146
@SYMREQ 					8741 Bengali Text Rendering
sl@0
  4147
*/
sl@0
  4148
	
sl@0
  4149
	// BEN002: Test invalid sequences
sl@0
  4150
	testText[0] = 0x09C7;
sl@0
  4151
	testText[1] = 0x0995;
sl@0
  4152
	testText[2] = 0x0995;
sl@0
  4153
	testText[3] = 0x09C1;
sl@0
  4154
	testText[4] = 0x09C1;
sl@0
  4155
	testText[5] = 0x0995;
sl@0
  4156
	testText[6] = 0x09CD;
sl@0
  4157
	testText[7] = 0x09C1;
sl@0
  4158
	testText[8] = 0x0995;
sl@0
  4159
	testText[9] = 0x0981;
sl@0
  4160
	testText[10] = 0x09C1;
sl@0
  4161
	
sl@0
  4162
	param.iText.Set(testText);
sl@0
  4163
	RShapeInfo shapeInfo;
sl@0
  4164
	param.iPosInText = 0;
sl@0
  4165
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  4166
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  4167
	
sl@0
  4168
	TEST(r && param.iPosInText == 1
sl@0
  4169
			   && param.iOutputGlyphs == 2
sl@0
  4170
			   && param.iOutput[0].iCode == 0x80000ce5
sl@0
  4171
			   && param.iOutput[1].iCode == 0x8000058f);
sl@0
  4172
sl@0
  4173
	#if defined __WINS__ || defined __WINSCW__
sl@0
  4174
	TEST(r && param.iPen.iX == 15);
sl@0
  4175
	#endif
sl@0
  4176
	
sl@0
  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);
sl@0
  4178
		
sl@0
  4179
	param.iPosInText = 1;
sl@0
  4180
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  4181
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  4182
	
sl@0
  4183
	TEST(r && param.iPosInText == 2
sl@0
  4184
			   && param.iOutputGlyphs == 1
sl@0
  4185
			   && param.iOutput[0].iCode == 0x80000cbc);
sl@0
  4186
	
sl@0
  4187
	#if defined __WINS__ || defined __WINSCW__
sl@0
  4188
	TEST(r && param.iPen.iX == 12);
sl@0
  4189
	#endif
sl@0
  4190
	
sl@0
  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);
sl@0
  4192
	
sl@0
  4193
	param.iPosInText = 2;
sl@0
  4194
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  4195
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  4196
	
sl@0
  4197
	TEST(r && param.iPosInText == 4
sl@0
  4198
			   && param.iOutputGlyphs == 1
sl@0
  4199
			   && param.iOutput[0].iCode == 0x80000ebe);
sl@0
  4200
sl@0
  4201
	#if defined __WINS__ || defined __WINSCW__
sl@0
  4202
	TEST(r && param.iPen.iX == 13);
sl@0
  4203
	#endif
sl@0
  4204
	
sl@0
  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);
sl@0
  4206
		
sl@0
  4207
	param.iPosInText = 4;
sl@0
  4208
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  4209
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  4210
	
sl@0
  4211
	TEST(r && param.iPosInText == 5
sl@0
  4212
			   && param.iOutputGlyphs == 2
sl@0
  4213
			   && param.iOutput[0].iCode == 0x8000058f
sl@0
  4214
			   && param.iOutput[1].iCode == 0x80000ce1
sl@0
  4215
	   );
sl@0
  4216
	#if defined __WINS__ || defined __WINSCW__
sl@0
  4217
	TEST(r && param.iPen.iX == 9);
sl@0
  4218
	#endif
sl@0
  4219
	
sl@0
  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);
sl@0
  4221
		
sl@0
  4222
	param.iPosInText = 5;
sl@0
  4223
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  4224
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  4225
	
sl@0
  4226
	TEST(r && param.iPosInText == 7
sl@0
  4227
			   && param.iOutputGlyphs == 2
sl@0
  4228
			   && param.iOutput[0].iCode == 0x80000cbc
sl@0
  4229
			   && param.iOutput[1].iCode == 0x80000ce9
sl@0
  4230
			   );
sl@0
  4231
	
sl@0
  4232
	#if defined __WINS__ || defined __WINSCW__
sl@0
  4233
	TEST(r && param.iPen.iX == 12);
sl@0
  4234
	#endif
sl@0
  4235
	
sl@0
  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);
sl@0
  4237
	
sl@0
  4238
	param.iPosInText = 7;
sl@0
  4239
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  4240
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  4241
sl@0
  4242
	TEST(r && param.iPosInText == 8
sl@0
  4243
			   && param.iOutputGlyphs == 2
sl@0
  4244
			   && param.iOutput[0].iCode == 0x8000058f
sl@0
  4245
			   && param.iOutput[1].iCode == 0x80000ce1
sl@0
  4246
			   );
sl@0
  4247
	
sl@0
  4248
	#if defined __WINS__ || defined __WINSCW__
sl@0
  4249
	TEST(r && param.iPen.iX == 9);
sl@0
  4250
	#endif
sl@0
  4251
	
sl@0
  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);
sl@0
  4253
		
sl@0
  4254
	param.iPosInText = 8;
sl@0
  4255
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  4256
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  4257
	
sl@0
  4258
	TEST(r && param.iPosInText == 10
sl@0
  4259
			   && param.iOutputGlyphs == 2
sl@0
  4260
			   && param.iOutput[0].iCode == 0x80000cbc
sl@0
  4261
			   && param.iOutput[1].iCode == 0x80000cad
sl@0
  4262
			   );
sl@0
  4263
	
sl@0
  4264
	#if defined __WINS__ || defined __WINSCW__
sl@0
  4265
	TEST(r && param.iPen.iX == 12);
sl@0
  4266
	#endif
sl@0
  4267
	
sl@0
  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);
sl@0
  4269
	
sl@0
  4270
	param.iPosInText = 10;
sl@0
  4271
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  4272
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  4273
	
sl@0
  4274
	TEST(r && param.iPosInText == 11
sl@0
  4275
			   && param.iOutputGlyphs == 2
sl@0
  4276
			   && param.iOutput[0].iCode == 0x8000058f
sl@0
  4277
			   && param.iOutput[1].iCode == 0x80000ce1
sl@0
  4278
			   );
sl@0
  4279
	
sl@0
  4280
	#if defined __WINS__ || defined __WINSCW__
sl@0
  4281
	TEST(r && param.iPen.iX == 9);
sl@0
  4282
	#endif
sl@0
  4283
	
sl@0
  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);
sl@0
  4285
	TRAPD(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
sl@0
  4286
    	if (err!=KErrNone)
sl@0
  4287
    		INFO_PRINTF1(_L("Failed to record test result"));
sl@0
  4288
	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4003"));
sl@0
  4289
/**
sl@0
  4290
@SYMTestCaseID 				GRAPHICS-SYSLIB-GDI-CIT-4003
sl@0
  4291
@SYMTestCaseDesc 			Automated GDI testing for Bengali
sl@0
  4292
@SYMTestPriority 			High
sl@0
  4293
@SYMTestActions  
sl@0
  4294
							Passing both Bengali and Latin scripts simultaneously
sl@0
  4295
@SYMTestExpectedResults 	The expected glyph clusters for given Unicode characters must be returned
sl@0
  4296
@SYMPREQ 					1766 Bengali for Sphinx
sl@0
  4297
@SYMREQ 					8741 Bengali Text Rendering
sl@0
  4298
*/
sl@0
  4299
	//BEN003
sl@0
  4300
	testText[11] = 0x0995;
sl@0
  4301
	testText[12] = 0x0041; // Unicode value for A
sl@0
  4302
	testText[13] = 0x09E6;	//Bengali digit 1
sl@0
  4303
	
sl@0
  4304
	param.iPosInText = 11;
sl@0
  4305
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  4306
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  4307
	
sl@0
  4308
	TEST(r && param.iPosInText == 12
sl@0
  4309
			   && param.iOutputGlyphs == 1
sl@0
  4310
			   && param.iOutput[0].iCode == 0x80000cbc
sl@0
  4311
			   );
sl@0
  4312
sl@0
  4313
	#if defined __WINS__ || defined __WINSCW__
sl@0
  4314
	TEST(r && param.iPen.iX == 12);
sl@0
  4315
	#endif
sl@0
  4316
	
sl@0
  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);
sl@0
  4318
	
sl@0
  4319
	param.iPosInText = 12;
sl@0
  4320
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  4321
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  4322
sl@0
  4323
	TEST(r && param.iPosInText == 13	
sl@0
  4324
			   && param.iOutputGlyphs == 1
sl@0
  4325
			   && param.iOutput[0].iCode == 0x41
sl@0
  4326
	  	);
sl@0
  4327
	
sl@0
  4328
	#if defined __WINS__ || defined __WINSCW__
sl@0
  4329
	TEST(r && param.iPen.iX == 10);
sl@0
  4330
	#endif
sl@0
  4331
	
sl@0
  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);
sl@0
  4333
	
sl@0
  4334
	param.iPosInText = 13;
sl@0
  4335
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  4336
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  4337
	
sl@0
  4338
	TEST(r && param.iPosInText == 14
sl@0
  4339
			   && param.iOutputGlyphs == 1
sl@0
  4340
			   && param.iOutput[0].iCode ==0x80000cf3
sl@0
  4341
			   );
sl@0
  4342
sl@0
  4343
	#if defined __WINS__ || defined __WINSCW__
sl@0
  4344
	TEST(r && param.iPen.iX == 10);
sl@0
  4345
	#endif
sl@0
  4346
	
sl@0
  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);
sl@0
  4348
	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
sl@0
  4349
    	if (err!=KErrNone)
sl@0
  4350
    		INFO_PRINTF1(_L("Failed to record test result"));
sl@0
  4351
	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4004"));
sl@0
  4352
/**
sl@0
  4353
@SYMTestCaseID 				GRAPHICS-SYSLIB-GDI-CIT-4004
sl@0
  4354
@SYMTestCaseDesc 			Automated GDI testing for Bengali
sl@0
  4355
@SYMTestPriority 			High
sl@0
  4356
@SYMTestActions  			Attempt to compose various valid  Bengali glyph clusters to test the reequirement.
sl@0
  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.
sl@0
  4358
							Invalid sequences of characters must be rendered as incomplete syllables
sl@0
  4359
							
sl@0
  4360
@SYMTestExpectedResults 	The expected glyph clusters for given Unicode characters must be returned
sl@0
  4361
@SYMPREQ 					1766: Bengali for Sphinx
sl@0
  4362
@SYMREQ 					8741:  Bengali Text Rendering
sl@0
  4363
*/
sl@0
  4364
	// BEN004: 
sl@0
  4365
	testText[14] = 0x0985;
sl@0
  4366
	testText[15] = 0x09A4;
sl@0
  4367
	testText[16] = 0x09CD;
sl@0
  4368
	testText[17] = 0x09AF;
sl@0
  4369
	testText[18] = 0x09A8;
sl@0
  4370
	testText[19] = 0x09CD;
sl@0
  4371
	testText[20] = 0x09A4;
sl@0
  4372
	
sl@0
  4373
	param.iPosInText = 14;
sl@0
  4374
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  4375
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  4376
	
sl@0
  4377
	TEST(r && param.iPosInText == 15
sl@0
  4378
			   && param.iOutputGlyphs == 1
sl@0
  4379
			   && param.iOutput[0].iCode == 0x80000cb0
sl@0
  4380
			   );
sl@0
  4381
	
sl@0
  4382
	#if defined __WINS__ || defined __WINSCW__
sl@0
  4383
	TEST(r && param.iPen.iX == 14);
sl@0
  4384
	#endif
sl@0
  4385
	
sl@0
  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);
sl@0
  4387
		
sl@0
  4388
	param.iPosInText = 15;
sl@0
  4389
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  4390
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  4391
	
sl@0
  4392
	TEST(r && param.iPosInText == 18
sl@0
  4393
			   && param.iOutputGlyphs == 2
sl@0
  4394
			   && param.iOutput[0].iCode ==0x80000ccb
sl@0
  4395
			   && param.iOutput[1].iCode ==0x80000d6e
sl@0
  4396
			   );
sl@0
  4397
sl@0
  4398
	#if defined __WINS__ || defined __WINSCW__
sl@0
  4399
	TEST(r && param.iPen.iX == 16);
sl@0
  4400
	#endif
sl@0
  4401
	
sl@0
  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);
sl@0
  4403
	
sl@0
  4404
	param.iPosInText = 18;
sl@0
  4405
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  4406
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  4407
sl@0
  4408
	TEST(r && param.iPosInText == 21
sl@0
  4409
			   && param.iOutputGlyphs == 1
sl@0
  4410
			   && param.iOutput[0].iCode == 0x80000e14
sl@0
  4411
			   );
sl@0
  4412
	
sl@0
  4413
	#if defined __WINS__ || defined __WINSCW__
sl@0
  4414
	TEST(r && param.iPen.iX == 13);
sl@0
  4415
	#endif
sl@0
  4416
	
sl@0
  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);
sl@0
  4418
	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
sl@0
  4419
    	if (err!=KErrNone)
sl@0
  4420
    		INFO_PRINTF1(_L("Failed to record test result"));
sl@0
  4421
	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4005"));
sl@0
  4422
// BEN005
sl@0
  4423
/**
sl@0
  4424
@SYMTestCaseID 				GRAPHICS-SYSLIB-GDI-CIT-4005
sl@0
  4425
@SYMTestCaseDesc 			Automated GDI testing for Bengali
sl@0
  4426
@SYMTestPriority 			High
sl@0
  4427
@SYMTestActions  			Attempt to compose various valid Bengali glyph clusters to test the requirment
sl@0
  4428
							Text rendering must be able to display specified character sequences using ligatures and set of ligatures (stable/unstable) must be font dependent / configurable.
sl@0
  4429
@SYMTestExpectedResults 	The expected glyph clusters for given Unicode characters must be returned
sl@0
  4430
@SYMPREQ 					1766: Bengali for Sphinx
sl@0
  4431
@SYMREQ 					8741:  Bengali Text Rendering
sl@0
  4432
*/
sl@0
  4433
	testText[21] = 0x0995;
sl@0
  4434
	testText[22] = 0x09CD;
sl@0
  4435
	testText[23] = 0x09B7;
sl@0
  4436
	
sl@0
  4437
	testText[24] = 0x09A4;
sl@0
  4438
	testText[25] = 0x09CD;
sl@0
  4439
	testText[26] = 0x09B0;
sl@0
  4440
	
sl@0
  4441
	testText[27] = 0x09A6;
sl@0
  4442
	testText[28] = 0x09CD;
sl@0
  4443
	testText[29] = 0x09A6;
sl@0
  4444
	
sl@0
  4445
	
sl@0
  4446
	param.iPosInText = 21;
sl@0
  4447
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  4448
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  4449
	
sl@0
  4450
	TEST(r && param.iPosInText == 24
sl@0
  4451
			   && param.iOutputGlyphs == 1
sl@0
  4452
			   && param.iOutput[0].iCode == 0x80000d25
sl@0
  4453
			   );
sl@0
  4454
sl@0
  4455
	#if defined __WINS__ || defined __WINSCW__
sl@0
  4456
	TEST(r && param.iPen.iX == 15);
sl@0
  4457
	#endif
sl@0
  4458
	
sl@0
  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);
sl@0
  4460
		
sl@0
  4461
	param.iPosInText = 24;
sl@0
  4462
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  4463
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  4464
	
sl@0
  4465
	TEST(r && param.iPosInText == 27
sl@0
  4466
			   && param.iOutputGlyphs == 1
sl@0
  4467
			   && param.iOutput[0].iCode ==0x80000d89
sl@0
  4468
			   );
sl@0
  4469
sl@0
  4470
	#if defined __WINS__ || defined __WINSCW__
sl@0
  4471
	TEST(r && param.iPen.iX == 12);
sl@0
  4472
	#endif
sl@0
  4473
	
sl@0
  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);
sl@0
  4475
		
sl@0
  4476
	param.iPosInText = 27;
sl@0
  4477
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  4478
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  4479
	
sl@0
  4480
	TEST(r && param.iPosInText == 30
sl@0
  4481
			   && param.iOutputGlyphs == 1
sl@0
  4482
			   && param.iOutput[0].iCode == 0x80000e0a
sl@0
  4483
			   );
sl@0
  4484
	
sl@0
  4485
	#if defined __WINS__ || defined __WINSCW__
sl@0
  4486
	TEST(r && param.iPen.iX == 13);
sl@0
  4487
	#endif
sl@0
  4488
	
sl@0
  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);
sl@0
  4490
	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
sl@0
  4491
    	if (err!=KErrNone)
sl@0
  4492
    		INFO_PRINTF1(_L("Failed to record test result"));
sl@0
  4493
	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4006"));
sl@0
  4494
// BEN006
sl@0
  4495
/**
sl@0
  4496
@SYMTestCaseID 				GRAPHICS-SYSLIB-GDI-CIT-4006
sl@0
  4497
@SYMTestCaseDesc 			Automated GDI testing for Bengali
sl@0
  4498
@SYMTestPriority		 	High
sl@0
  4499
@SYMTestActions  			Attempt to compose various valid Bengali glyph clusters to test 
sl@0
  4500
							whether tamil digits are recongized as numerals. 
sl@0
  4501
@SYMTestExpectedResults 	The expected glyph clusters for given Unicode characters must be returned
sl@0
  4502
@SYMPREQ 					1766: Bengali for Sphinx
sl@0
  4503
@SYMREQ 					8741:  Bengali Text Rendering
sl@0
  4504
*/
sl@0
  4505
	testText[30] = 0x09E6; // Bengali 1
sl@0
  4506
	testText[31] = 0x0030; //Basic Latin 0
sl@0
  4507
	
sl@0
  4508
	
sl@0
  4509
	param.iPosInText = 30;
sl@0
  4510
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  4511
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  4512
	
sl@0
  4513
	TEST(r && param.iPosInText == 31
sl@0
  4514
			   && param.iOutputGlyphs == 1
sl@0
  4515
			   && param.iOutput[0].iCode == 0x80000cf3
sl@0
  4516
			   );
sl@0
  4517
	
sl@0
  4518
	#if defined __WINS__ || defined __WINSCW__
sl@0
  4519
	TEST(r && param.iPen.iX == 10);
sl@0
  4520
	#endif
sl@0
  4521
	
sl@0
  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);
sl@0
  4523
	
sl@0
  4524
	param.iPosInText = 31;
sl@0
  4525
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  4526
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  4527
	
sl@0
  4528
	TEST(r && param.iPosInText == 32
sl@0
  4529
			   && param.iOutputGlyphs == 1
sl@0
  4530
			   && param.iOutput[0].iCode == 0x80000774	 
sl@0
  4531
			   );
sl@0
  4532
	
sl@0
  4533
	#if defined __WINS__ || defined __WINSCW__
sl@0
  4534
	TEST(r && param.iPen.iX == 8);
sl@0
  4535
	#endif
sl@0
  4536
	
sl@0
  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);
sl@0
  4538
	
sl@0
  4539
	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
sl@0
  4540
    	if (err!=KErrNone)
sl@0
  4541
    		INFO_PRINTF1(_L("Failed to record test result"));
sl@0
  4542
	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4007"));
sl@0
  4543
//BEN 008
sl@0
  4544
/**
sl@0
  4545
@SYMTestCaseID 				GRAPHICS-SYSLIB-GDI-CIT-4007
sl@0
  4546
@SYMTestCaseDesc 			Automated GDI testing for Bengali
sl@0
  4547
@SYMTestPriority 			High
sl@0
  4548
@SYMTestActions  			Attempt to compose various valid
sl@0
  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
sl@0
  4550
@SYMTestExpectedResults 	The expected glyph clusters for given Unicode characters must be returned
sl@0
  4551
@SYMPREQ 					1766: Bengali for Sphinx
sl@0
  4552
@SYMREQ 					8741:  Bengali Text Rendering
sl@0
  4553
*/
sl@0
  4554
	testText[32] = 0x09AF;
sl@0
  4555
	testText[33] = 0x09BC;
sl@0
  4556
	testText[34] = 0x09DF;
sl@0
  4557
	
sl@0
  4558
	param.iPosInText = 32;
sl@0
  4559
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  4560
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  4561
	
sl@0
  4562
	TEST(r && param.iPosInText == 34
sl@0
  4563
			   && param.iOutputGlyphs == 1
sl@0
  4564
			   && param.iOutput[0].iCode == 0x80000cee	 
sl@0
  4565
			   );
sl@0
  4566
sl@0
  4567
	#if defined __WINS__ || defined __WINSCW__
sl@0
  4568
	TEST(r && param.iPen.iX == 10);
sl@0
  4569
	#endif
sl@0
  4570
	
sl@0
  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);
sl@0
  4572
	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
sl@0
  4573
    	if (err!=KErrNone)
sl@0
  4574
    		INFO_PRINTF1(_L("Failed to record test result"));
sl@0
  4575
	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4008"));
sl@0
  4576
// BEN011
sl@0
  4577
/**
sl@0
  4578
@SYMTestCaseID 				GRAPHICS-SYSLIB-GDI-CIT-4008
sl@0
  4579
@SYMTestCaseDesc 			Automated GDI testing for Bengali
sl@0
  4580
@SYMTestPriority 			High
sl@0
  4581
@SYMTestActions  			Attempt to compose various valid Bengali glyph clusters to test 
sl@0
  4582
							Rendering engine must be capable of handling joining formatters.
sl@0
  4583
@SYMTestExpectedResults 	The expected glyph clusters for given Unicode characters must be returned
sl@0
  4584
@SYMPREQ 					1766: Bengali for Sphinx
sl@0
  4585
@SYMREQ 					8741:  Bengali Text Rendering
sl@0
  4586
*/
sl@0
  4587
	testText[35] = 0x0995;
sl@0
  4588
	testText[36] = 0x09CD;
sl@0
  4589
	testText[37] = 0x09B7;
sl@0
  4590
	
sl@0
  4591
	testText[38] = 0x0995;
sl@0
  4592
	testText[39] = 0x09CD;
sl@0
  4593
	testText[40] = 0x200C;
sl@0
  4594
	testText[42] = 0x09B7;
sl@0
  4595
	
sl@0
  4596
	testText[43] = 0x0995;
sl@0
  4597
	testText[44] = 0x09CD;
sl@0
  4598
	testText[45] = 0x200D;
sl@0
  4599
	testText[46] = 0x09B7;
sl@0
  4600
	
sl@0
  4601
	
sl@0
  4602
	param.iPosInText = 35;
sl@0
  4603
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  4604
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  4605
sl@0
  4606
	TEST(r && param.iPosInText == 38
sl@0
  4607
			   && param.iOutputGlyphs == 1
sl@0
  4608
			   && param.iOutput[0].iCode == 0x80000d25
sl@0
  4609
			   );
sl@0
  4610
	
sl@0
  4611
	#if defined __WINS__ || defined __WINSCW__
sl@0
  4612
	TEST(r && param.iPen.iX == 15);
sl@0
  4613
	#endif
sl@0
  4614
	
sl@0
  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);
sl@0
  4616
		
sl@0
  4617
	param.iPosInText = 38;
sl@0
  4618
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  4619
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  4620
	
sl@0
  4621
	TEST(r && param.iPosInText == 40
sl@0
  4622
			   && param.iOutputGlyphs == 2
sl@0
  4623
			   && param.iOutput[0].iCode == 0x80000cbc
sl@0
  4624
			   && param.iOutput[1].iCode == 0x80000ce9
sl@0
  4625
			   );
sl@0
  4626
sl@0
  4627
	#if defined __WINS__ || defined __WINSCW__
sl@0
  4628
	TEST(r && param.iPen.iX == 12);
sl@0
  4629
	#endif
sl@0
  4630
	
sl@0
  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);
sl@0
  4632
		
sl@0
  4633
	param.iPosInText = 43;
sl@0
  4634
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  4635
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  4636
	
sl@0
  4637
	TEST(r && param.iPosInText == 47
sl@0
  4638
			   && param.iOutputGlyphs == 2
sl@0
  4639
			   && param.iOutput[0].iCode == 0x80000d2a
sl@0
  4640
			   && param.iOutput[1].iCode == 0x80000cd9
sl@0
  4641
			   );
sl@0
  4642
	
sl@0
  4643
	#if defined __WINS__ || defined __WINSCW__
sl@0
  4644
	TEST(r && param.iPen.iX == 22);
sl@0
  4645
	#endif
sl@0
  4646
	
sl@0
  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);
sl@0
  4648
		
sl@0
  4649
	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
sl@0
  4650
    	if (err!=KErrNone)
sl@0
  4651
    		INFO_PRINTF1(_L("Failed to record test result"));
sl@0
  4652
	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4009"));
sl@0
  4653
// BEN012
sl@0
  4654
	
sl@0
  4655
/**
sl@0
  4656
@SYMTestCaseID 				GRAPHICS-SYSLIB-GDI-CIT-4009
sl@0
  4657
@SYMTestCaseDesc 			Automated GDI testing for Bengali
sl@0
  4658
@SYMTestPriority 			High
sl@0
  4659
@SYMTestActions  			Attempt to compose various valid Bengali glyph clusters to test
sl@0
  4660
 							If consonant /ya/, /ra/, /la/, /ma/, /na/ or /ba/, is the last element of a consonant cluster, the consonant assumes a phala form.
sl@0
  4661
@SYMTestExpectedResults 	The expected glyph clusters for given Unicode characters must be returned
sl@0
  4662
@SYMPREQ 					1766: Bengali for Sphinx
sl@0
  4663
@SYMREQ 					8741:  Bengali Text Rendering
sl@0
  4664
*/
sl@0
  4665
	testText[47] = 0x09AA;
sl@0
  4666
	testText[48] = 0x09CD;
sl@0
  4667
	testText[49] = 0x09AF;
sl@0
  4668
	
sl@0
  4669
	testText[50] = 0x09AA;
sl@0
  4670
	testText[51] = 0x09CD;
sl@0
  4671
	testText[52] = 0x09A8;
sl@0
  4672
	
sl@0
  4673
	// Not working with Series60Sans font:
sl@0
  4674
	testText[53] = 0x09AA;
sl@0
  4675
	testText[54] = 0x09CD;
sl@0
  4676
	testText[55] = 0x09AE;
sl@0
  4677
	
sl@0
  4678
	param.iPosInText = 47;
sl@0
  4679
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  4680
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  4681
	
sl@0
  4682
	TEST(r && param.iPosInText == 50
sl@0
  4683
			   && param.iOutputGlyphs == 2
sl@0
  4684
			   && param.iOutput[0].iCode == 0x80000cd0
sl@0
  4685
			   );
sl@0
  4686
	
sl@0
  4687
	#if defined __WINS__ || defined __WINSCW__
sl@0
  4688
	TEST(r && param.iPen.iX == 15);
sl@0
  4689
	#endif
sl@0
  4690
	
sl@0
  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);
sl@0
  4692
	
sl@0
  4693
	param.iPosInText = 50;
sl@0
  4694
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  4695
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  4696
	
sl@0
  4697
	TEST(r && param.iPosInText == 53
sl@0
  4698
			   && param.iOutputGlyphs == 1
sl@0
  4699
			   && param.iOutput[0].iCode == 0x80000e25
sl@0
  4700
			   );
sl@0
  4701
	
sl@0
  4702
	#if defined __WINS__ || defined __WINSCW__
sl@0
  4703
	TEST(r && param.iPen.iX == 11);
sl@0
  4704
	#endif
sl@0
  4705
	
sl@0
  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);
sl@0
  4707
	// Not working with Series60Sans font:
sl@0
  4708
	param.iPosInText = 53;
sl@0
  4709
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  4710
	
sl@0
  4711
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  4712
	
sl@0
  4713
	TEST(r && param.iPosInText == 56
sl@0
  4714
	   && param.iOutputGlyphs == 2
sl@0
  4715
	   && param.iOutput[0].iCode == 0x80000d3e 
sl@0
  4716
	   && param.iOutput[1].iCode == 0x80000cd4
sl@0
  4717
	  	);
sl@0
  4718
sl@0
  4719
	#if defined __WINS__ || defined __WINSCW__
sl@0
  4720
	TEST(r && param.iPen.iX == 19);
sl@0
  4721
	#endif
sl@0
  4722
	
sl@0
  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);	
sl@0
  4724
	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
sl@0
  4725
    	if (err!=KErrNone)
sl@0
  4726
    		INFO_PRINTF1(_L("Failed to record test result"));
sl@0
  4727
	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4010"));
sl@0
  4728
// BEN013	
sl@0
  4729
/**
sl@0
  4730
@SYMTestCaseID 				GRAPHICS-SYSLIB-GDI-CIT-4010
sl@0
  4731
@SYMTestCaseDesc 			Automated GDI testing for Bengali
sl@0
  4732
@SYMTestPriority 			High
sl@0
  4733
@SYMTestActions  			Attempt to compose various valid Bengali glyph clusters to tet 
sl@0
  4734
							Sequence <virama, ya>, i.e. ya-phala, MUST be allowed after independent vowels /a/ and /e/.
sl@0
  4735
@SYMTestExpectedResults 	The expected glyph clusters for given Unicode characters must be returned
sl@0
  4736
@SYMPREQ 					1766: Bengali for Sphinx
sl@0
  4737
@SYMREQ 					8741:  Bengali Text Rendering
sl@0
  4738
*/
sl@0
  4739
	testText[56] = 0x0985;
sl@0
  4740
	testText[57] = 0x09CD;
sl@0
  4741
	testText[58] = 0x09AF;
sl@0
  4742
	testText[59] = 0x09BE;
sl@0
  4743
	
sl@0
  4744
	// Double ya -> Ya, ya-phala
sl@0
  4745
	testText[60] = 0x09AA;
sl@0
  4746
	testText[61] = 0x09CD;
sl@0
  4747
	testText[62] = 0x09AF;
sl@0
  4748
	testText[63] = 0x09CD;
sl@0
  4749
	testText[64] = 0x09AF;
sl@0
  4750
	
sl@0
  4751
	param.iPosInText = 56;
sl@0
  4752
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  4753
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  4754
	#if defined __WINS__ || defined __WINSCW__
sl@0
  4755
	TEST(r && param.iPosInText == 57
sl@0
  4756
			   && param.iPen.iX == 14
sl@0
  4757
			   && param.iOutputGlyphs == 1
sl@0
  4758
			   && param.iOutput[0].iCode == 0x80000cb0
sl@0
  4759
			   );
sl@0
  4760
	#elif defined __ARMCC__
sl@0
  4761
	TEST(r && param.iPosInText == 57
sl@0
  4762
			   && param.iOutputGlyphs == 1
sl@0
  4763
			   && param.iOutput[0].iCode == 0x80000cb0
sl@0
  4764
			   );
sl@0
  4765
	#endif
sl@0
  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);
sl@0
  4767
	
sl@0
  4768
	param.iPosInText = 57;
sl@0
  4769
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  4770
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  4771
	
sl@0
  4772
	TEST(r && param.iPosInText == 58
sl@0
  4773
			   && param.iOutputGlyphs == 0	
sl@0
  4774
			   );
sl@0
  4775
	
sl@0
  4776
	#if defined __WINS__ || defined __WINSCW__
sl@0
  4777
	TEST(r && param.iPen.iX == 0);
sl@0
  4778
	#endif
sl@0
  4779
	
sl@0
  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);
sl@0
  4781
	
sl@0
  4782
	param.iPosInText = 60;
sl@0
  4783
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  4784
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  4785
	
sl@0
  4786
	TEST(r && param.iPosInText == 65
sl@0
  4787
			   && param.iOutputGlyphs == 3
sl@0
  4788
			   && param.iOutput[0].iCode == 0x80000d3e
sl@0
  4789
			   && param.iOutput[1].iCode == 0x80000cd5
sl@0
  4790
			   && param.iOutput[2].iCode == 0x80000d6e
sl@0
  4791
			   );
sl@0
  4792
	
sl@0
  4793
	#if defined __WINS__ || defined __WINSCW__
sl@0
  4794
	TEST(r && param.iPen.iX == 23);
sl@0
  4795
	#endif
sl@0
  4796
	
sl@0
  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);
sl@0
  4798
	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
sl@0
  4799
    	if (err!=KErrNone)
sl@0
  4800
    		INFO_PRINTF1(_L("Failed to record test result"));
sl@0
  4801
	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4011"));
sl@0
  4802
	// BEN014
sl@0
  4803
	/**
sl@0
  4804
@SYMTestCaseID 				GRAPHICS-SYSLIB-GDI-CIT-4011
sl@0
  4805
@SYMTestCaseDesc 			Automated GDI testing for Bengali
sl@0
  4806
@SYMTestPriority 			High
sl@0
  4807
@SYMTestActions  			Attempt to compose various valid and glyph clusters to test 
sl@0
  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.
sl@0
  4809
@SYMTestExpectedResults 	The expected glyph clusters for given Unicode characters must be returned
sl@0
  4810
@SYMPREQ 					1766: Bengali for Sphinx
sl@0
  4811
@SYMREQ 					8741:  Bengali Text Rendering
sl@0
  4812
*/
sl@0
  4813
	testText[65] = 0x0997;
sl@0
  4814
	testText[66] = 0x09CD;
sl@0
  4815
	testText[67] = 0x099C;
sl@0
  4816
	
sl@0
  4817
	testText[68] = 0x09AA;
sl@0
  4818
	testText[69] = 0x09CD;
sl@0
  4819
	testText[70] = 0x099C;
sl@0
  4820
	
sl@0
  4821
	
sl@0
  4822
	param.iPosInText = 65;
sl@0
  4823
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  4824
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  4825
	
sl@0
  4826
	TEST(r && param.iPosInText == 68
sl@0
  4827
			   && param.iOutputGlyphs == 2
sl@0
  4828
			   && param.iOutput[0].iCode == 0x80000d2c
sl@0
  4829
			   && param.iOutput[1].iCode == 0x80000cc3
sl@0
  4830
			   );
sl@0
  4831
	
sl@0
  4832
	#if defined __WINS__ || defined __WINSCW__
sl@0
  4833
	TEST(r && param.iPen.iX == 21);
sl@0
  4834
	#endif
sl@0
  4835
	
sl@0
  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);
sl@0
  4837
		
sl@0
  4838
	param.iPosInText = 68;
sl@0
  4839
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  4840
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  4841
	
sl@0
  4842
	TEST(r && param.iPosInText == 71
sl@0
  4843
			   && param.iOutputGlyphs == 2
sl@0
  4844
			   && param.iOutput[0].iCode == 0x80000d3e
sl@0
  4845
			   );
sl@0
  4846
	
sl@0
  4847
	#if defined __WINS__ || defined __WINSCW__
sl@0
  4848
	TEST(r && param.iPen.iX == 23);
sl@0
  4849
	#endif
sl@0
  4850
	
sl@0
  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);
sl@0
  4852
		
sl@0
  4853
	
sl@0
  4854
	// BEN015
sl@0
  4855
	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
sl@0
  4856
    	if (err!=KErrNone)
sl@0
  4857
    		INFO_PRINTF1(_L("Failed to record test result"));
sl@0
  4858
	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4012"));
sl@0
  4859
	/**
sl@0
  4860
@SYMTestCaseID 				GRAPHICS-SYSLIB-GDI-CIT-4012
sl@0
  4861
@SYMTestCaseDesc 			Automated GDI testing for Bengali
sl@0
  4862
@SYMTestPriority 			High
sl@0
  4863
@SYMTestActions  			Attempt to compose various valid Bengali glyph clusters to test 
sl@0
  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.
sl@0
  4865
@SYMTestExpectedResults 	The expected glyph clusters for given Unicode characters must be returned
sl@0
  4866
@SYMPREQ 					1766: Bengali for Sphinx
sl@0
  4867
@SYMREQ 					8741:  Bengali Text Rendering
sl@0
  4868
*/
sl@0
  4869
	testText[71] = 0x0995;
sl@0
  4870
	testText[72] = 0x09CD;
sl@0
  4871
	testText[73] = 0x099C;
sl@0
  4872
	
sl@0
  4873
	
sl@0
  4874
	param.iPosInText = 71;
sl@0
  4875
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  4876
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  4877
	
sl@0
  4878
	TEST(r && param.iPosInText == 74
sl@0
  4879
			   && param.iOutputGlyphs == 2
sl@0
  4880
			   && param.iOutput[0].iCode == 0x80000d2a  
sl@0
  4881
			   );
sl@0
  4882
	
sl@0
  4883
	#if defined __WINS__ || defined __WINSCW__
sl@0
  4884
	TEST(r && param.iPen.iX == 26);
sl@0
  4885
	#endif
sl@0
  4886
	
sl@0
  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);
sl@0
  4888
sl@0
  4889
	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
sl@0
  4890
    	if (err!=KErrNone)
sl@0
  4891
    		INFO_PRINTF1(_L("Failed to record test result"));
sl@0
  4892
	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4013"));
sl@0
  4893
	// BEN016
sl@0
  4894
	
sl@0
  4895
	/**
sl@0
  4896
@SYMTestCaseID 				GRAPHICS-SYSLIB-GDI-CIT-4013
sl@0
  4897
@SYMTestCaseDesc 			Automated GDI testing for Bengali
sl@0
  4898
@SYMTestPriority 			High
sl@0
  4899
@SYMTestActions  			Attempt to compose various valid Bengali glyph clusters to test
sl@0
  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.
sl@0
  4901
@SYMTestExpectedResults 	The expected glyph clusters for given Unicode characters must be returned
sl@0
  4902
@SYMPREQ 					1766: Bengali for Sphinx
sl@0
  4903
@SYMREQ 					8741:  Bengali Text Rendering
sl@0
  4904
*/
sl@0
  4905
	// Ma does not stack correctly on top with Series60Sans font, produces half form instead. Font defect.
sl@0
  4906
	testText[74] = 0x09AE;
sl@0
  4907
	testText[75] = 0x09CD;
sl@0
  4908
	testText[76] = 0x09A5;
sl@0
  4909
	
sl@0
  4910
	testText[77] = 0x09AE;
sl@0
  4911
	testText[78] = 0x09CD;
sl@0
  4912
	testText[79] = 0x09AB;
sl@0
  4913
	// Ma does not stack correctly on top, produces half form instead.
sl@0
  4914
	testText[80] = 0x09AE;
sl@0
  4915
	testText[81] = 0x09CD;
sl@0
  4916
	testText[82] = 0x0995;
sl@0
  4917
	
sl@0
  4918
	testText[83] = 0x09A8;
sl@0
  4919
	testText[84] = 0x09CD;
sl@0
  4920
	testText[85] = 0x09A5;
sl@0
  4921
	
sl@0
  4922
	
sl@0
  4923
	//Combination pa,virama,ma produces incorrect glyph mapping: Font defect.
sl@0
  4924
sl@0
  4925
	param.iPosInText = 74;
sl@0
  4926
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  4927
	
sl@0
  4928
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  4929
	
sl@0
  4930
	TEST(r && param.iPosInText == 77		 
sl@0
  4931
		   && param.iOutputGlyphs == 2
sl@0
  4932
		   && param.iOutput[0].iCode == 0x80000d42 
sl@0
  4933
		   && param.iOutput[1].iCode == 0x80000ccc
sl@0
  4934
	);
sl@0
  4935
	
sl@0
  4936
	#if defined __WINS__ || defined __WINSCW__
sl@0
  4937
	TEST(r && param.iPen.iX == 21);
sl@0
  4938
	#endif
sl@0
  4939
	
sl@0
  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);
sl@0
  4941
	
sl@0
  4942
	
sl@0
  4943
	param.iPosInText = 77;
sl@0
  4944
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  4945
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  4946
	
sl@0
  4947
	TEST(r && param.iPosInText == 80
sl@0
  4948
			   && param.iOutputGlyphs == 1
sl@0
  4949
			   && param.iOutput[0].iCode == 0x80000e30
sl@0
  4950
			   );
sl@0
  4951
	
sl@0
  4952
	#if defined __WINS__ || defined __WINSCW__
sl@0
  4953
	TEST(r && param.iPen.iX == 19);
sl@0
  4954
	#endif
sl@0
  4955
	
sl@0
  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);
sl@0
  4957
	
sl@0
  4958
	// Ma does not stack correctly on top, produces half form instead.
sl@0
  4959
	param.iPosInText = 80;
sl@0
  4960
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  4961
	
sl@0
  4962
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  4963
	
sl@0
  4964
	TEST(r && param.iPosInText == 83
sl@0
  4965
	   && param.iOutputGlyphs == 2
sl@0
  4966
	   && param.iOutput[0].iCode == 0x80000d42
sl@0
  4967
	);
sl@0
  4968
	
sl@0
  4969
	#if defined __WINS__ || defined __WINSCW__
sl@0
  4970
	TEST(r && param.iPen.iX == 22);
sl@0
  4971
	#endif
sl@0
  4972
sl@0
  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);
sl@0
  4974
	
sl@0
  4975
	
sl@0
  4976
	param.iPosInText = 83;
sl@0
  4977
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  4978
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  4979
sl@0
  4980
	TEST(r && param.iPosInText == 86
sl@0
  4981
			   && param.iOutputGlyphs == 1
sl@0
  4982
			   && param.iOutput[0].iCode == 0x80000e15
sl@0
  4983
			   );
sl@0
  4984
	
sl@0
  4985
	#if defined __WINS__ || defined __WINSCW__
sl@0
  4986
	TEST(r && param.iPen.iX == 10);
sl@0
  4987
	#endif
sl@0
  4988
	
sl@0
  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);
sl@0
  4990
	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
sl@0
  4991
    	if (err!=KErrNone)
sl@0
  4992
    		INFO_PRINTF1(_L("Failed to record test result"));
sl@0
  4993
	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4014"));
sl@0
  4994
	// BEN017
sl@0
  4995
	
sl@0
  4996
	/**
sl@0
  4997
@SYMTestCaseID 				GRAPHICS-SYSLIB-GDI-CIT-4014
sl@0
  4998
@SYMTestCaseDesc 			Automated GDI testing for Bengali
sl@0
  4999
@SYMTestPriority 			High
sl@0
  5000
@SYMTestActions  			Attempt to compose various valid Bengali glyph clusters to test
sl@0
  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.
sl@0
  5002
@SYMTestExpectedResults 	The expected glyph clusters for given Unicode characters must be returned
sl@0
  5003
@SYMPREQ 					1766: Bengali for Sphinx
sl@0
  5004
@SYMREQ 					8741:  Bengali Text Rendering
sl@0
  5005
*/
sl@0
  5006
	testText[86] = 0x0995;
sl@0
  5007
	testText[87] = 0x09CD;
sl@0
  5008
	testText[88] = 0x099F;
sl@0
  5009
	
sl@0
  5010
	testText[89] = 0x0995;
sl@0
  5011
	testText[90] = 0x09CD;
sl@0
  5012
	testText[91] = 0x09A4;
sl@0
  5013
	
sl@0
  5014
	// Not sure if this is forming the correct ligature
sl@0
  5015
	testText[92] = 0x09AE;
sl@0
  5016
	testText[93] = 0x09CD;
sl@0
  5017
	testText[94] = 0x09AA;
sl@0
  5018
		
sl@0
  5019
	// Not sure if this is forming the correct ligature
sl@0
  5020
	testText[95] = 0x09B8;
sl@0
  5021
	testText[96] = 0x09CD;
sl@0
  5022
	testText[97] = 0x09AA;
sl@0
  5023
	
sl@0
  5024
	testText[98] = 0x09B9;
sl@0
  5025
	testText[99] = 0x09CD;
sl@0
  5026
	testText[100] = 0x09A8;
sl@0
  5027
	
sl@0
  5028
	param.iPosInText = 86;
sl@0
  5029
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  5030
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  5031
	
sl@0
  5032
	TEST(r && param.iPosInText == 89
sl@0
  5033
			   && param.iOutputGlyphs == 1
sl@0
  5034
			   && param.iOutput[0].iCode == 0x80000dd7
sl@0
  5035
			   );
sl@0
  5036
	
sl@0
  5037
	#if defined __WINS__ || defined __WINSCW__
sl@0
  5038
	TEST(r && param.iPen.iX == 12);
sl@0
  5039
	#endif
sl@0
  5040
	
sl@0
  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);
sl@0
  5042
	
sl@0
  5043
	param.iPosInText = 89;
sl@0
  5044
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  5045
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  5046
	
sl@0
  5047
	TEST(r && param.iPosInText == 92
sl@0
  5048
			   && param.iOutputGlyphs == 1
sl@0
  5049
			   && param.iOutput[0].iCode == 0x80000dd9
sl@0
  5050
			   );
sl@0
  5051
	
sl@0
  5052
	#if defined __WINS__ || defined __WINSCW__
sl@0
  5053
	TEST(r && param.iPen.iX == 15);
sl@0
  5054
	#endif
sl@0
  5055
	
sl@0
  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);
sl@0
  5057
	
sl@0
  5058
	param.iPosInText = 92;
sl@0
  5059
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  5060
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  5061
	
sl@0
  5062
	TEST(r && param.iPosInText == 95
sl@0
  5063
			   && param.iOutputGlyphs == 1
sl@0
  5064
			   && param.iOutput[0].iCode == 0x80000e2f
sl@0
  5065
			   );
sl@0
  5066
sl@0
  5067
	#if defined __WINS__ || defined __WINSCW__
sl@0
  5068
	TEST(r && param.iPen.iX == 19);
sl@0
  5069
	#endif
sl@0
  5070
	
sl@0
  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);
sl@0
  5072
		
sl@0
  5073
	param.iPosInText = 95;
sl@0
  5074
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  5075
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  5076
	
sl@0
  5077
	TEST(r && param.iPosInText == 98
sl@0
  5078
			   && param.iOutputGlyphs == 1
sl@0
  5079
			   && param.iOutput[0].iCode == 0x80000e56
sl@0
  5080
			   );
sl@0
  5081
	
sl@0
  5082
	#if defined __WINS__ || defined __WINSCW__
sl@0
  5083
	TEST(r && param.iPen.iX == 20);
sl@0
  5084
	#endif
sl@0
  5085
	
sl@0
  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);	
sl@0
  5087
	
sl@0
  5088
	param.iPosInText = 98;
sl@0
  5089
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  5090
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  5091
	
sl@0
  5092
	TEST(r && param.iPosInText == 101	
sl@0
  5093
			   && param.iOutputGlyphs == 1
sl@0
  5094
			   && param.iOutput[0].iCode == 0x80000e5d	
sl@0
  5095
			   );
sl@0
  5096
sl@0
  5097
	#if defined __WINS__ || defined __WINSCW__
sl@0
  5098
	TEST(r && param.iPen.iX == 13);
sl@0
  5099
	#endif
sl@0
  5100
	
sl@0
  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);
sl@0
  5102
	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
sl@0
  5103
    	if (err!=KErrNone)
sl@0
  5104
    		INFO_PRINTF1(_L("Failed to record test result"));
sl@0
  5105
	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4015"));
sl@0
  5106
// BEN020
sl@0
  5107
/**
sl@0
  5108
@SYMTestCaseID 				GRAPHICS-SYSLIB-GDI-CIT-4015
sl@0
  5109
@SYMTestCaseDesc 			Automated GDI testing for Bengali
sl@0
  5110
@SYMTestPriority 			High
sl@0
  5111
@SYMTestActions  			Attempt to compose various valid Bengali glyph clusters to test that
sl@0
  5112
 							If RA is the first consonant cluster, it must assume the form of Repha.
sl@0
  5113
@SYMTestExpectedResults 	The expected glyph clusters for given Unicode characters must be returned
sl@0
  5114
@SYMPREQ 					1766: Bengali for Sphinx
sl@0
  5115
@SYMREQ 					8741:  Bengali Text Rendering
sl@0
  5116
*/
sl@0
  5117
	testText[101] = 0x09B0;
sl@0
  5118
	testText[102] = 0x09CD;
sl@0
  5119
	testText[103] = 0x0995;
sl@0
  5120
	
sl@0
  5121
	testText[104] = 0x09B0;
sl@0
  5122
	testText[105] = 0x200C;
sl@0
  5123
	testText[106] = 0x09CD;
sl@0
  5124
	testText[107] = 0x09AF;
sl@0
  5125
	
sl@0
  5126
	param.iPosInText = 101;
sl@0
  5127
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  5128
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  5129
	
sl@0
  5130
	TEST(r && param.iPosInText == 104
sl@0
  5131
			   && param.iOutputGlyphs == 2
sl@0
  5132
			   && param.iOutput[0].iCode == 0x80000cbc
sl@0
  5133
			   && param.iOutput[1].iCode == 0x80000d27
sl@0
  5134
			   );
sl@0
  5135
	
sl@0
  5136
	#if defined __WINS__ || defined __WINSCW__
sl@0
  5137
	TEST(r && param.iPen.iX == 12);
sl@0
  5138
	#endif
sl@0
  5139
	
sl@0
  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);
sl@0
  5141
		
sl@0
  5142
	param.iPosInText =104;
sl@0
  5143
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  5144
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  5145
	
sl@0
  5146
	TEST(r && param.iPosInText == 105
sl@0
  5147
			   && param.iOutputGlyphs == 1
sl@0
  5148
			   && param.iOutput[0].iCode == 0x80000cd6
sl@0
  5149
			   );
sl@0
  5150
sl@0
  5151
	#if defined __WINS__ || defined __WINSCW__
sl@0
  5152
	TEST(r && param.iPen.iX == 9);
sl@0
  5153
	#endif
sl@0
  5154
	
sl@0
  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);
sl@0
  5156
		
sl@0
  5157
	}
sl@0
  5158
sl@0
  5159
sl@0
  5160
void CTGlyphSelection::TestTamilChars(CFbsFont* aFont)
sl@0
  5161
	{
sl@0
  5162
INFO_PRINTF1(_L("Test Tamil Glyphs"));
sl@0
  5163
 
sl@0
  5164
  	TBool r;
sl@0
  5165
	TBuf<162> testText(0);
sl@0
  5166
	CFont::TPositionParam param;
sl@0
  5167
	param.iDirection = CFont::EHorizontal;
sl@0
  5168
	param.iFlags = CFont::TPositionParam::EFLogicalOrder;
sl@0
  5169
sl@0
  5170
	testText.SetLength(162);
sl@0
  5171
	// Make sure there is no garbage values in the memory we are using.
sl@0
  5172
	for (TInt i = 0; i < testText.Length(); i++)
sl@0
  5173
		testText[i]=0xFFFF;
sl@0
  5174
	param.iText.Set(testText);
sl@0
  5175
	RShapeInfo shapeInfo;
sl@0
  5176
	//Testdata for Tamil Langauage
sl@0
  5177
	TRAPD(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
sl@0
  5178
    	if (err!=KErrNone)
sl@0
  5179
    		INFO_PRINTF1(_L("Failed to record test result"));
sl@0
  5180
	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4016"));
sl@0
  5181
/*	
sl@0
  5182
@SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4016
sl@0
  5183
@SYMTestCaseDesc Automated GDI testing for Tamil
sl@0
  5184
@SYMTestPriority High
sl@0
  5185
@SYMTestActions  Attempt to compose various valid Tamil glyph clusters to test 
sl@0
  5186
  	 a)The Tamil alphabets are listed in contiguous Unicode range(U+0B80–U+0BFF),  This also contains Tamil Numbers.
sl@0
  5187
	 b)The Tamil alphabets are listed in contiguous Unicode range(U+0B80–U+0BFF),  This also contains Tamil Numbers.
sl@0
  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
sl@0
  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
sl@0
  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.
sl@0
  5191
@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
sl@0
  5192
@SYMPREQ 1766: Tamil for Sphinx
sl@0
  5193
@SYMREQ 8742:Tamil Text Rendering
sl@0
  5194
*/
sl@0
  5195
	testText[0] = 0x0B95; //Tamil Ka
sl@0
  5196
	testText[1] = 0x0B8E; //Tamil e
sl@0
  5197
	testText[2] = 0x0061; //Latin A
sl@0
  5198
	testText[3] = 0x0905; // Hindi Ka
sl@0
  5199
	testText[4] = 0x0020;
sl@0
  5200
	// Do the testing
sl@0
  5201
	param.iPosInText = 0 ;
sl@0
  5202
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  5203
	
sl@0
  5204
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  5205
sl@0
  5206
	TEST(r && param.iPosInText == 1  
sl@0
  5207
		   && param.iOutputGlyphs == 1
sl@0
  5208
		   && param.iOutput[0].iCode == 0x80000bf6);
sl@0
  5209
sl@0
  5210
	#if defined __WINS__ || defined __WINSCW__
sl@0
  5211
	TEST(r && param.iPen.iX == 13);
sl@0
  5212
	#endif
sl@0
  5213
	
sl@0
  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);
sl@0
  5215
	
sl@0
  5216
	param.iPosInText = 1 ;
sl@0
  5217
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  5218
	
sl@0
  5219
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  5220
	
sl@0
  5221
	TEST(r && param.iPosInText ==  2 
sl@0
  5222
		   && param.iOutputGlyphs == 1
sl@0
  5223
		   && param.iOutput[0].iCode == 0x80000bf0);
sl@0
  5224
sl@0
  5225
	#if defined __WINS__ || defined __WINSCW__
sl@0
  5226
	TEST(r && param.iPen.iX == 14);
sl@0
  5227
	#endif
sl@0
  5228
	
sl@0
  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);
sl@0
  5230
	
sl@0
  5231
	param.iPosInText = 2 ;
sl@0
  5232
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  5233
	
sl@0
  5234
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  5235
	
sl@0
  5236
	TEST(r && param.iPosInText == 3
sl@0
  5237
		   && param.iOutputGlyphs == 1
sl@0
  5238
		   && param.iOutput[0].iCode == 0x61 );
sl@0
  5239
sl@0
  5240
	#if defined __WINS__ || defined __WINSCW__
sl@0
  5241
	TEST(r && param.iPen.iX == 10);
sl@0
  5242
	#endif
sl@0
  5243
	
sl@0
  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);
sl@0
  5245
	param.iPosInText = 3 ;
sl@0
  5246
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  5247
	
sl@0
  5248
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  5249
	
sl@0
  5250
	TEST(r && param.iPosInText == 4  
sl@0
  5251
		   && param.iOutputGlyphs == 1
sl@0
  5252
		   && param.iOutput[0].iCode == 0x80000528);
sl@0
  5253
sl@0
  5254
	#if defined __WINS__ || defined __WINSCW__
sl@0
  5255
	TEST(r && param.iPen.iX == 12);
sl@0
  5256
	#endif
sl@0
  5257
	
sl@0
  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);
sl@0
  5259
	
sl@0
  5260
	/*Req 02 1.2.3, 1.3.21, 1.3.21.1, 1.3.21.2 1.3.21.3
sl@0
  5261
	
sl@0
  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. 
sl@0
  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
sl@0
  5264
Please see the attachment for examples
sl@0
  5265
	1.3.21.1 For normal rendering, combining Tamil characters must be preceded by a valid base character. 
sl@0
  5266
	1.3.21.2 Combining Tamil characters that do not follow a valid base character must be rendered using an appropriate fallback rendering.
sl@0
  5267
	1.3.21.3 Device must not hang or crash because of unexpected character sequences.*/
sl@0
  5268
	
sl@0
  5269
	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
sl@0
  5270
    	if (err!=KErrNone)
sl@0
  5271
    		INFO_PRINTF1(_L("Failed to record test result"));
sl@0
  5272
	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4017"));
sl@0
  5273
//Req 03 
sl@0
  5274
	
sl@0
  5275
/**
sl@0
  5276
@SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4017
sl@0
  5277
@SYMTestCaseDesc Automated GDI testing for Tamil
sl@0
  5278
@SYMTestPriority High
sl@0
  5279
@SYMTestActions  Attempt to compose various valid Tamil glyph clusters to test 
sl@0
  5280
				 It is reasonably common to mix Latin, Tamil as well as other script in texts.  This must include the numerals.
sl@0
  5281
@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
sl@0
  5282
@SYMPREQ 1766: Tamil for Sphinx
sl@0
  5283
@SYMREQ 8742:Tamil Text Rendering
sl@0
  5284
*/
sl@0
  5285
	testText[4] = 0x0036;//Latin 06
sl@0
  5286
	testText[5] = 0x0BEC;//Tamil 06
sl@0
  5287
	
sl@0
  5288
	param.iPosInText = 4 ;
sl@0
  5289
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  5290
	
sl@0
  5291
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  5292
	
sl@0
  5293
	TEST(r && param.iPosInText == 5  
sl@0
  5294
		   && param.iOutputGlyphs == 1
sl@0
  5295
		   && param.iOutput[0].iCode == 0x8000077A);
sl@0
  5296
	
sl@0
  5297
	#if defined __WINS__ || defined __WINSCW__
sl@0
  5298
	TEST(r && param.iPen.iX == 8);
sl@0
  5299
	#endif
sl@0
  5300
sl@0
  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);
sl@0
  5302
		
sl@0
  5303
	param.iPosInText = 5 ;
sl@0
  5304
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  5305
	
sl@0
  5306
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  5307
	
sl@0
  5308
	TEST(r && param.iPosInText == 6  
sl@0
  5309
		   && param.iOutputGlyphs == 1
sl@0
  5310
		   && param.iOutput[0].iCode == 0x80000c20);
sl@0
  5311
sl@0
  5312
	#if defined __WINS__ || defined __WINSCW__
sl@0
  5313
	TEST(r && param.iPen.iX == 16);
sl@0
  5314
	#endif
sl@0
  5315
	
sl@0
  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);
sl@0
  5317
sl@0
  5318
	/*Req 04 1.3.4, 1.3.20
sl@0
  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.
sl@0
  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.
sl@0
  5321
			3. After a syllable has been formed it must be considered an indivisible and invariable unit.
sl@0
  5322
			4. The shape of a syllable is not affected by surrounding syllables.
sl@0
  5323
	1.3.20 Syllable is the smallest unbreakable component in Tamil*/
sl@0
  5324
	
sl@0
  5325
	/*Req 07 1.3.5
sl@0
  5326
	
sl@0
  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
sl@0
  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
sl@0
  5329
	
sl@0
  5330
	Req 08 1.3.19
sl@0
  5331
	
sl@0
  5332
	1.3.19 In Tamil white space is used as a word boundary. Line breaking should be based on word boundaries
sl@0
  5333
	
sl@0
  5334
	
sl@0
  5335
	Req 09 1.2.4
sl@0
  5336
	
sl@0
  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)
sl@0
  5338
	*/
sl@0
  5339
	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
sl@0
  5340
    	if (err!=KErrNone)
sl@0
  5341
    		INFO_PRINTF1(_L("Failed to record test result"));
sl@0
  5342
	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4018"));
sl@0
  5343
//Req 10 1.3.6	
sl@0
  5344
/**
sl@0
  5345
@SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4018
sl@0
  5346
@SYMTestCaseDesc Automated GDI testing for Tamil
sl@0
  5347
@SYMTestPriority High
sl@0
  5348
@SYMTestActions  Attempt to compose various valid Tamil glyph clusters to test the requirement.
sl@0
  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.
sl@0
  5350
@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
sl@0
  5351
@SYMPREQ 1766: Tamil for Sphinx
sl@0
  5352
@SYMREQ 8742:Tamil Text Rendering
sl@0
  5353
*/
sl@0
  5354
	testText[6] = 0x0BAA; // Pa
sl@0
  5355
	testText[7] = 0x0BCD; //Virama
sl@0
  5356
	testText[8] = 0x0B95; //Ka
sl@0
  5357
	testText[9] = 0x0BCD; //Virama
sl@0
  5358
	testText[10] = 0x0B9F; //Tta
sl@0
  5359
	testText[11] = 0x0BC7; //-e
sl@0
  5360
	
sl@0
  5361
	testText[12] = 0x0BAA;//Pa
sl@0
  5362
	testText[13] = 0x0BCD;//Virama
sl@0
  5363
	testText[14] = 0x0B95;//Ka
sl@0
  5364
	testText[15] = 0x0BCC;//AU
sl@0
  5365
	
sl@0
  5366
	testText[16] = 0x0B95; //Ka
sl@0
  5367
	testText[17] = 0x0BCD; //Virama
sl@0
  5368
	testText[18] = 0x0BB7; //Ssa
sl@0
  5369
	testText[19] = 0x0BCB; //OO
sl@0
  5370
	
sl@0
  5371
	param.iPosInText = 6 ;
sl@0
  5372
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  5373
	
sl@0
  5374
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  5375
	
sl@0
  5376
	TEST(r && param.iPosInText == 12    
sl@0
  5377
		   && param.iOutputGlyphs == 4
sl@0
  5378
		   && param.iOutput[0].iCode == 0x80000c3a
sl@0
  5379
		   && param.iOutput[1].iCode == 0x80000c30  
sl@0
  5380
		   && param.iOutput[2].iCode == 0x80000c13
sl@0
  5381
		   && param.iOutput[3].iCode == 0x80000bfb);
sl@0
  5382
	
sl@0
  5383
	#if defined __WINS__ || defined __WINSCW__
sl@0
  5384
	TEST(r && param.iPen.iX == 51);
sl@0
  5385
	#endif
sl@0
  5386
	
sl@0
  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);
sl@0
  5388
	
sl@0
  5389
	param.iPosInText = 12 ;
sl@0
  5390
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  5391
	
sl@0
  5392
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  5393
	
sl@0
  5394
	TEST(r && param.iPosInText ==  16 
sl@0
  5395
		   && param.iOutputGlyphs ==4 
sl@0
  5396
		   && param.iOutput[0].iCode == 0x80000c3a 
sl@0
  5397
		   && param.iOutput[1].iCode == 0x80000c12 
sl@0
  5398
		   && param.iOutput[2].iCode == 0x80000bf6
sl@0
  5399
		   && param.iOutput[3].iCode == 0x80000c19);
sl@0
  5400
	
sl@0
  5401
	#if defined __WINS__ || defined __WINSCW__
sl@0
  5402
	TEST(r && param.iPen.iX == 56);
sl@0
  5403
	#endif
sl@0
  5404
	
sl@0
  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);
sl@0
  5406
	
sl@0
  5407
	param.iPosInText = 16 ;
sl@0
  5408
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  5409
	
sl@0
  5410
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  5411
	
sl@0
  5412
	TEST(r && param.iPosInText == 20  
sl@0
  5413
		   && param.iOutputGlyphs == 3
sl@0
  5414
		   && param.iOutput[0].iCode == 0x80000c13
sl@0
  5415
		   && param.iOutput[1].iCode == 0x80000c2f  
sl@0
  5416
		   && param.iOutput[2].iCode == 0x80000c0d);
sl@0
  5417
sl@0
  5418
	#if defined __WINS__ || defined __WINSCW__
sl@0
  5419
	TEST(r && param.iPen.iX == 54);
sl@0
  5420
	#endif
sl@0
  5421
	
sl@0
  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);
sl@0
  5423
	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
sl@0
  5424
    	if (err!=KErrNone)
sl@0
  5425
    		INFO_PRINTF1(_L("Failed to record test result"));
sl@0
  5426
	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4019"));
sl@0
  5427
//Req 11
sl@0
  5428
/**
sl@0
  5429
@SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4019
sl@0
  5430
@SYMTestCaseDesc Automated GDI testing for Tamil
sl@0
  5431
@SYMTestPriority High
sl@0
  5432
@SYMTestActions  Attempt to compose various valid Tamil glyph clusters to test the requirement
sl@0
  5433
				 Matras /-e/, /-ee/ and /-ai/ are reordered with the consonant they follow in memory order.
sl@0
  5434
@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
sl@0
  5435
@SYMPREQ 1766: Tamil for Sphinx
sl@0
  5436
@SYMREQ 8742:Tamil Text Rendering
sl@0
  5437
*/
sl@0
  5438
sl@0
  5439
	testText[20] = 0x0B95; //Ka
sl@0
  5440
	testText[21] = 0x0BC7; //-e
sl@0
  5441
	
sl@0
  5442
	param.iPosInText = 20 ;
sl@0
  5443
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  5444
	
sl@0
  5445
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  5446
	
sl@0
  5447
	TEST(r && param.iPosInText == 22  
sl@0
  5448
		   && param.iOutputGlyphs == 2
sl@0
  5449
		   && param.iOutput[0].iCode == 0x80000c13 
sl@0
  5450
		   && param.iOutput[1].iCode == 0x80000bf6 );
sl@0
  5451
	
sl@0
  5452
	#if defined __WINS__ || defined __WINSCW__
sl@0
  5453
	TEST(r && param.iPen.iX == 26);
sl@0
  5454
	#endif
sl@0
  5455
	
sl@0
  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); 
sl@0
  5457
	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
sl@0
  5458
    	if (err!=KErrNone)
sl@0
  5459
    		INFO_PRINTF1(_L("Failed to record test result"));
sl@0
  5460
	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4020"));
sl@0
  5461
//Req 12 1.3.5.2
sl@0
  5462
/**
sl@0
  5463
@SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4020
sl@0
  5464
@SYMTestCaseDesc Automated GDI testing for Tamil
sl@0
  5465
@SYMTestPriority High
sl@0
  5466
@SYMTestActions  Attempt to compose various valid Tamil glyph clusters to test the requirment
sl@0
  5467
				 Matras /-o/, /-oo/ and /-au/ are split into two halves that enclose the consonant they follow in memory order.
sl@0
  5468
@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
sl@0
  5469
@SYMPREQ 1766: Tamil for Sphinx
sl@0
  5470
@SYMREQ 8742:Tamil Text Rendering
sl@0
  5471
*/
sl@0
  5472
sl@0
  5473
	testText[22] = 0x0B95; //Ka
sl@0
  5474
	testText[23] = 0x0BCA; //O
sl@0
  5475
	
sl@0
  5476
	
sl@0
  5477
	param.iPosInText = 22 ;
sl@0
  5478
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  5479
	
sl@0
  5480
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  5481
	
sl@0
  5482
	TEST(r && param.iPosInText ==  24 
sl@0
  5483
		   && param.iOutputGlyphs == 3
sl@0
  5484
		   && param.iOutput[0].iCode == 0x80000c12
sl@0
  5485
		   && param.iOutput[1].iCode == 0x80000bf6   
sl@0
  5486
		   && param.iOutput[2].iCode == 0x80000c0d);
sl@0
  5487
sl@0
  5488
	#if defined __WINS__ || defined __WINSCW__
sl@0
  5489
	TEST(r && param.iPen.iX == 37);
sl@0
  5490
	#endif
sl@0
  5491
	
sl@0
  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);
sl@0
  5493
	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
sl@0
  5494
    	if (err!=KErrNone)
sl@0
  5495
    		INFO_PRINTF1(_L("Failed to record test result"));
sl@0
  5496
	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4021"));
sl@0
  5497
	//Req 13 
sl@0
  5498
/**
sl@0
  5499
@SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4021
sl@0
  5500
@SYMTestCaseDesc Automated GDI testing for Tamil
sl@0
  5501
@SYMTestPriority High
sl@0
  5502
@SYMTestActions  Attempt to compose various valid Tamil glyph clusters to test the requirment.
sl@0
  5503
				Tamil Modifier "Ayatham" MUST be treated as an independent character
sl@0
  5504
@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
sl@0
  5505
@SYMPREQ 1766: Tamil for Sphinx
sl@0
  5506
@SYMREQ 8742:Tamil Text Rendering
sl@0
  5507
*/
sl@0
  5508
sl@0
  5509
	testText[24] = 0x0B95; //Ka
sl@0
  5510
	testText[25] = 0x0B83; //Aythem
sl@0
  5511
	testText[26] = 0x0B85; //A
sl@0
  5512
	
sl@0
  5513
	param.iPosInText = 24;
sl@0
  5514
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  5515
	
sl@0
  5516
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  5517
	
sl@0
  5518
	TEST(r && param.iPosInText ==  25 
sl@0
  5519
		   && param.iOutputGlyphs == 1
sl@0
  5520
		   && param.iOutput[0].iCode == 0x80000bf6);
sl@0
  5521
sl@0
  5522
	#if defined __WINS__ || defined __WINSCW__
sl@0
  5523
	TEST(r && param.iPen.iX == 13);
sl@0
  5524
	#endif
sl@0
  5525
	
sl@0
  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);
sl@0
  5527
	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
sl@0
  5528
    	if (err!=KErrNone)
sl@0
  5529
    		INFO_PRINTF1(_L("Failed to record test result"));
sl@0
  5530
	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4022"));
sl@0
  5531
//Req 14 
sl@0
  5532
/**
sl@0
  5533
@SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4022
sl@0
  5534
@SYMTestCaseDesc Automated GDI testing for Tamil
sl@0
  5535
@SYMTestPriority High
sl@0
  5536
@SYMTestActions  Attempt to compose various valid Tamil glyph clusters to test the requirement. 
sl@0
  5537
			 	Rendering Engine MUST be capable of handling TAMIL ANUSVARA
sl@0
  5538
				It has been suggested that this character be deprecated in Unicode
sl@0
  5539
@@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
sl@0
  5540
@SYMPREQ 1766: Tamil for Sphinx
sl@0
  5541
@SYMREQ 8742:Tamil Text Rendering
sl@0
  5542
*/
sl@0
  5543
	
sl@0
  5544
	testText[27] = 0x0B95; //Ka
sl@0
  5545
	testText[28] = 0x0B82; //Anusvara
sl@0
  5546
	testText[29] = 0x0B95; //Ka
sl@0
  5547
	
sl@0
  5548
	param.iPosInText = 27;
sl@0
  5549
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  5550
	
sl@0
  5551
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  5552
	
sl@0
  5553
	TEST(r && param.iPosInText ==  29 
sl@0
  5554
		   && param.iOutputGlyphs == 2 
sl@0
  5555
		   && param.iOutput[0].iCode == 0x80000bf6
sl@0
  5556
		   && param.iOutput[1].iCode == 0x80000be8);
sl@0
  5557
sl@0
  5558
	#if defined __WINS__ || defined __WINSCW__
sl@0
  5559
	TEST(r && param.iPen.iX == 19);
sl@0
  5560
	#endif
sl@0
  5561
	
sl@0
  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);
sl@0
  5563
	param.iPosInText = 29;
sl@0
  5564
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  5565
	
sl@0
  5566
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  5567
	
sl@0
  5568
	TEST(r && param.iPosInText ==  30 
sl@0
  5569
		   && param.iOutputGlyphs == 1
sl@0
  5570
		   && param.iOutput[0].iCode == 0x80000bf6 );
sl@0
  5571
sl@0
  5572
	#if defined __WINS__ || defined __WINSCW__
sl@0
  5573
	TEST(r && param.iPen.iX == 13);
sl@0
  5574
	#endif 
sl@0
  5575
	
sl@0
  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);
sl@0
  5577
	
sl@0
  5578
	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
sl@0
  5579
    	if (err!=KErrNone)
sl@0
  5580
    		INFO_PRINTF1(_L("Failed to record test result"));
sl@0
  5581
	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4023"));
sl@0
  5582
//Req 15
sl@0
  5583
/**
sl@0
  5584
@SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4023
sl@0
  5585
@SYMTestCaseDesc Automated GDI testing for Tamil
sl@0
  5586
@SYMTestPriority High
sl@0
  5587
@SYMTestActions  Attempt to compose various valid Tamil glyph clusters to test the requirment
sl@0
  5588
				 Tamil consonant /ra/ changes its shape, when a virama is applied to it.
sl@0
  5589
@@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
sl@0
  5590
@SYMPREQ 1766: Tamil for Sphinx
sl@0
  5591
@SYMREQ 8742:Tamil Text Rendering
sl@0
  5592
*/
sl@0
  5593
sl@0
  5594
	testText[30] = 0x0BB0; //Ra
sl@0
  5595
	testText[31] = 0x0BCD; //Virama
sl@0
  5596
	testText[32] = 0x8205; //ZWJ
sl@0
  5597
	
sl@0
  5598
	
sl@0
  5599
	param.iPosInText =  30;
sl@0
  5600
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  5601
	
sl@0
  5602
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  5603
	
sl@0
  5604
	TEST(r && param.iPosInText ==  32 
sl@0
  5605
		   && param.iOutputGlyphs == 2 
sl@0
  5606
		   && param.iOutput[0].iCode == 0x80000c03 );
sl@0
  5607
sl@0
  5608
	#if defined __WINS__ || defined __WINSCW__
sl@0
  5609
	TEST(r && param.iPen.iX == 10);
sl@0
  5610
	#endif 
sl@0
  5611
	
sl@0
  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);
sl@0
  5613
	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
sl@0
  5614
    	if (err!=KErrNone)
sl@0
  5615
    		INFO_PRINTF1(_L("Failed to record test result"));
sl@0
  5616
	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4024"));
sl@0
  5617
//Req 16 
sl@0
  5618
/**
sl@0
  5619
@SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4024
sl@0
  5620
@SYMTestCaseDesc Automated GDI testing for Tamil
sl@0
  5621
@SYMTestPriority High
sl@0
  5622
@SYMTestActions  Attempt to compose various valid Tamil glyph clusters to test 
sl@0
  5623
				Matra /-aa/ is combined to consonants in regular fashion. No extra shaping is required.
sl@0
  5624
@@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
sl@0
  5625
@SYMPREQ 1766: Tamil for Sphinx
sl@0
  5626
@SYMREQ 8742:Tamil Text Rendering
sl@0
  5627
*/
sl@0
  5628
sl@0
  5629
	testText[33] = 0x0B95; //Ka
sl@0
  5630
	testText[34] = 0x0B82; //Anusvara
sl@0
  5631
	
sl@0
  5632
	param.iPosInText = 33 ;
sl@0
  5633
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  5634
	
sl@0
  5635
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  5636
	
sl@0
  5637
	TEST(r && param.iPosInText == 35  
sl@0
  5638
		   && param.iOutputGlyphs == 2 
sl@0
  5639
		   && param.iOutput[0].iCode == 0x80000bf6 );
sl@0
  5640
sl@0
  5641
	#if defined __WINS__ || defined __WINSCW__
sl@0
  5642
	TEST(r && param.iPen.iX == 19);
sl@0
  5643
	#endif 
sl@0
  5644
	
sl@0
  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);
sl@0
  5646
	
sl@0
  5647
	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
sl@0
  5648
    	if (err!=KErrNone)
sl@0
  5649
    		INFO_PRINTF1(_L("Failed to record test result"));
sl@0
  5650
	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4025"));
sl@0
  5651
//Req 17 1.3.11
sl@0
  5652
/**
sl@0
  5653
@SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4025
sl@0
  5654
@SYMTestCaseDesc Automated GDI testing for Tamil
sl@0
  5655
@SYMTestPriority High
sl@0
  5656
@SYMTestActions  Attempt to compose various valid Tamil glyph clusters to test 
sl@0
  5657
					Matras /-i/ and /-ii/ MUST form a ligature with consonant /tta/.
sl@0
  5658
@@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
sl@0
  5659
@SYMPREQ 1766: Tamil for Sphinx
sl@0
  5660
@SYMREQ 8742:Tamil Text Rendering
sl@0
  5661
*/
sl@0
  5662
sl@0
  5663
	testText[35] = 0x0B9F; //Tta
sl@0
  5664
	testText[36] = 0x0BBF; //I
sl@0
  5665
	
sl@0
  5666
	testText[37] = 0x0B9F; //Tta
sl@0
  5667
	testText[38] = 0x0BC0; //Ii
sl@0
  5668
	
sl@0
  5669
	param.iPosInText = 35 ;
sl@0
  5670
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  5671
	
sl@0
  5672
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  5673
	
sl@0
  5674
	TEST(r && param.iPosInText ==  37 
sl@0
  5675
		   && param.iOutputGlyphs == 1
sl@0
  5676
		   && param.iOutput[0].iCode == 0x80000c51);
sl@0
  5677
sl@0
  5678
	#if defined __WINS__ || defined __WINSCW__
sl@0
  5679
	TEST(r && param.iPen.iX == 15);
sl@0
  5680
	#endif
sl@0
  5681
	
sl@0
  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);
sl@0
  5683
	
sl@0
  5684
	param.iPosInText = 37 ;
sl@0
  5685
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  5686
	
sl@0
  5687
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  5688
	
sl@0
  5689
	TEST(r && param.iPosInText ==  39
sl@0
  5690
		   && param.iOutputGlyphs == 1 
sl@0
  5691
		   && param.iOutput[0].iCode == 0x80000c52);
sl@0
  5692
	
sl@0
  5693
	#if defined __WINS__ || defined __WINSCW__
sl@0
  5694
	TEST(r && param.iPen.iX == 13);
sl@0
  5695
	#endif 
sl@0
  5696
	
sl@0
  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);
sl@0
  5698
	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
sl@0
  5699
    	if (err!=KErrNone)
sl@0
  5700
    		INFO_PRINTF1(_L("Failed to record test result"));
sl@0
  5701
	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4026"));
sl@0
  5702
//Req 18 	
sl@0
  5703
/**
sl@0
  5704
@SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4026
sl@0
  5705
@SYMTestCaseDesc Automated GDI testing for Tamil
sl@0
  5706
@SYMTestPriority High
sl@0
  5707
@SYMTestActions  Attempt to compose various valid Tamil glyph clusters to test 
sl@0
  5708
				Consonant /ra/ takes an alternate shape when combined with matras /-i/ and /-ii/.
sl@0
  5709
@@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
sl@0
  5710
@SYMPREQ 1766: Tamil for Sphinx
sl@0
  5711
@SYMREQ 8742:Tamil Text Rendering
sl@0
  5712
*/	
sl@0
  5713
	testText[39] = 0x0BB0; //Ra
sl@0
  5714
	testText[40] = 0x0BBF; //I
sl@0
  5715
	
sl@0
  5716
	testText[41] = 0x0BB0; //Ra
sl@0
  5717
	testText[42] = 0x0BC0; //Ii
sl@0
  5718
	
sl@0
  5719
	param.iPosInText = 39 ;
sl@0
  5720
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  5721
	
sl@0
  5722
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  5723
	
sl@0
  5724
	TEST(r && param.iPosInText == 41  
sl@0
  5725
		   && param.iOutputGlyphs == 2
sl@0
  5726
		   && param.iOutput[0].iCode == 0x80000c0d
sl@0
  5727
		   && param.iOutput[1].iCode == 0x80000c0e );
sl@0
  5728
sl@0
  5729
	#if defined __WINS__ || defined __WINSCW__
sl@0
  5730
	TEST(r && param.iPen.iX == 13);
sl@0
  5731
	#endif 
sl@0
  5732
	
sl@0
  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);
sl@0
  5734
	
sl@0
  5735
	param.iPosInText = 41 ;
sl@0
  5736
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  5737
	
sl@0
  5738
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  5739
	
sl@0
  5740
	TEST(r && param.iPosInText ==  43
sl@0
  5741
		   && param.iOutputGlyphs == 2
sl@0
  5742
		   && param.iOutput[0].iCode == 0x80000c0d 
sl@0
  5743
		   && param.iOutput[1].iCode == 0x80000c0f);
sl@0
  5744
	
sl@0
  5745
	#if defined __WINS__ || defined __WINSCW__
sl@0
  5746
	TEST(r && param.iPen.iX == 13);
sl@0
  5747
	#endif
sl@0
  5748
	
sl@0
  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);
sl@0
  5750
	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
sl@0
  5751
    	if (err!=KErrNone)
sl@0
  5752
    		INFO_PRINTF1(_L("Failed to record test result"));
sl@0
  5753
	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4027"));
sl@0
  5754
//Req 19 
sl@0
  5755
/**
sl@0
  5756
@SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4027
sl@0
  5757
@SYMTestCaseDesc Automated GDI testing for Tamil
sl@0
  5758
@SYMTestPriority High
sl@0
  5759
@SYMTestActions  Attempt to compose various valid Tamil glyph clusters to test the requirement
sl@0
  5760
				 Matras /-i/ and /-ii/ take an alternate form when applied to consonants /nga/, /pa/, /ya/ and /va/.
sl@0
  5761
@@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
sl@0
  5762
@SYMPREQ 1766: Tamil for Sphinx
sl@0
  5763
@SYMREQ 8742:Tamil Text Rendering
sl@0
  5764
*/
sl@0
  5765
	testText[43] = 0x0B99; //Nga
sl@0
  5766
	testText[44] = 0x0BBF; //I
sl@0
  5767
	
sl@0
  5768
	testText[45] = 0x0B99; //Nga
sl@0
  5769
	testText[46] = 0x0BC0; //Ii
sl@0
  5770
	
sl@0
  5771
	param.iPosInText = 43 ;
sl@0
  5772
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  5773
	
sl@0
  5774
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  5775
	
sl@0
  5776
	TEST(r && param.iPosInText ==  45 
sl@0
  5777
		   && param.iOutputGlyphs == 2
sl@0
  5778
		   && param.iOutput[0].iCode == 0x80000bf7
sl@0
  5779
		   && param.iOutput[1].iCode == 0x80000c0e );
sl@0
  5780
sl@0
  5781
	#if defined __WINS__ || defined __WINSCW__
sl@0
  5782
	TEST(r && param.iPen.iX == 19);
sl@0
  5783
	#endif
sl@0
  5784
	
sl@0
  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);
sl@0
  5786
	param.iPosInText = 45 ;
sl@0
  5787
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  5788
	
sl@0
  5789
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  5790
	
sl@0
  5791
	TEST(r && param.iPosInText ==  47
sl@0
  5792
		   && param.iOutputGlyphs == 1
sl@0
  5793
		   && param.iOutput[0].iCode == 0x80000c4a );
sl@0
  5794
sl@0
  5795
	#if defined __WINS__ || defined __WINSCW__
sl@0
  5796
	TEST(r && param.iPen.iX == 17);
sl@0
  5797
	#endif 
sl@0
  5798
	
sl@0
  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);
sl@0
  5800
	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
sl@0
  5801
    	if (err!=KErrNone)
sl@0
  5802
    		INFO_PRINTF1(_L("Failed to record test result"));
sl@0
  5803
	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4028"));
sl@0
  5804
	
sl@0
  5805
//Req 20 		
sl@0
  5806
/**
sl@0
  5807
@SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4028
sl@0
  5808
@SYMTestCaseDesc Automated GDI testing for Tamil
sl@0
  5809
@SYMTestPriority High
sl@0
  5810
@SYMTestActions  Attempt to compose various valid Tamil glyph clusters to test the requirement. 
sl@0
  5811
				 Matras /-u/ and /-uu/ join in ligature form with all other consonants than /ha/, /ja/, /sa/, /ssa/ and /k.ssa/.
sl@0
  5812
@@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
sl@0
  5813
@SYMPREQ 1766: Tamil for Sphinx
sl@0
  5814
@SYMREQ 8742:Tamil Text Rendering
sl@0
  5815
*/
sl@0
  5816
	testText[47] = 0x0B9C; //Ja
sl@0
  5817
	testText[48] = 0x0BC1; //U
sl@0
  5818
	
sl@0
  5819
	testText[49] = 0x0B9C; //Ja
sl@0
  5820
	testText[50] = 0x0BC2; //Uu
sl@0
  5821
	
sl@0
  5822
	param.iPosInText = 47 ;
sl@0
  5823
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  5824
	
sl@0
  5825
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  5826
	
sl@0
  5827
	TEST(r && param.iPosInText == 49  
sl@0
  5828
		   && param.iOutputGlyphs == 2 
sl@0
  5829
		   && param.iOutput[0].iCode == 0x80000bf9
sl@0
  5830
		   && param.iOutput[1].iCode == 0x80000c10);
sl@0
  5831
sl@0
  5832
	#if defined __WINS__ || defined __WINSCW__
sl@0
  5833
	TEST(r && param.iPen.iX == 26);
sl@0
  5834
	#endif
sl@0
  5835
	
sl@0
  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);
sl@0
  5837
	
sl@0
  5838
	param.iPosInText = 49;
sl@0
  5839
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  5840
	
sl@0
  5841
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  5842
	
sl@0
  5843
	TEST(r && param.iPosInText ==  51
sl@0
  5844
		   && param.iOutputGlyphs == 2
sl@0
  5845
		   && param.iOutput[0].iCode == 0x80000bf9
sl@0
  5846
		   && param.iOutput[1].iCode == 0x80000c11 );
sl@0
  5847
sl@0
  5848
	#if defined __WINS__ || defined __WINSCW__
sl@0
  5849
	TEST(r && param.iPen.iX == 29);
sl@0
  5850
	#endif
sl@0
  5851
	
sl@0
  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);
sl@0
  5853
	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
sl@0
  5854
    	if (err!=KErrNone)
sl@0
  5855
    		INFO_PRINTF1(_L("Failed to record test result"));
sl@0
  5856
	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4029"));
sl@0
  5857
//Req 21 1.3.15		
sl@0
  5858
/**
sl@0
  5859
@SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4029
sl@0
  5860
@SYMTestCaseDesc Automated GDI testing for Tamil
sl@0
  5861
@SYMTestPriority High
sl@0
  5862
@SYMTestActions  Attempt to compose various valid Tamil glyph clusters to test the requirement. 
sl@0
  5863
				 Matra /-ai/ is combined to consonants in regular fashion. No extra shaping is required. 
sl@0
  5864
@@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
sl@0
  5865
@SYMPREQ 1766: Tamil for Sphinx
sl@0
  5866
@SYMREQ 8742:Tamil Text Rendering
sl@0
  5867
*/
sl@0
  5868
	testText[51] = 0x0B95; //Ka
sl@0
  5869
	testText[52] = 0x0BC8; //Ai
sl@0
  5870
	
sl@0
  5871
	param.iPosInText = 51;
sl@0
  5872
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  5873
	
sl@0
  5874
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  5875
	
sl@0
  5876
	TEST(r && param.iPosInText == 53  		   
sl@0
  5877
		   && param.iOutputGlyphs == 2
sl@0
  5878
		   && param.iOutput[0].iCode == 0x80000c14
sl@0
  5879
		   && param.iOutput[1].iCode == 0x80000bf6);
sl@0
  5880
sl@0
  5881
	#if defined __WINS__ || defined __WINSCW__
sl@0
  5882
	TEST(r && param.iPen.iX == 31);
sl@0
  5883
	#endif
sl@0
  5884
	
sl@0
  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);
sl@0
  5886
	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
sl@0
  5887
    	if (err!=KErrNone)
sl@0
  5888
    		INFO_PRINTF1(_L("Failed to record test result"));
sl@0
  5889
	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4030"));
sl@0
  5890
//Req 22
sl@0
  5891
/**
sl@0
  5892
@SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4030
sl@0
  5893
@SYMTestCaseDesc Automated GDI testing for Tamil
sl@0
  5894
@SYMTestPriority High
sl@0
  5895
@SYMTestActions  Attempt to compose various valid Tamil glyph clusters to test the requirement
sl@0
  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
sl@0
  5897
@@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
sl@0
  5898
@SYMPREQ 1766: Tamil for Sphinx
sl@0
  5899
@SYMREQ 8742:Tamil Text Rendering
sl@0
  5900
*/
sl@0
  5901
	testText[53] = 0x0B95; //Ka
sl@0
  5902
	testText[54] = 0x0BCD; //Virama
sl@0
  5903
	testText[55] = 0x0BB7; //Ssa
sl@0
  5904
	
sl@0
  5905
	param.iPosInText =  53;
sl@0
  5906
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  5907
	
sl@0
  5908
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  5909
	
sl@0
  5910
	TEST(r && param.iPosInText == 56  
sl@0
  5911
		   && param.iOutputGlyphs == 1
sl@0
  5912
		   && param.iOutput[0].iCode == 0x80000c2f );
sl@0
  5913
sl@0
  5914
	#if defined __WINS__ || defined __WINSCW__
sl@0
  5915
	TEST(r && param.iPen.iX == 31);
sl@0
  5916
	#endif
sl@0
  5917
	
sl@0
  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);
sl@0
  5919
	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
sl@0
  5920
    	if (err!=KErrNone)
sl@0
  5921
    		INFO_PRINTF1(_L("Failed to record test result"));
sl@0
  5922
	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4031"));
sl@0
  5923
//Req 23 1.3.17
sl@0
  5924
/**
sl@0
  5925
@SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4031
sl@0
  5926
@SYMTestCaseDesc Automated GDI testing for Tamil
sl@0
  5927
@SYMTestPriority High
sl@0
  5928
@SYMTestActions  Attempt to compose various valid Tamil glyph clusters to test 
sl@0
  5929
				Character sequence <sa, virama, ra, matra_ii> MUST be rendered as a ligature form /s.rii/.
sl@0
  5930
@@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
sl@0
  5931
@SYMPREQ 1766: Tamil for Sphinx
sl@0
  5932
@SYMREQ 8742:Tamil Text Rendering
sl@0
  5933
*/
sl@0
  5934
	testText[56] = 0x0BB8; //Sa
sl@0
  5935
	testText[57] = 0x0BCD; //Virama
sl@0
  5936
	testText[58] = 0x0BB0; //Ra
sl@0
  5937
	testText[59] = 0x0BC0; //Matra I
sl@0
  5938
	
sl@0
  5939
	param.iPosInText = 56;
sl@0
  5940
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  5941
	
sl@0
  5942
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  5943
	
sl@0
  5944
	TEST(r && param.iPosInText == 60  
sl@0
  5945
		   && param.iOutputGlyphs == 1 
sl@0
  5946
		   && param.iOutput[0].iCode == 0x80000c79 );
sl@0
  5947
	
sl@0
  5948
	#if defined __WINS__ || defined __WINSCW__
sl@0
  5949
	TEST(r && param.iPen.iX == 27);
sl@0
  5950
	#endif
sl@0
  5951
	
sl@0
  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);
sl@0
  5953
	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
sl@0
  5954
    	if (err!=KErrNone)
sl@0
  5955
    		INFO_PRINTF1(_L("Failed to record test result"));
sl@0
  5956
	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4032"));
sl@0
  5957
//Req 24 1.3.18
sl@0
  5958
/**
sl@0
  5959
@SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4032
sl@0
  5960
@SYMTestCaseDesc Automated GDI testing for Tamil
sl@0
  5961
@SYMTestPriority High
sl@0
  5962
@SYMTestActions  Attempt to compose various valid Tamil glyph clusters to test 
sl@0
  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
sl@0
  5964
@@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
sl@0
  5965
@SYMPREQ 1766: Tamil for Sphinx
sl@0
  5966
@SYMREQ 8742:Tamil Text Rendering
sl@0
  5967
*/
sl@0
  5968
	testText[60] = 0x0B95; //Ka
sl@0
  5969
	testText[62] = 0x0BCD; //Virama
sl@0
  5970
	testText[63] = 0x8205; //ZWJ
sl@0
  5971
	
sl@0
  5972
	param.iPosInText = 60;
sl@0
  5973
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  5974
	
sl@0
  5975
	r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  5976
	
sl@0
  5977
	TEST(r && param.iPosInText == 61  
sl@0
  5978
		   && param.iOutputGlyphs == 1 
sl@0
  5979
		   && param.iOutput[0].iCode == 0x80000bf6 );
sl@0
  5980
	
sl@0
  5981
	#if defined __WINS__ || defined __WINSCW__
sl@0
  5982
	TEST(r && param.iPen.iX == 13);
sl@0
  5983
	#endif
sl@0
  5984
	
sl@0
  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);
sl@0
  5986
	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
sl@0
  5987
    	if (err!=KErrNone)
sl@0
  5988
    		INFO_PRINTF1(_L("Failed to record test result"));
sl@0
  5989
	}
sl@0
  5990
sl@0
  5991
/**
sl@0
  5992
@SYMTestCaseID			GRAPHICS-SYSLIB-GDI-CIT-3479
sl@0
  5993
@SYMTestCaseDesc		Automated GDI testing for correct localised punctuation after indic characters
sl@0
  5994
@SYMTestPriority		High
sl@0
  5995
@SYMTestActions			Attempt to compose various valid Indic strings with western punctuation
sl@0
  5996
@SYMTestExpectedResults The expected punctuation glyphs for the implied locale should be returned
sl@0
  5997
@SYMDEF					DEF106651
sl@0
  5998
*/
sl@0
  5999
void CTGlyphSelection::TestGlyphs(CFont* aFont, CFont::TPositionParam& aParam,
sl@0
  6000
	const TPtrC16& aText, const TPtrC16& aExpectedGlyphs)
sl@0
  6001
	{
sl@0
  6002
	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-3479"));
sl@0
  6003
	TUint16* glyphs = CONST_CAST(TUint16*,aExpectedGlyphs.Ptr());
sl@0
  6004
	const TInt mask = 0x80000000-1;
sl@0
  6005
	TBool r;
sl@0
  6006
	RShapeInfo shapeInfo;
sl@0
  6007
	aParam.iText.Set(aText); 
sl@0
  6008
	aParam.iPosInText = aParam.iPen.iX = aParam.iPen.iY = 0;
sl@0
  6009
	while(aParam.iPosInText < aParam.iText.Length())
sl@0
  6010
		{
sl@0
  6011
		r = aFont->GetCharacterPosition2(aParam,shapeInfo);
sl@0
  6012
		//INFO_PRINTF3(_L("Glyph %d Icode 0x%x"),*glyphs,aParam.iOutput[0].iCode);
sl@0
  6013
		TEST(r && ((aParam.iOutput[0].iCode & mask) == *glyphs++));
sl@0
  6014
		}
sl@0
  6015
	shapeInfo.Close();
sl@0
  6016
	TRAPD(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
sl@0
  6017
    	if (err!=KErrNone)
sl@0
  6018
    		INFO_PRINTF1(_L("Failed to record test result"));
sl@0
  6019
	}
sl@0
  6020
void CTGlyphSelection::TestTeluguChars(CFbsFont* aFont)
sl@0
  6021
	{
sl@0
  6022
INFO_PRINTF1(_L("Test Telugu Glyphs"));
sl@0
  6023
 
sl@0
  6024
  	TBool r;
sl@0
  6025
	TBuf<162> testText(0);
sl@0
  6026
	CFont::TPositionParam param;
sl@0
  6027
	param.iDirection = CFont::EHorizontal;
sl@0
  6028
	param.iFlags = CFont::TPositionParam::EFLogicalOrder;
sl@0
  6029
sl@0
  6030
	testText.SetLength(162);
sl@0
  6031
	// Make sure there is no garbage values in the memory we are using.
sl@0
  6032
	for (TInt i = 0; i < testText.Length(); i++)
sl@0
  6033
		testText[i]=0xFFFF;
sl@0
  6034
	
sl@0
  6035
	param.iText.Set(testText);
sl@0
  6036
	RShapeInfo shapeInfo;
sl@0
  6037
sl@0
  6038
	//Testdata for Telugu Langauage
sl@0
  6039
	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4033"));
sl@0
  6040
/*	
sl@0
  6041
@SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4033
sl@0
  6042
@SYMTestCaseDesc Automated GDI testing for Telugu
sl@0
  6043
@SYMTestPriority High
sl@0
  6044
@SYMTestActions  Attempt to compose various valid Telugu glyph clusters to test   	 
sl@0
  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.
sl@0
  6046
@@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
sl@0
  6047
@SYMPREQ 1766: Tamil for Sphinx
sl@0
  6048
@SYMREQ 8743:Tamil Text Rendering
sl@0
  6049
*/
sl@0
  6050
//	Req 4.1
sl@0
  6051
	
sl@0
  6052
		testText[0] =  0x0C15;
sl@0
  6053
		testText[1] =  0x0C4D;
sl@0
  6054
		param.iPosInText = 0 ;
sl@0
  6055
		param.iPen.iX = param.iPen.iY = 0;
sl@0
  6056
		r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  6057
		
sl@0
  6058
		TEST(r && param.iPosInText == 2  
sl@0
  6059
			   && param.iOutputGlyphs == 1
sl@0
  6060
			   && param.iOutput[0].iCode == 0x80000f49 );
sl@0
  6061
sl@0
  6062
		#if defined __WINS__ || defined __WINSCW__
sl@0
  6063
		TEST(r && param.iPen.iX == 9);
sl@0
  6064
		#endif
sl@0
  6065
		
sl@0
  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);
sl@0
  6067
		TRAPD(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
sl@0
  6068
    		if (err!=KErrNone)
sl@0
  6069
    			INFO_PRINTF1(_L("Failed to record test result"));
sl@0
  6070
		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4034"));
sl@0
  6071
/*	
sl@0
  6072
@SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4034
sl@0
  6073
@SYMTestCaseDesc Automated GDI testing for Telugu
sl@0
  6074
@SYMTestPriority High
sl@0
  6075
@SYMTestActions  Attempt to compose various valid Telugu glyph clusters to test   	 
sl@0
  6076
				?VIRAMA attaches the upward stroke at the right of the glyph.	
sl@0
  6077
@@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
sl@0
  6078
@SYMPREQ 1766: Tamil for Sphinx
sl@0
  6079
@SYMREQ 8743:Tamil Text Rendering
sl@0
  6080
*/		
sl@0
  6081
		testText[2] =  0x0C16;		
sl@0
  6082
		testText[3] =  0x0C4D;	
sl@0
  6083
		
sl@0
  6084
		param.iPosInText = 2 ;
sl@0
  6085
		
sl@0
  6086
		 param.iPen.iX = param.iPen.iY = 0;
sl@0
  6087
		
sl@0
  6088
		r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  6089
		
sl@0
  6090
		
sl@0
  6091
		TEST(r && param.iPosInText ==  4 
sl@0
  6092
			   && param.iOutputGlyphs == 1
sl@0
  6093
			   && param.iOutput[0].iCode == 0x80000f4a);
sl@0
  6094
sl@0
  6095
		#if defined __WINS__ || defined __WINSCW__
sl@0
  6096
		TEST(r && param.iPen.iX == 13);
sl@0
  6097
		#endif
sl@0
  6098
		
sl@0
  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);
sl@0
  6100
		TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
sl@0
  6101
    		if (err!=KErrNone)
sl@0
  6102
    			INFO_PRINTF1(_L("Failed to record test result"));
sl@0
  6103
		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4035"));
sl@0
  6104
/*	
sl@0
  6105
@SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4035
sl@0
  6106
@SYMTestCaseDesc Automated GDI testing for Telugu
sl@0
  6107
@SYMTestPriority High
sl@0
  6108
@SYMTestActions  Attempt to compose various valid Telugu glyph clusters to test   	 
sl@0
  6109
?VIRAMA is attached to a stroke at the upper right corner.
sl@0
  6110
@@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
sl@0
  6111
@SYMPREQ 1766: Tamil for Sphinx
sl@0
  6112
@SYMREQ 8743:Tamil Text Rendering
sl@0
  6113
*/
sl@0
  6114
		
sl@0
  6115
		testText[4] =  0x0C23;
sl@0
  6116
		testText[5] =  0x0C4D;
sl@0
  6117
		
sl@0
  6118
		param.iPosInText = 4 ;
sl@0
  6119
		param.iPen.iX = param.iPen.iY = 0;
sl@0
  6120
		r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  6121
		
sl@0
  6122
		TEST(r && param.iPosInText == 6  
sl@0
  6123
			   && param.iOutputGlyphs == 1 
sl@0
  6124
			   && param.iOutput[0].iCode == 0x80000f57 );
sl@0
  6125
sl@0
  6126
		#if defined __WINS__ || defined __WINSCW__
sl@0
  6127
		TEST(r && param.iPen.iX == 13);
sl@0
  6128
		#endif
sl@0
  6129
		
sl@0
  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);
sl@0
  6131
		TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
sl@0
  6132
    		if (err!=KErrNone)
sl@0
  6133
    			INFO_PRINTF1(_L("Failed to record test result"));
sl@0
  6134
		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4036"));
sl@0
  6135
/**
sl@0
  6136
@SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4036
sl@0
  6137
@SYMTestCaseDesc Automated GDI testing for Telugu
sl@0
  6138
@SYMTestPriority High
sl@0
  6139
@SYMTestActions  Attempt to compose various valid Telugu glyph clusters to test   	 
sl@0
  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.
sl@0
  6141
@@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
sl@0
  6142
@SYMPREQ 1766: Tamil for Sphinx
sl@0
  6143
@SYMREQ 8743:Tamil Text Rendering
sl@0
  6144
*/		
sl@0
  6145
	//Req 4.2
sl@0
  6146
		testText[6] =  0x0C2E;
sl@0
  6147
		testText[7] =  0x0C43;
sl@0
  6148
		
sl@0
  6149
		param.iPosInText = 6 ;
sl@0
  6150
		param.iPen.iX = param.iPen.iY = 0;
sl@0
  6151
		r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  6152
		
sl@0
  6153
		TEST(r && param.iPosInText ==  8 
sl@0
  6154
			   && param.iOutputGlyphs == 2 
sl@0
  6155
			   && param.iOutput[0].iCode == 0x80000f21
sl@0
  6156
			   && param.iOutput[1].iCode == 0x80000f31 );
sl@0
  6157
sl@0
  6158
		#if defined __WINS__ || defined __WINSCW__
sl@0
  6159
		TEST(r && param.iPen.iX == 24);
sl@0
  6160
		#endif
sl@0
  6161
		
sl@0
  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);
sl@0
  6163
		TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
sl@0
  6164
    		if (err!=KErrNone)
sl@0
  6165
    			INFO_PRINTF1(_L("Failed to record test result"));
sl@0
  6166
		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4037"));
sl@0
  6167
		/*	
sl@0
  6168
@SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4037
sl@0
  6169
@SYMTestCaseDesc Automated GDI testing for Telugu
sl@0
  6170
@SYMTestPriority High
sl@0
  6171
@SYMTestActions  Attempt to compose various valid Telugu glyph clusters to test   	 
sl@0
  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.
sl@0
  6173
@@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
sl@0
  6174
@SYMPREQ 1766: Tamil for Sphinx
sl@0
  6175
@SYMREQ 8743:Tamil Text Rendering
sl@0
  6176
*/	
sl@0
  6177
		testText[8] =  0x0C32;
sl@0
  6178
		
sl@0
  6179
		testText[9] =  0x0C44;
sl@0
  6180
		
sl@0
  6181
		param.iPosInText = 8 ;
sl@0
  6182
		param.iPen.iX = param.iPen.iY = 0;
sl@0
  6183
		
sl@0
  6184
		r = aFont->GetCharacterPosition2(param,shapeInfo);	
sl@0
  6185
		
sl@0
  6186
		TEST(r && param.iPosInText ==  10 
sl@0
  6187
			   && param.iOutputGlyphs == 2
sl@0
  6188
			   && param.iOutput[0].iCode == 0x80000f25
sl@0
  6189
			   && param.iOutput[1].iCode == 0x80000f32);
sl@0
  6190
sl@0
  6191
		#if defined __WINS__ || defined __WINSCW__
sl@0
  6192
		TEST(r && param.iPen.iX == 22);
sl@0
  6193
		#endif
sl@0
  6194
		
sl@0
  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);
sl@0
  6196
		TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
sl@0
  6197
    		if (err!=KErrNone)
sl@0
  6198
    			INFO_PRINTF1(_L("Failed to record test result"));
sl@0
  6199
		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4038"));
sl@0
  6200
		/*	
sl@0
  6201
@SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4038
sl@0
  6202
@SYMTestCaseDesc Automated GDI testing for Telugu
sl@0
  6203
@SYMTestPriority High
sl@0
  6204
@SYMTestActions  Attempt to compose various valid Telugu glyph clusters to test   	 
sl@0
  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.
sl@0
  6206
@@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
sl@0
  6207
@SYMPREQ 1766: Tamil for Sphinx
sl@0
  6208
@SYMREQ 8743:Tamil Text Rendering
sl@0
  6209
*/		
sl@0
  6210
	//Req 4.2.1
sl@0
  6211
		testText[10] = 0x0C15; 
sl@0
  6212
		testText[11] = 0x0C3E;
sl@0
  6213
		
sl@0
  6214
		param.iPosInText = 10 ;
sl@0
  6215
		param.iPen.iX = param.iPen.iY = 0;
sl@0
  6216
		r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  6217
		
sl@0
  6218
		TEST(r && param.iPosInText == 12  
sl@0
  6219
			   && param.iOutputGlyphs == 1
sl@0
  6220
			   && param.iOutput[0].iCode == 0x80000f6d );
sl@0
  6221
sl@0
  6222
		#if defined __WINS__ || defined __WINSCW__
sl@0
  6223
		TEST(r && param.iPen.iX == 13);
sl@0
  6224
		#endif
sl@0
  6225
		
sl@0
  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);
sl@0
  6227
		TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
sl@0
  6228
    		if (err!=KErrNone)
sl@0
  6229
    			INFO_PRINTF1(_L("Failed to record test result"));
sl@0
  6230
		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4039"));
sl@0
  6231
		/*	
sl@0
  6232
@SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4039
sl@0
  6233
@SYMTestCaseDesc Automated GDI testing for Telugu
sl@0
  6234
@SYMTestPriority High
sl@0
  6235
@SYMTestActions  Attempt to compose various valid Telugu glyph clusters to test   	 
sl@0
  6236
?MATRA AA attaches to the upwards left curving stroke
sl@0
  6237
@@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
sl@0
  6238
@SYMPREQ 1766: Tamil for Sphinx
sl@0
  6239
@SYMREQ 8743:Tamil Text Rendering
sl@0
  6240
*/	
sl@0
  6241
		testText[12] = 0x0C1F;
sl@0
  6242
		testText[13] = 0x0C3E;
sl@0
  6243
		param.iPosInText = 12 ;
sl@0
  6244
		param.iPen.iX = param.iPen.iY = 0;
sl@0
  6245
		r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  6246
		
sl@0
  6247
		TEST(r && param.iPosInText == 14  
sl@0
  6248
			   && param.iOutputGlyphs == 1
sl@0
  6249
			   && param.iOutput[0].iCode == 0x80000f77 );
sl@0
  6250
sl@0
  6251
		#if defined __WINS__ || defined __WINSCW__
sl@0
  6252
		TEST(r && param.iPen.iX == 16);
sl@0
  6253
		#endif
sl@0
  6254
		
sl@0
  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);
sl@0
  6256
		TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
sl@0
  6257
    		if (err!=KErrNone)
sl@0
  6258
    			INFO_PRINTF1(_L("Failed to record test result"));
sl@0
  6259
		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4040"));
sl@0
  6260
		/*	
sl@0
  6261
@SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4040
sl@0
  6262
@SYMTestCaseDesc Automated GDI testing for Telugu
sl@0
  6263
@SYMTestPriority High
sl@0
  6264
@SYMTestActions  Attempt to compose various valid Telugu glyph clusters to test   	 
sl@0
  6265
?MATRA AA attaches the upwards (left curving) stroke at the top of the glyph
sl@0
  6266
@@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
sl@0
  6267
@SYMPREQ 1766: Tamil for Sphinx
sl@0
  6268
@SYMREQ 8743:Tamil Text Rendering
sl@0
  6269
*/
sl@0
  6270
		testText[14] = 0x0C1C;
sl@0
  6271
		testText[15] = 0x0C3E;
sl@0
  6272
		
sl@0
  6273
		param.iPosInText = 14 ;
sl@0
  6274
		param.iPen.iX = param.iPen.iY = 0;
sl@0
  6275
		r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  6276
		
sl@0
  6277
		TEST(r && param.iPosInText == 16  
sl@0
  6278
			   && param.iOutputGlyphs == 1
sl@0
  6279
			   && param.iOutput[0].iCode == 0x80000f74 );
sl@0
  6280
	
sl@0
  6281
		#if defined __WINS__ || defined __WINSCW__
sl@0
  6282
		TEST(r && param.iPen.iX == 15);
sl@0
  6283
		#endif
sl@0
  6284
		
sl@0
  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);
sl@0
  6286
		TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
sl@0
  6287
    		if (err!=KErrNone)
sl@0
  6288
    			INFO_PRINTF1(_L("Failed to record test result"));
sl@0
  6289
		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4041"));
sl@0
  6290
		/*	
sl@0
  6291
@SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4041
sl@0
  6292
@SYMTestCaseDesc Automated GDI testing for Telugu
sl@0
  6293
@SYMTestPriority High
sl@0
  6294
@SYMTestActions  Attempt to compose various valid Telugu glyph clusters to test   	 
sl@0
  6295
?MATRA AA is drawn on top of the glyph
sl@0
  6296
@@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
sl@0
  6297
@SYMPREQ 1766: Tamil for Sphinx
sl@0
  6298
@SYMREQ 8743:Tamil Text Rendering
sl@0
  6299
*/	
sl@0
  6300
		testText[16] = 0x0C23;
sl@0
  6301
		testText[17] = 0x0C3E;
sl@0
  6302
		
sl@0
  6303
		param.iPosInText = 16 ;
sl@0
  6304
		param.iPen.iX = param.iPen.iY = 0;
sl@0
  6305
		r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  6306
		
sl@0
  6307
		TEST(r && param.iPosInText == 18  
sl@0
  6308
			   && param.iOutputGlyphs == 1
sl@0
  6309
			   && param.iOutput[0].iCode == 0x80000f7b );
sl@0
  6310
sl@0
  6311
		#if defined __WINS__ || defined __WINSCW__
sl@0
  6312
		TEST(r && param.iPen.iX == 16);
sl@0
  6313
		#endif
sl@0
  6314
		
sl@0
  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);
sl@0
  6316
		TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
sl@0
  6317
    		if (err!=KErrNone)
sl@0
  6318
    			INFO_PRINTF1(_L("Failed to record test result"));
sl@0
  6319
		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4042"));
sl@0
  6320
		/*	
sl@0
  6321
@SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4042
sl@0
  6322
@SYMTestCaseDesc Automated GDI testing for Telugu
sl@0
  6323
@SYMTestPriority High
sl@0
  6324
@SYMTestActions  Attempt to compose various valid Telugu glyph clusters to test   	 
sl@0
  6325
?MATRA AA attaches to the upwards left curving stroke, the vowel stem remains intact
sl@0
  6326
@@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
sl@0
  6327
@SYMPREQ 1766: Tamil for Sphinx
sl@0
  6328
@SYMREQ 8743:Tamil Text Rendering
sl@0
  6329
*/	
sl@0
  6330
		testText[18] = 0x0C2B;
sl@0
  6331
		testText[19] = 0x0C3E;
sl@0
  6332
		
sl@0
  6333
		param.iPosInText = 18 ;
sl@0
  6334
		param.iPen.iX = param.iPen.iY = 0;
sl@0
  6335
						
sl@0
  6336
		r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  6337
		
sl@0
  6338
		TEST(r && param.iPosInText == 20  
sl@0
  6339
			   && param.iOutputGlyphs == 1
sl@0
  6340
			   && param.iOutput[0].iCode == 0x80000f82 );
sl@0
  6341
sl@0
  6342
		#if defined __WINS__ || defined __WINSCW__
sl@0
  6343
		TEST(r && param.iPen.iX == 16);
sl@0
  6344
		#endif
sl@0
  6345
		
sl@0
  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);
sl@0
  6347
		TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
sl@0
  6348
    		if (err!=KErrNone)
sl@0
  6349
    			INFO_PRINTF1(_L("Failed to record test result"));
sl@0
  6350
		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4043"));
sl@0
  6351
		/*	
sl@0
  6352
@SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4043
sl@0
  6353
@SYMTestCaseDesc Automated GDI testing for Telugu
sl@0
  6354
@SYMTestPriority High
sl@0
  6355
@SYMTestActions  Attempt to compose various valid Telugu glyph clusters to test   	 
sl@0
  6356
?MATRA AA replaces the vowel stem, the upwards left curving stroke is extended
sl@0
  6357
@@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
sl@0
  6358
@SYMPREQ 1766: Tamil for Sphinx
sl@0
  6359
@SYMREQ 8743:Tamil Text Rendering
sl@0
  6360
*/	
sl@0
  6361
		testText[20] = 0x0C2A;
sl@0
  6362
		testText[21] = 0x0C3E;
sl@0
  6363
	
sl@0
  6364
		param.iPosInText = 20 ;
sl@0
  6365
		param.iPen.iX = param.iPen.iY = 0;
sl@0
  6366
		
sl@0
  6367
		r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  6368
sl@0
  6369
		TEST(r && param.iPosInText == 22   
sl@0
  6370
			   && param.iOutputGlyphs == 1
sl@0
  6371
			   && param.iOutput[0].iCode == 0x80000f81);
sl@0
  6372
sl@0
  6373
		#if defined __WINS__ || defined __WINSCW__
sl@0
  6374
		TEST(r && param.iPen.iX == 16);
sl@0
  6375
		#endif
sl@0
  6376
		
sl@0
  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);
sl@0
  6378
		TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
sl@0
  6379
    		if (err!=KErrNone)
sl@0
  6380
    			INFO_PRINTF1(_L("Failed to record test result"));
sl@0
  6381
		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4044"));
sl@0
  6382
	//Req 4.2.2
sl@0
  6383
	/*	
sl@0
  6384
@SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4044
sl@0
  6385
@SYMTestCaseDesc Automated GDI testing for Telugu
sl@0
  6386
@SYMTestPriority High
sl@0
  6387
@SYMTestActions  Attempt to compose various valid Telugu glyph clusters to test   	 
sl@0
  6388
?Vowel sign replaces the vowel stem
sl@0
  6389
@@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
sl@0
  6390
@SYMPREQ 1766: Tamil for Sphinx
sl@0
  6391
@SYMREQ 8743:Tamil Text Rendering
sl@0
  6392
*/
sl@0
  6393
		testText[22] = 0x0C26;
sl@0
  6394
		testText[23] = 0x0C3F;
sl@0
  6395
		
sl@0
  6396
		param.iPosInText = 22 ;
sl@0
  6397
		param.iPen.iX = param.iPen.iY = 0;
sl@0
  6398
		
sl@0
  6399
		r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  6400
		
sl@0
  6401
		TEST(r && param.iPosInText ==  24 
sl@0
  6402
			   && param.iOutputGlyphs == 1
sl@0
  6403
			   && param.iOutput[0].iCode == 0x80000fa2 );
sl@0
  6404
sl@0
  6405
		#if defined __WINS__ || defined __WINSCW__
sl@0
  6406
		TEST(r && param.iPen.iX == 11);
sl@0
  6407
		#endif
sl@0
  6408
			
sl@0
  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);
sl@0
  6410
		TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
sl@0
  6411
    		if (err!=KErrNone)
sl@0
  6412
    			INFO_PRINTF1(_L("Failed to record test result"));
sl@0
  6413
		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4045"));
sl@0
  6414
		/*	
sl@0
  6415
@SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4045
sl@0
  6416
@SYMTestCaseDesc Automated GDI testing for Telugu
sl@0
  6417
@SYMTestPriority High
sl@0
  6418
@SYMTestActions  Attempt to compose various valid Telugu glyph clusters to test   	 
sl@0
  6419
?The upwards left curving stroke extends, vowel sign attaches to the extended stroke
sl@0
  6420
@@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
sl@0
  6421
@SYMPREQ 1766: Tamil for Sphinx
sl@0
  6422
@SYMREQ 8743:Tamil Text Rendering
sl@0
  6423
*/
sl@0
  6424
		testText[24] = 0x0C16;
sl@0
  6425
		testText[25] = 0x0C3F;
sl@0
  6426
	
sl@0
  6427
		param.iPosInText = 24 ;
sl@0
  6428
		param.iPen.iX = param.iPen.iY = 0;
sl@0
  6429
		
sl@0
  6430
		r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  6431
		
sl@0
  6432
		TEST(r && param.iPosInText == 26  
sl@0
  6433
			   && param.iOutputGlyphs == 1
sl@0
  6434
			   && param.iOutput[0].iCode == 0x80000f92);
sl@0
  6435
sl@0
  6436
		#if defined __WINS__ || defined __WINSCW__
sl@0
  6437
		TEST(r && param.iPen.iX == 12);
sl@0
  6438
		#endif
sl@0
  6439
		
sl@0
  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);
sl@0
  6441
		TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
sl@0
  6442
    		if (err!=KErrNone)
sl@0
  6443
    			INFO_PRINTF1(_L("Failed to record test result"));
sl@0
  6444
		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4046"));
sl@0
  6445
		/*	
sl@0
  6446
@SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4046
sl@0
  6447
@SYMTestCaseDesc Automated GDI testing for Telugu
sl@0
  6448
@SYMTestPriority High
sl@0
  6449
@SYMTestActions  Attempt to compose various valid Telugu glyph clusters to test   	 
sl@0
  6450
?Vowel sign attaches the upward stroke at the top of the glyph
sl@0
  6451
@@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
sl@0
  6452
@SYMPREQ 1766: Tamil for Sphinx
sl@0
  6453
@SYMREQ 8743:Tamil Text Rendering
sl@0
  6454
*/	
sl@0
  6455
		testText[26] = 0x0C1C;
sl@0
  6456
		testText[27] = 0x0C3F;
sl@0
  6457
	
sl@0
  6458
		param.iPosInText = 26 ;
sl@0
  6459
		param.iPen.iX = param.iPen.iY = 0;
sl@0
  6460
		
sl@0
  6461
		r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  6462
		
sl@0
  6463
		TEST(r && param.iPosInText == 28  
sl@0
  6464
			   && param.iOutputGlyphs == 1
sl@0
  6465
			   && param.iOutput[0].iCode == 0x80000f98 );
sl@0
  6466
sl@0
  6467
		#if defined __WINS__ || defined __WINSCW__
sl@0
  6468
		TEST(r && param.iPen.iX == 12);
sl@0
  6469
		#endif
sl@0
  6470
		
sl@0
  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);
sl@0
  6472
		TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
sl@0
  6473
    		if (err!=KErrNone)
sl@0
  6474
    			INFO_PRINTF1(_L("Failed to record test result"));
sl@0
  6475
		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4047"));
sl@0
  6476
		/*	
sl@0
  6477
@SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4047
sl@0
  6478
@SYMTestCaseDesc Automated GDI testing for Telugu
sl@0
  6479
@SYMTestPriority High
sl@0
  6480
@SYMTestActions  Attempt to compose various valid Telugu glyph clusters to test   	 
sl@0
  6481
?Vowel sign attaches the upward stroke at the top of the glyph
sl@0
  6482
@@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
sl@0
  6483
@SYMPREQ 1766: Tamil for Sphinx
sl@0
  6484
@SYMREQ 8743:Tamil Text Rendering
sl@0
  6485
*/		
sl@0
  6486
		testText[28] = 0x0C1E;
sl@0
  6487
		testText[29] = 0x0C40;
sl@0
  6488
		
sl@0
  6489
		param.iPosInText = 28 ;
sl@0
  6490
		param.iPen.iX = param.iPen.iY = 0;
sl@0
  6491
				
sl@0
  6492
		r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  6493
		
sl@0
  6494
		TEST(r && param.iPosInText == 30  
sl@0
  6495
			   && param.iOutputGlyphs == 1
sl@0
  6496
			   && param.iOutput[0].iCode == 0x80000fbe );
sl@0
  6497
sl@0
  6498
		#if defined __WINS__ || defined __WINSCW__
sl@0
  6499
		TEST(r && param.iPen.iX == 14);
sl@0
  6500
		#endif
sl@0
  6501
		
sl@0
  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);
sl@0
  6503
		TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
sl@0
  6504
    		if (err!=KErrNone)
sl@0
  6505
    			INFO_PRINTF1(_L("Failed to record test result"));
sl@0
  6506
		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4048"));
sl@0
  6507
		/*	
sl@0
  6508
@SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4048
sl@0
  6509
@SYMTestCaseDesc Automated GDI testing for Telugu
sl@0
  6510
@SYMTestPriority High
sl@0
  6511
@SYMTestActions  Attempt to compose various valid Telugu glyph clusters to test   	 
sl@0
  6512
?Vowel sign attaches to the right upper corner of the glyph
sl@0
  6513
@@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
sl@0
  6514
@SYMPREQ 1766: Tamil for Sphinx
sl@0
  6515
@SYMREQ 8743:Tamil Text Rendering
sl@0
  6516
*/		
sl@0
  6517
		testText[30] = 0x0C1F;
sl@0
  6518
		testText[31] = 0x0C3F;
sl@0
  6519
	
sl@0
  6520
		param.iPosInText = 30;
sl@0
  6521
		param.iPen.iX = param.iPen.iY = 0;
sl@0
  6522
		
sl@0
  6523
		r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  6524
sl@0
  6525
		TEST(r && param.iPosInText == 32  
sl@0
  6526
			   && param.iOutputGlyphs == 1
sl@0
  6527
			   && param.iOutput[0].iCode ==  0x80000f9b );
sl@0
  6528
sl@0
  6529
		#if defined __WINS__ || defined __WINSCW__
sl@0
  6530
		TEST(r && param.iPen.iX == 12);
sl@0
  6531
		#endif
sl@0
  6532
		
sl@0
  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);
sl@0
  6534
		TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
sl@0
  6535
    		if (err!=KErrNone)
sl@0
  6536
    			INFO_PRINTF1(_L("Failed to record test result"));
sl@0
  6537
		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4049"));
sl@0
  6538
		/*	
sl@0
  6539
@SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4049
sl@0
  6540
@SYMTestCaseDesc Automated GDI testing for Telugu
sl@0
  6541
@SYMTestPriority High
sl@0
  6542
@SYMTestActions  Attempt to compose various valid Telugu glyph clusters to test   	 
sl@0
  6543
?Vowel sign takes a loop form that replaces the vowel stem
sl@0
  6544
@@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
sl@0
  6545
@SYMPREQ 1766: Tamil for Sphinx
sl@0
  6546
@SYMREQ 8743:Tamil Text Rendering
sl@0
  6547
*/		
sl@0
  6548
		testText[32] = 0x0C1D;
sl@0
  6549
		testText[33] = 0x0C3F;
sl@0
  6550
	
sl@0
  6551
		param.iPosInText = 32 ;
sl@0
  6552
		param.iPen.iX = param.iPen.iY = 0;
sl@0
  6553
		
sl@0
  6554
		r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  6555
		
sl@0
  6556
		TEST(r && param.iPosInText ==  34 
sl@0
  6557
			   && param.iOutputGlyphs == 1
sl@0
  6558
			   && param.iOutput[0].iCode ==  0x80000f99 );
sl@0
  6559
	
sl@0
  6560
		#if defined __WINS__ || defined __WINSCW__
sl@0
  6561
		TEST(r && param.iPen.iX == 19);
sl@0
  6562
		#endif
sl@0
  6563
		
sl@0
  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);
sl@0
  6565
		TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
sl@0
  6566
    		if (err!=KErrNone)
sl@0
  6567
    			INFO_PRINTF1(_L("Failed to record test result"));
sl@0
  6568
		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4050"));
sl@0
  6569
		/*	
sl@0
  6570
@SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4050
sl@0
  6571
@SYMTestCaseDesc Automated GDI testing for Telugu
sl@0
  6572
@SYMTestPriority High
sl@0
  6573
@SYMTestActions  Attempt to compose various valid Telugu glyph clusters to test   	 
sl@0
  6574
?The upwards left curving stroke extends, vowel sign replaces the vowel stem at the tip of the extended stroke 
sl@0
  6575
@@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
sl@0
  6576
@SYMPREQ 1766: Tamil for Sphinx
sl@0
  6577
@SYMREQ 8743:Tamil Text Rendering
sl@0
  6578
*/	
sl@0
  6579
		testText[34] = 0x0C1B;
sl@0
  6580
		testText[35] = 0x0C3F;
sl@0
  6581
	
sl@0
  6582
	 	param.iPosInText =34 ;
sl@0
  6583
		param.iPen.iX = param.iPen.iY = 0;
sl@0
  6584
		
sl@0
  6585
		r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  6586
		
sl@0
  6587
		TEST(r && param.iPosInText == 36 
sl@0
  6588
			   && param.iOutputGlyphs == 1
sl@0
  6589
			   && param.iOutput[0].iCode == 0x80000f97 );
sl@0
  6590
sl@0
  6591
		#if defined __WINS__ || defined __WINSCW__
sl@0
  6592
		TEST(r && param.iPen.iX == 12);
sl@0
  6593
		#endif
sl@0
  6594
		
sl@0
  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);
sl@0
  6596
		TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
sl@0
  6597
    		if (err!=KErrNone)
sl@0
  6598
    			INFO_PRINTF1(_L("Failed to record test result"));
sl@0
  6599
		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4051"));
sl@0
  6600
		/*	
sl@0
  6601
@SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4051
sl@0
  6602
@SYMTestCaseDesc Automated GDI testing for Telugu
sl@0
  6603
@SYMTestPriority High
sl@0
  6604
@SYMTestActions  Attempt to compose various valid Telugu glyph clusters to test   	 
sl@0
  6605
?Vowel sign replaces the upwards curving stroke at the top of the glyph
sl@0
  6606
@@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
sl@0
  6607
@SYMPREQ 1766: Tamil for Sphinx
sl@0
  6608
@SYMREQ 8743:Tamil Text Rendering
sl@0
  6609
*/		
sl@0
  6610
		testText[36] = 0x0C1C;
sl@0
  6611
		testText[37] = 0x0C3F;
sl@0
  6612
	
sl@0
  6613
		param.iPosInText = 36 ;
sl@0
  6614
		param.iPen.iX = param.iPen.iY = 0;
sl@0
  6615
					
sl@0
  6616
		r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  6617
		
sl@0
  6618
		TEST(r && param.iPosInText == 38  
sl@0
  6619
			   && param.iOutputGlyphs == 1
sl@0
  6620
			   && param.iOutput[0].iCode == 0x80000f98 );
sl@0
  6621
		
sl@0
  6622
		#if defined __WINS__ || defined __WINSCW__
sl@0
  6623
		TEST(r && param.iPen.iX == 12);
sl@0
  6624
		#endif
sl@0
  6625
		
sl@0
  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);
sl@0
  6627
		TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
sl@0
  6628
    		if (err!=KErrNone)
sl@0
  6629
    			INFO_PRINTF1(_L("Failed to record test result"));
sl@0
  6630
		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4052"));
sl@0
  6631
		/*	
sl@0
  6632
@SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4052
sl@0
  6633
@SYMTestCaseDesc Automated GDI testing for Telugu
sl@0
  6634
@SYMTestPriority High
sl@0
  6635
@SYMTestActions  Attempt to compose various valid Telugu glyph clusters to test   	 
sl@0
  6636
?Vowel stem is removed.
sl@0
  6637
?Vowel stem is removed and MATRA II takes a form that looks like MATRA AA
sl@0
  6638
@@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
sl@0
  6639
@SYMPREQ 1766: Tamil for Sphinx
sl@0
  6640
@SYMREQ 8743:Tamil Text Rendering
sl@0
  6641
*/		
sl@0
  6642
		testText[38] = 0x0C2F;
sl@0
  6643
		testText[39] = 0x0C3F;
sl@0
  6644
	
sl@0
  6645
		param.iPosInText = 38 ;
sl@0
  6646
		param.iPen.iX = param.iPen.iY = 0;
sl@0
  6647
		
sl@0
  6648
		r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  6649
		
sl@0
  6650
		TEST(r && param.iPosInText == 40 
sl@0
  6651
			   && param.iOutputGlyphs == 1
sl@0
  6652
			   && param.iOutput[0].iCode == 0x80000faa );
sl@0
  6653
sl@0
  6654
		#if defined __WINS__ || defined __WINSCW__
sl@0
  6655
		TEST(r && param.iPen.iX == 19);
sl@0
  6656
		#endif
sl@0
  6657
		
sl@0
  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);
sl@0
  6659
		TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
sl@0
  6660
    		if (err!=KErrNone)
sl@0
  6661
    			INFO_PRINTF1(_L("Failed to record test result"));
sl@0
  6662
		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4053"));
sl@0
  6663
		/*	
sl@0
  6664
@SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4053
sl@0
  6665
@SYMTestCaseDesc Automated GDI testing for Telugu
sl@0
  6666
@SYMTestPriority High
sl@0
  6667
@SYMTestActions  Attempt to compose various valid Telugu glyph clusters to test   	 
sl@0
  6668
?Vowel sign attaches to the right of the consonant glyph, vowel stem remains intact
sl@0
  6669
@@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
sl@0
  6670
@SYMPREQ 1766: Tamil for Sphinx
sl@0
  6671
@SYMREQ 8743:Tamil Text Rendering
sl@0
  6672
*/	
sl@0
  6673
		testText[40] = 0x0C15;
sl@0
  6674
		testText[41] = 0x0C41;
sl@0
  6675
	
sl@0
  6676
		param.iPosInText = 40 ;
sl@0
  6677
		param.iPen.iX = param.iPen.iY = 0;
sl@0
  6678
		r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  6679
		
sl@0
  6680
		TEST(r && param.iPosInText ==42   
sl@0
  6681
			   && param.iOutputGlyphs == 1
sl@0
  6682
			   && param.iOutput[0].iCode == 0x80000fd9 );
sl@0
  6683
		
sl@0
  6684
		#if defined __WINS__ || defined __WINSCW__
sl@0
  6685
		TEST(r && param.iPen.iX == 14);
sl@0
  6686
		#endif
sl@0
  6687
		
sl@0
  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);
sl@0
  6689
		TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
sl@0
  6690
    		if (err!=KErrNone)
sl@0
  6691
    			INFO_PRINTF1(_L("Failed to record test result"));
sl@0
  6692
		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4054"));
sl@0
  6693
		/*	
sl@0
  6694
@SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4054
sl@0
  6695
@SYMTestCaseDesc Automated GDI testing for Telugu
sl@0
  6696
@SYMTestPriority High
sl@0
  6697
@SYMTestActions  Attempt to compose various valid Telugu glyph clusters to test   	 
sl@0
  6698
?Vowel sign takes a miniature form which attaches to the stroke at the top of the consonant glyph
sl@0
  6699
@@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
sl@0
  6700
@SYMPREQ 1766: Tamil for Sphinx
sl@0
  6701
@SYMREQ 8743:Tamil Text Rendering
sl@0
  6702
*/	
sl@0
  6703
		testText[42] = 0x0C19;
sl@0
  6704
		testText[43] = 0x0C41;
sl@0
  6705
	
sl@0
  6706
		param.iPosInText = 42 ;
sl@0
  6707
		param.iPen.iX = param.iPen.iY = 0;
sl@0
  6708
						
sl@0
  6709
		r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  6710
		
sl@0
  6711
		TEST(r && param.iPosInText ==  44 
sl@0
  6712
			   && param.iOutputGlyphs == 1
sl@0
  6713
			   && param.iOutput[0].iCode == 0x80000fda );
sl@0
  6714
		
sl@0
  6715
		#if defined __WINS__ || defined __WINSCW__
sl@0
  6716
		TEST(r && param.iPen.iX == 15);
sl@0
  6717
		#endif
sl@0
  6718
		
sl@0
  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);
sl@0
  6720
		TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
sl@0
  6721
    		if (err!=KErrNone)
sl@0
  6722
    			INFO_PRINTF1(_L("Failed to record test result"));
sl@0
  6723
		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4055"));
sl@0
  6724
		/*	
sl@0
  6725
@SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4055
sl@0
  6726
@SYMTestCaseDesc Automated GDI testing for Telugu
sl@0
  6727
@SYMTestPriority High
sl@0
  6728
@SYMTestActions  Attempt to compose various valid Telugu glyph clusters to test   	 
sl@0
  6729
?Vowel sign attaches the consonant sign from below. Vowel stem remains intact.
sl@0
  6730
@@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
sl@0
  6731
@SYMPREQ 1766: Tamil for Sphinx
sl@0
  6732
@SYMREQ 8743:Tamil Text Rendering
sl@0
  6733
*/	
sl@0
  6734
		testText[44] = 0x0C2E;
sl@0
  6735
		testText[45] = 0x0C41;
sl@0
  6736
	
sl@0
  6737
		param.iPosInText = 44 ;
sl@0
  6738
		param.iPen.iX = param.iPen.iY = 0;
sl@0
  6739
		r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  6740
		
sl@0
  6741
		TEST(r && param.iPosInText == 46   
sl@0
  6742
			   && param.iOutputGlyphs == 2
sl@0
  6743
			   && param.iOutput[0].iCode == 0x80000f21 );
sl@0
  6744
sl@0
  6745
		#if defined __WINS__ || defined __WINSCW__
sl@0
  6746
		TEST(r && param.iPen.iX == 21);
sl@0
  6747
		#endif
sl@0
  6748
		
sl@0
  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);
sl@0
  6750
		
sl@0
  6751
		testText[46] = 0x0C36;
sl@0
  6752
		testText[47] = 0x0C41;
sl@0
  6753
	
sl@0
  6754
		param.iPosInText = 46 ;
sl@0
  6755
		param.iPen.iX = param.iPen.iY = 0;
sl@0
  6756
		r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  6757
		
sl@0
  6758
		TEST(r && param.iPosInText == 48   
sl@0
  6759
			   && param.iOutputGlyphs == 2 
sl@0
  6760
			   && param.iOutput[0].iCode == 0x80000f28 );
sl@0
  6761
sl@0
  6762
		#if defined __WINS__ || defined __WINSCW__
sl@0
  6763
		TEST(r && param.iPen.iX == 14);
sl@0
  6764
		#endif
sl@0
  6765
			
sl@0
  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);
sl@0
  6767
		TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
sl@0
  6768
    		if (err!=KErrNone)
sl@0
  6769
    			INFO_PRINTF1(_L("Failed to record test result"));
sl@0
  6770
		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4056"));
sl@0
  6771
		/*	
sl@0
  6772
@SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4056
sl@0
  6773
@SYMTestCaseDesc Automated GDI testing for Telugu
sl@0
  6774
@SYMTestPriority High
sl@0
  6775
@SYMTestActions  Attempt to compose various valid Telugu glyph clusters to test   	 
sl@0
  6776
?Vowel sign replaces the vowel stem
sl@0
  6777
@@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
sl@0
  6778
@SYMPREQ 1766: Tamil for Sphinx
sl@0
  6779
@SYMREQ 8743:Tamil Text Rendering
sl@0
  6780
*/		
sl@0
  6781
//	Req 4.2.4
sl@0
  6782
		testText[48] = 0x0C28;
sl@0
  6783
		testText[49] = 0x0C46;
sl@0
  6784
	
sl@0
  6785
		param.iPosInText = 48 ;
sl@0
  6786
		param.iPen.iX = param.iPen.iY = 0;
sl@0
  6787
		r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  6788
		
sl@0
  6789
		TEST(r && param.iPosInText == 50   
sl@0
  6790
			   && param.iOutputGlyphs == 1
sl@0
  6791
			   && param.iOutput[0].iCode == 0x80001000 );
sl@0
  6792
sl@0
  6793
		#if defined __WINS__ || defined __WINSCW__
sl@0
  6794
		TEST(r && param.iPen.iX == 11);
sl@0
  6795
		#endif
sl@0
  6796
		
sl@0
  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);
sl@0
  6798
		TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
sl@0
  6799
    		if (err!=KErrNone)
sl@0
  6800
    			INFO_PRINTF1(_L("Failed to record test result"));
sl@0
  6801
		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4057"));
sl@0
  6802
		/*	
sl@0
  6803
@SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4057
sl@0
  6804
@SYMTestCaseDesc Automated GDI testing for Telugu
sl@0
  6805
@SYMTestPriority High
sl@0
  6806
@SYMTestActions  Attempt to compose various valid Telugu glyph clusters to test   	 
sl@0
  6807
?Vowel sign replaces the vowel stem
sl@0
  6808
@@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
sl@0
  6809
@SYMPREQ 1766: Tamil for Sphinx
sl@0
  6810
@SYMREQ 8743:Tamil Text Rendering
sl@0
  6811
*/		
sl@0
  6812
		testText[50] = 0x0C1B;
sl@0
  6813
		testText[51] = 0x0C47;
sl@0
  6814
		
sl@0
  6815
		param.iPosInText = 50 ;
sl@0
  6816
		param.iPen.iX = param.iPen.iY = 0;
sl@0
  6817
		r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  6818
		
sl@0
  6819
		TEST(r && param.iPosInText ==  52 
sl@0
  6820
			   && param.iOutputGlyphs == 1
sl@0
  6821
			   && param.iOutput[0].iCode == 0x80001017 );
sl@0
  6822
sl@0
  6823
		#if defined __WINS__ || defined __WINSCW__
sl@0
  6824
		TEST(r && param.iPen.iX == 12);
sl@0
  6825
		#endif
sl@0
  6826
		
sl@0
  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);
sl@0
  6828
		TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
sl@0
  6829
    		if (err!=KErrNone)
sl@0
  6830
    			INFO_PRINTF1(_L("Failed to record test result"));
sl@0
  6831
		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4058"));
sl@0
  6832
		/*	
sl@0
  6833
@SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4058
sl@0
  6834
@SYMTestCaseDesc Automated GDI testing for Telugu
sl@0
  6835
@SYMTestPriority High
sl@0
  6836
@SYMTestActions  Attempt to compose various valid Telugu glyph clusters to test   	 
sl@0
  6837
?Vowel sign replaces the vowel stem
sl@0
  6838
@@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
sl@0
  6839
@SYMPREQ 1766: Tamil for Sphinx
sl@0
  6840
@SYMREQ 8743:Tamil Text Rendering
sl@0
  6841
*/		
sl@0
  6842
		testText[52] = 0x0C1D;	
sl@0
  6843
		testText[53] = 0x0C48;
sl@0
  6844
		
sl@0
  6845
		param.iPosInText = 52 ;
sl@0
  6846
		param.iPen.iX = param.iPen.iY = 0;
sl@0
  6847
		r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  6848
		
sl@0
  6849
		TEST(r && param.iPosInText ==  54 
sl@0
  6850
			   && param.iOutputGlyphs == 2
sl@0
  6851
			   && param.iOutput[0].iCode == 0x80000ff5
sl@0
  6852
			   && param.iOutput[1].iCode == 0x80000f3b );
sl@0
  6853
sl@0
  6854
		#if defined __WINS__ || defined __WINSCW__
sl@0
  6855
		TEST(r && param.iPen.iX == 19);
sl@0
  6856
		#endif
sl@0
  6857
		
sl@0
  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);
sl@0
  6859
		TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
sl@0
  6860
    		if (err!=KErrNone)
sl@0
  6861
    			INFO_PRINTF1(_L("Failed to record test result"));
sl@0
  6862
		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4059"));	
sl@0
  6863
		/*	
sl@0
  6864
@SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4059
sl@0
  6865
@SYMTestCaseDesc Automated GDI testing for Telugu
sl@0
  6866
@SYMTestPriority High
sl@0
  6867
@SYMTestActions  Attempt to compose various valid Telugu glyph clusters to test   	 
sl@0
  6868
?Vowel sign replaces the vowel stem.
sl@0
  6869
@@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
sl@0
  6870
@SYMPREQ 1766: Tamil for Sphinx
sl@0
  6871
@SYMREQ 8743:Tamil Text Rendering
sl@0
  6872
*/	
sl@0
  6873
	// Req 4.2.5
sl@0
  6874
		testText[54] = 0x0C15;
sl@0
  6875
		testText[55] = 0x0C4A;
sl@0
  6876
		
sl@0
  6877
		param.iPosInText = 54 ;
sl@0
  6878
		param.iPen.iX = param.iPen.iY = 0;
sl@0
  6879
		
sl@0
  6880
		r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  6881
		
sl@0
  6882
		TEST(r && param.iPosInText ==  56 
sl@0
  6883
			   && param.iOutputGlyphs == 1
sl@0
  6884
			   && param.iOutput[0].iCode == 0x80001059 );
sl@0
  6885
sl@0
  6886
		#if defined __WINS__ || defined __WINSCW__
sl@0
  6887
		TEST(r && param.iPen.iX == 13);
sl@0
  6888
		#endif
sl@0
  6889
		
sl@0
  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);
sl@0
  6891
		TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
sl@0
  6892
    		if (err!=KErrNone)
sl@0
  6893
    			INFO_PRINTF1(_L("Failed to record test result"));
sl@0
  6894
		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4060"));
sl@0
  6895
		/*	
sl@0
  6896
@SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4060
sl@0
  6897
@SYMTestCaseDesc Automated GDI testing for Telugu
sl@0
  6898
@SYMTestPriority High
sl@0
  6899
@SYMTestActions  Attempt to compose various valid Telugu glyph clusters to test   	 
sl@0
  6900
?Vowel sign replaces the vowel stem.
sl@0
  6901
@@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
sl@0
  6902
@SYMPREQ 1766: Tamil for Sphinx
sl@0
  6903
@SYMREQ 8743:Tamil Text Rendering
sl@0
  6904
*/	
sl@0
  6905
	
sl@0
  6906
		testText[56] = 0x0C21;
sl@0
  6907
		testText[57] = 0x0C4B;
sl@0
  6908
		
sl@0
  6909
		param.iPosInText = 56 ;
sl@0
  6910
		param.iPen.iX = param.iPen.iY = 0;
sl@0
  6911
		
sl@0
  6912
		r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  6913
		
sl@0
  6914
		TEST(r && param.iPosInText ==  58 
sl@0
  6915
			   && param.iOutputGlyphs == 1 
sl@0
  6916
			   && param.iOutput[0].iCode == 0x80001089 );
sl@0
  6917
sl@0
  6918
		#if defined __WINS__ || defined __WINSCW__
sl@0
  6919
		TEST(r && param.iPen.iX == 14);
sl@0
  6920
		#endif
sl@0
  6921
		
sl@0
  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);
sl@0
  6923
		TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
sl@0
  6924
    		if (err!=KErrNone)
sl@0
  6925
    			INFO_PRINTF1(_L("Failed to record test result"));
sl@0
  6926
		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4061"));
sl@0
  6927
		/*	
sl@0
  6928
@SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4061
sl@0
  6929
@SYMTestCaseDesc Automated GDI testing for Telugu
sl@0
  6930
@SYMTestPriority High
sl@0
  6931
@SYMTestActions  Attempt to compose various valid Telugu glyph clusters to test   	 
sl@0
  6932
?Vowel sign replaces the vowel stem.
sl@0
  6933
@@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
sl@0
  6934
@SYMPREQ 1766: Tamil for Sphinx
sl@0
  6935
@SYMREQ 8743:Tamil Text Rendering
sl@0
  6936
*/	
sl@0
  6937
		testText[58] = 0x0C26;
sl@0
  6938
		testText[59] = 0x0C4C;
sl@0
  6939
		
sl@0
  6940
		param.iPosInText = 58 ;
sl@0
  6941
		param.iPen.iX = param.iPen.iY = 0;
sl@0
  6942
		
sl@0
  6943
		r = aFont->GetCharacterPosition2(param,shapeInfo);
sl@0
  6944
		
sl@0
  6945
		TEST(r && param.iPosInText == 60   
sl@0
  6946
			   && param.iOutputGlyphs == 1
sl@0
  6947
			   && param.iOutput[0].iCode == 0x800010b2 );
sl@0
  6948
	
sl@0
  6949
		#if defined __WINS__ || defined __WINSCW__
sl@0
  6950
		TEST(r && param.iPen.iX == 14);
sl@0
  6951
		#endif
sl@0
  6952
		
sl@0
  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);
sl@0
  6954
	}
sl@0
  6955
	
sl@0
  6956
void CTGlyphSelection::TestIndicPunctuation(CFbsFont* aFont)
sl@0
  6957
	{
sl@0
  6958
	INFO_PRINTF1(_L("Test Indic Punctuation"));
sl@0
  6959
sl@0
  6960
	CFont::TPositionParam param;
sl@0
  6961
	param.iDirection = CFont::EHorizontal;
sl@0
  6962
	param.iFlags = CFont::TPositionParam::EFLogicalOrder;
sl@0
  6963
	
sl@0
  6964
	//INFO_PRINTF1(_L("// punctuation string after Kannada text"));
sl@0
  6965
	TestGlyphs(aFont,param,_L("\xC95!?#@"),_L("\x7A8\x920\x93C\x922\x23"));
sl@0
  6966
	//INFO_PRINTF1(_L("// punctuation string before Kannada text"));
sl@0
  6967
	TestGlyphs(aFont,param,_L("!?#@\xC95"),_L("\x21\x3F\x23\x40\x7A8"));
sl@0
  6968
	//INFO_PRINTF1(_L("// punctuation string before and after Kannada text"));
sl@0
  6969
	TestGlyphs(aFont,param,_L("  \"\xC95\"  "),_L("\x20\x20\x22\x7A8\x22\x20\x20"));
sl@0
  6970
	//INFO_PRINTF1(_L("// punctuation before and after latin text followed by punctuation before and after kannada text"));
sl@0
  6971
	TestGlyphs(aFont,param,_L("\x201c\x041\x201D (\xc95)"),_L("\x201c\x41\x201d\x20\x28\x7a8\x29"));
sl@0
  6972
	//INFO_PRINTF1(_L("// mixed kannada/ latin with punctuation surrounded by whitespace inbetween"));
sl@0
  6973
	TestGlyphs(aFont,param,_L("\xc95 , \x041"),_L("\x7a8\x20\x929\x20\x41"));
sl@0
  6974
	//INFO_PRINTF1(_L("// mixed kannada/ latin with punctuation surrounded by whitespace inbetween (reversed)"));
sl@0
  6975
	TestGlyphs(aFont,param,_L("\x041 , \xc95"),_L("\x41\x20\x2C\x20\x7a8"));
sl@0
  6976
	//INFO_PRINTF1(_L("// mixed kannada/ latin with punctuation next to latin"));
sl@0
  6977
	TestGlyphs(aFont,param,_L("\x041, \xc95"),_L("\x41\x2C\x20\x7a8"));
sl@0
  6978
	//INFO_PRINTF1(_L("// mixed kannada/ latin with punctuation next to kannada"));
sl@0
  6979
	TestGlyphs(aFont,param,_L("\x041 ,\xc95"),_L("\x41\x20\x2C\x7a8"));
sl@0
  6980
	//INFO_PRINTF1(_L("// mixed kannada/ latin with punctuation next to latin and seperating tab"));
sl@0
  6981
	TestGlyphs(aFont,param,_L("\x041,\t\xc95"),_L("\x41\x2C\x9\x7a8"));
sl@0
  6982
	//INFO_PRINTF1(_L("// mixed kannada/ latin with punctuation next to kannada and seperating tab"));
sl@0
  6983
	TestGlyphs(aFont,param,_L("\x041\t,\xc95"),_L("\x41\x9\x2C\x7a8"));
sl@0
  6984
	//INFO_PRINTF1(_L("// devanagari digits with colons"));
sl@0
  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"),
sl@0
  6986
										_L("\x582\x77e\x583\x77e\x584\x77e\x585\x77e\x586\x77e\x587\x77e\x588\x77e\x589\x77e\x58a\x77e\x58b\x77e"));
sl@0
  6987
	//INFO_PRINTF1(_L("// string of only punctuation"));
sl@0
  6988
	TestGlyphs(aFont,param,_L("\x002D\x002D\x002D\x002D\x002D\x002D"),_L("\x002D\x002D\x002D\x002D\x002D\x002D"));
sl@0
  6989
	//INFO_PRINTF1(_L("// one Kannada character followed my multiple punctuation and non-punctuaion"));
sl@0
  6990
	TestGlyphs(aFont,param,_L("\x0C95!\x0022\x00A3$%^&*()-={}[]:@~;'#<>?,./"),
sl@0
  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"));
sl@0
  6992
	}
sl@0
  6993
	
sl@0
  6994
sl@0
  6995
sl@0
  6996
void CTGlyphSelection::TestIndicCharsL()
sl@0
  6997
	{
sl@0
  6998
	// create a font store for testing
sl@0
  6999
	CFontStore* fontStore = CFontStore::NewL(&User::Heap());
sl@0
  7000
	
sl@0
  7001
	//load all ecom implemented rasterizer dlls. installs the rasterizer.	
sl@0
  7002
	LoadOpenFontLibraries(fontStore);
sl@0
  7003
		// test font preparation
sl@0
  7004
	fontStore->iKPixelWidthInTwips = 11860; //This value is default
sl@0
  7005
sl@0
  7006
	//add any required font files
sl@0
  7007
	TUid err = fontStore->AddFileL(KTestHindiFontFile);
sl@0
  7008
sl@0
  7009
	TFontSpec testHindiFontSpec(KTestHindiFontFaceName,200); 
sl@0
  7010
	
sl@0
  7011
	TUid err1 = fontStore->AddFileL(KTestIndicFontFile);
sl@0
  7012
sl@0
  7013
	TFontSpec testIndicFontSpec(KTestIndicFontFaceName,200);
sl@0
  7014
	 
sl@0
  7015
	CFbsBitmap* bmp = new(ELeave) CFbsBitmap;
sl@0
  7016
	
sl@0
  7017
	TInt ret = bmp->Create(TSize(100,100),EGray2);
sl@0
  7018
	if (ret == KErrNotSupported)
sl@0
  7019
		return;
sl@0
  7020
	else
sl@0
  7021
		User::LeaveIfError(ret);
sl@0
  7022
sl@0
  7023
	CFbsBitmapDevice* device = NULL;
sl@0
  7024
	TRAPD(err2,device = CFbsBitmapDevice::NewL(bmp));
sl@0
  7025
	TEST(err2 == KErrNone);
sl@0
  7026
sl@0
  7027
	CFbsBitGc* gc = NULL;
sl@0
  7028
	User::LeaveIfError(device->CreateContext(gc));
sl@0
  7029
	// Font file Creation
sl@0
  7030
	CFbsFont* hindiFont = NULL;
sl@0
  7031
	User::LeaveIfError(device->GetNearestFontToDesignHeightInTwips(hindiFont,testHindiFontSpec));
sl@0
  7032
	gc->UseFont(hindiFont);
sl@0
  7033
	CleanupStack::PushL(hindiFont);
sl@0
  7034
	
sl@0
  7035
	//Testcode for Hindi language
sl@0
  7036
	((CTGlyphSelectionStep*)iStep)->RecordTestResultL();
sl@0
  7037
	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-1580"));
sl@0
  7038
	TestHindiChars(hindiFont);
sl@0
  7039
	((CTGlyphSelectionStep*)iStep)->RecordTestResultL();
sl@0
  7040
	
sl@0
  7041
	CleanupStack::Pop(hindiFont);
sl@0
  7042
	
sl@0
  7043
	// Font file Creation
sl@0
  7044
	CFbsFont* indicFont = NULL;
sl@0
  7045
	User::LeaveIfError(device->GetNearestFontToDesignHeightInTwips(indicFont,testIndicFontSpec));
sl@0
  7046
	gc->UseFont(indicFont);
sl@0
  7047
	CleanupStack::PushL(indicFont);
sl@0
  7048
	
sl@0
  7049
	//Testcode for Kannada, Marathi,Gujarati,Bengali language
sl@0
  7050
	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-3381"));
sl@0
  7051
	TestKannadaChars(indicFont);
sl@0
  7052
	((CTGlyphSelectionStep*)iStep)->RecordTestResultL();
sl@0
  7053
	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-3360"));
sl@0
  7054
	TestMarathiChars(indicFont);
sl@0
  7055
	((CTGlyphSelectionStep*)iStep)->RecordTestResultL();
sl@0
  7056
	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-3417"));
sl@0
  7057
	TestGujaratiChars(indicFont);
sl@0
  7058
	TestBengaliChars(indicFont);
sl@0
  7059
	TestTamilChars(indicFont);
sl@0
  7060
	TestTeluguChars(indicFont);
sl@0
  7061
	TestIndicPunctuation(indicFont);
sl@0
  7062
	CleanupStack::Pop(indicFont);
sl@0
  7063
			
sl@0
  7064
	//Cleaning the memory
sl@0
  7065
	delete bmp;
sl@0
  7066
	delete device;
sl@0
  7067
	delete gc;
sl@0
  7068
	fontStore->RemoveFile(err);
sl@0
  7069
	fontStore->RemoveFile(err1);
sl@0
  7070
	delete fontStore;
sl@0
  7071
	REComSession::FinalClose();
sl@0
  7072
	}
sl@0
  7073
sl@0
  7074
	
sl@0
  7075
/**
sl@0
  7076
@SYMTestCaseID GRAPHICS-SYSLIB-GDI-CT-0221
sl@0
  7077
@SYMTestCaseDesc Test support for Vietnamese characters.
sl@0
  7078
@SYMTestPriority High
sl@0
  7079
@SYMTestActions  Attempt to compose various valid and invalid Vietnamese glyph clusters.
sl@0
  7080
@SYMTestExpectedResults The test must not fail.
sl@0
  7081
@SYMPREQ 402: GDI for Bravo.
sl@0
  7082
*/
sl@0
  7083
void CTGlyphSelection::TestVietnameseChars()
sl@0
  7084
	{
sl@0
  7085
/**
sl@0
  7086
 This method is a test case to test GetCharacterPosition() correctly
sl@0
  7087
 processes Vietnamese characters.
sl@0
  7088
*/
sl@0
  7089
	TBool r;
sl@0
  7090
	TBuf<41> testText(0);
sl@0
  7091
	CFont::TPositionParam param;
sl@0
  7092
	param.iDirection = CFont::EHorizontal;
sl@0
  7093
	param.iFlags = CFont::TPositionParam::EFLogicalOrder;
sl@0
  7094
sl@0
  7095
	testText.SetLength(41);
sl@0
  7096
	
sl@0
  7097
	testText[0] = 0x0055; // capital U
sl@0
  7098
	testText[1] = 0x031B; // combining horn - expect 0x01AF (succeed)
sl@0
  7099
sl@0
  7100
	testText[2] = 0x0055; // capital U
sl@0
  7101
	testText[3] = 0x0027; // apostrophe - expect 0x0055 (fail)
sl@0
  7102
sl@0
  7103
	testText[4] = 0x0055; // capital U
sl@0
  7104
	testText[5] = 0x02B9; // modifier prime - expect 0x0055 (fail)
sl@0
  7105
sl@0
  7106
	testText[6] = 0x0055; // capital U
sl@0
  7107
	testText[7] = 0x02BC; // modifier apostrophe - expect 0x0055 (fail)
sl@0
  7108
sl@0
  7109
	testText[8] = 0x0055; // capital U
sl@0
  7110
	testText[9] = 0x0315; // combining comma above right - expect 0x0055, 0x0315 (fail)
sl@0
  7111
sl@0
  7112
	testText[10] = 0x0055; // capital U
sl@0
  7113
	testText[11] = 0x2019; // right single quote mark - expect 0x0055 (fail)
sl@0
  7114
sl@0
  7115
	testText[12] = 0x01AF; // capital U with horn
sl@0
  7116
	testText[13] = 0x0020; // space - expect 0x01AF (succeed)
sl@0
  7117
sl@0
  7118
	testText[14] = 0x0045; // capital E
sl@0
  7119
	testText[15] = 0x031B; // combining horn - expect 0x0045, 0x031B (fail)
sl@0
  7120
sl@0
  7121
	testText[16] = 0x0041; // capital A
sl@0
  7122
	testText[17] = 0x0306; // combining breve
sl@0
  7123
	testText[18] = 0x0301; // combining acute - expect 0x1EAE (succeed)
sl@0
  7124
sl@0
  7125
	testText[19] = 0x0102; // capital A with breve
sl@0
  7126
	testText[20] = 0x0301; // combining acute - expect 0x1EAE (succeed)
sl@0
  7127
sl@0
  7128
	testText[21] = 0x0041; // capital A
sl@0
  7129
	testText[22] = 0x0301; // combining acute
sl@0
  7130
	testText[23] = 0x0306; // combining breve - expect 0x0041, 0x0301, 0x0306 (fail)
sl@0
  7131
sl@0
  7132
	testText[24] = 0x0041; // capital A
sl@0
  7133
	testText[25] = 0x0323; // combining dot below
sl@0
  7134
	testText[26] = 0x0306; // combining breve - expect 0x1EB6 (succeed)
sl@0
  7135
sl@0
  7136
	testText[27] = 0x1EA0; // capital A with dot below
sl@0
  7137
	testText[28] = 0x0306; // combining breve - expect 0x1EB6 (succeed)
sl@0
  7138
sl@0
  7139
	testText[29] = 0x0102; // capital A with breve
sl@0
  7140
	testText[30] = 0x0323; // combining dot below - expect 0x0102, 0x0323 (fail)
sl@0
  7141
sl@0
  7142
	testText[31] = 0x0045; // capital A
sl@0
  7143
	testText[32] = 0x0302; // combining circumflex
sl@0
  7144
	testText[33] = 0x0301; // combining acute - expect 0x1EBE (succeed)
sl@0
  7145
sl@0
  7146
	testText[34] = 0x00CA; // capital A with circumflex
sl@0
  7147
	testText[35] = 0x0301; // combining acute - expect 0x1EBE (succeed)
sl@0
  7148
sl@0
  7149
	testText[36] = 0x004F; // capital O
sl@0
  7150
	testText[37] = 0x031B; // combining horn
sl@0
  7151
	testText[38] = 0x0309; // combining hook above - expect 0x1EDE (succeed)
sl@0
  7152
sl@0
  7153
	testText[39] = 0x01A0; // capital O with horn
sl@0
  7154
	testText[40] = 0x0309; // combining hook above - expect 0x1EDE (succeed)
sl@0
  7155
sl@0
  7156
	param.iText.Set(testText);
sl@0
  7157
sl@0
  7158
	// 1: Capital U with combining horn
sl@0
  7159
	param.iPosInText = 0;
sl@0
  7160
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  7161
	r = iTestFont->GetCharacterPosition(param);
sl@0
  7162
	TEST(r && param.iPosInText == 2 
sl@0
  7163
		   && param.iPen.iX == 10
sl@0
  7164
		   && param.iOutputGlyphs == 1
sl@0
  7165
		   && param.iOutput[0].iCode == 0x01AF);
sl@0
  7166
sl@0
  7167
	// 2: Capital U with apostrophe
sl@0
  7168
	param.iPosInText = 2;
sl@0
  7169
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  7170
	r = iTestFont->GetCharacterPosition(param);
sl@0
  7171
	TEST(r && param.iPosInText == 3 
sl@0
  7172
		   && param.iPen.iX == 10
sl@0
  7173
		   && param.iOutputGlyphs == 1
sl@0
  7174
		   && param.iOutput[0].iCode == 0x0055);
sl@0
  7175
sl@0
  7176
	// 3: Capital U with modifier prime
sl@0
  7177
	param.iPosInText = 4;
sl@0
  7178
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  7179
	r = iTestFont->GetCharacterPosition(param);
sl@0
  7180
	TEST(r && param.iPosInText == 5 
sl@0
  7181
		   && param.iPen.iX == 10
sl@0
  7182
		   && param.iOutputGlyphs == 1
sl@0
  7183
		   && param.iOutput[0].iCode == 0x0055);
sl@0
  7184
sl@0
  7185
	// 4: Capital U with modifier apostrophe
sl@0
  7186
	param.iPosInText = 6;
sl@0
  7187
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  7188
	r = iTestFont->GetCharacterPosition(param);
sl@0
  7189
	TEST(r && param.iPosInText == 7 
sl@0
  7190
		   && param.iPen.iX == 10
sl@0
  7191
		   && param.iOutputGlyphs == 1
sl@0
  7192
		   && param.iOutput[0].iCode == 0x0055);
sl@0
  7193
sl@0
  7194
	// 5: Capital U with combining comma above right
sl@0
  7195
	param.iPosInText = 8;
sl@0
  7196
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  7197
	r = iTestFont->GetCharacterPosition(param);
sl@0
  7198
	TEST(r && param.iPosInText == 10 
sl@0
  7199
		   && param.iPen.iX == 10
sl@0
  7200
		   && param.iOutputGlyphs == 2
sl@0
  7201
		   && param.iOutput[0].iCode == 0x0055
sl@0
  7202
		   && param.iOutput[1].iCode == 0x0315);
sl@0
  7203
sl@0
  7204
	// 6: Capital U with right single quote
sl@0
  7205
	param.iPosInText = 10;
sl@0
  7206
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  7207
	r = iTestFont->GetCharacterPosition(param);
sl@0
  7208
	TEST(r && param.iPosInText == 11 
sl@0
  7209
		   && param.iPen.iX == 10
sl@0
  7210
		   && param.iOutputGlyphs == 1
sl@0
  7211
		   && param.iOutput[0].iCode == 0x0055);
sl@0
  7212
sl@0
  7213
	// 7: Capital U with horn plus space
sl@0
  7214
	param.iPosInText = 12;
sl@0
  7215
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  7216
	r = iTestFont->GetCharacterPosition(param);
sl@0
  7217
	TEST(r && param.iPosInText == 13 
sl@0
  7218
		   && param.iPen.iX == 10
sl@0
  7219
		   && param.iOutputGlyphs == 1
sl@0
  7220
		   && param.iOutput[0].iCode == 0x01AF);
sl@0
  7221
sl@0
  7222
	// 8: Capital E with combining horn
sl@0
  7223
	param.iPosInText = 14;
sl@0
  7224
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  7225
	r = iTestFont->GetCharacterPosition(param);
sl@0
  7226
	TEST(r && param.iPosInText == 16 
sl@0
  7227
		   && param.iPen.iX == 10
sl@0
  7228
		   && param.iOutputGlyphs == 2
sl@0
  7229
		   && param.iOutput[0].iCode == 0x0045
sl@0
  7230
		   && param.iOutput[1].iCode == 0x031B);
sl@0
  7231
sl@0
  7232
	// 9: Capital A with combining breve with combining acute
sl@0
  7233
	param.iPosInText = 16;
sl@0
  7234
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  7235
	r = iTestFont->GetCharacterPosition(param);
sl@0
  7236
	TEST(r && param.iPosInText == 19 
sl@0
  7237
		   && param.iPen.iX == 10
sl@0
  7238
		   && param.iOutputGlyphs == 1
sl@0
  7239
		   && param.iOutput[0].iCode == 0x1EAE);
sl@0
  7240
sl@0
  7241
	// 10: Capital A with breve with combining acute
sl@0
  7242
	param.iPosInText = 19;
sl@0
  7243
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  7244
	r = iTestFont->GetCharacterPosition(param);
sl@0
  7245
	TEST(r && param.iPosInText == 21 
sl@0
  7246
		   && param.iPen.iX == 10
sl@0
  7247
		   && param.iOutputGlyphs == 1
sl@0
  7248
		   && param.iOutput[0].iCode == 0x1EAE);
sl@0
  7249
sl@0
  7250
	// 11: Capital A with combining acute with combining breve
sl@0
  7251
	param.iPosInText = 21;
sl@0
  7252
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  7253
	r = iTestFont->GetCharacterPosition(param);
sl@0
  7254
	TEST(r && param.iPosInText == 24 
sl@0
  7255
		   && param.iPen.iX == 10
sl@0
  7256
		   && param.iOutputGlyphs == 3
sl@0
  7257
		   && param.iOutput[0].iCode == 0x0041
sl@0
  7258
		   && param.iOutput[1].iCode == 0x0301
sl@0
  7259
		   && param.iOutput[2].iCode == 0x0306);
sl@0
  7260
sl@0
  7261
	// 12: Capital A with combining dot below with combining breve
sl@0
  7262
	param.iPosInText = 24;
sl@0
  7263
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  7264
	r = iTestFont->GetCharacterPosition(param);
sl@0
  7265
	TEST(r && param.iPosInText == 27 
sl@0
  7266
		   && param.iPen.iX == 10
sl@0
  7267
		   && param.iOutputGlyphs == 1
sl@0
  7268
		   && param.iOutput[0].iCode == 0x1EB6);
sl@0
  7269
sl@0
  7270
	// 13: Capital A with dot below with combining breve
sl@0
  7271
	param.iPosInText = 27;
sl@0
  7272
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  7273
	r = iTestFont->GetCharacterPosition(param);
sl@0
  7274
	TEST(r && param.iPosInText == 29 
sl@0
  7275
		   && param.iPen.iX == 10
sl@0
  7276
		   && param.iOutputGlyphs == 1
sl@0
  7277
		   && param.iOutput[0].iCode == 0x1EB6);
sl@0
  7278
sl@0
  7279
	// 14: Capital A with breve with combining dot below
sl@0
  7280
	param.iPosInText = 29;
sl@0
  7281
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  7282
	r = iTestFont->GetCharacterPosition(param);
sl@0
  7283
	TEST(r && param.iPosInText == 31 
sl@0
  7284
		   && param.iPen.iX == 10
sl@0
  7285
		   && param.iOutputGlyphs == 2
sl@0
  7286
		   && param.iOutput[0].iCode == 0x0102
sl@0
  7287
		   && param.iOutput[1].iCode == 0x0323);
sl@0
  7288
sl@0
  7289
	// 15: Capital A with combining circumflex with combining acute
sl@0
  7290
	param.iPosInText = 31;
sl@0
  7291
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  7292
	r = iTestFont->GetCharacterPosition(param);
sl@0
  7293
	TEST(r && param.iPosInText == 34 
sl@0
  7294
		   && param.iPen.iX == 10
sl@0
  7295
		   && param.iOutputGlyphs == 1
sl@0
  7296
		   && param.iOutput[0].iCode == 0x1EBE);
sl@0
  7297
sl@0
  7298
	// 16: Capital A with circumflex with combining acute
sl@0
  7299
	param.iPosInText = 34;
sl@0
  7300
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  7301
	r = iTestFont->GetCharacterPosition(param);
sl@0
  7302
	TEST(r && param.iPosInText == 36 
sl@0
  7303
		   && param.iPen.iX == 10
sl@0
  7304
		   && param.iOutputGlyphs == 1
sl@0
  7305
		   && param.iOutput[0].iCode == 0x1EBE);
sl@0
  7306
sl@0
  7307
	// 17: Capital O with combining horn with combing hook above
sl@0
  7308
	param.iPosInText = 36;
sl@0
  7309
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  7310
	r = iTestFont->GetCharacterPosition(param);
sl@0
  7311
	TEST(r && param.iPosInText == 39 
sl@0
  7312
		   && param.iPen.iX == 10
sl@0
  7313
		   && param.iOutputGlyphs == 1
sl@0
  7314
		   && param.iOutput[0].iCode == 0x1EDE);
sl@0
  7315
sl@0
  7316
	// 18: Capital O with horn with combing hook above
sl@0
  7317
	param.iPosInText = 39;
sl@0
  7318
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  7319
	r = iTestFont->GetCharacterPosition(param);
sl@0
  7320
	TEST(r && param.iPosInText == 41 
sl@0
  7321
		   && param.iPen.iX == 10
sl@0
  7322
		   && param.iOutputGlyphs == 1
sl@0
  7323
		   && param.iOutput[0].iCode == 0x1EDE);
sl@0
  7324
	}
sl@0
  7325
sl@0
  7326
sl@0
  7327
void CTGlyphSelection::TestNonBmpCharsL()
sl@0
  7328
	{
sl@0
  7329
	// create a font store for testing
sl@0
  7330
	CFontStore* fontStore = CFontStore::NewL(&User::Heap());
sl@0
  7331
	
sl@0
  7332
	//load all ecom implemented rasterizer dlls. installs the rasterizer.	
sl@0
  7333
	LoadOpenFontLibraries(fontStore);
sl@0
  7334
		// test font preparation
sl@0
  7335
	fontStore->iKPixelWidthInTwips = 11860; //This value is default
sl@0
  7336
sl@0
  7337
	//add any required font files
sl@0
  7338
	TUid err = fontStore->AddFileL(KTestGB18030FontFile);
sl@0
  7339
sl@0
  7340
	TFontSpec testGB18030FontSpec(KTestGB18030FontFaceName,200); 
sl@0
  7341
	 
sl@0
  7342
	CFbsBitmap* bmp = new(ELeave) CFbsBitmap;
sl@0
  7343
	
sl@0
  7344
	TInt ret = bmp->Create(TSize(100,100),EGray2);
sl@0
  7345
	if (ret == KErrNotSupported)
sl@0
  7346
		return;
sl@0
  7347
	else
sl@0
  7348
		User::LeaveIfError(ret);
sl@0
  7349
sl@0
  7350
	CFbsBitmapDevice* device = NULL;
sl@0
  7351
	TRAPD(err2,device = CFbsBitmapDevice::NewL(bmp));
sl@0
  7352
	TEST(err2 == KErrNone);
sl@0
  7353
sl@0
  7354
	CFbsBitGc* gc = NULL;
sl@0
  7355
	User::LeaveIfError(device->CreateContext(gc));
sl@0
  7356
	// Font file Creation
sl@0
  7357
	CFbsFont* gb18030Font = NULL;
sl@0
  7358
	User::LeaveIfError(device->GetNearestFontToDesignHeightInTwips(gb18030Font,testGB18030FontSpec));
sl@0
  7359
	gc->UseFont(gb18030Font);
sl@0
  7360
	CleanupStack::PushL(gb18030Font);
sl@0
  7361
	
sl@0
  7362
	//Testcode for GB18030
sl@0
  7363
	((CTGlyphSelectionStep*)iStep)->RecordTestResultL();
sl@0
  7364
	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("TI18N-GDI-CIT-4077"));
sl@0
  7365
	TestNonBmpCharsInGB18030(gb18030Font);
sl@0
  7366
	((CTGlyphSelectionStep*)iStep)->RecordTestResultL();
sl@0
  7367
	
sl@0
  7368
	CleanupStack::Pop(gb18030Font);
sl@0
  7369
	
sl@0
  7370
	//Cleaning the memory
sl@0
  7371
	delete bmp;
sl@0
  7372
	delete device;
sl@0
  7373
	delete gc;
sl@0
  7374
	fontStore->RemoveFile(err);
sl@0
  7375
	delete fontStore;
sl@0
  7376
	REComSession::FinalClose();
sl@0
  7377
	}
sl@0
  7378
sl@0
  7379
sl@0
  7380
void CTGlyphSelection::TestTextDirection()
sl@0
  7381
/**
sl@0
  7382
 This method is a test case to test GetCharacterPosition() correctly
sl@0
  7383
 produces glyph bounding boxes and utilizes various pen offsets in
sl@0
  7384
 a horizontal and vertical context.
sl@0
  7385
*/
sl@0
  7386
	{
sl@0
  7387
	TBool r;
sl@0
  7388
	TBuf<20> testText(0);
sl@0
  7389
	CFont::TPositionParam param;
sl@0
  7390
	param.iFlags = CFont::TPositionParam::EFLogicalOrder;
sl@0
  7391
sl@0
  7392
	testText.SetLength(5);
sl@0
  7393
	testText[0] = 'a';
sl@0
  7394
	testText[1] = 'B';
sl@0
  7395
	testText[2] = 'c';
sl@0
  7396
	testText[3] = ' ';
sl@0
  7397
	testText[4] = '1';
sl@0
  7398
	param.iText.Set(testText);
sl@0
  7399
sl@0
  7400
	// 1: Test horizontal text pen advancement & bounds
sl@0
  7401
	param.iDirection = CFont::EHorizontal;
sl@0
  7402
	param.iPosInText = 0;
sl@0
  7403
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  7404
	r = iTestFont->GetCharacterPosition(param);
sl@0
  7405
	TEST(r && param.iPosInText == 1 
sl@0
  7406
		   && param.iPen == TPoint(10,0)
sl@0
  7407
		   && param.iOutputGlyphs == 1 
sl@0
  7408
		   && param.iOutput[0].iCode == 'a'
sl@0
  7409
		   && param.iOutput[0].iBounds.iTl == TPoint(0,-10)
sl@0
  7410
		   && param.iOutput[0].iBounds.iBr == TPoint(10,2));
sl@0
  7411
		   // add check for bounds
sl@0
  7412
sl@0
  7413
	// 2: Test horizontal text pen advancement with +ve pen offset
sl@0
  7414
	param.iPosInText = 4;
sl@0
  7415
	param.iPen.iX = 20;
sl@0
  7416
	param.iPen.iY = 12;
sl@0
  7417
	r = iTestFont->GetCharacterPosition(param);
sl@0
  7418
	TEST(r && param.iPosInText == 5 
sl@0
  7419
		   && param.iPen == TPoint(30,12)
sl@0
  7420
		   && param.iOutputGlyphs == 1 
sl@0
  7421
		   && param.iOutput[0].iCode == '1'
sl@0
  7422
		   && param.iOutput[0].iBounds.iTl == TPoint(20,2)
sl@0
  7423
		   && param.iOutput[0].iBounds.iBr == TPoint(30,14));
sl@0
  7424
sl@0
  7425
	// 3: Test horizontal text pen advancement with -ve pen offset
sl@0
  7426
	param.iPosInText = 4;
sl@0
  7427
	param.iPen.iX = -10;
sl@0
  7428
	param.iPen.iY = -24;
sl@0
  7429
	r = iTestFont->GetCharacterPosition(param);
sl@0
  7430
	TEST(r && param.iPosInText == 5 
sl@0
  7431
		   && param.iPen == TPoint(0,-24)
sl@0
  7432
		   && param.iOutputGlyphs == 1 
sl@0
  7433
		   && param.iOutput[0].iCode == '1'
sl@0
  7434
		   && param.iOutput[0].iBounds.iTl == TPoint(-10,-34)
sl@0
  7435
		   && param.iOutput[0].iBounds.iBr == TPoint(0,-22));
sl@0
  7436
sl@0
  7437
	// 4: Test vertical text pen advancement & bounds
sl@0
  7438
	param.iDirection = CFont::EVertical;
sl@0
  7439
	param.iPosInText = 1;
sl@0
  7440
	param.iPen.iX = param.iPen.iY = 0;
sl@0
  7441
	r = iTestFont->GetCharacterPosition(param);
sl@0
  7442
	TEST(r && param.iPosInText == 2 
sl@0
  7443
		   && param.iPen == TPoint(0,12)
sl@0
  7444
		   && param.iOutputGlyphs == 1 
sl@0
  7445
		   && param.iOutput[0].iCode == 'B'
sl@0
  7446
		   && param.iOutput[0].iBounds.iTl == TPoint(0,0)
sl@0
  7447
		   && param.iOutput[0].iBounds.iBr == TPoint(10,12));
sl@0
  7448
sl@0
  7449
	// 5: Test vertical text pen advancement with +ve pen offset
sl@0
  7450
	param.iPosInText = 4;
sl@0
  7451
	param.iPen.iX = 20;
sl@0
  7452
	param.iPen.iY = 12;
sl@0
  7453
	r = iTestFont->GetCharacterPosition(param);
sl@0
  7454
	TEST(r && param.iPosInText == 5 
sl@0
  7455
		   && param.iPen == TPoint(20,24)
sl@0
  7456
		   && param.iOutputGlyphs == 1 
sl@0
  7457
		   && param.iOutput[0].iCode == '1'
sl@0
  7458
		   && param.iOutput[0].iBounds.iTl == TPoint(20,12)
sl@0
  7459
		   && param.iOutput[0].iBounds.iBr == TPoint(30,24));
sl@0
  7460
sl@0
  7461
	// 6: Test vertical text pen advancement with -ve pen offset
sl@0
  7462
	param.iPosInText = 4;
sl@0
  7463
	param.iPen.iX = -10;
sl@0
  7464
	param.iPen.iY = -24;
sl@0
  7465
	r = iTestFont->GetCharacterPosition(param);
sl@0
  7466
	TEST(r && param.iPosInText == 5 
sl@0
  7467
		   && param.iPen == TPoint(-10,-12)
sl@0
  7468
		   && param.iOutputGlyphs == 1 
sl@0
  7469
		   && param.iOutput[0].iCode == '1'
sl@0
  7470
		   && param.iOutput[0].iBounds.iTl == TPoint(-10,-24)
sl@0
  7471
		   && param.iOutput[0].iBounds.iBr == TPoint(0,-12));
sl@0
  7472
	}
sl@0
  7473
sl@0
  7474
void CTGlyphSelection::TestAllUnicodeChars()
sl@0
  7475
/**
sl@0
  7476
 This method is a test case to test GetCharacterPosition() correctly
sl@0
  7477
 processes all the characters in the Unicode code space 0x0000 to 
sl@0
  7478
 0xffff.
sl@0
  7479
*/
sl@0
  7480
	{
sl@0
  7481
	TBool r;
sl@0
  7482
	TBuf<8> testText(0);
sl@0
  7483
	CFont::TPositionParam param;
sl@0
  7484
	param.iFlags = CFont::TPositionParam::EFLogicalOrder;
sl@0
  7485
sl@0
  7486
	TInt errors = 0;
sl@0
  7487
	testText.SetLength(1);
sl@0
  7488
	for (TUint i = 0xd802; i <= 0xffff; i++)
sl@0
  7489
		{
sl@0
  7490
		testText[0] = (TText16) i;
sl@0
  7491
		if (i==0x1b) continue; // Skip as CTestFont designed to fail here r==0.
sl@0
  7492
		param.iText.Set(testText);
sl@0
  7493
		param.iDirection = CFont::EHorizontal;
sl@0
  7494
		param.iPosInText = 0;
sl@0
  7495
		param.iPen.iX = param.iPen.iY = 0;
sl@0
  7496
		r = iTestFont->GetCharacterPosition(param);
sl@0
  7497
		if (!r || param.iPosInText != 1)
sl@0
  7498
			{
sl@0
  7499
			errors++;
sl@0
  7500
			//RDebug::Print(_L("%04x(%d,%d,%d), "), i, r, param.iPosInText, param.iOutputGlyphs );
sl@0
  7501
			//if (errors%8 == 0)
sl@0
  7502
			//	RDebug::Print(_L("\n"));
sl@0
  7503
			}
sl@0
  7504
		}
sl@0
  7505
sl@0
  7506
	TEST (errors == 0);
sl@0
  7507
	}
sl@0
  7508
sl@0
  7509
/** Tests that ligatures (presently just Lam-Alef in Arabic) work correctly
sl@0
  7510
when diacritics are required on one, both or neither character comprising the
sl@0
  7511
ligature. */
sl@0
  7512
void CTGlyphSelection::TestLigaturesWithDiacritics()
sl@0
  7513
	{
sl@0
  7514
	// independent letters
sl@0
  7515
	const TText KAlef = 0x627;
sl@0
  7516
	const TText KLam = 0x644;
sl@0
  7517
	const TText KBeh = 0x628;
sl@0
  7518
	// dependent marks
sl@0
  7519
	const TText KFatha = 0x64E;
sl@0
  7520
	const TText KDamma = 0x64F;
sl@0
  7521
	// ligature forms
sl@0
  7522
	const TText KLamAlefIsolated = 0xFEFB;
sl@0
  7523
	const TText KLamAlefFinal = 0xFEFC;
sl@0
  7524
sl@0
  7525
	struct TTestCase
sl@0
  7526
		{
sl@0
  7527
		// Logical order input.
sl@0
  7528
		TText iInputL[8];
sl@0
  7529
		// Visual order input, should be equivalent to iInputL.
sl@0
  7530
		TText iInputV[8];
sl@0
  7531
		// Which cluster to test
sl@0
  7532
		TInt iClusterUnderTestStartL;
sl@0
  7533
		TInt iClusterUnderTestStartV;
sl@0
  7534
		// Expected glyphs to appear (in any order, but...)
sl@0
  7535
		TInt iGlyphs[8];
sl@0
  7536
		// ...number of glyphs from the start of iGlyphs that
sl@0
  7537
		// are in order of their expected x-coordinates (of their
sl@0
  7538
		// centres)
sl@0
  7539
		TInt iGlyphsInOrder;
sl@0
  7540
		};
sl@0
  7541
	const TTestCase KTestCases[] =
sl@0
  7542
		{
sl@0
  7543
		{{KLam, KAlef, 0}, {KAlef, KLam, 0},
sl@0
  7544
			0, 0, {KLamAlefIsolated, 0}, 1},
sl@0
  7545
		{{KBeh, KLam, KAlef, KBeh, 0}, {KBeh, KAlef, KLam, KBeh, 0},
sl@0
  7546
			1, 1, {KLamAlefFinal, 0}, 1},
sl@0
  7547
		{{KLam, KFatha, KAlef, 0}, {KAlef, KLam, KFatha, 0},
sl@0
  7548
			0, 0, {KLamAlefIsolated, KFatha, 0}, 1},
sl@0
  7549
		{{KBeh, KLam, KFatha, KAlef, KBeh, 0}, {KBeh, KAlef, KLam, KFatha, KBeh, 0},
sl@0
  7550
			1, 1, {KLamAlefFinal, KFatha, 0}, 1},
sl@0
  7551
		{{KLam, KAlef, KDamma, 0}, {KAlef, KDamma, KLam, 0},
sl@0
  7552
			0, 0, {KLamAlefIsolated, KDamma, 0}, 1},
sl@0
  7553
		{{KBeh, KLam, KAlef, KDamma, KBeh, 0}, {KBeh, KAlef, KDamma, KLam, KBeh, 0},
sl@0
  7554
			1, 1, {KLamAlefFinal, KDamma, 0}, 1},
sl@0
  7555
		{{KLam, KFatha, KAlef, KDamma, 0}, {KAlef, KDamma, KLam, KFatha, 0},
sl@0
  7556
			0, 0, {KDamma, KFatha, KLamAlefIsolated, 0}, 2},
sl@0
  7557
		{{KBeh, KLam, KFatha, KAlef, KDamma, KBeh, 0},
sl@0
  7558
			{KBeh, KAlef, KDamma, KLam, KFatha, KBeh, 0},
sl@0
  7559
			1, 1, {KDamma, KFatha, KLamAlefFinal, 0}, 2},
sl@0
  7560
		};
sl@0
  7561
	TBuf<8> input;
sl@0
  7562
	CFont::TPositionParam param;
sl@0
  7563
	for (TInt testCase = 0;
sl@0
  7564
		testCase != sizeof(KTestCases)/sizeof(KTestCases[0]);
sl@0
  7565
		++testCase)
sl@0
  7566
		{
sl@0
  7567
		const TTestCase& t = KTestCases[testCase];
sl@0
  7568
		for (TInt logical = 0; logical != 2; ++logical)
sl@0
  7569
			{
sl@0
  7570
			const TText* in = logical?
sl@0
  7571
				t.iInputL : t.iInputV;
sl@0
  7572
			input.Zero();
sl@0
  7573
			while (*in)
sl@0
  7574
				input.Append(*in++);
sl@0
  7575
			param.iText.Set(input);
sl@0
  7576
			param.iPosInText = logical?
sl@0
  7577
				t.iClusterUnderTestStartL : t.iClusterUnderTestStartV;
sl@0
  7578
			param.iFlags = static_cast<TUint16>(logical?
sl@0
  7579
				CFont::TPositionParam::EFLogicalOrder : 0);
sl@0
  7580
			param.iPen.SetXY(0, 0);
sl@0
  7581
			TBool r = iTestFont->GetCharacterPosition(param);
sl@0
  7582
			TEST(r);
sl@0
  7583
			TInt currentX = KMinTInt;
sl@0
  7584
			TInt expectedGlyphNo = 0;
sl@0
  7585
			while (t.iGlyphs[expectedGlyphNo] != 0)
sl@0
  7586
				{
sl@0
  7587
				// FInd the expected glyph in the output.
sl@0
  7588
				TInt outputGlyph = 0;
sl@0
  7589
				while (outputGlyph != param.iOutputGlyphs
sl@0
  7590
					&& static_cast<TInt>(param.iOutput[outputGlyph].iCode)
sl@0
  7591
					!= t.iGlyphs[expectedGlyphNo])
sl@0
  7592
					{
sl@0
  7593
					++outputGlyph;
sl@0
  7594
					}
sl@0
  7595
				TEST(outputGlyph < param.iOutputGlyphs);
sl@0
  7596
				TInt x = param.iOutput[outputGlyph].iBounds.Center().iX;
sl@0
  7597
				TEST(t.iGlyphsInOrder <= expectedGlyphNo
sl@0
  7598
					|| currentX < x);
sl@0
  7599
				currentX = x;
sl@0
  7600
				++expectedGlyphNo;
sl@0
  7601
				}
sl@0
  7602
			TEST(expectedGlyphNo == param.iOutputGlyphs);
sl@0
  7603
			}
sl@0
  7604
		}
sl@0
  7605
	}
sl@0
  7606
	
sl@0
  7607
 #if defined(__GCC32__)
sl@0
  7608
 typedef wchar_t __TText;
sl@0
  7609
 #elif defined(__VC32__)
sl@0
  7610
 typedef TUint16 __TText;
sl@0
  7611
 #elif defined(__CW32__)
sl@0
  7612
 typedef TUint16 __TText;
sl@0
  7613
 #elif !defined(__TText_defined)
sl@0
  7614
 #error  no typedef for __TText
sl@0
  7615
 #endif
sl@0
  7616
 const __TText* KLatinNoSideBearings = L"ABCDE";
sl@0
  7617
 const __TText* KLatinLeftSideBearing = L"WABCD";
sl@0
  7618
 const __TText* KLatinRightSideBearing = L"ABCDW";
sl@0
  7619
 const __TText* KLatinBothSideBearings = L"WABCW";
sl@0
  7620
 const __TText* KArabicAlefWaw = L"\x627\x648";
sl@0
  7621
 const __TText* KArabicWawAlef = L"\x648\x627";
sl@0
  7622
 const __TText* KGb18030NoSideBearings = L"\xD840\xDC00xyz\xD87E\xDE1D";
sl@0
  7623
 const __TText* KGb18030LeftSideBearings = L"W\xD840\xDC00xy\xD87E\xDE1D";
sl@0
  7624
 const __TText* KGb18030RightSideBearings = L"\xD840\xDC00xy\xD87E\xDE1DW";
sl@0
  7625
 const __TText* KGb18030BothSideBearings = L"W\xD840\xDC00x\xD87E\xDE1DW";
sl@0
  7626
 struct TMeasureTextTest
sl@0
  7627
 	{
sl@0
  7628
 	const __TText* iText;
sl@0
  7629
 	TInt iExpectedAdvanceLogical;
sl@0
  7630
 	TInt iExpectedAdvanceL2R;
sl@0
  7631
 	TInt iExpectedBoundsL2RLeft;
sl@0
  7632
 	TInt iExpectedBoundsL2RRight;
sl@0
  7633
 	TInt iExpectedBoundsL2RTop;
sl@0
  7634
 	TInt iExpectedBoundsL2RBottom;
sl@0
  7635
 	TInt iExpectedAdvanceR2L;
sl@0
  7636
 	TInt iExpectedBoundsR2LLeft;
sl@0
  7637
 	TInt iExpectedBoundsR2LRight;
sl@0
  7638
 	TInt iExpectedBoundsR2LTop;
sl@0
  7639
 	TInt iExpectedBoundsR2LBottom;
sl@0
  7640
 	};
sl@0
  7641
 const TMeasureTextTest KMeasureTextResults[] =
sl@0
  7642
 	{
sl@0
  7643
 	{KLatinNoSideBearings, 50, 50, 0, 50, -10, 2, 50, 0, 50, -10, 2},
sl@0
  7644
 	{KLatinLeftSideBearing, 50, 50, -1, 50, -10, 2, 50, 0, 51, -10, 2},
sl@0
  7645
 	{KLatinRightSideBearing, 50, 50, 0, 51, -10, 2, 50, -1, 50, -10, 2},
sl@0
  7646
 	{KLatinBothSideBearings, 50, 50, -1, 51, -10, 2, 50, -1, 51, -10, 2},
sl@0
  7647
 	{KArabicAlefWaw, 20, 20, 0, 20, -10, 2, 20, -5, 20, -10, 2},
sl@0
  7648
 	{KArabicWawAlef, 20, 20, -5, 20, -10, 2, 20, 0, 20, -10, 2},
sl@0
  7649
 	// ones containing surrogate pairs
sl@0
  7650
 	{KGb18030NoSideBearings, 50, 50, 0, 50, -10, 2, 50, 0, 50, -10, 2},
sl@0
  7651
 	{KGb18030LeftSideBearings, 50, 50, -1, 50, -10, 2, 50, 0, 51, -10, 2},
sl@0
  7652
 	{KGb18030RightSideBearings, 50, 50, 0, 51, -10, 2, 50, -1, 50, -10, 2},
sl@0
  7653
 	{KGb18030BothSideBearings, 50, 50, -1, 51, -10, 2, 50, -1, 51, -10, 2},
sl@0
  7654
 	};
sl@0
  7655
 /** Tests CFont::MeasureText */
sl@0
  7656
 void CTGlyphSelection::TestMeasureText()
sl@0
  7657
 	{
sl@0
  7658
 	CFont::TMeasureTextInput input;
sl@0
  7659
 	CFont::TMeasureTextOutput output;
sl@0
  7660
 	TInt advance;
sl@0
  7661
 	for (TInt i = 0;
sl@0
  7662
 		i != sizeof(KMeasureTextResults)/sizeof(KMeasureTextResults[0]); ++i)
sl@0
  7663
 		{
sl@0
  7664
 		TPtrC text(reinterpret_cast<const TText16*>(
sl@0
  7665
 			KMeasureTextResults[i].iText));
sl@0
  7666
 		advance = iTestFont->MeasureText(text, &input, &output);
sl@0
  7667
 		TEST(advance == KMeasureTextResults[i].iExpectedAdvanceLogical);
sl@0
  7668
 		input.iFlags = CFont::TMeasureTextInput::EFVisualOrder;
sl@0
  7669
 		advance = iTestFont->MeasureText(text, &input, &output);
sl@0
  7670
 		TEST(advance == KMeasureTextResults[i].iExpectedAdvanceL2R);
sl@0
  7671
 		TEST(output.iBounds.iTl.iX == KMeasureTextResults[i].iExpectedBoundsL2RLeft);
sl@0
  7672
 		TEST(output.iBounds.iBr.iX == KMeasureTextResults[i].iExpectedBoundsL2RRight);
sl@0
  7673
 		TEST(output.iBounds.iTl.iY == KMeasureTextResults[i].iExpectedBoundsL2RTop);
sl@0
  7674
 		TEST(output.iBounds.iBr.iY == KMeasureTextResults[i].iExpectedBoundsL2RBottom);
sl@0
  7675
 		input.iFlags = CFont::TMeasureTextInput::EFVisualOrderRightToLeft;
sl@0
  7676
 		advance = iTestFont->MeasureText(text, &input, &output);
sl@0
  7677
 		TEST(advance == KMeasureTextResults[i].iExpectedAdvanceR2L);
sl@0
  7678
 		TEST(output.iBounds.iTl.iX == KMeasureTextResults[i].iExpectedBoundsR2LLeft);
sl@0
  7679
 		TEST(output.iBounds.iBr.iX == KMeasureTextResults[i].iExpectedBoundsR2LRight);
sl@0
  7680
 		TEST(output.iBounds.iTl.iY == KMeasureTextResults[i].iExpectedBoundsR2LTop);
sl@0
  7681
 		TEST(output.iBounds.iBr.iY == KMeasureTextResults[i].iExpectedBoundsR2LBottom);
sl@0
  7682
 		}
sl@0
  7683
sl@0
  7684
	INFO_PRINTF1(_L("Test fix for INC086257 - EFIncludePenPositionInBoundsCheck"));
sl@0
  7685
	// left-to-right w/o flag and bounds set to just fit string disregarding sidebearings
sl@0
  7686
	input.iFlags = 0;
sl@0
  7687
	input.iMaxBounds = 50;
sl@0
  7688
	iTestFont->MeasureText(_L("XXXXX"), &input, &output);
sl@0
  7689
	TEST(output.iChars == 5);
sl@0
  7690
	// set flag, string should no longer fit (break happens)
sl@0
  7691
	input.iFlags = CFont::TMeasureTextInput::EFIncludePenPositionInBoundsCheck;
sl@0
  7692
	iTestFont->MeasureText(_L("XXXXX"), &input, &output);
sl@0
  7693
	TEST(output.iChars == 4);
sl@0
  7694
	// right-to-left w/o flag and bounds set to just fit string disregarding sidebearings
sl@0
  7695
	input.iFlags = CFont::TMeasureTextInput::EFVisualOrderRightToLeft;
sl@0
  7696
	iTestFont->MeasureText(_L("\x5EA\x5EA\x5EA\x5EA\x5EA"), &input, &output);
sl@0
  7697
	TEST(output.iChars == 5);
sl@0
  7698
	// set flag, string should no longer fit (break happens)
sl@0
  7699
	input.iFlags |= CFont::TMeasureTextInput::EFIncludePenPositionInBoundsCheck;
sl@0
  7700
	iTestFont->MeasureText(_L("\x5EA\x5EA\x5EA\x5EA\x5EA"), &input, &output);
sl@0
  7701
	TEST(output.iChars == 4);
sl@0
  7702
	// top-to-bottom w/o flag and bounds set to just fit string disregarding endbearings
sl@0
  7703
	input.iFlags = 0;
sl@0
  7704
	input.iMaxBounds = 60;
sl@0
  7705
	input.iDirection = CFont::EVertical;
sl@0
  7706
	iTestFont->MeasureText(_L("\x304B\x304B\x304B\x304B\x304B"), &input, &output);
sl@0
  7707
	TEST(output.iChars == 5);
sl@0
  7708
	// set flag, string should no longer fit (break happens)
sl@0
  7709
	input.iFlags = CFont::TMeasureTextInput::EFIncludePenPositionInBoundsCheck;
sl@0
  7710
	iTestFont->MeasureText(_L("\x304B\x304B\x304B\x304B\x304B"), &input, &output);
sl@0
  7711
	TEST(output.iChars == 4);
sl@0
  7712
 	}
sl@0
  7713
 
sl@0
  7714
void CTGlyphSelection::RunTestCaseL(TInt aCurTestCase)
sl@0
  7715
/**
sl@0
  7716
 This method will execute each test case method in the class
sl@0
  7717
 logging its progress as it does so.
sl@0
  7718
*/
sl@0
  7719
	{
sl@0
  7720
	((CTGlyphSelectionStep*)iStep)->SetTestStepID(KUnknownSYMTestCaseIDName);
sl@0
  7721
	switch(aCurTestCase)
sl@0
  7722
		{
sl@0
  7723
	case 1:
sl@0
  7724
/**
sl@0
  7725
@SYMTestCaseID 				GRAPHICS-SYSLIB-GDI-CIT-0200
sl@0
  7726
*/
sl@0
  7727
        ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-0200"));
sl@0
  7728
		INFO_PRINTF1(_L("Test API Boundaries"));
sl@0
  7729
		TestApiBoundaries();
sl@0
  7730
		break;
sl@0
  7731
	case 2:
sl@0
  7732
/**
sl@0
  7733
@SYMTestCaseID 				GRAPHICS-SYSLIB-GDI-CIT-0201
sl@0
  7734
*/
sl@0
  7735
		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-0201"));
sl@0
  7736
		INFO_PRINTF1(_L("Test CTRL Chars"));
sl@0
  7737
		TestCtrlCharsIgnored();
sl@0
  7738
		break;
sl@0
  7739
	case 3:
sl@0
  7740
/**
sl@0
  7741
@SYMTestCaseID 				GRAPHICS-SYSLIB-GDI-CIT-0202
sl@0
  7742
*/
sl@0
  7743
		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-0202"));
sl@0
  7744
		INFO_PRINTF1(_L("Test Latin Chars"));
sl@0
  7745
		TestLatinChars();
sl@0
  7746
		break;
sl@0
  7747
	case 4:
sl@0
  7748
/**
sl@0
  7749
@SYMTestCaseID 				GRAPHICS-SYSLIB-GDI-CIT-0203
sl@0
  7750
*/
sl@0
  7751
		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-0203"));
sl@0
  7752
		INFO_PRINTF1(_L("Test Soft Hypen Char"));
sl@0
  7753
		TestSoftHyphen();
sl@0
  7754
		break;
sl@0
  7755
	case 5:
sl@0
  7756
/**
sl@0
  7757
@SYMTestCaseID 				GRAPHICS-SYSLIB-GDI-CIT-0204
sl@0
  7758
*/
sl@0
  7759
		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-0204"));
sl@0
  7760
		INFO_PRINTF1(_L("Test Surrogate Pairs"));
sl@0
  7761
		TestSurrogates();
sl@0
  7762
		INFO_PRINTF1(_L("Test Supplementary Chars"));
sl@0
  7763
		TestNonBmpCharsL();
sl@0
  7764
		break;
sl@0
  7765
	case 6:
sl@0
  7766
/**
sl@0
  7767
@SYMTestCaseID 				GRAPHICS-SYSLIB-GDI-CIT-0205
sl@0
  7768
*/
sl@0
  7769
		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-0205"));
sl@0
  7770
		INFO_PRINTF1(_L("Test Combining Latin Chars"));
sl@0
  7771
		TestCombiningLatinChars();
sl@0
  7772
		break;
sl@0
  7773
	case 7:
sl@0
  7774
		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-0221"));
sl@0
  7775
		INFO_PRINTF1(_L("Test Vietnamese Chars"));
sl@0
  7776
		TestVietnameseChars();
sl@0
  7777
		break;
sl@0
  7778
	case 8:
sl@0
  7779
/**
sl@0
  7780
@SYMTestCaseID 				GRAPHICS-SYSLIB-GDI-CIT-0206
sl@0
  7781
*/
sl@0
  7782
		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-0206"));
sl@0
  7783
   		INFO_PRINTF1(_L("Test Vertical/Horizontal Text Bounds"));
sl@0
  7784
   		TestTextDirection();
sl@0
  7785
   		break;
sl@0
  7786
 	case 9:
sl@0
  7787
/**
sl@0
  7788
@SYMTestCaseID 				GRAPHICS-SYSLIB-GDI-CIT-0207
sl@0
  7789
*/
sl@0
  7790
		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-0207"));
sl@0
  7791
   		INFO_PRINTF1(_L("Test All Unicode Characters"));
sl@0
  7792
   		TestAllUnicodeChars();
sl@0
  7793
   		break;
sl@0
  7794
 	case 10:
sl@0
  7795
/**
sl@0
  7796
@SYMTestCaseID 				GRAPHICS-SYSLIB-GDI-CIT-0208
sl@0
  7797
*/
sl@0
  7798
		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-0208"));
sl@0
  7799
   		INFO_PRINTF1(_L("Test Ligatures with Diacritics"));
sl@0
  7800
   		TestLigaturesWithDiacritics();
sl@0
  7801
   		break;
sl@0
  7802
 	case 11:
sl@0
  7803
/**
sl@0
  7804
@SYMTestCaseID 				GRAPHICS-SYSLIB-GDI-CIT-0209
sl@0
  7805
*/
sl@0
  7806
		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-0209"));
sl@0
  7807
 		INFO_PRINTF1(_L("Test CFont::MeasureText()"));
sl@0
  7808
 		TestMeasureText();
sl@0
  7809
 		break;
sl@0
  7810
  	case 12:
sl@0
  7811
/**
sl@0
  7812
@SYMTestCaseID 				GRAPHICS-SYSLIB-GDI-CIT-0210
sl@0
  7813
*/
sl@0
  7814
		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-0210"));
sl@0
  7815
  		INFO_PRINTF1(_L("Test Indic Glyphs"));
sl@0
  7816
  		TestIndicCharsL();	
sl@0
  7817
		break;
sl@0
  7818
   	case 13:
sl@0
  7819
/**
sl@0
  7820
@SYMTestCaseID 				GRAPHICS-SYSLIB-GDI-CIT-0211
sl@0
  7821
*/
sl@0
  7822
		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-0211"));
sl@0
  7823
  		INFO_PRINTF1(_L("Test Thai Rendering"));
sl@0
  7824
   		ExecuteThaiTests();	
sl@0
  7825
   		break;
sl@0
  7826
   	case 14:
sl@0
  7827
/**
sl@0
  7828
@SYMTestCaseID 				GRAPHICS-SYSLIB-GDI-CIT-0212
sl@0
  7829
*/
sl@0
  7830
		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-0212"));
sl@0
  7831
		INFO_PRINTF1(_L("Test isolated Combining Latin Chars"));
sl@0
  7832
		TestIsolatedCombiningLatinChars();
sl@0
  7833
		break;
sl@0
  7834
   	case 15:
sl@0
  7835
/**
sl@0
  7836
@SYMTestCaseID 				GRAPHICS-SYSLIB-GDI-CIT-0213
sl@0
  7837
*/
sl@0
  7838
   		INFO_PRINTF1(_L("Test Indic Gurmukhi and Malayalam Chars"));
sl@0
  7839
		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-0213"));
sl@0
  7840
   		ExecuteIndicGurmukhiMalayalamTests();
sl@0
  7841
   		break;
sl@0
  7842
   	case 16:
sl@0
  7843
/**
sl@0
  7844
@SYMTestCaseID 				GRAPHICS-SYSLIB-GDI-CIT-0214
sl@0
  7845
*/
sl@0
  7846
   		INFO_PRINTF1(_L("Test Rendering Context"));
sl@0
  7847
		((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-0214"));
sl@0
  7848
   		TestContextInShapeInfo();
sl@0
  7849
   		break;
sl@0
  7850
   	case 17:
sl@0
  7851
   		TestComplete();
sl@0
  7852
		((CTGlyphSelectionStep*)iStep)->SetTestStepID(KNotATestSYMTestCaseIDName);
sl@0
  7853
		((CTGlyphSelectionStep*)iStep)->CloseTMSGraphicsStep();
sl@0
  7854
   		break;	
sl@0
  7855
   		}
sl@0
  7856
	((CTGlyphSelectionStep*)iStep)->RecordTestResultL();
sl@0
  7857
	}
sl@0
  7858
sl@0
  7859
void CTGlyphSelection::TestPerformance()
sl@0
  7860
/**
sl@0
  7861
 This method tests the performance of the API under test
sl@0
  7862
 by executing a 10000 cycles of each test case.
sl@0
  7863
**/
sl@0
  7864
	{
sl@0
  7865
	TStopWatch profile;
sl@0
  7866
	INFO_PRINTF1(_L("Test Performance..."));
sl@0
  7867
sl@0
  7868
	profile.Start();
sl@0
  7869
	for (TInt i = 0; i < 10000; i++)
sl@0
  7870
		{
sl@0
  7871
		TestCtrlCharsIgnored();
sl@0
  7872
		TestLatinChars();
sl@0
  7873
		TestSoftHyphen();
sl@0
  7874
		TestSurrogates();
sl@0
  7875
		TestCombiningLatinChars();
sl@0
  7876
		TestTextDirection();
sl@0
  7877
		
sl@0
  7878
		}
sl@0
  7879
	TUint numMilliSecs = profile.Stop();
sl@0
  7880
sl@0
  7881
	INFO_PRINTF3(_L("Performance test end %d.%d s\n"),numMilliSecs/1000,numMilliSecs%1000);
sl@0
  7882
	}
sl@0
  7883
sl@0
  7884
sl@0
  7885
void CTGlyphSelection::TestThai_SimpleChars()
sl@0
  7886
/**
sl@0
  7887
 This routine tests individual Thai base characters pumping them 
sl@0
  7888
 through the CFont::GetCharacterPosition() API.
sl@0
  7889
*/
sl@0
  7890
	{
sl@0
  7891
	TBool r;
sl@0
  7892
	CFont::TPositionParam param;
sl@0
  7893
	param.iDirection = CFont::EHorizontal;
sl@0
  7894
	param.iFlags = CFont::TPositionParam::EFLogicalOrder;
sl@0
  7895
	TBuf<5> testText(0);
sl@0
  7896
	testText.SetLength(1);
sl@0
  7897
	param.iText.Set(testText);
sl@0
  7898
sl@0
  7899
	for (TUint i=0; Thai_SimpleChars[i] != 0xFFFF; i++)
sl@0
  7900
		{
sl@0
  7901
		testText[0] = Thai_SimpleChars[i];
sl@0
  7902
		param.iPosInText = 0;
sl@0
  7903
		param.iPen.iX = param.iPen.iY = 0;
sl@0
  7904
sl@0
  7905
		r = iTestFont->GetCharacterPosition(param);
sl@0
  7906
sl@0
  7907
		TEST(r && param.iPosInText == 1 
sl@0
  7908
			   && param.iPen.iX == 10
sl@0
  7909
			   && param.iOutputGlyphs == 1 
sl@0
  7910
			   && param.iOutput[0].iCode == Thai_SimpleChars[i]);
sl@0
  7911
		}
sl@0
  7912
	}
sl@0
  7913
sl@0
  7914
sl@0
  7915
void CTGlyphSelection::TestThai_ValidGlyphClusters()
sl@0
  7916
/**
sl@0
  7917
 This routine tests combining sequences of Thai base & mark 
sl@0
  7918
 characters pumping them through the CFont::GetCharacterPosition() API.
sl@0
  7919
 The sequences mainly test the correct formation of Thay Glyph clusters
sl@0
  7920
 and the PUA substutions that take place.
sl@0
  7921
*/
sl@0
  7922
	{
sl@0
  7923
	TInt failures=0;
sl@0
  7924
	TBool r;
sl@0
  7925
	CFont::TPositionParam param;
sl@0
  7926
	param.iDirection = CFont::EHorizontal;
sl@0
  7927
	param.iFlags = CFont::TPositionParam::EFLogicalOrder;
sl@0
  7928
sl@0
  7929
	for (TUint i=0; Thai_ValidGlyphClusters[i].iTextLen != -1; i++)
sl@0
  7930
		{
sl@0
  7931
		TBuf<8> testText(Thai_ValidGlyphClusters[i].iText);
sl@0
  7932
		param.iText.Set(testText);
sl@0
  7933
		param.iPosInText = Thai_ValidGlyphClusters[i].iPosInText;
sl@0
  7934
		param.iPen.iX = param.iPen.iY = 0;
sl@0
  7935
sl@0
  7936
		r = iTestFont->GetCharacterPosition(param);
sl@0
  7937
sl@0
  7938
		if (r && param.iPosInText == Thai_ValidGlyphClusters[i].oPosInText
sl@0
  7939
			   && param.iOutputGlyphs == Thai_ValidGlyphClusters[i].oOutputLen)
sl@0
  7940
			{
sl@0
  7941
			for (TInt j=0; j<Thai_ValidGlyphClusters[i].oOutputLen; j++)
sl@0
  7942
				{
sl@0
  7943
				if (param.iOutput[j].iCode != Thai_ValidGlyphClusters[i].oOutput[j])
sl@0
  7944
					{
sl@0
  7945
					INFO_PRINTF4(_L("FAILURE: Glyph code invariance, Complex TEST(%d), %x != %x\n"), i, param.iOutput[j].iCode, Thai_ValidGlyphClusters[i].oOutput[j]);
sl@0
  7946
					failures++;
sl@0
  7947
					break;
sl@0
  7948
					}
sl@0
  7949
				}
sl@0
  7950
			}
sl@0
  7951
		else
sl@0
  7952
			{
sl@0
  7953
			INFO_PRINTF2(_L("FAILURE: Bad output result from GetCharacterPosition, Complex TEST(%d)\n"), i);
sl@0
  7954
			failures++;
sl@0
  7955
			}
sl@0
  7956
		}
sl@0
  7957
sl@0
  7958
	TEST(failures == 0);
sl@0
  7959
	}
sl@0
  7960
sl@0
  7961
sl@0
  7962
void CTGlyphSelection::TestThai_InvalidGlyphClusters()
sl@0
  7963
/**
sl@0
  7964
 This routine tests Thai base & mark cluster boundaries to ensure where 
sl@0
  7965
 requried the KUnicodeDottedCircle char is used when an invalid sequence is 
sl@0
  7966
 processed. Test data from the global Thai_GlyphClusterBoundaries 
sl@0
  7967
 variable is pumped through the CFont::GetCharacterPosition() API.
sl@0
  7968
*/
sl@0
  7969
	{
sl@0
  7970
	TInt failures=0;
sl@0
  7971
	TBool r;
sl@0
  7972
	CFont::TPositionParam param;
sl@0
  7973
	param.iDirection = CFont::EHorizontal;
sl@0
  7974
	param.iFlags = CFont::TPositionParam::EFLogicalOrder;
sl@0
  7975
sl@0
  7976
	for (TUint i=0; Thai_GlyphClusterBoundaries[i].iTextLen != -1; i++)
sl@0
  7977
		{
sl@0
  7978
		TBuf<8> testText(Thai_GlyphClusterBoundaries[i].iText);
sl@0
  7979
		param.iText.Set(testText);
sl@0
  7980
sl@0
  7981
		for (TUint k=0; k<2; k++)
sl@0
  7982
			{
sl@0
  7983
			if (Thai_GlyphClusterBoundaries[i].oOut[k].iPosInText == -1)
sl@0
  7984
				continue;
sl@0
  7985
sl@0
  7986
			param.iPosInText = Thai_GlyphClusterBoundaries[i].oOut[k].iPosInText;
sl@0
  7987
			param.iPen.iX = param.iPen.iY = 0;
sl@0
  7988
sl@0
  7989
			r = iTestFont->GetCharacterPosition(param);
sl@0
  7990
sl@0
  7991
			if (r && param.iPosInText == Thai_GlyphClusterBoundaries[i].oOut[k].oPosInText
sl@0
  7992
				   && param.iOutputGlyphs == Thai_GlyphClusterBoundaries[i].oOut[k].oOutputLen)
sl@0
  7993
				{
sl@0
  7994
				for (TInt j=0; j<Thai_GlyphClusterBoundaries[i].oOut[k].oOutputLen; j++)
sl@0
  7995
					{
sl@0
  7996
					if (!(param.iOutput[j].iCode == Thai_GlyphClusterBoundaries[i].oOut[k].oOutput[j]))
sl@0
  7997
						{
sl@0
  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]);
sl@0
  7999
						failures++;
sl@0
  8000
						break;
sl@0
  8001
						}
sl@0
  8002
					}
sl@0
  8003
				}
sl@0
  8004
			else
sl@0
  8005
				{
sl@0
  8006
				INFO_PRINTF3(_L("FAILURE: Bad output result from GetCharacterPosition, Complex TEST(%d,%d)\n"), i, k);
sl@0
  8007
				failures++;
sl@0
  8008
				}
sl@0
  8009
sl@0
  8010
			}
sl@0
  8011
		}
sl@0
  8012
sl@0
  8013
	if (failures)
sl@0
  8014
		RDebug::Print(_L("TOTAL FAILURES: %d\n"), failures);
sl@0
  8015
	TEST(failures == 0);
sl@0
  8016
	}
sl@0
  8017
sl@0
  8018
/**
sl@0
  8019
@SYMTestCaseID          GRAPHICS-SYSLIB-GDI-CT-4062
sl@0
  8020
@SYMTestCaseDesc        Tests that a punctuation character following the special-case
sl@0
  8021
                        character Thai SaraAm is rendered as a punctuation, not
sl@0
  8022
                        another SaraAm character.
sl@0
  8023
@SYMTestPriority        High
sl@0
  8024
@SYMTestActions         Compare input string and corresponding output glyph codes
sl@0
  8025
@SYMTestExpectedResults In this case, the string and the codes should match.
sl@0
  8026
@SYMDEF                 INC118424
sl@0
  8027
*/
sl@0
  8028
void CTGlyphSelection::TestThai_INC118424()
sl@0
  8029
	{
sl@0
  8030
	CFont::TPositionParam param;
sl@0
  8031
	param.iDirection = CFont::EHorizontal;
sl@0
  8032
	param.iFlags = CFont::TPositionParam::EFLogicalOrder;
sl@0
  8033
	
sl@0
  8034
	//punctuation after SaraAm
sl@0
  8035
	TestGlyphs(iTestFont,param,_L("\xE04\xE33:\?>"),_L("\xE04\xE33:\?>"));
sl@0
  8036
	}
sl@0
  8037
sl@0
  8038
/**
sl@0
  8039
 This fuction tests Indic Gurmukhi and Malayalam support
sl@0
  8040
*/
sl@0
  8041
void CTGlyphSelection::ExecuteIndicGurmukhiMalayalamTests()
sl@0
  8042
	{
sl@0
  8043
	// create a font store for testing
sl@0
  8044
	CFontStore* fontStore = CFontStore::NewL(&User::Heap());
sl@0
  8045
	
sl@0
  8046
	//load all ecom implemented rasterizer dlls. installs the rasterizer.	
sl@0
  8047
	LoadOpenFontLibraries(fontStore);
sl@0
  8048
		// test font preparation
sl@0
  8049
	fontStore->iKPixelWidthInTwips = 11860; //This value is default
sl@0
  8050
sl@0
  8051
	//add any required font files
sl@0
  8052
	TUid err1 = fontStore->AddFileL(KTestIndicFontFile);
sl@0
  8053
sl@0
  8054
	TFontSpec testIndicFontSpec(KTestIndicFontFaceName,200);
sl@0
  8055
	 
sl@0
  8056
	CFbsBitmap* bmp = new(ELeave) CFbsBitmap;
sl@0
  8057
	
sl@0
  8058
	TInt ret = bmp->Create(TSize(100,100),EGray2);
sl@0
  8059
	if (ret == KErrNotSupported)
sl@0
  8060
		return;
sl@0
  8061
	else
sl@0
  8062
		User::LeaveIfError(ret);
sl@0
  8063
sl@0
  8064
	CFbsBitmapDevice* device = NULL;
sl@0
  8065
	TRAPD(err2,device = CFbsBitmapDevice::NewL(bmp));
sl@0
  8066
	TEST(err2 == KErrNone);
sl@0
  8067
sl@0
  8068
	CFbsBitGc* gc = NULL;
sl@0
  8069
	User::LeaveIfError(device->CreateContext(gc));
sl@0
  8070
	
sl@0
  8071
	// Font file Creation
sl@0
  8072
	CFbsFont* indicFont = NULL;
sl@0
  8073
	User::LeaveIfError(device->GetNearestFontToDesignHeightInTwips(indicFont,testIndicFontSpec));
sl@0
  8074
	gc->UseFont(indicFont);
sl@0
  8075
	CleanupStack::PushL(indicFont);
sl@0
  8076
	
sl@0
  8077
	//Testcode for Kannada, Marathi,Gujarati,Bengali language
sl@0
  8078
	// Test Indic Gurmukhi digit.
sl@0
  8079
	TInt err;
sl@0
  8080
	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
sl@0
  8081
    	if (err!=KErrNone)
sl@0
  8082
    		INFO_PRINTF1(_L("Failed to record test result"));
sl@0
  8083
	INFO_PRINTF1(_L("Test Indic Gurmukhi digits"));
sl@0
  8084
	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-TI18N-GDI-CIT-4063"));
sl@0
  8085
	TestGurmukhiDigit( *indicFont );
sl@0
  8086
	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
sl@0
  8087
    	if (err!=KErrNone)
sl@0
  8088
    		INFO_PRINTF1(_L("Failed to record test result"));
sl@0
  8089
	INFO_PRINTF1(_L("Test Indic Gurmukhi and Latin"));
sl@0
  8090
	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-TI18N-GDI-CIT-4064"));
sl@0
  8091
	TestGurmukhiAndLatin( *indicFont );
sl@0
  8092
	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
sl@0
  8093
    	if (err!=KErrNone)
sl@0
  8094
    		INFO_PRINTF1(_L("Failed to record test result"));
sl@0
  8095
	INFO_PRINTF1(_L("Test Indic DEF102858 on Gurmukhi"));
sl@0
  8096
	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-TI18N-GDI-CIT-4065"));
sl@0
  8097
	TestGurmukhiModifierAfterConsonantViramaZWJ( *indicFont );
sl@0
  8098
	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
sl@0
  8099
    	if (err!=KErrNone)
sl@0
  8100
    		INFO_PRINTF1(_L("Failed to record test result"));
sl@0
  8101
	INFO_PRINTF1(_L("Test Indic Gurmukhi consonant leading"));
sl@0
  8102
	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-TI18N-GDI-CIT-4066"));
sl@0
  8103
	TestGurmukhiWithConsonantInitial( *indicFont );
sl@0
  8104
	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
sl@0
  8105
    	if (err!=KErrNone)
sl@0
  8106
    		INFO_PRINTF1(_L("Failed to record test result"));
sl@0
  8107
	INFO_PRINTF1(_L("Test Indic Gurmukhi vowel leading"));
sl@0
  8108
	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-TI18N-GDI-CIT-4068"));
sl@0
  8109
	TestGurmukhiWithVowelInitial( *indicFont );
sl@0
  8110
	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
sl@0
  8111
    	if (err!=KErrNone)
sl@0
  8112
    		INFO_PRINTF1(_L("Failed to record test result"));
sl@0
  8113
	INFO_PRINTF1(_L("Test Indic Malayalam digits"));
sl@0
  8114
	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-TI18N-GDI-CIT-4067"));
sl@0
  8115
	TestMalayalamDigit( *indicFont );
sl@0
  8116
	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
sl@0
  8117
    	if (err!=KErrNone)
sl@0
  8118
    		INFO_PRINTF1(_L("Failed to record test result"));
sl@0
  8119
	INFO_PRINTF1(_L("Test Indic Malayalam and Latin"));
sl@0
  8120
	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-TI18N-GDI-CIT-4069"));
sl@0
  8121
	TestMalayalamAndLatin( *indicFont );
sl@0
  8122
	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
sl@0
  8123
    	if (err!=KErrNone)
sl@0
  8124
    		INFO_PRINTF1(_L("Failed to record test result"));
sl@0
  8125
	INFO_PRINTF1(_L("Test Indic DEF102858 on Malayalam"));
sl@0
  8126
	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-TI18N-GDI-CIT-4070"));
sl@0
  8127
	TestMalayalamModifierAfterConsonantViramaZWJ( *indicFont );
sl@0
  8128
	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
sl@0
  8129
    	if (err!=KErrNone)
sl@0
  8130
    		INFO_PRINTF1(_L("Failed to record test result"));
sl@0
  8131
	INFO_PRINTF1(_L("Test Indic Malayalam consonant leading"));
sl@0
  8132
	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-TI18N-GDI-CIT-4071"));
sl@0
  8133
	TestMalayalamWithConsonantInitial( *indicFont );
sl@0
  8134
	TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
sl@0
  8135
    	if (err!=KErrNone)
sl@0
  8136
    		INFO_PRINTF1(_L("Failed to record test result"));
sl@0
  8137
	INFO_PRINTF1(_L("Test Indic Malayalam vowel leading"));
sl@0
  8138
	((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-TI18N-GDI-CIT-4072"));
sl@0
  8139
	TestMalayalamWithVowelInitial( *indicFont );
sl@0
  8140
	CleanupStack::Pop(indicFont);
sl@0
  8141
			
sl@0
  8142
	//Cleaning the memory
sl@0
  8143
	delete bmp;
sl@0
  8144
	delete device;
sl@0
  8145
	delete gc;
sl@0
  8146
	fontStore->RemoveFile(err1);
sl@0
  8147
	delete fontStore;
sl@0
  8148
	REComSession::FinalClose();
sl@0
  8149
	}
sl@0
  8150
/**
sl@0
  8151
 This function tests the Thai Font Rendering feature of the CFont class
sl@0
  8152
 in the GDI.dll and in particular the modifications made to 
sl@0
  8153
 CFont::GetCharacterPosition() to support the Unicocde Thai code page.
sl@0
  8154
 First introduced during the Sirocco project (A3.1.1)
sl@0
  8155
@SYMFssID Graphics/GDI/GDI/1
sl@0
  8156
@SYMFssID Graphics/GDI/GDI/2
sl@0
  8157
*/
sl@0
  8158
sl@0
  8159
void CTGlyphSelection::ExecuteThaiTests()
sl@0
  8160
	{
sl@0
  8161
	// Test individual Thai digits, letters and sign characters.
sl@0
  8162
	INFO_PRINTF1(_L("Test Thai simple charecters"));
sl@0
  8163
	TestThai_SimpleChars();
sl@0
  8164
sl@0
  8165
	// Test complex Thai char sequences.
sl@0
  8166
	INFO_PRINTF1(_L("Test valid Thai glyph clusters"));
sl@0
  8167
	TestThai_ValidGlyphClusters();
sl@0
  8168
sl@0
  8169
	// Test Thai glyph cluster boundaries.
sl@0
  8170
	INFO_PRINTF1(_L("Test invalid Thai glyph clusters"));
sl@0
  8171
	TestThai_InvalidGlyphClusters();
sl@0
  8172
sl@0
  8173
	// Test Thai SaraAm-punctuation exception.
sl@0
  8174
	INFO_PRINTF1(_L("Test fix for INC118424"));
sl@0
  8175
	TestThai_INC118424();
sl@0
  8176
	}
sl@0
  8177
sl@0
  8178
sl@0
  8179
/*  
sl@0
  8180
 * Note:
sl@0
  8181
 *       This is just a easy way to help generate the test data info
sl@0
  8182
 *       Any new added test data should do manually check firstly to check the correction before using this function
sl@0
  8183
 */
sl@0
  8184
// #define GEN_GURMUKHIMALAYALAMTESTDATA
sl@0
  8185
void CTGlyphSelection::GenerateGurmukhiMalayalamData( const TDesC& filename, const TTestInput_PositionParam6* testArray, const CFbsFont& aFont )
sl@0
  8186
    {
sl@0
  8187
    RFile file;
sl@0
  8188
    file.Replace( iFs, filename, EFileWrite );
sl@0
  8189
    
sl@0
  8190
    CFont::TPositionParam param;
sl@0
  8191
    param.iDirection = CFont::EHorizontal;
sl@0
  8192
    param.iFlags = CFont::TPositionParam::EFLogicalOrder;
sl@0
  8193
    RShapeInfo shapeInfo;
sl@0
  8194
sl@0
  8195
    if (!testArray)
sl@0
  8196
        {
sl@0
  8197
        return;
sl@0
  8198
        }
sl@0
  8199
sl@0
  8200
    for (TUint i = 0; testArray[i].iTextLen != -1; i++)
sl@0
  8201
        {
sl@0
  8202
        TTestInput_PositionParam6 currentArray = testArray[i];
sl@0
  8203
        TBuf<8> testText(testArray[i].iText);
sl@0
  8204
        param.iText.Set(testText);
sl@0
  8205
        
sl@0
  8206
        TBuf8<256> datatext;
sl@0
  8207
        datatext.SetLength(0);
sl@0
  8208
        //{ 1, {0x0a66}, { {0, 1, 1, {0x12fe} }, {-1, 1, 1, {0} } } },
sl@0
  8209
        datatext.Format(_L8("{ %d, {"), testArray[i].iTextLen);  // 1, 
sl@0
  8210
        
sl@0
  8211
        for (TUint i = 0; i<testText.Length(); i++)
sl@0
  8212
            {
sl@0
  8213
            TBuf8<8> tmp;
sl@0
  8214
            tmp.Format(_L8("0x%x, "), currentArray.iText[i]); // {0x0a66},
sl@0
  8215
            datatext.Append(tmp);
sl@0
  8216
            }
sl@0
  8217
        datatext = datatext.Left(datatext.Length()-2);
sl@0
  8218
        datatext.Append(_L8("}, { "));
sl@0
  8219
sl@0
  8220
        if (shapeInfo.IsOpen())
sl@0
  8221
            shapeInfo.Close();
sl@0
  8222
sl@0
  8223
        for (TUint k = 0; k < 6; k++)
sl@0
  8224
            {
sl@0
  8225
            param.iPosInText = k;
sl@0
  8226
            param.iPen.iX = param.iPen.iY = 0;
sl@0
  8227
            TBool ret = aFont.GetCharacterPosition2(param, shapeInfo);
sl@0
  8228
            if (0 == param.iOutputGlyphs)
sl@0
  8229
                continue;
sl@0
  8230
            
sl@0
  8231
            TBuf8<16> tmp;
sl@0
  8232
            tmp.Format(_L8("{%d, %d, %d, {"), k, param.iPosInText, param.iOutputGlyphs);
sl@0
  8233
            datatext.Append(tmp);
sl@0
  8234
            
sl@0
  8235
            for (TInt j = 0; j < param.iOutputGlyphs; j++)
sl@0
  8236
                {
sl@0
  8237
                TText16 aCode = param.iOutput[j].iCode;
sl@0
  8238
                TBuf8<128> tmp;
sl@0
  8239
                tmp.Format(_L8("0x%x, "), aCode);
sl@0
  8240
                datatext.Append(tmp);
sl@0
  8241
                } //end for
sl@0
  8242
            datatext = datatext.Left(datatext.Length()-2);
sl@0
  8243
            datatext.Append(_L8("}}, "));
sl@0
  8244
            } //end for
sl@0
  8245
        datatext.Append(_L8(" {-1, 1, 1, {0}} } }, \n"));
sl@0
  8246
        
sl@0
  8247
        file.Write(datatext);
sl@0
  8248
        } //end for
sl@0
  8249
    
sl@0
  8250
    file.Close();
sl@0
  8251
    return;
sl@0
  8252
    }
sl@0
  8253
sl@0
  8254
void CTGlyphSelection::DoEachGurmukhiMalayalamCase( const TTestInput_PositionParam6* testArray, const CFbsFont& aFont )
sl@0
  8255
	{
sl@0
  8256
	TInt failures=0;
sl@0
  8257
	TBool r;
sl@0
  8258
	CFont::TPositionParam param;
sl@0
  8259
	param.iDirection = CFont::EHorizontal;
sl@0
  8260
	param.iFlags = CFont::TPositionParam::EFLogicalOrder;
sl@0
  8261
	RShapeInfo shapeInfo;
sl@0
  8262
	
sl@0
  8263
	if ( !testArray )
sl@0
  8264
		{
sl@0
  8265
		return;
sl@0
  8266
		}
sl@0
  8267
	
sl@0
  8268
	for (TUint i=0; testArray[i].iTextLen != -1; i++)
sl@0
  8269
		{
sl@0
  8270
		TBuf<8> testText(testArray[i].iText);
sl@0
  8271
		param.iText.Set(testText);
sl@0
  8272
		if(shapeInfo.IsOpen())
sl@0
  8273
		    shapeInfo.Close();
sl@0
  8274
		
sl@0
  8275
		for (TUint k=0; k<6; k++)
sl@0
  8276
			{
sl@0
  8277
			//	If it's end of sequence
sl@0
  8278
			if ( testArray[i].oOut[k].iPosInText == -1)
sl@0
  8279
				break;
sl@0
  8280
	
sl@0
  8281
			param.iPosInText = testArray[i].oOut[k].iPosInText;
sl@0
  8282
			param.iPen.iX = param.iPen.iY = 0;
sl@0
  8283
	
sl@0
  8284
			r = aFont.GetCharacterPosition2(param, shapeInfo);
sl@0
  8285
			
sl@0
  8286
			if (r && param.iPosInText == testArray[i].oOut[k].oPosInText
sl@0
  8287
				   && param.iOutputGlyphs == testArray[i].oOut[k].oOutputLen)
sl@0
  8288
				{
sl@0
  8289
				for (TInt j=0; j<testArray[i].oOut[k].oOutputLen; j++)
sl@0
  8290
					{
sl@0
  8291
					//	Trim off the highest bit
sl@0
  8292
					TText16 aCode = param.iOutput[j].iCode;
sl@0
  8293
					if (!( aCode == testArray[i].oOut[k].oOutput[j]))
sl@0
  8294
						{
sl@0
  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]);
sl@0
  8296
						failures++;
sl@0
  8297
						break;
sl@0
  8298
						}
sl@0
  8299
					}
sl@0
  8300
				}
sl@0
  8301
			else
sl@0
  8302
				{
sl@0
  8303
				INFO_PRINTF4(_L("FAILURE: Bad output result from GetCharacterPosition, Complex TEST(%d,%d,%d)\n"), i, k, param.iOutputGlyphs);
sl@0
  8304
				failures++;
sl@0
  8305
				}
sl@0
  8306
	
sl@0
  8307
			}
sl@0
  8308
		}
sl@0
  8309
	
sl@0
  8310
	if (failures)
sl@0
  8311
		RDebug::Print(_L("TOTAL FAILURES: %d\n"), failures);
sl@0
  8312
	TEST(failures == 0);
sl@0
  8313
	}
sl@0
  8314
/**
sl@0
  8315
@SYMTestCaseID          GRAPHICS-TI18N-GDI-CIT-4063
sl@0
  8316
@SYMTestCaseDesc        Case to check Gurmukhi digit support
sl@0
  8317
@SYMTestPriority        High
sl@0
  8318
@SYMTestActions         Call to CFont::GetCharacterPosition2/CFont::MeasureText to check the following
sl@0
  8319
						1.Pass Gurmukhi digit (0xa66 ~ 0x0a6f) sequence
sl@0
  8320
						2.Pass any Consonant + Gurmukhi digit sequence 
sl@0
  8321
						3.Pass any Consonant + Gurmukhi digit + Matra sequence
sl@0
  8322
						4.Repetitive callss with Unicode sequence from the first 3 action items 
sl@0
  8323
						5.Pass Modifer + digit sequence
sl@0
  8324
						6.Pass Vowel and digit sequence
sl@0
  8325
						7.Pass Virama and digit sequence 
sl@0
  8326
@SYMTestExpectedResults 1.Glyph count, character count for digit is 1 for each digit, and glyph indices depends on font
sl@0
  8327
						2.Digit is recognized as a separate syllable
sl@0
  8328
						3.Matra and digit is not combined together
sl@0
  8329
						4.The shaper returned the same result as first 3 results
sl@0
  8330
						5.digit is recognized, and not combined with Modifier
sl@0
  8331
						6.digit is recognized, and not combined with Vowel.
sl@0
  8332
						7.digit is recognized, and not combined with Virama.
sl@0
  8333
@SYMPREQ 1922: Gurmukhi support
sl@0
  8334
*/
sl@0
  8335
void CTGlyphSelection::TestGurmukhiDigit( const CFbsFont& aFont )
sl@0
  8336
	{
sl@0
  8337
	DoEachGurmukhiMalayalamCase( (TTestInput_PositionParam6*)Indic_GurmukhiDigit, aFont );
sl@0
  8338
	
sl@0
  8339
#ifdef GEN_GURMUKHIMALAYALAMTESTDATA
sl@0
  8340
	_LIT(KValidFontPath, "c:\\GurmukhiDigit.txt");
sl@0
  8341
	GenerateGurmukhiMalayalamData(KValidFontPath, (TTestInput_PositionParam6*)Indic_GurmukhiDigit, aFont );
sl@0
  8342
#endif
sl@0
  8343
	}
sl@0
  8344
sl@0
  8345
/**
sl@0
  8346
@SYMTestCaseID          GRAPHICS-TI18N-GDI-CIT-4064
sl@0
  8347
@SYMTestCaseDesc        case to check if shaper can render Gurmukhi with other implemented Indic scripts and Latin
sl@0
  8348
@SYMTestPriority        High
sl@0
  8349
@SYMTestActions         Call to CFont::GetCharacterPosition2/CFont::MeasureText to check the following
sl@0
  8350
						1.Pass Gurmukhi sentence and Latin to the function
sl@0
  8351
						2.Pass Latin and Gurmukhi setence.
sl@0
  8352
						3.Pass syllable, Latin and syllable
sl@0
  8353
						4.Pass phoneme, Latin and phoneme
sl@0
  8354
						5.Pass Gurmukhi syllable and other Indic scripts together.
sl@0
  8355
						6.Pass Gurmukhi phoneme and other Indic script phoneme
sl@0
  8356
@SYMTestExpectedResults Gurumuki and Latin characters donĄ¯t mess up. Gurmukhi phoneme doesnĄ¯t combine with Latin into a new syllable, 
sl@0
  8357
						Gurmukhi phoneme doesnĄ¯t form a syllable with other Indic script.
sl@0
  8358
@SYMPREQ 1922: Gurmukhi support
sl@0
  8359
*/
sl@0
  8360
void CTGlyphSelection::TestGurmukhiAndLatin( const CFbsFont& aFont )
sl@0
  8361
	{
sl@0
  8362
	DoEachGurmukhiMalayalamCase( (TTestInput_PositionParam6*)Indic_GurmukhiAndLatin, aFont );
sl@0
  8363
sl@0
  8364
#ifdef GEN_GURMUKHIMALAYALAMTESTDATA
sl@0
  8365
    _LIT(KValidFontPath, "c:\\GurmukhiAndLatin.txt");
sl@0
  8366
    GenerateGurmukhiMalayalamData(KValidFontPath, (TTestInput_PositionParam6*)Indic_GurmukhiDigit, aFont );
sl@0
  8367
#endif
sl@0
  8368
	}
sl@0
  8369
sl@0
  8370
/**
sl@0
  8371
@SYMTestCaseID          GRAPHICS-TI18N-GDI-CIT-4065
sl@0
  8372
@SYMTestCaseDesc        case to check Gurmukhi modifier after Consonant, Virama, ZWJ
sl@0
  8373
@SYMTestPriority        High
sl@0
  8374
@SYMTestActions         Call to CFont::GetCharacterPosition2/CFont::MeasureText to check the following
sl@0
  8375
						1.Pass Consonant + Virama + ZWJ + Modifier
sl@0
  8376
@SYMTestExpectedResults Modifier is part of the syllable.
sl@0
  8377
@SYMPREQ 1922: Gurmukhi support, make sure DEF102858 fixing does not cause side effect
sl@0
  8378
*/
sl@0
  8379
void CTGlyphSelection::TestGurmukhiModifierAfterConsonantViramaZWJ( const CFbsFont& aFont )
sl@0
  8380
	{
sl@0
  8381
	DoEachGurmukhiMalayalamCase( (TTestInput_PositionParam6*)Indic_GurmukhiModifierAfterConsonantViramaZWJ, aFont );
sl@0
  8382
	
sl@0
  8383
#ifdef GEN_GURMUKHIMALAYALAMTESTDATA
sl@0
  8384
    _LIT(KValidFontPath, "c:\\GurmukhiModifierAfterConsonantViramaZWJ.txt");
sl@0
  8385
    GenerateGurmukhiMalayalamData(KValidFontPath, (TTestInput_PositionParam6*)Indic_GurmukhiDigit, aFont );
sl@0
  8386
#endif
sl@0
  8387
	}
sl@0
  8388
sl@0
  8389
/**
sl@0
  8390
@SYMTestCaseID          GRAPHICS-TI18N-GDI-CIT-4066
sl@0
  8391
@SYMTestCaseDesc        case to check syllable with consonant in initial position
sl@0
  8392
@SYMTestPriority        High
sl@0
  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.
sl@0
  8394
						1.Pass  consonant and Nukta sequence
sl@0
  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..
sl@0
  8396
						3.Pass consonant and matra /i/ t sequence 
sl@0
  8397
						4.Pass the following Consonant, Virama and HA sequence 
sl@0
  8398
						  Another sequence:  Consonant , Virama and RA
sl@0
  8399
						  Another sequence:  Consonant, Virama and VA
sl@0
  8400
						  Another sequence:  Consonant, Virama and YA
sl@0
  8401
						5.Pass Consonant  and Addak sequence to shaper 
sl@0
  8402
						  Pass Consonant, Addak and Consonant to shaper
sl@0
  8403
						6.Pass Consonant and BINDI sequence:  
sl@0
  8404
						  Sequence1:Consonant and BINDI,
sl@0
  8405
						  Sequence2: Consonant, dependent vowel which is shown to the right of base consonant and BINDI,
sl@0
  8406
						  Sequence3: Consonant, dependent vowel which is shown to the top of the base consonant and BINDI
sl@0
  8407
						  Pass Consonant and TIPPI sequence:
sl@0
  8408
						  Sequence1: Consonant and TIPPI, 
sl@0
  8409
						  Sequence2: Consonant, dependent vowel which is shown to the left of the base consonant and TIPPI.
sl@0
  8410
						  Sequence3: Consonant, dependent vowel which is shown to the bottom of the base consonant and TIPPI.
sl@0
  8411
						7.Pass Nukta, equavalent consonant, Nukta sequence to shaper sepeartely, save both result
sl@0
  8412
@SYMTestExpectedResults 1.nukta is combined to the base consonant according to the returned shape info
sl@0
  8413
						2.The matra position is different between two ShapeText calls according to the returned shaped info.
sl@0
  8414
						3.matra /i/ is combined to the left of the base consonant in position
sl@0
  8415
						4.HA, RA, VA is on bottom of the base consonant and subscripted, YA in final form according to the returned shape info.
sl@0
  8416
						5.Addak is on top of consonant, addak belongs to the consonant precedes it.
sl@0
  8417
						6.BINDI is on top,  TIPPI is on bottom
sl@0
  8418
						7.The combinationĄ¯s character count, glyph count, glyph indices info is the same as  the single nuktaĄ¯s
sl@0
  8419
@SYMPREQ 1922: Gurmukhi support
sl@0
  8420
*/
sl@0
  8421
void CTGlyphSelection::TestGurmukhiWithConsonantInitial( const CFbsFont& aFont )
sl@0
  8422
	{
sl@0
  8423
	DoEachGurmukhiMalayalamCase( (TTestInput_PositionParam6*)Indic_GurmukhiConsonantLeading, aFont );
sl@0
  8424
	
sl@0
  8425
#ifdef GEN_GURMUKHIMALAYALAMTESTDATA
sl@0
  8426
    _LIT(KValidFontPath, "c:\\GurmukhiWithConsonantInitial.txt");
sl@0
  8427
    GenerateGurmukhiMalayalamData(KValidFontPath, (TTestInput_PositionParam6*)Indic_GurmukhiDigit, aFont );
sl@0
  8428
#endif
sl@0
  8429
	}
sl@0
  8430
sl@0
  8431
sl@0
  8432
/**
sl@0
  8433
@SYMTestCaseID          GRAPHICS-TI18N-GDI-CIT-4067
sl@0
  8434
@SYMTestCaseDesc        Case to check Malayalam digit support
sl@0
  8435
@SYMTestPriority        High
sl@0
  8436
@SYMTestActions         Call to CFont::GetCharacterPosition2/CFont::MeasureText to check the following
sl@0
  8437
						1.Pass Malayalam digit (0xd66 ~ 0x0d6f) sequence
sl@0
  8438
						2.Pass any Consonant + Malayalam digit sequence 
sl@0
  8439
						3.Pass any Consonant + Malayalam digit + Matra sequence
sl@0
  8440
						4.Repetitive callss with Unicode sequence from the first 3 action items 
sl@0
  8441
						5.Pass Modifer + digit sequence
sl@0
  8442
						6.Pass Vowel and digit sequence
sl@0
  8443
						7.Pass Virama and digit sequence 
sl@0
  8444
@SYMTestExpectedResults 1.Glyph count, character count for digit is 1 for each digit, and glyph indices depends on font
sl@0
  8445
						2.Digit is recognized as a separate syllable
sl@0
  8446
						3.Matra and digit is not combined together
sl@0
  8447
						4.The shaper returned the same result as first 3 results
sl@0
  8448
						5.digit is recognized, and not combined with Modifier
sl@0
  8449
						6.digit is recognized, and not combined with Vowel.
sl@0
  8450
						7.digit is recognized, and not combined with Virama.
sl@0
  8451
@SYMPREQ 1922: Malayalam support
sl@0
  8452
*/
sl@0
  8453
void CTGlyphSelection::TestMalayalamDigit( const CFbsFont& aFont )
sl@0
  8454
	{
sl@0
  8455
	DoEachGurmukhiMalayalamCase( (TTestInput_PositionParam6*)Indic_MalayalamDigit, aFont );
sl@0
  8456
	
sl@0
  8457
#ifdef GEN_GURMUKHIMALAYALAMTESTDATA
sl@0
  8458
    _LIT(KValidFontPath, "c:\\MalayalamDigit.txt");
sl@0
  8459
    GenerateGurmukhiMalayalamData(KValidFontPath, (TTestInput_PositionParam6*)Indic_GurmukhiDigit, aFont );
sl@0
  8460
#endif	
sl@0
  8461
	}
sl@0
  8462
sl@0
  8463
/**
sl@0
  8464
@SYMTestCaseID          GRAPHICS-TI18N-GDI-CIT-4068
sl@0
  8465
@SYMTestCaseDesc        case to check syllable with vowel in initial position
sl@0
  8466
@SYMTestPriority        High
sl@0
  8467
@SYMTestActions         Call to CFont::GetCharacterPosition2/CFont::MeasureText to check the following using data from above requirements, 
sl@0
  8468
						each requirement above gives a vowel leading Unicode sequence. Each sequence falls into one of the following structure, 
sl@0
  8469
						then pass it to the calling.
sl@0
  8470
						1.Pass ARA, IRI to shaper, pass URA sequence
sl@0
  8471
						2.Pass valid bearer  and vowel pair sequence
sl@0
  8472
						  Pass invalid bearer and vowel pair sequence
sl@0
  8473
@SYMTestExpectedResults 1.ARA character count is 1, IRI, URA character count is 0
sl@0
  8474
						2.valid combination is combined together, invalid is not combined together
sl@0
  8475
@SYMPREQ 1922: Gurmukhi support
sl@0
  8476
*/
sl@0
  8477
void CTGlyphSelection::TestGurmukhiWithVowelInitial( const CFbsFont& aFont )
sl@0
  8478
	{
sl@0
  8479
	DoEachGurmukhiMalayalamCase( (TTestInput_PositionParam6*)Indic_GurmukhiVowelLeading, aFont );
sl@0
  8480
	
sl@0
  8481
#ifdef GEN_GURMUKHIMALAYALAMTESTDATA
sl@0
  8482
    _LIT(KValidFontPath, "c:\\GurmukhiWithVowelInitial.txt");
sl@0
  8483
    GenerateGurmukhiMalayalamData(KValidFontPath, (TTestInput_PositionParam6*)Indic_GurmukhiDigit, aFont );
sl@0
  8484
#endif  
sl@0
  8485
	}
sl@0
  8486
sl@0
  8487
/**
sl@0
  8488
@SYMTestCaseID          GRAPHICS-TI18N-GDI-CIT-4069
sl@0
  8489
@SYMTestCaseDesc        case to check if shaper can render Malayalam with other implemented Indic scripts and Latin
sl@0
  8490
@SYMTestPriority        High
sl@0
  8491
@SYMTestActions         Call to CFont::GetCharacterPosition2/CFont::MeasureText to check the following
sl@0
  8492
						1.Pass Malayalam sentence and Latin to the function
sl@0
  8493
						2.Pass Latin and Gurmukhi setence.
sl@0
  8494
						3.Pass syllable, Latin and syllable
sl@0
  8495
						4.Pass phoneme, Latin and phoneme
sl@0
  8496
						5.Pass Malayalam syllable and other Indic scripts together.
sl@0
  8497
						6.Pass Malayalam phoneme and other Indic script phoneme
sl@0
  8498
@SYMTestExpectedResults Malayalam and Latin characters donĄ¯t mess up. Malayalam phoneme doesnĄ¯t combine with Latin into a new syllable, 
sl@0
  8499
						Malayalam phoneme doesnĄ¯t form a syllable with other Indic script.
sl@0
  8500
@SYMPREQ 1922: Malayalam support
sl@0
  8501
*/
sl@0
  8502
void CTGlyphSelection::TestMalayalamAndLatin( const CFbsFont& aFont )
sl@0
  8503
	{
sl@0
  8504
	DoEachGurmukhiMalayalamCase( (TTestInput_PositionParam6*)Indic_MalayalamAndLatin, aFont );
sl@0
  8505
	
sl@0
  8506
#ifdef GEN_GURMUKHIMALAYALAMTESTDATA
sl@0
  8507
    _LIT(KValidFontPath, "c:\\MalayalamAndLatin.txt");
sl@0
  8508
    GenerateGurmukhiMalayalamData(KValidFontPath, (TTestInput_PositionParam6*)Indic_GurmukhiDigit, aFont );
sl@0
  8509
#endif  
sl@0
  8510
	}
sl@0
  8511
sl@0
  8512
/**
sl@0
  8513
@SYMTestCaseID          GRAPHICS-TI18N-GDI-CIT-4070
sl@0
  8514
@SYMTestCaseDesc        case to check  Malayalam modifier after Consonant, Virama, ZWJ
sl@0
  8515
@SYMTestPriority        High
sl@0
  8516
@SYMTestActions         Call to CFont::GetCharacterPosition2/CFont::MeasureText to check the following
sl@0
  8517
						1. Pass Consonant + Virama + ZWJ + Modifier
sl@0
  8518
@SYMTestExpectedResults Modifier is part of the syllable.
sl@0
  8519
@SYMPREQ 1922: Malayalam support, make sure DEF102858 fixing does not cause side effect 
sl@0
  8520
*/
sl@0
  8521
void CTGlyphSelection::TestMalayalamModifierAfterConsonantViramaZWJ( const CFbsFont& aFont )
sl@0
  8522
	{
sl@0
  8523
	DoEachGurmukhiMalayalamCase( (TTestInput_PositionParam6*)Indic_MalayalamModifierAfterConsonantViramaZWJ, aFont );
sl@0
  8524
	
sl@0
  8525
#ifdef GEN_GURMUKHIMALAYALAMTESTDATA
sl@0
  8526
    _LIT(KValidFontPath, "c:\\MalayalamModifierAfterConsonantViramaZWJ.txt");
sl@0
  8527
    GenerateGurmukhiMalayalamData(KValidFontPath, (TTestInput_PositionParam6*)Indic_GurmukhiDigit, aFont );
sl@0
  8528
#endif  
sl@0
  8529
	}
sl@0
  8530
sl@0
  8531
/**
sl@0
  8532
@SYMTestCaseID          GRAPHICS-TI18N-GDI-CIT-4071
sl@0
  8533
@SYMTestCaseDesc        case to check syllable with consonant in initial position
sl@0
  8534
@SYMTestPriority        High
sl@0
  8535
@SYMTestActions         Call to CFont::GetCharacterPosition2/CFont::MeasureText to check the following using data from above requirements, 
sl@0
  8536
						each requirement above gives a consonant leading Unicode sequence. Each sequence falls into one of the following structure, 
sl@0
  8537
						then pass it to the calling.
sl@0
  8538
						1.Pass consonant + vowel single code, and  consonant + its split representation to shaper
sl@0
  8539
						  The following Single representation /Split representation is passed to shaper
sl@0
  8540
						  0x0d14/0x0d12 + 0x0d57, 0x0d4a/0x0d46 + 0x0d3e, 0x0d4b/0x0d47 + 0x0d3e
sl@0
  8541
						  0x0d4c/0x0d46 + 0x0d57
sl@0
  8542
						2.Pass two Consonant and dependent Vowel sequences to shaper, save both returned results. 
sl@0
  8543
						  The Consonant is first sequence is difference with that of the second sequence, and the dependent Vowel is identical.
sl@0
  8544
						3.Pass Consonant and Matras /-e/, /-ee/, /-ai/ to shaper. 
sl@0
  8545
						4.Pass Consonant and Matras /-o/, /-oo/, /-au/ to shaper
sl@0
  8546
						  Pass Consonant and 0x0d4c (first form of Matra /-au/ ) to shaper,
sl@0
  8547
						  Pass Consonant, 0x0d46 and 0x0d57 (second form of Matra /-au/) to shaper002E
sl@0
  8548
						5.Pass Consonant + 0x0d4d + Consonant to shaper
sl@0
  8549
						  Pass Consonant + Virama + Consonant + 0x0d4d to shaper
sl@0
  8550
						6.Pass Consonant (NNA, NA, RA, LA, LLA) + Virama + ZWJ to shaper
sl@0
  8551
						  Pass KA + Virama + ZWJ to shaper.
sl@0
  8552
						  Pass other Consonant + Virama + ZWJ to shaper.
sl@0
  8553
						7.Pass RA + Virama + ZWJ to shaper,
sl@0
  8554
						  Pass RRA + Viram + ZWJ to shaper.
sl@0
  8555
						8.Pass Chillu ( one of 6 special consontants + Virama + ZWJ) and Vowel to shaper
sl@0
  8556
						  Pass Chillu and Modifier to shaper
sl@0
  8557
						  Pass Chillu and Virama to shaper
sl@0
  8558
						9.Pass one of (KA, GA, PA, BA, MA, LA, SHA, SA, HA), Virama and LA to shaper
sl@0
  8559
						10.Pass CA, Virama and CA to shaper
sl@0
  8560
						   Pass BA, Virama and BA to shaper
sl@0
  8561
						   Pass YA, Virama and YA to shaper
sl@0
  8562
						   Pass VA, Virama and VA to shaper
sl@0
  8563
						   PASS other Consonant, Virama and the same Consonant to shaper.
sl@0
  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.
sl@0
  8565
						12.Pass Consonant clusters from REQ1.3.11 to shaper.
sl@0
  8566
						13.Pass S.RR.RRA to shaper,
sl@0
  8567
						   Pass N.RR.RRA to shaper
sl@0
  8568
@SYMTestExpectedResults 1.First sequence is equivalent to the second sequence 
sl@0
  8569
						2.The dependent vowel position is different between the two sequence
sl@0
  8570
						3.The visual position of the Matras is different with the logical order (The same as Keyboard input order).
sl@0
  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.
sl@0
  8572
						5.0x0d4d is recognized as a Virama in first sequence, itĄ¯s recognized as MATRA (mid-u sound) in the second sequence
sl@0
  8573
						6.Virama and ZWJ is interpreted as Chillaksharam for the 6 consonants, for others itĄ¯s not interpreted that way.
sl@0
  8574
						7.Both sequences will interprete RA Chillu.
sl@0
  8575
						8.The combining character should not combine with Chillu.
sl@0
  8576
						9.LA takes subscript shape.
sl@0
  8577
						10.CA, BA, YA, VA double should result in a ligature, other consonants donĄ¯t.
sl@0
  8578
						11.The latter consonant in the cluster becomes a miniature subscript.
sl@0
  8579
						12.sequence forms a ligature.
sl@0
  8580
						13.sequence forms a ligature
sl@0
  8581
@SYMPREQ 1922: Malayalam support
sl@0
  8582
*/
sl@0
  8583
void CTGlyphSelection::TestMalayalamWithConsonantInitial( const CFbsFont& aFont )
sl@0
  8584
	{
sl@0
  8585
	DoEachGurmukhiMalayalamCase( (TTestInput_PositionParam6*)Indic_MalayalamConsonantLeading, aFont );
sl@0
  8586
	
sl@0
  8587
#ifdef GEN_GURMUKHIMALAYALAMTESTDATA
sl@0
  8588
    _LIT(KValidFontPath, "c:\\MalayalamWithConsonantInitial.txt");
sl@0
  8589
    GenerateGurmukhiMalayalamData(KValidFontPath, (TTestInput_PositionParam6*)Indic_GurmukhiDigit, aFont );
sl@0
  8590
#endif  
sl@0
  8591
	}
sl@0
  8592
sl@0
  8593
/**
sl@0
  8594
@SYMTestCaseID          GRAPHICS-TI18N-GDI-CIT-4072
sl@0
  8595
@SYMTestCaseDesc        case to check if shaper can render Malayalam with other implemented Indic scripts and Latin
sl@0
  8596
@SYMTestPriority        High
sl@0
  8597
@SYMTestActions         Call to CFont::GetCharacterPosition2/CFont::MeasureText to check the following
sl@0
  8598
						1.Pass Malayalam sentence and Latin to the function
sl@0
  8599
						2.Pass Latin and Malayalam setence.
sl@0
  8600
						3.Pass syllable, Latin and syllable
sl@0
  8601
						4.Pass phoneme, Latin and phoneme
sl@0
  8602
						5.Pass Malayalam syllable and other Indic scripts together.
sl@0
  8603
						6.Pass Malayalam phoneme and other Indic script phoneme
sl@0
  8604
@SYMTestExpectedResults Malayalam and Latin characters donĄ¯t mess up. Malayalam phoneme doesnĄ¯t combine with Latin into a new syllable, 
sl@0
  8605
						Malayalam phoneme doesnĄ¯t form a syllable with other Indic script.
sl@0
  8606
@SYMPREQ 1922: Malayalam support
sl@0
  8607
*/
sl@0
  8608
void CTGlyphSelection::TestMalayalamWithVowelInitial( const CFbsFont& aFont )
sl@0
  8609
	{
sl@0
  8610
	DoEachGurmukhiMalayalamCase( (TTestInput_PositionParam6*)Indic_MalayalamVowelLeading, aFont );
sl@0
  8611
	
sl@0
  8612
#ifdef GEN_GURMUKHIMALAYALAMTESTDATA
sl@0
  8613
    _LIT(KValidFontPath, "c:\\MalayalamWithVowelInitial.txt");
sl@0
  8614
    GenerateGurmukhiMalayalamData(KValidFontPath, (TTestInput_PositionParam6*)Indic_GurmukhiDigit, aFont );
sl@0
  8615
#endif 
sl@0
  8616
	}
sl@0
  8617
sl@0
  8618
sl@0
  8619
//--------------
sl@0
  8620
sl@0
  8621
__CONSTRUCT_STEP__(GlyphSelection)
sl@0
  8622
sl@0
  8623
void CTGlyphSelectionStep::TestSetupL()
sl@0
  8624
	{
sl@0
  8625
#ifdef _GLOWCODE_LAUNCH_DELAY
sl@0
  8626
	INFO_PRINTF1(_L("Time delay...."));
sl@0
  8627
	TTime t1, t2;
sl@0
  8628
	t1.UniversalTime();
sl@0
  8629
	t1 += TTimeIntervalSeconds(15);
sl@0
  8630
	do 
sl@0
  8631
		{
sl@0
  8632
		t2.UniversalTime();
sl@0
  8633
		}
sl@0
  8634
	while (t2 < t1);
sl@0
  8635
#endif
sl@0
  8636
	}