/*******************************************************************************
 * Copyright (c) 2011-2015 EclipseSource Muenchen GmbH and others.
 *
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 * Lucas Koehler - initial API and implementation
 ******************************************************************************/
package org.eclipse.emf.ecp.view.spi.table.swt;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertTrue;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.same;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

import java.util.LinkedHashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;

import org.eclipse.core.databinding.observable.Observables;
import org.eclipse.core.databinding.observable.list.IObservableList;
import org.eclipse.core.databinding.observable.list.WritableList;
import org.eclipse.core.databinding.observable.value.IObservableValue;
import org.eclipse.core.databinding.property.value.IValueProperty;
import org.eclipse.emf.databinding.IEMFValueProperty;
import org.eclipse.emf.databinding.internal.EMFValueProperty;
import org.eclipse.emf.databinding.internal.EMFValuePropertyDecorator;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.ecore.EcoreFactory;
import org.eclipse.emf.ecore.EcorePackage;
import org.eclipse.emf.ecore.InternalEObject;
import org.eclipse.emf.ecp.view.internal.context.ViewModelContextImpl;
import org.eclipse.emf.ecp.view.spi.model.VDomainModelReference;
import org.eclipse.emf.ecp.view.spi.model.VFeaturePathDomainModelReference;
import org.eclipse.emf.ecp.view.spi.model.VViewFactory;
import org.eclipse.emf.ecp.view.spi.renderer.NoPropertyDescriptorFoundExeption;
import org.eclipse.emf.ecp.view.spi.renderer.NoRendererFoundException;
import org.eclipse.emf.ecp.view.spi.table.model.VTableControl;
import org.eclipse.emf.ecp.view.spi.table.model.VTableDomainModelReference;
import org.eclipse.emf.ecp.view.spi.table.model.VTableFactory;
import org.eclipse.emf.ecp.view.spi.util.swt.ImageRegistryService;
import org.eclipse.emf.ecp.view.template.model.VTStyleProperty;
import org.eclipse.emf.ecp.view.template.model.VTViewTemplateProvider;
import org.eclipse.emf.ecp.view.template.style.alignment.model.AlignmentType;
import org.eclipse.emf.ecp.view.template.style.alignment.model.VTAlignmentFactory;
import org.eclipse.emf.ecp.view.template.style.alignment.model.VTControlLabelAlignmentStyleProperty;
import org.eclipse.emf.ecp.view.template.style.wrap.model.VTLabelWrapStyleProperty;
import org.eclipse.emf.ecp.view.template.style.wrap.model.VTWrapFactory;
import org.eclipse.emf.ecp.view.test.common.swt.spi.DatabindingClassRunner;
import org.eclipse.emf.edit.domain.EditingDomain;
import org.eclipse.emfforms.spi.common.report.ReportService;
import org.eclipse.emfforms.spi.core.services.databinding.DatabindingFailedException;
import org.eclipse.emfforms.spi.core.services.databinding.emf.EMFFormsDatabindingEMF;
import org.eclipse.emfforms.spi.core.services.editsupport.EMFFormsEditSupport;
import org.eclipse.emfforms.spi.core.services.label.EMFFormsLabelProvider;
import org.eclipse.emfforms.spi.core.services.label.NoLabelFoundException;
import org.eclipse.emfforms.spi.swt.core.layout.SWTGridCell;
import org.eclipse.emfforms.spi.swt.core.layout.SWTGridDescription;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Matchers;
import org.mockito.Mockito;

/**
 * JUnit tests for {@link TableControlSWTRenderer} testing the data binding of the table.
 *
 * @author Lucas Koehler
 *
 */
@SuppressWarnings("restriction")
@RunWith(DatabindingClassRunner.class)
public class SWTTableDatabindingLabel_PTest {
	private static final IObservableValue DISPLAYNAME = Observables.constantObservableValue("displayname");
	private static final IObservableValue DISPLAYNAME_COLUMNS = Observables
		.constantObservableValue("displayname-columns");
	private static final IObservableValue DESCRIPTION = Observables.constantObservableValue("description");
	private static final IObservableValue DESCRIPTION_COLUMNS = Observables
		.constantObservableValue("description-columns");
	private EMFFormsDatabindingEMF databindingService;
	private TableControlSWTRenderer renderer;
	private Shell shell;
	private EClass domainModel;
	private VTableControl vTableControl;
	private EMFFormsLabelProvider labelProvider;
	private VTViewTemplateProvider vtViewTemplateProvider;
	private ViewModelContextImpl viewContext;

	/**
	 * Set up executed before every test.
	 * Mocks and registers the databinding and label service.
	 * Creates a new {@link TableControlSWTRenderer} to be tested. Mocks needed parameters and contents (e.g.
	 * VControl, ViewModelContext).
	 *
	 * @throws DatabindingFailedException
	 * @throws NoLabelFoundException
	 */
	@Before
	public void setUp() throws DatabindingFailedException, NoLabelFoundException {
		databindingService = mock(EMFFormsDatabindingEMF.class);
		labelProvider = mock(EMFFormsLabelProvider.class);

		when(labelProvider.getDescription(any(VDomainModelReference.class), any(EObject.class))).thenReturn(
			DESCRIPTION);
		when(labelProvider.getDescription(any(VDomainModelReference.class), any(EClass.class)))
			.thenReturn(DESCRIPTION_COLUMNS);
		when(labelProvider.getDisplayName(any(VDomainModelReference.class), any(EObject.class))).thenReturn(
			DISPLAYNAME);
		when(labelProvider.getDisplayName(any(VDomainModelReference.class), any(EClass.class)))
			.thenReturn(DISPLAYNAME_COLUMNS);

		shell = new Shell();

		domainModel = EcoreFactory.eINSTANCE.createEClass();
		final EStructuralFeature eStructuralFeature = EcorePackage.eINSTANCE.getEClass_ESuperTypes();

		final VTableDomainModelReference tableDomainModelReference = createTableDomainModelReference(
			eStructuralFeature);
		vTableControl = VTableFactory.eINSTANCE.createTableControl();
		vTableControl.setDomainModelReference(tableDomainModelReference);

		final IValueProperty delegate = new EMFValueProperty(EcorePackage.eINSTANCE.getEClass_ESuperTypes());
		final EMFValuePropertyDecorator valueProperty = new EMFValuePropertyDecorator(delegate,
			EcorePackage.eINSTANCE.getEClass_ESuperTypes());
		final IObservableValue observableValue = valueProperty.observe(domainModel);
		when(databindingService.getValueProperty(vTableControl.getDomainModelReference(), (EObject) domainModel))
			.thenReturn(valueProperty);
		when(databindingService.getObservableValue(vTableControl.getDomainModelReference(), domainModel)).thenReturn(
			observableValue);

		final ReportService reportservice = mock(ReportService.class);
		vtViewTemplateProvider = mock(VTViewTemplateProvider.class);
		final ImageRegistryService imageRegistryService = mock(ImageRegistryService.class);
		final EMFFormsEditSupport emfFormsEditSupport = mock(EMFFormsEditSupport.class);
		viewContext = new ViewModelContextImpl(vTableControl, domainModel);

		renderer = new TableControlSWTRenderer(vTableControl, viewContext, reportservice, databindingService,
			labelProvider, vtViewTemplateProvider, imageRegistryService, emfFormsEditSupport);
		renderer.init();
		renderer.getGridDescription(new SWTGridDescription());
	}

	private VTableDomainModelReference createTableDomainModelReference(EStructuralFeature eStructuralFeature) {
		final VTableDomainModelReference tableDomainModelReference = VTableFactory.eINSTANCE
			.createTableDomainModelReference();
		tableDomainModelReference.setDomainModelEFeature(eStructuralFeature);

		final VFeaturePathDomainModelReference columnReference1 = VViewFactory.eINSTANCE
			.createFeaturePathDomainModelReference();
		columnReference1.setDomainModelEFeature(EcorePackage.eINSTANCE.getEClass_Abstract());

		tableDomainModelReference.getColumnDomainModelReferences().add(columnReference1);

		return tableDomainModelReference;
	}

	@Test
	public void testLabelServiceUsage() throws NoRendererFoundException, NoPropertyDescriptorFoundExeption,
		DatabindingFailedException {
		final IEMFValueProperty columnValueProperty = new EMFValuePropertyDecorator(
			new EMFValueProperty(EcorePackage.eINSTANCE.getEClass_Abstract()),
			EcorePackage.eINSTANCE.getEClass_Abstract());
		final VDomainModelReference columnDMR = ((VTableDomainModelReference) vTableControl.getDomainModelReference())
			.getColumnDomainModelReferences().get(0);
		when(databindingService.getValueProperty(same(columnDMR), same(domainModel.eClass()), any(EditingDomain.class)))
			.thenReturn(columnValueProperty);
		when(databindingService.getValueProperty(columnDMR, (EObject) domainModel)).thenReturn(columnValueProperty);

		final EReference eReference = mock(EReference.class);
		final EClass eClass = EcorePackage.eINSTANCE.getEClass();
		when(eReference.getEReferenceType()).thenReturn(eClass);

		final WritableList mockedObservableList = new WritableList(createInitialList(), eReference);

		when(databindingService.getObservableList(Matchers.eq(vTableControl.getDomainModelReference()),
			any(EObject.class)))
				.thenReturn(mockedObservableList);
		when(databindingService.getSetting(vTableControl.getDomainModelReference(), domainModel)).thenReturn(
			InternalEObject.class.cast(domainModel).eSetting(EcorePackage.eINSTANCE.getEClass_ESuperTypes()));

		final Composite renderedControl = (Composite) renderer.render(new SWTGridCell(0, 0, renderer), shell);
		final Composite composite = (Composite) renderedControl.getChildren()[0];
		final Composite titleComposite = (Composite) composite.getChildren()[0];
		final Label titleLabel = (Label) titleComposite.getChildren()[0];

		assertEquals(DISPLAYNAME.getValue(), titleLabel.getText());

		final Control tableControl = getTable(renderedControl);
		assertTrue(Table.class.isInstance(tableControl));
		final Table table = (Table) tableControl;
		final TableColumn column = table.getColumn(1);
		assertEquals(DISPLAYNAME_COLUMNS.getValue(), column.getText());
		assertEquals(DESCRIPTION_COLUMNS.getValue(), column.getToolTipText());
	}

	/**
	 * Tests the initial binding from the model to the table.
	 *
	 * @throws NoRendererFoundException Renderer could not be found
	 * @throws NoPropertyDescriptorFoundExeption Property descriptor could not be found
	 * @throws DatabindingFailedException if the databinidng failed
	 */
	@Test
	public void testDatabindingServiceUsageInitialBinding() throws NoRendererFoundException,
		NoPropertyDescriptorFoundExeption, DatabindingFailedException {
		final List<EClass> initialList = createInitialList();

		final EReference eReference = mock(EReference.class);
		final EClass eClass = EcorePackage.eINSTANCE.getEClass();
		when(eReference.getEReferenceType()).thenReturn(eClass);

		final WritableList mockedObservableList = new WritableList(initialList, eReference);

		final Table table = setUpDatabindingTests(mockedObservableList, initialList.get(0), initialList.get(1));

		assertDatabinding(mockedObservableList, table);
	}

	/**
	 * Tests the binding from the model to the table for the addition of a new element to the model.
	 *
	 * @throws NoRendererFoundException Renderer could not be found
	 * @throws NoPropertyDescriptorFoundExeption Property descriptor could not be found
	 * @throws DatabindingFailedException if the databinidng failed
	 */
	@Test
	public void testDatabindingServiceUsageAddToModel() throws NoRendererFoundException,
		NoPropertyDescriptorFoundExeption, DatabindingFailedException {
		final List<EClass> initialList = createInitialList();

		final EReference eReference = mock(EReference.class);
		final EClass eClass = EcorePackage.eINSTANCE.getEClass();
		when(eReference.getEReferenceType()).thenReturn(eClass);

		final WritableList mockedObservableList = new WritableList(initialList, eReference);

		final Table table = setUpDatabindingTests(mockedObservableList, initialList.get(0), initialList.get(1));

		final EClass class3 = EcoreFactory.eINSTANCE.createEClass();
		class3.setAbstract(true);
		mockedObservableList.add(class3);

		assertDatabinding(mockedObservableList, table);
	}

	/**
	 * Tests the binding from the model to the table for the removal of a element from the model .
	 *
	 * @throws NoRendererFoundException Renderer could not be found
	 * @throws NoPropertyDescriptorFoundExeption Property descriptor could not be found
	 * @throws DatabindingFailedException if the databinidng failed
	 */
	@Test
	public void testDatabindingServiceUsageRemoveFromModel() throws NoRendererFoundException,
		NoPropertyDescriptorFoundExeption, DatabindingFailedException {
		final List<EClass> initialList = createInitialList();
		final EReference eReference = mock(EReference.class);
		final EClass eClass = EcorePackage.eINSTANCE.getEClass();
		when(eReference.getEReferenceType()).thenReturn(eClass);
		final WritableList mockedObservableList = new WritableList(initialList, eReference);

		final Table table = setUpDatabindingTests(mockedObservableList, initialList.get(0), initialList.get(1));

		mockedObservableList.remove(1);

		assertDatabinding(mockedObservableList, table);
	}

	/**
	 * Tests the binding from the model to the table for the change of an element of the model.
	 *
	 * @throws NoRendererFoundException Renderer could not be found
	 * @throws NoPropertyDescriptorFoundExeption Property descriptor could not be found
	 * @throws DatabindingFailedException if the databinidng failed
	 */
	@Test
	public void testDatabindingServiceUsageChangeModel() throws NoRendererFoundException,
		NoPropertyDescriptorFoundExeption, DatabindingFailedException {
		final List<EClass> initialList = createInitialList();
		final EReference eReference = mock(EReference.class);
		final EClass eClass = EcorePackage.eINSTANCE.getEClass();
		when(eReference.getEReferenceType()).thenReturn(eClass);
		final WritableList mockedObservableList = new WritableList(initialList, eReference);

		final Table table = setUpDatabindingTests(mockedObservableList, initialList.get(0), initialList.get(1));

		((EClass) mockedObservableList.get(0)).setAbstract(true);

		assertDatabinding(mockedObservableList, table);
	}

	@Test
	public void testCreateLabelStyleBits() {
		/* setup */
		final VTControlLabelAlignmentStyleProperty alignProperty = VTAlignmentFactory.eINSTANCE
			.createControlLabelAlignmentStyleProperty();
		alignProperty.setType(AlignmentType.RIGHT);

		final VTLabelWrapStyleProperty labelWrapStyleProperty = VTWrapFactory.eINSTANCE.createLabelWrapStyleProperty();
		labelWrapStyleProperty.setWrapLabel(true);

		final Set<VTStyleProperty> properties = new LinkedHashSet<VTStyleProperty>();
		properties.add(alignProperty);
		properties.add(labelWrapStyleProperty);
		Mockito.when(vtViewTemplateProvider.getStyleProperties(vTableControl, viewContext)).thenReturn(properties);

		/* act */
		final Control render = renderer.createLabel(shell);

		/* assert */
		assertTrue(Label.class.isInstance(render));
		assertNotEquals(0, render.getStyle() & SWT.WRAP);
		assertEquals(SWT.RIGHT, Label.class.cast(render).getAlignment());
	}

	private void assertDatabinding(final WritableList mockedObservableList, final Table table) {
		assertEquals(mockedObservableList.size(), table.getItemCount());
		for (int i = 0; i < mockedObservableList.size(); i++) {
			assertEquals(Boolean.toString(((EClass) mockedObservableList.get(i)).isAbstract()), table.getItem(i)
				.getText(1));
		}
	}

	/**
	 * @return The initial list for data binding tests containing two {@link EClass} objects.
	 */
	private List<EClass> createInitialList() {
		final List<EClass> initialList = new LinkedList<EClass>();
		final EClass class1 = EcoreFactory.eINSTANCE.createEClass();
		class1.setAbstract(false);
		final EClass class2 = EcoreFactory.eINSTANCE.createEClass();
		class2.setAbstract(true);
		initialList.add(class1);
		initialList.add(class2);
		return initialList;
	}

	private Table setUpDatabindingTests(IObservableList mockedObservableList, EClass class1, EClass class2)
		throws NoRendererFoundException,
		NoPropertyDescriptorFoundExeption, DatabindingFailedException {

		final IEMFValueProperty columnValueProperty = new EMFValuePropertyDecorator(
			new EMFValueProperty(EcorePackage.eINSTANCE.getEClass_Abstract()),
			EcorePackage.eINSTANCE.getEClass_Abstract());
		final VDomainModelReference columnDMR = ((VTableDomainModelReference) vTableControl.getDomainModelReference())
			.getColumnDomainModelReferences().get(0);
		when(databindingService.getValueProperty(same(columnDMR), same(domainModel.eClass()), any(EditingDomain.class)))
			.thenReturn(columnValueProperty);
		when(databindingService.getValueProperty(columnDMR, (EObject) domainModel)).thenReturn(columnValueProperty);

		when(databindingService.getSetting(vTableControl.getDomainModelReference(), domainModel)).thenReturn(
			InternalEObject.class.cast(domainModel).eSetting(EcorePackage.eINSTANCE.getEClass_ESuperTypes()));

		when(databindingService.getObservableList(any(VDomainModelReference.class), any(EObject.class))).thenReturn(
			mockedObservableList);

		final Control renderedControl = renderer.render(new SWTGridCell(0, 0, renderer), shell);
		assertTrue(Composite.class.isInstance(renderedControl));
		final Control tableControl = getTable(renderedControl);
		assertTrue(Table.class.isInstance(tableControl));
		return (Table) tableControl;
	}

	private Control getTable(Control render) {
		Composite composite = (Composite) render;
		composite = (Composite) composite.getChildren()[0];
		composite = (Composite) composite.getChildren()[1];
		return composite.getChildren()[0];
	}
}
