12d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert// © 2016 and later: Unicode, Inc. and others.
22d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert// License & terms of use: http://www.unicode.org/copyright.html#License
37935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert/*
47935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert*******************************************************************************
57935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert*   Copyright (C) 2001-2012, International Business Machines
67935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert*   Corporation and others.  All Rights Reserved.
77935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert*******************************************************************************
87935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert*/
97935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertpackage com.ibm.icu.dev.test.shaping;
117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
122d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubertimport java.lang.reflect.Method;
137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.MissingResourceException;
147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
152d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubertimport org.junit.Test;
162d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.dev.test.TestFmwk;
187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.text.ArabicShaping;
197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.text.ArabicShapingException;
207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert/**
227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Regression test for Arabic shaping.
237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */
247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertpublic class ArabicShapingRegTest extends TestFmwk {
257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /* constants copied from ArabicShaping for convenience */
277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public static final int LENGTH_GROW_SHRINK = 0;
297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public static final int LENGTH_FIXED_SPACES_NEAR = 1;
307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public static final int LENGTH_FIXED_SPACES_AT_END = 2;
317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public static final int LENGTH_FIXED_SPACES_AT_BEGINNING = 3;
327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public static final int TEXT_DIRECTION_LOGICAL = 0;
347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public static final int TEXT_DIRECTION_VISUAL_LTR = 4;
357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public static final int LETTERS_NOOP = 0;
377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public static final int LETTERS_SHAPE = 8;
387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public static final int LETTERS_SHAPE_TASHKEEL_ISOLATED = 0x18;
397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public static final int LETTERS_UNSHAPE = 0x10;
407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public static final int DIGITS_NOOP = 0;
427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public static final int DIGITS_EN2AN = 0x20;
437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public static final int DIGITS_AN2EN = 0x40;
447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public static final int DIGITS_EN2AN_INIT_LR = 0x60;
457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public static final int DIGITS_EN2AN_INIT_AL = 0x80;
467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert//    private static final int DIGITS_RESERVED = 0xa0;
477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public static final int DIGIT_TYPE_AN = 0;
497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public static final int DIGIT_TYPE_AN_EXTENDED = 0x100;
507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public static class TestData {
527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        public int type;
537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        public String source;
547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        public int flags;
557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        public String result;
567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        public int length;
577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        public Class error;
587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        public static final int STANDARD = 0;
607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        public static final int PREFLIGHT = 1;
617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        public static final int ERROR = 2;
627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        public static TestData standard(String source, int flags, String result) {
647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return new TestData(STANDARD, source, flags, result, 0, null);
657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        public static TestData preflight(String source, int flags, int length) {
687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return new TestData(PREFLIGHT, source, flags, null, length, null);
697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        public static TestData error(String source, int flags, Class error) {
727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return new TestData(ERROR, source, flags, null, 0, error);
737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        private TestData(int type, String source, int flags, String result, int length, Class error) {
767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            this.type = type;
777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            this.source = source;
787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            this.flags = flags;
797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            this.result = result;
807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            this.length = length;
817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            this.error = error;
827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        private static final String[] typenames = { "standard", "preflight", "error" };
857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        public String toString() {
877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            StringBuffer buf = new StringBuffer(super.toString());
887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            buf.append("[\n");
897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            buf.append(typenames[type]);
907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            buf.append(",\n");
917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (source == null) {
927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                buf.append("null");
937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } else {
947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                buf.append('"');
957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                buf.append(escapedString(source));
967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                buf.append('"');
977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            buf.append(",\n");
997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            buf.append(Integer.toHexString(flags));
1007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            buf.append(",\n");
1017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (result == null) {
1027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                buf.append("null");
1037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } else {
1047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                buf.append('"');
1057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                buf.append(escapedString(result));
1067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                buf.append('"');
1077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
1087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            buf.append(",\n");
1097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            buf.append(length);
1107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            buf.append(",\n");
1117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            buf.append(error);
1127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            buf.append(']');
1137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return buf.toString();
1147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
1157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
1167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static final String lamAlefSpecialVLTR =
1187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "\u0020\u0646\u0622\u0644\u0627\u0020" +
1197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         "\u0646\u0623\u064E\u0644\u0627\u0020" +
1207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         "\u0646\u0627\u0670\u0644\u0627\u0020" +
1217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         "\u0646\u0622\u0653\u0644\u0627\u0020" +
1227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         "\u0646\u0625\u0655\u0644\u0627\u0020" +
1237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         "\u0646\u0622\u0654\u0644\u0627\u0020" +
1247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         "\uFEFC\u0639";
1257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static final String tashkeelSpecialVLTR =
1277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "\u064A\u0628\u0631\u0639\u0020" +
1287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "\u064A\u0628\u0651\u0631\u064E\u0639\u0020" +
1297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "\u064C\u064A\u0628\u0631\u064F\u0639\u0020" +
1307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "\u0628\u0670\u0631\u0670\u0639\u0020" +
1317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "\u0628\u0653\u0631\u0653\u0639\u0020" +
1327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "\u0628\u0654\u0631\u0654\u0639\u0020" +
1337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "\u0628\u0655\u0631\u0655\u0639\u0020";
1347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static final String tashkeelShaddaRTL=
1367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            "\u0634\u0651\u0645\u0652\u0633";
1377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static final String tashkeelShaddaLTR=
1387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            "\u0633\u0652\u0645\u0651\u0634";
1397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static final String ArMathSym =
1417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "\uD83B\uDE00\uD83B\uDE01\uD83B\uDE02\uD83B\uDE03\u0020" +
1427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "\uD83B\uDE24\uD83B\uDE05\uD83B\uDE06\u0020" +
1437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "\uD83B\uDE07\uD83B\uDE08\uD83B\uDE09\u0020" +
1447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "\uD83B\uDE0A\uD83B\uDE0B\uD83B\uDE0C\uD83B\uDE0D\u0020" +
1457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "\uD83B\uDE0E\uD83B\uDE0F\uD83B\uDE10\uD83B\uDE11\u0020" +
1467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "\uD83B\uDE12\uD83B\uDE13\uD83B\uDE14\uD83B\uDE15\u0020" +
1477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "\uD83B\uDE16\uD83B\uDE17\uD83B\uDE18\u0020" +
1487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "\uD83B\uDE19\uD83B\uDE1A\uD83B\uDE1B";
1497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static final String ArMathSymLooped =
1517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "\uD83B\uDE80\uD83B\uDE81\uD83B\uDE82\uD83B\uDE83\u0020" +
1527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "\uD83B\uDE84\uD83B\uDE85\uD83B\uDE86\u0020" +
1537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "\uD83B\uDE87\uD83B\uDE88\uD83B\uDE89\u0020" +
1547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "\uD83B\uDE8B\uD83B\uDE8C\uD83B\uDE8D\u0020" +
1557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "\uD83B\uDE8E\uD83B\uDE8F\uD83B\uDE90\uD83B\uDE91\u0020" +
1567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "\uD83B\uDE92\uD83B\uDE93\uD83B\uDE94\uD83B\uDE95\u0020" +
1577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "\uD83B\uDE96\uD83B\uDE97\uD83B\uDE98\u0020" +
1587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "\uD83B\uDE99\uD83B\uDE9A\uD83B\uDE9B";
1597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static final String ArMathSymDoubleStruck =
1617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "\uD83B\uDEA1\uD83B\uDEA2\uD83B\uDEA3\u0020" +
1627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "\uD83B\uDEA5\uD83B\uDEA6\u0020" +
1637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "\uD83B\uDEA7\uD83B\uDEA8\uD83B\uDEA9\u0020" +
1647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "\uD83B\uDEAB\uD83B\uDEAC\uD83B\uDEAD\u0020" +
1657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "\uD83B\uDEAE\uD83B\uDEAF\uD83B\uDEB0\uD83B\uDEB1\u0020" +
1667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "\uD83B\uDEB2\uD83B\uDEB3\uD83B\uDEB4\uD83B\uDEB5\u0020" +
1677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "\uD83B\uDEB6\uD83B\uDEB7\uD83B\uDEB8\u0020" +
1687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "\uD83B\uDEB9\uD83B\uDEBA\uD83B\uDEBB";
1697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static final String ArMathSymInitial =
1717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "\uD83B\uDE21\uD83B\uDE22\u0020" +
1727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "\uD83B\uDE27\uD83B\uDE29\u0020" +
1737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "\uD83B\uDE2A\uD83B\uDE2B\uD83B\uDE2C\uD83B\uDE2D\u0020" +
1747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "\uD83B\uDE2E\uD83B\uDE2F\uD83B\uDE30\uD83B\uDE31\u0020" +
1757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "\uD83B\uDE32\uD83B\uDE34\uD83B\uDE35\u0020" +
1767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "\uD83B\uDE36\uD83B\uDE37\u0020" +
1777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "\uD83B\uDE39\uD83B\uDE3B";
1787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static final String ArMathSymTailed =
1807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "\uD83B\uDE42\uD83B\uDE47\uD83B\uDE49\uD83B\uDE4B\u0020" +
1817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "\uD83B\uDE4D\uD83B\uDE4E\uD83B\uDE4F\u0020" +
1827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "\uD83B\uDE51\uD83B\uDE52\uD83B\uDE54\uD83B\uDE57\u0020" +
1837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "\uD83B\uDE59\uD83B\uDE5B\uD83B\uDE5D\uD83B\uDE5F";
1847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static final String ArMathSymStretched =
1867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "\uD83B\uDE21\u0633\uD83B\uDE62\u0647";
1877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static final String logicalUnshape =
1897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "\u0020\u0020\u0020\uFE8D\uFEF5\u0020\uFEE5\u0020\uFE8D\uFEF7\u0020" +
1907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "\uFED7\uFEFC\u0020\uFEE1\u0020\uFE8D\uFEDF\uFECC\uFEAE\uFE91\uFEF4" +
1917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "\uFE94\u0020\uFE8D\uFEDF\uFEA4\uFEAE\uFE93\u0020\u0020\u0020\u0020";
1927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static final String numSource =
1947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "\u0031" +  /* en:1 */
1957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "\u0627" +  /* arabic:alef */
1967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "\u0032" +  /* en:2 */
1977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "\u06f3" +  /* an:3 */
1987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "\u0061" +  /* latin:a */
1997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "\u0034";   /* en:4 */
2007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static final TestData[] standardTests = {
2027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /* lam alef special visual ltr */
2037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        TestData.standard(lamAlefSpecialVLTR,
2047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          LETTERS_SHAPE | TEXT_DIRECTION_VISUAL_LTR | LENGTH_FIXED_SPACES_NEAR,
2057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          "\u0020\ufee5\u0020\ufef5\ufe8d\u0020" +
2067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          "\ufee5\u0020\ufe76\ufef7\ufe8d\u0020" +
2077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          "\ufee5\u0020\u0670\ufefb\ufe8d\u0020" +
2087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          "\ufee5\u0020\u0653\ufef5\ufe8d\u0020" +
2097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          "\ufee5\u0020\u0655\ufef9\ufe8d\u0020" +
2107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          "\ufee5\u0020\u0654\ufef5\ufe8d\u0020" +
2117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          "\ufefc\ufecb"),
2127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        TestData.standard(lamAlefSpecialVLTR,
2137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          LETTERS_SHAPE | TEXT_DIRECTION_VISUAL_LTR | LENGTH_FIXED_SPACES_AT_END,
2147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          "\u0020\ufee5\ufef5\ufe8d\u0020\ufee5" +
2157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          "\ufe76\ufef7\ufe8d\u0020\ufee5\u0670" +
2167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          "\ufefb\ufe8d\u0020\ufee5\u0653\ufef5" +
2177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          "\ufe8d\u0020\ufee5\u0655\ufef9\ufe8d" +
2187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          "\u0020\ufee5\u0654\ufef5\ufe8d\u0020" +
2197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          "\ufefc\ufecb\u0020\u0020\u0020\u0020" +
2207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          "\u0020\u0020"),
2217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        TestData.standard(lamAlefSpecialVLTR,
2227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          LETTERS_SHAPE | TEXT_DIRECTION_VISUAL_LTR | LENGTH_FIXED_SPACES_AT_BEGINNING,
2237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          "\u0020\u0020\u0020\u0020\u0020\u0020" +
2247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          "\u0020\ufee5\ufef5\ufe8d\u0020\ufee5" +
2257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          "\ufe76\ufef7\ufe8d\u0020\ufee5\u0670" +
2267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          "\ufefb\ufe8d\u0020\ufee5\u0653\ufef5" +
2277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          "\ufe8d\u0020\ufee5\u0655\ufef9\ufe8d" +
2287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          "\u0020\ufee5\u0654\ufef5\ufe8d\u0020" +
2297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          "\ufefc\ufecb"),
2307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        TestData.standard(lamAlefSpecialVLTR,
2317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          LETTERS_SHAPE | TEXT_DIRECTION_VISUAL_LTR | LENGTH_GROW_SHRINK,
2327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          "\u0020\ufee5\ufef5\ufe8d\u0020\ufee5" +
2337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          "\ufe76\ufef7\ufe8d\u0020\ufee5\u0670" +
2347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          "\ufefb\ufe8d\u0020\ufee5\u0653\ufef5" +
2357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          "\ufe8d\u0020\ufee5\u0655\ufef9\ufe8d" +
2367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          "\u0020\ufee5\u0654\ufef5\ufe8d\u0020" +
2377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          "\ufefc\ufecb"),
2387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /* TASHKEEL */
2407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        TestData.standard(lamAlefSpecialVLTR,
2417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          LETTERS_SHAPE_TASHKEEL_ISOLATED | TEXT_DIRECTION_VISUAL_LTR | LENGTH_FIXED_SPACES_NEAR,
2427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          "\u0020\ufee5\u0020\ufef5\ufe8d\u0020" +
2437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          "\ufee5\u0020\ufe76\ufef7\ufe8d\u0020" +
2447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          "\ufee5\u0020\u0670\ufefb\ufe8d\u0020" +
2457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          "\ufee5\u0020\u0653\ufef5\ufe8d\u0020" +
2467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          "\ufee5\u0020\u0655\ufef9\ufe8d\u0020" +
2477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          "\ufee5\u0020\u0654\ufef5\ufe8d\u0020" +
2487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          "\ufefc\ufecb"),
2497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        TestData.standard(lamAlefSpecialVLTR,
2507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          LETTERS_SHAPE_TASHKEEL_ISOLATED | TEXT_DIRECTION_VISUAL_LTR | LENGTH_FIXED_SPACES_AT_END,
2517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          "\u0020\ufee5\ufef5\ufe8d\u0020\ufee5" +
2527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          "\ufe76\ufef7\ufe8d\u0020\ufee5\u0670" +
2537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          "\ufefb\ufe8d\u0020\ufee5\u0653\ufef5" +
2547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          "\ufe8d\u0020\ufee5\u0655\ufef9\ufe8d" +
2557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          "\u0020\ufee5\u0654\ufef5\ufe8d\u0020" +
2567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          "\ufefc\ufecb\u0020\u0020\u0020\u0020" +
2577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          "\u0020\u0020"),
2587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        TestData.standard(lamAlefSpecialVLTR,
2597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          LETTERS_SHAPE_TASHKEEL_ISOLATED | TEXT_DIRECTION_VISUAL_LTR | LENGTH_FIXED_SPACES_AT_BEGINNING,
2607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          "\u0020\u0020\u0020\u0020\u0020\u0020" +
2617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          "\u0020\ufee5\ufef5\ufe8d\u0020\ufee5" +
2627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          "\ufe76\ufef7\ufe8d\u0020\ufee5\u0670" +
2637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          "\ufefb\ufe8d\u0020\ufee5\u0653\ufef5" +
2647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          "\ufe8d\u0020\ufee5\u0655\ufef9\ufe8d" +
2657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          "\u0020\ufee5\u0654\ufef5\ufe8d\u0020" +
2667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          "\ufefc\ufecb"),
2677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        TestData.standard(lamAlefSpecialVLTR,
2687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          LETTERS_SHAPE_TASHKEEL_ISOLATED | TEXT_DIRECTION_VISUAL_LTR | LENGTH_GROW_SHRINK,
2697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          "\u0020\ufee5\ufef5\ufe8d\u0020\ufee5" +
2707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          "\ufe76\ufef7\ufe8d\u0020\ufee5\u0670" +
2717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          "\ufefb\ufe8d\u0020\ufee5\u0653\ufef5" +
2727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          "\ufe8d\u0020\ufee5\u0655\ufef9\ufe8d" +
2737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          "\u0020\ufee5\u0654\ufef5\ufe8d\u0020" +
2747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          "\ufefc\ufecb"),
2757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /* tashkeel special visual ltr */
2777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        TestData.standard(tashkeelSpecialVLTR,
2787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          LETTERS_SHAPE | TEXT_DIRECTION_VISUAL_LTR | LENGTH_FIXED_SPACES_NEAR,
2797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          "\ufef2\ufe91\ufeae\ufecb\u0020" +
2807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          "\ufef2\ufe91\ufe7c\ufeae\ufe77\ufecb\u0020" +
2817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          "\ufe72\ufef2\ufe91\ufeae\ufe79\ufecb\u0020" +
2827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          "\ufe8f\u0670\ufeae\u0670\ufecb\u0020" +
2837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          "\ufe8f\u0653\ufeae\u0653\ufecb\u0020" +
2847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          "\ufe8f\u0654\ufeae\u0654\ufecb\u0020" +
2857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          "\ufe8f\u0655\ufeae\u0655\ufecb\u0020"),
2867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        TestData.standard(tashkeelSpecialVLTR,
2887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          LETTERS_SHAPE_TASHKEEL_ISOLATED | TEXT_DIRECTION_VISUAL_LTR | LENGTH_FIXED_SPACES_NEAR,
2897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          "\ufef2\ufe91\ufeae\ufecb\u0020" +
2907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          "\ufef2\ufe91\ufe7c\ufeae\ufe76\ufecb\u0020" +
2917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          "\ufe72\ufef2\ufe91\ufeae\ufe78\ufecb\u0020" +
2927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          "\ufe8f\u0670\ufeae\u0670\ufecb\u0020" +
2937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          "\ufe8f\u0653\ufeae\u0653\ufecb\u0020" +
2947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          "\ufe8f\u0654\ufeae\u0654\ufecb\u0020" +
2957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          "\ufe8f\u0655\ufeae\u0655\ufecb\u0020"),
2967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        TestData.standard(tashkeelShaddaRTL,
2982d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                          ArabicShaping.LETTERS_SHAPE|ArabicShaping.TASHKEEL_BEGIN |ArabicShaping.TEXT_DIRECTION_VISUAL_RTL ,
2992d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                          "\u0020\ufeb7\ufe7d\ufee4\ufeb2"),
3002d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        TestData.standard(tashkeelShaddaRTL,
3012d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                          ArabicShaping.LETTERS_SHAPE|ArabicShaping.TASHKEEL_END|ArabicShaping.TEXT_DIRECTION_VISUAL_RTL ,
3022d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                          "\ufeb7\ufe7d\ufee4\ufeb2\u0020"),
3032d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        TestData.standard(tashkeelShaddaRTL,
3042d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                          ArabicShaping.LETTERS_SHAPE|ArabicShaping.TASHKEEL_RESIZE|ArabicShaping.TEXT_DIRECTION_VISUAL_RTL ,
3052d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                          "\ufeb7\ufe7d\ufee4\ufeb2"),
3062d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        TestData.standard(tashkeelShaddaRTL,
3072d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                          ArabicShaping.LETTERS_SHAPE|ArabicShaping.TASHKEEL_REPLACE_BY_TATWEEL|ArabicShaping.TEXT_DIRECTION_VISUAL_RTL ,
3082d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                          "\ufeb7\ufe7d\ufee4\u0640\ufeb2"),
3092d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
3102d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        TestData.standard(tashkeelShaddaLTR,
3112d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                          ArabicShaping.LETTERS_SHAPE|ArabicShaping.TASHKEEL_BEGIN |ArabicShaping.TEXT_DIRECTION_VISUAL_LTR ,
3122d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                          "\u0020\ufeb2\ufee4\ufe7d\ufeb7"),
3132d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        TestData.standard(tashkeelShaddaLTR,
3142d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                          ArabicShaping.LETTERS_SHAPE|ArabicShaping.TASHKEEL_END |ArabicShaping.TEXT_DIRECTION_VISUAL_LTR ,
3152d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                          "\ufeb2\ufee4\ufe7d\ufeb7\u0020"),
3162d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        TestData.standard(tashkeelShaddaLTR,
3172d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                          ArabicShaping.LETTERS_SHAPE|ArabicShaping.TASHKEEL_RESIZE |ArabicShaping.TEXT_DIRECTION_VISUAL_LTR ,
3182d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                          "\ufeb2\ufee4\ufe7d\ufeb7"),
3192d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        TestData.standard(tashkeelShaddaLTR,
3202d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                          ArabicShaping.LETTERS_SHAPE|ArabicShaping.TASHKEEL_REPLACE_BY_TATWEEL |ArabicShaping.TEXT_DIRECTION_VISUAL_LTR ,
3212d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                          "\ufeb2\u0640\ufee4\ufe7d\ufeb7"),
3227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        TestData.standard(ArMathSym,
3247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          ArabicShaping.LETTERS_SHAPE|ArabicShaping.TASHKEEL_BEGIN |ArabicShaping.TEXT_DIRECTION_VISUAL_RTL ,
3257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          "\uD83B\uDE00\uD83B\uDE01\uD83B\uDE02\uD83B\uDE03\u0020" +
3267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          "\uD83B\uDE24\uD83B\uDE05\uD83B\uDE06\u0020" +
3277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          "\uD83B\uDE07\uD83B\uDE08\uD83B\uDE09\u0020" +
3287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          "\uD83B\uDE0A\uD83B\uDE0B\uD83B\uDE0C\uD83B\uDE0D\u0020" +
3297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          "\uD83B\uDE0E\uD83B\uDE0F\uD83B\uDE10\uD83B\uDE11\u0020" +
3307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          "\uD83B\uDE12\uD83B\uDE13\uD83B\uDE14\uD83B\uDE15\u0020" +
3317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          "\uD83B\uDE16\uD83B\uDE17\uD83B\uDE18\u0020" +
3327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          "\uD83B\uDE19\uD83B\uDE1A\uD83B\uDE1B"),
3337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        TestData.standard(ArMathSymLooped,
3347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          ArabicShaping.LETTERS_SHAPE|ArabicShaping.TASHKEEL_END|ArabicShaping.TEXT_DIRECTION_VISUAL_RTL ,
3357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          "\uD83B\uDE80\uD83B\uDE81\uD83B\uDE82\uD83B\uDE83\u0020" +
3367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          "\uD83B\uDE84\uD83B\uDE85\uD83B\uDE86\u0020" +
3377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          "\uD83B\uDE87\uD83B\uDE88\uD83B\uDE89\u0020" +
3387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          "\uD83B\uDE8B\uD83B\uDE8C\uD83B\uDE8D\u0020" +
3397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          "\uD83B\uDE8E\uD83B\uDE8F\uD83B\uDE90\uD83B\uDE91\u0020" +
3407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          "\uD83B\uDE92\uD83B\uDE93\uD83B\uDE94\uD83B\uDE95\u0020" +
3417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          "\uD83B\uDE96\uD83B\uDE97\uD83B\uDE98\u0020" +
3427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          "\uD83B\uDE99\uD83B\uDE9A\uD83B\uDE9B"),
3437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        TestData.standard(ArMathSymDoubleStruck,
3447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          ArabicShaping.LETTERS_SHAPE|ArabicShaping.TASHKEEL_RESIZE|ArabicShaping.TEXT_DIRECTION_VISUAL_RTL ,
3457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          "\uD83B\uDEA1\uD83B\uDEA2\uD83B\uDEA3\u0020" +
3467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          "\uD83B\uDEA5\uD83B\uDEA6\u0020" +
3477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          "\uD83B\uDEA7\uD83B\uDEA8\uD83B\uDEA9\u0020" +
3487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          "\uD83B\uDEAB\uD83B\uDEAC\uD83B\uDEAD\u0020" +
3497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          "\uD83B\uDEAE\uD83B\uDEAF\uD83B\uDEB0\uD83B\uDEB1\u0020" +
3507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          "\uD83B\uDEB2\uD83B\uDEB3\uD83B\uDEB4\uD83B\uDEB5\u0020" +
3517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          "\uD83B\uDEB6\uD83B\uDEB7\uD83B\uDEB8\u0020" +
3527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          "\uD83B\uDEB9\uD83B\uDEBA\uD83B\uDEBB"),
3537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        TestData.standard(ArMathSymInitial,
3557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          ArabicShaping.LETTERS_SHAPE|ArabicShaping.TASHKEEL_BEGIN |ArabicShaping.TEXT_DIRECTION_VISUAL_LTR ,
3567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          "\uD83B\uDE21\uD83B\uDE22\u0020" +
3577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          "\uD83B\uDE27\uD83B\uDE29\u0020" +
3587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          "\uD83B\uDE2A\uD83B\uDE2B\uD83B\uDE2C\uD83B\uDE2D\u0020" +
3597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          "\uD83B\uDE2E\uD83B\uDE2F\uD83B\uDE30\uD83B\uDE31\u0020" +
3607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          "\uD83B\uDE32\uD83B\uDE34\uD83B\uDE35\u0020" +
3617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          "\uD83B\uDE36\uD83B\uDE37\u0020" +
3627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          "\uD83B\uDE39\uD83B\uDE3B"),
3637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        TestData.standard(ArMathSymTailed,
3647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          ArabicShaping.LETTERS_SHAPE|ArabicShaping.TASHKEEL_END |ArabicShaping.TEXT_DIRECTION_VISUAL_LTR ,
3657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          "\uD83B\uDE42\uD83B\uDE47\uD83B\uDE49\uD83B\uDE4B\u0020" +
3667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          "\uD83B\uDE4D\uD83B\uDE4E\uD83B\uDE4F\u0020" +
3677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          "\uD83B\uDE51\uD83B\uDE52\uD83B\uDE54\uD83B\uDE57\u0020" +
3687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          "\uD83B\uDE59\uD83B\uDE5B\uD83B\uDE5D\uD83B\uDE5F"),
3697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        TestData.standard(ArMathSymStretched,
3707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          ArabicShaping.LETTERS_SHAPE|ArabicShaping.TASHKEEL_RESIZE |ArabicShaping.TEXT_DIRECTION_VISUAL_LTR ,
3717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          "\uD83B\uDE21\uFEB1\uD83B\uDE62\uFEE9"),
3727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /* logical unshape */
3747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        TestData.standard(logicalUnshape,
3757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          LETTERS_UNSHAPE | TEXT_DIRECTION_LOGICAL | LENGTH_FIXED_SPACES_NEAR,
3767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          "\u0020\u0020\u0020\u0627\u0644\u0622\u0646\u0020\u0627\u0644\u0623\u0642\u0644\u0627" +
3777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          "\u0645\u0020\u0627\u0644\u0639\u0631\u0628\u064a\u0629\u0020\u0627\u0644\u062d\u0631" +
3787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          "\u0629\u0020\u0020\u0020\u0020"),
3797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        TestData.standard(logicalUnshape,
3807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          LETTERS_UNSHAPE | TEXT_DIRECTION_LOGICAL | LENGTH_FIXED_SPACES_AT_END,
3817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          "\u0020\u0020\u0020\u0627\u0644\u0622\u0020\u0646\u0020\u0627\u0644\u0623\u0020\u0642" +
3827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          "\u0644\u0627\u0020\u0645\u0020\u0627\u0644\u0639\u0631\u0628\u064a\u0629\u0020\u0627" +
3837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          "\u0644\u062d\u0631\u0629\u0020"),
3847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        TestData.standard(logicalUnshape,
3857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          LETTERS_UNSHAPE | TEXT_DIRECTION_LOGICAL | LENGTH_FIXED_SPACES_AT_BEGINNING,
3867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          "\u0627\u0644\u0622\u0020\u0646\u0020\u0627\u0644\u0623\u0020\u0642\u0644\u0627\u0020" +
3877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          "\u0645\u0020\u0627\u0644\u0639\u0631\u0628\u064a\u0629\u0020\u0627\u0644\u062d\u0631" +
3887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          "\u0629\u0020\u0020\u0020\u0020"),
3897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        TestData.standard(logicalUnshape,
3907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          LETTERS_UNSHAPE | TEXT_DIRECTION_LOGICAL | LENGTH_GROW_SHRINK,
3917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          "\u0020\u0020\u0020\u0627\u0644\u0622\u0020\u0646\u0020\u0627\u0644\u0623\u0020\u0642" +
3927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          "\u0644\u0627\u0020\u0645\u0020\u0627\u0644\u0639\u0631\u0628\u064a\u0629\u0020\u0627" +
3937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          "\u0644\u062d\u0631\u0629\u0020\u0020\u0020\u0020"),
3947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /* numbers */
3967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        TestData.standard(numSource,
3977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          DIGITS_EN2AN | DIGIT_TYPE_AN,
3987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          "\u0661\u0627\u0662\u06f3\u0061\u0664"),
3997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        TestData.standard(numSource,
4007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          DIGITS_AN2EN | DIGIT_TYPE_AN_EXTENDED,
4017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          "\u0031\u0627\u0032\u0033\u0061\u0034"),
4027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        TestData.standard(numSource,
4037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          DIGITS_EN2AN_INIT_LR | DIGIT_TYPE_AN,
4047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          "\u0031\u0627\u0662\u06f3\u0061\u0034"),
4057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        TestData.standard(numSource,
4067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          DIGITS_EN2AN_INIT_AL | DIGIT_TYPE_AN_EXTENDED,
4077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          "\u06f1\u0627\u06f2\u06f3\u0061\u0034"),
4087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        TestData.standard(numSource,
4097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          DIGITS_EN2AN_INIT_LR | DIGIT_TYPE_AN | TEXT_DIRECTION_VISUAL_LTR,
4107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          "\u0661\u0627\u0032\u06f3\u0061\u0034"),
4117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        TestData.standard(numSource,
4127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          DIGITS_EN2AN_INIT_AL | DIGIT_TYPE_AN_EXTENDED | TEXT_DIRECTION_VISUAL_LTR,
4137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          "\u06f1\u0627\u0032\u06f3\u0061\u06f4"),
4147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
4157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /* no-op */
4167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        TestData.standard(numSource,
4177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          0,
4187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          numSource),
4197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    };
4207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
4217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static final TestData[] preflightTests = {
4227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /* preflight */
4237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        TestData.preflight("\u0644\u0627",
4247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                           LETTERS_SHAPE | LENGTH_GROW_SHRINK,
4257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                           1),
4267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
4277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        TestData.preflight("\u0644\u0627\u0031",
4287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                           DIGITS_EN2AN | DIGIT_TYPE_AN_EXTENDED | LENGTH_GROW_SHRINK,
4297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                           3),
4307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
4317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        TestData.preflight("\u0644\u0644",
4327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                           LETTERS_SHAPE | LENGTH_GROW_SHRINK,
4337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                           2),
4347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
4357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        TestData.preflight("\ufef7",
4367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                           LETTERS_UNSHAPE | LENGTH_GROW_SHRINK,
4377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                           2),
4387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    };
4397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
4407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static final TestData[] errorTests = {
4417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /* bad data */
4427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        TestData.error("\u0020\ufef7\u0644\u0020",
4437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                       LETTERS_UNSHAPE | LENGTH_FIXED_SPACES_NEAR,
4447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                       ArabicShapingException.class),
4457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
4467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        TestData.error("\u0020\ufef7",
4477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                       LETTERS_UNSHAPE | LENGTH_FIXED_SPACES_AT_END,
4487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                       ArabicShapingException.class),
4497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
4507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        TestData.error("\ufef7\u0020",
4517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                       LETTERS_UNSHAPE | LENGTH_FIXED_SPACES_AT_BEGINNING,
4527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                       ArabicShapingException.class),
4537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
4547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /* bad options */
4557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        TestData.error("\ufef7",
4567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                       0xffffffff,
4577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                       IllegalArgumentException.class),
4587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
4597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        TestData.error("\ufef7",
4607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                       LETTERS_UNSHAPE | LENGTH_GROW_SHRINK,
4617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                       ArabicShapingException.class),
4627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
4637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        TestData.error(null,
4647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                       LETTERS_UNSHAPE | LENGTH_FIXED_SPACES_AT_END,
4657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                       IllegalArgumentException.class),
4667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    };
4677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
4682d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
4697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestStandard() {
4707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0; i < standardTests.length; ++i) {
4717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            TestData test = standardTests[i];
4727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
4737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            Exception ex = null;
4747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String result = null;
4757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            ArabicShaping shaper = null;
4767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
4777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            try {
4787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                shaper = new ArabicShaping(test.flags);
4797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                result = shaper.shape(test.source);
4807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
4817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            catch(MissingResourceException e){
4827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                throw e;
4837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
4847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            catch (IllegalStateException ie){
4857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                warnln("IllegalStateException: "+ie.toString());
4867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                return;
4877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
4887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            catch (Exception e) {
4897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                ex = e;
4907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
4917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
4927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (!test.result.equals(result)) {
4937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                reportTestFailure(i, test, shaper, result, ex);
4947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
4957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
4967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
4977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
4982d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
4997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestPreflight() {
5007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0; i < preflightTests.length; ++i) {
5017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            TestData test = preflightTests[i];
5027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
5037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            Exception ex = null;
5047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            char src[] = null;
5057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            int len = 0;
5067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            ArabicShaping shaper = null;
5077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
5087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (test.source != null) {
5097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                src = test.source.toCharArray();
5107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
5117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
5127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            try {
5137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                shaper = new ArabicShaping(test.flags);
5147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                len = shaper.shape(src, 0, src.length, null, 0, 0);
5157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
5167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            catch (Exception e) {
5177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                ex = e;
5187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
5197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
5207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (test.length != len) {
5217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                reportTestFailure(i, test, shaper, test.source, ex);
5227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
5237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
5247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
5257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
5262d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
5277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestError() {
5287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0; i < errorTests.length; ++i) {
5297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            TestData test = errorTests[i];
5307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
5317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            Exception ex = null;
5327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            char src[] = null;
5337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            int len = 0;
5347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            ArabicShaping shaper = null;
5357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
5367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (test.source != null) {
5377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                src = test.source.toCharArray();
5387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                len = src.length;
5397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
5407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
5417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            try {
5427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                shaper = new ArabicShaping(test.flags);
5437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                shaper.shape(src, 0, len);
5447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
5457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            catch (Exception e) {
5467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                ex = e;
5477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
5487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
5497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (!test.error.isInstance(ex)) {
5507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                reportTestFailure(i, test, shaper, test.source, ex);
5517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
5527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
5537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
5547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
5552d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
5567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestEquals()
5577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    {
5587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        ArabicShaping as1 = new ArabicShaping(LETTERS_SHAPE | TEXT_DIRECTION_VISUAL_LTR | LENGTH_FIXED_SPACES_NEAR);
5597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        ArabicShaping as2 = new ArabicShaping(LETTERS_SHAPE | TEXT_DIRECTION_VISUAL_LTR | LENGTH_FIXED_SPACES_NEAR);
5607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        ArabicShaping as3 = new ArabicShaping(LETTERS_UNSHAPE | TEXT_DIRECTION_LOGICAL | LENGTH_FIXED_SPACES_AT_BEGINNING);
5617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
5627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (! as1.equals(as1)) {
5637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            err("as1: " + as1 + " does not equal itself!\n");
5647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
5657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
5667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (! as1.equals(as2)) {
5677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            err("as1: " + as1 + ", as2: " + as2 + " are not equal, but should be.\n");
5687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
5697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
5707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (as1.equals(as3)) {
5717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            err("as1: " + as1 + ", as3: " + as3 + " are equal but should not be.\n");
5727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
5737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
5747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
5752d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    // TODO(junit): remove this and convert callers to parameterized tests
5762d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    private void reportTestFailure(int index, TestData test, ArabicShaping shaper, String result, Exception error) {
5772d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        if (error != null && error instanceof MissingResourceException ) {
5787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            warnln(error.getMessage());
5797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
5807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
5817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        StringBuffer buf = new StringBuffer();
5827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        buf.append("*** test failure ***\n");
5837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        buf.append("index: " + index + "\n");
5847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        buf.append("test: " + test + "\n");
5857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        buf.append("shaper: " + shaper + "\n");
5867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        buf.append("result: " + escapedString(result) + "\n");
5877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        buf.append("error: " + error + "\n");
5887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
5897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (result != null && test.result != null && !test.result.equals(result)) {
5907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            for (int i = 0; i < Math.max(test.result.length(), result.length()); ++i) {
5917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                String temp = Integer.toString(i);
5927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (temp.length() < 2) {
5937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    temp = " ".concat(temp);
5947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
5957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                char trg = i < test.result.length() ? test.result.charAt(i) : '\uffff';
5967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                char res = i < result.length() ? result.charAt(i) : '\uffff';
5977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
5987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                buf.append("[" + temp + "] ");
5997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                buf.append(escapedString("" + trg) + " ");
6007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                buf.append(escapedString("" + res) + " ");
6017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (trg != res) {
6027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    buf.append("***");
6037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
6047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                buf.append("\n");
6057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
6067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
6077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        err(buf.toString());
6087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
6097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
6107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static String escapedString(String str) {
6117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (str == null) {
6127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return null;
6137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
6147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
6157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        StringBuffer buf = new StringBuffer(str.length() * 6);
6167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0; i < str.length(); ++i) {
6177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            char ch = str.charAt(i);
6187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            buf.append("\\u");
6197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (ch < 0x1000) {
6207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                buf.append('0');
6217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
6227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (ch < 0x0100) {
6237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                buf.append('0');
6247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
6257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (ch < 0x0010) {
6267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                buf.append('0');
6277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
6287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            buf.append(Integer.toHexString(ch));
6297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
6307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return buf.toString();
6317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
6327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
6337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /* Tests the method
6347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *      public int shape(char[] source, int sourceStart, int sourceLength,
6357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *      char[] dest, int destStart, int destSize) throws ArabicShapingException)
6367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
6372d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
6387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestShape(){
6397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Tests when
6407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        //      if (sourceStart < 0 || sourceLength < 0 || sourceStart + sourceLength > source.length)
6417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Is true
6427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        ArabicShaping as = new ArabicShaping(0);
6437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        char[] source = {'d','u','m','m','y'};
6447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        char[] dest = {'d','u','m','m','y'};
6457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int[] negNum = {-1,-2,-5,-10,-100};
6467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
6477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
6487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for(int i=0; i<negNum.length; i++){
6497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            try{
6507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // Checks when "sourceStart < 0"
6517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                as.shape(source, negNum[i], 0, dest, 0, 0);
6527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("ArabicShaping.shape(char[],int,int,char[],int,int) was " +
6537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        "suppose to return an exception when 'sourceStart < 0'.");
6547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } catch(Exception e){}
6557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
6567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            try{
6577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // Checks when "sourceLength < 0"
6587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                as.shape(source, 0, negNum[i], dest, 0, 0);
6597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("ArabicShaping.shape(char[],int,int,char[],int,int) was " +
6607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        "suppose to return an exception when 'sourceLength < 0'.");
6617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } catch(Exception e){}
6627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
6637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
6647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Checks when "sourceStart + sourceLength > source.length"
6657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try{
6667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            as.shape(source, 3, 3, dest, 0, 0);
6677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("ArabicShaping.shape(char[],int,int,char[],int,int) was " +
6687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    "suppose to return an exception when 'sourceStart + sourceLength > source.length'.");
6697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch(Exception e){}
6707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try{
6717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            as.shape(source, 2, 4, dest, 0, 0);
6727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("ArabicShaping.shape(char[],int,int,char[],int,int) was " +
6737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    "suppose to return an exception when 'sourceStart + sourceLength > source.length'.");
6747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch(Exception e){}
6757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try{
6767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            as.shape(source, 1, 5, dest, 0, 0);
6777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("ArabicShaping.shape(char[],int,int,char[],int,int) was " +
6787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    "suppose to return an exception when 'sourceStart + sourceLength > source.length'.");
6797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch(Exception e){}
6807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try{
6817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            as.shape(source, 0, 6, dest, 0, 0);
6827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("ArabicShaping.shape(char[],int,int,char[],int,int) was " +
6837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    "suppose to return an exception when 'sourceStart + sourceLength > source.length'.");
6847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch(Exception e){}
6857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
6867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Checks when "if (dest == null && destSize != 0)" is true
6877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try{
6887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            as.shape(source, 2, 2, null, 0, 1);
6897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("ArabicShaping.shape(char[],int,int,char[],int,int) was " +
6907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    "suppose to return an exception when 'dest == null && destSize != 0'.");
6917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch(Exception e){}
6927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
6937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Checks when
6947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // if ((destSize != 0) && (destStart < 0 || destSize < 0 || destStart + destSize > dest.length))
6957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for(int i=0; i<negNum.length; i++){
6967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            try{
6977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                as.shape(source, 2, 2, dest, negNum[i], 1);
6987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("ArabicShaping.shape(char[],int,int,char[],int,int) was " +
6997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        "suppose to return an exception when " +
7007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        "(destSize != 0) && (destStart < 0 || destSize < 0 || destStart + destSize > dest.length).");
7017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } catch(Exception e){}
7027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
7037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            try{
7047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                as.shape(source, 2, 2, dest, 0, negNum[i]);
7057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("ArabicShaping.shape(char[],int,int,char[],int,int) was " +
7067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        "suppose to return an exception when " +
7077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        "(destSize != 0) && (destStart < 0 || destSize < 0 || destStart + destSize > dest.length).");
7087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } catch(Exception e){}
7097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
7107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
7117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Checks when "destStart + destSize > dest.length"
7127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try{
7137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            as.shape(source, 2, 2, dest, 3, 3);
7147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("ArabicShaping.shape(char[],int,int,char[],int,int) was " +
7157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    "suppose to return an exception when " +
7167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    "(destSize != 0) && (destStart < 0 || destSize < 0 || destStart + destSize > dest.length).");
7177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch(Exception e){}
7187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try{
7197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            as.shape(source, 2, 2, dest, 2, 4);
7207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("ArabicShaping.shape(char[],int,int,char[],int,int) was " +
7217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    "suppose to return an exception when " +
7227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    "(destSize != 0) && (destStart < 0 || destSize < 0 || destStart + destSize > dest.length).");
7237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch(Exception e){}
7247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try{
7257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            as.shape(source, 2, 2, dest, 1, 5);
7267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("ArabicShaping.shape(char[],int,int,char[],int,int) was " +
7277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    "suppose to return an exception when " +
7287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    "(destSize != 0) && (destStart < 0 || destSize < 0 || destStart + destSize > dest.length).");
7297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch(Exception e){}
7307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try{
7317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            as.shape(source, 2, 2, dest, 0, 6);
7327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("ArabicShaping.shape(char[],int,int,char[],int,int) was " +
7337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    "suppose to return an exception when " +
7347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    "(destSize != 0) && (destStart < 0 || destSize < 0 || destStart + destSize > dest.length).");
7357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch(Exception e){}
7367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
7377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Tests when "throw new IllegalArgumentException("Wrong Tashkeel argument")"
7387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int[] invalid_Tashkeel = {-1000, -500, -100};
7397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for(int i=0; i < invalid_Tashkeel.length; i++){
7407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            ArabicShaping arabicShape = new ArabicShaping(invalid_Tashkeel[i]);
7417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            try {
7427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                arabicShape.shape(source,0,0,dest,0,1);
7437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("ArabicShaping.shape(char[],int,int,char[],int,int) was " +
7447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        "suppose to return an exception for 'Wrong Tashkeel argument' for " +
7457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        "an option value of " + invalid_Tashkeel[i]);
7467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } catch (Exception e) {}
7477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
7487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
7492d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
7502d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
7512d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    public void TestCoverage() {
7522d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        ArabicShaping shp = new ArabicShaping(LETTERS_SHAPE | TEXT_DIRECTION_VISUAL_LTR | LENGTH_FIXED_SPACES_NEAR);
7532d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
7542d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        // Test ArabicShaping#toString();
7552d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        assertEquals("ArabicShaping#toString() failed.",
7562d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                shp.toString(),
7572d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                "com.ibm.icu.text.ArabicShaping@d[LamAlef spaces at near, visual, shape letters," +
7582d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                        " no digit shaping, standard Arabic-Indic digits]");
7592d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
7602d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        // Test ArabicShaping#hashCode()
7612d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        assertEquals("ArabicShaping#hashCode() failed.", shp.hashCode(), 13);
7622d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    }
7632d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
7642d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    private boolean getStaticCharacterHelperFunctionValue(String methodName, char testValue) throws Exception {
7652d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        Method m = ArabicShaping.class.getDeclaredMethod(methodName, Character.TYPE);
7662d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        m.setAccessible(true);
7672d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        Object returnValue = m.invoke(null, testValue);
7682d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
7692d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        if (Integer.class.isInstance(returnValue)) {
7702d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert            return (Integer)returnValue == 1;
7712d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        }
7722d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        return (Boolean)returnValue;
7732d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    }
7742d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
7752d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
7762d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    public void TestHelperFunctions() throws Exception {
7772d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        // Test private static helper functions that are used internally:
7782d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
7792d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        // ArabicShaping.isSeenTailFamilyChar(char)
7802d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        assertTrue("ArabicShaping.isSeenTailFamilyChar(char) failed.",
7812d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                getStaticCharacterHelperFunctionValue("isSeenTailFamilyChar", (char)0xfeb1));
7822d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
7832d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        // ArabicShaping.isAlefMaksouraChar(char)
7842d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        assertTrue("ArabicShaping.isAlefMaksouraChar(char) failed.",
7852d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                getStaticCharacterHelperFunctionValue("isAlefMaksouraChar", (char)0xfeef));
7862d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
7872d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        // ArabicShaping.isTailChar(char)
7882d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        assertTrue("ArabicShaping.isTailChar(char) failed.",
7892d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                getStaticCharacterHelperFunctionValue("isTailChar", (char)0x200B));
7902d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
7912d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        // ArabicShaping.isYehHamzaChar(char)
7922d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        assertTrue("ArabicShaping.isYehHamzaChar(char) failed.",
7932d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                getStaticCharacterHelperFunctionValue("isYehHamzaChar", (char)0xfe89));
7942d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
7952d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    }
7967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert}
7977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
798