package ch.vorburger.blueprints.data.tests;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.CoreMatchers.notNullValue;
import static org.hamcrest.Matchers.equalTo;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.fail;
import java.io.IOException;
import java.util.List;
import java.util.Map;
import org.junit.Test;
import ch.vorburger.blueprints.data.DataObject;
import ch.vorburger.blueprints.data.javareflect.JavaDataObjectFactory;
import ch.vorburger.blueprints.data.meta.Property;
import ch.vorburger.blueprints.data.meta.Type;
import ch.vorburger.blueprints.data.meta.TypesProvider;
import ch.vorburger.blueprints.data.xmlxsd.XSDDataObjectFactory;
import ch.vorburger.blueprints.objects.ObjectFactoryException;
/**
* Tests for DataObject & DataObjectFactory implementations.
*
* @author Michael Vorburger
*/
public class DataObjectTests {
@Test
public void testDynamicXSD() throws IOException {
XSDDataObjectFactory f = new XSDDataObjectFactory();
f.register("/SampleFormStructure.xsd");
String sampleTypeURI = findURIContaining(f, "SampleFormType");
DataObject dataObject = f.create(sampleTypeURI);
dataObject.set("name", "Saluton, Mondpacxo");
assertThat(dataObject.get("name", String.class), equalTo("Saluton, Mondpacxo"));
Type type = f.getTypes().get(sampleTypeURI);
assertEquals(8, type.getProperties().size());
}
@Test
public void testLeafSimpleTypes() throws ObjectFactoryException {
JavaDataObjectFactory f = new JavaDataObjectFactory();
Type stringType = f.register(String.class);
assertNull(stringType.getProperties());
assertEquals(String.class, stringType.getInstanceClass());
}
@Test
public void testStaticJavaBean() throws ObjectFactoryException {
JavaDataObjectFactory f = new JavaDataObjectFactory();
f.register(BookImpl.class);
String sampleTypeURI = findURIContaining(f, "Book");
DataObject dataObject = f.create(sampleTypeURI);
assertThat(dataObject, is(notNullValue()));
dataObject.set("AName", "Saluton, Mondpacxo");
assertThat(dataObject.get("AName", String.class), equalTo("Saluton, Mondpacxo"));
Type type = f.getTypes().values().iterator().next();
assertEquals(1, type.getProperties().size());
assertEquals("AName", type.getProperties().iterator().next().getName());
assertEquals(String.class, type.getProperties().iterator().next().getType().getInstanceClass());
}
@Test
public void testStaticJavaPrivateProperty() throws ObjectFactoryException {
JavaDataObjectFactory f = new JavaDataObjectFactory();
f.registerUsingDirectFieldsInsteadOfJavaBean(BookPrivateField.class);
Type type = f.getTypes().get("java:" + BookPrivateField.class.getName());
List<Property> properties = type.getProperties();
assertEquals(1, properties.size());
assertEquals("theName", properties.get(0).getName());
assertEquals("java:" + Name.class.getName(), properties.get(0).getType().getURI());
assertEquals(2, properties.get(0).getType().getProperties().size());
DataObject dataObject = f.create(type);
assertNotNull(dataObject);
DataObject nameDataObject = dataObject.get("theName", DataObject.class);
assertEquals("Mickey", nameDataObject.get("firstName", String.class));
nameDataObject.set("firstName", "Michael");
assertEquals("Michael", nameDataObject.get("firstName", String.class));
}
private String findURIContaining(TypesProvider f, String nameFragment) {
Map<String, ? extends Type> types = f.getTypes();
for (Type type : types.values()) {
if (type.getURI().contains(nameFragment)) {
return type.getURI();
}
}
fail("Factory does not contain any Type with an URI containing " + nameFragment + ", only: " + f.getTypes().keySet());
return null;
}
// @Test(expected=UnsupportedOperationException.class)
// public void testStaticXSD() {
// DataObjectFactory f = new XSDDataObjectFactory();
// f.create(Book.class);
// }
// Would this really be needed, is there a use case for such a usage?!
// @Test
// public void testStaticJava() {
// JavaDataObjectFactory f = new JavaDataObjectFactory();
// f.register(BookImpl.class);
// Book book = f.create(Book.class);
// assertThat(book, is(notNullValue()));
// book.setName("Saluton, Mondpacxo");
// assertThat(book.getName(), equalTo("Saluton, Mondpacxo"));
//
// book = f.create(BookImpl.class);
// assertThat(book, is(notNullValue()));
// }
}