// 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.shaking.annotations;

import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
import static junit.framework.TestCase.assertEquals;
import static junit.framework.TestCase.assertTrue;
import static org.hamcrest.CoreMatchers.not;
import static org.hamcrest.MatcherAssert.assertThat;

import com.android.tools.r8.CompilationFailedException;
import com.android.tools.r8.NeverClassInline;
import com.android.tools.r8.NeverInline;
import com.android.tools.r8.TestBase;
import com.android.tools.r8.TestParameters;
import com.android.tools.r8.TestParametersCollection;
import com.android.tools.r8.graph.DexAnnotationSet;
import com.android.tools.r8.graph.DexEncodedAnnotation;
import com.android.tools.r8.graph.DexEncodedMethod;
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.graph.DexValue;
import com.android.tools.r8.utils.codeinspector.ClassSubject;
import java.io.IOException;
import java.util.Arrays;
import java.util.concurrent.ExecutionException;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;

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

  private final TestParameters parameters;

  @Parameters(name = "{0}")
  public static TestParametersCollection data() {
    return getTestParameters().withAllRuntimesAndApiLevels().build();
  }

  public PrunedOrMergedAnnotationTest(TestParameters parameters) {
    this.parameters = parameters;
  }

  @Test
  public void testRewritingInFactory()
      throws IOException, CompilationFailedException, ExecutionException {
    testForR8(parameters.getBackend())
        .addInnerClasses(PrunedOrMergedAnnotationTest.class)
        .addKeepMainRule(Main.class)
        .addKeepAttributes("*Annotation*")
        .addKeepClassAndMembersRules(Factory.class)
        .enableInliningAnnotations()
        .enableNeverClassInliningAnnotations()
        .setMinApi(parameters.getApiLevel())
        .run(parameters.getRuntime(), Main.class)
        .assertSuccessWithOutputLines("Hello", "World!")
        .inspect(
            inspector -> {
              assertThat(inspector.clazz(A.class), not(isPresent()));
              DexType mergedType = inspector.clazz(B.class).getDexProgramClass().type;
              ClassSubject classC = inspector.clazz(C.class);
              assertThat(classC, isPresent());
              DexEncodedAnnotation annotation =
                  classC.annotation(Factory.class.getTypeName()).getAnnotation();
              assertTrue(valueIsDexType(mergedType, annotation.elements[0].value));
              assertTrue(
                  Arrays.stream(annotation.elements[1].value.asDexValueArray().getValues())
                      .allMatch(value -> valueIsDexType(mergedType, value)));
              // Check that method parameter annotations are rewritten as well.
              DexEncodedMethod method = inspector.clazz(Main.class).mainMethod().getMethod();
              DexAnnotationSet annotationSet = method.parameterAnnotationsList.get(0);
              DexEncodedAnnotation parameterAnnotation = annotationSet.annotations[0].annotation;
              assertTrue(valueIsDexType(mergedType, parameterAnnotation.elements[0].value));
            });
  }

  private boolean valueIsDexType(DexType type, DexValue value) {
    assertTrue(value.isDexValueType());
    assertEquals(type, value.asDexValueType().value);
    return true;
  }

  public @interface Factory {

    Class<?> extending() default Object.class;

    Class<?>[] other() default Object[].class;
  }

  public static class A {}

  @NeverClassInline
  public static class B extends A {
    @NeverInline
    public void world() {
      System.out.println("World!");
    }
  }

  @Factory(
      extending = A.class,
      other = {A.class, B.class})
  public static class C {
    @NeverInline
    public static void hello() {
      System.out.println("Hello");
    }
  }

  public static class Main {

    public static void main(@Factory(extending = A.class) String[] args) {
      C.hello();
      new B().world();
    }
  }
}
