blob: e752021a65f4a685d0134a55428010ab6d6a3e77 [file] [log] [blame]
/*******************************************************************************
* 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.segments.multi;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import java.util.Set;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.EStructuralFeature.Setting;
import org.eclipse.emf.ecore.InternalEObject;
import org.eclipse.emf.ecp.common.spi.UniqueSetting;
import org.eclipse.emf.ecp.view.spi.model.VDomainModelReference;
import org.eclipse.emf.ecp.view.spi.model.VFeatureDomainModelReferenceSegment;
import org.eclipse.emf.ecp.view.spi.model.VViewFactory;
import org.eclipse.emfforms.core.services.databinding.testmodel.test.model.B;
import org.eclipse.emfforms.core.services.databinding.testmodel.test.model.C;
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.common.report.AbstractReport;
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.mappingprovider.EMFFormsMappingProvider;
import org.eclipse.emfforms.view.spi.multisegment.model.VMultiDomainModelReferenceSegment;
import org.eclipse.emfforms.view.spi.multisegment.model.VMultisegmentFactory;
import org.junit.Before;
import org.junit.Test;
/**
* JUnit tests for {@link EMFFormsMappingProviderMulti}.
*
* @author Lucas Koehler
*
*/
public class EMFFormsMappingProviderMulti_Test {
private EMFFormsMappingProviderMulti provider;
private EMFFormsDatabindingEMF databinding;
private ReportService reportService;
@Before
public void setUp() {
provider = new EMFFormsMappingProviderMulti();
databinding = mock(EMFFormsDatabindingEMF.class);
provider.setEMFFormsDatabinding(databinding);
reportService = mock(ReportService.class);
provider.setReportService(reportService);
}
@Test
public void testGetMappingFor() throws DatabindingFailedException {
final VMultiDomainModelReferenceSegment multiSegment = VMultisegmentFactory.eINSTANCE
.createMultiDomainModelReferenceSegment();
final EReference listEReference = TestPackage.eINSTANCE.getB_CList();
multiSegment.setDomainModelFeature(listEReference.getName());
final VDomainModelReference childDMR = VViewFactory.eINSTANCE.createFeaturePathDomainModelReference();
multiSegment.getChildDomainModelReferences().add(childDMR);
final VDomainModelReference dmr = VViewFactory.eINSTANCE.createFeaturePathDomainModelReference();
dmr.getSegments().add(multiSegment);
final B domain = TestFactory.eINSTANCE.createB();
final C child1 = TestFactory.eINSTANCE.createC();
final C child2 = TestFactory.eINSTANCE.createC();
domain.getCList().add(child1);
domain.getCList().add(child2);
final Setting domainSetting = ((InternalEObject) domain).eSetting(listEReference);
final Setting child1Setting = ((InternalEObject) child1).eSetting(TestPackage.eINSTANCE.getC_D());
final Setting child2Setting = ((InternalEObject) child2).eSetting(TestPackage.eINSTANCE.getC_D());
when(databinding.getSetting(dmr, domain)).thenReturn(domainSetting);
when(databinding.getSetting(childDMR, child1)).thenReturn(child1Setting);
when(databinding.getSetting(childDMR, child2)).thenReturn(child2Setting);
final Set<UniqueSetting> mapping = provider.getMappingFor(dmr, domain);
assertEquals(3, mapping.size());
assertTrue(mapping.contains(UniqueSetting.createSetting(domainSetting)));
assertTrue(mapping.contains(UniqueSetting.createSetting(child1Setting)));
assertTrue(mapping.contains(UniqueSetting.createSetting(child2Setting)));
verify(databinding).getSetting(dmr, domain);
verify(databinding).getSetting(childDMR, child1);
verify(databinding).getSetting(childDMR, child2);
}
@Test
public void testGetMappingForFirstChildDatabindingFailed() throws DatabindingFailedException {
final VMultiDomainModelReferenceSegment multiSegment = VMultisegmentFactory.eINSTANCE
.createMultiDomainModelReferenceSegment();
final EReference listEReference = TestPackage.eINSTANCE.getB_CList();
multiSegment.setDomainModelFeature(listEReference.getName());
final VDomainModelReference childDMR = VViewFactory.eINSTANCE.createFeaturePathDomainModelReference();
multiSegment.getChildDomainModelReferences().add(childDMR);
final VDomainModelReference dmr = VViewFactory.eINSTANCE.createFeaturePathDomainModelReference();
dmr.getSegments().add(multiSegment);
final B domain = TestFactory.eINSTANCE.createB();
final C child1 = TestFactory.eINSTANCE.createC();
final C child2 = TestFactory.eINSTANCE.createC();
domain.getCList().add(child1);
domain.getCList().add(child2);
final Setting domainSetting = ((InternalEObject) domain).eSetting(listEReference);
final Setting child2Setting = ((InternalEObject) child2).eSetting(TestPackage.eINSTANCE.getC_D());
when(databinding.getSetting(dmr, domain)).thenReturn(domainSetting);
when(databinding.getSetting(childDMR, child1)).thenThrow(mock(DatabindingFailedException.class));
when(databinding.getSetting(childDMR, child2)).thenReturn(child2Setting);
final Set<UniqueSetting> mapping = provider.getMappingFor(dmr, domain);
assertEquals(2, mapping.size());
assertTrue(mapping.contains(UniqueSetting.createSetting(domainSetting)));
assertTrue(mapping.contains(UniqueSetting.createSetting(child2Setting)));
verify(databinding).getSetting(dmr, domain);
verify(databinding).getSetting(childDMR, child1);
verify(databinding).getSetting(childDMR, child2);
verify(reportService).report(any(AbstractReport.class));
}
@Test
public void testGetMappingForNoChildDMR() throws DatabindingFailedException {
final VMultiDomainModelReferenceSegment multiSegment = VMultisegmentFactory.eINSTANCE
.createMultiDomainModelReferenceSegment();
final EReference listEReference = TestPackage.eINSTANCE.getB_CList();
multiSegment.setDomainModelFeature(listEReference.getName());
final VDomainModelReference dmr = VViewFactory.eINSTANCE.createFeaturePathDomainModelReference();
dmr.getSegments().add(multiSegment);
final B domain = TestFactory.eINSTANCE.createB();
final Setting domainSetting = ((InternalEObject) domain).eSetting(listEReference);
when(databinding.getSetting(dmr, domain)).thenReturn(domainSetting);
final Set<UniqueSetting> mapping = provider.getMappingFor(dmr, domain);
assertEquals(1, mapping.size());
assertTrue(mapping.contains(UniqueSetting.createSetting(domainSetting)));
verify(databinding).getSetting(dmr, domain);
}
@Test
public void testGetMappingForDomainDatabindingFailed() throws DatabindingFailedException {
final VMultiDomainModelReferenceSegment multiSegment = VMultisegmentFactory.eINSTANCE
.createMultiDomainModelReferenceSegment();
final EReference listEReference = TestPackage.eINSTANCE.getB_CList();
multiSegment.setDomainModelFeature(listEReference.getName());
final VDomainModelReference dmr = VViewFactory.eINSTANCE.createFeaturePathDomainModelReference();
dmr.getSegments().add(multiSegment);
final B domain = TestFactory.eINSTANCE.createB();
when(databinding.getSetting(dmr, domain)).thenThrow(mock(DatabindingFailedException.class));
final Set<UniqueSetting> mapping = provider.getMappingFor(dmr, domain);
assertNotNull(mapping);
assertEquals(0, mapping.size());
verify(databinding).getSetting(dmr, domain);
verify(reportService).report(any(AbstractReport.class));
}
@Test(expected = IllegalArgumentException.class)
public void testGetMappingForDMRNull() {
provider.getMappingFor(null, mock(EObject.class));
}
@Test(expected = IllegalArgumentException.class)
public void testGetMappingForEObjectNull() {
final VDomainModelReference dmr = VViewFactory.eINSTANCE.createFeaturePathDomainModelReference();
final VMultiDomainModelReferenceSegment multiSegment = VMultisegmentFactory.eINSTANCE
.createMultiDomainModelReferenceSegment();
dmr.getSegments().add(multiSegment);
provider.getMappingFor(dmr, null);
}
@Test(expected = IllegalArgumentException.class)
public void testGetMappingForDMRWithoutSegments() {
final VDomainModelReference dmr = VViewFactory.eINSTANCE.createFeaturePathDomainModelReference();
provider.getMappingFor(dmr, mock(EObject.class));
}
@Test(expected = IllegalArgumentException.class)
public void testGetMappingForWrongLastSegment() {
final VDomainModelReference dmr = VViewFactory.eINSTANCE.createFeaturePathDomainModelReference();
final VFeatureDomainModelReferenceSegment featureSegment = VViewFactory.eINSTANCE
.createFeatureDomainModelReferenceSegment();
dmr.getSegments().add(featureSegment);
provider.getMappingFor(dmr, null);
}
@Test
public void testIsApplicableCorrectCase() {
final VDomainModelReference dmr = VViewFactory.eINSTANCE.createFeaturePathDomainModelReference();
final VMultiDomainModelReferenceSegment multiSegment = VMultisegmentFactory.eINSTANCE
.createMultiDomainModelReferenceSegment();
dmr.getSegments().add(multiSegment);
final double applicable = provider.isApplicable(dmr, mock(EObject.class));
assertEquals(6d, applicable, 0d);
}
@Test
public void testIsApplicableWrongLastSegment() {
final VDomainModelReference dmr = VViewFactory.eINSTANCE.createFeaturePathDomainModelReference();
final VFeatureDomainModelReferenceSegment featureSegment = VViewFactory.eINSTANCE
.createFeatureDomainModelReferenceSegment();
dmr.getSegments().add(featureSegment);
final double applicable = provider.isApplicable(dmr, mock(EObject.class));
assertEquals(EMFFormsMappingProvider.NOT_APPLICABLE, applicable, 0d);
}
@Test
public void testIsApplicableNullDMR() {
final double applicable = provider.isApplicable(null, mock(EObject.class));
assertEquals(EMFFormsMappingProvider.NOT_APPLICABLE, applicable, 0d);
verify(reportService).report(any(AbstractReport.class));
}
@Test
public void testIsApplicableNullEObject() {
final VDomainModelReference dmr = VViewFactory.eINSTANCE.createFeaturePathDomainModelReference();
final VMultiDomainModelReferenceSegment multiSegment = VMultisegmentFactory.eINSTANCE
.createMultiDomainModelReferenceSegment();
dmr.getSegments().add(multiSegment);
final double applicable = provider.isApplicable(dmr, null);
assertEquals(EMFFormsMappingProvider.NOT_APPLICABLE, applicable, 0d);
verify(reportService).report(any(AbstractReport.class));
}
@Test
public void testIsApplicableBothNull() {
final double applicable = provider.isApplicable(null, null);
assertEquals(EMFFormsMappingProvider.NOT_APPLICABLE, applicable, 0d);
verify(reportService).report(any(AbstractReport.class));
}
@Test
public void testIsApplicableNoSegments() {
final VDomainModelReference dmr = VViewFactory.eINSTANCE.createFeaturePathDomainModelReference();
final double applicable = provider.isApplicable(dmr, null);
assertEquals(EMFFormsMappingProvider.NOT_APPLICABLE, applicable, 0d);
verify(reportService).report(any(AbstractReport.class));
}
}