1 /* 2 * Licensed to the Apache Software Foundation (ASF) under one 3 * or more contributor license agreements. See the NOTICE file 4 * distributed with this work for additional information 5 * regarding copyright ownership. The ASF licenses this file 6 * to you under the Apache License, Version 2.0 (the 7 * "License"); you may not use this file except in compliance 8 * with the License. You may obtain a copy of the License at 9 * 10 * http://www.apache.org/licenses/LICENSE-2.0 11 * 12 * Unless required by applicable law or agreed to in writing, 13 * software distributed under the License is distributed on an 14 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 15 * KIND, either express or implied. See the License for the 16 * specific language governing permissions and limitations 17 * under the License. 18 */ 19 package org.apache.commons.lang3; 20 21 import static org.junit.jupiter.api.Assertions.assertEquals; 22 import static org.junit.jupiter.api.Assertions.assertFalse; 23 import static org.junit.jupiter.api.Assertions.assertNotEquals; 24 import static org.junit.jupiter.api.Assertions.assertNull; 25 import static org.junit.jupiter.api.Assertions.assertSame; 26 import static org.junit.jupiter.api.Assertions.assertTrue; 27 28 import java.lang.reflect.Modifier; 29 30 import org.junit.jupiter.api.Test; 31 32 /** 33 * Unit tests {@link org.apache.commons.lang3.CharSet}. 34 */ 35 public class CharSetTest extends AbstractLangTest { 36 37 @Test testClass()38 public void testClass() { 39 assertTrue(Modifier.isPublic(CharSet.class.getModifiers())); 40 assertFalse(Modifier.isFinal(CharSet.class.getModifiers())); 41 } 42 43 @Test testGetInstance()44 public void testGetInstance() { 45 assertSame(CharSet.EMPTY, CharSet.getInstance( (String) null)); 46 assertSame(CharSet.EMPTY, CharSet.getInstance("")); 47 assertSame(CharSet.ASCII_ALPHA, CharSet.getInstance("a-zA-Z")); 48 assertSame(CharSet.ASCII_ALPHA, CharSet.getInstance("A-Za-z")); 49 assertSame(CharSet.ASCII_ALPHA_LOWER, CharSet.getInstance("a-z")); 50 assertSame(CharSet.ASCII_ALPHA_UPPER, CharSet.getInstance("A-Z")); 51 assertSame(CharSet.ASCII_NUMERIC, CharSet.getInstance("0-9")); 52 } 53 54 @Test testGetInstance_Stringarray()55 public void testGetInstance_Stringarray() { 56 assertNull(CharSet.getInstance((String[]) null)); 57 assertEquals("[]", CharSet.getInstance(new String[0]).toString()); 58 assertEquals("[]", CharSet.getInstance(new String[] {null}).toString()); 59 assertEquals("[a-e]", CharSet.getInstance(new String[] {"a-e"}).toString()); 60 } 61 62 @Test testConstructor_String_simple()63 public void testConstructor_String_simple() { 64 CharSet set; 65 CharRange[] array; 66 67 set = CharSet.getInstance((String) null); 68 array = set.getCharRanges(); 69 assertEquals("[]", set.toString()); 70 assertEquals(0, array.length); 71 72 set = CharSet.getInstance(""); 73 array = set.getCharRanges(); 74 assertEquals("[]", set.toString()); 75 assertEquals(0, array.length); 76 77 set = CharSet.getInstance("a"); 78 array = set.getCharRanges(); 79 assertEquals("[a]", set.toString()); 80 assertEquals(1, array.length); 81 assertEquals("a", array[0].toString()); 82 83 set = CharSet.getInstance("^a"); 84 array = set.getCharRanges(); 85 assertEquals("[^a]", set.toString()); 86 assertEquals(1, array.length); 87 assertEquals("^a", array[0].toString()); 88 89 set = CharSet.getInstance("a-e"); 90 array = set.getCharRanges(); 91 assertEquals("[a-e]", set.toString()); 92 assertEquals(1, array.length); 93 assertEquals("a-e", array[0].toString()); 94 95 set = CharSet.getInstance("^a-e"); 96 array = set.getCharRanges(); 97 assertEquals("[^a-e]", set.toString()); 98 assertEquals(1, array.length); 99 assertEquals("^a-e", array[0].toString()); 100 } 101 102 @Test testConstructor_String_combo()103 public void testConstructor_String_combo() { 104 CharSet set; 105 CharRange[] array; 106 107 set = CharSet.getInstance("abc"); 108 array = set.getCharRanges(); 109 assertEquals(3, array.length); 110 assertTrue(ArrayUtils.contains(array, CharRange.is('a'))); 111 assertTrue(ArrayUtils.contains(array, CharRange.is('b'))); 112 assertTrue(ArrayUtils.contains(array, CharRange.is('c'))); 113 114 set = CharSet.getInstance("a-ce-f"); 115 array = set.getCharRanges(); 116 assertEquals(2, array.length); 117 assertTrue(ArrayUtils.contains(array, CharRange.isIn('a', 'c'))); 118 assertTrue(ArrayUtils.contains(array, CharRange.isIn('e', 'f'))); 119 120 set = CharSet.getInstance("ae-f"); 121 array = set.getCharRanges(); 122 assertEquals(2, array.length); 123 assertTrue(ArrayUtils.contains(array, CharRange.is('a'))); 124 assertTrue(ArrayUtils.contains(array, CharRange.isIn('e', 'f'))); 125 126 set = CharSet.getInstance("e-fa"); 127 array = set.getCharRanges(); 128 assertEquals(2, array.length); 129 assertTrue(ArrayUtils.contains(array, CharRange.is('a'))); 130 assertTrue(ArrayUtils.contains(array, CharRange.isIn('e', 'f'))); 131 132 set = CharSet.getInstance("ae-fm-pz"); 133 array = set.getCharRanges(); 134 assertEquals(4, array.length); 135 assertTrue(ArrayUtils.contains(array, CharRange.is('a'))); 136 assertTrue(ArrayUtils.contains(array, CharRange.isIn('e', 'f'))); 137 assertTrue(ArrayUtils.contains(array, CharRange.isIn('m', 'p'))); 138 assertTrue(ArrayUtils.contains(array, CharRange.is('z'))); 139 } 140 141 @Test testConstructor_String_comboNegated()142 public void testConstructor_String_comboNegated() { 143 CharSet set; 144 CharRange[] array; 145 146 set = CharSet.getInstance("^abc"); 147 array = set.getCharRanges(); 148 assertEquals(3, array.length); 149 assertTrue(ArrayUtils.contains(array, CharRange.isNot('a'))); 150 assertTrue(ArrayUtils.contains(array, CharRange.is('b'))); 151 assertTrue(ArrayUtils.contains(array, CharRange.is('c'))); 152 153 set = CharSet.getInstance("b^ac"); 154 array = set.getCharRanges(); 155 assertEquals(3, array.length); 156 assertTrue(ArrayUtils.contains(array, CharRange.is('b'))); 157 assertTrue(ArrayUtils.contains(array, CharRange.isNot('a'))); 158 assertTrue(ArrayUtils.contains(array, CharRange.is('c'))); 159 160 set = CharSet.getInstance("db^ac"); 161 array = set.getCharRanges(); 162 assertEquals(4, array.length); 163 assertTrue(ArrayUtils.contains(array, CharRange.is('d'))); 164 assertTrue(ArrayUtils.contains(array, CharRange.is('b'))); 165 assertTrue(ArrayUtils.contains(array, CharRange.isNot('a'))); 166 assertTrue(ArrayUtils.contains(array, CharRange.is('c'))); 167 168 set = CharSet.getInstance("^b^a"); 169 array = set.getCharRanges(); 170 assertEquals(2, array.length); 171 assertTrue(ArrayUtils.contains(array, CharRange.isNot('b'))); 172 assertTrue(ArrayUtils.contains(array, CharRange.isNot('a'))); 173 174 set = CharSet.getInstance("b^a-c^z"); 175 array = set.getCharRanges(); 176 assertEquals(3, array.length); 177 assertTrue(ArrayUtils.contains(array, CharRange.isNotIn('a', 'c'))); 178 assertTrue(ArrayUtils.contains(array, CharRange.isNot('z'))); 179 assertTrue(ArrayUtils.contains(array, CharRange.is('b'))); 180 } 181 182 @Test testConstructor_String_oddDash()183 public void testConstructor_String_oddDash() { 184 CharSet set; 185 CharRange[] array; 186 187 set = CharSet.getInstance("-"); 188 array = set.getCharRanges(); 189 assertEquals(1, array.length); 190 assertTrue(ArrayUtils.contains(array, CharRange.is('-'))); 191 192 set = CharSet.getInstance("--"); 193 array = set.getCharRanges(); 194 assertEquals(1, array.length); 195 assertTrue(ArrayUtils.contains(array, CharRange.is('-'))); 196 197 set = CharSet.getInstance("---"); 198 array = set.getCharRanges(); 199 assertEquals(1, array.length); 200 assertTrue(ArrayUtils.contains(array, CharRange.is('-'))); 201 202 set = CharSet.getInstance("----"); 203 array = set.getCharRanges(); 204 assertEquals(1, array.length); 205 assertTrue(ArrayUtils.contains(array, CharRange.is('-'))); 206 207 set = CharSet.getInstance("-a"); 208 array = set.getCharRanges(); 209 assertEquals(2, array.length); 210 assertTrue(ArrayUtils.contains(array, CharRange.is('-'))); 211 assertTrue(ArrayUtils.contains(array, CharRange.is('a'))); 212 213 set = CharSet.getInstance("a-"); 214 array = set.getCharRanges(); 215 assertEquals(2, array.length); 216 assertTrue(ArrayUtils.contains(array, CharRange.is('a'))); 217 assertTrue(ArrayUtils.contains(array, CharRange.is('-'))); 218 219 set = CharSet.getInstance("a--"); 220 array = set.getCharRanges(); 221 assertEquals(1, array.length); 222 assertTrue(ArrayUtils.contains(array, CharRange.isIn('a', '-'))); 223 224 set = CharSet.getInstance("--a"); 225 array = set.getCharRanges(); 226 assertEquals(1, array.length); 227 assertTrue(ArrayUtils.contains(array, CharRange.isIn('-', 'a'))); 228 } 229 230 @Test testConstructor_String_oddNegate()231 public void testConstructor_String_oddNegate() { 232 CharSet set; 233 CharRange[] array; 234 set = CharSet.getInstance("^"); 235 array = set.getCharRanges(); 236 assertEquals(1, array.length); 237 assertTrue(ArrayUtils.contains(array, CharRange.is('^'))); // "^" 238 239 set = CharSet.getInstance("^^"); 240 array = set.getCharRanges(); 241 assertEquals(1, array.length); 242 assertTrue(ArrayUtils.contains(array, CharRange.isNot('^'))); // "^^" 243 244 set = CharSet.getInstance("^^^"); 245 array = set.getCharRanges(); 246 assertEquals(2, array.length); 247 assertTrue(ArrayUtils.contains(array, CharRange.isNot('^'))); // "^^" 248 assertTrue(ArrayUtils.contains(array, CharRange.is('^'))); // "^" 249 250 set = CharSet.getInstance("^^^^"); 251 array = set.getCharRanges(); 252 assertEquals(1, array.length); 253 assertTrue(ArrayUtils.contains(array, CharRange.isNot('^'))); // "^^" x2 254 255 set = CharSet.getInstance("a^"); 256 array = set.getCharRanges(); 257 assertEquals(2, array.length); 258 assertTrue(ArrayUtils.contains(array, CharRange.is('a'))); // "a" 259 assertTrue(ArrayUtils.contains(array, CharRange.is('^'))); // "^" 260 261 set = CharSet.getInstance("^a-"); 262 array = set.getCharRanges(); 263 assertEquals(2, array.length); 264 assertTrue(ArrayUtils.contains(array, CharRange.isNot('a'))); // "^a" 265 assertTrue(ArrayUtils.contains(array, CharRange.is('-'))); // "-" 266 267 set = CharSet.getInstance("^^-c"); 268 array = set.getCharRanges(); 269 assertEquals(1, array.length); 270 assertTrue(ArrayUtils.contains(array, CharRange.isNotIn('^', 'c'))); // "^^-c" 271 272 set = CharSet.getInstance("^c-^"); 273 array = set.getCharRanges(); 274 assertEquals(1, array.length); 275 assertTrue(ArrayUtils.contains(array, CharRange.isNotIn('c', '^'))); // "^c-^" 276 277 set = CharSet.getInstance("^c-^d"); 278 array = set.getCharRanges(); 279 assertEquals(2, array.length); 280 assertTrue(ArrayUtils.contains(array, CharRange.isNotIn('c', '^'))); // "^c-^" 281 assertTrue(ArrayUtils.contains(array, CharRange.is('d'))); // "d" 282 283 set = CharSet.getInstance("^^-"); 284 array = set.getCharRanges(); 285 assertEquals(2, array.length); 286 assertTrue(ArrayUtils.contains(array, CharRange.isNot('^'))); // "^^" 287 assertTrue(ArrayUtils.contains(array, CharRange.is('-'))); // "-" 288 } 289 290 @Test testConstructor_String_oddCombinations()291 public void testConstructor_String_oddCombinations() { 292 CharSet set; 293 CharRange[] array; 294 295 set = CharSet.getInstance("a-^c"); 296 array = set.getCharRanges(); 297 assertTrue(ArrayUtils.contains(array, CharRange.isIn('a', '^'))); // "a-^" 298 assertTrue(ArrayUtils.contains(array, CharRange.is('c'))); // "c" 299 assertFalse(set.contains('b')); 300 assertTrue(set.contains('^')); 301 assertTrue(set.contains('_')); // between ^ and a 302 assertTrue(set.contains('c')); 303 304 set = CharSet.getInstance("^a-^c"); 305 array = set.getCharRanges(); 306 assertTrue(ArrayUtils.contains(array, CharRange.isNotIn('a', '^'))); // "^a-^" 307 assertTrue(ArrayUtils.contains(array, CharRange.is('c'))); // "c" 308 assertTrue(set.contains('b')); 309 assertFalse(set.contains('^')); 310 assertFalse(set.contains('_')); // between ^ and a 311 312 set = CharSet.getInstance("a- ^-- "); //contains everything 313 array = set.getCharRanges(); 314 assertTrue(ArrayUtils.contains(array, CharRange.isIn('a', ' '))); // "a- " 315 assertTrue(ArrayUtils.contains(array, CharRange.isNotIn('-', ' '))); // "^-- " 316 assertTrue(set.contains('#')); 317 assertTrue(set.contains('^')); 318 assertTrue(set.contains('a')); 319 assertTrue(set.contains('*')); 320 assertTrue(set.contains('A')); 321 322 set = CharSet.getInstance("^-b"); 323 array = set.getCharRanges(); 324 assertTrue(ArrayUtils.contains(array, CharRange.isIn('^', 'b'))); // "^-b" 325 assertTrue(set.contains('b')); 326 assertTrue(set.contains('_')); // between ^ and a 327 assertFalse(set.contains('A')); 328 assertTrue(set.contains('^')); 329 330 set = CharSet.getInstance("b-^"); 331 array = set.getCharRanges(); 332 assertTrue(ArrayUtils.contains(array, CharRange.isIn('^', 'b'))); // "b-^" 333 assertTrue(set.contains('b')); 334 assertTrue(set.contains('^')); 335 assertTrue(set.contains('a')); // between ^ and b 336 assertFalse(set.contains('c')); 337 } 338 339 @Test testEquals_Object()340 public void testEquals_Object() { 341 final CharSet abc = CharSet.getInstance("abc"); 342 final CharSet abc2 = CharSet.getInstance("abc"); 343 final CharSet atoc = CharSet.getInstance("a-c"); 344 final CharSet atoc2 = CharSet.getInstance("a-c"); 345 final CharSet notatoc = CharSet.getInstance("^a-c"); 346 final CharSet notatoc2 = CharSet.getInstance("^a-c"); 347 348 assertNotEquals(null, abc); 349 350 assertEquals(abc, abc); 351 assertEquals(abc, abc2); 352 assertNotEquals(abc, atoc); 353 assertNotEquals(abc, notatoc); 354 355 assertNotEquals(atoc, abc); 356 assertEquals(atoc, atoc); 357 assertEquals(atoc, atoc2); 358 assertNotEquals(atoc, notatoc); 359 360 assertNotEquals(notatoc, abc); 361 assertNotEquals(notatoc, atoc); 362 assertEquals(notatoc, notatoc); 363 assertEquals(notatoc, notatoc2); 364 } 365 366 @Test testHashCode()367 public void testHashCode() { 368 final CharSet abc = CharSet.getInstance("abc"); 369 final CharSet abc2 = CharSet.getInstance("abc"); 370 final CharSet atoc = CharSet.getInstance("a-c"); 371 final CharSet atoc2 = CharSet.getInstance("a-c"); 372 final CharSet notatoc = CharSet.getInstance("^a-c"); 373 final CharSet notatoc2 = CharSet.getInstance("^a-c"); 374 375 assertEquals(abc.hashCode(), abc.hashCode()); 376 assertEquals(abc.hashCode(), abc2.hashCode()); 377 assertEquals(atoc.hashCode(), atoc.hashCode()); 378 assertEquals(atoc.hashCode(), atoc2.hashCode()); 379 assertEquals(notatoc.hashCode(), notatoc.hashCode()); 380 assertEquals(notatoc.hashCode(), notatoc2.hashCode()); 381 } 382 383 @Test testContains_Char()384 public void testContains_Char() { 385 final CharSet btod = CharSet.getInstance("b-d"); 386 final CharSet dtob = CharSet.getInstance("d-b"); 387 final CharSet bcd = CharSet.getInstance("bcd"); 388 final CharSet bd = CharSet.getInstance("bd"); 389 final CharSet notbtod = CharSet.getInstance("^b-d"); 390 391 assertFalse(btod.contains('a')); 392 assertTrue(btod.contains('b')); 393 assertTrue(btod.contains('c')); 394 assertTrue(btod.contains('d')); 395 assertFalse(btod.contains('e')); 396 397 assertFalse(bcd.contains('a')); 398 assertTrue(bcd.contains('b')); 399 assertTrue(bcd.contains('c')); 400 assertTrue(bcd.contains('d')); 401 assertFalse(bcd.contains('e')); 402 403 assertFalse(bd.contains('a')); 404 assertTrue(bd.contains('b')); 405 assertFalse(bd.contains('c')); 406 assertTrue(bd.contains('d')); 407 assertFalse(bd.contains('e')); 408 409 assertTrue(notbtod.contains('a')); 410 assertFalse(notbtod.contains('b')); 411 assertFalse(notbtod.contains('c')); 412 assertFalse(notbtod.contains('d')); 413 assertTrue(notbtod.contains('e')); 414 415 assertFalse(dtob.contains('a')); 416 assertTrue(dtob.contains('b')); 417 assertTrue(dtob.contains('c')); 418 assertTrue(dtob.contains('d')); 419 assertFalse(dtob.contains('e')); 420 421 final CharRange[] array = dtob.getCharRanges(); 422 assertEquals("[b-d]", dtob.toString()); 423 assertEquals(1, array.length); 424 } 425 426 @Test testSerialization()427 public void testSerialization() { 428 CharSet set = CharSet.getInstance("a"); 429 assertEquals(set, SerializationUtils.clone(set)); 430 set = CharSet.getInstance("a-e"); 431 assertEquals(set, SerializationUtils.clone(set)); 432 set = CharSet.getInstance("be-f^a-z"); 433 assertEquals(set, SerializationUtils.clone(set)); 434 } 435 436 @Test testStatics()437 public void testStatics() { 438 CharRange[] array; 439 440 array = CharSet.EMPTY.getCharRanges(); 441 assertEquals(0, array.length); 442 443 array = CharSet.ASCII_ALPHA.getCharRanges(); 444 assertEquals(2, array.length); 445 assertTrue(ArrayUtils.contains(array, CharRange.isIn('a', 'z'))); 446 assertTrue(ArrayUtils.contains(array, CharRange.isIn('A', 'Z'))); 447 448 array = CharSet.ASCII_ALPHA_LOWER.getCharRanges(); 449 assertEquals(1, array.length); 450 assertTrue(ArrayUtils.contains(array, CharRange.isIn('a', 'z'))); 451 452 array = CharSet.ASCII_ALPHA_UPPER.getCharRanges(); 453 assertEquals(1, array.length); 454 assertTrue(ArrayUtils.contains(array, CharRange.isIn('A', 'Z'))); 455 456 array = CharSet.ASCII_NUMERIC.getCharRanges(); 457 assertEquals(1, array.length); 458 assertTrue(ArrayUtils.contains(array, CharRange.isIn('0', '9'))); 459 } 460 461 @Test testJavadocExamples()462 public void testJavadocExamples() { 463 assertFalse(CharSet.getInstance("^a-c").contains('a')); 464 assertTrue(CharSet.getInstance("^a-c").contains('d')); 465 assertTrue(CharSet.getInstance("^^a-c").contains('a')); 466 assertFalse(CharSet.getInstance("^^a-c").contains('^')); 467 assertTrue(CharSet.getInstance("^a-cd-f").contains('d')); 468 assertTrue(CharSet.getInstance("a-c^").contains('^')); 469 assertTrue(CharSet.getInstance("^", "a-c").contains('^')); 470 } 471 } 472