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.Arrays;
014: import java.util.List;
015: import java.util.Set;
016:
017: import org.eclipse.core.databinding.observable.set.IObservableSet;
018: import org.eclipse.jface.tests.databinding.EventTrackers.ChangeEventTracker;
019: import org.eclipse.jface.tests.databinding.EventTrackers.SetChangeEventTracker;
020:
021: /**
022: */
023: public class MutableObservableSetContractTest extends
024: MutableObservableCollectionContractTest {
025: private IObservableCollectionContractDelegate delegate;
026:
027: private IObservableSet set;
028:
029: public MutableObservableSetContractTest(String testName,
030: IObservableCollectionContractDelegate delegate) {
031: super (testName, delegate);
032: this .delegate = delegate;
033: }
034:
035: /**
036: * @param delegate
037: */
038: public MutableObservableSetContractTest(
039: IObservableCollectionContractDelegate delegate) {
040: super (delegate);
041: }
042:
043: protected void setUp() throws Exception {
044: super .setUp();
045: set = (IObservableSet) getObservable();
046: }
047:
048: public void testAdd_SetChangeEvent() throws Exception {
049: assertSetChangeEventFired(new Runnable() {
050: public void run() {
051: set.add(delegate.createElement(set));
052: }
053: }, "Set.add(Object)", set);
054: }
055:
056: public void testAdd_SetDiffEntry() throws Exception {
057: set.add(delegate.createElement(set));
058: final Object element = delegate.createElement(set);
059:
060: assertAddDiffEntry(new Runnable() {
061: public void run() {
062: set.add(element);
063: }
064: }, "Set.add(Object)", set, element);
065: }
066:
067: public void testAddAll_SetChangeEvent() throws Exception {
068: assertSetChangeEventFired(new Runnable() {
069: public void run() {
070: set.addAll(Arrays.asList(new Object[] { delegate
071: .createElement(set) }));
072: }
073: }, "Set.addAll(Collection", set);
074: }
075:
076: public void testAddAll_SetDiffEntry() throws Exception {
077: final Object element = delegate.createElement(set);
078:
079: assertAddDiffEntry(new Runnable() {
080: public void run() {
081: set.addAll(Arrays.asList(new Object[] { element }));
082: }
083: }, "Set.addAll(Collection)", set, element);
084: }
085:
086: public void testRemove_SetChangeEvent() throws Exception {
087: final Object element = delegate.createElement(set);
088: set.add(element);
089:
090: assertSetChangeEventFired(new Runnable() {
091: public void run() {
092: set.remove(element);
093: }
094: }, "Set.remove(Object)", set);
095: }
096:
097: public void testRemove_SetDiffEntry() throws Exception {
098: set.add(delegate.createElement(set));
099: final Object element = delegate.createElement(set);
100: set.add(element);
101:
102: assertRemoveDiffEntry(new Runnable() {
103: public void run() {
104: set.remove(element);
105: }
106: }, "Set.remove(Object)", set, element);
107: }
108:
109: public void testRemoveAll_SetChangeEvent() throws Exception {
110: final Object element = delegate.createElement(set);
111: set.add(element);
112:
113: assertSetChangeEventFired(new Runnable() {
114: public void run() {
115: set.removeAll(Arrays.asList(new Object[] { element }));
116: }
117: }, "Set.removeAll(Collection)", set);
118: }
119:
120: public void testRemoveAll_SetDiffEntry() throws Exception {
121: final Object element = delegate.createElement(set);
122: set.add(element);
123:
124: assertRemoveDiffEntry(new Runnable() {
125: public void run() {
126: set.removeAll(Arrays.asList(new Object[] { element }));
127: }
128: }, "Set.removeAll(Collection)", set, element);
129: }
130:
131: public void testRetainAll_SetChangeEvent() throws Exception {
132: final Object element1 = delegate.createElement(set);
133: set.add(element1);
134: set.add(delegate.createElement(set));
135:
136: assertSetChangeEventFired(new Runnable() {
137: public void run() {
138: set.retainAll(Arrays.asList(new Object[] { element1 }));
139: }
140: }, "Set.retainAll(Collection", set);
141: }
142:
143: public void testRetainAll_SetDiffEntry() throws Exception {
144: final Object element1 = delegate.createElement(set);
145: set.add(element1);
146: Object element2 = delegate.createElement(set);
147: set.add(delegate.createElement(set));
148:
149: assertRemoveDiffEntry(new Runnable() {
150: public void run() {
151: set.retainAll(Arrays.asList(new Object[] { element1 }));
152: }
153: }, "Set.retainAll(Collection)", set, element2);
154: }
155:
156: public void testClear_SetChangeEvent() throws Exception {
157: set.add(delegate.createElement(set));
158:
159: assertSetChangeEventFired(new Runnable() {
160: public void run() {
161: set.clear();
162: }
163: }, "Set.clear()", set);
164: }
165:
166: public void testClear_SetDiffEntry() throws Exception {
167: Object element = delegate.createElement(set);
168: set.add(element);
169:
170: assertRemoveDiffEntry(new Runnable() {
171: public void run() {
172: set.clear();
173: }
174: }, "Set.clear()", set, element);
175: }
176:
177: /**
178: * Asserts standard behaviors of firing set change events.
179: * <ul>
180: * <li>Event fires once.</li>
181: * <li>Source of the event is the provided <code>set</code>.
182: * <li>The set change event is fired after the change event.</li>
183: * </ul>
184: *
185: * @param runnable
186: * @param methodName
187: * @param set
188: */
189: private void assertSetChangeEventFired(Runnable runnable,
190: String methodName, IObservableSet set) {
191: List queue = new ArrayList();
192: SetChangeEventTracker setListener = new SetChangeEventTracker(
193: queue);
194: ChangeEventTracker changeListener = new ChangeEventTracker(
195: queue);
196:
197: set.addSetChangeListener(setListener);
198: set.addChangeListener(changeListener);
199:
200: runnable.run();
201:
202: assertEquals(formatFail(methodName
203: + " should fire one SetChangeEvent."), 1,
204: setListener.count);
205: assertEquals(
206: formatFail(methodName
207: + "'s change event observable should be the created Set."),
208: set, setListener.event.getObservable());
209:
210: assertEquals(
211: formatFail("Two notifications should have been received."),
212: 2, queue.size());
213: assertEquals(formatFail("ChangeEvent of " + methodName
214: + " should have fired before the SetChangeEvent."),
215: changeListener, queue.get(0));
216: assertEquals(formatFail("SetChangeEvent of " + methodName
217: + " should have fired after the ChangeEvent."),
218: setListener, queue.get(1));
219: }
220:
221: /**
222: * Asserts the set diff entry for an add operation.
223: *
224: * @param runnable
225: * @param methodName
226: * @param set
227: * @param element
228: */
229: private void assertAddDiffEntry(Runnable runnable,
230: String methodName, IObservableSet set, Object element) {
231: SetChangeEventTracker listener = new SetChangeEventTracker();
232: set.addSetChangeListener(listener);
233:
234: runnable.run();
235:
236: Set entries = listener.event.diff.getAdditions();
237: assertEquals(formatFail(methodName
238: + " should result in one diff entry."), 1, entries
239: .size());
240:
241: assertTrue(
242: formatFail(methodName
243: + " should result in a diff entry that is an addition."),
244: entries.contains(element));
245: }
246:
247: /**
248: * Asserts the set diff entry for a remove operation.
249: *
250: * @param runnable
251: * @param methodName
252: * @param set
253: * @param element
254: */
255: private void assertRemoveDiffEntry(Runnable runnable,
256: String methodName, IObservableSet set, Object element) {
257: SetChangeEventTracker listener = new SetChangeEventTracker();
258: set.addSetChangeListener(listener);
259:
260: runnable.run();
261:
262: Set entries = listener.event.diff.getRemovals();
263: assertEquals(formatFail(methodName
264: + " should result in one diff entry."), 1, entries
265: .size());
266:
267: assertTrue(
268: formatFail(methodName
269: + " should result in a diff entry that is an addition."),
270: entries.contains(element));
271: }
272: }
|