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