12d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert// © 2016 and later: Unicode, Inc. and others.
22d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert// License & terms of use: http://www.unicode.org/copyright.html#License
37935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert/*
47935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert *******************************************************************************
57935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Copyright (C) 2001-2014, International Business Machines Corporation and    *
67935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * others. All Rights Reserved.                                                *
77935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert *******************************************************************************
87935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */
97935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
102d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert/**
117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Port From:   ICU4C v1.8.1 : rbbi : RBBIAPITest
127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Source File: $ICU4CRoot/source/test/intltest/rbbiapts.cpp
137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert **/
147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertpackage com.ibm.icu.dev.test.rbbi;
167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
172d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubertimport java.io.ByteArrayOutputStream;
182d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubertimport java.io.PrintStream;
197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.text.CharacterIterator;
207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.text.StringCharacterIterator;
21fe77e7203e518f62b5bd8e8c603bca361e9cf47bFredrik Roubertimport java.util.ArrayList;
22fe77e7203e518f62b5bd8e8c603bca361e9cf47bFredrik Roubertimport java.util.List;
237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.Locale;
247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
252d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubertimport org.junit.Test;
26fe77e7203e518f62b5bd8e8c603bca361e9cf47bFredrik Roubertimport org.junit.runner.RunWith;
27fe77e7203e518f62b5bd8e8c603bca361e9cf47bFredrik Roubertimport org.junit.runners.JUnit4;
282d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
292d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubertimport com.ibm.icu.dev.test.TestFmwk;
307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.text.BreakIterator;
317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.text.RuleBasedBreakIterator;
327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.util.ULocale;
337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert/**
357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * API Test the RuleBasedBreakIterator class
367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */
37fe77e7203e518f62b5bd8e8c603bca361e9cf47bFredrik Roubert@RunWith(JUnit4.class)
38fe77e7203e518f62b5bd8e8c603bca361e9cf47bFredrik Roubertpublic class RBBIAPITest extends TestFmwk {
397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
402d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert     * Tests clone() and equals() methods of RuleBasedBreakIterator
417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     **/
422d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestCloneEquals() {
442d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        RuleBasedBreakIterator bi1 = (RuleBasedBreakIterator) BreakIterator.getCharacterInstance(Locale.getDefault());
452d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        RuleBasedBreakIterator biequal = (RuleBasedBreakIterator) BreakIterator.getCharacterInstance(Locale.getDefault());
462d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        RuleBasedBreakIterator bi3 = (RuleBasedBreakIterator) BreakIterator.getCharacterInstance(Locale.getDefault());
472d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        RuleBasedBreakIterator bi2 = (RuleBasedBreakIterator) BreakIterator.getWordInstance(Locale.getDefault());
487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String testString = "Testing word break iterators's clone() and equals()";
507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        bi1.setText(testString);
517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        bi2.setText(testString);
527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        biequal.setText(testString);
532d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        bi3.setText("hello");
557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("Testing equals()");
567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("Testing == and !=");
577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!bi1.equals(biequal) || bi1.equals(bi2) || bi1.equals(bi3))
587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("ERROR:1 RBBI's == and !- operator failed.");
597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (bi2.equals(biequal) || bi2.equals(bi1) || biequal.equals(bi3))
607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("ERROR:2 RBBI's == and != operator  failed.");
617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("Testing clone()");
627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        RuleBasedBreakIterator bi1clone = (RuleBasedBreakIterator) bi1.clone();
637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        RuleBasedBreakIterator bi2clone = (RuleBasedBreakIterator) bi2.clone();
647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!bi1clone.equals(bi1)
657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            || !bi1clone.equals(biequal)
667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            || bi1clone.equals(bi3)
677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            || bi1clone.equals(bi2))
687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("ERROR:1 RBBI's clone() method failed");
697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (bi2clone.equals(bi1)
717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            || bi2clone.equals(biequal)
727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            || bi2clone.equals(bi3)
737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            || !bi2clone.equals(bi2))
747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("ERROR:2 RBBI's clone() method failed");
757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!bi1.getText().equals(bi1clone.getText())
777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            || !bi2clone.getText().equals(bi2.getText())
787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            || bi2clone.equals(bi1clone))
797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("ERROR: RBBI's clone() method failed");
807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
812d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Tests toString() method of RuleBasedBreakIterator
847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     **/
852d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestToString() {
872d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        RuleBasedBreakIterator bi1 = (RuleBasedBreakIterator) BreakIterator.getCharacterInstance(Locale.getDefault());
887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        RuleBasedBreakIterator bi2 = (RuleBasedBreakIterator) BreakIterator.getWordInstance(Locale.getDefault());
897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("Testing toString()");
907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        bi1.setText("Hello there");
917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        RuleBasedBreakIterator bi3 = (RuleBasedBreakIterator) bi1.clone();
927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String temp = bi1.toString();
937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String temp2 = bi2.toString();
947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String temp3 = bi3.toString();
957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (temp2.equals(temp3) || temp.equals(temp2) || !temp.equals(temp3))
967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("ERROR: error in toString() method");
977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
982d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
1007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Tests the method hashCode() of RuleBasedBreakIterator
1017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     **/
1022d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
1037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestHashCode() {
1042d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        RuleBasedBreakIterator bi1 = (RuleBasedBreakIterator) BreakIterator.getCharacterInstance(Locale.getDefault());
1052d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        RuleBasedBreakIterator bi3 = (RuleBasedBreakIterator) BreakIterator.getCharacterInstance(Locale.getDefault());
1067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        RuleBasedBreakIterator bi2 = (RuleBasedBreakIterator) BreakIterator.getWordInstance(Locale.getDefault());
1077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("Testing hashCode()");
1087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        bi1.setText("Hash code");
1097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        bi2.setText("Hash code");
1107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        bi3.setText("Hash code");
1117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        RuleBasedBreakIterator bi1clone = (RuleBasedBreakIterator) bi1.clone();
1127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        RuleBasedBreakIterator bi2clone = (RuleBasedBreakIterator) bi2.clone();
1137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (bi1.hashCode() != bi1clone.hashCode()
1147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            || bi1.hashCode() != bi3.hashCode()
1157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            || bi1clone.hashCode() != bi3.hashCode()
1167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            || bi2.hashCode() != bi2clone.hashCode())
1177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("ERROR: identical objects have different hashcodes");
1182d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
1197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (bi1.hashCode() == bi2.hashCode()
1207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            || bi2.hashCode() == bi3.hashCode()
1217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            || bi1clone.hashCode() == bi2clone.hashCode()
1227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            || bi1clone.hashCode() == bi2.hashCode())
1237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("ERROR: different objects have same hashcodes");
1247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
1252d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
1267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
1277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert      * Tests the methods getText() and setText() of RuleBasedBreakIterator
1287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert      **/
1292d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
1307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestGetSetText() {
1317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("Testing getText setText ");
1327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String str1 = "first string.";
1337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String str2 = "Second string.";
1342d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        //RuleBasedBreakIterator charIter1 = (RuleBasedBreakIterator) BreakIterator.getCharacterInstance(Locale.getDefault());
1352d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        RuleBasedBreakIterator wordIter1 = (RuleBasedBreakIterator) BreakIterator.getWordInstance(Locale.getDefault());
1367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        CharacterIterator text1 = new StringCharacterIterator(str1);
1377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        //CharacterIterator text1Clone = (CharacterIterator) text1.clone();
1387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        //CharacterIterator text2 = new StringCharacterIterator(str2);
1397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        wordIter1.setText(str1);
1407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!wordIter1.getText().equals(text1))
1417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("ERROR:1 error in setText or getText ");
1427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (wordIter1.current() != 0)
1437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("ERROR:1 setText did not set the iteration position to the beginning of the text, it is"
1442d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                   + wordIter1.current() + "\n");
1457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        wordIter1.next(2);
1467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        wordIter1.setText(str2);
1477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (wordIter1.current() != 0)
1487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("ERROR:2 setText did not reset the iteration position to the beginning of the text, it is"
1492d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                    + wordIter1.current() + "\n");
1502d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
151fe77e7203e518f62b5bd8e8c603bca361e9cf47bFredrik Roubert        // Test the CharSequence overload of setText() for a simple case.
152fe77e7203e518f62b5bd8e8c603bca361e9cf47bFredrik Roubert        BreakIterator lineIter = BreakIterator.getLineInstance(Locale.ENGLISH);
153fe77e7203e518f62b5bd8e8c603bca361e9cf47bFredrik Roubert        CharSequence csText = "Hello, World. ";
154fe77e7203e518f62b5bd8e8c603bca361e9cf47bFredrik Roubert        // Expected Line Brks  ^      ^      ^
155fe77e7203e518f62b5bd8e8c603bca361e9cf47bFredrik Roubert        //                     0123456789012345
156fe77e7203e518f62b5bd8e8c603bca361e9cf47bFredrik Roubert        List<Integer> expected = new ArrayList<Integer>();
157fe77e7203e518f62b5bd8e8c603bca361e9cf47bFredrik Roubert        expected.add(0); expected.add(7); expected.add(14);
158fe77e7203e518f62b5bd8e8c603bca361e9cf47bFredrik Roubert        lineIter.setText(csText);
159fe77e7203e518f62b5bd8e8c603bca361e9cf47bFredrik Roubert        for (int pos = lineIter.first(); pos != BreakIterator.DONE; pos = lineIter.next()) {
160fe77e7203e518f62b5bd8e8c603bca361e9cf47bFredrik Roubert            assertTrue("", expected.contains(pos));
161fe77e7203e518f62b5bd8e8c603bca361e9cf47bFredrik Roubert        }
162fe77e7203e518f62b5bd8e8c603bca361e9cf47bFredrik Roubert        assertEquals("", csText.length(), lineIter.current());
1637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
1642d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
1657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
1667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert      * Testing the methods first(), next(), next(int) and following() of RuleBasedBreakIterator
1677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert      *   TODO:  Most of this test should be retired, rule behavior is much better covered by
1687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert      *          TestExtended, which is also easier to understand and maintain.
1697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert      **/
1702d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
1717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestFirstNextFollowing() {
1727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int p, q;
1737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String testString = "This is a word break. Isn't it? 2.25";
1747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("Testing first() and next(), following() with custom rules");
1757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("testing word iterator - string :- \"" + testString + "\"\n");
1767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        RuleBasedBreakIterator wordIter1 = (RuleBasedBreakIterator) BreakIterator.getWordInstance(Locale.getDefault());
1777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        wordIter1.setText(testString);
1787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        p = wordIter1.first();
1797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (p != 0)
1807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("ERROR: first() returned" + p + "instead of 0");
1817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        q = wordIter1.next(9);
1827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        doTest(testString, p, q, 20, "This is a word break");
1837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        p = q;
1847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        q = wordIter1.next();
1857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        doTest(testString, p, q, 21, ".");
1867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        p = q;
1877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        q = wordIter1.next(3);
1887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        doTest(testString, p, q, 28, " Isn't ");
1897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        p = q;
1907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        q = wordIter1.next(2);
1917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        doTest(testString, p, q, 31, "it?");
1927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        q = wordIter1.following(2);
1937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        doTest(testString, 2, q, 4, "is");
1947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        q = wordIter1.following(22);
1957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        doTest(testString, 22, q, 27, "Isn't");
1967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        wordIter1.last();
1977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        p = wordIter1.next();
1987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        q = wordIter1.following(wordIter1.last());
1997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (p != BreakIterator.DONE || q != BreakIterator.DONE)
2007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("ERROR: next()/following() at last position returned #"
2012d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                    + p + " and " + q + " instead of" + testString.length() + "\n");
2022d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        RuleBasedBreakIterator charIter1 = (RuleBasedBreakIterator) BreakIterator.getCharacterInstance(Locale.getDefault());
2032d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        testString = "Write hindi here. ";
2047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("testing char iter - string:- \"" + testString + "\"");
2057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        charIter1.setText(testString);
2067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        p = charIter1.first();
2077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (p != 0)
2087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("ERROR: first() returned" + p + "instead of 0");
2097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        q = charIter1.next();
2107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        doTest(testString, p, q, 1, "W");
2117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        p = q;
2127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        q = charIter1.next(4);
2137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        doTest(testString, p, q, 5, "rite");
2147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        p = q;
2157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        q = charIter1.next(12);
2167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        doTest(testString, p, q, 17, " hindi here.");
2177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        p = q;
2187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        q = charIter1.next(-6);
2197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        doTest(testString, p, q, 11, " here.");
2207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        p = q;
2217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        q = charIter1.next(6);
2227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        doTest(testString, p, q, 17, " here.");
2237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        p = charIter1.following(charIter1.last());
2247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        q = charIter1.next(charIter1.last());
2257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (p != BreakIterator.DONE || q != BreakIterator.DONE)
2267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("ERROR: following()/next() at last position returned #"
2272d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                    + p + " and " + q + " instead of" + testString.length());
2282d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        testString = "Hello! how are you? I'am fine. Thankyou. How are you doing? This  costs $20,00,000.";
2292d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        RuleBasedBreakIterator sentIter1 = (RuleBasedBreakIterator) BreakIterator.getSentenceInstance(Locale.getDefault());
2307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("testing sentence iter - String:- \"" + testString + "\"");
2317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        sentIter1.setText(testString);
2327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        p = sentIter1.first();
2337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (p != 0)
2347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("ERROR: first() returned" + p + "instead of 0");
2357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        q = sentIter1.next();
2367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        doTest(testString, p, q, 7, "Hello! ");
2377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        p = q;
2387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        q = sentIter1.next(2);
2397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        doTest(testString, p, q, 31, "how are you? I'am fine. ");
2407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        p = q;
2417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        q = sentIter1.next(-2);
2427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        doTest(testString, p, q, 7, "how are you? I'am fine. ");
2437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        p = q;
2447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        q = sentIter1.next(4);
2457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        doTest(testString, p, q, 60, "how are you? I'am fine. Thankyou. How are you doing? ");
2467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        p = q;
2477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        q = sentIter1.next();
2487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        doTest(testString, p, q, 83, "This  costs $20,00,000.");
2497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        q = sentIter1.following(1);
2507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        doTest(testString, 1, q, 7, "ello! ");
2517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        q = sentIter1.following(10);
2527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        doTest(testString, 10, q, 20, " are you? ");
2537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        q = sentIter1.following(20);
2547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        doTest(testString, 20, q, 31, "I'am fine. ");
2557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        p = sentIter1.following(sentIter1.last());
2567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        q = sentIter1.next(sentIter1.last());
2577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (p != BreakIterator.DONE || q != BreakIterator.DONE)
2587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("ERROR: following()/next() at last position returned #"
2592d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                    + p + " and " + q + " instead of" + testString.length());
2602d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        testString = "Hello! how\r\n (are)\r you? I'am fine- Thankyou. foo\u00a0bar How, are, you? This, costs $20,00,000.";
2617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("(UnicodeString)testing line iter - String:- \"" + testString + "\"");
2622d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        RuleBasedBreakIterator lineIter1 = (RuleBasedBreakIterator) BreakIterator.getLineInstance(Locale.getDefault());
2637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        lineIter1.setText(testString);
2647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        p = lineIter1.first();
2657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (p != 0)
2667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("ERROR: first() returned" + p + "instead of 0");
2677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        q = lineIter1.next();
2687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        doTest(testString, p, q, 7, "Hello! ");
2697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        p = q;
2707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        p = q;
2717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        q = lineIter1.next(4);
2727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        doTest(testString, p, q, 20, "how\r\n (are)\r ");
2737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        p = q;
2747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        q = lineIter1.next(-4);
2757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        doTest(testString, p, q, 7, "how\r\n (are)\r ");
2767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        p = q;
2777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        q = lineIter1.next(6);
2787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        doTest(testString, p, q, 30, "how\r\n (are)\r you? I'am ");
2797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        p = q;
2807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        q = lineIter1.next();
2817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        doTest(testString, p, q, 36, "fine- ");
2827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        p = q;
2837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        q = lineIter1.next(2);
2847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        doTest(testString, p, q, 54, "Thankyou. foo\u00a0bar ");
2857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        q = lineIter1.following(60);
2867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        doTest(testString, 60, q, 64, "re, ");
2877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        q = lineIter1.following(1);
2887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        doTest(testString, 1, q, 7, "ello! ");
2897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        q = lineIter1.following(10);
2907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        doTest(testString, 10, q, 12, "\r\n");
2917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        q = lineIter1.following(20);
2927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        doTest(testString, 20, q, 25, "you? ");
2937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        p = lineIter1.following(lineIter1.last());
2947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        q = lineIter1.next(lineIter1.last());
2957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (p != BreakIterator.DONE || q != BreakIterator.DONE)
2967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("ERROR: following()/next() at last position returned #"
2972d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                    + p + " and " + q + " instead of" + testString.length());
2987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
2992d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
3007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
301fe77e7203e518f62b5bd8e8c603bca361e9cf47bFredrik Roubert     * Testing the methods last(), previous(), and preceding() of RuleBasedBreakIterator
3027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     **/
3032d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
3047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestLastPreviousPreceding() {
3057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int p, q;
3067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String testString = "This is a word break. Isn't it? 2.25 dollars";
3077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("Testing last(),previous(), preceding() with custom rules");
3087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("testing word iteration for string \"" + testString + "\"");
309fe77e7203e518f62b5bd8e8c603bca361e9cf47bFredrik Roubert        RuleBasedBreakIterator wordIter1 = (RuleBasedBreakIterator) BreakIterator.getWordInstance(Locale.ENGLISH);
3107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        wordIter1.setText(testString);
3117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        p = wordIter1.last();
3127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (p != testString.length()) {
313fe77e7203e518f62b5bd8e8c603bca361e9cf47bFredrik Roubert            errln("ERROR: last() returned" + p + "instead of" + testString.length());
3147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
3157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        q = wordIter1.previous();
3167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        doTest(testString, p, q, 37, "dollars");
3177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        p = q;
3187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        q = wordIter1.previous();
3197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        doTest(testString, p, q, 36, " ");
3207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        q = wordIter1.preceding(25);
3217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        doTest(testString, 25, q, 22, "Isn");
3227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        p = q;
3237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        q = wordIter1.previous();
3247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        doTest(testString, p, q, 21, " ");
3257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        q = wordIter1.preceding(20);
3267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        doTest(testString, 20, q, 15, "break");
3277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        p = wordIter1.preceding(wordIter1.first());
3287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (p != BreakIterator.DONE)
3297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("ERROR: preceding()  at starting position returned #" + p + " instead of 0");
3302d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        testString = "Hello! how are you? I'am fine. Thankyou. How are you doing? This  costs $20,00,000.";
3317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("testing sentence iter - String:- \"" + testString + "\"");
3322d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        RuleBasedBreakIterator sentIter1 = (RuleBasedBreakIterator) BreakIterator.getSentenceInstance(Locale.getDefault());
3337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        sentIter1.setText(testString);
3347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        p = sentIter1.last();
3357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (p != testString.length())
3367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("ERROR: last() returned" + p + "instead of " + testString.length());
3377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        q = sentIter1.previous();
3387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        doTest(testString, p, q, 60, "This  costs $20,00,000.");
3397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        p = q;
3407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        q = sentIter1.previous();
3417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        doTest(testString, p, q, 41, "How are you doing? ");
3427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        q = sentIter1.preceding(40);
3437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        doTest(testString, 40, q, 31, "Thankyou.");
3447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        q = sentIter1.preceding(25);
3457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        doTest(testString, 25, q, 20, "I'am ");
3467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        sentIter1.first();
3477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        p = sentIter1.previous();
3487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        q = sentIter1.preceding(sentIter1.first());
3497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (p != BreakIterator.DONE || q != BreakIterator.DONE)
3507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("ERROR: previous()/preceding() at starting position returned #"
3512d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                    + p + " and " + q + " instead of 0\n");
3522d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        testString = "Hello! how are you? I'am fine. Thankyou. How are you doing? This\n costs $20,00,000.";
3537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("testing line iter - String:- \"" + testString + "\"");
3547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        RuleBasedBreakIterator lineIter1 = (RuleBasedBreakIterator) BreakIterator.getLineInstance(Locale.getDefault());
3557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        lineIter1.setText(testString);
3567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        p = lineIter1.last();
3577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (p != testString.length())
3587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("ERROR: last() returned" + p + "instead of " + testString.length());
3597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        q = lineIter1.previous();
3607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        doTest(testString, p, q, 72, "$20,00,000.");
3617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        p = q;
3627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        q = lineIter1.previous();
3637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        doTest(testString, p, q, 66, "costs ");
3647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        q = lineIter1.preceding(40);
3657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        doTest(testString, 40, q, 31, "Thankyou.");
3667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        q = lineIter1.preceding(25);
3677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        doTest(testString, 25, q, 20, "I'am ");
3687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        lineIter1.first();
3697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        p = lineIter1.previous();
3707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        q = lineIter1.preceding(sentIter1.first());
3717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (p != BreakIterator.DONE || q != BreakIterator.DONE)
3727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("ERROR: previous()/preceding() at starting position returned #"
3737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    + p + " and " + q + " instead of 0\n");
3747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
3752d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
3767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
3777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Tests the method IsBoundary() of RuleBasedBreakIterator
3787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     **/
3792d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
3807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestIsBoundary() {
3817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String testString1 = "Write here. \u092d\u0301\u0930\u0924 \u0938\u0941\u0902\u0926\u0930 a\u0301u";
382fe77e7203e518f62b5bd8e8c603bca361e9cf47bFredrik Roubert        RuleBasedBreakIterator charIter1 = (RuleBasedBreakIterator) BreakIterator.getCharacterInstance(Locale.ENGLISH);
3837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        charIter1.setText(testString1);
3847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int bounds1[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 15, 16, 17, 20, 21, 22, 23, 25, 26};
3857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        doBoundaryTest(charIter1, testString1, bounds1);
386fe77e7203e518f62b5bd8e8c603bca361e9cf47bFredrik Roubert        RuleBasedBreakIterator wordIter2 = (RuleBasedBreakIterator) BreakIterator.getWordInstance(Locale.ENGLISH);
3877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        wordIter2.setText(testString1);
3887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int bounds2[] = {0, 5, 6, 10, 11, 12, 16, 17, 22, 23, 26};
3897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        doBoundaryTest(wordIter2, testString1, bounds2);
3907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
3912d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
3927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
3937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *  Tests the rule status return value constants
3947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
3952d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
3967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestRuleStatus() {
3977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        BreakIterator bi = BreakIterator.getWordInstance(ULocale.ENGLISH);
3982d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
3997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        bi.setText("# ");
4007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals(null, bi.next(), 1);
4017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertTrue(null, bi.getRuleStatus() >= RuleBasedBreakIterator.WORD_NONE);
4027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertTrue(null, bi.getRuleStatus() < RuleBasedBreakIterator.WORD_NONE_LIMIT);
4032d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
4047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        bi.setText("3 ");
4057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals(null, bi.next(), 1);
4067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertTrue(null, bi.getRuleStatus() >= RuleBasedBreakIterator.WORD_NUMBER);
4077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertTrue(null, bi.getRuleStatus() < RuleBasedBreakIterator.WORD_NUMBER_LIMIT);
4082d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
4097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        bi.setText("a ");
4107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals(null, bi.next(), 1);
4117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertTrue(null, bi.getRuleStatus() >= RuleBasedBreakIterator.WORD_LETTER );
4127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertTrue(null, bi.getRuleStatus() < RuleBasedBreakIterator.WORD_LETTER_LIMIT);
4137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
4142d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
4157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        bi.setText("イ  ");
4167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals(null, bi.next(), 1);
4177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertTrue(null, bi.getRuleStatus() >= RuleBasedBreakIterator.WORD_KANA );
4187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // TODO: ticket #10261, Kana is not returning the correct status.
4197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // assertTrue(null, bi.getRuleStatus() < RuleBasedBreakIterator.WORD_KANA_LIMIT);
4207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // System.out.println("\n" + bi.getRuleStatus());
4212d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
4227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        bi.setText("退 ");
4237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals(null, bi.next(), 1);
4247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertTrue(null, bi.getRuleStatus() >= RuleBasedBreakIterator.WORD_IDEO );
4257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertTrue(null, bi.getRuleStatus() < RuleBasedBreakIterator.WORD_IDEO_LIMIT);
4267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
4272d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
4282d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    /**
4292d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert     *  Tests the rule dump debug function.
4302d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert     */
4312d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
4322d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    public void TestRuledump() {
4332d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        RuleBasedBreakIterator bi = (RuleBasedBreakIterator)BreakIterator.getCharacterInstance();
4342d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        ByteArrayOutputStream bos = new ByteArrayOutputStream();
4352d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        PrintStream out = new PrintStream(bos);
4362d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        bi.dump(out);
4372d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        assertTrue(null, bos.size() > 100);
4382d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    }
4392d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
4407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    //---------------------------------------------
4417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    //Internal subroutines
4427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    //---------------------------------------------
4432d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
4442d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    /* Internal subroutine used by TestIsBoundary() */
4452d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    private void doBoundaryTest(BreakIterator bi, String text, int[] boundaries) {
4467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("testIsBoundary():");
4477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int p = 0;
4487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        boolean isB;
4497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0; i < text.length(); i++) {
4507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            isB = bi.isBoundary(i);
4517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln("bi.isBoundary(" + i + ") -> " + isB);
4527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (i == boundaries[p]) {
4537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (!isB)
4547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("Wrong result from isBoundary() for " + i + ": expected true, got false");
4557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                p++;
4567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } else {
4577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (isB)
4587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("Wrong result from isBoundary() for " + i + ": expected false, got true");
4597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
4607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
4617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
4622d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
463fe77e7203e518f62b5bd8e8c603bca361e9cf47bFredrik Roubert    /*Internal subroutine used for comparison of expected and acquired results */
4642d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    private void doTest(String testString, int start, int gotoffset, int expectedOffset, String expectedString) {
4657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String selected;
4667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String expected = expectedString;
4677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (gotoffset != expectedOffset)
4687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("ERROR:****returned #" + gotoffset + " instead of #" + expectedOffset);
4697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (start <= gotoffset) {
4707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            selected = testString.substring(start, gotoffset);
4717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } else {
4727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            selected = testString.substring(gotoffset, start);
4737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
4747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!selected.equals(expected))
4757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("ERROR:****selected \"" + selected + "\" instead of \"" + expected + "\"");
4767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        else
4777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln("****selected \"" + selected + "\"");
4787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
4792d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
4802d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
4812d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    public void testGetTitleInstance() {
4822d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        BreakIterator bi = BreakIterator.getTitleInstance(new Locale("en", "CA"));
4832d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        TestFmwk.assertNotEquals("Title instance break iterator not correctly instantiated", bi.first(), null);
4842d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        bi.setText("Here is some Text");
4852d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        TestFmwk.assertEquals("Title instance break iterator not correctly instantiated", bi.first(), 0);
4862d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    }
4877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert}
488