blob: 4c2edddd186f2d1f5778a070e89d0ec3e2209a8c [file] [log] [blame]
/*******************************************************************************
* 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.emfforms.internal.core.services.domainexpander.defaultheuristic;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.atLeastOnce;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import java.util.Optional;
import org.eclipse.emf.ecore.EObject;
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.VViewFactory;
import org.eclipse.emfforms.spi.core.services.domainexpander.EMFFormsDMRExpander;
import org.eclipse.emfforms.spi.core.services.domainexpander.EMFFormsDMRSegmentExpander;
import org.eclipse.emfforms.spi.core.services.domainexpander.EMFFormsExpandingFailedException;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
/**
* JUnit test cases for {@link EMFFormsDomainExpanderImpl}.
*
* @author Lucas Koehler
*
*/
public class EMFFormsDomainExpanderImpl_Test {
private EMFFormsDomainExpanderImpl domainExpander;
/**
* Create a new {@link EMFFormsDomainExpanderImpl} for every test case.
*/
@Before
public void setUp() {
domainExpander = new EMFFormsDomainExpanderImpl();
}
/**
* @throws java.lang.Exception
*/
@After
public void tearDown() throws Exception {
}
@Test(expected = EMFFormsExpandingFailedException.class)
public void testPrepareDomainObject_NoDMRExpander() throws EMFFormsExpandingFailedException {
domainExpander.prepareDomainObject(VViewFactory.eINSTANCE.createFeaturePathDomainModelReference(),
mock(EObject.class));
}
@Test(expected = EMFFormsExpandingFailedException.class)
public void testPrepareDomainObjectNoSuitableDMRExpander() throws EMFFormsExpandingFailedException {
final EMFFormsDMRExpander dmrExpander = mock(EMFFormsDMRExpander.class);
when(dmrExpander.isApplicable(any(VDomainModelReference.class))).thenReturn(EMFFormsDMRExpander.NOT_APPLICABLE);
domainExpander.addEMFFormsDMRExpander(dmrExpander);
domainExpander.prepareDomainObject(VViewFactory.eINSTANCE.createFeaturePathDomainModelReference(),
mock(EObject.class));
}
@Test
public void testPrepareDomainObjectAllDMRExpandersConsidered() throws EMFFormsExpandingFailedException {
final EMFFormsDMRExpander dmrExpander1 = mock(EMFFormsDMRExpander.class);
when(dmrExpander1.isApplicable(any(VDomainModelReference.class))).thenReturn(1d);
final EMFFormsDMRExpander dmrExpander2 = mock(EMFFormsDMRExpander.class);
when(dmrExpander2.isApplicable(any(VDomainModelReference.class))).thenReturn(2d);
final EMFFormsDMRExpander dmrExpander3 = mock(EMFFormsDMRExpander.class);
when(dmrExpander3.isApplicable(any(VDomainModelReference.class))).thenReturn(3d);
domainExpander.addEMFFormsDMRExpander(dmrExpander1);
domainExpander.addEMFFormsDMRExpander(dmrExpander2);
domainExpander.addEMFFormsDMRExpander(dmrExpander3);
final VDomainModelReference dmr = VViewFactory.eINSTANCE.createFeaturePathDomainModelReference();
domainExpander.prepareDomainObject(dmr, mock(EObject.class));
verify(dmrExpander1, atLeastOnce()).isApplicable(dmr);
verify(dmrExpander2, atLeastOnce()).isApplicable(dmr);
verify(dmrExpander3, atLeastOnce()).isApplicable(dmr);
}
@Test
public void testPrepareDomainObjectUseCorrectDMRExpander() throws EMFFormsExpandingFailedException {
final EMFFormsDMRExpander dmrExpander1 = mock(EMFFormsDMRExpander.class);
when(dmrExpander1.isApplicable(any(VDomainModelReference.class))).thenReturn(1d);
final EMFFormsDMRExpander dmrExpander2 = mock(EMFFormsDMRExpander.class);
when(dmrExpander2.isApplicable(any(VDomainModelReference.class)))
.thenReturn(EMFFormsDMRExpander.NOT_APPLICABLE);
final EMFFormsDMRExpander dmrExpander3 = mock(EMFFormsDMRExpander.class);
when(dmrExpander3.isApplicable(any(VDomainModelReference.class))).thenReturn(3d);
domainExpander.addEMFFormsDMRExpander(dmrExpander1);
domainExpander.addEMFFormsDMRExpander(dmrExpander2);
domainExpander.addEMFFormsDMRExpander(dmrExpander3);
final VDomainModelReference dmr = VViewFactory.eINSTANCE.createFeaturePathDomainModelReference();
final EObject domainObject = mock(EObject.class);
domainExpander.prepareDomainObject(dmr, domainObject);
verify(dmrExpander3).prepareDomainObject(dmr, domainObject);
}
@Test(expected = IllegalArgumentException.class)
public void testPrepareDomainObjectReferenceNull() throws EMFFormsExpandingFailedException {
domainExpander.prepareDomainObject(null, mock(EObject.class));
}
@Test(expected = IllegalArgumentException.class)
public void testPrepareDomainObjectObjectNull() throws EMFFormsExpandingFailedException {
domainExpander.prepareDomainObject(mock(VDomainModelReference.class), null);
}
@Test(expected = IllegalArgumentException.class)
public void testPrepareDomainObjectBothNull() throws EMFFormsExpandingFailedException {
domainExpander.prepareDomainObject(null, null);
}
/**
* Tests that are used over the whole dmr if segments are present.
*
* @throws EMFFormsExpandingFailedException
*/
@Test
public void prepareDomainObject_SegmentsOverDmr() throws EMFFormsExpandingFailedException {
final EMFFormsDMRExpander dmrExpander = mock(EMFFormsDMRExpander.class);
final EMFFormsDMRSegmentExpander segmentExpander = mock(EMFFormsDMRSegmentExpander.class);
when(segmentExpander.isApplicable(any(VDomainModelReferenceSegment.class))).thenReturn(1d);
final VDomainModelReference dmr = VViewFactory.eINSTANCE.createFeaturePathDomainModelReference();
final VDomainModelReferenceSegment segment1 = VViewFactory.eINSTANCE.createFeatureDomainModelReferenceSegment();
final VDomainModelReferenceSegment segment2 = VViewFactory.eINSTANCE.createFeatureDomainModelReferenceSegment();
dmr.getSegments().add(segment1);
dmr.getSegments().add(segment2);
final EObject domainObject = mock(EObject.class);
final EObject resultForSegment1 = mock(EObject.class);
when(segmentExpander.prepareDomainObject(segment1, domainObject)).thenReturn(Optional.of(resultForSegment1));
domainExpander.addEMFFormsDMRExpander(dmrExpander);
domainExpander.addEMFFormsDMRSegmentExpander(segmentExpander);
domainExpander.prepareDomainObject(dmr, domainObject);
verify(dmrExpander, never()).isApplicable(any(VDomainModelReference.class));
verify(dmrExpander, never()).prepareDomainObject(any(VDomainModelReference.class), any(EObject.class));
verify(segmentExpander).isApplicable(segment1);
verify(segmentExpander).prepareDomainObject(segment1, domainObject);
}
@Test
public void testPrepareDomainObject() throws EMFFormsExpandingFailedException {
final VDomainModelReference dmr = VViewFactory.eINSTANCE.createFeaturePathDomainModelReference();
final VDomainModelReferenceSegment segment1 = VViewFactory.eINSTANCE.createFeatureDomainModelReferenceSegment();
final VDomainModelReferenceSegment segment2 = VViewFactory.eINSTANCE.createFeatureDomainModelReferenceSegment();
final VDomainModelReferenceSegment segment3 = VViewFactory.eINSTANCE.createFeatureDomainModelReferenceSegment();
dmr.getSegments().add(segment1);
dmr.getSegments().add(segment2);
dmr.getSegments().add(segment3);
final EObject domainObject = mock(EObject.class);
final EObject resultForSegment1 = mock(EObject.class);
final EMFFormsDMRSegmentExpander segmentExpander = mock(EMFFormsDMRSegmentExpander.class);
when(segmentExpander.isApplicable(any(VDomainModelReferenceSegment.class))).thenReturn(1d);
when(segmentExpander.prepareDomainObject(segment1, domainObject)).thenReturn(Optional.of(resultForSegment1));
when(segmentExpander.prepareDomainObject(segment2, resultForSegment1))
.thenReturn(Optional.of(mock(EObject.class)));
domainExpander.addEMFFormsDMRSegmentExpander(segmentExpander);
domainExpander.prepareDomainObject(dmr, domainObject);
verify(segmentExpander).prepareDomainObject(segment1, domainObject);
verify(segmentExpander).prepareDomainObject(segment2, resultForSegment1);
verify(segmentExpander, never()).prepareDomainObject(eq(segment3), any(EObject.class));
}
@Test
public void testPrepareDomainObjectLastSegmentNeedsExpansion() throws EMFFormsExpandingFailedException {
final VDomainModelReference dmr = VViewFactory.eINSTANCE.createFeaturePathDomainModelReference();
final VDomainModelReferenceSegment segment1 = VViewFactory.eINSTANCE.createFeatureDomainModelReferenceSegment();
final VDomainModelReferenceSegment segment2 = VViewFactory.eINSTANCE.createFeatureDomainModelReferenceSegment();
final VDomainModelReferenceSegment segment3 = VViewFactory.eINSTANCE.createFeatureDomainModelReferenceSegment();
dmr.getSegments().add(segment1);
dmr.getSegments().add(segment2);
dmr.getSegments().add(segment3);
final EObject domainObject = mock(EObject.class);
final EObject resultForSegment1 = mock(EObject.class);
final EObject resultForSegment2 = mock(EObject.class);
final EMFFormsDMRSegmentExpander segmentExpander = mock(EMFFormsDMRSegmentExpander.class);
when(segmentExpander.isApplicable(any(VDomainModelReferenceSegment.class))).thenReturn(1d);
when(segmentExpander.needsToExpandLastSegment()).thenReturn(true);
when(segmentExpander.prepareDomainObject(segment1, domainObject)).thenReturn(Optional.of(resultForSegment1));
when(segmentExpander.prepareDomainObject(segment2, resultForSegment1))
.thenReturn(Optional.of(resultForSegment2));
domainExpander.addEMFFormsDMRSegmentExpander(segmentExpander);
domainExpander.prepareDomainObject(dmr, domainObject);
verify(segmentExpander).prepareDomainObject(segment1, domainObject);
verify(segmentExpander).prepareDomainObject(segment2, resultForSegment1);
verify(segmentExpander).prepareDomainObject(segment3, resultForSegment2);
}
@Test(expected = EMFFormsExpandingFailedException.class)
public void testPrepareDomainObjectNoSuitableSegmentExpander() throws EMFFormsExpandingFailedException {
final EMFFormsDMRSegmentExpander segmentExpander = mock(EMFFormsDMRSegmentExpander.class);
when(segmentExpander.isApplicable(any(VDomainModelReferenceSegment.class)))
.thenReturn(EMFFormsDMRSegmentExpander.NOT_APPLICABLE);
domainExpander.addEMFFormsDMRSegmentExpander(segmentExpander);
final VDomainModelReferenceSegment segment1 = VViewFactory.eINSTANCE.createFeatureDomainModelReferenceSegment();
final VDomainModelReferenceSegment segment2 = VViewFactory.eINSTANCE.createFeatureDomainModelReferenceSegment();
final VDomainModelReference dmr = VViewFactory.eINSTANCE.createFeaturePathDomainModelReference();
dmr.getSegments().add(segment1);
dmr.getSegments().add(segment2);
domainExpander.prepareDomainObject(dmr, mock(EObject.class));
}
@Test
public void testPrepareDomainObjectAllDMRSegmentExpandersConsidered() throws EMFFormsExpandingFailedException {
final EMFFormsDMRSegmentExpander segmentExpander1 = mock(EMFFormsDMRSegmentExpander.class);
when(segmentExpander1.isApplicable(any(VDomainModelReferenceSegment.class))).thenReturn(1d);
final EMFFormsDMRSegmentExpander segmentExpander2 = mock(EMFFormsDMRSegmentExpander.class);
when(segmentExpander2.isApplicable(any(VDomainModelReferenceSegment.class))).thenReturn(2d);
final EMFFormsDMRSegmentExpander segmentExpander3 = mock(EMFFormsDMRSegmentExpander.class);
when(segmentExpander3.isApplicable(any(VDomainModelReferenceSegment.class))).thenReturn(3d);
domainExpander.addEMFFormsDMRSegmentExpander(segmentExpander1);
domainExpander.addEMFFormsDMRSegmentExpander(segmentExpander2);
domainExpander.addEMFFormsDMRSegmentExpander(segmentExpander3);
final VDomainModelReference dmr = VViewFactory.eINSTANCE.createFeaturePathDomainModelReference();
final VDomainModelReferenceSegment segment1 = VViewFactory.eINSTANCE.createFeatureDomainModelReferenceSegment();
final VDomainModelReferenceSegment segment2 = VViewFactory.eINSTANCE.createFeatureDomainModelReferenceSegment();
dmr.getSegments().add(segment1);
dmr.getSegments().add(segment2);
when(segmentExpander3.prepareDomainObject(eq(segment1), any(EObject.class)))
.thenReturn(Optional.of(mock(EObject.class)));
domainExpander.prepareDomainObject(dmr, mock(EObject.class));
verify(segmentExpander1, atLeastOnce()).isApplicable(segment1);
verify(segmentExpander2, atLeastOnce()).isApplicable(segment1);
verify(segmentExpander3, atLeastOnce()).isApplicable(segment1);
}
@Test
public void testPrepareDomainObjectUseCorrectSegmentExpander() throws EMFFormsExpandingFailedException {
final EMFFormsDMRSegmentExpander segmentExpander1 = mock(EMFFormsDMRSegmentExpander.class);
when(segmentExpander1.isApplicable(any(VDomainModelReferenceSegment.class))).thenReturn(1d);
final EMFFormsDMRSegmentExpander segmentExpander2 = mock(EMFFormsDMRSegmentExpander.class);
when(segmentExpander2.isApplicable(any(VDomainModelReferenceSegment.class)))
.thenReturn(EMFFormsDMRSegmentExpander.NOT_APPLICABLE);
final EMFFormsDMRSegmentExpander segmentExpander3 = mock(EMFFormsDMRSegmentExpander.class);
when(segmentExpander3.isApplicable(any(VDomainModelReferenceSegment.class))).thenReturn(3d);
domainExpander.addEMFFormsDMRSegmentExpander(segmentExpander1);
domainExpander.addEMFFormsDMRSegmentExpander(segmentExpander2);
domainExpander.addEMFFormsDMRSegmentExpander(segmentExpander3);
final VDomainModelReference dmr = VViewFactory.eINSTANCE.createFeaturePathDomainModelReference();
final VDomainModelReferenceSegment segment1 = VViewFactory.eINSTANCE.createFeatureDomainModelReferenceSegment();
final VDomainModelReferenceSegment segment2 = VViewFactory.eINSTANCE.createFeatureDomainModelReferenceSegment();
dmr.getSegments().add(segment1);
dmr.getSegments().add(segment2);
final EObject domainObject = mock(EObject.class);
when(segmentExpander3.prepareDomainObject(eq(segment1), any(EObject.class)))
.thenReturn(Optional.of(mock(EObject.class)));
domainExpander.prepareDomainObject(dmr, domainObject);
verify(segmentExpander3).prepareDomainObject(segment1, domainObject);
}
}