package org.openrdf.repository.object; import java.lang.reflect.Method; import java.util.HashSet; import java.util.Set; import junit.framework.Test; import org.openrdf.annotations.Iri; import org.openrdf.repository.object.base.ObjectRepositoryTestCase; public class CovarianceTest extends ObjectRepositoryTestCase { public static Test suite() throws Exception { return ObjectRepositoryTestCase.suite(CovarianceTest.class); } @Iri("urn:test:Base") public interface Base<B> { B getParent(); void setParent(B parent); B[] getChildren(); void setChildren(B[] children); @Iri("urn:test:sibling") B getSibling(); void setSibling(B sibling); @Iri("urn:test:self") B getSelf(); void setSelf(B self); } @Iri("urn:test2:Covariance") public interface Covariance extends Base<Covariance> { @Iri("urn:test2:sibling") Covariance getSibling(); void setSibling(Covariance sibling); } public abstract static class CovarianceSupport implements Covariance { private Covariance parent; private Covariance[] children; public Covariance getParent() { return parent; } public void setParent(Covariance parent) { this.parent = parent; } public Covariance[] getChildren() { return children; } public void setChildren(Covariance[] children) { this.children = children; } } public void testNumberOfBaseMethods() throws Exception { assertEquals(8, Base.class.getDeclaredMethods().length); Base obj = con.addDesignation(con.getObjectFactory().createObject(), Base.class); assertEquals(1, findMethods(obj, "getParent").size()); assertEquals(1, findMethods(obj, "setParent").size()); assertEquals(1, findMethods(obj, "getChildren").size()); assertEquals(1, findMethods(obj, "setChildren").size()); assertEquals(1, findMethods(obj, "getSibling").size()); assertEquals(1, findMethods(obj, "setSibling").size()); assertEquals(1, findMethods(obj, "getSelf").size()); assertEquals(1, findMethods(obj, "setSelf").size()); } public void testNumberOfCovarianceMethods() throws Exception { assertEquals(2, Covariance.class.getDeclaredMethods().length); Covariance obj = con.addDesignation(con.getObjectFactory().createObject(), Covariance.class); // support class with bridges assertEquals(2, findMethods(obj, "getParent").size()); assertEquals(2, findMethods(obj, "setParent").size()); assertEquals(2, findMethods(obj, "getChildren").size()); assertEquals(2, findMethods(obj, "setChildren").size()); // two properties assertEquals(2, findMethods(obj, "getSibling").size()); assertEquals(2, findMethods(obj, "setSibling").size()); // only one property assertEquals(1, findMethods(obj, "getSelf").size()); assertEquals(1, findMethods(obj, "setSelf").size()); } public void testCovariance() throws Exception { Covariance obj = con.addDesignation(con.getObjectFactory().createObject(), Covariance.class); Covariance parent = con.addDesignation(con.getObjectFactory().createObject(), Covariance.class); obj.setParent(parent); assertEquals(parent, Covariance.class.getMethod("getParent").invoke(obj)); assertEquals(parent, obj.getParent()); Base base = obj; base.setParent(parent); assertEquals(parent, Base.class.getMethod("getParent").invoke(obj)); assertEquals(parent, base.getParent()); } public void testArrayCovariance() throws Exception { Covariance obj = con.addDesignation(con.getObjectFactory().createObject(), Covariance.class); Covariance child = con.addDesignation(con.getObjectFactory().createObject(), Covariance.class); Covariance[] children = new Covariance[]{child}; obj.setChildren(children); assertEquals(children, obj.getChildren()); Base base = obj; base.setChildren(children); assertEquals(children, base.getChildren()); } public void testDifferentProperties() throws Exception { Covariance obj = con.addDesignation(con.getObjectFactory().createObject(), Covariance.class); Covariance sibling = con.addDesignation(con.getObjectFactory().createObject(), Covariance.class); Base base = obj; base.setSibling(sibling); assertEquals(sibling, base.getSibling()); assertEquals(sibling, obj.getSibling()); obj.setSibling(null); // base property should remain unchanged assertEquals(sibling, base.getSibling()); base.setSibling(null); assertEquals(null, base.getSibling()); obj.setSibling(sibling); assertEquals(sibling, obj.getSibling()); assertEquals(sibling, base.getSibling()); } public void testSameProperty() throws Exception { Covariance obj = con.addDesignation(con.getObjectFactory().createObject(), Covariance.class); Covariance self = con.addDesignation(con.getObjectFactory().createObject(), Covariance.class); Base base = obj; base.setSelf(self); assertEquals(self, base.getSelf()); assertEquals(self, obj.getSelf()); obj.setSelf(null); assertEquals(null, obj.getSelf()); assertEquals(null, base.getSelf()); obj.setSelf(self); assertEquals(self, obj.getSelf()); assertEquals(self, base.getSelf()); } @Override protected void setUp() throws Exception { config.addConcept(Base.class); config.addConcept(Covariance.class); config.addBehaviour(CovarianceSupport.class); super.setUp(); } private Set<Method> findMethods(Object obj, String name) { Set<Method> methods = new HashSet<Method>(); for (Method m : obj.getClass().getMethods()) { if (m.getName().equals(name)) methods.add(m); } System.out.println(methods); return methods; } }