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

import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
import static org.hamcrest.MatcherAssert.assertThat;

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.utils.AndroidApiLevel;
import com.android.tools.r8.utils.codeinspector.ClassSubject;
import com.android.tools.r8.utils.codeinspector.CodeInspector;
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 InterfaceInitializedByImplementationTest extends TestBase {

  private final TestParameters parameters;

  @Parameters(name = "{0}")
  public static TestParametersCollection data() {
    return getTestParameters()
        .withAllRuntimes()
        // Ensure default interface methods are supported.
        .withApiLevelsStartingAtIncluding(AndroidApiLevel.N)
        .build();
  }

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

  @Test
  public void test() throws Exception {
    testForR8(parameters.getBackend())
        .addInnerClasses(InterfaceInitializedByImplementationTest.class)
        .addKeepMainRule(TestClass.class)
        .enableInliningAnnotations()
        .setMinApi(parameters.getApiLevel())
        .noMinification()
        .compile()
        .inspect(this::inspect)
        .run(parameters.getRuntime(), TestClass.class)
        .assertSuccessWithOutputLines("Hello world!");
  }

  private void inspect(CodeInspector inspector) {
    // Check that A is not removed.
    ClassSubject aClasssubject = inspector.clazz(A.class);
    assertThat(aClasssubject, isPresent());

    // Check that I.<clinit>() is not removed.
    ClassSubject iClassSubject = inspector.clazz(I.class);
    assertThat(iClassSubject, isPresent());
    assertThat(iClassSubject.clinit(), isPresent());

    // Check that B.<clinit>() is not removed.
    ClassSubject bClassSubject = inspector.clazz(B.class);
    assertThat(bClassSubject, isPresent());
    assertThat(bClassSubject.clinit(), isPresent());
  }

  static class TestClass {

    public static void main(String[] args) {
      new A().m();
    }
  }

  interface I {

    B B_INSTANCE = new B();

    // TODO(b/144266257): If tree shaking removes this method, then I.<clinit>() won't be run when
    //  A is being class initialized.
    @NeverInline
    default void m() {
      System.out.println(" world!");
    }
  }

  static class A implements I {}

  static class B {

    static {
      System.out.print("Hello");
    }
  }
}
