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

import static junit.framework.TestCase.assertEquals;

import com.android.tools.r8.DiagnosticsHandler;
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.naming.mappinginformation.MappingInformation;
import com.android.tools.r8.utils.StringUtils;
import com.google.common.io.CharSource;
import java.io.IOException;
import org.junit.Assert;
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 MapReaderVersionTest extends TestBase {

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

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

  private static ClassNameMapper read(DiagnosticsHandler diagnosticsHandler, String... lines)
      throws IOException {
    return ClassNameMapper.mapperFromBufferedReader(
        CharSource.wrap(StringUtils.joinLines(lines)).openBufferedStream(),
        diagnosticsHandler,
        false,
        true);
  }

  private static ClassNameMapper read(String... lines) throws IOException {
    return read(null, lines);
  }

  @Test
  public void testNoVersion() throws IOException {
    ClassNameMapper mapper =
        read("pkg.Foo -> a.a:", "# { id: \"com.android.tools.r8.synthesized\" }");
    assertMapping("a.a", "pkg.Foo", false, mapper);
  }

  @Test
  public void testExperimentalVersion() throws IOException {
    ClassNameMapper mapper =
        read(
            "# { id: 'com.android.tools.r8.mapping', version: 'experimental' }",
            "pkg.Foo -> a.a:",
            "# { id: 'com.android.tools.r8.synthesized' }");
    assertMapping("a.a", "pkg.Foo", true, mapper);
  }

  @Test
  public void testConcatMapFiles() throws IOException {
    TestDiagnosticMessagesImpl diagnostics = new TestDiagnosticMessagesImpl();
    ClassNameMapper mapper =
        read(
            diagnostics,
            // Default map-version is none.
            "pkg.Foo -> a.a:",
            "# { id: 'com.android.tools.r8.synthesized' }",
            // Section with map-version experimental.
            "# { id: 'com.android.tools.r8.mapping', version: 'experimental' }",
            "pkg.Bar -> a.b:",
            "# { id: 'com.android.tools.r8.synthesized' }",
            // Section reverting map-version back to none (to support tooling that
            // concatenates).
            "# { id: 'com.android.tools.r8.mapping', version: 'none' }",
            "pkg.Baz -> a.c:",
            "# { id: 'com.android.tools.r8.synthesized' }");
    diagnostics.assertNoMessages();
    assertMapping("a.a", "pkg.Foo", false, mapper);
    assertMapping("a.b", "pkg.Bar", true, mapper);
    assertMapping("a.c", "pkg.Baz", false, mapper);
  }

  private void assertMapping(
      String finalName, String originalName, boolean isSynthesized, ClassNameMapper mapper) {
    ClassNamingForNameMapper naming = mapper.getClassNaming(finalName);
    assertEquals(originalName, naming.originalName);
    Assert.assertEquals(isSynthesized, isCompilerSynthesized(naming));
  }

  private boolean isCompilerSynthesized(ClassNamingForNameMapper naming) {
    return naming.getAdditionalMappingInfo().stream()
        .anyMatch(MappingInformation::isCompilerSynthesizedMappingInformation);
  }
}
