xref: /trunk/test/testuno/source/api/i18n/XBreakIteratorTest.java (revision 2f709283d1bd576d3b419fe5eab3c9c4e094bc79)
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