/*******************************************************************************
 * Copyright (c) 2005, 2006 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.jface.tests.databinding;

import junit.framework.TestCase;

import org.eclipse.jface.internal.databinding.provisional.observable.Diffs;
import org.eclipse.jface.internal.databinding.provisional.observable.IChangeListener;
import org.eclipse.jface.internal.databinding.provisional.observable.value.WritableValue;
import org.eclipse.jface.tests.databinding.util.Mocks;

public class ObservableTest extends TestCase {

	private static class MyObservable extends WritableValue {
		/**
		 * @param initialValue
		 */
		public MyObservable(Object initialValue) {
			super(initialValue);
		}

		public void fireChange(Object oldValue, Object newValue) {
			fireValueChange(Diffs.createValueDiff(oldValue, newValue));
		}

	}

	private MyObservable observable;

	protected void setUp() throws Exception {
		super.setUp();
		observable = new MyObservable(null);
	}

	protected void tearDown() throws Exception {
		if (observable != null) {
			try {
				observable.dispose();
			} catch (Exception ex) {
				// ignore
			}
		}
		observable = null;
		super.tearDown();
	}

	/*
	 * Test method for
	 * 'org.eclipse.jface.databinding.Observable.addChangeListener(IChangeListener)'
	 */
	public void testAddChangeListener() {
		IChangeListener changeListenerMock = (IChangeListener) Mocks
				.createOrderedMock(IChangeListener.class);

		// testing that no methods on the observable are called when adding the
		// change listener
		Mocks.startChecking(changeListenerMock);
		observable.addChangeListener(changeListenerMock);

		// testing that handleChange is actually called
		Mocks.reset(changeListenerMock);
		changeListenerMock.handleChange(null);
		changeListenerMock.handleChange(null);
		Mocks.startChecking(changeListenerMock);
		observable.fireChange(null, null);
		observable.fireChange(null, null);
		Mocks.verify(changeListenerMock);

		// testing that handleChange is called just once
		Mocks.reset(changeListenerMock);
		changeListenerMock.handleChange(null);
		Mocks.startChecking(changeListenerMock);
		observable.addChangeListener(changeListenerMock);
		observable.fireChange(null, null);
		Mocks.verify(changeListenerMock);

		// dispose() will call another handleChange. Prevent this from causing a
		// test failure
		Mocks.reset(changeListenerMock);
		changeListenerMock.handleChange(null);
		Mocks.startChecking(changeListenerMock);
	}

	/*
	 * Test method for
	 * 'org.eclipse.jface.databinding.Observable.removeChangeListener(IChangeListener)'
	 */
	public void testRemoveChangeListener() {
		IChangeListener changeListenerMock = (IChangeListener) Mocks
				.createOrderedMock(IChangeListener.class);

		// testing that no methods on the observable are called when removing
		// the
		// change listener
		Mocks.startChecking(changeListenerMock);
		observable.removeChangeListener(changeListenerMock);

		// testing that no methods on the observable are called after adding and
		// removing the change listener
		observable.addChangeListener(changeListenerMock);
		observable.removeChangeListener(changeListenerMock);

		observable.fireChange(null, null);
	}

	/*
	 * Test method for
	 * 'org.eclipse.jface.databinding.Observable.fireChangeEvent(int, Object,
	 * Object)'
	 */
	public void testFireChangeEvent() {
		// IChangeListener changeListenerMock = (IChangeListener) Mocks
		// .createMock(IChangeListener.class,
		// new Mocks.EqualityComparator() {
		// public boolean equals(Object o1, Object o2) {
		// ChangeEvent changeEvent1 = (ChangeEvent) o1;
		// ChangeEvent changeEvent2 = (ChangeEvent) o2;
		// return changeEvent1.getChangeType() == changeEvent2
		// .getChangeType()
		// && changeEvent1.getPosition() == changeEvent2
		// .getPosition()
		// && changeEvent1.getOldValue() == changeEvent2
		// .getOldValue()
		// && changeEvent1.getNewValue() == changeEvent2
		// .getNewValue();
		// }
		// });
		// observable.addChangeListener(changeListenerMock);
		//
		// Object o1 = new Object();
		// Object o2 = new Object();
		//
		// changeListenerMock.handleChange(new ChangeEvent(observable, 0, null,
		// null, ChangeEvent.POSITION_UNKNOWN));
		// changeListenerMock.handleChange(new ChangeEvent(observable, 0, null,
		// null, 1));
		// changeListenerMock.handleChange(new ChangeEvent(observable,
		// ChangeEvent.CHANGE, o1, o2, ChangeEvent.POSITION_UNKNOWN));
		// changeListenerMock.handleChange(new ChangeEvent(observable,
		// ChangeEvent.CHANGE, o1, o2, 42));
		// Mocks.startChecking(changeListenerMock);
		// observable.fireChange(0, null, null);
		// observable.fireChange(0, null, null, 1);
		// observable.fireChange(ChangeEvent.CHANGE, o1, o2);
		// observable.fireChange(ChangeEvent.CHANGE, o1, o2, 42);
		// Mocks.verify(changeListenerMock);
		//
		// // dispose() will call another handleChange. Prevent this from
		// causing a test failure
		// Mocks.reset(changeListenerMock);
		// changeListenerMock.handleChange(null);
		// Mocks.startChecking(changeListenerMock);
	}

}
