Add (ignored) test for tree shaking

Bug: 111199171
Change-Id: Ic08399a4ca8a4d56708f6e98a3451d395a8a703d
diff --git a/src/test/examples/shaking19/Shaking.java b/src/test/examples/shaking19/Shaking.java
new file mode 100644
index 0000000..da8de41
--- /dev/null
+++ b/src/test/examples/shaking19/Shaking.java
@@ -0,0 +1,28 @@
+// Copyright (c) 2018, 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 shaking19;
+
+public class Shaking {
+
+  public static void main(String[] args) {
+    A obj = new B();
+    obj.m();
+  }
+
+  public static class A {
+
+    // Since A is never instantiated and B overrides method m(), this is dead code.
+    public void m() {
+      System.out.println("In A.m()");
+    }
+  }
+
+  public static class B extends A {
+
+    @Override
+    public void m() {
+      System.out.println("In B.m()");
+    }
+  }
+}
diff --git a/src/test/examples/shaking19/keep-rules.txt b/src/test/examples/shaking19/keep-rules.txt
new file mode 100644
index 0000000..cbc332e
--- /dev/null
+++ b/src/test/examples/shaking19/keep-rules.txt
@@ -0,0 +1,9 @@
+# Copyright (c) 2017, 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.
+
+# Keep the application entry point. Get rid of everything that is not
+# reachable from there.
+-keep public class shaking19.Shaking {
+  public static void main(...);
+}
diff --git a/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking19Test.java b/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking19Test.java
new file mode 100644
index 0000000..e5be477
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking19Test.java
@@ -0,0 +1,62 @@
+// Copyright (c) 2018, 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.shaking.examples;
+
+import static com.android.tools.r8.utils.DexInspectorMatchers.isPresent;
+import static org.hamcrest.CoreMatchers.not;
+import static org.junit.Assert.assertThat;
+
+import com.android.tools.r8.TestBase.MinifyMode;
+import com.android.tools.r8.shaking.TreeShakingTest;
+import com.android.tools.r8.utils.DexInspector;
+import com.android.tools.r8.utils.DexInspector.ClassSubject;
+import com.android.tools.r8.utils.DexInspector.MethodSubject;
+import com.google.common.collect.ImmutableList;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+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 TreeShaking19Test extends TreeShakingTest {
+
+  @Parameters(name = "mode:{0}-{1} minify:{2}")
+  public static Collection<Object[]> data() {
+    List<Object[]> parameters = new ArrayList<>();
+    for (MinifyMode minify : MinifyMode.values()) {
+      parameters.add(new Object[] {Frontend.JAR, Backend.CF, minify});
+      parameters.add(new Object[] {Frontend.JAR, Backend.DEX, minify});
+      parameters.add(new Object[] {Frontend.DEX, Backend.DEX, minify});
+    }
+    return parameters;
+  }
+
+  public TreeShaking19Test(Frontend frontend, Backend backend, MinifyMode minify) {
+    super("examples/shaking19", "shaking19.Shaking", frontend, backend, minify);
+  }
+
+  @Ignore("b/111199171")
+  @Test
+  public void test() throws Exception {
+    runTest(
+        TreeShaking19Test::unusedRemoved,
+        null,
+        null,
+        ImmutableList.of("src/test/examples/shaking19/keep-rules.txt"),
+        // Disable vertical class merging to prevent A from being merged into B.
+        opt -> opt.enableClassMerging = false);
+  }
+
+  private static void unusedRemoved(DexInspector inspector) {
+    ClassSubject clazz = inspector.clazz("shaking19.Shaking$A");
+    assertThat(clazz, isPresent());
+
+    MethodSubject method = clazz.method("void", "m", ImmutableList.of());
+    assertThat(method, not(isPresent()));
+  }
+}