blob: 43adcd065e1ac7485592598ccf2414d57115b973 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2007, 2010 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.listener;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import junit.framework.TestCase;
import org.eclipse.jpt.utility.internal.ReflectionTools;
import org.eclipse.jpt.utility.internal.CollectionTools;
import org.eclipse.jpt.utility.internal.iterators.CloneIterator;
import org.eclipse.jpt.utility.internal.model.AbstractModel;
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.CollectionEvent;
import org.eclipse.jpt.utility.model.event.CollectionRemoveEvent;
import org.eclipse.jpt.utility.model.listener.CollectionChangeListener;
import org.eclipse.jpt.utility.model.listener.ListChangeListener;
import org.eclipse.jpt.utility.model.listener.ReflectiveChangeListener;
@SuppressWarnings("nls")
public class ReflectiveCollectionChangeListenerTests extends TestCase {
public ReflectiveCollectionChangeListenerTests(String name) {
super(name);
}
private CollectionChangeListener buildZeroArgumentListener(Object target) {
return ReflectiveChangeListener.buildCollectionChangeListener(target, "itemAddedZeroArgument", "itemRemovedZeroArgument", "collectionClearedZeroArgument", "collectionChangedZeroArgument");
}
private CollectionChangeListener buildSingleArgumentListener(Object target) {
return ReflectiveChangeListener.buildCollectionChangeListener(target, "itemAddedSingleArgument", "itemRemovedSingleArgument", "collectionClearedSingleArgument", "collectionChangedSingleArgument");
}
public void testItemAddedZeroArgumentNamedCollection() {
TestModel testModel = new TestModel();
String string = "foo";
Target target = new Target(testModel, TestModel.STRINGS_COLLECTION, string);
testModel.addCollectionChangeListener(TestModel.STRINGS_COLLECTION, this.buildZeroArgumentListener(target));
testModel.addString(string);
assertTrue(target.itemAddedZeroArgumentFlag);
assertFalse(target.itemAddedSingleArgumentFlag);
assertFalse(target.itemRemovedZeroArgumentFlag);
assertFalse(target.itemRemovedSingleArgumentFlag);
assertFalse(target.collectionClearedZeroArgumentFlag);
assertFalse(target.collectionClearedSingleArgumentFlag);
assertFalse(target.collectionChangedZeroArgumentFlag);
assertFalse(target.collectionChangedSingleArgumentFlag);
}
public void testItemAddedSingleArgumentNamedCollection() {
TestModel testModel = new TestModel();
String string = "foo";
Target target = new Target(testModel, TestModel.STRINGS_COLLECTION, string);
testModel.addCollectionChangeListener(TestModel.STRINGS_COLLECTION, this.buildSingleArgumentListener(target));
testModel.addString(string);
assertFalse(target.itemAddedZeroArgumentFlag);
assertTrue(target.itemAddedSingleArgumentFlag);
assertFalse(target.itemRemovedZeroArgumentFlag);
assertFalse(target.itemRemovedSingleArgumentFlag);
assertFalse(target.collectionClearedZeroArgumentFlag);
assertFalse(target.collectionClearedSingleArgumentFlag);
assertFalse(target.collectionChangedZeroArgumentFlag);
assertFalse(target.collectionChangedSingleArgumentFlag);
}
public void testItemRemovedZeroArgumentNamedCollection() {
TestModel testModel = new TestModel();
String string = "foo";
testModel.addString(string);
Target target = new Target(testModel, TestModel.STRINGS_COLLECTION, string);
testModel.addCollectionChangeListener(TestModel.STRINGS_COLLECTION, this.buildZeroArgumentListener(target));
testModel.removeString(string);
assertFalse(target.itemAddedZeroArgumentFlag);
assertFalse(target.itemAddedSingleArgumentFlag);
assertTrue(target.itemRemovedZeroArgumentFlag);
assertFalse(target.itemRemovedSingleArgumentFlag);
assertFalse(target.collectionClearedZeroArgumentFlag);
assertFalse(target.collectionClearedSingleArgumentFlag);
assertFalse(target.collectionChangedZeroArgumentFlag);
assertFalse(target.collectionChangedSingleArgumentFlag);
}
public void testItemRemovedSingleArgumentNamedCollection() {
TestModel testModel = new TestModel();
String string = "foo";
testModel.addString(string);
Target target = new Target(testModel, TestModel.STRINGS_COLLECTION, string);
testModel.addCollectionChangeListener(TestModel.STRINGS_COLLECTION, this.buildSingleArgumentListener(target));
testModel.removeString(string);
assertFalse(target.itemAddedZeroArgumentFlag);
assertFalse(target.itemAddedSingleArgumentFlag);
assertFalse(target.itemRemovedZeroArgumentFlag);
assertTrue(target.itemRemovedSingleArgumentFlag);
assertFalse(target.collectionClearedZeroArgumentFlag);
assertFalse(target.collectionClearedSingleArgumentFlag);
assertFalse(target.collectionChangedZeroArgumentFlag);
assertFalse(target.collectionChangedSingleArgumentFlag);
}
public void testCollectionClearedZeroArgumentNamedCollection() {
TestModel testModel = new TestModel();
String string = "foo";
testModel.addString(string);
Target target = new Target(testModel, TestModel.STRINGS_COLLECTION, string);
testModel.addCollectionChangeListener(TestModel.STRINGS_COLLECTION, this.buildZeroArgumentListener(target));
testModel.clearStrings();
assertFalse(target.itemAddedZeroArgumentFlag);
assertFalse(target.itemAddedSingleArgumentFlag);
assertFalse(target.itemRemovedZeroArgumentFlag);
assertFalse(target.itemRemovedSingleArgumentFlag);
assertTrue(target.collectionClearedZeroArgumentFlag);
assertFalse(target.collectionClearedSingleArgumentFlag);
assertFalse(target.collectionChangedZeroArgumentFlag);
assertFalse(target.collectionChangedSingleArgumentFlag);
}
public void testCollectionClearedSingleArgumentNamedCollection() {
TestModel testModel = new TestModel();
String string = "foo";
testModel.addString(string);
Target target = new Target(testModel, TestModel.STRINGS_COLLECTION, string);
testModel.addCollectionChangeListener(TestModel.STRINGS_COLLECTION, this.buildSingleArgumentListener(target));
testModel.clearStrings();
assertFalse(target.itemAddedZeroArgumentFlag);
assertFalse(target.itemAddedSingleArgumentFlag);
assertFalse(target.itemRemovedZeroArgumentFlag);
assertFalse(target.itemRemovedSingleArgumentFlag);
assertFalse(target.collectionClearedZeroArgumentFlag);
assertTrue(target.collectionClearedSingleArgumentFlag);
assertFalse(target.collectionChangedZeroArgumentFlag);
assertFalse(target.collectionChangedSingleArgumentFlag);
}
public void testCollectionChangedZeroArgumentNamedCollection() {
TestModel testModel = new TestModel();
String string = "foo";
testModel.addString(string);
Target target = new Target(testModel, TestModel.STRINGS_COLLECTION, string);
testModel.addCollectionChangeListener(TestModel.STRINGS_COLLECTION, this.buildZeroArgumentListener(target));
testModel.replaceStrings(new String[] {"bar", "baz"});
assertFalse(target.itemAddedZeroArgumentFlag);
assertFalse(target.itemAddedSingleArgumentFlag);
assertFalse(target.itemRemovedZeroArgumentFlag);
assertFalse(target.itemRemovedSingleArgumentFlag);
assertFalse(target.collectionClearedZeroArgumentFlag);
assertFalse(target.collectionClearedSingleArgumentFlag);
assertTrue(target.collectionChangedZeroArgumentFlag);
assertFalse(target.collectionChangedSingleArgumentFlag);
}
public void testCollectionChangedSingleArgumentNamedCollection() {
TestModel testModel = new TestModel();
String string = "foo";
testModel.addString(string);
Target target = new Target(testModel, TestModel.STRINGS_COLLECTION, string);
testModel.addCollectionChangeListener(TestModel.STRINGS_COLLECTION, this.buildSingleArgumentListener(target));
testModel.replaceStrings(new String[] {"bar", "baz"});
assertFalse(target.itemAddedZeroArgumentFlag);
assertFalse(target.itemAddedSingleArgumentFlag);
assertFalse(target.itemRemovedZeroArgumentFlag);
assertFalse(target.itemRemovedSingleArgumentFlag);
assertFalse(target.collectionClearedZeroArgumentFlag);
assertFalse(target.collectionClearedSingleArgumentFlag);
assertFalse(target.collectionChangedZeroArgumentFlag);
assertTrue(target.collectionChangedSingleArgumentFlag);
}
public void testBogusDoubleArgument1() {
TestModel testModel = new TestModel();
String string = "foo";
Target target = new Target(testModel, TestModel.STRINGS_COLLECTION, string);
boolean exCaught = false;
try {
CollectionChangeListener listener = ReflectiveChangeListener.buildCollectionChangeListener(target, "collectionChangedDoubleArgument");
fail("bogus listener: " + listener);
} catch (RuntimeException ex) {
if (ex.getCause().getClass() == NoSuchMethodException.class) {
exCaught = true;
}
}
assertTrue(exCaught);
}
public void testBogusDoubleArgument2() throws Exception {
TestModel testModel = new TestModel();
String string = "foo";
Target target = new Target(testModel, TestModel.STRINGS_COLLECTION, string);
Method method = ReflectionTools.getMethod(target, "collectionChangedDoubleArgument", new Class[] {CollectionChangeEvent.class, Object.class});
boolean exCaught = false;
try {
CollectionChangeListener listener = ReflectiveChangeListener.buildCollectionChangeListener(target, method);
fail("bogus listener: " + listener);
} catch (RuntimeException ex) {
if (ex.getMessage().equals(method.toString())) {
exCaught = true;
}
}
assertTrue(exCaught);
}
public void testListenerMismatch() {
TestModel testModel = new TestModel();
String string = "foo";
Target target = new Target(testModel, TestModel.STRINGS_COLLECTION, string);
// build a COLLECTION change listener and hack it so we
// can add it as a LIST change listener
Object listener = ReflectiveChangeListener.buildCollectionChangeListener(target, "collectionEventSingleArgument");
testModel.addListChangeListener("bogus list", (ListChangeListener) listener);
boolean exCaught = false;
try {
testModel.changeList();
fail("listener mismatch: " + listener);
} catch (IllegalArgumentException ex) {
exCaught = true;
}
assertTrue(exCaught);
}
class TestModel extends AbstractModel {
private Collection<String> strings = new ArrayList<String>();
public static final String STRINGS_COLLECTION = "strings";
TestModel() {
super();
}
Iterator<String> strings() {
return new CloneIterator<String>(this.strings) {
@Override
protected void remove(String s) {
TestModel.this.removeString(s);
}
};
}
void addString(String string) {
this.addItemToCollection(string, this.strings, STRINGS_COLLECTION);
}
void removeString(String string) {
this.removeItemFromCollection(string, this.strings, STRINGS_COLLECTION);
}
void clearStrings() {
this.clearCollection(this.strings, STRINGS_COLLECTION);
}
void replaceStrings(String[] newStrings) {
this.strings.clear();
CollectionTools.addAll(this.strings, newStrings);
this.fireCollectionChanged(STRINGS_COLLECTION, this.strings);
}
void changeList() {
this.fireListChanged("bogus list", Collections.emptyList());
}
}
class Target {
TestModel testModel;
String collectionName;
String string;
boolean itemAddedZeroArgumentFlag = false;
boolean itemAddedSingleArgumentFlag = false;
boolean itemRemovedZeroArgumentFlag = false;
boolean itemRemovedSingleArgumentFlag = false;
boolean collectionClearedZeroArgumentFlag = false;
boolean collectionClearedSingleArgumentFlag = false;
boolean collectionChangedZeroArgumentFlag = false;
boolean collectionChangedSingleArgumentFlag = false;
boolean collectionEventSingleArgumentFlag = false;
Target(TestModel testModel, String collectionName, String string) {
super();
this.testModel = testModel;
this.collectionName = collectionName;
this.string = string;
}
void itemAddedZeroArgument() {
this.itemAddedZeroArgumentFlag = true;
}
void itemAddedSingleArgument(CollectionAddEvent e) {
this.itemAddedSingleArgumentFlag = true;
assertSame(this.testModel, e.getSource());
assertEquals(this.collectionName, e.getCollectionName());
assertEquals(this.string, e.getItems().iterator().next());
}
void itemRemovedZeroArgument() {
this.itemRemovedZeroArgumentFlag = true;
}
void itemRemovedSingleArgument(CollectionRemoveEvent e) {
this.itemRemovedSingleArgumentFlag = true;
assertSame(this.testModel, e.getSource());
assertEquals(this.collectionName, e.getCollectionName());
assertEquals(this.string, e.getItems().iterator().next());
}
void collectionClearedZeroArgument() {
this.collectionClearedZeroArgumentFlag = true;
}
void collectionClearedSingleArgument(CollectionClearEvent e) {
this.collectionClearedSingleArgumentFlag = true;
assertSame(this.testModel, e.getSource());
assertEquals(this.collectionName, e.getCollectionName());
}
void collectionChangedZeroArgument() {
this.collectionChangedZeroArgumentFlag = true;
}
void collectionChangedSingleArgument(CollectionChangeEvent e) {
this.collectionChangedSingleArgumentFlag = true;
assertSame(this.testModel, e.getSource());
assertEquals(this.collectionName, e.getCollectionName());
}
void collectionEventSingleArgument(CollectionEvent e) {
this.collectionEventSingleArgumentFlag = true;
assertSame(this.testModel, e.getSource());
assertEquals(this.collectionName, e.getCollectionName());
}
void collectionChangedDoubleArgument(CollectionChangeEvent e, Object o) {
fail("bogus event: " + e + " object: " + o);
}
}
}