/*
* JBoss, Home of Professional Open Source.
*
* See the LEGAL.txt file distributed with this work for information regarding copyright ownership and licensing.
*
* See the AUTHORS.txt file distributed with this work for a full listing of individual contributors.
*/
package org.teiid.designer.core.util;
import static org.mockito.Mockito.mock;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import junit.extensions.TestSetup;
import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;
import org.teiid.designer.core.PropertyChangePublisher;
import org.teiid.designer.core.container.Container;
import org.teiid.designer.core.container.ContainerImpl;
/**
*/
public class TestFlatRegistry extends TestCase {
private class TestBean implements PropertyChangePublisher {
public static final String NAME_PROPERTY = "name"; //$NON-NLS-1$
private final Map<String, List<PropertyChangeListener>> listenerMap = new HashMap<String, List<PropertyChangeListener>>();
private String name;
/**
* @param name
*/
public TestBean(String name) {
this.name = name;
}
public void setName(String name) {
String oldName = this.name;
String newName = name;
this.name = name;
List<PropertyChangeListener> listenerList = listenerMap.get(NAME_PROPERTY);
if (listenerList != null) {
listenerList = new ArrayList(listenerList);
for (PropertyChangeListener listener : listenerList) {
listener.propertyChange(new PropertyChangeEvent(this, NAME_PROPERTY, oldName, newName));
}
}
}
public String getName() {
return name;
}
public List<PropertyChangeListener> getPropertyChangeListeners(String propertyName) {
return listenerMap.get(propertyName);
}
@Override
public void removePropertyChangeListener(String propertyName, PropertyChangeListener listener) {
List<PropertyChangeListener> list = listenerMap.get(propertyName);
if (list == null) {
return;
}
list.remove(listener);
}
@Override
public void removePropertyChangeListener(PropertyChangeListener listener) {
// Not implemented
}
@Override
public void addPropertyChangeListener(String propertyName, PropertyChangeListener listener) {
List<PropertyChangeListener> list = listenerMap.get(propertyName);
if (list == null) {
list = new ArrayList<PropertyChangeListener>();
listenerMap.put(propertyName, list);
}
list.add(listener);
}
@Override
public void addPropertyChangeListener(PropertyChangeListener listener) {
// Not implemented
}
}
private FlatRegistry registry;
/**
* Constructor for TestFlatRegistry.
* @param arg0
*/
public TestFlatRegistry(String arg0) {
super(arg0);
}
public static void main(String[] args) {
junit.textui.TestRunner.run(TestFlatRegistry.class);
}
/**
* @see TestCase#setUp()
*/
@Override
protected void setUp() throws Exception {
super.setUp();
this.registry = new FlatRegistry();
}
/**
* @see TestCase#tearDown()
*/
@Override
protected void tearDown() throws Exception {
super.tearDown();
this.registry = null;
}
/**
* Test suite, with one-time setup.
*/
public static Test suite() {
TestSuite suite = new TestSuite("TestFlatRegistry"); //$NON-NLS-1$
suite.addTestSuite(TestFlatRegistry.class);
// One-time setup and teardown
return new TestSetup(suite) {
@Override
public void setUp() {
}
@Override
public void tearDown() {
}
};
}
// =========================================================================
// H E L P E R M E T H O D S
// =========================================================================
public Object helpTestRegister( final Object obj, final String name, final boolean unregister ) {
registry.register(name, obj);
if ( registry.lookup(name) != obj ) {
fail("Unable to find registered object (" + obj + ") with name \"" + name + "\""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
}
Object registeredObj = registry.unregister(name);
if ( registeredObj != obj ) {
fail("Result from unregister did not match registered object (" + obj + ") with name \"" + name + "\""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
}
if ( !unregister ) {
registry.register(name, obj);
}
return obj;
}
public void helpCheckSize( final int expectedSize ) {
if ( registry.size() != expectedSize ) {
fail("The register has " + registry.size() + " entries; expected " + expectedSize); //$NON-NLS-1$ //$NON-NLS-2$
}
}
// =========================================================================
// T E S T C A S E S
// =========================================================================
public void testRegister() {
helpTestRegister("Object 1","obj1",false); //$NON-NLS-1$ //$NON-NLS-2$
helpTestRegister("Object 2","obj2",false); //$NON-NLS-1$ //$NON-NLS-2$
helpCheckSize(2);
helpTestRegister("Object 3","obj2",false); //$NON-NLS-1$ //$NON-NLS-2$
helpCheckSize(2);
helpTestRegister("Object 4","obj4",true); //$NON-NLS-1$ //$NON-NLS-2$
helpCheckSize(2);
helpTestRegister("Object 4","obj4",false); //$NON-NLS-1$ //$NON-NLS-2$
helpCheckSize(3);
helpTestRegister("Object 3","obj3",false); //$NON-NLS-1$ //$NON-NLS-2$
helpCheckSize(4);
try {
// but cannot register an object with a null name
helpTestRegister("Object X", null, false); //$NON-NLS-1$
fail("Should not be able to register object with a null name"); //$NON-NLS-1$
}
catch (IllegalArgumentException ex) {
// Should throw this exception when trying to register the container with a null name
}
}
public void testNameAndClassLookup() {
Container container1 = mock(Container.class);
Container container2 = mock(ContainerImpl.class);
String CONTAINER_1 = "container1"; //$NON-NLS-1$
String CONTAINER_2 = "container2"; //$NON-NLS-1$
registry.register(CONTAINER_1, container1);
registry.register(CONTAINER_2, container2);
Container c1 = registry.lookup(CONTAINER_1, Container.class);
assertSame(container1, c1);
Object cNull = registry.lookup(CONTAINER_1, String.class);
assertNull(cNull);
Container c2 = registry.lookup(CONTAINER_2, ContainerImpl.class);
assertSame(container2, c2);
// container c2 is an instance of Container
c2 = registry.lookup(CONTAINER_2, Container.class);
assertSame(container2, c2);
}
public void testPropertyChangePublisherRegistrationWithNullName() {
String name = null;
TestBean testBean = new TestBean(name);
try {
Object o = registry.register(name, testBean, TestBean.NAME_PROPERTY);
fail("Should not be able to register object with a null name"); //$NON-NLS-1$
}
catch (IllegalArgumentException ex) {
// Should throw this exception when trying to register the container with a null name
}
}
public void testPropertyChangePubisherRegistration() {
String name = "My Name"; //$NON-NLS-1$
TestBean testBean = new TestBean(name);
Object o = registry.register(name, testBean, TestBean.NAME_PROPERTY);
assertSame(testBean, o);
assertEquals(1, registry.size());
List<PropertyChangeListener> propertyChangeListeners = testBean.getPropertyChangeListeners(TestBean.NAME_PROPERTY);
assertEquals(1, propertyChangeListeners.size());
assertEquals(registry, propertyChangeListeners.get(0));
}
public void testPropertyChangePublisherLookup() {
String name = "My Name"; //$NON-NLS-1$
String newName = "My New Name"; //$NON-NLS-1$
TestBean testBean = new TestBean(name);
// Registery the test bean against its name
Object o = registry.register(testBean.getName(), testBean, TestBean.NAME_PROPERTY);
// Lookup the test bean by its name
PropertyChangePublisher p1 = registry.lookup(name, TestBean.class);
assertSame(o, p1);
}
public void testPropertyChangePublisherSetName() {
String name = "My Name"; //$NON-NLS-1$
String newName = "My New Name"; //$NON-NLS-1$
TestBean testBean = new TestBean(name);
// Registery the test bean against its name
Object o = registry.register(testBean.getName(), testBean, TestBean.NAME_PROPERTY);
// Lookup the test bean by its name
PropertyChangePublisher p1 = registry.lookup(name, TestBean.class);
// Set the test bean's name to something else
testBean.setName(newName);
assertEquals(newName, testBean.getName());
// Test bean now registered under new name
PropertyChangePublisher p2 = registry.lookup(newName, TestBean.class);
assertSame(o, p2);
assertSame(p1, p2);
// Test bean no longer registered under old name
assertNull(registry.lookup(name, TestBean.class));
}
public void testPropertyChangePublisherSetNameToNull() {
String name = "My Name"; //$NON-NLS-1$
String newName = null;
TestBean testBean = new TestBean(name);
// Registery the test bean against its name
registry.register(testBean.getName(), testBean, TestBean.NAME_PROPERTY);
// Set the test bean's name to something else
try {
testBean.setName(newName);
fail("Cannot register a null name to the registry"); //$NON-NLS-1$
}
catch (IllegalArgumentException ex) {
// Cannot see the name to null as cannot register a null key
}
}
}