001: /*******************************************************************************
002: * Copyright (c) 2007 Brad Reynolds and others.
003: * All rights reserved. This program and the accompanying materials
004: * are made available under the terms of the Eclipse Public License v1.0
005: * which accompanies this distribution, and is available at
006: * http://www.eclipse.org/legal/epl-v10.html
007: *
008: * Contributors:
009: * Brad Reynolds - initial API and implementation
010: ******************************************************************************/package org.eclipse.jface.conformance.databinding;
011:
012: import java.util.ArrayList;
013: import java.util.List;
014:
015: import org.eclipse.core.databinding.observable.ChangeEvent;
016: import org.eclipse.core.databinding.observable.IChangeListener;
017: import org.eclipse.core.databinding.observable.value.IObservableValue;
018: import org.eclipse.core.databinding.observable.value.IValueChangeListener;
019: import org.eclipse.core.databinding.observable.value.ValueChangeEvent;
020: import org.eclipse.jface.tests.databinding.RealmTester;
021: import org.eclipse.jface.tests.databinding.EventTrackers.ValueChangeEventTracker;
022: import org.eclipse.jface.tests.databinding.RealmTester.CurrentRealm;
023:
024: /**
025: * @since 3.2
026: */
027: public class ObservableValueContractTest extends ObservableContractTest {
028: private IObservableValueContractDelegate delegate;
029: private IObservableValue observable;
030:
031: public ObservableValueContractTest(
032: IObservableValueContractDelegate delegate) {
033: super (delegate);
034: this .delegate = delegate;
035: }
036:
037: /**
038: * @param testName
039: * @param delegate
040: */
041: public ObservableValueContractTest(String testName,
042: IObservableValueContractDelegate delegate) {
043: super (testName, delegate);
044: this .delegate = delegate;
045: }
046:
047: /*
048: * (non-Javadoc)
049: *
050: * @see org.eclipse.jface.conformance.databinding.ObservableContractTest#setUp()
051: */
052: protected void setUp() throws Exception {
053: super .setUp();
054: observable = (IObservableValue) getObservable();
055: }
056:
057: public void testChange_ValueChangeEvent() throws Exception {
058: ValueChangeEventTracker listener = new ValueChangeEventTracker()
059: .register(observable);
060:
061: delegate.change(observable);
062: assertEquals(
063: formatFail("On change value change listeners should be notified."),
064: 1, listener.count);
065: }
066:
067: public void testGetValueType_ExpectedType() throws Exception {
068: assertEquals(
069: formatFail("Type of the value should be returned from getType()."),
070: delegate.getValueType(observable), observable
071: .getValueType());
072: }
073:
074: public void testChange_OrderOfNotifications() throws Exception {
075: final List listeners = new ArrayList();
076: IChangeListener changeListener = new IChangeListener() {
077: public void handleChange(ChangeEvent event) {
078: listeners.add(this );
079: }
080: };
081:
082: IValueChangeListener valueChangeListener = new IValueChangeListener() {
083: public void handleValueChange(ValueChangeEvent event) {
084: listeners.add(this );
085: }
086: };
087:
088: observable.addChangeListener(changeListener);
089: observable.addValueChangeListener(valueChangeListener);
090:
091: delegate.change(observable);
092:
093: assertTrue(
094: formatFail("Change Listeners were not notified on change."),
095: listeners.size() > 0);
096:
097: // not asserting the fact that both are notified as this is asserted in
098: // other tests
099: assertEquals(
100: formatFail("Change listeners should be notified before value change listeners."),
101: changeListener, listeners.get(0));
102: assertEquals(
103: formatFail("Value change listeners should be notified after change listeners."),
104: valueChangeListener, listeners.get(1));
105: }
106:
107: public void testChange_ValueChangeEventDiff() throws Exception {
108: ValueChangeEventTracker listener = new ValueChangeEventTracker()
109: .register(observable);
110: Object oldValue = observable.getValue();
111:
112: delegate.change(observable);
113:
114: ValueChangeEvent event = listener.event;
115:
116: assertTrue(
117: formatFail("Change Listeners were not notified on change."),
118: listener.count > 0);
119:
120: assertEquals(
121: formatFail("When a value change event is fired the old value should be the previous value of the observable value."),
122: oldValue, event.diff.getOldValue());
123: assertEquals(
124: formatFail("When a value change event is fired the new value should be the same as the current value of the observable value."),
125: observable.getValue(), event.diff.getNewValue());
126: }
127:
128: public void testChange_ValueChangeEventFiredAfterValueIsSet()
129: throws Exception {
130: class ValueChangeListener extends ValueChangeEventTracker {
131: Object value;
132:
133: public void handleValueChange(ValueChangeEvent event) {
134: super .handleValueChange(event);
135:
136: this .value = event.getObservableValue().getValue();
137: }
138: }
139:
140: ValueChangeListener listener = (ValueChangeListener) new ValueChangeListener()
141: .register(observable);
142: delegate.change(observable);
143: assertEquals(
144: formatFail("When a value change event is fired the new value should be applied before firing the change event."),
145: listener.value, observable.getValue());
146: }
147:
148: public void testRemoveValueChangeListener_RemovesListener()
149: throws Exception {
150: ValueChangeEventTracker listener = new ValueChangeEventTracker()
151: .register(observable);
152: delegate.change(observable);
153:
154: // precondition
155: assertEquals(
156: formatFail("Value change listeners should be notified on change."),
157: 1, listener.count);
158:
159: observable.removeValueChangeListener(listener);
160: delegate.change(observable);
161:
162: assertEquals(
163: formatFail("Value change listeners should not be notified after they've been removed from the observable."),
164: 1, listener.count);
165: }
166:
167: public void testGetValue_GetterCalled() throws Exception {
168: assertGetterCalled(new Runnable() {
169: public void run() {
170: observable.getValue();
171: }
172: }, formatFail("IObservableValue.getValue()"), observable);
173: }
174:
175: public void testGetValue_RealmCheck() throws Exception {
176: RealmTester.exerciseCurrent(new Runnable() {
177: public void run() {
178: observable.getValue();
179: }
180: }, (CurrentRealm) observable.getRealm());
181: }
182: }
|