/* * Copyright (c) 2009-2012 Clark & Parsia, LLC. <http://www.clarkparsia.com> * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.clarkparsia.empire.codegen; import java.io.File; import java.lang.annotation.Annotation; import java.net.URI; import java.util.Collections; import javax.persistence.EntityManager; import javax.persistence.MappedSuperclass; import javax.persistence.Persistence; import com.clarkparsia.empire.Empire; import com.clarkparsia.empire.SupportsRdfId; import com.clarkparsia.empire.api.TestInterface; import com.clarkparsia.empire.util.TestModule; import com.clarkparsia.empire.util.TestUtil; import org.junit.BeforeClass; import org.junit.Test; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; /** * <p>Code generation unit tests</p> * * @author Michael Grove * @since 0.7 * @version 0.7 */ public class CodegenTests { @BeforeClass public static void beforeClass () { System.setProperty("empire.configuration.file", new File(TestUtil.getProjectHome(), "core/test/test.empire.config.properties").getAbsolutePath()); Empire.init(new TestModule()); } @Test public void testCodeGenWithWildcards() throws Exception { InstanceGenerator.generateInstanceClass(PersonWithWildcards.class); } @Test public void testUseInterfaceWithWildcards() throws Exception { EntityManager aManager = Persistence.createEntityManagerFactory("test-data-source2").createEntityManager(); try { PersonWithWildcards wc = InstanceGenerator.generateInstanceClass(PersonWithWildcards.class).newInstance(); PersonWithWildcards wc2 = InstanceGenerator.generateInstanceClass(PersonWithWildcards.class).newInstance(); wc.setRdfId(new SupportsRdfId.URIKey(URI.create("urn:wc"))); wc2.setRdfId(new SupportsRdfId.URIKey(URI.create("urn:wc2"))); wc.setHasContact(Collections.singletonList(wc2)); aManager.persist(wc); assertTrue(aManager.find(PersonWithWildcards.class, wc.getRdfId().value()) != null); } finally { aManager.close(); } } @Test public void testInstGen() throws Exception { Class<TestInterface> aIntClass = InstanceGenerator.generateInstanceClass(TestInterface.class); TestInterface aInt = aIntClass.newInstance(); // this should successfully re-use the previously generated class file. we want to make sure // this can happen without error. TestInterface aInt2 = InstanceGenerator.generateInstanceClass(TestInterface.class).newInstance(); URI aURI = URI.create("urn:uri"); Integer aNumber = 5; String aStr = "some string value"; SupportsRdfId.RdfKey aKey = new SupportsRdfId.URIKey(URI.create("urn:id")); SupportsRdfId.RdfKey aKey2 = new SupportsRdfId.URIKey(URI.create("urn:id2")); aInt.setURI(aURI); aInt.setInt(aNumber); aInt.setString(aStr); aInt.setRdfId(aKey); aInt2.setRdfId(aKey2); aInt.setObject(aInt2); assertEquals(aInt, aInt); assertEquals(aURI, aInt.getURI()); assertEquals(aStr, aInt.getString()); assertEquals(aNumber, aInt.getInt()); assertEquals(aKey, aInt.getRdfId()); assertEquals(aInt2, aInt.getObject()); assertEquals(aKey.toString(), aInt.toString()); } @Test(expected=IllegalArgumentException.class) public void testBadInstGen() throws Exception { InstanceGenerator.generateInstanceClass(BadTestInterface.class); } @Test(expected=IllegalArgumentException.class) public void testNoSupportsInstGen() throws Exception { InstanceGenerator.generateInstanceClass(NoSupportsTestInterface.class); } @Test public void testGenerateSuperInterfaces() { try { BaseInterface aBase = InstanceGenerator.generateInstanceClass(BaseInterface.class).newInstance(); aBase.setFoo("some value"); assertEquals("some value", aBase.getFoo()); ChildInterface aChild = InstanceGenerator.generateInstanceClass(ChildInterface.class).newInstance(); aChild.setBar(23); assertEquals(23, aChild.getBar()); aChild.setFoo("some value"); assertEquals("some value", aChild.getFoo()); } catch (Exception e) { fail(e.getMessage()); } } @Test public void testFunkyInstGenWithBoolean() throws Exception { IFoo aFoo = InstanceGenerator.generateInstanceClass(FooImpl.class).newInstance(); assertTrue(aFoo.isDereferenced()); } @Test public void testMultipleMethodAnnotationInheritance() throws Exception { // issue #105 PersonWithMultipleMethodAnnotations p = InstanceGenerator.generateInstanceClass(PersonWithMultipleMethodAnnotations.class).newInstance(); Annotation[] annos = p.getClass().getDeclaredMethod("getHasContact").getAnnotations(); assertEquals(2, annos.length); } public interface NoSupportsTestInterface { public String getBar(); public void setBar(String theStr); } public interface BadTestInterface extends SupportsRdfId { public void foo(); public String getBar(); public void setBar(String theStr); } public interface BaseInterface extends SupportsRdfId { public String getFoo(); public void setFoo(String theString); } public interface ChildInterface extends BaseInterface { public long getBar(); public void setBar(long theString); } public static abstract class FooImpl extends AbstractFoo implements IFoo { } public static interface IFoo { public boolean isDereferenced(); } @MappedSuperclass public static abstract class AbstractFoo implements SupportsRdfId { /** * @inheritDoc */ public boolean isDereferenced() { return true; } } }