// Copyright (c) 2021, 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.ir.optimize.inliner.conditionalsimpleinlining;

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

import com.android.tools.r8.AlwaysInline;
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.codeinspector.ClassSubject;
import com.android.tools.r8.utils.codeinspector.CodeMatchers;
import com.android.tools.r8.utils.codeinspector.MethodSubject;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameter;
import org.junit.runners.Parameterized.Parameters;

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

  @Parameter public TestParameters parameters;

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

  @Test
  public void test() throws Exception {
    testForR8(parameters.getBackend())
        .addInnerClasses(getClass())
        .addKeepMainRule(Main.class)
        .enableAlwaysInliningAnnotations()
        .enableInliningAnnotations()
        // TODO(b/173398086): uniqueMethodWithName() does not work with argument removal.
        .noMinification()
        .setMinApi(parameters.getApiLevel())
        .compile()
        .inspect(
            inspector -> {
              ClassSubject mainClassSubject = inspector.clazz(Main.class);
              assertThat(mainClassSubject, isPresent());

              // Method doStuff() is inlined into main().
              assertThat(mainClassSubject.uniqueMethodWithName("doStuff"), isAbsent());

              // Method checkNotNull() is not inlined.
              MethodSubject checkNotNullMethodSubject =
                  mainClassSubject.uniqueMethodWithName("checkNotNull");
              assertThat(checkNotNullMethodSubject, isPresent());

              // There is a single call to checkNotNull() in main(), as checkNotNull(newObject())
              // is dead code eliminated.
              assertEquals(
                  1,
                  mainClassSubject
                      .mainMethod()
                      .streamInstructions()
                      .filter(CodeMatchers.isInvokeWithTarget(checkNotNullMethodSubject))
                      .count());
            })
        .run(parameters.getRuntime(), Main.class)
        .assertSuccessWithOutputLines(
            "Caught NPE: Parameter specified as non-null is null: method "
                + Main.class.getTypeName()
                + ".main, parameter o");
  }

  static class Main {
    public static void main(String[] args) {
      doStuff(new Object());
      try {
        doStuff(null);
      } catch (NullPointerException e) {
        System.out.println("Caught NPE: " + e.getMessage());
      }
    }

    @AlwaysInline
    static void doStuff(Object o) {
      checkNotNull(o, "o");
    }

    @NeverInline
    static void checkNotNull(Object o, String parameterName) {
      if (o != null) {
        return;
      }
      StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
      int callerStackTraceElementIndex =
          stackTrace[0].getMethodName().equals("getThreadStackTrace") ? 3 : 2;
      StackTraceElement callerStackTraceElement = stackTrace[callerStackTraceElementIndex];
      throw new NullPointerException(
          "Parameter specified as non-null is null: method "
              + callerStackTraceElement.getClassName()
              + "."
              + callerStackTraceElement.getMethodName()
              + ", parameter "
              + parameterName);
    }
  }
}
