/******************************************************************************* * Copyright (c) 2010-2014 SAP AG and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * SAP AG - initial API and implementation *******************************************************************************/ package org.eclipse.skalli.model; import static org.junit.Assert.*; import java.util.Arrays; import java.util.Calendar; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.TimeZone; import javax.xml.bind.DatatypeConverter; import org.apache.commons.lang.time.DateFormatUtils; import org.eclipse.skalli.commons.CollectionUtils; import org.eclipse.skalli.testutil.AssertUtils; import org.eclipse.skalli.testutil.PropertyTestUtil; import org.eclipse.skalli.testutil.TestEntityBase; import org.eclipse.skalli.testutil.TestEntityBase1; import org.eclipse.skalli.testutil.TestEntityBase2; import org.eclipse.skalli.testutil.TestExtensibleEntityBase; import org.eclipse.skalli.testutil.TestExtension; import org.eclipse.skalli.testutil.TestUUIDs; import org.junit.Test; @SuppressWarnings("nls") public class EntityBaseTest { @Test public void testPropertyDefinitions() throws Exception { Map<String, Object> values = PropertyTestUtil.getValues(); Map<Class<?>, String[]> requiredProperties = PropertyTestUtil.getRequiredProperties(); PropertyTestUtil.checkPropertyDefinitions(EntityBase.class, requiredProperties, values); } @Test public void testSetUUIDTwice() { TestEntityBase entity = new TestEntityBase(); entity.setUuid(TestUUIDs.TEST_UUIDS[0]); assertEquals(TestUUIDs.TEST_UUIDS[0], entity.getUuid()); entity.setUuid(TestUUIDs.TEST_UUIDS[1]); assertEquals(TestUUIDs.TEST_UUIDS[0], entity.getUuid()); // still old UUID! entity.setUuid(null); assertEquals(TestUUIDs.TEST_UUIDS[0], entity.getUuid()); // still old UUID! } @Test public void testLastModified() { TestEntityBase entity = new TestEntityBase(); Calendar now = Calendar.getInstance(TimeZone.getTimeZone("UTC"), Locale.ENGLISH); //$NON-NLS-1$ String lastModified = DatatypeConverter.printDateTime(now); entity.setLastModified(lastModified); assertEquals(lastModified, entity.getLastModified()); assertEquals(now.getTimeInMillis(), entity.getLastModifiedMillis()); entity.setLastModified(null); assertNull(entity.getLastModified()); assertEquals(-1L, entity.getLastModifiedMillis()); entity.setLastModified(""); assertNull(entity.getLastModified()); assertEquals(-1L, entity.getLastModifiedMillis()); entity.setLastModified(now.getTimeInMillis()); assertEquals(now.getTimeInMillis(), entity.getLastModifiedMillis()); assertEquals(lastModified, entity.getLastModified()); entity.setLastModified(-4711L); assertEquals(-1L, entity.getLastModifiedMillis()); assertNull(entity.getLastModified()); } @Test(expected = IllegalArgumentException.class) public void testInvalidLastModified() { long now = System.currentTimeMillis(); TestEntityBase entity = new TestEntityBase(); entity.setLastModified(DateFormatUtils.ISO_DATE_FORMAT.format(now)); entity.setLastModified(DateFormatUtils.ISO_DATE_TIME_ZONE_FORMAT.format(now)); entity.setLastModified(DateFormatUtils.ISO_TIME_FORMAT.format(now)); entity.setLastModified("foobar"); entity.setLastModified(Long.toString(now)); } public void testLastModifiedBy() { TestEntityBase entity = new TestEntityBase(); entity.setLastModifiedBy("homer"); assertEquals("homer", entity.getLastModifiedBy()); entity.setLastModifiedBy(null); assertNull(entity.getLastModifiedBy()); entity.setLastModifiedBy(""); assertNull(entity.getLastModifiedBy()); } @Test public void testSetResetParentEntity() { TestEntityBase1 entity1 = new TestEntityBase1(); entity1.setUuid(TestUUIDs.TEST_UUIDS[0]); TestEntityBase2 entity2 = new TestEntityBase2(); entity2.setUuid(TestUUIDs.TEST_UUIDS[1]); entity1.setParentEntity(entity2); assertEquals(entity2, entity1.getParentEntity()); assertEquals(TestUUIDs.TEST_UUIDS[1], entity1.getParentEntityId()); entity1.setParentEntity(null); assertNull(entity1.getParentEntity()); assertNull(entity1.getParentEntityId()); } @Test(expected = IllegalArgumentException.class) public void testSetParentWithMissingUUID() { TestEntityBase1 entity1 = new TestEntityBase1(); entity1.setUuid(TestUUIDs.TEST_UUIDS[0]); TestEntityBase2 entity2 = new TestEntityBase2(); entity1.setParentEntity(entity2); } @Test public void testGetChildren() throws Exception { EntityBase parent = new TestEntityBase(TestUUIDs.TEST_UUIDS[0]); EntityBase child1 = new TestEntityBase(TestUUIDs.TEST_UUIDS[1]); EntityBase child2 = new TestEntityBase(TestUUIDs.TEST_UUIDS[2]); EntityBase child3 = new TestEntityBase(TestUUIDs.TEST_UUIDS[3]); child1.setParentEntity(parent); child1.setNextSibling(child2); child2.setParentEntity(parent); child2.setNextSibling(child3); child3.setParentEntity(parent); parent.setFirstChild(child1); assertNull(parent.getNextSibling()); assertNull(parent.getParentEntity()); assertEquals(child1, parent.getFirstChild()); assertEquals(parent, child1.getParentEntity()); assertEquals(child2, child1.getNextSibling()); assertEquals(parent, child2.getParentEntity()); assertEquals(child3, child2.getNextSibling()); assertNull(child3.getNextSibling()); assertEquals(parent, child3.getParentEntity()); List<EntityBase> expected = Arrays.asList(child1, child2, child3); AssertUtils.assertEquals("getChildren()", expected, parent.getChildren()); parent.getChildren().set(0, new TestEntityBase(TestUUIDs.TEST_UUIDS[4])); AssertUtils.assertEquals("getChildren()", expected, parent.getChildren()); } @Test public void testNoChildren() throws Exception { EntityBase parent = new TestEntityBase(TestUUIDs.TEST_UUIDS[0]); assertNull(parent.getFirstChild()); assertNotNull(parent.getChildren()); assertTrue(parent.getChildren().isEmpty()); } @Test public void testGetPropertyNames() { TestExtensibleEntityBase base = new TestExtensibleEntityBase(TestUUIDs.TEST_UUIDS[0]); TestExtension ext = new TestExtension(); ext.setExtensibleEntity(base); AssertUtils.assertEqualsAnyOrder("getPropertyNames", CollectionUtils.asSet("parentEntity", "str", "items", "parentEntityId", "uuid", "bool", "deleted", "lastModified", "lastModifiedBy", "firstChild", "nextSibling"), ext.getPropertyNames()); } @Test public void testGetProperty() throws Exception { TestExtensibleEntityBase base = new TestExtensibleEntityBase(TestUUIDs.TEST_UUIDS[0]); TestExtension extBase = new TestExtension(); extBase.setExtensibleEntity(base); extBase.setBool(true); extBase.setStr("Homer"); List<String> list = Arrays.asList("Marge", "Lisa", "Bart"); extBase.setItems(list); assertEquals(Boolean.TRUE, (Boolean) extBase.getProperty(TestExtension.PROPERTY_BOOL)); assertEquals("Homer", (String) extBase.getProperty(TestExtension.PROPERTY_STR)); AssertUtils.assertEquals("List", list, (List<String>) extBase.getProperty(TestExtension.PROPERTY_ITEMS)); } @Test public void testGetPropertyWithNullValue() throws Exception { TestExtensibleEntityBase base = new TestExtensibleEntityBase(TestUUIDs.TEST_UUIDS[0]); TestExtension extBase = new TestExtension(); extBase.setExtensibleEntity(base); extBase.setStr(null); assertNull(extBase.getProperty(TestExtension.PROPERTY_STR)); } @Test(expected = NoSuchPropertyException.class) public void testGetUnknownProperty() throws Exception { TestExtensibleEntityBase base = new TestExtensibleEntityBase(TestUUIDs.TEST_UUIDS[0]); base.getProperty("foobar"); } @Test(expected = NoSuchPropertyException.class) public void testGetUnpublishedProperty() throws Exception { TestExtension extBase = new TestExtension(); // TestExtension has a getUnpublished() method, but there is // no @PropertyName constant for that property! extBase.getProperty("unpublished"); } @Test public void testSetProperty() throws Exception { TestExtensibleEntityBase base = new TestExtensibleEntityBase(TestUUIDs.TEST_UUIDS[0]); TestExtension extBase = new TestExtension(); extBase.setExtensibleEntity(base); extBase.setProperty(TestExtension.PROPERTY_BOOL, true); extBase.setProperty(TestExtension.PROPERTY_STR, "Homer"); List<String> list = Arrays.asList("Marge", "Lisa", "Bart"); extBase.setProperty(TestExtension.PROPERTY_ITEMS, list); assertEquals(true, extBase.isBool()); assertEquals("Homer", extBase.getStr()); AssertUtils.assertEquals("List", list, extBase.getItems()); } @Test public void testGetPropertyByExpression() throws Exception { TestExtensibleEntityBase base = new TestExtensibleEntityBase(TestUUIDs.TEST_UUIDS[0]); TestExtension extBase = new TestExtension(); extBase.setExtensibleEntity(base); extBase.putInner("foo", new TestExtension.Inner("bar")); Expression expr1 = new Expression("inner", "foo"); Expression expr2 = new Expression("str"); assertEquals("bar", (String) extBase.getProperty(expr1, expr2)); } @Test public void testSimpleGetPropertyByExpression() throws Exception { TestExtensibleEntityBase base = new TestExtensibleEntityBase(TestUUIDs.TEST_UUIDS[0]); TestExtension extBase = new TestExtension(); extBase.setExtensibleEntity(base); extBase.setStr("Homer"); Expression expr1 = new Expression("str"); assertEquals("Homer", (String) extBase.getProperty(expr1)); } @Test(expected = NoSuchPropertyException.class) public void testGetUnknownPropertyByExpression() throws Exception { TestExtension extBase = new TestExtension(); extBase.getProperty(new Expression("foo", "bar")); } @Test(expected = NoSuchPropertyException.class) public void testGetUnknownSimplePropertyByExpression() throws Exception { TestExtension extBase = new TestExtension(); extBase.getProperty(new Expression("foo")); } @Test(expected = NoSuchPropertyException.class) public void testGetUnpublishedPropertyByExpression() throws Exception { TestExtension extBase = new TestExtension(); extBase.getProperty(new Expression("unpublished")); } @Test public void testIntermediateNull() throws Exception { TestExtensibleEntityBase base = new TestExtensibleEntityBase(TestUUIDs.TEST_UUIDS[0]); TestExtension ext = new TestExtension(); ext.setExtensibleEntity(base); ext.putInner("foo", new TestExtension.Inner("bar")); Expression expr1 = new Expression("inner", "unknown"); Expression expr2 = new Expression("str"); //inner("unknown") returns null => getProperty() returns null assertNull(ext.getProperty(expr1, expr2)); } @Test public void testGetPropertyNoExpression() throws Exception { TestExtension extBase = new TestExtension(); assertNull(extBase.getProperty((Expression[])null)); assertNull(extBase.getProperty(new Expression[0])); } @Test public void testNullValue() throws Exception { TestExtensibleEntityBase base = new TestExtensibleEntityBase(TestUUIDs.TEST_UUIDS[0]); TestExtension extBase = new TestExtension(); extBase.setExtensibleEntity(base); extBase.setProperty(TestExtension.PROPERTY_STR, "Homer"); assertNotNull(extBase.getStr()); extBase.setProperty(TestExtension.PROPERTY_STR, null); assertNull(extBase.getStr()); } @Test(expected = NoSuchPropertyException.class) public void testSetUnknownProperty() throws Exception { TestExtensibleEntityBase base = new TestExtensibleEntityBase(TestUUIDs.TEST_UUIDS[0]); base.setProperty("foo", "bar"); } @Test(expected = PropertyUpdateException.class) public void testSetPrimitivePropertyToNull() throws Exception { TestExtensibleEntityBase base = new TestExtensibleEntityBase(TestUUIDs.TEST_UUIDS[0]); TestExtension extBase = new TestExtension(); extBase.setExtensibleEntity(base); extBase.setProperty(TestExtension.PROPERTY_BOOL, null); } @Test(expected = PropertyUpdateException.class) public void testSetValueWithIncompatibleType() throws Exception { TestExtensibleEntityBase base = new TestExtensibleEntityBase(TestUUIDs.TEST_UUIDS[0]); TestExtension extBase = new TestExtension(); extBase.setExtensibleEntity(base); extBase.setProperty(TestExtension.PROPERTY_BOOL, new String[]{}); } @Test(expected = PropertyUpdateException.class) public void testSetterThrowsException() throws Exception { TestExtensibleEntityBase base = new TestExtensibleEntityBase(TestUUIDs.TEST_UUIDS[0]); TestExtension extBase = new TestExtension(); extBase.setExtensibleEntity(base); extBase.setProperty(TestExtension.PROPERTY_ITEMS, null); } @Test public void testToString() { TestEntityBase entity = new TestEntityBase(); entity.setUuid(TestUUIDs.TEST_UUIDS[0]); assertEquals(TestUUIDs.TEST_UUIDS[0].toString(), entity.toString()); } @Test public void testHashCode() { TestEntityBase entity = new TestEntityBase(); entity.setUuid(TestUUIDs.TEST_UUIDS[0]); assertEquals(TestUUIDs.TEST_UUIDS[0].hashCode(), entity.hashCode()); } @Test public void testEquals() { TestEntityBase entity1 = new TestEntityBase(); entity1.setUuid(TestUUIDs.TEST_UUIDS[0]); TestEntityBase entity2 = new TestEntityBase(); entity2.setUuid(TestUUIDs.TEST_UUIDS[0]); TestEntityBase entity3 = new TestEntityBase(); entity3.setUuid(TestUUIDs.TEST_UUIDS[1]); assertTrue(entity1.equals(entity1)); assertTrue(entity1.equals(entity2)); assertTrue(entity2.equals(entity1)); assertFalse(entity1.equals(entity3)); assertFalse(entity3.equals(entity1)); assertFalse(entity1.equals(TestUUIDs.TEST_UUIDS[1])); } }