// 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 java.util.Collection;
import java.util.Collections;
import java.util.List;
import org.hamcrest.Matcher;

public interface TestDiagnosticMessages {

  List<Diagnostic> getInfos();

  List<Diagnostic> getWarnings();

  List<Diagnostic> getErrors();

  TestDiagnosticMessages assertNoMessages();

  TestDiagnosticMessages assertOnlyInfos();

  TestDiagnosticMessages assertOnlyWarnings();

  TestDiagnosticMessages assertOnlyErrors();

  TestDiagnosticMessages assertInfosCount(int count);

  TestDiagnosticMessages assertWarningsCount(int count);

  TestDiagnosticMessages assertErrorsCount(int count);

  // Match exact.

  default TestDiagnosticMessages assertDiagnosticsMatch(Matcher<Diagnostic> matcher) {
    return assertDiagnosticsMatch(Collections.singletonList(matcher));
  }

  TestDiagnosticMessages assertDiagnosticsMatch(Collection<Matcher<Diagnostic>> matchers);

  default TestDiagnosticMessages assertInfosMatch(Matcher<Diagnostic> matcher) {
    return assertInfosMatch(Collections.singletonList(matcher));
  }

  TestDiagnosticMessages assertInfosMatch(Collection<Matcher<Diagnostic>> matchers);

  default TestDiagnosticMessages assertWarningsMatch(Matcher<Diagnostic> matcher) {
    return assertWarningsMatch(Collections.singletonList(matcher));
  }

  TestDiagnosticMessages assertWarningsMatch(Collection<Matcher<Diagnostic>> matchers);

  default TestDiagnosticMessages assertErrorsMatch(Matcher<Diagnostic> matcher) {
    return assertErrorsMatch(Collections.singletonList(matcher));
  }

  TestDiagnosticMessages assertErrorsMatch(Collection<Matcher<Diagnostic>> matchers);

  // Match one.

  TestDiagnosticMessages assertDiagnosticThatMatches(Matcher<Diagnostic> matcher);

  TestDiagnosticMessages assertInfoThatMatches(Matcher<Diagnostic> matcher);

  TestDiagnosticMessages assertWarningThatMatches(Matcher<Diagnostic> matcher);

  TestDiagnosticMessages assertErrorThatMatches(Matcher<Diagnostic> matcher);

  // Consider removing this helper.
  default TestDiagnosticMessages assertWarningMessageThatMatches(Matcher<String> matcher) {
    return assertWarningThatMatches(diagnosticMessage(matcher));
  }

  // Consider removing this helper.
  default TestDiagnosticMessages assertErrorMessageThatMatches(Matcher<String> matcher) {
    return assertErrorThatMatches(diagnosticMessage(matcher));
  }

  // Match all.

  TestDiagnosticMessages assertAllDiagnosticsMatch(Matcher<Diagnostic> matcher);

  TestDiagnosticMessages assertAllInfosMatch(Matcher<Diagnostic> matcher);

  TestDiagnosticMessages assertAllWarningsMatch(Matcher<Diagnostic> matcher);

  TestDiagnosticMessages assertAllErrorsMatch(Matcher<Diagnostic> matcher);

  // Match none.

  default TestDiagnosticMessages assertNoDiagnosticsMatch(Matcher<Diagnostic> matcher) {
    return assertAllDiagnosticsMatch(not(matcher));
  }

  default TestDiagnosticMessages assertNoInfosMatch(Matcher<Diagnostic> matcher) {
    return assertAllInfosMatch(not(matcher));
  }

  default TestDiagnosticMessages assertNoWarningsMatch(Matcher<Diagnostic> matcher) {
    return assertAllWarningsMatch(not(matcher));
  }

  default TestDiagnosticMessages assertNoErrorsMatch(Matcher<Diagnostic> matcher) {
    return assertAllErrorsMatch(not(matcher));
  }
}
