17935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert/* 27935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert******************************************************************************* 37935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* Copyright (C) 2007-2013, International Business Machines 47935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* Corporation and others. All Rights Reserved. 57935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert******************************************************************************* 67935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert*/ 77935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 87935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertpackage com.ibm.icu.dev.test.bidi; 97935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.text.Bidi; 117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert/** 137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Regression test for Bidi failure recovery 147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * 157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @author Lina Kemmel, Matitiahu Allouche 167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertpublic class TestFailureRecovery extends BidiTest { 197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void testFailureRecovery() 217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert { 227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("\nEntering TestFailureRecovery\n"); 237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Bidi bidi = new Bidi(); 247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Skip the following test since there are no invalid values 257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // between MAX_EXPLICIT_LEVEL+1 and LEVEL_DEFAULT_LTR 267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert //try { 277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // bidi.setPara("abc", (byte)(Bidi.LEVEL_DEFAULT_LTR - 1), null); 287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // errln("Bidi.setPara did not fail when passed too big para level"); 297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert //} catch (IllegalArgumentException e) { 307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // logln("OK: Got exception for bidi.setPara(..., Bidi.LEVEL_DEFAULT_LTR - 1, ...)" 317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // + " as expected: " + e.getMessage()); 327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert //} 337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert bidi.setPara("abc", (byte)(-1), null); 357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("Bidi.setPara did not fail when passed negative para level"); 367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (IllegalArgumentException e) { 377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("OK: Got exception for bidi.setPara(..., -1, ...)" 387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + " as expected: " + e.getMessage()); 397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Bidi.writeReverse(null, 0); 427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("Bidi.writeReverse did not fail when passed a null string"); 437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (IllegalArgumentException e) { 447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("OK: Got exception for Bidi.writeReverse(null) as expected: " 457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + e.getMessage()); 467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert bidi = new Bidi(); 487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert bidi.setLine(0, 1); 507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("bidi.setLine did not fail when called before valid setPara()"); 517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (IllegalStateException e) { 527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("OK: Got exception for Bidi.setLine(0, 1) as expected: " 537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + e.getMessage()); 547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert bidi.getDirection(); 577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("bidi.getDirection did not fail when called before valid setPara()"); 587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (IllegalStateException e) { 597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("OK: Got exception for Bidi.getDirection() as expected: " 607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + e.getMessage()); 617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert bidi.setPara("abc", Bidi.LTR, null); 637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert bidi.getLevelAt(3); 657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("bidi.getLevelAt did not fail when called with bad argument"); 667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (IllegalArgumentException e) { 677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("OK: Got exception for Bidi.getLevelAt(3) as expected: " 687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + e.getMessage()); 697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert bidi = new Bidi(-1, 0); 727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("Bidi constructor did not fail when called with bad argument"); 737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (IllegalArgumentException e) { 747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("OK: Got exception for Bidi(-1,0) as expected: " 757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + e.getMessage()); 767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert bidi = new Bidi(2, 1); 787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert bidi.setPara("abc", Bidi.LTR, null); 807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("setPara did not fail when called with text too long"); 817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (OutOfMemoryError e) { 827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("OK: Got exception for setPara(\"abc\") as expected: " 837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + e.getMessage()); 847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert bidi.setPara("=2", Bidi.RTL, null); 877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert bidi.countRuns(); 887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("countRuns did not fail when called for too many runs"); 897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (OutOfMemoryError e) { 907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("OK: Got exception for countRuns as expected: " 917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + e.getMessage()); 927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int rm = bidi.getReorderingMode(); 947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert bidi.setReorderingMode(Bidi.REORDER_DEFAULT - 1); 957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (rm != bidi.getReorderingMode()) { 967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("setReorderingMode with bad argument #1 should have no effect"); 977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert bidi.setReorderingMode(9999); 997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (rm != bidi.getReorderingMode()) { 1007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("setReorderingMode with bad argument #2 should have no effect"); 1017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 1027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* Try a surrogate char */ 1037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert bidi = new Bidi(); 1047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert bidi.setPara("\uD800\uDC00", Bidi.RTL, null); 1057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (bidi.getDirection() != Bidi.MIXED) { 1067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("getDirection for 1st surrogate char should be MIXED"); 1077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 1087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert byte[] levels = new byte[] {6,5,4}; 1097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 1107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert bidi.setPara("abc", (byte)5, levels); 1117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("setPara did not fail when called with bad levels"); 1127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (IllegalArgumentException e) { 1137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("OK: Got exception for setPara(..., levels) as expected: " 1147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + e.getMessage()); 1157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 1167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("\nExiting TestFailureRecovery\n"); 1187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 1197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public static void main(String[] args) { 1227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 1237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new TestFailureRecovery().run(args); 1247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 1257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert catch (Exception e) { 1267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert System.out.println(e); 1277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 1287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 1297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert} 130