/*
*******************************************************************************
*   Copyright (C) 2001-2013, International Business Machines
*   Corporation and others.  All Rights Reserved.
*******************************************************************************
*/

package com.ibm.icu.dev.test.bidi;

import java.util.Arrays;

import com.ibm.icu.dev.test.TestFmwk;
import com.ibm.icu.impl.Utility;
import com.ibm.icu.lang.UCharacter;
import com.ibm.icu.text.Bidi;
import com.ibm.icu.text.BidiRun;
import com.ibm.icu.util.VersionInfo;

/**
 * A base class for the Bidi test suite.
 *
 * @author Lina Kemmel, Matitiahu Allouche
 */

public class BidiTest extends TestFmwk {

    protected static final char[] charFromDirProp = {
         /* L      R    EN    ES    ET     AN    CS    B    S    WS    ON */
         0x61, 0x5d0, 0x30, 0x2f, 0x25, 0x660, 0x2c, 0xa, 0x9, 0x20, 0x26,
         /* LRE     LRO     AL     RLE     RLO     PDF    NSM      BN */
         0x202a, 0x202d, 0x627, 0x202b, 0x202e, 0x202c, 0x308, 0x200c,
         /* FSI     LRI     RLI     PDI */
         0x2068, 0x2066, 0x2067, 0x2069  /* new in Unicode 6.3/ICU 52 */
    };

    static {
        initCharFromDirProps();
    }

    private static void initCharFromDirProps() {
        final VersionInfo ucd401 =  VersionInfo.getInstance(4, 0, 1, 0);
        VersionInfo ucdVersion = VersionInfo.getInstance(0, 0, 0, 0);

        /* lazy initialization */
        if (ucdVersion.getMajor() > 0) {
            return;

        }
        ucdVersion = UCharacter.getUnicodeVersion();
        if (ucdVersion.compareTo(ucd401) >= 0) {
            /* Unicode 4.0.1 changes bidi classes for +-/ */
            /* change ES character from / to + */
            charFromDirProp[TestData.ES] = 0x2b;
        }
    }

    protected boolean assertEquals(String message, String expected, String actual,
                                   String src, String mode, String option,
                                   String level) {
        if (expected == null || actual == null) {
            return super.assertEquals(message, expected, actual);
        }
        if (expected.equals(actual)) {
            return true;
        }
        errln("");
        errcontln(message);
        if (src != null) {
            errcontln("source            : \"" + Utility.escape(src) + "\"");
        }
        errcontln("expected          : \"" + Utility.escape(expected) + "\"");
        errcontln("actual            : \"" + Utility.escape(actual) + "\"");
        if (mode != null) {
            errcontln("reordering mode   : " + mode);
        }
        if (option != null) {
            errcontln("reordering option : " + option);
        }
        if (level != null) {
            errcontln("paragraph level   : " + level);
        }
        return false;
    }

    protected static String valueOf(int[] array) {
        StringBuffer result = new StringBuffer(array.length * 4);
        for (int i = 0; i < array.length; i++) {
            result.append(' ');
            result.append(array[i]);
        }
        return result.toString();
    }

    private static final String[] modeDescriptions = {
        "REORDER_DEFAULT",
        "REORDER_NUMBERS_SPECIAL",
        "REORDER_GROUP_NUMBERS_WITH_R",
        "REORDER_RUNS_ONLY",
        "REORDER_INVERSE_NUMBERS_AS_L",
        "REORDER_INVERSE_LIKE_DIRECT",
        "REORDER_INVERSE_FOR_NUMBERS_SPECIAL"
    };

    protected static String modeToString(int mode) {
        if (mode < Bidi.REORDER_DEFAULT ||
            mode > Bidi.REORDER_INVERSE_FOR_NUMBERS_SPECIAL) {
            return "INVALID";
        }
        return modeDescriptions[mode];
    }

    private static final short SETPARA_MASK = Bidi.OPTION_INSERT_MARKS |
        Bidi.OPTION_REMOVE_CONTROLS | Bidi.OPTION_STREAMING;

    private static final String[] setParaDescriptions = {
        "OPTION_INSERT_MARKS",
        "OPTION_REMOVE_CONTROLS",
        "OPTION_STREAMING"
    };

    protected static String spOptionsToString(int option) {
        return optionToString(option, SETPARA_MASK, setParaDescriptions);
    }

    private static final int MAX_WRITE_REORDERED_OPTION = Bidi.OUTPUT_REVERSE;
    private static final int REORDER_MASK = (MAX_WRITE_REORDERED_OPTION << 1) - 1;

    private static final String[] writeReorderedDescriptions = {
        "KEEP_BASE_COMBINING",      //  1
        "DO_MIRRORING",             //  2
        "INSERT_LRM_FOR_NUMERIC",   //  4
        "REMOVE_BIDI_CONTROLS",     //  8
        "OUTPUT_REVERSE"            // 16
    };

    public static String wrOptionsToString(int option) {
        return optionToString(option, REORDER_MASK, writeReorderedDescriptions);
    }
    public static String optionToString(int option, int mask,
                                        String[] descriptions) {
        StringBuffer desc = new StringBuffer(50);

        if ((option &= mask) == 0) {
            return "0";
        }
        desc.setLength(0);

        for (int i = 0; option > 0; i++, option >>= 1) {
            if ((option & 1) != 0) {
                if (desc.length() > 0) {
                    desc.append(" | ");
                }
                desc.append(descriptions[i]);
            }
        }
        return desc.toString();
    }

    static final String columnString =
        "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
    static final char[] columns = columnString.toCharArray();
    private static final int TABLE_SIZE = 256;
    private static boolean tablesInitialized = false;
    private static char[] pseudoToUChar;
    private static char[] UCharToPseudo;    /* used for Unicode chars < 0x0100 */
    private static char[] UCharToPseud2;    /* used for Unicode chars >=0x0100 */

    static void buildPseudoTables()
    /*
        The rules for pseudo-Bidi are as follows:
        - [ == LRE
        - ] == RLE
        - { == LRO
        - } == RLO
        - ^ == PDF
        - @ == LRM
        - & == RLM
        - A-F == Arabic Letters 0631-0636
        - G-V == Hebrew letters 05d7-05ea
        - W-Z == Unassigned RTL 08d0-08d3
        - 0-5 == western digits 0030-0035
        - 6-9 == Arabic-Indic digits 0666-0669
        - ` == Combining Grave Accent 0300 (NSM)
        - ~ == Delete 007f (BN)
        - | == Paragraph Separator 2029 (B)
        - _ == Info Separator 1 001f (S)
        All other characters represent themselves as Latin-1, with the corresponding
        Bidi properties.
    */
    {
        int     i;
        char    uchar;
        char    c;

        /* initialize all tables to unknown */
        pseudoToUChar = new char[TABLE_SIZE];
        UCharToPseudo = new char[TABLE_SIZE];
        UCharToPseud2 = new char[TABLE_SIZE];
        for (i = 0; i < TABLE_SIZE; i++) {
            pseudoToUChar[i] = 0xFFFD;
            UCharToPseudo[i] = '?';
            UCharToPseud2[i] = '?';
        }
        /* initialize non letters or digits */
        pseudoToUChar[ 0 ] = 0x0000;    UCharToPseudo[0x00] =  0 ;
        pseudoToUChar[' '] = 0x0020;    UCharToPseudo[0x20] = ' ';
        pseudoToUChar['!'] = 0x0021;    UCharToPseudo[0x21] = '!';
        pseudoToUChar['"'] = 0x0022;    UCharToPseudo[0x22] = '"';
        pseudoToUChar['#'] = 0x0023;    UCharToPseudo[0x23] = '#';
        pseudoToUChar['$'] = 0x0024;    UCharToPseudo[0x24] = '$';
        pseudoToUChar['%'] = 0x0025;    UCharToPseudo[0x25] = '%';
        pseudoToUChar['\'']= 0x0027;    UCharToPseudo[0x27] = '\'';
        pseudoToUChar['('] = 0x0028;    UCharToPseudo[0x28] = '(';
        pseudoToUChar[')'] = 0x0029;    UCharToPseudo[0x29] = ')';
        pseudoToUChar['*'] = 0x002A;    UCharToPseudo[0x2A] = '*';
        pseudoToUChar['+'] = 0x002B;    UCharToPseudo[0x2B] = '+';
        pseudoToUChar[','] = 0x002C;    UCharToPseudo[0x2C] = ',';
        pseudoToUChar['-'] = 0x002D;    UCharToPseudo[0x2D] = '-';
        pseudoToUChar['.'] = 0x002E;    UCharToPseudo[0x2E] = '.';
        pseudoToUChar['/'] = 0x002F;    UCharToPseudo[0x2F] = '/';
        pseudoToUChar[':'] = 0x003A;    UCharToPseudo[0x3A] = ':';
        pseudoToUChar[';'] = 0x003B;    UCharToPseudo[0x3B] = ';';
        pseudoToUChar['<'] = 0x003C;    UCharToPseudo[0x3C] = '<';
        pseudoToUChar['='] = 0x003D;    UCharToPseudo[0x3D] = '=';
        pseudoToUChar['>'] = 0x003E;    UCharToPseudo[0x3E] = '>';
        pseudoToUChar['?'] = 0x003F;    UCharToPseudo[0x3F] = '?';
        pseudoToUChar['\\']= 0x005C;    UCharToPseudo[0x5C] = '\\';
        /* initialize specially used characters */
        pseudoToUChar['`'] = 0x0300;    UCharToPseud2[0x00] = '`';  /* NSM */
        pseudoToUChar['@'] = 0x200E;    UCharToPseud2[0x0E] = '@';  /* LRM */
        pseudoToUChar['&'] = 0x200F;    UCharToPseud2[0x0F] = '&';  /* RLM */
        pseudoToUChar['_'] = 0x001F;    UCharToPseudo[0x1F] = '_';  /* S   */
        pseudoToUChar['|'] = 0x2029;    UCharToPseud2[0x29] = '|';  /* B   */
        pseudoToUChar['['] = 0x202A;    UCharToPseud2[0x2A] = '[';  /* LRE */
        pseudoToUChar[']'] = 0x202B;    UCharToPseud2[0x2B] = ']';  /* RLE */
        pseudoToUChar['^'] = 0x202C;    UCharToPseud2[0x2C] = '^';  /* PDF */
        pseudoToUChar['{'] = 0x202D;    UCharToPseud2[0x2D] = '{';  /* LRO */
        pseudoToUChar['}'] = 0x202E;    UCharToPseud2[0x2E] = '}';  /* RLO */
        pseudoToUChar['~'] = 0x007F;    UCharToPseudo[0x7F] = '~';  /* BN  */
        /* initialize western digits */
        for (i = 0, uchar = 0x0030; i < 6; i++, uchar++) {
            c = columns[i];
            pseudoToUChar[c] = uchar;
            UCharToPseudo[uchar & 0x00ff] = c;
        }
        /* initialize Hindi digits */
        for (i = 6, uchar = 0x0666; i < 10; i++, uchar++) {
            c = columns[i];
            pseudoToUChar[c] = uchar;
            UCharToPseud2[uchar & 0x00ff] = c;
        }
        /* initialize Arabic letters */
        for (i = 10, uchar = 0x0631; i < 16; i++, uchar++) {
            c = columns[i];
            pseudoToUChar[c] = uchar;
            UCharToPseud2[uchar & 0x00ff] = c;
        }
        /* initialize Hebrew letters */
        for (i = 16, uchar = 0x05D7; i < 32; i++, uchar++) {
            c = columns[i];
            pseudoToUChar[c] = uchar;
            UCharToPseud2[uchar & 0x00ff] = c;
        }
        /* initialize Unassigned code points */
        for (i = 32, uchar = 0x08D0; i < 36; i++, uchar++) {
            c = columns[i];
            pseudoToUChar[c] = uchar;
            UCharToPseud2[uchar & 0x00ff] = c;
        }
        /* initialize Latin lower case letters */
        for (i = 36, uchar = 0x0061; i < 62; i++, uchar++) {
            c = columns[i];
            pseudoToUChar[c] = uchar;
            UCharToPseudo[uchar & 0x00ff] = c;
        }
        tablesInitialized = true;
    }

    /*----------------------------------------------------------------------*/

    static String pseudoToU16(String input)
    /*  This function converts a pseudo-Bidi string into a char string.
        It returns the char string.
    */
    {
        int len = input.length();
        char[] output = new char[len];
        int i;
        if (!tablesInitialized) {
            buildPseudoTables();
        }
        for (i = 0; i < len; i++)
            output[i] = pseudoToUChar[input.charAt(i)];
        return new String(output);
    }

    /*----------------------------------------------------------------------*/

    static String u16ToPseudo(String input)
    /*  This function converts a char string into a pseudo-Bidi string.
        It returns the pseudo-Bidi string.
    */
    {
        int len = input.length();
        char[] output = new char[len];
        int i;
        char uchar;
        if (!tablesInitialized) {
            buildPseudoTables();
        }
        for (i = 0; i < len; i++)
        {
            uchar = input.charAt(i);
            output[i] = uchar < 0x0100 ? UCharToPseudo[uchar] :
                                         UCharToPseud2[uchar & 0x00ff];
        }
        return new String(output);
    }

    void errcont(String message) {
        msg(message, ERR, false, false);
    }

    void errcontln(String message) {
        msg(message, ERR, false, true);
    }

    void printCaseInfo(Bidi bidi, String src, String dst)
    {
        int length = bidi.getProcessedLength();
        byte[] levels = bidi.getLevels();
        char[] levelChars  = new char[length];
        byte lev;
        int runCount = bidi.countRuns();
        errcontln("========================================");
        errcontln("Processed length: " + length);
        for (int i = 0; i < length; i++) {
            lev = levels[i];
            if (lev < 0) {
                levelChars[i] = '-';
            } else if (lev < columns.length) {
                levelChars[i] = columns[lev];
            } else {
                levelChars[i] = '+';
            }
        }
        errcontln("Levels: " + new String(levelChars));
        errcontln("Source: " + src);
        errcontln("Result: " + dst);
        errcontln("Direction: " + bidi.getDirection());
        errcontln("paraLevel: " + Byte.toString(bidi.getParaLevel()));
        errcontln("reorderingMode: " + modeToString(bidi.getReorderingMode()));
        errcontln("reorderingOptions: " + spOptionsToString(bidi.getReorderingOptions()));
        errcont("Runs: " + runCount + " => logicalStart.length/level: ");
        for (int i = 0; i < runCount; i++) {
            BidiRun run;
            run = bidi.getVisualRun(i);
            errcont(" " + run.getStart() + "." + run.getLength() + "/" +
                    run.getEmbeddingLevel());
        }
        errcont("\n");
    }

    static final String mates1 = "<>()[]{}";
    static final String mates2 = "><)(][}{";
    static final char[] mates1Chars = mates1.toCharArray();
    static final char[] mates2Chars = mates2.toCharArray();

    boolean matchingPair(Bidi bidi, int i, char c1, char c2)
    {
        if (c1 == c2) {
            return true;
        }
        /* For REORDER_RUNS_ONLY, it would not be correct to check levels[i],
           so we use the appropriate run's level, which is good for all cases.
         */
        if (bidi.getLogicalRun(i).getDirection() == 0) {
            return false;
        }
        for (int k = 0; k < mates1Chars.length; k++) {
            if ((c1 == mates1Chars[k]) && (c2 == mates2Chars[k])) {
                return true;
            }
        }
        return false;
    }

    boolean checkWhatYouCan(Bidi bidi, String src, String dst)
    {
        int i, idx, logLimit, visLimit;
        boolean testOK, errMap, errDst;
        char[] srcChars = src.toCharArray();
        char[] dstChars = dst.toCharArray();
        int[] visMap = bidi.getVisualMap();
        int[] logMap = bidi.getLogicalMap();

        testOK = true;
        errMap = errDst = false;
        logLimit = bidi.getProcessedLength();
        visLimit = bidi.getResultLength();
        if (visLimit > dstChars.length) {
            visLimit = dstChars.length;
        }
        char[] accumSrc = new char[logLimit];
        char[] accumDst = new char[visLimit];
        Arrays.fill(accumSrc, '?');
        Arrays.fill(accumDst, '?');

        if (logMap.length != logLimit) {
            errMap = true;
        }
        for (i = 0; i < logLimit; i++) {
            idx = bidi.getVisualIndex(i);
            if (idx != logMap[i]) {
                errMap = true;
            }
            if (idx == Bidi.MAP_NOWHERE) {
                continue;
            }
            if (idx >= visLimit) {
                continue;
            }
            accumDst[idx] = srcChars[i];
            if (!matchingPair(bidi, i, srcChars[i], dstChars[idx])) {
                errDst = true;
            }
        }
        if (errMap) {
            if (testOK) {
                printCaseInfo(bidi, src, dst);
                testOK = false;
            }
            errln("Mismatch between getLogicalMap() and getVisualIndex()");
            errcont("Map    :" + valueOf(logMap));
            errcont("\n");
            errcont("Indexes:");
            for (i = 0; i < logLimit; i++) {
                errcont(" " + bidi.getVisualIndex(i));
            }
            errcont("\n");
        }
        if (errDst) {
            if (testOK) {
                printCaseInfo(bidi, src, dst);
                testOK = false;
            }
            errln("Source does not map to Result");
            errcontln("We got: " + new String(accumDst));
        }

        errMap = errDst = false;
        if (visMap.length != visLimit) {
            errMap = true;
        }
        for (i = 0; i < visLimit; i++) {
            idx = bidi.getLogicalIndex(i);
            if (idx != visMap[i]) {
                errMap = true;
            }
            if (idx == Bidi.MAP_NOWHERE) {
                continue;
            }
            if (idx >= logLimit) {
                continue;
            }
            accumSrc[idx] = dstChars[i];
            if (!matchingPair(bidi, idx, srcChars[idx], dstChars[i])) {
                errDst = true;
            }
        }
        if (errMap) {
            if (testOK) {
                printCaseInfo(bidi, src, dst);
                testOK = false;
            }
            errln("Mismatch between getVisualMap() and getLogicalIndex()");
            errcont("Map    :" + valueOf(visMap));
            errcont("\n");
            errcont("Indexes:");
            for (i = 0; i < visLimit; i++) {
                errcont(" " + bidi.getLogicalIndex(i));
            }
            errcont("\n");
        }
        if (errDst) {
            if (testOK) {
                printCaseInfo(bidi, src, dst);
                testOK = false;
            }
            errln("Result does not map to Source");
            errcontln("We got: " + new String(accumSrc));
        }
        return testOK;
    }

}
