blob: a82673939c6d0dd102cf9ad9de9de05d28e3435d [file] [log] [blame]
// Copyright (c) 2020, 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 com.android.tools.r8.position.Position;
import com.android.tools.r8.utils.ExceptionDiagnostic;
import org.hamcrest.CoreMatchers;
import org.hamcrest.Description;
import org.hamcrest.Matcher;
import org.hamcrest.TypeSafeMatcher;
public abstract class DiagnosticsMatcher extends TypeSafeMatcher<Diagnostic> {
public static Matcher<Diagnostic> diagnosticMessage(Matcher<String> messageMatcher) {
return new DiagnosticsMatcher() {
@Override
protected boolean eval(Diagnostic diagnostic) {
return messageMatcher.matches(diagnostic.getDiagnosticMessage());
}
@Override
protected void explain(Description description) {
description.appendText("message with ");
messageMatcher.describeTo(description);
}
};
}
public static Matcher<Diagnostic> diagnosticType(Class<? extends Diagnostic> type) {
return new DiagnosticsMatcher() {
@Override
protected boolean eval(Diagnostic diagnostic) {
return type.isInstance(diagnostic);
}
@Override
protected void explain(Description description) {
description.appendText("type ").appendText(type.getSimpleName());
}
};
}
public static Matcher<Diagnostic> diagnosticException(Class<? extends Throwable> exception) {
return new DiagnosticsMatcher() {
@Override
protected boolean eval(Diagnostic diagnostic) {
return diagnostic instanceof ExceptionDiagnostic
&& exception.isInstance(((ExceptionDiagnostic) diagnostic).getCause());
}
@Override
protected void explain(Description description) {
description.appendText("exception type ").appendText(exception.getSimpleName());
}
};
}
public static Matcher<Diagnostic> diagnosticOrigin(Origin origin) {
return diagnosticOrigin(CoreMatchers.is(origin));
}
public static Matcher<Diagnostic> diagnosticOrigin(Matcher<Origin> originMatcher) {
return new DiagnosticsMatcher() {
@Override
protected boolean eval(Diagnostic diagnostic) {
return originMatcher.matches(diagnostic.getOrigin());
}
@Override
protected void explain(Description description) {
description.appendText("origin with ");
originMatcher.describeTo(description);
}
};
}
public static Matcher<Diagnostic> diagnosticPosition(Position position) {
return diagnosticPosition(CoreMatchers.equalTo(position));
}
public static Matcher<Diagnostic> diagnosticPosition(Matcher<Position> positionMatcher) {
return new DiagnosticsMatcher() {
@Override
protected boolean eval(Diagnostic diagnostic) {
return positionMatcher.matches(diagnostic.getPosition());
}
@Override
protected void explain(Description description) {
description.appendText("position ");
positionMatcher.describeTo(description);
}
};
}
@Override
protected boolean matchesSafely(Diagnostic diagnostic) {
return eval(diagnostic);
}
@Override
public void describeTo(Description description) {
explain(description.appendText("a diagnostic "));
}
@Override
protected void describeMismatchSafely(Diagnostic item, Description mismatchDescription) {
mismatchDescription
.appendText("was ")
.appendText(item.getClass().getName())
.appendText(" with message(")
.appendValue(item.getDiagnosticMessage())
.appendText(")");
}
protected abstract boolean eval(Diagnostic diagnostic);
protected abstract void explain(Description description);
}