예제 #1
0
        private void DoTests(Bidi bidi, Bidi bidiLine, bool countRunsFirst)
        {
            int    testNumber;
            String str0;
            int    lineStart;
            sbyte  paraLevel;
            int    bidiTestCount = IBM.ICU.Charset.TestData.TestCount();

            for (testNumber = 0; testNumber < bidiTestCount; ++testNumber)
            {
                TestData test = IBM.ICU.Charset.TestData.GetTestData(testNumber);
                str0      = GetStringFromDirProps(test.dirProps);
                paraLevel = test.paraLevel;
                try {
                    bidi.SetPara(str0, paraLevel, null);
                    Logln("Bidi.setPara(tests[" + testNumber + "] OK, direction "
                          + bidi.GetDirection() + " paraLevel " + paraLevel);
                } catch (Exception e) {
                    Errln("Bidi.setPara(tests[" + testNumber
                          + "] failed, direction " + bidi.GetDirection()
                          + " paraLevel " + paraLevel);
                }
                lineStart = test.lineStart;
                if (lineStart == -1)
                {
                    DoTest(bidi, testNumber, test, 0, countRunsFirst);
                }
                else
                {
                    try {
                        bidiLine = bidi.SetLine(lineStart, test.lineLimit);
                        Logln("Bidi.setLine(" + lineStart + ", " + test.lineLimit
                              + "), in tests[" + testNumber + "] OK, direction "
                              + bidiLine.GetDirection() + " paraLevel "
                              + bidiLine.GetBaseLevel());
                        DoTest(bidiLine, testNumber, test, lineStart,
                               countRunsFirst);
                    } catch (Exception e_0) {
                        Errln("Bidi.setLine(" + lineStart + ", " + test.lineLimit
                              + "), in runAll test[" + testNumber + "] failed");
                    }
                    /* do it again using createLineBidi instead of setLine */
                    try {
                        bidiLine = bidi.CreateLineBidi(lineStart, test.lineLimit);
                        Logln("Bidi.createLineBidi(" + lineStart + ", "
                              + test.lineLimit + "), in tests[" + testNumber
                              + "] OK, direction " + bidiLine.GetDirection()
                              + " paraLevel " + bidiLine.GetBaseLevel());
                        DoTest(bidiLine, testNumber, test, lineStart,
                               countRunsFirst);
                    } catch (Exception e_1) {
                        Errln("Bidi.createLineBidi(" + lineStart + ", "
                              + test.lineLimit + "), in runAll test["
                              + testNumber + "] failed");
                    }
                }
            }
        }
예제 #2
0
        internal void PrintCaseInfo(Bidi bidi, String src, String dst)
        {
            int length = bidi.GetProcessedLength();

            sbyte[] levels     = bidi.GetLevels();
            char[]  levelChars = new char[length];
            sbyte   lev;
            int     runCount = bidi.CountRuns();

            Errcontln("========================================");
            Errcontln("Processed length: " + length);
            for (int i = 0; i < length; i++)
            {
                lev = levels[i];
                if (lev < 0)
                {
                    levelChars[i] = '-';
                }
                else if (lev < columns.Length)
                {
                    levelChars[i] = columns[lev];
                }
                else
                {
                    levelChars[i] = '+';
                }
            }
            Errcontln("Levels: " + ILOG.J2CsMapping.Util.StringUtil.NewString(levelChars));
            Errcontln("Source: " + src);
            Errcontln("Result: " + dst);
            Errcontln("Direction: " + bidi.GetDirection());
            Errcontln("paraLevel: " + bidi.GetParaLevel().ToString());
            Errcontln("reorderingMode: " + ModeToString(bidi.GetReorderingMode()));
            Errcontln("reorderingOptions: "
                      + SpOptionsToString(bidi.GetReorderingOptions()));
            Errcont("Runs: " + runCount + " => logicalStart.length/level: ");
            for (int i_0 = 0; i_0 < runCount; i_0++)
            {
                BidiRun run;
                run = bidi.GetVisualRun(i_0);
                Errcont(" " + run.GetStart() + "." + run.GetLength() + "/"
                        + run.GetEmbeddingLevel());
            }
            Errcont("\n");
        }
예제 #3
0
        public void TestFailureRecovery2()
        {
            Logln("\nEntering TestFailureRecovery\n");
            Bidi bidi = new Bidi();

            try
            {
                bidi.SetPara("abc", (sbyte)(IBM.ICU.Text.Bidi.LEVEL_DEFAULT_LTR - 1), null);
                Errln("Bidi.setPara did not fail when passed too big para level");
            }
            catch (ArgumentException e)
            {
                Logln("OK: Got exception for bidi.setPara(..., Bidi.LEVEL_DEFAULT_LTR - 1, ...)"
                      + " as expected: " + e.Message);
            }
            try
            {
                bidi.SetPara("abc", (sbyte)(-1), null);
                Errln("Bidi.setPara did not fail when passed negative para level");
            }
            catch (ArgumentException e_0)
            {
                Logln("OK: Got exception for bidi.setPara(..., -1, ...)"
                      + " as expected: " + e_0.Message);
            }
            try
            {
                IBM.ICU.Text.Bidi.WriteReverse(null, 0);
                Errln("Bidi.writeReverse did not fail when passed a null string");
            }
            catch (ArgumentException e_1)
            {
                Logln("OK: Got exception for Bidi.writeReverse(null) as expected: "
                      + e_1.Message);
            }
            bidi = new Bidi();
            try
            {
                bidi.SetLine(0, 1);
                Errln("bidi.setLine did not fail when called before valid setPara()");
            }
            catch (InvalidOperationException e_2)
            {
                Logln("OK: Got exception for Bidi.setLine(0, 1) as expected: "
                      + e_2.Message);
            }
            try
            {
                bidi.GetDirection();
                Errln("bidi.getDirection did not fail when called before valid setPara()");
            }
            catch (InvalidOperationException e_3)
            {
                Logln("OK: Got exception for Bidi.getDirection() as expected: "
                      + e_3.Message);
            }
            bidi.SetPara("abc", IBM.ICU.Text.Bidi.LTR, null);
            try
            {
                bidi.GetLevelAt(3);
                Errln("bidi.getLevelAt did not fail when called with bad argument");
            }
            catch (ArgumentException e_4)
            {
                Logln("OK: Got exception for Bidi.getLevelAt(3) as expected: "
                      + e_4.Message);
            }
            try
            {
                bidi = new Bidi(-1, 0);
                Errln("Bidi constructor did not fail when called with bad argument");
            }
            catch (ArgumentException e_5)
            {
                Logln("OK: Got exception for Bidi(-1,0) as expected: "
                      + e_5.Message);
            }
            bidi = new Bidi(2, 1);
            try
            {
                bidi.SetPara("abc", IBM.ICU.Text.Bidi.LTR, null);
                Errln("setPara did not fail when called with text too long");
            }
            catch (Exception e_6)
            {
                Logln("OK: Got exception for setPara(\"abc\") as expected: "
                      + e_6.Message);
            }
            try
            {
                bidi.SetPara("=2", IBM.ICU.Text.Bidi.RTL, null);
                bidi.CountRuns();
                Errln("countRuns did not fail when called for too many runs");
            }
            catch (Exception e_7)
            {
                Logln("OK: Got exception for countRuns as expected: "
                      + e_7.Message);
            }
            int rm = bidi.GetReorderingMode();

            bidi.SetReorderingMode(IBM.ICU.Text.Bidi.REORDER_DEFAULT - 1);
            if (rm != bidi.GetReorderingMode())
            {
                Errln("setReorderingMode with bad argument #1 should have no effect");
            }
            bidi.SetReorderingMode(9999);
            if (rm != bidi.GetReorderingMode())
            {
                Errln("setReorderingMode with bad argument #2 should have no effect");
            }
            /* Try a surrogate char */
            bidi = new Bidi();
            bidi.SetPara("\uD800\uDC00", IBM.ICU.Text.Bidi.RTL, null);
            if (bidi.GetDirection() != IBM.ICU.Text.Bidi.MIXED)
            {
                Errln("getDirection for 1st surrogate char should be MIXED");
            }
            sbyte[] levels = new sbyte[] { 6, 5, 4 };
            try
            {
                bidi.SetPara("abc", (sbyte)5, levels);
                Errln("setPara did not fail when called with bad levels");
            }
            catch (ArgumentException e_8)
            {
                Logln("OK: Got exception for setPara(..., levels) as expected: "
                      + e_8.Message);
            }

            Logln("\nExiting TestFailureRecovery\n");
        }
예제 #4
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());
        }
예제 #5
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");
        }
예제 #6
0
        public void TestCompatibility2()
        {
            // This test case does not work well on Java 1.4/1.4.1 environment,
            // because of insufficient Bidi implementation in these versions.

            /*String javaVersion = System.Environment.GetEnvironmentVariable("java.version");
             * if (javaVersion.StartsWith("1.4.0") || javaVersion.StartsWith("1.4.1")) {
             *  Logln("\nSkipping TestCompatibility.  The test case is known to fail on Java "
             + javaVersion + "\n");
             +  return;
             + }*/
            Logln("\nEntering TestCompatibility\n");
            /* check constant field values */
            int val;

            val = IBM.ICU.Text.Bidi.DIRECTION_DEFAULT_LEFT_TO_RIGHT;
            val = IBM.ICU.Text.Bidi.DIRECTION_DEFAULT_RIGHT_TO_LEFT;
            val = IBM.ICU.Text.Bidi.DIRECTION_LEFT_TO_RIGHT;
            val = IBM.ICU.Text.Bidi.DIRECTION_RIGHT_TO_LEFT;
            Logln("last val = " + val);

            String[] data = { "",

                              /*
                               * the following 2 cases are skipped, because java.text.Bidi has bugs
                               * which cause discrepancies "abc", "ABC",
                               */
                              "abc def",        "ABC DEF",  "abc 123 def", "ABC 123 DEF", "abc DEF ghi",
                              "abc DEF 123 xyz","abc GHIJ 12345 def KLM" };
            int      dataCnt = data.Length;
            Bidi     bidi;
            Bidi     jbidi;

            for (int i = 0; i < dataCnt; i++)
            {
                String src = IBM.ICU.Charset.BidiTest.PseudoToU16(data[i]);
                bidi  = new Bidi(src, IBM.ICU.Text.Bidi.DIRECTION_LEFT_TO_RIGHT);
                jbidi = new Bidi(src,
                                 Bidi.DIRECTION_LEFT_TO_RIGHT);
                CompareBidi(bidi, jbidi);
                bidi  = new Bidi(src, IBM.ICU.Text.Bidi.DIRECTION_RIGHT_TO_LEFT);
                jbidi = new Bidi(src,
                                 Bidi.DIRECTION_RIGHT_TO_LEFT);
                CompareBidi(bidi, jbidi);
                char[] chars = src.ToCharArray();
                bidi = new Bidi(chars, 0, null, 0, chars.Length,
                                IBM.ICU.Text.Bidi.DIRECTION_LEFT_TO_RIGHT);
                jbidi = new Bidi(chars, 0, null, 0, chars.Length,
                                 Bidi.DIRECTION_LEFT_TO_RIGHT);
                CompareBidi(bidi, jbidi);
            }
            /* check bogus flags */
            bidi = new Bidi("abc", 999);
            AssertEquals("\nDirection should be LTR", IBM.ICU.Text.Bidi.LTR, bidi.GetDirection());
            /* check constructor with overriding embeddings */
            bidi = new Bidi(new char[] { 's', 's', 's' }, 0, new sbyte[] {
                (sbyte)-7, (sbyte)-2, (sbyte)-3
            }, 0, 3,
                            IBM.ICU.Text.Bidi.DIRECTION_DEFAULT_LEFT_TO_RIGHT);
            jbidi = new Bidi(new char[] { 's', 's', 's' }, 0,
                             new sbyte[] { (sbyte)-7, (sbyte)-2, (sbyte)-3 }, 0, 3,
                             Bidi.DIRECTION_DEFAULT_LEFT_TO_RIGHT);

            AttributedString al = new AttributedString(
                "HEBREW 123 english MOREHEB");

            al.AddAttribute(TextAttribute.RUN_DIRECTION,
                            TextAttribute.RUN_DIRECTION_RTL);
            al.AddAttribute(TextAttribute.NUMERIC_SHAPING,
                            NumericShaper.GetShaper(NumericShaper.ARABIC));
            al.AddAttribute(TextAttribute.BIDI_EMBEDDING, 1, 0, 26);
            al.AddAttribute(TextAttribute.BIDI_EMBEDDING, -1, 0, 6);
            al.AddAttribute(TextAttribute.BIDI_EMBEDDING, -1, 19,
                            26);

            AttributedCharacterIterator aci = al.GetIterator();

            bidi  = new Bidi(aci);
            jbidi = new Bidi(aci);
            CompareBidi(bidi, jbidi);
            String xout = bidi.WriteReordered(0);

            Logln("Output #1 of Bidi(AttributedCharacterIterator): " + xout);

            al = new AttributedString("HEBREW 123 english MOREHEB");

            al.AddAttribute(TextAttribute.RUN_DIRECTION,
                            TextAttribute.RUN_DIRECTION_RTL);
            al.AddAttribute(TextAttribute.BIDI_EMBEDDING, 0, 0, 26);

            aci   = al.GetIterator();
            bidi  = new Bidi(aci);
            jbidi = new Bidi(aci);
            CompareBidi(bidi, jbidi);
            xout = bidi.WriteReordered(0);
            Logln("Output #2 of Bidi(AttributedCharacterIterator): " + xout);

            al    = new AttributedString("HEBREW 123 english MOREHEB");
            aci   = al.GetIterator();
            bidi  = new Bidi(aci);
            jbidi = new Bidi(aci);
            CompareBidi(bidi, jbidi);
            xout = bidi.WriteReordered(0);
            Logln("Output #3 of Bidi(AttributedCharacterIterator): " + xout);

            char[] text = "abc==(123)==>def".ToCharArray();
            bidi = new Bidi(text, 3, null, 0, 10,
                            IBM.ICU.Text.Bidi.DIRECTION_DEFAULT_LEFT_TO_RIGHT);
            jbidi = new Bidi(text, 3, null, 0, 10,
                             Bidi.DIRECTION_DEFAULT_LEFT_TO_RIGHT);
            CompareBidi(bidi, jbidi);
            xout = bidi.WriteReordered(0);
            Logln("Output of Bidi(abc==(123)==>def,3,null,0,10, DEFAULT_LTR): "
                  + xout);
            bidi = new Bidi(text, 3, null, 0, 10,
                            IBM.ICU.Text.Bidi.DIRECTION_DEFAULT_RIGHT_TO_LEFT);
            jbidi = new Bidi(text, 3, null, 0, 10,
                             Bidi.DIRECTION_DEFAULT_RIGHT_TO_LEFT);
            CompareBidi(bidi, jbidi);
            xout = bidi.WriteReordered(0);
            Logln("Output of Bidi(abc==(123)==>def,3,null,0,10, DEFAULT_RTL): "
                  + xout);
            sbyte[] levels = new sbyte[] { 0, 0, 0, -1, -1, -1, 0, 0, 0, 0 };
            bidi  = new Bidi(text, 3, levels, 0, 10, IBM.ICU.Text.Bidi.DIRECTION_LEFT_TO_RIGHT);
            jbidi = new Bidi(text, 3, levels, 0, 10,
                             Bidi.DIRECTION_LEFT_TO_RIGHT);
            CompareBidi(bidi, jbidi);
            xout = bidi.WriteReordered(0);
            Logln("Output of Bidi(abc==(123)==>def,3,levels,0,10, LTR): " + xout);
            bidi = new Bidi(text, 3, levels, 0, 10,
                            IBM.ICU.Text.Bidi.DIRECTION_DEFAULT_RIGHT_TO_LEFT);
            jbidi = new Bidi(text, 3, levels, 0, 10,
                             Bidi.DIRECTION_DEFAULT_RIGHT_TO_LEFT);
            CompareBidi(bidi, jbidi);
            xout = bidi.WriteReordered(0);
            Logln("Output of Bidi(abc==(123)==>def,3,levels,0,10, DEFAULT_RTL): "
                  + xout);

            /* test reorderVisually */
            sbyte[]  myLevels = new sbyte[] { 1, 2, 0, 1, 2, 1, 2, 0, 1, 2 };
            object[] objects  = new object[10];
            levels = new sbyte[objects.Length];
            for (int i_0 = 0; i_0 < objects.Length; i_0++)
            {
                objects[i_0] = (char)((char)('a' + i_0));
                levels[i_0]  = myLevels[i_0];
            }
            IBM.ICU.Text.Bidi.ReorderVisually(levels, 3, objects, 3, 7);
            String strbidi = "";

            for (int i_1 = 0; i_1 < objects.Length; i_1++)
            {
                strbidi += objects[i_1].ToString();
            }
            for (int i_2 = 0; i_2 < objects.Length; i_2++)
            {
                objects[i_2] = (char)((char)('a' + i_2));
                levels[i_2]  = myLevels[i_2];
            }
            Bidi.ReorderVisually(levels, 3, objects, 3, 7);
            String strjbidi = "";

            for (int i_3 = 0; i_3 < objects.Length; i_3++)
            {
                strjbidi += objects[i_3].ToString();
            }
            if (!strjbidi.Equals(strbidi))
            {
                Errln("Discrepancy in reorderVisually " + "\n      bidi: "
                      + strbidi + "\n     jbidi: " + strjbidi);
            }
            else
            {
                Logln("Correct match in reorderVisually " + "\n      bidi: "
                      + strbidi + "\n     jbidi: " + strjbidi);
            }

            Logln("\nExiting TestCompatibility\n");
        }