// Copyright (c) 2018, 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.naming;

import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
import static com.android.tools.r8.utils.codeinspector.Matchers.isRenamed;
import static org.hamcrest.CoreMatchers.not;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertThat;

import com.android.tools.r8.R8Command;
import com.android.tools.r8.TestBase;
import com.android.tools.r8.ToolHelper;
import com.android.tools.r8.origin.Origin;
import com.android.tools.r8.utils.AndroidApp;
import com.android.tools.r8.utils.codeinspector.ClassSubject;
import com.android.tools.r8.utils.codeinspector.CodeInspector;
import com.google.common.collect.ImmutableList;
import java.util.Arrays;
import java.util.Collection;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
import org.objectweb.asm.ClassWriter;
import org.objectweb.asm.FieldVisitor;
import org.objectweb.asm.Label;
import org.objectweb.asm.MethodVisitor;
import org.objectweb.asm.Opcodes;
import org.objectweb.asm.Type;

@RunWith(Parameterized.class)
public class EnumMinification extends TestBase {

  private Backend backend;

  @Parameters(name = "Backend: {0}")
  public static Collection<Backend> data() {
    return Arrays.asList(Backend.values());
  }

  public EnumMinification(Backend backend) {
    this.backend = backend;
  }

  private AndroidApp buildApp(Class<?> mainClass, byte[] enumClassFile) throws Exception {
    return ToolHelper.runR8(
        R8Command.builder()
            .addClassProgramData(ToolHelper.getClassAsBytes(mainClass), Origin.unknown())
            .addClassProgramData(enumClassFile, Origin.unknown())
            .addProguardConfiguration(
                ImmutableList.of(keepMainProguardConfiguration(mainClass)), Origin.unknown())
            .setProgramConsumer(emptyConsumer(backend))
            .build());
  }

  public void runTest(
      Class<?> mainClass, byte[] enumClass, String enumTypeName, boolean valueOfKept)
      throws Exception {
    AndroidApp output = buildApp(mainClass, enumClass);

    CodeInspector inspector = new CodeInspector(output);
    ClassSubject clazz = inspector.clazz(enumTypeName);
    // The class and fields - including field $VALUES and method valueOf - can be renamed. Only
    // the values() method needs to be
    assertThat(clazz, isRenamed());
    assertThat(clazz.field(enumTypeName, "VALUE1"), isRenamed());
    assertThat(clazz.field(enumTypeName, "VALUE2"), isRenamed());
    assertThat(clazz.field(enumTypeName + "[]", "$VALUES"), isRenamed());
    assertThat(
        clazz.method(enumTypeName, "valueOf", ImmutableList.of("java.lang.String")),
        valueOfKept ? isRenamed() : not(isPresent()));
    assertThat(clazz.method(enumTypeName + "[]", "values", ImmutableList.of()), not(isRenamed()));

    assertEquals("VALUE1", runOnVM(output, mainClass, backend));
  }

  @Test
  public void test() throws Exception {
    runTest(Main.class, ToolHelper.getClassAsBytes(Enum.class), Enum.class.getTypeName(), true);
  }

  @Test
  public void testAsmDump() throws Exception {
    runTest(Main.class, EnumDump.dump(true), "com.android.tools.r8.naming.Enum", true);
  }

  @Test
  public void testWithoutValuesMethod() throws Exception {
    // This should not fail even if the values method is not present.
    buildApp(Main.class, EnumDump.dump(false));
  }

  @Test
  public void testJavaLangEnumValueOf() throws Exception {
    runTest(Main2.class, ToolHelper.getClassAsBytes(Enum.class), Enum.class.getTypeName(), false);
  }
}

class Main {

  public static void main(String[] args) {
    Enum e = Enum.valueOf("VALUE1");
    System.out.print(e);
  }
}

enum Enum {
  VALUE1,
  VALUE2
}

class Main2 {
  public static void main(String[] args) {
    // Use java.lang.Enum.valueOf instead of com.android.tools.r8.naming.Enum.valueOf.
    System.out.print(java.lang.Enum.valueOf(Enum.class, "VALUE1"));
  }
}
/* Dump of javac generated code from the following enum class (the one just above):
 *
 *  package com.android.tools.r8.naming;
 *
 *  enum Enum {
 *    VALUE1,
 *    VALUE2
 *  }
 *
 */
class EnumDump implements Opcodes {

  public static byte[] dump(boolean includeValuesMethod) {
    ClassWriter classWriter = new ClassWriter(0);
    FieldVisitor fieldVisitor;
    MethodVisitor methodVisitor;

    classWriter.visit(
        V1_8,
        ACC_FINAL | ACC_SUPER | ACC_ENUM,
        "com/android/tools/r8/naming/Enum",
        "Ljava/lang/Enum<Lcom/android/tools/r8/naming/Enum;>;",
        "java/lang/Enum",
        null);

    classWriter.visitSource("EnumMinification.java", null);

    {
      fieldVisitor =
          classWriter.visitField(
              ACC_PUBLIC | ACC_FINAL | ACC_STATIC | ACC_ENUM,
              "VALUE1",
              "Lcom/android/tools/r8/naming/Enum;",
              null,
              null);
      fieldVisitor.visitEnd();
    }
    {
      fieldVisitor =
          classWriter.visitField(
              ACC_PUBLIC | ACC_FINAL | ACC_STATIC | ACC_ENUM,
              "VALUE2",
              "Lcom/android/tools/r8/naming/Enum;",
              null,
              null);
      fieldVisitor.visitEnd();
    }
    {
      fieldVisitor =
          classWriter.visitField(
              ACC_PRIVATE | ACC_FINAL | ACC_STATIC | ACC_SYNTHETIC,
              "$VALUES",
              "[Lcom/android/tools/r8/naming/Enum;",
              null,
              null);
      fieldVisitor.visitEnd();
    }
    if (includeValuesMethod) {
      {
        methodVisitor =
            classWriter.visitMethod(
                ACC_PUBLIC | ACC_STATIC,
                "values",
                "()[Lcom/android/tools/r8/naming/Enum;",
                null,
                null);
        methodVisitor.visitCode();
        Label label0 = new Label();
        methodVisitor.visitLabel(label0);
        methodVisitor.visitLineNumber(72, label0);
        methodVisitor.visitFieldInsn(
            GETSTATIC,
            "com/android/tools/r8/naming/Enum",
            "$VALUES",
            "[Lcom/android/tools/r8/naming/Enum;");
        methodVisitor.visitMethodInsn(
            INVOKEVIRTUAL,
            "[Lcom/android/tools/r8/naming/Enum;",
            "clone",
            "()Ljava/lang/Object;",
            false);
        methodVisitor.visitTypeInsn(CHECKCAST, "[Lcom/android/tools/r8/naming/Enum;");
        methodVisitor.visitInsn(ARETURN);
        methodVisitor.visitMaxs(1, 0);
        methodVisitor.visitEnd();
      }
    }
    {
      methodVisitor =
          classWriter.visitMethod(
              ACC_PUBLIC | ACC_STATIC,
              "valueOf",
              "(Ljava/lang/String;)Lcom/android/tools/r8/naming/Enum;",
              null,
              null);
      methodVisitor.visitCode();
      Label label0 = new Label();
      methodVisitor.visitLabel(label0);
      methodVisitor.visitLineNumber(72, label0);
      methodVisitor.visitLdcInsn(Type.getType("Lcom/android/tools/r8/naming/Enum;"));
      methodVisitor.visitVarInsn(ALOAD, 0);
      methodVisitor.visitMethodInsn(
          INVOKESTATIC,
          "java/lang/Enum",
          "valueOf",
          "(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Enum;",
          false);
      methodVisitor.visitTypeInsn(CHECKCAST, "com/android/tools/r8/naming/Enum");
      methodVisitor.visitInsn(ARETURN);
      Label label1 = new Label();
      methodVisitor.visitLabel(label1);
      methodVisitor.visitLocalVariable("name", "Ljava/lang/String;", null, label0, label1, 0);
      methodVisitor.visitMaxs(2, 1);
      methodVisitor.visitEnd();
    }
    {
      methodVisitor =
          classWriter.visitMethod(ACC_PRIVATE, "<init>", "(Ljava/lang/String;I)V", "()V", null);
      methodVisitor.visitCode();
      Label label0 = new Label();
      methodVisitor.visitLabel(label0);
      methodVisitor.visitLineNumber(72, label0);
      methodVisitor.visitVarInsn(ALOAD, 0);
      methodVisitor.visitVarInsn(ALOAD, 1);
      methodVisitor.visitVarInsn(ILOAD, 2);
      methodVisitor.visitMethodInsn(
          INVOKESPECIAL, "java/lang/Enum", "<init>", "(Ljava/lang/String;I)V", false);
      methodVisitor.visitInsn(RETURN);
      Label label1 = new Label();
      methodVisitor.visitLabel(label1);
      methodVisitor.visitLocalVariable(
          "this", "Lcom/android/tools/r8/naming/Enum;", null, label0, label1, 0);
      methodVisitor.visitMaxs(3, 3);
      methodVisitor.visitEnd();
    }
    {
      methodVisitor = classWriter.visitMethod(ACC_STATIC, "<clinit>", "()V", null, null);
      methodVisitor.visitCode();
      Label label0 = new Label();
      methodVisitor.visitLabel(label0);
      methodVisitor.visitLineNumber(73, label0);
      methodVisitor.visitTypeInsn(NEW, "com/android/tools/r8/naming/Enum");
      methodVisitor.visitInsn(DUP);
      methodVisitor.visitLdcInsn("VALUE1");
      methodVisitor.visitInsn(ICONST_0);
      methodVisitor.visitMethodInsn(
          INVOKESPECIAL,
          "com/android/tools/r8/naming/Enum",
          "<init>",
          "(Ljava/lang/String;I)V",
          false);
      methodVisitor.visitFieldInsn(
          PUTSTATIC,
          "com/android/tools/r8/naming/Enum",
          "VALUE1",
          "Lcom/android/tools/r8/naming/Enum;");
      Label label1 = new Label();
      methodVisitor.visitLabel(label1);
      methodVisitor.visitLineNumber(74, label1);
      methodVisitor.visitTypeInsn(NEW, "com/android/tools/r8/naming/Enum");
      methodVisitor.visitInsn(DUP);
      methodVisitor.visitLdcInsn("VALUE2");
      methodVisitor.visitInsn(ICONST_1);
      methodVisitor.visitMethodInsn(
          INVOKESPECIAL,
          "com/android/tools/r8/naming/Enum",
          "<init>",
          "(Ljava/lang/String;I)V",
          false);
      methodVisitor.visitFieldInsn(
          PUTSTATIC,
          "com/android/tools/r8/naming/Enum",
          "VALUE2",
          "Lcom/android/tools/r8/naming/Enum;");
      Label label2 = new Label();
      methodVisitor.visitLabel(label2);
      methodVisitor.visitLineNumber(72, label2);
      methodVisitor.visitInsn(ICONST_2);
      methodVisitor.visitTypeInsn(ANEWARRAY, "com/android/tools/r8/naming/Enum");
      methodVisitor.visitInsn(DUP);
      methodVisitor.visitInsn(ICONST_0);
      methodVisitor.visitFieldInsn(
          GETSTATIC,
          "com/android/tools/r8/naming/Enum",
          "VALUE1",
          "Lcom/android/tools/r8/naming/Enum;");
      methodVisitor.visitInsn(AASTORE);
      methodVisitor.visitInsn(DUP);
      methodVisitor.visitInsn(ICONST_1);
      methodVisitor.visitFieldInsn(
          GETSTATIC,
          "com/android/tools/r8/naming/Enum",
          "VALUE2",
          "Lcom/android/tools/r8/naming/Enum;");
      methodVisitor.visitInsn(AASTORE);
      methodVisitor.visitFieldInsn(
          PUTSTATIC,
          "com/android/tools/r8/naming/Enum",
          "$VALUES",
          "[Lcom/android/tools/r8/naming/Enum;");
      methodVisitor.visitInsn(RETURN);
      methodVisitor.visitMaxs(4, 0);
      methodVisitor.visitEnd();
    }
    classWriter.visitEnd();

    return classWriter.toByteArray();
  }
}
