1aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin/* GENERATED SOURCE. DO NOT MODIFY. */
2f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert// © 2016 and later: Unicode, Inc. and others.
3f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert// License & terms of use: http://www.unicode.org/copyright.html#License
4aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin/*
5aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin*******************************************************************************
6aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin*   Copyright (C) 2008-2010, International Business Machines
7aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin*   Corporation and others.  All Rights Reserved.
8aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin*******************************************************************************
9aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin*/
10aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
11aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinpackage android.icu.dev.test.bidi;
12aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
13aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport java.util.Arrays;
14aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
15f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubertimport org.junit.Test;
16f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert
17aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport android.icu.impl.Utility;
18aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport android.icu.text.Bidi;
19aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport android.icu.text.BidiRun;
202e13a2bdade5cd0a635f0bd89805931a6fd710daPete Gillinimport android.icu.testsharding.MainTestShard;
21aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
22aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin/**
23aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin * Regression test for Bidi multiple paragraphs
24aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin *
25aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin * @author Lina Kemmel, Matitiahu Allouche
26aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin */
27aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
282e13a2bdade5cd0a635f0bd89805931a6fd710daPete Gillin@MainTestShard
29f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubertpublic class TestMultipleParagraphs extends BidiFmwk {
30aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
31aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    private static final String text =
32aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        "__ABC\u001c"                  /* Para #0 offset 0 */
33aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        + "__\u05d0DE\u001c"           /*       1        6 */
34aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        + "__123\u001c"                /*       2       12 */
35aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        + "\r\n"                       /*       3       18 */
36aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        + "FG\r"                       /*       4       20 */
37aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        + "\r"                         /*       5       23 */
38aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        + "HI\r\n"                     /*       6       24 */
39aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        + "\r\n"                       /*       7       28 */
40aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        + "\n"                         /*       8       30 */
41aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        + "\n"                         /*       9       31 */
42aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        + "JK\u001c";                  /*      10       32 */
43aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    private static final int paraCount = 11;
44aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    private static final int[] paraBounds = {
45aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        0, 6, 12, 18, 20, 23, 24, 28, 30, 31, 32, 35
46aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    };
47aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    private static final byte[] paraLevels = {
48aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        Bidi.LTR, Bidi.RTL, Bidi.LEVEL_DEFAULT_LTR, Bidi.LEVEL_DEFAULT_RTL, 22, 23
49aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    };
50aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    private static final byte[][] multiLevels = {
51aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
52aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
53aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        {0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0},
54aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        {0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0},
55aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        {22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22},
56aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        {23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23}
57aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    };
58aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    private static final String text2 = "\u05d0 1-2\u001c\u0630 1-2\u001c1-2";
59aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    private static final byte[] levels2 = {
60aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        1, 1, 2, 2, 2, 0, 1, 1, 2, 1, 2, 0, 2, 2, 2
61aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    };
62aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    private static final char[] multiparaTestString = {
63aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        0x5de, 0x5e0, 0x5e1, 0x5d4, 0x20,  0x5e1, 0x5e4, 0x5da,
64aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        0x20,  0xa,   0xa,   0x41,  0x72,  0x74,  0x69,  0x73,
65aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        0x74,  0x3a,  0x20,  0x5de, 0x5e0, 0x5e1, 0x5d4, 0x20,
66aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        0x5e1, 0x5e4, 0x5da, 0x20,  0xa,   0xa,   0x41,  0x6c,
67aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        0x62,  0x75,  0x6d,  0x3a,  0x20,  0x5de, 0x5e0, 0x5e1,
68aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        0x5d4, 0x20,  0x5e1, 0x5e4, 0x5da, 0x20,  0xa,   0xa,
69aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        0x54,  0x69,  0x6d,  0x65,  0x3a,  0x20,  0x32,  0x3a,
70aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        0x32,  0x37,  0xa,  0xa
71aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    };
72aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    private static final byte[] multiparaTestLevels = {
73aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        1, 1, 1, 1, 1, 1, 1, 1,
74aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        1, 1, 0, 0, 0, 0, 0, 0,
75aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        0, 0, 0, 1, 1, 1, 1, 1,
76aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        1, 1, 1, 0, 0, 0, 0, 0,
77aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        0, 0, 0, 0, 0, 1, 1, 1,
78aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        1, 1, 1, 1, 1, 0, 0, 0,
79aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        0, 0, 0, 0, 0, 0, 0, 0,
80aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        0, 0, 0, 0
81aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    };
82aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
83f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    @Test
84aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    public void testMultipleParagraphs()
85aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    {
86aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        byte gotLevel;
87aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        byte[] gotLevels;
88aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        boolean orderParagraphsLTR;
89aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String src;
90aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        Bidi bidi = new Bidi();
91aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        Bidi bidiLine;
92aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        int count, paraStart, paraLimit, paraIndex, length;
93aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        int i, j, k;
94aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
95aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        logln("\nEntering TestMultipleParagraphs\n");
96aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        try {
97aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            bidi.setPara(text, Bidi.LTR, null);
98aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        } catch (IllegalArgumentException e) {
99aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("1st Bidi.setPara failed, paraLevel = " + Bidi.LTR);
100aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
101aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
102aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        /* check paragraph count and boundaries */
103aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if (paraCount != (count = bidi.countParagraphs())) {
104aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("1st Bidi.countParagraphs returned " + count + ", should be " +
105aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                  paraCount);
106aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
107aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        BidiRun run;
108aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        for (i = 0; i < paraCount; i++) {
109aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            run = bidi.getParagraphByIndex(i);
110aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            paraStart = run.getStart();
111aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            paraLimit = run.getLimit();
112aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if ((paraStart != paraBounds[i]) ||
113aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                (paraLimit != paraBounds[i + 1])) {
114aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                errln("Found boundaries of paragraph " + i + ": " +
115aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                      paraStart + "-" + paraLimit + "; expected: " +
116aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                      paraBounds[i] + "-" + paraBounds[i + 1]);
117aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
118aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
119aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
120aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        /* check with last paragraph not terminated by B */
121aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        char[] chars = text.toCharArray();
122aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        chars[chars.length - 1] = 'L';
123aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        src = new String(chars);
124aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        try {
125aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            bidi.setPara(src, Bidi.LTR, null);
126aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        } catch (IllegalArgumentException e) {
127aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("2nd Bidi.setPara failed, paraLevel = " + Bidi.LTR);
128aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
129aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if (paraCount != (count = bidi.countParagraphs())) {
130aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("2nd Bidi.countParagraphs returned " + count +
131aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                  ", should be " + paraCount);
132aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
133aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        i = paraCount - 1;
134aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        run = bidi.getParagraphByIndex(i);
135aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        paraStart = run.getStart();
136aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        paraLimit = run.getLimit();
137aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if ((paraStart != paraBounds[i]) ||
138aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            (paraLimit != paraBounds[i + 1])) {
139aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("2nd Found boundaries of paragraph " + i + ": " +
140aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                  paraStart + "-" + paraLimit + "; expected: " +
141aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                  paraBounds[i] + "-" + paraBounds[i + 1]);
142aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
143aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
144aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        /* check paraLevel for all paragraphs under various paraLevel specs */
145aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        for (k = 0; k < 6; k++) {
146aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            try {
147aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                bidi.setPara(src, paraLevels[k], null);
148aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            } catch (IllegalArgumentException e) {
149aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                errln("3nd Bidi.setPara failed, paraLevel = " + paraLevels[k]);
150aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
151aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            for (i = 0; i < paraCount; i++) {
152aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                paraIndex = bidi.getParagraphIndex(paraBounds[i]);
153aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                run = bidi.getParagraph(paraBounds[i]);
154aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                if (paraIndex != i) {
155aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    errln("#1 For paraLevel = " + paraLevels[k] +
156aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                          " paragraph = " + i + ", found paragraph" +
157aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                          " index = " + paraIndex + " expected = " + i);
158aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                }
159aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                gotLevel = run.getEmbeddingLevel();
160aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                if (gotLevel != multiLevels[k][i]) {
161aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    errln("#2 For paraLevel = " + paraLevels[k] +
162aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                          " paragraph = " + i + ", found level = " + gotLevel +
163aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                          ", expected = " + multiLevels[k][i]);
164aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                }
165aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
166aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            gotLevel = bidi.getParaLevel();
167aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (gotLevel != multiLevels[k][0]) {
168aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                errln("#3 For paraLevel = " + paraLevels[k] +
169aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                      " getParaLevel = " + gotLevel + ", expected " +
170aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                      multiLevels[k][0]);
171aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
172aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
173aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
174aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        /* check that the result of Bidi.getParaLevel changes if the first
175aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin         * paragraph has a different level
176aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin         */
177aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        chars[0] = '\u05d2';            /* Hebrew letter Gimel */
178aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        src = new String(chars);
179aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        try {
180aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            bidi.setPara(src, Bidi.LEVEL_DEFAULT_LTR, null);
181aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        } catch (IllegalArgumentException e) {
182aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("Bidi.setPara failed, paraLevel = " + Bidi.LEVEL_DEFAULT_LTR);
183aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
184aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        gotLevel = bidi.getParaLevel();
185aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if (gotLevel != Bidi.RTL) {
186aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("#4 For paraLevel = Bidi.LEVEL_DEFAULT_LTR getParaLevel = " +
187aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                  gotLevel + ", expected = " + Bidi.RTL);
188aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
189aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
190aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        /* check that line cannot overlap paragraph boundaries */
191aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        bidiLine = new Bidi();
192aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        i = paraBounds[1];
193aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        k = paraBounds[2] + 1;
194aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        try {
195aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            bidiLine = bidi.setLine(i, k);
196aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("For line limits " + i + "-" + k
197aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    + " got success, while expected failure");
198aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        } catch (Exception e) {}
199aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
200aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        i = paraBounds[1];
201aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        k = paraBounds[2];
202aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        try {
203aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            bidiLine = bidi.setLine(i, k);
204aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        } catch (Exception e) {
205aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("For line limits " + i + "-" + k + " got failure");
206aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
207aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
208aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        /* check level of block separator at end of paragraph when orderParagraphsLTR==FALSE */
209aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        try {
210aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            bidi.setPara(src, Bidi.RTL, null);
211aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        } catch (IllegalArgumentException e) {
212aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("Bidi.setPara failed, paraLevel = " + Bidi.RTL);
213aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
214aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        /* get levels through para Bidi block */
215aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        try {
216aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            gotLevels = bidi.getLevels();
217aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        } catch (Exception e) {
218aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("Error on Bidi.getLevels");
219aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            gotLevels = new byte[bidi.getLength()];
220aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            Arrays.fill(gotLevels, (byte)-1);
221aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
222aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        for (i = 26; i < 32; i++) {
223aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (gotLevels[i] != Bidi.RTL) {
224aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                errln("For char " + i + "(0x" + Utility.hex(chars[i]) +
225aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                      "), level = " + gotLevels[i] + ", expected = " + Bidi.RTL);
226aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
227aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
228aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        /* get levels through para Line block */
229aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        i = paraBounds[1];
230aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        k = paraBounds[2];
231aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        try {
232aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            bidiLine = bidi.setLine(i, k);
233aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        } catch (Exception e) {
234aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("For line limits " + i + "-" + k + " got failure");
235aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            return;
236aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
237aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        paraIndex = bidiLine.getParagraphIndex(i);
238aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        run = bidiLine.getParagraph(i);
239aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        try {
240aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            gotLevels = bidiLine.getLevels();
241aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        } catch (Exception e) {
242aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("Error on bidiLine.getLevels");
243aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            gotLevels = new byte[bidiLine.getLength()];
244aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            Arrays.fill(gotLevels, (byte)-1);
245aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
246aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        length = bidiLine.getLength();
247aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        gotLevel = run.getEmbeddingLevel();
248aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if ((gotLevel != Bidi.RTL) || (gotLevels[length - 1] != Bidi.RTL)) {
249aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("For paragraph " + paraIndex + " with limits " +
250aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                  run.getStart() + "-" + run.getLimit() +
251aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                  ", paraLevel = " + gotLevel +
252aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                  "expected = " + Bidi.RTL +
253aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                  ", level of separator = " + gotLevels[length - 1] +
254aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                  " expected = " + Bidi.RTL);
255aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
256aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        orderParagraphsLTR = bidi.isOrderParagraphsLTR();
257aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        assertFalse("orderParagraphsLTR is true", orderParagraphsLTR);
258aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        bidi.orderParagraphsLTR(true);
259aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        orderParagraphsLTR = bidi.isOrderParagraphsLTR();
260aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        assertTrue("orderParagraphsLTR is false", orderParagraphsLTR);
261aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
262aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        /* check level of block separator at end of paragraph when orderParagraphsLTR==TRUE */
263aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        try {
264aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            bidi.setPara(src, Bidi.RTL, null);
265aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        } catch (IllegalArgumentException e) {
266aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("Bidi.setPara failed, paraLevel = " + Bidi.RTL);
267aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
268aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        /* get levels through para Bidi block */
269aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        try {
270aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            gotLevels = bidi.getLevels();
271aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        } catch (Exception e) {
272aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("Error on Bidi.getLevels");
273aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            gotLevels = new byte[bidi.getLength()];
274aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            Arrays.fill(gotLevels, (byte)-1);
275aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
276aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        for (i = 26; i < 32; i++) {
277aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (gotLevels[i] != 0) {
278aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                errln("For char " + i + "(0x" + Utility.hex(chars[i]) +
279aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                      "), level = "+ gotLevels[i] + ", expected = 0");
280aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
281aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
282aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        /* get levels through para Line block */
283aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        i = paraBounds[1];
284aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        k = paraBounds[2];
285aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        paraStart = run.getStart();
286aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        paraLimit = run.getLimit();
287aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        try {
288aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            bidiLine = bidi.setLine(paraStart, paraLimit);
289aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        } catch (Exception e) {
290aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("For line limits " + paraStart + "-" + paraLimit +
291aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                  " got failure");
292aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
293aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        paraIndex = bidiLine.getParagraphIndex(i);
294aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        run = bidiLine.getParagraph(i);
295aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        try {
296aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            gotLevels = bidiLine.getLevels();
297aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        } catch (Exception e) {
298aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("Error on bidiLine.getLevels");
299aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            gotLevels = new byte[bidiLine.getLength()];
300aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            Arrays.fill(gotLevels, (byte)-1);
301aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
302aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        length = bidiLine.getLength();
303aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        gotLevel = run.getEmbeddingLevel();
304aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        if ((gotLevel != Bidi.RTL) || (gotLevels[length - 1] != 0)) {
305aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            err("\nFor paragraph " + paraIndex + " with limits " +
306aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                run.getStart() + "-" + run.getLimit() +
307aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                ", paraLevel = " + gotLevel + "expected = " + Bidi.RTL +
308aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                ", level of separator = " + gotLevels[length - 1] +
309aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                " expected = 0\nlevels = ");
310aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            for (count = 0; count < length; count++) {
311aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                errcont(gotLevels[count] + "  ");
312aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
313aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errcont("\n");
314aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
315aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
316aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        /* test that the concatenation of separate invocations of the bidi code
317aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin         * on each individual paragraph in order matches the levels array that
318aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin         * results from invoking bidi once over the entire multiparagraph tests
319aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin         * (with orderParagraphsLTR false, of course)
320aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin         */
321aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        src = text;                     /* restore original content */
322aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        bidi.orderParagraphsLTR(false);
323aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        try {
324aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            bidi.setPara(src, Bidi.LEVEL_DEFAULT_RTL, null);
325aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        } catch (IllegalArgumentException e) {
326aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("Bidi.setPara failed, paraLevel = " + Bidi.LEVEL_DEFAULT_RTL);
327aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
328aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        try {
329aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            gotLevels = bidi.getLevels();
330aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        } catch (Exception e) {
331aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("Error on bidiLine.getLevels");
332aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            gotLevels = new byte[bidi.getLength()];
333aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            Arrays.fill(gotLevels, (byte)-1);
334aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
335aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        for (i = 0; i < paraCount; i++) {
336aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            /* use pLine for individual paragraphs */
337aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            paraStart = paraBounds[i];
338aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            length = paraBounds[i + 1] - paraStart;
339aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            try {
340aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                bidiLine.setPara(src.substring(paraStart, paraStart + length),
341aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                                 Bidi.LEVEL_DEFAULT_RTL, null);
342aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            } catch (IllegalArgumentException e) {
343aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                errln("Bidi.setPara failed, paraLevel = " + Bidi.LEVEL_DEFAULT_RTL);
344aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
345aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            for (j = 0; j < length; j++) {
346aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                if ((k = bidiLine.getLevelAt(j)) !=
347aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        (gotLevel = gotLevels[paraStart + j])) {
348aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    errln("Checking paragraph concatenation: for paragraph[" +
349aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                          i + "], char[" + j + "] = 0x" +
350aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                          Utility.hex(src.charAt(paraStart + j)) +
351aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                          ", level = " + k + ", expected = " + gotLevel);
352aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                }
353aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
354aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
355aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
356aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        /* ensure that leading numerics in a paragraph are not treated as arabic
357aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin           numerals because of arabic text in a preceding paragraph
358aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin         */
359aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        src = text2;
360aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        bidi.orderParagraphsLTR(true);
361aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        try {
362aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            bidi.setPara(src, Bidi.RTL, null);
363aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        } catch (IllegalArgumentException e) {
364aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("Bidi.setPara failed, paraLevel = " + Bidi.RTL);
365aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
366aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        try {
367aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            gotLevels = bidi.getLevels();
368aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        } catch (Exception e) {
369aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("Error on Bidi.getLevels");
370aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            gotLevels = new byte[bidi.getLength()];
371aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            Arrays.fill(gotLevels, (byte)-1);
372aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
373aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        for (i = 0, length = src.length(); i < length; i++) {
374aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (gotLevels[i] != levels2[i]) {
375aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                errln("Checking leading numerics: for char " + i + "(0x" +
376aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                      Utility.hex(src.charAt(i)) + "), level = " +
377aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                      gotLevels[i] + ", expected = " + levels2[i]);
378aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
379aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
380aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
381aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        /* check handling of whitespace before end of paragraph separator when
382aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin         * orderParagraphsLTR==TRUE, when last paragraph has, and lacks, a terminating B
383aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin         */
384aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        chars = src.toCharArray();
385aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        Arrays.fill(chars, '\u0020');
386aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        bidi.orderParagraphsLTR(true);
387aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        for (i = 0x001c; i <= 0x0020; i += (0x0020-0x001c)) {
388aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            chars[4] = (char)i;         /* with and without terminating B */
389aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            for (j = 0x0041; j <= 0x05d0; j += (0x05d0-0x0041)) {
390aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                chars[0] = (char)j;     /* leading 'A' or Alef */
391aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                src = new String(chars);
392aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                for (gotLevel = 4; gotLevel <= 5; gotLevel++) {
393aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    /* test even and odd paraLevel */
394aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    try {
395aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        bidi.setPara(src, gotLevel, null);
396aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    } catch (IllegalArgumentException e) {
397aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        errln("Bidi.setPara failed, paraLevel = " + gotLevel);
398aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    }
399aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    try {
400aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        gotLevels = bidi.getLevels();
401aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    } catch (Exception e) {
402aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        errln("Error on Bidi.getLevels");
403aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        gotLevels = new byte[bidi.getLength()];
404aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        Arrays.fill(gotLevels, (byte)-1);
405aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    }
406aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    for (k = 1; k <= 3; k++) {
407aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        if (gotLevels[k] != gotLevel) {
408aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                            errln("Checking trailing spaces for leading char 0x" +
409aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                                  Utility.hex(chars[0]) + ", last_char = " +
410aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                                  Utility.hex(chars[4]) + ", index = " + k +
411aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                                  "level = " + gotLevels[k] +
412aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                                  ", expected = " + gotLevel);
413aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                        }
414aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                    }
415aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                }
416aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
417aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
418aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
419aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        /* check default orientation when inverse bidi and paragraph starts
420aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin         * with LTR strong char and ends with RTL strong char, with and without
421aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin         * a terminating B
422aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin         */
423aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        bidi.setReorderingMode(Bidi.REORDER_INVERSE_LIKE_DIRECT);
424aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        bidi.setPara("abc \u05d2\u05d1\n", Bidi.LEVEL_DEFAULT_LTR, null);
425aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        String out = bidi.writeReordered(0);
426aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        assertEquals("\nInvalid output", "\u05d1\u05d2 abc\n", out);
427aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        bidi.setPara("abc \u05d2\u05d1", Bidi.LEVEL_DEFAULT_LTR, null);
428aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        out = bidi.writeReordered(0);
429aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        assertEquals("\nInvalid output #1", "\u05d1\u05d2 abc", out);
430aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
431aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        /* check multiple paragraphs together with explicit levels
432aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin         */
433aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        bidi.setReorderingMode(Bidi.REORDER_DEFAULT);
434aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        gotLevels = new byte[] {0,0,0,0,0,0,0,0,0,0};
435aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        bidi.setPara("ab\u05d1\u05d2\n\u05d3\u05d4123", Bidi.LTR, gotLevels);
436aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        out = bidi.writeReordered(0);
437aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        assertEquals("\nInvalid output #2", "ab\u05d2\u05d1\n123\u05d4\u05d3", out);
438aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        assertEquals("\nInvalid number of paras", 2, bidi.countParagraphs());
439aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
440aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        logln("\nExiting TestMultipleParagraphs\n");
441aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin
442aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        /* check levels in multiple paragraphs with default para level
443aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin         */
444aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        bidi = new Bidi();
445aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        bidi.setPara(multiparaTestString, Bidi.LEVEL_DEFAULT_LTR, null);
446aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        try {
447aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            gotLevels = bidi.getLevels();
448aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        } catch (Exception e) {
449aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            errln("Error on Bidi.getLevels for multiparaTestString");
450aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            return;
451aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
452aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        for (i = 0; i < multiparaTestString.length; i++) {
453aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            if (gotLevels[i] != multiparaTestLevels[i]) {
454aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                errln("Error on level for multiparaTestString at index " + i +
455aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                      ", expected=" + multiparaTestLevels[i] +
456aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin                      ", actual=" + gotLevels[i]);
457aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin            }
458aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin        }
459aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin    }
460aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin}
461