Skip to main content
aboutsummaryrefslogblamecommitdiffstats
blob: 2286225afa3e0d59cd01d874e7a411b9b11ea95e (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
                                                                                
                                                        












                                                                                



                                                                       





























































































































































                                                                                                                                                                             


                                                                             




                                                                        


                                                                             






                                                                                     
/*******************************************************************************
 * Copyright (c) 2007, 2008 Oracle. All rights reserved.
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v1.0, which accompanies this distribution
 * and is available at http://www.eclipse.org/legal/epl-v10.html.
 * 
 * Contributors:
 *     Oracle - initial API and implementation
 ******************************************************************************/
package org.eclipse.jpt.utility.tests.internal.model.listener;

import java.lang.reflect.Method;

import org.eclipse.jpt.utility.internal.ClassTools;
import org.eclipse.jpt.utility.internal.model.AbstractModel;
import org.eclipse.jpt.utility.model.event.PropertyChangeEvent;
import org.eclipse.jpt.utility.model.listener.PropertyChangeListener;
import org.eclipse.jpt.utility.model.listener.ReflectiveChangeListener;
import org.eclipse.jpt.utility.model.listener.StateChangeListener;

import junit.framework.TestCase;

public class ReflectivePropertyChangeListenerTests extends TestCase {
	
	public ReflectivePropertyChangeListenerTests(String name) {
		super(name);
	}

	public void testZeroArgument() {
		TestModel testModel = new TestModel(7);
		Target target = new Target(testModel, TestModel.VALUE_PROPERTY, 7, 99);
		testModel.addPropertyChangeListener(ReflectiveChangeListener.buildPropertyChangeListener(target, "propertyChangedZeroArgument"));
		testModel.setValue(99);
		assertTrue(target.zeroArgumentFlag);
		assertFalse(target.singleArgumentFlag);
	}

	public void testZeroArgumentNamedProperty() {
		TestModel testModel = new TestModel(7);
		Target target = new Target(testModel, TestModel.VALUE_PROPERTY, 7, 99);
		testModel.addPropertyChangeListener(TestModel.VALUE_PROPERTY, ReflectiveChangeListener.buildPropertyChangeListener(target, "propertyChangedZeroArgument"));
		testModel.setValue(99);
		assertTrue(target.zeroArgumentFlag);
		assertFalse(target.singleArgumentFlag);
	}

	public void testSingleArgument() {
		TestModel testModel = new TestModel(7);
		Target target = new Target(testModel, TestModel.VALUE_PROPERTY, 7, 99);
		testModel.addPropertyChangeListener(ReflectiveChangeListener.buildPropertyChangeListener(target, "propertyChangedSingleArgument"));
		testModel.setValue(99);
		assertFalse(target.zeroArgumentFlag);
		assertTrue(target.singleArgumentFlag);
	}

	/**
	 * test method that has more general method parameter type
	 */
	public void testSingleArgument2() throws Exception {
		TestModel testModel = new TestModel(7);
		Target target = new Target(testModel, TestModel.VALUE_PROPERTY, 7, 99);
		Method method = ClassTools.method(target, "propertyChangedSingleArgument2", new Class[] {Object.class});
		testModel.addPropertyChangeListener(ReflectiveChangeListener.buildPropertyChangeListener(target, method));
		testModel.setValue(99);
		assertFalse(target.zeroArgumentFlag);
		assertTrue(target.singleArgumentFlag);
	}

	public void testSingleArgumentNamedProperty() {
		TestModel testModel = new TestModel(7);
		Target target = new Target(testModel, TestModel.VALUE_PROPERTY, 7, 99);
		testModel.addPropertyChangeListener(TestModel.VALUE_PROPERTY, ReflectiveChangeListener.buildPropertyChangeListener(target, "propertyChangedSingleArgument"));
		testModel.setValue(99);
		assertFalse(target.zeroArgumentFlag);
		assertTrue(target.singleArgumentFlag);
	}

	/**
	 * test method that has more general method parameter type
	 */
	public void testSingleArgumentNamedProperty2() throws Exception {
		TestModel testModel = new TestModel(7);
		Target target = new Target(testModel, TestModel.VALUE_PROPERTY, 7, 99);
		Method method = ClassTools.method(target, "propertyChangedSingleArgument2", new Class[] {Object.class});
		testModel.addPropertyChangeListener(TestModel.VALUE_PROPERTY, ReflectiveChangeListener.buildPropertyChangeListener(target, method));
		testModel.setValue(99);
		assertFalse(target.zeroArgumentFlag);
		assertTrue(target.singleArgumentFlag);
	}

	public void testListenerMismatch() {
		TestModel testModel = new TestModel(7);
		Target target = new Target(testModel, TestModel.VALUE_PROPERTY, 7, 99);
		// build a PROPERTY change listener and hack it so we
		// can add it as a STATE change listener
		Object listener = ReflectiveChangeListener.buildPropertyChangeListener(target, "propertyChangedSingleArgument");
		testModel.addStateChangeListener((StateChangeListener) listener);

		boolean exCaught = false;
		try {
			testModel.setValue(99);
			fail("listener mismatch: " + listener);
		} catch (IllegalArgumentException ex) {
			exCaught = true;
		}
		assertTrue(exCaught);
	}

	public void testBogusDoubleArgument1() {
		TestModel testModel = new TestModel(7);
		Target target = new Target(testModel, TestModel.VALUE_PROPERTY, 7, 99);
		boolean exCaught = false;
		try {
			PropertyChangeListener listener = ReflectiveChangeListener.buildPropertyChangeListener(target, "stateChangedDoubleArgument");
			fail("bogus listener: " + listener);
		} catch (RuntimeException ex) {
			if (ex.getCause().getClass() == NoSuchMethodException.class) {
				exCaught = true;
			}
		}
		assertTrue(exCaught);
	}

	public void testBogusDoubleArgument2() throws Exception {
		TestModel testModel = new TestModel(7);
		Target target = new Target(testModel, TestModel.VALUE_PROPERTY, 7, 99);
		Method method = ClassTools.method(target, "propertyChangedDoubleArgument", new Class[] {PropertyChangeEvent.class, Object.class});
		boolean exCaught = false;
		try {
			PropertyChangeListener listener = ReflectiveChangeListener.buildPropertyChangeListener(target, method);
			fail("bogus listener: " + listener);
		} catch (RuntimeException ex) {
			if (ex.getMessage().equals(method.toString())) {
				exCaught = true;
			}
		}
		assertTrue(exCaught);
	}


	private class TestModel extends AbstractModel {
		private int value = 0;
			public static final String VALUE_PROPERTY = "value";
		TestModel(int value) {
			super();
			this.value = value;
		}
		void setValue(int value) {
			int old = this.value;
			this.value = value;
			this.firePropertyChanged(VALUE_PROPERTY, old, value);
			if (old != value) {
				this.fireStateChanged();
			}
		}
	}

	private class Target {
		TestModel testModel;
		String propertyName;
		Object oldValue;
		Object newValue;
		boolean zeroArgumentFlag = false;
		boolean singleArgumentFlag = false;
		Target(TestModel testModel, String propertyName, int oldValue, int newValue) {
			super();
			this.testModel = testModel;
			this.propertyName = propertyName;
			this.oldValue = new Integer(oldValue);
			this.newValue = new Integer(newValue);
		}
		void propertyChangedZeroArgument() {
			this.zeroArgumentFlag = true;
		}
		void propertyChangedSingleArgument(PropertyChangeEvent e) {
			this.singleArgumentFlag = true;
			assertSame(this.testModel, e.getSource());
			assertEquals(this.propertyName, e.getPropertyName());
			assertEquals(this.oldValue, e.getOldValue());
			assertEquals(this.newValue, e.getNewValue());
		}
		void propertyChangedSingleArgument2(Object o) {
			PropertyChangeEvent e = (PropertyChangeEvent) o;
			this.singleArgumentFlag = true;
			assertSame(this.testModel, e.getSource());
			assertEquals(this.propertyName, e.getPropertyName());
			assertEquals(this.oldValue, e.getOldValue());
			assertEquals(this.newValue, e.getNewValue());
		}
		void propertyChangedDoubleArgument(PropertyChangeEvent e, Object o) {
			fail("bogus event: " + e);
		}
	}

}

Back to the top