package org.hamcrest;

import org.hamcrest.core.IsEqual;
import org.junit.Test;

import static org.hamcrest.AbstractMatcherTest.*;
import static org.junit.Assert.assertEquals;

public final class FeatureMatcherTest {
    private final FeatureMatcher<Thingy, String> resultMatcher = resultMatcher();

    @Test public void
    matchesPartOfAnObject() {
        assertMatches("feature", resultMatcher, new Thingy("bar"));
        assertDescription("Thingy with result \"bar\"", resultMatcher);
    }

    @Test public void
    mismatchesPartOfAnObject() {
        assertMismatchDescription("result mismatch-description", resultMatcher, new Thingy("foo"));
    }

    @Test public void
    doesNotThrowNullPointerException() {
        assertMismatchDescription("was null", resultMatcher, null);
    }

    @Test public void
    doesNotThrowClassCastException() {
        resultMatcher.matches(new ShouldNotMatch());
        StringDescription mismatchDescription = new StringDescription(); 
        resultMatcher.describeMismatch(new ShouldNotMatch(), mismatchDescription);
        assertEquals("was <ShouldNotMatch>", mismatchDescription.toString());
    }

    public static class Match extends IsEqual<String> {
        public Match(String equalArg) { super(equalArg); }
        @Override public void describeMismatch(Object item, Description description) {
            description.appendText("mismatch-description");
        }
    }

    public static class Thingy {
        private final String result;

        public Thingy(String result) {
            this.result = result;
        }

        public String getResult() {
            return result;
        }
    }

    public static class ShouldNotMatch {
        @Override public String toString() { return "ShouldNotMatch"; }
    } 

    private static FeatureMatcher<Thingy, String> resultMatcher() {
        return new FeatureMatcher<Thingy, String>(new Match("bar"), "Thingy with result", "result") {
            @Override
            public String featureValueOf(Thingy actual) {
                return actual.getResult();
            }
        };
    }

}
