1// © 2016 and later: Unicode, Inc. and others.
2// License & terms of use: http://www.unicode.org/copyright.html#License
3/*
4 *******************************************************************************
5 * Copyright (C) 1996-2010, International Business Machines Corporation and    *
6 * others. All Rights Reserved.                                                *
7 *******************************************************************************
8 */
9package com.ibm.icu.dev.test.rbbi;
10
11import java.text.CharacterIterator;
12import java.util.Arrays;
13import java.util.Locale;
14
15import org.junit.Test;
16import org.junit.runner.RunWith;
17import org.junit.runners.JUnit4;
18
19import com.ibm.icu.dev.test.TestFmwk;
20import com.ibm.icu.text.BreakIterator;
21
22@RunWith(JUnit4.class)
23public class BreakIteratorRegTest extends TestFmwk
24{
25    @Test
26    public void TestRegUnreg() {
27    Locale thailand_locale = new Locale("th", "TH", "");
28    Locale foo_locale = new Locale("fu", "FU", "FOO");
29    BreakIterator jwbi = BreakIterator.getWordInstance(Locale.JAPAN);
30    BreakIterator uwbi = BreakIterator.getWordInstance(Locale.US);
31    BreakIterator usbi = BreakIterator.getSentenceInstance(Locale.US);
32    BreakIterator twbi = BreakIterator.getWordInstance(thailand_locale);
33    BreakIterator rwbi = BreakIterator.getWordInstance(new Locale("", "", ""));
34
35    BreakIterator sbi = (BreakIterator)usbi.clone();
36    // todo: this will cause the test to fail, no way to set a breakiterator to null text so can't fix yet.
37    // String text = "This is some test, by golly. Boy, they don't make tests like they used to, do they?  This here test ain't worth $2.50.  Nope.";
38    // sbi.setText(text);
39
40    assertTrue(!BreakIterator.unregister(""), "unregister before register"); // coverage
41
42    Object key0 = BreakIterator.registerInstance((BreakIterator)twbi.clone(), foo_locale, BreakIterator.KIND_WORD);
43    Object key1 = BreakIterator.registerInstance(sbi, Locale.US, BreakIterator.KIND_WORD);
44    Object key2 = BreakIterator.registerInstance((BreakIterator)twbi.clone(), Locale.US, BreakIterator.KIND_WORD);
45
46    {
47        BreakIterator test0 = BreakIterator.getWordInstance(Locale.JAPAN);
48        BreakIterator test1 = BreakIterator.getWordInstance(Locale.US);
49        BreakIterator test2 = BreakIterator.getSentenceInstance(Locale.US);
50        BreakIterator test3 = BreakIterator.getWordInstance(thailand_locale);
51        BreakIterator test4 = BreakIterator.getWordInstance(foo_locale);
52
53        assertEqual(test0, jwbi, "japan word == japan word");
54        assertEqual(test1, twbi, "us word == thai word");
55        assertEqual(test2, usbi, "us sentence == us sentence");
56        assertEqual(test3, twbi, "thai word == thai word");
57        assertEqual(test4, twbi, "foo word == thai word");
58    }
59
60    //Locale[] locales = BreakIterator.getAvailableLocales();
61
62    assertTrue(BreakIterator.unregister(key2), "unregister us word (thai word)");
63    assertTrue(!BreakIterator.unregister(key2), "unregister second time");
64    boolean error = false;
65    try {
66        BreakIterator.unregister(null);
67    }
68    catch (IllegalArgumentException e) {
69        error = true;
70    }
71
72    assertTrue(error, "unregister null");
73
74    {
75        CharacterIterator sci = BreakIterator.getWordInstance(Locale.US).getText();
76        int len = sci.getEndIndex() - sci.getBeginIndex();
77        assertEqual(len, 0, "us word text: " + getString(sci));
78    }
79
80    assertTrue(Arrays.asList(BreakIterator.getAvailableLocales()).contains(foo_locale), "foo_locale");
81    assertTrue(BreakIterator.unregister(key0), "unregister foo word (thai word)");
82    assertTrue(!Arrays.asList(BreakIterator.getAvailableLocales()).contains(foo_locale), "no foo_locale");
83    assertEqual(BreakIterator.getWordInstance(Locale.US), usbi, "us word == us sentence");
84
85    assertTrue(BreakIterator.unregister(key1), "unregister us word (us sentence)");
86    {
87        BreakIterator test0 = BreakIterator.getWordInstance(Locale.JAPAN);
88        BreakIterator test1 = BreakIterator.getWordInstance(Locale.US);
89        BreakIterator test2 = BreakIterator.getSentenceInstance(Locale.US);
90        BreakIterator test3 = BreakIterator.getWordInstance(thailand_locale);
91        BreakIterator test4 = BreakIterator.getWordInstance(foo_locale);
92
93        assertEqual(test0, jwbi, "japanese word break");
94        assertEqual(test1, uwbi, "us sentence-word break");
95        assertEqual(test2, usbi, "us sentence break");
96        assertEqual(test3, twbi, "thai word break");
97        assertEqual(test4, rwbi, "root word break");
98
99        CharacterIterator sci = test1.getText();
100        int len = sci.getEndIndex() - sci.getBeginIndex();
101        assertEqual(len, 0, "us sentence-word break text: " + getString(sci));
102    }
103    }
104
105    private void assertEqual(Object lhs, Object rhs, String msg) {
106    msg(msg, lhs.equals(rhs) ? LOG : ERR, true, true);
107    }
108
109    private void assertEqual(int lhs, int rhs, String msg) {
110    msg(msg, lhs == rhs ? LOG : ERR, true, true);
111    }
112
113    private void assertTrue(boolean arg, String msg) {
114    msg(msg, arg ? LOG : ERR, true, true);
115    }
116
117    private static String getString(CharacterIterator ci) {
118    StringBuffer buf = new StringBuffer(ci.getEndIndex() - ci.getBeginIndex() + 2);
119    buf.append("'");
120    for (char c = ci.first(); c != CharacterIterator.DONE; c = ci.next()) {
121        buf.append(c);
122    }
123    buf.append("'");
124    return buf.toString();
125    }
126}
127