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

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;

import com.android.tools.r8.Diagnostic;
import com.android.tools.r8.TestBase;
import com.android.tools.r8.TestDiagnosticMessagesImpl;
import com.android.tools.r8.TestParameters;
import com.android.tools.r8.TestParametersCollection;
import com.android.tools.r8.utils.AbortException;
import com.android.tools.r8.utils.FileUtils;
import com.android.tools.r8.utils.Reporter;
import java.io.IOException;
import java.nio.file.Path;
import org.junit.Ignore;
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 SeedMapperTests extends TestBase {

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

  public SeedMapperTests(TestParameters parameters) {
    parameters.assertNoneRuntime();
  }

  private Path getApplyMappingFile(String... pgMap) throws IOException {
    Path mapPath = temp.newFile().toPath();
    FileUtils.writeTextFile(mapPath, pgMap);
    return mapPath;
  }

  @Test
  public void testNoDuplicates() throws IOException {
    Path applyMappingFile =
        getApplyMappingFile(
            "A.B.C -> a:",
            "  int aaaa(B) -> a",
            "  int bbbb(B) -> b",
            "  void cccc() -> a",
            "  B foo       -> a",
            "A.B.D -> b:",
            "  int aaaa(B) -> a");
    TestDiagnosticMessagesImpl testDiagnosticMessages = new TestDiagnosticMessagesImpl();
    Reporter reporter = new Reporter(testDiagnosticMessages);
    SeedMapper.seedMapperFromFile(reporter, applyMappingFile);
    testDiagnosticMessages.assertNoMessages();
  }

  @Test
  public void testDuplicateSourceClasses() throws IOException {
    Path applyMappingFile = getApplyMappingFile("A.B.C -> a:", "A.B.C -> b:");
    TestDiagnosticMessagesImpl testDiagnosticMessages = new TestDiagnosticMessagesImpl();
    Reporter reporter = new Reporter(testDiagnosticMessages);
    try {
      SeedMapper.seedMapperFromFile(reporter, applyMappingFile);
      fail("Should have thrown an error");
    } catch (RuntimeException e) {
      assertEquals(1, testDiagnosticMessages.getErrors().size());
      Diagnostic diagnostic = testDiagnosticMessages.getErrors().get(0);
      assertEquals(
          String.format(ProguardMapError.DUPLICATE_SOURCE_MESSAGE, "A.B.C"),
          diagnostic.getDiagnosticMessage());
      assertEquals("line 2", diagnostic.getPosition().getDescription());
    }
  }

  @Test
  public void testDuplicateSourceMethods() throws IOException {
    Path applyMappingFile =
        getApplyMappingFile(
            "A.B.C -> a:",
            "  int aaaa(B) -> a",
            "  int aaaa(B) -> a",
            "A.B.D -> b:");
    TestDiagnosticMessagesImpl testDiagnosticMessages = new TestDiagnosticMessagesImpl();
    Reporter reporter = new Reporter(testDiagnosticMessages);
    try {
      SeedMapper.seedMapperFromFile(reporter, applyMappingFile);
      fail("Should have thrown an error");
    } catch (RuntimeException e) {
      assertEquals(1, testDiagnosticMessages.getErrors().size());
      Diagnostic diagnostic = testDiagnosticMessages.getErrors().get(0);
      assertEquals(
          String.format(ProguardMapError.DUPLICATE_SOURCE_MEMBER_MESSAGE, "int aaaa(B)", "A.B.C"),
          diagnostic.getDiagnosticMessage());
      assertEquals("line 3", diagnostic.getPosition().getDescription());
    }
  }

  @Test
  public void testDuplicateSourceFields() throws IOException {
    Path applyMappingFile =
        getApplyMappingFile(
            "A.B.C -> a:",
            "  int aaaa -> a",
            "  int aaaa -> a",
            "A.B.D -> b:");
    TestDiagnosticMessagesImpl testDiagnosticMessages = new TestDiagnosticMessagesImpl();
    Reporter reporter = new Reporter(testDiagnosticMessages);
    try {
      SeedMapper.seedMapperFromFile(reporter, applyMappingFile);
      fail("Should have thrown an error");
    } catch (RuntimeException e) {
      assertEquals(1, testDiagnosticMessages.getErrors().size());
      Diagnostic diagnostic = testDiagnosticMessages.getErrors().get(0);
      assertEquals(
          String.format(ProguardMapError.DUPLICATE_SOURCE_MEMBER_MESSAGE, "int aaaa", "A.B.C"),
          diagnostic.getDiagnosticMessage());
      assertEquals("line 3", diagnostic.getPosition().getDescription());
    }
  }

  @Test
  public void testDuplicateClassTargets() throws IOException {
    Path applyMappingFile = getApplyMappingFile("A.B.C -> a:", "A.B.D -> a:");
    TestDiagnosticMessagesImpl testDiagnosticMessages = new TestDiagnosticMessagesImpl();
    Reporter reporter = new Reporter(testDiagnosticMessages);
    try {
      SeedMapper.seedMapperFromFile(reporter, applyMappingFile);
      fail("Should have thrown an error");
    } catch (RuntimeException e) {
      assertEquals(1, testDiagnosticMessages.getErrors().size());
      Diagnostic diagnostic = testDiagnosticMessages.getErrors().get(0);
      assertEquals(
          String.format(ProguardMapError.DUPLICATE_TARGET_MESSAGE, "A.B.D", "A.B.C", "a"),
          diagnostic.getDiagnosticMessage());
      assertEquals("line 2", diagnostic.getPosition().getDescription());
    }
  }

  @Test
  public void testSameNameMethodTargets() throws IOException {
    Path applyMappingFile =
        getApplyMappingFile(
            "A.B.C -> A:",
            "  int foo(A) -> a",
            "  int bar(B) -> a",
            "  int baz(A,B) -> a",
            "A.B.D -> b:");
    TestDiagnosticMessagesImpl testDiagnosticMessages = new TestDiagnosticMessagesImpl();
    Reporter reporter = new Reporter(testDiagnosticMessages);
    SeedMapper.seedMapperFromFile(reporter, applyMappingFile);
    testDiagnosticMessages.assertNoMessages();
  }

  @Test
  @Ignore("b/136697829")
  public void testDuplicateMethodTargets() throws IOException {
    Path applyMappingFile =
        getApplyMappingFile(
            "A.B.C -> a:",
            "  int foo(A) -> a",
            "  int bar(A) -> a",
            "A.B.D -> b:");
    TestDiagnosticMessagesImpl testDiagnosticMessages = new TestDiagnosticMessagesImpl();
    Reporter reporter = new Reporter(testDiagnosticMessages);
    try {
      SeedMapper.seedMapperFromFile(reporter, applyMappingFile);
      fail("Should have thrown an error");
    } catch (AbortException e) {
      assertEquals(1, testDiagnosticMessages.getErrors().size());
      Diagnostic diagnostic = testDiagnosticMessages.getErrors().get(0);
      assertEquals(
          String.format(ProguardMapError.DUPLICATE_TARGET_MESSAGE, "int bar(A)", "int foo(A)", "a"),
          diagnostic.getDiagnosticMessage());
      assertEquals("line 2", diagnostic.getPosition().getDescription());
    }
  }

  @Test
  public void testInliningFrames() throws IOException {
    Path applyMappingFile =
        getApplyMappingFile(
            "A.B.C -> a:",
            "  int foo(A) -> a",
            "  1:2:int bar(A):3:4 -> a",
            "  1:2:int baz(B):3 -> a");
    TestDiagnosticMessagesImpl testDiagnosticMessages = new TestDiagnosticMessagesImpl();
    Reporter reporter = new Reporter(testDiagnosticMessages);
    SeedMapper.seedMapperFromFile(reporter, applyMappingFile);
  }

  @Test
  public void testDuplicateInliningFrames() throws IOException {
    Path applyMappingFile =
        getApplyMappingFile(
            "A.B.C -> a:",
            "  int foo(Z) -> a",
            "  1:1:int qux(A):3:3 -> a",
            "  1:1:int bar(A):3 -> a",
            "  2:2:int qux(A):3:3 -> a",
            "  2:2:int bar(A):4 -> a",
            "  3:3:int bar(A):5:5 -> a",
            "  int qux(C) -> a");
    TestDiagnosticMessagesImpl testDiagnosticMessages = new TestDiagnosticMessagesImpl();
    Reporter reporter = new Reporter(testDiagnosticMessages);
    SeedMapper.seedMapperFromFile(reporter, applyMappingFile);
  }

  @Test
  public void testMultipleInitRanges() throws IOException {
    Path applyMappingFile =
        getApplyMappingFile(
            "com.android.tools.r8.ArchiveClassFileProvider ->"
                + " com.android.tools.r8.ArchiveClassFileProvider:",
            "    1:1:void <init>(java.nio.file.Path):50:50 -> <init>",
            "    2:2:void <init>(java.nio.file.Path):59:59 -> <init>",
            "    boolean lambda$new$0(java.lang.String) -> a");
    TestDiagnosticMessagesImpl testDiagnosticMessages = new TestDiagnosticMessagesImpl();
    Reporter reporter = new Reporter(testDiagnosticMessages);
    SeedMapper.seedMapperFromFile(reporter, applyMappingFile);
  }
}
