| /******************************************************************************* |
| * Copyright (c) 2007, 2008 IBM Corporation 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: |
| * IBM Corporation - initial API and implementation |
| *******************************************************************************/ |
| |
| package org.eclipse.core.tests.databinding.observable.map; |
| |
| import java.util.Collections; |
| |
| import org.eclipse.core.databinding.beans.BeansObservables; |
| import org.eclipse.core.databinding.observable.IObservable; |
| import org.eclipse.core.databinding.observable.map.CompositeMap; |
| import org.eclipse.core.databinding.observable.map.IObservableMap; |
| import org.eclipse.core.databinding.observable.masterdetail.IObservableFactory; |
| import org.eclipse.core.databinding.observable.set.IObservableSet; |
| import org.eclipse.core.databinding.observable.set.WritableSet; |
| import org.eclipse.jface.databinding.conformance.util.MapChangeEventTracker; |
| import org.eclipse.jface.examples.databinding.model.SimpleCart; |
| import org.eclipse.jface.examples.databinding.model.SimplePerson; |
| import org.eclipse.jface.tests.databinding.AbstractDefaultRealmTestCase; |
| |
| /** |
| * @since 3.2 |
| * |
| */ |
| public class CompositeMapTest extends AbstractDefaultRealmTestCase { |
| |
| private WritableSet persons; |
| private CompositeMap composedMap; |
| |
| protected void setUp() throws Exception { |
| super.setUp(); |
| persons = new WritableSet(); |
| IObservableMap first = BeansObservables.observeMap(persons, |
| SimplePerson.class, "cart"); |
| composedMap = new CompositeMap(first, new IObservableFactory() { |
| public IObservable createObservable(Object target) { |
| return BeansObservables.observeMap((IObservableSet) target, |
| SimpleCart.class, "numItems"); |
| } |
| }); |
| } |
| |
| public void testAddToFirstMap() { |
| MapChangeEventTracker tracker = new MapChangeEventTracker(); |
| composedMap.addMapChangeListener(tracker); |
| assertEquals(0, tracker.count); |
| SimplePerson newPerson = new SimplePerson("p1", "a1", "c1", "s1"); |
| newPerson.getCart().setNumItems(42); |
| persons.add(newPerson); |
| assertEquals(1, tracker.count); |
| assertEquals(0, tracker.event.diff.getRemovedKeys().size()); |
| assertEquals(0, tracker.event.diff.getChangedKeys().size()); |
| assertEquals(Collections.singleton(newPerson), tracker.event.diff |
| .getAddedKeys()); |
| assertEquals(new Integer(42), tracker.event.diff.getNewValue(newPerson)); |
| assertEquals(new Integer(42), composedMap.get(newPerson)); |
| } |
| |
| public void testAddSharedToFirstMap() { |
| SimplePerson person1 = new SimplePerson("p1", "a1", "c1", "s1"); |
| person1.getCart().setNumItems(42); |
| persons.add(person1); |
| MapChangeEventTracker tracker = new MapChangeEventTracker(); |
| composedMap.addMapChangeListener(tracker); |
| assertEquals(0, tracker.count); |
| SimplePerson person2 = new SimplePerson("p1", "a1", "c1", "s1"); |
| person2.setCart(person1.getCart()); |
| persons.add(person2); |
| assertEquals(1, tracker.count); |
| assertEquals(0, tracker.event.diff.getRemovedKeys().size()); |
| assertEquals(0, tracker.event.diff.getChangedKeys().size()); |
| assertEquals(Collections.singleton(person2), tracker.event.diff |
| .getAddedKeys()); |
| assertEquals(new Integer(42), tracker.event.diff.getNewValue(person2)); |
| assertEquals(new Integer(42), composedMap.get(person2)); |
| assertEquals(new Integer(42), composedMap.get(person1)); |
| } |
| |
| public void testRemoveFromFirstMap() { |
| MapChangeEventTracker tracker = new MapChangeEventTracker(); |
| SimplePerson newPerson = new SimplePerson("p1", "a1", "c1", "s1"); |
| newPerson.getCart().setNumItems(42); |
| persons.add(newPerson); |
| assertTrue("newPerson should be added", composedMap.containsKey(newPerson)); |
| composedMap.addMapChangeListener(tracker); |
| assertEquals(0, tracker.count); |
| persons.remove(newPerson); |
| assertEquals(1, tracker.count); |
| assertEquals(0, tracker.event.diff.getAddedKeys().size()); |
| assertEquals(0, tracker.event.diff.getChangedKeys().size()); |
| assertEquals(Collections.singleton(newPerson), tracker.event.diff |
| .getRemovedKeys()); |
| assertEquals(new Integer(42), tracker.event.diff.getOldValue(newPerson)); |
| assertFalse("newPerson should be removed", composedMap.containsKey(newPerson)); |
| } |
| |
| public void testRemoveSharedFromFirstMap() { |
| SimplePerson person1 = new SimplePerson("p1", "a1", "c1", "s1"); |
| person1.getCart().setNumItems(42); |
| persons.add(person1); |
| SimplePerson person2 = new SimplePerson("p1", "a1", "c1", "s1"); |
| person2.setCart(person1.getCart()); |
| persons.add(person2); |
| assertTrue("person2 should be added", composedMap.containsKey(person2)); |
| MapChangeEventTracker tracker = new MapChangeEventTracker(); |
| composedMap.addMapChangeListener(tracker); |
| assertEquals(0, tracker.count); |
| persons.remove(person2); |
| assertEquals(1, tracker.count); |
| assertEquals(0, tracker.event.diff.getAddedKeys().size()); |
| assertEquals(0, tracker.event.diff.getChangedKeys().size()); |
| assertEquals(Collections.singleton(person2), tracker.event.diff |
| .getRemovedKeys()); |
| assertEquals(new Integer(42), tracker.event.diff.getOldValue(person2)); |
| assertFalse("person2 should be removed", composedMap.containsKey(person2)); |
| assertEquals(new Integer(42), composedMap.get(person1)); |
| } |
| |
| public void testChangeInFirstMap() { |
| SimplePerson person1 = new SimplePerson("p1", "a1", "c1", "s1"); |
| person1.getCart().setNumItems(42); |
| persons.add(person1); |
| MapChangeEventTracker tracker = new MapChangeEventTracker(); |
| composedMap.addMapChangeListener(tracker); |
| assertEquals(0, tracker.count); |
| person1.setCart(new SimpleCart()); |
| assertEquals(1, tracker.count); |
| assertEquals(0, tracker.event.diff.getAddedKeys().size()); |
| assertEquals(0, tracker.event.diff.getRemovedKeys().size()); |
| assertEquals(Collections.singleton(person1), tracker.event.diff |
| .getChangedKeys()); |
| assertEquals(new Integer(42), tracker.event.diff.getOldValue(person1)); |
| assertEquals(new Integer(0), tracker.event.diff.getNewValue(person1)); |
| assertEquals(new Integer(0), composedMap.get(person1)); |
| } |
| |
| public void testChangeInFirstMapToShared() { |
| SimplePerson person0 = new SimplePerson("p0", "a0", "c0", "s0"); |
| person0.getCart().setNumItems(13); |
| persons.add(person0); |
| SimplePerson person1 = new SimplePerson("p1", "a1", "c1", "s1"); |
| person1.getCart().setNumItems(42); |
| persons.add(person1); |
| MapChangeEventTracker tracker = new MapChangeEventTracker(); |
| composedMap.addMapChangeListener(tracker); |
| assertEquals(0, tracker.count); |
| person1.setCart(person0.getCart()); |
| assertEquals(1, tracker.count); |
| assertEquals(0, tracker.event.diff.getAddedKeys().size()); |
| assertEquals(0, tracker.event.diff.getRemovedKeys().size()); |
| assertEquals(Collections.singleton(person1), tracker.event.diff |
| .getChangedKeys()); |
| assertEquals(new Integer(42), tracker.event.diff.getOldValue(person1)); |
| assertEquals(new Integer(13), tracker.event.diff.getNewValue(person1)); |
| assertEquals(new Integer(13), composedMap.get(person1)); |
| } |
| |
| public void testChangeInFirstMapFromShared() { |
| SimplePerson person0 = new SimplePerson("p0", "a0", "c0", "s0"); |
| person0.getCart().setNumItems(13); |
| persons.add(person0); |
| SimplePerson person1 = new SimplePerson("p1", "a1", "c1", "s1"); |
| person1.setCart(person0.getCart()); |
| persons.add(person1); |
| MapChangeEventTracker tracker = new MapChangeEventTracker(); |
| composedMap.addMapChangeListener(tracker); |
| assertEquals(0, tracker.count); |
| person1.setCart(new SimpleCart()); |
| assertEquals(1, tracker.count); |
| assertEquals(0, tracker.event.diff.getAddedKeys().size()); |
| assertEquals(0, tracker.event.diff.getRemovedKeys().size()); |
| assertEquals(Collections.singleton(person1), tracker.event.diff |
| .getChangedKeys()); |
| assertEquals(new Integer(13), tracker.event.diff.getOldValue(person1)); |
| assertEquals(new Integer(0), tracker.event.diff.getNewValue(person1)); |
| assertEquals(new Integer(0), composedMap.get(person1)); |
| } |
| |
| public void testChangeInSecondMap() { |
| SimplePerson person0 = new SimplePerson("p0", "a0", "c0", "s0"); |
| person0.getCart().setNumItems(13); |
| persons.add(person0); |
| MapChangeEventTracker tracker = new MapChangeEventTracker(); |
| composedMap.addMapChangeListener(tracker); |
| assertEquals(0, tracker.count); |
| person0.getCart().setNumItems(42); |
| assertEquals(1, tracker.count); |
| assertEquals(0, tracker.event.diff.getAddedKeys().size()); |
| assertEquals(0, tracker.event.diff.getRemovedKeys().size()); |
| assertEquals(Collections.singleton(person0), tracker.event.diff |
| .getChangedKeys()); |
| assertEquals(new Integer(13), tracker.event.diff.getOldValue(person0)); |
| assertEquals(new Integer(42), tracker.event.diff.getNewValue(person0)); |
| assertEquals(new Integer(42), composedMap.get(person0)); |
| } |
| |
| } |