Home | History | Annotate | Download | only in bidi
      1 //  2016 and later: Unicode, Inc. and others.
      2 // License & terms of use: http://www.unicode.org/copyright.html#License
      3 /*
      4 *******************************************************************************
      5 *   Copyright (C) 2007-2013, International Business Machines
      6 *   Corporation and others.  All Rights Reserved.
      7 *******************************************************************************
      8 */
      9 
     10 package com.ibm.icu.dev.test.bidi;
     11 
     12 import org.junit.Test;
     13 
     14 import com.ibm.icu.text.Bidi;
     15 import com.ibm.icu.text.BidiClassifier;
     16 
     17 /**
     18  * Regression test for Bidi class override.
     19  *
     20  * @author Lina Kemmel, Matitiahu Allouche
     21  */
     22 
     23 public class TestClassOverride extends BidiFmwk {
     24 
     25     private static final int DEF = TestData.DEF;
     26     private static final int L   = TestData.L;
     27     private static final int R   = TestData.R;
     28     private static final int AL  = TestData.AL;
     29     private static final int AN  = TestData.AN;
     30     private static final int EN  = TestData.EN;
     31     private static final int LRE = TestData.LRE;
     32     private static final int RLE = TestData.RLE;
     33     private static final int LRO = TestData.LRO;
     34     private static final int RLO = TestData.RLO;
     35     private static final int PDF = TestData.PDF;
     36     private static final int NSM = TestData.NSM;
     37     private static final int B   = TestData.B;
     38     private static final int S   = TestData.S;
     39     private static final int BN  = TestData.BN;
     40 
     41     private static final int[] customClasses = {
     42     /*  0/8    1/9    2/A    3/B    4/C    5/D    6/E    7/F  */
     43         DEF,   DEF,   DEF,   DEF,   DEF,   DEF,   DEF,   DEF, //00-07
     44         DEF,   DEF,   DEF,   DEF,   DEF,   DEF,   DEF,   DEF, //08-0F
     45         DEF,   DEF,   DEF,   DEF,   DEF,   DEF,   DEF,   DEF, //10-17
     46         DEF,   DEF,   DEF,   DEF,   DEF,   DEF,   DEF,   DEF, //18-1F
     47         DEF,   DEF,   DEF,   DEF,   DEF,   DEF,     R,   DEF, //20-27
     48         DEF,   DEF,   DEF,   DEF,   DEF,   DEF,   DEF,   DEF, //28-2F
     49          EN,    EN,    EN,    EN,    EN,    EN,    AN,    AN, //30-37
     50          AN,    AN,   DEF,   DEF,   DEF,   DEF,   DEF,   DEF, //38-3F
     51           L,    AL,    AL,    AL,    AL,    AL,    AL,     R, //40-47
     52           R,     R,     R,     R,     R,     R,     R,     R, //48-4F
     53           R,     R,     R,     R,     R,     R,     R,     R, //50-57
     54           R,     R,     R,   LRE,   DEF,   RLE,   PDF,     S, //58-5F
     55         NSM,   DEF,   DEF,   DEF,   DEF,   DEF,   DEF,   DEF, //60-67
     56         DEF,   DEF,   DEF,   DEF,   DEF,   DEF,   DEF,   DEF, //68-6F
     57         DEF,   DEF,   DEF,   DEF,   DEF,   DEF,   DEF,   DEF, //70-77
     58         DEF,   DEF,   DEF,   LRO,     B,   RLO,    BN,   DEF  //78-7F
     59     };
     60     static final int nEntries = customClasses.length;
     61 
     62     static final String textIn  = "JIH.>12->a \u05d0\u05d1 6 ABC78";
     63     static final String textOut = "12<.HIJ->a 78CBA 6 \u05d1\u05d0";
     64 
     65     protected static class CustomClassifier extends BidiClassifier {
     66 
     67         public CustomClassifier(Object context) {
     68           super(context);
     69         }
     70         public int classify(int c) {
     71             // some (meaningless) action - just for testing purposes
     72             return (this.context != null ? ((Integer)context).intValue()
     73                             : c >= nEntries ? super.classify(c)
     74                             : customClasses[c]);
     75         }
     76     }
     77 
     78     private void verifyClassifier(Bidi bidi) {
     79         BidiClassifier actualClassifier = bidi.getCustomClassifier();
     80 
     81         if (this.classifier == null) {
     82             if (actualClassifier != null) {
     83                 errln("Bidi classifier is not yet set, but reported as not null");
     84             }
     85         } else {
     86             Class<?> expectedClass = this.classifier.getClass();
     87             assertTrue("null Bidi classifier", actualClassifier != null);
     88             if (actualClassifier == null) {
     89                 return;
     90             }
     91             if (expectedClass.isInstance(actualClassifier)) {
     92                 Object context = classifier.getContext();
     93                 if (context == null) {
     94                     if (actualClassifier.getContext() != null) {
     95                         errln("Unexpected context, should be null");
     96                     }
     97                 } else {
     98                     assertEquals("Unexpected classifier context", context,
     99                                  actualClassifier.getContext());
    100                     assertEquals("Unexpected context's content",
    101                                  ((Integer)context).intValue(),
    102                                  bidi.getCustomizedClass('a'));
    103                 }
    104             } else {
    105                 errln("Bidi object reports classifier is an instance of " +
    106                       actualClassifier.getClass().getName() +
    107                       ",\nwhile the expected classifier should be an " +
    108                       "instance of " + expectedClass);
    109             }
    110         }
    111     }
    112 
    113     CustomClassifier classifier = null;
    114 
    115     @Test
    116     public void testClassOverride()
    117     {
    118         Bidi bidi;
    119 
    120         logln("\nEntering TestClassOverride\n");
    121 
    122         bidi = new Bidi();
    123         verifyClassifier(bidi);
    124 
    125         classifier = new CustomClassifier(new Integer(TestData.R));
    126         bidi.setCustomClassifier(classifier);
    127         verifyClassifier(bidi);
    128 
    129         classifier.setContext(null);
    130         verifyClassifier(bidi);
    131 
    132         bidi.setPara(textIn, Bidi.LTR, null);
    133 
    134         String out = bidi.writeReordered(Bidi.DO_MIRRORING);
    135         assertEquals("Actual and expected output mismatch", textOut, out);
    136 
    137         logln("\nExiting TestClassOverride\n");
    138     }
    139 }
    140