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