/******************************************************************************* * Copyright (c) 1998, 2015 Oracle and/or its affiliates. All rights reserved. * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0 * which accompanies this distribution. * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html * and the Eclipse Distribution License is available at * http://www.eclipse.org/org/documents/edl-v10.php. * * Contributors: * Oracle - initial API and implementation from Oracle TopLink ******************************************************************************/ package org.eclipse.persistence.tools.workbench.test.utility.events; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; import java.util.ListIterator; import junit.framework.Test; import junit.framework.TestCase; import junit.framework.TestSuite; import org.eclipse.persistence.tools.workbench.utility.AbstractModel; import org.eclipse.persistence.tools.workbench.utility.ClassTools; import org.eclipse.persistence.tools.workbench.utility.CollectionTools; import org.eclipse.persistence.tools.workbench.utility.events.CollectionChangeListener; import org.eclipse.persistence.tools.workbench.utility.events.ListChangeEvent; import org.eclipse.persistence.tools.workbench.utility.events.ListChangeListener; import org.eclipse.persistence.tools.workbench.utility.events.ReflectiveChangeListener; import org.eclipse.persistence.tools.workbench.utility.iterators.CloneListIterator; public class ReflectiveListChangeListenerTests extends TestCase { public static Test suite() { return new TestSuite(ReflectiveListChangeListenerTests.class); } public ReflectiveListChangeListenerTests(String name) { super(name); } private ListChangeListener buildZeroArgumentListener(Object target) { return ReflectiveChangeListener.buildListChangeListener(target, "itemAddedZeroArgument", "itemRemovedZeroArgument", "itemReplacedZeroArgument", "listChangedZeroArgument"); } private ListChangeListener buildSingleArgumentListener(Object target) { return ReflectiveChangeListener.buildListChangeListener(target, "itemAddedSingleArgument", "itemRemovedSingleArgument", "itemReplacedSingleArgument", "listChangedSingleArgument"); } public void testItemAddedZeroArgument() { TestModel testModel = new TestModel(); String string = "foo"; Target target = new Target(testModel, TestModel.STRINGS_LIST, string, 0); testModel.addListChangeListener(this.buildZeroArgumentListener(target)); testModel.addString(string); assertTrue(target.itemAddedZeroArgumentFlag); assertFalse(target.itemAddedSingleArgumentFlag); assertFalse(target.itemRemovedZeroArgumentFlag); assertFalse(target.itemRemovedSingleArgumentFlag); assertFalse(target.itemReplacedZeroArgumentFlag); assertFalse(target.itemReplacedSingleArgumentFlag); assertFalse(target.listChangedZeroArgumentFlag); assertFalse(target.listChangedSingleArgumentFlag); } public void testItemAddedZeroArgumentNamedList() { TestModel testModel = new TestModel(); String string = "foo"; Target target = new Target(testModel, TestModel.STRINGS_LIST, string, 0); testModel.addListChangeListener(TestModel.STRINGS_LIST, this.buildZeroArgumentListener(target)); testModel.addString(string); assertTrue(target.itemAddedZeroArgumentFlag); assertFalse(target.itemAddedSingleArgumentFlag); assertFalse(target.itemRemovedZeroArgumentFlag); assertFalse(target.itemRemovedSingleArgumentFlag); assertFalse(target.itemReplacedZeroArgumentFlag); assertFalse(target.itemReplacedSingleArgumentFlag); assertFalse(target.listChangedZeroArgumentFlag); assertFalse(target.listChangedSingleArgumentFlag); } public void testItemAddedSingleArgument() { TestModel testModel = new TestModel(); String string = "foo"; Target target = new Target(testModel, TestModel.STRINGS_LIST, string, 0); testModel.addListChangeListener(this.buildSingleArgumentListener(target)); testModel.addString(string); assertFalse(target.itemAddedZeroArgumentFlag); assertTrue(target.itemAddedSingleArgumentFlag); assertFalse(target.itemRemovedZeroArgumentFlag); assertFalse(target.itemRemovedSingleArgumentFlag); assertFalse(target.itemReplacedZeroArgumentFlag); assertFalse(target.itemReplacedSingleArgumentFlag); assertFalse(target.listChangedZeroArgumentFlag); assertFalse(target.listChangedSingleArgumentFlag); } public void testItemAddedSingleArgumentNamedList() { TestModel testModel = new TestModel(); String string = "foo"; Target target = new Target(testModel, TestModel.STRINGS_LIST, string, 0); testModel.addListChangeListener(TestModel.STRINGS_LIST, this.buildSingleArgumentListener(target)); testModel.addString(string); assertFalse(target.itemAddedZeroArgumentFlag); assertTrue(target.itemAddedSingleArgumentFlag); assertFalse(target.itemRemovedZeroArgumentFlag); assertFalse(target.itemRemovedSingleArgumentFlag); assertFalse(target.itemReplacedZeroArgumentFlag); assertFalse(target.itemReplacedSingleArgumentFlag); assertFalse(target.listChangedZeroArgumentFlag); assertFalse(target.listChangedSingleArgumentFlag); } public void testItemRemovedZeroArgument() { TestModel testModel = new TestModel(); String string = "foo"; testModel.addString(string); Target target = new Target(testModel, TestModel.STRINGS_LIST, string, 0); testModel.addListChangeListener(this.buildZeroArgumentListener(target)); testModel.removeString(string); assertFalse(target.itemAddedZeroArgumentFlag); assertFalse(target.itemAddedSingleArgumentFlag); assertTrue(target.itemRemovedZeroArgumentFlag); assertFalse(target.itemRemovedSingleArgumentFlag); assertFalse(target.itemReplacedZeroArgumentFlag); assertFalse(target.itemReplacedSingleArgumentFlag); assertFalse(target.listChangedZeroArgumentFlag); assertFalse(target.listChangedSingleArgumentFlag); } public void testItemRemovedZeroArgumentNamedList() { TestModel testModel = new TestModel(); String string = "foo"; testModel.addString(string); Target target = new Target(testModel, TestModel.STRINGS_LIST, string, 0); testModel.addListChangeListener(TestModel.STRINGS_LIST, this.buildZeroArgumentListener(target)); testModel.removeString(string); assertFalse(target.itemAddedZeroArgumentFlag); assertFalse(target.itemAddedSingleArgumentFlag); assertTrue(target.itemRemovedZeroArgumentFlag); assertFalse(target.itemRemovedSingleArgumentFlag); assertFalse(target.itemReplacedZeroArgumentFlag); assertFalse(target.itemReplacedSingleArgumentFlag); assertFalse(target.listChangedZeroArgumentFlag); assertFalse(target.listChangedSingleArgumentFlag); } public void testItemRemovedSingleArgument() { TestModel testModel = new TestModel(); String string = "foo"; testModel.addString(string); Target target = new Target(testModel, TestModel.STRINGS_LIST, string, 0); testModel.addListChangeListener(this.buildSingleArgumentListener(target)); testModel.removeString(string); assertFalse(target.itemAddedZeroArgumentFlag); assertFalse(target.itemAddedSingleArgumentFlag); assertFalse(target.itemRemovedZeroArgumentFlag); assertTrue(target.itemRemovedSingleArgumentFlag); assertFalse(target.itemReplacedZeroArgumentFlag); assertFalse(target.itemReplacedSingleArgumentFlag); assertFalse(target.listChangedZeroArgumentFlag); assertFalse(target.listChangedSingleArgumentFlag); } public void testItemRemovedSingleArgumentNamedList() { TestModel testModel = new TestModel(); String string = "foo"; testModel.addString(string); Target target = new Target(testModel, TestModel.STRINGS_LIST, string, 0); testModel.addListChangeListener(TestModel.STRINGS_LIST, this.buildSingleArgumentListener(target)); testModel.removeString(string); assertFalse(target.itemAddedZeroArgumentFlag); assertFalse(target.itemAddedSingleArgumentFlag); assertFalse(target.itemRemovedZeroArgumentFlag); assertTrue(target.itemRemovedSingleArgumentFlag); assertFalse(target.itemReplacedZeroArgumentFlag); assertFalse(target.itemReplacedSingleArgumentFlag); assertFalse(target.listChangedZeroArgumentFlag); assertFalse(target.listChangedSingleArgumentFlag); } public void testItemReplacedZeroArgument() { TestModel testModel = new TestModel(); String oldString = "foo"; String newString = "bar"; testModel.addString(oldString); Target target = new Target(testModel, TestModel.STRINGS_LIST, newString, 0, oldString); testModel.addListChangeListener(this.buildZeroArgumentListener(target)); testModel.replaceString(oldString, newString); assertFalse(target.itemAddedZeroArgumentFlag); assertFalse(target.itemAddedSingleArgumentFlag); assertFalse(target.itemRemovedZeroArgumentFlag); assertFalse(target.itemRemovedSingleArgumentFlag); assertTrue(target.itemReplacedZeroArgumentFlag); assertFalse(target.itemReplacedSingleArgumentFlag); assertFalse(target.listChangedZeroArgumentFlag); assertFalse(target.listChangedSingleArgumentFlag); } public void testItemReplacedZeroArgumentNamedList() { TestModel testModel = new TestModel(); String oldString = "foo"; String newString = "bar"; testModel.addString(oldString); Target target = new Target(testModel, TestModel.STRINGS_LIST, newString, 0, oldString); testModel.addListChangeListener(TestModel.STRINGS_LIST, this.buildZeroArgumentListener(target)); testModel.replaceString(oldString, newString); assertFalse(target.itemAddedZeroArgumentFlag); assertFalse(target.itemAddedSingleArgumentFlag); assertFalse(target.itemRemovedZeroArgumentFlag); assertFalse(target.itemRemovedSingleArgumentFlag); assertTrue(target.itemReplacedZeroArgumentFlag); assertFalse(target.itemReplacedSingleArgumentFlag); assertFalse(target.listChangedZeroArgumentFlag); assertFalse(target.listChangedSingleArgumentFlag); } public void testItemReplacedSingleArgument() { TestModel testModel = new TestModel(); String oldString = "foo"; String newString = "bar"; testModel.addString(oldString); Target target = new Target(testModel, TestModel.STRINGS_LIST, newString, 0, oldString); testModel.addListChangeListener(this.buildSingleArgumentListener(target)); testModel.replaceString(oldString, newString); assertFalse(target.itemAddedZeroArgumentFlag); assertFalse(target.itemAddedSingleArgumentFlag); assertFalse(target.itemRemovedZeroArgumentFlag); assertFalse(target.itemRemovedSingleArgumentFlag); assertFalse(target.itemReplacedZeroArgumentFlag); assertTrue(target.itemReplacedSingleArgumentFlag); assertFalse(target.listChangedZeroArgumentFlag); assertFalse(target.listChangedSingleArgumentFlag); } public void testItemReplacedSingleArgumentNamedList() { TestModel testModel = new TestModel(); String oldString = "foo"; String newString = "bar"; testModel.addString(oldString); Target target = new Target(testModel, TestModel.STRINGS_LIST, newString, 0, oldString); testModel.addListChangeListener(TestModel.STRINGS_LIST, this.buildSingleArgumentListener(target)); testModel.replaceString(oldString, newString); assertFalse(target.itemAddedZeroArgumentFlag); assertFalse(target.itemAddedSingleArgumentFlag); assertFalse(target.itemRemovedZeroArgumentFlag); assertFalse(target.itemRemovedSingleArgumentFlag); assertFalse(target.itemReplacedZeroArgumentFlag); assertTrue(target.itemReplacedSingleArgumentFlag); assertFalse(target.listChangedZeroArgumentFlag); assertFalse(target.listChangedSingleArgumentFlag); } public void testListChangedZeroArgument() { TestModel testModel = new TestModel(); String string = "foo"; testModel.addString(string); Target target = new Target(testModel, TestModel.STRINGS_LIST, null, -1); testModel.addListChangeListener(this.buildZeroArgumentListener(target)); testModel.replaceAllStrings(new String[] {"bar", "baz"}); assertFalse(target.itemAddedZeroArgumentFlag); assertFalse(target.itemAddedSingleArgumentFlag); assertFalse(target.itemRemovedZeroArgumentFlag); assertFalse(target.itemRemovedSingleArgumentFlag); assertFalse(target.itemReplacedZeroArgumentFlag); assertFalse(target.itemReplacedSingleArgumentFlag); assertTrue(target.listChangedZeroArgumentFlag); assertFalse(target.listChangedSingleArgumentFlag); } public void testListChangedZeroArgumentNamedList() { TestModel testModel = new TestModel(); String string = "foo"; testModel.addString(string); Target target = new Target(testModel, TestModel.STRINGS_LIST, null, -1); testModel.addListChangeListener(TestModel.STRINGS_LIST, this.buildZeroArgumentListener(target)); testModel.replaceAllStrings(new String[] {"bar", "baz"}); assertFalse(target.itemAddedZeroArgumentFlag); assertFalse(target.itemAddedSingleArgumentFlag); assertFalse(target.itemRemovedZeroArgumentFlag); assertFalse(target.itemRemovedSingleArgumentFlag); assertFalse(target.itemReplacedZeroArgumentFlag); assertFalse(target.itemReplacedSingleArgumentFlag); assertTrue(target.listChangedZeroArgumentFlag); assertFalse(target.listChangedSingleArgumentFlag); } public void testListChangedSingleArgument() { TestModel testModel = new TestModel(); String string = "foo"; testModel.addString(string); Target target = new Target(testModel, TestModel.STRINGS_LIST, null, -1); testModel.addListChangeListener(this.buildSingleArgumentListener(target)); testModel.replaceAllStrings(new String[] {"bar", "baz"}); assertFalse(target.itemAddedZeroArgumentFlag); assertFalse(target.itemAddedSingleArgumentFlag); assertFalse(target.itemRemovedZeroArgumentFlag); assertFalse(target.itemRemovedSingleArgumentFlag); assertFalse(target.itemReplacedZeroArgumentFlag); assertFalse(target.itemReplacedSingleArgumentFlag); assertFalse(target.listChangedZeroArgumentFlag); assertTrue(target.listChangedSingleArgumentFlag); } public void testListChangedSingleArgumentNamedList() { TestModel testModel = new TestModel(); String string = "foo"; testModel.addString(string); Target target = new Target(testModel, TestModel.STRINGS_LIST, null, -1); testModel.addListChangeListener(TestModel.STRINGS_LIST, this.buildSingleArgumentListener(target)); testModel.replaceAllStrings(new String[] {"bar", "baz"}); assertFalse(target.itemAddedZeroArgumentFlag); assertFalse(target.itemAddedSingleArgumentFlag); assertFalse(target.itemRemovedZeroArgumentFlag); assertFalse(target.itemRemovedSingleArgumentFlag); assertFalse(target.itemReplacedZeroArgumentFlag); assertFalse(target.itemReplacedSingleArgumentFlag); assertFalse(target.listChangedZeroArgumentFlag); assertTrue(target.listChangedSingleArgumentFlag); } public void testBogusDoubleArgument1() { TestModel testModel = new TestModel(); String string = "foo"; Target target = new Target(testModel, TestModel.STRINGS_LIST, string, 0); boolean exCaught = false; try { ListChangeListener listener = ReflectiveChangeListener.buildListChangeListener(target, "listChangedDoubleArgument"); fail("bogus listener: " + listener); } catch (RuntimeException ex) { if (ex.getCause().getClass() == NoSuchMethodException.class) { exCaught = true; } } assertTrue(exCaught); } public void testBogusDoubleArgument2() throws Exception { TestModel testModel = new TestModel(); String string = "foo"; Target target = new Target(testModel, TestModel.STRINGS_LIST, string, 0); Method method = ClassTools.method(target, "listChangedDoubleArgument", new Class[] {ListChangeEvent.class, Object.class}); boolean exCaught = false; try { ListChangeListener listener = ReflectiveChangeListener.buildListChangeListener(target, method); fail("bogus listener: " + listener); } catch (RuntimeException ex) { if (ex.getMessage().equals(method.toString())) { exCaught = true; } } assertTrue(exCaught); } public void testListenerMismatch() { TestModel testModel = new TestModel(); String string = "foo"; Target target = new Target(testModel, TestModel.STRINGS_LIST, string, 0); // build a LIST change listener and hack it so we // can add it as a COLLECTION change listener Object listener = ReflectiveChangeListener.buildListChangeListener(target, "itemAddedSingleArgument"); testModel.addCollectionChangeListener((CollectionChangeListener) listener); boolean exCaught = false; try { testModel.changeCollection(); fail("listener mismatch: " + listener); } catch (IllegalArgumentException ex) { exCaught = true; } assertTrue(exCaught); } private class TestModel extends AbstractModel { private List strings = new ArrayList(); public static final String STRINGS_LIST = "strings"; TestModel() { super(); } ListIterator strings() { return new CloneListIterator(this.strings); } void addString(String string) { this.addItemToList(string, this.strings, STRINGS_LIST); } void removeString(String string) { this.removeItemFromList(this.strings.indexOf(string), this.strings, STRINGS_LIST); } void replaceString(String oldString, String newString) { this.setItemInList(this.strings.indexOf(oldString), newString, this.strings, STRINGS_LIST); } void replaceAllStrings(String[] newStrings) { this.strings.clear(); CollectionTools.addAll(this.strings, newStrings); this.fireListChanged(STRINGS_LIST); } void changeCollection() { this.fireCollectionChanged("bogus collection"); } } private class Target { TestModel testModel; String listName; String string; int index; String replacedString; boolean itemAddedZeroArgumentFlag = false; boolean itemAddedSingleArgumentFlag = false; boolean itemRemovedZeroArgumentFlag = false; boolean itemRemovedSingleArgumentFlag = false; boolean itemReplacedZeroArgumentFlag = false; boolean itemReplacedSingleArgumentFlag = false; boolean listChangedZeroArgumentFlag = false; boolean listChangedSingleArgumentFlag = false; Target(TestModel testModel, String listName, String string, int index) { super(); this.testModel = testModel; this.listName = listName; this.string = string; this.index = index; } Target(TestModel testModel, String listName, String string, int index, String replacedString) { this(testModel, listName, string, index); this.replacedString = replacedString; } void itemAddedZeroArgument() { this.itemAddedZeroArgumentFlag = true; } void itemAddedSingleArgument(ListChangeEvent e) { this.itemAddedSingleArgumentFlag = true; assertSame(this.testModel, e.getSource()); assertEquals(this.listName, e.getListName()); assertEquals(this.string, e.items().next()); assertEquals(this.index, e.getIndex()); } void itemRemovedZeroArgument() { this.itemRemovedZeroArgumentFlag = true; } void itemRemovedSingleArgument(ListChangeEvent e) { this.itemRemovedSingleArgumentFlag = true; assertSame(this.testModel, e.getSource()); assertEquals(this.listName, e.getListName()); assertEquals(this.string, e.items().next()); assertEquals(this.index, e.getIndex()); } void itemReplacedZeroArgument() { this.itemReplacedZeroArgumentFlag = true; } void itemReplacedSingleArgument(ListChangeEvent e) { this.itemReplacedSingleArgumentFlag = true; assertSame(this.testModel, e.getSource()); assertEquals(this.listName, e.getListName()); assertEquals(this.string, e.items().next()); assertEquals(this.replacedString, e.replacedItems().next()); assertEquals(this.index, e.getIndex()); } void listChangedZeroArgument() { this.listChangedZeroArgumentFlag = true; } void listChangedSingleArgument(ListChangeEvent e) { this.listChangedSingleArgumentFlag = true; assertSame(this.testModel, e.getSource()); assertEquals(this.listName, e.getListName()); assertFalse(e.items().hasNext()); assertEquals(this.index, e.getIndex()); } void listChangedDoubleArgument(ListChangeEvent e, Object o) { fail("bogus event: " + e); } } }