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

import com.android.tools.r8.ToolHelper.KotlinTargetVersion;
import com.android.tools.r8.naming.MemberNaming.MethodSignature;
import com.android.tools.r8.utils.codeinspector.ClassSubject;
import com.android.tools.r8.utils.codeinspector.CodeInspector;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Lists;
import java.util.Collections;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;

@RunWith(Parameterized.class)
public class R8KotlinIntrinsicsTest extends AbstractR8KotlinTestBase {

  private static final TestKotlinDataClass KOTLIN_INTRINSICS_CLASS =
      new TestKotlinDataClass("kotlin.jvm.internal.Intrinsics");

  public R8KotlinIntrinsicsTest(
      KotlinTargetVersion targetVersion, boolean allowAccessModification) {
    super(targetVersion, allowAccessModification);
  }

  @Test
  public void testParameterNullCheckIsInlined() throws Exception {
    final String extraRules = keepClassMethod("intrinsics.IntrinsicsKt",
        new MethodSignature("expectsNonNullParameters",
            "java.lang.String", Lists.newArrayList("java.lang.String", "java.lang.String")));

    runTest("intrinsics", "intrinsics.IntrinsicsKt", extraRules, (app) -> {
      CodeInspector codeInspector = new CodeInspector(app);
      ClassSubject intrinsicsClass = checkClassIsKept(
          codeInspector, KOTLIN_INTRINSICS_CLASS.getClassName());

      checkMethodsPresence(intrinsicsClass,
          ImmutableMap.<MethodSignature, Boolean>builder()
              .put(new MethodSignature("throwParameterIsNullException",
                      "void", Collections.singletonList("java.lang.String")),
                  true)
              .put(new MethodSignature("checkParameterIsNotNull",
                      "void", Lists.newArrayList("java.lang.Object", "java.lang.String")),
                  allowAccessModification ? false /* should be inlined*/ : true)
              .build());
    });
  }
}
