/*******************************************************************************
 * Copyright (c) 2018 RCP Vision (http://www.rcp-vision.com) 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:
 * Lorenzo Bettini - Initial contribution and API
 *******************************************************************************/
package org.eclipse.emf.parsley.tests

import org.eclipse.emf.ecore.EObject
import org.eclipse.emf.ecore.EcoreFactory
import org.eclipse.emf.parsley.composite.AbstractMasterDetailComposite
import org.eclipse.emf.parsley.composite.IDetailComposite
import org.eclipse.emf.parsley.composite.IMasterComposite
import org.eclipse.emf.parsley.inject.parameters.CompositeParameters
import org.eclipse.emf.parsley.junit4.AbstractEmfParsleyShellBasedTest
import org.eclipse.jface.viewers.ISelectionChangedListener
import org.eclipse.jface.viewers.SelectionChangedEvent
import org.eclipse.jface.viewers.StructuredSelection
import org.eclipse.swt.SWT
import org.eclipse.swt.widgets.Composite
import org.junit.Test

import static org.mockito.Matchers.*
import static org.mockito.Mockito.*

import static extension org.junit.Assert.*

class AbstractMasterDetailCompositeTest extends AbstractEmfParsleyShellBasedTest {

	static class MasterDetailComposite extends AbstractMasterDetailComposite {
		public var IMasterComposite mockMasterComposite = mock(IMasterComposite);

		public var IDetailComposite mockDetailComposite

		public var ISelectionChangedListener selectionChangedListener

		new(CompositeParameters params, int sashStyle, int[] weights) {
			super(params, sashStyle, weights)
		}

		override protected createDetailComposite(Composite parent, EObject selectedObject) {
			mockDetailComposite = mock(IDetailComposite)
			return mockDetailComposite
		}

		override protected createMasterComposite(Composite parent) {
			// capture the selection changed listener for later use
			doAnswer[ invocation |
				selectionChangedListener = invocation.arguments.head as ISelectionChangedListener;
				return null
			].when(mockMasterComposite).addSelectionChangedListener(any(ISelectionChangedListener))
			return mockMasterComposite
		}

		override getSashForm() {
			super.getSashForm()
		}

	}

	var MasterDetailComposite SUT;

	@Test def void testSashFormWeigths() {
		SUT = createSUT(0, #[])
		"200, 200".assertEquals(SUT.sashForm.weights.map[toString].join(", "))
	}

	@Test def void testCustomSashFormWeigths() {
		SUT = createSUT(0, #[1, 2])
		"333, 666".assertEquals(SUT.sashForm.weights.map[toString].join(", "))
	}

	@Test def void testSetSashFormOrientation() {
		SUT = createSUT(SWT.VERTICAL, #[])
		SUT.setSashFormOrientation(SWT.HORIZONTAL)
		assertTrue(SWT.HORIZONTAL.bitwiseAnd(SUT.sashForm.style) != 0)
	}

	@Test def void testUpdateDelegatesToMasterComposite() {
		SUT = createSUT(SWT.VERTICAL, #[])
		val o = new Object
		SUT.update(o)
		verify(SUT.mockMasterComposite).update(o)
	}

	@Test def void testSelectionChangeCreatesDetailComposite() {
		SUT = createSUT(0, #[])
		SUT.mockDetailComposite.assertNull
		triggerSelectionChanged(SUT.selectionChangedListener, EcoreFactory.eINSTANCE.createEClass)
		SUT.mockDetailComposite.assertNotNull
	}

	@Test def void testSelectionChangeCreatesDetailCompositeAfterDispose() {
		SUT = createSUT(0, #[])
		triggerSelectionChanged(SUT.selectionChangedListener, EcoreFactory.eINSTANCE.createEClass)
		val previousDetailComposite = SUT.mockDetailComposite
		previousDetailComposite.assertNotNull
		triggerSelectionChanged(SUT.selectionChangedListener, EcoreFactory.eINSTANCE.createEClass)
		verify(previousDetailComposite).dispose
	}

	@Test def void testSelectionChangeWithNonEObjectDoesNotCreateDetailComposite() {
		SUT = createSUT(0, #[])
		SUT.mockDetailComposite.assertNull
		triggerSelectionChanged(SUT.selectionChangedListener, "noEObject")
		SUT.mockDetailComposite.assertNull
	}

	private def Object triggerSelectionChanged(ISelectionChangedListener selectionChangedListener, Object selected) {
		val selectionEvent = mock(SelectionChangedEvent)
		when(selectionEvent.getSelection()).thenReturn(new StructuredSelection(selected))
		selectionChangedListener.selectionChanged(selectionEvent)
		return selected
	}

	private def createSUT(int sashStyle, int[] weights) {
		return new MasterDetailComposite(new CompositeParameters(shell, 0), sashStyle, weights).injectMembers
	}
}
