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