/*******************************************************************************
 * Copyright (c) 2005 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.databinding.*;
import org.eclipse.jface.tests.databinding.util.Mocks;

public class UpdatableTest extends TestCase {

	private static class MyUpdatable extends Updatable {
		public void fireChange(int changeType, Object oldValue,
				Object newValue, int position) {
			fireChangeEvent(changeType, oldValue, newValue, position);
		}

		public void fireChange(int changeType, Object oldValue, Object newValue) {
			fireChangeEvent(changeType, oldValue, newValue);
		}
	}

	private MyUpdatable updatable;

	protected void setUp() throws Exception {
		super.setUp();
		updatable = new MyUpdatable();
	}

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

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

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

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

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

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

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

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

		updatable.fireChange(0, null, null, 0);
	}

	/*
	 * Test method for 'org.eclipse.jface.databinding.Updatable.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();
							}
						});
		updatable.addChangeListener(changeListenerMock);

		Object o1 = new Object();
		Object o2 = new Object();

		changeListenerMock.handleChange(new ChangeEvent(updatable, 0, null,
				null, ChangeEvent.POSITION_UNKNOWN));
		changeListenerMock.handleChange(new ChangeEvent(updatable, 0, null,
				null, 1));
		changeListenerMock.handleChange(new ChangeEvent(updatable,
				ChangeEvent.CHANGE, o1, o2, ChangeEvent.POSITION_UNKNOWN));
		changeListenerMock.handleChange(new ChangeEvent(updatable,
				ChangeEvent.CHANGE, o1, o2, 42));
		Mocks.startChecking(changeListenerMock);
		updatable.fireChange(0, null, null);
		updatable.fireChange(0, null, null, 1);
		updatable.fireChange(ChangeEvent.CHANGE, o1, o2);
		updatable.fireChange(ChangeEvent.CHANGE, o1, o2, 42);
		Mocks.verify(changeListenerMock);
	}

}
