Update test of invalid MethodParameters attribute from desugaring

* Add parameter annotations

Bug: 189743726
Change-Id: Ib86ce8bcbd149396945a08a3d0cc43695caacaaf
diff --git a/src/main/java/com/android/tools/r8/utils/SupplierUtils.java b/src/main/java/com/android/tools/r8/utils/SupplierUtils.java
index 13a02cb..84dac5f 100644
--- a/src/main/java/com/android/tools/r8/utils/SupplierUtils.java
+++ b/src/main/java/com/android/tools/r8/utils/SupplierUtils.java
@@ -4,6 +4,7 @@
 
 package com.android.tools.r8.utils;
 
+import com.google.common.base.Suppliers;
 import java.util.function.Supplier;
 
 public class SupplierUtils {
@@ -12,4 +13,15 @@
     Box<T> box = new Box<>();
     return () -> box.computeIfAbsent(supplier);
   }
+
+  public static <T, E extends Throwable> Supplier<T> memoize(ThrowingSupplier<T, E> supplier) {
+    return Suppliers.memoize(
+        () -> {
+          try {
+            return supplier.get();
+          } catch (Throwable e) {
+            throw new RuntimeException(e);
+          }
+        });
+  }
 }
diff --git a/src/test/java/com/android/tools/r8/desugaring/interfacemethods/MethodParametersTest.java b/src/test/java/com/android/tools/r8/desugaring/interfacemethods/MethodParametersTest.java
index 7d70d21..27dcc8c 100644
--- a/src/test/java/com/android/tools/r8/desugaring/interfacemethods/MethodParametersTest.java
+++ b/src/test/java/com/android/tools/r8/desugaring/interfacemethods/MethodParametersTest.java
@@ -16,7 +16,10 @@
 import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.ToolHelper.DexVm.Version;
 import com.android.tools.r8.desugaring.interfacemethods.methodparameters.I;
+import com.android.tools.r8.utils.StringUtils;
+import com.android.tools.r8.utils.SupplierUtils;
 import java.nio.file.Path;
+import java.util.function.Supplier;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
@@ -25,6 +28,7 @@
 public class MethodParametersTest extends TestBase {
 
   private final TestParameters parameters;
+  private final Supplier<Path> compiledWithParameters;
 
   @Parameterized.Parameters(name = "{0}")
   public static TestParametersCollection data() {
@@ -38,16 +42,30 @@
 
   public MethodParametersTest(TestParameters parameters) {
     this.parameters = parameters;
+    compiledWithParameters =
+        SupplierUtils.memoize(
+            () ->
+                javac(
+                        parameters.isCfRuntime()
+                            ? getCheckedInJdk(parameters.getRuntime().asCf().getVm())
+                            : getCheckedInJdk11())
+                    .addSourceFiles(ToolHelper.getSourceFileForTestClass(I.class))
+                    .addOptions("-parameters")
+                    .compile());
   }
 
+  private final String EXPECTED =
+      StringUtils.lines(
+          "0", "1", "a: 1", "2", "a: 1", "b: 2", "0", "1", "a: 1", "2", "a: 1", "b: 2");
+
   @Test
   public void testJvm() throws Exception {
     assumeTrue(parameters.isCfRuntime());
     testForJvm()
-        .addProgramClassesAndInnerClasses(I.class)
+        .addProgramFiles(compiledWithParameters.get())
         .addInnerClasses(getClass())
         .run(parameters.getRuntime(), TestRunner.class)
-        .assertSuccessWithOutputLines("0", "1", "2", "0", "1", "2");
+        .assertSuccessWithOutput(EXPECTED);
   }
 
   @Test
@@ -56,18 +74,9 @@
     assumeTrue(
         parameters.isDexRuntime()
             || getCheckedInJdk(parameters.getRuntime().asCf().getVm()) != null);
-    Path compiledWithParameters =
-        javac(
-                parameters.isCfRuntime()
-                    ? getCheckedInJdk(parameters.getRuntime().asCf().getVm())
-                    : getCheckedInJdk11())
-            .addSourceFiles(ToolHelper.getSourceFileForTestClass(I.class))
-            .addOptions("-parameters")
-            .compile();
-
     Path interfaceDesugared =
         testForD8(Backend.CF)
-            .addProgramFiles(compiledWithParameters)
+            .addProgramFiles(compiledWithParameters.get())
             .setMinApi(parameters.getApiLevel())
             .compile()
             .writeToZip();
@@ -117,7 +126,7 @@
         .run(parameters.getRuntime(), TestRunner.class)
         .applyIf(
             parameters.canUseDefaultAndStaticInterfaceMethodsWhenDesugaring(),
-            r -> r.assertSuccessWithOutputLines("0", "1", "2", "0", "1", "2"),
+            r -> r.assertSuccessWithOutput(EXPECTED),
             // TODO(b/189743726): Should not fail at runtime (but will have different parameter
             // count for non-static methods when desugared).
             r ->
diff --git a/src/test/java/com/android/tools/r8/desugaring/interfacemethods/methodparameters/I.java b/src/test/java/com/android/tools/r8/desugaring/interfacemethods/methodparameters/I.java
index 4c7ba69..ccf787e 100644
--- a/src/test/java/com/android/tools/r8/desugaring/interfacemethods/methodparameters/I.java
+++ b/src/test/java/com/android/tools/r8/desugaring/interfacemethods/methodparameters/I.java
@@ -3,29 +3,67 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.desugaring.interfacemethods.methodparameters;
 
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.reflect.Parameter;
+
 public interface I {
 
   default void zeroArgsDefault() {
     System.out.println(new Object() {}.getClass().getEnclosingMethod().getParameters().length);
   }
 
-  default void oneArgDefault(int a) {
-    System.out.println(new Object() {}.getClass().getEnclosingMethod().getParameters().length);
+  default void oneArgDefault(@RuntimeAnnotation1(n = 0) int a) {
+    Parameter[] parameters = new Object() {}.getClass().getEnclosingMethod().getParameters();
+    System.out.println(parameters.length);
+    for (Parameter parameter : parameters) {
+      System.out.println(parameter.getName() + ": " + parameter.getAnnotations().length);
+    }
   }
 
-  default void twoArgDefault(int a, int b) {
-    System.out.println(new Object() {}.getClass().getEnclosingMethod().getParameters().length);
+  default void twoArgDefault(
+      @RuntimeAnnotation1(n = 1) int a,
+      @RuntimeAnnotation1(n = 2) @RuntimeAnnotation2(n = 2) int b) {
+    Parameter[] parameters = new Object() {}.getClass().getEnclosingMethod().getParameters();
+    System.out.println(parameters.length);
+    for (Parameter parameter : parameters) {
+      System.out.println(parameter.getName() + ": " + parameter.getAnnotations().length);
+    }
   }
 
   static void zeroArgStatic() {
-    System.out.println(new Object() {}.getClass().getEnclosingMethod().getParameters().length);
+    Parameter[] parameters = new Object() {}.getClass().getEnclosingMethod().getParameters();
+    System.out.println(parameters.length);
+    for (Parameter parameter : parameters) {
+      System.out.println(parameter.getName() + ": " + parameter.getAnnotations().length);
+    }
   }
 
-  static void oneArgStatic(int a) {
-    System.out.println(new Object() {}.getClass().getEnclosingMethod().getParameters().length);
+  static void oneArgStatic(@RuntimeAnnotation1(n = 0) int a) {
+    Parameter[] parameters = new Object() {}.getClass().getEnclosingMethod().getParameters();
+    System.out.println(parameters.length);
+    for (Parameter parameter : parameters) {
+      System.out.println(parameter.getName() + ": " + parameter.getAnnotations().length);
+    }
   }
 
-  static void twoArgsStatic(int a, int b) {
-    System.out.println(new Object() {}.getClass().getEnclosingMethod().getParameters().length);
+  static void twoArgsStatic(
+      @RuntimeAnnotation1(n = 1) int a,
+      @RuntimeAnnotation1(n = 2) @RuntimeAnnotation2(n = 2) int b) {
+    Parameter[] parameters = new Object() {}.getClass().getEnclosingMethod().getParameters();
+    System.out.println(parameters.length);
+    for (Parameter parameter : parameters) {
+      System.out.println(parameter.getName() + ": " + parameter.getAnnotations().length);
+    }
+  }
+
+  @Retention(RetentionPolicy.RUNTIME)
+  @interface RuntimeAnnotation1 {
+    int n();
+  }
+
+  @Retention(RetentionPolicy.RUNTIME)
+  @interface RuntimeAnnotation2 {
+    int n();
   }
 }