Enum unboxing: add regression tests

- add regression and fix a bug for method
  collision in enum unboxing
- add regression for accessibility errors
  in enum unboxing

Bug: 160854837
Bug: 160769257
Change-Id: I3f62ce600a47dc2f2c228907c9df33e08a759856
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxer.java b/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxer.java
index 1ffca3d..3be53b2 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxer.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxer.java
@@ -771,7 +771,7 @@
           factory.createString(
               enumUnboxerRewriter.compatibleName(method.holder)
                   + "$"
-                  + (encodedMethod.isDirectMethod() ? "d" : "v")
+                  + (encodedMethod.isStatic() ? "s" : "v")
                   + "$"
                   + method.name.toString());
       DexProto proto =
diff --git a/src/test/java/com/android/tools/r8/enumunboxing/VirtualMethodsEnumUnboxingTest.java b/src/test/java/com/android/tools/r8/enumunboxing/VirtualMethodsEnumUnboxingTest.java
index 6323e8b..2e3466f 100644
--- a/src/test/java/com/android/tools/r8/enumunboxing/VirtualMethodsEnumUnboxingTest.java
+++ b/src/test/java/com/android/tools/r8/enumunboxing/VirtualMethodsEnumUnboxingTest.java
@@ -4,8 +4,11 @@
 
 package com.android.tools.r8.enumunboxing;
 
+import static org.hamcrest.CoreMatchers.containsString;
+
 import com.android.tools.r8.NeverClassInline;
 import com.android.tools.r8.NeverInline;
+import com.android.tools.r8.R8TestCompileResult;
 import com.android.tools.r8.R8TestRunResult;
 import com.android.tools.r8.TestParameters;
 import java.util.List;
@@ -36,10 +39,11 @@
   @Test
   public void testEnumUnboxing() throws Exception {
     Class<?> classToTest = VirtualMethods.class;
-    R8TestRunResult run =
+    R8TestCompileResult compile =
         testForR8(parameters.getBackend())
             .addInnerClasses(VirtualMethodsEnumUnboxingTest.class)
             .addKeepMainRule(classToTest)
+            .addKeepMainRule(VirtualMethodsFail.class)
             .addKeepRules(enumKeepRules.getKeepRules())
             .enableNeverClassInliningAnnotations()
             .enableInliningAnnotations()
@@ -51,10 +55,16 @@
                 m -> {
                   assertEnumIsUnboxed(MyEnum.class, classToTest.getSimpleName(), m);
                   assertEnumIsUnboxed(MyEnum2.class, classToTest.getSimpleName(), m);
-                })
-            .run(parameters.getRuntime(), classToTest)
-            .assertSuccess();
+                  assertEnumIsUnboxed(MyEnumWithCollisions.class, classToTest.getSimpleName(), m);
+                  assertEnumIsUnboxed(
+                      MyEnumWithPackagePrivateCall.class, classToTest.getSimpleName(), m);
+                });
+    R8TestRunResult run = compile.run(parameters.getRuntime(), classToTest).assertSuccess();
     assertLines2By2Correct(run.getStdOut());
+    // TODO(b/160854837): This test should actually be successful.
+    compile
+        .run(parameters.getRuntime(), VirtualMethodsFail.class)
+        .assertFailureWithErrorThatMatches(containsString("IllegalAccessError"));
   }
 
   @SuppressWarnings("SameParameterValue")
@@ -102,6 +112,7 @@
   }
 
   // Use two enums to test collision.
+  @NeverClassInline
   enum MyEnum2 {
     A,
     B,
@@ -123,6 +134,76 @@
     }
   }
 
+  @NeverClassInline
+  enum MyEnumWithCollisions {
+    A,
+    B,
+    C;
+
+    @NeverInline
+    public int get() {
+      return get(this);
+    }
+
+    @NeverInline
+    public static int get(MyEnumWithCollisions e) {
+      switch (e) {
+        case A:
+          return 5;
+        case B:
+          return 2;
+        case C:
+          return 1;
+      }
+      return -1;
+    }
+  }
+
+  @NeverClassInline
+  static class PackagePrivateClass {
+    @NeverInline
+    static void print() {
+      System.out.println("print");
+    }
+  }
+
+  @NeverClassInline
+  enum MyEnumWithPackagePrivateCall {
+    A,
+    B,
+    C;
+
+    @NeverInline
+    public static void callPackagePrivate() {
+      PackagePrivateClass.print();
+    }
+  }
+
+  static class VirtualMethodsFail {
+    public static void main(String[] args) {
+      testCollisions();
+      testPackagePrivate();
+    }
+
+    @NeverInline
+    private static void testPackagePrivate() {
+      System.out.println(MyEnumWithPackagePrivateCall.A.ordinal());
+      System.out.println(0);
+      MyEnumWithPackagePrivateCall.callPackagePrivate();
+      System.out.println("print");
+    }
+
+    @NeverInline
+    private static void testCollisions() {
+      System.out.println(MyEnumWithCollisions.A.get());
+      System.out.println(5);
+      System.out.println(MyEnumWithCollisions.B.get());
+      System.out.println(2);
+      System.out.println(MyEnumWithCollisions.C.get());
+      System.out.println(1);
+    }
+  }
+
   static class VirtualMethods {
 
     public static void main(String[] args) {