/******************************************************************************* * Copyright (c) 2009 Oracle. 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: * Oracle - initial API and implementation ******************************************************************************/ package org.eclipse.jpt.utility.tests.internal.model.value; import java.util.ArrayList; import java.util.Collection; import junit.framework.TestCase; import org.eclipse.jpt.utility.internal.Bag; import org.eclipse.jpt.utility.internal.CollectionTools; import org.eclipse.jpt.utility.internal.model.AbstractModel; import org.eclipse.jpt.utility.internal.model.value.SetCollectionValueModel; import org.eclipse.jpt.utility.internal.model.value.SimpleCollectionValueModel; import org.eclipse.jpt.utility.model.event.CollectionAddEvent; import org.eclipse.jpt.utility.model.event.CollectionChangeEvent; import org.eclipse.jpt.utility.model.event.CollectionClearEvent; import org.eclipse.jpt.utility.model.event.CollectionRemoveEvent; import org.eclipse.jpt.utility.model.listener.ChangeAdapter; import org.eclipse.jpt.utility.model.listener.ChangeListener; import org.eclipse.jpt.utility.model.listener.CollectionChangeListener; import org.eclipse.jpt.utility.model.value.CollectionValueModel; import org.eclipse.jpt.utility.tests.internal.TestTools; @SuppressWarnings("nls") public class SetCollectionValueModelTests extends TestCase { private SimpleCollectionValueModel collectionHolder; CollectionAddEvent addEvent; CollectionRemoveEvent removeEvent; CollectionClearEvent collectionClearedEvent; CollectionChangeEvent collectionChangedEvent; private CollectionValueModel setHolder; CollectionAddEvent setAddEvent; CollectionRemoveEvent setRemoveEvent; CollectionClearEvent setClearedEvent; CollectionChangeEvent setChangedEvent; public SetCollectionValueModelTests(String name) { super(name); } @Override protected void setUp() throws Exception { super.setUp(); this.collectionHolder = new SimpleCollectionValueModel(this.buildCollection()); this.setHolder = new SetCollectionValueModel(this.collectionHolder); } private Collection buildCollection() { Collection collection = new ArrayList(); collection.add("foo"); collection.add("foo"); return collection; } @Override protected void tearDown() throws Exception { TestTools.clear(this); super.tearDown(); } public void testIterator() { // add a listener to "activate" the wrapper this.setHolder.addChangeListener(this.buildSetChangeListener()); this.verify(this.collectionHolder, "foo", "foo"); this.verify(this.setHolder, "foo"); this.collectionHolder.add("bar"); this.collectionHolder.add("bar"); this.verify(this.collectionHolder, "foo", "foo", "bar", "bar"); this.verify(this.setHolder, "foo", "bar"); this.collectionHolder.remove("bar"); this.verify(this.collectionHolder, "foo", "foo", "bar"); this.verify(this.setHolder, "foo", "bar"); this.collectionHolder.remove("bar"); this.verify(this.collectionHolder, "foo", "foo"); this.verify(this.setHolder, "foo"); this.collectionHolder.remove("foo"); this.verify(this.collectionHolder, "foo"); this.verify(this.setHolder, "foo"); this.collectionHolder.remove("foo"); assertFalse(this.collectionHolder.iterator().hasNext()); assertFalse(this.setHolder.iterator().hasNext()); } public void testSize() { // add a listener to "activate" the wrapper this.setHolder.addChangeListener(this.buildSetChangeListener()); assertEquals(2, this.collectionHolder.size()); assertEquals(1, this.setHolder.size()); this.collectionHolder.add("bar"); this.collectionHolder.add("bar"); assertEquals(4, this.collectionHolder.size()); assertEquals(2, this.setHolder.size()); this.collectionHolder.remove("bar"); assertEquals(3, this.collectionHolder.size()); assertEquals(2, this.setHolder.size()); this.collectionHolder.remove("bar"); assertEquals(2, this.collectionHolder.size()); assertEquals(1, this.setHolder.size()); this.collectionHolder.remove("foo"); assertEquals(1, this.collectionHolder.size()); assertEquals(1, this.setHolder.size()); this.collectionHolder.remove("foo"); assertEquals(0, this.collectionHolder.size()); assertEquals(0, this.setHolder.size()); } public void testBulkChange() { // add a listener to "activate" the wrapper this.setHolder.addChangeListener(this.buildSetChangeListener()); Collection newCollection = new ArrayList(); newCollection.add("fox"); newCollection.add("fox"); newCollection.add("bat"); this.collectionHolder.setValues(newCollection); this.verify(this.collectionHolder, "fox", "fox", "bat"); this.verify(this.setHolder, "fox", "bat"); } public void testLazyListening() { assertTrue(((AbstractModel) this.collectionHolder).hasNoCollectionChangeListeners(CollectionValueModel.VALUES)); ChangeListener listener = this.buildSetChangeListener(); this.setHolder.addChangeListener(listener); assertTrue(((AbstractModel) this.collectionHolder).hasAnyCollectionChangeListeners(CollectionValueModel.VALUES)); this.setHolder.removeChangeListener(listener); assertTrue(((AbstractModel) this.collectionHolder).hasNoCollectionChangeListeners(CollectionValueModel.VALUES)); this.setHolder.addCollectionChangeListener(CollectionValueModel.VALUES, listener); assertTrue(((AbstractModel) this.collectionHolder).hasAnyCollectionChangeListeners(CollectionValueModel.VALUES)); this.setHolder.removeCollectionChangeListener(CollectionValueModel.VALUES, listener); assertTrue(((AbstractModel) this.collectionHolder).hasNoCollectionChangeListeners(CollectionValueModel.VALUES)); } public void testEvents1() { this.collectionHolder.addChangeListener(this.buildChangeListener()); this.setHolder.addChangeListener(this.buildSetChangeListener()); this.verifyEvents(); } public void testEvents2() { this.collectionHolder.addCollectionChangeListener(CollectionValueModel.VALUES, this.buildCollectionChangeListener()); this.setHolder.addCollectionChangeListener(CollectionValueModel.VALUES, this.buildSetCollectionChangeListener()); this.verifyEvents(); } private void clearEvents() { this.addEvent = null; this.removeEvent = null; this.collectionClearedEvent = null; this.collectionChangedEvent = null; this.setAddEvent = null; this.setRemoveEvent = null; this.setClearedEvent = null; this.setChangedEvent = null; } private void verifyEvents() { this.clearEvents(); this.collectionHolder.add("bar"); this.verifyEvent(this.addEvent, this.collectionHolder, "bar"); this.verifyEvent(this.setAddEvent, this.setHolder, "bar"); this.clearEvents(); this.collectionHolder.remove("foo"); this.verifyEvent(this.removeEvent, this.collectionHolder, "foo"); assertNull(this.setRemoveEvent); this.clearEvents(); this.collectionHolder.add("bar"); this.verifyEvent(this.addEvent, this.collectionHolder, "bar"); assertNull(this.setAddEvent); this.clearEvents(); this.collectionHolder.remove("foo"); this.verifyEvent(this.removeEvent, this.collectionHolder, "foo"); this.verifyEvent(this.setRemoveEvent, this.setHolder, "foo"); this.clearEvents(); this.collectionHolder.add("foo"); this.verifyEvent(this.addEvent, this.collectionHolder, "foo"); this.verifyEvent(this.setAddEvent, this.setHolder, "foo"); this.clearEvents(); this.collectionHolder.clear(); this.verifyEvent(this.collectionClearedEvent, this.collectionHolder); this.verifyEvent(this.setClearedEvent, this.setHolder); this.clearEvents(); Collection newCollection = new ArrayList(); newCollection.add("fox"); newCollection.add("fox"); newCollection.add("bat"); newCollection.add("bat"); newCollection.add("bat"); this.collectionHolder.setValues(newCollection); this.verifyEvent(this.collectionChangedEvent, this.collectionHolder, "fox", "fox", "bat", "bat", "bat"); this.verifyEvent(this.setChangedEvent, this.setHolder, "fox", "bat"); } private CollectionChangeListener buildCollectionChangeListener() { return new CollectionChangeListener() { public void itemsAdded(CollectionAddEvent event) { SetCollectionValueModelTests.this.addEvent = event; } public void itemsRemoved(CollectionRemoveEvent event) { SetCollectionValueModelTests.this.removeEvent = event; } public void collectionCleared(CollectionClearEvent event) { SetCollectionValueModelTests.this.collectionClearedEvent = event; } public void collectionChanged(CollectionChangeEvent event) { SetCollectionValueModelTests.this.collectionChangedEvent = event; } }; } private ChangeListener buildChangeListener() { return new ChangeAdapter() { @Override public void itemsAdded(CollectionAddEvent event) { SetCollectionValueModelTests.this.addEvent = event; } @Override public void itemsRemoved(CollectionRemoveEvent event) { SetCollectionValueModelTests.this.removeEvent = event; } @Override public void collectionCleared(CollectionClearEvent event) { SetCollectionValueModelTests.this.collectionClearedEvent = event; } @Override public void collectionChanged(CollectionChangeEvent event) { SetCollectionValueModelTests.this.collectionChangedEvent = event; } }; } private CollectionChangeListener buildSetCollectionChangeListener() { return new CollectionChangeListener() { public void itemsAdded(CollectionAddEvent event) { SetCollectionValueModelTests.this.setAddEvent = event; } public void itemsRemoved(CollectionRemoveEvent event) { SetCollectionValueModelTests.this.setRemoveEvent = event; } public void collectionCleared(CollectionClearEvent event) { SetCollectionValueModelTests.this.setClearedEvent = event; } public void collectionChanged(CollectionChangeEvent event) { SetCollectionValueModelTests.this.setChangedEvent = event; } }; } private ChangeListener buildSetChangeListener() { return new ChangeAdapter() { @Override public void itemsAdded(CollectionAddEvent event) { SetCollectionValueModelTests.this.setAddEvent = event; } @Override public void itemsRemoved(CollectionRemoveEvent event) { SetCollectionValueModelTests.this.setRemoveEvent = event; } @Override public void collectionCleared(CollectionClearEvent event) { SetCollectionValueModelTests.this.setClearedEvent = event; } @Override public void collectionChanged(CollectionChangeEvent event) { SetCollectionValueModelTests.this.setChangedEvent = event; } }; } private void verify(CollectionValueModel cvm, String... expectedItems) { Bag actual = CollectionTools.bag(cvm); Bag expected = CollectionTools.bag(expectedItems); assertEquals(expected, actual); } private void verifyEvent(CollectionAddEvent event, Object source, Object... expectedItems) { assertEquals(source, event.getSource()); assertEquals(CollectionValueModel.VALUES, event.getCollectionName()); assertEquals(CollectionTools.bag(expectedItems), CollectionTools.bag(event.getItems())); } private void verifyEvent(CollectionRemoveEvent event, Object source, Object... expectedItems) { assertEquals(source, event.getSource()); assertEquals(CollectionValueModel.VALUES, event.getCollectionName()); assertEquals(CollectionTools.bag(expectedItems), CollectionTools.bag(event.getItems())); } private void verifyEvent(CollectionClearEvent event, Object source) { assertEquals(source, event.getSource()); assertEquals(CollectionValueModel.VALUES, event.getCollectionName()); } private void verifyEvent(CollectionChangeEvent event, Object source, Object... expectedItems) { assertEquals(source, event.getSource()); assertEquals(CollectionValueModel.VALUES, event.getCollectionName()); assertEquals(CollectionTools.bag(expectedItems), CollectionTools.bag(event.getCollection())); } }