Esempio n. 1
0
        public void TestMultipleParagraphs2()
        {
            sbyte gotLevel;

            sbyte[] gotLevels;
            bool    orderParagraphsLTR;
            String  src;
            Bidi    bidi = new Bidi();
            Bidi    bidiLine;
            int     count, paraStart, paraLimit, paraIndex, length;
            int     i, j, k;

            Logln("\nEntering TestMultipleParagraphs\n");
            try {
                bidi.SetPara(text, IBM.ICU.Text.Bidi.LTR, null);
            } catch (ArgumentException e) {
                Errln("1st Bidi.setPara failed, paraLevel = " + IBM.ICU.Text.Bidi.LTR);
            }

            /* check paragraph count and boundaries */
            if (paraCount != (count = bidi.CountParagraphs()))
            {
                Errln("1st Bidi.countParagraphs returned " + count + ", should be "
                      + paraCount);
            }
            BidiRun run;

            for (i = 0; i < paraCount; i++)
            {
                run       = bidi.GetParagraphByIndex(i);
                paraStart = run.GetStart();
                paraLimit = run.GetLimit();
                if ((paraStart != paraBounds[i]) ||
                    (paraLimit != paraBounds[i + 1]))
                {
                    Errln("Found boundaries of paragraph " + i + ": " + paraStart
                          + "-" + paraLimit + "; expected: " + paraBounds[i]
                          + "-" + paraBounds[i + 1]);
                }
            }

            /* check with last paragraph not terminated by B */
            char[] chars = text.ToCharArray();
            chars[chars.Length - 1] = 'L';
            src = ILOG.J2CsMapping.Util.StringUtil.NewString(chars);
            try {
                bidi.SetPara(src, IBM.ICU.Text.Bidi.LTR, null);
            } catch (ArgumentException e_0) {
                Errln("2nd Bidi.setPara failed, paraLevel = " + IBM.ICU.Text.Bidi.LTR);
            }
            if (paraCount != (count = bidi.CountParagraphs()))
            {
                Errln("2nd Bidi.countParagraphs returned " + count + ", should be "
                      + paraCount);
            }
            i         = paraCount - 1;
            run       = bidi.GetParagraphByIndex(i);
            paraStart = run.GetStart();
            paraLimit = run.GetLimit();
            if ((paraStart != paraBounds[i]) || (paraLimit != paraBounds[i + 1]))
            {
                Errln("2nd Found boundaries of paragraph " + i + ": " + paraStart
                      + "-" + paraLimit + "; expected: " + paraBounds[i] + "-"
                      + paraBounds[i + 1]);
            }

            /* check paraLevel for all paragraphs under various paraLevel specs */
            for (k = 0; k < 6; k++)
            {
                try {
                    bidi.SetPara(src, paraLevels[k], null);
                } catch (ArgumentException e_1) {
                    Errln("3nd Bidi.setPara failed, paraLevel = " + paraLevels[k]);
                }
                for (i = 0; i < paraCount; i++)
                {
                    paraIndex = bidi.GetParagraphIndex(paraBounds[i]);
                    run       = bidi.GetParagraph(paraBounds[i]);
                    if (paraIndex != i)
                    {
                        Errln("#1 For paraLevel = " + paraLevels[k]
                              + " paragraph = " + i + ", found paragraph"
                              + " index = " + paraIndex + " expected = " + i);
                    }
                    gotLevel = run.GetEmbeddingLevel();
                    if (gotLevel != multiLevels[k][i])
                    {
                        Errln("#2 For paraLevel = " + paraLevels[k]
                              + " paragraph = " + i + ", found level = "
                              + gotLevel + ", expected = " + multiLevels[k][i]);
                    }
                }
                gotLevel = bidi.GetParaLevel();
                if (gotLevel != multiLevels[k][0])
                {
                    Errln("#3 For paraLevel = " + paraLevels[k]
                          + " getParaLevel = " + gotLevel + ", expected "
                          + multiLevels[k][0]);
                }
            }

            /*
             * check that the result of Bidi.getParaLevel changes if the first
             * paragraph has a different level
             */
            chars[0] = '\u05d2';     /* Hebrew letter Gimel */
            src      = ILOG.J2CsMapping.Util.StringUtil.NewString(chars);
            try {
                bidi.SetPara(src, IBM.ICU.Text.Bidi.LEVEL_DEFAULT_LTR, null);
            } catch (ArgumentException e_2) {
                Errln("Bidi.setPara failed, paraLevel = " + IBM.ICU.Text.Bidi.LEVEL_DEFAULT_LTR);
            }
            gotLevel = bidi.GetParaLevel();
            if (gotLevel != IBM.ICU.Text.Bidi.RTL)
            {
                Errln("#4 For paraLevel = Bidi.LEVEL_DEFAULT_LTR getParaLevel = "
                      + gotLevel + ", expected = " + IBM.ICU.Text.Bidi.RTL);
            }

            /* check that line cannot overlap paragraph boundaries */
            bidiLine = new Bidi();
            i        = paraBounds[1];
            k        = paraBounds[2] + 1;
            try {
                bidiLine = bidi.SetLine(i, k);
                Errln("For line limits " + i + "-" + k
                      + " got success, while expected failure");
            } catch (Exception e_3) {
            }

            i = paraBounds[1];
            k = paraBounds[2];
            try {
                bidiLine = bidi.SetLine(i, k);
            } catch (Exception e_4) {
                Errln("For line limits " + i + "-" + k + " got failure");
            }

            /*
             * check level of block separator at end of paragraph when
             * orderParagraphsLTR==FALSE
             */
            try {
                bidi.SetPara(src, IBM.ICU.Text.Bidi.RTL, null);
            } catch (ArgumentException e_5) {
                Errln("Bidi.setPara failed, paraLevel = " + IBM.ICU.Text.Bidi.RTL);
            }
            /* get levels through para Bidi block */
            try {
                gotLevels = bidi.GetLevels();
            } catch (Exception e_6) {
                Errln("Error on Bidi.getLevels");
                gotLevels = new sbyte[bidi.GetLength()];
                ILOG.J2CsMapping.Collections.Arrays.Fill(gotLevels, (sbyte)-1);
            }
            for (i = 26; i < 32; i++)
            {
                if (gotLevels[i] != IBM.ICU.Text.Bidi.RTL)
                {
                    Errln("For char " + i + "(0x" + IBM.ICU.Impl.Utility.Hex(chars[i])
                          + "), level = " + gotLevels[i] + ", expected = "
                          + IBM.ICU.Text.Bidi.RTL);
                }
            }
            /* get levels through para Line block */
            i = paraBounds[1];
            k = paraBounds[2];
            try {
                bidiLine = bidi.SetLine(i, k);
            } catch (Exception e_7) {
                Errln("For line limits " + i + "-" + k + " got failure");
                return;
            }
            paraIndex = bidiLine.GetParagraphIndex(i);
            run       = bidiLine.GetParagraph(i);
            try {
                gotLevels = bidiLine.GetLevels();
            } catch (Exception e_8) {
                Errln("Error on bidiLine.getLevels");
                gotLevels = new sbyte[bidiLine.GetLength()];
                ILOG.J2CsMapping.Collections.Arrays.Fill(gotLevels, (sbyte)-1);
            }
            length   = bidiLine.GetLength();
            gotLevel = run.GetEmbeddingLevel();
            if ((gotLevel != IBM.ICU.Text.Bidi.RTL) || (gotLevels[length - 1] != IBM.ICU.Text.Bidi.RTL))
            {
                Errln("For paragraph " + paraIndex + " with limits "
                      + run.GetStart() + "-" + run.GetLimit() + ", paraLevel = "
                      + gotLevel + "expected = " + IBM.ICU.Text.Bidi.RTL
                      + ", level of separator = " + gotLevels[length - 1]
                      + " expected = " + IBM.ICU.Text.Bidi.RTL);
            }
            orderParagraphsLTR = bidi.IsOrderParagraphsLTR();
            AssertFalse("orderParagraphsLTR is true", orderParagraphsLTR);
            bidi.OrderParagraphsLTR(true);
            orderParagraphsLTR = bidi.IsOrderParagraphsLTR();
            AssertTrue("orderParagraphsLTR is false", orderParagraphsLTR);

            /*
             * check level of block separator at end of paragraph when
             * orderParagraphsLTR==TRUE
             */
            try {
                bidi.SetPara(src, IBM.ICU.Text.Bidi.RTL, null);
            } catch (ArgumentException e_9) {
                Errln("Bidi.setPara failed, paraLevel = " + IBM.ICU.Text.Bidi.RTL);
            }
            /* get levels through para Bidi block */
            try {
                gotLevels = bidi.GetLevels();
            } catch (Exception e_10) {
                Errln("Error on Bidi.getLevels");
                gotLevels = new sbyte[bidi.GetLength()];
                ILOG.J2CsMapping.Collections.Arrays.Fill(gotLevels, (sbyte)-1);
            }
            for (i = 26; i < 32; i++)
            {
                if (gotLevels[i] != 0)
                {
                    Errln("For char " + i + "(0x" + IBM.ICU.Impl.Utility.Hex(chars[i])
                          + "), level = " + gotLevels[i] + ", expected = 0");
                }
            }
            /* get levels through para Line block */
            i         = paraBounds[1];
            k         = paraBounds[2];
            paraStart = run.GetStart();
            paraLimit = run.GetLimit();
            try {
                bidiLine = bidi.SetLine(paraStart, paraLimit);
            } catch (Exception e_11) {
                Errln("For line limits " + paraStart + "-" + paraLimit
                      + " got failure");
            }
            paraIndex = bidiLine.GetParagraphIndex(i);
            run       = bidiLine.GetParagraph(i);
            try {
                gotLevels = bidiLine.GetLevels();
            } catch (Exception e_12) {
                Errln("Error on bidiLine.getLevels");
                gotLevels = new sbyte[bidiLine.GetLength()];
                ILOG.J2CsMapping.Collections.Arrays.Fill(gotLevels, (sbyte)-1);
            }
            length   = bidiLine.GetLength();
            gotLevel = run.GetEmbeddingLevel();
            if ((gotLevel != IBM.ICU.Text.Bidi.RTL) || (gotLevels[length - 1] != 0))
            {
                Err("\nFor paragraph " + paraIndex + " with limits "
                    + run.GetStart() + "-" + run.GetLimit() + ", paraLevel = "
                    + gotLevel + "expected = " + IBM.ICU.Text.Bidi.RTL
                    + ", level of separator = " + gotLevels[length - 1]
                    + " expected = 0\nlevels = ");
                for (count = 0; count < length; count++)
                {
                    Errcont(gotLevels[count] + "  ");
                }
                Errcont("\n");
            }

            /*
             * test that the concatenation of separate invocations of the bidi code
             * on each individual paragraph in order matches the levels array that
             * results from invoking bidi once over the entire multiparagraph tests
             * (with orderParagraphsLTR false, of course)
             */
            src = text;     /* restore original content */
            bidi.OrderParagraphsLTR(false);
            try {
                bidi.SetPara(src, IBM.ICU.Text.Bidi.LEVEL_DEFAULT_RTL, null);
            } catch (ArgumentException e_13) {
                Errln("Bidi.setPara failed, paraLevel = " + IBM.ICU.Text.Bidi.LEVEL_DEFAULT_RTL);
            }
            try {
                gotLevels = bidi.GetLevels();
            } catch (Exception e_14) {
                Errln("Error on bidiLine.getLevels");
                gotLevels = new sbyte[bidi.GetLength()];
                ILOG.J2CsMapping.Collections.Arrays.Fill(gotLevels, (sbyte)-1);
            }
            for (i = 0; i < paraCount; i++)
            {
                /* use pLine for individual paragraphs */
                paraStart = paraBounds[i];
                length    = paraBounds[i + 1] - paraStart;
                try {
                    bidiLine.SetPara(src.Substring(paraStart, (paraStart + length) - (paraStart)),
                                     IBM.ICU.Text.Bidi.LEVEL_DEFAULT_RTL, null);
                } catch (ArgumentException e_15) {
                    Errln("Bidi.setPara failed, paraLevel = "
                          + IBM.ICU.Text.Bidi.LEVEL_DEFAULT_RTL);
                }
                for (j = 0; j < length; j++)
                {
                    if ((k = bidiLine.GetLevelAt(j)) != (gotLevel = gotLevels[paraStart
                                                                              + j]))
                    {
                        Errln("Checking paragraph concatenation: for paragraph["
                              + i + "], char[" + j + "] = 0x"
                              + IBM.ICU.Impl.Utility.Hex(src[paraStart + j])
                              + ", level = " + k + ", expected = " + gotLevel);
                    }
                }
            }

            /*
             * ensure that leading numerics in a paragraph are not treated as arabic
             * numerals because of arabic text in a preceding paragraph
             */
            src = text2;
            bidi.OrderParagraphsLTR(true);
            try {
                bidi.SetPara(src, IBM.ICU.Text.Bidi.RTL, null);
            } catch (ArgumentException e_16) {
                Errln("Bidi.setPara failed, paraLevel = " + IBM.ICU.Text.Bidi.RTL);
            }
            try {
                gotLevels = bidi.GetLevels();
            } catch (Exception e_17) {
                Errln("Error on Bidi.getLevels");
                gotLevels = new sbyte[bidi.GetLength()];
                ILOG.J2CsMapping.Collections.Arrays.Fill(gotLevels, (sbyte)-1);
            }
            for (i = 0, length = src.Length; i < length; i++)
            {
                if (gotLevels[i] != levels2[i])
                {
                    Errln("Checking leading numerics: for char " + i + "(0x"
                          + IBM.ICU.Impl.Utility.Hex(src[i]) + "), level = "
                          + gotLevels[i] + ", expected = " + levels2[i]);
                }
            }

            /*
             * check handling of whitespace before end of paragraph separator when
             * orderParagraphsLTR==TRUE, when last paragraph has, and lacks, a
             * terminating B
             */
            chars = src.ToCharArray();
            ILOG.J2CsMapping.Collections.Arrays.Fill(chars, '\u0020');
            bidi.OrderParagraphsLTR(true);
            for (i = 0x001c; i <= 0x0020; i += (0x0020 - 0x001c))
            {
                chars[4] = (char)i;      /* with and without terminating B */
                for (j = 0x0041; j <= 0x05d0; j += (0x05d0 - 0x0041))
                {
                    chars[0] = (char)j;      /* leading 'A' or Alef */
                    src      = ILOG.J2CsMapping.Util.StringUtil.NewString(chars);
                    for (gotLevel = 4; gotLevel <= 5; gotLevel++)
                    {
                        /* test even and odd paraLevel */
                        try {
                            bidi.SetPara(src, gotLevel, null);
                        } catch (ArgumentException e_18) {
                            Errln("Bidi.setPara failed, paraLevel = " + gotLevel);
                        }
                        try {
                            gotLevels = bidi.GetLevels();
                        } catch (Exception e_19) {
                            Errln("Error on Bidi.getLevels");
                            gotLevels = new sbyte[bidi.GetLength()];
                            ILOG.J2CsMapping.Collections.Arrays.Fill(gotLevels, (sbyte)-1);
                        }
                        for (k = 1; k <= 3; k++)
                        {
                            if (gotLevels[k] != gotLevel)
                            {
                                Errln("Checking trailing spaces for leading char 0x"
                                      + IBM.ICU.Impl.Utility.Hex(chars[0])
                                      + ", last_char = "
                                      + IBM.ICU.Impl.Utility.Hex(chars[4])
                                      + ", index = "
                                      + k
                                      + "level = "
                                      + gotLevels[k]
                                      + ", expected = " + gotLevel);
                            }
                        }
                    }
                }
            }

            /*
             * check default orientation when inverse bidi and paragraph starts with
             * LTR strong char and ends with RTL strong char, with and without a
             * terminating B
             */
            bidi.SetReorderingMode(IBM.ICU.Text.Bidi.REORDER_INVERSE_LIKE_DIRECT);
            bidi.SetPara("abc \u05d2\u05d1\n", IBM.ICU.Text.Bidi.LEVEL_DEFAULT_LTR, null);
            String xout = bidi.WriteReordered(0);

            AssertEquals("\nInvalid output", "\u05d1\u05d2 abc\n", xout);
            bidi.SetPara("abc \u05d2\u05d1", IBM.ICU.Text.Bidi.LEVEL_DEFAULT_LTR, null);
            xout = bidi.WriteReordered(0);
            AssertEquals("\nInvalid output #1", "\u05d1\u05d2 abc", xout);

            /*
             * check multiple paragraphs together with explicit levels
             */
            bidi.SetReorderingMode(IBM.ICU.Text.Bidi.REORDER_DEFAULT);
            gotLevels = new sbyte[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
            bidi.SetPara("ab\u05d1\u05d2\n\u05d3\u05d4123", IBM.ICU.Text.Bidi.LTR, gotLevels);
            xout = bidi.WriteReordered(0);
            AssertEquals("\nInvalid output #2", "ab\u05d2\u05d1\n123\u05d4\u05d3",
                         xout);
            AssertEquals("\nInvalid number of paras", 2, bidi.CountParagraphs());

            Logln("\nExiting TestMultipleParagraphs\n");
        }
Esempio n. 2
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");
        }
Esempio n. 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");
        }
Esempio 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());
        }
Esempio n. 5
0
        internal void CompareBidi(Bidi bidi, Bidi jbidi)
        {
            sbyte paraLevel = bidi.GetParaLevel();

            if (bidi.BaseIsLeftToRight() != jbidi.BaseIsLeftToRight())
            {
                Errln("Discrepancy in baseIsLeftToRight for case " + "(level="
                      + paraLevel + "): " + IBM.ICU.Charset.BidiTest.U16ToPseudo(bidi.GetTextAsString())
                      + "\n    bidi: " + bidi.BaseIsLeftToRight()
                      + "\n   jbidi: " + jbidi.BaseIsLeftToRight());
            }
            if (bidi.GetBaseLevel() != jbidi.GetBaseLevel())
            {
                Errln("Discrepancy in getBaseLevel for case " + "(level="
                      + paraLevel + "): " + IBM.ICU.Charset.BidiTest.U16ToPseudo(bidi.GetTextAsString())
                      + "\n    bidi: " + bidi.GetBaseLevel() + "\n   jbidi: "
                      + jbidi.GetBaseLevel());
            }
            if (bidi.GetLength() != jbidi.GetLength())
            {
                Errln("Discrepancy in getLength for case " + "(level=" + paraLevel
                      + "): " + IBM.ICU.Charset.BidiTest.U16ToPseudo(bidi.GetTextAsString())
                      + "\n    bidi: " + bidi.GetLength() + "\n   jbidi: "
                      + jbidi.GetLength());
            }
            int len = bidi.GetLength();

            for (int i = 0; i < len; i++)
            {
                if (bidi.GetLevelAt(i) != jbidi.GetLevelAt(i))
                {
                    Errln("Discrepancy in getLevelAt for offset " + i + " of case "
                          + "(level=" + paraLevel + "): "
                          + IBM.ICU.Charset.BidiTest.U16ToPseudo(bidi.GetTextAsString()) + "\n    bidi: "
                          + bidi.GetLevelAt(i) + "\n   jbidi: "
                          + jbidi.GetLevelAt(i));
                }
            }
            if (bidi.GetRunCount() != jbidi.GetRunCount())
            {
                if (!(len == 0 && jbidi.GetRunCount() == 1))
                {
                    Errln("Discrepancy in getRunCount for case " + "(level="
                          + paraLevel + "): "
                          + IBM.ICU.Charset.BidiTest.U16ToPseudo(bidi.GetTextAsString()) + "\n    bidi: "
                          + bidi.GetRunCount() + "\n   jbidi: "
                          + jbidi.GetRunCount());
                }
            }
            int runCount = bidi.GetRunCount();

            for (int i_0 = 0; i_0 < runCount; i_0++)
            {
                if (bidi.GetRunLevel(i_0) != jbidi.GetRunLevel(i_0))
                {
                    Errln("Discrepancy in getRunLevel for run " + i_0 + " of case "
                          + "(level=" + paraLevel + "): "
                          + IBM.ICU.Charset.BidiTest.U16ToPseudo(bidi.GetTextAsString()) + "\n    bidi: "
                          + bidi.GetRunLevel(i_0) + "\n   jbidi: "
                          + jbidi.GetRunLevel(i_0));
                }
                if (bidi.GetRunLimit(i_0) != jbidi.GetRunLimit(i_0))
                {
                    Errln("Discrepancy in getRunLimit for run " + i_0 + " of case "
                          + "(level=" + paraLevel + "): "
                          + IBM.ICU.Charset.BidiTest.U16ToPseudo(bidi.GetTextAsString()) + "\n    bidi: "
                          + bidi.GetRunLimit(i_0) + "\n   jbidi: "
                          + jbidi.GetRunLimit(i_0));
                }
                if (bidi.GetRunStart(i_0) != jbidi.GetRunStart(i_0))
                {
                    Errln("Discrepancy in getRunStart for run " + i_0 + " of case "
                          + "(level=" + paraLevel + "): "
                          + IBM.ICU.Charset.BidiTest.U16ToPseudo(bidi.GetTextAsString()) + "\n    bidi: "
                          + bidi.GetRunStart(i_0) + "\n   jbidi: "
                          + jbidi.GetRunStart(i_0));
                }
            }
            if (bidi.IsLeftToRight() != jbidi.IsLeftToRight())
            {
                Errln("Discrepancy in isLeftToRight for case " + "(level="
                      + paraLevel + "): " + IBM.ICU.Charset.BidiTest.U16ToPseudo(bidi.GetTextAsString())
                      + "\n    bidi: " + bidi.IsLeftToRight() + "\n   jbidi: "
                      + jbidi.IsLeftToRight());
            }
            if (bidi.IsMixed() != jbidi.IsMixed())
            {
                Errln("Discrepancy in isMixed for case " + "(level=" + paraLevel
                      + "): " + IBM.ICU.Charset.BidiTest.U16ToPseudo(bidi.GetTextAsString())
                      + "\n    bidi: " + bidi.IsMixed() + "\n   jbidi: "
                      + jbidi.IsMixed());
            }
            if (bidi.IsRightToLeft() != jbidi.IsRightToLeft())
            {
                Errln("Discrepancy in isRightToLeft for case " + "(level="
                      + paraLevel + "): " + IBM.ICU.Charset.BidiTest.U16ToPseudo(bidi.GetTextAsString())
                      + "\n    bidi: " + bidi.IsRightToLeft() + "\n   jbidi: "
                      + jbidi.IsRightToLeft());
            }
            char[] text = bidi.GetText();
            if (IBM.ICU.Text.Bidi.RequiresBidi(text, 0, text.Length) != Bidi
                .RequiresBidi(text, 0, text.Length))
            {
                Errln("Discrepancy in requiresBidi for case "
                      + IBM.ICU.Charset.BidiTest.U16ToPseudo(bidi.GetTextAsString()) + "\n    bidi: "
                      + IBM.ICU.Text.Bidi.RequiresBidi(text, 0, text.Length) + "\n   jbidi: "
                      + Bidi.RequiresBidi(text, 0, text.Length));
            }

            /*
             * skip the next test, since the toString implementation are not
             * compatible if (!bidi.toString().equals(jbidi.toString())) {
             * errln("Discrepancy in toString for case " + "(level=" + paraLevel +
             * "): " + u16ToPseudo(bidi.getTextAsString() + "\n    bidi: " +
             * bidi.toString() + "\n   jbidi: " + jbidi.toString())); }
             */
        }