Update tests of -checkdiscard in the standalone main dex list generator

This adds testing of the MainDexListGenerator through the testing
infrastructure.

Bug: 116774422
Change-Id: I3fc18de0c42ac15e2bd62f3a359cae3af0d9a877
diff --git a/src/main/java/com/android/tools/r8/GenerateMainDexList.java b/src/main/java/com/android/tools/r8/GenerateMainDexList.java
index 1be9b3a..14dd1ae 100644
--- a/src/main/java/com/android/tools/r8/GenerateMainDexList.java
+++ b/src/main/java/com/android/tools/r8/GenerateMainDexList.java
@@ -75,7 +75,7 @@
 
       if (!mainDexRootSet.checkDiscarded.isEmpty()) {
         new DiscardedChecker(
-            mainDexRootSet, mainDexClasses.getClasses(), appView.appInfo(), options)
+                mainDexRootSet, mainDexClasses.getClasses(), appView.appInfo(), options)
             .run();
       }
       // Print -whyareyoukeeping results if any.
diff --git a/src/test/java/com/android/tools/r8/GenerateMainDexListResult.java b/src/test/java/com/android/tools/r8/GenerateMainDexListResult.java
new file mode 100644
index 0000000..392a72b
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/GenerateMainDexListResult.java
@@ -0,0 +1,17 @@
+// Copyright (c) 2019, 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;
+
+public class GenerateMainDexListResult
+    extends TestBaseResult<GenerateMainDexListResult, GenerateMainDexListRunResult> {
+
+  GenerateMainDexListResult(TestState state) {
+    super(state);
+  }
+
+  @Override
+  public GenerateMainDexListResult self() {
+    return this;
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/GenerateMainDexListRunResult.java b/src/test/java/com/android/tools/r8/GenerateMainDexListRunResult.java
new file mode 100644
index 0000000..b9842f2
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/GenerateMainDexListRunResult.java
@@ -0,0 +1,22 @@
+// Copyright (c) 2019, 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;
+
+import java.util.List;
+
+public class GenerateMainDexListRunResult extends TestRunResult<GenerateMainDexListRunResult> {
+
+  List<String> mainDexList;
+
+  public GenerateMainDexListRunResult(List<String> mainDexList) {
+    super(null, null);
+    this.mainDexList = mainDexList;
+  }
+
+  @Override
+  protected GenerateMainDexListRunResult self() {
+    return this;
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/GenerateMainDexListTestBuilder.java b/src/test/java/com/android/tools/r8/GenerateMainDexListTestBuilder.java
new file mode 100644
index 0000000..6eae670
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/GenerateMainDexListTestBuilder.java
@@ -0,0 +1,64 @@
+// Copyright (c) 2019, 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;
+
+import com.android.tools.r8.GenerateMainDexListCommand.Builder;
+import com.android.tools.r8.debug.DebugTestConfig;
+import com.android.tools.r8.errors.Unimplemented;
+import com.android.tools.r8.origin.Origin;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+
+public class GenerateMainDexListTestBuilder
+    extends TestBaseBuilder<
+        GenerateMainDexListCommand,
+        Builder,
+        GenerateMainDexListResult,
+        GenerateMainDexListRunResult,
+        GenerateMainDexListTestBuilder> {
+
+  private GenerateMainDexListTestBuilder(TestState state, Builder builder) {
+    super(state, builder);
+  }
+
+  public static GenerateMainDexListTestBuilder create(TestState state) {
+    return new GenerateMainDexListTestBuilder(state, GenerateMainDexListCommand.builder());
+  }
+
+  @Override
+  GenerateMainDexListTestBuilder self() {
+    return this;
+  }
+
+  @Override
+  public GenerateMainDexListRunResult run(String mainClass)
+      throws IOException, CompilationFailedException {
+    throw new Unimplemented("No support for running with a main class");
+  }
+
+  @Override
+  public GenerateMainDexListRunResult run(Class mainClass)
+      throws IOException, CompilationFailedException {
+    throw new Unimplemented("No support for running with a main class");
+  }
+
+  public DebugTestConfig debugConfig() {
+    throw new Unimplemented("No support for debug configuration");
+  }
+
+  public GenerateMainDexListRunResult run() throws CompilationFailedException {
+    return new GenerateMainDexListRunResult(GenerateMainDexList.run(builder.build()));
+  }
+
+  public GenerateMainDexListTestBuilder addMainDexRules(Collection<String> rules) {
+    builder.addMainDexRules(new ArrayList<>(rules), Origin.unknown());
+    return self();
+  }
+
+  public GenerateMainDexListTestBuilder addMainDexRules(String... rules) {
+    return addMainDexRules(Arrays.asList(rules));
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/TestBase.java b/src/test/java/com/android/tools/r8/TestBase.java
index c24ed3b..1df6808 100644
--- a/src/test/java/com/android/tools/r8/TestBase.java
+++ b/src/test/java/com/android/tools/r8/TestBase.java
@@ -103,6 +103,10 @@
     return ProguardTestBuilder.create(new TestState(temp));
   }
 
+  public static GenerateMainDexListTestBuilder testForMainDexListGenerator(TemporaryFolder temp) {
+    return GenerateMainDexListTestBuilder.create(new TestState(temp));
+  }
+
   public R8TestBuilder testForR8(Backend backend) {
     return testForR8(temp, backend);
   }
@@ -131,6 +135,10 @@
     return testForProguard(temp);
   }
 
+  public GenerateMainDexListTestBuilder testForMainDexListGenerator() {
+    return testForMainDexListGenerator(temp);
+  }
+
   public enum Backend {
     CF,
     DEX
diff --git a/src/test/java/com/android/tools/r8/TestBaseBuilder.java b/src/test/java/com/android/tools/r8/TestBaseBuilder.java
new file mode 100644
index 0000000..5fcd1b5
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/TestBaseBuilder.java
@@ -0,0 +1,50 @@
+// Copyright (c) 2019, 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;
+
+import com.android.tools.r8.origin.Origin;
+import java.nio.file.Path;
+import java.util.Collection;
+
+public abstract class TestBaseBuilder<
+        C extends BaseCommand,
+        B extends BaseCommand.Builder<C, B>,
+        CR extends TestBaseResult<CR, RR>,
+        RR extends TestRunResult,
+        T extends TestBaseBuilder<C, B, CR, RR, T>>
+    extends TestBuilder<RR, T> {
+
+  final B builder;
+
+  TestBaseBuilder(TestState state, B builder) {
+    super(state);
+    this.builder = builder;
+  }
+
+  @Override
+  public T addProgramClassFileData(Collection<byte[]> classes) {
+    for (byte[] clazz : classes) {
+      builder.addClassProgramData(clazz, Origin.unknown());
+    }
+    return self();
+  }
+
+  @Override
+  public T addProgramFiles(Collection<Path> files) {
+    builder.addProgramFiles(files);
+    return self();
+  }
+
+  @Override
+  public T addLibraryFiles(Collection<Path> files) {
+    builder.addLibraryFiles(files);
+    return self();
+  }
+
+  public T addMainDexListFiles(Collection<Path> files) {
+    builder.addMainDexListFiles(files);
+    return self();
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/TestBaseResult.java b/src/test/java/com/android/tools/r8/TestBaseResult.java
new file mode 100644
index 0000000..e7623a3
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/TestBaseResult.java
@@ -0,0 +1,15 @@
+// Copyright (c) 2019, 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;
+
+public abstract class TestBaseResult<CR extends TestBaseResult<CR, RR>, RR extends TestRunResult> {
+  final TestState state;
+
+  TestBaseResult(TestState state) {
+    this.state = state;
+  }
+
+  public abstract CR self();
+}
diff --git a/src/test/java/com/android/tools/r8/TestCompileResult.java b/src/test/java/com/android/tools/r8/TestCompileResult.java
index 9700d56..d74fab5 100644
--- a/src/test/java/com/android/tools/r8/TestCompileResult.java
+++ b/src/test/java/com/android/tools/r8/TestCompileResult.java
@@ -26,19 +26,17 @@
 import org.hamcrest.Matcher;
 
 public abstract class TestCompileResult<
-    CR extends TestCompileResult<CR, RR>, RR extends TestRunResult> {
+        CR extends TestCompileResult<CR, RR>, RR extends TestRunResult>
+    extends TestBaseResult<CR, RR> {
 
-  final TestState state;
   public final AndroidApp app;
   final List<Path> additionalRunClassPath = new ArrayList<>();
 
   TestCompileResult(TestState state, AndroidApp app) {
-    this.state = state;
+    super(state);
     this.app = app;
   }
 
-  public abstract CR self();
-
   public abstract Backend getBackend();
 
   public abstract TestDiagnosticMessages getDiagnosticMessages();
diff --git a/src/test/java/com/android/tools/r8/TestCompilerBuilder.java b/src/test/java/com/android/tools/r8/TestCompilerBuilder.java
index cbd0cb9..77dc0df 100644
--- a/src/test/java/com/android/tools/r8/TestCompilerBuilder.java
+++ b/src/test/java/com/android/tools/r8/TestCompilerBuilder.java
@@ -5,7 +5,6 @@
 
 import com.android.tools.r8.TestBase.Backend;
 import com.android.tools.r8.debug.DebugTestConfig;
-import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.AndroidApp;
 import com.android.tools.r8.utils.AndroidAppConsumers;
@@ -24,7 +23,7 @@
         CR extends TestCompileResult<CR, RR>,
         RR extends TestRunResult,
         T extends TestCompilerBuilder<C, B, CR, RR, T>>
-    extends TestBuilder<RR, T> {
+    extends TestBaseBuilder<C, B, CR, RR, T> {
 
   public static final Consumer<InternalOptions> DEFAULT_OPTIONS =
       new Consumer<InternalOptions>() {
@@ -32,7 +31,6 @@
         public void accept(InternalOptions options) {}
       };
 
-  final B builder;
   final Backend backend;
 
   // Default initialized setup. Can be overwritten if needed.
@@ -44,8 +42,7 @@
   private PrintStream stdout = null;
 
   TestCompilerBuilder(TestState state, B builder, Backend backend) {
-    super(state);
-    this.builder = builder;
+    super(state, builder);
     this.backend = backend;
     defaultLibrary = TestBase.runtimeJar(backend);
     programConsumer = TestBase.emptyConsumer(backend);
@@ -135,30 +132,10 @@
     return self();
   }
 
-  public T addMainDexListFiles(Collection<Path> files) {
-    builder.addMainDexListFiles(files);
-    return self();
-  }
-
-  @Override
-  public T addProgramClassFileData(Collection<byte[]> classes) {
-    for (byte[] clazz : classes) {
-      builder.addClassProgramData(clazz, Origin.unknown());
-    }
-    return self();
-  }
-
-  @Override
-  public T addProgramFiles(Collection<Path> files) {
-    builder.addProgramFiles(files);
-    return self();
-  }
-
   @Override
   public T addLibraryFiles(Collection<Path> files) {
     defaultLibrary = null;
-    builder.addLibraryFiles(files);
-    return self();
+    return super.addLibraryFiles(files);
   }
 
   public T noDesugaring() {
diff --git a/src/test/java/com/android/tools/r8/maindexlist/checkdiscard/MainDexListCheckDiscard.java b/src/test/java/com/android/tools/r8/maindexlist/checkdiscard/MainDexListCheckDiscard.java
index 16958a6..125c364 100644
--- a/src/test/java/com/android/tools/r8/maindexlist/checkdiscard/MainDexListCheckDiscard.java
+++ b/src/test/java/com/android/tools/r8/maindexlist/checkdiscard/MainDexListCheckDiscard.java
@@ -5,16 +5,10 @@
 package com.android.tools.r8.maindexlist.checkdiscard;
 
 import com.android.tools.r8.CompilationFailedException;
-import com.android.tools.r8.CompilationMode;
-import com.android.tools.r8.GenerateMainDexList;
-import com.android.tools.r8.GenerateMainDexListCommand;
-import com.android.tools.r8.OutputMode;
-import com.android.tools.r8.R8Command;
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.errors.Unreachable;
-import com.android.tools.r8.origin.Origin;
-import com.android.tools.r8.utils.ListUtils;
+import com.android.tools.r8.utils.AndroidApiLevel;
 import com.google.common.collect.ImmutableList;
 import java.util.List;
 import org.junit.Assert;
@@ -54,33 +48,24 @@
     this.command = command;
   }
 
-
   public void runTestWithR8(String checkDiscardRule) throws Exception {
-    R8Command command =
-        ToolHelper.prepareR8CommandBuilder(
-                readClasses(HelloWorldMain.class, MainDexClass.class, NonMainDexClass.class))
-            .addMainDexRules(
-                ImmutableList.of(keepMainProguardConfiguration(HelloWorldMain.class)),
-                Origin.unknown())
-            .addMainDexRules(ImmutableList.of(checkDiscardRule), Origin.unknown())
-            .setOutput(temp.getRoot().toPath(), OutputMode.DexIndexed)
-            .setMode(CompilationMode.RELEASE)
-            .setDisableTreeShaking(true)
-            .setDisableMinification(true)
-            .build();
-    ToolHelper.runR8(command);
+    testForR8(Backend.DEX)
+        .addProgramClasses(CLASSES)
+        .setMinApi(AndroidApiLevel.K)
+        .addMainDexRules(keepMainProguardConfiguration(HelloWorldMain.class))
+        .addMainDexRules(checkDiscardRule)
+        .noTreeShaking()
+        .noMinification()
+        .compile();
   }
 
   public void runTestWithGenerator(String checkDiscardRule) throws Exception {
-    GenerateMainDexListCommand.Builder builder =
-        GenerateMainDexListCommand.builder()
-            .addProgramFiles(ListUtils.map(CLASSES, ToolHelper::getClassFileForTestClass))
-            .addLibraryFiles(ToolHelper.getDefaultAndroidJar())
-            .addMainDexRules(
-                ImmutableList.of(keepMainProguardConfiguration(HelloWorldMain.class)),
-                Origin.unknown())
-            .addMainDexRules(ImmutableList.of(checkDiscardRule), Origin.unknown());
-    GenerateMainDexList.run(builder.build());
+    testForMainDexListGenerator()
+        .addProgramClasses(CLASSES)
+        .addLibraryFiles(ToolHelper.getDefaultAndroidJar())
+        .addMainDexRules(keepMainProguardConfiguration(HelloWorldMain.class))
+        .addMainDexRules(checkDiscardRule)
+        .run();
   }
 
   public void runTest(String checkDiscardRule, boolean shouldFail) throws Exception {