sl@0: /* sl@0: * Copyright (c) 1997-2009 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 "utf7.h" sl@0: #include "t_comp7.h" sl@0: sl@0: /////////////////////////////////////////////////////////////////////////////////////// sl@0: sl@0: sl@0: #define test(cond) \ sl@0: TEST((cond)); \ sl@0: if (!(cond)) \ 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: /////////////////////////////////////////////////////////////////////////////////////// sl@0: /////////////////////////////////////////////////////////////////////////////////////// sl@0: sl@0: enum TPanic sl@0: { sl@0: EPanicNoFreeSpaceAtEndOfBuffer1=1, sl@0: EPanicNoFreeSpaceAtEndOfBuffer2 sl@0: }; sl@0: sl@0: LOCAL_C void Panic(TPanic aPanic) sl@0: { sl@0: User::Panic(_L("TCOMP7"), aPanic); sl@0: } sl@0: /** sl@0: @SYMTestCaseID SYSLIB-CHARCONV-CT-0565 sl@0: @SYMTestCaseDesc Comparing behaviour with the Unicode CD-ROM UTF-7 sample code sl@0: @SYMTestPriority Medium sl@0: @SYMTestActions Tests for CnvUtfConverter::ConvertToUnicodeFromUtf7() function sl@0: @SYMTestExpectedResults Test must not fail sl@0: @SYMREQ REQ0000 sl@0: */ sl@0: void CT_COMP7::TestCOMP7() sl@0: { sl@0: INFO_PRINTF1(_L(" @SYMTestCaseID:SYSLIB-CHARCONV-CT-0565 Comparing behaviour with the Unicode CD-ROM UTF-7 sample code ")); sl@0: TDes16* originalUnicode=new TBuf16<512>; sl@0: TDes8* generatedUtf7=new TBuf8<1024>; sl@0: TDes8* otherGeneratedUtf7=new TBuf8<1024>; sl@0: TDes16* generatedUnicode=new TBuf16<512>; sl@0: TDes16* otherGeneratedUnicode=new TBuf16<512>; sl@0: TInt state=CnvUtfConverter::KStateDefault; sl@0: // sl@0: *originalUnicode=_L16(""); sl@0: originalUnicode->AppendFormat(_L16("Here are some European letters: %c%c%c%c%c%c%c%c%c%c. "), 0x0117, 0x010d, 0x00f1, 0x00df, 0x00d8, 0x0142, 0x0151, 0x016f, 0x0131, 0x00c9); sl@0: originalUnicode->AppendFormat(_L16("Here are some Greek letters: %c%c%c%c%c%c%c%c%c%c. "), 0x03a3, 0x03bf, 0x03bc, 0x03b4, 0x03b5, 0x0345, 0x03a9, 0x0392, 0x0395, 0x03a1); sl@0: originalUnicode->AppendFormat(_L16("Here are some Cyrillic letters: %c%c%c%c%c%c%c%c%c%c. "), 0x0437, 0x0430, 0x0440, 0x0435, 0x0438, 0x0306, 0x0411, 0x041e, 0x0423, 0x0416); sl@0: originalUnicode->AppendFormat(_L16("Here are some Georgian letters: %c%c%c%c%c%c%c%c%c%c. "), 0x10da, 0x10e0, 0x10e9, 0x10ef, 0x10d2, 0x10d7, 0x10e2, 0x10d0, 0x10ed, 0x10e8); sl@0: originalUnicode->AppendFormat(_L16("Here are some Japanese kana: %c%c%c%c%c%c%c%c%c%c. "), 0x30a2, 0x30c0, 0x30d5, 0x30b7, 0x30ba, 0x3091, 0x3093, 0x3055, 0x3074, 0x3080); sl@0: originalUnicode->AppendFormat(_L16("Here are some Han characters: %c%c%c%c%c%c%c%c%c%c. "), 0x7f0c, 0x7a92, 0x6d90, 0x6272, 0x5934, 0x5973, 0x55ce, 0x516c, 0x4ec0, 0x4e00); sl@0: originalUnicode->AppendFormat(_L16("Here are some surrogate pairs: %c%c%c%c%c%c%c%c%c%c. "), 0xd800, 0xdc00, 0xdbff, 0xdfff, 0xdb80, 0xdddd, 0xdbff, 0xdcba, 0xdbeb, 0xdeb0); sl@0: originalUnicode->AppendFormat(_L16("Here are some odd bits and pieces: =+-/*?#~'@!\"$%%^&\\|()[]{}<>_;:,. ")); sl@0: enum TUtf7Flags sl@0: { sl@0: EUtf7FlagOptional =0x00000001, sl@0: EUtf7FlagOtherOptional =0x00000002, sl@0: EUtf7FlagOtherVerbose =0x00000004, sl@0: EUtf7FlagCrossOver =0x00000008, sl@0: EUtf7FlagDone =0x00000010 sl@0: }; sl@0: INFO_PRINTF1(_L("Round-trips via UTF-7")); sl@0: for (TInt i=0; ~i&EUtf7FlagDone; ++i) sl@0: { sl@0: test(CnvUtfConverter::ConvertFromUnicodeToUtf7(*generatedUtf7, *originalUnicode, i&EUtf7FlagOptional)==0); sl@0: {__ASSERT_ALWAYS(originalUnicode->Length()MaxLength(), Panic(EPanicNoFreeSpaceAtEndOfBuffer1)); sl@0: TUint16* sourceStart=CONST_CAST(TUint16*, originalUnicode->Ptr()); sl@0: TUint16* sourceEnd=sourceStart+originalUnicode->Length(); sl@0: char* targetStart=REINTERPRET_CAST(char*, CONST_CAST(TUint8*, otherGeneratedUtf7->Ptr())); sl@0: char* targetEnd=targetStart+(otherGeneratedUtf7->MaxLength()-1); sl@0: test(ConvertUCS2toUTF7(&sourceStart, sourceEnd, &targetStart, targetEnd, i&EUtf7FlagOtherOptional, i&EUtf7FlagOtherVerbose)==ok); sl@0: otherGeneratedUtf7->SetLength(targetStart-REINTERPRET_CAST(char*, CONST_CAST(TUint8*, otherGeneratedUtf7->Ptr())));} sl@0: TDes8& sourceForReturnTrip=(i&EUtf7FlagCrossOver)? *otherGeneratedUtf7: *generatedUtf7; sl@0: TDes8& otherSourceForReturnTrip=(i&EUtf7FlagCrossOver)? *generatedUtf7: *otherGeneratedUtf7; sl@0: test(CnvUtfConverter::ConvertToUnicodeFromUtf7(*generatedUnicode, sourceForReturnTrip, state)==0); sl@0: test(state==CnvUtfConverter::KStateDefault); sl@0: {__ASSERT_ALWAYS(otherSourceForReturnTrip.Length()Ptr()); sl@0: TUint16* targetEnd=targetStart+(otherGeneratedUnicode->MaxLength()-1); sl@0: test(ConvertUTF7toUCS2(&sourceStart, sourceEnd, &targetStart, targetEnd)==ok); sl@0: otherGeneratedUnicode->SetLength(targetStart-otherGeneratedUnicode->Ptr());} sl@0: test(*generatedUnicode==*originalUnicode); sl@0: test(*generatedUnicode==*otherGeneratedUnicode); sl@0: } sl@0: // sl@0: delete originalUnicode; sl@0: delete generatedUtf7; sl@0: delete otherGeneratedUtf7; sl@0: delete generatedUnicode; sl@0: delete otherGeneratedUnicode; sl@0: sl@0: } sl@0: sl@0: CT_COMP7::CT_COMP7() sl@0: { sl@0: SetTestStepName(KTestStep_T_COMP7); sl@0: } sl@0: sl@0: TVerdict CT_COMP7::doTestStepL() sl@0: { sl@0: SetTestStepResult(EFail); sl@0: sl@0: __UHEAP_MARK; sl@0: sl@0: TRAPD(error1, TestCOMP7()); sl@0: 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: }