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

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

import com.ibm.icu.text.Bidi;
import com.ibm.icu.text.BidiClassifier;

/**
 * Regression test for Bidi class override.
 *
 * @author Lina Kemmel, Matitiahu Allouche
 */

public class TestClassOverride extends BidiTest {

    private static final int DEF = TestData.DEF;
    private static final int L   = TestData.L;
    private static final int R   = TestData.R;
    private static final int AL  = TestData.AL;
    private static final int AN  = TestData.AN;
    private static final int EN  = TestData.EN;
    private static final int LRE = TestData.LRE;
    private static final int RLE = TestData.RLE;
    private static final int LRO = TestData.LRO;
    private static final int RLO = TestData.RLO;
    private static final int PDF = TestData.PDF;
    private static final int NSM = TestData.NSM;
    private static final int B   = TestData.B;
    private static final int S   = TestData.S;
    private static final int BN  = TestData.BN;

    private static final int[] customClasses = {
        /* 0/8    1/9    2/A    3/B    4/C    5/D    6/E    7/F  */
        DEF,   DEF,   DEF,   DEF,   DEF,   DEF,   DEF,   DEF, //00-07
        DEF,   DEF,   DEF,   DEF,   DEF,   DEF,   DEF,   DEF, //08-0F
        DEF,   DEF,   DEF,   DEF,   DEF,   DEF,   DEF,   DEF, //10-17
        DEF,   DEF,   DEF,   DEF,   DEF,   DEF,   DEF,   DEF, //18-1F
        DEF,   DEF,   DEF,   DEF,   DEF,   DEF,     R,   DEF, //20-27
        DEF,   DEF,   DEF,   DEF,   DEF,   DEF,   DEF,   DEF, //28-2F
         EN,    EN,    EN,    EN,    EN,    EN,    AN,    AN, //30-37
         AN,    AN,   DEF,   DEF,   DEF,   DEF,   DEF,   DEF, //38-3F
          L,    AL,    AL,    AL,    AL,    AL,    AL,     R, //40-47
          R,     R,     R,     R,     R,     R,     R,     R, //48-4F
          R,     R,     R,     R,     R,     R,     R,     R, //50-57
          R,     R,     R,   LRE,   DEF,   RLE,   PDF,     S, //58-5F
        NSM,   DEF,   DEF,   DEF,   DEF,   DEF,   DEF,   DEF, //60-67
        DEF,   DEF,   DEF,   DEF,   DEF,   DEF,   DEF,   DEF, //68-6F
        DEF,   DEF,   DEF,   DEF,   DEF,   DEF,   DEF,   DEF, //70-77
        DEF,   DEF,   DEF,   LRO,     B,   RLO,    BN,   DEF  //78-7F
    };
    static final int nEntries = customClasses.length;

    static final String textIn  = "JIH.>12->a \u05d0\u05d1 6 ABC78";
    static final String textOut = "12<.HIJ->a 78CBA 6 \u05d1\u05d0";

    protected static class CustomClassifier extends BidiClassifier {

        public CustomClassifier(Object context) {
          super(context);
        }
        public int classify(int c) {
            // some (meaningless) action - just for testing purposes
            return (this.context != null ? ((Integer)context).intValue()
                            : c >= nEntries ? Bidi.CLASS_DEFAULT
                            : customClasses[c]);
        }
    }

    private void verifyClassifier(Bidi bidi) {
        BidiClassifier actualClassifier = bidi.getCustomClassifier();

        if (this.classifier != null) {
            Class expectedClass = this.classifier.getClass();
            assertTrue("null Bidi classifier", actualClassifier != null);
            if (actualClassifier == null) {
                return;
            }
            if (!expectedClass.isInstance(actualClassifier)) {
                errln("Bidi object reports classifier is an instance of " +
                      actualClassifier.getClass().getName() +
                      ",\nwhile the expected classifier should be an " +
                      "instance of " + expectedClass);
            } else {
                Object context = classifier.getContext();
                if (context != null) {
                    assertEquals("Unexpected classifier context", context,
                                 actualClassifier.getContext());
                    assertEquals("Unexpected context's content",
                                 ((Integer)context).intValue(),
                                 bidi.getCustomizedClass('a'));
                } else if (actualClassifier.getContext() != null) {
                    errln("Unexpected context, should be null");
                }
            }
        } else if (actualClassifier != null) {
            errln("Bidi classifier is not yet set, but reported as not null");
        }
    }

    CustomClassifier classifier = null;

    public void testClassOverride()
    {
        Bidi bidi;

        logln("\nEntering TestClassOverride\n");

        bidi = new Bidi();
        verifyClassifier(bidi);

        classifier = new CustomClassifier(new Integer(TestData.R));
        bidi.setCustomClassifier(classifier);
        verifyClassifier(bidi);

        classifier.setContext(null);
        verifyClassifier(bidi);

        bidi.setPara(textIn, Bidi.LTR, null);

        String out = bidi.writeReordered(Bidi.DO_MIRRORING);
        assertEquals("Actual and expected output mismatch", textOut, out);

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


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