Skip to content

Package: EMFFormsStructuralChangeTesterImpl_Test

EMFFormsStructuralChangeTesterImpl_Test

nameinstructionbranchcomplexitylinemethod
EMFFormsStructuralChangeTesterImpl_Test()
M: 0 C: 3
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 1
100%
M: 0 C: 1
100%
setUp()
M: 0 C: 26
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 6
100%
M: 0 C: 1
100%
testFallbackToDmrBasedResolution()
M: 0 C: 95
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 19
100%
M: 0 C: 1
100%
testIsStructureChangedConsiderAllNecessarySegments()
M: 0 C: 173
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 34
100%
M: 0 C: 1
100%
testIsStructureChangedDontConsiderUnnecessarySegments()
M: 0 C: 156
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 32
100%
M: 0 C: 1
100%
testIsStructureChangedMultiReferenceNoRelevantChange()
M: 0 C: 154
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 31
100%
M: 0 C: 1
100%
testIsStructureChangedMultiReferenceRelevantChange()
M: 0 C: 154
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 31
100%
M: 0 C: 1
100%
testIsStructureChangedSegmentTesterUsage()
M: 0 C: 117
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 24
100%
M: 0 C: 1
100%

Coverage

1: /*******************************************************************************
2: * Copyright (c) 2011-2018 EclipseSource Muenchen GmbH and others.
3: *
4: * All rights reserved. This program and the accompanying materials
5: * are made available under the terms of the Eclipse Public License 2.0
6: * which accompanies this distribution, and is available at
7: * https://www.eclipse.org/legal/epl-2.0/
8: *
9: * SPDX-License-Identifier: EPL-2.0
10: *
11: * Contributors:
12: * Lucas Koehler - initial API and implementation
13: ******************************************************************************/
14: package org.eclipse.emfforms.internal.core.services.structuralchange;
15:
16: import static org.junit.Assert.assertFalse;
17: import static org.junit.Assert.assertTrue;
18: import static org.mockito.Matchers.any;
19: import static org.mockito.Mockito.mock;
20: import static org.mockito.Mockito.never;
21: import static org.mockito.Mockito.verify;
22: import static org.mockito.Mockito.when;
23:
24: import org.eclipse.emf.common.notify.Notification;
25: import org.eclipse.emf.ecore.EObject;
26: import org.eclipse.emf.ecore.EReference;
27: import org.eclipse.emf.ecore.EStructuralFeature.Setting;
28: import org.eclipse.emf.ecore.InternalEObject;
29: import org.eclipse.emf.ecp.view.spi.model.ModelChangeNotification;
30: import org.eclipse.emf.ecp.view.spi.model.VDomainModelReference;
31: import org.eclipse.emf.ecp.view.spi.model.VDomainModelReferenceSegment;
32: import org.eclipse.emf.ecp.view.spi.model.VFeatureDomainModelReferenceSegment;
33: import org.eclipse.emf.ecp.view.spi.model.VFeaturePathDomainModelReference;
34: import org.eclipse.emf.ecp.view.spi.model.VViewFactory;
35: import org.eclipse.emfforms.core.services.databinding.testmodel.test.model.A;
36: import org.eclipse.emfforms.core.services.databinding.testmodel.test.model.B;
37: import org.eclipse.emfforms.core.services.databinding.testmodel.test.model.C;
38: import org.eclipse.emfforms.core.services.databinding.testmodel.test.model.TestFactory;
39: import org.eclipse.emfforms.core.services.databinding.testmodel.test.model.TestPackage;
40: import org.eclipse.emfforms.spi.common.report.ReportService;
41: import org.eclipse.emfforms.spi.core.services.databinding.DatabindingFailedException;
42: import org.eclipse.emfforms.spi.core.services.databinding.emf.EMFFormsSegmentResolver;
43: import org.eclipse.emfforms.spi.core.services.structuralchange.StructuralChangeSegmentTester;
44: import org.eclipse.emfforms.spi.core.services.structuralchange.StructuralChangeTesterInternal;
45: import org.junit.Before;
46: import org.junit.Test;
47:
48: /**
49: * JUnit org.eclipse.emfforms.core.services.structuralchange.test for {@link EMFFormsStructuralChangeTesterImpl}.
50: *
51: * @author Lucas Koehler
52: *
53: */
54: public class EMFFormsStructuralChangeTesterImpl_Test {
55:
56:         private EMFFormsStructuralChangeTesterImpl changeTester;
57:         private ReportService reportService;
58:         private EMFFormsSegmentResolver segmentResolver;
59:
60:         @Before
61:         public void setUp() {
62:                 changeTester = new EMFFormsStructuralChangeTesterImpl();
63:                 reportService = mock(ReportService.class);
64:                 changeTester.setReportService(reportService);
65:                 segmentResolver = mock(EMFFormsSegmentResolver.class);
66:                 changeTester.setEMFFormsSegmentResolver(segmentResolver);
67:         }
68:
69:         /**
70:          * Test method for
71:          * {@link org.eclipse.emfforms.internal.core.services.structuralchange.EMFFormsStructuralChangeTesterImpl#isStructureChanged(org.eclipse.emf.ecp.view.spi.model.VDomainModelReference, org.eclipse.emf.ecore.EObject, org.eclipse.emf.ecp.view.spi.model.ModelChangeNotification)}.
72:          *
73:          * @throws DatabindingFailedException
74:          */
75:         @Test
76:         public void testIsStructureChangedSegmentTesterUsage() throws DatabindingFailedException {
77:                 final B domain = TestFactory.eINSTANCE.createB();
78:                 final EReference eReference = TestPackage.eINSTANCE.getB_C();
79:                 final Setting setting = ((InternalEObject) domain).eSetting(eReference);
80:                 final VFeatureDomainModelReferenceSegment segment = VViewFactory.eINSTANCE
81:                         .createFeatureDomainModelReferenceSegment();
82:                 segment.setDomainModelFeature(eReference.getName());
83:                 final VDomainModelReference dmr = VViewFactory.eINSTANCE.createFeaturePathDomainModelReference();
84:                 dmr.getSegments().add(segment);
85:
86:                 final C oldValue = TestFactory.eINSTANCE.createC();
87:                 final C newValue = TestFactory.eINSTANCE.createC();
88:                 final TestNotification raw = new TestNotification(Notification.SET, oldValue, newValue, domain, eReference);
89:                 final ModelChangeNotification mcn = new ModelChangeNotification(raw);
90:
91:                 final StructuralChangeSegmentTester tester0 = mock(StructuralChangeSegmentTester.class);
92:                 final StructuralChangeSegmentTester tester1 = mock(StructuralChangeSegmentTester.class);
93:
94:                 when(tester0.isApplicable(segment)).thenReturn(1d);
95:                 when(tester1.isApplicable(segment)).thenReturn(2d);
96:                 when(segmentResolver.resolveSegment(segment, domain)).thenReturn(setting);
97:
98:                 changeTester.addStructuralChangeSegmentTester(tester0);
99:                 changeTester.addStructuralChangeSegmentTester(tester1);
100:
101:                 changeTester.isStructureChanged(dmr, domain, mcn);
102:
103:                 verify(tester0).isApplicable(segment);
104:                 verify(tester1).isApplicable(segment);
105:                 verify(tester1).isStructureChanged(segment, domain, mcn);
106:         }
107:
108:         /**
109:          * Test method for
110:          * {@link org.eclipse.emfforms.internal.core.services.structuralchange.EMFFormsStructuralChangeTesterImpl#isStructureChanged(org.eclipse.emf.ecp.view.spi.model.VDomainModelReference, org.eclipse.emf.ecore.EObject, org.eclipse.emf.ecp.view.spi.model.ModelChangeNotification)}.
111:          *
112:          * @throws DatabindingFailedException
113:          */
114:         @Test
115:         public void testIsStructureChangedConsiderAllNecessarySegments() throws DatabindingFailedException {
116:                 final B domain = TestFactory.eINSTANCE.createB();
117:                 final C c = TestFactory.eINSTANCE.createC();
118:                 domain.setC(c);
119:                 final EReference bToC = TestPackage.eINSTANCE.getB_C();
120:                 final EReference cToA = TestPackage.eINSTANCE.getC_A();
121:
122:                 final VFeatureDomainModelReferenceSegment segmentB = VViewFactory.eINSTANCE
123:                         .createFeatureDomainModelReferenceSegment();
124:                 segmentB.setDomainModelFeature(bToC.getName());
125:                 final VFeatureDomainModelReferenceSegment segmentC = VViewFactory.eINSTANCE
126:                         .createFeatureDomainModelReferenceSegment();
127:                 segmentC.setDomainModelFeature(cToA.getName());
128:
129:                 final VDomainModelReference dmr = VViewFactory.eINSTANCE.createFeaturePathDomainModelReference();
130:                 dmr.getSegments().add(segmentB);
131:                 dmr.getSegments().add(segmentC);
132:
133:                 final Setting settingB = ((InternalEObject) domain).eSetting(bToC);
134:                 final Setting settingC = ((InternalEObject) c).eSetting(cToA);
135:
136:                 final A newValue = TestFactory.eINSTANCE.createA();
137:                 final TestNotification raw = new TestNotification(Notification.SET, null, newValue, c, cToA);
138:                 final ModelChangeNotification mcn = new ModelChangeNotification(raw);
139:
140:                 final StructuralChangeSegmentTester tester0 = mock(StructuralChangeSegmentTester.class);
141:                 final StructuralChangeSegmentTester tester1 = mock(StructuralChangeSegmentTester.class);
142:
143:                 when(tester0.isApplicable(any(VDomainModelReferenceSegment.class))).thenReturn(1d);
144:                 when(tester1.isApplicable(any(VDomainModelReferenceSegment.class))).thenReturn(2d);
145:                 when(tester1.isStructureChanged(segmentB, domain, mcn)).thenReturn(false);
146:                 when(tester1.isStructureChanged(segmentC, c, mcn)).thenReturn(true);
147:                 when(segmentResolver.resolveSegment(segmentB, domain)).thenReturn(settingB);
148:                 when(segmentResolver.resolveSegment(segmentC, c)).thenReturn(settingC);
149:
150:                 changeTester.addStructuralChangeSegmentTester(tester0);
151:                 changeTester.addStructuralChangeSegmentTester(tester1);
152:
153:                 final boolean isChanged = changeTester.isStructureChanged(dmr, domain, mcn);
154:
155:                 assertTrue(isChanged);
156:                 verify(tester1).isStructureChanged(segmentB, domain, mcn);
157:                 verify(tester1).isStructureChanged(segmentC, c, mcn);
158:         }
159:
160:         /**
161:          * Test method for
162:          * {@link org.eclipse.emfforms.internal.core.services.structuralchange.EMFFormsStructuralChangeTesterImpl#isStructureChanged(org.eclipse.emf.ecp.view.spi.model.VDomainModelReference, org.eclipse.emf.ecore.EObject, org.eclipse.emf.ecp.view.spi.model.ModelChangeNotification)}.
163:          *
164:          * @throws DatabindingFailedException
165:          */
166:         @Test
167:         public void testIsStructureChangedMultiReferenceRelevantChange() throws DatabindingFailedException {
168:                 final A domain = TestFactory.eINSTANCE.createA();
169:                 final B b = TestFactory.eINSTANCE.createB();
170:                 domain.setB(b);
171:                 final EReference aToB = TestPackage.eINSTANCE.getA_B();
172:                 final EReference bToCList = TestPackage.eINSTANCE.getB_CList();
173:
174:                 final VFeatureDomainModelReferenceSegment segmentB = VViewFactory.eINSTANCE
175:                         .createFeatureDomainModelReferenceSegment();
176:                 segmentB.setDomainModelFeature(aToB.getName());
177:                 final VFeatureDomainModelReferenceSegment segmentCList = VViewFactory.eINSTANCE
178:                         .createFeatureDomainModelReferenceSegment();
179:                 segmentCList.setDomainModelFeature(bToCList.getName());
180:
181:                 final VDomainModelReference dmr = VViewFactory.eINSTANCE.createFeaturePathDomainModelReference();
182:                 dmr.getSegments().add(segmentB);
183:                 dmr.getSegments().add(segmentCList);
184:
185:                 final Setting settingB = ((InternalEObject) domain).eSetting(aToB);
186:                 final Setting settingCList = ((InternalEObject) b).eSetting(bToCList);
187:
188:                 final C newValue = TestFactory.eINSTANCE.createC();
189:                 final TestNotification raw = new TestNotification(Notification.ADD, null, newValue, b, bToCList);
190:                 final ModelChangeNotification mcn = new ModelChangeNotification(raw);
191:
192:                 final StructuralChangeSegmentTester tester = mock(StructuralChangeSegmentTester.class);
193:
194:                 when(tester.isApplicable(any(VDomainModelReferenceSegment.class))).thenReturn(2d);
195:                 when(tester.isStructureChanged(segmentB, domain, mcn)).thenReturn(false);
196:                 when(tester.isStructureChanged(segmentCList, b, mcn)).thenReturn(true);
197:                 when(segmentResolver.resolveSegment(segmentB, domain)).thenReturn(settingB);
198:                 when(segmentResolver.resolveSegment(segmentCList, b)).thenReturn(settingCList);
199:
200:                 changeTester.addStructuralChangeSegmentTester(tester);
201:
202:                 final boolean isChanged = changeTester.isStructureChanged(dmr, domain, mcn);
203:
204:                 assertTrue(isChanged);
205:                 verify(tester).isStructureChanged(segmentB, domain, mcn);
206:                 verify(tester).isStructureChanged(segmentCList, b, mcn);
207:         }
208:
209:         /**
210:          * Test method for
211:          * {@link org.eclipse.emfforms.internal.core.services.structuralchange.EMFFormsStructuralChangeTesterImpl#isStructureChanged(org.eclipse.emf.ecp.view.spi.model.VDomainModelReference, org.eclipse.emf.ecore.EObject, org.eclipse.emf.ecp.view.spi.model.ModelChangeNotification)}.
212:          *
213:          * @throws DatabindingFailedException
214:          */
215:         @Test
216:         public void testIsStructureChangedMultiReferenceNoRelevantChange() throws DatabindingFailedException {
217:                 final A domain = TestFactory.eINSTANCE.createA();
218:                 final B b = TestFactory.eINSTANCE.createB();
219:                 domain.setB(b);
220:                 final EReference aToB = TestPackage.eINSTANCE.getA_B();
221:                 final EReference bToCList = TestPackage.eINSTANCE.getB_CList();
222:
223:                 final VFeatureDomainModelReferenceSegment segmentB = VViewFactory.eINSTANCE
224:                         .createFeatureDomainModelReferenceSegment();
225:                 segmentB.setDomainModelFeature(aToB.getName());
226:                 final VFeatureDomainModelReferenceSegment segmentCList = VViewFactory.eINSTANCE
227:                         .createFeatureDomainModelReferenceSegment();
228:                 segmentCList.setDomainModelFeature(bToCList.getName());
229:
230:                 final VDomainModelReference dmr = VViewFactory.eINSTANCE.createFeaturePathDomainModelReference();
231:                 dmr.getSegments().add(segmentB);
232:                 dmr.getSegments().add(segmentCList);
233:
234:                 final Setting settingB = ((InternalEObject) domain).eSetting(aToB);
235:                 final Setting settingCList = ((InternalEObject) b).eSetting(bToCList);
236:
237:                 final C newValue = TestFactory.eINSTANCE.createC();
238:                 final TestNotification raw = new TestNotification(Notification.ADD, null, newValue, b, bToCList);
239:                 final ModelChangeNotification mcn = new ModelChangeNotification(raw);
240:
241:                 final StructuralChangeSegmentTester tester = mock(StructuralChangeSegmentTester.class);
242:
243:                 when(tester.isApplicable(any(VDomainModelReferenceSegment.class))).thenReturn(2d);
244:                 when(tester.isStructureChanged(segmentB, domain, mcn)).thenReturn(false);
245:                 when(tester.isStructureChanged(segmentCList, b, mcn)).thenReturn(false);
246:                 when(segmentResolver.resolveSegment(segmentB, domain)).thenReturn(settingB);
247:                 when(segmentResolver.resolveSegment(segmentCList, b)).thenReturn(settingCList);
248:
249:                 changeTester.addStructuralChangeSegmentTester(tester);
250:
251:                 final boolean isChanged = changeTester.isStructureChanged(dmr, domain, mcn);
252:
253:                 assertFalse(isChanged);
254:                 verify(tester).isStructureChanged(segmentB, domain, mcn);
255:                 verify(tester).isStructureChanged(segmentCList, b, mcn);
256:         }
257:
258:         /**
259:          * Test method for
260:          * {@link org.eclipse.emfforms.internal.core.services.structuralchange.EMFFormsStructuralChangeTesterImpl#isStructureChanged(org.eclipse.emf.ecp.view.spi.model.VDomainModelReference, org.eclipse.emf.ecore.EObject, org.eclipse.emf.ecp.view.spi.model.ModelChangeNotification)}.
261:          *
262:          * @throws DatabindingFailedException
263:          */
264:         @Test
265:         public void testIsStructureChangedDontConsiderUnnecessarySegments() throws DatabindingFailedException {
266:                 final B domain = TestFactory.eINSTANCE.createB();
267:                 final C c = TestFactory.eINSTANCE.createC();
268:                 domain.setC(c);
269:                 final EReference bToC = TestPackage.eINSTANCE.getB_C();
270:                 final EReference cToA = TestPackage.eINSTANCE.getC_A();
271:
272:                 final VFeatureDomainModelReferenceSegment segmentB = VViewFactory.eINSTANCE
273:                         .createFeatureDomainModelReferenceSegment();
274:                 segmentB.setDomainModelFeature(bToC.getName());
275:                 final VFeatureDomainModelReferenceSegment segmentC = VViewFactory.eINSTANCE
276:                         .createFeatureDomainModelReferenceSegment();
277:                 segmentC.setDomainModelFeature(cToA.getName());
278:
279:                 final VDomainModelReference dmr = VViewFactory.eINSTANCE.createFeaturePathDomainModelReference();
280:                 dmr.getSegments().add(segmentB);
281:                 dmr.getSegments().add(segmentC);
282:
283:                 final Setting settingB = ((InternalEObject) domain).eSetting(bToC);
284:
285:                 final C newValue = TestFactory.eINSTANCE.createC();
286:                 final TestNotification raw = new TestNotification(Notification.SET, null, newValue, domain, bToC);
287:                 final ModelChangeNotification mcn = new ModelChangeNotification(raw);
288:
289:                 final StructuralChangeSegmentTester tester0 = mock(StructuralChangeSegmentTester.class);
290:                 final StructuralChangeSegmentTester tester1 = mock(StructuralChangeSegmentTester.class);
291:
292:                 when(tester0.isApplicable(any(VDomainModelReferenceSegment.class))).thenReturn(1d);
293:                 when(tester1.isApplicable(any(VDomainModelReferenceSegment.class))).thenReturn(2d);
294:                 when(tester1.isStructureChanged(segmentB, domain, mcn)).thenReturn(true);
295:                 when(segmentResolver.resolveSegment(segmentB, domain)).thenReturn(settingB);
296:
297:                 changeTester.addStructuralChangeSegmentTester(tester0);
298:                 changeTester.addStructuralChangeSegmentTester(tester1);
299:
300:                 final boolean isChanged = changeTester.isStructureChanged(dmr, domain, mcn);
301:
302:                 assertTrue(isChanged);
303:                 verify(tester1).isStructureChanged(segmentB, domain, mcn);
304:                 verify(tester1, never()).isStructureChanged(segmentC, c, mcn);
305:                 verify(tester1, never()).isApplicable(segmentC);
306:         }
307:
308:         /** Test that the service uses DMR based structural change testing if the DMR does not have any segments. */
309:         @Test
310:         public void testFallbackToDmrBasedResolution() {
311:                 final VFeaturePathDomainModelReference dmr = VViewFactory.eINSTANCE.createFeaturePathDomainModelReference();
312:
313:                 final B domain = TestFactory.eINSTANCE.createB();
314:                 final C c = TestFactory.eINSTANCE.createC();
315:                 domain.setC(c);
316:
317:                 dmr.getDomainModelEReferencePath().add(TestPackage.Literals.B__C);
318:                 dmr.setDomainModelEFeature(TestPackage.Literals.C__A);
319:
320:                 final StructuralChangeTesterInternal tester = mock(StructuralChangeTesterInternal.class);
321:                 when(tester.isApplicable(any(VDomainModelReference.class))).thenReturn(1d);
322:                 when(tester.isStructureChanged(any(VDomainModelReference.class), any(EObject.class),
323:                         any(ModelChangeNotification.class))).thenReturn(true);
324:
325:                 changeTester.addStructuralChangeTesterInternal(tester);
326:
327:                 final TestNotification raw = new TestNotification(Notification.SET, null, TestFactory.eINSTANCE.createC(),
328:                         domain, TestPackage.Literals.B__C);
329:                 final ModelChangeNotification mcn = new ModelChangeNotification(raw);
330:
331:                 final boolean result = changeTester.isStructureChanged(dmr, domain, mcn);
332:                 assertTrue(result);
333:                 verify(tester).isApplicable(dmr);
334:                 verify(tester).isStructureChanged(dmr, domain, mcn);
335:         }
336: }