Skip to content

Content of file EMFFormsDatabindingImpl_Test.java

/*******************************************************************************
 * Copyright (c) 2011-2018 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.emfforms.internal.core.services.databinding;

import static org.junit.Assert.assertEquals;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.eq;
import static org.mockito.Matchers.same;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import static org.mockito.Mockito.withSettings;

import java.util.Optional;

import org.eclipse.core.databinding.observable.list.IObservableList;
import org.eclipse.core.databinding.observable.value.IObservableValue;
import org.eclipse.core.databinding.property.list.IListProperty;
import org.eclipse.core.databinding.property.value.IValueProperty;
import org.eclipse.emf.common.util.BasicEList;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.databinding.IEMFListProperty;
import org.eclipse.emf.databinding.IEMFValueProperty;
import org.eclipse.emf.databinding.internal.EMFListPropertyDecorator;
import org.eclipse.emf.databinding.internal.EMFValuePropertyDecorator;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EStructuralFeature.Setting;
import org.eclipse.emf.ecore.EcoreFactory;
import org.eclipse.emf.ecp.test.common.DefaultRealm;
import org.eclipse.emf.ecp.view.spi.model.VDomainModelReference;
import org.eclipse.emf.ecp.view.spi.model.VDomainModelReferenceSegment;
import org.eclipse.emf.ecp.view.spi.model.VFeatureDomainModelReferenceSegment;
import org.eclipse.emf.ecp.view.spi.model.VViewFactory;
import org.eclipse.emf.ecp.view.spi.model.VViewPackage;
import org.eclipse.emf.edit.domain.EditingDomain;
import org.eclipse.emfforms.core.services.databinding.testmodel.test.model.TestFactory;
import org.eclipse.emfforms.core.services.databinding.testmodel.test.model.TestPackage;
import org.eclipse.emfforms.spi.core.services.databinding.DatabindingFailedException;
import org.eclipse.emfforms.spi.core.services.databinding.DomainModelReferenceConverter;
import org.eclipse.emfforms.spi.core.services.databinding.emf.DomainModelReferenceConverterEMF;
import org.eclipse.emfforms.spi.core.services.databinding.emf.DomainModelReferenceSegmentConverterEMF;
import org.eclipse.emfforms.spi.core.services.databinding.emf.SegmentConverterListResultEMF;
import org.eclipse.emfforms.spi.core.services.databinding.emf.SegmentConverterValueResultEMF;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

/**
 * This JUnit test tests the correct functionality of {@link EMFFormsDatabindingImpl}.
 *
 * @author Lucas Koehler
 *
 */
@SuppressWarnings({ "restriction", "rawtypes" })
public class EMFFormsDatabindingImpl_Test {

	private EMFFormsDatabindingImpl databindingService;
	private DefaultRealm realm;

	/**
	 * Set up that is executed before every test.
	 */
	@Before
	public void setUp() {
		realm = new DefaultRealm();
		databindingService = new EMFFormsDatabindingImpl();
	}

	@After
	public void tearDown() {
		realm.dispose();
	}

	/**
	 * Test method for
	 * {@link org.eclipse.emfforms.internal.core.services.databinding.EMFFormsDatabindingImpl#getObservableValue(org.eclipse.emf.ecp.view.spi.model.VDomainModelReference, org.eclipse.emf.ecore.EObject)}
	 * .
	 *
	 * @throws DatabindingFailedException if the databinding failed
	 */
	@Test
	public void testGetObservableValue() throws DatabindingFailedException {
		databindingService = spy(new EMFFormsDatabindingImpl());
		final VDomainModelReference reference = mock(VDomainModelReference.class);
		final EList<VDomainModelReferenceSegment> segments = new BasicEList<>();
		when(reference.getSegments()).thenReturn(segments);
		final EObject eObject = mock(EObject.class);
		final DomainModelReferenceConverterEMF converter1 = mock(DomainModelReferenceConverterEMF.class);
		final IEMFValueProperty expectedResultProperty = mock(IEMFValueProperty.class);
		final IObservableValue expectedObservableValue = mock(IObservableValue.class);

		when(converter1.isApplicable(reference)).thenReturn(0d);
		when(converter1.convertToValueProperty(reference, eObject)).thenReturn(expectedResultProperty);
		when(expectedResultProperty.observe(eObject)).thenReturn(expectedObservableValue);

		databindingService.addDomainModelReferenceConverter(converter1);
		final IObservableValue resultObservableValue = databindingService.getObservableValue(reference, eObject);

		verify(databindingService).getValueProperty(reference, eObject);
		verify(expectedResultProperty).observe(eObject);
		assertEquals(expectedObservableValue, resultObservableValue);
	}

	/**
	 * Test method for
	 * {@link org.eclipse.emfforms.internal.core.services.databinding.EMFFormsDatabindingImpl#getObservableValue(org.eclipse.emf.ecp.view.spi.model.VDomainModelReference, org.eclipse.emf.ecore.EObject)}
	 * .
	 * <p>
	 * Tests whether the method returns the correct result for both arguments being <strong>null</strong>.
	 *
	 * @throws DatabindingFailedException if the databinding failed
	 */
	@Test(expected = IllegalArgumentException.class)
	public void testGetObservableValueNullBoth() throws DatabindingFailedException {
		databindingService.getObservableValue(null, null);
	}

	/**
	 * Test method for
	 * {@link org.eclipse.emfforms.internal.core.services.databinding.EMFFormsDatabindingImpl#getObservableValue(org.eclipse.emf.ecp.view.spi.model.VDomainModelReference, org.eclipse.emf.ecore.EObject)}
	 * .
	 * <p>
	 * Tests whether the method returns the correct result for the VDomainModelReference argument being
	 * <strong>null</strong>.
	 *
	 * @throws DatabindingFailedException if the databinding failed
	 */
	@Test(expected = IllegalArgumentException.class)
	public void testGetObservableValueNullDomainModelReference() throws DatabindingFailedException {
		databindingService.getObservableValue(null, mock(EObject.class));
	}

	/**
	 * Test method for
	 * {@link org.eclipse.emfforms.internal.core.services.databinding.EMFFormsDatabindingImpl#getObservableValue(org.eclipse.emf.ecp.view.spi.model.VDomainModelReference, org.eclipse.emf.ecore.EObject)}
	 * .
	 * <p>
	 * Tests whether the method returns the correct result for the EObject argument being <strong>null</strong>.
	 *
	 * @throws DatabindingFailedException if the databinding failed
	 */
	@Test(expected = IllegalArgumentException.class)
	public void testGetObservableValueNullObject() throws DatabindingFailedException {
		databindingService.getObservableValue(mock(VDomainModelReference.class), null);
	}

	/**
	 * Test method for
	 * {@link org.eclipse.emfforms.internal.core.services.databinding.EMFFormsDatabindingImpl#getValueProperty(VDomainModelReference,EObject)}
	 * .
	 *
	 * @throws DatabindingFailedException if the databinding failed
	 */
	@Test(expected = DatabindingFailedException.class)
	public void testGetValuePropertyNoApplicableConverter() throws DatabindingFailedException {
		final VDomainModelReference modelReference = mock(VDomainModelReference.class);
		final EList<VDomainModelReferenceSegment> segments = new BasicEList<>();
		when(modelReference.getSegments()).thenReturn(segments);
		final EClass eClass = mock(EClass.class);
		when(eClass.getName()).thenReturn("test"); //$NON-NLS-1$
		when(modelReference.eClass()).thenReturn(eClass);
		databindingService.getValueProperty(modelReference, mock(EObject.class));
	}

	/**
	 * Test method for
	 * {@link org.eclipse.emfforms.internal.core.services.databinding.EMFFormsDatabindingImpl#getValueProperty(VDomainModelReference,EObject)}
	 * .
	 * Tests whether the correct converter is used when one is applicable and one is not.
	 *
	 * @throws DatabindingFailedException if the databinding failed
	 */
	@Test
	public void testGetValuePropertyOneApplicable() throws DatabindingFailedException {
		final VDomainModelReference reference = mock(VDomainModelReference.class);
		final EList<VDomainModelReferenceSegment> segments = new BasicEList<>();
		when(reference.getSegments()).thenReturn(segments);
		final DomainModelReferenceConverterEMF converter1 = mock(DomainModelReferenceConverterEMF.class);
		final DomainModelReferenceConverterEMF converter2 = mock(DomainModelReferenceConverterEMF.class);
		final IEMFValueProperty expectedResultProperty = mock(IEMFValueProperty.class);

		when(converter1.isApplicable(reference)).thenReturn(0d);
		when(converter1.convertToValueProperty(same(reference), any(EObject.class))).thenReturn(expectedResultProperty);
		when(converter2.isApplicable(reference)).thenReturn(DomainModelReferenceConverter.NOT_APPLICABLE);
		when(converter2.convertToValueProperty(same(reference), any(EObject.class))).thenReturn(
			mock(IEMFValueProperty.class));

		databindingService.addDomainModelReferenceConverter(converter1);
		databindingService.addDomainModelReferenceConverter(converter2);
		final IValueProperty valueProperty = databindingService.getValueProperty(reference, mock(EObject.class));
		assertEquals(expectedResultProperty, valueProperty);
	}

	public void testGetValueProperty_eClass_editingDomain() throws DatabindingFailedException {
		final VDomainModelReference reference = mock(VDomainModelReference.class);
		final EList<VDomainModelReferenceSegment> segments = new BasicEList<>();
		when(reference.getSegments()).thenReturn(segments);
		final DomainModelReferenceConverterEMF converter1 = mock(DomainModelReferenceConverterEMF.class);
		final DomainModelReferenceConverterEMF converter2 = mock(DomainModelReferenceConverterEMF.class);
		final IEMFValueProperty expectedResultProperty = mock(IEMFValueProperty.class);
		final EditingDomain editingDomain = mock(EditingDomain.class);
		final EClass rootEClass = mock(EClass.class);

		when(converter1.isApplicable(reference)).thenReturn(0d);
		when(converter1.convertToValueProperty(reference, rootEClass, editingDomain))
			.thenReturn(expectedResultProperty);
		when(converter2.isApplicable(reference)).thenReturn(DomainModelReferenceConverter.NOT_APPLICABLE);
		when(converter2.convertToValueProperty(reference, rootEClass, editingDomain)).thenReturn(
			mock(IEMFValueProperty.class));

		databindingService.addDomainModelReferenceConverter(converter1);
		databindingService.addDomainModelReferenceConverter(converter2);
		final IValueProperty valueProperty = databindingService.getValueProperty(reference, rootEClass, editingDomain);
		assertEquals(expectedResultProperty, valueProperty);
		verify(converter1).convertToValueProperty(reference, rootEClass, editingDomain);
	}

	/**
	 * Test method for
	 * {@link org.eclipse.emfforms.internal.core.services.databinding.EMFFormsDatabindingImpl#getValueProperty(VDomainModelReference,EObject)}
	 * .
	 * Tests whether the correct converter is used when there are two applicable ones with different priorities.
	 * Also tests whether the correct result is returned.
	 *
	 * @throws DatabindingFailedException if the databinding failed
	 */
	@Test
	public void testGetValuePropertyTwoApplicable() throws DatabindingFailedException {
		final VDomainModelReference reference = mock(VDomainModelReference.class);
		final EList<VDomainModelReferenceSegment> segments = new BasicEList<>();
		when(reference.getSegments()).thenReturn(segments);
		final DomainModelReferenceConverterEMF converter1 = mock(DomainModelReferenceConverterEMF.class);
		final DomainModelReferenceConverterEMF converter2 = mock(DomainModelReferenceConverterEMF.class);
		final IEMFValueProperty expectedResultProperty = mock(IEMFValueProperty.class);

		when(converter1.isApplicable(reference)).thenReturn(5d);
		when(converter1.convertToValueProperty(same(reference), any(EObject.class))).thenReturn(expectedResultProperty);
		when(converter2.isApplicable(reference)).thenReturn(1d);
		when(converter2.convertToValueProperty(same(reference), any(EObject.class))).thenReturn(
			mock(EMFValuePropertyDecorator.class));

		databindingService.addDomainModelReferenceConverter(converter1);
		databindingService.addDomainModelReferenceConverter(converter2);
		final IValueProperty valueProperty = databindingService.getValueProperty(reference, mock(EObject.class));
		assertEquals(expectedResultProperty, valueProperty);
	}

	/**
	 * Test method for
	 * {@link org.eclipse.emfforms.internal.core.services.databinding.EMFFormsDatabindingImpl#getValueProperty(VDomainModelReference,EObject)}
	 * .
	 * Tests whether the {@link EMFFormsDatabindingImpl} considers all {@link DomainModelReferenceConverterEMF}s, that
	 * are
	 * registered to it, for its conversions.
	 *
	 * @throws DatabindingFailedException if the databinding failed
	 */
	@Test
	public void testGetValuePropertyAllConsidered() throws DatabindingFailedException {
		final VDomainModelReference reference = mock(VDomainModelReference.class);
		final EList<VDomainModelReferenceSegment> segments = new BasicEList<>();
		when(reference.getSegments()).thenReturn(segments);

		final DomainModelReferenceConverterEMF converter1 = mock(DomainModelReferenceConverterEMF.class);
		final DomainModelReferenceConverterEMF converter2 = mock(DomainModelReferenceConverterEMF.class);
		final DomainModelReferenceConverterEMF converter3 = mock(DomainModelReferenceConverterEMF.class);

		databindingService.addDomainModelReferenceConverter(converter1);
		databindingService.addDomainModelReferenceConverter(converter2);
		databindingService.addDomainModelReferenceConverter(converter3);

		databindingService.getValueProperty(reference, mock(EObject.class));

		verify(converter1).isApplicable(reference);
		verify(converter2).isApplicable(reference);
		verify(converter3).isApplicable(reference);
	}

	/**
	 * Test method for
	 * {@link org.eclipse.emfforms.internal.core.services.databinding.EMFFormsDatabindingImpl#getValueProperty(VDomainModelReference,EObject)}
	 * .
	 * <p>
	 * Tests whether the method returns the correct result for a <strong>null</strong> argument.
	 *
	 * @throws DatabindingFailedException if the databinding failed
	 */
	@Test(expected = IllegalArgumentException.class)
	public void testGetValuePropertyNull() throws DatabindingFailedException {
		databindingService.getValueProperty(null, mock(EObject.class));
	}

	/**
	 * Test method for
	 * {@link org.eclipse.emfforms.internal.core.services.databinding.EMFFormsDatabindingImpl#getObservableList(VDomainModelReference, org.eclipse.emf.ecore.EObject)}
	 * .
	 *
	 * @throws DatabindingFailedException if the databinding failed
	 */
	@Test
	public void testGetObservableList() throws DatabindingFailedException {
		databindingService = spy(new EMFFormsDatabindingImpl());
		final VDomainModelReference reference = mock(VDomainModelReference.class);
		final EList<VDomainModelReferenceSegment> segments = new BasicEList<>();
		when(reference.getSegments()).thenReturn(segments);

		final EObject eObject = mock(EObject.class);
		final DomainModelReferenceConverterEMF converter1 = mock(DomainModelReferenceConverterEMF.class);
		final IEMFListProperty expectedResultProperty = mock(IEMFListProperty.class);
		final IObservableList expectedObservableList = mock(IObservableList.class);

		when(converter1.isApplicable(reference)).thenReturn(0d);
		when(converter1.convertToListProperty(reference, eObject)).thenReturn(expectedResultProperty);
		when(expectedResultProperty.observe(eObject)).thenReturn(expectedObservableList);

		databindingService.addDomainModelReferenceConverter(converter1);
		final IObservableList resultObservableList = databindingService.getObservableList(reference, eObject);

		verify(databindingService).getListProperty(reference, eObject);
		verify(expectedResultProperty).observe(eObject);
		assertEquals(expectedObservableList, resultObservableList);
	}

	/**
	 * Test method for
	 * {@link org.eclipse.emfforms.internal.core.services.databinding.EMFFormsDatabindingImpl#getObservableList(org.eclipse.emf.ecp.view.spi.model.VDomainModelReference, org.eclipse.emf.ecore.EObject)}
	 * .
	 * <p>
	 * Tests whether the method returns the correct result for both arguments being <strong>null</strong>.
	 *
	 * @throws DatabindingFailedException if the databinding failed
	 */
	@Test(expected = IllegalArgumentException.class)
	public void testGetObservableListNullBoth() throws DatabindingFailedException {
		databindingService.getObservableList(null, null);
	}

	/**
	 * Test method for
	 * {@link org.eclipse.emfforms.internal.core.services.databinding.EMFFormsDatabindingImpl#getObservableList(org.eclipse.emf.ecp.view.spi.model.VDomainModelReference, org.eclipse.emf.ecore.EObject)}
	 * .
	 * <p>
	 * Tests whether the method returns the correct result for the VDomainModelReference argument being
	 * <strong>null</strong>.
	 *
	 * @throws DatabindingFailedException if the databinding failed
	 */
	@Test(expected = IllegalArgumentException.class)
	public void testGetObservableListNullDomainModelReference() throws DatabindingFailedException {
		databindingService.getObservableList(null, mock(EObject.class));
	}

	/**
	 * Test method for
	 * {@link org.eclipse.emfforms.internal.core.services.databinding.EMFFormsDatabindingImpl#getObservableList(org.eclipse.emf.ecp.view.spi.model.VDomainModelReference, org.eclipse.emf.ecore.EObject)}
	 * .
	 * <p>
	 * Tests whether the method returns the correct result for the EObject argument being <strong>null</strong>.
	 *
	 * @throws DatabindingFailedException if the databinding failed
	 */
	@Test(expected = IllegalArgumentException.class)
	public void testGetObservableListNullObject() throws DatabindingFailedException {
		databindingService.getObservableList(mock(VDomainModelReference.class), null);
	}

	/**
	 * Test method for
	 * {@link org.eclipse.emfforms.internal.core.services.databinding.EMFFormsDatabindingImpl#getListProperty(VDomainModelReference,EObject)}
	 * .
	 *
	 * @throws DatabindingFailedException if the databinding failed
	 */
	@Test(expected = DatabindingFailedException.class)
	public void testGetListPropertyNoApplicableConverter() throws DatabindingFailedException {
		final VDomainModelReference reference = mock(VDomainModelReference.class);
		final EList<VDomainModelReferenceSegment> segments = new BasicEList<>();
		when(reference.getSegments()).thenReturn(segments);
		databindingService.getListProperty(reference, mock(EObject.class));
	}

	/**
	 * Test method for
	 * {@link org.eclipse.emfforms.internal.core.services.databinding.EMFFormsDatabindingImpl#getListProperty(VDomainModelReference,EObject)}
	 * .
	 * Tests whether the correct converter is used when one is applicable and one is not.
	 *
	 * @throws DatabindingFailedException if the databinding failed
	 */
	@Test
	public void testGetListPropertyOneApplicable() throws DatabindingFailedException {
		final VDomainModelReference reference = mock(VDomainModelReference.class);
		final EList<VDomainModelReferenceSegment> segments = new BasicEList<>();
		when(reference.getSegments()).thenReturn(segments);
		final DomainModelReferenceConverterEMF converter1 = mock(DomainModelReferenceConverterEMF.class);
		final DomainModelReferenceConverterEMF converter2 = mock(DomainModelReferenceConverterEMF.class);
		final IEMFListProperty expectedResultProperty = mock(IEMFListProperty.class);

		when(converter1.isApplicable(reference)).thenReturn(0d);
		when(converter1.convertToListProperty(same(reference), any(EObject.class))).thenReturn(expectedResultProperty);
		when(converter2.isApplicable(reference)).thenReturn(DomainModelReferenceConverter.NOT_APPLICABLE);
		when(converter2.convertToListProperty(same(reference), any(EObject.class))).thenReturn(
			mock(IEMFListProperty.class));

		databindingService.addDomainModelReferenceConverter(converter1);
		databindingService.addDomainModelReferenceConverter(converter2);
		final IListProperty listProperty = databindingService.getListProperty(reference, mock(EObject.class));
		assertEquals(expectedResultProperty, listProperty);
	}

	/**
	 * Test method for
	 * {@link org.eclipse.emfforms.internal.core.services.databinding.EMFFormsDatabindingImpl#getListProperty(VDomainModelReference,EObject)}
	 * .
	 * Tests whether the correct converter is used when there are two applicable ones with different priorities.
	 * Also tests whether the correct result is returned.
	 *
	 * @throws DatabindingFailedException if the databinding failed
	 */
	@Test
	public void testGetListPropertyTwoApplicable() throws DatabindingFailedException {
		final VDomainModelReference reference = mock(VDomainModelReference.class);
		final EList<VDomainModelReferenceSegment> segments = new BasicEList<>();
		when(reference.getSegments()).thenReturn(segments);
		final DomainModelReferenceConverterEMF converter1 = mock(DomainModelReferenceConverterEMF.class);
		final DomainModelReferenceConverterEMF converter2 = mock(DomainModelReferenceConverterEMF.class);
		final IEMFListProperty expectedResultProperty = mock(IEMFListProperty.class);

		when(converter1.isApplicable(reference)).thenReturn(5d);
		when(converter1.convertToListProperty(same(reference), any(EObject.class))).thenReturn(expectedResultProperty);
		when(converter2.isApplicable(reference)).thenReturn(1d);
		when(converter2.convertToListProperty(same(reference), any(EObject.class))).thenReturn(
			mock(EMFListPropertyDecorator.class));

		databindingService.addDomainModelReferenceConverter(converter1);
		databindingService.addDomainModelReferenceConverter(converter2);
		final IListProperty listProperty = databindingService.getListProperty(reference, mock(EObject.class));
		assertEquals(expectedResultProperty, listProperty);
	}

	/**
	 * Test method for
	 * {@link org.eclipse.emfforms.internal.core.services.databinding.EMFFormsDatabindingImpl#getValueProperty(VDomainModelReference,EObject)}
	 * .
	 * Tests whether the {@link EMFFormsDatabindingImpl} considers all {@link DomainModelReferenceConverter}s, that are
	 * registered to it, for its conversions.
	 *
	 * @throws DatabindingFailedException if the databinding failed
	 */
	@Test
	public void testGetListPropertyAllConsidered() throws DatabindingFailedException {
		final VDomainModelReference reference = mock(VDomainModelReference.class);
		final EList<VDomainModelReferenceSegment> segments = new BasicEList<>();
		when(reference.getSegments()).thenReturn(segments);

		final DomainModelReferenceConverterEMF converter1 = mock(DomainModelReferenceConverterEMF.class);
		final DomainModelReferenceConverterEMF converter2 = mock(DomainModelReferenceConverterEMF.class);
		final DomainModelReferenceConverterEMF converter3 = mock(DomainModelReferenceConverterEMF.class);

		databindingService.addDomainModelReferenceConverter(converter1);
		databindingService.addDomainModelReferenceConverter(converter2);
		databindingService.addDomainModelReferenceConverter(converter3);

		databindingService.getListProperty(reference, mock(EObject.class));

		verify(converter1).isApplicable(reference);
		verify(converter2).isApplicable(reference);
		verify(converter3).isApplicable(reference);
	}

	/**
	 * Test method for
	 * {@link org.eclipse.emfforms.internal.core.services.databinding.EMFFormsDatabindingImpl#getValueProperty(VDomainModelReference,EObject)}
	 * .
	 * <p>
	 * Tests whether the method returns the correct result for a <strong>null</strong> argument.
	 *
	 * @throws DatabindingFailedException if the databinding failed
	 */
	@Test(expected = IllegalArgumentException.class)
	public void testGetListPropertyNull() throws DatabindingFailedException {
		databindingService.getListProperty(null, mock(EObject.class));
	}

	/**
	 * Test method for
	 * {@link org.eclipse.emfforms.internal.core.services.databinding.EMFFormsDatabindingImpl#removeDomainModelReferenceConverter(DomainModelReferenceConverterEMF)}
	 * .
	 *
	 * @throws DatabindingFailedException if the databinding failed
	 */
	@Test(expected = DatabindingFailedException.class)
	public void testRemoveDomainModelReferenceConverter() throws DatabindingFailedException {
		final VDomainModelReference reference = mock(VDomainModelReference.class);
		final EList<VDomainModelReferenceSegment> segments = new BasicEList<>();
		when(reference.getSegments()).thenReturn(segments);
		when(reference.eClass()).thenReturn(VViewPackage.eINSTANCE.getFeaturePathDomainModelReference());
		final DomainModelReferenceConverterEMF converter1 = mock(DomainModelReferenceConverterEMF.class);

		when(converter1.isApplicable(reference)).thenReturn(5d);

		databindingService.addDomainModelReferenceConverter(converter1);
		databindingService.removeDomainModelReferenceConverter(converter1);
		databindingService.getValueProperty(reference, mock(EObject.class));
	}

	@Test(expected = DatabindingFailedException.class)
	public void testGetSettingNoApplicableConverter() throws DatabindingFailedException {
		final VDomainModelReference modelReference = mock(VDomainModelReference.class);
		final EList<VDomainModelReferenceSegment> segments = new BasicEList<>();
		when(modelReference.getSegments()).thenReturn(segments);
		final EClass eClass = mock(EClass.class);
		when(eClass.getName()).thenReturn("test"); //$NON-NLS-1$
		when(modelReference.eClass()).thenReturn(eClass);
		databindingService.getSetting(modelReference, mock(EObject.class));
	}

	@Test
	public void testGetSettingPropertyOneApplicable() throws DatabindingFailedException {
		final VDomainModelReference reference = mock(VDomainModelReference.class);
		final EList<VDomainModelReferenceSegment> segments = new BasicEList<>();
		when(reference.getSegments()).thenReturn(segments);
		final DomainModelReferenceConverterEMF converter1 = mock(DomainModelReferenceConverterEMF.class);
		final DomainModelReferenceConverterEMF converter2 = mock(DomainModelReferenceConverterEMF.class);
		final Setting expectedSetting = mock(Setting.class);

		when(converter1.isApplicable(reference)).thenReturn(0d);
		when(converter1.getSetting(same(reference), any(EObject.class))).thenReturn(expectedSetting);
		when(converter2.isApplicable(reference)).thenReturn(DomainModelReferenceConverter.NOT_APPLICABLE);
		when(converter2.convertToValueProperty(same(reference), any(EObject.class))).thenReturn(
			mock(IEMFValueProperty.class));

		databindingService.addDomainModelReferenceConverter(converter1);
		databindingService.addDomainModelReferenceConverter(converter2);
		final Setting setting = databindingService.getSetting(reference, mock(EObject.class));
		assertEquals(expectedSetting, setting);
	}

	@Test
	public void testGetSettingPropertyTwoApplicable() throws DatabindingFailedException {
		final VDomainModelReference reference = mock(VDomainModelReference.class);
		final EList<VDomainModelReferenceSegment> segments = new BasicEList<>();
		when(reference.getSegments()).thenReturn(segments);
		final DomainModelReferenceConverterEMF converter1 = mock(DomainModelReferenceConverterEMF.class);
		final DomainModelReferenceConverterEMF converter2 = mock(DomainModelReferenceConverterEMF.class);
		final Setting expectedSetting = mock(Setting.class);

		when(converter1.isApplicable(reference)).thenReturn(5d);
		when(converter1.getSetting(same(reference), any(EObject.class))).thenReturn(expectedSetting);
		when(converter2.isApplicable(reference)).thenReturn(1d);
		when(converter2.convertToValueProperty(same(reference), any(EObject.class))).thenReturn(
			mock(EMFValuePropertyDecorator.class));

		databindingService.addDomainModelReferenceConverter(converter1);
		databindingService.addDomainModelReferenceConverter(converter2);
		final Setting setting = databindingService.getSetting(reference, mock(EObject.class));
		assertEquals(expectedSetting, setting);
	}

	@Test
	public void testGetSettingPropertyAllConsidered() throws DatabindingFailedException {
		final VDomainModelReference reference = mock(VDomainModelReference.class);
		final EList<VDomainModelReferenceSegment> segments = new BasicEList<>();
		when(reference.getSegments()).thenReturn(segments);

		final DomainModelReferenceConverterEMF converter1 = mock(DomainModelReferenceConverterEMF.class);
		final DomainModelReferenceConverterEMF converter2 = mock(DomainModelReferenceConverterEMF.class);
		final DomainModelReferenceConverterEMF converter3 = mock(DomainModelReferenceConverterEMF.class);

		databindingService.addDomainModelReferenceConverter(converter1);
		databindingService.addDomainModelReferenceConverter(converter2);
		databindingService.addDomainModelReferenceConverter(converter3);

		databindingService.getSetting(reference, mock(EObject.class));

		verify(converter1).isApplicable(reference);
		verify(converter2).isApplicable(reference);
		verify(converter3).isApplicable(reference);
	}

	@Test(expected = IllegalArgumentException.class)
	public void testGetSettingPropertyNull() throws DatabindingFailedException {
		databindingService.getSetting(null, mock(EObject.class));
	}

	/**
	 * Test method for
	 * {@link org.eclipse.emfforms.internal.core.services.databinding.EMFFormsDatabindingImpl#getObservableValue(org.eclipse.emf.ecp.view.spi.model.VDomainModelReference, org.eclipse.emf.ecore.EObject)}
	 * .
	 *
	 * @throws DatabindingFailedException if the databinding failed
	 */
	@Test
	public void settings_testGetObservableValue() throws DatabindingFailedException {
		databindingService = spy(new EMFFormsDatabindingImpl());
		final VDomainModelReference reference = VViewFactory.eINSTANCE.createFeaturePathDomainModelReference();
		final VFeatureDomainModelReferenceSegment segment = VViewFactory.eINSTANCE
			.createFeatureDomainModelReferenceSegment();
		reference.getSegments().add(segment);
		final EObject eObject = EcoreFactory.eINSTANCE.createEObject();
		final DomainModelReferenceSegmentConverterEMF converter1 = mock(DomainModelReferenceSegmentConverterEMF.class);
		final IEMFValueProperty expectedResultProperty = mock(IEMFValueProperty.class);
		final SegmentConverterValueResultEMF converterResult = mock(SegmentConverterValueResultEMF.class);
		when(converterResult.getValueProperty()).thenReturn(expectedResultProperty);
		when(converterResult.getNextEClass()).thenReturn(Optional.empty());
		final IObservableValue expectedObservableValue = mock(IObservableValue.class);

		when(converter1.isApplicable(segment)).thenReturn(0d);
		when(converter1.convertToValueProperty(same(segment), any(EClass.class), any(EditingDomain.class)))
			.thenReturn(converterResult);
		when(expectedResultProperty.observe(eObject)).thenReturn(expectedObservableValue);

		databindingService.addDomainModelReferenceSegmentConverter(converter1);
		final IObservableValue resultObservableValue = databindingService.getObservableValue(reference, eObject);

		verify(databindingService).getValueProperty(reference, eObject);
		verify(expectedResultProperty).observe(eObject);
		assertEquals(expectedObservableValue, resultObservableValue);
	}

	/**
	 * Test method for
	 * {@link org.eclipse.emfforms.internal.core.services.databinding.EMFFormsDatabindingImpl#getValueProperty(VDomainModelReference,EObject)}
	 * .
	 *
	 * @throws DatabindingFailedException if the databinding failed
	 */
	@Test(expected = DatabindingFailedException.class)
	public void settings_testGetValuePropertyNoApplicableConverter() throws DatabindingFailedException {
		final VDomainModelReference reference = VViewFactory.eINSTANCE.createFeaturePathDomainModelReference();
		final VFeatureDomainModelReferenceSegment segment = VViewFactory.eINSTANCE
			.createFeatureDomainModelReferenceSegment();
		reference.getSegments().add(segment);
		databindingService.getValueProperty(reference, TestFactory.eINSTANCE.createA());
	}

	/**
	 * Test method for
	 * {@link org.eclipse.emfforms.internal.core.services.databinding.EMFFormsDatabindingImpl#getValueProperty(VDomainModelReference,EObject)}
	 * .
	 * Tests whether the correct converter is used when one is applicable and one is not.
	 *
	 * @throws DatabindingFailedException if the databinding failed
	 */
	@Test
	public void settings_testGetValuePropertyOneApplicable() throws DatabindingFailedException {
		final VDomainModelReference reference = VViewFactory.eINSTANCE.createFeaturePathDomainModelReference();
		final VFeatureDomainModelReferenceSegment segment = VViewFactory.eINSTANCE
			.createFeatureDomainModelReferenceSegment();
		reference.getSegments().add(segment);
		final DomainModelReferenceSegmentConverterEMF converter1 = mock(DomainModelReferenceSegmentConverterEMF.class);
		final DomainModelReferenceSegmentConverterEMF converter2 = mock(DomainModelReferenceSegmentConverterEMF.class);
		final IEMFValueProperty expectedResultProperty = mock(IEMFValueProperty.class);
		final SegmentConverterValueResultEMF converterResult = mock(SegmentConverterValueResultEMF.class);
		when(converterResult.getValueProperty()).thenReturn(expectedResultProperty);

		when(converter1.isApplicable(segment)).thenReturn(0d);
		when(converter1.convertToValueProperty(same(segment), any(EClass.class), any(EditingDomain.class)))
			.thenReturn(converterResult);
		when(converter2.isApplicable(segment)).thenReturn(DomainModelReferenceSegmentConverterEMF.NOT_APPLICABLE);
		when(converter2.convertToValueProperty(same(segment), any(EClass.class), any(EditingDomain.class)))
			.thenReturn(mock(SegmentConverterValueResultEMF.class));

		databindingService.addDomainModelReferenceSegmentConverter(converter1);
		databindingService.addDomainModelReferenceSegmentConverter(converter2);
		final IValueProperty valueProperty = databindingService.getValueProperty(reference,
			TestFactory.eINSTANCE.createA());
		assertEquals(expectedResultProperty, valueProperty);
	}

	@Test
	public void settings_testGetValueProperty_multipleSegments() throws DatabindingFailedException {
		final VDomainModelReference reference = VViewFactory.eINSTANCE.createFeaturePathDomainModelReference();
		final VFeatureDomainModelReferenceSegment segment1 = VViewFactory.eINSTANCE
			.createFeatureDomainModelReferenceSegment();
		reference.getSegments().add(segment1);
		final VFeatureDomainModelReferenceSegment segment2 = VViewFactory.eINSTANCE
			.createFeatureDomainModelReferenceSegment();
		reference.getSegments().add(segment2);

		final DomainModelReferenceSegmentConverterEMF converter = mock(DomainModelReferenceSegmentConverterEMF.class);
		final IEMFValueProperty resultProperty1 = mock(IEMFValueProperty.class, withSettings().name("resultProperty1")); //$NON-NLS-1$
		final IEMFValueProperty resultProperty2 = mock(IEMFValueProperty.class, withSettings().name("resultProperty2")); //$NON-NLS-1$
		final IEMFValueProperty expectedResultProperty = mock(IEMFValueProperty.class,
			withSettings().name("expectedResultProperty")); //$NON-NLS-1$
		when(resultProperty1.value(resultProperty2)).thenReturn(expectedResultProperty);

		final SegmentConverterValueResultEMF converterResult1 = mock(SegmentConverterValueResultEMF.class);
		when(converterResult1.getValueProperty()).thenReturn(resultProperty1);
		when(converterResult1.getNextEClass()).thenReturn(Optional.of(TestPackage.Literals.D));

		final SegmentConverterValueResultEMF converterResult2 = mock(SegmentConverterValueResultEMF.class);
		when(converterResult2.getValueProperty()).thenReturn(resultProperty2);
		when(converterResult2.getNextEClass()).thenReturn(Optional.empty());

		when(converter.isApplicable(segment1)).thenReturn(1d);
		when(converter.convertToValueProperty(same(segment1), eq(TestPackage.Literals.C), any(EditingDomain.class)))
			.thenReturn(converterResult1);
		when(converter.convertToValueProperty(same(segment2), eq(TestPackage.Literals.D), any(EditingDomain.class)))
			.thenReturn(converterResult2);

		databindingService.addDomainModelReferenceSegmentConverter(converter);
		final IValueProperty valueProperty = databindingService.getValueProperty(reference,
			TestFactory.eINSTANCE.createC());
		assertEquals(expectedResultProperty, valueProperty);
	}

	/**
	 * Test method for
	 * {@link org.eclipse.emfforms.internal.core.services.databinding.EMFFormsDatabindingImpl#getValueProperty(VDomainModelReference,EObject)}
	 * .
	 * Tests whether the correct converter is used when there are two applicable ones with different priorities.
	 * Also tests whether the correct result is returned.
	 *
	 * @throws DatabindingFailedException if the databinding failed
	 */
	@Test
	public void settings_testGetValuePropertyTwoApplicable() throws DatabindingFailedException {
		final VDomainModelReference reference = VViewFactory.eINSTANCE.createFeaturePathDomainModelReference();
		final VFeatureDomainModelReferenceSegment segment = VViewFactory.eINSTANCE
			.createFeatureDomainModelReferenceSegment();
		reference.getSegments().add(segment);
		final DomainModelReferenceSegmentConverterEMF converter1 = mock(DomainModelReferenceSegmentConverterEMF.class);
		final DomainModelReferenceSegmentConverterEMF converter2 = mock(DomainModelReferenceSegmentConverterEMF.class);
		final IEMFValueProperty expectedResultProperty = mock(IEMFValueProperty.class);
		final SegmentConverterValueResultEMF converterResult = mock(SegmentConverterValueResultEMF.class);
		when(converterResult.getValueProperty()).thenReturn(expectedResultProperty);

		when(converter1.isApplicable(segment)).thenReturn(5d);
		when(converter1.convertToValueProperty(same(segment), any(EClass.class), any(EditingDomain.class)))
			.thenReturn(converterResult);
		when(converter2.isApplicable(segment)).thenReturn(1d);
		when(converter2.convertToValueProperty(same(segment), any(EClass.class), any(EditingDomain.class)))
			.thenReturn(mock(SegmentConverterValueResultEMF.class));

		databindingService.addDomainModelReferenceSegmentConverter(converter1);
		databindingService.addDomainModelReferenceSegmentConverter(converter2);
		final IValueProperty valueProperty = databindingService.getValueProperty(reference,
			TestFactory.eINSTANCE.createA());
		assertEquals(expectedResultProperty, valueProperty);
	}

	/**
	 * Test method for
	 * {@link org.eclipse.emfforms.internal.core.services.databinding.EMFFormsDatabindingImpl#getValueProperty(VDomainModelReference,EObject)}
	 * .
	 * Tests whether the {@link EMFFormsDatabindingImpl} considers all {@link DomainModelReferenceSegmentConverterEMF}s,
	 * that
	 * are
	 * registered to it, for its conversions.
	 *
	 * @throws DatabindingFailedException if the databinding failed
	 */
	@Test
	public void settings_testGetValuePropertyAllConsidered() throws DatabindingFailedException {
		final VDomainModelReference reference = VViewFactory.eINSTANCE.createFeaturePathDomainModelReference();
		final VFeatureDomainModelReferenceSegment segment = VViewFactory.eINSTANCE
			.createFeatureDomainModelReferenceSegment();
		reference.getSegments().add(segment);

		final DomainModelReferenceSegmentConverterEMF converter1 = mock(DomainModelReferenceSegmentConverterEMF.class);
		final DomainModelReferenceSegmentConverterEMF converter2 = mock(DomainModelReferenceSegmentConverterEMF.class);
		final DomainModelReferenceSegmentConverterEMF converter3 = mock(DomainModelReferenceSegmentConverterEMF.class);

		when(converter1.isApplicable(segment)).thenReturn(1d);
		when(converter2.isApplicable(segment)).thenReturn(3d);
		when(converter3.isApplicable(segment)).thenReturn(2d);

		when(converter2.convertToValueProperty(same(segment), any(EClass.class), any(EditingDomain.class)))
			.thenReturn(mock(SegmentConverterValueResultEMF.class));
		databindingService.addDomainModelReferenceSegmentConverter(converter1);
		databindingService.addDomainModelReferenceSegmentConverter(converter2);
		databindingService.addDomainModelReferenceSegmentConverter(converter3);

		databindingService.getValueProperty(reference, TestFactory.eINSTANCE.createA());

		verify(converter1).isApplicable(segment);
		verify(converter2).isApplicable(segment);
		verify(converter3).isApplicable(segment);
	}

	@Test
	public void settings_testGetValueProperty_eClass() throws DatabindingFailedException {
		final VDomainModelReference reference = VViewFactory.eINSTANCE.createFeaturePathDomainModelReference();
		final VFeatureDomainModelReferenceSegment segment1 = VViewFactory.eINSTANCE
			.createFeatureDomainModelReferenceSegment();
		reference.getSegments().add(segment1);
		final VFeatureDomainModelReferenceSegment segment2 = VViewFactory.eINSTANCE
			.createFeatureDomainModelReferenceSegment();
		reference.getSegments().add(segment2);

		final DomainModelReferenceSegmentConverterEMF converter = mock(DomainModelReferenceSegmentConverterEMF.class);
		final IEMFValueProperty resultProperty1 = mock(IEMFValueProperty.class, withSettings().name("resultProperty1")); //$NON-NLS-1$
		final IEMFValueProperty resultProperty2 = mock(IEMFValueProperty.class, withSettings().name("resultProperty2")); //$NON-NLS-1$
		final IEMFValueProperty expectedResultProperty = mock(IEMFValueProperty.class,
			withSettings().name("expectedResultProperty")); //$NON-NLS-1$
		when(resultProperty1.value(resultProperty2)).thenReturn(expectedResultProperty);

		final SegmentConverterValueResultEMF converterResult1 = mock(SegmentConverterValueResultEMF.class);
		when(converterResult1.getValueProperty()).thenReturn(resultProperty1);
		when(converterResult1.getNextEClass()).thenReturn(Optional.of(TestPackage.Literals.D));

		final SegmentConverterValueResultEMF converterResult2 = mock(SegmentConverterValueResultEMF.class);
		when(converterResult2.getValueProperty()).thenReturn(resultProperty2);
		when(converterResult2.getNextEClass()).thenReturn(Optional.empty());

		when(converter.isApplicable(segment1)).thenReturn(1d);
		when(converter.convertToValueProperty(same(segment1), eq(TestPackage.Literals.C), any(EditingDomain.class)))
			.thenReturn(converterResult1);
		when(converter.convertToValueProperty(same(segment2), eq(TestPackage.Literals.D), any(EditingDomain.class)))
			.thenReturn(converterResult2);

		databindingService.addDomainModelReferenceSegmentConverter(converter);
		final IValueProperty valueProperty = databindingService.getValueProperty(reference,
			TestPackage.Literals.C);
		assertEquals(expectedResultProperty, valueProperty);
	}

	@Test
	public void settings_testGetValueProperty_eClass_editingDomain() throws DatabindingFailedException {
		final VDomainModelReference reference = VViewFactory.eINSTANCE.createFeaturePathDomainModelReference();
		final VFeatureDomainModelReferenceSegment segment1 = VViewFactory.eINSTANCE
			.createFeatureDomainModelReferenceSegment();
		reference.getSegments().add(segment1);
		final VFeatureDomainModelReferenceSegment segment2 = VViewFactory.eINSTANCE
			.createFeatureDomainModelReferenceSegment();
		reference.getSegments().add(segment2);

		final EditingDomain editingDomain = mock(EditingDomain.class);
		final DomainModelReferenceSegmentConverterEMF converter = mock(DomainModelReferenceSegmentConverterEMF.class);
		final IEMFValueProperty resultProperty1 = mock(IEMFValueProperty.class, withSettings().name("resultProperty1")); //$NON-NLS-1$
		final IEMFValueProperty resultProperty2 = mock(IEMFValueProperty.class, withSettings().name("resultProperty2")); //$NON-NLS-1$
		final IEMFValueProperty expectedResultProperty = mock(IEMFValueProperty.class,
			withSettings().name("expectedResultProperty")); //$NON-NLS-1$
		when(resultProperty1.value(resultProperty2)).thenReturn(expectedResultProperty);

		final SegmentConverterValueResultEMF converterResult1 = mock(SegmentConverterValueResultEMF.class);
		when(converterResult1.getValueProperty()).thenReturn(resultProperty1);
		when(converterResult1.getNextEClass()).thenReturn(Optional.of(TestPackage.Literals.D));

		final SegmentConverterValueResultEMF converterResult2 = mock(SegmentConverterValueResultEMF.class);
		when(converterResult2.getValueProperty()).thenReturn(resultProperty2);
		when(converterResult2.getNextEClass()).thenReturn(Optional.empty());

		when(converter.isApplicable(segment1)).thenReturn(1d);
		when(converter.convertToValueProperty(same(segment1), eq(TestPackage.Literals.C), any(EditingDomain.class)))
			.thenReturn(converterResult1);
		when(converter.convertToValueProperty(same(segment2), eq(TestPackage.Literals.D), any(EditingDomain.class)))
			.thenReturn(converterResult2);

		databindingService.addDomainModelReferenceSegmentConverter(converter);
		final IValueProperty valueProperty = databindingService.getValueProperty(reference,
			TestPackage.Literals.C, editingDomain);
		assertEquals(expectedResultProperty, valueProperty);
		verify(converter).convertToValueProperty(segment1, TestPackage.Literals.C, editingDomain);
		verify(converter).convertToValueProperty(segment2, TestPackage.Literals.D, editingDomain);
	}

	/**
	 * Test method for
	 * {@link org.eclipse.emfforms.internal.core.services.databinding.EMFFormsDatabindingImpl#getObservableList(VDomainModelReference, org.eclipse.emf.ecore.EObject)}
	 * .
	 *
	 * @throws DatabindingFailedException if the databinding failed
	 */
	@Test
	public void settings_testGetObservableList() throws DatabindingFailedException {
		databindingService = spy(new EMFFormsDatabindingImpl());
		final VDomainModelReference reference = VViewFactory.eINSTANCE.createFeaturePathDomainModelReference();
		final VFeatureDomainModelReferenceSegment segment = VViewFactory.eINSTANCE
			.createFeatureDomainModelReferenceSegment();
		reference.getSegments().add(segment);

		final EObject eObject = mock(EObject.class);
		final DomainModelReferenceSegmentConverterEMF converter1 = mock(DomainModelReferenceSegmentConverterEMF.class);
		final SegmentConverterListResultEMF converterResult = mock(SegmentConverterListResultEMF.class);
		final IEMFListProperty expectedResultProperty = mock(IEMFListProperty.class);
		when(converterResult.getListProperty()).thenReturn(expectedResultProperty);
		final IObservableList expectedObservableList = mock(IObservableList.class);

		when(converter1.isApplicable(segment)).thenReturn(5d);
		when(converter1.convertToListProperty(same(segment), any(EClass.class), any(EditingDomain.class)))
			.thenReturn(converterResult);
		when(expectedResultProperty.observe(eObject)).thenReturn(expectedObservableList);

		databindingService.addDomainModelReferenceSegmentConverter(converter1);
		final IObservableList resultObservableList = databindingService.getObservableList(reference, eObject);

		verify(databindingService).getListProperty(reference, eObject);
		verify(expectedResultProperty).observe(eObject);
assertEquals(expectedObservableList, resultObservableList); } /** * Test method for * {@link org.eclipse.emfforms.internal.core.services.databinding.EMFFormsDatabindingImpl#getListProperty(VDomainModelReference,EObject)} * . * * @throws DatabindingFailedException if the databinding failed */ @Test(expected = DatabindingFailedException.class) public void settings_testGetListPropertyNoApplicableConverter() throws DatabindingFailedException { final VDomainModelReference reference = VViewFactory.eINSTANCE.createFeaturePathDomainModelReference(); final VFeatureDomainModelReferenceSegment segment = VViewFactory.eINSTANCE .createFeatureDomainModelReferenceSegment(); reference.getSegments().add(segment); databindingService.getListProperty(reference, mock(EObject.class)); } /** * Test method for * {@link org.eclipse.emfforms.internal.core.services.databinding.EMFFormsDatabindingImpl#getListProperty(VDomainModelReference,EObject)} * . * Tests whether the correct converter is used when one is applicable and one is not. * * @throws DatabindingFailedException if the databinding failed */ @Test public void settings_testGetListPropertyOneApplicable() throws DatabindingFailedException { final VDomainModelReference reference = VViewFactory.eINSTANCE.createFeaturePathDomainModelReference(); final VFeatureDomainModelReferenceSegment segment = VViewFactory.eINSTANCE .createFeatureDomainModelReferenceSegment(); reference.getSegments().add(segment); final DomainModelReferenceSegmentConverterEMF converter1 = mock(DomainModelReferenceSegmentConverterEMF.class); final DomainModelReferenceSegmentConverterEMF converter2 = mock(DomainModelReferenceSegmentConverterEMF.class); final SegmentConverterListResultEMF converterResult = mock(SegmentConverterListResultEMF.class); final IEMFListProperty expectedResultProperty = mock(IEMFListProperty.class); when(converterResult.getListProperty()).thenReturn(expectedResultProperty); when(converter1.isApplicable(segment)).thenReturn(5d); when(converter1.convertToListProperty(same(segment), any(EClass.class), any(EditingDomain.class))) .thenReturn(converterResult); when(converter2.isApplicable(segment)).thenReturn(DomainModelReferenceSegmentConverterEMF.NOT_APPLICABLE); when(converter2.convertToListProperty(same(segment), any(EClass.class), any(EditingDomain.class))) .thenReturn(mock(SegmentConverterListResultEMF.class)); databindingService.addDomainModelReferenceSegmentConverter(converter1); databindingService.addDomainModelReferenceSegmentConverter(converter2); final IListProperty listProperty = databindingService.getListProperty(reference, mock(EObject.class)); assertEquals(expectedResultProperty, listProperty); } /** * Test method for * {@link org.eclipse.emfforms.internal.core.services.databinding.EMFFormsDatabindingImpl#getListProperty(VDomainModelReference,EObject)} * . * Tests whether the correct converter is used when there are two applicable ones with different priorities. * Also tests whether the correct result is returned. * * @throws DatabindingFailedException if the databinding failed */ @Test public void settings_testGetListPropertyTwoApplicable() throws DatabindingFailedException { final VDomainModelReference reference = VViewFactory.eINSTANCE.createFeaturePathDomainModelReference(); final VFeatureDomainModelReferenceSegment segment = VViewFactory.eINSTANCE .createFeatureDomainModelReferenceSegment(); reference.getSegments().add(segment); final DomainModelReferenceSegmentConverterEMF converter1 = mock(DomainModelReferenceSegmentConverterEMF.class); final DomainModelReferenceSegmentConverterEMF converter2 = mock(DomainModelReferenceSegmentConverterEMF.class); final SegmentConverterListResultEMF converterResult = mock(SegmentConverterListResultEMF.class); final IEMFListProperty expectedResultProperty = mock(IEMFListProperty.class); when(converterResult.getListProperty()).thenReturn(expectedResultProperty); when(converter1.isApplicable(segment)).thenReturn(5d); when(converter1.convertToListProperty(same(segment), any(EClass.class), any(EditingDomain.class))) .thenReturn(converterResult); when(converter2.isApplicable(segment)).thenReturn(1d); when(converter2.convertToListProperty(same(segment), any(EClass.class), any(EditingDomain.class))) .thenReturn(mock(SegmentConverterListResultEMF.class)); databindingService.addDomainModelReferenceSegmentConverter(converter1); databindingService.addDomainModelReferenceSegmentConverter(converter2); final IListProperty listProperty = databindingService.getListProperty(reference, mock(EObject.class)); assertEquals(expectedResultProperty, listProperty); } /** * Test method for * {@link org.eclipse.emfforms.internal.core.services.databinding.EMFFormsDatabindingImpl#getValueProperty(VDomainModelReference,EObject)} * . * Tests whether the {@link EMFFormsDatabindingImpl} considers all {@link DomainModelReferenceSegmentConverterEMF}s, * that are registered to it, for its conversions. * * @throws DatabindingFailedException if the databinding failed */ @Test public void settings_testGetListPropertyAllConsidered() throws DatabindingFailedException { final VDomainModelReference reference = VViewFactory.eINSTANCE.createFeaturePathDomainModelReference(); final VFeatureDomainModelReferenceSegment segment = VViewFactory.eINSTANCE .createFeatureDomainModelReferenceSegment(); reference.getSegments().add(segment); final DomainModelReferenceSegmentConverterEMF converter1 = mock(DomainModelReferenceSegmentConverterEMF.class); final DomainModelReferenceSegmentConverterEMF converter2 = mock(DomainModelReferenceSegmentConverterEMF.class); final DomainModelReferenceSegmentConverterEMF converter3 = mock(DomainModelReferenceSegmentConverterEMF.class); databindingService.addDomainModelReferenceSegmentConverter(converter1); databindingService.addDomainModelReferenceSegmentConverter(converter2); databindingService.addDomainModelReferenceSegmentConverter(converter3); when(converter1.isApplicable(segment)).thenReturn(1d); when(converter2.isApplicable(segment)).thenReturn(3d); when(converter2.convertToListProperty(any(VDomainModelReferenceSegment.class), any(EClass.class), any(EditingDomain.class))).thenReturn(mock(SegmentConverterListResultEMF.class)); when(converter3.isApplicable(segment)).thenReturn(2d); databindingService.getListProperty(reference, mock(EObject.class)); verify(converter1).isApplicable(segment); verify(converter2).isApplicable(segment); verify(converter3).isApplicable(segment); } /** * Test method for * {@link org.eclipse.emfforms.internal.core.services.databinding.EMFFormsDatabindingImpl#removeDomainModelReferenceSegmentConverter(DomainModelReferenceSegmentConverterEMF)} * . * * @throws DatabindingFailedException if the databinding failed */ @Test(expected = DatabindingFailedException.class) public void settings_testRemoveDomainModelReferenceSegmentConverter() throws DatabindingFailedException { final VDomainModelReference reference = VViewFactory.eINSTANCE.createFeaturePathDomainModelReference(); final VFeatureDomainModelReferenceSegment segment = VViewFactory.eINSTANCE .createFeatureDomainModelReferenceSegment(); reference.getSegments().add(segment); final DomainModelReferenceSegmentConverterEMF converter1 = mock(DomainModelReferenceSegmentConverterEMF.class); when(converter1.isApplicable(segment)).thenReturn(5d); databindingService.addDomainModelReferenceSegmentConverter(converter1); databindingService.removeDomainModelReferenceSegmentConverter(converter1); databindingService.getValueProperty(reference, TestFactory.eINSTANCE.createA()); } @Test(expected = DatabindingFailedException.class) public void settings_testGetSettingNoApplicableConverter() throws DatabindingFailedException { final VDomainModelReference reference = VViewFactory.eINSTANCE.createFeaturePathDomainModelReference(); final VFeatureDomainModelReferenceSegment segment = VViewFactory.eINSTANCE .createFeatureDomainModelReferenceSegment(); reference.getSegments().add(segment); databindingService.getSetting(reference, mock(EObject.class)); } @Test public void settings_testGetSettingPropertyOneApplicable() throws DatabindingFailedException { final VDomainModelReference reference = VViewFactory.eINSTANCE.createFeaturePathDomainModelReference(); final VFeatureDomainModelReferenceSegment segment = VViewFactory.eINSTANCE .createFeatureDomainModelReferenceSegment(); reference.getSegments().add(segment); final DomainModelReferenceSegmentConverterEMF converter1 = mock(DomainModelReferenceSegmentConverterEMF.class); final DomainModelReferenceSegmentConverterEMF converter2 = mock(DomainModelReferenceSegmentConverterEMF.class); final Setting expectedSetting = mock(Setting.class); when(converter1.isApplicable(segment)).thenReturn(5d); when(converter1.getSetting(same(segment), any(EObject.class))).thenReturn(expectedSetting); when(converter2.isApplicable(segment)).thenReturn(DomainModelReferenceSegmentConverterEMF.NOT_APPLICABLE); when(converter2.getSetting(same(segment), any(EObject.class))).thenReturn( mock(Setting.class)); databindingService.addDomainModelReferenceSegmentConverter(converter1); databindingService.addDomainModelReferenceSegmentConverter(converter2); final Setting setting = databindingService.getSetting(reference, mock(EObject.class)); assertEquals(expectedSetting, setting); } @Test public void settings_testGetSettingPropertyTwoApplicable() throws DatabindingFailedException { final VDomainModelReference reference = VViewFactory.eINSTANCE.createFeaturePathDomainModelReference(); final VFeatureDomainModelReferenceSegment segment = VViewFactory.eINSTANCE .createFeatureDomainModelReferenceSegment(); reference.getSegments().add(segment); final DomainModelReferenceSegmentConverterEMF converter1 = mock(DomainModelReferenceSegmentConverterEMF.class); final DomainModelReferenceSegmentConverterEMF converter2 = mock(DomainModelReferenceSegmentConverterEMF.class); final Setting expectedSetting = mock(Setting.class); when(converter1.isApplicable(segment)).thenReturn(5d); when(converter1.getSetting(same(segment), any(EObject.class))).thenReturn(expectedSetting); when(converter2.isApplicable(segment)).thenReturn(1d); when(converter2.getSetting(same(segment), any(EObject.class))).thenReturn( mock(Setting.class)); databindingService.addDomainModelReferenceSegmentConverter(converter1); databindingService.addDomainModelReferenceSegmentConverter(converter2); final Setting setting = databindingService.getSetting(reference, mock(EObject.class)); assertEquals(expectedSetting, setting); } @Test public void settings_testGetSettingPropertyAllConsidered() throws DatabindingFailedException { final VDomainModelReference reference = VViewFactory.eINSTANCE.createFeaturePathDomainModelReference(); final VFeatureDomainModelReferenceSegment segment = VViewFactory.eINSTANCE .createFeatureDomainModelReferenceSegment(); reference.getSegments().add(segment); final DomainModelReferenceSegmentConverterEMF converter1 = mock(DomainModelReferenceSegmentConverterEMF.class); final DomainModelReferenceSegmentConverterEMF converter2 = mock(DomainModelReferenceSegmentConverterEMF.class); final DomainModelReferenceSegmentConverterEMF converter3 = mock(DomainModelReferenceSegmentConverterEMF.class); when(converter1.isApplicable(segment)).thenReturn(1d); when(converter2.isApplicable(segment)).thenReturn(3d); when(converter3.isApplicable(segment)).thenReturn(2d); databindingService.addDomainModelReferenceSegmentConverter(converter1); databindingService.addDomainModelReferenceSegmentConverter(converter2); databindingService.addDomainModelReferenceSegmentConverter(converter3); databindingService.getSetting(reference, mock(EObject.class)); verify(converter1).isApplicable(segment); verify(converter2).isApplicable(segment); verify(converter3).isApplicable(segment); } @Test(expected = IllegalArgumentException.class) public void settings_testGetSettingPropertyNull() throws DatabindingFailedException { databindingService.getSetting(null, mock(EObject.class)); } @Test public void testResolveSegment() throws DatabindingFailedException { final VFeatureDomainModelReferenceSegment segment = VViewFactory.eINSTANCE .createFeatureDomainModelReferenceSegment(); final EObject eObject = EcoreFactory.eINSTANCE.createEObject(); final Setting expectedSetting = mock(Setting.class); final DomainModelReferenceSegmentConverterEMF converter1 = mock(DomainModelReferenceSegmentConverterEMF.class); final DomainModelReferenceSegmentConverterEMF converter2 = mock(DomainModelReferenceSegmentConverterEMF.class); final DomainModelReferenceSegmentConverterEMF converter3 = mock(DomainModelReferenceSegmentConverterEMF.class); when(converter1.isApplicable(segment)).thenReturn(1d); when(converter2.isApplicable(segment)).thenReturn(3d); when(converter3.isApplicable(segment)).thenReturn(2d); when(converter2.getSetting(segment, eObject)).thenReturn(expectedSetting); databindingService.addDomainModelReferenceSegmentConverter(converter1); databindingService.addDomainModelReferenceSegmentConverter(converter2); databindingService.addDomainModelReferenceSegmentConverter(converter3); final Setting result = databindingService.resolveSegment(segment, eObject); assertEquals(expectedSetting, result); verify(converter1).isApplicable(segment); verify(converter2).isApplicable(segment); verify(converter3).isApplicable(segment); verify(converter2).getSetting(segment, eObject); } }