Skip to content

Package: ControlRevealProvider_ITest

ControlRevealProvider_ITest

nameinstructionbranchcomplexitylinemethod
ControlRevealProvider_ITest()
M: 0 C: 19
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 7
100%
M: 0 C: 1
100%
createDomainModel()
M: 0 C: 37
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 5
100%
M: 0 C: 1
100%
createShell()
M: 0 C: 12
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 3
100%
M: 0 C: 1
100%
createViewModel()
M: 0 C: 22
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 5
100%
M: 0 C: 1
100%
destroyShell()
M: 0 C: 7
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 3
100%
M: 0 C: 1
100%
lambda$0(InvocationOnMock)
M: 0 C: 5
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 1
100%
M: 0 C: 1
100%
lambda$1(InvocationOnMock)
M: 0 C: 22
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 3
100%
M: 0 C: 1
100%
mockServices()
M: 0 C: 85
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 11
100%
M: 0 C: 1
100%
removeMockServices()
M: 0 C: 9
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 3
100%
M: 0 C: 1
100%
render()
M: 0 C: 20
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 5
100%
M: 0 C: 1
100%
revealWithFocus()
M: 0 C: 46
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 12
100%
M: 0 C: 1
100%

Coverage

1: /*******************************************************************************
2: * Copyright (c) 2019 Christian W. Damus 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: * Christian W. Damus - initial API and implementation
13: ******************************************************************************/
14: package org.eclipse.emfforms.internal.swt.core;
15:
16: import static java.util.Collections.singleton;
17: import static org.hamcrest.CoreMatchers.is;
18: import static org.mockito.Matchers.any;
19: import static org.mockito.Matchers.anyBoolean;
20: import static org.mockito.Matchers.argThat;
21: import static org.mockito.Mockito.atLeastOnce;
22: import static org.mockito.Mockito.mock;
23: import static org.mockito.Mockito.verify;
24: import static org.mockito.Mockito.when;
25:
26: import org.eclipse.e4.core.contexts.IEclipseContext;
27: import org.eclipse.emf.ecore.EAttribute;
28: import org.eclipse.emf.ecore.EObject;
29: import org.eclipse.emf.ecore.EcorePackage;
30: import org.eclipse.emf.ecp.common.spi.UniqueSetting;
31: import org.eclipse.emf.ecp.test.common.DefaultRealm;
32: import org.eclipse.emf.ecp.view.spi.context.ViewModelContext;
33: import org.eclipse.emf.ecp.view.spi.model.ModelReferenceHelper;
34: import org.eclipse.emf.ecp.view.spi.model.VContainedContainer;
35: import org.eclipse.emf.ecp.view.spi.model.VContainer;
36: import org.eclipse.emf.ecp.view.spi.model.VControl;
37: import org.eclipse.emf.ecp.view.spi.model.VElement;
38: import org.eclipse.emf.ecp.view.spi.model.VView;
39: import org.eclipse.emf.ecp.view.spi.model.VViewFactory;
40: import org.eclipse.emf.ecp.view.spi.renderer.NoPropertyDescriptorFoundExeption;
41: import org.eclipse.emf.ecp.view.spi.renderer.NoRendererFoundException;
42: import org.eclipse.emf.ecp.view.spi.vertical.model.VVerticalFactory;
43: import org.eclipse.emf.ecp.view.test.common.spi.EMFFormsRevealServiceFixture;
44: import org.eclipse.emf.ecp.view.test.common.spi.EMFFormsViewContextFixture.DomainModel;
45: import org.eclipse.emf.ecp.view.test.common.spi.EMFFormsViewContextFixture.ViewModel;
46: import org.eclipse.emf.ecp.view.test.common.spi.EMFMockingRunner;
47: import org.eclipse.emf.ecp.view.test.common.spi.EMock;
48: import org.eclipse.emf.ecp.view.test.common.swt.spi.SWTTestUtil;
49: import org.eclipse.emf.ecp.view.test.common.swt.spi.SWTViewTestHelper;
50: import org.eclipse.emfforms.bazaar.Bid;
51: import org.eclipse.emfforms.bazaar.Create;
52: import org.eclipse.emfforms.spi.common.report.ReportService;
53: import org.eclipse.emfforms.spi.core.services.controlmapper.EMFFormsSettingToControlMapper;
54: import org.eclipse.emfforms.spi.core.services.reveal.EMFFormsRevealProvider;
55: import org.eclipse.emfforms.spi.core.services.reveal.Reveal;
56: import org.eclipse.emfforms.spi.core.services.reveal.RevealHelper;
57: import org.eclipse.emfforms.spi.core.services.reveal.RevealStep;
58: import org.eclipse.emfforms.spi.swt.core.AbstractSWTRenderer;
59: import org.eclipse.emfforms.spi.swt.core.EMFFormsRendererFactory;
60: import org.eclipse.emfforms.spi.swt.core.EMFFormsRendererService;
61: import org.eclipse.emfforms.spi.swt.core.layout.GridDescriptionFactory;
62: import org.eclipse.emfforms.spi.swt.core.layout.SWTGridCell;
63: import org.eclipse.emfforms.spi.swt.core.layout.SWTGridDescription;
64: import org.eclipse.swt.SWT;
65: import org.eclipse.swt.layout.GridLayout;
66: import org.eclipse.swt.widgets.Composite;
67: import org.eclipse.swt.widgets.Control;
68: import org.eclipse.swt.widgets.Shell;
69: import org.eclipse.swt.widgets.Text;
70: import org.junit.After;
71: import org.junit.Before;
72: import org.junit.Rule;
73: import org.junit.Test;
74: import org.junit.rules.TestRule;
75: import org.junit.runner.RunWith;
76: import org.mockito.Mock;
77:
78: /**
79: * Tests covering the {@link ControlRevealProvider} class.
80: */
81: @SuppressWarnings("nls")
82: @RunWith(EMFMockingRunner.class)
83: public class ControlRevealProvider_ITest {
84:
85:         @ViewModel
86:         private final VView view = VViewFactory.eINSTANCE.createView();
87:         private final VControl control = VViewFactory.eINSTANCE.createControl();
88:
89:         @EMock
90:         @DomainModel
91:         private EObject rootObject;
92:
93:         @EMock
94:         private EObject obj1;
95:
96:         @EMock
97:         private EAttribute feature;
98:
99:         private AbstractSWTRenderer<VElement> controlRenderer;
100:
101:         @Mock
102:         private EMFFormsRendererService<VElement> rendererService;
103:
104:         @Mock
105:         private Runnable scrollToReveal;
106:
107:         @Rule
108:         public final TestRule realm = DefaultRealm.rule();
109:
110:         @Rule
111:         public final EMFFormsRevealServiceFixture<ViewModelContext> fixture = EMFFormsRevealServiceFixture.create(
112:                 ViewModelContext.class, this);
113:
114:         private Shell shell;
115:
116:         /**
117:          * Initializes me.
118:          */
119:         public ControlRevealProvider_ITest() {
120:                 super();
121:         }
122:
123:         @Test
124:         public void revealWithFocus() {
125:                 final VContainer container = (VContainer) view.getChildren().get(0);
126:
127:                 final Runnable reveal = mock(Runnable.class);
128:
129:                 final EMFFormsRevealProvider compositeRevealer = new EMFFormsRevealProvider() {
130:                         @Bid
131:                         public Double bid(VElement view, EObject model) {
132:                                 return view == container && model == obj1 ? Double.MAX_VALUE : null;
133:                         }
134:
135:                         @Create
136:                         public RevealStep create(VElement view, EObject model, RevealHelper helper) {
137:                                 return view == container && model == obj1
138:                                         ? helper.drillDown(this)
139:                                         : RevealStep.fail();
140:                         }
141:
142:                         @Reveal
143:                         RevealStep drillDown(VContainer element, EObject model) {
144:                                 return RevealStep.reveal(element, model, reveal);
145:                         }
146:
147:                 };
148:                 fixture.addRevealProvider(compositeRevealer);
149:
150:                 render();
151:
152:                 SWTTestUtil.waitForUIThread();
153:
154:                 fixture.reveal(obj1, feature);
155:
156:                 SWTTestUtil.waitForUIThread();
157:
158:                 verify(reveal).run();
159:
160:                 SWTTestUtil.waitForUIThread();
161:
162:                 // Check that the specific setting renderer was asked to reveal
163:                 verify(scrollToReveal, atLeastOnce()).run();
164:         }
165:
166:         //
167:         // Test framework
168:         //
169:
170:         @Before
171:         public void createDomainModel() {
172:                 when(feature.getEType()).thenReturn(EcorePackage.Literals.ESTRING);
173:                 when(feature.getEAttributeType()).thenReturn(EcorePackage.Literals.ESTRING);
174:                 when(obj1.eGet(feature)).thenReturn("Hello, world");
175:                 when(obj1.eGet(argThat(is(feature)), anyBoolean())).thenReturn("Hello, world");
176:         }
177:
178:         @Before
179:         public void createViewModel() {
180:                 final VContainedContainer container = VVerticalFactory.eINSTANCE.createVerticalLayout();
181:                 view.getChildren().add(container);
182:                 control.setDomainModelReference(ModelReferenceHelper.createDomainModelReference(feature));
183:                 container.getChildren().add(control);
184:         }
185:
186:         @Before
187:         public void mockServices() throws NoRendererFoundException, NoPropertyDescriptorFoundExeption {
188:                 // Ensure that the context-provider service gets our Eclipse context
189:                 when(fixture.getViewContext().getContextValue(IEclipseContext.class.getName()))
190:                         .then(invocation -> fixture.getService(IEclipseContext.class));
191:
192:                 // Spy on a renderer for verification of interactions
193:                 when(rendererService.isApplicable(argThat(is(control)), any())).thenReturn(Double.MAX_VALUE);
194:                 when(rendererService.getRendererInstance(argThat(is(control)), any())).then(invocation -> {
195:                         final ViewModelContext viewContext = (ViewModelContext) invocation.getArguments()[1];
196:                         controlRenderer = new DummyRenderer(control, viewContext, viewContext.getService(ReportService.class));
197:                         return controlRenderer;
198:                 });
199:                 ((EMFFormsRendererFactoryImpl) fixture.getService(EMFFormsRendererFactory.class))
200:                         .addEMFFormsRendererService(rendererService);
201:
202:                 // And also important is the control mapper
203:                 final EMFFormsSettingToControlMapper mapper = mock(EMFFormsSettingToControlMapper.class);
204:                 when(mapper.hasMapping(any(), any(VControl.class))).thenReturn(true);
205:                 when(mapper.getControlsFor(any(UniqueSetting.class))).thenReturn(singleton(control));
206:                 fixture.putService(EMFFormsSettingToControlMapper.class, mapper);
207:         }
208:
209:         @Before
210:         public void createShell() {
211:                 shell = new Shell();
212:                 shell.setLayout(new GridLayout());
213:         }
214:
215:         @After
216:         public void destroyShell() {
217:                 shell.dispose();
218:                 shell = null;
219:         }
220:
221:         // Don't mess with other tests
222:         @After
223:         public void removeMockServices() {
224:                 ((EMFFormsRendererFactoryImpl) fixture.getService(EMFFormsRendererFactory.class))
225:                         .removeEMFFormsRendererService(rendererService);
226:         }
227:
228:         void render() {
229:                 SWTViewTestHelper.render(fixture.getViewContext(), shell);
230:                 shell.layout();
231:                 shell.setSize(500, 300);
232:                 shell.open();
233:         }
234:
235:         //
236:         // Nested types
237:         //
238:
239:         /**
240:          * The abstract renderer API has too many final methods that cannot be mocked, and
241:          * they cause NPEs in the rendering process when using mocks.
242:          */
243:         private final class DummyRenderer extends AbstractSWTRenderer<VElement> {
244:
245:                 DummyRenderer(VElement vElement, ViewModelContext viewContext, ReportService reportService) {
246:                         super(vElement, viewContext, reportService);
247:                 }
248:
249:                 @Override
250:                 public SWTGridDescription getGridDescription(SWTGridDescription gridDescription) {
251:                         return GridDescriptionFactory.INSTANCE.createSimpleGrid(1, 1, this);
252:                 }
253:
254:                 @Override
255:                 protected Control renderControl(SWTGridCell cell, Composite parent)
256:                         throws NoRendererFoundException, NoPropertyDescriptorFoundExeption {
257:
258:                         return new Text(parent, SWT.BORDER);
259:                 }
260:
261:                 @Override
262:                 public void scrollToReveal() {
263:                         scrollToReveal.run();
264:                 }
265:         }
266:
267: }