Update backport tests of Android 14 and 15 methods

  * int CharSequence.compare(CharSequence, CharSequence) was added in
    Android 14
  * Character.toString(int) was added in Android 15

Bug: b/343127842
Change-Id: I448c19fe3a710d8a7a8d4a2d35f69d80974bd09a
diff --git a/src/test/examplesJava11/backport/CharacterBackportJava11Main.java b/src/test/examplesJava11/backport/CharacterBackportJava11Main.java
deleted file mode 100644
index 487c7b0..0000000
--- a/src/test/examplesJava11/backport/CharacterBackportJava11Main.java
+++ /dev/null
@@ -1,33 +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 backport;
-
-public final class CharacterBackportJava11Main {
-  public static void main(String[] args) {
-    testToStringCodepoint();
-  }
-
-  private static void testToStringCodepoint() {
-    for (int i = Character.MIN_CODE_POINT; i <= Character.MAX_CODE_POINT; i++) {
-      String expected = new StringBuilder().appendCodePoint(i).toString();
-      assertEquals(expected, Character.toString(i));
-    }
-
-    try {
-      throw new AssertionError(Character.toString(Character.MIN_CODE_POINT - 1));
-    } catch (IllegalArgumentException expected) {
-    }
-    try {
-      throw new AssertionError(Character.toString(Character.MAX_CODE_POINT + 1));
-    } catch (IllegalArgumentException 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/java/com/android/tools/r8/BackportedMethodListTest.java b/src/test/java/com/android/tools/r8/BackportedMethodListTest.java
index 5ef5e9c..f003fdf 100644
--- a/src/test/java/com/android/tools/r8/BackportedMethodListTest.java
+++ b/src/test/java/com/android/tools/r8/BackportedMethodListTest.java
@@ -92,16 +92,15 @@
             && (mode == Mode.LIBRARY_DESUGAR || apiLevel >= AndroidApiLevel.N.getLevel()),
         backports.contains("java/util/OptionalLong#isEmpty()Z"));
 
-    // Java 9, 10 and 11 method added at API level S.
+    // Java 9, 10 and 11 methods added at API level S.
     assertEquals(
         apiLevel < AndroidApiLevel.S.getLevel(),
         backports.contains("java/lang/StrictMath#multiplyExact(JI)J"));
-    // Java 9, 10 and 11 method added at API level S.
     assertEquals(
         apiLevel < AndroidApiLevel.S.getLevel(),
         backports.contains("java/util/List#copyOf(Ljava/util/Collection;)Ljava/util/List;"));
 
-    // Java 9, 10 and 11 method added at API level T.
+    // Java 9, 10 and 11 methods added at API level T.
     assertEquals(
         apiLevel < AndroidApiLevel.T.getLevel(),
         backports.contains("java/lang/Integer#parseInt(Ljava/lang/CharSequence;III)I"));
@@ -109,8 +108,16 @@
         apiLevel < AndroidApiLevel.T.getLevel(),
         backports.contains("java/lang/String#repeat(I)Ljava/lang/String;"));
 
-    // Java 9, 10 and 11 methods not yet added.
-    assertTrue(backports.contains("java/lang/Character#toString(I)Ljava/lang/String;"));
+    // Java 9, 10 and 11 method added at API level U.
+    assertEquals(
+        apiLevel < AndroidApiLevel.U.getLevel(),
+        backports.contains(
+            "java/lang/CharSequence#compare(Ljava/lang/CharSequence;Ljava/lang/CharSequence;)I"));
+
+    // Java 9, 10 and 11 method added at API level V.
+    assertEquals(
+        apiLevel < AndroidApiLevel.V.getLevel(),
+        backports.contains("java/lang/Character#toString(I)Ljava/lang/String;"));
   }
 
   private void addLibraryDesugaring(BackportedMethodListCommand.Builder builder) {
diff --git a/src/test/java/com/android/tools/r8/desugar/backports/AbstractBackportTest.java b/src/test/java/com/android/tools/r8/desugar/backports/AbstractBackportTest.java
index dbea395..7fcd792 100644
--- a/src/test/java/com/android/tools/r8/desugar/backports/AbstractBackportTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/backports/AbstractBackportTest.java
@@ -90,6 +90,11 @@
   }
 
   AbstractBackportTest(
+      TestParameters parameters, Class<?> targetClass, List<byte[]> testClassFileData) {
+    this(parameters, new ClassInfo(targetClass), new ClassInfo(testClassFileData), null, null);
+  }
+
+  AbstractBackportTest(
       TestParameters parameters, String className, List<byte[]> testClassFileData) {
     this(parameters, new ClassInfo(className), new ClassInfo(testClassFileData), null, null);
   }
diff --git a/src/test/java/com/android/tools/r8/desugar/backports/CharacterBackportJava11Test.java b/src/test/java/com/android/tools/r8/desugar/backports/CharacterBackportJava11Test.java
deleted file mode 100644
index 735ba69..0000000
--- a/src/test/java/com/android/tools/r8/desugar/backports/CharacterBackportJava11Test.java
+++ /dev/null
@@ -1,37 +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 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 CharacterBackportJava11Test 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 CharacterBackportJava11Test(TestParameters parameters) {
-    super(parameters, Character.class, TEST_JAR, "backport.CharacterBackportJava11Main");
-    // 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/CharacterBackportTest.java b/src/test/java/com/android/tools/r8/desugar/backports/CharacterBackportTest.java
index 2345798..f9daa35 100644
--- a/src/test/java/com/android/tools/r8/desugar/backports/CharacterBackportTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/backports/CharacterBackportTest.java
@@ -5,7 +5,9 @@
 package com.android.tools.r8.desugar.backports;
 
 import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.desugar.backports.CharacterBackportTest.Main.MockCharacter;
 import com.android.tools.r8.utils.AndroidApiLevel;
+import com.google.common.collect.ImmutableList;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
 import org.junit.runners.Parameterized.Parameters;
@@ -17,8 +19,16 @@
     return getTestParameters().withAllRuntimes().withAllApiLevelsAlsoForCf().build();
   }
 
-  public CharacterBackportTest(TestParameters parameters) {
-    super(parameters, Character.class, Main.class);
+  public CharacterBackportTest(TestParameters parameters) throws Exception {
+    super(
+        parameters,
+        Character.class,
+        ImmutableList.of(
+            transformer(Main.class)
+                .replaceClassDescriptorInMethodInstructions(
+                    descriptor(MockCharacter.class), descriptor(Character.class))
+                .transform()));
+    registerTarget(AndroidApiLevel.V, 11);
     registerTarget(AndroidApiLevel.N, 8);
     registerTarget(AndroidApiLevel.K, 7);
   }
@@ -44,5 +54,29 @@
       assertTrue(Character.compare(Character.MIN_VALUE, Character.MIN_VALUE) == 0);
       assertTrue(Character.compare(Character.MAX_VALUE, Character.MAX_VALUE) == 0);
     }
+
+    // Character.toString(int) added in JDK-11. Use MockCharacter and transformer to compile test
+    // with -target 8
+    static class MockCharacter {
+      static String toString(int i) {
+        throw new RuntimeException("MockCharacter.toString(int i)");
+      }
+    }
+
+    private static void testToString() {
+      for (int i = Character.MIN_CODE_POINT; i <= Character.MAX_CODE_POINT; i++) {
+        String expected = new StringBuilder().appendCodePoint(i).toString();
+        assertEquals(expected, MockCharacter.toString(i));
+      }
+
+      try {
+        throw new AssertionError(MockCharacter.toString(Character.MIN_CODE_POINT - 1));
+      } catch (IllegalArgumentException expected) {
+      }
+      try {
+        throw new AssertionError(MockCharacter.toString(Character.MAX_CODE_POINT + 1));
+      } catch (IllegalArgumentException expected) {
+      }
+    }
   }
 }