package org.junit.tests.experimental;

import static org.hamcrest.CoreMatchers.not;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.junit.Assume.assumeThat;
import static org.junit.experimental.results.ResultMatchers.hasFailureContaining;
import static org.junit.experimental.results.ResultMatchers.hasSingleFailureContaining;

import java.util.Arrays;

import org.hamcrest.Matcher;
import org.junit.experimental.results.PrintableResult;
import org.junit.experimental.theories.DataPoint;
import org.junit.experimental.theories.Theories;
import org.junit.experimental.theories.Theory;
import org.junit.runner.Description;
import org.junit.runner.RunWith;
import org.junit.runner.notification.Failure;

@RunWith(Theories.class)
public class MatcherTest {
    @DataPoint
    public static Matcher<Object> SINGLE_FAILURE = hasSingleFailureContaining("cheese");

    @DataPoint
    public static Matcher<PrintableResult> ANY_FAILURE = hasFailureContaining("cheese");

    @DataPoint
    public static PrintableResult TWO_FAILURES_ONE_CHEESE = new PrintableResult(
            Arrays.asList(failure("cheese"), failure("mustard")));

    @Theory
    @SuppressWarnings({ "unchecked", "rawtypes" })
    public void differentMatchersHaveDifferentDescriptions(
            Matcher matcher1, Matcher matcher2, Object value) {
        assumeThat(value, matcher1);
        assumeThat(value, not(matcher2));
        assertThat(matcher1.toString(), not(matcher2.toString()));
    }

    private static Failure failure(String string) {
        return new Failure(Description.EMPTY, new Error(string));
    }
}
