package com.vaadin.v7.data.util; import java.util.Iterator; import org.easymock.EasyMock; import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import com.vaadin.v7.data.Item.PropertySetChangeEvent; import com.vaadin.v7.data.Item.PropertySetChangeListener; public class PropertySetItemTest { private static final String ID1 = "id1"; private static final String ID2 = "id2"; private static final String ID3 = "id3"; private static final String VALUE1 = "value1"; private static final String VALUE2 = "value2"; private static final String VALUE3 = "value3"; private ObjectProperty<String> prop1; private ObjectProperty<String> prop2; private ObjectProperty<String> prop3; private PropertySetChangeListener propertySetListenerMock; private PropertySetChangeListener propertySetListenerMock2; @Before public void setUp() { prop1 = new ObjectProperty<String>(VALUE1, String.class); prop2 = new ObjectProperty<String>(VALUE2, String.class); prop3 = new ObjectProperty<String>(VALUE3, String.class); propertySetListenerMock = EasyMock .createStrictMock(PropertySetChangeListener.class); propertySetListenerMock2 = EasyMock .createMock(PropertySetChangeListener.class); } @After public void tearDown() { prop1 = null; prop2 = null; prop3 = null; propertySetListenerMock = null; propertySetListenerMock2 = null; } private PropertysetItem createPropertySetItem() { return new PropertysetItem(); } @Test public void testEmptyItem() { PropertysetItem item = createPropertySetItem(); Assert.assertNotNull(item.getItemPropertyIds()); Assert.assertEquals(0, item.getItemPropertyIds().size()); } @Test public void testGetProperty() { PropertysetItem item = createPropertySetItem(); Assert.assertNull(item.getItemProperty(ID1)); item.addItemProperty(ID1, prop1); Assert.assertEquals(prop1, item.getItemProperty(ID1)); Assert.assertNull(item.getItemProperty(ID2)); } @Test public void testAddSingleProperty() { PropertysetItem item = createPropertySetItem(); item.addItemProperty(ID1, prop1); Assert.assertEquals(1, item.getItemPropertyIds().size()); Object firstValue = item.getItemPropertyIds().iterator().next(); Assert.assertEquals(ID1, firstValue); Assert.assertEquals(prop1, item.getItemProperty(ID1)); } @Test public void testAddMultipleProperties() { PropertysetItem item = createPropertySetItem(); item.addItemProperty(ID1, prop1); Assert.assertEquals(1, item.getItemPropertyIds().size()); Assert.assertEquals(prop1, item.getItemProperty(ID1)); item.addItemProperty(ID2, prop2); Assert.assertEquals(2, item.getItemPropertyIds().size()); Assert.assertEquals(prop1, item.getItemProperty(ID1)); Assert.assertEquals(prop2, item.getItemProperty(ID2)); item.addItemProperty(ID3, prop3); Assert.assertEquals(3, item.getItemPropertyIds().size()); } @Test public void testAddedPropertyOrder() { PropertysetItem item = createPropertySetItem(); item.addItemProperty(ID1, prop1); item.addItemProperty(ID2, prop2); item.addItemProperty(ID3, prop3); Iterator<?> it = item.getItemPropertyIds().iterator(); Assert.assertEquals(ID1, it.next()); Assert.assertEquals(ID2, it.next()); Assert.assertEquals(ID3, it.next()); } @Test public void testAddPropertyTwice() { PropertysetItem item = createPropertySetItem(); Assert.assertTrue(item.addItemProperty(ID1, prop1)); Assert.assertFalse(item.addItemProperty(ID1, prop1)); Assert.assertEquals(1, item.getItemPropertyIds().size()); Assert.assertEquals(prop1, item.getItemProperty(ID1)); } @Test public void testCannotChangeProperty() { PropertysetItem item = createPropertySetItem(); Assert.assertTrue(item.addItemProperty(ID1, prop1)); Assert.assertEquals(prop1, item.getItemProperty(ID1)); Assert.assertFalse(item.addItemProperty(ID1, prop2)); Assert.assertEquals(1, item.getItemPropertyIds().size()); Assert.assertEquals(prop1, item.getItemProperty(ID1)); } @Test public void testRemoveProperty() { PropertysetItem item = createPropertySetItem(); item.addItemProperty(ID1, prop1); item.removeItemProperty(ID1); Assert.assertEquals(0, item.getItemPropertyIds().size()); Assert.assertNull(item.getItemProperty(ID1)); } @Test public void testRemovePropertyOrder() { PropertysetItem item = createPropertySetItem(); item.addItemProperty(ID1, prop1); item.addItemProperty(ID2, prop2); item.addItemProperty(ID3, prop3); item.removeItemProperty(ID2); Iterator<?> it = item.getItemPropertyIds().iterator(); Assert.assertEquals(ID1, it.next()); Assert.assertEquals(ID3, it.next()); } @Test public void testRemoveNonExistentListener() { PropertysetItem item = createPropertySetItem(); item.removeListener(propertySetListenerMock); } @Test public void testRemoveListenerTwice() { PropertysetItem item = createPropertySetItem(); item.addListener(propertySetListenerMock); item.removeListener(propertySetListenerMock); item.removeListener(propertySetListenerMock); } @Test public void testAddPropertyNotification() { // exactly one notification each time PropertysetItem item = createPropertySetItem(); // Expectations and start test propertySetListenerMock.itemPropertySetChange( EasyMock.isA(PropertySetChangeEvent.class)); EasyMock.replay(propertySetListenerMock); // Add listener and add a property -> should end up in listener once item.addListener(propertySetListenerMock); item.addItemProperty(ID1, prop1); // Ensure listener was called once EasyMock.verify(propertySetListenerMock); // Remove the listener -> should not end up in listener when adding a // property item.removeListener(propertySetListenerMock); item.addItemProperty(ID2, prop2); // Ensure listener still has been called only once EasyMock.verify(propertySetListenerMock); } @Test public void testRemovePropertyNotification() { // exactly one notification each time PropertysetItem item = createPropertySetItem(); item.addItemProperty(ID1, prop1); item.addItemProperty(ID2, prop2); // Expectations and start test propertySetListenerMock.itemPropertySetChange( EasyMock.isA(PropertySetChangeEvent.class)); EasyMock.replay(propertySetListenerMock); // Add listener and add a property -> should end up in listener once item.addListener(propertySetListenerMock); item.removeItemProperty(ID1); // Ensure listener was called once EasyMock.verify(propertySetListenerMock); // Remove the listener -> should not end up in listener item.removeListener(propertySetListenerMock); item.removeItemProperty(ID2); // Ensure listener still has been called only once EasyMock.verify(propertySetListenerMock); } @Test public void testItemEqualsNull() { PropertysetItem item = createPropertySetItem(); Assert.assertFalse(item.equals(null)); } @Test public void testEmptyItemEquals() { PropertysetItem item1 = createPropertySetItem(); PropertysetItem item2 = createPropertySetItem(); Assert.assertTrue(item1.equals(item2)); } @Test public void testItemEqualsSingleProperty() { PropertysetItem item1 = createPropertySetItem(); PropertysetItem item2 = createPropertySetItem(); item2.addItemProperty(ID1, prop1); PropertysetItem item3 = createPropertySetItem(); item3.addItemProperty(ID1, prop1); PropertysetItem item4 = createPropertySetItem(); item4.addItemProperty(ID1, prop2); PropertysetItem item5 = createPropertySetItem(); item5.addItemProperty(ID2, prop2); Assert.assertFalse(item1.equals(item2)); Assert.assertFalse(item1.equals(item3)); Assert.assertFalse(item1.equals(item4)); Assert.assertFalse(item1.equals(item5)); Assert.assertTrue(item2.equals(item3)); Assert.assertFalse(item2.equals(item4)); Assert.assertFalse(item2.equals(item5)); Assert.assertFalse(item3.equals(item4)); Assert.assertFalse(item3.equals(item5)); Assert.assertFalse(item4.equals(item5)); Assert.assertFalse(item2.equals(item1)); } @Test public void testItemEqualsMultipleProperties() { PropertysetItem item1 = createPropertySetItem(); item1.addItemProperty(ID1, prop1); PropertysetItem item2 = createPropertySetItem(); item2.addItemProperty(ID1, prop1); item2.addItemProperty(ID2, prop2); PropertysetItem item3 = createPropertySetItem(); item3.addItemProperty(ID1, prop1); item3.addItemProperty(ID2, prop2); Assert.assertFalse(item1.equals(item2)); Assert.assertTrue(item2.equals(item3)); } @Test public void testItemEqualsPropertyOrder() { PropertysetItem item1 = createPropertySetItem(); item1.addItemProperty(ID1, prop1); item1.addItemProperty(ID2, prop2); PropertysetItem item2 = createPropertySetItem(); item2.addItemProperty(ID2, prop2); item2.addItemProperty(ID1, prop1); Assert.assertFalse(item1.equals(item2)); } @Test public void testEqualsSingleListener() { PropertysetItem item1 = createPropertySetItem(); PropertysetItem item2 = createPropertySetItem(); item1.addListener(propertySetListenerMock); Assert.assertFalse(item1.equals(item2)); Assert.assertFalse(item2.equals(item1)); item2.addListener(propertySetListenerMock); Assert.assertTrue(item1.equals(item2)); Assert.assertTrue(item2.equals(item1)); } @Test public void testEqualsMultipleListeners() { PropertysetItem item1 = createPropertySetItem(); PropertysetItem item2 = createPropertySetItem(); item1.addListener(propertySetListenerMock); item1.addListener(propertySetListenerMock2); item2.addListener(propertySetListenerMock); Assert.assertFalse(item1.equals(item2)); Assert.assertFalse(item2.equals(item1)); item2.addListener(propertySetListenerMock2); Assert.assertTrue(item1.equals(item2)); Assert.assertTrue(item2.equals(item1)); } @Test public void testEqualsAddRemoveListener() { PropertysetItem item1 = createPropertySetItem(); PropertysetItem item2 = createPropertySetItem(); item1.addListener(propertySetListenerMock); item1.removeListener(propertySetListenerMock); Assert.assertTrue(item1.equals(item2)); Assert.assertTrue(item2.equals(item1)); } @Test public void testItemHashCodeEmpty() { PropertysetItem item1 = createPropertySetItem(); PropertysetItem item2 = createPropertySetItem(); Assert.assertEquals(item1.hashCode(), item2.hashCode()); } @Test public void testItemHashCodeAddProperties() { PropertysetItem item1 = createPropertySetItem(); PropertysetItem item2 = createPropertySetItem(); Assert.assertEquals(item1.hashCode(), item2.hashCode()); item1.addItemProperty(ID1, prop1); item1.addItemProperty(ID2, prop2); // hashCodes can be equal even if items are different item2.addItemProperty(ID1, prop1); item2.addItemProperty(ID2, prop2); // but here hashCodes must be equal Assert.assertEquals(item1.hashCode(), item2.hashCode()); } @Test public void testItemHashCodeAddListeners() { PropertysetItem item1 = createPropertySetItem(); PropertysetItem item2 = createPropertySetItem(); Assert.assertEquals(item1.hashCode(), item2.hashCode()); item1.addListener(propertySetListenerMock); // hashCodes can be equal even if items are different item2.addListener(propertySetListenerMock); // but here hashCodes must be equal Assert.assertEquals(item1.hashCode(), item2.hashCode()); } @Test public void testItemHashCodeAddRemoveProperty() { PropertysetItem item1 = createPropertySetItem(); PropertysetItem item2 = createPropertySetItem(); item1.addItemProperty(ID1, prop1); item1.removeItemProperty(ID1); Assert.assertEquals(item1.hashCode(), item2.hashCode()); } @Test public void testItemHashCodeAddRemoveListener() { PropertysetItem item1 = createPropertySetItem(); PropertysetItem item2 = createPropertySetItem(); item1.addListener(propertySetListenerMock); item1.removeListener(propertySetListenerMock); Assert.assertEquals(item1.hashCode(), item2.hashCode()); } @Test public void testToString() { // toString() behavior is specified in the class javadoc PropertysetItem item = createPropertySetItem(); Assert.assertEquals("", item.toString()); item.addItemProperty(ID1, prop1); Assert.assertEquals(String.valueOf(prop1.getValue()), item.toString()); item.addItemProperty(ID2, prop2); Assert.assertEquals(String.valueOf(prop1.getValue()) + " " + String.valueOf(prop2.getValue()), item.toString()); } }