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