예제 #1
0
        internal bool MatchingPair(Bidi bidi, int i, char c1, char c2)
        {
            if (c1 == c2)
            {
                return(true);
            }

            /*
             * For REORDER_RUNS_ONLY, it would not be correct to check levels[i], so
             * we use the appropriate run's level, which is good for all cases.
             */
            if (bidi.GetLogicalRun(i).GetDirection() == 0)
            {
                return(false);
            }
            for (int k = 0; k < mates1Chars.Length; k++)
            {
                if ((c1 == mates1Chars[k]) && (c2 == mates2Chars[k]))
                {
                    return(true);
                }
            }
            return(false);
        }
예제 #2
0
        private void DoMisc()
        {
            /* Miscellaneous tests to exercize less popular code paths */
            Bidi bidi = new Bidi(120, 66), bidiLine;

            AssertEquals("\nwriteReverse should return an empty string", "",
                         IBM.ICU.Text.Bidi.WriteReverse("", 0));

            bidi.SetPara("", IBM.ICU.Text.Bidi.LTR, null);
            AssertEquals("\nwriteReordered should return an empty string", "",
                         bidi.WriteReordered(0));

            bidi.SetPara("abc", IBM.ICU.Text.Bidi.LTR, null);
            AssertEquals("\ngetRunStart should return 0", 0, bidi.GetRunStart(0));
            AssertEquals("\ngetRunLimit should return 3", 3, bidi.GetRunLimit(0));

            bidi.SetPara("abc          ", IBM.ICU.Text.Bidi.RTL, null);
            bidiLine = bidi.SetLine(0, 6);
            for (int i = 3; i < 6; i++)
            {
                AssertEquals("\nTrailing space at " + i
                             + " should get paragraph level", IBM.ICU.Text.Bidi.RTL,
                             bidiLine.GetLevelAt(i));
            }

            bidi.SetPara("abc       def", IBM.ICU.Text.Bidi.RTL, null);
            bidiLine = bidi.SetLine(0, 6);
            for (int i_0 = 3; i_0 < 6; i_0++)
            {
                AssertEquals("\nTrailing space at " + i_0
                             + " should get paragraph level", IBM.ICU.Text.Bidi.RTL,
                             bidiLine.GetLevelAt(i_0));
            }

            bidi.SetPara("abcdefghi    ", IBM.ICU.Text.Bidi.RTL, null);
            bidiLine = bidi.SetLine(0, 6);
            for (int i_1 = 3; i_1 < 6; i_1++)
            {
                AssertEquals("\nTrailing char at " + i_1 + " should get level 2", 2,
                             bidiLine.GetLevelAt(i_1));
            }

            bidi.SetReorderingOptions(IBM.ICU.Text.Bidi.OPTION_REMOVE_CONTROLS);
            bidi.SetPara("\u200eabc       def", IBM.ICU.Text.Bidi.RTL, null);
            bidiLine = bidi.SetLine(0, 6);
            AssertEquals("\nWrong result length", 5, bidiLine.GetResultLength());

            bidi.SetPara("abcdefghi", IBM.ICU.Text.Bidi.LTR, null);
            bidiLine = bidi.SetLine(0, 6);
            AssertEquals("\nWrong direction #1", IBM.ICU.Text.Bidi.LTR, bidiLine.GetDirection());

            bidi.SetPara("", IBM.ICU.Text.Bidi.LTR, null);
            sbyte[] levels = bidi.GetLevels();
            AssertEquals("\nWrong number of level elements", 0, levels.Length);
            AssertEquals("\nWrong number of runs #1", 0, bidi.CountRuns());

            bidi.SetPara("          ", IBM.ICU.Text.Bidi.RTL, null);
            bidiLine = bidi.SetLine(0, 6);
            AssertEquals("\nWrong number of runs #2", 1, bidiLine.CountRuns());

            bidi.SetPara("a\u05d0        bc", IBM.ICU.Text.Bidi.RTL, null);
            bidiLine = bidi.SetLine(0, 6);
            AssertEquals("\nWrong direction #2", IBM.ICU.Text.Bidi.MIXED, bidi.GetDirection());
            AssertEquals("\nWrong direction #3", IBM.ICU.Text.Bidi.MIXED,
                         bidiLine.GetDirection());
            AssertEquals("\nWrong number of runs #3", 2, bidiLine.CountRuns());

            int[] map = IBM.ICU.Text.Bidi.ReorderLogical(null);
            AssertTrue("\nWe should have got a null map #1", map == null);
            map = IBM.ICU.Text.Bidi.ReorderLogical(new sbyte[] { 0, 99, 99 });
            AssertTrue("\nWe should have got a null map #2", map == null);
            map = IBM.ICU.Text.Bidi.ReorderVisual(null);
            AssertTrue("\nWe should have got a null map #3", map == null);

            map = IBM.ICU.Text.Bidi.InvertMap(null);
            AssertTrue("\nWe should have got a null map #4", map == null);
            map = IBM.ICU.Text.Bidi.InvertMap(new int[] { 0, 1, -1, 5, 4 });
            AssertTrue("\nUnexpected inverted Map",
                       ILOG.J2CsMapping.Collections.Arrays.Equals(map, new int[] { 0, 1, -1, -1, 4, 3 }));

            bidi.SetPara("", IBM.ICU.Text.Bidi.LTR, null);
            map = bidi.GetLogicalMap();
            AssertTrue("\nMap should have length==0 #1", map.Length == 0);
            map = bidi.GetVisualMap();
            AssertTrue("\nMap should have length==0 #2", map.Length == 0);

            /* test BidiRun.toString and allocation of run memory > 1 */
            bidi.SetPara("abc", IBM.ICU.Text.Bidi.LTR, null);
            AssertEquals("\nWrong run display", "BidiRun 0 - 3 @ 0", bidi
                         .GetLogicalRun(0).ToString());

            /* test REMOVE_BIDI_CONTROLS together with DO_MIRRORING */
            bidi.SetPara("abc\u200e", IBM.ICU.Text.Bidi.LTR, null);
            String xout = bidi.WriteReordered(IBM.ICU.Text.Bidi.REMOVE_BIDI_CONTROLS
                                              | IBM.ICU.Text.Bidi.DO_MIRRORING);

            AssertEquals("\nWrong result #1", "abc", xout);

            /* test inverse Bidi with marks and contextual orientation */
            bidi.SetReorderingMode(IBM.ICU.Text.Bidi.REORDER_INVERSE_LIKE_DIRECT);
            bidi.SetReorderingOptions(IBM.ICU.Text.Bidi.OPTION_INSERT_MARKS);
            bidi.SetPara("", IBM.ICU.Text.Bidi.LEVEL_DEFAULT_RTL, null);
            xout = bidi.WriteReordered(0);
            AssertEquals("\nWrong result #2", "", xout);
            bidi.SetPara("   ", IBM.ICU.Text.Bidi.LEVEL_DEFAULT_RTL, null);
            xout = bidi.WriteReordered(0);
            AssertEquals("\nWrong result #3", "   ", xout);
            bidi.SetPara("abc", IBM.ICU.Text.Bidi.LEVEL_DEFAULT_RTL, null);
            xout = bidi.WriteReordered(0);
            AssertEquals("\nWrong result #4", "abc", xout);
            bidi.SetPara("\u05d0\u05d1", IBM.ICU.Text.Bidi.LEVEL_DEFAULT_RTL, null);
            xout = bidi.WriteReordered(0);
            AssertEquals("\nWrong result #5", "\u05d1\u05d0", xout);
            bidi.SetPara("abc \u05d0\u05d1", IBM.ICU.Text.Bidi.LEVEL_DEFAULT_RTL, null);
            xout = bidi.WriteReordered(0);
            AssertEquals("\nWrong result #6", "\u05d1\u05d0 abc", xout);
            bidi.SetPara("\u05d0\u05d1 abc", IBM.ICU.Text.Bidi.LEVEL_DEFAULT_RTL, null);
            xout = bidi.WriteReordered(0);
            AssertEquals("\nWrong result #7", "\u200fabc \u05d1\u05d0", xout);
            bidi.SetPara("\u05d0\u05d1 abc .-=", IBM.ICU.Text.Bidi.LEVEL_DEFAULT_RTL, null);
            xout = bidi.WriteReordered(0);
            AssertEquals("\nWrong result #8", "\u200f=-. abc \u05d1\u05d0", xout);
            bidi.OrderParagraphsLTR(true);
            bidi.SetPara("\n\r   \n\rabc\n\u05d0\u05d1\rabc \u05d2\u05d3\n\r"
                         + "\u05d4\u05d5 abc\n\u05d6\u05d7 abc .-=\r\n"
                         + "-* \u05d8\u05d9 abc .-=", IBM.ICU.Text.Bidi.LEVEL_DEFAULT_RTL, null);
            xout = bidi.WriteReordered(0);
            AssertEquals(
                "\nWrong result #9",
                "\n\r   \n\rabc\n\u05d1\u05d0\r\u05d3\u05d2 abc\n\r"
                + "\u200fabc \u05d5\u05d4\n\u200f=-. abc \u05d7\u05d6\r\n"
                + "\u200f=-. abc \u05d9\u05d8 *-", xout);

            bidi.SetPara("\u05d0 \t", IBM.ICU.Text.Bidi.LTR, null);
            xout = bidi.WriteReordered(0);
            AssertEquals("\nWrong result #10", "\u05D0\u200e \t", xout);
            bidi.SetPara("\u05d0 123 \t\u05d1 123 \u05d2", IBM.ICU.Text.Bidi.LTR, null);
            xout = bidi.WriteReordered(0);
            AssertEquals("\nWrong result #11",
                         "\u05d0 \u200e123\u200e \t\u05d2 123 \u05d1", xout);
            bidi.SetPara("\u05d0 123 \u0660\u0661 ab", IBM.ICU.Text.Bidi.LTR, null);
            xout = bidi.WriteReordered(0);
            AssertEquals("\nWrong result #12",
                         "\u05d0 \u200e123 \u200e\u0660\u0661 ab", xout);
            bidi.SetPara("ab \t", IBM.ICU.Text.Bidi.RTL, null);
            xout = bidi.WriteReordered(0);
            AssertEquals("\nWrong result #13", "\u200f\t ab", xout);

            /* check exceeding para level */
            bidi = new Bidi();
            bidi.SetPara("A\u202a\u05d0\u202aC\u202c\u05d1\u202cE",
                         (sbyte)(IBM.ICU.Text.Bidi.MAX_EXPLICIT_LEVEL - 1), null);
            AssertEquals("\nWrong level at index 2", 61, bidi.GetLevelAt(2));

            /* check 1-char runs with RUNS_ONLY */
            bidi.SetReorderingMode(IBM.ICU.Text.Bidi.REORDER_RUNS_ONLY);
            bidi.SetPara("a \u05d0 b \u05d1 c \u05d2 d ", IBM.ICU.Text.Bidi.LTR, null);
            AssertEquals("\nWrong number of runs #4", 14, bidi.CountRuns());
        }
예제 #3
0
        private void DoTest(Bidi bidi, int testNumber, TestData test,
                            int lineStart, bool countRunsFirst)
        {
            short[] dirProps = test.dirProps;
            byte[]  levels = test.levels;
            int[]   visualMap = test.visualMap;
            int     i, len = bidi.GetLength(), logicalIndex = -1, runCount = 0;
            sbyte   level, level2;

            if (countRunsFirst)
            {
                Logln("Calling Bidi.countRuns() first.");
                try {
                    runCount = bidi.CountRuns();
                } catch (InvalidOperationException e) {
                    Errln("Bidi.countRuns(test[" + testNumber + "]) failed");
                }
            }
            else
            {
                Logln("Calling Bidi.getLogicalMap() first.");
            }

            _testReordering(bidi, testNumber);

            for (i = 0; i < len; ++i)
            {
                Logln(i + "  " + bidi.GetLevelAt(i) + "  " + levelString
                      + IBM.ICU.Charset.TestData.dirPropNames[dirProps[lineStart + i]] + "  "
                      + bidi.GetVisualIndex(i));
            }

            Log("\n-----levels:");
            for (i = 0; i < len; ++i)
            {
                if (i > 0)
                {
                    Log(",");
                }
                Log(" " + bidi.GetLevelAt(i));
            }

            Log("\n--reordered:");
            for (i = 0; i < len; ++i)
            {
                if (i > 0)
                {
                    Log(",");
                }
                Log(" " + bidi.GetVisualIndex(i));
            }
            Log("\n");

            AssertEquals(
                "\nFailure in Bidi.getDirection(test[" + testNumber + "])",
                test.direction, bidi.GetDirection());
            AssertEquals(
                "\nFailure in Bidi.getParaLevel(test[" + testNumber + "])",
                test.resultLevel, bidi.GetParaLevel());

            for (i = 0; i < len; ++i)
            {
                AssertEquals("\nFailure in Bidi.getLevelAt(" + i + ") in test["
                             + testNumber + "]", levels[i], bidi.GetLevelAt(i));
            }

            for (i = 0; i < len; ++i)
            {
                try {
                    logicalIndex = bidi.GetVisualIndex(i);
                } catch (Exception th) {
                    Errln("Bidi.getVisualIndex(" + i + ") in test[" + testNumber
                          + "] failed");
                }
                if (visualMap[i] != logicalIndex)
                {
                    AssertEquals("\nFailure in Bidi.getVisualIndex(" + i
                                 + ") in test[" + testNumber + "])", visualMap[i],
                                 logicalIndex);
                }
            }

            if (!countRunsFirst)
            {
                try {
                    runCount = bidi.CountRuns();
                } catch (InvalidOperationException e_0) {
                    Errln("Bidi.countRuns(test[" + testNumber + "]) failed");
                }
            }

            BidiRun run;

            for (logicalIndex = 0; logicalIndex < len;)
            {
                level        = bidi.GetLevelAt(logicalIndex);
                run          = bidi.GetLogicalRun(logicalIndex);
                logicalIndex = run.GetLimit();
                level2       = run.GetEmbeddingLevel();
                AssertEquals("Logical " + run.ToString() + " in test[" + testNumber
                             + "]: wrong level", level, level2);
                if (--runCount < 0)
                {
                    Errln("Bidi.getLogicalRun(test["
                          + testNumber
                          + "]): wrong number of runs compared to Bidi.countRuns() = "
                          + bidi.CountRuns());
                }
            }
            if (runCount != 0)
            {
                Errln("Bidi.getLogicalRun(test["
                      + testNumber
                      + "]): wrong number of runs compared to Bidi.countRuns() = "
                      + bidi.CountRuns());
            }

            Log("\n\n");
        }