// 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()
        .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);
    }
  }
}
