os/textandloc/charconvfw/charconvplugins/test/rtest/tsrc/main/t_builtin.cpp
author sl@SLION-WIN7.fritz.box
Fri, 15 Jun 2012 03:10:57 +0200
changeset 0 bde4ae8d615e
permissions -rw-r--r--
First public contribution.
     1 /*
     2 * Copyright (c) 1997-2010 Nokia Corporation and/or its subsidiary(-ies).
     3 * All rights reserved.
     4 * This component and the accompanying materials are made available
     5 * under the terms of "Eclipse Public License v1.0"
     6 * which accompanies this distribution, and is available
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
     8 *
     9 * Initial Contributors:
    10 * Nokia Corporation - initial contribution.
    11 *
    12 * Contributors:
    13 *
    14 * Description: 
    15 *
    16 */
    17 
    18 
    19 #include <e32std.h>
    20 #include <e32base.h>
    21 #include <f32file.h>
    22 #include <charconv.h>
    23 #include "t_builtin.h"
    24 
    25 /**
    26 * Work around for DEF063276.
    27 * This literal is now loaded from a z:\test\data\KOriginalSms7Bit.dat
    28 * Bullseye Coverage corrupts this literal at position \x1b\x30 to \x1b\x37
    29 * to avoid this literal is stored in a file as to not be touched by Bullseye Coverage.
    30 */
    31 
    32 /*
    33 _LIT8(KOriginalSms7Bit, "\
    34 \x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\
    35 \x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a    \x1c\x1d\x1e\x1f\
    36 \x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\
    37 \x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f\
    38 \x40\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f\
    39 \x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f\
    40 \x60\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f\
    41 \x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f\
    42 \x1b\x00\x1b\x01\x1b\x02\x1b\x03\x1b\x04\x1b\x05\x1b\x06\x1b\x07\x1b\x08\x1b\x09\x1b\x0a\x1b\x0b\x1b\x0c\x1b\x0d\x1b\x0e\x1b\x0f\
    43 \x1b\x10\x1b\x11\x1b\x12\x1b\x13\x1b\x14\x1b\x15\x1b\x16\x1b\x17\x1b\x18\x1b\x19\x1b\x1a\x1b\x1b\x1b\x1c\x1b\x1d\x1b\x1e\x1b\x1f\
    44 \x1b\x20\x1b\x21\x1b\x22\x1b\x23\x1b\x24\x1b\x25\x1b\x26\x1b\x27\x1b\x28\x1b\x29\x1b\x2a\x1b\x2b\x1b\x2c\x1b\x2d\x1b\x2e\x1b\x2f\
    45 \x1b\x30\x1b\x31\x1b\x32\x1b\x33\x1b\x34\x1b\x35\x1b\x36\x1b\x37\x1b\x38\x1b\x39\x1b\x3a\x1b\x3b\x1b\x3c\x1b\x3d\x1b\x3e\x1b\x3f\
    46 \x1b\x40\x1b\x41\x1b\x42\x1b\x43\x1b\x44\x1b\x45\x1b\x46\x1b\x47\x1b\x48\x1b\x49\x1b\x4a\x1b\x4b\x1b\x4c\x1b\x4d\x1b\x4e\x1b\x4f\
    47 \x1b\x50\x1b\x51\x1b\x52\x1b\x53\x1b\x54\x1b\x55\x1b\x56\x1b\x57\x1b\x58\x1b\x59\x1b\x5a\x1b\x5b\x1b\x5c\x1b\x5d\x1b\x5e\x1b\x5f\
    48 \x1b\x60\x1b\x61\x1b\x62\x1b\x63\x1b\x64\x1b\x65\x1b\x67\x1b\x67\x1b\x68\x1b\x69\x1b\x6a\x1b\x6b\x1b\x6c\x1b\x6d\x1b\x6e\x1b\x6f\
    49 \x1b\x70\x1b\x71\x1b\x72\x1b\x73\x1b\x74\x1b\x75\x1b\x76\x1b\x77\x1b\x78\x1b\x79\x1b\x7a\x1b\x7b\x1b\x7c\x1b\x7d\x1b\x7e\x1b\x7f");
    50 */
    51 
    52 
    53 _LIT8(KExpectedSms7Bit, "\
    54 \x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\
    55 \x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a    \x1c\x1d\x1e\x1f\
    56 \x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\
    57 \x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f\
    58 \x40\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f\
    59 \x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f\
    60 \x60\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f\
    61 \x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f\
    62 \x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x1b\x0a\x0b\x0c\x0d\x0e\x0f\
    63 \x10\x11\x12\x13\x1b\x14\x15\x16\x17\x18\x19\x1a\x3f\x1c\x1d\x1e\x1f\
    64 \x20\x21\x22\x23\x24\x25\x26\x27\x1b\x28\x1b\x29\x2a\x2b\x2c\x2d\x2e\x1b\x2f\
    65 \x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x1b\x3c\x1b\x3d\x1b\x3e\x3f\
    66 \x1b\x40\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f\
    67 \x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f\
    68 \x60\x61\x62\x63\x64\x1b\x65\x67\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f\
    69 \x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f");
    70 _LIT16(KExpectedUnicodeFromSms7Bit, "\
    71 \x0040\x00a3$\x00a5\x00e8\x00e9\x00f9\x00ec\x00f2\x00e7\x000a\x00d8\x00f8\x000d\x00c5\x00e5\
    72 \x0394\x005f\x03a6\x0393\x039b\x03a9\x03a0\x03a8\x03a3\x0398\x039e    \x00c6\x00e6\x00df\x00c9\
    73 \x0020!\"#\x00a4%&'()*+,-./0123456789:;<=>?\
    74 \x00a1\x0041\x0042\x0043\x0044\x0045\x0046GHIJKLMNOPQRSTUVWXYZ\x00c4\x00d6\x00d1\x00dc\x00a7\
    75 \x00bf\x0061\x0062\x0063\x0064\x0065\x0066ghijklmnopqrstuvwxyz\x00e4\x00f6\x00f1\x00fc\x00e0\
    76 \x0040\x00a3$\x00a5\x00e8\x00e9\x00f9\x00ec\x00f2\x00c7\x000c\x00d8\x00f8\x000d\x00c5\x00e5\
    77 \x0394\x005f\x03a6\x0393\x005e\x03a9\x03a0\x03a8\x03a3\x0398\x039e\xfffd\x00c6\x00e6\x00df\x00c9\
    78 \x0020!\"#\x00a4%&'{}*+,-.\\0123456789:;[~]?\
    79 |\x0041\x0042\x0043\x0044\x0045\x0046GHIJKLMNOPQRSTUVWXYZ\x00c4\x00d6\x00d1\x00dc\x00a7\
    80 \x00bf\x0061\x0062\x0063\x0064\x20ac\x0067ghijklmnopqrstuvwxyz\x00e4\x00f6\x00f1\x00fc\x00e0");
    81 
    82 
    83 
    84 // 1 line of the original defect data from email in unicode
    85 	_LIT16(KEmailToConvert, "\
    86 \x006C\x0069\x006E\x0065\x0020\x0065\x006E\x0064\x0073\x0020\x0069\
    87 \x006E\x0020\x006A\x0061\x0070\x0061\x006E\x0065\x0073\x0065\x0020\
    88 \x3075\x3064\x3059\x3057\x306B\x3072\x3080\x000d\x000a");
    89 
    90 
    91 
    92 	// the expected result when converted to ISO2022JP
    93 _LIT8(KExpectedIso2022jp, "\
    94 \x6C\x69\x6E\x65\x20\x65\x6E\x64\x73\x20\x69\x6E\x20\
    95 \x6A\x61\x70\x61\x6E\x65\x73\x65\x20\x1B\x24\x42\x24\x55\x24\x44\
    96 \x24\x39\x24\x37\x24\x4B\x24\x52\x24\x60\x1B\x28\x42\x0D\x0A");
    97 //\x1B\x28\x4A");
    98 
    99 // 1 line of the original defect data from email in unicode
   100 	_LIT16(KEmailEndingInJapanese, "\
   101 \x006C\x0069\x006E\x0065\x0020\x0065\x006E\x0064\x0073\x0020\x0069\
   102 \x006E\x0020\x006A\x0061\x0070\x0061\x006E\x0065\x0073\x0065\x0020\
   103 \x3075\x3064\x3059\x3057\x306B\x3072\x3080");
   104 
   105 	// the expected result when converted to ISO2022JP
   106 _LIT8(KExpectedEmailEndingInJapanese, "\
   107 \x6C\x69\x6E\x65\x20\x65\x6E\x64\x73\x20\x69\x6E\x20\
   108 \x6A\x61\x70\x61\x6E\x65\x73\x65\x20\x1B\x24\x42\x24\x55\x24\x44\
   109 \x24\x39\x24\x37\x24\x4B\x24\x52\x24\x60\x1B\x28\x42");
   110 
   111 _LIT(KOriginalSms7BitFile, "z:\\test\\data\\KOriginalSms7Bit.dat");
   112 
   113 #define test(cond)                                  \
   114     {                                               \
   115     TBool __bb = (cond);                            \
   116     TEST(__bb);                                     \
   117     if (!__bb)                                      \
   118         {                                           \
   119         ERR_PRINTF1(_L("ERROR: Test Failed"));      \
   120         User::Leave(1);                             \
   121         }                                           \
   122     }
   123 
   124 
   125 // this is the test plugin implementation ID in rather than KCharacterSetIdentifierShiftJis
   126 const TUint KCharacterSetTestShiftJisKddiau=0x01000001;
   127 
   128 /**
   129 * Utility for DEF063276 fix.
   130 */
   131 
   132 void CT_BUILTIN::ReadDesc(TDes8& aDes, const TDesC& aFilename, RFs& aFs)
   133 	{
   134 	RFile file;
   135 	TInt err = file.Open(aFs, aFilename, EFileRead);
   136 	test(err == KErrNone);
   137 	CleanupClosePushL(file);
   138 
   139 	err = file.Read(aDes);
   140 	test(err == KErrNone);
   141 	CleanupStack::PopAndDestroy(&file);
   142 	}
   143 
   144 ///////////////////////////////////////////////////////////////////////////////////////
   145 ///////////////////////////////////////////////////////////////////////////////////////
   146 /**
   147 @SYMTestCaseID          SYSLIB-CHARCONV-CT-0499
   148 @SYMTestCaseDesc        Tests for conversion of SMS 7 bit data to Unicode, and from Unicode to original data
   149 @SYMTestPriority        Medium
   150 @SYMTestActions         Tests for CCnvCharacterSetConverter::ConvertToUnicode(),CCnvCharacterSetConverter::ConvertFromUnicode()
   151 @SYMTestExpectedResults Test must not fail
   152 @SYMREQ                 REQ0000
   153 */
   154 void CT_BUILTIN::TestFix_EDNJJUN_4RWH2A(CCnvCharacterSetConverter& aCharacterSetConverter, RFs& aFileServerSession, CArrayFix<CCnvCharacterSetConverter::SCharacterSet>& aArrayOfCharacterSetsAvailable)
   155 	{
   156 	INFO_PRINTF1(_L(" @SYMTestCaseID:SYSLIB-CHARCONV-CT-0499 "));
   157 	TBuf16<300> generatedUnicode;
   158 	TBuf8<300> generatedSms7Bit;
   159 	TRAPD(errCode, aCharacterSetConverter.PrepareToConvertToOrFromL(KCharacterSetIdentifierSms7Bit, aArrayOfCharacterSetsAvailable, aFileServerSession));
   160 	test(errCode == KErrNone);
   161 	TInt state=CCnvCharacterSetConverter::KStateDefault;
   162 
   163 	// Fix for DEF063276.
   164 
   165 	TBuf8<400> buf;
   166 	ReadDesc(buf, KOriginalSms7BitFile, aFileServerSession);
   167 
   168 	test(aCharacterSetConverter.ConvertToUnicode(generatedUnicode, buf, state)==0);
   169 	// End fix.
   170 
   171 	test(generatedUnicode.Length()==259);
   172 	test(generatedUnicode==KExpectedUnicodeFromSms7Bit);
   173 	test(state==CCnvCharacterSetConverter::KStateDefault);
   174 	test(aCharacterSetConverter.ConvertFromUnicode(generatedSms7Bit, generatedUnicode)==0);
   175 	test(generatedSms7Bit.Length()==269);
   176 	test(generatedSms7Bit==KExpectedSms7Bit);
   177 	}
   178 
   179 /**
   180 Test_DEF049749 test code for DEF049749 - Char convs don t handle correcly Shift JIS emoji
   181 
   182 @SYMTestCaseID          SYSLIB-CHARCONV-CT-0500
   183 @SYMTestCaseDesc        Tests for defect number DEF049749
   184 @SYMTestPriority        Medium
   185 @SYMTestActions         Tests for conversion from Shift JIS Emoji character set to Unicode
   186                         Tests for CCnvCharacterSetConverter::EErrorIllFormedInput error flag
   187 @SYMTestExpectedResults Test must not fail
   188 @SYMREQ                 REQ0000
   189 */
   190 void CT_BUILTIN::Test_DEF049749(CCnvCharacterSetConverter& aCharacterSetConverter, RFs& aFileServerSession, CArrayFix<CCnvCharacterSetConverter::SCharacterSet>& aArrayOfCharacterSetsAvailable)
   191 	{
   192 	// original defect data
   193 	_LIT8(KCodeToConvert, "\xF8\x9F\xF8\x9F\x81\x40\x3B\x3B\x3B\x3B");
   194 	_LIT16(KExpectedUnicode, "\xFFFD\xFFFD\x3000\x003b\x003b\x003b\x003b");
   195 	TBuf16<300> generatedUnicode;
   196 
   197 	// check now able to convert the original defect data
   198 	TRAPD(errCode, aCharacterSetConverter.PrepareToConvertToOrFromL(KCharacterSetTestShiftJisKddiau, aArrayOfCharacterSetsAvailable, aFileServerSession));
   199 	test(errCode == KErrNone);
   200 	TInt state=CCnvCharacterSetConverter::KStateDefault;
   201 	TInt ret = aCharacterSetConverter.ConvertToUnicode(generatedUnicode, KCodeToConvert, state);
   202 
   203 	// in DEF049749 CCnvCharacterSetConverter::EErrorIllFormedInput was incorrectly returned.
   204 	// rather than the number of unconverted bytes left, which should be 0
   205 	test(ret ==0);
   206 	test(generatedUnicode==KExpectedUnicode);
   207 
   208 	INFO_PRINTF1(_L(" @SYMTestCaseID:SYSLIB-CHARCONV-CT-0500 User-defined ShiftJIS region->FFFD "));
   209 	/* check the user defined region (ref CJKV Ken Lunde page206)
   210 	F040-F97E and F080-F9FC */
   211 	TBuf8<300> sampleUserDefined;
   212 	for (TInt leadByte = 0xF0; leadByte != 0xF9; leadByte++)
   213 		{
   214 		// a leadbyte missing the trail byte then another character
   215 		sampleUserDefined.Format(_L8("%c\x3F"), leadByte);
   216 		_LIT16(KExpectedUnicode4, "\xFFFD\x3F");
   217 		TRAP(errCode, aCharacterSetConverter.PrepareToConvertToOrFromL(KCharacterSetTestShiftJisKddiau, aArrayOfCharacterSetsAvailable, aFileServerSession));
   218 		test(errCode == KErrNone);
   219 		ret = aCharacterSetConverter.ConvertToUnicode(generatedUnicode, sampleUserDefined, state);
   220 		test(ret ==0);
   221 		test(generatedUnicode==KExpectedUnicode4);
   222 
   223 		// a single leadbyte missing the trail byte
   224 		sampleUserDefined.Format(_L8("%c"), leadByte);
   225 		TRAP(errCode, aCharacterSetConverter.PrepareToConvertToOrFromL(KCharacterSetTestShiftJisKddiau, aArrayOfCharacterSetsAvailable, aFileServerSession));
   226 		test(errCode == KErrNone);
   227 		ret = aCharacterSetConverter.ConvertToUnicode(generatedUnicode, sampleUserDefined, state);
   228 		test(ret == CCnvCharacterSetConverter::EErrorIllFormedInput);
   229 
   230 		// Default version of Shift-JIS converter now contains mappings for ezweb private use
   231 		// in range 0xF7BC to 0xF7FC so following tests would fail in this area - JG 30/06/2005
   232 		if ((leadByte < 0xF3) || (leadByte > 0xF7))
   233 			{
   234 			for (TInt trailbyte = 0x40; trailbyte != 0xFD;
   235 				trailbyte += (trailbyte == 0x7E? 2 : 1))
   236 				{
   237 				TInt errCode = KErrNone;
   238 
   239 				// emoji character on its own
   240 				sampleUserDefined.Format(_L8("%c%c"), leadByte, trailbyte);
   241 				_LIT16(KExpectedUnicode1, "\xFFFD");
   242 				TRAP(errCode, aCharacterSetConverter.PrepareToConvertToOrFromL(KCharacterSetTestShiftJisKddiau, aArrayOfCharacterSetsAvailable, aFileServerSession));
   243 				test(errCode == KErrNone);
   244 				ret = aCharacterSetConverter.ConvertToUnicode(generatedUnicode, sampleUserDefined, state);
   245 				test(ret ==0);
   246 				test(generatedUnicode==KExpectedUnicode1);
   247 
   248 				// followed by a single character
   249 				sampleUserDefined.Format(_L8("%c%cx"), leadByte, trailbyte);
   250 				_LIT16(KExpectedUnicode2, "\xFFFDx");
   251 				TRAP(errCode, aCharacterSetConverter.PrepareToConvertToOrFromL(KCharacterSetTestShiftJisKddiau, aArrayOfCharacterSetsAvailable, aFileServerSession));
   252 				test(errCode == KErrNone);
   253 				ret = aCharacterSetConverter.ConvertToUnicode(generatedUnicode, sampleUserDefined, state);
   254 				test(ret ==0);
   255 				test(generatedUnicode==KExpectedUnicode2);
   256 
   257 				// preceeded by a single character
   258 				sampleUserDefined.Format(_L8("x%c%c"), leadByte, trailbyte);
   259 				_LIT16(KExpectedUnicode3, "x\xFFFD");
   260 				TRAP(errCode, aCharacterSetConverter.PrepareToConvertToOrFromL(KCharacterSetTestShiftJisKddiau, aArrayOfCharacterSetsAvailable, aFileServerSession));
   261 				test(errCode == KErrNone);
   262 				ret = aCharacterSetConverter.ConvertToUnicode(generatedUnicode, sampleUserDefined, state);
   263 				test(ret ==0);
   264 				test(generatedUnicode==KExpectedUnicode3);
   265 				}
   266 			}
   267 		}
   268 
   269 	INFO_PRINTF1(_L("All double-byte characters convert to single Unicode"));
   270 	TText8 LeadBytes[] = { 0x81, 0x9F, 0xE0, 0xEA, 0xEB, 0xF9, 0xFA, 0xFC };
   271 	TText8 TrailBytes[] = { 0x40, 0x7E, 0x80, 0xFC };
   272 	TText8* leadp;
   273 	for (leadp = LeadBytes;
   274 		leadp != LeadBytes + sizeof(LeadBytes)/sizeof(LeadBytes[0]);
   275 		++leadp)
   276 		{
   277 		// a single leadbyte missing the trail byte
   278 		sampleUserDefined.Format(_L8("%c"), *leadp);
   279 		TRAP(errCode, aCharacterSetConverter.PrepareToConvertToOrFromL(KCharacterSetTestShiftJisKddiau, aArrayOfCharacterSetsAvailable, aFileServerSession));
   280 		test(errCode == KErrNone);
   281 		ret = aCharacterSetConverter.ConvertToUnicode(generatedUnicode, sampleUserDefined, state);
   282 		test(ret == CCnvCharacterSetConverter::EErrorIllFormedInput);
   283 
   284 		// lead byte then illegal trail byte, which is a legal byte on its own
   285 		sampleUserDefined.Format(_L8("%c%c"), *leadp, 0x3F);
   286 		TRAP(errCode, aCharacterSetConverter.PrepareToConvertToOrFromL(KCharacterSetTestShiftJisKddiau, aArrayOfCharacterSetsAvailable, aFileServerSession));
   287 		test(errCode == KErrNone);
   288 		ret = aCharacterSetConverter.ConvertToUnicode(generatedUnicode, sampleUserDefined, state);
   289 		test(ret == 0);
   290 		test(generatedUnicode == _L16("\xFFFD\x3F"));
   291 
   292 		for (TText8* trailp = TrailBytes;
   293 			trailp != TrailBytes + sizeof(TrailBytes)/sizeof(TrailBytes[0]);
   294 			++trailp)
   295 			{
   296 			sampleUserDefined.Format(_L8("%c%c"), *leadp, *trailp);
   297 			TRAP(errCode, aCharacterSetConverter.PrepareToConvertToOrFromL(KCharacterSetTestShiftJisKddiau, aArrayOfCharacterSetsAvailable, aFileServerSession));
   298 			test(errCode == KErrNone);
   299 			ret = aCharacterSetConverter.ConvertToUnicode(generatedUnicode, sampleUserDefined, state);
   300 			test(ret == 0);
   301 			test(generatedUnicode.Length() == 1);
   302 			}
   303 		}
   304 
   305 	INFO_PRINTF1(_L("All single-byte characters convert to single Unicode"));
   306 	TText8 SingleBytes[] = { 0, 0x7F, 0x80, 0xA0, 0xA1, 0xFD, 0xFE, 0xFF };
   307 	for (TText8* singlep = SingleBytes;
   308 		singlep != SingleBytes + sizeof(SingleBytes)/sizeof(SingleBytes[0]);
   309 		++singlep)
   310 		{
   311 		// a single leadbyte missing the trail byte
   312 		sampleUserDefined.Format(_L8("%c"), *singlep);
   313 		TRAP(errCode, aCharacterSetConverter.PrepareToConvertToOrFromL(KCharacterSetTestShiftJisKddiau, aArrayOfCharacterSetsAvailable, aFileServerSession));
   314 		test(errCode == KErrNone);
   315 		ret = aCharacterSetConverter.ConvertToUnicode(generatedUnicode, sampleUserDefined, state);
   316 		test(ret == 0);
   317 		test(generatedUnicode.Length() == 1);
   318 		}
   319 
   320 	INFO_PRINTF1(_L("Valid lead byte + invalid trail byte -> FFFD + something"));
   321 	TText8 NotTrailBytes[] = { 0x3F, 0x7F, 0xFD, 0xFE, 0xFF };
   322 	for (leadp = LeadBytes;
   323 		leadp != LeadBytes + sizeof(LeadBytes)/sizeof(LeadBytes[0]);
   324 		++leadp)
   325 		{
   326 		for (TText8* trailp = NotTrailBytes;
   327 			trailp != NotTrailBytes + sizeof(NotTrailBytes)/sizeof(NotTrailBytes[0]);
   328 			++trailp)
   329 			{
   330 			sampleUserDefined.Format(_L8("%c%c"), *leadp, *trailp);
   331 			TRAP(errCode, aCharacterSetConverter.PrepareToConvertToOrFromL(KCharacterSetTestShiftJisKddiau, aArrayOfCharacterSetsAvailable, aFileServerSession));
   332 			test(errCode == KErrNone);
   333 			ret = aCharacterSetConverter.ConvertToUnicode(generatedUnicode, sampleUserDefined, state);
   334 			test(ret == 0);
   335 			test(generatedUnicode.Length() == 2);
   336 			test(generatedUnicode[0] == 0xFFFD);
   337 			}
   338 		}
   339 	}
   340 
   341 /**
   342 Test_DEF053900 test code for DEF053900  - Problems encoding Japanese emails to ISO-2022-JP
   343 
   344 @SYMTestCaseID          SYSLIB-CHARCONV-CT-1306
   345 @SYMTestCaseDesc        Tests for defect number DEF053900
   346 @SYMTestPriority        Medium
   347 @SYMTestActions         Attempt for converting from Japanese character set email to Unicode.
   348 @SYMTestExpectedResults Test must not fail
   349 @SYMREQ                 REQ0000
   350 */
   351 void CT_BUILTIN::Test_DEF053900(CCnvCharacterSetConverter& aCharacterSetConverter, RFs& aFileServerSession, CArrayFix<CCnvCharacterSetConverter::SCharacterSet>& aArrayOfCharacterSetsAvailable)
   352 	{
   353 	// check now able to convert the original defect data
   354 	INFO_PRINTF1(_L(" @SYMTestCaseID:SYSLIB-CHARCONV-CT-1306 "));
   355 	TBuf8<300> generatedIso2022;
   356 	TRAPD(errCode, aCharacterSetConverter.PrepareToConvertToOrFromL(KCharacterSetIdentifierIso2022Jp, aArrayOfCharacterSetsAvailable, aFileServerSession));
   357 	test(errCode == KErrNone);
   358 	TInt state=CCnvCharacterSetConverter::KStateDefault;
   359 	TInt ret = aCharacterSetConverter.ConvertFromUnicode(generatedIso2022, KEmailToConvert, state);
   360 	// check the converted data is as expected
   361 	test(ret ==0);
   362 	test(generatedIso2022==KExpectedIso2022jp);
   363 	ret = aCharacterSetConverter.ConvertFromUnicode(generatedIso2022, KEmailEndingInJapanese, state);
   364 	test(ret ==0);
   365 	test(generatedIso2022==KExpectedEmailEndingInJapanese);
   366 }
   367 
   368 /**
   369 @SYMTestCaseID          SYSLIB-CHARCONV-CT-0501
   370 @SYMTestCaseDesc        Tests for CCnvCharacterSetConverter class
   371 @SYMTestPriority        Medium
   372 @SYMTestActions         Tests for conversion from empty descriptors to different character sets
   373 @SYMTestExpectedResults Test must not fail
   374 @SYMREQ                 REQ0000
   375 */
   376 void CT_BUILTIN::DoE32MainL()
   377 	{
   378 	RFs fileServerSession;
   379 	CleanupClosePushL(fileServerSession);
   380 	User::LeaveIfError(fileServerSession.Connect());
   381 	CCnvCharacterSetConverter* characterSetConverter=CCnvCharacterSetConverter::NewLC();
   382 	CArrayFix<CCnvCharacterSetConverter::SCharacterSet>* arrayOfCharacterSetsAvailable=CCnvCharacterSetConverter::CreateArrayOfCharacterSetsAvailableLC(fileServerSession);
   383 	INFO_PRINTF1(_L("Available:\n"));
   384 	for (TInt i=arrayOfCharacterSetsAvailable->Count()-1; i>=0; --i)
   385 		{
   386 		const CCnvCharacterSetConverter::SCharacterSet& charactersSet=(*arrayOfCharacterSetsAvailable)[i];
   387 		characterSetConverter->PrepareToConvertToOrFromL(charactersSet.Identifier(), *arrayOfCharacterSetsAvailable, fileServerSession);
   388 		TPtrC charactersSetName(charactersSet.Name());
   389 		if (charactersSet.NameIsFileName())
   390 			{
   391 			charactersSetName.Set(TParsePtrC(charactersSetName).Name());
   392 			}
   393 		INFO_PRINTF2(_L("    %S\n"), &charactersSetName);
   394 		}
   395 	TBuf16<128> originalUnicode;
   396 	TBuf8<128> generatedForeign;
   397 	TBuf16<128> generatedUnicode;
   398 	TInt state=CCnvCharacterSetConverter::KStateDefault;
   399 	TUint characterCode;
   400 	INFO_PRINTF1(_L(" @SYMTestCaseID:SYSLIB-CHARCONV-CT-0501 Testing empty descriptors (Code Page 1252) "));
   401 	characterSetConverter->PrepareToConvertToOrFromL(KCharacterSetIdentifierCodePage1252, *arrayOfCharacterSetsAvailable, fileServerSession);
   402 	originalUnicode=KNullDesC16;
   403 	test(characterSetConverter->ConvertFromUnicode(generatedForeign, originalUnicode)==0);
   404 	test(generatedForeign==KNullDesC8);
   405 	test(characterSetConverter->ConvertToUnicode(generatedUnicode, generatedForeign, state)==0);
   406 	test(state==CCnvCharacterSetConverter::KStateDefault);
   407 	test(generatedUnicode==originalUnicode);
   408 	INFO_PRINTF1(_L("Testing empty descriptors (ISO-8859-1)"));
   409 	characterSetConverter->PrepareToConvertToOrFromL(KCharacterSetIdentifierIso88591, *arrayOfCharacterSetsAvailable, fileServerSession);
   410 	originalUnicode=KNullDesC16;
   411 	test(characterSetConverter->ConvertFromUnicode(generatedForeign, originalUnicode)==0);
   412 	test(generatedForeign==KNullDesC8);
   413 	test(characterSetConverter->ConvertToUnicode(generatedUnicode, generatedForeign, state)==0);
   414 	test(state==CCnvCharacterSetConverter::KStateDefault);
   415 	test(generatedUnicode==originalUnicode);
   416 	INFO_PRINTF1(_L("Testing empty descriptors (ASCII)"));
   417 	characterSetConverter->PrepareToConvertToOrFromL(KCharacterSetIdentifierAscii, *arrayOfCharacterSetsAvailable, fileServerSession);
   418 	originalUnicode=KNullDesC16;
   419 	test(characterSetConverter->ConvertFromUnicode(generatedForeign, originalUnicode)==0);
   420 	test(generatedForeign==KNullDesC8);
   421 	test(characterSetConverter->ConvertToUnicode(generatedUnicode, generatedForeign, state)==0);
   422 	test(state==CCnvCharacterSetConverter::KStateDefault);
   423 	test(generatedUnicode==originalUnicode);
   424 	INFO_PRINTF1(_L("Testing empty descriptors (SMS 7-bit)"));
   425 	characterSetConverter->PrepareToConvertToOrFromL(KCharacterSetIdentifierSms7Bit, *arrayOfCharacterSetsAvailable, fileServerSession);
   426 	originalUnicode=KNullDesC16;
   427 	test(characterSetConverter->ConvertFromUnicode(generatedForeign, originalUnicode)==0);
   428 	test(generatedForeign==KNullDesC8);
   429 	test(characterSetConverter->ConvertToUnicode(generatedUnicode, generatedForeign, state)==0);
   430 	test(state==CCnvCharacterSetConverter::KStateDefault);
   431 	test(generatedUnicode==originalUnicode);
   432 	INFO_PRINTF1(_L("Testing exhaustive single-character Code Page 1252 round trips"));
   433 	characterSetConverter->PrepareToConvertToOrFromL(KCharacterSetIdentifierCodePage1252, *arrayOfCharacterSetsAvailable, fileServerSession);
   434 	for (characterCode=0x00; characterCode<=0x7f; ++characterCode)
   435 		{
   436 		originalUnicode.Format(_L16("%c"), characterCode);
   437 		test(characterSetConverter->ConvertFromUnicode(generatedForeign, originalUnicode)==0);
   438 		TBuf8<1> expectedForeign;
   439 		expectedForeign.Format(_L8("%c"), characterCode);
   440 		test(generatedForeign==expectedForeign);
   441 		test(characterSetConverter->ConvertToUnicode(generatedUnicode, generatedForeign, state)==0);
   442 		test(state==CCnvCharacterSetConverter::KStateDefault);
   443 		test(generatedUnicode==originalUnicode);
   444 		}
   445 	originalUnicode.Format(_L16("%c"), 0x20ac);
   446 	test(characterSetConverter->ConvertFromUnicode(generatedForeign, originalUnicode)==0);
   447 	test(generatedForeign==_L8("\x80"));
   448 	test(characterSetConverter->ConvertToUnicode(generatedUnicode, generatedForeign, state)==0);
   449 	test(state==CCnvCharacterSetConverter::KStateDefault);
   450 	test(generatedUnicode==originalUnicode);
   451 	originalUnicode.Format(_L16("%c"), 0x201a);
   452 	test(characterSetConverter->ConvertFromUnicode(generatedForeign, originalUnicode)==0);
   453 	test(generatedForeign==_L8("\x82"));
   454 	test(characterSetConverter->ConvertToUnicode(generatedUnicode, generatedForeign, state)==0);
   455 	test(state==CCnvCharacterSetConverter::KStateDefault);
   456 	test(generatedUnicode==originalUnicode);
   457 	originalUnicode.Format(_L16("%c"), 0x0192);
   458 	test(characterSetConverter->ConvertFromUnicode(generatedForeign, originalUnicode)==0);
   459 	test(generatedForeign==_L8("\x83"));
   460 	test(characterSetConverter->ConvertToUnicode(generatedUnicode, generatedForeign, state)==0);
   461 	test(state==CCnvCharacterSetConverter::KStateDefault);
   462 	test(generatedUnicode==originalUnicode);
   463 	originalUnicode.Format(_L16("%c"), 0x201e);
   464 	test(characterSetConverter->ConvertFromUnicode(generatedForeign, originalUnicode)==0);
   465 	test(generatedForeign==_L8("\x84"));
   466 	test(characterSetConverter->ConvertToUnicode(generatedUnicode, generatedForeign, state)==0);
   467 	test(state==CCnvCharacterSetConverter::KStateDefault);
   468 	test(generatedUnicode==originalUnicode);
   469 	originalUnicode.Format(_L16("%c"), 0x2026);
   470 	test(characterSetConverter->ConvertFromUnicode(generatedForeign, originalUnicode)==0);
   471 	test(generatedForeign==_L8("\x85"));
   472 	test(characterSetConverter->ConvertToUnicode(generatedUnicode, generatedForeign, state)==0);
   473 	test(state==CCnvCharacterSetConverter::KStateDefault);
   474 	test(generatedUnicode==originalUnicode);
   475 	originalUnicode.Format(_L16("%c"), 0x2020);
   476 	test(characterSetConverter->ConvertFromUnicode(generatedForeign, originalUnicode)==0);
   477 	test(generatedForeign==_L8("\x86"));
   478 	test(characterSetConverter->ConvertToUnicode(generatedUnicode, generatedForeign, state)==0);
   479 	test(state==CCnvCharacterSetConverter::KStateDefault);
   480 	test(generatedUnicode==originalUnicode);
   481 	originalUnicode.Format(_L16("%c"), 0x2021);
   482 	test(characterSetConverter->ConvertFromUnicode(generatedForeign, originalUnicode)==0);
   483 	test(generatedForeign==_L8("\x87"));
   484 	test(characterSetConverter->ConvertToUnicode(generatedUnicode, generatedForeign, state)==0);
   485 	test(state==CCnvCharacterSetConverter::KStateDefault);
   486 	test(generatedUnicode==originalUnicode);
   487 	originalUnicode.Format(_L16("%c"), 0x02c6);
   488 	test(characterSetConverter->ConvertFromUnicode(generatedForeign, originalUnicode)==0);
   489 	test(generatedForeign==_L8("\x88"));
   490 	test(characterSetConverter->ConvertToUnicode(generatedUnicode, generatedForeign, state)==0);
   491 	test(state==CCnvCharacterSetConverter::KStateDefault);
   492 	test(generatedUnicode==originalUnicode);
   493 	originalUnicode.Format(_L16("%c"), 0x2030);
   494 	test(characterSetConverter->ConvertFromUnicode(generatedForeign, originalUnicode)==0);
   495 	test(generatedForeign==_L8("\x89"));
   496 	test(characterSetConverter->ConvertToUnicode(generatedUnicode, generatedForeign, state)==0);
   497 	test(state==CCnvCharacterSetConverter::KStateDefault);
   498 	test(generatedUnicode==originalUnicode);
   499 	originalUnicode.Format(_L16("%c"), 0x0160);
   500 	test(characterSetConverter->ConvertFromUnicode(generatedForeign, originalUnicode)==0);
   501 	test(generatedForeign==_L8("\x8a"));
   502 	test(characterSetConverter->ConvertToUnicode(generatedUnicode, generatedForeign, state)==0);
   503 	test(state==CCnvCharacterSetConverter::KStateDefault);
   504 	test(generatedUnicode==originalUnicode);
   505 	originalUnicode.Format(_L16("%c"), 0x2039);
   506 	test(characterSetConverter->ConvertFromUnicode(generatedForeign, originalUnicode)==0);
   507 	test(generatedForeign==_L8("\x8b"));
   508 	test(characterSetConverter->ConvertToUnicode(generatedUnicode, generatedForeign, state)==0);
   509 	test(state==CCnvCharacterSetConverter::KStateDefault);
   510 	test(generatedUnicode==originalUnicode);
   511 	originalUnicode.Format(_L16("%c"), 0x0152);
   512 	test(characterSetConverter->ConvertFromUnicode(generatedForeign, originalUnicode)==0);
   513 	test(generatedForeign==_L8("\x8c"));
   514 	test(characterSetConverter->ConvertToUnicode(generatedUnicode, generatedForeign, state)==0);
   515 	test(state==CCnvCharacterSetConverter::KStateDefault);
   516 	test(generatedUnicode==originalUnicode);
   517 	originalUnicode.Format(_L16("%c"), 0x017d);
   518 	test(characterSetConverter->ConvertFromUnicode(generatedForeign, originalUnicode)==0);
   519 	test(generatedForeign==_L8("\x8e"));
   520 	test(characterSetConverter->ConvertToUnicode(generatedUnicode, generatedForeign, state)==0);
   521 	test(state==CCnvCharacterSetConverter::KStateDefault);
   522 	test(generatedUnicode==originalUnicode);
   523 	originalUnicode.Format(_L16("%c"), 0x017e);
   524 	test(characterSetConverter->ConvertFromUnicode(generatedForeign, originalUnicode)==0);
   525 	test(generatedForeign==_L8("\x9e"));
   526 	test(characterSetConverter->ConvertToUnicode(generatedUnicode, generatedForeign, state)==0);
   527 	test(state==CCnvCharacterSetConverter::KStateDefault);
   528 	test(generatedUnicode==originalUnicode);
   529 	originalUnicode.Format(_L16("%c"), 0x2018);
   530 	test(characterSetConverter->ConvertFromUnicode(generatedForeign, originalUnicode)==0);
   531 	test(generatedForeign==_L8("\x91"));
   532 	test(characterSetConverter->ConvertToUnicode(generatedUnicode, generatedForeign, state)==0);
   533 	test(state==CCnvCharacterSetConverter::KStateDefault);
   534 	test(generatedUnicode==originalUnicode);
   535 	originalUnicode.Format(_L16("%c"), 0x2019);
   536 	test(characterSetConverter->ConvertFromUnicode(generatedForeign, originalUnicode)==0);
   537 	test(generatedForeign==_L8("\x92"));
   538 	test(characterSetConverter->ConvertToUnicode(generatedUnicode, generatedForeign, state)==0);
   539 	test(state==CCnvCharacterSetConverter::KStateDefault);
   540 	test(generatedUnicode==originalUnicode);
   541 	originalUnicode.Format(_L16("%c"), 0x201c);
   542 	test(characterSetConverter->ConvertFromUnicode(generatedForeign, originalUnicode)==0);
   543 	test(generatedForeign==_L8("\x93"));
   544 	test(characterSetConverter->ConvertToUnicode(generatedUnicode, generatedForeign, state)==0);
   545 	test(state==CCnvCharacterSetConverter::KStateDefault);
   546 	test(generatedUnicode==originalUnicode);
   547 	originalUnicode.Format(_L16("%c"), 0x201d);
   548 	test(characterSetConverter->ConvertFromUnicode(generatedForeign, originalUnicode)==0);
   549 	test(generatedForeign==_L8("\x94"));
   550 	test(characterSetConverter->ConvertToUnicode(generatedUnicode, generatedForeign, state)==0);
   551 	test(state==CCnvCharacterSetConverter::KStateDefault);
   552 	test(generatedUnicode==originalUnicode);
   553 	originalUnicode.Format(_L16("%c"), 0x2022);
   554 	test(characterSetConverter->ConvertFromUnicode(generatedForeign, originalUnicode)==0);
   555 	test(generatedForeign==_L8("\x95"));
   556 	test(characterSetConverter->ConvertToUnicode(generatedUnicode, generatedForeign, state)==0);
   557 	test(state==CCnvCharacterSetConverter::KStateDefault);
   558 	test(generatedUnicode==originalUnicode);
   559 	originalUnicode.Format(_L16("%c"), 0x2013);
   560 	test(characterSetConverter->ConvertFromUnicode(generatedForeign, originalUnicode)==0);
   561 	test(generatedForeign==_L8("\x96"));
   562 	test(characterSetConverter->ConvertToUnicode(generatedUnicode, generatedForeign, state)==0);
   563 	test(state==CCnvCharacterSetConverter::KStateDefault);
   564 	test(generatedUnicode==originalUnicode);
   565 	originalUnicode.Format(_L16("%c"), 0x2014);
   566 	test(characterSetConverter->ConvertFromUnicode(generatedForeign, originalUnicode)==0);
   567 	test(generatedForeign==_L8("\x97"));
   568 	test(characterSetConverter->ConvertToUnicode(generatedUnicode, generatedForeign, state)==0);
   569 	test(state==CCnvCharacterSetConverter::KStateDefault);
   570 	test(generatedUnicode==originalUnicode);
   571 	originalUnicode.Format(_L16("%c"), 0x02dc);
   572 	test(characterSetConverter->ConvertFromUnicode(generatedForeign, originalUnicode)==0);
   573 	test(generatedForeign==_L8("\x98"));
   574 	test(characterSetConverter->ConvertToUnicode(generatedUnicode, generatedForeign, state)==0);
   575 	test(state==CCnvCharacterSetConverter::KStateDefault);
   576 	test(generatedUnicode==originalUnicode);
   577 	originalUnicode.Format(_L16("%c"), 0x2122);
   578 	test(characterSetConverter->ConvertFromUnicode(generatedForeign, originalUnicode)==0);
   579 	test(generatedForeign==_L8("\x99"));
   580 	test(characterSetConverter->ConvertToUnicode(generatedUnicode, generatedForeign, state)==0);
   581 	test(state==CCnvCharacterSetConverter::KStateDefault);
   582 	test(generatedUnicode==originalUnicode);
   583 	originalUnicode.Format(_L16("%c"), 0x0161);
   584 	test(characterSetConverter->ConvertFromUnicode(generatedForeign, originalUnicode)==0);
   585 	test(generatedForeign==_L8("\x9a"));
   586 	test(characterSetConverter->ConvertToUnicode(generatedUnicode, generatedForeign, state)==0);
   587 	test(state==CCnvCharacterSetConverter::KStateDefault);
   588 	test(generatedUnicode==originalUnicode);
   589 	originalUnicode.Format(_L16("%c"), 0x203a);
   590 	test(characterSetConverter->ConvertFromUnicode(generatedForeign, originalUnicode)==0);
   591 	test(generatedForeign==_L8("\x9b"));
   592 	test(characterSetConverter->ConvertToUnicode(generatedUnicode, generatedForeign, state)==0);
   593 	test(state==CCnvCharacterSetConverter::KStateDefault);
   594 	test(generatedUnicode==originalUnicode);
   595 	originalUnicode.Format(_L16("%c"), 0x0153);
   596 	test(characterSetConverter->ConvertFromUnicode(generatedForeign, originalUnicode)==0);
   597 	test(generatedForeign==_L8("\x9c"));
   598 	test(characterSetConverter->ConvertToUnicode(generatedUnicode, generatedForeign, state)==0);
   599 	test(state==CCnvCharacterSetConverter::KStateDefault);
   600 	test(generatedUnicode==originalUnicode);
   601 	originalUnicode.Format(_L16("%c"), 0x0178);
   602 	test(characterSetConverter->ConvertFromUnicode(generatedForeign, originalUnicode)==0);
   603 	test(generatedForeign==_L8("\x9f"));
   604 	test(characterSetConverter->ConvertToUnicode(generatedUnicode, generatedForeign, state)==0);
   605 	test(state==CCnvCharacterSetConverter::KStateDefault);
   606 	test(generatedUnicode==originalUnicode);
   607 	for (characterCode=0xa0; characterCode<0xff; ++characterCode)
   608 		{
   609 		originalUnicode.Format(_L16("%c"), characterCode);
   610 		test(characterSetConverter->ConvertFromUnicode(generatedForeign, originalUnicode)==0);
   611 		TBuf8<1> expectedForeign;
   612 		expectedForeign.Format(_L8("%c"), characterCode);
   613 		test(generatedForeign==expectedForeign);
   614 		test(characterSetConverter->ConvertToUnicode(generatedUnicode, generatedForeign, state)==0);
   615 		test(state==CCnvCharacterSetConverter::KStateDefault);
   616 		test(generatedUnicode==originalUnicode);
   617 		}
   618 	INFO_PRINTF1(_L("Testing exhaustive single-character ISO-8859-1 round trips"));
   619 	characterSetConverter->PrepareToConvertToOrFromL(KCharacterSetIdentifierIso88591, *arrayOfCharacterSetsAvailable, fileServerSession);
   620 	for (characterCode=0x00; characterCode<=0xff; ++characterCode)
   621 		{
   622 		const TBool unconvertibleCharacter=(characterCode==0x80);
   623 		TInt numberOfUnconvertibleCharacters;
   624 		TInt indexOfFirstUnconvertibleCharacter;
   625 		originalUnicode.Format(_L16("%c"), characterCode);
   626 		test(characterSetConverter->ConvertFromUnicode(generatedForeign, originalUnicode, numberOfUnconvertibleCharacters, indexOfFirstUnconvertibleCharacter)==0);
   627 		if (characterCode != 0x80)
   628 			test(numberOfUnconvertibleCharacters==(unconvertibleCharacter? 1: 0));
   629 		if (numberOfUnconvertibleCharacters>0)
   630 			{
   631 			test(indexOfFirstUnconvertibleCharacter==0);
   632 			}
   633 		TBuf8<1> expectedForeign;
   634 		expectedForeign.Format(_L8("%c"), unconvertibleCharacter? 0x1a: characterCode);
   635 		test(generatedForeign==expectedForeign);
   636 		TBuf8<1> originalForeign;
   637 		originalForeign.Format(_L8("%c"), characterCode);
   638 		test(characterSetConverter->ConvertToUnicode(generatedUnicode, originalForeign, state, numberOfUnconvertibleCharacters, indexOfFirstUnconvertibleCharacter)==0);
   639 		test(state==CCnvCharacterSetConverter::KStateDefault);
   640 		if (characterCode != 0x80)
   641 			test(numberOfUnconvertibleCharacters==(unconvertibleCharacter? 1: 0));
   642 		if (numberOfUnconvertibleCharacters>0)
   643 			{
   644 			test(indexOfFirstUnconvertibleCharacter==0);
   645 			}
   646 		if (unconvertibleCharacter)
   647 			{
   648 			test(generatedUnicode.Length()==1);
   649 			if (characterCode==0x80)
   650 			    {
   651 				test(generatedUnicode[0]==0x20ac);
   652 			    }
   653 			else
   654 			    {
   655 				test(generatedUnicode[0]==0xfffd);
   656 			    }
   657 			}
   658 		else
   659 			{
   660 			test(generatedUnicode==originalUnicode);
   661 			}
   662 		}
   663 	INFO_PRINTF1(_L("Testing exhaustive single-character ASCII round trips"));
   664 	characterSetConverter->PrepareToConvertToOrFromL(KCharacterSetIdentifierAscii, *arrayOfCharacterSetsAvailable, fileServerSession);
   665 	for (characterCode=0x00; characterCode<=0xff; ++characterCode)
   666 		{
   667 		const TBool unconvertibleCharacter=(characterCode>=0x80);
   668 		TInt numberOfUnconvertibleCharacters;
   669 		originalUnicode.Format(_L16("%c"), characterCode);
   670 		test(characterSetConverter->ConvertFromUnicode(generatedForeign, originalUnicode, numberOfUnconvertibleCharacters)==0);
   671 		test(numberOfUnconvertibleCharacters==(unconvertibleCharacter? 1: 0));
   672 		TBuf8<1> expectedForeign;
   673 		expectedForeign.Format(_L8("%c"), unconvertibleCharacter? 0x1a: characterCode);
   674 		test(generatedForeign==expectedForeign);
   675 		TBuf8<1> originalForeign;
   676 		originalForeign.Format(_L8("%c"), characterCode);
   677 		test(characterSetConverter->ConvertToUnicode(generatedUnicode, originalForeign, state, numberOfUnconvertibleCharacters)==0);
   678 		test(state==CCnvCharacterSetConverter::KStateDefault);
   679 		test(numberOfUnconvertibleCharacters==(unconvertibleCharacter? 1: 0));
   680 		if (unconvertibleCharacter)
   681 			{
   682 			test(generatedUnicode.Length()==1);
   683 			test(generatedUnicode[0]==0xfffd);
   684 			}
   685 		else
   686 			{
   687 			test(generatedUnicode==originalUnicode);
   688 			}
   689 		}
   690 	INFO_PRINTF1(_L("Testing exhaustive SMS 7-bit round trip (default table)"));
   691 	characterSetConverter->PrepareToConvertToOrFromL(KCharacterSetIdentifierSms7Bit, fileServerSession);
   692 	originalUnicode.SetLength(0);
   693 	const TPtrC16 formatOfSixteenCharacters=_L16("%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c");
   694 	originalUnicode.AppendFormat(formatOfSixteenCharacters, 0x0040, 0x00a3, 0x0024, 0x00a5, 0x00e8, 0x00e9, 0x00f9, 0x00ec, 0x00f2, 0x00e7, 0x000a, 0x00d8, 0x00f8, 0x000d, 0x00c5, 0x00e5);
   695 	originalUnicode.AppendFormat(formatOfSixteenCharacters, 0x0394, 0x005f, 0x03a6, 0x0393, 0x039b, 0x03a9, 0x03a0, 0x03a8, 0x03a3, 0x0398, 0x039e,    '!', 0x00c6, 0x00e6, 0x00df, 0x00c9);
   696 	originalUnicode.AppendFormat(formatOfSixteenCharacters, 0x0020, 0x0021, 0x0022, 0x0023, 0x00a4, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f);
   697 	originalUnicode.AppendFormat(formatOfSixteenCharacters, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f);
   698 	originalUnicode.AppendFormat(formatOfSixteenCharacters, 0x00a1, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f);
   699 	originalUnicode.AppendFormat(formatOfSixteenCharacters, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x00c4, 0x00d6, 0x00d1, 0x00dc, 0x00a7);
   700 	originalUnicode.AppendFormat(formatOfSixteenCharacters, 0x00bf, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f);
   701 	originalUnicode.AppendFormat(formatOfSixteenCharacters, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x00e4, 0x00f6, 0x00f1, 0x00fc, 0x00e0);
   702 	test(characterSetConverter->ConvertFromUnicode(generatedForeign, originalUnicode)==0);
   703 	test(generatedForeign.Length()==0x80);
   704 	for (characterCode=0x00; characterCode<0x80; ++characterCode)
   705 		{
   706 		test(generatedForeign[characterCode]==(characterCode==0x1b)? '!': characterCode);
   707 		}
   708 	test(characterSetConverter->ConvertToUnicode(generatedUnicode, generatedForeign, state)==0);
   709 	test(state==CCnvCharacterSetConverter::KStateDefault);
   710 	test(generatedUnicode==originalUnicode);
   711 	INFO_PRINTF1(_L("Testing Greek range of SMS 7-bit"));
   712 	characterSetConverter->PrepareToConvertToOrFromL(KCharacterSetIdentifierSms7Bit, *arrayOfCharacterSetsAvailable, fileServerSession);
   713 	TBuf16<16> expectedUnicode;
   714 	originalUnicode.Format(formatOfSixteenCharacters.Left(7*2), 0x0386, 0x0388, 0x0389, 0x038a, 0x038c, 0x038e, 0x038f);
   715 	expectedUnicode.Format(formatOfSixteenCharacters.Left(7*2), 0x0041, 0x0045, 0x0048, 0x0049, 0x004f, 0x0059, 0x03a9);
   716 	test(characterSetConverter->ConvertFromUnicode(generatedForeign, originalUnicode)==0);
   717 	test(generatedForeign==_L8("\x41\x45\x48\x49\x4f\x59\x15"));
   718 	test(characterSetConverter->ConvertToUnicode(generatedUnicode, generatedForeign, state)==0);
   719 	test(state==CCnvCharacterSetConverter::KStateDefault);
   720 	test(generatedUnicode==expectedUnicode);
   721 	originalUnicode.Format(formatOfSixteenCharacters, 0x0390, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398, 0x0399, 0x039a, 0x039b, 0x039c, 0x039d, 0x039e, 0x039f);
   722 	expectedUnicode.Format(formatOfSixteenCharacters, 0x0049, 0x0041, 0x0042, 0x0393, 0x0394, 0x0045, 0x005a, 0x0048, 0x0398, 0x0049, 0x004b, 0x039b, 0x004d, 0x004e, 0x039e, 0x004f);
   723 	test(characterSetConverter->ConvertFromUnicode(generatedForeign, originalUnicode)==0);
   724 	test(generatedForeign==_L8("\x49\x41\x42\x13\x10\x45\x5a\x48\x19\x49\x4b\x14\x4d\x4e\x1a\x4f"));
   725 	test(characterSetConverter->ConvertToUnicode(generatedUnicode, generatedForeign, state)==0);
   726 	test(state==CCnvCharacterSetConverter::KStateDefault);
   727 	test(generatedUnicode==expectedUnicode);
   728 	originalUnicode.Format(formatOfSixteenCharacters.Left(15*2), 0x03a0, 0x03a1, 0x03a3, 0x03a4, 0x03a5, 0x03a6, 0x03a7, 0x03a8, 0x03a9, 0x03aa, 0x03ab, 0x03ac, 0x03ad, 0x03ae, 0x03af);
   729 	expectedUnicode.Format(formatOfSixteenCharacters.Left(15*2), 0x03a0, 0x0050, 0x03a3, 0x0054, 0x0059, 0x03a6, 0x0058, 0x03a8, 0x03a9, 0x0049, 0x0059, 0x0041, 0x0045, 0x0048, 0x0049);
   730 	test(characterSetConverter->ConvertFromUnicode(generatedForeign, originalUnicode)==0);
   731 	test(generatedForeign==_L8("\x16\x50\x18\x54\x59\x12\x58\x17\x15\x49\x59\x41\x45\x48\x49"));
   732 	test(characterSetConverter->ConvertToUnicode(generatedUnicode, generatedForeign, state)==0);
   733 	test(state==CCnvCharacterSetConverter::KStateDefault);
   734 	test(generatedUnicode==expectedUnicode);
   735 	originalUnicode.Format(formatOfSixteenCharacters, 0x03b0, 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b6, 0x03b7, 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03be, 0x03bf);
   736 	expectedUnicode.Format(formatOfSixteenCharacters, 0x0059, 0x0041, 0x0042, 0x0393, 0x0394, 0x0045, 0x005a, 0x0048, 0x0398, 0x0049, 0x004b, 0x039b, 0x004d, 0x004e, 0x039e, 0x004f);
   737 	test(characterSetConverter->ConvertFromUnicode(generatedForeign, originalUnicode)==0);
   738 	test(generatedForeign==_L8("\x59\x41\x42\x13\x10\x45\x5a\x48\x19\x49\x4b\x14\x4d\x4e\x1a\x4f"));
   739 	test(characterSetConverter->ConvertToUnicode(generatedUnicode, generatedForeign, state)==0);
   740 	test(state==CCnvCharacterSetConverter::KStateDefault);
   741 	test(generatedUnicode==expectedUnicode);
   742 	originalUnicode.Format(formatOfSixteenCharacters.Left(15*2), 0x03c0, 0x03c1, 0x03c2, 0x03c3, 0x03c4, 0x03c5, 0x03c6, 0x03c7, 0x03c8, 0x03c9, 0x03ca, 0x03cb, 0x03cc, 0x03cd, 0x03ce);
   743 	expectedUnicode.Format(formatOfSixteenCharacters.Left(15*2), 0x03a0, 0x0050, 0x03a3, 0x03a3, 0x0054, 0x0059, 0x03a6, 0x0058, 0x03a8, 0x03a9, 0x0049, 0x0059, 0x004f, 0x0059, 0x03a9);
   744 	test(characterSetConverter->ConvertFromUnicode(generatedForeign, originalUnicode)==0);
   745 	test(generatedForeign==_L8("\x16\x50\x18\x18\x54\x59\x12\x58\x17\x15\x49\x59\x4f\x59\x15"));
   746 	test(characterSetConverter->ConvertToUnicode(generatedUnicode, generatedForeign, state)==0);
   747 	test(state==CCnvCharacterSetConverter::KStateDefault);
   748 	test(generatedUnicode==expectedUnicode);
   749 	originalUnicode.Format(formatOfSixteenCharacters.Left(6*2), 0x03d0, 0x03d1, 0x03d2, 0x03d3, 0x03d4, 0x03d5);
   750 	expectedUnicode.Format(formatOfSixteenCharacters.Left(6*2), 0x0042, 0x0398, 0x0059, 0x0059, 0x0059, 0x03a6);
   751 	test(characterSetConverter->ConvertFromUnicode(generatedForeign, originalUnicode)==0);
   752 	test(generatedForeign==_L8("\x42\x19\x59\x59\x59\x12"));
   753 	test(characterSetConverter->ConvertToUnicode(generatedUnicode, generatedForeign, state)==0);
   754 	test(state==CCnvCharacterSetConverter::KStateDefault);
   755 	test(generatedUnicode==expectedUnicode);
   756 	{
   757 	INFO_PRINTF1(_L("Testing converting from Internet-standard names to UIDs"));
   758 	test(characterSetConverter->ConvertStandardNameOfCharacterSetToIdentifierL(_L8("US-ASCII"), fileServerSession)==KCharacterSetIdentifierAscii);
   759 	HBufC8* standardName=characterSetConverter->ConvertCharacterSetIdentifierToStandardNameL(KCharacterSetIdentifierAscii, fileServerSession);
   760 	test(*standardName==_L8("US-ASCII"));
   761 	delete standardName;
   762 	}
   763 	{
   764 	INFO_PRINTF1(_L("Testing fix for defect EDNEMUA-4KGFEY in \"Symbian Defect Tracking v3.0\""));
   765 	CCnvCharacterSetConverter* characterSetConverter2=CCnvCharacterSetConverter::NewLC();
   766 	characterSetConverter->PrepareToConvertToOrFromL(KCharacterSetIdentifierSms7Bit, *arrayOfCharacterSetsAvailable, fileServerSession);
   767 	characterSetConverter2->PrepareToConvertToOrFromL(KCharacterSetIdentifierSms7Bit, *arrayOfCharacterSetsAvailable, fileServerSession);
   768 	characterSetConverter2->SetDowngradeForExoticLineTerminatingCharacters(CCnvCharacterSetConverter::EDowngradeExoticLineTerminatingCharactersToJustLineFeed);
   769 	originalUnicode.Format(_L16("Line1%cLine2%cLine3\x0aLine4\x0d\x0a"), 0x2029, 0x2028);
   770 	test(characterSetConverter->ConvertFromUnicode(generatedForeign, originalUnicode)==0);
   771 	test(generatedForeign==_L8("Line1\x0d\x0aLine2\x0d\x0aLine3\x0aLine4\x0d\x0a"));
   772 	test(characterSetConverter->ConvertToUnicode(generatedUnicode, generatedForeign, state)==0);
   773 	test(state==CCnvCharacterSetConverter::KStateDefault);
   774 	test(generatedUnicode==_L16("Line1\x0d\x0aLine2\x0d\x0aLine3\x0aLine4\x0d\x0a"));
   775 	test(characterSetConverter2->ConvertToUnicode(generatedUnicode, generatedForeign, state)==0);
   776 	test(state==CCnvCharacterSetConverter::KStateDefault);
   777 	test(generatedUnicode==_L16("Line1\x0d\x0aLine2\x0d\x0aLine3\x0aLine4\x0d\x0a"));
   778 	test(characterSetConverter2->ConvertFromUnicode(generatedForeign, originalUnicode)==0);
   779 	test(generatedForeign==_L8("Line1\x0aLine2\x0aLine3\x0aLine4\x0d\x0a"));
   780 	test(characterSetConverter2->ConvertToUnicode(generatedUnicode, generatedForeign, state)==0);
   781 	test(state==CCnvCharacterSetConverter::KStateDefault);
   782 	test(generatedUnicode==_L16("Line1\x0aLine2\x0aLine3\x0aLine4\x0d\x0a"));
   783 	test(characterSetConverter->ConvertToUnicode(generatedUnicode, generatedForeign, state)==0);
   784 	test(state==CCnvCharacterSetConverter::KStateDefault);
   785 	test(generatedUnicode==_L16("Line1\x0aLine2\x0aLine3\x0aLine4\x0d\x0a"));
   786 	CleanupStack::PopAndDestroy(); // characterSetConverter2
   787 	}
   788 	{
   789 	INFO_PRINTF1(_L("Testing fix for defect EDNPSTN-4L5K2G in \"Symbian Defect Tracking v3.0\" (i.e. the extension table)"));
   790 	characterSetConverter->PrepareToConvertToOrFromL(KCharacterSetIdentifierSms7Bit, *arrayOfCharacterSetsAvailable, fileServerSession);
   791 	originalUnicode.Format(_L16("%c^{}\\abc[~]|%c"), 0x000c, 0x20ac);
   792 	test(characterSetConverter->ConvertFromUnicode(generatedForeign, originalUnicode)==0);
   793 	test(generatedForeign==_L8("\x1b\x0a\x1b\x14\x1b\x28\x1b\x29\x1b\x2f""abc\x1b\x3c\x1b\x3d\x1b\x3e\x1b\x40\x1b\x65"));
   794 	test(characterSetConverter->ConvertToUnicode(generatedUnicode, generatedForeign, state)==0);
   795 	test(state==CCnvCharacterSetConverter::KStateDefault);
   796 	test(generatedUnicode==originalUnicode);
   797 	}
   798 	{
   799 	INFO_PRINTF1(_L("Testing fix for defect EDNJJUN-4RWH2A in \"Symbian Defect Tracking v3.0\" (SMS 7-bit [0x1b, 0x41] should be converted to 0x0041, etc.)"));
   800 	TestFix_EDNJJUN_4RWH2A(*characterSetConverter, fileServerSession, *arrayOfCharacterSetsAvailable);
   801 	}
   802 
   803 	//
   804 	INFO_PRINTF1(_L("Testing fix for defect DEF049749"));
   805 	Test_DEF049749(*characterSetConverter, fileServerSession, *arrayOfCharacterSetsAvailable);
   806 
   807 	INFO_PRINTF1(_L("Testing fix for defect DEF053900"));
   808 	Test_DEF053900(*characterSetConverter, fileServerSession, *arrayOfCharacterSetsAvailable);
   809 
   810 	CleanupStack::PopAndDestroy(3); // arrayOfCharacterSetsAvailable and characterSetConverter and fileServerSession
   811 	}
   812 
   813 CT_BUILTIN::CT_BUILTIN()
   814     {
   815     SetTestStepName(KTestStep_T_BUILTIN);
   816     }
   817 
   818 TVerdict CT_BUILTIN::doTestStepL()
   819     {
   820     SetTestStepResult(EFail);
   821 
   822     __UHEAP_MARK;
   823     TRAPD(error1, DoE32MainL());
   824     __UHEAP_MARKEND;
   825 
   826     if(error1 == KErrNone)
   827         {
   828         SetTestStepResult(EPass);
   829         }
   830 
   831     return TestStepResult();
   832     }