xref: /trunk/test/testuno/source/api/i18n/XBreakIteratorTest.java (revision 3309286857f19787ae62bd793a98b5af4edd2ad3)
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 
242f709283SDamjan Jovanovic package api.i18n;
25de76a5adSDamjan Jovanovic 
262f709283SDamjan Jovanovic import java.io.ByteArrayOutputStream;
272f709283SDamjan Jovanovic import java.io.File;
282f709283SDamjan Jovanovic import java.io.FileInputStream;
292f709283SDamjan Jovanovic import java.io.IOException;
302f709283SDamjan Jovanovic import java.util.ArrayList;
31de76a5adSDamjan Jovanovic import java.util.Vector;
32de76a5adSDamjan Jovanovic 
332f709283SDamjan Jovanovic import com.sun.star.beans.PropertyState;
342f709283SDamjan 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;
432f709283SDamjan Jovanovic import com.sun.star.lang.XComponent;
442f709283SDamjan Jovanovic import com.sun.star.text.XTextDocument;
452f709283SDamjan Jovanovic import com.sun.star.text.XTextRange;
462f709283SDamjan Jovanovic import com.sun.star.uno.UnoRuntime;
472f709283SDamjan Jovanovic import com.sun.star.uno.XComponentContext;
482f709283SDamjan Jovanovic import org.junit.After;
492f709283SDamjan Jovanovic import org.junit.AfterClass;
502f709283SDamjan Jovanovic import org.junit.Before;
512f709283SDamjan Jovanovic import org.junit.BeforeClass;
522f709283SDamjan Jovanovic import org.junit.Assert;
532f709283SDamjan Jovanovic import org.junit.Test;
542f709283SDamjan Jovanovic import org.openoffice.test.common.Testspace;
552f709283SDamjan 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 */
952f709283SDamjan Jovanovic public class XBreakIteratorTest {
962f709283SDamjan Jovanovic     private static final UnoApp app = new UnoApp();
972f709283SDamjan Jovanovic     private static final String iteratorPath = "api/i18n/Iterator.sxw";
982f709283SDamjan Jovanovic     private static String UnicodeString;
99de76a5adSDamjan Jovanovic 
1002f709283SDamjan 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 
1072f709283SDamjan Jovanovic     // setup and close connections
1082f709283SDamjan Jovanovic     @BeforeClass
setUpConnection()1092f709283SDamjan Jovanovic     public static void setUpConnection() throws Exception
1102f709283SDamjan Jovanovic     {
1112f709283SDamjan Jovanovic         app.start();
1122f709283SDamjan Jovanovic         UnicodeString = readFileContents(iteratorPath);
1132f709283SDamjan Jovanovic     }
1142f709283SDamjan Jovanovic 
1152f709283SDamjan Jovanovic     @AfterClass
tearDownConnection()1162f709283SDamjan Jovanovic     public static void tearDownConnection() throws InterruptedException, com.sun.star.uno.Exception
1172f709283SDamjan Jovanovic     {
1182f709283SDamjan Jovanovic         app.close();
1192f709283SDamjan Jovanovic     }
1202f709283SDamjan Jovanovic 
121de76a5adSDamjan Jovanovic     /**
122de76a5adSDamjan Jovanovic      * Retrieves object relations.
123de76a5adSDamjan Jovanovic      * @throws StatusException If one of relations not found.
124de76a5adSDamjan Jovanovic      */
1252f709283SDamjan Jovanovic     @Before
before()1262f709283SDamjan Jovanovic     public void before() throws Exception {
1272f709283SDamjan Jovanovic         xContext = app.getComponentContext();
1282f709283SDamjan Jovanovic         oObj = UnoRuntime.queryInterface(
1292f709283SDamjan Jovanovic             XBreakIterator.class,
1302f709283SDamjan Jovanovic             xContext.getServiceManager().createInstanceWithContext("com.sun.star.i18n.BreakIterator", xContext)
1312f709283SDamjan Jovanovic         );
1322f709283SDamjan Jovanovic 
1332f709283SDamjan Jovanovic         locale = new Locale("en", "US", "");
134de76a5adSDamjan Jovanovic     }
135de76a5adSDamjan Jovanovic 
readFileContents(String path)1362f709283SDamjan Jovanovic     private static String readFileContents(String path) throws Exception {
1372f709283SDamjan Jovanovic         String sample = Testspace.prepareData(path);
1382f709283SDamjan Jovanovic         PropertyValue[] properties = new PropertyValue[1];
1392f709283SDamjan Jovanovic         properties[0] = new PropertyValue("Hidden", -1, true, PropertyState.DIRECT_VALUE);
1402f709283SDamjan Jovanovic         XComponent docComponent = app.loadDocument(sample, properties);
1412f709283SDamjan Jovanovic         XTextDocument textDocument = (XTextDocument) UnoRuntime.queryInterface(XTextDocument.class, docComponent);
1422f709283SDamjan Jovanovic         XTextRange xTextRange = (XTextRange)textDocument.getText();
1432f709283SDamjan 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      */
1522f709283SDamjan Jovanovic     @Test
_nextCharacters()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);
1712f709283SDamjan Jovanovic             System.out.println("Expected result is: lRes = " + nextCharacters[i][2] +
172de76a5adSDamjan Jovanovic                         "; lDone = " + nextCharacters[i][3] );
1732f709283SDamjan 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 
1802f709283SDamjan 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      */
1892f709283SDamjan Jovanovic     @Test
_previousCharacters()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);
2082f709283SDamjan Jovanovic             System.out.println("Expected result is: lRes = " + previousCharacters[i][2]
209de76a5adSDamjan Jovanovic                 + "; lDone = " + previousCharacters[i][3] );
2102f709283SDamjan 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 
2172f709283SDamjan 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     */
2242f709283SDamjan Jovanovic     @Test
_nextWord()225de76a5adSDamjan Jovanovic     public void _nextWord() {
2262f709283SDamjan Jovanovic         ArrayList<Boundary> vBounds = nextWord();
2272f709283SDamjan Jovanovic         Assert.assertTrue("nextWord()", vBounds != null && vBounds.size() > 0);
2282f709283SDamjan Jovanovic     }
229de76a5adSDamjan Jovanovic 
nextWord()2302f709283SDamjan Jovanovic     private ArrayList<Boundary> nextWord() {
2312f709283SDamjan Jovanovic         int i = 0;
2322f709283SDamjan 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 );
2382f709283SDamjan 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         }
2452f709283SDamjan Jovanovic         System.out.println("In text there are " + vBounds.size()
246de76a5adSDamjan Jovanovic             + " words, if count from left to right");
2472f709283SDamjan 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     */
2552f709283SDamjan Jovanovic     @Test
_previousWord()256de76a5adSDamjan Jovanovic     public void _previousWord() {
2572f709283SDamjan Jovanovic         ArrayList<Boundary> vBounds = nextWord();
258de76a5adSDamjan Jovanovic 
259de76a5adSDamjan Jovanovic         int i = UnicodeString.length() - 1;
2602f709283SDamjan 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 );
2662f709283SDamjan 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         }
2732f709283SDamjan Jovanovic         System.out.println("In text there are " + vPrevBounds.size()
274de76a5adSDamjan Jovanovic             + " words, if count from right to left");
2752f709283SDamjan 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      */
2852f709283SDamjan Jovanovic     @Test
_getWordBoundary()286de76a5adSDamjan Jovanovic     public void _getWordBoundary() {
2872f709283SDamjan 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);
2982f709283SDamjan Jovanovic             System.out.println("Expected result is: startPos = " + iBounds.startPos +
299de76a5adSDamjan Jovanovic                                  "; endPos = " + iBounds.endPos);
3002f709283SDamjan 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 
3082f709283SDamjan 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      */
3172f709283SDamjan Jovanovic     @Test
_getWordType()318de76a5adSDamjan Jovanovic     public void _getWordType() {
3192f709283SDamjan 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 
3342f709283SDamjan 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      */
3452f709283SDamjan Jovanovic     @Test
_isBeginWord()346de76a5adSDamjan Jovanovic     public void _isBeginWord() {
3472f709283SDamjan 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,
35410a136b9SDamjan Jovanovic                                                locale, wordType);
355de76a5adSDamjan Jovanovic             bRes = bRes && isBegin;
356de76a5adSDamjan Jovanovic             boolean isNotBegin = !oObj.isBeginWord(UnicodeString,
35710a136b9SDamjan Jovanovic                     iBounds.startPos + 1, locale, wordType);
358de76a5adSDamjan Jovanovic             bRes = bRes && isNotBegin;
359de76a5adSDamjan Jovanovic 
3602f709283SDamjan Jovanovic             System.out.println("At position + " + iBounds.startPos
361de76a5adSDamjan Jovanovic                 + " isBeginWord? " + isBegin);
3622f709283SDamjan Jovanovic             System.out.println("At position + " + (iBounds.startPos + 1)
363de76a5adSDamjan Jovanovic                 + " isBeginWord? " + !isNotBegin);
364de76a5adSDamjan Jovanovic         }
365de76a5adSDamjan Jovanovic 
3662f709283SDamjan Jovanovic         Assert.assertTrue("isBeginWord()", bRes);
367de76a5adSDamjan Jovanovic     }
368de76a5adSDamjan Jovanovic 
369de76a5adSDamjan Jovanovic     /**
370de76a5adSDamjan Jovanovic      * For every word in array obtained by <code>nextWord</code> method test
371de76a5adSDamjan Jovanovic      * tries to determine if the character at a position ends a word.
372de76a5adSDamjan Jovanovic      * First word ending position is passed, then internal character
373de76a5adSDamjan Jovanovic      * position is passed. <p>
374de76a5adSDamjan Jovanovic      *
375de76a5adSDamjan Jovanovic      * Has <b>OK</b> status if in the first case <code>true</code>
376de76a5adSDamjan Jovanovic      * returned and in the second - <code>false</code> for every word.
377de76a5adSDamjan Jovanovic      */
3782f709283SDamjan Jovanovic     @Test
_isEndWord()379de76a5adSDamjan Jovanovic     public void _isEndWord() {
3802f709283SDamjan Jovanovic         ArrayList<Boundary> vBounds = nextWord();
381de76a5adSDamjan Jovanovic 
382de76a5adSDamjan Jovanovic         boolean bRes = true;
383de76a5adSDamjan Jovanovic 
384de76a5adSDamjan Jovanovic         for(int i = 0; i < vBounds.size(); i++) {
385de76a5adSDamjan Jovanovic             Boundary iBounds = (Boundary)vBounds.get(i);
386de76a5adSDamjan Jovanovic             boolean isEnd = oObj.isEndWord(UnicodeString, iBounds.endPos,
38710a136b9SDamjan Jovanovic                 locale, wordType);
388de76a5adSDamjan Jovanovic             bRes = bRes && isEnd;
389de76a5adSDamjan Jovanovic             boolean isNotEnd = !oObj.isEndWord(UnicodeString,
39010a136b9SDamjan Jovanovic                 iBounds.endPos - 1, locale, wordType);
391de76a5adSDamjan Jovanovic             bRes = bRes && isNotEnd;
392de76a5adSDamjan Jovanovic 
3932f709283SDamjan Jovanovic             System.out.println("At position + " + iBounds.endPos
394de76a5adSDamjan Jovanovic                 + " isEndWord? " + isEnd);
3952f709283SDamjan Jovanovic             System.out.println("At position + " + (iBounds.endPos - 1)
396de76a5adSDamjan Jovanovic                 + " isEndWord? " + !isNotEnd);
397de76a5adSDamjan Jovanovic         }
398de76a5adSDamjan Jovanovic 
3992f709283SDamjan Jovanovic         Assert.assertTrue("isEndWord()", bRes);
400de76a5adSDamjan Jovanovic     }
401de76a5adSDamjan Jovanovic 
402de76a5adSDamjan Jovanovic     Vector vSentenceStart = new Vector();
403de76a5adSDamjan Jovanovic     /**
404de76a5adSDamjan Jovanovic      * Tries to find all sentences starting positions passing every character
405de76a5adSDamjan Jovanovic      * as position parameter and stores them. Then tries to pass invalid
406de76a5adSDamjan Jovanovic      * position parameters.
407de76a5adSDamjan Jovanovic      *
408de76a5adSDamjan Jovanovic      * Has <b>OK</b> status if -1 is returned for wrong position arguments.
409de76a5adSDamjan Jovanovic      */
4102f709283SDamjan Jovanovic     @Test
_beginOfSentence()411de76a5adSDamjan Jovanovic     public void _beginOfSentence() {
412de76a5adSDamjan Jovanovic         int iPos = 0;
413de76a5adSDamjan Jovanovic         while( iPos < UnicodeString.length() ) {
414de76a5adSDamjan Jovanovic             Integer start = new Integer( oObj.beginOfSentence(UnicodeString,
415de76a5adSDamjan Jovanovic                 iPos, locale) );
416de76a5adSDamjan Jovanovic             if (start.intValue() >= 0 && !vSentenceStart.contains(start) ) {
417de76a5adSDamjan Jovanovic                 vSentenceStart.add( start );
4182f709283SDamjan Jovanovic                 System.out.println("Sentence " + vSentenceStart.size()
419de76a5adSDamjan Jovanovic                     + " : start from position " + start);
420de76a5adSDamjan Jovanovic             }
421de76a5adSDamjan Jovanovic             iPos++;
422de76a5adSDamjan Jovanovic         }
423de76a5adSDamjan Jovanovic 
424de76a5adSDamjan Jovanovic         //test for invalid nStartPosition
425de76a5adSDamjan Jovanovic         boolean bRes = oObj.beginOfSentence(UnicodeString, -10, locale) == -1;
426de76a5adSDamjan Jovanovic         bRes &= oObj.beginOfSentence(UnicodeString,
427de76a5adSDamjan Jovanovic             UnicodeString.length() + 1, locale) == -1;
428de76a5adSDamjan Jovanovic 
429de76a5adSDamjan Jovanovic         if (!bRes) {
4302f709283SDamjan Jovanovic             System.out.println("When invalid position, returned value isn't equal to -1");
431de76a5adSDamjan Jovanovic         }
432de76a5adSDamjan Jovanovic 
4332f709283SDamjan Jovanovic         Assert.assertTrue("beginOfSentence()", bRes);
434de76a5adSDamjan Jovanovic     }
435de76a5adSDamjan Jovanovic 
436de76a5adSDamjan Jovanovic     /**
437de76a5adSDamjan Jovanovic      * For every sentence starting position found in
438de76a5adSDamjan Jovanovic      * <code>beginOfSentence()</code> test tries to compute end
439de76a5adSDamjan Jovanovic      * position of a sentence and checks that the end position is
440de76a5adSDamjan Jovanovic      * greater than starting.
441de76a5adSDamjan Jovanovic      * Then wrong position arguments are passed.
442de76a5adSDamjan Jovanovic      *
443de76a5adSDamjan Jovanovic      * Has <b>OK</b> status if the end position of every sentence
444de76a5adSDamjan Jovanovic      * greater than starting and -1 returned for invalid arguments.
445de76a5adSDamjan Jovanovic      */
4462f709283SDamjan Jovanovic     @Test
_endOfSentence()447de76a5adSDamjan Jovanovic     public void _endOfSentence() {
448de76a5adSDamjan Jovanovic         boolean bRes = true;
449de76a5adSDamjan Jovanovic         for(int i = 0; i < vSentenceStart.size(); i++) {
450de76a5adSDamjan Jovanovic             int start = ((Integer)vSentenceStart.get(i)).intValue();
451de76a5adSDamjan Jovanovic             int end = oObj.endOfSentence(UnicodeString, start, locale);
452de76a5adSDamjan Jovanovic             bRes &= end > start;
4532f709283SDamjan Jovanovic             System.out.println("Sentence " + i + " range is [" + start + ", "
454de76a5adSDamjan Jovanovic                 + end + "]");
455de76a5adSDamjan Jovanovic         }
456de76a5adSDamjan Jovanovic 
457de76a5adSDamjan Jovanovic         //test for invalid nStartPosition
458de76a5adSDamjan Jovanovic         boolean bInvRes = oObj.endOfSentence(UnicodeString, -10, locale) == -1;
459de76a5adSDamjan Jovanovic         bInvRes &= oObj.endOfSentence(UnicodeString,
460de76a5adSDamjan Jovanovic             UnicodeString.length() + 1, locale) == -1;
461de76a5adSDamjan Jovanovic 
462de76a5adSDamjan Jovanovic         if (!bInvRes) {
4632f709283SDamjan Jovanovic             System.out.println("When invalid position, returned value isn't equal to -1");
464de76a5adSDamjan Jovanovic         }
465de76a5adSDamjan Jovanovic 
4662f709283SDamjan Jovanovic         Assert.assertTrue("endOfSentence()", bRes && bInvRes);
467de76a5adSDamjan Jovanovic     }
468de76a5adSDamjan Jovanovic 
469de76a5adSDamjan Jovanovic     /**
470de76a5adSDamjan Jovanovic     * Tries to break a string in position other than 0 iterating characters
471de76a5adSDamjan Jovanovic     * from the string beginning (Hyphenation is not used for a while). <p>
472de76a5adSDamjan Jovanovic     *
473de76a5adSDamjan Jovanovic     * Has <b>OK</b> status if non-zero break position was found and it is
474de76a5adSDamjan Jovanovic     * less or equal than position we trying to break.
475de76a5adSDamjan Jovanovic     */
4762f709283SDamjan Jovanovic     @Test
_getLineBreak()477de76a5adSDamjan Jovanovic     public void _getLineBreak() {
478de76a5adSDamjan Jovanovic         boolean bRes = true;
479de76a5adSDamjan Jovanovic         LineBreakResults lineBreakResults;
480de76a5adSDamjan Jovanovic         LineBreakHyphenationOptions lineBreakHyphenationOptions =
481de76a5adSDamjan Jovanovic             new LineBreakHyphenationOptions();
482de76a5adSDamjan Jovanovic         LineBreakUserOptions lineBreakUserOptions = new LineBreakUserOptions();
483de76a5adSDamjan Jovanovic 
484de76a5adSDamjan Jovanovic         lineBreakUserOptions.applyForbiddenRules = false;
485de76a5adSDamjan Jovanovic         lineBreakUserOptions.allowHyphenateEnglish = false;
486de76a5adSDamjan Jovanovic 
487de76a5adSDamjan Jovanovic         int breakPos = 0;
488de76a5adSDamjan Jovanovic         int pos = 0;
489de76a5adSDamjan Jovanovic 
490de76a5adSDamjan Jovanovic         while(breakPos == 0 && pos < UnicodeString.length() ) {
491de76a5adSDamjan Jovanovic             lineBreakResults = oObj.getLineBreak(UnicodeString, pos,
492de76a5adSDamjan Jovanovic                 locale, 0, lineBreakHyphenationOptions, lineBreakUserOptions);
493de76a5adSDamjan Jovanovic             breakPos = lineBreakResults.breakIndex;
494de76a5adSDamjan Jovanovic             pos++;
495de76a5adSDamjan Jovanovic         }
496de76a5adSDamjan Jovanovic 
497de76a5adSDamjan Jovanovic         // finally the position of break must be found in the middle and
498de76a5adSDamjan Jovanovic         // it must be before the break position specified
499de76a5adSDamjan Jovanovic         bRes = breakPos <= pos && breakPos > 0;
500de76a5adSDamjan Jovanovic 
501de76a5adSDamjan Jovanovic         if (!bRes) {
5022f709283SDamjan Jovanovic             System.out.println("The last position was: " + pos
503de76a5adSDamjan Jovanovic                 + ", and the break position was: " + breakPos);
504de76a5adSDamjan Jovanovic         }
505de76a5adSDamjan Jovanovic 
5062f709283SDamjan Jovanovic         Assert.assertTrue("getLineBreak()", bRes);
507de76a5adSDamjan Jovanovic     }
508de76a5adSDamjan Jovanovic 
509de76a5adSDamjan Jovanovic     // Asian type script
510de76a5adSDamjan Jovanovic     private static String katakana = new String(new char[] {0x30A1, 0x30A2}) ;
511de76a5adSDamjan Jovanovic     // Weak type script
512de76a5adSDamjan Jovanovic     private static String arrows = new String(new char[] {0x2190, 0x2191}) ;
513de76a5adSDamjan Jovanovic     // Complex type script
514de76a5adSDamjan Jovanovic     private static String arabic = new String(new char[] {0x0641, 0x0642}) ;
515de76a5adSDamjan Jovanovic 
516de76a5adSDamjan Jovanovic     /**
517de76a5adSDamjan Jovanovic     * Tries to find the beginning of the nearest script specified
518de76a5adSDamjan Jovanovic     * relatively to position passed. <p>
519de76a5adSDamjan Jovanovic     * Has <b>OK</b> status if the starting position of script is returned.
520de76a5adSDamjan Jovanovic     */
5212f709283SDamjan Jovanovic     @Test
_beginOfScript()522de76a5adSDamjan Jovanovic     public void _beginOfScript() {
523de76a5adSDamjan Jovanovic         String multiScript = "ab" + katakana  ;
524de76a5adSDamjan Jovanovic 
525de76a5adSDamjan Jovanovic         int pos = oObj.beginOfScript(multiScript, 3, ScriptType.ASIAN) ;
526de76a5adSDamjan Jovanovic 
5272f709283SDamjan Jovanovic         System.out.println("Position = " + pos) ;
528de76a5adSDamjan Jovanovic 
5292f709283SDamjan Jovanovic         Assert.assertTrue("beginOfScript()", pos == 2) ;
530de76a5adSDamjan Jovanovic     }
531de76a5adSDamjan Jovanovic 
532de76a5adSDamjan Jovanovic     /**
533de76a5adSDamjan Jovanovic     * Tries to find the end of the nearest script specified
534de76a5adSDamjan Jovanovic     * relatively to position passed. <p>
535de76a5adSDamjan Jovanovic     * Has <b>OK</b> status if the end position of script is returned.
536de76a5adSDamjan Jovanovic     */
5372f709283SDamjan Jovanovic     @Test
_endOfScript()538de76a5adSDamjan Jovanovic     public void _endOfScript() {
539de76a5adSDamjan Jovanovic         String multiScript = "ab" + katakana + "cd" ;
540de76a5adSDamjan Jovanovic 
541de76a5adSDamjan Jovanovic         int pos = oObj.endOfScript(multiScript, 2, ScriptType.ASIAN) ;
542de76a5adSDamjan Jovanovic 
5432f709283SDamjan Jovanovic         System.out.println("Position = " + pos) ;
544de76a5adSDamjan Jovanovic 
5452f709283SDamjan Jovanovic         Assert.assertTrue("endOfScript()", pos == 4) ;
546de76a5adSDamjan Jovanovic     }
547de76a5adSDamjan Jovanovic 
548de76a5adSDamjan Jovanovic     /**
549de76a5adSDamjan Jovanovic     * Tries to find the next script starting position specified
550de76a5adSDamjan Jovanovic     * relatively to position passed. <p>
551de76a5adSDamjan Jovanovic     * Has <b>OK</b> status if the appropriate position is returned.
552de76a5adSDamjan Jovanovic     */
5532f709283SDamjan Jovanovic     @Test
_nextScript()554de76a5adSDamjan Jovanovic     public void _nextScript() {
555de76a5adSDamjan Jovanovic         String multiScript = "ab" + katakana + "cd"  ;
556de76a5adSDamjan Jovanovic 
557de76a5adSDamjan Jovanovic         int pos = oObj.nextScript(multiScript, 0, ScriptType.LATIN) ;
558de76a5adSDamjan Jovanovic 
5592f709283SDamjan Jovanovic         System.out.println("Position = " + pos) ;
560de76a5adSDamjan Jovanovic 
5612f709283SDamjan Jovanovic         Assert.assertTrue("nextScript()", pos == 4) ;
562de76a5adSDamjan Jovanovic     }
563de76a5adSDamjan Jovanovic 
564de76a5adSDamjan Jovanovic     /**
565de76a5adSDamjan Jovanovic     * Tries to find the previous script starting position specified
566de76a5adSDamjan Jovanovic     * relatively to position passed. <p>
567de76a5adSDamjan Jovanovic     * Has <b>OK</b> status if the appropriate position is returned.
568de76a5adSDamjan Jovanovic     */
5692f709283SDamjan Jovanovic     @Test
_previousScript()570de76a5adSDamjan Jovanovic     public void _previousScript() {
571de76a5adSDamjan Jovanovic         String multiScript = "ab" + katakana + "cd"  ;
572de76a5adSDamjan Jovanovic 
573de76a5adSDamjan Jovanovic         int pos = oObj.previousScript(multiScript, 5, ScriptType.ASIAN) ;
574de76a5adSDamjan Jovanovic 
5752f709283SDamjan Jovanovic         System.out.println("Position = " + pos) ;
576de76a5adSDamjan Jovanovic 
5772f709283SDamjan Jovanovic         Assert.assertTrue("previousScript()", pos == 2) ;
578de76a5adSDamjan Jovanovic     }
579de76a5adSDamjan Jovanovic 
580de76a5adSDamjan Jovanovic     /**
581de76a5adSDamjan Jovanovic     * Tries to determine script type (of all four types). <p>
582de76a5adSDamjan Jovanovic     * Has <b>OK</b> status if <code>LATIN</code> type returned
583*141ed1b0SJohn Bampton     * for ASCII character, <code>ASIAN</code> for Katakana Unicode
584de76a5adSDamjan Jovanovic     * codepoints, <code>COMPLEX</code> for Arabic Unicode
585de76a5adSDamjan Jovanovic     * codepoints and <code>WEAK</code> for codepoints from Arrows
586de76a5adSDamjan Jovanovic     * Unicode block.
587de76a5adSDamjan Jovanovic     */
5882f709283SDamjan Jovanovic     @Test
_getScriptType()589de76a5adSDamjan Jovanovic     public void _getScriptType() {
590de76a5adSDamjan Jovanovic         boolean res = true ;
591de76a5adSDamjan Jovanovic 
592de76a5adSDamjan Jovanovic         res &= oObj.getScriptType("abcd", 0) == ScriptType.LATIN ;
593de76a5adSDamjan Jovanovic         res &= oObj.getScriptType(katakana, 0) == ScriptType.ASIAN;
594de76a5adSDamjan Jovanovic         res &= oObj.getScriptType(arabic, 0) == ScriptType.COMPLEX ;
595de76a5adSDamjan Jovanovic         res &= oObj.getScriptType(arrows, 0) == ScriptType.WEAK ;
596de76a5adSDamjan Jovanovic 
5972f709283SDamjan Jovanovic         Assert.assertTrue("getScriptType()", res) ;
598de76a5adSDamjan Jovanovic     }
599de76a5adSDamjan Jovanovic 
getCharBlockType(int pos)600de76a5adSDamjan Jovanovic     protected short getCharBlockType(int pos) {
601de76a5adSDamjan Jovanovic         short i = 1;
602de76a5adSDamjan Jovanovic         short cType = 0;
603de76a5adSDamjan Jovanovic         while (i < 31) {
604de76a5adSDamjan Jovanovic             if (oObj.beginOfCharBlock(UnicodeString, pos, locale, i) != -1) {
605de76a5adSDamjan Jovanovic                 cType = i;
606de76a5adSDamjan Jovanovic                 i = 100;
607de76a5adSDamjan Jovanovic             }
608de76a5adSDamjan Jovanovic             i++;
609de76a5adSDamjan Jovanovic         }
610de76a5adSDamjan Jovanovic 
611de76a5adSDamjan Jovanovic         return cType;
612de76a5adSDamjan Jovanovic     }
613de76a5adSDamjan Jovanovic 
614de76a5adSDamjan Jovanovic     Vector vCharBlockBounds = new Vector();
615de76a5adSDamjan Jovanovic     Vector vCharBlockTypes = new Vector();
616de76a5adSDamjan Jovanovic 
617de76a5adSDamjan Jovanovic     /**
618de76a5adSDamjan Jovanovic      * Creates array of all char blocks with their boundaries and
619de76a5adSDamjan Jovanovic      * types using <code>beginOfCharBlock()</code> and
620de76a5adSDamjan Jovanovic      * <code>endOfCharBlock()</code> methods. <p>
621de76a5adSDamjan Jovanovic      *
622de76a5adSDamjan Jovanovic      * Has <b>OK</b> status if the end of each boundary is the same
623de76a5adSDamjan Jovanovic      * as start of the next one and if the start of the first block
624de76a5adSDamjan Jovanovic      * has position 0 and the end of the last block is at the end
625de76a5adSDamjan Jovanovic      * of the whole string.
626de76a5adSDamjan Jovanovic      */
6272f709283SDamjan Jovanovic     @Test
_beginOfCharBlock()628de76a5adSDamjan Jovanovic     public void _beginOfCharBlock() {
6292f709283SDamjan Jovanovic         Assert.assertTrue("beginOfCharBlock()", beginOfCharBlock());
6302f709283SDamjan Jovanovic     }
6312f709283SDamjan Jovanovic 
beginOfCharBlock()6322f709283SDamjan Jovanovic     private boolean beginOfCharBlock() {
6332f709283SDamjan Jovanovic         boolean bCharBlockRes = true;
634de76a5adSDamjan Jovanovic         int iPos = 0;
635de76a5adSDamjan Jovanovic 
636de76a5adSDamjan Jovanovic         while( iPos < UnicodeString.length() && iPos > -1) {
637de76a5adSDamjan Jovanovic             short charType = getCharBlockType(iPos);
638de76a5adSDamjan Jovanovic             int startPos = oObj.beginOfCharBlock(UnicodeString, iPos,
639de76a5adSDamjan Jovanovic                 locale, charType);
640de76a5adSDamjan Jovanovic             int endPos = oObj.endOfCharBlock(UnicodeString, iPos,
641de76a5adSDamjan Jovanovic                 locale, charType);
642de76a5adSDamjan Jovanovic             iPos = endPos;
643de76a5adSDamjan Jovanovic             vCharBlockBounds.add(new Boundary(startPos, endPos));
6442f709283SDamjan Jovanovic             System.out.println("" + vCharBlockBounds.size() + "). Bounds: ["
645de76a5adSDamjan Jovanovic                 + startPos + "," + endPos + "]; Type = " + charType);
646de76a5adSDamjan Jovanovic             vCharBlockTypes.add(new Short(charType));
647de76a5adSDamjan Jovanovic         }
648de76a5adSDamjan Jovanovic 
649de76a5adSDamjan Jovanovic         for(int i = 0; i < vCharBlockBounds.size() - 1; i++) {
650de76a5adSDamjan Jovanovic             int endPos = ((Boundary)vCharBlockBounds.get(i)).endPos;
651de76a5adSDamjan Jovanovic             int startPos = ((Boundary)vCharBlockBounds.get(i + 1)).startPos;
652de76a5adSDamjan Jovanovic             bCharBlockRes &= endPos == startPos;
653de76a5adSDamjan Jovanovic         }
654de76a5adSDamjan Jovanovic 
6552f709283SDamjan Jovanovic         System.out.println("Testing for no intersections : " + bCharBlockRes);
656de76a5adSDamjan Jovanovic         int startPos = ((Boundary)vCharBlockBounds.get(0)).startPos;
657de76a5adSDamjan Jovanovic         bCharBlockRes &= startPos == 0;
658de76a5adSDamjan Jovanovic         int endPos = ((Boundary)vCharBlockBounds.get
659de76a5adSDamjan Jovanovic             (vCharBlockBounds.size() - 1)).endPos;
660de76a5adSDamjan Jovanovic         bCharBlockRes &= endPos == UnicodeString.length();
6612f709283SDamjan Jovanovic         System.out.println("Regions should starts with 0 and ends with "
662de76a5adSDamjan Jovanovic             + UnicodeString.length());
663de76a5adSDamjan Jovanovic 
6642f709283SDamjan Jovanovic         return bCharBlockRes;
665de76a5adSDamjan Jovanovic     }
666de76a5adSDamjan Jovanovic 
667de76a5adSDamjan Jovanovic     /**
668de76a5adSDamjan Jovanovic      * Testing of this method is performed in <code>beginOfCharBlock()</code>
669de76a5adSDamjan Jovanovic      * method test. <p>
670de76a5adSDamjan Jovanovic      *
671de76a5adSDamjan Jovanovic      * Has the status same as <code>beginOfCharBlock()</code> method status.
672de76a5adSDamjan Jovanovic      */
_endOfCharBlock()673de76a5adSDamjan Jovanovic     public void _endOfCharBlock() {
6742f709283SDamjan Jovanovic         Assert.assertTrue("endOfCharBlock()", beginOfCharBlock());
675de76a5adSDamjan Jovanovic     }
676de76a5adSDamjan Jovanovic 
677de76a5adSDamjan Jovanovic     /**
678de76a5adSDamjan Jovanovic      * For every character block obtained in <code>beginOfCharBlock()</code>
679de76a5adSDamjan Jovanovic      * method test (except the first) tries to find its starting position
680de76a5adSDamjan Jovanovic      * by mean of <code>nextCharBlock()</code> method passing as position
681de76a5adSDamjan Jovanovic      * argument the position before the start of a block. <p>
682de76a5adSDamjan Jovanovic      *
683de76a5adSDamjan Jovanovic      * Has <b>OK</b> status if the start of every block was found and it's
684de76a5adSDamjan Jovanovic      * equal to this block boundary start.
685de76a5adSDamjan Jovanovic      */
_nextCharBlock()686de76a5adSDamjan Jovanovic     public void _nextCharBlock() {
6872f709283SDamjan Jovanovic         beginOfCharBlock();
688de76a5adSDamjan Jovanovic 
689de76a5adSDamjan Jovanovic         boolean bRes = true;
690de76a5adSDamjan Jovanovic         for(int i = 0; i < vCharBlockBounds.size(); i++) {
691de76a5adSDamjan Jovanovic             Boundary bounds = (Boundary)vCharBlockBounds.get(i);
692de76a5adSDamjan Jovanovic             Short type = (Short)vCharBlockTypes.get(i);
693de76a5adSDamjan Jovanovic             if (bounds.startPos - 1 < 0) continue;
694de76a5adSDamjan Jovanovic             int iPos = oObj.nextCharBlock(UnicodeString, bounds.startPos - 1,
695de76a5adSDamjan Jovanovic                 locale, type.shortValue());
696de76a5adSDamjan Jovanovic             if (iPos != bounds.startPos) {
697de76a5adSDamjan Jovanovic                 bRes = false;
6982f709283SDamjan Jovanovic                 System.out.println("nextCharBlock(UnicodeString, "
699de76a5adSDamjan Jovanovic                     + (bounds.startPos - 1) + ", locale, " + type
700de76a5adSDamjan Jovanovic                     + ") should return " + bounds.startPos);
7012f709283SDamjan Jovanovic                 System.out.println("... and actual value is " + iPos);
702de76a5adSDamjan Jovanovic             }
703de76a5adSDamjan Jovanovic         }
704de76a5adSDamjan Jovanovic 
7052f709283SDamjan Jovanovic         Assert.assertTrue("nextCharBlock()", bRes);
706de76a5adSDamjan Jovanovic     }
707de76a5adSDamjan Jovanovic 
708de76a5adSDamjan Jovanovic     /**
709de76a5adSDamjan Jovanovic      * For every character block obtained in <code>beginOfCharBlock()</code>
710de76a5adSDamjan Jovanovic      * method test (except the first) tries to find its starting position
711de76a5adSDamjan Jovanovic      * by mean of <code>previousCharBlock()</code> method passing as position
712de76a5adSDamjan Jovanovic      * argument the position after the end of a block. <p>
713de76a5adSDamjan Jovanovic      *
714de76a5adSDamjan Jovanovic      * Has <b>OK</b> status if the start of every block was found and it's
715de76a5adSDamjan Jovanovic      * equal to this block boundary start.
716de76a5adSDamjan Jovanovic      */
_previousCharBlock()717de76a5adSDamjan Jovanovic     public void _previousCharBlock() {
7182f709283SDamjan Jovanovic         beginOfCharBlock();
719de76a5adSDamjan Jovanovic 
720de76a5adSDamjan Jovanovic         boolean bRes = true;
721de76a5adSDamjan Jovanovic         for(int i = 0; i < vCharBlockBounds.size(); i++) {
722de76a5adSDamjan Jovanovic             Boundary bounds = (Boundary)vCharBlockBounds.get(i);
723de76a5adSDamjan Jovanovic             Short type = (Short)vCharBlockTypes.get(i);
724de76a5adSDamjan Jovanovic             int iPos = oObj.previousCharBlock(UnicodeString,
725de76a5adSDamjan Jovanovic                 bounds.endPos + 1, locale, type.shortValue());
726de76a5adSDamjan Jovanovic             if (iPos != bounds.startPos) {
727de76a5adSDamjan Jovanovic                 bRes = false;
7282f709283SDamjan Jovanovic                 System.out.println("previousCharBlock(UnicodeString, "
729de76a5adSDamjan Jovanovic                     + (bounds.endPos + 1) + ", locale, " + type
730de76a5adSDamjan Jovanovic                     + ") should return " + bounds.startPos);
7312f709283SDamjan Jovanovic                 System.out.println("... and actual value is " + iPos);
732de76a5adSDamjan Jovanovic             }
733de76a5adSDamjan Jovanovic         }
734de76a5adSDamjan Jovanovic 
7352f709283SDamjan Jovanovic         Assert.assertTrue("previousCharBlock()", bRes);
736de76a5adSDamjan Jovanovic     }
737de76a5adSDamjan Jovanovic 
738de76a5adSDamjan Jovanovic }
739