|  | // 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 static com.android.tools.r8.DiagnosticsMatcher.diagnosticMessage; | 
|  | import static org.hamcrest.CoreMatchers.not; | 
|  | import static org.junit.Assert.assertEquals; | 
|  |  | 
|  | import com.android.tools.r8.diagnosticinspector.DiagnosticSubject; | 
|  | import com.android.tools.r8.diagnosticinspector.FoundDiagnosticSubject; | 
|  | import java.util.Arrays; | 
|  | import java.util.Collection; | 
|  | import java.util.Collections; | 
|  | import java.util.Iterator; | 
|  | import java.util.List; | 
|  | import org.hamcrest.Matcher; | 
|  |  | 
|  | public abstract class TestDiagnosticMessages { | 
|  |  | 
|  | public abstract List<Diagnostic> getInfos(); | 
|  |  | 
|  | public abstract List<Diagnostic> getWarnings(); | 
|  |  | 
|  | public final TestDiagnosticMessages inspectWarning( | 
|  | int index, ThrowableConsumer<DiagnosticSubject> consumer) { | 
|  | consumer.acceptWithRuntimeException(new FoundDiagnosticSubject<>(getWarnings().get(index))); | 
|  | return this; | 
|  | } | 
|  |  | 
|  | @SafeVarargs | 
|  | @SuppressWarnings("unchecked") | 
|  | public final TestDiagnosticMessages inspectWarnings( | 
|  | ThrowableConsumer<DiagnosticSubject>... consumers) { | 
|  | return inspectWarnings(Arrays.asList(consumers)); | 
|  | } | 
|  |  | 
|  | public final TestDiagnosticMessages inspectWarnings( | 
|  | Collection<ThrowableConsumer<DiagnosticSubject>> consumers) { | 
|  | assertEquals(consumers.size(), getWarnings().size()); | 
|  | Iterator<ThrowableConsumer<DiagnosticSubject>> consumerIterator = consumers.iterator(); | 
|  | Iterator<Diagnostic> warningIterator = getWarnings().iterator(); | 
|  | for (int i = 0; i < consumers.size(); i++) { | 
|  | consumerIterator | 
|  | .next() | 
|  | .acceptWithRuntimeException(new FoundDiagnosticSubject<>(warningIterator.next())); | 
|  | } | 
|  | return this; | 
|  | } | 
|  |  | 
|  | public abstract List<Diagnostic> getErrors(); | 
|  |  | 
|  | @SafeVarargs | 
|  | @SuppressWarnings("unchecked") | 
|  | public final TestDiagnosticMessages inspectErrors( | 
|  | ThrowableConsumer<DiagnosticSubject>... consumers) { | 
|  | return inspectErrors(Arrays.asList(consumers)); | 
|  | } | 
|  |  | 
|  | public final TestDiagnosticMessages inspectErrors( | 
|  | Collection<ThrowableConsumer<DiagnosticSubject>> consumers) { | 
|  | assertEquals(consumers.size(), getErrors().size()); | 
|  | Iterator<ThrowableConsumer<DiagnosticSubject>> consumerIterator = consumers.iterator(); | 
|  | Iterator<Diagnostic> errorIterator = getErrors().iterator(); | 
|  | for (int i = 0; i < consumers.size(); i++) { | 
|  | consumerIterator | 
|  | .next() | 
|  | .acceptWithRuntimeException(new FoundDiagnosticSubject<>(errorIterator.next())); | 
|  | } | 
|  | return this; | 
|  | } | 
|  |  | 
|  | public abstract TestDiagnosticMessages assertNoMessages(); | 
|  |  | 
|  | public abstract TestDiagnosticMessages assertHasWarnings(); | 
|  |  | 
|  | public abstract TestDiagnosticMessages assertOnlyInfos(); | 
|  |  | 
|  | public abstract TestDiagnosticMessages assertOnlyWarnings(); | 
|  |  | 
|  | public abstract TestDiagnosticMessages assertOnlyErrors(); | 
|  |  | 
|  | public abstract TestDiagnosticMessages assertInfosCount(int count); | 
|  |  | 
|  | public abstract TestDiagnosticMessages assertWarningsCount(int count); | 
|  |  | 
|  | public abstract TestDiagnosticMessages assertErrorsCount(int count); | 
|  |  | 
|  | public final TestDiagnosticMessages assertNoInfos() { | 
|  | return assertInfosMatch(Collections.emptyList()); | 
|  | } | 
|  |  | 
|  | public final TestDiagnosticMessages assertNoWarnings() { | 
|  | return assertWarningsMatch(Collections.emptyList()); | 
|  | } | 
|  |  | 
|  | public final TestDiagnosticMessages assertNoErrors() { | 
|  | return assertErrorsMatch(Collections.emptyList()); | 
|  | } | 
|  |  | 
|  | // Match exact. | 
|  |  | 
|  | public final TestDiagnosticMessages assertDiagnosticsMatch(Matcher<Diagnostic> matcher) { | 
|  | return assertDiagnosticsMatch(Collections.singletonList(matcher)); | 
|  | } | 
|  |  | 
|  | public abstract TestDiagnosticMessages assertDiagnosticsMatch( | 
|  | Collection<Matcher<Diagnostic>> matchers); | 
|  |  | 
|  | public final TestDiagnosticMessages assertInfosMatch(Matcher<Diagnostic> matcher) { | 
|  | return assertInfosMatch(Collections.singletonList(matcher)); | 
|  | } | 
|  |  | 
|  | @SafeVarargs | 
|  | public final TestDiagnosticMessages assertInfosMatch(Matcher<Diagnostic>... matchers) { | 
|  | return assertInfosMatch(Arrays.asList(matchers)); | 
|  | } | 
|  |  | 
|  | public abstract TestDiagnosticMessages assertInfosMatch(Collection<Matcher<Diagnostic>> matchers); | 
|  |  | 
|  | public final TestDiagnosticMessages assertWarningsMatch(Matcher<Diagnostic> matcher) { | 
|  | return assertWarningsMatch(Collections.singletonList(matcher)); | 
|  | } | 
|  |  | 
|  | @SafeVarargs | 
|  | public final TestDiagnosticMessages assertWarningsMatch(Matcher<Diagnostic>... matchers) { | 
|  | return assertWarningsMatch(Arrays.asList(matchers)); | 
|  | } | 
|  |  | 
|  | public abstract TestDiagnosticMessages assertWarningsMatch( | 
|  | Collection<Matcher<Diagnostic>> matchers); | 
|  |  | 
|  | @SafeVarargs | 
|  | public final TestDiagnosticMessages assertErrorsMatch(Matcher<Diagnostic>... matchers) { | 
|  | return assertErrorsMatch(Arrays.asList(matchers)); | 
|  | } | 
|  |  | 
|  | public abstract TestDiagnosticMessages assertErrorsMatch( | 
|  | Collection<Matcher<Diagnostic>> matchers); | 
|  |  | 
|  | // Match one. | 
|  |  | 
|  | public abstract TestDiagnosticMessages assertDiagnosticThatMatches(Matcher<Diagnostic> matcher); | 
|  |  | 
|  | public abstract TestDiagnosticMessages assertInfoThatMatches(Matcher<Diagnostic> matcher); | 
|  |  | 
|  | public abstract TestDiagnosticMessages assertWarningThatMatches(Matcher<Diagnostic> matcher); | 
|  |  | 
|  | public abstract TestDiagnosticMessages assertErrorThatMatches(Matcher<Diagnostic> matcher); | 
|  |  | 
|  | // Consider removing this helper. | 
|  | public final TestDiagnosticMessages assertWarningMessageThatMatches(Matcher<String> matcher) { | 
|  | return assertWarningThatMatches(diagnosticMessage(matcher)); | 
|  | } | 
|  |  | 
|  | // Consider removing this helper. | 
|  | public final TestDiagnosticMessages assertErrorMessageThatMatches(Matcher<String> matcher) { | 
|  | return assertErrorThatMatches(diagnosticMessage(matcher)); | 
|  | } | 
|  |  | 
|  | // Match all. | 
|  |  | 
|  | public abstract TestDiagnosticMessages assertAllDiagnosticsMatch(Matcher<Diagnostic> matcher); | 
|  |  | 
|  | public abstract TestDiagnosticMessages assertAllInfosMatch(Matcher<Diagnostic> matcher); | 
|  |  | 
|  | public abstract TestDiagnosticMessages assertAllWarningsMatch(Matcher<Diagnostic> matcher); | 
|  |  | 
|  | public abstract TestDiagnosticMessages assertAllErrorsMatch(Matcher<Diagnostic> matcher); | 
|  |  | 
|  | // Match none. | 
|  |  | 
|  | public final TestDiagnosticMessages assertNoDiagnosticsMatch(Matcher<Diagnostic> matcher) { | 
|  | return assertAllDiagnosticsMatch(not(matcher)); | 
|  | } | 
|  |  | 
|  | public final TestDiagnosticMessages assertNoInfosMatch(Matcher<Diagnostic> matcher) { | 
|  | return assertAllInfosMatch(not(matcher)); | 
|  | } | 
|  |  | 
|  | public final TestDiagnosticMessages assertNoWarningsMatch(Matcher<Diagnostic> matcher) { | 
|  | return assertAllWarningsMatch(not(matcher)); | 
|  | } | 
|  |  | 
|  | public final TestDiagnosticMessages assertNoErrorsMatch(Matcher<Diagnostic> matcher) { | 
|  | return assertAllErrorsMatch(not(matcher)); | 
|  | } | 
|  | } |