blob: 4e6f855dde51f7273c87ec838571baf081e39381 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006-2008 Brad Reynolds 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
* Matthew Hall - bugs 184830, 233306
******************************************************************************/
package org.eclipse.core.tests.databinding.observable.map;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import org.eclipse.core.databinding.observable.Realm;
import org.eclipse.core.databinding.observable.map.MapChangeEvent;
import org.eclipse.core.databinding.observable.map.MapDiff;
import org.eclipse.core.databinding.observable.map.WritableMap;
import org.eclipse.jface.databinding.conformance.util.CurrentRealm;
import org.eclipse.jface.databinding.conformance.util.MapChangeEventTracker;
import org.eclipse.jface.databinding.conformance.util.RealmTester;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
/**
* @since 3.2
*
*/
public class WritableMapTest {
@Before
public void setUp() throws Exception {
RealmTester.setDefault(new CurrentRealm(true));
}
@After
public void tearDown() throws Exception {
RealmTester.setDefault(null);
}
@Test
public void testPutRealmChecks() throws Exception {
RealmTester.exerciseCurrent(new Runnable() {
@Override
public void run() {
WritableMap map = new WritableMap();
map.put("", "");
}
});
}
@Test
public void testRemoveRealmChecks() throws Exception {
RealmTester.exerciseCurrent(new Runnable() {
@Override
public void run() {
WritableMap map = new WritableMap();
CurrentRealm realm = (CurrentRealm) Realm.getDefault();
boolean current = realm.isCurrent();
realm.setCurrent(true);
map.put("", "");
realm.setCurrent(current);
map.remove("");
}
});
}
@Test
public void testClearRealmChecks() throws Exception {
RealmTester.exerciseCurrent(new Runnable() {
@Override
public void run() {
WritableMap map = new WritableMap();
map.clear();
}
});
}
@Test
public void testPutAllRealmChecks() throws Exception {
RealmTester.exerciseCurrent(new Runnable() {
@Override
public void run() {
WritableMap map = new WritableMap();
map.putAll(Collections.EMPTY_MAP);
}
});
}
@Test
public void testPutWithExistingKeyMapChangeEvent() throws Exception {
WritableMap map = new WritableMap();
String key = "key";
String value = "value";
map.put(key, value);
MapChangeEventTracker listener = new MapChangeEventTracker();
map.addMapChangeListener(listener);
assertEquals(0, listener.count);
String newValue = "new value";
map.put(key, newValue);
assertEquals(1, listener.count);
MapChangeEvent event = listener.event;
Set changedKeys = event.diff.getChangedKeys();
assertEquals(1, changedKeys.size());
assertTrue(changedKeys.contains(key));
assertEquals(value, event.diff.getOldValue(key));
assertEquals(newValue, event.diff.getNewValue(key));
}
@Test
public void testPutSameValue_NoMapChangeEvent() {
WritableMap map = new WritableMap();
Object key = new Object();
Object value = "value";
map.put(key, value);
MapChangeEventTracker tracker = MapChangeEventTracker.observe(map);
assertEquals(0, tracker.count);
Object equalValue = new String("value");
map.put(key, equalValue);
assertEquals(0, tracker.count);
}
@Test
public void testPutNullKey_SingleAdditionChangeEvent() {
WritableMap map = new WritableMap();
MapChangeEventTracker tracker = MapChangeEventTracker.observe(map);
assertEquals(0, tracker.count);
Object key = null;
Object value = new Object();
map.put(key, value);
assertEquals(1, tracker.count);
MapDiff diff = tracker.event.diff;
assertEquals(Collections.singleton(key), diff.getAddedKeys());
assertEquals(Collections.EMPTY_SET, diff.getChangedKeys());
assertEquals(Collections.EMPTY_SET, diff.getRemovedKeys());
assertEquals(value, diff.getNewValue(key));
}
@Test
public void testRemoveNullKey_SingleRemovalChangeEvent() {
WritableMap map = new WritableMap();
Object key = null;
Object value = new Object();
map.put(key, value);
MapChangeEventTracker tracker = MapChangeEventTracker.observe(map);
map.remove(key);
assertEquals(1, tracker.count);
MapDiff diff = tracker.event.diff;
assertEquals(Collections.EMPTY_SET, diff.getAddedKeys());
assertEquals(Collections.EMPTY_SET, diff.getChangedKeys());
assertEquals(Collections.singleton(key), diff.getRemovedKeys());
assertEquals(value, diff.getOldValue(key));
}
@Test
public void testPutNullValue_SingleAdditionChangeEvent() {
WritableMap map = new WritableMap();
MapChangeEventTracker tracker = MapChangeEventTracker.observe(map);
assertEquals(0, tracker.count);
Object key = new Object();
Object value = null;
map.put(key, value);
assertEquals(1, tracker.count);
MapDiff diff = tracker.event.diff;
assertEquals(Collections.singleton(key), diff.getAddedKeys());
assertEquals(Collections.EMPTY_SET, diff.getChangedKeys());
assertEquals(Collections.EMPTY_SET, diff.getRemovedKeys());
assertEquals(value, diff.getNewValue(key));
}
@Test
public void testPutNullOverNonNullValue_SingleChangeEvent() {
WritableMap map = new WritableMap();
Object key = new Object();
Object oldValue = new Object();
map.put(key, oldValue);
MapChangeEventTracker tracker = MapChangeEventTracker.observe(map);
Object newValue = null;
map.put(key, newValue);
assertEquals(1, tracker.count);
MapDiff diff = tracker.event.diff;
assertEquals(Collections.EMPTY_SET, diff.getAddedKeys());
assertEquals(Collections.singleton(key), diff.getChangedKeys());
assertEquals(Collections.EMPTY_SET, diff.getRemovedKeys());
assertEquals(oldValue, diff.getOldValue(key));
assertEquals(newValue, diff.getNewValue(key));
}
@Test
public void testPutNonNullOverNullValue_SingleChangeEvent() {
WritableMap map = new WritableMap();
Object key = new Object();
Object oldValue = null;
map.put(key, oldValue);
MapChangeEventTracker tracker = MapChangeEventTracker.observe(map);
Object newValue = new Object();
map.put(key, newValue);
assertEquals(1, tracker.count);
MapDiff diff = tracker.event.diff;
assertEquals(Collections.EMPTY_SET, diff.getAddedKeys());
assertEquals(Collections.singleton(key), diff.getChangedKeys());
assertEquals(Collections.EMPTY_SET, diff.getRemovedKeys());
assertEquals(oldValue, diff.getOldValue(key));
assertEquals(newValue, diff.getNewValue(key));
}
@Test
public void testRemoveNullValue_SingleRemovalChangeEvent() {
WritableMap map = new WritableMap();
Object key = new Object();
Object value = null;
map.put(key, value);
MapChangeEventTracker tracker = MapChangeEventTracker.observe(map);
map.remove(key);
assertEquals(1, tracker.count);
MapDiff diff = tracker.event.diff;
assertEquals(Collections.EMPTY_SET, diff.getAddedKeys());
assertEquals(Collections.EMPTY_SET, diff.getChangedKeys());
assertEquals(Collections.singleton(key), diff.getRemovedKeys());
assertEquals(value, diff.getOldValue(key));
}
@Test
public void testPutAllNullValue_SingleAdditionChangeEvent() {
WritableMap map = new WritableMap();
MapChangeEventTracker tracker = MapChangeEventTracker.observe(map);
Object key = new Object();
Object value = null;
Map other = new HashMap();
other.put(key, value);
map.putAll(other);
assertEquals(1, tracker.count);
MapDiff diff = tracker.event.diff;
assertEquals(Collections.singleton(key), diff.getAddedKeys());
assertEquals(Collections.EMPTY_SET, diff.getChangedKeys());
assertEquals(Collections.EMPTY_SET, diff.getRemovedKeys());
assertEquals(value, diff.getNewValue(key));
}
@Test
public void testPutAllNullValueToNonNullValue_SingleChangeEvent() {
WritableMap map = new WritableMap();
Object key = new Object();
Object oldValue = null;
map.put(key, oldValue);
MapChangeEventTracker tracker = MapChangeEventTracker.observe(map);
Object newValue = new Object();
Map other = new HashMap();
other.put(key, newValue);
map.putAll(other);
assertEquals(1, tracker.count);
MapDiff diff = tracker.event.diff;
assertEquals(Collections.EMPTY_SET, diff.getAddedKeys());
assertEquals(Collections.singleton(key), diff.getChangedKeys());
assertEquals(Collections.EMPTY_SET, diff.getRemovedKeys());
assertEquals(oldValue, diff.getOldValue(key));
assertEquals(newValue, diff.getNewValue(key));
}
@Test
public void testPutAllNonNullValueToNullValue_SingleChangeEvent() {
WritableMap map = new WritableMap();
Object key = new Object();
Object oldValue = new Object();
map.put(key, oldValue);
MapChangeEventTracker tracker = MapChangeEventTracker.observe(map);
Object newValue = null;
Map other = new HashMap();
other.put(key, newValue);
map.putAll(other);
assertEquals(1, tracker.count);
MapDiff diff = tracker.event.diff;
assertEquals(Collections.EMPTY_SET, diff.getAddedKeys());
assertEquals(Collections.singleton(key), diff.getChangedKeys());
assertEquals(Collections.EMPTY_SET, diff.getRemovedKeys());
assertEquals(oldValue, diff.getOldValue(key));
assertEquals(newValue, diff.getNewValue(key));
}
}