private bool CheckMaps(Bidi bidi, int stringIndex, String src, String dest, String mode, String option, sbyte level, bool forward) { int[] actualLogicalMap; int[] actualVisualMap; int[] getIndexMap; int i, srcLen, resLen, index; int[] expectedLogicalMap, expectedVisualMap; bool testOK = true; if (forward) { expectedLogicalMap = forwardMap[stringIndex]; expectedVisualMap = inverseMap[stringIndex]; } else { expectedLogicalMap = inverseMap[stringIndex]; expectedVisualMap = forwardMap[stringIndex]; } actualLogicalMap = bidi.GetLogicalMap(); srcLen = bidi.GetProcessedLength(); if (!ILOG.J2CsMapping.Collections.Arrays.Equals(expectedLogicalMap, actualLogicalMap)) { Err("Bidi.getLogicalMap returned unexpected map for output " + "string index " + stringIndex + "\n" + "source: " + src + "\n" + "dest : " + dest + "\n" + "Scale : " + IBM.ICU.Charset.BidiTest.columnString + "\n" + "ExpMap: " + FormatMap(expectedLogicalMap) + "\n" + "Actual: " + FormatMap(actualLogicalMap) + "\n" + "Paragraph level : " + level + " == " + bidi.GetParaLevel() + "\n" + "Reordering mode : " + mode + " == " + bidi.GetReorderingMode() + "\n" + "Reordering option: " + option + " == " + bidi.GetReorderingOptions() + "\n" + "Forward flag : " + forward + "\n"); testOK = false; } resLen = bidi.GetResultLength(); actualVisualMap = bidi.GetVisualMap(); if (!ILOG.J2CsMapping.Collections.Arrays.Equals(expectedVisualMap, actualVisualMap)) { Err("Bidi.getVisualMap returned unexpected map for output " + "string index " + stringIndex + "\n" + "source: " + src + "\n" + "dest : " + dest + "\n" + "Scale : " + IBM.ICU.Charset.BidiTest.columnString + "\n" + "ExpMap: " + FormatMap(expectedVisualMap) + "\n" + "Actual: " + FormatMap(actualVisualMap) + "\n" + "Paragraph level : " + level + " == " + bidi.GetParaLevel() + "\n" + "Reordering mode : " + mode + " == " + bidi.GetReorderingMode() + "\n" + "Reordering option: " + option + " == " + bidi.GetReorderingOptions() + "\n" + "Forward flag : " + forward + "\n"); testOK = false; } getIndexMap = new int[srcLen]; for (i = 0; i < srcLen; i++) { index = bidi.GetVisualIndex(i); getIndexMap[i] = index; } if (!ILOG.J2CsMapping.Collections.Arrays.Equals(actualLogicalMap, getIndexMap)) { Err("Mismatch between getLogicalMap and getVisualIndex for output " + "string index " + stringIndex + "\n" + "source: " + src + "\n" + "dest : " + dest + "\n" + "Scale : " + IBM.ICU.Charset.BidiTest.columnString + "\n" + "ActMap: " + FormatMap(actualLogicalMap) + "\n" + "IdxMap: " + FormatMap(getIndexMap) + "\n" + "Paragraph level : " + level + " == " + bidi.GetParaLevel() + "\n" + "Reordering mode : " + mode + " == " + bidi.GetReorderingMode() + "\n" + "Reordering option: " + option + " == " + bidi.GetReorderingOptions() + "\n" + "Forward flag : " + forward + "\n"); testOK = false; } getIndexMap = new int[resLen]; for (i = 0; i < resLen; i++) { index = bidi.GetLogicalIndex(i); getIndexMap[i] = index; } if (!ILOG.J2CsMapping.Collections.Arrays.Equals(actualVisualMap, getIndexMap)) { Err("Mismatch between getVisualMap and getLogicalIndex for output " + "string index " + stringIndex + "\n" + "source: " + src + "\n" + "dest : " + dest + "\n" + "Scale : " + IBM.ICU.Charset.BidiTest.columnString + "\n" + "ActMap: " + FormatMap(actualVisualMap) + "\n" + "IdxMap: " + FormatMap(getIndexMap) + "\n" + "Paragraph level : " + level + " == " + bidi.GetParaLevel() + "\n" + "Reordering mode : " + mode + " == " + bidi.GetReorderingMode() + "\n" + "Reordering option: " + option + " == " + bidi.GetReorderingOptions() + "\n" + "Forward flag : " + forward + "\n"); testOK = false; } return(testOK); }
private void _testReordering(Bidi bidi, int testNumber) { int[] logicalMap1; int[] logicalMap2; int[] logicalMap3; int[] visualMap1; int[] visualMap2; int[] visualMap3; int[] visualMap4 = new int[MAXLEN]; sbyte[] levels; int i, length = bidi.GetLength(), destLength = bidi.GetResultLength(); int runCount, visualIndex, logicalIndex = -1, logicalStart, runLength; bool odd; if (length <= 0) { return; } /* get the logical and visual maps from the object */ logicalMap1 = bidi.GetLogicalMap(); if (logicalMap1 == null) { Errln("getLogicalMap in test " + testNumber + " is null"); logicalMap1 = new int[0]; } visualMap1 = bidi.GetVisualMap(); if (visualMap1 == null) { Errln("getVisualMap() in test " + testNumber + " is null"); visualMap1 = new int[0]; } /* invert them both */ visualMap2 = IBM.ICU.Text.Bidi.InvertMap(logicalMap1); logicalMap2 = IBM.ICU.Text.Bidi.InvertMap(visualMap1); /* get them from the levels array, too */ levels = bidi.GetLevels(); if (levels == null || levels.Length != length) { Errln("getLevels() in test " + testNumber + " failed"); } logicalMap3 = IBM.ICU.Text.Bidi.ReorderLogical(levels); visualMap3 = IBM.ICU.Text.Bidi.ReorderVisual(levels); /* get the visual map from the runs, too */ try { runCount = bidi.CountRuns(); } catch (InvalidOperationException e) { Errln("countRuns() in test " + testNumber + " failed"); runCount = 0; } Logln("\n---- " + runCount + " runs"); visualIndex = 0; BidiRun run; for (i = 0; i < runCount; ++i) { run = bidi.GetVisualRun(i); if (run == null) { Errln("null visual run encountered at index " + i + ", in test " + testNumber); continue; } odd = run.IsOddRun(); logicalStart = run.GetStart(); runLength = run.GetLength(); Log("(" + ((run.IsOddRun()) ? "R" : "L")); Log(" @" + run.GetStart() + '[' + run.GetLength() + "])\n"); if (!odd) { do /* LTR */ { visualMap4[visualIndex++] = logicalStart++; } while (--runLength > 0); } else { logicalStart += runLength; /* logicalLimit */ do /* RTL */ { visualMap4[visualIndex++] = --logicalStart; } while (--runLength > 0); } } Log("\n"); /* print all the maps */ Logln("logical maps:"); for (i = 0; i < length; ++i) { Log(logicalMap1[i] + " "); } Log("\n"); for (i = 0; i < length; ++i) { Log(logicalMap2[i] + " "); } Log("\n"); for (i = 0; i < length; ++i) { Log(logicalMap3[i] + " "); } Log("\nvisual maps:\n"); for (i = 0; i < destLength; ++i) { Log(visualMap1[i] + " "); } Log("\n"); for (i = 0; i < destLength; ++i) { Log(visualMap2[i] + " "); } Log("\n"); for (i = 0; i < length; ++i) { Log(visualMap3[i] + " "); } Log("\n"); for (i = 0; i < length; ++i) { Log(visualMap4[i] + " "); } Log("\n"); /* * check that the indexes are the same between these and * Bidi.getLogical/VisualIndex() */ for (i = 0; i < length; ++i) { if (logicalMap1[i] != logicalMap2[i]) { Errln("Error in tests[" + testNumber + "]: (logicalMap1[" + i + "] == " + logicalMap1[i] + ") != (logicalMap2[" + i + "] == " + logicalMap2[i] + ")"); } if (logicalMap1[i] != logicalMap3[i]) { Errln("Error in tests[" + testNumber + "]: (logicalMap1[" + i + "] == " + logicalMap1[i] + ") != (logicalMap3[" + i + "] == " + logicalMap3[i] + ")"); } if (visualMap1[i] != visualMap2[i]) { Errln("Error in tests[" + testNumber + "]: (visualMap1[" + i + "] == " + visualMap1[i] + ") != (visualMap2[" + i + "] == " + visualMap2[i] + ")"); } if (visualMap1[i] != visualMap3[i]) { Errln("Error in tests[" + testNumber + "]: (visualMap1[" + i + "] == " + visualMap1[i] + ") != (visualMap3[" + i + "] == " + visualMap3[i] + ")"); } if (visualMap1[i] != visualMap4[i]) { Errln("Error in tests[" + testNumber + "]: (visualMap1[" + i + "] == " + visualMap1[i] + ") != (visualMap4[" + i + "] == " + visualMap4[i] + ")"); } try { visualIndex = bidi.GetVisualIndex(i); } catch (Exception e_0) { Errln("Bidi.getVisualIndex(" + i + ") failed in tests[" + testNumber + "]"); } if (logicalMap1[i] != visualIndex) { Errln("Error in tests[" + testNumber + "]: (logicalMap1[" + i + "] == " + logicalMap1[i] + ") != (Bidi.getVisualIndex(" + i + ") == " + visualIndex + ")"); } try { logicalIndex = bidi.GetLogicalIndex(i); } catch (Exception e_1) { Errln("Bidi.getLogicalIndex(" + i + ") failed in tests[" + testNumber + "]"); } if (visualMap1[i] != logicalIndex) { Errln("Error in tests[" + testNumber + "]: (visualMap1[" + i + "] == " + visualMap1[i] + ") != (Bidi.getLogicalIndex(" + i + ") == " + logicalIndex + ")"); } } }
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 bool CheckWhatYouCan(Bidi bidi, String src, String dst) { int i, idx, logLimit, visLimit; bool testOK, errMap, errDst; char[] srcChars = src.ToCharArray(); char[] dstChars = dst.ToCharArray(); int[] visMap = bidi.GetVisualMap(); int[] logMap = bidi.GetLogicalMap(); testOK = true; errMap = errDst = false; logLimit = bidi.GetProcessedLength(); visLimit = bidi.GetResultLength(); if (visLimit > dstChars.Length) { visLimit = dstChars.Length; } char[] accumSrc = new char[logLimit]; char[] accumDst = new char[visLimit]; ILOG.J2CsMapping.Collections.Arrays.Fill(accumSrc, '?'); ILOG.J2CsMapping.Collections.Arrays.Fill(accumDst, '?'); if (logMap.Length != logLimit) { errMap = true; } for (i = 0; i < logLimit; i++) { idx = bidi.GetVisualIndex(i); if (idx != logMap[i]) { errMap = true; } if (idx == IBM.ICU.Text.Bidi.MAP_NOWHERE) { continue; } if (idx >= visLimit) { continue; } accumDst[idx] = srcChars[i]; if (!MatchingPair(bidi, i, srcChars[i], dstChars[idx])) { errDst = true; } } if (errMap) { if (testOK) { PrintCaseInfo(bidi, src, dst); testOK = false; } Errln("Mismatch between getLogicalMap() and getVisualIndex()"); Errcont("Map :" + ValueOf(logMap)); Errcont("\n"); Errcont("Indexes:"); for (i = 0; i < logLimit; i++) { Errcont(" " + bidi.GetVisualIndex(i)); } Errcont("\n"); } if (errDst) { if (testOK) { PrintCaseInfo(bidi, src, dst); testOK = false; } Errln("Source does not map to Result"); Errcontln("We got: " + ILOG.J2CsMapping.Util.StringUtil.NewString(accumDst)); } errMap = errDst = false; if (visMap.Length != visLimit) { errMap = true; } for (i = 0; i < visLimit; i++) { idx = bidi.GetLogicalIndex(i); if (idx != visMap[i]) { errMap = true; } if (idx == IBM.ICU.Text.Bidi.MAP_NOWHERE) { continue; } if (idx >= logLimit) { continue; } accumSrc[idx] = dstChars[i]; if (!MatchingPair(bidi, idx, srcChars[idx], dstChars[i])) { errDst = true; } } if (errMap) { if (testOK) { PrintCaseInfo(bidi, src, dst); testOK = false; } Errln("Mismatch between getVisualMap() and getLogicalIndex()"); Errcont("Map :" + ValueOf(visMap)); Errcont("\n"); Errcont("Indexes:"); for (i = 0; i < visLimit; i++) { Errcont(" " + bidi.GetLogicalIndex(i)); } Errcont("\n"); } if (errDst) { if (testOK) { PrintCaseInfo(bidi, src, dst); testOK = false; } Errln("Result does not map to Source"); Errcontln("We got: " + ILOG.J2CsMapping.Util.StringUtil.NewString(accumSrc)); } return(testOK); }