/*******************************************************************************
 * Copyright (c) 2007, 2009 Matthew Hall 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:
 *     Matthew Hall - initial API and implementation (bug 206839)
 *     Matthew Hall - bug 213145, 194734, 195222
 *******************************************************************************/
package org.eclipse.jface.tests.internal.databinding.viewers;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.fail;

import org.eclipse.core.databinding.observable.IObservable;
import org.eclipse.core.databinding.observable.Realm;
import org.eclipse.core.databinding.observable.value.IObservableValue;
import org.eclipse.core.databinding.observable.value.ValueChangeEvent;
import org.eclipse.jface.databinding.conformance.MutableObservableValueContractTest;
import org.eclipse.jface.databinding.conformance.delegate.AbstractObservableValueContractDelegate;
import org.eclipse.jface.databinding.conformance.util.ValueChangeEventTracker;
import org.eclipse.jface.databinding.viewers.ViewerProperties;
import org.eclipse.jface.databinding.viewers.ViewersObservables;
import org.eclipse.jface.tests.databinding.AbstractDefaultRealmTestCase;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Shell;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import junit.framework.TestSuite;

/**
 * Tests for ViewerInputObservableValue.
 *
 * @since 1.2
 */
public class ViewerInputObservableValueTest extends AbstractDefaultRealmTestCase {
	private TableViewer viewer;
	private static String[] model = new String[] { "0", "1" };

	@Override
	@Before
	public void setUp() throws Exception {
		super.setUp();
		Shell shell = new Shell();
		viewer = new TableViewer(shell, SWT.NONE);
		viewer.setContentProvider(new ContentProvider());
	}

	@Override
	@After
	public void tearDown() throws Exception {
		Shell shell = viewer.getTable().getShell();
		if (!shell.isDisposed())
			shell.dispose();
		super.tearDown();
	}

	@Test
	public void testConstructor_IllegalArgumentException() {
		try {
			ViewersObservables.observeInput(null);
			fail("Expected IllegalArgumentException for null argument");
		} catch (IllegalArgumentException expected) {
		}
	}

	@Test
	public void testSetInputOnViewer_FiresChangeEventOnGetValue() {
		IObservableValue observable = ViewersObservables.observeInput(viewer);
		ValueChangeEventTracker listener = ValueChangeEventTracker
				.observe(observable);

		assertNull(viewer.getInput());
		assertEquals(0, listener.count);

		viewer.setInput(model);

		assertEquals(model, viewer.getInput());
		assertEquals(0, listener.count);

		// Call to getValue() causes observable to discover change
		assertEquals(model, observable.getValue());
		assertEquals(1, listener.count);

		viewer.setInput(null);
		assertEquals(null, viewer.getInput());

		assertEquals(null, observable.getValue());
		assertEquals(2, listener.count);
	}

	@Test
	public void testGetSetValue_FiresChangeEvents() {
		IObservableValue observable = ViewersObservables.observeInput(viewer);
		ValueChangeEventTracker listener = new ValueChangeEventTracker();
		observable.addValueChangeListener(listener);

		assertNull(observable.getValue());
		assertEquals(0, listener.count);

		observable.setValue(model);

		assertEquals(model, observable.getValue());
		assertEquals(1, listener.count);
		assertValueChangeEventEquals(observable, null, model, listener.event);

		observable.setValue(null);

		assertNull(observable.getValue());
		assertEquals(2, listener.count);
		assertValueChangeEventEquals(observable, model, null, listener.event);
	}

	@Test
	public void testGetValueType_AlwaysNull() throws Exception {
		IObservableValue observable = ViewersObservables.observeInput(viewer);
		assertEquals(null, observable.getValueType());
	}

	@Test
	public void testDispose() throws Exception {
		IObservableValue observable = ViewersObservables.observeInput(viewer);
		observable.dispose();
		try {
			observable.setValue(model);
			fail("Expected NullPointerException");
		} catch (NullPointerException expected) {
		}
	}

	private void assertValueChangeEventEquals(
			IObservableValue expectedObservable, Object expectedOldValue,
			Object expectedNewValue, ValueChangeEvent event) {
		assertSame(expectedObservable, event.getObservableValue());
		assertEquals(expectedOldValue, event.diff.getOldValue());
		assertEquals(expectedNewValue, event.diff.getNewValue());
	}

	static class ContentProvider implements IStructuredContentProvider {
		@Override
		public Object[] getElements(Object inputElement) {
			return (String[]) inputElement;
		}
	}

	public static void addConformanceTest(TestSuite suite) {
		suite.addTest(MutableObservableValueContractTest.suite(new Delegate()));
	}

	static class Delegate extends AbstractObservableValueContractDelegate {
		TableViewer viewer;

		@Override
		public void setUp() {
			super.setUp();
			Shell shell = new Shell();
			viewer = new TableViewer(shell, SWT.NONE);
			viewer.setContentProvider(new ContentProvider());
		}

		@Override
		public void tearDown() {
			Shell shell = viewer.getTable().getShell();
			if (!shell.isDisposed())
				shell.dispose();
			super.tearDown();
		}

		@Override
		public IObservableValue createObservableValue(Realm realm) {
			return ViewerProperties.input().observe(realm, viewer);
		}

		@Override
		public void change(IObservable observable) {
			IObservableValue value = (IObservableValue) observable;
			value.setValue(createValue(value));
		}

		@Override
		public Object createValue(IObservableValue observable) {
			return new String[] { "one", "two" };
		}

		@Override
		public Object getValueType(IObservableValue observable) {
			return null;
		}
	}
}
