// 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);
}
