/*******************************************************************************
 * 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;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.EventListener;
import java.util.HashSet;
import java.util.List;

import junit.framework.TestCase;

import org.eclipse.jpt.common.utility.internal.ArrayTools;
import org.eclipse.jpt.common.utility.internal.CollectionTools;
import org.eclipse.jpt.common.utility.internal.ListenerList;
import org.eclipse.jpt.common.utility.internal.ReflectionTools;
import org.eclipse.jpt.common.utility.internal.Tools;
import org.eclipse.jpt.common.utility.internal.model.AbstractModel;
import org.eclipse.jpt.common.utility.internal.model.ChangeSupport;
import org.eclipse.jpt.common.utility.model.event.CollectionAddEvent;
import org.eclipse.jpt.common.utility.model.event.CollectionChangeEvent;
import org.eclipse.jpt.common.utility.model.event.CollectionClearEvent;
import org.eclipse.jpt.common.utility.model.event.CollectionEvent;
import org.eclipse.jpt.common.utility.model.event.CollectionRemoveEvent;
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.event.PropertyChangeEvent;
import org.eclipse.jpt.common.utility.model.event.StateChangeEvent;
import org.eclipse.jpt.common.utility.model.event.TreeAddEvent;
import org.eclipse.jpt.common.utility.model.event.TreeChangeEvent;
import org.eclipse.jpt.common.utility.model.event.TreeClearEvent;
import org.eclipse.jpt.common.utility.model.event.TreeEvent;
import org.eclipse.jpt.common.utility.model.event.TreeRemoveEvent;
import org.eclipse.jpt.common.utility.model.listener.ChangeAdapter;
import org.eclipse.jpt.common.utility.model.listener.ChangeListener;
import org.eclipse.jpt.common.utility.model.listener.CollectionChangeAdapter;
import org.eclipse.jpt.common.utility.model.listener.ListChangeAdapter;
import org.eclipse.jpt.common.utility.model.listener.ListChangeListener;
import org.eclipse.jpt.common.utility.model.listener.PropertyChangeAdapter;
import org.eclipse.jpt.common.utility.model.listener.StateChangeAdapter;
import org.eclipse.jpt.common.utility.model.listener.StateChangeListener;
import org.eclipse.jpt.common.utility.model.listener.TreeChangeAdapter;
import org.eclipse.jpt.common.utility.tests.internal.TestTools;

@SuppressWarnings("nls")
public class ChangeSupportTests
	extends TestCase
{
	TestModel testModel;
	static final String TEST_TO_STRING = "this is a test";

	ChangeListener changeListener = new Adapter();

	StateChangeEvent stateChangeEvent;
	boolean stateChangedCalled = false;

	PropertyChangeEvent propertyChangeEvent;
	boolean propertyChangeCalled = false;
	static final String PROPERTY_NAME = "propertyName";
	static final Object OLD_OBJECT_VALUE = new Object();
	static final Object NEW_OBJECT_VALUE = new Object();
	static final Integer OLD_INT_VALUE = new Integer(27);
	static final Boolean OLD_BOOLEAN_VALUE = Boolean.TRUE;
	static final Integer NEW_INT_VALUE = new Integer(42);
	static final Boolean NEW_BOOLEAN_VALUE = Boolean.FALSE;

	CollectionEvent collectionEvent;
	boolean itemsAddedCollectionCalled = false;
	boolean itemsRemovedCollectionCalled = false;
	boolean collectionChangedCalled = false;
	boolean collectionClearedCalled = false;
	static final String COLLECTION_NAME = "collectionName";
	static final Object ADDED_OBJECT_VALUE = new Object();
	static final Object ADDED_OBJECT_VALUE_2 = new Object();
	static final Object REMOVED_OBJECT_VALUE = new Object();
	static final int TARGET_INDEX = 7;
	static final int SOURCE_INDEX = 22;

	ListEvent listEvent;
	boolean itemsAddedListCalled = false;
	boolean itemsRemovedListCalled = false;
	boolean itemsReplacedListCalled = false;
	boolean itemsMovedListCalled = false;
	boolean listChangedCalled = false;
	boolean listClearedCalled = false;
	static final String LIST_NAME = "listName";
	static final int ADD_INDEX = 3;
	static final int REMOVE_INDEX = 5;
	static final int REPLACE_INDEX = 2;

	TreeEvent treeEvent;
	boolean nodeAddedCalled = false;
	boolean nodeRemovedCalled = false;
	boolean treeChangedCalled = false;
	boolean treeClearedCalled = false;
	static final String TREE_NAME = "treeName";
	static final List<Object> OBJECT_PATH = Arrays.asList(new Object[] {new Object(), new Object(), new String()});


	public ChangeSupportTests(String name) {
		super(name);
	}

	@Override
	protected void setUp() throws Exception {
		super.setUp();
		this.testModel = new TestModel();
	}

	@Override
	protected void tearDown() throws Exception {
		TestTools.clear(this);
		super.tearDown();
	}


	// ********** general tests **********

	public void testNullSource() {
		boolean exCaught = false;
		try {
			ChangeSupport cs = new ChangeSupport(null);
			fail("bogus change support: " + cs);
		} catch (NullPointerException ex) {
			exCaught = true;
		}
		assertTrue(exCaught);
	}

	// ********** state change tests **********

	public void testFireStateChange() {
		this.stateChangeEvent = null;
		this.stateChangedCalled = false;
		this.testModel.addChangeListener(this.changeListener);
		this.testModel.testFireStateChange();
		assertNotNull(this.stateChangeEvent);
		assertEquals(this.testModel, this.stateChangeEvent.getSource());
		assertTrue(this.stateChangedCalled);
	}

	public void testHasAnyStateChangeListeners() {
		assertTrue(this.testModel.hasNoStateChangeListeners());
		this.testModel.addChangeListener(this.changeListener);
		assertTrue(this.testModel.hasAnyStateChangeListeners());
		this.testModel.removeChangeListener(this.changeListener);
		assertTrue(this.testModel.hasNoStateChangeListeners());
	}

	public void testHasAnyStateChangeListenersDuplicate() {
		assertTrue(this.testModel.hasNoStateChangeListeners());
		this.testModel.addChangeListener(this.changeListener);
		boolean exCaught = false;
		try {
			this.testModel.addChangeListener(this.changeListener);
		} catch (IllegalArgumentException ex) {
			exCaught = true;
		}
		assertTrue(exCaught);
		assertTrue(this.testModel.hasAnyStateChangeListeners());
		this.testModel.removeChangeListener(this.changeListener);
		assertTrue(this.testModel.hasNoStateChangeListeners());

		exCaught = false;
		try {
			this.testModel.removeChangeListener(this.changeListener);
		} catch (IllegalArgumentException ex) {
			exCaught = true;
		}
		assertTrue(this.testModel.hasNoStateChangeListeners());
	}

	public void testAddNullStateListener() {
		boolean exCaught = false;
		try {
			this.testModel.addStateChangeListener(null);
		} catch (NullPointerException ex) {
			exCaught = true;
		}
		assertTrue(exCaught);
	}

	public void testRemoveBogusStateListener() {
		boolean exCaught = false;
		try {
			this.testModel.removeChangeListener(this.changeListener);
		} catch (IllegalArgumentException ex) {
			exCaught = true;
		}
		assertTrue(exCaught);

		this.testModel.addPropertyChangeListener("foo", this.changeListener);
		exCaught = false;
		try {
			this.testModel.removeChangeListener(this.changeListener);
		} catch (IllegalArgumentException ex) {
			exCaught = true;
		}
		assertTrue(exCaught);

		this.testModel.addChangeListener(this.changeListener);
		exCaught = false;
		try {
			this.testModel.removeStateChangeListener(new Adapter());
		} catch (IllegalArgumentException ex) {
			exCaught = true;
		}
		assertTrue(exCaught);

		exCaught = false;
		try {
			this.testModel.removeStateChangeListener(new StateChangeAdapter());
		} catch (IllegalArgumentException ex) {
			exCaught = true;
		}
		assertTrue(exCaught);
	}


	// ********** property change tests **********

	public void testFirePropertyChangedEvent() {
		this.propertyChangeEvent = null;
		this.propertyChangeCalled = false;
		this.testModel.addChangeListener(this.changeListener);
		this.testModel.testFirePropertyChangedEvent();
		this.verifyPropertyChangeEvent(OLD_OBJECT_VALUE, NEW_OBJECT_VALUE);
		assertTrue(this.propertyChangeCalled);

		this.propertyChangeEvent = null;
		this.propertyChangeCalled = false;
		this.testModel.removeChangeListener(this.changeListener);
		this.testModel.testFirePropertyChangedEvent();
		assertNull(this.propertyChangeEvent);
		assertFalse(this.propertyChangeCalled);

		this.propertyChangeEvent = null;
		this.propertyChangeCalled = false;
		this.testModel.addPropertyChangeListener(PROPERTY_NAME, this.changeListener);
		this.testModel.testFirePropertyChangedEvent();
		this.verifyPropertyChangeEvent(OLD_OBJECT_VALUE, NEW_OBJECT_VALUE);
		assertTrue(this.propertyChangeCalled);

		this.propertyChangeEvent = null;
		this.propertyChangeCalled = false;
		this.testModel.removePropertyChangeListener(PROPERTY_NAME, this.changeListener);
		this.testModel.testFirePropertyChangedEvent();
		assertNull(this.propertyChangeEvent);
		assertFalse(this.propertyChangeCalled);
	}

	public void testFirePropertyChangedEventNoChange() {
		this.propertyChangeEvent = null;
		this.propertyChangeCalled = false;
		this.testModel.addChangeListener(this.changeListener);
		this.testModel.testFirePropertyChangedEventNoChange();
		assertNull(this.propertyChangeEvent);
		assertFalse(this.propertyChangeCalled);

		this.propertyChangeEvent = null;
		this.propertyChangeCalled = false;
		this.testModel.removeChangeListener(this.changeListener);
		this.testModel.testFirePropertyChangedEventNoChange();
		assertNull(this.propertyChangeEvent);
		assertFalse(this.propertyChangeCalled);

		this.propertyChangeEvent = null;
		this.propertyChangeCalled = false;
		this.testModel.addPropertyChangeListener(PROPERTY_NAME, this.changeListener);
		this.testModel.testFirePropertyChangedEventNoChange();
		assertNull(this.propertyChangeEvent);
		assertFalse(this.propertyChangeCalled);

		this.propertyChangeEvent = null;
		this.propertyChangeCalled = false;
		this.testModel.removePropertyChangeListener(PROPERTY_NAME, this.changeListener);
		this.testModel.testFirePropertyChangedEventNoChange();
		assertNull(this.propertyChangeEvent);
		assertFalse(this.propertyChangeCalled);
	}

	public void testFirePropertyChangedObjectObject() {
		this.propertyChangeEvent = null;
		this.propertyChangeCalled = false;
		this.testModel.addChangeListener(this.changeListener);
		this.testModel.testFirePropertyChangedObjectObject();
		this.verifyPropertyChangeEvent(OLD_OBJECT_VALUE, NEW_OBJECT_VALUE);
		assertTrue(this.propertyChangeCalled);

		this.propertyChangeEvent = null;
		this.propertyChangeCalled = false;
		this.testModel.removeChangeListener(this.changeListener);
		this.testModel.testFirePropertyChangedObjectObject();
		assertNull(this.propertyChangeEvent);
		assertFalse(this.propertyChangeCalled);

		this.propertyChangeEvent = null;
		this.propertyChangeCalled = false;
		this.testModel.addPropertyChangeListener(PROPERTY_NAME, this.changeListener);
		this.testModel.testFirePropertyChangedObjectObject();
		this.verifyPropertyChangeEvent(OLD_OBJECT_VALUE, NEW_OBJECT_VALUE);
		assertTrue(this.propertyChangeCalled);

		this.propertyChangeEvent = null;
		this.propertyChangeCalled = false;
		this.testModel.removePropertyChangeListener(PROPERTY_NAME, this.changeListener);
		this.testModel.testFirePropertyChangedObjectObject();
		assertNull(this.propertyChangeEvent);
		assertFalse(this.propertyChangeCalled);
	}

	public void testFirePropertyChangedObjectObjectNoChange() {
		this.propertyChangeEvent = null;
		this.propertyChangeCalled = false;
		this.testModel.addChangeListener(this.changeListener);
		this.testModel.testFirePropertyChangedObjectObjectNoChange();
		assertNull(this.propertyChangeEvent);
		assertFalse(this.propertyChangeCalled);

		this.propertyChangeEvent = null;
		this.propertyChangeCalled = false;
		this.testModel.removeChangeListener(this.changeListener);
		this.testModel.testFirePropertyChangedObjectObjectNoChange();
		assertNull(this.propertyChangeEvent);
		assertFalse(this.propertyChangeCalled);

		this.propertyChangeEvent = null;
		this.propertyChangeCalled = false;
		this.testModel.addPropertyChangeListener(PROPERTY_NAME, this.changeListener);
		this.testModel.testFirePropertyChangedObjectObjectNoChange();
		assertNull(this.propertyChangeEvent);
		assertFalse(this.propertyChangeCalled);

		this.propertyChangeEvent = null;
		this.propertyChangeCalled = false;
		this.testModel.removePropertyChangeListener(PROPERTY_NAME, this.changeListener);
		this.testModel.testFirePropertyChangedObjectObjectNoChange();
		assertNull(this.propertyChangeEvent);
		assertFalse(this.propertyChangeCalled);
	}

	public void testFirePropertyChangedObject() {
		this.propertyChangeEvent = null;
		this.propertyChangeCalled = false;
		this.testModel.addChangeListener(this.changeListener);
		this.testModel.testFirePropertyChangedObject();
		this.verifyPropertyChangeEvent(null, NEW_OBJECT_VALUE);
		assertTrue(this.propertyChangeCalled);

		this.propertyChangeEvent = null;
		this.propertyChangeCalled = false;
		this.testModel.removeChangeListener(this.changeListener);
		this.testModel.testFirePropertyChangedObject();
		assertNull(this.propertyChangeEvent);
		assertFalse(this.propertyChangeCalled);

		this.propertyChangeEvent = null;
		this.propertyChangeCalled = false;
		this.testModel.addPropertyChangeListener(PROPERTY_NAME, this.changeListener);
		this.testModel.testFirePropertyChangedObject();
		this.verifyPropertyChangeEvent(null, NEW_OBJECT_VALUE);
		assertTrue(this.propertyChangeCalled);

		this.propertyChangeEvent = null;
		this.propertyChangeCalled = false;
		this.testModel.removePropertyChangeListener(PROPERTY_NAME, this.changeListener);
		this.testModel.testFirePropertyChangedObject();
		assertNull(this.propertyChangeEvent);
		assertFalse(this.propertyChangeCalled);
	}

	public void testFirePropertyChangedObjectNoChange() {
		this.propertyChangeEvent = null;
		this.propertyChangeCalled = false;
		this.testModel.addChangeListener(this.changeListener);
		this.testModel.testFirePropertyChangedObjectNoChange();
		assertNull(this.propertyChangeEvent);
		assertFalse(this.propertyChangeCalled);

		this.propertyChangeEvent = null;
		this.propertyChangeCalled = false;
		this.testModel.removeChangeListener(this.changeListener);
		this.testModel.testFirePropertyChangedObjectNoChange();
		assertNull(this.propertyChangeEvent);
		assertFalse(this.propertyChangeCalled);

		this.propertyChangeEvent = null;
		this.propertyChangeCalled = false;
		this.testModel.addPropertyChangeListener(PROPERTY_NAME, this.changeListener);
		this.testModel.testFirePropertyChangedObjectNoChange();
		assertNull(this.propertyChangeEvent);
		assertFalse(this.propertyChangeCalled);

		this.propertyChangeEvent = null;
		this.propertyChangeCalled = false;
		this.testModel.removePropertyChangeListener(PROPERTY_NAME, this.changeListener);
		this.testModel.testFirePropertyChangedObjectNoChange();
		assertNull(this.propertyChangeEvent);
		assertFalse(this.propertyChangeCalled);
	}

	public void testFirePropertyChangedIntInt() {
		this.propertyChangeEvent = null;
		this.propertyChangeCalled = false;
		this.testModel.addChangeListener(this.changeListener);
		this.testModel.testFirePropertyChangedIntInt();
		this.verifyPropertyChangeEvent(OLD_INT_VALUE, NEW_INT_VALUE);
		assertTrue(this.propertyChangeCalled);

		this.propertyChangeEvent = null;
		this.propertyChangeCalled = false;
		this.testModel.removeChangeListener(this.changeListener);
		this.testModel.testFirePropertyChangedIntInt();
		assertNull(this.propertyChangeEvent);
		assertFalse(this.propertyChangeCalled);

		this.propertyChangeEvent = null;
		this.propertyChangeCalled = false;
		this.testModel.addPropertyChangeListener(PROPERTY_NAME, this.changeListener);
		this.testModel.testFirePropertyChangedIntInt();
		this.verifyPropertyChangeEvent(OLD_INT_VALUE, NEW_INT_VALUE);
		assertTrue(this.propertyChangeCalled);

		this.propertyChangeEvent = null;
		this.propertyChangeCalled = false;
		this.testModel.removePropertyChangeListener(PROPERTY_NAME, this.changeListener);
		this.testModel.testFirePropertyChangedIntInt();
		assertNull(this.propertyChangeEvent);
		assertFalse(this.propertyChangeCalled);
	}

	public void testFirePropertyChangedIntIntNoChange() {
		this.propertyChangeEvent = null;
		this.propertyChangeCalled = false;
		this.testModel.addChangeListener(this.changeListener);
		this.testModel.testFirePropertyChangedIntIntNoChange();
		assertNull(this.propertyChangeEvent);
		assertFalse(this.propertyChangeCalled);

		this.propertyChangeEvent = null;
		this.propertyChangeCalled = false;
		this.testModel.removeChangeListener(this.changeListener);
		this.testModel.testFirePropertyChangedIntIntNoChange();
		assertNull(this.propertyChangeEvent);
		assertFalse(this.propertyChangeCalled);

		this.propertyChangeEvent = null;
		this.propertyChangeCalled = false;
		this.testModel.addPropertyChangeListener(PROPERTY_NAME, this.changeListener);
		this.testModel.testFirePropertyChangedIntIntNoChange();
		assertNull(this.propertyChangeEvent);
		assertFalse(this.propertyChangeCalled);

		this.propertyChangeEvent = null;
		this.propertyChangeCalled = false;
		this.testModel.removePropertyChangeListener(PROPERTY_NAME, this.changeListener);
		this.testModel.testFirePropertyChangedIntIntNoChange();
		assertNull(this.propertyChangeEvent);
		assertFalse(this.propertyChangeCalled);
	}

	public void testFirePropertyChangedBooleanBoolean() {
		this.propertyChangeEvent = null;
		this.propertyChangeCalled = false;
		this.testModel.addChangeListener(this.changeListener);
		this.testModel.testFirePropertyChangedBooleanBoolean();
		this.verifyPropertyChangeEvent(OLD_BOOLEAN_VALUE, NEW_BOOLEAN_VALUE);
		assertTrue(this.propertyChangeCalled);

		this.propertyChangeEvent = null;
		this.propertyChangeCalled = false;
		this.testModel.removeChangeListener(this.changeListener);
		this.testModel.testFirePropertyChangedBooleanBoolean();
		assertNull(this.propertyChangeEvent);
		assertFalse(this.propertyChangeCalled);

		this.propertyChangeEvent = null;
		this.propertyChangeCalled = false;
		this.testModel.addPropertyChangeListener(PROPERTY_NAME, this.changeListener);
		this.testModel.testFirePropertyChangedBooleanBoolean();
		this.verifyPropertyChangeEvent(OLD_BOOLEAN_VALUE, NEW_BOOLEAN_VALUE);
		assertTrue(this.propertyChangeCalled);

		this.propertyChangeEvent = null;
		this.propertyChangeCalled = false;
		this.testModel.removePropertyChangeListener(PROPERTY_NAME, this.changeListener);
		this.testModel.testFirePropertyChangedBooleanBoolean();
		assertNull(this.propertyChangeEvent);
		assertFalse(this.propertyChangeCalled);
	}

	public void testFirePropertyChangedBooleanBooleanNoChange() {
		this.propertyChangeEvent = null;
		this.propertyChangeCalled = false;
		this.testModel.addChangeListener(this.changeListener);
		this.testModel.testFirePropertyChangedBooleanBooleanNoChange();
		assertNull(this.propertyChangeEvent);
		assertFalse(this.propertyChangeCalled);

		this.propertyChangeEvent = null;
		this.propertyChangeCalled = false;
		this.testModel.removeChangeListener(this.changeListener);
		this.testModel.testFirePropertyChangedBooleanBooleanNoChange();
		assertNull(this.propertyChangeEvent);
		assertFalse(this.propertyChangeCalled);

		this.propertyChangeEvent = null;
		this.propertyChangeCalled = false;
		this.testModel.addPropertyChangeListener(PROPERTY_NAME, this.changeListener);
		this.testModel.testFirePropertyChangedBooleanBooleanNoChange();
		assertNull(this.propertyChangeEvent);
		assertFalse(this.propertyChangeCalled);

		this.propertyChangeEvent = null;
		this.propertyChangeCalled = false;
		this.testModel.removePropertyChangeListener(PROPERTY_NAME, this.changeListener);
		this.testModel.testFirePropertyChangedBooleanBooleanNoChange();
		assertNull(this.propertyChangeEvent);
		assertFalse(this.propertyChangeCalled);
	}

	public void testHasAnyPropertyChangeListeners() {
		assertTrue(this.testModel.hasNoPropertyChangeListeners(PROPERTY_NAME));
		this.testModel.addChangeListener(this.changeListener);
		assertTrue(this.testModel.hasAnyPropertyChangeListeners(PROPERTY_NAME));
		this.testModel.removeChangeListener(this.changeListener);
		assertTrue(this.testModel.hasNoPropertyChangeListeners(PROPERTY_NAME));

		assertTrue(this.testModel.hasNoPropertyChangeListeners(PROPERTY_NAME));
		this.testModel.addPropertyChangeListener(PROPERTY_NAME, this.changeListener);
		assertTrue(this.testModel.hasAnyPropertyChangeListeners(PROPERTY_NAME));
		this.testModel.removePropertyChangeListener(PROPERTY_NAME, this.changeListener);
		assertTrue(this.testModel.hasNoPropertyChangeListeners(PROPERTY_NAME));
	}

	public void testAddNullPropertyListener() {
		boolean exCaught = false;
		try {
			this.testModel.addChangeListener(null);
		} catch (NullPointerException ex) {
			exCaught = true;
		}
		assertTrue(exCaught);
	}

	public void testAddNullPropertyListenerName() {
		boolean exCaught = false;
		try {
			this.testModel.addPropertyChangeListener("foo", null);
		} catch (NullPointerException ex) {
			exCaught = true;
		}
		assertTrue(exCaught);
	}

	public void testRemoveBogusPropertyListener() {
		boolean exCaught = false;
		try {
			this.testModel.removePropertyChangeListener("foo", new PropertyChangeAdapter());
		} catch (IllegalArgumentException ex) {
			exCaught = true;
		}
		assertTrue(exCaught);

		this.testModel.addCollectionChangeListener("foo", this.changeListener);
		exCaught = false;
		try {
			this.testModel.removePropertyChangeListener("foo", this.changeListener);
		} catch (IllegalArgumentException ex) {
			exCaught = true;
		}
		assertTrue(exCaught);

		this.testModel.addPropertyChangeListener("foo", this.changeListener);
		exCaught = false;
		try {
			this.testModel.removePropertyChangeListener("foo", new PropertyChangeAdapter());
		} catch (IllegalArgumentException ex) {
			exCaught = true;
		}
		assertTrue(exCaught);

		exCaught = false;
		try {
			this.testModel.removePropertyChangeListener("foo", new PropertyChangeAdapter());
		} catch (IllegalArgumentException ex) {
			exCaught = true;
		}
		assertTrue(exCaught);
	}

	private void verifyPropertyChangeEvent(Object oldValue, Object newValue) {
		this.verifyPropertyChangeEvent(this.testModel, oldValue, newValue);
	}

	private void verifyPropertyChangeEvent(Object source, Object oldValue, Object newValue) {
		assertNotNull(this.propertyChangeEvent);
		assertEquals(source, this.propertyChangeEvent.getSource());
		assertEquals(PROPERTY_NAME, this.propertyChangeEvent.getPropertyName());
		assertEquals(oldValue, this.propertyChangeEvent.getOldValue());
		assertEquals(newValue, this.propertyChangeEvent.getNewValue());
	}


	// ********** collection change tests **********

	public void testFireItemsAddedCollectionEvent() {
		this.collectionEvent = null;
		this.itemsAddedCollectionCalled = false;
		this.testModel.addChangeListener(this.changeListener);
		this.testModel.testFireItemsAddedCollectionEvent();
		this.verifyCollectionEvent(ADDED_OBJECT_VALUE);
		assertTrue(this.itemsAddedCollectionCalled);

		this.collectionEvent = null;
		this.itemsAddedCollectionCalled = false;
		this.testModel.removeChangeListener(this.changeListener);
		this.testModel.testFireItemsAddedCollectionEvent();
		assertNull(this.collectionEvent);
		assertFalse(this.itemsAddedCollectionCalled);

		this.collectionEvent = null;
		this.itemsAddedCollectionCalled = false;
		this.testModel.addCollectionChangeListener(COLLECTION_NAME, this.changeListener);
		this.testModel.testFireItemsAddedCollectionEvent();
		this.verifyCollectionEvent(ADDED_OBJECT_VALUE);
		assertTrue(this.itemsAddedCollectionCalled);

		this.collectionEvent = null;
		this.itemsAddedCollectionCalled = false;
		this.testModel.removeCollectionChangeListener(COLLECTION_NAME, this.changeListener);
		this.testModel.testFireItemsAddedCollectionEvent();
		assertNull(this.collectionEvent);
		assertFalse(this.itemsAddedCollectionCalled);
	}

	public void testFireItemsAddedCollectionEventNoChange() {
		this.collectionEvent = null;
		this.itemsAddedCollectionCalled = false;
		this.testModel.addChangeListener(this.changeListener);
		this.testModel.testFireItemsAddedCollectionEventNoChange();
		assertNull(this.collectionEvent);
		assertFalse(this.itemsAddedCollectionCalled);

		this.collectionEvent = null;
		this.itemsAddedCollectionCalled = false;
		this.testModel.removeChangeListener(this.changeListener);
		this.testModel.testFireItemsAddedCollectionEventNoChange();
		assertNull(this.collectionEvent);
		assertFalse(this.itemsAddedCollectionCalled);

		this.collectionEvent = null;
		this.itemsAddedCollectionCalled = false;
		this.testModel.addCollectionChangeListener(COLLECTION_NAME, this.changeListener);
		this.testModel.testFireItemsAddedCollectionEventNoChange();
		assertNull(this.collectionEvent);
		assertFalse(this.itemsAddedCollectionCalled);

		this.collectionEvent = null;
		this.itemsAddedCollectionCalled = false;
		this.testModel.removeCollectionChangeListener(COLLECTION_NAME, this.changeListener);
		this.testModel.testFireItemsAddedCollectionEventNoChange();
		assertNull(this.collectionEvent);
		assertFalse(this.itemsAddedCollectionCalled);
	}

	public void testFireItemsAddedCollection() {
		this.collectionEvent = null;
		this.itemsAddedCollectionCalled = false;
		this.testModel.addChangeListener(this.changeListener);
		this.testModel.testFireItemsAddedCollection();
		this.verifyCollectionEvent(ADDED_OBJECT_VALUE);
		assertTrue(this.itemsAddedCollectionCalled);

		this.collectionEvent = null;
		this.itemsAddedCollectionCalled = false;
		this.testModel.removeChangeListener(this.changeListener);
		this.testModel.testFireItemsAddedCollection();
		assertNull(this.collectionEvent);
		assertFalse(this.itemsAddedCollectionCalled);

		this.collectionEvent = null;
		this.itemsAddedCollectionCalled = false;
		this.testModel.addCollectionChangeListener(COLLECTION_NAME, this.changeListener);
		this.testModel.testFireItemsAddedCollection();
		this.verifyCollectionEvent(ADDED_OBJECT_VALUE);
		assertTrue(this.itemsAddedCollectionCalled);

		this.collectionEvent = null;
		this.itemsAddedCollectionCalled = false;
		this.testModel.removeCollectionChangeListener(COLLECTION_NAME, this.changeListener);
		this.testModel.testFireItemsAddedCollection();
		assertNull(this.collectionEvent);
		assertFalse(this.itemsAddedCollectionCalled);
	}

	public void testFireItemsAddedCollectionNoChange() {
		this.collectionEvent = null;
		this.itemsAddedCollectionCalled = false;
		this.testModel.addChangeListener(this.changeListener);
		this.testModel.testFireItemsAddedCollectionNoChange();
		assertNull(this.collectionEvent);
		assertFalse(this.itemsAddedCollectionCalled);

		this.collectionEvent = null;
		this.itemsAddedCollectionCalled = false;
		this.testModel.removeChangeListener(this.changeListener);
		this.testModel.testFireItemsAddedCollectionNoChange();
		assertNull(this.collectionEvent);
		assertFalse(this.itemsAddedCollectionCalled);

		this.collectionEvent = null;
		this.itemsAddedCollectionCalled = false;
		this.testModel.addCollectionChangeListener(COLLECTION_NAME, this.changeListener);
		this.testModel.testFireItemsAddedCollectionNoChange();
		assertNull(this.collectionEvent);
		assertFalse(this.itemsAddedCollectionCalled);

		this.collectionEvent = null;
		this.itemsAddedCollectionCalled = false;
		this.testModel.removeCollectionChangeListener(COLLECTION_NAME, this.changeListener);
		this.testModel.testFireItemsAddedCollectionNoChange();
		assertNull(this.collectionEvent);
		assertFalse(this.itemsAddedCollectionCalled);
	}

	public void testFireItemAddedCollection() {
		this.collectionEvent = null;
		this.itemsAddedCollectionCalled = false;
		this.testModel.addChangeListener(this.changeListener);
		this.testModel.testFireItemAddedCollection();
		this.verifyCollectionEvent(ADDED_OBJECT_VALUE);
		assertTrue(this.itemsAddedCollectionCalled);

		this.collectionEvent = null;
		this.itemsAddedCollectionCalled = false;
		this.testModel.removeChangeListener(this.changeListener);
		this.testModel.testFireItemAddedCollection();
		assertNull(this.collectionEvent);
		assertFalse(this.itemsAddedCollectionCalled);

		this.collectionEvent = null;
		this.itemsAddedCollectionCalled = false;
		this.testModel.addCollectionChangeListener(COLLECTION_NAME, this.changeListener);
		this.testModel.testFireItemAddedCollection();
		this.verifyCollectionEvent(ADDED_OBJECT_VALUE);
		assertTrue(this.itemsAddedCollectionCalled);

		this.collectionEvent = null;
		this.itemsAddedCollectionCalled = false;
		this.testModel.removeCollectionChangeListener(COLLECTION_NAME, this.changeListener);
		this.testModel.testFireItemAddedCollection();
		assertNull(this.collectionEvent);
		assertFalse(this.itemsAddedCollectionCalled);
	}

	public void testFireItemsRemovedCollectionEvent() {
		this.collectionEvent = null;
		this.itemsRemovedCollectionCalled = false;
		this.testModel.addChangeListener(this.changeListener);
		this.testModel.testFireItemsRemovedCollectionEvent();
		this.verifyCollectionEvent(REMOVED_OBJECT_VALUE);
		assertTrue(this.itemsRemovedCollectionCalled);

		this.collectionEvent = null;
		this.itemsRemovedCollectionCalled = false;
		this.testModel.removeChangeListener(this.changeListener);
		this.testModel.testFireItemsRemovedCollectionEvent();
		assertNull(this.collectionEvent);
		assertFalse(this.itemsRemovedCollectionCalled);

		this.collectionEvent = null;
		this.itemsRemovedCollectionCalled = false;
		this.testModel.addCollectionChangeListener(COLLECTION_NAME, this.changeListener);
		this.testModel.testFireItemsRemovedCollectionEvent();
		this.verifyCollectionEvent(REMOVED_OBJECT_VALUE);
		assertTrue(this.itemsRemovedCollectionCalled);

		this.collectionEvent = null;
		this.itemsRemovedCollectionCalled = false;
		this.testModel.removeCollectionChangeListener(COLLECTION_NAME, this.changeListener);
		this.testModel.testFireItemsRemovedCollectionEvent();
		assertNull(this.collectionEvent);
		assertFalse(this.itemsRemovedCollectionCalled);
	}

	public void testFireItemsRemovedCollectionEventNoChange() {
		this.collectionEvent = null;
		this.itemsRemovedCollectionCalled = false;
		this.testModel.addChangeListener(this.changeListener);
		this.testModel.testFireItemsRemovedCollectionEventNoChange();
		assertNull(this.collectionEvent);
		assertFalse(this.itemsRemovedCollectionCalled);

		this.collectionEvent = null;
		this.itemsRemovedCollectionCalled = false;
		this.testModel.removeChangeListener(this.changeListener);
		this.testModel.testFireItemsRemovedCollectionEventNoChange();
		assertNull(this.collectionEvent);
		assertFalse(this.itemsRemovedCollectionCalled);

		this.collectionEvent = null;
		this.itemsRemovedCollectionCalled = false;
		this.testModel.addCollectionChangeListener(COLLECTION_NAME, this.changeListener);
		this.testModel.testFireItemsRemovedCollectionEventNoChange();
		assertNull(this.collectionEvent);
		assertFalse(this.itemsRemovedCollectionCalled);

		this.collectionEvent = null;
		this.itemsRemovedCollectionCalled = false;
		this.testModel.removeCollectionChangeListener(COLLECTION_NAME, this.changeListener);
		this.testModel.testFireItemsRemovedCollectionEventNoChange();
		assertNull(this.collectionEvent);
		assertFalse(this.itemsRemovedCollectionCalled);
	}

	public void testFireItemsRemovedCollection() {
		this.collectionEvent = null;
		this.itemsRemovedCollectionCalled = false;
		this.testModel.addChangeListener(this.changeListener);
		this.testModel.testFireItemsRemovedCollection();
		this.verifyCollectionEvent(REMOVED_OBJECT_VALUE);
		assertTrue(this.itemsRemovedCollectionCalled);

		this.collectionEvent = null;
		this.itemsRemovedCollectionCalled = false;
		this.testModel.removeChangeListener(this.changeListener);
		this.testModel.testFireItemsRemovedCollection();
		assertNull(this.collectionEvent);
		assertFalse(this.itemsRemovedCollectionCalled);

		this.collectionEvent = null;
		this.itemsRemovedCollectionCalled = false;
		this.testModel.addCollectionChangeListener(COLLECTION_NAME, this.changeListener);
		this.testModel.testFireItemsRemovedCollection();
		this.verifyCollectionEvent(REMOVED_OBJECT_VALUE);
		assertTrue(this.itemsRemovedCollectionCalled);

		this.collectionEvent = null;
		this.itemsRemovedCollectionCalled = false;
		this.testModel.removeCollectionChangeListener(COLLECTION_NAME, this.changeListener);
		this.testModel.testFireItemsRemovedCollection();
		assertNull(this.collectionEvent);
		assertFalse(this.itemsRemovedCollectionCalled);
	}

	public void testFireItemsRemovedCollectionNoChange() {
		this.collectionEvent = null;
		this.itemsRemovedCollectionCalled = false;
		this.testModel.addChangeListener(this.changeListener);
		this.testModel.testFireItemsRemovedCollectionNoChange();
		assertNull(this.collectionEvent);
		assertFalse(this.itemsRemovedCollectionCalled);

		this.collectionEvent = null;
		this.itemsRemovedCollectionCalled = false;
		this.testModel.removeChangeListener(this.changeListener);
		this.testModel.testFireItemsRemovedCollectionNoChange();
		assertNull(this.collectionEvent);
		assertFalse(this.itemsRemovedCollectionCalled);

		this.collectionEvent = null;
		this.itemsRemovedCollectionCalled = false;
		this.testModel.addCollectionChangeListener(COLLECTION_NAME, this.changeListener);
		this.testModel.testFireItemsRemovedCollectionNoChange();
		assertNull(this.collectionEvent);
		assertFalse(this.itemsRemovedCollectionCalled);

		this.collectionEvent = null;
		this.itemsRemovedCollectionCalled = false;
		this.testModel.removeCollectionChangeListener(COLLECTION_NAME, this.changeListener);
		this.testModel.testFireItemsRemovedCollectionNoChange();
		assertNull(this.collectionEvent);
		assertFalse(this.itemsRemovedCollectionCalled);
	}

	public void testFireItemRemovedCollection() {
		this.collectionEvent = null;
		this.itemsRemovedCollectionCalled = false;
		this.testModel.addChangeListener(this.changeListener);
		this.testModel.testFireItemRemovedCollection();
		this.verifyCollectionEvent(REMOVED_OBJECT_VALUE);
		assertTrue(this.itemsRemovedCollectionCalled);

		this.collectionEvent = null;
		this.itemsRemovedCollectionCalled = false;
		this.testModel.removeChangeListener(this.changeListener);
		this.testModel.testFireItemRemovedCollection();
		assertNull(this.collectionEvent);
		assertFalse(this.itemsRemovedCollectionCalled);

		this.collectionEvent = null;
		this.itemsRemovedCollectionCalled = false;
		this.testModel.addCollectionChangeListener(COLLECTION_NAME, this.changeListener);
		this.testModel.testFireItemRemovedCollection();
		this.verifyCollectionEvent(REMOVED_OBJECT_VALUE);
		assertTrue(this.itemsRemovedCollectionCalled);

		this.collectionEvent = null;
		this.itemsRemovedCollectionCalled = false;
		this.testModel.removeCollectionChangeListener(COLLECTION_NAME, this.changeListener);
		this.testModel.testFireItemRemovedCollection();
		assertNull(this.collectionEvent);
		assertFalse(this.itemsRemovedCollectionCalled);
	}

	public void testFireCollectionCleared() {
		this.collectionEvent = null;
		this.collectionClearedCalled = false;
		this.testModel.addChangeListener(this.changeListener);
		this.testModel.testFireCollectionCleared();
		this.verifyCollectionEvent(null);
		assertTrue(this.collectionClearedCalled);

		this.collectionEvent = null;
		this.collectionClearedCalled = false;
		this.testModel.removeChangeListener(this.changeListener);
		this.testModel.testFireCollectionCleared();
		assertNull(this.collectionEvent);
		assertFalse(this.collectionClearedCalled);

		this.collectionEvent = null;
		this.collectionClearedCalled = false;
		this.testModel.addCollectionChangeListener(COLLECTION_NAME, this.changeListener);
		this.testModel.testFireCollectionCleared();
		this.verifyCollectionEvent(null);
		assertTrue(this.collectionClearedCalled);

		this.collectionEvent = null;
		this.collectionClearedCalled = false;
		this.testModel.removeCollectionChangeListener(COLLECTION_NAME, this.changeListener);
		this.testModel.testFireCollectionCleared();
		assertNull(this.collectionEvent);
		assertFalse(this.collectionClearedCalled);
	}

	public void testFireCollectionChangedEvent() {
		this.collectionEvent = null;
		this.collectionChangedCalled = false;
		this.testModel.addChangeListener(this.changeListener);
		this.testModel.testFireCollectionChangedEvent();
		this.verifyCollectionEvent(null);
		assertTrue(this.collectionChangedCalled);

		this.collectionEvent = null;
		this.collectionChangedCalled = false;
		this.testModel.removeChangeListener(this.changeListener);
		this.testModel.testFireCollectionChangedEvent();
		assertNull(this.collectionEvent);
		assertFalse(this.collectionChangedCalled);

		this.collectionEvent = null;
		this.collectionChangedCalled = false;
		this.testModel.addCollectionChangeListener(COLLECTION_NAME, this.changeListener);
		this.testModel.testFireCollectionChangedEvent();
		this.verifyCollectionEvent(null);
		assertTrue(this.collectionChangedCalled);

		this.collectionEvent = null;
		this.collectionChangedCalled = false;
		this.testModel.removeCollectionChangeListener(COLLECTION_NAME, this.changeListener);
		this.testModel.testFireCollectionChangedEvent();
		assertNull(this.collectionEvent);
		assertFalse(this.collectionChangedCalled);
	}

	public void testFireCollectionChanged() {
		this.collectionEvent = null;
		this.collectionChangedCalled = false;
		this.testModel.addChangeListener(this.changeListener);
		this.testModel.testFireCollectionChanged();
		this.verifyCollectionEvent(null);
		assertTrue(this.collectionChangedCalled);

		this.collectionEvent = null;
		this.collectionChangedCalled = false;
		this.testModel.removeChangeListener(this.changeListener);
		this.testModel.testFireCollectionChanged();
		assertNull(this.collectionEvent);
		assertFalse(this.collectionChangedCalled);

		this.collectionEvent = null;
		this.collectionChangedCalled = false;
		this.testModel.addCollectionChangeListener(COLLECTION_NAME, this.changeListener);
		this.testModel.testFireCollectionChanged();
		this.verifyCollectionEvent(null);
		assertTrue(this.collectionChangedCalled);

		this.collectionEvent = null;
		this.collectionChangedCalled = false;
		this.testModel.removeCollectionChangeListener(COLLECTION_NAME, this.changeListener);
		this.testModel.testFireCollectionChanged();
		assertNull(this.collectionEvent);
		assertFalse(this.collectionChangedCalled);
	}

	public void testAddItemToCollection() {
		this.collectionEvent = null;
		this.itemsAddedCollectionCalled = false;
		this.testModel.addChangeListener(this.changeListener);
		assertTrue(this.testModel.testAddItemToCollection());
		this.verifyCollectionEvent(ADDED_OBJECT_VALUE);
		assertTrue(this.itemsAddedCollectionCalled);

		this.collectionEvent = null;
		this.itemsAddedCollectionCalled = false;
		this.testModel.removeChangeListener(this.changeListener);
		assertTrue(this.testModel.testAddItemToCollection());
		assertNull(this.collectionEvent);
		assertFalse(this.itemsAddedCollectionCalled);

		this.collectionEvent = null;
		this.itemsAddedCollectionCalled = false;
		this.testModel.addCollectionChangeListener(COLLECTION_NAME, this.changeListener);
		assertTrue(this.testModel.testAddItemToCollection());
		this.verifyCollectionEvent(ADDED_OBJECT_VALUE);
		assertTrue(this.itemsAddedCollectionCalled);

		this.collectionEvent = null;
		this.itemsAddedCollectionCalled = false;
		this.testModel.removeCollectionChangeListener(COLLECTION_NAME, this.changeListener);
		assertTrue(this.testModel.testAddItemToCollection());
		assertNull(this.collectionEvent);
		assertFalse(this.itemsAddedCollectionCalled);
	}

	public void testAddItemToCollectionNoChange() {
		this.collectionEvent = null;
		this.itemsAddedCollectionCalled = false;
		this.testModel.addChangeListener(this.changeListener);
		assertFalse(this.testModel.testAddItemToCollectionNoChange());
		assertNull(this.collectionEvent);
		assertFalse(this.itemsAddedCollectionCalled);

		this.collectionEvent = null;
		this.itemsAddedCollectionCalled = false;
		this.testModel.removeChangeListener(this.changeListener);
		assertFalse(this.testModel.testAddItemToCollectionNoChange());
		assertNull(this.collectionEvent);
		assertFalse(this.itemsAddedCollectionCalled);

		this.collectionEvent = null;
		this.itemsAddedCollectionCalled = false;
		this.testModel.addCollectionChangeListener(COLLECTION_NAME, this.changeListener);
		assertFalse(this.testModel.testAddItemToCollectionNoChange());
		assertNull(this.collectionEvent);
		assertFalse(this.itemsAddedCollectionCalled);

		this.collectionEvent = null;
		this.itemsAddedCollectionCalled = false;
		this.testModel.removeCollectionChangeListener(COLLECTION_NAME, this.changeListener);
		assertFalse(this.testModel.testAddItemToCollectionNoChange());
		assertNull(this.collectionEvent);
		assertFalse(this.itemsAddedCollectionCalled);
	}

	public void testAddItemsToCollection() {
		this.collectionEvent = null;
		this.itemsAddedCollectionCalled = false;
		this.testModel.addChangeListener(this.changeListener);
		assertTrue(this.testModel.testAddItemsToCollection());
		this.verifyCollectionEvent(ADDED_OBJECT_VALUE);
		assertTrue(this.itemsAddedCollectionCalled);

		this.collectionEvent = null;
		this.itemsAddedCollectionCalled = false;
		this.testModel.removeChangeListener(this.changeListener);
		assertTrue(this.testModel.testAddItemsToCollection());
		assertNull(this.collectionEvent);
		assertFalse(this.itemsAddedCollectionCalled);

		this.collectionEvent = null;
		this.itemsAddedCollectionCalled = false;
		this.testModel.addCollectionChangeListener(COLLECTION_NAME, this.changeListener);
		assertTrue(this.testModel.testAddItemsToCollection());
		this.verifyCollectionEvent(ADDED_OBJECT_VALUE);
		assertTrue(this.itemsAddedCollectionCalled);

		this.collectionEvent = null;
		this.itemsAddedCollectionCalled = false;
		this.testModel.removeCollectionChangeListener(COLLECTION_NAME, this.changeListener);
		assertTrue(this.testModel.testAddItemsToCollection());
		assertNull(this.collectionEvent);
		assertFalse(this.itemsAddedCollectionCalled);
	}

	public void testAddItemsToCollectionNoChange() {
		this.collectionEvent = null;
		this.itemsAddedCollectionCalled = false;
		this.testModel.addChangeListener(this.changeListener);
		assertFalse(this.testModel.testAddItemsToCollectionNoChange());
		assertNull(this.collectionEvent);
		assertFalse(this.itemsAddedCollectionCalled);

		this.collectionEvent = null;
		this.itemsAddedCollectionCalled = false;
		this.testModel.removeChangeListener(this.changeListener);
		assertFalse(this.testModel.testAddItemsToCollectionNoChange());
		assertNull(this.collectionEvent);
		assertFalse(this.itemsAddedCollectionCalled);

		this.collectionEvent = null;
		this.itemsAddedCollectionCalled = false;
		this.testModel.addCollectionChangeListener(COLLECTION_NAME, this.changeListener);
		assertFalse(this.testModel.testAddItemsToCollectionNoChange());
		assertNull(this.collectionEvent);
		assertFalse(this.itemsAddedCollectionCalled);

		this.collectionEvent = null;
		this.itemsAddedCollectionCalled = false;
		this.testModel.removeCollectionChangeListener(COLLECTION_NAME, this.changeListener);
		assertFalse(this.testModel.testAddItemsToCollectionNoChange());
		assertNull(this.collectionEvent);
		assertFalse(this.itemsAddedCollectionCalled);
	}

	public void testAddItemsToCollectionMixed() {
		this.collectionEvent = null;
		this.itemsAddedCollectionCalled = false;
		this.testModel.addChangeListener(this.changeListener);
		assertTrue(this.testModel.testAddItemsToCollectionMixed());
		this.verifyCollectionEvent(ADDED_OBJECT_VALUE_2);
		assertTrue(this.itemsAddedCollectionCalled);

		this.collectionEvent = null;
		this.itemsAddedCollectionCalled = false;
		this.testModel.removeChangeListener(this.changeListener);
		assertTrue(this.testModel.testAddItemsToCollectionMixed());
		assertNull(this.collectionEvent);
		assertFalse(this.itemsAddedCollectionCalled);

		this.collectionEvent = null;
		this.itemsAddedCollectionCalled = false;
		this.testModel.addCollectionChangeListener(COLLECTION_NAME, this.changeListener);
		assertTrue(this.testModel.testAddItemsToCollectionMixed());
		this.verifyCollectionEvent(ADDED_OBJECT_VALUE_2);
		assertTrue(this.itemsAddedCollectionCalled);

		this.collectionEvent = null;
		this.itemsAddedCollectionCalled = false;
		this.testModel.removeCollectionChangeListener(COLLECTION_NAME, this.changeListener);
		assertTrue(this.testModel.testAddItemsToCollectionMixed());
		assertNull(this.collectionEvent);
		assertFalse(this.itemsAddedCollectionCalled);
	}

	public void testRemoveItemFromCollection() {
		this.collectionEvent = null;
		this.itemsRemovedCollectionCalled = false;
		this.testModel.addChangeListener(this.changeListener);
		assertTrue(this.testModel.testRemoveItemFromCollection());
		this.verifyCollectionEvent(REMOVED_OBJECT_VALUE);
		assertTrue(this.itemsRemovedCollectionCalled);

		this.collectionEvent = null;
		this.itemsRemovedCollectionCalled = false;
		this.testModel.removeChangeListener(this.changeListener);
		assertTrue(this.testModel.testRemoveItemFromCollection());
		assertNull(this.collectionEvent);
		assertFalse(this.itemsRemovedCollectionCalled);

		this.collectionEvent = null;
		this.itemsRemovedCollectionCalled = false;
		this.testModel.addCollectionChangeListener(COLLECTION_NAME, this.changeListener);
		assertTrue(this.testModel.testRemoveItemFromCollection());
		this.verifyCollectionEvent(REMOVED_OBJECT_VALUE);
		assertTrue(this.itemsRemovedCollectionCalled);

		this.collectionEvent = null;
		this.itemsRemovedCollectionCalled = false;
		this.testModel.removeCollectionChangeListener(COLLECTION_NAME, this.changeListener);
		assertTrue(this.testModel.testRemoveItemFromCollection());
		assertNull(this.collectionEvent);
		assertFalse(this.itemsRemovedCollectionCalled);
	}

	public void testRemoveItemFromCollectionNoChange() {
		this.collectionEvent = null;
		this.itemsRemovedCollectionCalled = false;
		this.testModel.addChangeListener(this.changeListener);
		assertFalse(this.testModel.testRemoveItemFromCollectionNoChange());
		assertNull(this.collectionEvent);
		assertFalse(this.itemsRemovedCollectionCalled);

		this.collectionEvent = null;
		this.itemsRemovedCollectionCalled = false;
		this.testModel.removeChangeListener(this.changeListener);
		assertFalse(this.testModel.testRemoveItemFromCollectionNoChange());
		assertNull(this.collectionEvent);
		assertFalse(this.itemsRemovedCollectionCalled);

		this.collectionEvent = null;
		this.itemsRemovedCollectionCalled = false;
		this.testModel.addCollectionChangeListener(COLLECTION_NAME, this.changeListener);
		assertFalse(this.testModel.testRemoveItemFromCollectionNoChange());
		assertNull(this.collectionEvent);
		assertFalse(this.itemsRemovedCollectionCalled);

		this.collectionEvent = null;
		this.itemsRemovedCollectionCalled = false;
		this.testModel.removeCollectionChangeListener(COLLECTION_NAME, this.changeListener);
		assertFalse(this.testModel.testRemoveItemFromCollectionNoChange());
		assertNull(this.collectionEvent);
		assertFalse(this.itemsRemovedCollectionCalled);
	}

	public void testRemoveItemsFromCollection() {
		this.collectionEvent = null;
		this.itemsRemovedCollectionCalled = false;
		this.testModel.addChangeListener(this.changeListener);
		assertTrue(this.testModel.testRemoveItemsFromCollection());
		this.verifyCollectionChangeEvent2(REMOVED_OBJECT_VALUE, "foo", "bar");
		assertTrue(this.itemsRemovedCollectionCalled);

		this.collectionEvent = null;
		this.itemsRemovedCollectionCalled = false;
		this.testModel.removeChangeListener(this.changeListener);
		assertTrue(this.testModel.testRemoveItemsFromCollection());
		assertNull(this.collectionEvent);
		assertFalse(this.itemsRemovedCollectionCalled);

		this.collectionEvent = null;
		this.itemsRemovedCollectionCalled = false;
		this.testModel.addCollectionChangeListener(COLLECTION_NAME, this.changeListener);
		assertTrue(this.testModel.testRemoveItemsFromCollection());
		this.verifyCollectionChangeEvent2(REMOVED_OBJECT_VALUE, "foo", "bar");
		assertTrue(this.itemsRemovedCollectionCalled);

		this.collectionEvent = null;
		this.itemsRemovedCollectionCalled = false;
		this.testModel.removeCollectionChangeListener(COLLECTION_NAME, this.changeListener);
		assertTrue(this.testModel.testRemoveItemsFromCollection());
		assertNull(this.collectionEvent);
		assertFalse(this.itemsRemovedCollectionCalled);
	}

	public void testRemoveItemsFromCollectionNoChange1() {
		this.collectionEvent = null;
		this.itemsRemovedCollectionCalled = false;
		this.testModel.addChangeListener(this.changeListener);
		assertFalse(this.testModel.testRemoveItemsFromCollectionNoChange1());
		assertNull(this.collectionEvent);
		assertFalse(this.itemsRemovedCollectionCalled);

		this.collectionEvent = null;
		this.itemsRemovedCollectionCalled = false;
		this.testModel.removeChangeListener(this.changeListener);
		assertFalse(this.testModel.testRemoveItemsFromCollectionNoChange1());
		assertNull(this.collectionEvent);
		assertFalse(this.itemsRemovedCollectionCalled);

		this.collectionEvent = null;
		this.itemsRemovedCollectionCalled = false;
		this.testModel.addCollectionChangeListener(COLLECTION_NAME, this.changeListener);
		assertFalse(this.testModel.testRemoveItemsFromCollectionNoChange1());
		assertNull(this.collectionEvent);
		assertFalse(this.itemsRemovedCollectionCalled);

		this.collectionEvent = null;
		this.itemsRemovedCollectionCalled = false;
		this.testModel.removeCollectionChangeListener(COLLECTION_NAME, this.changeListener);
		assertFalse(this.testModel.testRemoveItemsFromCollectionNoChange1());
		assertNull(this.collectionEvent);
		assertFalse(this.itemsRemovedCollectionCalled);
	}

	public void testRemoveItemsFromCollectionNoChange2() {
		this.collectionEvent = null;
		this.itemsRemovedCollectionCalled = false;
		this.testModel.addChangeListener(this.changeListener);
		assertFalse(this.testModel.testRemoveItemsFromCollectionNoChange2());
		assertNull(this.collectionEvent);
		assertFalse(this.itemsRemovedCollectionCalled);

		this.collectionEvent = null;
		this.itemsRemovedCollectionCalled = false;
		this.testModel.removeChangeListener(this.changeListener);
		assertFalse(this.testModel.testRemoveItemsFromCollectionNoChange2());
		assertNull(this.collectionEvent);
		assertFalse(this.itemsRemovedCollectionCalled);

		this.collectionEvent = null;
		this.itemsRemovedCollectionCalled = false;
		this.testModel.addCollectionChangeListener(COLLECTION_NAME, this.changeListener);
		assertFalse(this.testModel.testRemoveItemsFromCollectionNoChange2());
		assertNull(this.collectionEvent);
		assertFalse(this.itemsRemovedCollectionCalled);

		this.collectionEvent = null;
		this.itemsRemovedCollectionCalled = false;
		this.testModel.removeCollectionChangeListener(COLLECTION_NAME, this.changeListener);
		assertFalse(this.testModel.testRemoveItemsFromCollectionNoChange2());
		assertNull(this.collectionEvent);
		assertFalse(this.itemsRemovedCollectionCalled);
	}

	public void testRemoveItemsFromCollectionNoChange3() {
		this.collectionEvent = null;
		this.itemsRemovedCollectionCalled = false;
		this.testModel.addChangeListener(this.changeListener);
		assertFalse(this.testModel.testRemoveItemsFromCollectionNoChange3());
		assertNull(this.collectionEvent);
		assertFalse(this.itemsRemovedCollectionCalled);

		this.collectionEvent = null;
		this.itemsRemovedCollectionCalled = false;
		this.testModel.removeChangeListener(this.changeListener);
		assertFalse(this.testModel.testRemoveItemsFromCollectionNoChange3());
		assertNull(this.collectionEvent);
		assertFalse(this.itemsRemovedCollectionCalled);

		this.collectionEvent = null;
		this.itemsRemovedCollectionCalled = false;
		this.testModel.addCollectionChangeListener(COLLECTION_NAME, this.changeListener);
		assertFalse(this.testModel.testRemoveItemsFromCollectionNoChange3());
		assertNull(this.collectionEvent);
		assertFalse(this.itemsRemovedCollectionCalled);

		this.collectionEvent = null;
		this.itemsRemovedCollectionCalled = false;
		this.testModel.removeCollectionChangeListener(COLLECTION_NAME, this.changeListener);
		assertFalse(this.testModel.testRemoveItemsFromCollectionNoChange3());
		assertNull(this.collectionEvent);
		assertFalse(this.itemsRemovedCollectionCalled);
	}

	public void testRetainItemsInCollection1() {
		this.collectionEvent = null;
		this.itemsRemovedCollectionCalled = false;
		this.testModel.addChangeListener(this.changeListener);
		assertTrue(this.testModel.testRetainItemsInCollection1());
		this.verifyCollectionEvent(REMOVED_OBJECT_VALUE);
		assertTrue(this.itemsRemovedCollectionCalled);

		this.collectionEvent = null;
		this.itemsRemovedCollectionCalled = false;
		this.testModel.removeChangeListener(this.changeListener);
		assertTrue(this.testModel.testRetainItemsInCollection1());
		assertNull(this.collectionEvent);
		assertFalse(this.itemsRemovedCollectionCalled);

		this.collectionEvent = null;
		this.itemsRemovedCollectionCalled = false;
		this.testModel.addCollectionChangeListener(COLLECTION_NAME, this.changeListener);
		assertTrue(this.testModel.testRetainItemsInCollection1());
		this.verifyCollectionEvent(REMOVED_OBJECT_VALUE);
		assertTrue(this.itemsRemovedCollectionCalled);

		this.collectionEvent = null;
		this.itemsRemovedCollectionCalled = false;
		this.testModel.removeCollectionChangeListener(COLLECTION_NAME, this.changeListener);
		assertTrue(this.testModel.testRetainItemsInCollection1());
		assertNull(this.collectionEvent);
		assertFalse(this.itemsRemovedCollectionCalled);
	}

	// collection cleared...
	public void testRetainItemsInCollection2() {
		this.collectionEvent = null;
		this.collectionClearedCalled = false;
		this.testModel.addChangeListener(this.changeListener);
		assertTrue(this.testModel.testRetainItemsInCollection2());
		this.verifyCollectionEvent(null);
		assertTrue(this.collectionClearedCalled);

		this.collectionEvent = null;
		this.collectionClearedCalled = false;
		this.testModel.removeChangeListener(this.changeListener);
		assertTrue(this.testModel.testRetainItemsInCollection2());
		assertNull(this.collectionEvent);
		assertFalse(this.collectionClearedCalled);

		this.collectionEvent = null;
		this.collectionClearedCalled = false;
		this.testModel.addCollectionChangeListener(COLLECTION_NAME, this.changeListener);
		assertTrue(this.testModel.testRetainItemsInCollection2());
		this.verifyCollectionEvent(null);
		assertTrue(this.collectionClearedCalled);

		this.collectionEvent = null;
		this.collectionClearedCalled = false;
		this.testModel.removeCollectionChangeListener(COLLECTION_NAME, this.changeListener);
		assertTrue(this.testModel.testRetainItemsInCollection2());
		assertNull(this.collectionEvent);
		assertFalse(this.collectionClearedCalled);
	}

	public void testRetainItemsInCollectionNoChange1() {
		this.collectionEvent = null;
		this.itemsRemovedCollectionCalled = false;
		this.testModel.addChangeListener(this.changeListener);
		assertFalse(this.testModel.testRetainItemsInCollectionNoChange1());
		assertNull(this.collectionEvent);
		assertFalse(this.itemsRemovedCollectionCalled);

		this.collectionEvent = null;
		this.itemsRemovedCollectionCalled = false;
		this.testModel.removeChangeListener(this.changeListener);
		assertFalse(this.testModel.testRetainItemsInCollectionNoChange1());
		assertNull(this.collectionEvent);
		assertFalse(this.itemsRemovedCollectionCalled);

		this.collectionEvent = null;
		this.itemsRemovedCollectionCalled = false;
		this.testModel.addCollectionChangeListener(COLLECTION_NAME, this.changeListener);
		assertFalse(this.testModel.testRetainItemsInCollectionNoChange1());
		assertNull(this.collectionEvent);
		assertFalse(this.itemsRemovedCollectionCalled);

		this.collectionEvent = null;
		this.itemsRemovedCollectionCalled = false;
		this.testModel.removeCollectionChangeListener(COLLECTION_NAME, this.changeListener);
		assertFalse(this.testModel.testRetainItemsInCollectionNoChange1());
		assertNull(this.collectionEvent);
		assertFalse(this.itemsRemovedCollectionCalled);
	}

	public void testRetainItemsInCollectionNoChange2() {
		this.collectionEvent = null;
		this.itemsRemovedCollectionCalled = false;
		this.testModel.addChangeListener(this.changeListener);
		assertFalse(this.testModel.testRetainItemsInCollectionNoChange2());
		assertNull(this.collectionEvent);
		assertFalse(this.itemsRemovedCollectionCalled);

		this.collectionEvent = null;
		this.itemsRemovedCollectionCalled = false;
		this.testModel.removeChangeListener(this.changeListener);
		assertFalse(this.testModel.testRetainItemsInCollectionNoChange2());
		assertNull(this.collectionEvent);
		assertFalse(this.itemsRemovedCollectionCalled);

		this.collectionEvent = null;
		this.itemsRemovedCollectionCalled = false;
		this.testModel.addCollectionChangeListener(COLLECTION_NAME, this.changeListener);
		assertFalse(this.testModel.testRetainItemsInCollectionNoChange2());
		assertNull(this.collectionEvent);
		assertFalse(this.itemsRemovedCollectionCalled);

		this.collectionEvent = null;
		this.itemsRemovedCollectionCalled = false;
		this.testModel.removeCollectionChangeListener(COLLECTION_NAME, this.changeListener);
		assertFalse(this.testModel.testRetainItemsInCollectionNoChange2());
		assertNull(this.collectionEvent);
		assertFalse(this.itemsRemovedCollectionCalled);
	}

	public void testClearCollection() {
		this.collectionEvent = null;
		this.collectionClearedCalled = false;
		this.testModel.addChangeListener(this.changeListener);
		assertTrue(this.testModel.testClearCollection());
		this.verifyCollectionEvent(null);
		assertTrue(this.collectionClearedCalled);

		this.collectionEvent = null;
		this.collectionClearedCalled = false;
		this.testModel.removeChangeListener(this.changeListener);
		assertTrue(this.testModel.testClearCollection());
		assertNull(this.collectionEvent);
		assertFalse(this.collectionClearedCalled);

		this.collectionEvent = null;
		this.collectionClearedCalled = false;
		this.testModel.addCollectionChangeListener(COLLECTION_NAME, this.changeListener);
		assertTrue(this.testModel.testClearCollection());
		this.verifyCollectionEvent(null);
		assertTrue(this.collectionClearedCalled);

		this.collectionEvent = null;
		this.collectionClearedCalled = false;
		this.testModel.removeCollectionChangeListener(COLLECTION_NAME, this.changeListener);
		assertTrue(this.testModel.testClearCollection());
		assertNull(this.collectionEvent);
		assertFalse(this.collectionClearedCalled);
	}

	public void testClearCollectionNoChange() {
		this.collectionEvent = null;
		this.collectionClearedCalled = false;
		this.testModel.addChangeListener(this.changeListener);
		assertFalse(this.testModel.testClearCollectionNoChange());
		assertNull(this.collectionEvent);
		assertFalse(this.collectionClearedCalled);

		this.collectionEvent = null;
		this.collectionClearedCalled = false;
		this.testModel.removeChangeListener(this.changeListener);
		assertFalse(this.testModel.testClearCollectionNoChange());
		assertNull(this.collectionEvent);
		assertFalse(this.collectionClearedCalled);

		this.collectionEvent = null;
		this.collectionClearedCalled = false;
		this.testModel.addCollectionChangeListener(COLLECTION_NAME, this.changeListener);
		assertFalse(this.testModel.testClearCollectionNoChange());
		assertNull(this.collectionEvent);
		assertFalse(this.collectionClearedCalled);

		this.collectionEvent = null;
		this.collectionClearedCalled = false;
		this.testModel.removeCollectionChangeListener(COLLECTION_NAME, this.changeListener);
		assertFalse(this.testModel.testClearCollectionNoChange());
		assertNull(this.collectionEvent);
		assertFalse(this.collectionClearedCalled);
	}

	public void testSynchronizeCollection1() {
		CollectionSynchListener csl = new CollectionSynchListener();
		this.testModel.addChangeListener(csl);
		assertTrue(this.testModel.testSynchronizeCollection1());
		assertTrue(csl.itemsAdded);
		assertTrue(csl.itemsRemoved);
		assertFalse(csl.collectionChanged);
		assertFalse(csl.collectionCleared);
		assertEquals(2, csl.addedItems.size());
		assertTrue(CollectionTools.containsAll(csl.addedItems, new Object[] {"joo", "jar"}));
		assertEquals(2, csl.removedItems.size());
		assertTrue(CollectionTools.containsAll(csl.removedItems, new Object[] {"foo", "bar"}));
	}

	public void testSynchronizeCollection2() {
		CollectionSynchListener csl = new CollectionSynchListener();
		this.testModel.addChangeListener(csl);
		assertTrue(this.testModel.testSynchronizeCollection2());
		assertFalse(csl.itemsAdded);
		assertFalse(csl.itemsRemoved);
		assertFalse(csl.collectionChanged);
		assertTrue(csl.collectionCleared);
		assertTrue(csl.addedItems.isEmpty());
		assertTrue(csl.removedItems.isEmpty());
	}

	public void testSynchronizeCollection3() {
		CollectionSynchListener csl = new CollectionSynchListener();
		this.testModel.addChangeListener(csl);
		assertTrue(this.testModel.testSynchronizeCollection3());
		assertTrue(csl.itemsAdded);
		assertFalse(csl.itemsRemoved);
		assertFalse(csl.collectionChanged);
		assertFalse(csl.collectionCleared);
		assertEquals(3, csl.addedItems.size());
		assertTrue(CollectionTools.containsAll(csl.addedItems, new Object[] {"joo", "jar", "baz"}));
		assertTrue(csl.removedItems.isEmpty());
	}

	class CollectionSynchListener extends ChangeAdapter {
		boolean itemsAdded = false;
		boolean itemsRemoved = false;
		boolean collectionChanged = false;
		boolean collectionCleared = false;
		Collection<Object> addedItems = new ArrayList<Object>();
		Collection<Object> removedItems = new ArrayList<Object>();
		@Override
		public void collectionChanged(CollectionChangeEvent event) {
			this.collectionChanged = true;
		}
		@Override
		public void collectionCleared(CollectionClearEvent event) {
			this.collectionCleared = true;
		}
		@Override
		public void itemsAdded(CollectionAddEvent event) {
			this.itemsAdded = true;
			CollectionTools.addAll(this.addedItems, event.getItems());
		}
		@Override
		public void itemsRemoved(CollectionRemoveEvent event) {
			this.itemsRemoved = true;
			CollectionTools.addAll(this.removedItems, event.getItems());
		}
	}

	public void testHasAnyCollectionChangeListeners() {
		assertTrue(this.testModel.hasNoCollectionChangeListeners(COLLECTION_NAME));
		this.testModel.addChangeListener(this.changeListener);
		assertTrue(this.testModel.hasAnyCollectionChangeListeners(COLLECTION_NAME));
		this.testModel.removeChangeListener(this.changeListener);
		assertTrue(this.testModel.hasNoCollectionChangeListeners(COLLECTION_NAME));

		assertTrue(this.testModel.hasNoCollectionChangeListeners(COLLECTION_NAME));
		this.testModel.addCollectionChangeListener(COLLECTION_NAME, this.changeListener);
		assertTrue(this.testModel.hasAnyCollectionChangeListeners(COLLECTION_NAME));
		this.testModel.removeCollectionChangeListener(COLLECTION_NAME, this.changeListener);
		assertTrue(this.testModel.hasNoCollectionChangeListeners(COLLECTION_NAME));
	}

	public void testAddNullCollectionListener() {
		boolean exCaught = false;
		try {
			this.testModel.addCollectionChangeListener("foo", null);
		} catch (NullPointerException ex) {
			exCaught = true;
		}
		assertTrue(exCaught);
	}

	public void testRemoveBogusCollectionListener() {
		boolean exCaught = false;
		try {
			this.testModel.removeCollectionChangeListener("foo", this.changeListener);
		} catch (IllegalArgumentException ex) {
			exCaught = true;
		}
		assertTrue(exCaught);

		this.testModel.addPropertyChangeListener("foo", this.changeListener);
		exCaught = false;
		try {
			this.testModel.removeCollectionChangeListener("foo", this.changeListener);
		} catch (IllegalArgumentException ex) {
			exCaught = true;
		}
		assertTrue(exCaught);

		this.testModel.addCollectionChangeListener("foo", this.changeListener);
		exCaught = false;
		try {
			this.testModel.removeCollectionChangeListener("foo", new CollectionChangeAdapter());
		} catch (IllegalArgumentException ex) {
			exCaught = true;
		}
		assertTrue(exCaught);

		exCaught = false;
		try {
			this.testModel.removeCollectionChangeListener("foo", new CollectionChangeAdapter());
		} catch (IllegalArgumentException ex) {
			exCaught = true;
		}
		assertTrue(exCaught);
	}

	private void verifyCollectionEvent(Object item) {
		assertNotNull(this.collectionEvent);
		assertEquals(this.testModel, this.collectionEvent.getSource());
		assertEquals(COLLECTION_NAME, this.collectionEvent.getCollectionName());
		if (item != null) {
			assertEquals(item, this.getCollectionEventItems().iterator().next());
		}
	}

	private Iterable<?> getCollectionEventItems() {
		if (this.collectionEvent instanceof CollectionAddEvent) {
			return ((CollectionAddEvent) this.collectionEvent).getItems();
		} else if (this.collectionEvent instanceof CollectionRemoveEvent) {
			return ((CollectionRemoveEvent) this.collectionEvent).getItems();
		}
		throw new IllegalStateException();
	}

	private void verifyCollectionChangeEvent2(Object... items) {
		assertNotNull(this.collectionEvent);
		assertEquals(this.testModel, this.collectionEvent.getSource());
		assertEquals(COLLECTION_NAME, this.collectionEvent.getCollectionName());
		assertEquals(items.length, this.getCollectionEventItemsSize());
		for (Object item : items) {
			assertTrue(CollectionTools.contains(this.getCollectionEventItems(), item));
		}
	}

	private int getCollectionEventItemsSize() {
		if (this.collectionEvent instanceof CollectionAddEvent) {
			return ((CollectionAddEvent) this.collectionEvent).getItemsSize();
		} else if (this.collectionEvent instanceof CollectionRemoveEvent) {
			return ((CollectionRemoveEvent) this.collectionEvent).getItemsSize();
		}
		throw new IllegalStateException();
	}


	// ********** list change tests **********

	public void testFireItemsAddedListEvent() {
		this.listEvent = null;
		this.itemsAddedListCalled = false;
		this.testModel.addChangeListener(this.changeListener);
		this.testModel.testFireItemsAddedListEvent();
		this.verifyListAddEvent(ADD_INDEX, ADDED_OBJECT_VALUE);
		assertTrue(this.itemsAddedListCalled);

		this.listEvent = null;
		this.itemsAddedListCalled = false;
		this.testModel.removeChangeListener(this.changeListener);
		this.testModel.testFireItemsAddedListEvent();
		assertNull(this.listEvent);
		assertFalse(this.itemsAddedListCalled);

		this.listEvent = null;
		this.itemsAddedListCalled = false;
		this.testModel.addListChangeListener(LIST_NAME, this.changeListener);
		this.testModel.testFireItemsAddedListEvent();
		this.verifyListAddEvent(ADD_INDEX, ADDED_OBJECT_VALUE);
		assertTrue(this.itemsAddedListCalled);

		this.listEvent = null;
		this.itemsAddedListCalled = false;
		this.testModel.removeListChangeListener(LIST_NAME, this.changeListener);
		this.testModel.testFireItemsAddedListEvent();
		assertNull(this.listEvent);
		assertFalse(this.itemsAddedListCalled);
	}

	public void testFireItemsAddedListEventNoChange() {
		this.listEvent = null;
		this.itemsAddedListCalled = false;
		this.testModel.addChangeListener(this.changeListener);
		this.testModel.testFireItemsAddedListEventNoChange();
		assertNull(this.listEvent);
		assertFalse(this.itemsAddedListCalled);

		this.listEvent = null;
		this.itemsAddedListCalled = false;
		this.testModel.removeChangeListener(this.changeListener);
		this.testModel.testFireItemsAddedListEventNoChange();
		assertNull(this.listEvent);
		assertFalse(this.itemsAddedListCalled);

		this.listEvent = null;
		this.itemsAddedListCalled = false;
		this.testModel.addListChangeListener(LIST_NAME, this.changeListener);
		this.testModel.testFireItemsAddedListEventNoChange();
		assertNull(this.listEvent);
		assertFalse(this.itemsAddedListCalled);

		this.listEvent = null;
		this.itemsAddedListCalled = false;
		this.testModel.removeListChangeListener(LIST_NAME, this.changeListener);
		this.testModel.testFireItemsAddedListEventNoChange();
		assertNull(this.listEvent);
		assertFalse(this.itemsAddedListCalled);
	}

	public void testFireItemsAddedList() {
		this.listEvent = null;
		this.itemsAddedListCalled = false;
		this.testModel.addChangeListener(this.changeListener);
		this.testModel.testFireItemsAddedList();
		this.verifyListAddEvent(ADD_INDEX, ADDED_OBJECT_VALUE);
		assertTrue(this.itemsAddedListCalled);

		this.listEvent = null;
		this.itemsAddedListCalled = false;
		this.testModel.removeChangeListener(this.changeListener);
		this.testModel.testFireItemsAddedList();
		assertNull(this.listEvent);
		assertFalse(this.itemsAddedListCalled);

		this.listEvent = null;
		this.itemsAddedListCalled = false;
		this.testModel.addListChangeListener(LIST_NAME, this.changeListener);
		this.testModel.testFireItemsAddedList();
		this.verifyListAddEvent(ADD_INDEX, ADDED_OBJECT_VALUE);
		assertTrue(this.itemsAddedListCalled);

		this.listEvent = null;
		this.itemsAddedListCalled = false;
		this.testModel.removeListChangeListener(LIST_NAME, this.changeListener);
		this.testModel.testFireItemsAddedList();
		assertNull(this.listEvent);
		assertFalse(this.itemsAddedListCalled);
	}

	public void testFireItemsAddedListNoChange() {
		this.listEvent = null;
		this.itemsAddedListCalled = false;
		this.testModel.addChangeListener(this.changeListener);
		this.testModel.testFireItemsAddedListNoChange();
		assertNull(this.listEvent);
		assertFalse(this.itemsAddedListCalled);

		this.listEvent = null;
		this.itemsAddedListCalled = false;
		this.testModel.removeChangeListener(this.changeListener);
		this.testModel.testFireItemsAddedListNoChange();
		assertNull(this.listEvent);
		assertFalse(this.itemsAddedListCalled);

		this.listEvent = null;
		this.itemsAddedListCalled = false;
		this.testModel.addListChangeListener(LIST_NAME, this.changeListener);
		this.testModel.testFireItemsAddedListNoChange();
		assertNull(this.listEvent);
		assertFalse(this.itemsAddedListCalled);

		this.listEvent = null;
		this.itemsAddedListCalled = false;
		this.testModel.removeListChangeListener(LIST_NAME, this.changeListener);
		this.testModel.testFireItemsAddedListNoChange();
		assertNull(this.listEvent);
		assertFalse(this.itemsAddedListCalled);
	}

	public void testFireItemAddedList() {
		this.listEvent = null;
		this.itemsAddedListCalled = false;
		this.testModel.addChangeListener(this.changeListener);
		this.testModel.testFireItemAddedList();
		this.verifyListAddEvent(ADD_INDEX, ADDED_OBJECT_VALUE);
		assertTrue(this.itemsAddedListCalled);

		this.listEvent = null;
		this.itemsAddedListCalled = false;
		this.testModel.removeChangeListener(this.changeListener);
		this.testModel.testFireItemAddedList();
		assertNull(this.listEvent);
		assertFalse(this.itemsAddedListCalled);

		this.listEvent = null;
		this.itemsAddedListCalled = false;
		this.testModel.addListChangeListener(LIST_NAME, this.changeListener);
		this.testModel.testFireItemAddedList();
		this.verifyListAddEvent(ADD_INDEX, ADDED_OBJECT_VALUE);
		assertTrue(this.itemsAddedListCalled);

		this.listEvent = null;
		this.itemsAddedListCalled = false;
		this.testModel.removeListChangeListener(LIST_NAME, this.changeListener);
		this.testModel.testFireItemAddedList();
		assertNull(this.listEvent);
		assertFalse(this.itemsAddedListCalled);
	}

	public void testFireItemsRemovedListEvent() {
		this.listEvent = null;
		this.itemsRemovedListCalled = false;
		this.testModel.addChangeListener(this.changeListener);
		this.testModel.testFireItemsRemovedListEvent();
		this.verifyListRemoveEvent(REMOVE_INDEX, REMOVED_OBJECT_VALUE);
		assertTrue(this.itemsRemovedListCalled);

		this.listEvent = null;
		this.itemsRemovedListCalled = false;
		this.testModel.removeChangeListener(this.changeListener);
		this.testModel.testFireItemsRemovedListEvent();
		assertNull(this.listEvent);
		assertFalse(this.itemsRemovedListCalled);

		this.listEvent = null;
		this.itemsRemovedListCalled = false;
		this.testModel.addListChangeListener(LIST_NAME, this.changeListener);
		this.testModel.testFireItemsRemovedListEvent();
		this.verifyListRemoveEvent(REMOVE_INDEX, REMOVED_OBJECT_VALUE);
		assertTrue(this.itemsRemovedListCalled);

		this.listEvent = null;
		this.itemsRemovedListCalled = false;
		this.testModel.removeListChangeListener(LIST_NAME, this.changeListener);
		this.testModel.testFireItemsRemovedListEvent();
		assertNull(this.listEvent);
		assertFalse(this.itemsRemovedListCalled);
	}

	public void testFireItemsRemovedListEventNoChange() {
		this.listEvent = null;
		this.itemsRemovedListCalled = false;
		this.testModel.addChangeListener(this.changeListener);
		this.testModel.testFireItemsRemovedListEventNoChange();
		assertNull(this.listEvent);
		assertFalse(this.itemsRemovedListCalled);

		this.listEvent = null;
		this.itemsRemovedListCalled = false;
		this.testModel.removeChangeListener(this.changeListener);
		this.testModel.testFireItemsRemovedListEventNoChange();
		assertNull(this.listEvent);
		assertFalse(this.itemsRemovedListCalled);

		this.listEvent = null;
		this.itemsRemovedListCalled = false;
		this.testModel.addListChangeListener(LIST_NAME, this.changeListener);
		this.testModel.testFireItemsRemovedListEventNoChange();
		assertNull(this.listEvent);
		assertFalse(this.itemsRemovedListCalled);

		this.listEvent = null;
		this.itemsRemovedListCalled = false;
		this.testModel.removeListChangeListener(LIST_NAME, this.changeListener);
		this.testModel.testFireItemsRemovedListEventNoChange();
		assertNull(this.listEvent);
		assertFalse(this.itemsRemovedListCalled);
	}

	public void testFireItemsRemovedList() {
		this.listEvent = null;
		this.itemsRemovedListCalled = false;
		this.testModel.addChangeListener(this.changeListener);
		this.testModel.testFireItemsRemovedList();
		this.verifyListRemoveEvent(REMOVE_INDEX, REMOVED_OBJECT_VALUE);
		assertTrue(this.itemsRemovedListCalled);

		this.listEvent = null;
		this.itemsRemovedListCalled = false;
		this.testModel.removeChangeListener(this.changeListener);
		this.testModel.testFireItemsRemovedList();
		assertNull(this.listEvent);
		assertFalse(this.itemsRemovedListCalled);

		this.listEvent = null;
		this.itemsRemovedListCalled = false;
		this.testModel.addListChangeListener(LIST_NAME, this.changeListener);
		this.testModel.testFireItemsRemovedList();
		this.verifyListRemoveEvent(REMOVE_INDEX, REMOVED_OBJECT_VALUE);
		assertTrue(this.itemsRemovedListCalled);

		this.listEvent = null;
		this.itemsRemovedListCalled = false;
		this.testModel.removeListChangeListener(LIST_NAME, this.changeListener);
		this.testModel.testFireItemsRemovedList();
		assertNull(this.listEvent);
		assertFalse(this.itemsRemovedListCalled);
	}

	public void testFireItemsRemovedListNoChange() {
		this.listEvent = null;
		this.itemsRemovedListCalled = false;
		this.testModel.addChangeListener(this.changeListener);
		this.testModel.testFireItemsRemovedListNoChange();
		assertNull(this.listEvent);
		assertFalse(this.itemsRemovedListCalled);

		this.listEvent = null;
		this.itemsRemovedListCalled = false;
		this.testModel.removeChangeListener(this.changeListener);
		this.testModel.testFireItemsRemovedListNoChange();
		assertNull(this.listEvent);
		assertFalse(this.itemsRemovedListCalled);

		this.listEvent = null;
		this.itemsRemovedListCalled = false;
		this.testModel.addListChangeListener(LIST_NAME, this.changeListener);
		this.testModel.testFireItemsRemovedListNoChange();
		assertNull(this.listEvent);
		assertFalse(this.itemsRemovedListCalled);

		this.listEvent = null;
		this.itemsRemovedListCalled = false;
		this.testModel.removeListChangeListener(LIST_NAME, this.changeListener);
		this.testModel.testFireItemsRemovedListNoChange();
		assertNull(this.listEvent);
		assertFalse(this.itemsRemovedListCalled);
	}

	public void testFireItemRemovedList() {
		this.listEvent = null;
		this.itemsRemovedListCalled = false;
		this.testModel.addChangeListener(this.changeListener);
		this.testModel.testFireItemRemovedList();
		this.verifyListRemoveEvent(REMOVE_INDEX, REMOVED_OBJECT_VALUE);
		assertTrue(this.itemsRemovedListCalled);

		this.listEvent = null;
		this.itemsRemovedListCalled = false;
		this.testModel.removeChangeListener(this.changeListener);
		this.testModel.testFireItemRemovedList();
		assertNull(this.listEvent);
		assertFalse(this.itemsRemovedListCalled);

		this.listEvent = null;
		this.itemsRemovedListCalled = false;
		this.testModel.addListChangeListener(LIST_NAME, this.changeListener);
		this.testModel.testFireItemRemovedList();
		this.verifyListRemoveEvent(REMOVE_INDEX, REMOVED_OBJECT_VALUE);
		assertTrue(this.itemsRemovedListCalled);

		this.listEvent = null;
		this.itemsRemovedListCalled = false;
		this.testModel.removeListChangeListener(LIST_NAME, this.changeListener);
		this.testModel.testFireItemRemovedList();
		assertNull(this.listEvent);
		assertFalse(this.itemsRemovedListCalled);
	}

	public void testFireItemsReplacedListEvent() {
		this.listEvent = null;
		this.itemsReplacedListCalled = false;
		this.testModel.addChangeListener(this.changeListener);
		this.testModel.testFireItemsReplacedListEvent();
		this.verifyListReplaceEvent(REPLACE_INDEX, ADDED_OBJECT_VALUE, REMOVED_OBJECT_VALUE);
		assertTrue(this.itemsReplacedListCalled);

		this.listEvent = null;
		this.itemsReplacedListCalled = false;
		this.testModel.removeChangeListener(this.changeListener);
		this.testModel.testFireItemsReplacedListEvent();
		assertNull(this.listEvent);
		assertFalse(this.itemsReplacedListCalled);

		this.listEvent = null;
		this.itemsReplacedListCalled = false;
		this.testModel.addListChangeListener(LIST_NAME, this.changeListener);
		this.testModel.testFireItemsReplacedListEvent();
		this.verifyListReplaceEvent(REPLACE_INDEX, ADDED_OBJECT_VALUE, REMOVED_OBJECT_VALUE);
		assertTrue(this.itemsReplacedListCalled);

		this.listEvent = null;
		this.itemsReplacedListCalled = false;
		this.testModel.removeListChangeListener(LIST_NAME, this.changeListener);
		this.testModel.testFireItemsReplacedListEvent();
		assertNull(this.listEvent);
		assertFalse(this.itemsReplacedListCalled);
	}

	public void testFireItemsReplacedListEventNoChange() {
		this.listEvent = null;
		this.itemsReplacedListCalled = false;
		this.testModel.addChangeListener(this.changeListener);
		this.testModel.testFireItemsReplacedListEventNoChange();
		assertNull(this.listEvent);
		assertFalse(this.itemsReplacedListCalled);

		this.listEvent = null;
		this.itemsReplacedListCalled = false;
		this.testModel.removeChangeListener(this.changeListener);
		this.testModel.testFireItemsReplacedListEventNoChange();
		assertNull(this.listEvent);
		assertFalse(this.itemsReplacedListCalled);

		this.listEvent = null;
		this.itemsReplacedListCalled = false;
		this.testModel.addListChangeListener(LIST_NAME, this.changeListener);
		this.testModel.testFireItemsReplacedListEventNoChange();
		assertNull(this.listEvent);
		assertFalse(this.itemsReplacedListCalled);

		this.listEvent = null;
		this.itemsReplacedListCalled = false;
		this.testModel.removeListChangeListener(LIST_NAME, this.changeListener);
		this.testModel.testFireItemsReplacedListEventNoChange();
		assertNull(this.listEvent);
		assertFalse(this.itemsReplacedListCalled);
	}

	public void testFireItemsReplacedList() {
		this.listEvent = null;
		this.itemsReplacedListCalled = false;
		this.testModel.addChangeListener(this.changeListener);
		this.testModel.testFireItemsReplacedList();
		this.verifyListReplaceEvent(REPLACE_INDEX, ADDED_OBJECT_VALUE, REMOVED_OBJECT_VALUE);
		assertTrue(this.itemsReplacedListCalled);

		this.listEvent = null;
		this.itemsReplacedListCalled = false;
		this.testModel.removeChangeListener(this.changeListener);
		this.testModel.testFireItemsReplacedList();
		assertNull(this.listEvent);
		assertFalse(this.itemsReplacedListCalled);

		this.listEvent = null;
		this.itemsReplacedListCalled = false;
		this.testModel.addListChangeListener(LIST_NAME, this.changeListener);
		this.testModel.testFireItemsReplacedList();
		this.verifyListReplaceEvent(REPLACE_INDEX, ADDED_OBJECT_VALUE, REMOVED_OBJECT_VALUE);
		assertTrue(this.itemsReplacedListCalled);

		this.listEvent = null;
		this.itemsReplacedListCalled = false;
		this.testModel.removeListChangeListener(LIST_NAME, this.changeListener);
		this.testModel.testFireItemsReplacedList();
		assertNull(this.listEvent);
		assertFalse(this.itemsReplacedListCalled);
	}

	public void testFireItemsReplacedListNoChange() {
		this.listEvent = null;
		this.itemsReplacedListCalled = false;
		this.testModel.addChangeListener(this.changeListener);
		this.testModel.testFireItemsReplacedListNoChange();
		assertNull(this.listEvent);
		assertFalse(this.itemsReplacedListCalled);

		this.listEvent = null;
		this.itemsReplacedListCalled = false;
		this.testModel.removeChangeListener(this.changeListener);
		this.testModel.testFireItemsReplacedListNoChange();
		assertNull(this.listEvent);
		assertFalse(this.itemsReplacedListCalled);

		this.listEvent = null;
		this.itemsReplacedListCalled = false;
		this.testModel.addListChangeListener(LIST_NAME, this.changeListener);
		this.testModel.testFireItemsReplacedListNoChange();
		assertNull(this.listEvent);
		assertFalse(this.itemsReplacedListCalled);

		this.listEvent = null;
		this.itemsReplacedListCalled = false;
		this.testModel.removeListChangeListener(LIST_NAME, this.changeListener);
		this.testModel.testFireItemsReplacedListNoChange();
		assertNull(this.listEvent);
		assertFalse(this.itemsReplacedListCalled);
	}

	public void testFireItemReplacedList() {
		this.listEvent = null;
		this.itemsReplacedListCalled = false;
		this.testModel.addChangeListener(this.changeListener);
		this.testModel.testFireItemReplacedList();
		this.verifyListReplaceEvent(REPLACE_INDEX, ADDED_OBJECT_VALUE, REMOVED_OBJECT_VALUE);
		assertTrue(this.itemsReplacedListCalled);

		this.listEvent = null;
		this.itemsReplacedListCalled = false;
		this.testModel.removeChangeListener(this.changeListener);
		this.testModel.testFireItemReplacedList();
		assertNull(this.listEvent);
		assertFalse(this.itemsReplacedListCalled);

		this.listEvent = null;
		this.itemsReplacedListCalled = false;
		this.testModel.addListChangeListener(LIST_NAME, this.changeListener);
		this.testModel.testFireItemReplacedList();
		this.verifyListReplaceEvent(REPLACE_INDEX, ADDED_OBJECT_VALUE, REMOVED_OBJECT_VALUE);
		assertTrue(this.itemsReplacedListCalled);

		this.listEvent = null;
		this.itemsReplacedListCalled = false;
		this.testModel.removeListChangeListener(LIST_NAME, this.changeListener);
		this.testModel.testFireItemReplacedList();
		assertNull(this.listEvent);
		assertFalse(this.itemsReplacedListCalled);
	}

	public void testFireItemsMovedListEvent() {
		this.listEvent = null;
		this.itemsMovedListCalled = false;
		this.testModel.addChangeListener(this.changeListener);
		this.testModel.testFireItemsMovedListEvent();
		this.verifyListMoveEvent(TARGET_INDEX, SOURCE_INDEX);
		assertTrue(this.itemsMovedListCalled);

		this.listEvent = null;
		this.itemsMovedListCalled = false;
		this.testModel.removeChangeListener(this.changeListener);
		this.testModel.testFireItemsMovedListEvent();
		assertNull(this.listEvent);
		assertFalse(this.itemsMovedListCalled);

		this.listEvent = null;
		this.itemsMovedListCalled = false;
		this.testModel.addListChangeListener(LIST_NAME, this.changeListener);
		this.testModel.testFireItemsMovedListEvent();
		this.verifyListMoveEvent(TARGET_INDEX, SOURCE_INDEX);
		assertTrue(this.itemsMovedListCalled);

		this.listEvent = null;
		this.itemsMovedListCalled = false;
		this.testModel.removeListChangeListener(LIST_NAME, this.changeListener);
		this.testModel.testFireItemsMovedListEvent();
		assertNull(this.listEvent);
		assertFalse(this.itemsMovedListCalled);
	}

	public void testFireItemsMovedListEventNoChange() {
		this.listEvent = null;
		this.itemsMovedListCalled = false;
		this.testModel.addChangeListener(this.changeListener);
		this.testModel.testFireItemsMovedListEventNoChange();
		assertNull(this.listEvent);
		assertFalse(this.itemsMovedListCalled);

		this.listEvent = null;
		this.itemsMovedListCalled = false;
		this.testModel.removeChangeListener(this.changeListener);
		this.testModel.testFireItemsMovedListEventNoChange();
		assertNull(this.listEvent);
		assertFalse(this.itemsMovedListCalled);

		this.listEvent = null;
		this.itemsMovedListCalled = false;
		this.testModel.addListChangeListener(LIST_NAME, this.changeListener);
		this.testModel.testFireItemsMovedListEventNoChange();
		assertNull(this.listEvent);
		assertFalse(this.itemsMovedListCalled);

		this.listEvent = null;
		this.itemsMovedListCalled = false;
		this.testModel.removeListChangeListener(LIST_NAME, this.changeListener);
		this.testModel.testFireItemsMovedListEventNoChange();
		assertNull(this.listEvent);
		assertFalse(this.itemsMovedListCalled);
	}

	public void testFireItemsMovedList() {
		this.listEvent = null;
		this.itemsMovedListCalled = false;
		this.testModel.addChangeListener(this.changeListener);
		this.testModel.testFireItemsMovedList();
		this.verifyListMoveEvent(TARGET_INDEX, SOURCE_INDEX);
		assertTrue(this.itemsMovedListCalled);

		this.listEvent = null;
		this.itemsMovedListCalled = false;
		this.testModel.removeChangeListener(this.changeListener);
		this.testModel.testFireItemsMovedList();
		assertNull(this.listEvent);
		assertFalse(this.itemsMovedListCalled);

		this.listEvent = null;
		this.itemsMovedListCalled = false;
		this.testModel.addListChangeListener(LIST_NAME, this.changeListener);
		this.testModel.testFireItemsMovedList();
		this.verifyListMoveEvent(TARGET_INDEX, SOURCE_INDEX);
		assertTrue(this.itemsMovedListCalled);

		this.listEvent = null;
		this.itemsMovedListCalled = false;
		this.testModel.removeListChangeListener(LIST_NAME, this.changeListener);
		this.testModel.testFireItemsMovedList();
		assertNull(this.listEvent);
		assertFalse(this.itemsMovedListCalled);
	}

	public void testFireItemsMovedListNoChange() {
		this.listEvent = null;
		this.itemsMovedListCalled = false;
		this.testModel.addChangeListener(this.changeListener);
		this.testModel.testFireItemsMovedListNoChange();
		assertNull(this.listEvent);
		assertFalse(this.itemsMovedListCalled);

		this.listEvent = null;
		this.itemsMovedListCalled = false;
		this.testModel.removeChangeListener(this.changeListener);
		this.testModel.testFireItemsMovedListNoChange();
		assertNull(this.listEvent);
		assertFalse(this.itemsMovedListCalled);

		this.listEvent = null;
		this.itemsMovedListCalled = false;
		this.testModel.addListChangeListener(LIST_NAME, this.changeListener);
		this.testModel.testFireItemsMovedListNoChange();
		assertNull(this.listEvent);
		assertFalse(this.itemsMovedListCalled);

		this.listEvent = null;
		this.itemsMovedListCalled = false;
		this.testModel.removeListChangeListener(LIST_NAME, this.changeListener);
		this.testModel.testFireItemsMovedListNoChange();
		assertNull(this.listEvent);
		assertFalse(this.itemsMovedListCalled);
	}

	public void testFireItemMovedList() {
		this.listEvent = null;
		this.itemsMovedListCalled = false;
		this.testModel.addChangeListener(this.changeListener);
		this.testModel.testFireItemMovedList();
		this.verifyListMoveEvent(TARGET_INDEX, SOURCE_INDEX);
		assertTrue(this.itemsMovedListCalled);

		this.listEvent = null;
		this.itemsMovedListCalled = false;
		this.testModel.removeChangeListener(this.changeListener);
		this.testModel.testFireItemMovedList();
		assertNull(this.listEvent);
		assertFalse(this.itemsMovedListCalled);

		this.listEvent = null;
		this.itemsMovedListCalled = false;
		this.testModel.addListChangeListener(LIST_NAME, this.changeListener);
		this.testModel.testFireItemMovedList();
		this.verifyListMoveEvent(TARGET_INDEX, SOURCE_INDEX);
		assertTrue(this.itemsMovedListCalled);

		this.listEvent = null;
		this.itemsMovedListCalled = false;
		this.testModel.removeListChangeListener(LIST_NAME, this.changeListener);
		this.testModel.testFireItemMovedList();
		assertNull(this.listEvent);
		assertFalse(this.itemsMovedListCalled);
	}

	public void testFireListClearedEvent() {
		this.listEvent = null;
		this.listClearedCalled = false;
		this.testModel.addChangeListener(this.changeListener);
		this.testModel.testFireListClearedEvent();
		this.verifyListClearEvent();
		assertTrue(this.listClearedCalled);

		this.listEvent = null;
		this.listClearedCalled = false;
		this.testModel.removeChangeListener(this.changeListener);
		this.testModel.testFireListClearedEvent();
		assertNull(this.listEvent);
		assertFalse(this.listClearedCalled);

		this.listEvent = null;
		this.listClearedCalled = false;
		this.testModel.addListChangeListener(LIST_NAME, this.changeListener);
		this.testModel.testFireListClearedEvent();
		this.verifyListClearEvent();
		assertTrue(this.listClearedCalled);

		this.listEvent = null;
		this.listClearedCalled = false;
		this.testModel.removeListChangeListener(LIST_NAME, this.changeListener);
		this.testModel.testFireListClearedEvent();
		assertNull(this.listEvent);
		assertFalse(this.listClearedCalled);
	}

	public void testFireListCleared() {
		this.listEvent = null;
		this.listClearedCalled = false;
		this.testModel.addChangeListener(this.changeListener);
		this.testModel.testFireListCleared();
		this.verifyListClearEvent();
		assertTrue(this.listClearedCalled);

		this.listEvent = null;
		this.listClearedCalled = false;
		this.testModel.removeChangeListener(this.changeListener);
		this.testModel.testFireListCleared();
		assertNull(this.listEvent);
		assertFalse(this.listClearedCalled);

		this.listEvent = null;
		this.listClearedCalled = false;
		this.testModel.addListChangeListener(LIST_NAME, this.changeListener);
		this.testModel.testFireListCleared();
		this.verifyListClearEvent();
		assertTrue(this.listClearedCalled);

		this.listEvent = null;
		this.listClearedCalled = false;
		this.testModel.removeListChangeListener(LIST_NAME, this.changeListener);
		this.testModel.testFireListCleared();
		assertNull(this.listEvent);
		assertFalse(this.listClearedCalled);
	}

	public void testFireListChangedEvent() {
		this.listEvent = null;
		this.listChangedCalled = false;
		this.testModel.addChangeListener(this.changeListener);
		this.testModel.testFireListChangedEvent();
		this.verifyListChangeEvent();
		assertTrue(this.listChangedCalled);

		this.listEvent = null;
		this.listChangedCalled = false;
		this.testModel.removeChangeListener(this.changeListener);
		this.testModel.testFireListChangedEvent();
		assertNull(this.listEvent);
		assertFalse(this.listChangedCalled);

		this.listEvent = null;
		this.listChangedCalled = false;
		this.testModel.addListChangeListener(LIST_NAME, this.changeListener);
		this.testModel.testFireListChangedEvent();
		this.verifyListChangeEvent();
		assertTrue(this.listChangedCalled);

		this.listEvent = null;
		this.listChangedCalled = false;
		this.testModel.removeListChangeListener(LIST_NAME, this.changeListener);
		this.testModel.testFireListChangedEvent();
		assertNull(this.listEvent);
		assertFalse(this.listChangedCalled);
	}

	public void testFireListChanged() {
		this.listEvent = null;
		this.listChangedCalled = false;
		this.testModel.addChangeListener(this.changeListener);
		this.testModel.testFireListChanged();
		this.verifyListChangeEvent();
		assertTrue(this.listChangedCalled);

		this.listEvent = null;
		this.listChangedCalled = false;
		this.testModel.removeChangeListener(this.changeListener);
		this.testModel.testFireListChanged();
		assertNull(this.listEvent);
		assertFalse(this.listChangedCalled);

		this.listEvent = null;
		this.listChangedCalled = false;
		this.testModel.addListChangeListener(LIST_NAME, this.changeListener);
		this.testModel.testFireListChanged();
		this.verifyListChangeEvent();
		assertTrue(this.listChangedCalled);

		this.listEvent = null;
		this.listChangedCalled = false;
		this.testModel.removeListChangeListener(LIST_NAME, this.changeListener);
		this.testModel.testFireListChanged();
		assertNull(this.listEvent);
		assertFalse(this.listChangedCalled);
	}

	public void testAddItemToListIndex() {
		this.listEvent = null;
		this.itemsAddedListCalled = false;
		this.testModel.addChangeListener(this.changeListener);
		this.testModel.testAddItemToListIndex();
		this.verifyListAddEvent(2, "joo");
		assertTrue(this.itemsAddedListCalled);

		this.listEvent = null;
		this.itemsAddedListCalled = false;
		this.testModel.removeChangeListener(this.changeListener);
		this.testModel.testAddItemToListIndex();
		assertNull(this.listEvent);
		assertFalse(this.itemsAddedListCalled);

		this.listEvent = null;
		this.itemsAddedListCalled = false;
		this.testModel.addListChangeListener(LIST_NAME, this.changeListener);
		this.testModel.testAddItemToListIndex();
		this.verifyListAddEvent(2, "joo");
		assertTrue(this.itemsAddedListCalled);

		this.listEvent = null;
		this.itemsAddedListCalled = false;
		this.testModel.removeListChangeListener(LIST_NAME, this.changeListener);
		this.testModel.testAddItemToListIndex();
		assertNull(this.listEvent);
		assertFalse(this.itemsAddedListCalled);
	}

	public void testAddItemToList() {
		this.listEvent = null;
		this.itemsAddedListCalled = false;
		this.testModel.addChangeListener(this.changeListener);
		this.testModel.testAddItemToList();
		this.verifyListAddEvent(3, "joo");
		assertTrue(this.itemsAddedListCalled);

		this.listEvent = null;
		this.itemsAddedListCalled = false;
		this.testModel.removeChangeListener(this.changeListener);
		this.testModel.testAddItemToList();
		assertNull(this.listEvent);
		assertFalse(this.itemsAddedListCalled);

		this.listEvent = null;
		this.itemsAddedListCalled = false;
		this.testModel.addListChangeListener(LIST_NAME, this.changeListener);
		this.testModel.testAddItemToList();
		this.verifyListAddEvent(3, "joo");
		assertTrue(this.itemsAddedListCalled);

		this.listEvent = null;
		this.itemsAddedListCalled = false;
		this.testModel.removeListChangeListener(LIST_NAME, this.changeListener);
		this.testModel.testAddItemToList();
		assertNull(this.listEvent);
		assertFalse(this.itemsAddedListCalled);
	}

	public void testAddItemsToListIndex() {
		this.listEvent = null;
		this.itemsAddedListCalled = false;
		this.testModel.addChangeListener(this.changeListener);
		this.testModel.testAddItemsToListIndex();
		this.verifyListAddEvent(2, "joo");
		assertTrue(this.itemsAddedListCalled);

		this.listEvent = null;
		this.itemsAddedListCalled = false;
		this.testModel.removeChangeListener(this.changeListener);
		this.testModel.testAddItemsToListIndex();
		assertNull(this.listEvent);
		assertFalse(this.itemsAddedListCalled);

		this.listEvent = null;
		this.itemsAddedListCalled = false;
		this.testModel.addListChangeListener(LIST_NAME, this.changeListener);
		this.testModel.testAddItemsToListIndex();
		this.verifyListAddEvent(2, "joo");
		assertTrue(this.itemsAddedListCalled);

		this.listEvent = null;
		this.itemsAddedListCalled = false;
		this.testModel.removeListChangeListener(LIST_NAME, this.changeListener);
		this.testModel.testAddItemsToListIndex();
		assertNull(this.listEvent);
		assertFalse(this.itemsAddedListCalled);
	}

	public void testAddItemsToListIndexNoChange() {
		this.listEvent = null;
		this.itemsAddedListCalled = false;
		this.testModel.addChangeListener(this.changeListener);
		this.testModel.testAddItemsToListIndexNoChange();
		assertNull(this.listEvent);
		assertFalse(this.itemsAddedListCalled);

		this.listEvent = null;
		this.itemsAddedListCalled = false;
		this.testModel.removeChangeListener(this.changeListener);
		this.testModel.testAddItemsToListIndexNoChange();
		assertNull(this.listEvent);
		assertFalse(this.itemsAddedListCalled);

		this.listEvent = null;
		this.itemsAddedListCalled = false;
		this.testModel.addListChangeListener(LIST_NAME, this.changeListener);
		this.testModel.testAddItemsToListIndexNoChange();
		assertNull(this.listEvent);
		assertFalse(this.itemsAddedListCalled);

		this.listEvent = null;
		this.itemsAddedListCalled = false;
		this.testModel.removeListChangeListener(LIST_NAME, this.changeListener);
		this.testModel.testAddItemsToListIndexNoChange();
		assertNull(this.listEvent);
		assertFalse(this.itemsAddedListCalled);
	}

	public void testAddItemsToList() {
		this.listEvent = null;
		this.itemsAddedListCalled = false;
		this.testModel.addChangeListener(this.changeListener);
		this.testModel.testAddItemsToList();
		this.verifyListAddEvent(3, "joo");
		assertTrue(this.itemsAddedListCalled);

		this.listEvent = null;
		this.itemsAddedListCalled = false;
		this.testModel.removeChangeListener(this.changeListener);
		this.testModel.testAddItemsToList();
		assertNull(this.listEvent);
		assertFalse(this.itemsAddedListCalled);

		this.listEvent = null;
		this.itemsAddedListCalled = false;
		this.testModel.addListChangeListener(LIST_NAME, this.changeListener);
		this.testModel.testAddItemsToList();
		this.verifyListAddEvent(3, "joo");
		assertTrue(this.itemsAddedListCalled);

		this.listEvent = null;
		this.itemsAddedListCalled = false;
		this.testModel.removeListChangeListener(LIST_NAME, this.changeListener);
		this.testModel.testAddItemsToList();
		assertNull(this.listEvent);
		assertFalse(this.itemsAddedListCalled);
	}

	public void testAddItemsToListNoChange() {
		this.listEvent = null;
		this.itemsAddedListCalled = false;
		this.testModel.addChangeListener(this.changeListener);
		this.testModel.testAddItemsToListNoChange();
		assertNull(this.listEvent);
		assertFalse(this.itemsAddedListCalled);

		this.listEvent = null;
		this.itemsAddedListCalled = false;
		this.testModel.removeChangeListener(this.changeListener);
		this.testModel.testAddItemsToListNoChange();
		assertNull(this.listEvent);
		assertFalse(this.itemsAddedListCalled);

		this.listEvent = null;
		this.itemsAddedListCalled = false;
		this.testModel.addListChangeListener(LIST_NAME, this.changeListener);
		this.testModel.testAddItemsToListNoChange();
		assertNull(this.listEvent);
		assertFalse(this.itemsAddedListCalled);

		this.listEvent = null;
		this.itemsAddedListCalled = false;
		this.testModel.removeListChangeListener(LIST_NAME, this.changeListener);
		this.testModel.testAddItemsToListNoChange();
		assertNull(this.listEvent);
		assertFalse(this.itemsAddedListCalled);
	}

	public void testRemoveItemFromListIndex() {
		this.listEvent = null;
		this.itemsRemovedListCalled = false;
		this.testModel.addChangeListener(this.changeListener);
		this.testModel.testRemoveItemFromListIndex();
		this.verifyListRemoveEvent(1, "bar");
		assertTrue(this.itemsRemovedListCalled);

		this.listEvent = null;
		this.itemsRemovedListCalled = false;
		this.testModel.removeChangeListener(this.changeListener);
		this.testModel.testRemoveItemFromListIndex();
		assertNull(this.listEvent);
		assertFalse(this.itemsRemovedListCalled);

		this.listEvent = null;
		this.itemsRemovedListCalled = false;
		this.testModel.addListChangeListener(LIST_NAME, this.changeListener);
		this.testModel.testRemoveItemFromListIndex();
		this.verifyListRemoveEvent(1, "bar");
		assertTrue(this.itemsRemovedListCalled);

		this.listEvent = null;
		this.itemsRemovedListCalled = false;
		this.testModel.removeListChangeListener(LIST_NAME, this.changeListener);
		this.testModel.testRemoveItemFromListIndex();
		assertNull(this.listEvent);
		assertFalse(this.itemsRemovedListCalled);
	}

	public void testRemoveItemFromList() {
		this.listEvent = null;
		this.itemsRemovedListCalled = false;
		this.testModel.addChangeListener(this.changeListener);
		this.testModel.testRemoveItemFromList();
		this.verifyListRemoveEvent(1, "bar");
		assertTrue(this.itemsRemovedListCalled);

		this.listEvent = null;
		this.itemsRemovedListCalled = false;
		this.testModel.removeChangeListener(this.changeListener);
		this.testModel.testRemoveItemFromList();
		assertNull(this.listEvent);
		assertFalse(this.itemsRemovedListCalled);

		this.listEvent = null;
		this.itemsRemovedListCalled = false;
		this.testModel.addListChangeListener(LIST_NAME, this.changeListener);
		this.testModel.testRemoveItemFromList();
		this.verifyListRemoveEvent(1, "bar");
		assertTrue(this.itemsRemovedListCalled);

		this.listEvent = null;
		this.itemsRemovedListCalled = false;
		this.testModel.removeListChangeListener(LIST_NAME, this.changeListener);
		this.testModel.testRemoveItemFromList();
		assertNull(this.listEvent);
		assertFalse(this.itemsRemovedListCalled);
	}

	public void testRemoveItemsFromListIndex() {
		this.listEvent = null;
		this.itemsRemovedListCalled = false;
		this.testModel.addChangeListener(this.changeListener);
		this.testModel.testRemoveItemsFromListIndex();
		this.verifyListRemoveEvent(1, "bar");
		assertTrue(this.itemsRemovedListCalled);

		this.listEvent = null;
		this.itemsRemovedListCalled = false;
		this.testModel.removeChangeListener(this.changeListener);
		this.testModel.testRemoveItemsFromListIndex();
		assertNull(this.listEvent);
		assertFalse(this.itemsRemovedListCalled);

		this.listEvent = null;
		this.itemsRemovedListCalled = false;
		this.testModel.addListChangeListener(LIST_NAME, this.changeListener);
		this.testModel.testRemoveItemsFromListIndex();
		this.verifyListRemoveEvent(1, "bar");
		assertTrue(this.itemsRemovedListCalled);

		this.listEvent = null;
		this.itemsRemovedListCalled = false;
		this.testModel.removeListChangeListener(LIST_NAME, this.changeListener);
		this.testModel.testRemoveItemsFromListIndex();
		assertNull(this.listEvent);
		assertFalse(this.itemsRemovedListCalled);
	}

	public void testRemoveItemsFromListIndexNoChange() {
		this.listEvent = null;
		this.itemsRemovedListCalled = false;
		this.testModel.addChangeListener(this.changeListener);
		this.testModel.testRemoveItemsFromListIndexNoChange();
		assertNull(this.listEvent);
		assertFalse(this.itemsRemovedListCalled);

		this.listEvent = null;
		this.itemsRemovedListCalled = false;
		this.testModel.removeChangeListener(this.changeListener);
		this.testModel.testRemoveItemsFromListIndexNoChange();
		assertNull(this.listEvent);
		assertFalse(this.itemsRemovedListCalled);

		this.listEvent = null;
		this.itemsRemovedListCalled = false;
		this.testModel.addListChangeListener(LIST_NAME, this.changeListener);
		this.testModel.testRemoveItemsFromListIndexNoChange();
		assertNull(this.listEvent);
		assertFalse(this.itemsRemovedListCalled);

		this.listEvent = null;
		this.itemsRemovedListCalled = false;
		this.testModel.removeListChangeListener(LIST_NAME, this.changeListener);
		this.testModel.testRemoveItemsFromListIndexNoChange();
		assertNull(this.listEvent);
		assertFalse(this.itemsRemovedListCalled);
	}

	public void testRemoveItemsFromList() {
		this.listEvent = null;
		this.itemsRemovedListCalled = false;
		this.testModel.addChangeListener(this.changeListener);
		this.testModel.testRemoveItemsFromList();
		this.verifyListRemoveEvent(1, "bar");
		assertTrue(this.itemsRemovedListCalled);

		this.listEvent = null;
		this.itemsRemovedListCalled = false;
		this.testModel.removeChangeListener(this.changeListener);
		this.testModel.testRemoveItemsFromList();
		assertNull(this.listEvent);
		assertFalse(this.itemsRemovedListCalled);

		this.listEvent = null;
		this.itemsRemovedListCalled = false;
		this.testModel.addListChangeListener(LIST_NAME, this.changeListener);
		this.testModel.testRemoveItemsFromList();
		this.verifyListRemoveEvent(1, "bar");
		assertTrue(this.itemsRemovedListCalled);

		this.listEvent = null;
		this.itemsRemovedListCalled = false;
		this.testModel.removeListChangeListener(LIST_NAME, this.changeListener);
		this.testModel.testRemoveItemsFromList();
		assertNull(this.listEvent);
		assertFalse(this.itemsRemovedListCalled);
	}

	public void testRemoveItemsFromListNoChange() {
		this.listEvent = null;
		this.itemsRemovedListCalled = false;
		this.testModel.addChangeListener(this.changeListener);
		this.testModel.testRemoveItemsFromListNoChange();
		assertNull(this.listEvent);
		assertFalse(this.itemsRemovedListCalled);

		this.listEvent = null;
		this.itemsRemovedListCalled = false;
		this.testModel.removeChangeListener(this.changeListener);
		this.testModel.testRemoveItemsFromListNoChange();
		assertNull(this.listEvent);
		assertFalse(this.itemsRemovedListCalled);

		this.listEvent = null;
		this.itemsRemovedListCalled = false;
		this.testModel.addListChangeListener(LIST_NAME, this.changeListener);
		this.testModel.testRemoveItemsFromListNoChange();
		assertNull(this.listEvent);
		assertFalse(this.itemsRemovedListCalled);

		this.listEvent = null;
		this.itemsRemovedListCalled = false;
		this.testModel.removeListChangeListener(LIST_NAME, this.changeListener);
		this.testModel.testRemoveItemsFromListNoChange();
		assertNull(this.listEvent);
		assertFalse(this.itemsRemovedListCalled);
	}

	public void testRetainItemsInList() {
		this.listEvent = null;
		this.itemsRemovedListCalled = false;
		this.testModel.addChangeListener(this.changeListener);
		this.testModel.testRetainItemsInList();
		this.verifyListRemoveEvent(0, "foo");
		assertTrue(this.itemsRemovedListCalled);

		this.listEvent = null;
		this.itemsRemovedListCalled = false;
		this.testModel.removeChangeListener(this.changeListener);
		this.testModel.testRetainItemsInList();
		assertNull(this.listEvent);
		assertFalse(this.itemsRemovedListCalled);

		this.listEvent = null;
		this.itemsRemovedListCalled = false;
		this.testModel.addListChangeListener(LIST_NAME, this.changeListener);
		this.testModel.testRetainItemsInList();
		this.verifyListRemoveEvent(0, "foo");
		assertTrue(this.itemsRemovedListCalled);

		this.listEvent = null;
		this.itemsRemovedListCalled = false;
		this.testModel.removeListChangeListener(LIST_NAME, this.changeListener);
		this.testModel.testRetainItemsInList();
		assertNull(this.listEvent);
		assertFalse(this.itemsRemovedListCalled);
	}

	public void testReplaceItemInList() {
		this.listEvent = null;
		this.itemsReplacedListCalled = false;
		this.testModel.addChangeListener(this.changeListener);
		this.testModel.testReplaceItemInList();
		this.verifyListReplaceEvent(1, "xxx", "bar");
		assertTrue(this.itemsReplacedListCalled);

		this.listEvent = null;
		this.itemsReplacedListCalled = false;
		this.testModel.removeChangeListener(this.changeListener);
		this.testModel.testReplaceItemInList();
		assertNull(this.listEvent);
		assertFalse(this.itemsReplacedListCalled);

		this.listEvent = null;
		this.itemsReplacedListCalled = false;
		this.testModel.addListChangeListener(LIST_NAME, this.changeListener);
		this.testModel.testReplaceItemInList();
		this.verifyListReplaceEvent(1, "xxx", "bar");
		assertTrue(this.itemsReplacedListCalled);

		this.listEvent = null;
		this.itemsReplacedListCalled = false;
		this.testModel.removeListChangeListener(LIST_NAME, this.changeListener);
		this.testModel.testReplaceItemInList();
		assertNull(this.listEvent);
		assertFalse(this.itemsReplacedListCalled);
	}

	public void testSetItemsInList() {
		this.listEvent = null;
		this.itemsReplacedListCalled = false;
		this.testModel.addChangeListener(this.changeListener);
		this.testModel.testSetItemsInList();
		this.verifyListReplaceEvent(1, "xxx", "bar");
		assertTrue(this.itemsReplacedListCalled);

		this.listEvent = null;
		this.itemsReplacedListCalled = false;
		this.testModel.removeChangeListener(this.changeListener);
		this.testModel.testSetItemsInList();
		assertNull(this.listEvent);
		assertFalse(this.itemsReplacedListCalled);

		this.listEvent = null;
		this.itemsReplacedListCalled = false;
		this.testModel.addListChangeListener(LIST_NAME, this.changeListener);
		this.testModel.testSetItemsInList();
		this.verifyListReplaceEvent(1, "xxx", "bar");
		assertTrue(this.itemsReplacedListCalled);

		this.listEvent = null;
		this.itemsReplacedListCalled = false;
		this.testModel.removeListChangeListener(LIST_NAME, this.changeListener);
		this.testModel.testSetItemsInList();
		assertNull(this.listEvent);
		assertFalse(this.itemsReplacedListCalled);
	}

	public void testMoveItemsInList() {
		this.listEvent = null;
		this.itemsMovedListCalled = false;
		this.testModel.addChangeListener(this.changeListener);
		this.testModel.testMoveItemsInList();
		this.verifyListMoveEvent(2, 4, 2);
		assertTrue(this.itemsMovedListCalled);

		this.listEvent = null;
		this.itemsMovedListCalled = false;
		this.testModel.removeChangeListener(this.changeListener);
		this.testModel.testMoveItemsInList();
		assertNull(this.listEvent);
		assertFalse(this.itemsMovedListCalled);

		this.listEvent = null;
		this.itemsMovedListCalled = false;
		this.testModel.addListChangeListener(LIST_NAME, this.changeListener);
		this.testModel.testMoveItemsInList();
		this.verifyListMoveEvent(2, 4, 2);
		assertTrue(this.itemsMovedListCalled);

		this.listEvent = null;
		this.itemsMovedListCalled = false;
		this.testModel.removeListChangeListener(LIST_NAME, this.changeListener);
		this.testModel.testMoveItemsInList();
		assertNull(this.listEvent);
		assertFalse(this.itemsMovedListCalled);
	}

	public void testClearList() {
		this.listEvent = null;
		this.listClearedCalled = false;
		this.testModel.addChangeListener(this.changeListener);
		this.testModel.testClearList();
		this.verifyListClearEvent();
		assertTrue(this.listClearedCalled);

		this.listEvent = null;
		this.listClearedCalled = false;
		this.testModel.removeChangeListener(this.changeListener);
		this.testModel.testClearList();
		assertNull(this.listEvent);
		assertFalse(this.listClearedCalled);

		this.listEvent = null;
		this.listClearedCalled = false;
		this.testModel.addListChangeListener(LIST_NAME, this.changeListener);
		this.testModel.testClearList();
		this.verifyListClearEvent();
		assertTrue(this.listClearedCalled);

		this.listEvent = null;
		this.listClearedCalled = false;
		this.testModel.removeListChangeListener(LIST_NAME, this.changeListener);
		this.testModel.testClearList();
		assertNull(this.listEvent);
		assertFalse(this.listClearedCalled);
	}

	public void testSynchronizeList() {
		this.listEvent = null;
		this.itemsReplacedListCalled = false;
		this.itemsRemovedListCalled = false;
		this.testModel.addChangeListener(this.changeListener);
		this.testModel.testSynchronizeList();
		assertNotNull(this.listEvent);
		assertTrue(this.itemsReplacedListCalled);
		assertTrue(this.itemsRemovedListCalled);

		this.listEvent = null;
		this.itemsReplacedListCalled = false;
		this.itemsRemovedListCalled = false;
		this.testModel.removeChangeListener(this.changeListener);
		this.testModel.testSynchronizeList();
		assertNull(this.listEvent);
		assertFalse(this.itemsReplacedListCalled);
		assertFalse(this.itemsRemovedListCalled);

		this.listEvent = null;
		this.itemsReplacedListCalled = false;
		this.itemsRemovedListCalled = false;
		this.testModel.addListChangeListener(LIST_NAME, this.changeListener);
		this.testModel.testSynchronizeList();
		assertNotNull(this.listEvent);
		assertTrue(this.itemsReplacedListCalled);
		assertTrue(this.itemsRemovedListCalled);

		this.listEvent = null;
		this.itemsReplacedListCalled = false;
		this.itemsRemovedListCalled = false;
		this.testModel.removeListChangeListener(LIST_NAME, this.changeListener);
		this.testModel.testSynchronizeList();
		assertNull(this.listEvent);
		assertFalse(this.itemsReplacedListCalled);
		assertFalse(this.itemsRemovedListCalled);
	}

	public void testHasAnyListChangeListeners() {
		assertTrue(this.testModel.hasNoListChangeListeners(LIST_NAME));
		this.testModel.addChangeListener(this.changeListener);
		assertTrue(this.testModel.hasAnyListChangeListeners(LIST_NAME));
		this.testModel.removeChangeListener(this.changeListener);
		assertTrue(this.testModel.hasNoListChangeListeners(LIST_NAME));

		assertTrue(this.testModel.hasNoListChangeListeners(LIST_NAME));
		this.testModel.addListChangeListener(LIST_NAME, this.changeListener);
		assertTrue(this.testModel.hasAnyListChangeListeners(LIST_NAME));
		this.testModel.removeListChangeListener(LIST_NAME, this.changeListener);
		assertTrue(this.testModel.hasNoListChangeListeners(LIST_NAME));
	}

	public void testAddNullListListener() {
		boolean exCaught = false;
		try {
			this.testModel.addListChangeListener("foo", null);
		} catch (NullPointerException ex) {
			exCaught = true;
		}
		assertTrue(exCaught);
	}

	public void testRemoveBogusListListener() {
		boolean exCaught = false;
		try {
			this.testModel.removeListChangeListener("foo", this.changeListener);
		} catch (IllegalArgumentException ex) {
			exCaught = true;
		}
		assertTrue(exCaught);

		this.testModel.addPropertyChangeListener("foo", this.changeListener);
		exCaught = false;
		try {
			this.testModel.removeListChangeListener("foo", this.changeListener);
		} catch (IllegalArgumentException ex) {
			exCaught = true;
		}
		assertTrue(exCaught);

		this.testModel.addListChangeListener("foo", this.changeListener);
		exCaught = false;
		try {
			this.testModel.removeListChangeListener("foo", new ListChangeAdapter());
		} catch (IllegalArgumentException ex) {
			exCaught = true;
		}
		assertTrue(exCaught);

		exCaught = false;
		try {
			this.testModel.removeListChangeListener("foo", new ListChangeAdapter());
		} catch (IllegalArgumentException ex) {
			exCaught = true;
		}
		assertTrue(exCaught);
	}

	private void verifyListAddEvent(int index, Object item) {
		assertNotNull(this.listEvent);
		assertEquals(this.testModel, this.listEvent.getSource());
		assertEquals(LIST_NAME, this.listEvent.getListName());
		assertEquals(index, ((ListAddEvent) this.listEvent).getIndex());
		assertEquals(item, ((ListAddEvent) this.listEvent).getItems().iterator().next());
	}

	private void verifyListRemoveEvent(int index, Object item) {
		assertNotNull(this.listEvent);
		assertEquals(this.testModel, this.listEvent.getSource());
		assertEquals(LIST_NAME, this.listEvent.getListName());
		assertEquals(index, ((ListRemoveEvent) this.listEvent).getIndex());
		assertEquals(item, ((ListRemoveEvent) this.listEvent).getItems().iterator().next());
	}

	private void verifyListReplaceEvent(int index, Object newItem, Object oldItem) {
		assertNotNull(this.listEvent);
		assertEquals(this.testModel, this.listEvent.getSource());
		assertEquals(LIST_NAME, this.listEvent.getListName());
		assertEquals(index, ((ListReplaceEvent) this.listEvent).getIndex());
		assertEquals(newItem, ((ListReplaceEvent) this.listEvent).getNewItems().iterator().next());
		assertEquals(oldItem, ((ListReplaceEvent) this.listEvent).getOldItems().iterator().next());
	}

	private void verifyListMoveEvent(int targetIndex, int sourceIndex) {
		this.verifyListMoveEvent(targetIndex, sourceIndex, 1);
	}

	private void verifyListMoveEvent(int targetIndex, int sourceIndex, int length) {
		assertNotNull(this.listEvent);
		assertEquals(this.testModel, this.listEvent.getSource());
		assertEquals(LIST_NAME, this.listEvent.getListName());
		assertEquals(targetIndex, ((ListMoveEvent) this.listEvent).getTargetIndex());
		assertEquals(sourceIndex, ((ListMoveEvent) this.listEvent).getSourceIndex());
		assertEquals(length, ((ListMoveEvent) this.listEvent).getLength());
	}

	private void verifyListClearEvent() {
		assertNotNull(this.listEvent);
		assertEquals(this.testModel, this.listEvent.getSource());
		assertEquals(LIST_NAME, this.listEvent.getListName());
		assertEquals(ListClearEvent.class, this.listEvent.getClass());
	}

	private void verifyListChangeEvent() {
		assertNotNull(this.listEvent);
		assertEquals(this.testModel, this.listEvent.getSource());
		assertEquals(LIST_NAME, this.listEvent.getListName());
		assertEquals(ListChangeEvent.class, this.listEvent.getClass());
	}


	// ********** tree change tests **********

	public void testFireNodeAddedTree() {
		this.treeEvent = null;
		this.nodeAddedCalled = false;
		this.testModel.addChangeListener(this.changeListener);
		this.testModel.testFireNodeAddedTree();
		this.verifyTreeEvent(OBJECT_PATH);
		assertTrue(this.nodeAddedCalled);

		this.treeEvent = null;
		this.nodeAddedCalled = false;
		this.testModel.removeChangeListener(this.changeListener);
		this.testModel.testFireNodeAddedTree();
		assertNull(this.treeEvent);
		assertFalse(this.nodeAddedCalled);

		this.treeEvent = null;
		this.nodeAddedCalled = false;
		this.testModel.addTreeChangeListener(TREE_NAME, this.changeListener);
		this.testModel.testFireNodeAddedTree();
		this.verifyTreeEvent(OBJECT_PATH);
		assertTrue(this.nodeAddedCalled);

		this.treeEvent = null;
		this.nodeAddedCalled = false;
		this.testModel.removeTreeChangeListener(TREE_NAME, this.changeListener);
		this.testModel.testFireNodeAddedTree();
		assertNull(this.treeEvent);
		assertFalse(this.nodeAddedCalled);
	}

	public void testFireNodeAddedTreeEvent() {
		this.treeEvent = null;
		this.nodeAddedCalled = false;
		this.testModel.addChangeListener(this.changeListener);
		this.testModel.testFireNodeAddedTreeEvent();
		this.verifyTreeEvent(OBJECT_PATH);
		assertTrue(this.nodeAddedCalled);

		this.treeEvent = null;
		this.nodeAddedCalled = false;
		this.testModel.removeChangeListener(this.changeListener);
		this.testModel.testFireNodeAddedTreeEvent();
		assertNull(this.treeEvent);
		assertFalse(this.nodeAddedCalled);

		this.treeEvent = null;
		this.nodeAddedCalled = false;
		this.testModel.addTreeChangeListener(TREE_NAME, this.changeListener);
		this.testModel.testFireNodeAddedTreeEvent();
		this.verifyTreeEvent(OBJECT_PATH);
		assertTrue(this.nodeAddedCalled);

		this.treeEvent = null;
		this.nodeAddedCalled = false;
		this.testModel.removeTreeChangeListener(TREE_NAME, this.changeListener);
		this.testModel.testFireNodeAddedTreeEvent();
		assertNull(this.treeEvent);
		assertFalse(this.nodeAddedCalled);
	}

	public void testFireNodeRemovedTreeEvent() {
		this.treeEvent = null;
		this.nodeRemovedCalled = false;
		this.testModel.addChangeListener(this.changeListener);
		this.testModel.testFireNodeRemovedTreeEvent();
		this.verifyTreeEvent(OBJECT_PATH);
		assertTrue(this.nodeRemovedCalled);

		this.treeEvent = null;
		this.nodeRemovedCalled = false;
		this.testModel.removeChangeListener(this.changeListener);
		this.testModel.testFireNodeRemovedTreeEvent();
		assertNull(this.treeEvent);
		assertFalse(this.nodeRemovedCalled);

		this.treeEvent = null;
		this.nodeRemovedCalled = false;
		this.testModel.addTreeChangeListener(TREE_NAME, this.changeListener);
		this.testModel.testFireNodeRemovedTreeEvent();
		this.verifyTreeEvent(OBJECT_PATH);
		assertTrue(this.nodeRemovedCalled);

		this.treeEvent = null;
		this.nodeRemovedCalled = false;
		this.testModel.removeTreeChangeListener(TREE_NAME, this.changeListener);
		this.testModel.testFireNodeRemovedTreeEvent();
		assertNull(this.treeEvent);
		assertFalse(this.nodeRemovedCalled);
	}

	public void testFireNodeRemovedTree() {
		this.treeEvent = null;
		this.nodeRemovedCalled = false;
		this.testModel.addChangeListener(this.changeListener);
		this.testModel.testFireNodeRemovedTree();
		this.verifyTreeEvent(OBJECT_PATH);
		assertTrue(this.nodeRemovedCalled);

		this.treeEvent = null;
		this.nodeRemovedCalled = false;
		this.testModel.removeChangeListener(this.changeListener);
		this.testModel.testFireNodeRemovedTree();
		assertNull(this.treeEvent);
		assertFalse(this.nodeRemovedCalled);

		this.treeEvent = null;
		this.nodeRemovedCalled = false;
		this.testModel.addTreeChangeListener(TREE_NAME, this.changeListener);
		this.testModel.testFireNodeRemovedTree();
		this.verifyTreeEvent(OBJECT_PATH);
		assertTrue(this.nodeRemovedCalled);

		this.treeEvent = null;
		this.nodeRemovedCalled = false;
		this.testModel.removeTreeChangeListener(TREE_NAME, this.changeListener);
		this.testModel.testFireNodeRemovedTree();
		assertNull(this.treeEvent);
		assertFalse(this.nodeRemovedCalled);
	}

	public void testFireTreeClearedEvent() {
		this.treeEvent = null;
		this.treeClearedCalled = false;
		this.testModel.addChangeListener(this.changeListener);
		this.testModel.testFireTreeClearedEvent();
		this.verifyTreeEvent(null);
		assertTrue(this.treeClearedCalled);

		this.treeEvent = null;
		this.treeClearedCalled = false;
		this.testModel.removeChangeListener(this.changeListener);
		this.testModel.testFireTreeClearedEvent();
		assertNull(this.treeEvent);
		assertFalse(this.treeClearedCalled);

		this.treeEvent = null;
		this.treeClearedCalled = false;
		this.testModel.addTreeChangeListener(TREE_NAME, this.changeListener);
		this.testModel.testFireTreeClearedEvent();
		this.verifyTreeEvent(null);
		assertTrue(this.treeClearedCalled);

		this.treeEvent = null;
		this.treeClearedCalled = false;
		this.testModel.removeTreeChangeListener(TREE_NAME, this.changeListener);
		this.testModel.testFireTreeClearedEvent();
		assertNull(this.treeEvent);
		assertFalse(this.treeClearedCalled);
	}

	public void testFireTreeCleared() {
		this.treeEvent = null;
		this.treeClearedCalled = false;
		this.testModel.addChangeListener(this.changeListener);
		this.testModel.testFireTreeCleared();
		this.verifyTreeEvent(null);
		assertTrue(this.treeClearedCalled);

		this.treeEvent = null;
		this.treeClearedCalled = false;
		this.testModel.removeChangeListener(this.changeListener);
		this.testModel.testFireTreeCleared();
		assertNull(this.treeEvent);
		assertFalse(this.treeClearedCalled);

		this.treeEvent = null;
		this.treeClearedCalled = false;
		this.testModel.addTreeChangeListener(TREE_NAME, this.changeListener);
		this.testModel.testFireTreeCleared();
		this.verifyTreeEvent(null);
		assertTrue(this.treeClearedCalled);

		this.treeEvent = null;
		this.treeClearedCalled = false;
		this.testModel.removeTreeChangeListener(TREE_NAME, this.changeListener);
		this.testModel.testFireTreeCleared();
		assertNull(this.treeEvent);
		assertFalse(this.treeClearedCalled);
	}

	public void testFireTreeChangedEvent() {
		this.treeEvent = null;
		this.treeChangedCalled = false;
		this.testModel.addChangeListener(this.changeListener);
		this.testModel.testFireTreeChangedEvent();
		this.verifyTreeEvent(null);
		assertTrue(this.treeChangedCalled);

		this.treeEvent = null;
		this.treeChangedCalled = false;
		this.testModel.removeChangeListener(this.changeListener);
		this.testModel.testFireTreeChangedEvent();
		assertNull(this.treeEvent);
		assertFalse(this.treeChangedCalled);

		this.treeEvent = null;
		this.treeChangedCalled = false;
		this.testModel.addTreeChangeListener(TREE_NAME, this.changeListener);
		this.testModel.testFireTreeChangedEvent();
		this.verifyTreeEvent(null);
		assertTrue(this.treeChangedCalled);

		this.treeEvent = null;
		this.treeChangedCalled = false;
		this.testModel.removeTreeChangeListener(TREE_NAME, this.changeListener);
		this.testModel.testFireTreeChangedEvent();
		assertNull(this.treeEvent);
		assertFalse(this.treeChangedCalled);
	}

	public void testFireTreeChanged() {
		this.treeEvent = null;
		this.treeChangedCalled = false;
		this.testModel.addChangeListener(this.changeListener);
		this.testModel.testFireTreeChanged();
		this.verifyTreeEvent(null);
		assertTrue(this.treeChangedCalled);

		this.treeEvent = null;
		this.treeChangedCalled = false;
		this.testModel.removeChangeListener(this.changeListener);
		this.testModel.testFireTreeChanged();
		assertNull(this.treeEvent);
		assertFalse(this.treeChangedCalled);

		this.treeEvent = null;
		this.treeChangedCalled = false;
		this.testModel.addTreeChangeListener(TREE_NAME, this.changeListener);
		this.testModel.testFireTreeChanged();
		this.verifyTreeEvent(null);
		assertTrue(this.treeChangedCalled);

		this.treeEvent = null;
		this.treeChangedCalled = false;
		this.testModel.removeTreeChangeListener(TREE_NAME, this.changeListener);
		this.testModel.testFireTreeChanged();
		assertNull(this.treeEvent);
		assertFalse(this.treeChangedCalled);
	}

	public void testHasAnyTreeChangeListeners() {
		assertTrue(this.testModel.hasNoTreeChangeListeners(TREE_NAME));
		this.testModel.addChangeListener(this.changeListener);
		assertTrue(this.testModel.hasAnyTreeChangeListeners(TREE_NAME));
		this.testModel.removeChangeListener(this.changeListener);
		assertTrue(this.testModel.hasNoTreeChangeListeners(TREE_NAME));

		assertTrue(this.testModel.hasNoTreeChangeListeners(TREE_NAME));
		this.testModel.addTreeChangeListener(TREE_NAME, this.changeListener);
		assertTrue(this.testModel.hasAnyTreeChangeListeners(TREE_NAME));
		this.testModel.removeTreeChangeListener(TREE_NAME, this.changeListener);
		assertTrue(this.testModel.hasNoTreeChangeListeners(TREE_NAME));
	}

	public void testAddNullTreeListener() {
		boolean exCaught = false;
		try {
			this.testModel.addTreeChangeListener("foo", null);
		} catch (NullPointerException ex) {
			exCaught = true;
		}
		assertTrue(exCaught);
	}

	public void testRemoveBogusTreeListener() {
		boolean exCaught = false;
		try {
			this.testModel.removeTreeChangeListener("foo", this.changeListener);
		} catch (IllegalArgumentException ex) {
			exCaught = true;
		}
		assertTrue(exCaught);

		this.testModel.addPropertyChangeListener("foo", this.changeListener);
		exCaught = false;
		try {
			this.testModel.removeTreeChangeListener("foo", this.changeListener);
		} catch (IllegalArgumentException ex) {
			exCaught = true;
		}
		assertTrue(exCaught);

		this.testModel.addTreeChangeListener("foo", this.changeListener);
		exCaught = false;
		try {
			this.testModel.removeTreeChangeListener("foo", new TreeChangeAdapter());
		} catch (IllegalArgumentException ex) {
			exCaught = true;
		}
		assertTrue(exCaught);

		exCaught = false;
		try {
			this.testModel.removeTreeChangeListener("foo", new TreeChangeAdapter());
		} catch (IllegalArgumentException ex) {
			exCaught = true;
		}
		assertTrue(exCaught);
	}

	private void verifyTreeEvent(List<?> path) {
		assertNotNull(this.treeEvent);
		assertEquals(this.testModel, this.treeEvent.getSource());
		assertEquals(TREE_NAME, this.treeEvent.getTreeName());
		assertEquals(path, this.getListPath());
	}

	private List<?> getListPath() {
		Iterable<?> iterable = this.getPath();
		return (iterable == null)  ? null : CollectionTools.list(iterable);
	}

	private Iterable<?> getPath() {
		if (this.treeEvent instanceof TreeAddEvent) {
			return ((TreeAddEvent) this.treeEvent).getPath();
		}
		if (this.treeEvent instanceof TreeRemoveEvent) {
			return ((TreeRemoveEvent) this.treeEvent).getPath();
		}
		return null;
	}
	


	// ********** convenience method tests **********

	public void testElementsAreEqual() {
		Collection<String> c1 = new ArrayList<String>();
		c1.add("foo");
		c1.add("bar");
		c1.add("baz");
		Collection<String> c2 = new ArrayList<String>();
		c2.add("foo");
		c2.add("bar");
		c2.add("baz");
		assertTrue(this.testModel.testElementsAreEqual(c1, c2));
	}

	public void testElementsAreDifferent() {
		Collection<String> c1 = new ArrayList<String>();
		c1.add("foo");
		c1.add("bar");
		c1.add("baz");
		Collection<String> c2 = new ArrayList<String>();
		c2.add("baz");
		c2.add("bar");
		c2.add("foo");
		assertTrue(this.testModel.testElementsAreDifferent(c1, c2));
	}


	// ********** AbstractModel tests **********

	public void testAbstractModelValuesAreEqual1() {
		assertTrue(this.testModel.testValuesAreEqual(null, null));
	}

	public void testAbstractModelValuesAreEqual2() {
		assertTrue(this.testModel.testValuesAreEqual("foo", "foo"));
	}

	public void testAbstractModelValuesAreEqual3() {
		assertFalse(this.testModel.testValuesAreEqual("foo", null));
	}

	public void testAbstractModelValuesAreEqual4() {
		assertFalse(this.testModel.testValuesAreEqual(null, "foo"));
	}

	public void testAbstractModelValuesAreEqual5() {
		assertFalse(this.testModel.testValuesAreEqual("bar", "foo"));
	}

	public void testAbstractModelValuesAreDifferent1() {
		assertFalse(this.testModel.testValuesAreDifferent(null, null));
	}

	public void testAbstractModelValuesAreDifferent2() {
		assertFalse(this.testModel.testValuesAreDifferent("foo", "foo"));
	}

	public void testAbstractModelValuesAreDifferent3() {
		assertTrue(this.testModel.testValuesAreDifferent("foo", null));
	}

	public void testAbstractModelValuesAreDifferent4() {
		assertTrue(this.testModel.testValuesAreDifferent(null, "foo"));
	}

	public void testAbstractModelValuesAreDifferent5() {
		assertTrue(this.testModel.testValuesAreDifferent("bar", "foo"));
	}

	public void testAbstractModelAttributeValueHasChanged1() {
		assertFalse(this.testModel.testAttributeValueHasChanged(null, null));
	}

	public void testAbstractModelAttributeValueHasChanged2() {
		assertFalse(this.testModel.testAttributeValueHasChanged("foo", "foo"));
	}

	public void testAbstractModelAttributeValueHasChanged3() {
		assertTrue(this.testModel.testAttributeValueHasChanged("foo", null));
	}

	public void testAbstractModelAttributeValueHasChanged4() {
		assertTrue(this.testModel.testAttributeValueHasChanged(null, "foo"));
	}

	public void testAbstractModelAttributeValueHasChanged5() {
		assertTrue(this.testModel.testAttributeValueHasChanged("bar", "foo"));
	}

	public void testAbstractModelAttributeValueHasNotChanged1() {
		assertTrue(this.testModel.testAttributeValueHasNotChanged(null, null));
	}

	public void testAbstractModelAttributeValueHasNotChanged2() {
		assertTrue(this.testModel.testAttributeValueHasNotChanged("foo", "foo"));
	}

	public void testAbstractModelAttributeValueHasNotChanged3() {
		assertFalse(this.testModel.testAttributeValueHasNotChanged("foo", null));
	}

	public void testAbstractModelAttributeValueHasNotChanged4() {
		assertFalse(this.testModel.testAttributeValueHasNotChanged(null, "foo"));
	}

	public void testAbstractModelAttributeValueHasNotChanged5() {
		assertFalse(this.testModel.testAttributeValueHasNotChanged("bar", "foo"));
	}

	public void testAbstractModelClone() {
		assertFalse(this.testModel.hasAnyPropertyChangeListeners(PROPERTY_NAME));
		this.testModel.addChangeListener(this.changeListener);
		assertTrue(this.testModel.hasAnyPropertyChangeListeners(PROPERTY_NAME));

		// verify that the clone does not have any listeners
		TestModel clone = this.testModel.clone();
		assertFalse(clone.hasAnyPropertyChangeListeners(PROPERTY_NAME));
		clone.addChangeListener(this.changeListener);
		assertTrue(clone.hasAnyPropertyChangeListeners(PROPERTY_NAME));
		// check original
		assertTrue(this.testModel.hasAnyPropertyChangeListeners(PROPERTY_NAME));

		// now test events fired by original
		this.propertyChangeEvent = null;
		this.propertyChangeCalled = false;
		this.testModel.testFirePropertyChangedObjectObject();
		this.verifyPropertyChangeEvent(OLD_OBJECT_VALUE, NEW_OBJECT_VALUE);
		assertTrue(this.propertyChangeCalled);

		// now test events fired by clone
		this.propertyChangeEvent = null;
		this.propertyChangeCalled = false;
		clone.testFirePropertyChangedObjectObject();
		this.verifyPropertyChangeEvent(clone, OLD_OBJECT_VALUE, NEW_OBJECT_VALUE);
		assertTrue(this.propertyChangeCalled);
	}

	public void testAbstractModelToString() {
		assertTrue(this.testModel.toString().contains('(' + TEST_TO_STRING + ')'));
	}


	// ********** listener implementations **********

	class Adapter implements ChangeListener {
		public void stateChanged(StateChangeEvent e) {
			ChangeSupportTests.this.stateChangedCalled = true;
			ChangeSupportTests.this.stateChangeEvent = e;
		}
	
		public void propertyChanged(PropertyChangeEvent e) {
			ChangeSupportTests.this.propertyChangeCalled = true;
			ChangeSupportTests.this.propertyChangeEvent = e;
		}
	
	
		public void itemsAdded(CollectionAddEvent e) {
			ChangeSupportTests.this.itemsAddedCollectionCalled = true;
			ChangeSupportTests.this.collectionEvent = e;
		}
		public void itemsRemoved(CollectionRemoveEvent e) {
			ChangeSupportTests.this.itemsRemovedCollectionCalled = true;
			ChangeSupportTests.this.collectionEvent = e;
		}
		public void collectionCleared(CollectionClearEvent e) {
			ChangeSupportTests.this.collectionClearedCalled = true;
			ChangeSupportTests.this.collectionEvent = e;
		}
		public void collectionChanged(CollectionChangeEvent e) {
			ChangeSupportTests.this.collectionChangedCalled = true;
			ChangeSupportTests.this.collectionEvent = e;
		}
	
		public void itemsAdded(ListAddEvent e) {
			ChangeSupportTests.this.itemsAddedListCalled = true;
			ChangeSupportTests.this.listEvent = e;
		}
		public void itemsRemoved(ListRemoveEvent e) {
			ChangeSupportTests.this.itemsRemovedListCalled = true;
			ChangeSupportTests.this.listEvent = e;
		}
		public void itemsReplaced(ListReplaceEvent e) {
			ChangeSupportTests.this.itemsReplacedListCalled = true;
			ChangeSupportTests.this.listEvent = e;
		}
		public void itemsMoved(ListMoveEvent e) {
			ChangeSupportTests.this.itemsMovedListCalled = true;
			ChangeSupportTests.this.listEvent = e;
		}
		public void listCleared(ListClearEvent e) {
			ChangeSupportTests.this.listClearedCalled = true;
			ChangeSupportTests.this.listEvent = e;
		}
		public void listChanged(ListChangeEvent e) {
			ChangeSupportTests.this.listChangedCalled = true;
			ChangeSupportTests.this.listEvent = e;
		}
	
		public void nodeAdded(TreeAddEvent e) {
			ChangeSupportTests.this.nodeAddedCalled = true;
			ChangeSupportTests.this.treeEvent = e;
		}
		public void nodeRemoved(TreeRemoveEvent e) {
			ChangeSupportTests.this.nodeRemovedCalled = true;
			ChangeSupportTests.this.treeEvent = e;
		}
		public void treeCleared(TreeClearEvent e) {
			ChangeSupportTests.this.treeClearedCalled = true;
			ChangeSupportTests.this.treeEvent = e;
		}
		public void treeChanged(TreeChangeEvent e) {
			ChangeSupportTests.this.treeChangedCalled = true;
			ChangeSupportTests.this.treeEvent = e;
		}
	}


	// ********** inner class **********

	private static class TestModel extends AbstractModel implements Cloneable {
		TestModel() {
			super();
		}

		// ***** state
		public void testFireStateChange() {
			this.fireStateChanged();
		}

		// ***** property
		public void testFirePropertyChangedEvent() {
			this.firePropertyChanged(new PropertyChangeEvent(this, PROPERTY_NAME, OLD_OBJECT_VALUE, NEW_OBJECT_VALUE));
		}

		public void testFirePropertyChangedEventNoChange() {
			this.firePropertyChanged(new PropertyChangeEvent(this, PROPERTY_NAME, OLD_OBJECT_VALUE, OLD_OBJECT_VALUE));
		}

		public void testFirePropertyChangedObjectObject() {
			this.firePropertyChanged(PROPERTY_NAME, OLD_OBJECT_VALUE, NEW_OBJECT_VALUE);
		}

		public void testFirePropertyChangedObjectObjectNoChange() {
			this.firePropertyChanged(PROPERTY_NAME, OLD_OBJECT_VALUE, OLD_OBJECT_VALUE);
		}

		public void testFirePropertyChangedObject() {
			this.firePropertyChanged(PROPERTY_NAME, NEW_OBJECT_VALUE);
		}

		public void testFirePropertyChangedObjectNoChange() {
			this.firePropertyChanged(PROPERTY_NAME, null);
		}

		public void testFirePropertyChangedIntInt() {
			this.firePropertyChanged(PROPERTY_NAME, OLD_INT_VALUE.intValue(), NEW_INT_VALUE.intValue());
		}

		public void testFirePropertyChangedIntIntNoChange() {
			this.firePropertyChanged(PROPERTY_NAME, OLD_INT_VALUE.intValue(), OLD_INT_VALUE.intValue());
		}

		public void testFirePropertyChangedBooleanBoolean() {
			this.firePropertyChanged(PROPERTY_NAME, OLD_BOOLEAN_VALUE.booleanValue(), NEW_BOOLEAN_VALUE.booleanValue());
		}

		public void testFirePropertyChangedBooleanBooleanNoChange() {
			this.firePropertyChanged(PROPERTY_NAME, OLD_BOOLEAN_VALUE.booleanValue(), OLD_BOOLEAN_VALUE.booleanValue());
		}

		// ***** collection
		public void testFireItemsAddedCollectionEvent() {
			this.fireItemsAdded(new CollectionAddEvent(this, COLLECTION_NAME, ADDED_OBJECT_VALUE));
		}

		public void testFireItemsAddedCollectionEventNoChange() {
			this.fireItemsAdded(new CollectionAddEvent(this, COLLECTION_NAME, Collections.emptySet()));
		}

		public void testFireItemsAddedCollection() {
			this.fireItemsAdded(COLLECTION_NAME, Collections.singleton(ADDED_OBJECT_VALUE));
		}

		public void testFireItemsAddedCollectionNoChange() {
			this.fireItemsAdded(COLLECTION_NAME, Collections.emptySet());
		}

		public void testFireItemAddedCollection() {
			this.fireItemAdded(COLLECTION_NAME, ADDED_OBJECT_VALUE);
		}

		public void testFireItemsRemovedCollectionEvent() {
			this.fireItemsRemoved(new CollectionRemoveEvent(this, COLLECTION_NAME, REMOVED_OBJECT_VALUE));
		}

		public void testFireItemsRemovedCollectionEventNoChange() {
			this.fireItemsRemoved(new CollectionRemoveEvent(this, COLLECTION_NAME, Collections.emptySet()));
		}

		public void testFireItemsRemovedCollection() {
			this.fireItemsRemoved(COLLECTION_NAME, Collections.singleton(REMOVED_OBJECT_VALUE));
		}

		public void testFireItemsRemovedCollectionNoChange() {
			this.fireItemsRemoved(COLLECTION_NAME, Collections.emptySet());
		}

		public void testFireItemRemovedCollection() {
			this.fireItemRemoved(COLLECTION_NAME, REMOVED_OBJECT_VALUE);
		}

		public void testFireCollectionCleared() {
			this.fireCollectionCleared(COLLECTION_NAME);
		}

		public void testFireCollectionChangedEvent() {
			this.fireCollectionChanged(new CollectionChangeEvent(this, COLLECTION_NAME, Collections.emptySet()));
		}

		public void testFireCollectionChanged() {
			this.fireCollectionChanged(COLLECTION_NAME, Collections.emptySet());
		}

		public boolean testAddItemToCollection() {
			return this.addItemToCollection(ADDED_OBJECT_VALUE, new ArrayList<Object>(), COLLECTION_NAME);
		}

		public boolean testAddItemToCollectionNoChange() {
			Collection<Object> collection = new HashSet<Object>();
			collection.add(ADDED_OBJECT_VALUE);
			return this.addItemToCollection(ADDED_OBJECT_VALUE, collection, COLLECTION_NAME);
		}

		public boolean testAddItemsToCollection() {
			return this.addItemsToCollection(Collections.singleton(ADDED_OBJECT_VALUE), new ArrayList<Object>(), COLLECTION_NAME);
		}

		public boolean testAddItemsToCollectionNoChange() {
			Collection<Object> collection = new HashSet<Object>();
			collection.add(ADDED_OBJECT_VALUE);
			return this.addItemsToCollection(Collections.singleton(ADDED_OBJECT_VALUE), collection, COLLECTION_NAME);
		}

		public boolean testAddItemsToCollectionMixed() {
			Collection<Object> collection = new HashSet<Object>();
			collection.add(ADDED_OBJECT_VALUE);
			return this.addItemsToCollection(new Object[] {ADDED_OBJECT_VALUE, ADDED_OBJECT_VALUE_2}, collection, COLLECTION_NAME);
		}

		public boolean testRemoveItemFromCollection() {
			Collection<Object> collection = new HashSet<Object>();
			collection.add(REMOVED_OBJECT_VALUE);
			return this.removeItemFromCollection(REMOVED_OBJECT_VALUE, collection, COLLECTION_NAME);
		}

		public boolean testRemoveItemFromCollectionNoChange() {
			Collection<Object> collection = new HashSet<Object>();
			collection.add(REMOVED_OBJECT_VALUE);
			return this.removeItemFromCollection("foo", collection, COLLECTION_NAME);
		}

		public boolean testRemoveItemsFromCollection() {
			Collection<Object> collection = new HashSet<Object>();
			collection.add(REMOVED_OBJECT_VALUE);
			collection.add("foo");
			collection.add("bar");
			return this.removeItemsFromCollection(new Object[] {"foo", "bar", REMOVED_OBJECT_VALUE}, collection, COLLECTION_NAME);
		}

		public boolean testRemoveItemsFromCollectionNoChange1() {
			Collection<Object> collection = new HashSet<Object>();
			collection.add(REMOVED_OBJECT_VALUE);
			return this.removeItemsFromCollection(Collections.emptySet(), collection, COLLECTION_NAME);
		}

		public boolean testRemoveItemsFromCollectionNoChange2() {
			Collection<Object> collection = new HashSet<Object>();
			return this.removeItemsFromCollection(Collections.singleton("foo"), collection, COLLECTION_NAME);
		}

		public boolean testRemoveItemsFromCollectionNoChange3() {
			Collection<Object> collection = new HashSet<Object>();
			collection.add(REMOVED_OBJECT_VALUE);
			return this.removeItemsFromCollection(Collections.singleton("foo"), collection, COLLECTION_NAME);
		}

		public boolean testRetainItemsInCollection1() {
			Collection<Object> collection = new HashSet<Object>();
			collection.add(REMOVED_OBJECT_VALUE);
			collection.add("foo");
			collection.add("bar");
			return this.retainItemsInCollection(new Object[] {"foo", "bar"}, collection, COLLECTION_NAME);
		}

		public boolean testRetainItemsInCollection2() {
			Collection<Object> collection = new HashSet<Object>();
			collection.add(REMOVED_OBJECT_VALUE);
			collection.add("foo");
			collection.add("bar");
			return this.retainItemsInCollection(Collections.emptySet(), collection, COLLECTION_NAME);
		}

		public boolean testRetainItemsInCollectionNoChange1() {
			Collection<Object> collection = new HashSet<Object>();
			return this.retainItemsInCollection(new Object[] {"foo", "bar"}, collection, COLLECTION_NAME);
		}

		public boolean testRetainItemsInCollectionNoChange2() {
			Collection<Object> collection = new HashSet<Object>();
			collection.add(REMOVED_OBJECT_VALUE);
			collection.add("foo");
			collection.add("bar");
			return this.retainItemsInCollection(new Object[] {"foo", "bar", REMOVED_OBJECT_VALUE}, collection, COLLECTION_NAME);
		}

		public boolean testClearCollection() {
			Collection<Object> collection = new HashSet<Object>();
			collection.add(REMOVED_OBJECT_VALUE);
			collection.add("foo");
			collection.add("bar");
			return this.clearCollection(collection, COLLECTION_NAME);
		}

		public boolean testClearCollectionNoChange() {
			Collection<Object> collection = new HashSet<Object>();
			return this.clearCollection(collection, COLLECTION_NAME);
		}

		public boolean testSynchronizeCollection1() {
			Collection<Object> collection = new HashSet<Object>();
			collection.add("foo");
			collection.add("bar");
			collection.add("baz");
			Collection<Object> newCollection = new HashSet<Object>();
			newCollection.add("joo");
			newCollection.add("jar");
			newCollection.add("baz");
			boolean result = this.synchronizeCollection(newCollection, collection, COLLECTION_NAME);
			assertEquals(newCollection, collection);
			return result;
		}

		public boolean testSynchronizeCollection2() {
			Collection<Object> collection = new HashSet<Object>();
			collection.add("foo");
			collection.add("bar");
			collection.add("baz");
			Collection<Object> newCollection = new HashSet<Object>();
			boolean result = this.synchronizeCollection(newCollection, collection, COLLECTION_NAME);
			assertEquals(newCollection, collection);
			return result;
		}

		public boolean testSynchronizeCollection3() {
			Collection<Object> collection = new HashSet<Object>();
			Collection<Object> newCollection = new HashSet<Object>();
			newCollection.add("joo");
			newCollection.add("jar");
			newCollection.add("baz");
			boolean result = this.synchronizeCollection(newCollection, collection, COLLECTION_NAME);
			assertEquals(newCollection, collection);
			return result;
		}

		// ***** list
		public void testFireItemsAddedListEvent() {
			this.fireItemsAdded(new ListAddEvent(this, LIST_NAME, ADD_INDEX, ADDED_OBJECT_VALUE));
		}

		public void testFireItemsAddedListEventNoChange() {
			this.fireItemsAdded(new ListAddEvent(this, LIST_NAME, ADD_INDEX, Collections.emptyList()));
		}

		public void testFireItemsAddedList() {
			this.fireItemsAdded(LIST_NAME, ADD_INDEX, Collections.singletonList(ADDED_OBJECT_VALUE));
		}

		public void testFireItemsAddedListNoChange() {
			this.fireItemsAdded(LIST_NAME, ADD_INDEX, Collections.emptyList());
		}

		public void testFireItemAddedList() {
			this.fireItemAdded(LIST_NAME, ADD_INDEX, ADDED_OBJECT_VALUE);
		}

		public void testFireItemsRemovedListEvent() {
			this.fireItemsRemoved(new ListRemoveEvent(this, LIST_NAME, REMOVE_INDEX, REMOVED_OBJECT_VALUE));
		}

		public void testFireItemsRemovedListEventNoChange() {
			this.fireItemsRemoved(new ListRemoveEvent(this, LIST_NAME, REMOVE_INDEX, Collections.emptyList()));
		}

		public void testFireItemsRemovedList() {
			this.fireItemsRemoved(LIST_NAME, REMOVE_INDEX, Collections.singletonList(REMOVED_OBJECT_VALUE));
		}

		public void testFireItemsRemovedListNoChange() {
			this.fireItemsRemoved(LIST_NAME, REMOVE_INDEX, Collections.emptyList());
		}

		public void testFireItemRemovedList() {
			this.fireItemRemoved(LIST_NAME, REMOVE_INDEX, REMOVED_OBJECT_VALUE);
		}

		public void testFireItemsReplacedListEvent() {
			this.fireItemsReplaced(new ListReplaceEvent(this, LIST_NAME, REPLACE_INDEX, ADDED_OBJECT_VALUE, REMOVED_OBJECT_VALUE));
		}

		public void testFireItemsReplacedListEventNoChange() {
			this.fireItemsReplaced(new ListReplaceEvent(this, LIST_NAME, REPLACE_INDEX, Collections.emptyList(), Collections.emptyList()));
		}

		public void testFireItemsReplacedList() {
			this.fireItemsReplaced(LIST_NAME, REPLACE_INDEX, Collections.singletonList(ADDED_OBJECT_VALUE), Collections.singletonList(REMOVED_OBJECT_VALUE));
		}

		public void testFireItemsReplacedListNoChange() {
			this.fireItemsReplaced(LIST_NAME, REPLACE_INDEX, Collections.emptyList(), Collections.emptyList());
		}

		public void testFireItemReplacedList() {
			this.fireItemReplaced(LIST_NAME, REPLACE_INDEX, ADDED_OBJECT_VALUE, REMOVED_OBJECT_VALUE);
		}

		public void testFireItemsMovedListEvent() {
			this.fireItemsMoved(new ListMoveEvent(this, LIST_NAME, TARGET_INDEX, SOURCE_INDEX, 1));
		}

		public void testFireItemsMovedListEventNoChange() {
			this.fireItemsMoved(new ListMoveEvent(this, LIST_NAME, SOURCE_INDEX, SOURCE_INDEX, 1));
		}

		public void testFireItemsMovedList() {
			this.fireItemsMoved(LIST_NAME, TARGET_INDEX, SOURCE_INDEX, 1);
		}

		public void testFireItemsMovedListNoChange() {
			this.fireItemsMoved(LIST_NAME, SOURCE_INDEX, SOURCE_INDEX, 1);
		}

		public void testFireItemMovedList() {
			this.fireItemMoved(LIST_NAME, TARGET_INDEX, SOURCE_INDEX);
		}

		public void testFireListClearedEvent() {
			this.fireListCleared(new ListClearEvent(this, LIST_NAME));
		}

		public void testFireListCleared() {
			this.fireListCleared(LIST_NAME);
		}

		public void testFireListChangedEvent() {
			this.fireListChanged(new ListChangeEvent(this, LIST_NAME, Collections.emptyList()));
		}

		public void testFireListChanged() {
			this.fireListChanged(LIST_NAME, Collections.emptyList());
		}

		public void testAddItemToListIndex() {
			List<String> list = new ArrayList<String>();
			list.add("foo");
			list.add("bar");
			list.add("baz");
			this.addItemToList(2, "joo", list, LIST_NAME);
		}

		public void testAddItemToList() {
			List<String> list = new ArrayList<String>();
			list.add("foo");
			list.add("bar");
			list.add("baz");
			this.addItemToList("joo", list, LIST_NAME);
		}

		public void testAddItemsToListIndex() {
			List<String> list = new ArrayList<String>();
			list.add("foo");
			list.add("bar");
			list.add("baz");
			this.addItemsToList(2, Collections.singletonList("joo"), list, LIST_NAME);
		}

		public void testAddItemsToListIndexNoChange() {
			List<String> list = new ArrayList<String>();
			list.add("foo");
			list.add("bar");
			list.add("baz");
			this.addItemsToList(2, Collections.<String>emptyList(), list, LIST_NAME);
		}

		public void testAddItemsToList() {
			List<String> list = new ArrayList<String>();
			list.add("foo");
			list.add("bar");
			list.add("baz");
			this.addItemsToList(Collections.singletonList("joo"), list, LIST_NAME);
		}

		public void testAddItemsToListNoChange() {
			List<String> list = new ArrayList<String>();
			list.add("foo");
			list.add("bar");
			list.add("baz");
			this.addItemsToList(Collections.<String>emptyList(), list, LIST_NAME);
		}

		public void testRemoveItemFromListIndex() {
			List<String> list = new ArrayList<String>();
			list.add("foo");
			list.add("bar");
			list.add("baz");
			this.removeItemFromList(1, list, LIST_NAME);
		}

		public void testRemoveItemFromList() {
			List<String> list = new ArrayList<String>();
			list.add("foo");
			list.add("bar");
			list.add("baz");
			this.removeItemFromList("bar", list, LIST_NAME);
		}

		public void testRemoveItemsFromListIndex() {
			List<String> list = new ArrayList<String>();
			list.add("foo");
			list.add("bar");
			list.add("baz");
			this.removeItemsFromList(1, 1, list, LIST_NAME);
		}

		public void testRemoveItemsFromListIndexNoChange() {
			List<String> list = new ArrayList<String>();
			list.add("foo");
			list.add("bar");
			list.add("baz");
			this.removeItemsFromList(2, 0, list, LIST_NAME);
		}

		public void testRemoveItemsFromList() {
			List<String> list = new ArrayList<String>();
			list.add("foo");
			list.add("bar");
			list.add("baz");
			this.removeItemsFromList(Collections.singletonList("bar"), list, LIST_NAME);
		}

		public void testRemoveItemsFromListNoChange() {
			List<String> list = new ArrayList<String>();
			list.add("foo");
			list.add("bar");
			list.add("baz");
			this.addItemsToList(Collections.<String>emptyList(), list, LIST_NAME);
		}

		public void testRetainItemsInList() {
			List<String> list = new ArrayList<String>();
			list.add("foo");
			list.add("bar");
			list.add("baz");
			this.retainItemsInList(new String[] {"bar", "baz"}, list, LIST_NAME);
		}

		public void testReplaceItemInList() {
			List<String> list = new ArrayList<String>();
			list.add("foo");
			list.add("bar");
			list.add("baz");
			this.replaceItemInList("bar", "xxx", list, LIST_NAME);
		}

		public void testSetItemsInList() {
			List<String> list = new ArrayList<String>();
			list.add("foo");
			list.add("bar");
			list.add("baz");
			this.setItemsInList(1, new String[] {"xxx"}, list, LIST_NAME);
		}

		public void testMoveItemsInList() {
			List<String> list = new ArrayList<String>();
			list.add("foo");
			list.add("bar");
			list.add("baz");
			list.add("xxx");
			list.add("yyy");
			list.add("zzz");
			this.moveItemsInList(2, 4, 2, list, LIST_NAME);
		}

		public void testClearList() {
			List<String> list = new ArrayList<String>();
			list.add("foo");
			list.add("bar");
			list.add("baz");
			this.clearList(list, LIST_NAME);
		}

		public void testSynchronizeList() {
			List<String> oldList = new ArrayList<String>();
			oldList.add("foo");
			oldList.add("bar");
			oldList.add("baz");
			oldList.add("xxx");
			oldList.add("yyy");
			oldList.add("zzz");
			List<String> newList = new ArrayList<String>();
			newList.add("foo");
			newList.add("ppp");
			newList.add("baz");
			newList.add("xxx");
			newList.add("qqq");
			this.synchronizeList(newList, oldList, LIST_NAME);
			assertEquals(newList, oldList);
		}

		// ***** tree
		public void testFireNodeAddedTreeEvent() {
			this.fireNodeAdded(new TreeAddEvent(this, TREE_NAME, OBJECT_PATH));
		}

		public void testFireNodeAddedTree() {
			this.fireNodeAdded(TREE_NAME, OBJECT_PATH);
		}

		public void testFireNodeRemovedTreeEvent() {
			this.fireNodeRemoved(new TreeRemoveEvent(this, TREE_NAME, OBJECT_PATH));
		}

		public void testFireNodeRemovedTree() {
			this.fireNodeRemoved(TREE_NAME, OBJECT_PATH);
		}

		public void testFireTreeClearedEvent() {
			this.fireTreeCleared(new TreeClearEvent(this, TREE_NAME));
		}

		public void testFireTreeCleared() {
			this.fireTreeCleared(TREE_NAME);
		}

		public void testFireTreeChangedEvent() {
			this.fireTreeChanged(new TreeChangeEvent(this, TREE_NAME, OBJECT_PATH));
		}

		public void testFireTreeChanged() {
			this.fireTreeChanged(TREE_NAME, OBJECT_PATH);
		}

		public boolean testAttributeValueHasChanged(Object value1, Object value2) {
			return this.attributeValueHasChanged(value1, value2);
		}

		public boolean testAttributeValueHasNotChanged(Object value1, Object value2) {
			return this.attributeValueHasNotChanged(value1, value2);
		}

		// ***** misc
		@Override
		public TestModel clone() {
			try {
				return (TestModel) super.clone();
			} catch (CloneNotSupportedException ex) {
				throw new InternalError();
			}
		}

		public boolean testValuesAreDifferent(Object value1, Object value2) {
			return this.valuesAreDifferent(value1, value2);
		}

		public boolean testValuesAreEqual(Object value1, Object value2) {
			return this.valuesAreEqual(value1, value2);
		}

		public boolean testElementsAreDifferent(Iterable<?> iterable1, Iterable<?> iterable2) {
			return this.getChangeSupport().elementsAreDifferent(iterable1, iterable2);
		}

		public boolean testElementsAreEqual(Iterable<?> iterable1, Iterable<?> iterable2) {
			return this.getChangeSupport().elementsAreEqual(iterable1, iterable2);
		}

		@Override
		public void toString(StringBuilder sb) {
			sb.append(TEST_TO_STRING);
		}

	}


	// ********** serialization test **********
	public void testSerialization() throws java.io.IOException, ClassNotFoundException {
		if (Tools.jvmIsSun()) {
			// This test doesn't pass in the Eclipse build environment (Linux/IBM JVM) for some reason
			this.verifySerialization();
		}
	}

	private void verifySerialization() throws java.io.IOException, ClassNotFoundException {
		LocalModel model1 = new LocalModel();
		Foo foo1 = new Foo();
		Bar bar1 = new Bar();
		Joo joo1 = new Joo();
		Jar jar1 = new Jar();
		model1.addStateChangeListener(foo1);
		model1.addStateChangeListener(bar1);
		model1.addListChangeListener("foo", joo1);
		model1.addListChangeListener("foo", jar1);

		Iterable<EventListener> listeners1 = this.getListeners(model1, StateChangeListener.class, null);
		Object[] listenersArray1 = ArrayTools.array(listeners1);
		assertEquals(2, listenersArray1.length);
		// the order of these could change...
		assertEquals(Foo.class, listenersArray1[0].getClass());
		assertEquals(Bar.class, listenersArray1[1].getClass());

		listeners1 = this.getListeners(model1, ListChangeListener.class, "foo");
		listenersArray1 = ArrayTools.array(listeners1);
		assertEquals(2, listenersArray1.length);
		// the order of these could change...
		assertEquals(Joo.class, listenersArray1[0].getClass());
		assertEquals(Jar.class, listenersArray1[1].getClass());

		LocalModel model2 = TestTools.serialize(model1);

		Iterable<EventListener> listeners2 = this.getListeners(model2, StateChangeListener.class, null);
		Object[] listenersArray2 = ArrayTools.array(listeners2);
		assertEquals(1, listenersArray2.length);
		assertEquals(Foo.class, listenersArray2[0].getClass());

		listeners2 = this.getListeners(model2, ListChangeListener.class, "foo");
		listenersArray2 = ArrayTools.array(listeners2);
		assertEquals(1, listenersArray2.length);
		assertEquals(Joo.class, listenersArray2[0].getClass());
	}

	private Iterable<EventListener> getListeners(LocalModel model, Class<? extends EventListener> listenerClass, String aspectName) {
		return this.getListenerList(model, listenerClass, aspectName).getListeners();
	}

	@SuppressWarnings("unchecked")
	private ListenerList<EventListener> getListenerList(LocalModel model, Class<? extends EventListener> listenerClass, String aspectName) {
		ChangeSupport changeSupport = (ChangeSupport) ReflectionTools.getFieldValue(model, "changeSupport");
		return (ListenerList<EventListener>) ReflectionTools.executeMethod(changeSupport, "getListenerList_", new Class<?>[] {Class.class, String.class}, new Object[] {listenerClass, aspectName});
	}

	// we have to manually handle 'changeSupport' since AbstractModel is not Serializable
	private static class LocalModel extends AbstractModel implements Serializable {
		LocalModel() {
			super();
		}
		private synchronized void writeObject(ObjectOutputStream s) throws IOException {
			s.defaultWriteObject();
			s.writeObject(this.changeSupport);
	    }
		private void readObject(ObjectInputStream s) throws ClassNotFoundException, IOException {
			s.defaultReadObject();
			this.changeSupport = (ChangeSupport) s.readObject();
		}
	}

	private static class Foo implements Serializable, StateChangeListener {
		Foo() {
			super();
		}
		public void stateChanged(StateChangeEvent event) {
			// do nothing
		}
	}

	private static class Bar implements StateChangeListener {
		Bar() {
			super();
		}
		public void stateChanged(StateChangeEvent event) {
			// do nothing
		}
	}

	private static class Joo extends ListChangeAdapter implements Serializable {
		Joo() {
			super();
		}
	}

	private static class Jar extends ListChangeAdapter {
		Jar() {
			super();
		}
	}


	// ********** bug(?) test **********

	private static final String ISE_MESSAGE = "this object is no longer listening to localA";

	/**
	 * Test the following situation:
	 * 	- both B and C are listening to A
	 * 	- C is also listening to B
	 * 	- when B receives an event from A, it will fire an event to C
	 * 	- when C receives an event from B, it will STOP listening to A
	 * 	- the event from B to C may be preceded or followed (depending on
	 * 		the hash positions of listeners) by an event from A to C:
	 * 		- if the A to C event comes first, no problem
	 * 		- but if the A to B event comes first, the A to C event should NOT happen
	 */
	public void testIndirectRemoveStateListener() {
		this.verifyIndirectRemoveListener(
			new NotifyCommand() {
				public void notifyListeners(LocalA localA) {
					localA.notifyStateListeners();
				}
			}
		);
	}

	public void testIndirectRemovePropertyListener() {
		this.verifyIndirectRemoveListener(
			new NotifyCommand() {
				public void notifyListeners(LocalA localA) {
					localA.notifyPropertyListeners();
				}
			}
		);
	}

	public void testIndirectRemoveCollectionListener() {
		this.verifyIndirectRemoveListener(
			new NotifyCommand() {
				public void notifyListeners(LocalA localA) {
					localA.notifyCollectionListeners();
				}
			}
		);
	}

	public void testIndirectRemoveListListener() {
		this.verifyIndirectRemoveListener(
			new NotifyCommand() {
				public void notifyListeners(LocalA localA) {
					localA.notifyListListeners();
				}
			}
		);
	}

	public void testIndirectRemoveTreeListener() {
		this.verifyIndirectRemoveListener(
			new NotifyCommand() {
				public void notifyListeners(LocalA localA) {
					localA.notifyTreeListeners();
				}
			}
		);
	}

	public void verifyIndirectRemoveListener(NotifyCommand command) {
		LocalA localA = new LocalA();
		LocalB localB = new LocalB(localA);

		// build a bunch of LocalCs so at least one of them is notified AFTER the LocalB;
		// using 1000 seemed to fail very consistently before ChangeSupport was fixed
		LocalC[] localCs = new LocalC[1000];
		for (int i = localCs.length; i-- > 0; ) {
			localCs[i] = new LocalC(localA, localB);
		}

		boolean exCaught = false;
		try {
			command.notifyListeners(localA);
		} catch (IllegalStateException ex) {
			if (ex.getMessage() == ISE_MESSAGE) {
				exCaught = true;
			} else {
				throw ex;
			}
		}
		assertFalse(exCaught);

		for (int i = localCs.length; i-- > 0; ) {
			assertFalse(localCs[i].isListeningToLocalA());
		}
	}

	private interface NotifyCommand {
		void notifyListeners(LocalA localA);
	}

	/**
	 * This object simply fires a state change event. Both LocalB and LocalC
	 * will be listeners.
	 */
	private static class LocalA extends AbstractModel {
		LocalA() {
			super();
		}
		void notifyStateListeners() {
			this.fireStateChanged();
		}
		void notifyPropertyListeners() {
			this.firePropertyChanged("foo", 1, 2);
		}
		void notifyCollectionListeners() {
			this.fireCollectionChanged("foo", Collections.emptySet());
		}
		void notifyListListeners() {
			this.fireListChanged("foo", Collections.emptyList());
		}
		void notifyTreeListeners() {
			this.fireTreeChanged("foo", Collections.emptySet());
		}
	}

	/**
	 * This object will fire state change events whenever it receives
	 * a state change event from localA.
	 */
	private static class LocalB
		extends AbstractModel
		implements ChangeListener
	{
		LocalB(LocalA localA) {
			super();
			localA.addChangeListener(this);
		}

		public void stateChanged(StateChangeEvent e) {
			this.fireStateChanged();
		}

		public void propertyChanged(PropertyChangeEvent evt) {
			this.firePropertyChanged("bar", 1, 2);
		}

		public void collectionChanged(CollectionChangeEvent e) {
			this.fireCollectionChanged("bar", Collections.emptySet());
		}
		public void collectionCleared(CollectionClearEvent e) {/*ignore*/}
		public void itemsAdded(CollectionAddEvent e) {/*ignore*/}
		public void itemsRemoved(CollectionRemoveEvent e) {/*ignore*/}

		public void listChanged(ListChangeEvent e) {
			this.fireListChanged("bar", Collections.emptyList());
		}
		public void listCleared(ListClearEvent e) {/*ignore*/}
		public void itemsAdded(ListAddEvent e) {/*ignore*/}
		public void itemsRemoved(ListRemoveEvent e) {/*ignore*/}
		public void itemsReplaced(ListReplaceEvent e) {/*ignore*/}
		public void itemsMoved(ListMoveEvent e) {/*ignore*/}

		public void treeChanged(TreeChangeEvent e) {
			this.fireTreeChanged("bar", Collections.emptySet());
		}
		public void treeCleared(TreeClearEvent e) {/*ignore*/}
		public void nodeAdded(TreeAddEvent e) {/*ignore*/}
		public void nodeRemoved(TreeRemoveEvent e) {/*ignore*/}

	}

	/**
	 * This object will listen to two other objects, localA and localB.
	 * If this object receives notification from localB, it will stop listening to
	 * localA. If this object receives notification from localA, it will check to
	 * see whether it still listening to localA. If this object is no longer
	 * listening to localA, it will complain about receiving the event and
	 * throw an exception.
	 */
	private static class LocalC
		extends AbstractModel
		implements ChangeListener
	{
		private LocalA localA;
		private LocalB localB;
		private boolean listeningToLocalA;

		LocalC(LocalA localA, LocalB localB) {
			super();
			this.localA = localA;
			this.localB = localB;

			localA.addChangeListener(this);
			this.listeningToLocalA = true;

			localB.addChangeListener(this);
		}
		boolean isListeningToLocalA() {
			return this.listeningToLocalA;
		}

		public void stateChanged(StateChangeEvent e) {
			Object source = e.getSource();
			if (source == this.localA) {
				if ( ! this.listeningToLocalA) {
					throw new IllegalStateException(ISE_MESSAGE);
				}
			} else if (source == this.localB) {
				this.localA.removeChangeListener(this);
				this.listeningToLocalA = false;
			} else {
				throw new IllegalStateException("bogus event source: " + source);
			}
		}

		public void propertyChanged(PropertyChangeEvent e) {
			Object source = e.getSource();
			if (source == this.localA) {
				if ( ! this.listeningToLocalA) {
					throw new IllegalStateException(ISE_MESSAGE);
				}
			} else if (source == this.localB) {
				this.localA.removeChangeListener(this);
				this.listeningToLocalA = false;
			} else {
				throw new IllegalStateException("bogus event source: " + source);
			}
		}

		public void collectionChanged(CollectionChangeEvent e) {
			Object source = e.getSource();
			if (source == this.localA) {
				if ( ! this.listeningToLocalA) {
					throw new IllegalStateException(ISE_MESSAGE);
				}
			} else if (source == this.localB) {
				this.localA.removeChangeListener(this);
				this.listeningToLocalA = false;
			} else {
				throw new IllegalStateException("bogus event source: " + source);
			}
		}
		public void collectionCleared(CollectionClearEvent e) {/*ignore*/}
		public void itemsAdded(CollectionAddEvent e) {/*ignore*/}
		public void itemsRemoved(CollectionRemoveEvent e) {/*ignore*/}

		public void listChanged(ListChangeEvent e) {
			Object source = e.getSource();
			if (source == this.localA) {
				if ( ! this.listeningToLocalA) {
					throw new IllegalStateException(ISE_MESSAGE);
				}
			} else if (source == this.localB) {
				this.localA.removeChangeListener(this);
				this.listeningToLocalA = false;
			} else {
				throw new IllegalStateException("bogus event source: " + source);
			}
		}
		public void listCleared(ListClearEvent e) {/*ignore*/}
		public void itemsAdded(ListAddEvent e) {/*ignore*/}
		public void itemsRemoved(ListRemoveEvent e) {/*ignore*/}
		public void itemsReplaced(ListReplaceEvent e) {/*ignore*/}
		public void itemsMoved(ListMoveEvent e) {/*ignore*/}

		public void treeChanged(TreeChangeEvent e) {
			Object source = e.getSource();
			if (source == this.localA) {
				if ( ! this.listeningToLocalA) {
					throw new IllegalStateException(ISE_MESSAGE);
				}
			} else if (source == this.localB) {
				this.localA.removeChangeListener(this);
				this.listeningToLocalA = false;
			} else {
				throw new IllegalStateException("bogus event source: " + source);
			}
		}
		public void treeCleared(TreeClearEvent e) {/*ignore*/}
		public void nodeAdded(TreeAddEvent e) {/*ignore*/}
		public void nodeRemoved(TreeRemoveEvent e) {/*ignore*/}

	}

}
