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