1/*
2 * Licensed to the Apache Software Foundation (ASF) under one or more
3 * contributor license agreements.  See the NOTICE file distributed with
4 * this work for additional information regarding copyright ownership.
5 * The ASF licenses this file to You under the Apache License, Version 2.0
6 * (the "License"); you may not use this file except in compliance with
7 * the License.  You may obtain a copy of the License at
8 *
9 *     http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17
18package org.apache.harmony.tests.java.text;
19
20import java.text.CollationElementIterator;
21import java.text.Collator;
22import java.text.RuleBasedCollator;
23import java.text.StringCharacterIterator;
24import java.util.Locale;
25
26import junit.framework.TestCase;
27
28/**
29 * Test CollationElementIterator
30 *
31 * Only test normal condition.
32 *
33 */
34public class CollationElementIteratorTest extends TestCase {
35
36  private RuleBasedCollator coll;
37  private RuleBasedCollator traditionalSpanishColl;
38
39  protected void setUp() {
40    coll = (RuleBasedCollator) Collator.getInstance(Locale.US);
41    traditionalSpanishColl = (RuleBasedCollator)
42            Collator.getInstance(Locale.forLanguageTag("es-u-co-trad"));
43  }
44
45  public void testGetOffset() {
46    String text = "abc";
47    CollationElementIterator iterator = coll.getCollationElementIterator(text);
48    int[] offsets = { 0, 1, 2, 3 };
49    int offset = iterator.getOffset();
50    int i = 0;
51    assertEquals(offsets[i++], offset);
52    while (offset != text.length()) {
53      iterator.next();
54      offset = iterator.getOffset();
55      assertEquals(offsets[i++], offset);
56    }
57  }
58
59  public void testNext() {
60    String text = "abc";
61    CollationElementIterator iterator = coll.getCollationElementIterator(text);
62    int[] orders = new int[text.length()];
63    int order = iterator.next();
64    int i = 0;
65    while (order != CollationElementIterator.NULLORDER) {
66      orders[i++] = order;
67      order = iterator.next();
68    }
69
70    int offset = iterator.getOffset();
71    assertEquals(text.length(), offset);
72
73    iterator.reset();
74    order = iterator.previous();
75
76    while (order != CollationElementIterator.NULLORDER) {
77      assertEquals(orders[--i], order);
78      order = iterator.previous();
79    }
80
81    assertEquals(0, iterator.getOffset());
82  }
83
84  public void testPrevious() {
85    RuleBasedCollator coll = (RuleBasedCollator) Collator.getInstance(Locale.US);
86    String text = "abc";
87    CollationElementIterator iterator = coll
88        .getCollationElementIterator(text);
89    int[] orders = new int[text.length()];
90    int order = iterator.next();
91    int i = 0;
92    while (order != CollationElementIterator.NULLORDER) {
93      orders[i++] = order;
94      order = iterator.next();
95    }
96
97    int offset = iterator.getOffset();
98    assertEquals(text.length(), offset);
99
100    iterator.reset();
101    order = iterator.previous();
102
103    while (order != CollationElementIterator.NULLORDER) {
104      assertEquals(orders[--i], order);
105      order = iterator.previous();
106    }
107
108    assertEquals(0, iterator.getOffset());
109  }
110
111  public void testReset() {
112    String text = "abc";
113    CollationElementIterator iterator = coll.getCollationElementIterator(text);
114    int[] orders = new int[text.length()];
115    int order = iterator.next();
116    int i = 0;
117    while (order != CollationElementIterator.NULLORDER) {
118      orders[i++] = order;
119      order = iterator.next();
120    }
121
122    int offset = iterator.getOffset();
123    assertEquals(text.length(), offset);
124
125    iterator.reset();
126    assertEquals(0, iterator.getOffset());
127  }
128
129  public void testGetMaxExpansion() {
130    String text = "cha";
131    RuleBasedCollator rbColl = (RuleBasedCollator) Collator.getInstance(
132            Locale.forLanguageTag("es-u-co-trad"));
133    CollationElementIterator iterator = rbColl.getCollationElementIterator(text);
134    int order = iterator.next();
135    while (order != CollationElementIterator.NULLORDER) {
136      assertEquals(1, iterator.getMaxExpansion(order));
137      order = iterator.next();
138    }
139  }
140
141  public void testPrimaryOrder() {
142    RuleBasedCollator rbColl = (RuleBasedCollator) Collator.getInstance(new Locale("de", "DE"));
143    String text = "\u00e6";
144    CollationElementIterator iterator = rbColl.getCollationElementIterator(text);
145    int order = iterator.next();
146    int pOrder = CollationElementIterator.primaryOrder(order);
147    CollationElementIterator iterator2 = rbColl.getCollationElementIterator("ae");
148    int order2 = iterator2.next();
149    int pOrder2 = CollationElementIterator.primaryOrder(order2);
150    assertEquals(pOrder, pOrder2);
151  }
152
153  public void testSecondaryOrder() {
154    RuleBasedCollator rbColl = (RuleBasedCollator) Collator.getInstance(new Locale("fr", "FR"));
155    String text = "a\u00e0";
156    CollationElementIterator iterator = rbColl.getCollationElementIterator(text);
157    int order = iterator.next();
158    int sOrder1 = CollationElementIterator.secondaryOrder(order);
159
160    order = iterator.next();
161    int sOrder2 = CollationElementIterator.secondaryOrder(order);
162
163    assertEquals(sOrder1, sOrder2);
164  }
165
166  public void testTertiaryOrder() {
167    RuleBasedCollator rbColl = (RuleBasedCollator) Collator.getInstance(new Locale("fr", "FR"));
168    String text = "abAB";
169    CollationElementIterator iterator = rbColl.getCollationElementIterator(text);
170    int order = iterator.next();
171    int tOrder1 = CollationElementIterator.tertiaryOrder(order);
172    order = iterator.next();
173    int tOrder2 = CollationElementIterator.tertiaryOrder(order);
174    assertEquals(tOrder1, tOrder2);
175
176    order = iterator.next();
177    tOrder1 = CollationElementIterator.tertiaryOrder(order);
178    order = iterator.next();
179    tOrder2 = CollationElementIterator.tertiaryOrder(order);
180    assertEquals(tOrder1, tOrder2);
181  }
182
183  public void testSetOffset() {
184    RuleBasedCollator rbColl = (RuleBasedCollator) Collator.getInstance(
185            Locale.forLanguageTag("es-u-co-trad"));
186    String text = "cha";
187    CollationElementIterator iterator = rbColl.getCollationElementIterator(text);
188    iterator.setOffset(0);
189    assertEquals(0, iterator.getOffset());
190    iterator.setOffset(1);
191    assertEquals(0, iterator.getOffset());
192    iterator.setOffset(2);
193    assertEquals(2, iterator.getOffset());
194  }
195
196  public void testSetTextString() {
197    String text = "caa";
198    CollationElementIterator iterator = traditionalSpanishColl.getCollationElementIterator(text);
199    iterator.setOffset(0);
200    assertEquals(0, iterator.getOffset());
201    iterator.setOffset(1);
202    assertEquals(1, iterator.getOffset());
203    iterator.setOffset(2);
204    assertEquals(2, iterator.getOffset());
205    iterator.setText("cha");
206    iterator.setOffset(0);
207    assertEquals(0, iterator.getOffset());
208    iterator.setOffset(1);
209    assertEquals(0, iterator.getOffset());
210    iterator.setOffset(2);
211    assertEquals(2, iterator.getOffset());
212  }
213
214  public void testSetTextCharacterIterator() {
215    String text = "caa";
216    CollationElementIterator iterator = traditionalSpanishColl.getCollationElementIterator(text);
217    iterator.setOffset(1);
218    assertEquals(1, iterator.getOffset());
219    // In traditional spanish the "ch" acts as a single character so the iterator cannot stop
220    // between the 'c' and the 'h', it goes back if that is attempted.
221    iterator.setText(new StringCharacterIterator("cha"));
222    iterator.setOffset(1);
223    assertEquals(0, iterator.getOffset());
224  }
225}
226