|  | package backport; | 
|  |  | 
|  | public final class StringBackportJava11Main { | 
|  | public static void main(String[] args) { | 
|  | testRepeat(); | 
|  | testIsBlank(); | 
|  | testStrip(); | 
|  | testStripLeading(); | 
|  | testStripTrailing(); | 
|  | } | 
|  |  | 
|  | private static void testRepeat() { | 
|  | try { | 
|  | throw new AssertionError("hey".repeat(-1)); | 
|  | } catch (IllegalArgumentException e) { | 
|  | assertEquals("count is negative: -1", e.getMessage()); | 
|  | } | 
|  |  | 
|  | assertEquals("", "".repeat(0)); | 
|  | assertEquals("", "".repeat(1)); | 
|  | assertEquals("", "".repeat(2)); | 
|  |  | 
|  | assertEquals("", "hey".repeat(0)); | 
|  | assertEquals("hey", "hey".repeat(1)); | 
|  | assertEquals("heyhey", "hey".repeat(2)); | 
|  | assertEquals("heyheyhey", "hey".repeat(3)); | 
|  | assertEquals("heyheyheyhey", "hey".repeat(4)); | 
|  |  | 
|  | try { | 
|  | "\u03B1\u03B2".repeat(Integer.MAX_VALUE); | 
|  | throw new AssertionError("Expected to throw OutOfMemoryError"); | 
|  | } catch (OutOfMemoryError e) { | 
|  | // Expected. | 
|  | } | 
|  | } | 
|  |  | 
|  | /** Per {@link Character#isWhitespace(int)} */ | 
|  | private static final String WHITESPACE = "" | 
|  | // Unicode "Zs" category: | 
|  | + "\u0020" | 
|  | + "\u1680" | 
|  | //+ "\u00A0" Exception per Javadoc | 
|  | + "\u1680" | 
|  | + "\u2000" | 
|  | + "\u2001" | 
|  | + "\u2002" | 
|  | + "\u2003" | 
|  | + "\u2004" | 
|  | + "\u2005" | 
|  | + "\u2006" | 
|  | //+ "\u2007" Exception per Javadoc | 
|  | + "\u2008" | 
|  | + "\u2009" | 
|  | + "\u200A" | 
|  | //+ "\u200F" Exception per Javadoc | 
|  | //+ "\u205F" Not honored on Android 4.0.4 | 
|  | + "\u3000" | 
|  | // Unicode "Zl" category: | 
|  | + "\u2028" | 
|  | // Unicode "Zp" category: | 
|  | + "\u2029" | 
|  | // Others: | 
|  | + "\t" | 
|  | + "\n" | 
|  | + "\u000B" | 
|  | + "\f" | 
|  | + "\r" | 
|  | + "\u001C" | 
|  | + "\u001D" | 
|  | + "\u001E" | 
|  | + "\u001F" | 
|  | ; | 
|  |  | 
|  | public static void testIsBlank() { | 
|  | assertEquals(true, "".isBlank()); | 
|  | assertEquals(true, WHITESPACE.isBlank()); | 
|  |  | 
|  | // Android <=4.0.4 does not recognize this as whitespace. Just ensure local consistency. | 
|  | assertEquals(Character.isWhitespace(0x205F), "\u205F".isBlank()); | 
|  |  | 
|  | assertEquals(false, "a".isBlank()); | 
|  | assertEquals(false, "å".isBlank()); | 
|  | assertEquals(false, "a\u030A".isBlank()); | 
|  | assertEquals(false, "\uD83D\uDE00".isBlank()); | 
|  | assertEquals(false, (WHITESPACE + "a").isBlank()); | 
|  | assertEquals(false, ("a" + WHITESPACE).isBlank()); | 
|  | } | 
|  |  | 
|  | public static void testStrip() { | 
|  | assertEquals("", "".strip()); | 
|  | assertEquals("", WHITESPACE.strip()); | 
|  | assertEquals("a", "a".strip()); | 
|  | assertEquals("a", (WHITESPACE + "a").strip()); | 
|  | assertEquals("a", ("a" + WHITESPACE).strip()); | 
|  | assertEquals("a", (WHITESPACE + "a" + WHITESPACE).strip()); | 
|  | assertEquals("a" + WHITESPACE + "a", ("a" + WHITESPACE + "a").strip()); | 
|  | assertEquals("a" + WHITESPACE + "a", (WHITESPACE + "a" + WHITESPACE + "a").strip()); | 
|  | assertEquals("a" + WHITESPACE + "a", ("a" + WHITESPACE + "a" + WHITESPACE).strip()); | 
|  | assertEquals("a" + WHITESPACE + "a", | 
|  | (WHITESPACE + "a" + WHITESPACE + "a" + WHITESPACE).strip()); | 
|  | } | 
|  |  | 
|  | public static void testStripLeading() { | 
|  | assertEquals("", "".stripLeading()); | 
|  | assertEquals("", WHITESPACE.stripLeading()); | 
|  | assertEquals("a", "a".stripLeading()); | 
|  | assertEquals("a", (WHITESPACE + "a").stripLeading()); | 
|  | assertEquals("a" + WHITESPACE, ("a" + WHITESPACE).stripLeading()); | 
|  | assertEquals("a" + WHITESPACE, (WHITESPACE + "a" + WHITESPACE).stripLeading()); | 
|  | assertEquals("a" + WHITESPACE + "a", ("a" + WHITESPACE + "a").stripLeading()); | 
|  | assertEquals("a" + WHITESPACE + "a", (WHITESPACE + "a" + WHITESPACE + "a").stripLeading()); | 
|  | assertEquals("a" + WHITESPACE + "a" + WHITESPACE, | 
|  | ("a" + WHITESPACE + "a" + WHITESPACE).stripLeading()); | 
|  | assertEquals("a" + WHITESPACE + "a" + WHITESPACE, | 
|  | (WHITESPACE + "a" + WHITESPACE + "a" + WHITESPACE).stripLeading()); | 
|  | } | 
|  |  | 
|  | public static void testStripTrailing() { | 
|  | assertEquals("", "".stripTrailing()); | 
|  | assertEquals("", WHITESPACE.stripTrailing()); | 
|  | assertEquals("a", "a".stripTrailing()); | 
|  | assertEquals(WHITESPACE + "a", (WHITESPACE + "a").stripTrailing()); | 
|  | assertEquals("a", ("a" + WHITESPACE).stripTrailing()); | 
|  | assertEquals(WHITESPACE + "a", (WHITESPACE + "a" + WHITESPACE).stripTrailing()); | 
|  | assertEquals("a" + WHITESPACE + "a", ("a" + WHITESPACE + "a").stripTrailing()); | 
|  | assertEquals(WHITESPACE + "a" + WHITESPACE + "a", | 
|  | (WHITESPACE + "a" + WHITESPACE + "a").stripTrailing()); | 
|  | assertEquals("a" + WHITESPACE + "a", ("a" + WHITESPACE + "a" + WHITESPACE).stripTrailing()); | 
|  | assertEquals(WHITESPACE + "a" + WHITESPACE + "a", | 
|  | (WHITESPACE + "a" + WHITESPACE + "a" + WHITESPACE).stripTrailing()); | 
|  | } | 
|  |  | 
|  | private static void assertEquals(Object expected, Object actual) { | 
|  | if (expected != actual && (expected == null || !expected.equals(actual))) { | 
|  | throw new AssertionError("Expected <" + expected + "> but was <" + actual + '>'); | 
|  | } | 
|  | } | 
|  | } |