Merge "Add support for inspection diagnostics messages in test framework"
diff --git a/src/test/java/com/android/tools/r8/D8TestBuilder.java b/src/test/java/com/android/tools/r8/D8TestBuilder.java
index 129176a..88d077b 100644
--- a/src/test/java/com/android/tools/r8/D8TestBuilder.java
+++ b/src/test/java/com/android/tools/r8/D8TestBuilder.java
@@ -22,7 +22,7 @@
   }
 
   public static D8TestBuilder create(TestState state) {
-    return new D8TestBuilder(state, D8Command.builder());
+    return new D8TestBuilder(state, D8Command.builder(state.getDiagnosticsHandler()));
   }
 
   @Override
diff --git a/src/test/java/com/android/tools/r8/D8TestCompileResult.java b/src/test/java/com/android/tools/r8/D8TestCompileResult.java
index 178d351..79fb293 100644
--- a/src/test/java/com/android/tools/r8/D8TestCompileResult.java
+++ b/src/test/java/com/android/tools/r8/D8TestCompileResult.java
@@ -18,6 +18,11 @@
   }
 
   @Override
+  public TestDiagnosticMessages getDiagnosticMessages() {
+    return state.getDiagnosticsMessages();
+  }
+
+  @Override
   public D8TestRunResult createRunResult(AndroidApp app, ProcessResult result) {
     return new D8TestRunResult(app, result);
   }
diff --git a/src/test/java/com/android/tools/r8/DXTestCompileResult.java b/src/test/java/com/android/tools/r8/DXTestCompileResult.java
index fa1f314..da6a17a 100644
--- a/src/test/java/com/android/tools/r8/DXTestCompileResult.java
+++ b/src/test/java/com/android/tools/r8/DXTestCompileResult.java
@@ -19,6 +19,11 @@
   }
 
   @Override
+  public TestDiagnosticMessages getDiagnosticMessages() {
+    throw new UnsupportedOperationException("No diagnostics messages from dx");
+  }
+
+  @Override
   public DXTestRunResult createRunResult(AndroidApp app, ProcessResult result) {
     return new DXTestRunResult(app, result);
   }
diff --git a/src/test/java/com/android/tools/r8/ProguardTestCompileResult.java b/src/test/java/com/android/tools/r8/ProguardTestCompileResult.java
index bef1e02..4ea8953 100644
--- a/src/test/java/com/android/tools/r8/ProguardTestCompileResult.java
+++ b/src/test/java/com/android/tools/r8/ProguardTestCompileResult.java
@@ -25,6 +25,11 @@
   }
 
   @Override
+  public TestDiagnosticMessages getDiagnosticMessages() {
+    throw new UnsupportedOperationException("No diagnostics messages from dx");
+  }
+
+  @Override
   public CodeInspector inspector() throws IOException, ExecutionException {
     return new CodeInspector(app, proguardMap);
   }
diff --git a/src/test/java/com/android/tools/r8/R8TestBuilder.java b/src/test/java/com/android/tools/r8/R8TestBuilder.java
index 5550415..ee0e8af 100644
--- a/src/test/java/com/android/tools/r8/R8TestBuilder.java
+++ b/src/test/java/com/android/tools/r8/R8TestBuilder.java
@@ -25,7 +25,9 @@
 
   public static R8TestBuilder create(TestState state, Backend backend, R8Mode mode) {
     R8Command.Builder builder =
-        mode == R8Mode.Full ? R8Command.builder() : new CompatProguardCommandBuilder();
+        mode == R8Mode.Full
+            ? R8Command.builder(state.getDiagnosticsHandler())
+            : new CompatProguardCommandBuilder(true, state.getDiagnosticsHandler());
     return new R8TestBuilder(state, builder, backend);
   }
 
diff --git a/src/test/java/com/android/tools/r8/R8TestCompileResult.java b/src/test/java/com/android/tools/r8/R8TestCompileResult.java
index 35cb176..d27a4a0 100644
--- a/src/test/java/com/android/tools/r8/R8TestCompileResult.java
+++ b/src/test/java/com/android/tools/r8/R8TestCompileResult.java
@@ -27,6 +27,11 @@
   }
 
   @Override
+  public TestDiagnosticMessages getDiagnosticMessages() {
+    return state.getDiagnosticsMessages();
+  }
+
+  @Override
   public CodeInspector inspector() throws IOException, ExecutionException {
     return new CodeInspector(app, proguardMap);
   }
diff --git a/src/test/java/com/android/tools/r8/TestCompileResult.java b/src/test/java/com/android/tools/r8/TestCompileResult.java
index 61f9def..34ffcaa 100644
--- a/src/test/java/com/android/tools/r8/TestCompileResult.java
+++ b/src/test/java/com/android/tools/r8/TestCompileResult.java
@@ -4,6 +4,9 @@
 package com.android.tools.r8;
 
 import static com.android.tools.r8.TestBase.Backend.DEX;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
+import static org.junit.Assert.fail;
 
 import com.android.tools.r8.TestBase.Backend;
 import com.android.tools.r8.ToolHelper.DexVm;
@@ -18,6 +21,7 @@
 import java.io.IOException;
 import java.nio.file.Path;
 import java.util.concurrent.ExecutionException;
+import org.hamcrest.Matcher;
 
 public abstract class TestCompileResult<RR extends TestRunResult> {
   final TestState state;
@@ -30,6 +34,8 @@
 
   public abstract Backend getBackend();
 
+  public abstract TestDiagnosticMessages getDiagnosticMessages();
+
   protected abstract RR createRunResult(AndroidApp add, ProcessResult result);
 
   public RR run(Class<?> mainClass) throws IOException {
@@ -62,6 +68,38 @@
     return this;
   }
 
+  public TestCompileResult<RR> assertNoMessages() {
+    assertEquals(0, getDiagnosticMessages().getInfos().size());
+    assertEquals(0, getDiagnosticMessages().getWarnings().size());
+    assertEquals(0, getDiagnosticMessages().getErrors().size());
+    return this;
+  }
+
+  public TestCompileResult<RR> assertOnlyInfos() {
+    assertNotEquals(0, getDiagnosticMessages().getInfos().size());
+    assertEquals(0, getDiagnosticMessages().getWarnings().size());
+    assertEquals(0, getDiagnosticMessages().getErrors().size());
+    return this;
+  }
+
+  public TestCompileResult<RR> assertOnlyWarnings() {
+    assertEquals(0, getDiagnosticMessages().getInfos().size());
+    assertNotEquals(0, getDiagnosticMessages().getWarnings().size());
+    assertEquals(0, getDiagnosticMessages().getErrors().size());
+    return this;
+  }
+
+  public TestCompileResult<RR> assertWarningMessageThatMatches(Matcher<String> matcher) {
+    assertNotEquals(0, getDiagnosticMessages().getWarnings().size());
+    for (int i = 0; i < getDiagnosticMessages().getWarnings().size(); i++) {
+      if (matcher.matches(getDiagnosticMessages().getWarnings().get(i).getDiagnosticMessage())) {
+        return this;
+      }
+    }
+    fail("No warning matches " + matcher.toString());
+    return this;
+  }
+
   public DebugTestConfig debugConfig() {
     // Rethrow exceptions since debug config is usually used in a delayed wrapper which
     // does not declare exceptions.
diff --git a/src/test/java/com/android/tools/r8/TestDiagnosticMessages.java b/src/test/java/com/android/tools/r8/TestDiagnosticMessages.java
new file mode 100644
index 0000000..3e734cc
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/TestDiagnosticMessages.java
@@ -0,0 +1,16 @@
+// 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.
+
+package com.android.tools.r8;
+
+import java.util.List;
+
+public interface TestDiagnosticMessages {
+
+  public List<Diagnostic> getInfos();
+
+  public List<Diagnostic> getWarnings();
+
+  public List<Diagnostic> getErrors();
+}
diff --git a/src/test/java/com/android/tools/r8/TestDiagnosticMessagesImpl.java b/src/test/java/com/android/tools/r8/TestDiagnosticMessagesImpl.java
new file mode 100644
index 0000000..d0476b9
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/TestDiagnosticMessagesImpl.java
@@ -0,0 +1,41 @@
+// 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.
+
+package com.android.tools.r8;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class TestDiagnosticMessagesImpl implements DiagnosticsHandler, TestDiagnosticMessages {
+  private final List<Diagnostic> infos = new ArrayList<>();
+  private final List<Diagnostic> warnings = new ArrayList<>();
+  private final List<Diagnostic> errors = new ArrayList<>();
+
+  @Override
+  public void info(Diagnostic info) {
+    infos.add(info);
+  }
+
+  @Override
+  public void warning(Diagnostic warning) {
+    warnings.add(warning);
+  }
+
+  @Override
+  public void error(Diagnostic error) {
+    errors.add(error);
+  }
+
+  public List<Diagnostic> getInfos() {
+    return infos;
+  }
+
+  public List<Diagnostic> getWarnings() {
+    return warnings;
+  }
+
+  public List<Diagnostic> getErrors() {
+    return errors;
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/TestState.java b/src/test/java/com/android/tools/r8/TestState.java
index d516c7c..bdb4e2f 100644
--- a/src/test/java/com/android/tools/r8/TestState.java
+++ b/src/test/java/com/android/tools/r8/TestState.java
@@ -10,6 +10,7 @@
 public class TestState {
 
   private final TemporaryFolder temp;
+  private final TestDiagnosticMessagesImpl messages = new TestDiagnosticMessagesImpl();
 
   public TestState(TemporaryFolder temp) {
     this.temp = temp;
@@ -18,4 +19,12 @@
   public Path getNewTempFolder() throws IOException {
     return temp.newFolder().toPath();
   }
+
+  DiagnosticsHandler getDiagnosticsHandler() {
+    return messages;
+  }
+
+  public TestDiagnosticMessages getDiagnosticsMessages() {
+    return messages;
+  }
 }