package net.onrc.onos.core.util;

import org.junit.Test;

import static net.onrc.onos.core.util.ImmutableClassChecker.assertThatClassIsImmutable;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.is;

/**
 * Set of unit tests to check the implementation of the immutable class
 * checker.
 */
public class ImmutableClassCheckerTest {
    /**
     * Test class for non final class check.
     */
    static class NonFinal {
        private NonFinal() {}
    }

    /**
     * Check that a non final class correctly produces an error.
     * @throws Exception if any of the reflection lookups fail.
     */
    @Test
    public void testNonFinalClass() throws Exception {
        boolean gotException = false;
        try {
            assertThatClassIsImmutable(NonFinal.class);
        } catch (AssertionError assertion) {
            assertThat(assertion.getMessage(),
                    containsString("is not final"));
            gotException = true;
        }
        assertThat(gotException, is(true));
    }

    /**
     * Test class for non private member class check.
     */
    static final class FinalProtectedMember {
        protected final int x = 0;
    }

    /**
     * Check that a final class with a non-private member is properly detected.
     *
     * @throws Exception if any of the reflection lookups fail.
     */
    @Test
    public void testFinalProtectedMember() throws Exception {
        boolean gotException = false;
        try {
            assertThatClassIsImmutable(FinalProtectedMember.class);
        } catch (AssertionError assertion) {
            assertThat(assertion.getMessage(),
                       containsString("a field named 'x' that is not private"));
            gotException = true;
        }
        assertThat(gotException, is(true));
    }

    /**
     * Test class for non private member class check.
     */
    static final class NotFinalPrivateMember {
        private int x = 0;
    }

    /**
     * Check that a final class with a non-final private
     * member is properly detected.
     *
     * @throws Exception if any of the reflection lookups fail.
     */
    @Test
    public void testNotFinalPrivateMember() throws Exception {
        boolean gotException = false;
        try {
            assertThatClassIsImmutable(NotFinalPrivateMember.class);
        } catch (AssertionError assertion) {
            assertThat(assertion.getMessage(),
                    containsString("a field named 'x' that is not final"));
            gotException = true;
        }
        assertThat(gotException, is(true));
    }

    /**
     * Test class for non private member class check.
     */
    static final class ClassWithSetter {
        private final int x = 0;
        public void setX(int newX) {
        }
    }

    /**
     * Check that a final class with a final private
     * member that is modifyable by a setter is properly detected.
     *
     * @throws Exception if any of the reflection lookups fail.
     */
    @Test
    public void testClassWithSetter() throws Exception {
        boolean gotException = false;
        try {
            assertThatClassIsImmutable(ClassWithSetter.class);
        } catch (AssertionError assertion) {
            assertThat(assertion.getMessage(),
                    containsString("a class with a setter named 'setX'"));
            gotException = true;
        }
        assertThat(gotException, is(true));
    }

}

