17935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert/*
27935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert*******************************************************************************
37935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert*   Copyright (C) 2007-2011, 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 doing transformations in context
147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert *
157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @author Matitiahu Allouche
167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */
177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertpublic class TestContext extends BidiTest {
197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private class ContextCase {
217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String prologue;
227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String source;
237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String epilogue;
247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String expected;
257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        byte paraLevel;
267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        ContextCase(String pro, String src, String epi, String exp, byte lev) {
287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            prologue = pro;
297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            source = src;
307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            epilogue = epi;
317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            expected = exp;
327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            paraLevel = lev;
337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    };
357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private final ContextCase[] contextData = {
377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /*00*/  new ContextCase("", "", "", "", Bidi.LTR),
387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /*01*/  new ContextCase("", ".-=JKL-+*", "", ".-=LKJ-+*", Bidi.LTR),
397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /*02*/  new ContextCase(" ", ".-=JKL-+*", " ", ".-=LKJ-+*", Bidi.LTR),
407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /*03*/  new ContextCase("a", ".-=JKL-+*", "b", ".-=LKJ-+*", Bidi.LTR),
417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /*04*/  new ContextCase("D", ".-=JKL-+*", "", "LKJ=-.-+*", Bidi.LTR),
427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /*05*/  new ContextCase("", ".-=JKL-+*", " D", ".-=*+-LKJ", Bidi.LTR),
437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /*06*/  new ContextCase("", ".-=JKL-+*", " 2", ".-=*+-LKJ", Bidi.LTR),
447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /*07*/  new ContextCase("", ".-=JKL-+*", " 7", ".-=*+-LKJ", Bidi.LTR),
457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /*08*/  new ContextCase(" G 1", ".-=JKL-+*", " H", "*+-LKJ=-.", Bidi.LTR),
467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /*09*/  new ContextCase("7", ".-=JKL-+*", " H", ".-=*+-LKJ", Bidi.LTR),
477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /*10*/  new ContextCase("", ".-=abc-+*", "", "*+-abc=-.", Bidi.RTL),
487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /*11*/  new ContextCase(" ", ".-=abc-+*", " ", "*+-abc=-.", Bidi.RTL),
497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /*12*/  new ContextCase("D", ".-=abc-+*", "G", "*+-abc=-.", Bidi.RTL),
507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /*13*/  new ContextCase("x", ".-=abc-+*", "", "*+-.-=abc", Bidi.RTL),
517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /*14*/  new ContextCase("", ".-=abc-+*", " y", "abc-+*=-.", Bidi.RTL),
527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /*15*/  new ContextCase("", ".-=abc-+*", " 2", "abc-+*=-.", Bidi.RTL),
537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /*16*/  new ContextCase(" x 1", ".-=abc-+*", " 2", ".-=abc-+*", Bidi.RTL),
547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /*17*/  new ContextCase(" x 7", ".-=abc-+*", " 8", "*+-.-=abc", Bidi.RTL),
557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /*18*/  new ContextCase("x|", ".-=abc-+*", " 8", "*+-abc=-.", Bidi.RTL),
567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /*19*/  new ContextCase("G|y", ".-=abc-+*", " 8", "*+-.-=abc", Bidi.RTL),
577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /*20*/  new ContextCase("", ".-=", "", ".-=", Bidi.LEVEL_DEFAULT_LTR),
587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /*21*/  new ContextCase("D", ".-=", "", "=-.", Bidi.LEVEL_DEFAULT_LTR),
597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /*22*/  new ContextCase("G", ".-=", "", "=-.", Bidi.LEVEL_DEFAULT_LTR),
607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /*23*/  new ContextCase("xG", ".-=", "", ".-=", Bidi.LEVEL_DEFAULT_LTR),
617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /*24*/  new ContextCase("x|G", ".-=", "", "=-.", Bidi.LEVEL_DEFAULT_LTR),
627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /*25*/  new ContextCase("x|G", ".-=|-+*", "", "=-.|-+*", Bidi.LEVEL_DEFAULT_LTR),
637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    };
647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private final int CONTEXT_COUNT = contextData.length;
657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void testContext()
677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    {
687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String prologue, epilogue, src, dest;
697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Bidi bidi = new Bidi();
707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int tc;
717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        ContextCase cc;
727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("\nEntering TestContext\n");
747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        bidi.orderParagraphsLTR(true);
767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (tc = 0; tc < CONTEXT_COUNT; tc++) {
787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            cc = contextData[tc];
797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            prologue = pseudoToU16(cc.prologue);
807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            epilogue = pseudoToU16(cc.epilogue);
817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            /* in the call below, prologue and epilogue are swapped to show
827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert               that the next call will override this call */
837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            bidi.setContext(epilogue, prologue);
847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            bidi.setContext(prologue, epilogue);
857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            src = pseudoToU16(cc.source);
867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            bidi.setPara(src, cc.paraLevel, null);
877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            dest = bidi.writeReordered(Bidi.DO_MIRRORING);
887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            dest = u16ToPseudo(dest);
897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            assertEquals("\nActual and expected output mismatch on case "+tc+"." +
907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                         "\nPrologue:           " + cc.prologue +
917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                         "\nInput:              " + cc.source +
927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                         "\nEpilogue:           " + cc.epilogue +
937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                         "\nParagraph level:    " + Byte.toString(bidi.getParaLevel()) + "\n",
947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                         cc.expected, dest);
957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("\nExiting TestContext\n");
987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public static void main(String[] args) {
1017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
1027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new TestContext().run(args);
1037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
1047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        catch (Exception e) {
1057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            System.out.println(e);
1067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
1077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
1087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert}
109