17935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert/*
27935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert*******************************************************************************
37935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert*   Copyright (C) 2007-2010, International Business Machines
47935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert*   Corporation and others.  All Rights Reserved.
57935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert*******************************************************************************
67935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert*/
77935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
87935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertpackage com.ibm.icu.dev.test.bidi;
97935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.awt.font.NumericShaper;
117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.awt.font.TextAttribute;
127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.text.AttributedCharacterIterator;
137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.text.AttributedString;
147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.text.Bidi;
167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert/**
187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Regression test for java.text.Bidi compatibility
197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert *
207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @author Matitiahu Allouche
217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */
227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertpublic class TestCompatibility extends BidiTest {
247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    void compareBidi(Bidi bidi, java.text.Bidi jbidi)
267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    {
277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        byte paraLevel = bidi.getParaLevel();
287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (bidi.baseIsLeftToRight() != jbidi.baseIsLeftToRight()) {
297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Discrepancy in baseIsLeftToRight for case " +
307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                  "(level=" + paraLevel + "): " +
317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                  u16ToPseudo(bidi.getTextAsString()) +
327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                  "\n    bidi: " + bidi.baseIsLeftToRight() +
337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                  "\n   jbidi: " + jbidi.baseIsLeftToRight());
347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (bidi.getBaseLevel() != jbidi.getBaseLevel()) {
367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Discrepancy in getBaseLevel for case " +
377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                  "(level=" + paraLevel + "): " +
387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                  u16ToPseudo(bidi.getTextAsString()) +
397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                  "\n    bidi: " + bidi.getBaseLevel() +
407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                  "\n   jbidi: " + jbidi.getBaseLevel());
417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (bidi.getLength() != jbidi.getLength()) {
437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Discrepancy in getLength for case " +
447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                  "(level=" + paraLevel + "): " +
457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                  u16ToPseudo(bidi.getTextAsString()) +
467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                  "\n    bidi: " + bidi.getLength() +
477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                  "\n   jbidi: " + jbidi.getLength());
487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int len = bidi.getLength();
507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0; i < len; i++) {
517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (bidi.getLevelAt(i) != jbidi.getLevelAt(i)) {
527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Discrepancy in getLevelAt for offset " + i +
537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                      " of case " +
547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                      "(level=" + paraLevel + "): " +
557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                      u16ToPseudo(bidi.getTextAsString()) +
567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                      "\n    bidi: " + bidi.getLevelAt(i) +
577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                      "\n   jbidi: " + jbidi.getLevelAt(i));
587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (bidi.getRunCount() != jbidi.getRunCount()) {
617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (!(len == 0 && jbidi.getRunCount() == 1)) {
627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Discrepancy in getRunCount for case " +
637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                      "(level=" + paraLevel + "): " +
647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                      u16ToPseudo(bidi.getTextAsString()) +
657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                      "\n    bidi: " + bidi.getRunCount() +
667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                      "\n   jbidi: " + jbidi.getRunCount());
677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int runCount = bidi.getRunCount();
707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0; i < runCount; i++) {
717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (bidi.getRunLevel(i) != jbidi.getRunLevel(i)) {
727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Discrepancy in getRunLevel for run " + i +
737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                      " of case " +
747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                      "(level=" + paraLevel + "): " +
757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                      u16ToPseudo(bidi.getTextAsString()) +
767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                      "\n    bidi: " + bidi.getRunLevel(i) +
777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                      "\n   jbidi: " + jbidi.getRunLevel(i));
787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (bidi.getRunLimit(i) != jbidi.getRunLimit(i)) {
807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Discrepancy in getRunLimit for run " + i +
817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                      " of case " +
827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                      "(level=" + paraLevel + "): " +
837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                      u16ToPseudo(bidi.getTextAsString()) +
847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                      "\n    bidi: " + bidi.getRunLimit(i) +
857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                      "\n   jbidi: " + jbidi.getRunLimit(i));
867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (bidi.getRunStart(i) != jbidi.getRunStart(i)) {
887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Discrepancy in getRunStart for run " + i +
897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                      " of case " +
907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                      "(level=" + paraLevel + "): " +
917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                      u16ToPseudo(bidi.getTextAsString()) +
927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                      "\n    bidi: " + bidi.getRunStart(i) +
937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                      "\n   jbidi: " + jbidi.getRunStart(i));
947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (bidi.isLeftToRight() != jbidi.isLeftToRight()) {
977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Discrepancy in isLeftToRight for case " +
987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                  "(level=" + paraLevel + "): " +
997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                  u16ToPseudo(bidi.getTextAsString()) +
1007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                  "\n    bidi: " + bidi.isLeftToRight() +
1017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                  "\n   jbidi: " + jbidi.isLeftToRight());
1027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
1037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (bidi.isMixed() != jbidi.isMixed()) {
1047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Discrepancy in isMixed for case " +
1057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                  "(level=" + paraLevel + "): " +
1067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                  u16ToPseudo(bidi.getTextAsString()) +
1077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                  "\n    bidi: " + bidi.isMixed() +
1087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                  "\n   jbidi: " + jbidi.isMixed());
1097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
1107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (bidi.isRightToLeft() != jbidi.isRightToLeft()) {
1117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Discrepancy in isRightToLeft for case " +
1127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                  "(level=" + paraLevel + "): " +
1137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                  u16ToPseudo(bidi.getTextAsString()) +
1147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                  "\n    bidi: " + bidi.isRightToLeft() +
1157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                  "\n   jbidi: " + jbidi.isRightToLeft());
1167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
1177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        char[] text = bidi.getText();
1187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (Bidi.requiresBidi(text, 0, text.length) !=
1197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            java.text.Bidi.requiresBidi(text, 0, text.length)) {
1207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Discrepancy in requiresBidi for case " +
1217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                  u16ToPseudo(bidi.getTextAsString()) +
1227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                  "\n    bidi: " + Bidi.requiresBidi(text, 0, text.length) +
1237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                  "\n   jbidi: " + java.text.Bidi.requiresBidi(text, 0, text.length));
1247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
1257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /* skip the next test, since the toString implementation are
1267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         * not compatible
1277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!bidi.toString().equals(jbidi.toString())) {
1287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Discrepancy in toString for case " +
1297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                  "(level=" + paraLevel + "): " +
1307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                  u16ToPseudo(bidi.getTextAsString() +
1317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                  "\n    bidi: " + bidi.toString() +
1327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                  "\n   jbidi: " + jbidi.toString()));
1337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
1347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         */
1357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
1367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void testCompatibility()
1387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    {
1397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // This test case does not work well on Java 1.4/1.4.1 environment,
1407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // because of insufficient Bidi implementation in these versions.
1417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // This test case also does not work will with Java 1.7 environment,
1427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // because the changes to the Java Bidi implementation.
1437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String javaVersion = System.getProperty("java.version");
1447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (javaVersion.startsWith("1.4.0") || javaVersion.startsWith("1.4.1") || javaVersion.startsWith("1.7")) {
1457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln("\nSkipping TestCompatibility.  The test case is known to fail on Java "
1467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    + javaVersion + "\n");
1477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return;
1487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
1497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("\nEntering TestCompatibility\n");
1507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /* check constant field values */
1517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int val;
1527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        val = Bidi.DIRECTION_DEFAULT_LEFT_TO_RIGHT;
1537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        val = Bidi.DIRECTION_DEFAULT_RIGHT_TO_LEFT;
1547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        val = Bidi.DIRECTION_LEFT_TO_RIGHT;
1557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        val = Bidi.DIRECTION_RIGHT_TO_LEFT;
1567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("last val = " + val);
1577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String[] data = {"",
1597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                         /* the following 2 cases are skipped, because
1607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          * java.text.Bidi has bugs which cause discrepancies
1617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                         "abc",
1627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                         "ABC",
1637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          */
1647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                         "abc def",
1657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                         "ABC DEF",
1667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                         "abc 123 def",
1677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                         "ABC 123 DEF",
1687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                         "abc DEF ghi",
1697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                         "abc DEF 123 xyz",
1707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                         "abc GHIJ 12345 def KLM"
1717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        };
1727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int dataCnt = data.length;
1737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Bidi bidi;
1747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        java.text.Bidi jbidi;
1757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0; i < dataCnt; i++) {
1767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String src = pseudoToU16(data[i]);
1777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            bidi = new Bidi(src, Bidi.DIRECTION_LEFT_TO_RIGHT);
1787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            jbidi = new java.text.Bidi(src, java.text.Bidi.DIRECTION_LEFT_TO_RIGHT);
1797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            compareBidi(bidi, jbidi);
1807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            bidi = new Bidi(src, Bidi.DIRECTION_RIGHT_TO_LEFT);
1817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            jbidi = new java.text.Bidi(src, java.text.Bidi.DIRECTION_RIGHT_TO_LEFT);
1827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            compareBidi(bidi, jbidi);
1837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            char[] chars = src.toCharArray();
1847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            bidi = new Bidi(chars, 0, null, 0, chars.length, Bidi.DIRECTION_LEFT_TO_RIGHT);
1857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            jbidi = new java.text.Bidi(chars, 0, null, 0, chars.length, java.text.Bidi.DIRECTION_LEFT_TO_RIGHT);
1867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            compareBidi(bidi, jbidi);
1877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
1887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /* check bogus flags */
1897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        bidi = new Bidi("abc", 999);
1907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("\nDirection should be LTR", Bidi.LTR, bidi.getDirection());
1917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /* check constructor with overriding embeddings */
1927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        bidi = new Bidi(new char[] { 's', 's', 's' }, 0,
1937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        new byte[] {(byte) -7, (byte) -2, (byte) -3 },
1947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        0, 3, Bidi.DIRECTION_DEFAULT_LEFT_TO_RIGHT);
1957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        jbidi = new java.text.Bidi(new char[] { 's', 's', 's' }, 0,
1967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        new byte[] {(byte) -7, (byte) -2, (byte) -3 },
1977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        0, 3, Bidi.DIRECTION_DEFAULT_LEFT_TO_RIGHT);
1987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        AttributedString as = new AttributedString("HEBREW 123 english MOREHEB");
2007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        as.addAttribute(TextAttribute.RUN_DIRECTION, TextAttribute.RUN_DIRECTION_RTL);
2017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        as.addAttribute(TextAttribute.NUMERIC_SHAPING, NumericShaper.getShaper(NumericShaper.ARABIC));
2027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        as.addAttribute(TextAttribute.BIDI_EMBEDDING, new Integer(1), 0, 26);
2037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        as.addAttribute(TextAttribute.BIDI_EMBEDDING, new Integer(-1), 0, 6);
2047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        as.addAttribute(TextAttribute.BIDI_EMBEDDING, new Integer(-1), 19, 26);
2057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        AttributedCharacterIterator aci = as.getIterator();
2067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        bidi = new Bidi(aci);
2077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        jbidi = new java.text.Bidi(aci);
2087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        compareBidi(bidi, jbidi);
2097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String out = bidi.writeReordered(0);
2107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("Output #1 of Bidi(AttributedCharacterIterator): " + out);
2117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        as = new AttributedString("HEBREW 123 english MOREHEB");
2137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        as.addAttribute(TextAttribute.RUN_DIRECTION, TextAttribute.RUN_DIRECTION_RTL);
2147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        as.addAttribute(TextAttribute.BIDI_EMBEDDING, new Integer(0), 0, 26);
2157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        aci = as.getIterator();
2167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        bidi = new Bidi(aci);
2177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        jbidi = new java.text.Bidi(aci);
2187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        compareBidi(bidi, jbidi);
2197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        out = bidi.writeReordered(0);
2207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("Output #2 of Bidi(AttributedCharacterIterator): " + out);
2217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        as = new AttributedString("HEBREW 123 english MOREHEB");
2237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        aci = as.getIterator();
2247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        bidi = new Bidi(aci);
2257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        jbidi = new java.text.Bidi(aci);
2267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        compareBidi(bidi, jbidi);
2277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        out = bidi.writeReordered(0);
2287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("Output #3 of Bidi(AttributedCharacterIterator): " + out);
2297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        char[] text = "abc==(123)==>def".toCharArray();
2317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        bidi = new Bidi(text, 3, null, 0, 10, Bidi.DIRECTION_DEFAULT_LEFT_TO_RIGHT);
2327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        jbidi = new java.text.Bidi(text, 3, null, 0, 10, java.text.Bidi.DIRECTION_DEFAULT_LEFT_TO_RIGHT);
2337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        compareBidi(bidi, jbidi);
2347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        out = bidi.writeReordered(0);
2357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("Output of Bidi(abc==(123)==>def,3,null,0,10, DEFAULT_LTR): " + out);
2367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        bidi = new Bidi(text, 3, null, 0, 10, Bidi.DIRECTION_DEFAULT_RIGHT_TO_LEFT);
2377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        jbidi = new java.text.Bidi(text, 3, null, 0, 10, java.text.Bidi.DIRECTION_DEFAULT_RIGHT_TO_LEFT);
2387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        compareBidi(bidi, jbidi);
2397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        out = bidi.writeReordered(0);
2407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("Output of Bidi(abc==(123)==>def,3,null,0,10, DEFAULT_RTL): " + out);
2417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        byte[] levels = new byte[] {0,0,0,-1,-1,-1,0,0,0,0};
2427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        bidi = new Bidi(text, 3, levels, 0, 10, Bidi.DIRECTION_LEFT_TO_RIGHT);
2437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        jbidi = new java.text.Bidi(text, 3, levels, 0, 10, java.text.Bidi.DIRECTION_LEFT_TO_RIGHT);
2447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        compareBidi(bidi, jbidi);
2457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        out = bidi.writeReordered(0);
2467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("Output of Bidi(abc==(123)==>def,3,levels,0,10, LTR): " + out);
2477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        bidi = new Bidi(text, 3, levels, 0, 10, Bidi.DIRECTION_DEFAULT_RIGHT_TO_LEFT);
2487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        jbidi = new java.text.Bidi(text, 3, levels, 0, 10, java.text.Bidi.DIRECTION_DEFAULT_RIGHT_TO_LEFT);
2497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        compareBidi(bidi, jbidi);
2507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        out = bidi.writeReordered(0);
2517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("Output of Bidi(abc==(123)==>def,3,levels,0,10, DEFAULT_RTL): " + out);
2527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /* test reorderVisually */
2547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        byte[] myLevels = new byte[] {1,2,0,1,2,1,2,0,1,2};
2557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Character[] objects = new Character[10];
2567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        levels = new byte[objects.length];
2577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0; i < objects.length; i++) {
2587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            objects[i] = new Character((char)('a'+i));
2597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            levels[i] = myLevels[i];
2607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
2617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Bidi.reorderVisually(levels, 3, objects, 3, 7);
2627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String strbidi = "";
2637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0; i < objects.length; i++) {
2647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            strbidi += objects[i].toString();
2657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
2667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0; i < objects.length; i++) {
2677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            objects[i] = new Character((char)('a'+i));
2687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            levels[i] = myLevels[i];
2697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
2707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        java.text.Bidi.reorderVisually(levels, 3, objects, 3, 7);
2717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String strjbidi = "";
2727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0; i < objects.length; i++) {
2737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            strjbidi += objects[i].toString();
2747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
2757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!strjbidi.equals(strbidi)) {
2767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Discrepancy in reorderVisually " +
2777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                  "\n      bidi: " + strbidi +
2787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                  "\n     jbidi: " + strjbidi);
2797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } else {
2807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln("Correct match in reorderVisually " +
2817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                  "\n      bidi: " + strbidi +
2827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                  "\n     jbidi: " + strjbidi);
2837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
2847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("\nExiting TestCompatibility\n");
2867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
2877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public static void main(String[] args) {
2897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
2907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new TestCompatibility().run(args);
2917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
2927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        catch (Exception e) {
2937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            System.out.println(e);
2947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
2957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
2967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert}
297