/*
*******************************************************************************
*   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 ? super.classify(c)
                            : customClasses[c]);
        }
    }

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

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

    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);
        }
    }
}
