/*******************************************************************************
 * 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.lang.reflect.Method;
import java.util.Collections;

import org.eclipse.core.databinding.beans.BeansObservables;
import org.eclipse.core.databinding.observable.AbstractObservable;
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;
	private IObservableMap first;

	boolean hasListeners(AbstractObservable o) {
		try {
			Method method = AbstractObservable.class.getSuperclass().getDeclaredMethod("hasListeners", new Class[0]);
			method.setAccessible(true);
			return ((Boolean)method.invoke(o, new Object[0])).booleanValue();
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}

	protected void setUp() throws Exception {
		super.setUp();
		persons = new WritableSet();
		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));
	}
	
	public void testDispose() {
		SimplePerson person0 = new SimplePerson("p0", "a0", "c0", "s0");
		person0.getCart().setNumItems(13);
		persons.add(person0);
		assertTrue(hasListeners((AbstractObservable) first));
		composedMap.dispose();
		assertFalse(hasListeners((AbstractObservable) first));
	}
	
}
