[Metadata] Add test for not renaming enum values in metadata

Bug: b/259389417
Change-Id: Ibf13f00e38b77d9f198ab5556c6fb5b9f59cb0a0
diff --git a/src/test/java/com/android/tools/r8/JvmTestBuilder.java b/src/test/java/com/android/tools/r8/JvmTestBuilder.java
index e1ab7a6..8b56639 100644
--- a/src/test/java/com/android/tools/r8/JvmTestBuilder.java
+++ b/src/test/java/com/android/tools/r8/JvmTestBuilder.java
@@ -107,7 +107,8 @@
           throw new RuntimeException(e);
         }
       } else {
-        throw new Unimplemented("No support for adding file: " + file);
+        assert Files.isDirectory(file);
+        classpath.add(file);
       }
     }
     return self();
diff --git a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteDoNotEmitValuesIfEmpty.java b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteDoNotEmitValuesIfEmptyTest.java
similarity index 95%
rename from src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteDoNotEmitValuesIfEmpty.java
rename to src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteDoNotEmitValuesIfEmptyTest.java
index 7a7aec4..d8a78c9 100644
--- a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteDoNotEmitValuesIfEmpty.java
+++ b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteDoNotEmitValuesIfEmptyTest.java
@@ -22,7 +22,7 @@
 import org.junit.runners.Parameterized;
 
 @RunWith(Parameterized.class)
-public class MetadataRewriteDoNotEmitValuesIfEmpty extends KotlinMetadataTestBase {
+public class MetadataRewriteDoNotEmitValuesIfEmptyTest extends KotlinMetadataTestBase {
 
   private final Set<String> nullableFieldKeys = Sets.newHashSet("pn", "xs", "xi");
 
@@ -35,7 +35,7 @@
 
   private final TestParameters parameters;
 
-  public MetadataRewriteDoNotEmitValuesIfEmpty(
+  public MetadataRewriteDoNotEmitValuesIfEmptyTest(
       TestParameters parameters, KotlinTestParameters kotlinParameters) {
     super(kotlinParameters);
     this.parameters = parameters;
diff --git a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteEnumTest.java b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteEnumTest.java
new file mode 100644
index 0000000..939eb30
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteEnumTest.java
@@ -0,0 +1,97 @@
+// 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.kotlin.metadata;
+
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndNotRenamed;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.junit.Assert.assertTrue;
+
+import com.android.tools.r8.KotlinTestParameters;
+import com.android.tools.r8.R8TestCompileResult;
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import java.nio.file.Path;
+import java.util.Collection;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+
+/** This is a regression test for b/259389417. */
+@RunWith(Parameterized.class)
+public class MetadataRewriteEnumTest extends KotlinMetadataTestBase {
+
+  private final String[] EXPECTED =
+      new String[] {"UP", "RIGHT", "DOWN", "LEFT", "UP", "RIGHT", "DOWN", "LEFT"};
+  private final String DIRECTION_TYPE_NAME = PKG + ".enum_lib.Direction";
+
+  private final TestParameters parameters;
+
+  @Parameterized.Parameters(name = "{0}, {1}")
+  public static Collection<Object[]> data() {
+    return buildParameters(
+        getTestParameters().withCfRuntimes().build(),
+        getKotlinTestParameters().withAllCompilersAndTargetVersions().build());
+  }
+
+  public MetadataRewriteEnumTest(TestParameters parameters, KotlinTestParameters kotlinParameters) {
+    super(kotlinParameters);
+    this.parameters = parameters;
+  }
+
+  private static final KotlinCompileMemoizer jarMap =
+      getCompileMemoizer(getKotlinFileInTest(PKG_PREFIX + "/enum_lib", "lib"));
+
+  @Test
+  public void smokeTest() throws Exception {
+    Path libJar = jarMap.getForConfiguration(kotlinc, targetVersion);
+    Path output =
+        kotlinc(parameters.getRuntime().asCf(), kotlinc, targetVersion)
+            .addClasspathFiles(libJar)
+            .addSourceFiles(getKotlinFileInTest(PKG_PREFIX + "/enum_app", "main"))
+            .compile();
+    testForRuntime(parameters)
+        .addProgramFiles(
+            libJar, output, kotlinc.getKotlinStdlibJar(), kotlinc.getKotlinReflectJar())
+        .run(parameters.getRuntime(), PKG + ".enum_app.MainKt")
+        .assertSuccessWithOutputLines(EXPECTED);
+  }
+
+  @Test
+  public void testR8() throws Exception {
+    R8TestCompileResult r8libResult =
+        testForR8(parameters.getBackend())
+            .addProgramFiles(jarMap.getForConfiguration(kotlinc, targetVersion))
+            .addClasspathFiles(kotlinc.getKotlinStdlibJar())
+            .addKeepKotlinMetadata()
+            .addKeepEnumsRule()
+            .addKeepClassRules(DIRECTION_TYPE_NAME)
+            .addKeepClassAndMembersRulesWithAllowObfuscation(DIRECTION_TYPE_NAME)
+            .compile()
+            .inspect(
+                inspector -> {
+                  ClassSubject direction = inspector.clazz(DIRECTION_TYPE_NAME);
+                  assertThat(direction, isPresentAndNotRenamed());
+                  direction.allFields().forEach(field -> assertTrue(field.isRenamed()));
+                });
+    Path libJar = r8libResult.writeToZip();
+    Path output =
+        kotlinc(parameters.getRuntime().asCf(), kotlinc, targetVersion)
+            .addClasspathFiles(libJar)
+            .addSourceFiles(getKotlinFileInTest(PKG_PREFIX + "/enum_app", "main"))
+            .compile();
+    Path path =
+        testForR8(parameters.getBackend())
+            .addClasspathFiles(kotlinc.getKotlinStdlibJar(), kotlinc.getKotlinReflectJar(), libJar)
+            .addProgramFiles(output)
+            .addKeepAllClassesRule()
+            .addApplyMapping(r8libResult.getProguardMap())
+            .compile()
+            .writeToZip();
+    // TODO(b/259389417): We should rename enum values in metadata.
+    testForRuntime(parameters)
+        .addProgramFiles(libJar, kotlinc.getKotlinStdlibJar(), kotlinc.getKotlinReflectJar(), path)
+        .run(parameters.getRuntime(), PKG + ".enum_app.MainKt")
+        .assertFailureWithErrorThatThrows(NoSuchFieldError.class);
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/kotlin/metadata/enum_app/main.kt b/src/test/java/com/android/tools/r8/kotlin/metadata/enum_app/main.kt
new file mode 100644
index 0000000..ff23216
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/kotlin/metadata/enum_app/main.kt
@@ -0,0 +1,16 @@
+// 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.kotlin.metadata.enum_app
+
+import com.android.tools.r8.kotlin.metadata.enum_lib.Direction
+
+fun main() {
+  println(Direction.UP)
+  println(Direction.RIGHT)
+  println(Direction.DOWN)
+  println(Direction.LEFT)
+
+  Direction::class.java.enumConstants.forEach { println(it) }
+}
diff --git a/src/test/java/com/android/tools/r8/kotlin/metadata/enum_lib/lib.kt b/src/test/java/com/android/tools/r8/kotlin/metadata/enum_lib/lib.kt
new file mode 100644
index 0000000..0423b6d
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/kotlin/metadata/enum_lib/lib.kt
@@ -0,0 +1,9 @@
+// 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.kotlin.metadata.enum_lib
+
+enum class Direction {
+  UP, RIGHT, DOWN, LEFT
+}