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