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"); }
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"); }
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"); }
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()); }
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())); } */ }