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