/*******************************************************************************
* 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.uitools.app;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.Date;
import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;
import org.eclipse.persistence.tools.workbench.test.utility.TestTools;
import org.eclipse.persistence.tools.workbench.uitools.app.BufferedPropertyValueModel;
import org.eclipse.persistence.tools.workbench.uitools.app.PropertyAspectAdapter;
import org.eclipse.persistence.tools.workbench.uitools.app.PropertyValueModel;
import org.eclipse.persistence.tools.workbench.uitools.app.SimplePropertyValueModel;
import org.eclipse.persistence.tools.workbench.uitools.app.ValueModel;
import org.eclipse.persistence.tools.workbench.utility.AbstractModel;
public class BufferedPropertyValueModelTests extends TestCase {
private Employee employee;
private PropertyValueModel employeeHolder;
PropertyChangeEvent employeeEvent;
private PropertyValueModel idAdapter;
private PropertyValueModel nameAdapter;
private PropertyValueModel hireDateAdapter;
PropertyChangeEvent adapterEvent;
private BufferedPropertyValueModel.Trigger trigger;
private PropertyValueModel bufferedIDHolder;
private PropertyValueModel bufferedNameHolder;
private PropertyValueModel bufferedHireDateHolder;
PropertyChangeEvent bufferedEvent;
public static Test suite() {
return new TestSuite(BufferedPropertyValueModelTests.class);
}
public BufferedPropertyValueModelTests(String name) {
super(name);
}
protected void setUp() throws Exception {
super.setUp();
this.employee = new Employee(17, "Freddy", new Date());
this.employeeHolder = new SimplePropertyValueModel(this.employee);
this.trigger = new BufferedPropertyValueModel.Trigger();
this.idAdapter = this.buildIDAdapter(this.employeeHolder);
this.bufferedIDHolder = new BufferedPropertyValueModel(this.idAdapter, this.trigger);
this.nameAdapter = this.buildNameAdapter(this.employeeHolder);
this.bufferedNameHolder = new BufferedPropertyValueModel(this.nameAdapter, this.trigger);
this.hireDateAdapter = this.buildHireDateAdapter(this.employeeHolder);
this.bufferedHireDateHolder = new BufferedPropertyValueModel(this.hireDateAdapter, this.trigger);
}
private PropertyValueModel buildIDAdapter(ValueModel eHolder) {
return new PropertyAspectAdapter(eHolder, Employee.ID_PROPERTY) {
protected Object getValueFromSubject() {
return new Integer(((Employee) this.subject).getID());
}
protected void setValueOnSubject(Object value) {
((Employee) this.subject).setID(((Integer) value).intValue());
}
};
}
private PropertyValueModel buildNameAdapter(ValueModel eHolder) {
return new PropertyAspectAdapter(eHolder, Employee.NAME_PROPERTY) {
protected Object getValueFromSubject() {
return ((Employee) this.subject).getName();
}
protected void setValueOnSubject(Object value) {
((Employee) this.subject).setName((String) value);
}
};
}
private PropertyValueModel buildHireDateAdapter(ValueModel eHolder) {
return new PropertyAspectAdapter(eHolder, Employee.HIRE_DATE_PROPERTY) {
protected Object getValueFromSubject() {
return ((Employee) this.subject).getHireDate();
}
protected void setValueOnSubject(Object value) {
((Employee) this.subject).setHireDate((Date) value);
}
};
}
protected void tearDown() throws Exception {
TestTools.clear(this);
super.tearDown();
}
public void testGetValue() {
PropertyChangeListener bufferedListener = this.buildBufferedListener();
this.bufferedIDHolder.addPropertyChangeListener(ValueModel.VALUE, bufferedListener);
this.bufferedNameHolder.addPropertyChangeListener(ValueModel.VALUE, bufferedListener);
this.bufferedHireDateHolder.addPropertyChangeListener(ValueModel.VALUE, bufferedListener);
assertEquals(new Integer(17), this.idAdapter.getValue());
assertEquals(new Integer(17), this.bufferedIDHolder.getValue());
assertEquals("Freddy", this.employee.getName());
assertEquals("Freddy", this.nameAdapter.getValue());
assertEquals("Freddy", this.bufferedNameHolder.getValue());
Date temp = this.employee.getHireDate();
assertEquals(temp, this.employee.getHireDate());
assertEquals(temp, this.hireDateAdapter.getValue());
assertEquals(temp, this.bufferedHireDateHolder.getValue());
this.bufferedIDHolder.setValue(new Integer(323));
assertEquals(17, this.employee.getID());
assertEquals(new Integer(17), this.idAdapter.getValue());
assertEquals(new Integer(323), this.bufferedIDHolder.getValue());
this.bufferedNameHolder.setValue("Ripley");
assertEquals("Freddy", this.employee.getName());
assertEquals("Freddy", this.nameAdapter.getValue());
assertEquals("Ripley", this.bufferedNameHolder.getValue());
this.bufferedHireDateHolder.setValue(null);
assertEquals(temp, this.employee.getHireDate());
assertEquals(temp, this.hireDateAdapter.getValue());
assertEquals(null, this.bufferedHireDateHolder.getValue());
}
public void testAccept() {
PropertyChangeListener bufferedListener = this.buildBufferedListener();
this.bufferedIDHolder.addPropertyChangeListener(ValueModel.VALUE, bufferedListener);
this.bufferedNameHolder.addPropertyChangeListener(ValueModel.VALUE, bufferedListener);
this.bufferedHireDateHolder.addPropertyChangeListener(ValueModel.VALUE, bufferedListener);
this.bufferedIDHolder.setValue(new Integer(323));
assertEquals(17, this.employee.getID());
assertEquals(new Integer(17), this.idAdapter.getValue());
assertEquals(new Integer(323), this.bufferedIDHolder.getValue());
this.bufferedNameHolder.setValue("Ripley");
assertEquals("Freddy", this.employee.getName());
assertEquals("Freddy", this.nameAdapter.getValue());
assertEquals("Ripley", this.bufferedNameHolder.getValue());
Date temp = this.employee.getHireDate();
this.bufferedHireDateHolder.setValue(null);
assertEquals(temp, this.employee.getHireDate());
assertEquals(temp, this.hireDateAdapter.getValue());
assertEquals(null, this.bufferedHireDateHolder.getValue());
this.trigger.accept();
assertEquals(323, this.employee.getID());
assertEquals(new Integer(323), this.idAdapter.getValue());
assertEquals(new Integer(323), this.bufferedIDHolder.getValue());
assertEquals("Ripley", this.employee.getName());
assertEquals("Ripley", this.nameAdapter.getValue());
assertEquals("Ripley", this.bufferedNameHolder.getValue());
assertEquals(null, this.employee.getHireDate());
assertEquals(null, this.hireDateAdapter.getValue());
assertEquals(null, this.bufferedHireDateHolder.getValue());
}
public void testReset() {
PropertyChangeListener bufferedListener = this.buildBufferedListener();
this.bufferedIDHolder.addPropertyChangeListener(ValueModel.VALUE, bufferedListener);
this.bufferedNameHolder.addPropertyChangeListener(ValueModel.VALUE, bufferedListener);
this.bufferedHireDateHolder.addPropertyChangeListener(ValueModel.VALUE, bufferedListener);
this.bufferedIDHolder.setValue(new Integer(323));
assertEquals(17, this.employee.getID());
assertEquals(new Integer(17), this.idAdapter.getValue());
assertEquals(new Integer(323), this.bufferedIDHolder.getValue());
this.bufferedNameHolder.setValue("Ripley");
assertEquals("Freddy", this.employee.getName());
assertEquals("Freddy", this.nameAdapter.getValue());
assertEquals("Ripley", this.bufferedNameHolder.getValue());
Date temp = this.employee.getHireDate();
this.bufferedHireDateHolder.setValue(null);
assertEquals(temp, this.employee.getHireDate());
assertEquals(temp, this.hireDateAdapter.getValue());
assertEquals(null, this.bufferedHireDateHolder.getValue());
this.trigger.reset();
assertEquals(17, this.employee.getID());
assertEquals(new Integer(17), this.idAdapter.getValue());
assertEquals(new Integer(17), this.bufferedIDHolder.getValue());
assertEquals("Freddy", this.employee.getName());
assertEquals("Freddy", this.nameAdapter.getValue());
assertEquals("Freddy", this.bufferedNameHolder.getValue());
assertEquals(temp, this.employee.getHireDate());
assertEquals(temp, this.hireDateAdapter.getValue());
assertEquals(temp, this.bufferedHireDateHolder.getValue());
}
public void testLazyListening() {
assertTrue(((AbstractModel) this.bufferedIDHolder).hasNoPropertyChangeListeners(ValueModel.VALUE));
assertTrue(((AbstractModel) this.bufferedNameHolder).hasNoPropertyChangeListeners(ValueModel.VALUE));
assertTrue(((AbstractModel) this.bufferedHireDateHolder).hasNoPropertyChangeListeners(ValueModel.VALUE));
assertTrue(((AbstractModel) this.idAdapter).hasNoPropertyChangeListeners(ValueModel.VALUE));
assertTrue(((AbstractModel) this.nameAdapter).hasNoPropertyChangeListeners(ValueModel.VALUE));
assertTrue(((AbstractModel) this.hireDateAdapter).hasNoPropertyChangeListeners(ValueModel.VALUE));
assertTrue(this.employee.hasNoPropertyChangeListeners(Employee.ID_PROPERTY));
assertTrue(this.employee.hasNoPropertyChangeListeners(Employee.NAME_PROPERTY));
assertTrue(this.employee.hasNoPropertyChangeListeners(Employee.HIRE_DATE_PROPERTY));
PropertyChangeListener bufferedListener = this.buildBufferedListener();
this.bufferedIDHolder.addPropertyChangeListener(ValueModel.VALUE, bufferedListener);
this.bufferedNameHolder.addPropertyChangeListener(ValueModel.VALUE, bufferedListener);
this.bufferedHireDateHolder.addPropertyChangeListener(ValueModel.VALUE, bufferedListener);
assertTrue(((AbstractModel) this.bufferedIDHolder).hasAnyPropertyChangeListeners(ValueModel.VALUE));
assertTrue(((AbstractModel) this.bufferedNameHolder).hasAnyPropertyChangeListeners(ValueModel.VALUE));
assertTrue(((AbstractModel) this.bufferedHireDateHolder).hasAnyPropertyChangeListeners(ValueModel.VALUE));
assertTrue(((AbstractModel) this.idAdapter).hasAnyPropertyChangeListeners(ValueModel.VALUE));
assertTrue(((AbstractModel) this.nameAdapter).hasAnyPropertyChangeListeners(ValueModel.VALUE));
assertTrue(((AbstractModel) this.hireDateAdapter).hasAnyPropertyChangeListeners(ValueModel.VALUE));
assertTrue(this.employee.hasAnyPropertyChangeListeners(Employee.ID_PROPERTY));
assertTrue(this.employee.hasAnyPropertyChangeListeners(Employee.NAME_PROPERTY));
assertTrue(this.employee.hasAnyPropertyChangeListeners(Employee.HIRE_DATE_PROPERTY));
this.bufferedIDHolder.removePropertyChangeListener(ValueModel.VALUE, bufferedListener);
this.bufferedNameHolder.removePropertyChangeListener(ValueModel.VALUE, bufferedListener);
this.bufferedHireDateHolder.removePropertyChangeListener(ValueModel.VALUE, bufferedListener);
assertTrue(((AbstractModel) this.bufferedIDHolder).hasNoPropertyChangeListeners(ValueModel.VALUE));
assertTrue(((AbstractModel) this.bufferedNameHolder).hasNoPropertyChangeListeners(ValueModel.VALUE));
assertTrue(((AbstractModel) this.bufferedHireDateHolder).hasNoPropertyChangeListeners(ValueModel.VALUE));
assertTrue(((AbstractModel) this.idAdapter).hasNoPropertyChangeListeners(ValueModel.VALUE));
assertTrue(((AbstractModel) this.nameAdapter).hasNoPropertyChangeListeners(ValueModel.VALUE));
assertTrue(((AbstractModel) this.hireDateAdapter).hasNoPropertyChangeListeners(ValueModel.VALUE));
assertTrue(this.employee.hasNoPropertyChangeListeners(Employee.ID_PROPERTY));
assertTrue(this.employee.hasNoPropertyChangeListeners(Employee.NAME_PROPERTY));
assertTrue(this.employee.hasNoPropertyChangeListeners(Employee.HIRE_DATE_PROPERTY));
}
public void testPropertyChange1() {
PropertyChangeListener bufferedListener = this.buildBufferedListener();
this.bufferedNameHolder.addPropertyChangeListener(ValueModel.VALUE, bufferedListener);
PropertyChangeListener adapterListener = this.buildAdapterListener();
this.nameAdapter.addPropertyChangeListener(ValueModel.VALUE, adapterListener);
PropertyChangeListener employeeListener = this.buildEmployeeListener();
this.employee.addPropertyChangeListener(Employee.NAME_PROPERTY, employeeListener);
this.verifyPropertyChanges();
}
public void testPropertyChange2() {
PropertyChangeListener bufferedListener = this.buildBufferedListener();
this.bufferedNameHolder.addPropertyChangeListener(bufferedListener);
PropertyChangeListener adapterListener = this.buildAdapterListener();
this.nameAdapter.addPropertyChangeListener(adapterListener);
PropertyChangeListener employeeListener = this.buildEmployeeListener();
this.employee.addPropertyChangeListener(employeeListener);
this.verifyPropertyChanges();
}
private void verifyPropertyChanges() {
this.bufferedEvent = null;
this.adapterEvent = null;
this.employeeEvent = null;
this.bufferedNameHolder.setValue("Ripley");
this.verifyEvent(this.bufferedEvent, this.bufferedNameHolder, ValueModel.VALUE, "Freddy", "Ripley");
assertNull(this.adapterEvent);
assertNull(this.employeeEvent);
this.bufferedEvent = null;
this.adapterEvent = null;
this.employeeEvent = null;
this.bufferedNameHolder.setValue("Charlie");
this.verifyEvent(this.bufferedEvent, this.bufferedNameHolder, ValueModel.VALUE, "Ripley", "Charlie");
assertNull(this.adapterEvent);
assertNull(this.employeeEvent);
this.bufferedEvent = null;
this.adapterEvent = null;
this.employeeEvent = null;
this.trigger.accept();
assertNull(this.bufferedEvent);
this.verifyEvent(this.adapterEvent, this.nameAdapter, ValueModel.VALUE, "Freddy", "Charlie");
this.verifyEvent(this.employeeEvent, this.employee, Employee.NAME_PROPERTY, "Freddy", "Charlie");
this.bufferedEvent = null;
this.adapterEvent = null;
this.employeeEvent = null;
this.bufferedNameHolder.setValue("Jason");
this.verifyEvent(this.bufferedEvent, this.bufferedNameHolder, ValueModel.VALUE, "Charlie", "Jason");
assertNull(this.adapterEvent);
assertNull(this.employeeEvent);
this.bufferedEvent = null;
this.adapterEvent = null;
this.employeeEvent = null;
this.trigger.reset();
this.verifyEvent(this.bufferedEvent, this.bufferedNameHolder, ValueModel.VALUE, "Jason", "Charlie");
assertNull(this.adapterEvent);
assertNull(this.employeeEvent);
}
private PropertyChangeListener buildBufferedListener() {
return new PropertyChangeListener() {
public void propertyChange(PropertyChangeEvent e) {
BufferedPropertyValueModelTests.this.bufferedEvent = e;
}
};
}
private PropertyChangeListener buildAdapterListener() {
return new PropertyChangeListener() {
public void propertyChange(PropertyChangeEvent e) {
BufferedPropertyValueModelTests.this.adapterEvent = e;
}
};
}
private PropertyChangeListener buildEmployeeListener() {
return new PropertyChangeListener() {
public void propertyChange(PropertyChangeEvent e) {
BufferedPropertyValueModelTests.this.employeeEvent = e;
}
};
}
private void verifyEvent(PropertyChangeEvent event, Object source, String propertyName, Object oldValue, Object newValue) {
assertEquals(source, event.getSource());
assertEquals(propertyName, event.getPropertyName());
assertEquals(oldValue, event.getOldValue());
assertEquals(newValue, event.getNewValue());
}
// ********** inner class **********
private class Employee extends AbstractModel {
private int id;
public static final String ID_PROPERTY = "id";
private String name;
public static final String NAME_PROPERTY = "name";
private Date hireDate;
public static final String HIRE_DATE_PROPERTY = "hireDate";
Employee(int id, String name, Date hireDate) {
super();
this.id = id;
this.name = name;
this.hireDate = hireDate;
}
int getID() {
return this.id;
}
void setID(int id) {
int old = this.id;
this.id = id;
this.firePropertyChanged(ID_PROPERTY, old, id);
}
String getName() {
return this.name;
}
void setName(String name) {
Object old = this.name;
this.name = name;
this.firePropertyChanged(NAME_PROPERTY, old, name);
}
Date getHireDate() {
return this.hireDate;
}
void setHireDate(Date hireDate) {
Object old = this.hireDate;
this.hireDate = hireDate;
this.firePropertyChanged(HIRE_DATE_PROPERTY, old, hireDate);
}
public void toString(StringBuffer sb) {
sb.append(this.name);
}
}
}