// 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.enumunboxing;

import static junit.framework.TestCase.assertEquals;

import com.android.tools.r8.TestBase;
import com.android.tools.r8.TestParametersCollection;
import com.android.tools.r8.utils.BooleanUtils;
import com.android.tools.r8.utils.InternalOptions;
import com.android.tools.r8.utils.StringUtils;
import java.util.List;

public class EnumUnboxingTestBase extends TestBase {

  // Default keep rule present in Android Studio.
  private static final String KEEP_ENUM_STUDIO =
      "-keepclassmembers enum * {\n"
          + " public static **[] values();\n"
          + " public static ** valueOf(java.lang.String);\n"
          + "}";

  public enum EnumKeepRules {
    NONE(""),
    STUDIO(KEEP_ENUM_STUDIO);

    private final String keepRules;

    public String getKeepRules() {
      return keepRules;
    }

    public boolean isNone() {
      return this == NONE;
    }

    public boolean isStudio() {
      return this == STUDIO;
    }

    EnumKeepRules(String keepRules) {
      this.keepRules = keepRules;
    }
  }

  public void assertLines2By2Correct(String string) {
    List<String> lines = StringUtils.splitLines(string);
    assert lines.size() % 2 == 0;
    for (int i = 0; i < lines.size(); i += 2) {
      assertEquals(
          "Different lines: " + lines.get(i) + " || " + lines.get(i + 1) + "\n" + string,
          lines.get(i),
          lines.get(i + 1));
    }
  }

  protected void enableEnumOptions(InternalOptions options, boolean enumValueOptimization) {
    options.enableEnumValueOptimization = enumValueOptimization;
    options.enableEnumSwitchMapRemoval = enumValueOptimization;
  }

  static List<Object[]> enumUnboxingTestParameters() {
    return enumUnboxingTestParameters(
        getTestParameters().withDexRuntimes().withAllApiLevels().build());
  }

  static List<Object[]> enumUnboxingTestParameters(TestParametersCollection testParameters) {
    return buildParameters(testParameters, BooleanUtils.values(), getAllEnumKeepRules());
  }

  protected static EnumKeepRules[] getAllEnumKeepRules() {
    return EnumKeepRules.values();
  }
}
