11d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/*
21d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Copyright (C) 2008 The Guava Authors
31d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
41d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Licensed under the Apache License, Version 2.0 (the "License");
51d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * you may not use this file except in compliance with the License.
61d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * You may obtain a copy of the License at
71d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
81d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * http://www.apache.org/licenses/LICENSE-2.0
91d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Unless required by applicable law or agreed to in writing, software
111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * distributed under the License is distributed on an "AS IS" BASIS,
121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * See the License for the specific language governing permissions and
141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * limitations under the License.
151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */
161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpackage com.google.common.base;
181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
190888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport static com.google.common.base.CharMatcher.BREAKING_WHITESPACE;
200888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport static com.google.common.base.CharMatcher.WHITESPACE;
211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.base.CharMatcher.anyOf;
221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.base.CharMatcher.forPredicate;
231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.base.CharMatcher.inRange;
241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.base.CharMatcher.is;
251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.base.CharMatcher.isNot;
261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.base.CharMatcher.noneOf;
271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.annotations.GwtCompatible;
291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.annotations.GwtIncompatible;
307dd252788645e940eada959bdde927426e2531c9Paul Duffinimport com.google.common.collect.Sets;
311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.testing.NullPointerTester;
321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
330888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport junit.framework.AssertionFailedError;
340888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport junit.framework.TestCase;
350888a09821a98ac0680fad765217302858e70fa4Paul Duffin
367dd252788645e940eada959bdde927426e2531c9Paul Duffinimport java.util.Arrays;
377dd252788645e940eada959bdde927426e2531c9Paul Duffinimport java.util.BitSet;
387dd252788645e940eada959bdde927426e2531c9Paul Duffinimport java.util.HashSet;
397dd252788645e940eada959bdde927426e2531c9Paul Duffinimport java.util.Random;
407dd252788645e940eada959bdde927426e2531c9Paul Duffinimport java.util.Set;
417dd252788645e940eada959bdde927426e2531c9Paul Duffin
421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/**
431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Unit test for {@link CharMatcher}.
441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Kevin Bourrillion
461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */
471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert@GwtCompatible(emulated = true)
481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpublic class CharMatcherTest extends TestCase {
491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("NullPointerTester")
511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testStaticNullPointers() throws Exception {
521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    NullPointerTester tester = new NullPointerTester();
531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    tester.testAllPublicStaticMethods(CharMatcher.class);
541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    tester.testAllPublicInstanceMethods(CharMatcher.ANY);
551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    tester.testAllPublicInstanceMethods(CharMatcher.anyOf("abc"));
561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static final CharMatcher WHATEVER = new CharMatcher() {
591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override public boolean matches(char c) {
601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      throw new AssertionFailedError(
611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          "You weren't supposed to actually invoke me!");
621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  };
641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testAnyAndNone_logicalOps() throws Exception {
661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // These are testing behavior that's never promised by the API, but since
671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // we're lucky enough that these do pass, it saves us from having to write
681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // more excruciating tests! Hooray!
691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSame(CharMatcher.ANY, CharMatcher.NONE.negate());
711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSame(CharMatcher.NONE, CharMatcher.ANY.negate());
721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSame(WHATEVER, CharMatcher.ANY.and(WHATEVER));
741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSame(CharMatcher.ANY, CharMatcher.ANY.or(WHATEVER));
751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSame(CharMatcher.NONE, CharMatcher.NONE.and(WHATEVER));
771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSame(WHATEVER, CharMatcher.NONE.or(WHATEVER));
781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
807dd252788645e940eada959bdde927426e2531c9Paul Duffin  // The rest of the behavior of ANY and DEFAULT will be covered in the tests for
811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  // the text processing methods below.
821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
830888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public void testWhitespaceBreakingWhitespaceSubset() throws Exception {
840888a09821a98ac0680fad765217302858e70fa4Paul Duffin    for (int c = 0; c <= Character.MAX_VALUE; c++) {
850888a09821a98ac0680fad765217302858e70fa4Paul Duffin      if (BREAKING_WHITESPACE.apply((char) c)) {
860888a09821a98ac0680fad765217302858e70fa4Paul Duffin        assertTrue(Integer.toHexString(c), WHITESPACE.apply((char) c));
870888a09821a98ac0680fad765217302858e70fa4Paul Duffin      }
880888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
890888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
900888a09821a98ac0680fad765217302858e70fa4Paul Duffin
911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  // The next tests require ICU4J and have, at least for now, been sliced out
921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  // of the open-source view of the tests.
931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("Character.isISOControl")
951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testJavaIsoControl() {
961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (int c = 0; c <= Character.MAX_VALUE; c++) {
971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertEquals("" + c, Character.isISOControl(c),
981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          CharMatcher.JAVA_ISO_CONTROL.matches((char) c));
991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  // Omitting tests for the rest of the JAVA_* constants as these are defined
1031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  // as extremely straightforward pass-throughs to the JDK methods.
1041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  // We're testing the is(), isNot(), anyOf(), noneOf() and inRange() methods
1061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  // below by testing their text-processing methods.
1071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  // The organization of this test class is unusual, as it's not done by
1091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  // method, but by overall "scenario". Also, the variety of actual tests we
1101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  // do borders on absurd overkill. Better safe than sorry, though?
1111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1127dd252788645e940eada959bdde927426e2531c9Paul Duffin  @GwtIncompatible("java.util.BitSet")
1137dd252788645e940eada959bdde927426e2531c9Paul Duffin  public void testSetBits() {
1147dd252788645e940eada959bdde927426e2531c9Paul Duffin    doTestSetBits(CharMatcher.ANY);
1157dd252788645e940eada959bdde927426e2531c9Paul Duffin    doTestSetBits(CharMatcher.NONE);
1167dd252788645e940eada959bdde927426e2531c9Paul Duffin    doTestSetBits(is('a'));
1177dd252788645e940eada959bdde927426e2531c9Paul Duffin    doTestSetBits(isNot('a'));
1187dd252788645e940eada959bdde927426e2531c9Paul Duffin    doTestSetBits(anyOf(""));
1197dd252788645e940eada959bdde927426e2531c9Paul Duffin    doTestSetBits(anyOf("x"));
1207dd252788645e940eada959bdde927426e2531c9Paul Duffin    doTestSetBits(anyOf("xy"));
1217dd252788645e940eada959bdde927426e2531c9Paul Duffin    doTestSetBits(anyOf("CharMatcher"));
1227dd252788645e940eada959bdde927426e2531c9Paul Duffin    doTestSetBits(noneOf("CharMatcher"));
1237dd252788645e940eada959bdde927426e2531c9Paul Duffin    doTestSetBits(inRange('n', 'q'));
1247dd252788645e940eada959bdde927426e2531c9Paul Duffin    doTestSetBits(forPredicate(Predicates.equalTo('c')));
1257dd252788645e940eada959bdde927426e2531c9Paul Duffin    doTestSetBits(CharMatcher.ASCII);
1267dd252788645e940eada959bdde927426e2531c9Paul Duffin    doTestSetBits(CharMatcher.DIGIT);
1277dd252788645e940eada959bdde927426e2531c9Paul Duffin    doTestSetBits(CharMatcher.INVISIBLE);
1280888a09821a98ac0680fad765217302858e70fa4Paul Duffin    doTestSetBits(CharMatcher.WHITESPACE);
1297dd252788645e940eada959bdde927426e2531c9Paul Duffin    doTestSetBits(inRange('A', 'Z').and(inRange('F', 'K').negate()));
1307dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
1317dd252788645e940eada959bdde927426e2531c9Paul Duffin
1327dd252788645e940eada959bdde927426e2531c9Paul Duffin  @GwtIncompatible("java.util.BitSet")
1337dd252788645e940eada959bdde927426e2531c9Paul Duffin  private void doTestSetBits(CharMatcher matcher) {
1347dd252788645e940eada959bdde927426e2531c9Paul Duffin    BitSet bitset = new BitSet();
1357dd252788645e940eada959bdde927426e2531c9Paul Duffin    matcher.setBits(bitset);
1367dd252788645e940eada959bdde927426e2531c9Paul Duffin    for (int i = Character.MIN_VALUE; i <= Character.MAX_VALUE; i++) {
1377dd252788645e940eada959bdde927426e2531c9Paul Duffin      assertEquals(matcher.matches((char) i), bitset.get(i));
1387dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
1397dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
1407dd252788645e940eada959bdde927426e2531c9Paul Duffin
1411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testEmpty() throws Exception {
1421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestEmpty(CharMatcher.ANY);
1431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestEmpty(CharMatcher.NONE);
1441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestEmpty(is('a'));
1451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestEmpty(isNot('a'));
1461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestEmpty(anyOf(""));
1471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestEmpty(anyOf("x"));
1481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestEmpty(anyOf("xy"));
1491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestEmpty(anyOf("CharMatcher"));
1501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestEmpty(noneOf("CharMatcher"));
1511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestEmpty(inRange('n', 'q'));
1521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestEmpty(forPredicate(Predicates.equalTo('c')));
1531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("NullPointerTester")
1561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testNull() throws Exception {
1571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestNull(CharMatcher.ANY);
1581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestNull(CharMatcher.NONE);
1591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestNull(is('a'));
1601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestNull(isNot('a'));
1611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestNull(anyOf(""));
1621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestNull(anyOf("x"));
1631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestNull(anyOf("xy"));
1641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestNull(anyOf("CharMatcher"));
1651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestNull(noneOf("CharMatcher"));
1661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestNull(inRange('n', 'q'));
1671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestNull(forPredicate(Predicates.equalTo('c')));
1681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private void doTestEmpty(CharMatcher matcher) throws Exception {
1711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    reallyTestEmpty(matcher);
1721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    reallyTestEmpty(matcher.negate());
1731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    reallyTestEmpty(matcher.precomputed());
1741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private void reallyTestEmpty(CharMatcher matcher) throws Exception {
1771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(-1, matcher.indexIn(""));
1781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(-1, matcher.indexIn("", 0));
1791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
1801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      matcher.indexIn("", 1);
1811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
1821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (IndexOutOfBoundsException expected) {
1831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
1851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      matcher.indexIn("", -1);
1861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
1871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (IndexOutOfBoundsException expected) {
1881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(-1, matcher.lastIndexIn(""));
1901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(matcher.matchesAnyOf(""));
1911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(matcher.matchesAllOf(""));
1921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(matcher.matchesNoneOf(""));
1931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("", matcher.removeFrom(""));
1941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("", matcher.replaceFrom("", 'z'));
1951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("", matcher.replaceFrom("", "ZZ"));
1961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("", matcher.trimFrom(""));
1971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(0, matcher.countIn(""));
1981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("NullPointerTester")
2011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private void doTestNull(CharMatcher matcher) throws Exception {
2021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    NullPointerTester tester = new NullPointerTester();
2031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    tester.testAllPublicInstanceMethods(matcher);
2041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testNoMatches() {
2071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestNoMatches(CharMatcher.NONE, "blah");
2081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestNoMatches(is('a'), "bcde");
2091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestNoMatches(isNot('a'), "aaaa");
2101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestNoMatches(anyOf(""), "abcd");
2111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestNoMatches(anyOf("x"), "abcd");
2121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestNoMatches(anyOf("xy"), "abcd");
2131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestNoMatches(anyOf("CharMatcher"), "zxqy");
2141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestNoMatches(noneOf("CharMatcher"), "ChMa");
2151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestNoMatches(inRange('p', 'x'), "mom");
2161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestNoMatches(forPredicate(Predicates.equalTo('c')), "abe");
2171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestNoMatches(inRange('A', 'Z').and(inRange('F', 'K').negate()), "F1a");
2181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestNoMatches(CharMatcher.DIGIT, "\tAz()");
2191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestNoMatches(CharMatcher.JAVA_DIGIT, "\tAz()");
2201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestNoMatches(CharMatcher.DIGIT.and(CharMatcher.ASCII), "\tAz()");
2211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestNoMatches(CharMatcher.SINGLE_WIDTH, "\u05bf\u3000");
2221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private void doTestNoMatches(CharMatcher matcher, String s) {
2251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    reallyTestNoMatches(matcher, s);
2261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    reallyTestAllMatches(matcher.negate(), s);
2271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    reallyTestNoMatches(matcher.precomputed(), s);
2281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    reallyTestAllMatches(matcher.negate().precomputed(), s);
2291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    reallyTestAllMatches(matcher.precomputed().negate(), s);
2301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    reallyTestNoMatches(forPredicate(matcher), s);
2311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    reallyTestNoMatches(matcher, new StringBuilder(s));
2331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testAllMatches() {
2361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestAllMatches(CharMatcher.ANY, "blah");
2371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestAllMatches(isNot('a'), "bcde");
2381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestAllMatches(is('a'), "aaaa");
2391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestAllMatches(noneOf("CharMatcher"), "zxqy");
2401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestAllMatches(anyOf("x"), "xxxx");
2411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestAllMatches(anyOf("xy"), "xyyx");
2421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestAllMatches(anyOf("CharMatcher"), "ChMa");
2431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestAllMatches(inRange('m', 'p'), "mom");
2441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestAllMatches(forPredicate(Predicates.equalTo('c')), "ccc");
2451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestAllMatches(CharMatcher.DIGIT, "0123456789\u0ED0\u1B59");
2461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestAllMatches(CharMatcher.JAVA_DIGIT, "0123456789");
2471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestAllMatches(CharMatcher.DIGIT.and(CharMatcher.ASCII), "0123456789");
2481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestAllMatches(CharMatcher.SINGLE_WIDTH, "\t0123ABCdef~\u00A0\u2111");
2491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private void doTestAllMatches(CharMatcher matcher, String s) {
2521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    reallyTestAllMatches(matcher, s);
2531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    reallyTestNoMatches(matcher.negate(), s);
2541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    reallyTestAllMatches(matcher.precomputed(), s);
2551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    reallyTestNoMatches(matcher.negate().precomputed(), s);
2561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    reallyTestNoMatches(matcher.precomputed().negate(), s);
2571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    reallyTestAllMatches(forPredicate(matcher), s);
2581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    reallyTestAllMatches(matcher, new StringBuilder(s));
2601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private void reallyTestNoMatches(CharMatcher matcher, CharSequence s) {
2631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(matcher.matches(s.charAt(0)));
2641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(-1, matcher.indexIn(s));
2651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(-1, matcher.indexIn(s, 0));
2661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(-1, matcher.indexIn(s, 1));
2671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(-1, matcher.indexIn(s, s.length()));
2681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
2691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      matcher.indexIn(s, s.length() + 1);
2701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
2711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (IndexOutOfBoundsException expected) {
2721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
2741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      matcher.indexIn(s, -1);
2751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
2761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (IndexOutOfBoundsException expected) {
2771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(-1, matcher.lastIndexIn(s));
2791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(matcher.matchesAnyOf(s));
2801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(matcher.matchesAllOf(s));
2811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(matcher.matchesNoneOf(s));
2821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(s.toString(), matcher.removeFrom(s));
2841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(s.toString(), matcher.replaceFrom(s, 'z'));
2851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(s.toString(), matcher.replaceFrom(s, "ZZ"));
2861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(s.toString(), matcher.trimFrom(s));
2871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(0, matcher.countIn(s));
2881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private void reallyTestAllMatches(CharMatcher matcher, CharSequence s) {
2911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(matcher.matches(s.charAt(0)));
2921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(0, matcher.indexIn(s));
2931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(0, matcher.indexIn(s, 0));
2941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(1, matcher.indexIn(s, 1));
2951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(-1, matcher.indexIn(s, s.length()));
2961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(s.length() - 1, matcher.lastIndexIn(s));
2971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(matcher.matchesAnyOf(s));
2981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(matcher.matchesAllOf(s));
2991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(matcher.matchesNoneOf(s));
3001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("", matcher.removeFrom(s));
3011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Strings.repeat("z", s.length()),
3021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        matcher.replaceFrom(s, 'z'));
3031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Strings.repeat("ZZ", s.length()),
3041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        matcher.replaceFrom(s, "ZZ"));
3051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("", matcher.trimFrom(s));
3061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(s.length(), matcher.countIn(s));
3071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testGeneral() {
3101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestGeneral(is('a'), 'a', 'b');
3111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestGeneral(isNot('a'), 'b', 'a');
3121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestGeneral(anyOf("x"), 'x', 'z');
3131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestGeneral(anyOf("xy"), 'y', 'z');
3141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestGeneral(anyOf("CharMatcher"), 'C', 'z');
3151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestGeneral(noneOf("CharMatcher"), 'z', 'C');
3161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestGeneral(inRange('p', 'x'), 'q', 'z');
3171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private void doTestGeneral(CharMatcher matcher, char match, char noMatch) {
3201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestOneCharMatch(matcher, "" + match);
3211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestOneCharNoMatch(matcher, "" + noMatch);
3221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestMatchThenNoMatch(matcher, "" + match + noMatch);
3231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestNoMatchThenMatch(matcher, "" + noMatch + match);
3241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private void doTestOneCharMatch(CharMatcher matcher, String s) {
3271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    reallyTestOneCharMatch(matcher, s);
3281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    reallyTestOneCharNoMatch(matcher.negate(), s);
3291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    reallyTestOneCharMatch(matcher.precomputed(), s);
3301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    reallyTestOneCharNoMatch(matcher.negate().precomputed(), s);
3311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    reallyTestOneCharNoMatch(matcher.precomputed().negate(), s);
3321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private void doTestOneCharNoMatch(CharMatcher matcher, String s) {
3351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    reallyTestOneCharNoMatch(matcher, s);
3361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    reallyTestOneCharMatch(matcher.negate(), s);
3371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    reallyTestOneCharNoMatch(matcher.precomputed(), s);
3381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    reallyTestOneCharMatch(matcher.negate().precomputed(), s);
3391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    reallyTestOneCharMatch(matcher.precomputed().negate(), s);
3401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private void doTestMatchThenNoMatch(CharMatcher matcher, String s) {
3431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    reallyTestMatchThenNoMatch(matcher, s);
3441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    reallyTestNoMatchThenMatch(matcher.negate(), s);
3451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    reallyTestMatchThenNoMatch(matcher.precomputed(), s);
3461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    reallyTestNoMatchThenMatch(matcher.negate().precomputed(), s);
3471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    reallyTestNoMatchThenMatch(matcher.precomputed().negate(), s);
3481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private void doTestNoMatchThenMatch(CharMatcher matcher, String s) {
3511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    reallyTestNoMatchThenMatch(matcher, s);
3521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    reallyTestMatchThenNoMatch(matcher.negate(), s);
3531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    reallyTestNoMatchThenMatch(matcher.precomputed(), s);
3541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    reallyTestMatchThenNoMatch(matcher.negate().precomputed(), s);
3551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    reallyTestMatchThenNoMatch(matcher.precomputed().negate(), s);
3561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private void reallyTestOneCharMatch(CharMatcher matcher, String s) {
3591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(matcher.matches(s.charAt(0)));
3601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(matcher.apply(s.charAt(0)));
3611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(0, matcher.indexIn(s));
3621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(0, matcher.indexIn(s, 0));
3631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(-1, matcher.indexIn(s, 1));
3641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(0, matcher.lastIndexIn(s));
3651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(matcher.matchesAnyOf(s));
3661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(matcher.matchesAllOf(s));
3671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(matcher.matchesNoneOf(s));
3681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("", matcher.removeFrom(s));
3691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("z", matcher.replaceFrom(s, 'z'));
3701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("ZZ", matcher.replaceFrom(s, "ZZ"));
3711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("", matcher.trimFrom(s));
3721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(1, matcher.countIn(s));
3731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private void reallyTestOneCharNoMatch(CharMatcher matcher, String s) {
3761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(matcher.matches(s.charAt(0)));
3771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(matcher.apply(s.charAt(0)));
3781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(-1, matcher.indexIn(s));
3791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(-1, matcher.indexIn(s, 0));
3801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(-1, matcher.indexIn(s, 1));
3811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(-1, matcher.lastIndexIn(s));
3821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(matcher.matchesAnyOf(s));
3831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(matcher.matchesAllOf(s));
3841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(matcher.matchesNoneOf(s));
3851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3867dd252788645e940eada959bdde927426e2531c9Paul Duffin    assertSame(s, matcher.removeFrom(s));
3877dd252788645e940eada959bdde927426e2531c9Paul Duffin    assertSame(s, matcher.replaceFrom(s, 'z'));
3887dd252788645e940eada959bdde927426e2531c9Paul Duffin    assertSame(s, matcher.replaceFrom(s, "ZZ"));
3897dd252788645e940eada959bdde927426e2531c9Paul Duffin    assertSame(s, matcher.trimFrom(s));
3907dd252788645e940eada959bdde927426e2531c9Paul Duffin    assertSame(0, matcher.countIn(s));
3911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private void reallyTestMatchThenNoMatch(CharMatcher matcher, String s) {
3941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(0, matcher.indexIn(s));
3951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(0, matcher.indexIn(s, 0));
3961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(-1, matcher.indexIn(s, 1));
3971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(-1, matcher.indexIn(s, 2));
3981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(0, matcher.lastIndexIn(s));
3991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(matcher.matchesAnyOf(s));
4001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(matcher.matchesAllOf(s));
4011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(matcher.matchesNoneOf(s));
4021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(s.substring(1), matcher.removeFrom(s));
4031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("z" + s.substring(1), matcher.replaceFrom(s, 'z'));
4041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("ZZ" + s.substring(1), matcher.replaceFrom(s, "ZZ"));
4051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(s.substring(1), matcher.trimFrom(s));
4061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(1, matcher.countIn(s));
4071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private void reallyTestNoMatchThenMatch(CharMatcher matcher, String s) {
4101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(1, matcher.indexIn(s));
4111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(1, matcher.indexIn(s, 0));
4121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(1, matcher.indexIn(s, 1));
4131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(-1, matcher.indexIn(s, 2));
4141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(1, matcher.lastIndexIn(s));
4151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(matcher.matchesAnyOf(s));
4161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(matcher.matchesAllOf(s));
4171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(matcher.matchesNoneOf(s));
4181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(s.substring(0, 1), matcher.removeFrom(s));
4191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(s.substring(0, 1) + "z", matcher.replaceFrom(s, 'z'));
4201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(s.substring(0, 1) + "ZZ", matcher.replaceFrom(s, "ZZ"));
4211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(s.substring(0, 1), matcher.trimFrom(s));
4221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(1, matcher.countIn(s));
4231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4257dd252788645e940eada959bdde927426e2531c9Paul Duffin  /**
4267dd252788645e940eada959bdde927426e2531c9Paul Duffin   * Checks that expected is equals to out, and further, if in is
4277dd252788645e940eada959bdde927426e2531c9Paul Duffin   * equals to expected, then out is successfully optimized to be
4287dd252788645e940eada959bdde927426e2531c9Paul Duffin   * identical to in, i.e. that "in" is simply returned.
4297dd252788645e940eada959bdde927426e2531c9Paul Duffin   */
4307dd252788645e940eada959bdde927426e2531c9Paul Duffin  private void assertEqualsSame(String expected, String in, String out) {
4317dd252788645e940eada959bdde927426e2531c9Paul Duffin    if (expected.equals(in)) {
4327dd252788645e940eada959bdde927426e2531c9Paul Duffin      assertSame(in, out);
4337dd252788645e940eada959bdde927426e2531c9Paul Duffin    } else {
4347dd252788645e940eada959bdde927426e2531c9Paul Duffin      assertEquals(expected, out);
4357dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
4367dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
4377dd252788645e940eada959bdde927426e2531c9Paul Duffin
4381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  // Test collapse() a little differently than the rest, as we really want to
4391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  // cover lots of different configurations of input text
4401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCollapse() {
4417dd252788645e940eada959bdde927426e2531c9Paul Duffin    // collapsing groups of '-' into '_' or '-'
4421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestCollapse("-", "_");
4431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestCollapse("x-", "x_");
4441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestCollapse("-x", "_x");
4451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestCollapse("--", "_");
4461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestCollapse("x--", "x_");
4471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestCollapse("--x", "_x");
4481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestCollapse("-x-", "_x_");
4491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestCollapse("x-x", "x_x");
4501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestCollapse("---", "_");
4511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestCollapse("--x-", "_x_");
4521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestCollapse("--xx", "_xx");
4531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestCollapse("-x--", "_x_");
4541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestCollapse("-x-x", "_x_x");
4551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestCollapse("-xx-", "_xx_");
4561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestCollapse("x--x", "x_x");
4571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestCollapse("x-x-", "x_x_");
4581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestCollapse("x-xx", "x_xx");
4591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestCollapse("x-x--xx---x----x", "x_x_xx_x_x");
4601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestCollapseWithNoChange("");
4621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestCollapseWithNoChange("x");
4631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestCollapseWithNoChange("xx");
4641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private void doTestCollapse(String in, String out) {
4671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // Try a few different matchers which all match '-' and not 'x'
4687dd252788645e940eada959bdde927426e2531c9Paul Duffin    // Try replacement chars that both do and do not change the value.
4697dd252788645e940eada959bdde927426e2531c9Paul Duffin    for (char replacement : new char[] { '_', '-' }) {
4707dd252788645e940eada959bdde927426e2531c9Paul Duffin      String expected = out.replace('_', replacement);
4717dd252788645e940eada959bdde927426e2531c9Paul Duffin      assertEqualsSame(expected, in, is('-').collapseFrom(in, replacement));
4727dd252788645e940eada959bdde927426e2531c9Paul Duffin      assertEqualsSame(expected, in, is('-').collapseFrom(in, replacement));
4737dd252788645e940eada959bdde927426e2531c9Paul Duffin      assertEqualsSame(expected, in, is('-').or(is('#')).collapseFrom(in, replacement));
4747dd252788645e940eada959bdde927426e2531c9Paul Duffin      assertEqualsSame(expected, in, isNot('x').collapseFrom(in, replacement));
4757dd252788645e940eada959bdde927426e2531c9Paul Duffin      assertEqualsSame(expected, in, is('x').negate().collapseFrom(in, replacement));
4767dd252788645e940eada959bdde927426e2531c9Paul Duffin      assertEqualsSame(expected, in, anyOf("-").collapseFrom(in, replacement));
4777dd252788645e940eada959bdde927426e2531c9Paul Duffin      assertEqualsSame(expected, in, anyOf("-#").collapseFrom(in, replacement));
4787dd252788645e940eada959bdde927426e2531c9Paul Duffin      assertEqualsSame(expected, in, anyOf("-#123").collapseFrom(in, replacement));
4797dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
4801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private void doTestCollapseWithNoChange(String inout) {
4837dd252788645e940eada959bdde927426e2531c9Paul Duffin    assertSame(inout, is('-').collapseFrom(inout, '_'));
4847dd252788645e940eada959bdde927426e2531c9Paul Duffin    assertSame(inout, is('-').or(is('#')).collapseFrom(inout, '_'));
4857dd252788645e940eada959bdde927426e2531c9Paul Duffin    assertSame(inout, isNot('x').collapseFrom(inout, '_'));
4867dd252788645e940eada959bdde927426e2531c9Paul Duffin    assertSame(inout, is('x').negate().collapseFrom(inout, '_'));
4877dd252788645e940eada959bdde927426e2531c9Paul Duffin    assertSame(inout, anyOf("-").collapseFrom(inout, '_'));
4887dd252788645e940eada959bdde927426e2531c9Paul Duffin    assertSame(inout, anyOf("-#").collapseFrom(inout, '_'));
4897dd252788645e940eada959bdde927426e2531c9Paul Duffin    assertSame(inout, anyOf("-#123").collapseFrom(inout, '_'));
4907dd252788645e940eada959bdde927426e2531c9Paul Duffin    assertSame(inout, CharMatcher.NONE.collapseFrom(inout, '_'));
4911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCollapse_any() {
4941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("", CharMatcher.ANY.collapseFrom("", '_'));
4951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("_", CharMatcher.ANY.collapseFrom("a", '_'));
4961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("_", CharMatcher.ANY.collapseFrom("ab", '_'));
4971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("_", CharMatcher.ANY.collapseFrom("abcd", '_'));
4981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testTrimFrom() {
5011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // trimming -
5021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestTrimFrom("-", "");
5031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestTrimFrom("x-", "x");
5041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestTrimFrom("-x", "x");
5051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestTrimFrom("--", "");
5061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestTrimFrom("x--", "x");
5071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestTrimFrom("--x", "x");
5081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestTrimFrom("-x-", "x");
5091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestTrimFrom("x-x", "x-x");
5101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestTrimFrom("---", "");
5111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestTrimFrom("--x-", "x");
5121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestTrimFrom("--xx", "xx");
5131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestTrimFrom("-x--", "x");
5141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestTrimFrom("-x-x", "x-x");
5151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestTrimFrom("-xx-", "xx");
5161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestTrimFrom("x--x", "x--x");
5171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestTrimFrom("x-x-", "x-x");
5181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestTrimFrom("x-xx", "x-xx");
5191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestTrimFrom("x-x--xx---x----x", "x-x--xx---x----x");
5201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // additional testing using the doc example
5211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("cat", anyOf("ab").trimFrom("abacatbab"));
5221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private void doTestTrimFrom(String in, String out) {
5251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // Try a few different matchers which all match '-' and not 'x'
5261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(out, is('-').trimFrom(in));
5271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(out, is('-').or(is('#')).trimFrom(in));
5281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(out, isNot('x').trimFrom(in));
5291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(out, is('x').negate().trimFrom(in));
5301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(out, anyOf("-").trimFrom(in));
5311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(out, anyOf("-#").trimFrom(in));
5321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(out, anyOf("-#123").trimFrom(in));
5331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testTrimLeadingFrom() {
5361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // trimming -
5371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestTrimLeadingFrom("-", "");
5381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestTrimLeadingFrom("x-", "x-");
5391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestTrimLeadingFrom("-x", "x");
5401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestTrimLeadingFrom("--", "");
5411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestTrimLeadingFrom("x--", "x--");
5421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestTrimLeadingFrom("--x", "x");
5431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestTrimLeadingFrom("-x-", "x-");
5441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestTrimLeadingFrom("x-x", "x-x");
5451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestTrimLeadingFrom("---", "");
5461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestTrimLeadingFrom("--x-", "x-");
5471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestTrimLeadingFrom("--xx", "xx");
5481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestTrimLeadingFrom("-x--", "x--");
5491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestTrimLeadingFrom("-x-x", "x-x");
5501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestTrimLeadingFrom("-xx-", "xx-");
5511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestTrimLeadingFrom("x--x", "x--x");
5521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestTrimLeadingFrom("x-x-", "x-x-");
5531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestTrimLeadingFrom("x-xx", "x-xx");
5541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestTrimLeadingFrom("x-x--xx---x----x", "x-x--xx---x----x");
5551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // additional testing using the doc example
5561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("catbab", anyOf("ab").trimLeadingFrom("abacatbab"));
5571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private void doTestTrimLeadingFrom(String in, String out) {
5601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // Try a few different matchers which all match '-' and not 'x'
5611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(out, is('-').trimLeadingFrom(in));
5621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(out, is('-').or(is('#')).trimLeadingFrom(in));
5631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(out, isNot('x').trimLeadingFrom(in));
5641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(out, is('x').negate().trimLeadingFrom(in));
5651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(out, anyOf("-#").trimLeadingFrom(in));
5661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(out, anyOf("-#123").trimLeadingFrom(in));
5671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testTrimTrailingFrom() {
5701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // trimming -
5711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestTrimTrailingFrom("-", "");
5721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestTrimTrailingFrom("x-", "x");
5731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestTrimTrailingFrom("-x", "-x");
5741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestTrimTrailingFrom("--", "");
5751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestTrimTrailingFrom("x--", "x");
5761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestTrimTrailingFrom("--x", "--x");
5771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestTrimTrailingFrom("-x-", "-x");
5781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestTrimTrailingFrom("x-x", "x-x");
5791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestTrimTrailingFrom("---", "");
5801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestTrimTrailingFrom("--x-", "--x");
5811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestTrimTrailingFrom("--xx", "--xx");
5821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestTrimTrailingFrom("-x--", "-x");
5831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestTrimTrailingFrom("-x-x", "-x-x");
5841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestTrimTrailingFrom("-xx-", "-xx");
5851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestTrimTrailingFrom("x--x", "x--x");
5861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestTrimTrailingFrom("x-x-", "x-x");
5871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestTrimTrailingFrom("x-xx", "x-xx");
5881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestTrimTrailingFrom("x-x--xx---x----x", "x-x--xx---x----x");
5891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // additional testing using the doc example
5901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("abacat", anyOf("ab").trimTrailingFrom("abacatbab"));
5911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private void doTestTrimTrailingFrom(String in, String out) {
5941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // Try a few different matchers which all match '-' and not 'x'
5951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(out, is('-').trimTrailingFrom(in));
5961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(out, is('-').or(is('#')).trimTrailingFrom(in));
5971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(out, isNot('x').trimTrailingFrom(in));
5981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(out, is('x').negate().trimTrailingFrom(in));
5991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(out, anyOf("-#").trimTrailingFrom(in));
6001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(out, anyOf("-#123").trimTrailingFrom(in));
6011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
6021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testTrimAndCollapse() {
6047dd252788645e940eada959bdde927426e2531c9Paul Duffin    // collapsing groups of '-' into '_' or '-'
6057dd252788645e940eada959bdde927426e2531c9Paul Duffin    doTestTrimAndCollapse("", "");
6067dd252788645e940eada959bdde927426e2531c9Paul Duffin    doTestTrimAndCollapse("x", "x");
6071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestTrimAndCollapse("-", "");
6081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestTrimAndCollapse("x-", "x");
6091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestTrimAndCollapse("-x", "x");
6101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestTrimAndCollapse("--", "");
6111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestTrimAndCollapse("x--", "x");
6121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestTrimAndCollapse("--x", "x");
6131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestTrimAndCollapse("-x-", "x");
6141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestTrimAndCollapse("x-x", "x_x");
6151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestTrimAndCollapse("---", "");
6161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestTrimAndCollapse("--x-", "x");
6171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestTrimAndCollapse("--xx", "xx");
6181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestTrimAndCollapse("-x--", "x");
6191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestTrimAndCollapse("-x-x", "x_x");
6201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestTrimAndCollapse("-xx-", "xx");
6211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestTrimAndCollapse("x--x", "x_x");
6221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestTrimAndCollapse("x-x-", "x_x");
6231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestTrimAndCollapse("x-xx", "x_xx");
6241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    doTestTrimAndCollapse("x-x--xx---x----x", "x_x_xx_x_x");
6251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
6261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private void doTestTrimAndCollapse(String in, String out) {
6281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // Try a few different matchers which all match '-' and not 'x'
6297dd252788645e940eada959bdde927426e2531c9Paul Duffin    for (char replacement : new char[] { '_', '-' }) {
6307dd252788645e940eada959bdde927426e2531c9Paul Duffin      String expected = out.replace('_', replacement);
6317dd252788645e940eada959bdde927426e2531c9Paul Duffin      assertEqualsSame(expected, in, is('-').trimAndCollapseFrom(in, replacement));
6327dd252788645e940eada959bdde927426e2531c9Paul Duffin      assertEqualsSame(expected, in, is('-').or(is('#')).trimAndCollapseFrom(in, replacement));
6337dd252788645e940eada959bdde927426e2531c9Paul Duffin      assertEqualsSame(expected, in, isNot('x').trimAndCollapseFrom(in, replacement));
6347dd252788645e940eada959bdde927426e2531c9Paul Duffin      assertEqualsSame(expected, in, is('x').negate().trimAndCollapseFrom(in, replacement));
6357dd252788645e940eada959bdde927426e2531c9Paul Duffin      assertEqualsSame(expected, in, anyOf("-").trimAndCollapseFrom(in, replacement));
6367dd252788645e940eada959bdde927426e2531c9Paul Duffin      assertEqualsSame(expected, in, anyOf("-#").trimAndCollapseFrom(in, replacement));
6377dd252788645e940eada959bdde927426e2531c9Paul Duffin      assertEqualsSame(expected, in, anyOf("-#123").trimAndCollapseFrom(in, replacement));
6387dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
6391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
6401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testReplaceFrom() {
6421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("yoho", is('a').replaceFrom("yaha", 'o'));
6431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("yh", is('a').replaceFrom("yaha", ""));
6441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("yoho", is('a').replaceFrom("yaha", "o"));
6451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("yoohoo", is('a').replaceFrom("yaha", "oo"));
6461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("12 &gt; 5", is('>').replaceFrom("12 > 5", "&gt;"));
6471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
6481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testPrecomputedOptimizations() {
6501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // These are testing behavior that's never promised by the API.
6511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // Some matchers are so efficient that it is a waste of effort to
6521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // build a precomputed version.
6531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    CharMatcher m1 = is('x');
6541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSame(m1, m1.precomputed());
6557dd252788645e940eada959bdde927426e2531c9Paul Duffin    assertSame(m1.toString(), m1.precomputed().toString());
6561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    CharMatcher m2 = anyOf("Az");
6581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSame(m2, m2.precomputed());
6597dd252788645e940eada959bdde927426e2531c9Paul Duffin    assertSame(m2.toString(), m2.precomputed().toString());
6601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    CharMatcher m3 = inRange('A', 'Z');
6621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSame(m3, m3.precomputed());
6637dd252788645e940eada959bdde927426e2531c9Paul Duffin    assertSame(m3.toString(), m3.precomputed().toString());
6641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSame(CharMatcher.NONE, CharMatcher.NONE.precomputed());
6661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSame(CharMatcher.ANY, CharMatcher.ANY.precomputed());
6671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
6687dd252788645e940eada959bdde927426e2531c9Paul Duffin
6697dd252788645e940eada959bdde927426e2531c9Paul Duffin  @GwtIncompatible("java.util.BitSet")
6707dd252788645e940eada959bdde927426e2531c9Paul Duffin  private static BitSet bitSet(String chars) {
6717dd252788645e940eada959bdde927426e2531c9Paul Duffin    return bitSet(chars.toCharArray());
6727dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
6737dd252788645e940eada959bdde927426e2531c9Paul Duffin
6747dd252788645e940eada959bdde927426e2531c9Paul Duffin  @GwtIncompatible("java.util.BitSet")
6757dd252788645e940eada959bdde927426e2531c9Paul Duffin  private static BitSet bitSet(char[] chars) {
6767dd252788645e940eada959bdde927426e2531c9Paul Duffin    BitSet tmp = new BitSet();
6777dd252788645e940eada959bdde927426e2531c9Paul Duffin    for (int i = 0; i < chars.length; i++) {
6787dd252788645e940eada959bdde927426e2531c9Paul Duffin      tmp.set(chars[i]);
6797dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
6807dd252788645e940eada959bdde927426e2531c9Paul Duffin    return tmp;
6817dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
6827dd252788645e940eada959bdde927426e2531c9Paul Duffin
6837dd252788645e940eada959bdde927426e2531c9Paul Duffin  @GwtIncompatible("java.util.Random, java.util.BitSet")
6847dd252788645e940eada959bdde927426e2531c9Paul Duffin  public void testSmallCharMatcher() {
6857dd252788645e940eada959bdde927426e2531c9Paul Duffin    CharMatcher len1 = SmallCharMatcher.from(bitSet("#"), "#");
6867dd252788645e940eada959bdde927426e2531c9Paul Duffin    CharMatcher len2 = SmallCharMatcher.from(bitSet("ab"), "ab");
6877dd252788645e940eada959bdde927426e2531c9Paul Duffin    CharMatcher len3 = SmallCharMatcher.from(bitSet("abc"), "abc");
6887dd252788645e940eada959bdde927426e2531c9Paul Duffin    CharMatcher len4 = SmallCharMatcher.from(bitSet("abcd"), "abcd");
6897dd252788645e940eada959bdde927426e2531c9Paul Duffin    assertTrue(len1.matches('#'));
6907dd252788645e940eada959bdde927426e2531c9Paul Duffin    assertFalse(len1.matches('!'));
6917dd252788645e940eada959bdde927426e2531c9Paul Duffin    assertTrue(len2.matches('a'));
6927dd252788645e940eada959bdde927426e2531c9Paul Duffin    assertTrue(len2.matches('b'));
6937dd252788645e940eada959bdde927426e2531c9Paul Duffin    for (char c = 'c'; c < 'z'; c++) {
6947dd252788645e940eada959bdde927426e2531c9Paul Duffin      assertFalse(len2.matches(c));
6957dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
6967dd252788645e940eada959bdde927426e2531c9Paul Duffin    assertTrue(len3.matches('a'));
6977dd252788645e940eada959bdde927426e2531c9Paul Duffin    assertTrue(len3.matches('b'));
6987dd252788645e940eada959bdde927426e2531c9Paul Duffin    assertTrue(len3.matches('c'));
6997dd252788645e940eada959bdde927426e2531c9Paul Duffin    for (char c = 'd'; c < 'z'; c++) {
7007dd252788645e940eada959bdde927426e2531c9Paul Duffin      assertFalse(len3.matches(c));
7017dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
7027dd252788645e940eada959bdde927426e2531c9Paul Duffin    assertTrue(len4.matches('a'));
7037dd252788645e940eada959bdde927426e2531c9Paul Duffin    assertTrue(len4.matches('b'));
7047dd252788645e940eada959bdde927426e2531c9Paul Duffin    assertTrue(len4.matches('c'));
7057dd252788645e940eada959bdde927426e2531c9Paul Duffin    assertTrue(len4.matches('d'));
7067dd252788645e940eada959bdde927426e2531c9Paul Duffin    for (char c = 'e'; c < 'z'; c++) {
7077dd252788645e940eada959bdde927426e2531c9Paul Duffin      assertFalse(len4.matches(c));
7087dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
7097dd252788645e940eada959bdde927426e2531c9Paul Duffin
7107dd252788645e940eada959bdde927426e2531c9Paul Duffin    Random rand = new Random(1234);
7117dd252788645e940eada959bdde927426e2531c9Paul Duffin    for (int testCase = 0; testCase < 100; testCase++) {
7127dd252788645e940eada959bdde927426e2531c9Paul Duffin      char[] chars = randomChars(rand, rand.nextInt(63) + 1);
7137dd252788645e940eada959bdde927426e2531c9Paul Duffin      CharMatcher m = SmallCharMatcher.from(bitSet(chars), new String(chars));
7147dd252788645e940eada959bdde927426e2531c9Paul Duffin      checkExactMatches(m, chars);
7157dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
7167dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
7177dd252788645e940eada959bdde927426e2531c9Paul Duffin
7187dd252788645e940eada959bdde927426e2531c9Paul Duffin  static void checkExactMatches(CharMatcher m, char[] chars) {
7197dd252788645e940eada959bdde927426e2531c9Paul Duffin    Set<Character> positive = Sets.newHashSetWithExpectedSize(chars.length);
7207dd252788645e940eada959bdde927426e2531c9Paul Duffin    for (int i = 0; i < chars.length; i++) {
7217dd252788645e940eada959bdde927426e2531c9Paul Duffin      positive.add(chars[i]);
7227dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
7237dd252788645e940eada959bdde927426e2531c9Paul Duffin    for (int c = 0; c <= Character.MAX_VALUE; c++) {
7247dd252788645e940eada959bdde927426e2531c9Paul Duffin      assertFalse(positive.contains(new Character((char) c)) ^ m.matches((char) c));
7257dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
7267dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
7277dd252788645e940eada959bdde927426e2531c9Paul Duffin
7287dd252788645e940eada959bdde927426e2531c9Paul Duffin  static char[] randomChars(Random rand, int size) {
7297dd252788645e940eada959bdde927426e2531c9Paul Duffin    Set<Character> chars = new HashSet<Character>(size);
7307dd252788645e940eada959bdde927426e2531c9Paul Duffin    for (int i = 0; i < size; i++) {
7317dd252788645e940eada959bdde927426e2531c9Paul Duffin      char c;
7327dd252788645e940eada959bdde927426e2531c9Paul Duffin      while (true) {
7337dd252788645e940eada959bdde927426e2531c9Paul Duffin        c = (char) rand.nextInt(Character.MAX_VALUE - Character.MIN_VALUE + 1);
7347dd252788645e940eada959bdde927426e2531c9Paul Duffin        if (!chars.contains(c)) {
7357dd252788645e940eada959bdde927426e2531c9Paul Duffin          break;
7367dd252788645e940eada959bdde927426e2531c9Paul Duffin        }
7377dd252788645e940eada959bdde927426e2531c9Paul Duffin      }
7387dd252788645e940eada959bdde927426e2531c9Paul Duffin      chars.add(c);
7397dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
7407dd252788645e940eada959bdde927426e2531c9Paul Duffin    char[] retValue = new char[chars.size()];
7417dd252788645e940eada959bdde927426e2531c9Paul Duffin    int i = 0;
7427dd252788645e940eada959bdde927426e2531c9Paul Duffin    for (char c : chars) {
7437dd252788645e940eada959bdde927426e2531c9Paul Duffin      retValue[i++] = c;
7447dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
7457dd252788645e940eada959bdde927426e2531c9Paul Duffin    Arrays.sort(retValue);
7467dd252788645e940eada959bdde927426e2531c9Paul Duffin    return retValue;
7477dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
7487dd252788645e940eada959bdde927426e2531c9Paul Duffin
7497dd252788645e940eada959bdde927426e2531c9Paul Duffin  public void testToString() {
7500888a09821a98ac0680fad765217302858e70fa4Paul Duffin    assertToStringWorks("CharMatcher.NONE", CharMatcher.anyOf(""));
7510888a09821a98ac0680fad765217302858e70fa4Paul Duffin    assertToStringWorks("CharMatcher.is('\\u0031')", CharMatcher.anyOf("1"));
7520888a09821a98ac0680fad765217302858e70fa4Paul Duffin    assertToStringWorks("CharMatcher.isNot('\\u0031')", CharMatcher.isNot('1'));
7530888a09821a98ac0680fad765217302858e70fa4Paul Duffin    assertToStringWorks("CharMatcher.anyOf(\"\\u0031\\u0032\")", CharMatcher.anyOf("12"));
7540888a09821a98ac0680fad765217302858e70fa4Paul Duffin    assertToStringWorks("CharMatcher.anyOf(\"\\u0031\\u0032\\u0033\")",
7550888a09821a98ac0680fad765217302858e70fa4Paul Duffin        CharMatcher.anyOf("321"));
7560888a09821a98ac0680fad765217302858e70fa4Paul Duffin    assertToStringWorks("CharMatcher.inRange('\\u0031', '\\u0033')",
7570888a09821a98ac0680fad765217302858e70fa4Paul Duffin        CharMatcher.inRange('1', '3'));
7580888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
7590888a09821a98ac0680fad765217302858e70fa4Paul Duffin
7600888a09821a98ac0680fad765217302858e70fa4Paul Duffin  private static void assertToStringWorks(String expected, CharMatcher matcher) {
7610888a09821a98ac0680fad765217302858e70fa4Paul Duffin    assertEquals(expected, matcher.toString());
7620888a09821a98ac0680fad765217302858e70fa4Paul Duffin    assertEquals(expected, matcher.precomputed().toString());
7630888a09821a98ac0680fad765217302858e70fa4Paul Duffin    assertEquals(expected, matcher.negate().negate().toString());
7640888a09821a98ac0680fad765217302858e70fa4Paul Duffin    assertEquals(expected, matcher.negate().precomputed().negate().toString());
7650888a09821a98ac0680fad765217302858e70fa4Paul Duffin    assertEquals(expected, matcher.negate().precomputed().negate().precomputed().toString());
7667dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
7671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert}
768