Add tests for composition of member rebinding and apply mapping.
Bug: 110067602
Change-Id: I2650fc8ad026be20638dc02d0f5224013ce15d41
diff --git a/src/test/java/com/android/tools/r8/memberrebinding/CompositionalLenseTest.java b/src/test/java/com/android/tools/r8/memberrebinding/CompositionalLenseTest.java
new file mode 100644
index 0000000..aba14cf
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/memberrebinding/CompositionalLenseTest.java
@@ -0,0 +1,89 @@
+// 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.memberrebinding;
+
+import static com.android.tools.r8.utils.DexInspectorMatchers.isPresent;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertThat;
+import static org.junit.Assert.assertTrue;
+
+import com.android.tools.r8.R8Command;
+import com.android.tools.r8.TestBase;
+import com.android.tools.r8.ToolHelper;
+import com.android.tools.r8.graph.DexCode;
+import com.android.tools.r8.code.InvokeVirtual;
+import com.android.tools.r8.graph.DexMethod;
+import com.android.tools.r8.origin.Origin;
+import com.android.tools.r8.utils.AndroidApp;
+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.android.tools.r8.utils.FileUtils;
+import com.google.common.collect.ImmutableList;
+import java.nio.file.Path;
+import java.util.List;
+import org.junit.Test;
+
+// Base -> X:
+class Base {
+ // foo() -> bar
+ void foo() {
+ System.out.println("Base#foo");
+ }
+}
+
+// Sub -> Y:
+class Sub extends Base {
+ // foo() -> bar
+ // Sub#foo ~> Base#foo by member rebinding analysis
+}
+
+class TestMain {
+ public static void main(String[] args) {
+ // Without regard to the order of member rebinding and apply mapping,
+ // this call should be mapped to X.bar(), not Y.bar() nor Base.foo().
+ new Sub().foo();
+ }
+}
+
+public class CompositionalLenseTest extends TestBase {
+ private final static List<Class> CLASSES =
+ ImmutableList.of(Base.class, Sub.class, TestMain.class);
+
+ @Test
+ public void test() throws Exception {
+ Path mapPath = temp.newFile("test-mapping.txt").toPath();
+ List<String> pgMap = ImmutableList.of(
+ "com.android.tools.r8.memberrebinding.Base -> X:",
+ " void foo() -> bar",
+ "com.android.tools.r8.memberrebinding.Sub -> Y:",
+ " void foo() -> bar"
+ );
+ FileUtils.writeTextFile(mapPath, pgMap);
+
+ AndroidApp app = readClasses(CLASSES);
+ R8Command.Builder builder = ToolHelper.prepareR8CommandBuilder(app);
+ builder.addProguardConfiguration(
+ ImmutableList.of(
+ keepMainProguardConfiguration(TestMain.class),
+ "-applymapping " + mapPath,
+ "-dontobfuscate"), // to use the renamed names in test-mapping.txt
+ Origin.unknown());
+ AndroidApp processedApp = ToolHelper.runR8(builder.build(), options -> {
+ options.enableInlining = false;
+ options.enableClassMerging = false;
+ });
+ DexInspector dexInspector = new DexInspector(processedApp);
+ ClassSubject classSubject = dexInspector.clazz(TestMain.class);
+ assertThat(classSubject, isPresent());
+ MethodSubject methodSubject = classSubject.method(DexInspector.MAIN);
+ assertThat(methodSubject, isPresent());
+ DexCode dexCode = methodSubject.getMethod().getCode().asDexCode();
+ assertTrue(dexCode.instructions[2] instanceof InvokeVirtual);
+ InvokeVirtual invoke = (InvokeVirtual) dexCode.instructions[2];
+ DexMethod invokedMethod = invoke.getMethod();
+ assertEquals("bar", invokedMethod.name.toString());
+ assertEquals("X", invokedMethod.getHolder().getName());
+ }
+}
diff --git a/src/test/java/com/android/tools/r8/naming/ApplyMappingTest.java b/src/test/java/com/android/tools/r8/naming/ApplyMappingTest.java
index 38af4de..bf6c895 100644
--- a/src/test/java/com/android/tools/r8/naming/ApplyMappingTest.java
+++ b/src/test/java/com/android/tools/r8/naming/ApplyMappingTest.java
@@ -13,6 +13,7 @@
import com.android.tools.r8.OutputMode;
import com.android.tools.r8.R8Command;
import com.android.tools.r8.StringConsumer;
+import com.android.tools.r8.TestBase;
import com.android.tools.r8.ToolHelper;
import com.android.tools.r8.code.Instruction;
import com.android.tools.r8.code.NewInstance;
@@ -31,11 +32,9 @@
import java.util.Iterator;
import java.util.concurrent.ExecutionException;
import org.junit.Before;
-import org.junit.Rule;
import org.junit.Test;
-import org.junit.rules.TemporaryFolder;
-public class ApplyMappingTest {
+public class ApplyMappingTest extends TestBase {
private static final String MAPPING = "test-mapping.txt";
@@ -51,9 +50,6 @@
private static final Path APPLYMAPPING044_JAR =
Paths.get(ToolHelper.EXAMPLES_BUILD_DIR, "applymapping044" + FileUtils.JAR_EXTENSION);
- @Rule
- public TemporaryFolder temp = ToolHelper.getTemporaryFolderForTest();
-
private Path out;
@Before