// 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.graph.invokespecial;

import static com.android.tools.r8.utils.DescriptorUtils.javaTypeToDescriptor;
import static org.hamcrest.CoreMatchers.containsString;

import com.android.tools.r8.AsmTestBase;
import com.android.tools.r8.ByteDataView;
import com.android.tools.r8.ClassFileConsumer;
import com.android.tools.r8.CompilationFailedException;
import com.android.tools.r8.ToolHelper;
import com.android.tools.r8.ToolHelper.DexVm.Version;
import com.android.tools.r8.utils.StringUtils;
import java.nio.file.Path;
import org.junit.BeforeClass;
import org.junit.ClassRule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;

public class InvokeSpecialTest extends AsmTestBase {

  @ClassRule
  public static TemporaryFolder tempFolder = ToolHelper.getTemporaryFolderForTest();

  private static Path inputJar;

  @BeforeClass
  public static void setup() throws Exception {
    inputJar = tempFolder.getRoot().toPath().resolve("input.jar");
    ClassFileConsumer consumer = new ClassFileConsumer.ArchiveConsumer(inputJar);
    consumer.accept(
        ByteDataView.of(ToolHelper.getClassAsBytes(Main.class)),
        javaTypeToDescriptor(Main.class.getTypeName()),
        null);
    consumer.accept(
        ByteDataView.of(TestClassDump.dump()),
        javaTypeToDescriptor(TestClass.class.getTypeName()),
        null);
    consumer.finished(null);
  }

  @Test
  public void testExpectedBehavior() throws Exception {
    testForJvm()
        .addProgramClasses(Main.class, TestClass.class)
        .run(Main.class)
        .assertSuccessWithOutput(StringUtils.lines("true", "false"));
  }

  @Test(expected = CompilationFailedException.class)
  public void testD8Behavior() throws Exception {
    // TODO(b/110175213): Should succeed with output "true\nfalse\n".
    testForD8()
        .addProgramFiles(inputJar)
        .compileWithExpectedDiagnostics(
            testDiagnosticMessages ->
                testDiagnosticMessages.assertErrorMessageThatMatches(
                    containsString("Failed to compile unsupported use of invokespecial")));
  }

  @Test
  public void testDXBehavior() throws Exception {
    testForDX()
        .addProgramFiles(inputJar)
        .run(Main.class)
        .assertFailureWithErrorThatMatches(containsString(getExpectedOutput()));
  }

  private static String getExpectedOutput() {
    if (ToolHelper.getDexVm().getVersion().isOlderThanOrEqual(Version.V4_4_4)) {
      return "VFY: unable to resolve direct method";
    }
    return "was expected to be of type direct but instead was found to be of type virtual";
  }
}
