1 package org.apache.lucene.util;
4 * Licensed to the Apache Software Foundation (ASF) under one or more
5 * contributor license agreements. See the NOTICE file distributed with
6 * this work for additional information regarding copyright ownership.
7 * The ASF licenses this file to You under the Apache License, Version 2.0
8 * (the "License"); you may not use this file except in compliance with
9 * the License. You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
20 import java.io.IOException;
21 import java.io.Reader;
22 import java.io.StringReader;
24 import org.apache.lucene.util.CharacterUtils.CharacterBuffer;
25 import org.junit.Test;
28 * TestCase for the {@link CharacterUtils} class.
30 public class TestCharacterUtils extends LuceneTestCase {
33 public void testCodePointAtCharArrayInt() {
34 CharacterUtils java4 = CharacterUtils.getInstance(Version.LUCENE_30);
35 char[] cpAt3 = "Abc\ud801\udc1c".toCharArray();
36 char[] highSurrogateAt3 = "Abc\ud801".toCharArray();
37 assertEquals((int) 'A', java4.codePointAt(cpAt3, 0));
38 assertEquals((int) '\ud801', java4.codePointAt(cpAt3, 3));
39 assertEquals((int) '\ud801', java4.codePointAt(highSurrogateAt3, 3));
41 java4.codePointAt(highSurrogateAt3, 4);
42 fail("array index out of bounds");
43 } catch (IndexOutOfBoundsException e) {
46 CharacterUtils java5 = CharacterUtils.getInstance(TEST_VERSION_CURRENT);
47 assertEquals((int) 'A', java5.codePointAt(cpAt3, 0));
48 assertEquals(Character.toCodePoint('\ud801', '\udc1c'), java5.codePointAt(
50 assertEquals((int) '\ud801', java5.codePointAt(highSurrogateAt3, 3));
52 java5.codePointAt(highSurrogateAt3, 4);
53 fail("array index out of bounds");
54 } catch (IndexOutOfBoundsException e) {
59 public void testCodePointAtCharSequenceInt() {
60 CharacterUtils java4 = CharacterUtils.getInstance(Version.LUCENE_30);
61 String cpAt3 = "Abc\ud801\udc1c";
62 String highSurrogateAt3 = "Abc\ud801";
63 assertEquals((int) 'A', java4.codePointAt(cpAt3, 0));
64 assertEquals((int) '\ud801', java4.codePointAt(cpAt3, 3));
65 assertEquals((int) '\ud801', java4.codePointAt(highSurrogateAt3, 3));
67 java4.codePointAt(highSurrogateAt3, 4);
68 fail("string index out of bounds");
69 } catch (IndexOutOfBoundsException e) {
72 CharacterUtils java5 = CharacterUtils.getInstance(TEST_VERSION_CURRENT);
73 assertEquals((int) 'A', java5.codePointAt(cpAt3, 0));
74 assertEquals(Character.toCodePoint('\ud801', '\udc1c'), java5.codePointAt(
76 assertEquals((int) '\ud801', java5.codePointAt(highSurrogateAt3, 3));
78 java5.codePointAt(highSurrogateAt3, 4);
79 fail("string index out of bounds");
80 } catch (IndexOutOfBoundsException e) {
86 public void testCodePointAtCharArrayIntInt() {
87 CharacterUtils java4 = CharacterUtils.getInstance(Version.LUCENE_30);
88 char[] cpAt3 = "Abc\ud801\udc1c".toCharArray();
89 char[] highSurrogateAt3 = "Abc\ud801".toCharArray();
90 assertEquals((int) 'A', java4.codePointAt(cpAt3, 0, 2));
91 assertEquals((int) '\ud801', java4.codePointAt(cpAt3, 3, 5));
92 assertEquals((int) '\ud801', java4.codePointAt(highSurrogateAt3, 3, 4));
94 CharacterUtils java5 = CharacterUtils.getInstance(TEST_VERSION_CURRENT);
95 assertEquals((int) 'A', java5.codePointAt(cpAt3, 0, 2));
96 assertEquals(Character.toCodePoint('\ud801', '\udc1c'), java5.codePointAt(
98 assertEquals((int) '\ud801', java5.codePointAt(highSurrogateAt3, 3, 4));
103 public void testNewCharacterBuffer() {
104 CharacterBuffer newCharacterBuffer = CharacterUtils.newCharacterBuffer(1024);
105 assertEquals(1024, newCharacterBuffer.getBuffer().length);
106 assertEquals(0, newCharacterBuffer.getOffset());
107 assertEquals(0, newCharacterBuffer.getLength());
109 newCharacterBuffer = CharacterUtils.newCharacterBuffer(2);
110 assertEquals(2, newCharacterBuffer.getBuffer().length);
111 assertEquals(0, newCharacterBuffer.getOffset());
112 assertEquals(0, newCharacterBuffer.getLength());
115 newCharacterBuffer = CharacterUtils.newCharacterBuffer(1);
116 fail("length must be >= 2");
117 } catch (IllegalArgumentException e) {
122 public void testFillNoHighSurrogate() throws IOException {
123 Version[] versions = new Version[] { Version.LUCENE_30, TEST_VERSION_CURRENT };
124 for (Version version : versions) {
125 CharacterUtils instance = CharacterUtils.getInstance(version);
126 Reader reader = new StringReader("helloworld");
127 CharacterBuffer buffer = CharacterUtils.newCharacterBuffer(6);
128 assertTrue(instance.fill(buffer,reader));
129 assertEquals(0, buffer.getOffset());
130 assertEquals(6, buffer.getLength());
131 assertEquals("hellow", new String(buffer.getBuffer()));
132 assertTrue(instance.fill(buffer,reader));
133 assertEquals(4, buffer.getLength());
134 assertEquals(0, buffer.getOffset());
136 assertEquals("orld", new String(buffer.getBuffer(), buffer.getOffset(),
137 buffer.getLength()));
138 assertFalse(instance.fill(buffer,reader));
143 public void testFillJava15() throws IOException {
144 String input = "1234\ud801\udc1c789123\ud801\ud801\udc1c\ud801";
145 CharacterUtils instance = CharacterUtils.getInstance(TEST_VERSION_CURRENT);
146 Reader reader = new StringReader(input);
147 CharacterBuffer buffer = CharacterUtils.newCharacterBuffer(5);
148 assertTrue(instance.fill(buffer, reader));
149 assertEquals(4, buffer.getLength());
150 assertEquals("1234", new String(buffer.getBuffer(), buffer.getOffset(),
151 buffer.getLength()));
152 assertTrue(instance.fill(buffer, reader));
153 assertEquals(5, buffer.getLength());
154 assertEquals("\ud801\udc1c789", new String(buffer.getBuffer()));
155 assertTrue(instance.fill(buffer, reader));
156 assertEquals(4, buffer.getLength());
157 assertEquals("123\ud801", new String(buffer.getBuffer(),
158 buffer.getOffset(), buffer.getLength()));
159 assertTrue(instance.fill(buffer, reader));
160 assertEquals(2, buffer.getLength());
161 assertEquals("\ud801\udc1c", new String(buffer.getBuffer(), buffer
162 .getOffset(), buffer.getLength()));
163 assertTrue(instance.fill(buffer, reader));
164 assertEquals(1, buffer.getLength());
165 assertEquals("\ud801", new String(buffer.getBuffer(), buffer
166 .getOffset(), buffer.getLength()));
167 assertFalse(instance.fill(buffer, reader));
171 public void testFillJava14() throws IOException {
172 String input = "1234\ud801\udc1c789123\ud801\ud801\udc1c\ud801";
173 CharacterUtils instance = CharacterUtils.getInstance(Version.LUCENE_30);
174 Reader reader = new StringReader(input);
175 CharacterBuffer buffer = CharacterUtils.newCharacterBuffer(5);
176 assertTrue(instance.fill(buffer, reader));
177 assertEquals(5, buffer.getLength());
178 assertEquals("1234\ud801", new String(buffer.getBuffer(), buffer
179 .getOffset(), buffer.getLength()));
180 assertTrue(instance.fill(buffer, reader));
181 assertEquals(5, buffer.getLength());
182 assertEquals("\udc1c7891", new String(buffer.getBuffer()));
183 buffer = CharacterUtils.newCharacterBuffer(6);
184 assertTrue(instance.fill(buffer, reader));
185 assertEquals(6, buffer.getLength());
186 assertEquals("23\ud801\ud801\udc1c\ud801", new String(buffer.getBuffer(), buffer
187 .getOffset(), buffer.getLength()));
188 assertFalse(instance.fill(buffer, reader));