1 /*
   2  * Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.
   8  *
   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  */
  23 
  24 /*
  25  * @test
  26  * @bug 6271411
  27  * @library /java/text/testlib
  28  * @summary Confirm that three JCK testcases for CollationElementIterator pass.
  29  */
  30 
  31 import java.text.*;
  32 
  33 /*
  34  * Based on JCK-runtime-15/tests/api/java_text/CollationElementIterator/ColltnElmtIterTests.java.
  35  */
  36 public class Bug6271411 extends IntlTest {
  37 
  38     public static void main(String argv[]) throws Exception {
  39         Bug6271411 test = new Bug6271411();
  40         test.run(argv);
  41     }
  42 
  43     /*
  44      * Rule for RuleBasedCollator
  45      */
  46     static final String rule = "< c, C < d; D";
  47 
  48     /*
  49      * Textdata
  50      */
  51     static final String[] values = {
  52         "", "c", "cH522Yd", "Hi, high school", "abcchCHidD"
  53     };
  54 
  55 
  56     /*
  57      * Confirm that setOffset() throws IllegalArgumentException
  58      * (not IndexOutOfBoundsException) if the given offset is invalid.
  59      * Use CollationElementIterator.setText(String).
  60      */
  61     public void Test_CollationElementIterator0007() throws Exception {
  62         int[] offsets = {
  63             Integer.MIN_VALUE, Integer.MIN_VALUE + 1, -10000, -2, -1,
  64             100, 101, // These two are customized for every test data later.
  65             12345, Integer.MAX_VALUE - 1, Integer.MAX_VALUE
  66         };
  67         boolean err = false;
  68 
  69         RuleBasedCollator rbc = new RuleBasedCollator(rule);
  70         CollationElementIterator iterator = rbc.getCollationElementIterator("");
  71 
  72         for (int i = 0; i < values.length; i++) {
  73             String source = values[i];
  74             iterator.setText(source);
  75 
  76             int len = source.length();
  77             offsets[5] = len + 1;
  78             offsets[6] = len + 2;
  79 
  80             for (int j = 0; j < offsets.length; j++) {
  81                 try {
  82                     iterator.setOffset(offsets[j]);
  83                     System.out.println("IllegalArgumentException should be thrown for setOffset(" +
  84                                        offsets[j] + ") for <" + source + ">.");
  85                     err = true;
  86                 }
  87                 catch (IllegalArgumentException e) {
  88                 }
  89             }
  90         }
  91 
  92         if (err) {
  93             errln("CollationElementIterator.setOffset() didn't throw an expected IllegalArguemntException.");
  94         }
  95     }
  96 
  97     /*
  98      * Confirm that setText() doesn't throw an exception and setOffset() throws
  99      * IllegalArgumentException if the given offset is invalid.
 100      * Use CollationElementIterator.setText(CharacterIterator).
 101      */
 102     public void Test_CollationElementIterator0010() throws Exception {
 103         String prefix = "xyz abc";
 104         String suffix = "1234567890";
 105         int begin = prefix.length();
 106         int[] offsets = {
 107             Integer.MIN_VALUE, Integer.MIN_VALUE + 1, -10000,
 108             -2, -1, 0, 1, begin - 2, begin - 1, 9, 10, 11, 12, 13, 14,
 109             15, 12345, Integer.MAX_VALUE - 1, Integer.MAX_VALUE
 110         };
 111         boolean err = false;
 112 
 113         RuleBasedCollator rbc = new RuleBasedCollator(rule);
 114         CollationElementIterator iterator = rbc.getCollationElementIterator("");
 115 
 116         for (int i = 0; i < values.length; i++) {
 117             String str = prefix + values[i] + suffix;
 118             int len = str.length();
 119             int end = len - suffix.length();
 120 
 121             CharacterIterator source =
 122                 new StringCharacterIterator(str, begin, end, begin);
 123             iterator.setText(source);
 124 
 125             offsets[9] = end + 1;
 126             offsets[10] = end + 2;
 127             offsets[11] = (end + len) / 2;
 128             offsets[12] = len - 1;
 129             offsets[13] = len;
 130             offsets[14] = len + 1;
 131             offsets[15] = len + 2;
 132 
 133             for (int j = 0; j < offsets.length; j++) {
 134                 try {
 135                     iterator.setOffset(offsets[j]);
 136 
 137                     System.out.println("IllegalArgumentException should be thrown for setOffset(" +
 138                                        offsets[j] + ") for <" + str + ">.");
 139                     err = true;
 140                 }
 141                 catch (IllegalArgumentException e) {
 142                 }
 143             }
 144         }
 145 
 146         if (err) {
 147             errln("CollationElementIterator.setOffset() didn't throw an expected IllegalArguemntException.");
 148         }
 149     }
 150 
 151     /*
 152      * Confirm that setText() doesn't throw an exception and setOffset() sets
 153      * an offset as expected.
 154      * Use CollationElementIterator.setText(CharacterIterator).
 155      */
 156     public void Test_CollationElementIterator0011() throws Exception {
 157         String prefix = "xyz abc";
 158         String suffix = "1234567890";
 159         int begin = prefix.length();
 160         int[] offsets = { begin, begin + 1, 2, 3, 4 };
 161 
 162         RuleBasedCollator rbc = new RuleBasedCollator(rule);
 163         CollationElementIterator iterator = rbc.getCollationElementIterator("");
 164 
 165         for (int i = 0; i < values.length; i++) {
 166             String str = prefix + values[i] + suffix;
 167             int len = str.length();
 168             int end = len - suffix.length();
 169             CharacterIterator source =
 170                 new StringCharacterIterator(str, begin, end, begin);
 171             iterator.setText(source);
 172 
 173             offsets[2] = (end + len) / 2;
 174             offsets[3] = len - 1;
 175             offsets[4] = len;
 176 
 177             for (int j = 0; j < offsets.length; j++) {
 178                 int offset = offsets[j];
 179 
 180                 if (offset < begin || offset > end) {
 181                     break;
 182                 }
 183 
 184                 iterator.setOffset(offset);
 185                 int newOffset = iterator.getOffset();
 186 
 187                 if (newOffset != offset) {
 188                     throw new RuntimeException("setOffset() didn't set a correct offset. Got: " +
 189                     newOffset + " Expected: " + offset + " for <" + str + ">.");
 190                 }
 191             }
 192         }
 193     }
 194 }