blob: 34f6c9b49f51c9e118eacf77e5634b6516b01121 [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.common.utility.tests.internal.model.listener;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.ListIterator;
import junit.framework.TestCase;
import org.eclipse.jpt.common.utility.internal.CollectionTools;
import org.eclipse.jpt.common.utility.internal.ReflectionTools;
import org.eclipse.jpt.common.utility.internal.iterators.CloneListIterator;
import org.eclipse.jpt.common.utility.internal.model.AbstractModel;
import org.eclipse.jpt.common.utility.model.event.ListAddEvent;
import org.eclipse.jpt.common.utility.model.event.ListChangeEvent;
import org.eclipse.jpt.common.utility.model.event.ListClearEvent;
import org.eclipse.jpt.common.utility.model.event.ListEvent;
import org.eclipse.jpt.common.utility.model.event.ListMoveEvent;
import org.eclipse.jpt.common.utility.model.event.ListRemoveEvent;
import org.eclipse.jpt.common.utility.model.event.ListReplaceEvent;
import org.eclipse.jpt.common.utility.model.listener.CollectionChangeListener;
import org.eclipse.jpt.common.utility.model.listener.ListChangeListener;
import org.eclipse.jpt.common.utility.model.listener.ReflectiveChangeListener;
@SuppressWarnings("nls")
public class ReflectiveListChangeListenerTests extends TestCase {
public ReflectiveListChangeListenerTests(String name) {
super(name);
}
private ListChangeListener buildZeroArgumentListener(Object target) {
return ReflectiveChangeListener.buildListChangeListener(target, "itemAddedZeroArgument", "itemRemovedZeroArgument", "itemReplacedZeroArgument", "itemMovedZeroArgument", "listClearedZeroArgument", "listChangedZeroArgument");
}
private ListChangeListener buildSingleArgumentListener(Object target) {
return ReflectiveChangeListener.buildListChangeListener(target, "itemAddedSingleArgument", "itemRemovedSingleArgument", "itemReplacedSingleArgument", "itemMovedSingleArgument", "listClearedSingleArgument", "listChangedSingleArgument");
}
public void testItemAddedZeroArgumentNamedList() {
TestModel testModel = new TestModel();
String string = "foo";
Target target = new Target(testModel, TestModel.STRINGS_LIST, string, 0);
testModel.addListChangeListener(TestModel.STRINGS_LIST, this.buildZeroArgumentListener(target));
testModel.addString(string);
assertTrue(target.itemAddedZeroArgumentFlag);
assertFalse(target.itemAddedSingleArgumentFlag);
assertFalse(target.itemRemovedZeroArgumentFlag);
assertFalse(target.itemRemovedSingleArgumentFlag);
assertFalse(target.itemReplacedZeroArgumentFlag);
assertFalse(target.itemReplacedSingleArgumentFlag);
assertFalse(target.itemMovedZeroArgumentFlag);
assertFalse(target.itemMovedSingleArgumentFlag);
assertFalse(target.listClearedZeroArgumentFlag);
assertFalse(target.listClearedSingleArgumentFlag);
assertFalse(target.listChangedZeroArgumentFlag);
assertFalse(target.listChangedSingleArgumentFlag);
}
public void testItemAddedSingleArgumentNamedList() {
TestModel testModel = new TestModel();
String string = "foo";
Target target = new Target(testModel, TestModel.STRINGS_LIST, string, 0);
testModel.addListChangeListener(TestModel.STRINGS_LIST, this.buildSingleArgumentListener(target));
testModel.addString(string);
assertFalse(target.itemAddedZeroArgumentFlag);
assertTrue(target.itemAddedSingleArgumentFlag);
assertFalse(target.itemRemovedZeroArgumentFlag);
assertFalse(target.itemRemovedSingleArgumentFlag);
assertFalse(target.itemReplacedZeroArgumentFlag);
assertFalse(target.itemReplacedSingleArgumentFlag);
assertFalse(target.itemMovedZeroArgumentFlag);
assertFalse(target.itemMovedSingleArgumentFlag);
assertFalse(target.listClearedZeroArgumentFlag);
assertFalse(target.listClearedSingleArgumentFlag);
assertFalse(target.listChangedZeroArgumentFlag);
assertFalse(target.listChangedSingleArgumentFlag);
}
public void testItemRemovedZeroArgumentNamedList() {
TestModel testModel = new TestModel();
String string = "foo";
testModel.addString(string);
Target target = new Target(testModel, TestModel.STRINGS_LIST, string, 0);
testModel.addListChangeListener(TestModel.STRINGS_LIST, this.buildZeroArgumentListener(target));
testModel.removeString(string);
assertFalse(target.itemAddedZeroArgumentFlag);
assertFalse(target.itemAddedSingleArgumentFlag);
assertTrue(target.itemRemovedZeroArgumentFlag);
assertFalse(target.itemRemovedSingleArgumentFlag);
assertFalse(target.itemReplacedZeroArgumentFlag);
assertFalse(target.itemReplacedSingleArgumentFlag);
assertFalse(target.itemMovedZeroArgumentFlag);
assertFalse(target.itemMovedSingleArgumentFlag);
assertFalse(target.listClearedZeroArgumentFlag);
assertFalse(target.listClearedSingleArgumentFlag);
assertFalse(target.listChangedZeroArgumentFlag);
assertFalse(target.listChangedSingleArgumentFlag);
}
public void testItemRemovedSingleArgumentNamedList() {
TestModel testModel = new TestModel();
String string = "foo";
testModel.addString(string);
Target target = new Target(testModel, TestModel.STRINGS_LIST, string, 0);
testModel.addListChangeListener(TestModel.STRINGS_LIST, this.buildSingleArgumentListener(target));
testModel.removeString(string);
assertFalse(target.itemAddedZeroArgumentFlag);
assertFalse(target.itemAddedSingleArgumentFlag);
assertFalse(target.itemRemovedZeroArgumentFlag);
assertTrue(target.itemRemovedSingleArgumentFlag);
assertFalse(target.itemReplacedZeroArgumentFlag);
assertFalse(target.itemReplacedSingleArgumentFlag);
assertFalse(target.itemMovedZeroArgumentFlag);
assertFalse(target.itemMovedSingleArgumentFlag);
assertFalse(target.listClearedZeroArgumentFlag);
assertFalse(target.listClearedSingleArgumentFlag);
assertFalse(target.listChangedZeroArgumentFlag);
assertFalse(target.listChangedSingleArgumentFlag);
}
public void testItemReplacedZeroArgumentNamedList() {
TestModel testModel = new TestModel();
String oldString = "foo";
String newString = "bar";
testModel.addString(oldString);
Target target = new Target(testModel, TestModel.STRINGS_LIST, newString, 0, oldString);
testModel.addListChangeListener(TestModel.STRINGS_LIST, this.buildZeroArgumentListener(target));
testModel.replaceString(oldString, newString);
assertFalse(target.itemAddedZeroArgumentFlag);
assertFalse(target.itemAddedSingleArgumentFlag);
assertFalse(target.itemRemovedZeroArgumentFlag);
assertFalse(target.itemRemovedSingleArgumentFlag);
assertTrue(target.itemReplacedZeroArgumentFlag);
assertFalse(target.itemReplacedSingleArgumentFlag);
assertFalse(target.itemMovedZeroArgumentFlag);
assertFalse(target.itemMovedSingleArgumentFlag);
assertFalse(target.listClearedZeroArgumentFlag);
assertFalse(target.listClearedSingleArgumentFlag);
assertFalse(target.listChangedZeroArgumentFlag);
assertFalse(target.listChangedSingleArgumentFlag);
}
public void testItemReplacedSingleArgumentNamedList() {
TestModel testModel = new TestModel();
String oldString = "foo";
String newString = "bar";
testModel.addString(oldString);
Target target = new Target(testModel, TestModel.STRINGS_LIST, newString, 0, oldString);
testModel.addListChangeListener(TestModel.STRINGS_LIST, this.buildSingleArgumentListener(target));
testModel.replaceString(oldString, newString);
assertFalse(target.itemAddedZeroArgumentFlag);
assertFalse(target.itemAddedSingleArgumentFlag);
assertFalse(target.itemRemovedZeroArgumentFlag);
assertFalse(target.itemRemovedSingleArgumentFlag);
assertFalse(target.itemReplacedZeroArgumentFlag);
assertTrue(target.itemReplacedSingleArgumentFlag);
assertFalse(target.itemMovedZeroArgumentFlag);
assertFalse(target.itemMovedSingleArgumentFlag);
assertFalse(target.listClearedZeroArgumentFlag);
assertFalse(target.listClearedSingleArgumentFlag);
assertFalse(target.listChangedZeroArgumentFlag);
assertFalse(target.listChangedSingleArgumentFlag);
}
public void testItemMovedZeroArgumentNamedList() {
TestModel testModel = new TestModel();
testModel.addString("zero");
testModel.addString("one");
testModel.addString("two");
testModel.addString("three");
Target target = new Target(testModel, TestModel.STRINGS_LIST, 0, 2);
testModel.addListChangeListener(TestModel.STRINGS_LIST, this.buildZeroArgumentListener(target));
testModel.moveString(0, 2);
assertFalse(target.itemAddedZeroArgumentFlag);
assertFalse(target.itemAddedSingleArgumentFlag);
assertFalse(target.itemRemovedZeroArgumentFlag);
assertFalse(target.itemRemovedSingleArgumentFlag);
assertFalse(target.itemReplacedZeroArgumentFlag);
assertFalse(target.itemReplacedSingleArgumentFlag);
assertTrue(target.itemMovedZeroArgumentFlag);
assertFalse(target.itemMovedSingleArgumentFlag);
assertFalse(target.listClearedZeroArgumentFlag);
assertFalse(target.listClearedSingleArgumentFlag);
assertFalse(target.listChangedZeroArgumentFlag);
assertFalse(target.listChangedSingleArgumentFlag);
}
public void testItemMovedSingleArgumentNamedList() {
TestModel testModel = new TestModel();
testModel.addString("zero");
testModel.addString("one");
testModel.addString("two");
testModel.addString("three");
Target target = new Target(testModel, TestModel.STRINGS_LIST, 0, 2);
testModel.addListChangeListener(TestModel.STRINGS_LIST, this.buildSingleArgumentListener(target));
testModel.moveString(0, 2);
assertFalse(target.itemAddedZeroArgumentFlag);
assertFalse(target.itemAddedSingleArgumentFlag);
assertFalse(target.itemRemovedZeroArgumentFlag);
assertFalse(target.itemRemovedSingleArgumentFlag);
assertFalse(target.itemReplacedZeroArgumentFlag);
assertFalse(target.itemReplacedSingleArgumentFlag);
assertFalse(target.itemMovedZeroArgumentFlag);
assertTrue(target.itemMovedSingleArgumentFlag);
assertFalse(target.listClearedZeroArgumentFlag);
assertFalse(target.listClearedSingleArgumentFlag);
assertFalse(target.listChangedZeroArgumentFlag);
assertFalse(target.listChangedSingleArgumentFlag);
}
public void testListClearedZeroArgumentNamedList() {
TestModel testModel = new TestModel();
String string = "foo";
testModel.addString(string);
Target target = new Target(testModel, TestModel.STRINGS_LIST, null, -1);
testModel.addListChangeListener(TestModel.STRINGS_LIST, this.buildZeroArgumentListener(target));
testModel.clearStrings();
assertFalse(target.itemAddedZeroArgumentFlag);
assertFalse(target.itemAddedSingleArgumentFlag);
assertFalse(target.itemRemovedZeroArgumentFlag);
assertFalse(target.itemRemovedSingleArgumentFlag);
assertFalse(target.itemReplacedZeroArgumentFlag);
assertFalse(target.itemReplacedSingleArgumentFlag);
assertFalse(target.itemMovedZeroArgumentFlag);
assertFalse(target.itemMovedSingleArgumentFlag);
assertTrue(target.listClearedZeroArgumentFlag);
assertFalse(target.listClearedSingleArgumentFlag);
assertFalse(target.listChangedZeroArgumentFlag);
assertFalse(target.listChangedSingleArgumentFlag);
}
public void testListClearedSingleArgumentNamedList() {
TestModel testModel = new TestModel();
String string = "foo";
testModel.addString(string);
Target target = new Target(testModel, TestModel.STRINGS_LIST, null, -1);
testModel.addListChangeListener(TestModel.STRINGS_LIST, this.buildSingleArgumentListener(target));
testModel.clearStrings();
assertFalse(target.itemAddedZeroArgumentFlag);
assertFalse(target.itemAddedSingleArgumentFlag);
assertFalse(target.itemRemovedZeroArgumentFlag);
assertFalse(target.itemRemovedSingleArgumentFlag);
assertFalse(target.itemReplacedZeroArgumentFlag);
assertFalse(target.itemReplacedSingleArgumentFlag);
assertFalse(target.itemMovedZeroArgumentFlag);
assertFalse(target.itemMovedSingleArgumentFlag);
assertFalse(target.listClearedZeroArgumentFlag);
assertTrue(target.listClearedSingleArgumentFlag);
assertFalse(target.listChangedZeroArgumentFlag);
assertFalse(target.listChangedSingleArgumentFlag);
}
public void testListChangedZeroArgumentNamedList() {
TestModel testModel = new TestModel();
String string = "foo";
testModel.addString(string);
Target target = new Target(testModel, TestModel.STRINGS_LIST, null, -1);
testModel.addListChangeListener(TestModel.STRINGS_LIST, this.buildZeroArgumentListener(target));
testModel.replaceAllStrings(new String[] {"bar", "baz"});
assertFalse(target.itemAddedZeroArgumentFlag);
assertFalse(target.itemAddedSingleArgumentFlag);
assertFalse(target.itemRemovedZeroArgumentFlag);
assertFalse(target.itemRemovedSingleArgumentFlag);
assertFalse(target.itemReplacedZeroArgumentFlag);
assertFalse(target.itemReplacedSingleArgumentFlag);
assertFalse(target.itemMovedZeroArgumentFlag);
assertFalse(target.itemMovedSingleArgumentFlag);
assertFalse(target.listClearedZeroArgumentFlag);
assertFalse(target.listClearedSingleArgumentFlag);
assertTrue(target.listChangedZeroArgumentFlag);
assertFalse(target.listChangedSingleArgumentFlag);
}
public void testListChangedSingleArgumentNamedList() {
TestModel testModel = new TestModel();
String string = "foo";
testModel.addString(string);
Target target = new Target(testModel, TestModel.STRINGS_LIST, null, -1);
testModel.addListChangeListener(TestModel.STRINGS_LIST, this.buildSingleArgumentListener(target));
testModel.replaceAllStrings(new String[] {"bar", "baz"});
assertFalse(target.itemAddedZeroArgumentFlag);
assertFalse(target.itemAddedSingleArgumentFlag);
assertFalse(target.itemRemovedZeroArgumentFlag);
assertFalse(target.itemRemovedSingleArgumentFlag);
assertFalse(target.itemReplacedZeroArgumentFlag);
assertFalse(target.itemReplacedSingleArgumentFlag);
assertFalse(target.itemMovedZeroArgumentFlag);
assertFalse(target.itemMovedSingleArgumentFlag);
assertFalse(target.listClearedZeroArgumentFlag);
assertFalse(target.listClearedSingleArgumentFlag);
assertFalse(target.listChangedZeroArgumentFlag);
assertTrue(target.listChangedSingleArgumentFlag);
}
public void testBogusDoubleArgument1() {
TestModel testModel = new TestModel();
String string = "foo";
Target target = new Target(testModel, TestModel.STRINGS_LIST, string, 0);
boolean exCaught = false;
try {
ListChangeListener listener = ReflectiveChangeListener.buildListChangeListener(target, "listChangedDoubleArgument");
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_LIST, string, 0);
Method method = ReflectionTools.getMethod(target, "listChangedDoubleArgument", new Class[] {ListChangeEvent.class, Object.class});
boolean exCaught = false;
try {
ListChangeListener listener = ReflectiveChangeListener.buildListChangeListener(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_LIST, string, 0);
// build a LIST change listener and hack it so we
// can add it as a COLLECTION change listener
Object listener = ReflectiveChangeListener.buildListChangeListener(target, "listEventSingleArgument");
testModel.addCollectionChangeListener("bogus collection", (CollectionChangeListener) listener);
boolean exCaught = false;
try {
testModel.changeCollection();
fail("listener mismatch: " + listener);
} catch (IllegalArgumentException ex) {
exCaught = true;
}
assertTrue(exCaught);
}
class TestModel extends AbstractModel {
private List<String> strings = new ArrayList<String>();
public static final String STRINGS_LIST = "strings";
TestModel() {
super();
}
ListIterator<String> strings() {
return new CloneListIterator<String>(this.strings);
}
void addString(String string) {
this.addItemToList(string, this.strings, STRINGS_LIST);
}
void removeString(String string) {
this.removeItemFromList(this.strings.indexOf(string), this.strings, STRINGS_LIST);
}
void replaceString(String oldString, String newString) {
this.setItemInList(this.strings.indexOf(oldString), newString, this.strings, STRINGS_LIST);
}
void moveString(int targetIndex, int sourceIndex) {
this.moveItemInList(targetIndex, sourceIndex, this.strings, STRINGS_LIST);
}
void clearStrings() {
this.clearList(this.strings, STRINGS_LIST);
}
void replaceAllStrings(String[] newStrings) {
this.strings.clear();
CollectionTools.addAll(this.strings, newStrings);
this.fireListChanged(STRINGS_LIST, this.strings);
}
void changeCollection() {
this.fireCollectionChanged("bogus collection", Collections.emptySet());
}
}
class Target {
TestModel testModel;
String listName;
String string;
int index;
String replacedString;
int sourceIndex;
boolean itemAddedZeroArgumentFlag = false;
boolean itemAddedSingleArgumentFlag = false;
boolean itemRemovedZeroArgumentFlag = false;
boolean itemRemovedSingleArgumentFlag = false;
boolean itemReplacedZeroArgumentFlag = false;
boolean itemReplacedSingleArgumentFlag = false;
boolean itemMovedZeroArgumentFlag = false;
boolean itemMovedSingleArgumentFlag = false;
boolean listClearedZeroArgumentFlag = false;
boolean listClearedSingleArgumentFlag = false;
boolean listChangedZeroArgumentFlag = false;
boolean listChangedSingleArgumentFlag = false;
boolean listEventSingleArgumentFlag = false;
Target(TestModel testModel, String listName, String string, int index) {
super();
this.testModel = testModel;
this.listName = listName;
this.string = string;
this.index = index;
}
Target(TestModel testModel, String listName, String string, int index, String replacedString) {
this(testModel, listName, string, index);
this.replacedString = replacedString;
}
Target(TestModel testModel, String listName, int targetIndex, int sourceIndex) {
super();
this.testModel = testModel;
this.listName = listName;
this.index = targetIndex;
this.sourceIndex = sourceIndex;
}
void itemAddedZeroArgument() {
this.itemAddedZeroArgumentFlag = true;
}
void itemAddedSingleArgument(ListAddEvent e) {
this.itemAddedSingleArgumentFlag = true;
assertSame(this.testModel, e.getSource());
assertEquals(this.listName, e.getListName());
assertEquals(this.string, e.getItems().iterator().next());
assertEquals(this.index, e.getIndex());
}
void itemRemovedZeroArgument() {
this.itemRemovedZeroArgumentFlag = true;
}
void itemRemovedSingleArgument(ListRemoveEvent e) {
this.itemRemovedSingleArgumentFlag = true;
assertSame(this.testModel, e.getSource());
assertEquals(this.listName, e.getListName());
assertEquals(this.string, e.getItems().iterator().next());
assertEquals(this.index, e.getIndex());
}
void itemReplacedZeroArgument() {
this.itemReplacedZeroArgumentFlag = true;
}
void itemReplacedSingleArgument(ListReplaceEvent e) {
this.itemReplacedSingleArgumentFlag = true;
assertSame(this.testModel, e.getSource());
assertEquals(this.listName, e.getListName());
assertEquals(this.string, e.getNewItems().iterator().next());
assertEquals(this.replacedString, e.getOldItems().iterator().next());
assertEquals(this.index, e.getIndex());
}
void itemMovedZeroArgument() {
this.itemMovedZeroArgumentFlag = true;
}
void itemMovedSingleArgument(ListMoveEvent e) {
this.itemMovedSingleArgumentFlag = true;
assertSame(this.testModel, e.getSource());
assertEquals(this.listName, e.getListName());
assertEquals(this.index, e.getTargetIndex());
assertEquals(this.sourceIndex, e.getSourceIndex());
}
void listChangedZeroArgument() {
this.listChangedZeroArgumentFlag = true;
}
void listClearedSingleArgument(ListClearEvent e) {
this.listClearedSingleArgumentFlag = true;
assertSame(this.testModel, e.getSource());
assertEquals(this.listName, e.getListName());
}
void listClearedZeroArgument() {
this.listClearedZeroArgumentFlag = true;
}
void listChangedSingleArgument(ListChangeEvent e) {
this.listChangedSingleArgumentFlag = true;
assertSame(this.testModel, e.getSource());
assertEquals(this.listName, e.getListName());
}
void listChangedDoubleArgument(ListChangeEvent e, Object o) {
fail("bogus event: " + e + " - object: " + o);
}
void listEventSingleArgument(ListEvent e) {
this.listEventSingleArgumentFlag = true;
assertSame(this.testModel, e.getSource());
assertEquals(this.listName, e.getListName());
}
}
}