[Retrace] Add test for identity mapping

Bug: 202426891
Change-Id: Ic10ad2b8d75d66bf6ac9a43a75d9ff33edf3535b
diff --git a/src/test/java/com/android/tools/r8/retrace/RetraceTests.java b/src/test/java/com/android/tools/r8/retrace/RetraceTests.java
index a50bb98..17ea86d 100644
--- a/src/test/java/com/android/tools/r8/retrace/RetraceTests.java
+++ b/src/test/java/com/android/tools/r8/retrace/RetraceTests.java
@@ -32,6 +32,7 @@
 import com.android.tools.r8.retrace.stacktraces.DifferentLineNumberSpanStackTrace;
 import com.android.tools.r8.retrace.stacktraces.FileNameExtensionStackTrace;
 import com.android.tools.r8.retrace.stacktraces.FoundMethodVerboseStackTrace;
+import com.android.tools.r8.retrace.stacktraces.IdentityMappingStackTrace;
 import com.android.tools.r8.retrace.stacktraces.InlineFileNameStackTrace;
 import com.android.tools.r8.retrace.stacktraces.InlineFileNameWithInnerClassesStackTrace;
 import com.android.tools.r8.retrace.stacktraces.InlineInOutlineStackTrace;
@@ -358,6 +359,11 @@
     runRetraceTest(new OutsideLineRangeStackTraceTest());
   }
 
+  @Test
+  public void testIdentityMappingStackTrace() throws Exception {
+    runRetraceTest(new IdentityMappingStackTrace());
+  }
+
   private void inspectRetraceTest(
       StackTraceForTest stackTraceForTest, Consumer<Retracer> inspection) {
     inspection.accept(
diff --git a/src/test/java/com/android/tools/r8/retrace/stacktraces/IdentityMappingStackTrace.java b/src/test/java/com/android/tools/r8/retrace/stacktraces/IdentityMappingStackTrace.java
new file mode 100644
index 0000000..8c9ce7c
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/retrace/stacktraces/IdentityMappingStackTrace.java
@@ -0,0 +1,82 @@
+// 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.stacktraces;
+
+import com.android.tools.r8.utils.StringUtils;
+import java.util.Arrays;
+import java.util.List;
+
+public class IdentityMappingStackTrace implements StackTraceForTest {
+
+  @Override
+  public List<String> obfuscatedStackTrace() {
+    return Arrays.asList(
+        "java.lang.IndexOutOfBoundsException", "\tat a.a(:10)", "\tat b.a(:11)", "\tat c.a(:12)");
+  }
+
+  @Override
+  public String mapping() {
+    return StringUtils.lines(
+        "com.android.tools.r8.One -> a:",
+        "  10:10:void foo(int) -> a",
+        "com.android.tools.r8.Other -> b:",
+        "  11:11:void bar(int, int) -> a", // This is an inline frame
+        "  11:11:boolean baz(int, int) -> a",
+        "com.android.tools.r8.Third -> c:",
+        "  12:12:void qux(int) -> a", // This is also an inline frame
+        "  12:12:void other(int, int) -> b",
+        "  12:12:boolean quux(int, int) -> a");
+  }
+
+  @Override
+  public List<String> retracedStackTrace() {
+    // TODO(b/202426891): Should not be ambiguous.
+    return Arrays.asList(
+        "java.lang.IndexOutOfBoundsException",
+        "\tat com.android.tools.r8.One.foo(One.java:10)",
+        "\tat com.android.tools.r8.Other.bar(Other.java:11)",
+        "\tat com.android.tools.r8.Third.quux(Third.java:12)",
+        "<OR> java.lang.IndexOutOfBoundsException",
+        "\tat com.android.tools.r8.One.foo(One.java:10)",
+        "\tat com.android.tools.r8.Other.bar(Other.java:11)",
+        "\tat com.android.tools.r8.Third.qux(Third.java:12)",
+        "<OR> java.lang.IndexOutOfBoundsException",
+        "\tat com.android.tools.r8.One.foo(One.java:10)",
+        "\tat com.android.tools.r8.Other.baz(Other.java:11)",
+        "\tat com.android.tools.r8.Third.quux(Third.java:12)",
+        "<OR> java.lang.IndexOutOfBoundsException",
+        "\tat com.android.tools.r8.One.foo(One.java:10)",
+        "\tat com.android.tools.r8.Other.baz(Other.java:11)",
+        "\tat com.android.tools.r8.Third.qux(Third.java:12)");
+  }
+
+  @Override
+  public List<String> retraceVerboseStackTrace() {
+    // TODO(b/202426891): Should not be ambiguous.
+    return Arrays.asList(
+        "There are 4 ambiguous stack traces.",
+        "java.lang.IndexOutOfBoundsException",
+        "\tat com.android.tools.r8.One.void foo(int)(One.java:10)",
+        "\tat com.android.tools.r8.Other.void bar(int,int)(Other.java:11)",
+        "\tat com.android.tools.r8.Third.boolean quux(int,int)(Third.java:12)",
+        "<OR> java.lang.IndexOutOfBoundsException",
+        "\tat com.android.tools.r8.One.void foo(int)(One.java:10)",
+        "\tat com.android.tools.r8.Other.void bar(int,int)(Other.java:11)",
+        "\tat com.android.tools.r8.Third.void qux(int)(Third.java:12)",
+        "<OR> java.lang.IndexOutOfBoundsException",
+        "\tat com.android.tools.r8.One.void foo(int)(One.java:10)",
+        "\tat com.android.tools.r8.Other.boolean baz(int,int)(Other.java:11)",
+        "\tat com.android.tools.r8.Third.boolean quux(int,int)(Third.java:12)",
+        "<OR> java.lang.IndexOutOfBoundsException",
+        "\tat com.android.tools.r8.One.void foo(int)(One.java:10)",
+        "\tat com.android.tools.r8.Other.boolean baz(int,int)(Other.java:11)",
+        "\tat com.android.tools.r8.Third.void qux(int)(Third.java:12)");
+  }
+
+  @Override
+  public int expectedWarnings() {
+    return 0;
+  }
+}