sl@0: // Copyright (c) 2003-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: #include sl@0: #include sl@0: #include sl@0: #include "TGraphicsContext.h" sl@0: #include "TBiDiDefect.h" sl@0: sl@0: class CTBiDiDefect : public CTGraphicsBase sl@0: { sl@0: sl@0: public: sl@0: CTBiDiDefect(CTestStep* aStep); sl@0: ~CTBiDiDefect(); sl@0: sl@0: protected: sl@0: //from CTGraphicsStep sl@0: virtual void RunTestCaseL(TInt aCurTestCase); sl@0: sl@0: private: sl@0: void CreateTestGraphicsContextL(); sl@0: sl@0: void INC016328L(const TDesC& aTestText); sl@0: void INC016665L(); sl@0: void INC017825L(); sl@0: void INC017974L(); sl@0: void INC017991L(); sl@0: void DEF021227(); sl@0: void INC023337(); sl@0: void INC023917(); sl@0: void DEF037928(); sl@0: void DEF021347L(); sl@0: void INC037549L(); sl@0: void INC042422L(); sl@0: void DEF059214L(); sl@0: sl@0: void TestDEF021347L(TUint16 aControlCharacter); sl@0: void TestDEF043720L(); sl@0: sl@0: void TestPDEF117110L(); sl@0: sl@0: private: sl@0: TBidirectionalState::TRunInfo* iRunInfoArray; sl@0: CTestFont* iTestFont; sl@0: TBidiText* iBidiText; sl@0: CTestGraphicsDevice* iTestGraphicsDevice; sl@0: CTestGraphicsContext* iTestGraphicsContext; sl@0: }; sl@0: sl@0: sl@0: CTBiDiDefect::CTBiDiDefect(CTestStep* aStep) : sl@0: CTGraphicsBase(aStep), sl@0: iRunInfoArray(NULL), sl@0: iTestFont(NULL), sl@0: iBidiText(NULL), sl@0: iTestGraphicsDevice(NULL), sl@0: iTestGraphicsContext(NULL) sl@0: { sl@0: } sl@0: sl@0: CTBiDiDefect::~CTBiDiDefect() sl@0: { sl@0: delete iTestGraphicsContext; sl@0: delete iTestGraphicsDevice; sl@0: delete iBidiText; sl@0: delete iTestFont; sl@0: delete [] iRunInfoArray; sl@0: } sl@0: sl@0: void CTBiDiDefect::RunTestCaseL(TInt aCurTestCase) sl@0: { sl@0: ((CTBiDiDefectStep*)iStep)->SetTestStepID(KUnknownSYMTestCaseIDName); sl@0: switch(aCurTestCase) sl@0: { sl@0: case 1: sl@0: { sl@0: /** sl@0: @SYMTestCaseID GRAPHICS-GDI-BiDiDefect-0001 sl@0: */ sl@0: ((CTBiDiDefectStep*)iStep)->SetTestStepID(_L("GRAPHICS-GDI-BiDiDefect-0001")); sl@0: TBuf<32> testText(_L(".Test")); sl@0: INFO_PRINTF1(_L("INC016328")); sl@0: INC016328L(testText); sl@0: } sl@0: break; sl@0: case 2: sl@0: /** sl@0: @SYMTestCaseID GRAPHICS-GDI-BiDiDefect-0002 sl@0: */ sl@0: ((CTBiDiDefectStep*)iStep)->SetTestStepID(_L("GRAPHICS-GDI-BiDiDefect-0002")); sl@0: INFO_PRINTF1(_L("INC016665")); sl@0: INC016665L(); sl@0: break; sl@0: case 3: sl@0: /** sl@0: @SYMTestCaseID GRAPHICS-GDI-BiDiDefect-0003 sl@0: */ sl@0: ((CTBiDiDefectStep*)iStep)->SetTestStepID(_L("GRAPHICS-GDI-BiDiDefect-0003")); sl@0: INFO_PRINTF1(_L("INC017825")); sl@0: INC017825L(); sl@0: break; sl@0: case 4: sl@0: /** sl@0: @SYMTestCaseID GRAPHICS-GDI-BiDiDefect-0004 sl@0: */ sl@0: ((CTBiDiDefectStep*)iStep)->SetTestStepID(_L("GRAPHICS-GDI-BiDiDefect-0004")); sl@0: INFO_PRINTF1(_L("INC017974")); sl@0: INC017974L(); sl@0: break; sl@0: case 5: sl@0: /** sl@0: @SYMTestCaseID GRAPHICS-GDI-BiDiDefect-0005 sl@0: */ sl@0: ((CTBiDiDefectStep*)iStep)->SetTestStepID(_L("GRAPHICS-GDI-BiDiDefect-0005")); sl@0: INFO_PRINTF1(_L("INC017991")); sl@0: INC017991L(); sl@0: break; sl@0: case 6: sl@0: /** sl@0: @SYMTestCaseID GRAPHICS-GDI-BiDiDefect-0006 sl@0: */ sl@0: ((CTBiDiDefectStep*)iStep)->SetTestStepID(_L("GRAPHICS-GDI-BiDiDefect-0006")); sl@0: INFO_PRINTF1(_L("DEF021227")); sl@0: DEF021227(); sl@0: break; sl@0: case 7: sl@0: /** sl@0: @SYMTestCaseID GRAPHICS-GDI-BiDiDefect-0007 sl@0: */ sl@0: ((CTBiDiDefectStep*)iStep)->SetTestStepID(_L("GRAPHICS-GDI-BiDiDefect-0007")); sl@0: INFO_PRINTF1(_L("DEF021347")); sl@0: DEF021347L(); sl@0: break; sl@0: case 8: sl@0: /** sl@0: @SYMTestCaseID GRAPHICS-GDI-BiDiDefect-0008 sl@0: */ sl@0: ((CTBiDiDefectStep*)iStep)->SetTestStepID(_L("GRAPHICS-GDI-BiDiDefect-0008")); sl@0: INFO_PRINTF1(_L("INC023337")); sl@0: INC023337(); sl@0: break; sl@0: case 9: sl@0: /** sl@0: @SYMTestCaseID GRAPHICS-GDI-BiDiDefect-0009 sl@0: */ sl@0: ((CTBiDiDefectStep*)iStep)->SetTestStepID(_L("GRAPHICS-GDI-BiDiDefect-0009")); sl@0: INFO_PRINTF1(_L("INC023917")); sl@0: INC023917(); sl@0: break; sl@0: case 10: sl@0: /** sl@0: @SYMTestCaseID GRAPHICS-GDI-BiDiDefect-0010 sl@0: */ sl@0: ((CTBiDiDefectStep*)iStep)->SetTestStepID(_L("GRAPHICS-GDI-BiDiDefect-0010")); sl@0: INFO_PRINTF1(_L("DEF037928")); sl@0: DEF037928(); sl@0: break; sl@0: case 11: sl@0: /** sl@0: @SYMTestCaseID GRAPHICS-GDI-BiDiDefect-0011 sl@0: */ sl@0: //INC037549 TBidiText crashes if appear at the end of the text sl@0: ((CTBiDiDefectStep*)iStep)->SetTestStepID(_L("GRAPHICS-GDI-BiDiDefect-0011")); sl@0: INFO_PRINTF1(_L("INC037549L")); sl@0: INC037549L(); sl@0: break; sl@0: case 12: sl@0: /** sl@0: @SYMTestCaseID GRAPHICS-GDI-BiDiDefect-0012 sl@0: */ sl@0: //INC042422 when calculated length in BidiCompact.cpp TRunInfoCompact::Reorder < 0 sl@0: ((CTBiDiDefectStep*)iStep)->SetTestStepID(_L("GRAPHICS-GDI-BiDiDefect-0012")); sl@0: INFO_PRINTF1(_L("INC042422L")); sl@0: INC042422L(); sl@0: break; sl@0: case 13: sl@0: /** sl@0: @SYMTestCaseID GRAPHICS-GDI-BiDiDefect-0013 sl@0: */ sl@0: ((CTBiDiDefectStep*)iStep)->SetTestStepID(_L("GRAPHICS-GDI-BiDiDefect-0013")); sl@0: INFO_PRINTF1(_L("DEF043720")); sl@0: TestDEF043720L(); sl@0: break; sl@0: case 14: sl@0: /** sl@0: @SYMTestCaseID GRAPHICS-GDI-BiDiDefect-0014 sl@0: */ sl@0: ((CTBiDiDefectStep*)iStep)->SetTestStepID(_L("GRAPHICS-GDI-BiDiDefect-0014")); sl@0: INFO_PRINTF1(_L("DEF059214: Erroneous caret cursor movements")); sl@0: DEF059214L(); sl@0: break; sl@0: case 15: sl@0: /** sl@0: @SYMTestCaseID GRAPHICS-GDI-BiDiDefect-0015 sl@0: */ sl@0: ((CTBiDiDefectStep*)iStep)->SetTestStepID(_L("GRAPHICS-GDI-BiDiDefect-0015")); sl@0: INFO_PRINTF1(_L("PDEF117110")); sl@0: TestPDEF117110L(); sl@0: break; sl@0: case 16: sl@0: ((CTBiDiDefectStep*)iStep)->SetTestStepID(KNotATestSYMTestCaseIDName); sl@0: ((CTBiDiDefectStep*)iStep)->CloseTMSGraphicsStep(); sl@0: TestComplete(); sl@0: break; sl@0: } sl@0: ((CTBiDiDefectStep*)iStep)->RecordTestResultL(); sl@0: } sl@0: sl@0: void CTBiDiDefect::CreateTestGraphicsContextL() sl@0: { sl@0: delete iTestGraphicsContext; sl@0: iTestGraphicsContext = NULL; sl@0: delete iTestGraphicsDevice; sl@0: iTestGraphicsDevice = NULL; sl@0: sl@0: TSize windowSize(400, 400); sl@0: iTestGraphicsDevice = CTestGraphicsDevice::NewL(windowSize); sl@0: CGraphicsContext* tContext = NULL; sl@0: TEST(iTestGraphicsDevice->CreateContext(tContext) == KErrNone); sl@0: iTestGraphicsContext = static_cast(tContext); sl@0: } sl@0: sl@0: //TBidiText crashes if the first character of the text is '.'. sl@0: void CTBiDiDefect::INC016328L(const TDesC& aTestText) sl@0: { sl@0: TInt arraySize = TBidirectionalState::GenerateBdRunArray(aTestText.Ptr(), aTestText.Length(), 0, 0); sl@0: iRunInfoArray = new (ELeave) TBidirectionalState::TRunInfo[arraySize]; sl@0: TBidirectionalState::GenerateBdRunArray(aTestText.Ptr(), aTestText.Length(), iRunInfoArray, arraySize); sl@0: TBidirectionalState state; sl@0: state.ReorderLine(iRunInfoArray, arraySize, ETrue, ETrue, EFalse, TChar::EOtherNeutral, TChar::EOtherNeutral); sl@0: TEST(iRunInfoArray->iLength > 0); sl@0: } sl@0: sl@0: //Truncation after space character in Bidirectional text classes. sl@0: //Actually it doesn't prove missing space character but proves sl@0: //truncation at the middle of "text" word - yet another defect. sl@0: void CTBiDiDefect::INC016665L() sl@0: { sl@0: iTestFont = new (ELeave) CTestFont; sl@0: iBidiText = TBidiText::NewL(_L("Truncated text"), 1); sl@0: iBidiText->WrapText(110, *iTestFont, NULL);//"Truncated " and "text" sl@0: TEST(iBidiText->DisplayText().Length() == 10); sl@0: TEST(iBidiText->DisplayText()[9] == 0x2026); sl@0: delete (iBidiText); sl@0: sl@0: iBidiText = TBidiText::NewL(_L("Truncated text"), 1); sl@0: iBidiText->WrapText(110, *iTestFont, NULL);//"Truncated " and "text" sl@0: TEST(iBidiText->DisplayText().Length() == 10); sl@0: TEST(iBidiText->DisplayText()[9] == 0x2026); sl@0: } sl@0: sl@0: //TBidiText crashes with length 0 descriptor. sl@0: void CTBiDiDefect::INC017825L() sl@0: { sl@0: delete iTestGraphicsContext; sl@0: iTestGraphicsContext = NULL; sl@0: CreateTestGraphicsContextL(); sl@0: sl@0: delete iTestFont; sl@0: iTestFont = NULL; sl@0: iTestFont = new (ELeave) CTestFont; sl@0: sl@0: delete iBidiText; sl@0: iBidiText = NULL; sl@0: iBidiText = TBidiText::NewL(KNullDesC(), 1); sl@0: iBidiText->WrapText(100, *iTestFont, NULL); sl@0: sl@0: iBidiText->DrawText(*iTestGraphicsContext, TPoint(0, 20), 20, CGraphicsContext::ERight); sl@0: } sl@0: sl@0: //BidiText does not show 0x062A character correctly if it is a first character. sl@0: void CTBiDiDefect::INC017974L() sl@0: { sl@0: _LIT(KTextWithLatinLettersFirstArabicLetter, "\x062A abcdef"); sl@0: sl@0: delete iTestFont; sl@0: iTestFont = NULL; sl@0: iTestFont = new (ELeave) CTestFont; sl@0: sl@0: delete iBidiText; sl@0: iBidiText = NULL; sl@0: iBidiText = TBidiText::NewL(KTextWithLatinLettersFirstArabicLetter, 1); sl@0: iBidiText->WrapText(100, *iTestFont, NULL); sl@0: const TText* text = iBidiText->DisplayText().Ptr(); sl@0: TEST(text[7] == 0x062A);//the arabic character should be the first at the end. sl@0: } sl@0: sl@0: //TBidiText::DrawText draws out of the area if alignment is right. sl@0: void CTBiDiDefect::INC017991L() sl@0: { sl@0: delete iTestGraphicsContext; sl@0: iTestGraphicsContext = NULL; sl@0: CreateTestGraphicsContextL(); sl@0: sl@0: _LIT(KTextWithLatinLetters, "abc def ghijk lmnop qrstuvw xyz 12.34."); sl@0: const TInt KTextWidth = 200; sl@0: sl@0: delete iTestFont; sl@0: iTestFont = NULL; sl@0: iTestFont = new (ELeave) CTestFont; sl@0: sl@0: delete iBidiText; sl@0: iBidiText = NULL; sl@0: iBidiText = TBidiText::NewL(KTextWithLatinLetters, 2); sl@0: iBidiText->WrapText(KTextWidth, *iTestFont, NULL); sl@0: sl@0: iBidiText->DrawText(*iTestGraphicsContext, TPoint(0, 20), 20, CGraphicsContext::ERight); sl@0: const TTestGCDisplayLine& line1 = iTestGraphicsContext->DisplayLine(0); sl@0: const TDesC& text1 = line1.iLineData; sl@0: TInt width1 = iTestFont->TextWidthInPixels(text1); sl@0: TEST((width1 + line1.iLinePos.iX) <= KTextWidth); sl@0: const TTestGCDisplayLine& line2 = iTestGraphicsContext->DisplayLine(1); sl@0: const TDesC& text2 = line2.iLineData; sl@0: TInt width2 = iTestFont->TextWidthInPixels(text2); sl@0: TEST((width2 + line2.iLinePos.iX) <= KTextWidth); sl@0: } sl@0: sl@0: //TBidiLogicalToVisual seems to lose characters. sl@0: void CTBiDiDefect::DEF021227() sl@0: { sl@0: _LIT(KTestText, "Waitnote + D prompt "); sl@0: // _LIT(KTestText, "Waitnote H D prompt "); sl@0: TBuf<100> visualText; sl@0: visualText.Fill(0xCDCD); sl@0: TBidirectionalState::TRunInfo runArray[6]; sl@0: sl@0: TBidiLogicalToVisual bidiConverter(KTestText, EFalse, runArray, sl@0: sizeof(runArray)/sizeof(runArray[0])); sl@0: bidiConverter.Reorder(); sl@0: TDesC des = KTestText; sl@0: bidiConverter.GetVisualLine(visualText, 0, des.Length() - 1, 0xFFFF); sl@0: TInt len = visualText.Length(); sl@0: TEST((des.Length() - 1) == len); sl@0: } sl@0: sl@0: //DrawText should not draw control codes (particularly Bidirectional ones) sl@0: void CTBiDiDefect::DEF021347L() sl@0: { sl@0: TestDEF021347L(0x200C); sl@0: TestDEF021347L(0x200D); sl@0: TestDEF021347L(0x200E); sl@0: TestDEF021347L(0x200F); sl@0: TestDEF021347L(0x202A); sl@0: TestDEF021347L(0x202B); sl@0: TestDEF021347L(0x202C); sl@0: TestDEF021347L(0x202D); sl@0: TestDEF021347L(0x202E); sl@0: // Tested in TGLYPHSEL now following rewrite. sl@0: //TestDEF021347L(0xFFFF); sl@0: } sl@0: sl@0: void CTBiDiDefect::TestDEF021347L(TUint16 aControlCharacter) sl@0: { sl@0: const TInt KTestTextLen = 5; sl@0: TBuf<100> testText(KTestTextLen); sl@0: testText[0] = 'a'; sl@0: testText[1] = 'b'; sl@0: testText[2] = aControlCharacter; sl@0: testText[3] = 'c'; sl@0: testText[4] = 'd'; sl@0: sl@0: delete iTestFont; sl@0: iTestFont = NULL; sl@0: iTestFont = new (ELeave) CTestFont; sl@0: sl@0: CFont::TPositionParam param; sl@0: param.iDirection = 0; sl@0: param.iFlags = 1; sl@0: param.iText.Set(testText); sl@0: param.iPosInText = 0; sl@0: param.iPen.iX = 0; sl@0: param.iPen.iY = 0; sl@0: param.iPosInText = 2; //testText[2] = aControlCharacter sl@0: TBool r = iTestFont->GetCharacterPosition(param); sl@0: sl@0: TEST(r && param.iPen.iX == 0 && param.iOutputGlyphs == 0); sl@0: } sl@0: sl@0: //TBidiLogicalToVisual::GetVisualLine() panics when aEnd == 0 sl@0: void CTBiDiDefect::INC023337() sl@0: { sl@0: _LIT(KTestText, ""); sl@0: TBuf<100> visualText; sl@0: visualText.Fill(0xCDCD); sl@0: TBidirectionalState::TRunInfo runArray[6]; sl@0: TBidiLogicalToVisual bidiConverter(KTestText, EFalse, runArray, sizeof(runArray)/sizeof(runArray[0])); sl@0: bidiConverter.Reorder(); sl@0: sl@0: TDesC des = KTestText; sl@0: const TUint KEmptyChar = TUint(0xFFFF); sl@0: //The next statement will panics, if INC023337 is not fixed. sl@0: bidiConverter.GetVisualLine(visualText, 0, des.Length(), KEmptyChar); sl@0: } sl@0: sl@0: //TBidiLogicalToVisual indexes over the given text. sl@0: void CTBiDiDefect::INC023917() sl@0: { sl@0: const TInt dest_buf_len = 10; sl@0: TBidirectionalState::TRunInfo runInfoArray[dest_buf_len]; sl@0: const TInt src_buf_len = 4; sl@0: TBuf logical; sl@0: logical.Fill(0x0639, src_buf_len); sl@0: sl@0: _LIT(KArabicWord, "\x0631\x0641\x0636"); sl@0: logical = KArabicWord; sl@0: sl@0: TBidiLogicalToVisual bidiConverter(logical, runInfoArray, sizeof(runInfoArray)/sizeof(runInfoArray[0])); sl@0: bidiConverter.Reorder(); sl@0: sl@0: TBuf visual; sl@0: bidiConverter.GetVisualLine(visual, 0, logical.Length(), 0xFFFF); sl@0: sl@0: TEST(visual[0] == 0x0636); sl@0: } sl@0: sl@0: // DEF037928 - TBidiLogicalToVisual::GetVisualLine does not work correctly for 0 length strings sl@0: void CTBiDiDefect::DEF037928() sl@0: { sl@0: // Zero length string for testing sl@0: _LIT(KTestText, ""); sl@0: TBuf<100> visualText; sl@0: visualText.Fill(0xCDCD); sl@0: visualText.SetMax(); sl@0: sl@0: TBidirectionalState::TRunInfo runArray[6]; sl@0: TBidiLogicalToVisual bidiConverter(KTestText, EFalse, runArray, sl@0: sizeof(runArray)/sizeof(runArray[0])); sl@0: bidiConverter.Reorder(); sl@0: sl@0: bidiConverter.GetVisualLine(visualText, 0, 1, 0xFFFF); sl@0: TEST( visualText.Length() == 0); sl@0: } sl@0: sl@0: sl@0: // INC037549 - TBidiText crashes if appear at the end of the text sl@0: void CTBiDiDefect::INC037549L() sl@0: { sl@0: // This crash occured when the final character is sl@0: // and following memory location is sl@0: // To test this testString has a length of 5, but sPtr has length 4 sl@0: _LIT( testString, "123\r\n" ) ; sl@0: TBuf<5> string( testString ) ; sl@0: TPtrC sPtr( string.Ptr(), 4 ) ; sl@0: TBidiText* bText = TBidiText::NewL( sPtr, 1, TBidiText::ELeftToRight ) ; sl@0: sl@0: delete bText; sl@0: } sl@0: sl@0: // INC042422 - when calculated length in BidiCompact.cpp TRunInfoCompact::Reorder < 0 sl@0: // sl@0: // This defect causes an extra blank line to be added when text contains \r\n sl@0: // This was caused by a miscalculation in Biditext.cpp SizeLineBreak(). sl@0: // this test case is modified due to change of TBidiText::DoWrapText for fixing PDEF117110 sl@0: void CTBiDiDefect::INC042422L() sl@0: { sl@0: _LIT( testString, "123\r\n" ) ; sl@0: TBidiText* bText = TBidiText::NewL( testString, 1, TBidiText::ELeftToRight ) ; sl@0: bText->WrapText(100,*iTestFont,0); sl@0: TPtrC text = bText->DisplayText(); sl@0: sl@0: // The defect caused text to contain an extra blank line sl@0: // So the length was 5 ( text contained:1,2,3, 0x2028, 0x2026) sl@0: // when the correct value is 4 (text should contain: 1,2,3, 0x2026) sl@0: // Note: Due to fix for PDEF117109, the correct value is 3 now (text contains: 1,2,3) sl@0: TEST(text.Length() == 3); sl@0: TEST(text[0] == '1'); sl@0: TEST(text[1] == '2'); sl@0: TEST(text[2] == '3'); sl@0: sl@0: delete bText; sl@0: } sl@0: sl@0: //DEF043720 - Assert fails in TBiDiText wrapping when more than one \n is present in the text sl@0: void CTBiDiDefect::TestDEF043720L() sl@0: { sl@0: delete iTestFont; sl@0: iTestFont = NULL; sl@0: iTestFont = new (ELeave) CTestFont; sl@0: sl@0: delete iBidiText; sl@0: iBidiText = NULL; sl@0: iBidiText = TBidiText::NewL(_L("\n\nAB\n\n\nCD\n"),10); sl@0: iBidiText->WrapText(10,*iTestFont,0); sl@0: sl@0: //After wrapping text should look like "\x2028\x2028A\x2028B\x2028\x2028\x2028C\x2028D" sl@0: //where \x2028 is the line separator sl@0: TPtrC afterwrap(iBidiText->DisplayText()); sl@0: TEST(afterwrap.Length()==11); sl@0: TEST(afterwrap[0]==0x2028); sl@0: TEST(afterwrap[1]==0x2028); sl@0: TEST(afterwrap[3]==0x2028); sl@0: TEST(afterwrap[5]==0x2028); sl@0: TEST(afterwrap[6]==0x2028); sl@0: TEST(afterwrap[7]==0x2028); sl@0: TEST(afterwrap[9]==0x2028); sl@0: sl@0: INFO_PRINTF1(iBidiText->DisplayText()); sl@0: sl@0: delete iBidiText; sl@0: iBidiText = NULL; sl@0: delete iTestFont; sl@0: iTestFont = NULL; sl@0: } sl@0: sl@0: void CTBiDiDefect::DEF059214L() sl@0: { sl@0: TBidirectionalState::TRunInfo runs[4]; sl@0: TBidirectionalState bs; sl@0: TBool ambig; sl@0: sl@0: // entirely left to right paragraph is not ambiguous sl@0: ambig = 3000; sl@0: bs.Reset(); sl@0: runs[0].iCategory = TChar::ELeftToRight; sl@0: runs[0].iStart = 0; sl@0: runs[0].iLength = 10; sl@0: bs.ReorderLine(runs, 1, ETrue, EFalse, EFalse, TChar::ELeftToRight, sl@0: TChar::ELeftToRight, ambig); sl@0: sl@0: // entirely right to left paragraph is not ambiguous sl@0: ambig = 3000; sl@0: bs.Reset(); sl@0: runs[0].iCategory = TChar::ERightToLeft; sl@0: runs[0].iStart = 0; sl@0: runs[0].iLength = 10; sl@0: bs.ReorderLine(runs, 1, ETrue, EFalse, ETrue, TChar::ERightToLeft, sl@0: TChar::ERightToLeft, ambig); sl@0: TEST(!ambig); sl@0: sl@0: // right to left portion within left to right paragraph is ambiguous sl@0: ambig = 3000; sl@0: bs.Reset(); sl@0: runs[0].iCategory = TChar::ERightToLeft; sl@0: runs[0].iStart = 0; sl@0: runs[0].iLength = 10; sl@0: bs.ReorderLine(runs, 1, ETrue, EFalse, EFalse, TChar::ERightToLeft, sl@0: TChar::ERightToLeft, ambig); sl@0: TEST(ambig && ambig != 3000); sl@0: ambig = 3000; sl@0: bs.Reset(); sl@0: runs[0].iCategory = TChar::ERightToLeft; sl@0: runs[0].iStart = 0; sl@0: runs[0].iLength = 10; sl@0: bs.ReorderLine(runs, 1, ETrue, EFalse, EFalse, TChar::EOtherNeutral, sl@0: TChar::ERightToLeft, ambig); sl@0: TEST(ambig && ambig != 3000); sl@0: sl@0: // left to right portion within right to left paragraph is ambiguous sl@0: ambig = 3000; sl@0: bs.Reset(); sl@0: runs[0].iCategory = TChar::ELeftToRight; sl@0: runs[0].iStart = 0; sl@0: runs[0].iLength = 10; sl@0: bs.ReorderLine(runs, 1, ETrue, EFalse, ETrue, TChar::ELeftToRight, sl@0: TChar::ELeftToRight, ambig); sl@0: TEST(ambig && ambig != 3000); sl@0: ambig = 3000; sl@0: bs.Reset(); sl@0: runs[0].iCategory = TChar::ELeftToRight; sl@0: runs[0].iStart = 0; sl@0: runs[0].iLength = 10; sl@0: bs.ReorderLine(runs, 1, ETrue, EFalse, ETrue, TChar::EOtherNeutral, sl@0: TChar::ELeftToRight, ambig); sl@0: TEST(ambig && ambig != 3000); sl@0: sl@0: // right to left following on from left to right paragraph is ambiguous sl@0: ambig = 3000; sl@0: bs.Reset(); sl@0: runs[0].iCategory = TChar::ELeftToRight; sl@0: runs[0].iStart = 0; sl@0: runs[0].iLength = 10; sl@0: bs.ReorderLine(runs, 1, ETrue, EFalse, EFalse, TChar::ERightToLeft, sl@0: TChar::ERightToLeft, ambig); sl@0: TEST(ambig && ambig != 3000); sl@0: ambig = 3000; sl@0: bs.Reset(); sl@0: runs[0].iCategory = TChar::ELeftToRight; sl@0: runs[0].iStart = 0; sl@0: runs[0].iLength = 10; sl@0: bs.ReorderLine(runs, 1, ETrue, EFalse, EFalse, TChar::EOtherNeutral, sl@0: TChar::ERightToLeft, ambig); sl@0: TEST(ambig && ambig != 3000); sl@0: sl@0: // left to right following on from right to left paragraph is ambiguous sl@0: ambig = 3000; sl@0: bs.Reset(); sl@0: runs[0].iCategory = TChar::ERightToLeft; sl@0: runs[0].iStart = 0; sl@0: runs[0].iLength = 10; sl@0: bs.ReorderLine(runs, 1, ETrue, EFalse, ETrue, TChar::ELeftToRight, sl@0: TChar::ELeftToRight, ambig); sl@0: TEST(ambig && ambig != 3000); sl@0: ambig = 3000; sl@0: bs.Reset(); sl@0: runs[0].iCategory = TChar::ERightToLeft; sl@0: runs[0].iStart = 0; sl@0: runs[0].iLength = 10; sl@0: bs.ReorderLine(runs, 1, ETrue, EFalse, ETrue, TChar::EOtherNeutral, sl@0: TChar::ELeftToRight, ambig); sl@0: TEST(ambig && ambig != 3000); sl@0: } sl@0: sl@0: void CTBiDiDefect::TestPDEF117110L() sl@0: { sl@0: TPtrC wrappedText; sl@0: TPtrC expectedText; sl@0: sl@0: delete iTestFont; sl@0: iTestFont = new (ELeave) CTestFont; sl@0: sl@0: delete iBidiText; sl@0: iBidiText = TBidiText::NewL(_L("Test Text\n"), 5); sl@0: iBidiText->WrapText(KMaxTInt, *iTestFont, NULL, 1); sl@0: wrappedText.Set(iBidiText->DisplayText()); sl@0: expectedText.Set(_L("Test Text")); sl@0: TEST(expectedText.Compare(wrappedText) == 0); sl@0: sl@0: delete iBidiText; sl@0: iBidiText = TBidiText::NewL(_L("Test Text\r"), 5); sl@0: iBidiText->WrapText(KMaxTInt, *iTestFont, NULL, 1); sl@0: wrappedText.Set(iBidiText->DisplayText()); sl@0: expectedText.Set(_L("Test Text")); sl@0: TEST(expectedText.Compare(wrappedText) == 0); sl@0: sl@0: delete iBidiText; sl@0: iBidiText = TBidiText::NewL(_L("Test Text\r\n"), 5); sl@0: iBidiText->WrapText(KMaxTInt, *iTestFont, NULL, 1); sl@0: wrappedText.Set(iBidiText->DisplayText()); sl@0: expectedText.Set(_L("Test Text")); sl@0: TEST(expectedText.Compare(wrappedText) == 0); sl@0: sl@0: delete iBidiText; sl@0: iBidiText = TBidiText::NewL(_L("Test Text\x2028"), 5); sl@0: iBidiText->WrapText(KMaxTInt, *iTestFont, NULL, 1); sl@0: wrappedText.Set(iBidiText->DisplayText()); sl@0: expectedText.Set(_L("Test Text")); sl@0: TEST(expectedText.Compare(wrappedText) == 0); sl@0: sl@0: delete iBidiText; sl@0: iBidiText = TBidiText::NewL(_L("Test Text\n\x2028"), 5); sl@0: iBidiText->WrapText(KMaxTInt, *iTestFont, NULL, 2); sl@0: wrappedText.Set(iBidiText->DisplayText()); sl@0: expectedText.Set(_L("Test Text\x2028")); sl@0: TEST(expectedText.Compare(wrappedText) == 0); sl@0: sl@0: delete iBidiText; sl@0: iBidiText = TBidiText::NewL(_L("Test\nText\n"), 5); sl@0: iBidiText->WrapText(KMaxTInt, *iTestFont, NULL, 2); sl@0: wrappedText.Set(iBidiText->DisplayText()); sl@0: expectedText.Set(_L("Test\x2028Text")); sl@0: TEST(expectedText.Compare(wrappedText) == 0); sl@0: sl@0: delete iBidiText; sl@0: iBidiText = TBidiText::NewL(_L("Test\nText\n"), 5); sl@0: iBidiText->WrapText(KMaxTInt, *iTestFont, NULL, 1); sl@0: wrappedText.Set(iBidiText->DisplayText()); sl@0: expectedText.Set(_L("Test\x2026")); sl@0: TEST(expectedText.Compare(wrappedText) == 0); sl@0: sl@0: delete iBidiText; sl@0: iBidiText = TBidiText::NewL(_L("TestText\n"), 5); sl@0: iBidiText->WrapText(45, *iTestFont, NULL, 2); sl@0: wrappedText.Set(iBidiText->DisplayText()); sl@0: expectedText.Set(_L("Test\x2028Text")); sl@0: TEST(expectedText.Compare(wrappedText) == 0); sl@0: sl@0: delete iBidiText; sl@0: iBidiText = TBidiText::NewL(_L("Test Text"), 5); sl@0: iBidiText->WrapText(KMaxTInt, *iTestFont, NULL, 1); sl@0: wrappedText.Set(iBidiText->DisplayText()); sl@0: expectedText.Set(_L("Test Text")); sl@0: TEST(expectedText.Compare(wrappedText) == 0); sl@0: sl@0: delete iBidiText; sl@0: iBidiText = NULL; sl@0: delete iTestFont; sl@0: iTestFont = NULL; sl@0: } sl@0: sl@0: //-------------- sl@0: CTBiDiDefectStep::CTBiDiDefectStep() sl@0: { sl@0: SetTestStepName(KTBiDiDefectStep); sl@0: } sl@0: sl@0: CTGraphicsBase* CTBiDiDefectStep::CreateTestL() sl@0: { sl@0: return new (ELeave) CTBiDiDefect(this); sl@0: }