// 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.retrace.api;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;

import com.android.tools.r8.DiagnosticsHandler;
import com.android.tools.r8.TestParameters;
import com.android.tools.r8.references.ClassReference;
import com.android.tools.r8.references.MethodReference;
import com.android.tools.r8.references.Reference;
import com.android.tools.r8.retrace.ProguardMapProducer;
import com.android.tools.r8.retrace.RetraceFrameResult;
import com.android.tools.r8.retrace.RetraceStackTraceContext;
import com.android.tools.r8.retrace.Retracer;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.OptionalInt;
import java.util.stream.Collectors;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;

@RunWith(Parameterized.class)
public class RetraceApiAmbiguousOriginalRangeTest extends RetraceApiTestBase {

  public RetraceApiAmbiguousOriginalRangeTest(TestParameters parameters) {
    super(parameters);
  }

  @Override
  protected Class<? extends RetraceApiBinaryTest> binaryTestClass() {
    return ApiTest.class;
  }

  public static class ApiTest implements RetraceApiBinaryTest {

    private final ClassReference renamedHolder = Reference.classFromTypeName("a");

    private final String mapping =
        "com.android.tools.r8.naming.retrace.Main -> a:\n"
            + "  1:1:void method():42:44 -> a\n"
            + "  2:4:void method():45:46 -> a\n"
            + "  5:6:void method():47:47 -> a\n";

    @Test
    public void testAmbiguousResult() {
      Retracer retracer =
          Retracer.createDefault(
              ProguardMapProducer.fromString(mapping), new DiagnosticsHandler() {});
      MethodReference methodReference =
          Reference.methodFromDescriptor(renamedHolder.getDescriptor(), "a", "()V");

      // Check that retracing with position one is ambiguous between line 42, 43 and 44.
      RetraceFrameResult retraceFrameResult =
          retracer.retraceFrame(
              RetraceStackTraceContext.empty(), OptionalInt.of(1), methodReference);
      assertTrue(retraceFrameResult.isAmbiguous());
      List<Integer> originalPositions =
          retraceFrameResult.stream()
              .map(element -> element.getTopFrame().getOriginalPositionOrDefault(1))
              .collect(Collectors.toList());
      assertEquals(Arrays.asList(42, 43, 44), originalPositions);

      // Check that retracing with position 3 is ambiguous between 45 and 46.
      retraceFrameResult =
          retracer.retraceFrame(
              RetraceStackTraceContext.empty(), OptionalInt.of(3), methodReference);
      assertTrue(retraceFrameResult.isAmbiguous());
      originalPositions =
          retraceFrameResult.stream()
              .map(element -> element.getTopFrame().getOriginalPositionOrDefault(3))
              .collect(Collectors.toList());
      assertEquals(Arrays.asList(45, 46), originalPositions);

      // Check that retracing with position 5 is not ambiguous.
      retraceFrameResult =
          retracer.retraceFrame(
              RetraceStackTraceContext.empty(), OptionalInt.of(5), methodReference);
      assertFalse(retraceFrameResult.isAmbiguous());
      originalPositions =
          retraceFrameResult.stream()
              .map(element -> element.getTopFrame().getOriginalPositionOrDefault(5))
              .collect(Collectors.toList());
      assertEquals(Collections.singletonList(47), originalPositions);
    }
  }
}
