| 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 + '>'); | 
 |     } | 
 |   } | 
 | } |