sl@0: /* sl@0: * Copyright (c) 2000-2010 Nokia Corporation and/or its subsidiary(-ies). sl@0: * All rights reserved. sl@0: * This component and the accompanying materials are made available sl@0: * under the terms of "Eclipse Public License v1.0" sl@0: * which accompanies this distribution, and is available sl@0: * at the URL "http://www.eclipse.org/legal/epl-v10.html". sl@0: * sl@0: * Initial Contributors: sl@0: * Nokia Corporation - initial contribution. sl@0: * sl@0: * Contributors: sl@0: * sl@0: * Description: sl@0: * sl@0: */ sl@0: sl@0: sl@0: #include sl@0: #include sl@0: #include sl@0: #include sl@0: #include "t_replacement.h" sl@0: sl@0: sl@0: #define test(cond) \ sl@0: { \ sl@0: TBool __bb = (cond); \ sl@0: TEST(__bb); \ sl@0: if (!__bb) \ sl@0: { \ sl@0: ERR_PRINTF1(_L("ERROR: Test Failed")); \ sl@0: User::Leave(1); \ sl@0: } \ sl@0: } sl@0: sl@0: /** sl@0: @SYMTestCaseID SYSLIB-CHARCONV-CT-0546 sl@0: @SYMTestCaseDesc Tests for the conversion of uncovertible Unicode characters sl@0: @SYMTestPriority Medium sl@0: @SYMTestActions Tests for the replacement of uncovertible Unicode characters sl@0: @SYMTestExpectedResults Test must not fail sl@0: @SYMREQ REQ0000 sl@0: */ sl@0: void CT_REPLACEMENT::DoE32MainL() sl@0: { sl@0: INFO_PRINTF1(_L(" @SYMTestCaseID:SYSLIB-CHARCONV-CT-0546 ")); sl@0: RFs fileServerSession; sl@0: CleanupClosePushL(fileServerSession); sl@0: User::LeaveIfError(fileServerSession.Connect()); sl@0: CCnvCharacterSetConverter* characterSetConverter=CCnvCharacterSetConverter::NewLC(); sl@0: CArrayFix* arrayOfCharacterSetsAvailable=CCnvCharacterSetConverter::CreateArrayOfCharacterSetsAvailableLC(fileServerSession); sl@0: INFO_PRINTF1(_L("Available:\n")); sl@0: for (TInt i=arrayOfCharacterSetsAvailable->Count()-1; i>=0; --i) sl@0: { sl@0: const CCnvCharacterSetConverter::SCharacterSet& charactersSet=(*arrayOfCharacterSetsAvailable)[i]; sl@0: characterSetConverter->PrepareToConvertToOrFromL(charactersSet.Identifier(), *arrayOfCharacterSetsAvailable, fileServerSession); sl@0: TPtrC charactersSetName(charactersSet.Name()); sl@0: if (charactersSet.NameIsFileName()) sl@0: { sl@0: charactersSetName.Set(TParsePtrC(charactersSetName).Name()); sl@0: } sl@0: INFO_PRINTF2(_L(" %S\n"), &charactersSetName); sl@0: } sl@0: characterSetConverter->PrepareToConvertToOrFromL(KCharacterSetIdentifierGb2312, *arrayOfCharacterSetsAvailable, fileServerSession); sl@0: INFO_PRINTF1(_L("Testing various values for iReplacementForUnconvertibleUnicodeCharacters")); sl@0: // sl@0: INFO_PRINTF1(_L("Testing iReplacementForUnconvertibleUnicodeCharacters being long")); sl@0: { sl@0: TBuf16<50> originalUnicode; sl@0: originalUnicode.Format(_L16("Here is a Georgian character - %c"), 0x10da); sl@0: characterSetConverter->SetReplacementForUnconvertibleUnicodeCharactersL(_L8("[something quite long]")); sl@0: const TInt KLengthOfForeignBuffer=100; sl@0: TUint8 foreignBuffer[KLengthOfForeignBuffer]; sl@0: for (TInt i=31; ; ++i) sl@0: { sl@0: test(i<=KLengthOfForeignBuffer); sl@0: TPtr8 generatedForeign(foreignBuffer, i); sl@0: TInt numberOfUnconvertibleCharacters; sl@0: TInt indexOfFirstUnconvertibleCharacter; sl@0: const TInt returnValue=characterSetConverter->ConvertFromUnicode(generatedForeign, originalUnicode, numberOfUnconvertibleCharacters, indexOfFirstUnconvertibleCharacter); sl@0: if (i==53) sl@0: { sl@0: test(returnValue==0); sl@0: test(generatedForeign==_L8("Here is a Georgian character - [something quite long]")); sl@0: test(numberOfUnconvertibleCharacters==1); sl@0: test(indexOfFirstUnconvertibleCharacter==31); sl@0: break; sl@0: } sl@0: test(returnValue==1); sl@0: test(generatedForeign==_L8("Here is a Georgian character - ")); sl@0: test(numberOfUnconvertibleCharacters==0); sl@0: test(indexOfFirstUnconvertibleCharacter==-1); // not something that the API guarantees (it's undefined if numberOfUnconvertibleCharacters==0), but we'll check it any sl@0: } sl@0: } sl@0: INFO_PRINTF1(_L("Testing lots of unconvertible Unicode characters")); sl@0: { sl@0: characterSetConverter->SetReplacementForUnconvertibleUnicodeCharactersL(_L8("?Q")); sl@0: TInt numberOfUnconvertibleCharacters; sl@0: TInt indexOfFirstUnconvertibleCharacter; sl@0: TInt i; sl@0: TPtr16 originalUnicode(HBufC16::NewMaxLC(10+(sizeof(CCnvCharacterSetConverter::TArrayOfAscendingIndices)/sizeof(TUint16)))->Des()); sl@0: TPtr8 generatedForeign(HBufC8::NewLC(originalUnicode.Length()*sizeof(TUint16))->Des()); sl@0: originalUnicode.Fill(0x7535); sl@0: test(characterSetConverter->ConvertFromUnicode(generatedForeign, originalUnicode, numberOfUnconvertibleCharacters, indexOfFirstUnconvertibleCharacter)==0); sl@0: test(generatedForeign.Length()>0); sl@0: test(generatedForeign.Length()==originalUnicode.Length()*STATIC_CAST(TInt, sizeof(TUint16))); sl@0: test(numberOfUnconvertibleCharacters==0); sl@0: for (i=generatedForeign.Length()-1; i>=0; i-=2) sl@0: { sl@0: test(generatedForeign[i-1]==0xb5); sl@0: test(generatedForeign[i]==0xe7); sl@0: } sl@0: originalUnicode.Fill(0x0f0a); // a Tibetan character, not in GB 2312-80 sl@0: const TInt returnValue=characterSetConverter->ConvertFromUnicode(generatedForeign, originalUnicode, numberOfUnconvertibleCharacters, indexOfFirstUnconvertibleCharacter); sl@0: test(returnValue==0); sl@0: test(generatedForeign.Length()>0); sl@0: test(generatedForeign.Length()==(originalUnicode.Length()-returnValue)*STATIC_CAST(TInt, sizeof(TUint16))); sl@0: test(numberOfUnconvertibleCharacters==25); sl@0: test(indexOfFirstUnconvertibleCharacter==0); sl@0: for (i=generatedForeign.Length()-1; i>=0; i-=2) sl@0: { sl@0: test(generatedForeign[i-1]=='?'); sl@0: test(generatedForeign[i]=='Q'); sl@0: } sl@0: CleanupStack::PopAndDestroy(2); // generatedForeign and originalUnicode sl@0: } sl@0: CleanupStack::PopAndDestroy(3); // arrayOfCharacterSetsAvailable and characterSetConverter and fileServerSession sl@0: } sl@0: sl@0: CT_REPLACEMENT::CT_REPLACEMENT() sl@0: { sl@0: SetTestStepName(KTestStep_T_REPLACEMENT); sl@0: } sl@0: sl@0: TVerdict CT_REPLACEMENT::doTestStepL() sl@0: { sl@0: SetTestStepResult(EFail); sl@0: sl@0: __UHEAP_MARK; sl@0: TRAPD(error1, DoE32MainL()); sl@0: __UHEAP_MARKEND; sl@0: sl@0: if(error1 == KErrNone) sl@0: { sl@0: SetTestStepResult(EPass); sl@0: } sl@0: sl@0: return TestStepResult(); sl@0: } sl@0: