11d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/*
21d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Copyright (C) 2010 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
191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.annotations.GwtCompatible;
203ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffinimport com.google.common.annotations.GwtIncompatible;
211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport junit.framework.TestCase;
231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/**
251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Unit test for {@link Ascii}.
261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Craig Berry
281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */
291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert@GwtCompatible
301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpublic class AsciiTest extends TestCase {
311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * The Unicode points {@code 00c1} and {@code 00e1} are the upper- and
341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * lowercase forms of A-with-acute-accent, {@code Á} and {@code á}.
351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static final String IGNORED =
371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      "`10-=~!@#$%^&*()_+[]\\{}|;':\",./<>?'\u00c1\u00e1\n";
381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static final String LOWER = "abcdefghijklmnopqrstuvwxyz";
391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static final String UPPER = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testToLowerCase() {
421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(LOWER, Ascii.toLowerCase(UPPER));
430888a09821a98ac0680fad765217302858e70fa4Paul Duffin    assertSame(LOWER, Ascii.toLowerCase(LOWER));
440888a09821a98ac0680fad765217302858e70fa4Paul Duffin    assertEquals(IGNORED, Ascii.toLowerCase(IGNORED));
450888a09821a98ac0680fad765217302858e70fa4Paul Duffin    assertEquals("foobar", Ascii.toLowerCase("fOobaR"));
461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testToUpperCase() {
491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(UPPER, Ascii.toUpperCase(LOWER));
500888a09821a98ac0680fad765217302858e70fa4Paul Duffin    assertSame(UPPER, Ascii.toUpperCase(UPPER));
511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(IGNORED, Ascii.toUpperCase(IGNORED));
520888a09821a98ac0680fad765217302858e70fa4Paul Duffin    assertEquals("FOOBAR", Ascii.toUpperCase("FoOBAr"));
531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCharsIgnored() {
561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (char c : IGNORED.toCharArray()) {
571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      String str = String.valueOf(c);
581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertTrue(str, c == Ascii.toLowerCase(c));
591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertTrue(str, c == Ascii.toUpperCase(c));
601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertFalse(str, Ascii.isLowerCase(c));
611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertFalse(str, Ascii.isUpperCase(c));
621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCharsLower() {
661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (char c : LOWER.toCharArray()) {
671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      String str = String.valueOf(c);
681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertTrue(str, c == Ascii.toLowerCase(c));
691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertFalse(str, c == Ascii.toUpperCase(c));
701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertTrue(str, Ascii.isLowerCase(c));
711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertFalse(str, Ascii.isUpperCase(c));
721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCharsUpper() {
761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (char c : UPPER.toCharArray()) {
771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      String str = String.valueOf(c);
781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertFalse(str, c == Ascii.toLowerCase(c));
791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertTrue(str, c == Ascii.toUpperCase(c));
801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertFalse(str, Ascii.isLowerCase(c));
811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertTrue(str, Ascii.isUpperCase(c));
821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
840888a09821a98ac0680fad765217302858e70fa4Paul Duffin
850888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public void testTruncate() {
860888a09821a98ac0680fad765217302858e70fa4Paul Duffin    assertEquals("foobar", Ascii.truncate("foobar", 10, "..."));
870888a09821a98ac0680fad765217302858e70fa4Paul Duffin    assertEquals("fo...", Ascii.truncate("foobar", 5, "..."));
880888a09821a98ac0680fad765217302858e70fa4Paul Duffin    assertEquals("foobar", Ascii.truncate("foobar", 6, "..."));
890888a09821a98ac0680fad765217302858e70fa4Paul Duffin    assertEquals("...", Ascii.truncate("foobar", 3, "..."));
900888a09821a98ac0680fad765217302858e70fa4Paul Duffin    assertEquals("foobar", Ascii.truncate("foobar", 10, "…"));
910888a09821a98ac0680fad765217302858e70fa4Paul Duffin    assertEquals("foo…", Ascii.truncate("foobar", 4, "…"));
920888a09821a98ac0680fad765217302858e70fa4Paul Duffin    assertEquals("fo--", Ascii.truncate("foobar", 4, "--"));
930888a09821a98ac0680fad765217302858e70fa4Paul Duffin    assertEquals("foobar", Ascii.truncate("foobar", 6, "…"));
940888a09821a98ac0680fad765217302858e70fa4Paul Duffin    assertEquals("foob…", Ascii.truncate("foobar", 5, "…"));
950888a09821a98ac0680fad765217302858e70fa4Paul Duffin    assertEquals("foo", Ascii.truncate("foobar", 3, ""));
960888a09821a98ac0680fad765217302858e70fa4Paul Duffin    assertEquals("", Ascii.truncate("", 5, ""));
970888a09821a98ac0680fad765217302858e70fa4Paul Duffin    assertEquals("", Ascii.truncate("", 5, "..."));
980888a09821a98ac0680fad765217302858e70fa4Paul Duffin    assertEquals("", Ascii.truncate("", 0, ""));
990888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
1000888a09821a98ac0680fad765217302858e70fa4Paul Duffin
1010888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public void testTruncateIllegalArguments() {
1020888a09821a98ac0680fad765217302858e70fa4Paul Duffin    String truncated = null;
1030888a09821a98ac0680fad765217302858e70fa4Paul Duffin    try {
1040888a09821a98ac0680fad765217302858e70fa4Paul Duffin      truncated = Ascii.truncate("foobar", 2, "...");
1050888a09821a98ac0680fad765217302858e70fa4Paul Duffin      fail();
1060888a09821a98ac0680fad765217302858e70fa4Paul Duffin    } catch (IllegalArgumentException expected) {}
1070888a09821a98ac0680fad765217302858e70fa4Paul Duffin
1080888a09821a98ac0680fad765217302858e70fa4Paul Duffin    try {
1090888a09821a98ac0680fad765217302858e70fa4Paul Duffin      truncated = Ascii.truncate("foobar", 8, "1234567890");
1100888a09821a98ac0680fad765217302858e70fa4Paul Duffin      fail();
1110888a09821a98ac0680fad765217302858e70fa4Paul Duffin    } catch (IllegalArgumentException expected) {}
1120888a09821a98ac0680fad765217302858e70fa4Paul Duffin
1130888a09821a98ac0680fad765217302858e70fa4Paul Duffin    try {
1140888a09821a98ac0680fad765217302858e70fa4Paul Duffin      truncated = Ascii.truncate("foobar", -1, "...");
1150888a09821a98ac0680fad765217302858e70fa4Paul Duffin      fail();
1160888a09821a98ac0680fad765217302858e70fa4Paul Duffin    } catch (IllegalArgumentException expected) {}
1170888a09821a98ac0680fad765217302858e70fa4Paul Duffin
1180888a09821a98ac0680fad765217302858e70fa4Paul Duffin    try {
1190888a09821a98ac0680fad765217302858e70fa4Paul Duffin      truncated = Ascii.truncate("foobar", -1, "");
1200888a09821a98ac0680fad765217302858e70fa4Paul Duffin      fail();
1210888a09821a98ac0680fad765217302858e70fa4Paul Duffin    } catch (IllegalArgumentException expected) {}
1220888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
1230888a09821a98ac0680fad765217302858e70fa4Paul Duffin
1240888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public void testEqualsIgnoreCase() {
1250888a09821a98ac0680fad765217302858e70fa4Paul Duffin    assertTrue(Ascii.equalsIgnoreCase("", ""));
1260888a09821a98ac0680fad765217302858e70fa4Paul Duffin    assertFalse(Ascii.equalsIgnoreCase("", "x"));
1270888a09821a98ac0680fad765217302858e70fa4Paul Duffin    assertFalse(Ascii.equalsIgnoreCase("x", ""));
1280888a09821a98ac0680fad765217302858e70fa4Paul Duffin    assertTrue(Ascii.equalsIgnoreCase(LOWER, UPPER));
1290888a09821a98ac0680fad765217302858e70fa4Paul Duffin    assertTrue(Ascii.equalsIgnoreCase(UPPER, LOWER));
1300888a09821a98ac0680fad765217302858e70fa4Paul Duffin    // Create new strings here to avoid early-out logic.
1310888a09821a98ac0680fad765217302858e70fa4Paul Duffin    assertTrue(Ascii.equalsIgnoreCase(new String(IGNORED), new String(IGNORED)));
1320888a09821a98ac0680fad765217302858e70fa4Paul Duffin    // Compare to: "\u00c1".equalsIgnoreCase("\u00e1") == true
1330888a09821a98ac0680fad765217302858e70fa4Paul Duffin    assertFalse(Ascii.equalsIgnoreCase("\u00c1", "\u00e1"));
1340888a09821a98ac0680fad765217302858e70fa4Paul Duffin    // Test chars just outside the alphabetic range ('A'-1 vs 'a'-1, 'Z'+1 vs 'z'+1)
1350888a09821a98ac0680fad765217302858e70fa4Paul Duffin    assertFalse(Ascii.equalsIgnoreCase("@", "`"));
1360888a09821a98ac0680fad765217302858e70fa4Paul Duffin    assertFalse(Ascii.equalsIgnoreCase("[", "{"));
1370888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
1380888a09821a98ac0680fad765217302858e70fa4Paul Duffin
1393ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  @GwtIncompatible("String.toUpperCase() has browser semantics")
1400888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public void testEqualsIgnoreCaseUnicodeEquivalence() {
1410888a09821a98ac0680fad765217302858e70fa4Paul Duffin    // Note that it's possible in future that the JDK's idea to toUpperCase() or equalsIgnoreCase()
1420888a09821a98ac0680fad765217302858e70fa4Paul Duffin    // may change and break assumptions in this test [*]. This is not a bug in the implementation of
1430888a09821a98ac0680fad765217302858e70fa4Paul Duffin    // Ascii.equalsIgnoreCase(), but it is a signal that its documentation may need updating as
1440888a09821a98ac0680fad765217302858e70fa4Paul Duffin    // regards edge cases.
1450888a09821a98ac0680fad765217302858e70fa4Paul Duffin
1460888a09821a98ac0680fad765217302858e70fa4Paul Duffin    // The Unicode point {@code 00df} is the lowercase form of sharp-S (ß), whose uppercase is "SS".
1470888a09821a98ac0680fad765217302858e70fa4Paul Duffin    assertEquals("pa\u00dfword".toUpperCase(), "PASSWORD");    // [*]
1480888a09821a98ac0680fad765217302858e70fa4Paul Duffin    assertFalse("pa\u00dfword".equalsIgnoreCase("PASSWORD"));  // [*]
1490888a09821a98ac0680fad765217302858e70fa4Paul Duffin    assertFalse(Ascii.equalsIgnoreCase("pa\u00dfword", "PASSWORD"));
1500888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
1511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert}
152