| /******************************************************************************* |
| * Copyright (c) 2007 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.internal.model.event.PropertyChangeEvent; |
| import org.eclipse.jpt.utility.internal.model.listener.PropertyChangeListener; |
| import org.eclipse.jpt.utility.internal.model.listener.ReflectiveChangeListener; |
| import org.eclipse.jpt.utility.internal.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.propertyName()); |
| assertEquals(this.oldValue, e.oldValue()); |
| assertEquals(this.newValue, e.newValue()); |
| } |
| void propertyChangedSingleArgument2(Object o) { |
| PropertyChangeEvent e = (PropertyChangeEvent) o; |
| this.singleArgumentFlag = true; |
| assertSame(this.testModel, e.getSource()); |
| assertEquals(this.propertyName, e.propertyName()); |
| assertEquals(this.oldValue, e.oldValue()); |
| assertEquals(this.newValue, e.newValue()); |
| } |
| void propertyChangedDoubleArgument(PropertyChangeEvent e, Object o) { |
| fail("bogus event: " + e); |
| } |
| } |
| |
| } |