Move backport test to java 11 package

Bug: b/380808556
Change-Id: I6fb814aba2be9cba076912db970efa92cc4f3558
diff --git a/d8_r8/test_modules/tests_java_11/build.gradle.kts b/d8_r8/test_modules/tests_java_11/build.gradle.kts
index bb30566..12a7681 100644
--- a/d8_r8/test_modules/tests_java_11/build.gradle.kts
+++ b/d8_r8/test_modules/tests_java_11/build.gradle.kts
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import org.gradle.api.JavaVersion
-import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
 
 plugins {
   `kotlin-dsl`
diff --git a/src/test/examplesJava11/backport/CharSequenceBackportJava11Main.java b/src/test/examplesJava11/backport/CharSequenceBackportJava11Main.java
deleted file mode 100644
index d0888f8..0000000
--- a/src/test/examplesJava11/backport/CharSequenceBackportJava11Main.java
+++ /dev/null
@@ -1,46 +0,0 @@
-package backport;
-
-public final class CharSequenceBackportJava11Main {
-  public static void main(String[] args) {
-    testCompare();
-  }
-
-  private static void testCompare() {
-    assertTrue(CharSequence.compare("Hello", "Hello") == 0);
-
-    assertTrue(CharSequence.compare("Hey", "Hello") > 0);
-    assertTrue(CharSequence.compare("Hello", "Hey") < 0);
-
-    assertTrue(CharSequence.compare("Hel", "Hello") < 0);
-    assertTrue(CharSequence.compare("Hello", "Hel") > 0);
-
-    assertTrue(CharSequence.compare("", "") == 0);
-    assertTrue(CharSequence.compare("", "Hello") < 0);
-    assertTrue(CharSequence.compare("Hello", "") > 0);
-
-    // Different CharSequence types:
-    assertTrue(CharSequence.compare("Hello", new StringBuilder("Hello")) == 0);
-    assertTrue(CharSequence.compare(new StringBuffer("hey"), "Hello") > 0);
-    assertTrue(CharSequence.compare(new StringBuffer("Hello"), new StringBuilder("Hey")) < 0);
-
-    try {
-      throw new AssertionError(CharSequence.compare(null, "Hello"));
-    } catch (NullPointerException expected) {
-    }
-    try {
-      throw new AssertionError(CharSequence.compare("Hello", null));
-    } catch (NullPointerException expected) {
-    }
-    try {
-      // Ensure a == b fast path does not happen before null checks.
-      throw new AssertionError(CharSequence.compare(null, null));
-    } catch (NullPointerException expected) {
-    }
-  }
-
-  private static void assertTrue(boolean value) {
-    if (!value) {
-      throw new AssertionError("Expected <true> but was <false>");
-    }
-  }
-}
diff --git a/src/test/examplesJava11/backport/CharSequenceBackportJava11Test.java b/src/test/examplesJava11/backport/CharSequenceBackportJava11Test.java
new file mode 100644
index 0000000..dad526c
--- /dev/null
+++ b/src/test/examplesJava11/backport/CharSequenceBackportJava11Test.java
@@ -0,0 +1,75 @@
+// Copyright (c) 2020, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+package backport;
+
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.TestRuntime.CfVm;
+import com.android.tools.r8.desugar.backports.AbstractBackportTest;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
+
+@RunWith(Parameterized.class)
+public final class CharSequenceBackportJava11Test extends AbstractBackportTest {
+  @Parameters(name = "{0}")
+  public static Iterable<?> data() {
+    return getTestParameters()
+        .withDexRuntimes()
+        .withCfRuntimesStartingFromIncluding(CfVm.JDK11)
+        .withAllApiLevelsAlsoForCf()
+        .build();
+  }
+
+  public CharSequenceBackportJava11Test(TestParameters parameters) {
+    super(parameters, Character.class, CharSequenceBackportJava11Main.class);
+    // Note: None of the methods in this test exist in the latest android.jar. If/when they ship in
+    // an actual API level, migrate these tests to CharacterBackportTest.
+  }
+
+  public static class CharSequenceBackportJava11Main {
+    public static void main(String[] args) {
+      testCompare();
+    }
+
+    private static void testCompare() {
+      assertTrue(CharSequence.compare("Hello", "Hello") == 0);
+
+      assertTrue(CharSequence.compare("Hey", "Hello") > 0);
+      assertTrue(CharSequence.compare("Hello", "Hey") < 0);
+
+      assertTrue(CharSequence.compare("Hel", "Hello") < 0);
+      assertTrue(CharSequence.compare("Hello", "Hel") > 0);
+
+      assertTrue(CharSequence.compare("", "") == 0);
+      assertTrue(CharSequence.compare("", "Hello") < 0);
+      assertTrue(CharSequence.compare("Hello", "") > 0);
+
+      // Different CharSequence types:
+      assertTrue(CharSequence.compare("Hello", new StringBuilder("Hello")) == 0);
+      assertTrue(CharSequence.compare(new StringBuffer("hey"), "Hello") > 0);
+      assertTrue(CharSequence.compare(new StringBuffer("Hello"), new StringBuilder("Hey")) < 0);
+
+      try {
+        throw new AssertionError(CharSequence.compare(null, "Hello"));
+      } catch (NullPointerException expected) {
+      }
+      try {
+        throw new AssertionError(CharSequence.compare("Hello", null));
+      } catch (NullPointerException expected) {
+      }
+      try {
+        // Ensure a == b fast path does not happen before null checks.
+        throw new AssertionError(CharSequence.compare(null, null));
+      } catch (NullPointerException expected) {
+      }
+    }
+
+    private static void assertTrue(boolean value) {
+      if (!value) {
+        throw new AssertionError("Expected <true> but was <false>");
+      }
+    }
+  }
+}
diff --git a/src/test/examplesJava11/backport/OptionalBackportJava11Main.java b/src/test/examplesJava11/backport/OptionalBackportJava11Main.java
deleted file mode 100644
index d1f6fa1..0000000
--- a/src/test/examplesJava11/backport/OptionalBackportJava11Main.java
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright (c) 2019, the R8 project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-package backport;
-
-import java.util.Optional;
-
-public final class OptionalBackportJava11Main {
-
-  public static void main(String[] args) {
-    testIsEmpty();
-  }
-
-  private static void testIsEmpty() {
-    Optional<String> present = Optional.of("hey");
-    assertFalse(present.isEmpty());
-
-    Optional<String> absent = Optional.empty();
-    assertTrue(absent.isEmpty());
-  }
-
-  private static void assertTrue(boolean value) {
-    if (!value) {
-      throw new AssertionError("Expected <true> but was <false>");
-    }
-  }
-
-  private static void assertFalse(boolean value) {
-    if (value) {
-      throw new AssertionError("Expected <false> but was <true>");
-    }
-  }
-}
diff --git a/src/test/java/com/android/tools/r8/desugar/backports/OptionalBackportJava11Test.java b/src/test/examplesJava11/backport/OptionalBackportJava11Test.java
similarity index 62%
rename from src/test/java/com/android/tools/r8/desugar/backports/OptionalBackportJava11Test.java
rename to src/test/examplesJava11/backport/OptionalBackportJava11Test.java
index a7255b6..ebbf952 100644
--- a/src/test/java/com/android/tools/r8/desugar/backports/OptionalBackportJava11Test.java
+++ b/src/test/examplesJava11/backport/OptionalBackportJava11Test.java
@@ -2,17 +2,13 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-package com.android.tools.r8.desugar.backports;
-
-import static com.android.tools.r8.utils.FileUtils.JAR_EXTENSION;
+package backport;
 
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestRuntime.CfVm;
-import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.ToolHelper.DexVm.Version;
+import com.android.tools.r8.desugar.backports.AbstractBackportTest;
 import com.android.tools.r8.utils.AndroidApiLevel;
-import java.nio.file.Path;
-import java.nio.file.Paths;
 import java.util.Optional;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
@@ -30,11 +26,8 @@
         .build();
   }
 
-  private static final Path TEST_JAR =
-      Paths.get(ToolHelper.EXAMPLES_JAVA11_JAR_DIR).resolve("backport" + JAR_EXTENSION);
-
   public OptionalBackportJava11Test(TestParameters parameters) {
-    super(parameters, Optional.class, TEST_JAR, "backport.OptionalBackportJava11Main");
+    super(parameters, Optional.class, OptionalBackportJava11Main.class);
     // Note: The methods in this test exist in android.jar from Android T. When R8 builds targeting
     // Java 11 move these tests to OptionalBackportTest (out of examplesJava11).
 
@@ -44,4 +37,31 @@
 
     registerTarget(AndroidApiLevel.T, 2);
   }
+
+  public static class OptionalBackportJava11Main {
+
+    public static void main(String[] args) {
+      testIsEmpty();
+    }
+
+    private static void testIsEmpty() {
+      Optional<String> present = Optional.of("hey");
+      assertFalse(present.isEmpty());
+
+      Optional<String> absent = Optional.empty();
+      assertTrue(absent.isEmpty());
+    }
+
+    private static void assertTrue(boolean value) {
+      if (!value) {
+        throw new AssertionError("Expected <true> but was <false>");
+      }
+    }
+
+    private static void assertFalse(boolean value) {
+      if (value) {
+        throw new AssertionError("Expected <false> but was <true>");
+      }
+    }
+  }
 }
diff --git a/src/test/examplesJava11/backport/OptionalDoubleBackportJava11Main.java b/src/test/examplesJava11/backport/OptionalDoubleBackportJava11Main.java
deleted file mode 100644
index 1fa5617..0000000
--- a/src/test/examplesJava11/backport/OptionalDoubleBackportJava11Main.java
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright (c) 2019, the R8 project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-package backport;
-
-import java.util.OptionalDouble;
-
-public final class OptionalDoubleBackportJava11Main {
-
-  public static void main(String[] args) {
-    testIsEmpty();
-  }
-
-  private static void testIsEmpty() {
-    OptionalDouble present = OptionalDouble.of(2d);
-    assertFalse(present.isEmpty());
-
-    OptionalDouble absent = OptionalDouble.empty();
-    assertTrue(absent.isEmpty());
-  }
-
-  private static void assertTrue(boolean value) {
-    if (!value) {
-      throw new AssertionError("Expected <true> but was <false>");
-    }
-  }
-
-  private static void assertFalse(boolean value) {
-    if (value) {
-      throw new AssertionError("Expected <false> but was <true>");
-    }
-  }
-}
diff --git a/src/test/java/com/android/tools/r8/desugar/backports/OptionalDoubleBackportJava11Test.java b/src/test/examplesJava11/backport/OptionalDoubleBackportJava11Test.java
similarity index 62%
rename from src/test/java/com/android/tools/r8/desugar/backports/OptionalDoubleBackportJava11Test.java
rename to src/test/examplesJava11/backport/OptionalDoubleBackportJava11Test.java
index 377ed2e..de629a1 100644
--- a/src/test/java/com/android/tools/r8/desugar/backports/OptionalDoubleBackportJava11Test.java
+++ b/src/test/examplesJava11/backport/OptionalDoubleBackportJava11Test.java
@@ -2,17 +2,13 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-package com.android.tools.r8.desugar.backports;
-
-import static com.android.tools.r8.utils.FileUtils.JAR_EXTENSION;
+package backport;
 
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestRuntime.CfVm;
-import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.ToolHelper.DexVm.Version;
+import com.android.tools.r8.desugar.backports.AbstractBackportTest;
 import com.android.tools.r8.utils.AndroidApiLevel;
-import java.nio.file.Path;
-import java.nio.file.Paths;
 import java.util.OptionalDouble;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
@@ -30,11 +26,8 @@
         .build();
   }
 
-  private static final Path TEST_JAR =
-      Paths.get(ToolHelper.EXAMPLES_JAVA11_JAR_DIR).resolve("backport" + JAR_EXTENSION);
-
   public OptionalDoubleBackportJava11Test(TestParameters parameters) {
-    super(parameters, OptionalDouble.class, TEST_JAR, "backport.OptionalDoubleBackportJava11Main");
+    super(parameters, OptionalDouble.class, OptionalDoubleBackportJava11Main.class);
     // Note: The methods in this test exist in android.jar from Android T. When R8 builds targeting
     // Java 11 move these tests to OptionalBackportTest (out of examplesJava11).
 
@@ -44,4 +37,31 @@
 
     registerTarget(AndroidApiLevel.T, 2);
   }
+
+  public static class OptionalDoubleBackportJava11Main {
+
+    public static void main(String[] args) {
+      testIsEmpty();
+    }
+
+    private static void testIsEmpty() {
+      OptionalDouble present = OptionalDouble.of(2d);
+      assertFalse(present.isEmpty());
+
+      OptionalDouble absent = OptionalDouble.empty();
+      assertTrue(absent.isEmpty());
+    }
+
+    private static void assertTrue(boolean value) {
+      if (!value) {
+        throw new AssertionError("Expected <true> but was <false>");
+      }
+    }
+
+    private static void assertFalse(boolean value) {
+      if (value) {
+        throw new AssertionError("Expected <false> but was <true>");
+      }
+    }
+  }
 }
diff --git a/src/test/examplesJava11/backport/OptionalIntBackportJava11Main.java b/src/test/examplesJava11/backport/OptionalIntBackportJava11Main.java
deleted file mode 100644
index 9d1a09a..0000000
--- a/src/test/examplesJava11/backport/OptionalIntBackportJava11Main.java
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright (c) 2019, the R8 project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-package backport;
-
-import java.util.OptionalInt;
-
-public final class OptionalIntBackportJava11Main {
-
-  public static void main(String[] args) {
-    testIsEmpty();
-  }
-
-  private static void testIsEmpty() {
-    OptionalInt present = OptionalInt.of(2);
-    assertFalse(present.isEmpty());
-
-    OptionalInt absent = OptionalInt.empty();
-    assertTrue(absent.isEmpty());
-  }
-
-  private static void assertTrue(boolean value) {
-    if (!value) {
-      throw new AssertionError("Expected <true> but was <false>");
-    }
-  }
-
-  private static void assertFalse(boolean value) {
-    if (value) {
-      throw new AssertionError("Expected <false> but was <true>");
-    }
-  }
-}
diff --git a/src/test/java/com/android/tools/r8/desugar/backports/OptionalIntBackportJava11Test.java b/src/test/examplesJava11/backport/OptionalIntBackportJava11Test.java
similarity index 62%
rename from src/test/java/com/android/tools/r8/desugar/backports/OptionalIntBackportJava11Test.java
rename to src/test/examplesJava11/backport/OptionalIntBackportJava11Test.java
index 95c6adc..90d40ef 100644
--- a/src/test/java/com/android/tools/r8/desugar/backports/OptionalIntBackportJava11Test.java
+++ b/src/test/examplesJava11/backport/OptionalIntBackportJava11Test.java
@@ -2,17 +2,13 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-package com.android.tools.r8.desugar.backports;
-
-import static com.android.tools.r8.utils.FileUtils.JAR_EXTENSION;
+package backport;
 
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestRuntime.CfVm;
-import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.ToolHelper.DexVm.Version;
+import com.android.tools.r8.desugar.backports.AbstractBackportTest;
 import com.android.tools.r8.utils.AndroidApiLevel;
-import java.nio.file.Path;
-import java.nio.file.Paths;
 import java.util.OptionalInt;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
@@ -30,11 +26,8 @@
         .build();
   }
 
-  private static final Path TEST_JAR =
-      Paths.get(ToolHelper.EXAMPLES_JAVA11_JAR_DIR).resolve("backport" + JAR_EXTENSION);
-
   public OptionalIntBackportJava11Test(TestParameters parameters) {
-    super(parameters, OptionalInt.class, TEST_JAR, "backport.OptionalIntBackportJava11Main");
+    super(parameters, OptionalInt.class, OptionalIntBackportJava11Main.class);
     // Note: The methods in this test exist in android.jar from Android T. When R8 builds targeting
     // Java 11 move these tests to OptionalBackportTest (out of examplesJava11).
 
@@ -44,4 +37,31 @@
 
     registerTarget(AndroidApiLevel.T, 2);
   }
+
+  public static class OptionalIntBackportJava11Main {
+
+    public static void main(String[] args) {
+      testIsEmpty();
+    }
+
+    private static void testIsEmpty() {
+      OptionalInt present = OptionalInt.of(2);
+      assertFalse(present.isEmpty());
+
+      OptionalInt absent = OptionalInt.empty();
+      assertTrue(absent.isEmpty());
+    }
+
+    private static void assertTrue(boolean value) {
+      if (!value) {
+        throw new AssertionError("Expected <true> but was <false>");
+      }
+    }
+
+    private static void assertFalse(boolean value) {
+      if (value) {
+        throw new AssertionError("Expected <false> but was <true>");
+      }
+    }
+  }
 }
diff --git a/src/test/examplesJava11/backport/OptionalLongBackportJava11Main.java b/src/test/examplesJava11/backport/OptionalLongBackportJava11Main.java
deleted file mode 100644
index 573bbba..0000000
--- a/src/test/examplesJava11/backport/OptionalLongBackportJava11Main.java
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright (c) 2019, the R8 project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-package backport;
-
-import java.util.OptionalLong;
-
-public final class OptionalLongBackportJava11Main {
-
-  public static void main(String[] args) {
-    testIsEmpty();
-  }
-
-  private static void testIsEmpty() {
-    OptionalLong present = OptionalLong.of(2L);
-    assertFalse(present.isEmpty());
-
-    OptionalLong absent = OptionalLong.empty();
-    assertTrue(absent.isEmpty());
-  }
-
-  private static void assertTrue(boolean value) {
-    if (!value) {
-      throw new AssertionError("Expected <true> but was <false>");
-    }
-  }
-
-  private static void assertFalse(boolean value) {
-    if (value) {
-      throw new AssertionError("Expected <false> but was <true>");
-    }
-  }
-}
diff --git a/src/test/java/com/android/tools/r8/desugar/backports/OptionalLongBackportJava11Test.java b/src/test/examplesJava11/backport/OptionalLongBackportJava11Test.java
similarity index 62%
rename from src/test/java/com/android/tools/r8/desugar/backports/OptionalLongBackportJava11Test.java
rename to src/test/examplesJava11/backport/OptionalLongBackportJava11Test.java
index 7333cb9..b6f9e43 100644
--- a/src/test/java/com/android/tools/r8/desugar/backports/OptionalLongBackportJava11Test.java
+++ b/src/test/examplesJava11/backport/OptionalLongBackportJava11Test.java
@@ -2,17 +2,13 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-package com.android.tools.r8.desugar.backports;
-
-import static com.android.tools.r8.utils.FileUtils.JAR_EXTENSION;
+package backport;
 
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestRuntime.CfVm;
-import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.ToolHelper.DexVm.Version;
+import com.android.tools.r8.desugar.backports.AbstractBackportTest;
 import com.android.tools.r8.utils.AndroidApiLevel;
-import java.nio.file.Path;
-import java.nio.file.Paths;
 import java.util.OptionalLong;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
@@ -30,11 +26,8 @@
         .build();
   }
 
-  private static final Path TEST_JAR =
-      Paths.get(ToolHelper.EXAMPLES_JAVA11_JAR_DIR).resolve("backport" + JAR_EXTENSION);
-
   public OptionalLongBackportJava11Test(TestParameters parameters) {
-    super(parameters, OptionalLong.class, TEST_JAR, "backport.OptionalLongBackportJava11Main");
+    super(parameters, OptionalLong.class, OptionalLongBackportJava11Main.class);
     // Note: The methods in this test exist in android.jar from Android T. When R8 builds targeting
     // Java 11 move these tests to OptionalBackportTest (out of examplesJava11).
 
@@ -44,4 +37,31 @@
 
     registerTarget(AndroidApiLevel.T, 2);
   }
+
+  public static class OptionalLongBackportJava11Main {
+
+    public static void main(String[] args) {
+      testIsEmpty();
+    }
+
+    private static void testIsEmpty() {
+      OptionalLong present = OptionalLong.of(2L);
+      assertFalse(present.isEmpty());
+
+      OptionalLong absent = OptionalLong.empty();
+      assertTrue(absent.isEmpty());
+    }
+
+    private static void assertTrue(boolean value) {
+      if (!value) {
+        throw new AssertionError("Expected <true> but was <false>");
+      }
+    }
+
+    private static void assertFalse(boolean value) {
+      if (value) {
+        throw new AssertionError("Expected <false> but was <true>");
+      }
+    }
+  }
 }
diff --git a/src/test/examplesJava11/backport/PredicateBackportJava11Main.java b/src/test/examplesJava11/backport/PredicateBackportJava11Main.java
deleted file mode 100644
index d16674a..0000000
--- a/src/test/examplesJava11/backport/PredicateBackportJava11Main.java
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright (c) 2022, the R8 project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-package backport;
-
-import java.util.Objects;
-import java.util.function.Predicate;
-
-public final class PredicateBackportJava11Main {
-  public static void main(String[] args) {
-    testNot();
-  }
-
-  private static void testNot() {
-
-    Predicate<Object> isNull = Objects::isNull;
-    Predicate<Object> notNull = Predicate.not(isNull);
-
-    assertEquals(notNull.test(null), false);
-    assertEquals(notNull.test("something"), true);
-
-    try {
-      Predicate.not(null);
-      throw new AssertionError("Expected to throw NPE");
-    } catch (Throwable t) {
-      // Expected.
-    }
-  }
-
-  private static void assertEquals(Object expected, Object actual) {
-    if (expected != actual && (expected == null || !expected.equals(actual))) {
-      throw new AssertionError("Expected <" + expected + "> but was <" + actual + '>');
-    }
-  }
-}
diff --git a/src/test/examplesJava11/backport/PredicateBackportJava11Test.java b/src/test/examplesJava11/backport/PredicateBackportJava11Test.java
new file mode 100644
index 0000000..e8a28c6
--- /dev/null
+++ b/src/test/examplesJava11/backport/PredicateBackportJava11Test.java
@@ -0,0 +1,65 @@
+// Copyright (c) 2022, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+package backport;
+
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.TestRuntime.CfVm;
+import com.android.tools.r8.ToolHelper.DexVm.Version;
+import com.android.tools.r8.desugar.backports.AbstractBackportTest;
+import com.android.tools.r8.utils.AndroidApiLevel;
+import java.util.Objects;
+import java.util.OptionalLong;
+import java.util.function.Predicate;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
+
+@RunWith(Parameterized.class)
+public final class PredicateBackportJava11Test extends AbstractBackportTest {
+  @Parameters(name = "{0}")
+  public static Iterable<?> data() {
+    return getTestParameters()
+        .withDexRuntimesStartingFromIncluding(Version.V7_0_0)
+        .withApiLevelsStartingAtIncluding(AndroidApiLevel.N)
+        .withCfRuntimesStartingFromIncluding(CfVm.JDK11)
+        .enableApiLevelsForCf()
+        .build();
+  }
+
+  public PredicateBackportJava11Test(TestParameters parameters) {
+    super(parameters, OptionalLong.class, PredicateBackportJava11Main.class);
+
+    // Available since N as part of library desugaring.
+    ignoreInvokes("not");
+  }
+
+  public static class PredicateBackportJava11Main {
+    public static void main(String[] args) {
+      testNot();
+    }
+
+    private static void testNot() {
+
+      Predicate<Object> isNull = Objects::isNull;
+      Predicate<Object> notNull = Predicate.not(isNull);
+
+      assertEquals(notNull.test(null), false);
+      assertEquals(notNull.test("something"), true);
+
+      try {
+        Predicate.not(null);
+        throw new AssertionError("Expected to throw NPE");
+      } catch (Throwable t) {
+        // Expected.
+      }
+    }
+
+    private static void assertEquals(Object expected, Object actual) {
+      if (expected != actual && (expected == null || !expected.equals(actual))) {
+        throw new AssertionError("Expected <" + expected + "> but was <" + actual + '>');
+      }
+    }
+  }
+}
diff --git a/src/test/examplesJava11/backport/StringBackportJava11Main.java b/src/test/examplesJava11/backport/StringBackportJava11Main.java
deleted file mode 100644
index eaf2f8a..0000000
--- a/src/test/examplesJava11/backport/StringBackportJava11Main.java
+++ /dev/null
@@ -1,138 +0,0 @@
-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 + '>');
-    }
-  }
-}
diff --git a/src/test/examplesJava11/backport/StringBackportJava11Test.java b/src/test/examplesJava11/backport/StringBackportJava11Test.java
new file mode 100644
index 0000000..bb11b5e
--- /dev/null
+++ b/src/test/examplesJava11/backport/StringBackportJava11Test.java
@@ -0,0 +1,156 @@
+// Copyright (c) 2019, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+package backport;
+
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.TestRuntime.CfVm;
+import com.android.tools.r8.desugar.backports.AbstractBackportTest;
+import com.android.tools.r8.utils.AndroidApiLevel;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
+
+@RunWith(Parameterized.class)
+public final class StringBackportJava11Test extends AbstractBackportTest {
+  @Parameters(name = "{0}")
+  public static Iterable<?> data() {
+    return getTestParameters()
+        .withDexRuntimes()
+        .withCfRuntimesStartingFromIncluding(CfVm.JDK11)
+        .withAllApiLevelsAlsoForCf()
+        .build();
+  }
+
+  public StringBackportJava11Test(TestParameters parameters) {
+    super(parameters, String.class, StringBackportJava11Main.class);
+    // Note: The methods in this test exist in android.jar from Android T. When R8 builds targeting
+    // Java 11 move these tests to StringBackportTest (out of examplesJava11).
+
+    registerTarget(AndroidApiLevel.T, 49);
+  }
+
+  public static 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 + '>');
+      }
+    }
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/desugar/backports/CharSequenceBackportJava11Test.java b/src/test/java/com/android/tools/r8/desugar/backports/CharSequenceBackportJava11Test.java
deleted file mode 100644
index 42a85c0..0000000
--- a/src/test/java/com/android/tools/r8/desugar/backports/CharSequenceBackportJava11Test.java
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright (c) 2020, the R8 project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-package com.android.tools.r8.desugar.backports;
-
-import static com.android.tools.r8.utils.FileUtils.JAR_EXTENSION;
-
-import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.TestRuntime.CfVm;
-import com.android.tools.r8.ToolHelper;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
-import org.junit.runners.Parameterized.Parameters;
-
-@RunWith(Parameterized.class)
-public final class CharSequenceBackportJava11Test extends AbstractBackportTest {
-  @Parameters(name = "{0}")
-  public static Iterable<?> data() {
-    return getTestParameters()
-        .withDexRuntimes()
-        .withCfRuntimesStartingFromIncluding(CfVm.JDK11)
-        .withAllApiLevelsAlsoForCf()
-        .build();
-  }
-
-  private static final Path TEST_JAR =
-      Paths.get(ToolHelper.EXAMPLES_JAVA11_JAR_DIR).resolve("backport" + JAR_EXTENSION);
-
-  public CharSequenceBackportJava11Test(TestParameters parameters) {
-    super(parameters, Character.class, TEST_JAR, "backport.CharSequenceBackportJava11Main");
-    // Note: None of the methods in this test exist in the latest android.jar. If/when they ship in
-    // an actual API level, migrate these tests to CharacterBackportTest.
-  }
-}
diff --git a/src/test/java/com/android/tools/r8/desugar/backports/PredicateBackportJava11Test.java b/src/test/java/com/android/tools/r8/desugar/backports/PredicateBackportJava11Test.java
deleted file mode 100644
index d0a6c35..0000000
--- a/src/test/java/com/android/tools/r8/desugar/backports/PredicateBackportJava11Test.java
+++ /dev/null
@@ -1,42 +0,0 @@
-// Copyright (c) 2022, the R8 project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-package com.android.tools.r8.desugar.backports;
-
-import static com.android.tools.r8.utils.FileUtils.JAR_EXTENSION;
-
-import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.TestRuntime.CfVm;
-import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.ToolHelper.DexVm.Version;
-import com.android.tools.r8.utils.AndroidApiLevel;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.util.OptionalLong;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
-import org.junit.runners.Parameterized.Parameters;
-
-@RunWith(Parameterized.class)
-public final class PredicateBackportJava11Test extends AbstractBackportTest {
-  @Parameters(name = "{0}")
-  public static Iterable<?> data() {
-    return getTestParameters()
-        .withDexRuntimesStartingFromIncluding(Version.V7_0_0)
-        .withApiLevelsStartingAtIncluding(AndroidApiLevel.N)
-        .withCfRuntimesStartingFromIncluding(CfVm.JDK11)
-        .enableApiLevelsForCf()
-        .build();
-  }
-
-  private static final Path TEST_JAR =
-      Paths.get(ToolHelper.EXAMPLES_JAVA11_JAR_DIR).resolve("backport" + JAR_EXTENSION);
-
-  public PredicateBackportJava11Test(TestParameters parameters) {
-    super(parameters, OptionalLong.class, TEST_JAR, "backport.PredicateBackportJava11Main");
-
-    // Available since N as part of library desugaring.
-    ignoreInvokes("not");
-  }
-}
diff --git a/src/test/java/com/android/tools/r8/desugar/backports/StringBackportJava11Test.java b/src/test/java/com/android/tools/r8/desugar/backports/StringBackportJava11Test.java
deleted file mode 100644
index e6d81ac..0000000
--- a/src/test/java/com/android/tools/r8/desugar/backports/StringBackportJava11Test.java
+++ /dev/null
@@ -1,40 +0,0 @@
-// Copyright (c) 2019, the R8 project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-package com.android.tools.r8.desugar.backports;
-
-import static com.android.tools.r8.utils.FileUtils.JAR_EXTENSION;
-
-import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.TestRuntime.CfVm;
-import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.utils.AndroidApiLevel;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
-import org.junit.runners.Parameterized.Parameters;
-
-@RunWith(Parameterized.class)
-public final class StringBackportJava11Test extends AbstractBackportTest {
-  @Parameters(name = "{0}")
-  public static Iterable<?> data() {
-    return getTestParameters()
-        .withDexRuntimes()
-        .withCfRuntimesStartingFromIncluding(CfVm.JDK11)
-        .withAllApiLevelsAlsoForCf()
-        .build();
-  }
-
-  private static final Path TEST_JAR =
-      Paths.get(ToolHelper.EXAMPLES_JAVA11_JAR_DIR).resolve("backport" + JAR_EXTENSION);
-
-  public StringBackportJava11Test(TestParameters parameters) {
-    super(parameters, String.class, TEST_JAR, "backport.StringBackportJava11Main");
-    // Note: The methods in this test exist in android.jar from Android T. When R8 builds targeting
-    // Java 11 move these tests to StringBackportTest (out of examplesJava11).
-
-    registerTarget(AndroidApiLevel.T, 49);
-  }
-}
diff --git a/src/test/testbase/java/com/android/tools/r8/desugar/backports/AbstractBackportTest.java b/src/test/testbase/java/com/android/tools/r8/desugar/backports/AbstractBackportTest.java
index 18c8f65..ed256d5 100644
--- a/src/test/testbase/java/com/android/tools/r8/desugar/backports/AbstractBackportTest.java
+++ b/src/test/testbase/java/com/android/tools/r8/desugar/backports/AbstractBackportTest.java
@@ -29,6 +29,8 @@
 import it.unimi.dsi.fastutil.ints.Int2IntAVLTreeMap;
 import it.unimi.dsi.fastutil.ints.Int2IntSortedMap;
 import java.io.IOException;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
 import java.nio.file.Path;
 import java.util.HashSet;
 import java.util.List;
@@ -79,11 +81,24 @@
 
     TestBuilder<?, ?> addAsProgramClass(TestBuilder<?, ?> builder) throws IOException {
       if (clazz != null) {
+        addStrippedOuter(builder);
         return builder.addProgramClassesAndInnerClasses(clazz);
       } else {
         return builder.addProgramClassFileData(classFileData);
       }
     }
+
+    private void addStrippedOuter(TestBuilder<?, ?> builder) throws IOException {
+      try {
+        Method getNestHost = Class.class.getDeclaredMethod("getNestHost");
+        Class<?> nestHost = (Class<?>) getNestHost.invoke(clazz);
+        if (nestHost != null && nestHost != clazz) {
+          builder.addStrippedOuter(nestHost);
+        }
+      } catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException e) {
+        // Ignored on old JDKs.
+      }
+    }
   }
 
   protected AbstractBackportTest(