001: /*******************************************************************************
002: * Copyright (c) 2006 Brad Reynolds.
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: * Brad Reynolds - bug 116920
011: *******************************************************************************/package org.eclipse.jface.tests.internal.databinding.internal.viewers;
012:
013: import junit.framework.TestCase;
014:
015: import org.eclipse.core.databinding.observable.list.ListDiffEntry;
016: import org.eclipse.jface.databinding.swt.SWTObservables;
017: import org.eclipse.jface.internal.databinding.internal.viewers.SelectionProviderMultipleSelectionObservableList;
018: import org.eclipse.jface.tests.databinding.EventTrackers.ListChangeEventTracker;
019: import org.eclipse.jface.viewers.ISelectionProvider;
020: import org.eclipse.jface.viewers.IStructuredContentProvider;
021: import org.eclipse.jface.viewers.IStructuredSelection;
022: import org.eclipse.jface.viewers.StructuredSelection;
023: import org.eclipse.jface.viewers.TableViewer;
024: import org.eclipse.jface.viewers.Viewer;
025: import org.eclipse.swt.SWT;
026: import org.eclipse.swt.widgets.Display;
027: import org.eclipse.swt.widgets.Shell;
028:
029: /**
030: * Tests for SelectionProviderMultiSelectionObservableList.
031: *
032: * @since 1.2
033: */
034: public class SelectionProviderMultiSelectionObservableListTest extends
035: TestCase {
036: private ISelectionProvider selectionProvider;
037:
038: private TableViewer viewer;
039:
040: private static String[] model = new String[] { "0", "1", "2", "3" };
041:
042: protected void setUp() throws Exception {
043: Shell shell = new Shell();
044: viewer = new TableViewer(shell, SWT.MULTI);
045: viewer.setContentProvider(new ContentProvider());
046: viewer.setInput(model);
047: selectionProvider = viewer;
048: }
049:
050: protected void tearDown() throws Exception {
051: Shell shell = viewer.getTable().getShell();
052: if (!shell.isDisposed())
053: shell.dispose();
054: }
055:
056: public void testConstructorIllegalArgumentException() {
057: try {
058: new SelectionProviderMultipleSelectionObservableList(
059: SWTObservables.getRealm(Display.getDefault()),
060: null, Object.class);
061: fail();
062: } catch (IllegalArgumentException e) {
063: }
064: }
065:
066: /**
067: * Asserts that when a selection is set on the viewer:
068: * <ul>
069: * <li>the selection is available in the observable</li>
070: * <li>Value change events are fired with appropriate diff values</li>
071: * </ul>
072: */
073: public void testAddRemove() {
074: SelectionProviderMultipleSelectionObservableList observable = new SelectionProviderMultipleSelectionObservableList(
075: SWTObservables.getRealm(Display.getDefault()),
076: selectionProvider, Object.class);
077: ListChangeEventTracker listener = new ListChangeEventTracker();
078: observable.addListChangeListener(listener);
079: assertEquals(0, observable.size());
080:
081: selectionProvider
082: .setSelection(new StructuredSelection(model[0]));
083: assertEquals(1, listener.count);
084: assertEquals(1, listener.event.diff.getDifferences().length);
085: assertDiffEntry(listener.event.diff.getDifferences()[0], 0,
086: model[0], true);
087: assertEquals(observable, listener.event.getObservableList());
088: assertEquals(1, observable.size());
089: assertEquals(model[0], observable.get(0));
090:
091: selectionProvider
092: .setSelection(new StructuredSelection(model[1]));
093: assertEquals(2, listener.count);
094: assertEquals(2, listener.event.diff.getDifferences().length);
095: assertDiffEntry(listener.event.diff.getDifferences()[0], 0,
096: model[1], true);
097: assertDiffEntry(listener.event.diff.getDifferences()[1], 1,
098: model[0], false);
099: assertEquals(observable, listener.event.getObservableList());
100: assertEquals(1, observable.size());
101: assertEquals(model[1], observable.get(0));
102:
103: selectionProvider.setSelection(new StructuredSelection(
104: new Object[] { model[2], model[3] }));
105: assertEquals(3, listener.count);
106: assertEquals(3, listener.event.diff.getDifferences().length);
107: assertDiffEntry(listener.event.diff.getDifferences()[0], 0,
108: model[2], true);
109: assertDiffEntry(listener.event.diff.getDifferences()[1], 1,
110: model[3], true);
111: assertDiffEntry(listener.event.diff.getDifferences()[2], 2,
112: model[1], false);
113: assertEquals(observable, listener.event.getObservableList());
114: assertEquals(2, observable.size());
115: assertEquals(model[2], observable.get(0));
116: assertEquals(model[3], observable.get(1));
117:
118: selectionProvider.setSelection(StructuredSelection.EMPTY);
119: assertEquals(4, listener.count);
120: assertEquals(2, listener.event.diff.getDifferences().length);
121: assertDiffEntry(listener.event.diff.getDifferences()[0], 1,
122: model[3], false);
123: assertDiffEntry(listener.event.diff.getDifferences()[1], 0,
124: model[2], false);
125: assertEquals(observable, listener.event.getObservableList());
126: assertEquals(0, observable.size());
127:
128: observable.add(model[1]);
129: assertEquals(5, listener.count);
130: assertEquals(1, listener.event.diff.getDifferences().length);
131: assertDiffEntry(listener.event.diff.getDifferences()[0], 0,
132: model[1], true);
133: assertEquals(observable, listener.event.getObservableList());
134: assertEquals(1, ((IStructuredSelection) viewer.getSelection())
135: .size());
136:
137: observable.add(0, model[2]);
138: assertEquals(6, listener.count);
139: assertEquals(1, listener.event.diff.getDifferences().length);
140: // This is a bit surprising (we added at index 0 but the event says index 1).
141: // It is to the fact that the observable list tracks the underlying selection
142: // provider's notion of which element is at which index.
143: assertDiffEntry(listener.event.diff.getDifferences()[0], 1,
144: model[2], true);
145: assertEquals(observable, listener.event.getObservableList());
146: assertEquals(2, ((IStructuredSelection) viewer.getSelection())
147: .size());
148:
149: observable.clear();
150: assertEquals(7, listener.count);
151: assertEquals(2, listener.event.diff.getDifferences().length);
152: assertDiffEntry(listener.event.diff.getDifferences()[0], 1,
153: model[2], false);
154: assertDiffEntry(listener.event.diff.getDifferences()[1], 0,
155: model[1], false);
156: assertEquals(observable, listener.event.getObservableList());
157: assertEquals(0, ((IStructuredSelection) viewer.getSelection())
158: .size());
159: }
160:
161: /**
162: * @param diffEntry
163: * @param position
164: * @param element
165: * @param isAddition
166: */
167: private void assertDiffEntry(ListDiffEntry diffEntry, int position,
168: String element, boolean isAddition) {
169: assertEquals(isAddition, diffEntry.isAddition());
170: assertEquals(position, diffEntry.getPosition());
171: assertEquals(element, diffEntry.getElement());
172: }
173:
174: private class ContentProvider implements IStructuredContentProvider {
175: public void dispose() {
176: // TODO Auto-generated method stub
177:
178: }
179:
180: public void inputChanged(Viewer viewer, Object oldInput,
181: Object newInput) {
182: // TODO Auto-generated method stub
183:
184: }
185:
186: public Object[] getElements(Object inputElement) {
187: return (String[]) inputElement;
188: }
189: }
190: }
|