package org.junit.tests;

import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.junit.Assume.assumeNotNull;
import static org.junit.Assume.assumeThat;

import java.lang.reflect.Method;

import org.junit.Test;
import org.junit.Test.None;
import org.junit.experimental.theories.DataPoints;
import org.junit.experimental.theories.Theories;
import org.junit.experimental.theories.Theory;
import org.junit.runner.RunWith;
import org.junit.runners.model.FrameworkMethod;

@RunWith(Theories.class)
public class ObjectContractTest {
    @DataPoints
    public static Object[] objects = {new FrameworkMethod(toStringMethod()),
            new FrameworkMethod(toStringMethod()), 3, null};

    @Theory
    @Test(expected = None.class)
    public void equalsThrowsNoException(Object a, Object b) {
        assumeNotNull(a);
        a.equals(b);
    }

    @Theory
    public void equalsMeansEqualHashCodes(Object a, Object b) {
        assumeNotNull(a, b);
        assumeThat(a, is(b));
        assertThat(a.hashCode(), is(b.hashCode()));
    }

    private static Method toStringMethod() {
        try {
            return Object.class.getMethod("toString");
        } catch (SecurityException e) {
        } catch (NoSuchMethodException e) {
        }
        return null;
    }
}
