Enum unboxing: Test snap rule

Bug: 150417819
Change-Id: Iedd2f6c3271b9649aef824bcee0ceb6f0288807a
diff --git a/src/test/java/com/android/tools/r8/enumunboxing/ComparisonEnumUnboxingTest.java b/src/test/java/com/android/tools/r8/enumunboxing/ComparisonEnumUnboxingTest.java
index b13c250..19c069d 100644
--- a/src/test/java/com/android/tools/r8/enumunboxing/ComparisonEnumUnboxingTest.java
+++ b/src/test/java/com/android/tools/r8/enumunboxing/ComparisonEnumUnboxingTest.java
@@ -23,7 +23,7 @@
 
   private final TestParameters parameters;
   private final boolean enumValueOptimization;
-  private final boolean enumKeepRules;
+  private final KeepRule enumKeepRules;
 
   @Parameters(name = "{0} valueOpt: {1} keep: {2}")
   public static List<Object[]> data() {
@@ -31,7 +31,7 @@
   }
 
   public ComparisonEnumUnboxingTest(
-      TestParameters parameters, boolean enumValueOptimization, boolean enumKeepRules) {
+      TestParameters parameters, boolean enumValueOptimization, KeepRule enumKeepRules) {
     this.parameters = parameters;
     this.enumValueOptimization = enumValueOptimization;
     this.enumKeepRules = enumKeepRules;
@@ -45,7 +45,7 @@
             .addKeepMainRules(INPUTS)
             .enableInliningAnnotations()
             .enableNeverClassInliningAnnotations()
-            .addKeepRules(enumKeepRules ? KEEP_ENUM : "")
+            .addKeepRules(enumKeepRules.getKeepRule())
             .addOptionsModification(opt -> enableEnumOptions(opt, enumValueOptimization))
             .allowDiagnosticInfoMessages()
             .setMinApi(parameters.getApiLevel())
diff --git a/src/test/java/com/android/tools/r8/enumunboxing/EnumUnboxingTestBase.java b/src/test/java/com/android/tools/r8/enumunboxing/EnumUnboxingTestBase.java
index b7ebc83..399b6b0 100644
--- a/src/test/java/com/android/tools/r8/enumunboxing/EnumUnboxingTestBase.java
+++ b/src/test/java/com/android/tools/r8/enumunboxing/EnumUnboxingTestBase.java
@@ -10,18 +10,49 @@
 import com.android.tools.r8.Diagnostic;
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestDiagnosticMessages;
-import com.android.tools.r8.TestRuntime.CfVm;
-import com.android.tools.r8.ToolHelper.DexVm;
 import com.android.tools.r8.utils.BooleanUtils;
 import com.android.tools.r8.utils.InternalOptions;
 import com.android.tools.r8.utils.StringUtils;
+import com.google.common.collect.ImmutableList;
 import java.util.List;
 
 public class EnumUnboxingTestBase extends TestBase {
 
-  static final String KEEP_ENUM =
-      "-keepclassmembers enum * { public static **[] values(); public static **"
-          + " valueOf(java.lang.String); }";
+  private static final String KEEP_ENUM_STUDIO =
+      "-keepclassmembers enum * {\n"
+          + " public static **[] values();\n"
+          + " public static ** valueOf(java.lang.String);\n"
+          + "}";
+  private static final String KEEP_ENUM_SNAP =
+      "-keepclassmembers enum * {\n"
+          + "<fields>;\n"
+          + " public static **[] values();\n"
+          + " public static ** valueOf(java.lang.String);\n"
+          + "}";
+  private static final List<KeepRule> KEEP_ENUM =
+      ImmutableList.of(
+          new KeepRule("none", ""),
+          new KeepRule("studio", KEEP_ENUM_STUDIO),
+          new KeepRule("snap", KEEP_ENUM_SNAP));
+
+  public static class KeepRule {
+    private final String name;
+    private final String keepRule;
+
+    private KeepRule(String name, String keepRule) {
+      this.name = name;
+      this.keepRule = keepRule;
+    }
+
+    public String getKeepRule() {
+      return keepRule;
+    }
+
+    @Override
+    public String toString() {
+      return name;
+    }
+  }
 
   public void assertLines2By2Correct(String string) {
     List<String> lines = StringUtils.splitLines(string);
@@ -58,13 +89,8 @@
 
   static List<Object[]> enumUnboxingTestParameters() {
     return buildParameters(
-        getTestParameters()
-            .withCfRuntime(CfVm.JDK9)
-            .withDexRuntime(DexVm.Version.first())
-            .withDexRuntime(DexVm.Version.last())
-            .withAllApiLevels()
-            .build(),
+        getTestParameters().withAllRuntimesAndApiLevels().withAllApiLevels().build(),
         BooleanUtils.values(),
-        BooleanUtils.values());
+        KEEP_ENUM);
   }
 }
diff --git a/src/test/java/com/android/tools/r8/enumunboxing/FailingEnumUnboxingTest.java b/src/test/java/com/android/tools/r8/enumunboxing/FailingEnumUnboxingTest.java
index 4f13c05..ad16ee1 100644
--- a/src/test/java/com/android/tools/r8/enumunboxing/FailingEnumUnboxingTest.java
+++ b/src/test/java/com/android/tools/r8/enumunboxing/FailingEnumUnboxingTest.java
@@ -38,7 +38,7 @@
 
   private final TestParameters parameters;
   private final boolean enumValueOptimization;
-  private final boolean enumKeepRules;
+  private final KeepRule enumKeepRules;
 
   @Parameters(name = "{0} valueOpt: {1} keep: {2}")
   public static List<Object[]> data() {
@@ -46,7 +46,7 @@
   }
 
   public FailingEnumUnboxingTest(
-      TestParameters parameters, boolean enumValueOptimization, boolean enumKeepRules) {
+      TestParameters parameters, boolean enumValueOptimization, KeepRule enumKeepRules) {
     this.parameters = parameters;
     this.enumValueOptimization = enumValueOptimization;
     this.enumKeepRules = enumKeepRules;
@@ -64,7 +64,7 @@
             .noTreeShaking() // Disabled to avoid merging Itf into EnumInterface.
             .enableInliningAnnotations()
             .enableNeverClassInliningAnnotations()
-            .addKeepRules(enumKeepRules ? KEEP_ENUM : "")
+            .addKeepRules(enumKeepRules.getKeepRule())
             .addOptionsModification(opt -> enableEnumOptions(opt, enumValueOptimization))
             .allowDiagnosticInfoMessages()
             .setMinApi(parameters.getApiLevel())
diff --git a/src/test/java/com/android/tools/r8/enumunboxing/FailingMethodEnumUnboxingTest.java b/src/test/java/com/android/tools/r8/enumunboxing/FailingMethodEnumUnboxingTest.java
index 6a3ffea..8e7be57 100644
--- a/src/test/java/com/android/tools/r8/enumunboxing/FailingMethodEnumUnboxingTest.java
+++ b/src/test/java/com/android/tools/r8/enumunboxing/FailingMethodEnumUnboxingTest.java
@@ -29,13 +29,13 @@
     ToString.class,
     EnumSetTest.class,
     FailingPhi.class,
-      FailingReturnType.class,
-      FailingParameterType.class
+    FailingReturnType.class,
+    FailingParameterType.class
   };
 
   private final TestParameters parameters;
   private final boolean enumValueOptimization;
-  private final boolean enumKeepRules;
+  private final KeepRule enumKeepRules;
 
   @Parameters(name = "{0} valueOpt: {1} keep: {2}")
   public static List<Object[]> data() {
@@ -43,7 +43,7 @@
   }
 
   public FailingMethodEnumUnboxingTest(
-      TestParameters parameters, boolean enumValueOptimization, boolean enumKeepRules) {
+      TestParameters parameters, boolean enumValueOptimization, KeepRule enumKeepRules) {
     this.parameters = parameters;
     this.enumValueOptimization = enumValueOptimization;
     this.enumKeepRules = enumKeepRules;
@@ -55,7 +55,7 @@
         testForR8(parameters.getBackend())
             .addInnerClasses(FailingMethodEnumUnboxingTest.class)
             .addKeepMainRules(FAILURES)
-            .addKeepRules(enumKeepRules ? KEEP_ENUM : "")
+            .addKeepRules(enumKeepRules.getKeepRule())
             .addOptionsModification(opt -> enableEnumOptions(opt, enumValueOptimization))
             .allowDiagnosticInfoMessages()
             .enableInliningAnnotations()
@@ -71,7 +71,7 @@
                       assertEnumIsBoxed(
                           failure.getDeclaredClasses()[0], failure.getSimpleName(), m))
               .run(parameters.getRuntime(), failure);
-      if (failure == EnumSetTest.class && !enumKeepRules) {
+      if (failure == EnumSetTest.class && enumKeepRules.getKeepRule().isEmpty()) {
         // EnumSet and EnumMap cannot be used without the enumKeepRules.
         run.assertFailure();
       } else {
diff --git a/src/test/java/com/android/tools/r8/enumunboxing/FieldPutEnumUnboxingTest.java b/src/test/java/com/android/tools/r8/enumunboxing/FieldPutEnumUnboxingTest.java
index 129230a..f2ed08b 100644
--- a/src/test/java/com/android/tools/r8/enumunboxing/FieldPutEnumUnboxingTest.java
+++ b/src/test/java/com/android/tools/r8/enumunboxing/FieldPutEnumUnboxingTest.java
@@ -25,7 +25,7 @@
 
   private final TestParameters parameters;
   private final boolean enumValueOptimization;
-  private final boolean enumKeepRules;
+  private final KeepRule enumKeepRules;
 
   @Parameters(name = "{0} valueOpt: {1} keep: {2}")
   public static List<Object[]> data() {
@@ -33,7 +33,7 @@
   }
 
   public FieldPutEnumUnboxingTest(
-      TestParameters parameters, boolean enumValueOptimization, boolean enumKeepRules) {
+      TestParameters parameters, boolean enumValueOptimization, KeepRule enumKeepRules) {
     this.parameters = parameters;
     this.enumValueOptimization = enumValueOptimization;
     this.enumKeepRules = enumKeepRules;
@@ -45,7 +45,7 @@
         testForR8(parameters.getBackend())
             .addInnerClasses(FieldPutEnumUnboxingTest.class)
             .addKeepMainRules(INPUTS)
-            .addKeepRules(enumKeepRules ? KEEP_ENUM : "")
+            .addKeepRules(enumKeepRules.getKeepRule())
             .addOptionsModification(opt -> enableEnumOptions(opt, enumValueOptimization))
             .allowDiagnosticInfoMessages()
             .enableInliningAnnotations()
diff --git a/src/test/java/com/android/tools/r8/enumunboxing/OrdinalEnumUnboxingTest.java b/src/test/java/com/android/tools/r8/enumunboxing/OrdinalEnumUnboxingTest.java
index 91cd718..b388ed7 100644
--- a/src/test/java/com/android/tools/r8/enumunboxing/OrdinalEnumUnboxingTest.java
+++ b/src/test/java/com/android/tools/r8/enumunboxing/OrdinalEnumUnboxingTest.java
@@ -20,7 +20,7 @@
 
   private final TestParameters parameters;
   private final boolean enumValueOptimization;
-  private final boolean enumKeepRules;
+  private final KeepRule enumKeepRules;
 
   @Parameters(name = "{0} valueOpt: {1} keep: {2}")
   public static List<Object[]> data() {
@@ -28,7 +28,7 @@
   }
 
   public OrdinalEnumUnboxingTest(
-      TestParameters parameters, boolean enumValueOptimization, boolean enumKeepRules) {
+      TestParameters parameters, boolean enumValueOptimization, KeepRule enumKeepRules) {
     this.parameters = parameters;
     this.enumValueOptimization = enumValueOptimization;
     this.enumKeepRules = enumKeepRules;
@@ -41,7 +41,7 @@
         testForR8(parameters.getBackend())
             .addProgramClasses(classToTest, ENUM_CLASS)
             .addKeepMainRule(classToTest)
-            .addKeepRules(enumKeepRules ? KEEP_ENUM : "")
+            .addKeepRules(enumKeepRules.getKeepRule())
             .enableNeverClassInliningAnnotations()
             .addOptionsModification(opt -> enableEnumOptions(opt, enumValueOptimization))
             .allowDiagnosticInfoMessages()
diff --git a/src/test/java/com/android/tools/r8/enumunboxing/PhiEnumUnboxingTest.java b/src/test/java/com/android/tools/r8/enumunboxing/PhiEnumUnboxingTest.java
index 62ccaf8..ba217f6 100644
--- a/src/test/java/com/android/tools/r8/enumunboxing/PhiEnumUnboxingTest.java
+++ b/src/test/java/com/android/tools/r8/enumunboxing/PhiEnumUnboxingTest.java
@@ -21,7 +21,7 @@
 
   private final TestParameters parameters;
   private final boolean enumValueOptimization;
-  private final boolean enumKeepRules;
+  private final KeepRule enumKeepRules;
 
   @Parameters(name = "{0} valueOpt: {1} keep: {2}")
   public static List<Object[]> data() {
@@ -29,7 +29,7 @@
   }
 
   public PhiEnumUnboxingTest(
-      TestParameters parameters, boolean enumValueOptimization, boolean enumKeepRules) {
+      TestParameters parameters, boolean enumValueOptimization, KeepRule enumKeepRules) {
     this.parameters = parameters;
     this.enumValueOptimization = enumValueOptimization;
     this.enumKeepRules = enumKeepRules;
@@ -42,7 +42,7 @@
         testForR8(parameters.getBackend())
             .addProgramClasses(classToTest, ENUM_CLASS)
             .addKeepMainRule(classToTest)
-            .addKeepRules(enumKeepRules ? KEEP_ENUM : "")
+            .addKeepRules(enumKeepRules.getKeepRule())
             .enableInliningAnnotations()
             .enableNeverClassInliningAnnotations()
             .addOptionsModification(opt -> enableEnumOptions(opt, enumValueOptimization))
diff --git a/src/test/java/com/android/tools/r8/enumunboxing/PinnedEnumUnboxingTest.java b/src/test/java/com/android/tools/r8/enumunboxing/PinnedEnumUnboxingTest.java
index 3c34d67..355c6a1 100644
--- a/src/test/java/com/android/tools/r8/enumunboxing/PinnedEnumUnboxingTest.java
+++ b/src/test/java/com/android/tools/r8/enumunboxing/PinnedEnumUnboxingTest.java
@@ -5,7 +5,6 @@
 package com.android.tools.r8.enumunboxing;
 
 import com.android.tools.r8.NeverClassInline;
-import com.android.tools.r8.R8TestRunResult;
 import com.android.tools.r8.TestParameters;
 import java.util.List;
 import org.junit.Test;
@@ -20,7 +19,7 @@
 
   private final TestParameters parameters;
   private final boolean enumValueOptimization;
-  private final boolean enumKeepRules;
+  private final KeepRule enumKeepRules;
 
   @Parameters(name = "{0} valueOpt: {1} keep: {2}")
   public static List<Object[]> data() {
@@ -28,7 +27,7 @@
   }
 
   public PinnedEnumUnboxingTest(
-      TestParameters parameters, boolean enumValueOptimization, boolean enumKeepRules) {
+      TestParameters parameters, boolean enumValueOptimization, KeepRule enumKeepRules) {
     this.parameters = parameters;
     this.enumValueOptimization = enumValueOptimization;
     this.enumKeepRules = enumKeepRules;
@@ -37,21 +36,20 @@
   @Test
   public void testEnumUnboxing() throws Exception {
     Class<MainWithKeptEnum> classToTest = MainWithKeptEnum.class;
-    R8TestRunResult run =
-        testForR8(parameters.getBackend())
-            .addProgramClasses(classToTest, ENUM_CLASS)
-            .addKeepMainRule(classToTest)
-            .addKeepClassRules(MyEnum.class)
-            .addKeepRules(enumKeepRules ? KEEP_ENUM : "")
-            .enableNeverClassInliningAnnotations()
-            .addOptionsModification(opt -> enableEnumOptions(opt, enumValueOptimization))
-            .allowDiagnosticInfoMessages()
-            .setMinApi(parameters.getApiLevel())
-            .compile()
-            .inspectDiagnosticMessages(
-                m -> assertEnumIsBoxed(ENUM_CLASS, classToTest.getSimpleName(), m))
-            .run(parameters.getRuntime(), classToTest)
-            .assertSuccessWithOutputLines("0");
+    testForR8(parameters.getBackend())
+        .addProgramClasses(classToTest, ENUM_CLASS)
+        .addKeepMainRule(classToTest)
+        .addKeepClassRules(MyEnum.class)
+        .addKeepRules(enumKeepRules.getKeepRule())
+        .enableNeverClassInliningAnnotations()
+        .addOptionsModification(opt -> enableEnumOptions(opt, enumValueOptimization))
+        .allowDiagnosticInfoMessages()
+        .setMinApi(parameters.getApiLevel())
+        .compile()
+        .inspectDiagnosticMessages(
+            m -> assertEnumIsBoxed(ENUM_CLASS, classToTest.getSimpleName(), m))
+        .run(parameters.getRuntime(), classToTest)
+        .assertSuccessWithOutputLines("0");
   }
 
   @NeverClassInline
diff --git a/src/test/java/com/android/tools/r8/enumunboxing/SwitchEnumUnboxingTest.java b/src/test/java/com/android/tools/r8/enumunboxing/SwitchEnumUnboxingTest.java
index 88dd987..4bfa568 100644
--- a/src/test/java/com/android/tools/r8/enumunboxing/SwitchEnumUnboxingTest.java
+++ b/src/test/java/com/android/tools/r8/enumunboxing/SwitchEnumUnboxingTest.java
@@ -21,7 +21,7 @@
 
   private final TestParameters parameters;
   private final boolean enumValueOptimization;
-  private final boolean enumKeepRules;
+  private final KeepRule enumKeepRules;
 
   @Parameters(name = "{0} valueOpt: {1} keep: {2}")
   public static List<Object[]> data() {
@@ -29,7 +29,7 @@
   }
 
   public SwitchEnumUnboxingTest(
-      TestParameters parameters, boolean enumValueOptimization, boolean enumKeepRules) {
+      TestParameters parameters, boolean enumValueOptimization, KeepRule enumKeepRules) {
     this.parameters = parameters;
     this.enumValueOptimization = enumValueOptimization;
     this.enumKeepRules = enumKeepRules;
@@ -42,7 +42,7 @@
         testForR8(parameters.getBackend())
             .addInnerClasses(SwitchEnumUnboxingTest.class)
             .addKeepMainRule(classToTest)
-            .addKeepRules(enumKeepRules ? KEEP_ENUM : "")
+            .addKeepRules(enumKeepRules.getKeepRule())
             .enableInliningAnnotations()
             .enableNeverClassInliningAnnotations()
             .addOptionsModification(opt -> enableEnumOptions(opt, enumValueOptimization))