package org.skife.objectfilter;

import junit.framework.TestCase;

import java.io.Serializable;

public class TestReferenceFilter extends TestCase
{
    public void tearDown()
    {
        Filter.instance().clearActor();
        Filter.instance().clearRules();
    }

    public void testBlockReference()
    {
        Filter filter = Filter.instance();
        filter.setActor(new Object());
        filter.addRules(Teacher.class, new Rules()
        {
            public boolean allow(Object actor, Object instance)
            {
                return false;
            }
        });

        Teacher mr_brown = new Teacher("Mr. Brown");
        ClassRoom english = new ClassRoom(mr_brown);
        assertNull(english.getTeacher());
    }

    public void testAllowReference()
    {
        Filter filter = Filter.instance();
        filter.setActor(new Object());
        filter.addRules(Teacher.class, new Rules()
        {
            public boolean allow(Object actor, Object instance)
            {
                return true;
            }
        });

        Teacher mr_brown = new Teacher("Mr. Brown");
        ClassRoom english = new ClassRoom(mr_brown);
        assertEquals(mr_brown, english.getTeacher());
    }

    public void testDisallowToSuperClass()
    {
        Filter filter = Filter.instance();
        filter.setActor(new Object());
        filter.addRules(Teacher.class, new Rules()
        {
            public boolean allow(Object actor, Object instance)
            {
                return false;
            }
        });

        Teacher dave = new StudentTeacher("Dave");
        ClassRoom english = new ClassRoom(dave);
        assertNull(english.getTeacher());
    }

    public void testDisallowToInterface()
    {
        Filter filter = Filter.instance();
        filter.setActor(new Object());
        filter.addRules(Serializable.class, new Rules()
        {
            public boolean allow(Object actor, Object instance)
            {
                return false;
            }
        });

        Teacher dave = new StudentTeacher("Dave");
        ClassRoom english = new ClassRoom(dave);
        assertNull(english.getTeacher());
    }
}
