1*de76a5adSDamjan Jovanovic /************************************************************** 2*de76a5adSDamjan Jovanovic * 3*de76a5adSDamjan Jovanovic * Licensed to the Apache Software Foundation (ASF) under one 4*de76a5adSDamjan Jovanovic * or more contributor license agreements. See the NOTICE file 5*de76a5adSDamjan Jovanovic * distributed with this work for additional information 6*de76a5adSDamjan Jovanovic * regarding copyright ownership. The ASF licenses this file 7*de76a5adSDamjan Jovanovic * to you under the Apache License, Version 2.0 (the 8*de76a5adSDamjan Jovanovic * "License"); you may not use this file except in compliance 9*de76a5adSDamjan Jovanovic * with the License. You may obtain a copy of the License at 10*de76a5adSDamjan Jovanovic * 11*de76a5adSDamjan Jovanovic * http://www.apache.org/licenses/LICENSE-2.0 12*de76a5adSDamjan Jovanovic * 13*de76a5adSDamjan Jovanovic * Unless required by applicable law or agreed to in writing, 14*de76a5adSDamjan Jovanovic * software distributed under the License is distributed on an 15*de76a5adSDamjan Jovanovic * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*de76a5adSDamjan Jovanovic * KIND, either express or implied. See the License for the 17*de76a5adSDamjan Jovanovic * specific language governing permissions and limitations 18*de76a5adSDamjan Jovanovic * under the License. 19*de76a5adSDamjan Jovanovic * 20*de76a5adSDamjan Jovanovic *************************************************************/ 21*de76a5adSDamjan Jovanovic 22*de76a5adSDamjan Jovanovic 23*de76a5adSDamjan Jovanovic 24*de76a5adSDamjan Jovanovic package ifc.i18n; 25*de76a5adSDamjan Jovanovic 26*de76a5adSDamjan Jovanovic import java.util.Vector; 27*de76a5adSDamjan Jovanovic 28*de76a5adSDamjan Jovanovic import lib.MultiMethodTest; 29*de76a5adSDamjan Jovanovic import lib.Status; 30*de76a5adSDamjan Jovanovic import lib.StatusException; 31*de76a5adSDamjan Jovanovic 32*de76a5adSDamjan Jovanovic import com.sun.star.i18n.Boundary; 33*de76a5adSDamjan Jovanovic import com.sun.star.i18n.LineBreakHyphenationOptions; 34*de76a5adSDamjan Jovanovic import com.sun.star.i18n.LineBreakResults; 35*de76a5adSDamjan Jovanovic import com.sun.star.i18n.LineBreakUserOptions; 36*de76a5adSDamjan Jovanovic import com.sun.star.i18n.ScriptType; 37*de76a5adSDamjan Jovanovic import com.sun.star.i18n.WordType; 38*de76a5adSDamjan Jovanovic import com.sun.star.i18n.XBreakIterator; 39*de76a5adSDamjan Jovanovic import com.sun.star.lang.Locale; 40*de76a5adSDamjan Jovanovic 41*de76a5adSDamjan Jovanovic /** 42*de76a5adSDamjan Jovanovic * Testing <code>com.sun.star.i18n.XBreakIterator</code> 43*de76a5adSDamjan Jovanovic * interface methods : 44*de76a5adSDamjan Jovanovic * <ul> 45*de76a5adSDamjan Jovanovic * <li><code> nextCharacters()</code></li> 46*de76a5adSDamjan Jovanovic * <li><code> previousCharacters()</code></li> 47*de76a5adSDamjan Jovanovic * <li><code> nextWord()</code></li> 48*de76a5adSDamjan Jovanovic * <li><code> previousWord()</code></li> 49*de76a5adSDamjan Jovanovic * <li><code> getWordBoundary()</code></li> 50*de76a5adSDamjan Jovanovic * <li><code> getWordType()</code></li> 51*de76a5adSDamjan Jovanovic * <li><code> isBeginWord()</code></li> 52*de76a5adSDamjan Jovanovic * <li><code> isEndWord()</code></li> 53*de76a5adSDamjan Jovanovic * <li><code> beginOfSentence()</code></li> 54*de76a5adSDamjan Jovanovic * <li><code> endOfSentence()</code></li> 55*de76a5adSDamjan Jovanovic * <li><code> getLineBreak()</code></li> 56*de76a5adSDamjan Jovanovic * <li><code> beginOfScript()</code></li> 57*de76a5adSDamjan Jovanovic * <li><code> endOfScript()</code></li> 58*de76a5adSDamjan Jovanovic * <li><code> nextScript()</code></li> 59*de76a5adSDamjan Jovanovic * <li><code> previousScript()</code></li> 60*de76a5adSDamjan Jovanovic * <li><code> getScriptType()</code></li> 61*de76a5adSDamjan Jovanovic * <li><code> beginOfCharBlock()</code></li> 62*de76a5adSDamjan Jovanovic * <li><code> endOfCharBlock()</code></li> 63*de76a5adSDamjan Jovanovic * <li><code> nextCharBlock()</code></li> 64*de76a5adSDamjan Jovanovic * <li><code> previousCharBlock()</code></li> 65*de76a5adSDamjan Jovanovic * </ul> <p> 66*de76a5adSDamjan Jovanovic * This test needs the following object relations : 67*de76a5adSDamjan Jovanovic * <ul> 68*de76a5adSDamjan Jovanovic * <li> <code>'Locale'</code> 69*de76a5adSDamjan Jovanovic * (of type <code>com.sun.star.lang.Locale</code>): 70*de76a5adSDamjan Jovanovic * this locale is used as locale argument for tested methods. 71*de76a5adSDamjan Jovanovic * </li> 72*de76a5adSDamjan Jovanovic * <li> <code>'UnicodeString'</code> 73*de76a5adSDamjan Jovanovic * (of type <code>String</code>): Unicode string which is passed 74*de76a5adSDamjan Jovanovic * to methods except 'CharacterBlock' methods. 75*de76a5adSDamjan Jovanovic * </li> 76*de76a5adSDamjan Jovanovic * <ul> <p> 77*de76a5adSDamjan Jovanovic * @see com.sun.star.i18n.XBreakIterator 78*de76a5adSDamjan Jovanovic */ 79*de76a5adSDamjan Jovanovic public class _XBreakIterator extends MultiMethodTest { 80*de76a5adSDamjan Jovanovic 81*de76a5adSDamjan Jovanovic public XBreakIterator oObj = null; 82*de76a5adSDamjan Jovanovic 83*de76a5adSDamjan Jovanovic Locale locale = null; 84*de76a5adSDamjan Jovanovic String UnicodeString = null; 85*de76a5adSDamjan Jovanovic 86*de76a5adSDamjan Jovanovic short wordType = WordType.ANYWORD_IGNOREWHITESPACES; 87*de76a5adSDamjan Jovanovic 88*de76a5adSDamjan Jovanovic /** 89*de76a5adSDamjan Jovanovic * Retrieves object relations. 90*de76a5adSDamjan Jovanovic * @throws StatusException If one of relations not found. 91*de76a5adSDamjan Jovanovic */ 92*de76a5adSDamjan Jovanovic protected void before() { 93*de76a5adSDamjan Jovanovic locale = (Locale)tEnv.getObjRelation("Locale"); 94*de76a5adSDamjan Jovanovic if (locale == null) { 95*de76a5adSDamjan Jovanovic throw new StatusException 96*de76a5adSDamjan Jovanovic (Status.failed("Relation 'Locale' not found")) ; 97*de76a5adSDamjan Jovanovic } 98*de76a5adSDamjan Jovanovic 99*de76a5adSDamjan Jovanovic UnicodeString = (String)tEnv.getObjRelation("UnicodeString"); 100*de76a5adSDamjan Jovanovic if (UnicodeString == null) { 101*de76a5adSDamjan Jovanovic throw new StatusException(Status.failed 102*de76a5adSDamjan Jovanovic ("Relation 'UnicodeString' not found")) ; 103*de76a5adSDamjan Jovanovic } 104*de76a5adSDamjan Jovanovic } 105*de76a5adSDamjan Jovanovic 106*de76a5adSDamjan Jovanovic /** 107*de76a5adSDamjan Jovanovic * Compares returned next character positions with expected values. <p> 108*de76a5adSDamjan Jovanovic * 109*de76a5adSDamjan Jovanovic * Has <b>OK</b> status if position after travel and traveled length 110*de76a5adSDamjan Jovanovic * has expected values. 111*de76a5adSDamjan Jovanovic */ 112*de76a5adSDamjan Jovanovic public void _nextCharacters() { 113*de76a5adSDamjan Jovanovic short nCharacterIteratorMode = 114*de76a5adSDamjan Jovanovic com.sun.star.i18n.CharacterIteratorMode.SKIPCHARACTER; 115*de76a5adSDamjan Jovanovic 116*de76a5adSDamjan Jovanovic int strLength = UnicodeString.length(); 117*de76a5adSDamjan Jovanovic 118*de76a5adSDamjan Jovanovic //Start from position : Travel ... chars : 119*de76a5adSDamjan Jovanovic // Actual position after : How many chars traveled 120*de76a5adSDamjan Jovanovic int[][] nextCharacters = { 121*de76a5adSDamjan Jovanovic { 1, 5000, strLength , strLength - 1 }, 122*de76a5adSDamjan Jovanovic { 10, 6, 16, 6}}; 123*de76a5adSDamjan Jovanovic 124*de76a5adSDamjan Jovanovic boolean bRes = true; 125*de76a5adSDamjan Jovanovic 126*de76a5adSDamjan Jovanovic for(int i = 0; i < nextCharacters.length; i++) { 127*de76a5adSDamjan Jovanovic int[] lDone = new int[1]; 128*de76a5adSDamjan Jovanovic long lRes = oObj.nextCharacters(UnicodeString, nextCharacters[i][0], 129*de76a5adSDamjan Jovanovic locale, nCharacterIteratorMode, nextCharacters[i][1], lDone); 130*de76a5adSDamjan Jovanovic log.println("Expected result is: lRes = " + nextCharacters[i][2] + 131*de76a5adSDamjan Jovanovic "; lDone = " + nextCharacters[i][3] ); 132*de76a5adSDamjan Jovanovic log.println("Actual result is: lRes = " + lRes + 133*de76a5adSDamjan Jovanovic "; lDone = " + lDone[0] ); 134*de76a5adSDamjan Jovanovic 135*de76a5adSDamjan Jovanovic bRes = bRes && lRes == nextCharacters[i][2]; 136*de76a5adSDamjan Jovanovic bRes = bRes && lDone[0] == nextCharacters[i][3]; 137*de76a5adSDamjan Jovanovic } 138*de76a5adSDamjan Jovanovic 139*de76a5adSDamjan Jovanovic tRes.tested("nextCharacters()", bRes); 140*de76a5adSDamjan Jovanovic } 141*de76a5adSDamjan Jovanovic 142*de76a5adSDamjan Jovanovic /** 143*de76a5adSDamjan Jovanovic * Compares returned previous character positions with expected values. <p> 144*de76a5adSDamjan Jovanovic * 145*de76a5adSDamjan Jovanovic * Has <b>OK</b> status if position after travel and traveled length 146*de76a5adSDamjan Jovanovic * has expected values. 147*de76a5adSDamjan Jovanovic */ 148*de76a5adSDamjan Jovanovic public void _previousCharacters() { 149*de76a5adSDamjan Jovanovic short nCharacterIteratorMode = 150*de76a5adSDamjan Jovanovic com.sun.star.i18n.CharacterIteratorMode.SKIPCHARACTER; 151*de76a5adSDamjan Jovanovic 152*de76a5adSDamjan Jovanovic 153*de76a5adSDamjan Jovanovic //Start from position : Travel ... chars : Actual position after : 154*de76a5adSDamjan Jovanovic //How many chars traveled 155*de76a5adSDamjan Jovanovic int[][] previousCharacters = { 156*de76a5adSDamjan Jovanovic {5, 5000, 0, 5}, 157*de76a5adSDamjan Jovanovic {10, 6, 4, 6}}; 158*de76a5adSDamjan Jovanovic 159*de76a5adSDamjan Jovanovic boolean bRes = true; 160*de76a5adSDamjan Jovanovic for(int i = 0; i < previousCharacters.length; i++) { 161*de76a5adSDamjan Jovanovic int[] lDone = new int[1]; 162*de76a5adSDamjan Jovanovic int lRes = oObj.previousCharacters(UnicodeString, 163*de76a5adSDamjan Jovanovic previousCharacters[i][0], 164*de76a5adSDamjan Jovanovic locale, nCharacterIteratorMode, 165*de76a5adSDamjan Jovanovic previousCharacters[i][1], lDone); 166*de76a5adSDamjan Jovanovic log.println("Expected result is: lRes = " + previousCharacters[i][2] 167*de76a5adSDamjan Jovanovic + "; lDone = " + previousCharacters[i][3] ); 168*de76a5adSDamjan Jovanovic log.println("Actual result is: lRes = " + lRes 169*de76a5adSDamjan Jovanovic + "; lDone = " + lDone[0]); 170*de76a5adSDamjan Jovanovic 171*de76a5adSDamjan Jovanovic bRes = bRes && lRes == previousCharacters[i][2]; 172*de76a5adSDamjan Jovanovic bRes = bRes && lDone[0] == previousCharacters[i][3]; 173*de76a5adSDamjan Jovanovic } 174*de76a5adSDamjan Jovanovic 175*de76a5adSDamjan Jovanovic tRes.tested("previousCharacters()", bRes); 176*de76a5adSDamjan Jovanovic } 177*de76a5adSDamjan Jovanovic 178*de76a5adSDamjan Jovanovic Vector vBounds = new Vector(); 179*de76a5adSDamjan Jovanovic 180*de76a5adSDamjan Jovanovic /** 181*de76a5adSDamjan Jovanovic * Saves bounds of all returned words for the future tests. <p> 182*de76a5adSDamjan Jovanovic * Has <b>OK</b> status. 183*de76a5adSDamjan Jovanovic */ 184*de76a5adSDamjan Jovanovic public void _nextWord() { 185*de76a5adSDamjan Jovanovic int i = 0; 186*de76a5adSDamjan Jovanovic 187*de76a5adSDamjan Jovanovic while( i < UnicodeString.length() - 1 ) { 188*de76a5adSDamjan Jovanovic Boundary bounds = oObj.nextWord 189*de76a5adSDamjan Jovanovic (UnicodeString, i, locale, wordType); 190*de76a5adSDamjan Jovanovic if (bounds.endPos - bounds.startPos > 3) { 191*de76a5adSDamjan Jovanovic vBounds.add( bounds ); 192*de76a5adSDamjan Jovanovic log.println("Word " + vBounds.size() + "(" 193*de76a5adSDamjan Jovanovic + bounds.startPos + "," + bounds.endPos + "): '" + 194*de76a5adSDamjan Jovanovic UnicodeString.substring(bounds.startPos, 195*de76a5adSDamjan Jovanovic bounds.endPos) + "'"); 196*de76a5adSDamjan Jovanovic } 197*de76a5adSDamjan Jovanovic i = bounds.endPos - 1; 198*de76a5adSDamjan Jovanovic } 199*de76a5adSDamjan Jovanovic log.println("In text there are " + vBounds.size() 200*de76a5adSDamjan Jovanovic + " words, if count from left to right"); 201*de76a5adSDamjan Jovanovic tRes.tested("nextWord()", true); 202*de76a5adSDamjan Jovanovic } 203*de76a5adSDamjan Jovanovic 204*de76a5adSDamjan Jovanovic /** 205*de76a5adSDamjan Jovanovic * Compares number of word bounds with number of word bounds saved 206*de76a5adSDamjan Jovanovic * by the method _nextWord().<p> 207*de76a5adSDamjan Jovanovic * Has <b>OK</b> status if number of word bounds are equal. 208*de76a5adSDamjan Jovanovic */ 209*de76a5adSDamjan Jovanovic public void _previousWord() { 210*de76a5adSDamjan Jovanovic requiredMethod("nextWord()"); 211*de76a5adSDamjan Jovanovic 212*de76a5adSDamjan Jovanovic int i = UnicodeString.length() - 1; 213*de76a5adSDamjan Jovanovic Vector vPrevBounds = new Vector(); 214*de76a5adSDamjan Jovanovic while( i > 0 ) { 215*de76a5adSDamjan Jovanovic Boundary bounds = 216*de76a5adSDamjan Jovanovic oObj.previousWord(UnicodeString, i, locale, wordType); 217*de76a5adSDamjan Jovanovic if (bounds.endPos - bounds.startPos > 3) { 218*de76a5adSDamjan Jovanovic vPrevBounds.add( bounds ); 219*de76a5adSDamjan Jovanovic log.println("Word " + vPrevBounds.size() + "(" 220*de76a5adSDamjan Jovanovic + bounds.startPos + "," + bounds.endPos + "): '" 221*de76a5adSDamjan Jovanovic + UnicodeString.substring(bounds.startPos, bounds.endPos) 222*de76a5adSDamjan Jovanovic + "'"); 223*de76a5adSDamjan Jovanovic } 224*de76a5adSDamjan Jovanovic i = bounds.startPos; 225*de76a5adSDamjan Jovanovic } 226*de76a5adSDamjan Jovanovic log.println("In text there are " + vPrevBounds.size() 227*de76a5adSDamjan Jovanovic + " words, if count from right to left"); 228*de76a5adSDamjan Jovanovic tRes.tested("previousWord()", vPrevBounds.size() == vBounds.size() ); 229*de76a5adSDamjan Jovanovic } 230*de76a5adSDamjan Jovanovic 231*de76a5adSDamjan Jovanovic /** 232*de76a5adSDamjan Jovanovic * For every word in array obtained by <code>nextWord</code> method test 233*de76a5adSDamjan Jovanovic * computes bounds of the word, passing its internal character position.<p> 234*de76a5adSDamjan Jovanovic * 235*de76a5adSDamjan Jovanovic * Has <b>OK</b> status if bounds calculated by <code>getWordBoundary()</code> 236*de76a5adSDamjan Jovanovic * method are the same as bounds obtained by <code>nextWord</code> method. 237*de76a5adSDamjan Jovanovic */ 238*de76a5adSDamjan Jovanovic public void _getWordBoundary() { 239*de76a5adSDamjan Jovanovic requiredMethod("nextWord()"); 240*de76a5adSDamjan Jovanovic 241*de76a5adSDamjan Jovanovic boolean bRes = true; 242*de76a5adSDamjan Jovanovic 243*de76a5adSDamjan Jovanovic for(int i = 0; i < vBounds.size(); i++) { 244*de76a5adSDamjan Jovanovic // calculate middle of the word 245*de76a5adSDamjan Jovanovic Boundary iBounds = (Boundary)vBounds.get(i); 246*de76a5adSDamjan Jovanovic int iPos = (iBounds.endPos - iBounds.startPos) / 2 247*de76a5adSDamjan Jovanovic + iBounds.startPos; 248*de76a5adSDamjan Jovanovic Boundary bounds = oObj.getWordBoundary(UnicodeString, iPos, 249*de76a5adSDamjan Jovanovic locale, wordType, true); 250*de76a5adSDamjan Jovanovic log.println("Expected result is: startPos = " + iBounds.startPos + 251*de76a5adSDamjan Jovanovic "; endPos = " + iBounds.endPos); 252*de76a5adSDamjan Jovanovic log.println("Actual result is: startPos = " + bounds.startPos 253*de76a5adSDamjan Jovanovic + "; endPos = " + bounds.endPos + " Word is: '" 254*de76a5adSDamjan Jovanovic + UnicodeString.substring(bounds.startPos, bounds.endPos) + "'"); 255*de76a5adSDamjan Jovanovic 256*de76a5adSDamjan Jovanovic bRes = bRes && iBounds.startPos == bounds.startPos; 257*de76a5adSDamjan Jovanovic bRes = bRes && iBounds.endPos == bounds.endPos; 258*de76a5adSDamjan Jovanovic } 259*de76a5adSDamjan Jovanovic 260*de76a5adSDamjan Jovanovic tRes.tested("getWordBoundary()", bRes); 261*de76a5adSDamjan Jovanovic } 262*de76a5adSDamjan Jovanovic 263*de76a5adSDamjan Jovanovic /** 264*de76a5adSDamjan Jovanovic * For every word in array obtained by <code>nextWord</code> method test 265*de76a5adSDamjan Jovanovic * get its type, passing its internal character position.<p> 266*de76a5adSDamjan Jovanovic * 267*de76a5adSDamjan Jovanovic * Has <b>OK</b> status if every word has type <code>WordType.ANY_WORD</code> 268*de76a5adSDamjan Jovanovic */ 269*de76a5adSDamjan Jovanovic public void _getWordType() { 270*de76a5adSDamjan Jovanovic requiredMethod("nextWord()"); 271*de76a5adSDamjan Jovanovic 272*de76a5adSDamjan Jovanovic boolean bRes = true; 273*de76a5adSDamjan Jovanovic 274*de76a5adSDamjan Jovanovic for(int i = 0; i < vBounds.size(); i++) { 275*de76a5adSDamjan Jovanovic // calculate middle of the word 276*de76a5adSDamjan Jovanovic Boundary iBounds = (Boundary)vBounds.get(i); 277*de76a5adSDamjan Jovanovic int iPos = (iBounds.endPos - iBounds.startPos) / 2 278*de76a5adSDamjan Jovanovic + iBounds.startPos; 279*de76a5adSDamjan Jovanovic 280*de76a5adSDamjan Jovanovic short type = oObj.getWordType(UnicodeString, iPos, locale); 281*de76a5adSDamjan Jovanovic 282*de76a5adSDamjan Jovanovic bRes = bRes && type == WordType.ANY_WORD; 283*de76a5adSDamjan Jovanovic } 284*de76a5adSDamjan Jovanovic 285*de76a5adSDamjan Jovanovic tRes.tested("getWordType()", bRes); 286*de76a5adSDamjan Jovanovic } 287*de76a5adSDamjan Jovanovic 288*de76a5adSDamjan Jovanovic /** 289*de76a5adSDamjan Jovanovic * For every word in array obtained by <code>nextWord</code> method test 290*de76a5adSDamjan Jovanovic * tries to determine if the character at a position starts a word. 291*de76a5adSDamjan Jovanovic * First word starting position is passed, then internal character 292*de76a5adSDamjan Jovanovic * position is passed. <p> 293*de76a5adSDamjan Jovanovic * Has <b>OK</b> status if in the first case <code>true</code> 294*de76a5adSDamjan Jovanovic * returned and in the second - <code>false</code> for every word. 295*de76a5adSDamjan Jovanovic */ 296*de76a5adSDamjan Jovanovic public void _isBeginWord() { 297*de76a5adSDamjan Jovanovic requiredMethod("nextWord()"); 298*de76a5adSDamjan Jovanovic 299*de76a5adSDamjan Jovanovic boolean bRes = true; 300*de76a5adSDamjan Jovanovic 301*de76a5adSDamjan Jovanovic for(int i = 0; i < vBounds.size(); i++) { 302*de76a5adSDamjan Jovanovic Boundary iBounds = (Boundary)vBounds.get(i); 303*de76a5adSDamjan Jovanovic boolean isBegin = oObj.isBeginWord(UnicodeString, iBounds.startPos, 304*de76a5adSDamjan Jovanovic locale, WordType.ANY_WORD); 305*de76a5adSDamjan Jovanovic bRes = bRes && isBegin; 306*de76a5adSDamjan Jovanovic boolean isNotBegin = !oObj.isBeginWord(UnicodeString, 307*de76a5adSDamjan Jovanovic iBounds.startPos + 1, locale, WordType.ANY_WORD); 308*de76a5adSDamjan Jovanovic bRes = bRes && isNotBegin; 309*de76a5adSDamjan Jovanovic 310*de76a5adSDamjan Jovanovic log.println("At position + " + iBounds.startPos 311*de76a5adSDamjan Jovanovic + " isBeginWord? " + isBegin); 312*de76a5adSDamjan Jovanovic log.println("At position + " + (iBounds.startPos + 1) 313*de76a5adSDamjan Jovanovic + " isBeginWord? " + !isNotBegin); 314*de76a5adSDamjan Jovanovic } 315*de76a5adSDamjan Jovanovic 316*de76a5adSDamjan Jovanovic tRes.tested("isBeginWord()", bRes); 317*de76a5adSDamjan Jovanovic } 318*de76a5adSDamjan Jovanovic 319*de76a5adSDamjan Jovanovic /** 320*de76a5adSDamjan Jovanovic * For every word in array obtained by <code>nextWord</code> method test 321*de76a5adSDamjan Jovanovic * tries to determine if the character at a position ends a word. 322*de76a5adSDamjan Jovanovic * First word ending position is passed, then internal character 323*de76a5adSDamjan Jovanovic * position is passed. <p> 324*de76a5adSDamjan Jovanovic * 325*de76a5adSDamjan Jovanovic * Has <b>OK</b> status if in the first case <code>true</code> 326*de76a5adSDamjan Jovanovic * returned and in the second - <code>false</code> for every word. 327*de76a5adSDamjan Jovanovic */ 328*de76a5adSDamjan Jovanovic public void _isEndWord() { 329*de76a5adSDamjan Jovanovic requiredMethod("nextWord()"); 330*de76a5adSDamjan Jovanovic 331*de76a5adSDamjan Jovanovic boolean bRes = true; 332*de76a5adSDamjan Jovanovic 333*de76a5adSDamjan Jovanovic for(int i = 0; i < vBounds.size(); i++) { 334*de76a5adSDamjan Jovanovic Boundary iBounds = (Boundary)vBounds.get(i); 335*de76a5adSDamjan Jovanovic boolean isEnd = oObj.isEndWord(UnicodeString, iBounds.endPos, 336*de76a5adSDamjan Jovanovic locale, WordType.ANY_WORD); 337*de76a5adSDamjan Jovanovic bRes = bRes && isEnd; 338*de76a5adSDamjan Jovanovic boolean isNotEnd = !oObj.isEndWord(UnicodeString, 339*de76a5adSDamjan Jovanovic iBounds.endPos - 1, locale, WordType.ANY_WORD); 340*de76a5adSDamjan Jovanovic bRes = bRes && isNotEnd; 341*de76a5adSDamjan Jovanovic 342*de76a5adSDamjan Jovanovic log.println("At position + " + iBounds.endPos 343*de76a5adSDamjan Jovanovic + " isEndWord? " + isEnd); 344*de76a5adSDamjan Jovanovic log.println("At position + " + (iBounds.endPos - 1) 345*de76a5adSDamjan Jovanovic + " isEndWord? " + !isNotEnd); 346*de76a5adSDamjan Jovanovic } 347*de76a5adSDamjan Jovanovic 348*de76a5adSDamjan Jovanovic tRes.tested("isEndWord()", bRes); 349*de76a5adSDamjan Jovanovic } 350*de76a5adSDamjan Jovanovic 351*de76a5adSDamjan Jovanovic Vector vSentenceStart = new Vector(); 352*de76a5adSDamjan Jovanovic /** 353*de76a5adSDamjan Jovanovic * Tries to find all sentences starting positions passing every character 354*de76a5adSDamjan Jovanovic * as position parameter and stores them. Then tries to pass invalid 355*de76a5adSDamjan Jovanovic * position parameters. 356*de76a5adSDamjan Jovanovic * 357*de76a5adSDamjan Jovanovic * Has <b>OK</b> status if -1 is returned for wrong position arguments. 358*de76a5adSDamjan Jovanovic */ 359*de76a5adSDamjan Jovanovic public void _beginOfSentence() { 360*de76a5adSDamjan Jovanovic int iPos = 0; 361*de76a5adSDamjan Jovanovic while( iPos < UnicodeString.length() ) { 362*de76a5adSDamjan Jovanovic Integer start = new Integer( oObj.beginOfSentence(UnicodeString, 363*de76a5adSDamjan Jovanovic iPos, locale) ); 364*de76a5adSDamjan Jovanovic if (start.intValue() >= 0 && !vSentenceStart.contains(start) ) { 365*de76a5adSDamjan Jovanovic vSentenceStart.add( start ); 366*de76a5adSDamjan Jovanovic log.println("Sentence " + vSentenceStart.size() 367*de76a5adSDamjan Jovanovic + " : start from position " + start); 368*de76a5adSDamjan Jovanovic } 369*de76a5adSDamjan Jovanovic iPos++; 370*de76a5adSDamjan Jovanovic } 371*de76a5adSDamjan Jovanovic 372*de76a5adSDamjan Jovanovic //test for invalid nStartPosition 373*de76a5adSDamjan Jovanovic boolean bRes = oObj.beginOfSentence(UnicodeString, -10, locale) == -1; 374*de76a5adSDamjan Jovanovic bRes &= oObj.beginOfSentence(UnicodeString, 375*de76a5adSDamjan Jovanovic UnicodeString.length() + 1, locale) == -1; 376*de76a5adSDamjan Jovanovic 377*de76a5adSDamjan Jovanovic if (!bRes) { 378*de76a5adSDamjan Jovanovic log.println("When invalid position, returned value isn't equal to -1"); 379*de76a5adSDamjan Jovanovic } 380*de76a5adSDamjan Jovanovic 381*de76a5adSDamjan Jovanovic tRes.tested("beginOfSentence()", bRes); 382*de76a5adSDamjan Jovanovic } 383*de76a5adSDamjan Jovanovic 384*de76a5adSDamjan Jovanovic /** 385*de76a5adSDamjan Jovanovic * For every sentence starting position found in 386*de76a5adSDamjan Jovanovic * <code>beginOfSentence()</code> test tries to compute end 387*de76a5adSDamjan Jovanovic * position of a sentence and checks that the end position is 388*de76a5adSDamjan Jovanovic * greater than starting. 389*de76a5adSDamjan Jovanovic * Then wrong position arguments are passed. 390*de76a5adSDamjan Jovanovic * 391*de76a5adSDamjan Jovanovic * Has <b>OK</b> status if the end position of every sentence 392*de76a5adSDamjan Jovanovic * greater than starting and -1 returned for invalid arguments. 393*de76a5adSDamjan Jovanovic */ 394*de76a5adSDamjan Jovanovic public void _endOfSentence() { 395*de76a5adSDamjan Jovanovic boolean bRes = true; 396*de76a5adSDamjan Jovanovic for(int i = 0; i < vSentenceStart.size(); i++) { 397*de76a5adSDamjan Jovanovic int start = ((Integer)vSentenceStart.get(i)).intValue(); 398*de76a5adSDamjan Jovanovic int end = oObj.endOfSentence(UnicodeString, start, locale); 399*de76a5adSDamjan Jovanovic bRes &= end > start; 400*de76a5adSDamjan Jovanovic log.println("Sentence " + i + " range is [" + start + ", " 401*de76a5adSDamjan Jovanovic + end + "]"); 402*de76a5adSDamjan Jovanovic } 403*de76a5adSDamjan Jovanovic 404*de76a5adSDamjan Jovanovic //test for invalid nStartPosition 405*de76a5adSDamjan Jovanovic boolean bInvRes = oObj.endOfSentence(UnicodeString, -10, locale) == -1; 406*de76a5adSDamjan Jovanovic bInvRes &= oObj.endOfSentence(UnicodeString, 407*de76a5adSDamjan Jovanovic UnicodeString.length() + 1, locale) == -1; 408*de76a5adSDamjan Jovanovic 409*de76a5adSDamjan Jovanovic if (!bInvRes) { 410*de76a5adSDamjan Jovanovic log.println("When invalid position, returned value isn't equal to -1"); 411*de76a5adSDamjan Jovanovic } 412*de76a5adSDamjan Jovanovic 413*de76a5adSDamjan Jovanovic tRes.tested("endOfSentence()", bRes && bInvRes); 414*de76a5adSDamjan Jovanovic } 415*de76a5adSDamjan Jovanovic 416*de76a5adSDamjan Jovanovic /** 417*de76a5adSDamjan Jovanovic * Tries to break a string in position other than 0 iterating characters 418*de76a5adSDamjan Jovanovic * from the string beginning (Hyphenation is not used for a while). <p> 419*de76a5adSDamjan Jovanovic * 420*de76a5adSDamjan Jovanovic * Has <b>OK</b> status if non-zero break position was found and it is 421*de76a5adSDamjan Jovanovic * less or equal than position we trying to break. 422*de76a5adSDamjan Jovanovic */ 423*de76a5adSDamjan Jovanovic public void _getLineBreak() { 424*de76a5adSDamjan Jovanovic boolean bRes = true; 425*de76a5adSDamjan Jovanovic LineBreakResults lineBreakResults; 426*de76a5adSDamjan Jovanovic LineBreakHyphenationOptions lineBreakHyphenationOptions = 427*de76a5adSDamjan Jovanovic new LineBreakHyphenationOptions(); 428*de76a5adSDamjan Jovanovic LineBreakUserOptions lineBreakUserOptions = new LineBreakUserOptions(); 429*de76a5adSDamjan Jovanovic 430*de76a5adSDamjan Jovanovic lineBreakUserOptions.applyForbiddenRules = false; 431*de76a5adSDamjan Jovanovic lineBreakUserOptions.allowHyphenateEnglish = false; 432*de76a5adSDamjan Jovanovic 433*de76a5adSDamjan Jovanovic int breakPos = 0; 434*de76a5adSDamjan Jovanovic int pos = 0; 435*de76a5adSDamjan Jovanovic 436*de76a5adSDamjan Jovanovic while(breakPos == 0 && pos < UnicodeString.length() ) { 437*de76a5adSDamjan Jovanovic lineBreakResults = oObj.getLineBreak(UnicodeString, pos, 438*de76a5adSDamjan Jovanovic locale, 0, lineBreakHyphenationOptions, lineBreakUserOptions); 439*de76a5adSDamjan Jovanovic breakPos = lineBreakResults.breakIndex; 440*de76a5adSDamjan Jovanovic pos++; 441*de76a5adSDamjan Jovanovic } 442*de76a5adSDamjan Jovanovic 443*de76a5adSDamjan Jovanovic // finally the position of break must be found in the middle and 444*de76a5adSDamjan Jovanovic // it must be before the break position specified 445*de76a5adSDamjan Jovanovic bRes = breakPos <= pos && breakPos > 0; 446*de76a5adSDamjan Jovanovic 447*de76a5adSDamjan Jovanovic if (!bRes) { 448*de76a5adSDamjan Jovanovic log.println("The last position was: " + pos 449*de76a5adSDamjan Jovanovic + ", and the break position was: " + breakPos); 450*de76a5adSDamjan Jovanovic } 451*de76a5adSDamjan Jovanovic 452*de76a5adSDamjan Jovanovic tRes.tested("getLineBreak()", bRes); 453*de76a5adSDamjan Jovanovic } 454*de76a5adSDamjan Jovanovic 455*de76a5adSDamjan Jovanovic // Asian type script 456*de76a5adSDamjan Jovanovic private static String katakana = new String(new char[] {0x30A1, 0x30A2}) ; 457*de76a5adSDamjan Jovanovic // Weak type script 458*de76a5adSDamjan Jovanovic private static String arrows = new String(new char[] {0x2190, 0x2191}) ; 459*de76a5adSDamjan Jovanovic // Complex type script 460*de76a5adSDamjan Jovanovic private static String arabic = new String(new char[] {0x0641, 0x0642}) ; 461*de76a5adSDamjan Jovanovic 462*de76a5adSDamjan Jovanovic /** 463*de76a5adSDamjan Jovanovic * Tries to find the beginning of the nearest script specified 464*de76a5adSDamjan Jovanovic * relatively to position passed. <p> 465*de76a5adSDamjan Jovanovic * Has <b>OK</b> status if the starting position of script is returned. 466*de76a5adSDamjan Jovanovic */ 467*de76a5adSDamjan Jovanovic public void _beginOfScript() { 468*de76a5adSDamjan Jovanovic String multiScript = "ab" + katakana ; 469*de76a5adSDamjan Jovanovic 470*de76a5adSDamjan Jovanovic int pos = oObj.beginOfScript(multiScript, 3, ScriptType.ASIAN) ; 471*de76a5adSDamjan Jovanovic 472*de76a5adSDamjan Jovanovic log.println("Position = " + pos) ; 473*de76a5adSDamjan Jovanovic 474*de76a5adSDamjan Jovanovic tRes.tested("beginOfScript()", pos == 2) ; 475*de76a5adSDamjan Jovanovic } 476*de76a5adSDamjan Jovanovic 477*de76a5adSDamjan Jovanovic /** 478*de76a5adSDamjan Jovanovic * Tries to find the end of the nearest script specified 479*de76a5adSDamjan Jovanovic * relatively to position passed. <p> 480*de76a5adSDamjan Jovanovic * Has <b>OK</b> status if the end position of script is returned. 481*de76a5adSDamjan Jovanovic */ 482*de76a5adSDamjan Jovanovic public void _endOfScript() { 483*de76a5adSDamjan Jovanovic String multiScript = "ab" + katakana + "cd" ; 484*de76a5adSDamjan Jovanovic 485*de76a5adSDamjan Jovanovic int pos = oObj.endOfScript(multiScript, 2, ScriptType.ASIAN) ; 486*de76a5adSDamjan Jovanovic 487*de76a5adSDamjan Jovanovic log.println("Position = " + pos) ; 488*de76a5adSDamjan Jovanovic 489*de76a5adSDamjan Jovanovic tRes.tested("endOfScript()", pos == 4) ; 490*de76a5adSDamjan Jovanovic } 491*de76a5adSDamjan Jovanovic 492*de76a5adSDamjan Jovanovic /** 493*de76a5adSDamjan Jovanovic * Tries to find the next script starting position specified 494*de76a5adSDamjan Jovanovic * relatively to position passed. <p> 495*de76a5adSDamjan Jovanovic * Has <b>OK</b> status if the appropriate position is returned. 496*de76a5adSDamjan Jovanovic */ 497*de76a5adSDamjan Jovanovic public void _nextScript() { 498*de76a5adSDamjan Jovanovic String multiScript = "ab" + katakana + "cd" ; 499*de76a5adSDamjan Jovanovic 500*de76a5adSDamjan Jovanovic int pos = oObj.nextScript(multiScript, 0, ScriptType.LATIN) ; 501*de76a5adSDamjan Jovanovic 502*de76a5adSDamjan Jovanovic log.println("Position = " + pos) ; 503*de76a5adSDamjan Jovanovic 504*de76a5adSDamjan Jovanovic tRes.tested("nextScript()", pos == 4) ; 505*de76a5adSDamjan Jovanovic } 506*de76a5adSDamjan Jovanovic 507*de76a5adSDamjan Jovanovic /** 508*de76a5adSDamjan Jovanovic * Tries to find the previous script starting position specified 509*de76a5adSDamjan Jovanovic * relatively to position passed. <p> 510*de76a5adSDamjan Jovanovic * Has <b>OK</b> status if the appropriate position is returned. 511*de76a5adSDamjan Jovanovic */ 512*de76a5adSDamjan Jovanovic public void _previousScript() { 513*de76a5adSDamjan Jovanovic String multiScript = "ab" + katakana + "cd" ; 514*de76a5adSDamjan Jovanovic 515*de76a5adSDamjan Jovanovic int pos = oObj.previousScript(multiScript, 5, ScriptType.ASIAN) ; 516*de76a5adSDamjan Jovanovic 517*de76a5adSDamjan Jovanovic log.println("Position = " + pos) ; 518*de76a5adSDamjan Jovanovic 519*de76a5adSDamjan Jovanovic tRes.tested("previousScript()", pos == 2) ; 520*de76a5adSDamjan Jovanovic } 521*de76a5adSDamjan Jovanovic 522*de76a5adSDamjan Jovanovic /** 523*de76a5adSDamjan Jovanovic * Tries to determine script type (of all four types). <p> 524*de76a5adSDamjan Jovanovic * Has <b>OK</b> status if <code>LATIN</code> type returned 525*de76a5adSDamjan Jovanovic * for ACSII character, <code>ASIAN</code> for Katakana Unicode 526*de76a5adSDamjan Jovanovic * codepoints, <code>COMPLEX</code> for Arabic Unicode 527*de76a5adSDamjan Jovanovic * codepoints and <code>WEAK</code> for codepoints from Arrows 528*de76a5adSDamjan Jovanovic * Unicode block. 529*de76a5adSDamjan Jovanovic */ 530*de76a5adSDamjan Jovanovic public void _getScriptType() { 531*de76a5adSDamjan Jovanovic boolean res = true ; 532*de76a5adSDamjan Jovanovic 533*de76a5adSDamjan Jovanovic res &= oObj.getScriptType("abcd", 0) == ScriptType.LATIN ; 534*de76a5adSDamjan Jovanovic res &= oObj.getScriptType(katakana, 0) == ScriptType.ASIAN; 535*de76a5adSDamjan Jovanovic res &= oObj.getScriptType(arabic, 0) == ScriptType.COMPLEX ; 536*de76a5adSDamjan Jovanovic res &= oObj.getScriptType(arrows, 0) == ScriptType.WEAK ; 537*de76a5adSDamjan Jovanovic 538*de76a5adSDamjan Jovanovic tRes.tested("getScriptType()", res) ; 539*de76a5adSDamjan Jovanovic } 540*de76a5adSDamjan Jovanovic 541*de76a5adSDamjan Jovanovic boolean bCharBlockRes = true; 542*de76a5adSDamjan Jovanovic 543*de76a5adSDamjan Jovanovic protected short getCharBlockType(int pos) { 544*de76a5adSDamjan Jovanovic short i = 1; 545*de76a5adSDamjan Jovanovic short cType = 0; 546*de76a5adSDamjan Jovanovic while (i < 31) { 547*de76a5adSDamjan Jovanovic if (oObj.beginOfCharBlock(UnicodeString, pos, locale, i) != -1) { 548*de76a5adSDamjan Jovanovic cType = i; 549*de76a5adSDamjan Jovanovic i = 100; 550*de76a5adSDamjan Jovanovic } 551*de76a5adSDamjan Jovanovic i++; 552*de76a5adSDamjan Jovanovic } 553*de76a5adSDamjan Jovanovic 554*de76a5adSDamjan Jovanovic return cType; 555*de76a5adSDamjan Jovanovic } 556*de76a5adSDamjan Jovanovic 557*de76a5adSDamjan Jovanovic Vector vCharBlockBounds = new Vector(); 558*de76a5adSDamjan Jovanovic Vector vCharBlockTypes = new Vector(); 559*de76a5adSDamjan Jovanovic 560*de76a5adSDamjan Jovanovic /** 561*de76a5adSDamjan Jovanovic * Creates array of all char blocks with their boundaries and 562*de76a5adSDamjan Jovanovic * types using <code>beginOfCharBlock()</code> and 563*de76a5adSDamjan Jovanovic * <code>endOfCharBlock()</code> methods. <p> 564*de76a5adSDamjan Jovanovic * 565*de76a5adSDamjan Jovanovic * Has <b>OK</b> status if the end of each boundary is the same 566*de76a5adSDamjan Jovanovic * as start of the next one and if the start of the first block 567*de76a5adSDamjan Jovanovic * has position 0 and the end of the last block is at the end 568*de76a5adSDamjan Jovanovic * of the whole string. 569*de76a5adSDamjan Jovanovic */ 570*de76a5adSDamjan Jovanovic public void _beginOfCharBlock() { 571*de76a5adSDamjan Jovanovic int iPos = 0; 572*de76a5adSDamjan Jovanovic 573*de76a5adSDamjan Jovanovic while( iPos < UnicodeString.length() && iPos > -1) { 574*de76a5adSDamjan Jovanovic short charType = getCharBlockType(iPos); 575*de76a5adSDamjan Jovanovic int startPos = oObj.beginOfCharBlock(UnicodeString, iPos, 576*de76a5adSDamjan Jovanovic locale, charType); 577*de76a5adSDamjan Jovanovic int endPos = oObj.endOfCharBlock(UnicodeString, iPos, 578*de76a5adSDamjan Jovanovic locale, charType); 579*de76a5adSDamjan Jovanovic iPos = endPos; 580*de76a5adSDamjan Jovanovic vCharBlockBounds.add(new Boundary(startPos, endPos)); 581*de76a5adSDamjan Jovanovic log.println("" + vCharBlockBounds.size() + "). Bounds: [" 582*de76a5adSDamjan Jovanovic + startPos + "," + endPos + "]; Type = " + charType); 583*de76a5adSDamjan Jovanovic vCharBlockTypes.add(new Short(charType)); 584*de76a5adSDamjan Jovanovic } 585*de76a5adSDamjan Jovanovic 586*de76a5adSDamjan Jovanovic for(int i = 0; i < vCharBlockBounds.size() - 1; i++) { 587*de76a5adSDamjan Jovanovic int endPos = ((Boundary)vCharBlockBounds.get(i)).endPos; 588*de76a5adSDamjan Jovanovic int startPos = ((Boundary)vCharBlockBounds.get(i + 1)).startPos; 589*de76a5adSDamjan Jovanovic bCharBlockRes &= endPos == startPos; 590*de76a5adSDamjan Jovanovic } 591*de76a5adSDamjan Jovanovic 592*de76a5adSDamjan Jovanovic log.println("Testing for no intersections : " + bCharBlockRes); 593*de76a5adSDamjan Jovanovic int startPos = ((Boundary)vCharBlockBounds.get(0)).startPos; 594*de76a5adSDamjan Jovanovic bCharBlockRes &= startPos == 0; 595*de76a5adSDamjan Jovanovic int endPos = ((Boundary)vCharBlockBounds.get 596*de76a5adSDamjan Jovanovic (vCharBlockBounds.size() - 1)).endPos; 597*de76a5adSDamjan Jovanovic bCharBlockRes &= endPos == UnicodeString.length(); 598*de76a5adSDamjan Jovanovic log.println("Regions should starts with 0 and ends with " 599*de76a5adSDamjan Jovanovic + UnicodeString.length()); 600*de76a5adSDamjan Jovanovic 601*de76a5adSDamjan Jovanovic tRes.tested("beginOfCharBlock()", bCharBlockRes); 602*de76a5adSDamjan Jovanovic } 603*de76a5adSDamjan Jovanovic 604*de76a5adSDamjan Jovanovic /** 605*de76a5adSDamjan Jovanovic * Testing of this method is performed in <code>beginOfCharBlock()</code> 606*de76a5adSDamjan Jovanovic * method test. <p> 607*de76a5adSDamjan Jovanovic * 608*de76a5adSDamjan Jovanovic * Has the status same as <code>beginOfCharBlock()</code> method status. 609*de76a5adSDamjan Jovanovic */ 610*de76a5adSDamjan Jovanovic public void _endOfCharBlock() { 611*de76a5adSDamjan Jovanovic requiredMethod("beginOfCharBlock()"); 612*de76a5adSDamjan Jovanovic tRes.tested("endOfCharBlock()", bCharBlockRes); 613*de76a5adSDamjan Jovanovic } 614*de76a5adSDamjan Jovanovic 615*de76a5adSDamjan Jovanovic /** 616*de76a5adSDamjan Jovanovic * For every character block obtained in <code>beginOfCharBlock()</code> 617*de76a5adSDamjan Jovanovic * method test (except the first) tries to find its starting position 618*de76a5adSDamjan Jovanovic * by mean of <code>nextCharBlock()</code> method passing as position 619*de76a5adSDamjan Jovanovic * argument the position before the start of a block. <p> 620*de76a5adSDamjan Jovanovic * 621*de76a5adSDamjan Jovanovic * Has <b>OK</b> status if the start of every block was found and it's 622*de76a5adSDamjan Jovanovic * equal to this block boundary start. 623*de76a5adSDamjan Jovanovic */ 624*de76a5adSDamjan Jovanovic public void _nextCharBlock() { 625*de76a5adSDamjan Jovanovic requiredMethod("beginOfCharBlock()"); 626*de76a5adSDamjan Jovanovic 627*de76a5adSDamjan Jovanovic boolean bRes = true; 628*de76a5adSDamjan Jovanovic for(int i = 0; i < vCharBlockBounds.size(); i++) { 629*de76a5adSDamjan Jovanovic Boundary bounds = (Boundary)vCharBlockBounds.get(i); 630*de76a5adSDamjan Jovanovic Short type = (Short)vCharBlockTypes.get(i); 631*de76a5adSDamjan Jovanovic if (bounds.startPos - 1 < 0) continue; 632*de76a5adSDamjan Jovanovic int iPos = oObj.nextCharBlock(UnicodeString, bounds.startPos - 1, 633*de76a5adSDamjan Jovanovic locale, type.shortValue()); 634*de76a5adSDamjan Jovanovic if (iPos != bounds.startPos) { 635*de76a5adSDamjan Jovanovic bRes = false; 636*de76a5adSDamjan Jovanovic log.println("nextCharBlock(UnicodeString, " 637*de76a5adSDamjan Jovanovic + (bounds.startPos - 1) + ", locale, " + type 638*de76a5adSDamjan Jovanovic + ") should return " + bounds.startPos); 639*de76a5adSDamjan Jovanovic log.println("... and actual value is " + iPos); 640*de76a5adSDamjan Jovanovic } 641*de76a5adSDamjan Jovanovic } 642*de76a5adSDamjan Jovanovic 643*de76a5adSDamjan Jovanovic tRes.tested("nextCharBlock()", bRes); 644*de76a5adSDamjan Jovanovic } 645*de76a5adSDamjan Jovanovic 646*de76a5adSDamjan Jovanovic /** 647*de76a5adSDamjan Jovanovic * For every character block obtained in <code>beginOfCharBlock()</code> 648*de76a5adSDamjan Jovanovic * method test (except the first) tries to find its starting position 649*de76a5adSDamjan Jovanovic * by mean of <code>previousCharBlock()</code> method passing as position 650*de76a5adSDamjan Jovanovic * argument the position after the end of a block. <p> 651*de76a5adSDamjan Jovanovic * 652*de76a5adSDamjan Jovanovic * Has <b>OK</b> status if the start of every block was found and it's 653*de76a5adSDamjan Jovanovic * equal to this block boundary start. 654*de76a5adSDamjan Jovanovic */ 655*de76a5adSDamjan Jovanovic public void _previousCharBlock() { 656*de76a5adSDamjan Jovanovic requiredMethod("beginOfCharBlock()"); 657*de76a5adSDamjan Jovanovic 658*de76a5adSDamjan Jovanovic boolean bRes = true; 659*de76a5adSDamjan Jovanovic for(int i = 0; i < vCharBlockBounds.size(); i++) { 660*de76a5adSDamjan Jovanovic Boundary bounds = (Boundary)vCharBlockBounds.get(i); 661*de76a5adSDamjan Jovanovic Short type = (Short)vCharBlockTypes.get(i); 662*de76a5adSDamjan Jovanovic int iPos = oObj.previousCharBlock(UnicodeString, 663*de76a5adSDamjan Jovanovic bounds.endPos + 1, locale, type.shortValue()); 664*de76a5adSDamjan Jovanovic if (iPos != bounds.startPos) { 665*de76a5adSDamjan Jovanovic bRes = false; 666*de76a5adSDamjan Jovanovic log.println("previousCharBlock(UnicodeString, " 667*de76a5adSDamjan Jovanovic + (bounds.endPos + 1) + ", locale, " + type 668*de76a5adSDamjan Jovanovic + ") should return " + bounds.startPos); 669*de76a5adSDamjan Jovanovic log.println("... and actual value is " + iPos); 670*de76a5adSDamjan Jovanovic } 671*de76a5adSDamjan Jovanovic } 672*de76a5adSDamjan Jovanovic 673*de76a5adSDamjan Jovanovic tRes.tested("previousCharBlock()", bRes); 674*de76a5adSDamjan Jovanovic } 675*de76a5adSDamjan Jovanovic 676*de76a5adSDamjan Jovanovic } 677