/**
* Copyright 2009-2013 Oy Vaadin Ltd
*
* 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.vaadin.addon.jpacontainer.metadata;
import org.junit.Test;
import static com.vaadin.addon.jpacontainer.metadata.TestClasses.*;
import static org.junit.Assert.*;
/**
* Test case for {@link ClassMetadata}.
*
* @author Petter Holmström (Vaadin Ltd)
* @since 1.0
*/
public class ClassMetadataTest {
@Test
public void testAddTransientProperty() throws Exception {
ClassMetadata<Person_M> metadata = new ClassMetadata<Person_M>(
Person_M.class);
PropertyMetadata prop = new PropertyMetadata("transientField2",
String.class, Person_M.class
.getDeclaredMethod("getTransientField2"),
Person_M.class.getDeclaredMethod("setTransientField2",
String.class));
metadata.addProperties(prop);
assertTrue(metadata.getProperties().contains(prop));
assertTrue(metadata.getPersistentProperties().isEmpty());
assertSame(prop, metadata.getProperty("transientField2"));
assertSame(Person_M.class, metadata.getMappedClass());
}
@Test
public void testAddPersistentProperty() throws Exception {
ClassMetadata<Person_M> metadata = new ClassMetadata<Person_M>(
Person_M.class);
PersistentPropertyMetadata prop = new PersistentPropertyMetadata(
"firstName", String.class,
PropertyKind.SIMPLE, Person_M.class
.getDeclaredMethod("getFirstName"), Person_M.class
.getDeclaredMethod("setFirstName", String.class));
metadata.addProperties(prop);
assertTrue(metadata.getProperties().contains(prop));
assertTrue(metadata.getPersistentProperties().contains(prop));
assertSame(prop, metadata.getProperty("firstName"));
assertSame(Person_M.class, metadata.getMappedClass());
}
@Test
public void testGetTransientPropertyValue() throws Exception {
ClassMetadata<Person_M> metadata = new ClassMetadata<Person_M>(
Person_M.class);
PropertyMetadata prop = new PropertyMetadata("transientField2",
String.class, Person_M.class
.getDeclaredMethod("getTransientField2"),
Person_M.class.getDeclaredMethod("setTransientField2",
String.class));
metadata.addProperties(prop);
Person_M person = new Person_M();
person.setTransientField2("Hello");
assertEquals("Hello", metadata.getPropertyValue(person,
"transientField2"));
}
@Test
public void testGetNestedTransientPropertyValue() throws Exception {
ClassMetadata<Person_F> metadata = new ClassMetadata<Person_F>(
Person_F.class);
metadata.addProperties(new PropertyMetadata("transientAddress",
Address_M.class, Person_F.class
.getDeclaredMethod("getTransientAddress"),
Person_F.class.getDeclaredMethod("setTransientAddress",
Address_M.class)));
Person_F person = new Person_F();
assertNull(metadata.getProperty("transientAddress.street"));
person.setTransientAddress(new Address_M());
person.transientAddress.setStreet("Street");
assertEquals("Street", metadata.getPropertyValue(person,
"transientAddress.street"));
}
@Test
public void testSetTransientPropertyValue() throws Exception {
ClassMetadata<Person_M> metadata = new ClassMetadata<Person_M>(
Person_M.class);
PropertyMetadata prop = new PropertyMetadata("transientField2",
String.class, Person_M.class
.getDeclaredMethod("getTransientField2"),
Person_M.class.getDeclaredMethod("setTransientField2",
String.class));
metadata.addProperties(prop);
Person_M person = new Person_M();
assertNull(person.getTransientField2());
metadata.setPropertyValue(person, "transientField2", "Hello");
assertEquals("Hello", person.getTransientField2());
}
@Test
public void testSetNestedTransientPropertyValue() throws Exception {
ClassMetadata<Person_F> metadata = new ClassMetadata<Person_F>(
Person_F.class);
metadata.addProperties(new PropertyMetadata("transientAddress",
Address_M.class, Person_F.class
.getDeclaredMethod("getTransientAddress"),
Person_F.class.getDeclaredMethod("setTransientAddress",
Address_M.class)));
Person_F person = new Person_F();
person.setTransientAddress(new Address_M());
metadata.setPropertyValue(person, "transientAddress.street", "Street");
assertEquals("Street", person.getTransientAddress().getStreet());
}
@Test
public void testGetPersistentPropertyValue_Field() throws Exception {
ClassMetadata<Person_F> metadata = new ClassMetadata<Person_F>(
Person_F.class);
PersistentPropertyMetadata prop = new PersistentPropertyMetadata(
"firstName", String.class,
PropertyKind.SIMPLE, Person_F.class
.getDeclaredField("firstName"), null);
metadata.addProperties(prop);
Person_F person = new Person_F();
person.firstName = "Hello";
assertEquals("Hello", metadata.getPropertyValue(person, "firstName"));
}
@Test
public void testGetNestedPersistentPropertyValue_Field() throws Exception {
ClassMetadata<Address_F> addressMetadata = new ClassMetadata<Address_F>(
Address_F.class);
addressMetadata.addProperties(new PersistentPropertyMetadata("street",
String.class, PropertyKind.SIMPLE,
Address_F.class.getDeclaredField("street"), null));
ClassMetadata<Person_F> metadata = new ClassMetadata<Person_F>(
Person_F.class);
metadata.addProperties(new PersistentPropertyMetadata("address",
addressMetadata,
PropertyKind.EMBEDDED,
Person_F.class.getDeclaredField("address"), null));
Person_F person = new Person_F();
assertNull(metadata.getProperty("address.street"));
person.address = new Address_F();
person.address.street = "Street";
assertEquals("Street", metadata.getPropertyValue(person,
"address.street"));
}
@Test
public void testSetPersistentPropertyValue_Field() throws Exception {
ClassMetadata<Person_F> metadata = new ClassMetadata<Person_F>(
Person_F.class);
PersistentPropertyMetadata prop = new PersistentPropertyMetadata(
"firstName", String.class,
PropertyKind.SIMPLE, Person_F.class
.getDeclaredField("firstName"), null);
metadata.addProperties(prop);
Person_F person = new Person_F();
assertNull(person.firstName);
metadata.setPropertyValue(person, "firstName", "Hello");
assertEquals("Hello", person.firstName);
}
@Test
public void testSetNestedPersistentPropertyValue_Field() throws Exception {
ClassMetadata<Address_F> addressMetadata = new ClassMetadata<Address_F>(
Address_F.class);
addressMetadata.addProperties(new PersistentPropertyMetadata("street",
String.class, PropertyKind.SIMPLE,
Address_F.class.getDeclaredField("street"), null));
ClassMetadata<Person_F> metadata = new ClassMetadata<Person_F>(
Person_F.class);
metadata.addProperties(new PersistentPropertyMetadata("address",
addressMetadata,
PropertyKind.EMBEDDED,
Person_F.class.getDeclaredField("address"), null));
Person_F person = new Person_F();
person.address = new Address_F();
assertNull(person.address.street);
metadata.setPropertyValue(person, "address.street", "Hello");
assertEquals("Hello", person.address.street);
}
@Test
public void testGetPersistentPropertyValue_Method() throws Exception {
ClassMetadata<Person_M> metadata = new ClassMetadata<Person_M>(
Person_M.class);
PersistentPropertyMetadata prop = new PersistentPropertyMetadata(
"firstName", String.class,
PropertyKind.SIMPLE, Person_M.class
.getDeclaredMethod("getFirstName"), Person_M.class
.getDeclaredMethod("setFirstName", String.class));
metadata.addProperties(prop);
Person_M person = new Person_M();
person.setFirstName("Hello");
assertEquals("Hello", metadata.getPropertyValue(person, "firstName"));
}
@Test
public void testGetNestedPersistentPropertyValue_Method() throws Exception {
ClassMetadata<Address_M> addressMetadata = new ClassMetadata<Address_M>(
Address_M.class);
addressMetadata.addProperties(new PersistentPropertyMetadata("street",
String.class, PropertyKind.SIMPLE,
Address_M.class.getDeclaredMethod("getStreet"), Address_M.class
.getDeclaredMethod("setStreet", String.class)));
ClassMetadata<Person_M> metadata = new ClassMetadata<Person_M>(
Person_M.class);
metadata.addProperties(new PersistentPropertyMetadata("address",
addressMetadata,
PropertyKind.EMBEDDED,
Person_M.class.getDeclaredMethod("getAddress"), Person_M.class
.getDeclaredMethod("setAddress", Address_M.class)));
Person_M person = new Person_M();
assertNull(metadata.getProperty("address.street"));
person.setAddress(new Address_M());
person.getAddress().setStreet("Street");
assertEquals("Street", metadata.getPropertyValue(person,
"address.street"));
}
@Test
public void testSetPersistentPropertyValue_Method() throws Exception {
ClassMetadata<Person_M> metadata = new ClassMetadata<Person_M>(
Person_M.class);
PersistentPropertyMetadata prop = new PersistentPropertyMetadata(
"firstName", String.class,
PropertyKind.SIMPLE, Person_M.class
.getDeclaredMethod("getFirstName"), Person_M.class
.getDeclaredMethod("setFirstName", String.class));
metadata.addProperties(prop);
Person_M person = new Person_M();
assertNull(person.getFirstName());
metadata.setPropertyValue(person, "firstName", "Hello");
assertEquals("Hello", person.getFirstName());
}
@Test
public void testSetNestedPersistentPropertyValue_Method() throws Exception {
ClassMetadata<Address_M> addressMetadata = new ClassMetadata<Address_M>(
Address_M.class);
addressMetadata.addProperties(new PersistentPropertyMetadata("street",
String.class, PropertyKind.SIMPLE,
Address_M.class.getDeclaredMethod("getStreet"), Address_M.class
.getDeclaredMethod("setStreet", String.class)));
ClassMetadata<Person_M> metadata = new ClassMetadata<Person_M>(
Person_M.class);
metadata.addProperties(new PersistentPropertyMetadata("address",
addressMetadata,
PropertyKind.EMBEDDED,
Person_M.class.getDeclaredMethod("getAddress"), Person_M.class
.getDeclaredMethod("setAddress", Address_M.class)));
Person_M person = new Person_M();
person.setAddress(new Address_M());
assertNull(person.getAddress().getStreet());
metadata.setPropertyValue(person, "address.street", "Hello");
assertEquals("Hello", person.getAddress().getStreet());
}
// TODO Add test for equals() and hashCode()
@Test
public void testEqualsAndHashCode() throws Exception {
ClassMetadata<Person_M> metadata1 = new ClassMetadata<Person_M>(
Person_M.class);
PropertyMetadata prop = new PropertyMetadata("transientField2",
String.class, Person_M.class
.getDeclaredMethod("getTransientField2"),
Person_M.class.getDeclaredMethod("setTransientField2",
String.class));
metadata1.addProperties(prop);
ClassMetadata<Person_M> metadata2 = new ClassMetadata<Person_M>(
Person_M.class);
metadata2.addProperties(prop);
assertEquals(metadata1, metadata2);
assertEquals(metadata1.hashCode(), metadata2.hashCode());
PersistentPropertyMetadata prop2 = new PersistentPropertyMetadata(
"firstName", String.class,
PropertyKind.SIMPLE, Person_M.class
.getDeclaredMethod("getFirstName"), Person_M.class
.getDeclaredMethod("setFirstName", String.class));
metadata1.addProperties(prop2);
assertFalse(metadata1.equals(metadata2));
assertFalse(metadata1.hashCode() == metadata2.hashCode());
assertFalse(metadata1.equals("Wrong type"));
}
}