Backport String.isBlank/strip/stripLeading/stripTrailing

Test: tools/test.py --dex_vm all --no-internal -v *Backport*Test*
Test: tools/test.py --no-internal -v *GenerateBackportMethods*
Change-Id: I8741da099597e06e7115ef92c2e622d67f8bb0a3
diff --git a/src/test/examplesJava11/backport/StringBackportJava11Main.java b/src/test/examplesJava11/backport/StringBackportJava11Main.java
index 2af923e..6af33fa 100644
--- a/src/test/examplesJava11/backport/StringBackportJava11Main.java
+++ b/src/test/examplesJava11/backport/StringBackportJava11Main.java
@@ -3,6 +3,10 @@
 public final class StringBackportJava11Main {
   public static void main(String[] args) {
     testRepeat();
+    testIsBlank();
+    testStrip();
+    testStripLeading();
+    testStripTrailing();
   }
 
   private static void testRepeat() {
@@ -23,6 +27,102 @@
     assertEquals("heyheyheyhey", "hey".repeat(4));
   }
 
+  /** 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 + '>');