blob: d23677ceb626a2a11f309b91bfb9e412b32422a0 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006, 2009 Matthew and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Brad Reynolds - initial API and implementation
* (through UnmodifiableObservableListTest.java)
* Matthew Hall - bugs 208332, 213145, 237718
* Ovidio Mallo - bug 247741
******************************************************************************/
package org.eclipse.core.tests.internal.databinding.observable;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
import org.eclipse.core.databinding.observable.Diffs;
import org.eclipse.core.databinding.observable.IObservable;
import org.eclipse.core.databinding.observable.IObservableCollection;
import org.eclipse.core.databinding.observable.Observables;
import org.eclipse.core.databinding.observable.Realm;
import org.eclipse.core.databinding.observable.set.IObservableSet;
import org.eclipse.core.databinding.observable.set.ObservableSet;
import org.eclipse.core.databinding.observable.set.WritableSet;
import org.eclipse.core.internal.databinding.observable.UnmodifiableObservableSet;
import org.eclipse.jface.databinding.conformance.ObservableCollectionContractTest;
import org.eclipse.jface.databinding.conformance.delegate.AbstractObservableCollectionContractDelegate;
import org.eclipse.jface.databinding.conformance.util.ChangeEventTracker;
import org.eclipse.jface.databinding.conformance.util.SetChangeEventTracker;
import org.eclipse.jface.databinding.conformance.util.StaleEventTracker;
import org.eclipse.jface.tests.databinding.AbstractDefaultRealmTestCase;
import org.junit.Before;
import org.junit.Test;
import junit.framework.TestSuite;
public class UnmodifiableObservableSetTest extends AbstractDefaultRealmTestCase {
UnmodifiableObservableSet unmodifiable;
MutableObservableSet mutable;
@Override
@Before
public void setUp() throws Exception {
super.setUp();
Set set = new HashSet();
set.add("1");
set.add("2");
mutable = new MutableObservableSet(set, String.class);
unmodifiable = (UnmodifiableObservableSet) Observables
.unmodifiableObservableSet(mutable);
}
@Test
public void testFiresChangeEvents() throws Exception {
ChangeEventTracker mutableListener = new ChangeEventTracker();
ChangeEventTracker unmodifiableListener = new ChangeEventTracker();
mutable.addChangeListener(mutableListener);
unmodifiable.addChangeListener(unmodifiableListener);
assertEquals(0, mutableListener.count);
assertEquals(0, unmodifiableListener.count);
mutable.add("3");
assertEquals(1, mutableListener.count);
assertEquals(1, unmodifiableListener.count);
}
@Test
public void testFiresSetChangeEvents() throws Exception {
SetChangeEventTracker mutableListener = new SetChangeEventTracker();
SetChangeEventTracker unmodifiableListener = new SetChangeEventTracker();
mutable.addSetChangeListener(mutableListener);
unmodifiable.addSetChangeListener(unmodifiableListener);
assertEquals(0, mutableListener.count);
assertEquals(0, unmodifiableListener.count);
String element = "3";
mutable.add(element);
assertEquals(1, mutableListener.count);
assertEquals(mutable, mutableListener.event.getObservableSet());
assertEquals(1, mutableListener.event.diff.getAdditions().size());
Object addition = mutableListener.event.diff.getAdditions().toArray()[0];
assertEquals(element, addition);
assertEquals(3, mutable.size());
assertEquals(1, unmodifiableListener.count);
assertEquals(unmodifiable, unmodifiableListener.event.getObservableSet());
assertEquals(1, unmodifiableListener.event.diff.getAdditions().size());
addition = unmodifiableListener.event.diff.getAdditions().toArray()[0];
assertEquals(element, addition);
assertEquals(3, unmodifiable.size());
}
@Test
public void testFiresStaleEvents() throws Exception {
StaleEventTracker mutableListener = new StaleEventTracker();
StaleEventTracker unmodifiableListener = new StaleEventTracker();
mutable.addStaleListener(mutableListener);
unmodifiable.addStaleListener(unmodifiableListener);
assertEquals(0, mutableListener.count);
assertEquals(0, unmodifiableListener.count);
mutable.setStale(true);
assertEquals(1, mutableListener.count);
assertEquals(mutable, mutableListener.event.getObservable());
assertTrue(mutable.isStale());
assertEquals(1, unmodifiableListener.count);
assertEquals(unmodifiable, unmodifiableListener.event.getObservable());
assertTrue(unmodifiable.isStale());
}
@Test
public void testIsStale() throws Exception {
assertFalse(mutable.isStale());
assertFalse(unmodifiable.isStale());
mutable.setStale(true);
assertTrue(mutable.isStale());
assertTrue(unmodifiable.isStale());
}
private static class MutableObservableSet extends ObservableSet {
/**
* @param wrappedList
* @param elementType
*/
public MutableObservableSet(Set wrappedSet, Object elementType) {
super(wrappedSet, elementType);
}
@Override
public boolean add(Object o) {
boolean result = wrappedSet.add(o);
if (result)
fireSetChange(Diffs.createSetDiff(Collections.singleton(o),
Collections.EMPTY_SET));
return result;
}
}
public static void addConformanceTest(TestSuite suite) {
suite.addTest(ObservableCollectionContractTest.suite(new Delegate()));
}
private static class Delegate extends
AbstractObservableCollectionContractDelegate {
private Object elementType = new Object();
@Override
public IObservableCollection createObservableCollection(Realm realm,
int elementCount) {
IObservableSet backingList = new WritableSet(realm, new HashSet(),
elementType);
IObservableSet result = new UnmodifiableObservableSetStub(
backingList);
for (int i = 0; i < elementCount; i++)
backingList.add(createElement(result));
return result;
}
@Override
public Object createElement(IObservableCollection collection) {
return new Object();
}
@Override
public Object getElementType(IObservableCollection collection) {
return elementType;
}
@Override
public void change(IObservable observable) {
UnmodifiableObservableSetStub unmodifiableList = (UnmodifiableObservableSetStub) observable;
IObservableSet wrappedList = unmodifiableList.wrappedSet;
wrappedList.add(createElement(unmodifiableList));
}
}
private static class UnmodifiableObservableSetStub extends
UnmodifiableObservableSet {
IObservableSet wrappedSet;
UnmodifiableObservableSetStub(IObservableSet wrappedSet) {
super(wrappedSet);
this.wrappedSet = wrappedSet;
}
}
}