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

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

import com.ibm.icu.text.Bidi;


/**
 * Regression test for the UBA implementation.
 *
 * ported from C by Lina Kemmel, Matitiahu Allouche
 */

public class TestReorder extends BidiTest {

    private static final String[] logicalOrder = {
        "del(KC)add(K.C.&)",
        "del(QDVT) add(BVDL)",
        "del(PQ)add(R.S.)T)U.&",
        "del(LV)add(L.V.) L.V.&",
        "day  0  R  DPDHRVR dayabbr",
        "day  1  H  DPHPDHDA dayabbr",
        "day  2   L  DPBLENDA dayabbr",
        "day  3  J  DPJQVM  dayabbr",
        "day  4   I  DPIQNF    dayabbr",
        "day  5  M  DPMEG  dayabbr",
        "helloDPMEG",
        "hello WXYZ"
    };

    private static final String[] visualOrder = {
        "del(CK)add(&.C.K)",
        "del(TVDQ) add(LDVB)",
        "del(QP)add(&.U(T(.S.R",
        "del(VL)add(&.V.L (.V.L",
        "day  0  RVRHDPD  R dayabbr",
        "day  1  ADHDPHPD  H dayabbr",
        "day  2   ADNELBPD  L dayabbr",
        "day  3  MVQJPD  J  dayabbr",
        "day  4   FNQIPD  I    dayabbr",
        "day  5  GEMPD  M  dayabbr",
        "helloGEMPD",
        "hello ZYXW"
    };

    private static final String[] visualOrder1 = {
        ")K.C.&(dda)KC(led",
        ")BVDL(dda )QDVT(led",
        "R.S.(T(U.&(dda)PQ(led",
        "L.V.( L.V.&(dda)LV(led",
        "rbbayad R  DPDHRVR  0  yad",
        "rbbayad H  DPHPDHDA  1  yad",
        "rbbayad L  DPBLENDA   2  yad",
        "rbbayad  J  DPJQVM  3  yad",
        "rbbayad    I  DPIQNF   4  yad",
        "rbbayad  M  DPMEG  5  yad",
        "DPMEGolleh",
        "WXYZ olleh"
    };

    private static final String[] visualOrder2 = {
        "@)@K.C.&@(dda)@KC@(led",
        "@)@BVDL@(dda )@QDVT@(led",
        "R.S.)T)U.&@(dda)@PQ@(led",
        "L.V.) L.V.&@(dda)@LV@(led",
        "rbbayad @R  DPDHRVR@  0  yad",
        "rbbayad @H  DPHPDHDA@  1  yad",
        "rbbayad @L  DPBLENDA@   2  yad",
        "rbbayad  @J  DPJQVM@  3  yad",
        "rbbayad    @I  DPIQNF@   4  yad",
        "rbbayad  @M  DPMEG@  5  yad",
        "DPMEGolleh",
        "WXYZ@ olleh"
    };

    private static final String[] visualOrder3 = {
        ")K.C.&(KC)dda(led",
        ")BVDL(ddaQDVT) (led",
        "R.S.)T)U.&(PQ)dda(led",
        "L.V.) L.V.&(LV)dda(led",
        "rbbayad DPDHRVR   R  0 yad",
        "rbbayad DPHPDHDA   H  1 yad",
        "rbbayad DPBLENDA     L 2 yad",
        "rbbayad  DPJQVM   J  3 yad",
        "rbbayad    DPIQNF     I 4 yad",
        "rbbayad  DPMEG   M  5 yad",
        "DPMEGolleh",
        "WXYZ olleh"
    };

    private static final String[] visualOrder4 = {
        "del(add(CK(.C.K)",
        "del( (TVDQadd(LDVB)",
        "del(add(QP(.U(T(.S.R",
        "del(add(VL(.V.L (.V.L",
        "day 0  R   RVRHDPD dayabbr",
        "day 1  H   ADHDPHPD dayabbr",
        "day 2 L     ADNELBPD dayabbr",
        "day 3  J   MVQJPD  dayabbr",
        "day 4 I     FNQIPD    dayabbr",
        "day 5  M   GEMPD  dayabbr",
        "helloGEMPD",
        "hello ZYXW"
    };

    public void testReorder() {
        Bidi bidi = new Bidi();
        int testNumber;
        int nTests = logicalOrder.length;
        String src, srcU16, dest = "";

        logln("\nEntering TestReorder\n");

        for (testNumber = 0; testNumber < nTests; testNumber++) {
            logln("Testing L2V #1 for case " + testNumber);
            src = logicalOrder[testNumber];
            srcU16 = pseudoToU16(src);
            try {
                bidi.setPara(srcU16, Bidi.LEVEL_DEFAULT_LTR, null);
            } catch (Exception e) {
                errln("Bidi.setPara(tests[" + testNumber + "], paraLevel " +
                      Bidi.LEVEL_DEFAULT_LTR + " failed.");
            }
            try {
                dest = u16ToPseudo(bidi.writeReordered(Bidi.DO_MIRRORING));
            } catch (Exception e) {
                errln("Bidi.writeReordered(tests[" + testNumber + "], paraLevel " +
                      Bidi.LEVEL_DEFAULT_LTR + " failed.");
            }
            if (!visualOrder[testNumber].equals(dest)) {
                assertEquals("Failure #1 in Bidi.writeReordered(), test number " +
                             testNumber, visualOrder[testNumber], dest, src, null,
                             "Bidi.DO_MIRRORING", "Bidi.LEVEL_DEFAULT_LTR");
            }
            checkWhatYouCan(bidi, src, dest);
        }

        for (testNumber = 0; testNumber < nTests; testNumber++) {
            logln("Testing L2V #2 for case " + testNumber);
            src = logicalOrder[testNumber];
            srcU16 = pseudoToU16(src);
            try {
                bidi.setPara(srcU16, Bidi.LEVEL_DEFAULT_LTR, null);
            } catch (Exception e) {
                errln("Bidi.setPara(tests[" + testNumber + "], paraLevel " +
                      Bidi.LEVEL_DEFAULT_LTR + " failed.");
            }
            try {
                dest = u16ToPseudo(bidi.writeReordered((short)(Bidi.DO_MIRRORING +
                                                               Bidi.OUTPUT_REVERSE)));
            } catch (Exception e) {
                errln("Bidi.writeReordered(test[" + testNumber + "], paraLevel "
                        + Bidi.LEVEL_DEFAULT_LTR + " failed.");
            }
            assertEquals("Failure #2 in Bidi.writeReordered() at index " +
                         testNumber, visualOrder1[testNumber], dest,
                         logicalOrder[testNumber], null,
                         "DO_MIRRORING + OUTPUT_REVERSE",
                         "Bidi.LEVEL_DEFAULT_LTR");
        }

        for (testNumber = 0; testNumber < nTests; testNumber++) {
            logln("Testing V2L #3 for case " + testNumber);
            src = logicalOrder[testNumber];
            srcU16 = pseudoToU16(src);
            bidi.setInverse(true);
            try {
                bidi.setPara(srcU16, Bidi.LEVEL_DEFAULT_LTR, null);
            } catch (Exception e) {
                errln("Bidi.setPara(tests[" + testNumber + "], paraLevel " +
                      Bidi.LEVEL_DEFAULT_LTR + " failed.");
            }
            try {
                dest = u16ToPseudo(bidi.writeReordered((short)
                           (Bidi.INSERT_LRM_FOR_NUMERIC | Bidi.OUTPUT_REVERSE)));
            } catch (Exception e) {
                errln("Bidi.writeReordered(test[" + testNumber + "], paraLevel " +
                      Bidi.LEVEL_DEFAULT_LTR + " failed.");
            }
            assertEquals("Failure #3 in Bidi.writeReordered(test[" + testNumber +
                         "])", visualOrder2[testNumber], dest,
                         logicalOrder[testNumber], null,
                         "INSERT_LRM_FOR_NUMERIC + OUTPUT_REVERSE",
                         "Bidi.LEVEL_DEFAULT_LTR");
        }

        /* Max Explicit level */
        for (testNumber = 0; testNumber < nTests; testNumber++) {
            logln("Testing V2L #4 for case " + testNumber);
            src = logicalOrder[testNumber];
            srcU16 = pseudoToU16(src);
            byte[] levels = new byte[Bidi.MAX_EXPLICIT_LEVEL];
            for (int i = 0; i < 10; i++) {
                levels[i] = (byte)(i + 1);
            }
            try {
                bidi.setPara(srcU16, Bidi.LEVEL_DEFAULT_LTR, levels);
            } catch (Exception e) {
                errln("Bidi.setPara(tests[" + testNumber +
                      "], paraLevel = MAX_EXPLICIT_LEVEL = " +
                      Bidi.MAX_EXPLICIT_LEVEL + " failed.");
            }
            try {
                dest = u16ToPseudo(bidi.writeReordered(Bidi.OUTPUT_REVERSE));
            } catch (Exception e) {
                errln("Bidi.writeReordered(test[" + testNumber + "], paraLevel " +
                      Bidi.LEVEL_DEFAULT_LTR + " failed.");
            }
            assertEquals("Failure #4 in Bidi.writeReordered(test[" + testNumber +
                         "])", visualOrder3[testNumber], dest,
                         logicalOrder[testNumber], null,
                         "OUTPUT_REVERSE", "Bidi.LEVEL_DEFAULT_LTR");
        }

        for (testNumber = 0; testNumber < nTests; testNumber++) {
            logln("Testing V2L #5 for case " + testNumber);
            src = logicalOrder[testNumber];
            srcU16 = pseudoToU16(src);
            byte[] levels = new byte[Bidi.MAX_EXPLICIT_LEVEL];
            for (int i = 0; i < 10; i++) {
                levels[i] = (byte)(i + 1);
            }
            try {
                bidi.setPara(srcU16, Bidi.LEVEL_DEFAULT_LTR, levels);
            } catch (Exception e) {
                errln("Bidi.setPara(tests[" + testNumber + "], paraLevel " +
                      Bidi.MAX_EXPLICIT_LEVEL + " failed.");
            }
            try {
                dest = u16ToPseudo(bidi.writeReordered((short)
                              (Bidi.DO_MIRRORING | Bidi.REMOVE_BIDI_CONTROLS)));
            } catch (Exception e) {
                errln("Bidi.writeReordered(test[" + testNumber + "], paraLevel "
                        + Bidi.LEVEL_DEFAULT_LTR + " failed.");
            }
            assertEquals("Failure #5 in Bidi.writeReordered(test[" + testNumber +
                         "])", visualOrder4[testNumber], dest,
                         logicalOrder[testNumber], null,
                         "DO_MIRRORING + REMOVE_BIDI_CONTROLS",
                         "Bidi.LEVEL_DEFAULT_LTR");
        }

        logln("\nExiting TestReorder\n");
    }


    public static void main(String[] args) {
        try {
            new TestReorder().run(args);
        }
        catch (Exception e) {
            System.out.println(e);
        }
    }

}
