Skip to content

Package: TreeRevealProvider_PTest$DetailRevealer

TreeRevealProvider_PTest$DetailRevealer

nameinstructionbranchcomplexitylinemethod
TreeRevealProvider_PTest.DetailRevealer(TreeRevealProvider_PTest, Runnable)
M: 0 C: 9
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 4
100%
M: 0 C: 1
100%
bid(VView, EObject)
M: 0 C: 15
100%
M: 1 C: 3
75%
M: 1 C: 2
67%
M: 0 C: 1
100%
M: 0 C: 1
100%
create(VView, EObject)
M: 0 C: 6
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 1
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.emf.ecp.view.treemasterdetail.ui.swt.internal;
15:
16: import static org.eclipse.emf.ecp.view.test.common.spi.EMFMocking.eMock;
17: import static org.eclipse.emf.ecp.view.test.common.spi.EMFMocking.withESettings;
18: import static org.hamcrest.CoreMatchers.is;
19: import static org.junit.Assert.assertThat;
20: import static org.mockito.Matchers.any;
21: import static org.mockito.Matchers.anyVararg;
22: import static org.mockito.Mockito.mock;
23: import static org.mockito.Mockito.verify;
24: import static org.mockito.Mockito.when;
25:
26: import java.util.Arrays;
27:
28: import org.eclipse.emf.common.command.BasicCommandStack;
29: import org.eclipse.emf.common.util.URI;
30: import org.eclipse.emf.ecore.EAttribute;
31: import org.eclipse.emf.ecore.EClass;
32: import org.eclipse.emf.ecore.EObject;
33: import org.eclipse.emf.ecore.EPackage;
34: import org.eclipse.emf.ecore.EReference;
35: import org.eclipse.emf.ecore.ETypedElement;
36: import org.eclipse.emf.ecore.EcoreFactory;
37: import org.eclipse.emf.ecore.EcorePackage;
38: import org.eclipse.emf.ecore.resource.Resource;
39: import org.eclipse.emf.ecore.resource.impl.ResourceImpl;
40: import org.eclipse.emf.ecore.util.EcoreUtil;
41: import org.eclipse.emf.ecp.test.common.DefaultRealm;
42: import org.eclipse.emf.ecp.view.spi.context.ViewModelContext;
43: import org.eclipse.emf.ecp.view.spi.context.ViewModelService;
44: import org.eclipse.emf.ecp.view.spi.model.VElement;
45: import org.eclipse.emf.ecp.view.spi.model.VView;
46: import org.eclipse.emf.ecp.view.spi.model.VViewFactory;
47: import org.eclipse.emf.ecp.view.spi.swt.services.DefaultSelectionProviderService;
48: import org.eclipse.emf.ecp.view.spi.swt.services.ECPSelectionProviderService;
49: import org.eclipse.emf.ecp.view.test.common.spi.EMFFormsRevealServiceFixture;
50: import org.eclipse.emf.ecp.view.test.common.spi.EMFFormsViewContextFixture.DomainModel;
51: import org.eclipse.emf.ecp.view.test.common.spi.EMFFormsViewContextFixture.ViewModel;
52: import org.eclipse.emf.ecp.view.test.common.swt.spi.SWTTestUtil;
53: import org.eclipse.emf.ecp.view.test.common.swt.spi.SWTViewTestHelper;
54: import org.eclipse.emf.ecp.view.treemasterdetail.model.VTreeMasterDetail;
55: import org.eclipse.emf.ecp.view.treemasterdetail.model.VTreeMasterDetailFactory;
56: import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain;
57: import org.eclipse.emf.edit.provider.ReflectiveItemProviderAdapterFactory;
58: import org.eclipse.emfforms.bazaar.Bid;
59: import org.eclipse.emfforms.bazaar.Create;
60: import org.eclipse.emfforms.spi.core.services.reveal.EMFFormsRevealProvider;
61: import org.eclipse.emfforms.spi.core.services.reveal.Reveal;
62: import org.eclipse.emfforms.spi.core.services.reveal.RevealHelper;
63: import org.eclipse.emfforms.spi.core.services.reveal.RevealStep;
64: import org.eclipse.swt.widgets.Shell;
65: import org.eclipse.swt.widgets.Tree;
66: import org.eclipse.swt.widgets.TreeItem;
67: import org.junit.After;
68: import org.junit.Before;
69: import org.junit.Rule;
70: import org.junit.Test;
71: import org.junit.rules.TestRule;
72:
73: /**
74: * Tests covering the {@link TreeRevealProvider} class.
75: */
76: @SuppressWarnings("nls")
77: public class TreeRevealProvider_PTest {
78:
79:         @ViewModel
80:         private final VView viewModel = VViewFactory.eINSTANCE.createView();
81:
82:         @DomainModel
83:         private EObject rootObject;
84:
85:         private EObject class1;
86:         private EObject class2;
87:
88:         private EObject att1;
89:         private EObject att2;
90:
91:         private EObject detailObj;
92:
93:         private VTreeMasterDetail treeMD;
94:
95:         @Rule
96:         public final TestRule realm = DefaultRealm.rule();
97:
98:         @Rule
99:         public final EMFFormsRevealServiceFixture<ViewModelContext> fixture = EMFFormsRevealServiceFixture.create(
100:                 ViewModelContext.class, this);
101:
102:         private Shell shell;
103:
104:         /**
105:          * Initializes me.
106:          */
107:         public TreeRevealProvider_PTest() {
108:                 super();
109:
110:                 createDomainModel();
111:         }
112:
113:         /**
114:          * Test revealing an object that is presented and selectable in the tree.
115:          */
116:         @Test
117:         public void revealInTree() {
118:                 final Runnable reveal = mock(Runnable.class);
119:
120:                 fixture.addRevealProvider(new ViewRevealer(reveal));
121:
122:                 render();
123:
124:                 fixture.reveal(att1);
125:
126:                 SWTTestUtil.waitForUIThread();
127:
128:                 verify(reveal).run();
129:
130:                 final Tree tree = SWTTestUtil.findControl(shell, 0, Tree.class);
131:                 final TreeItem[] selection = tree.getSelection();
132:                 assertThat("No tree selection", selection.length, is(1));
133:                 assertThat("Tree selection incorrect", selection[0].getData(), is(att1));
134:         }
135:
136:         /**
137:          * Test revealing an object that is presented only in the detail view of an object
138:          * that is selectable in the tree.
139:          */
140:         @Test
141:         public void revealInDetail() {
142:                 final Runnable reveal = mock(Runnable.class);
143:
144:                 fixture.addRevealProvider(new ViewRevealer(mock(Runnable.class)));
145:                 fixture.addRevealProvider(new DetailRevealer(reveal));
146:
147:                 render();
148:
149:                 fixture.reveal(detailObj);
150:
151:                 SWTTestUtil.waitForUIThread();
152:
153:                 verify(reveal).run();
154:
155:                 final Tree tree = SWTTestUtil.findControl(shell, 0, Tree.class);
156:                 final TreeItem[] selection = tree.getSelection();
157:                 assertThat("No tree selection", selection.length, is(1));
158:                 assertThat("Tree selection incorrect", selection[0].getData(), is(att2));
159:         }
160:
161:         //
162:         // Test framework
163:         //
164:
165:         @Before
166:         public void createViewModel() {
167:                 treeMD = VTreeMasterDetailFactory.eINSTANCE.createTreeMasterDetail();
168:                 viewModel.getChildren().add(treeMD);
169:
170:                 // The renderer needs this
171:                 fixture.putService(ECPSelectionProviderService.class, new DefaultSelectionProviderService());
172:         }
173:
174:         private void createDomainModel() {
175:                 // Tiny dynamic schema to make sure that we get a generated view model
176:                 // for the details (for predictability)
177:                 final EPackage pkg = EcoreFactory.eINSTANCE.createEPackage();
178:                 pkg.setName("pkg");
179:                 pkg.setNsPrefix("pkg");
180:                 pkg.setNsURI("fake:pkg");
181:                 final EClass namedElement = EcoreFactory.eINSTANCE.createEClass();
182:                 namedElement.setName("NamedElement");
183:                 pkg.getEClassifiers().add(namedElement);
184:                 final EAttribute name = EcoreFactory.eINSTANCE.createEAttribute();
185:                 name.setName("name");
186:                 name.setEType(EcorePackage.Literals.ESTRING);
187:                 namedElement.getEStructuralFeatures().add(name);
188:                 final EReference children = EcoreFactory.eINSTANCE.createEReference();
189:                 children.setName("children");
190:                 children.setEType(namedElement);
191:                 children.setContainment(true);
192:                 children.setLowerBound(0);
193:                 children.setUpperBound(ETypedElement.UNBOUNDED_MULTIPLICITY);
194:                 namedElement.getEStructuralFeatures().add(children);
195:
196:                 // Create the model that will show in the tree
197:                 rootObject = EcoreUtil.create(namedElement);
198:                 rootObject.eSet(name, "pkg");
199:                 class1 = EcoreUtil.create(namedElement);
200:                 class1.eSet(name, "Class1");
201:                 class2 = EcoreUtil.create(namedElement);
202:                 class2.eSet(name, "Class2");
203:                 rootObject.eSet(children, Arrays.asList(class1, class2));
204:
205:                 att1 = EcoreUtil.create(namedElement);
206:                 att1.eSet(name, "att1");
207:                 att2 = EcoreUtil.create(namedElement);
208:                 att2.eSet(name, "att2");
209:                 class2.eSet(children, Arrays.asList(att1, att2));
210:
211:                 // An object that isn't presented in the tree but as a detail
212:                 // of an object that is in the tree
213:                 detailObj = eMock(EObject.class, withESettings().eContainer(att2));
214:
215:                 // The detail rendeering for featurees wants to find types in the resource set
216:                 final Resource res = new ResourceImpl(URI.createURI("fake:resource"));
217:                 res.getContents().add(rootObject);
218:                 new AdapterFactoryEditingDomain(new ReflectiveItemProviderAdapterFactory(),
219:                         new BasicCommandStack()).getResourceSet().getResources().add(res);
220:         }
221:
222:         @Before
223:         public void createShell() {
224:                 shell = new Shell();
225:         }
226:
227:         @Before
228:         public void mockChildContexts() {
229:                 when(fixture.getViewContext().getChildContext(any(), any(), any(), (ViewModelService[]) anyVararg()))
230:                         .then(invocation -> {
231:                                 final ViewModelContext result = fixture.createChildContext((VElement) invocation.getArguments()[1],
232:                                         "child",
233:                                         (VView) invocation.getArguments()[2],
234:                                         (EObject) invocation.getArguments()[0]);
235:                                 when(result.getParentContext()).thenReturn((ViewModelContext) invocation.getMock());
236:                                 return result;
237:                         });
238:         }
239:
240:         @After
241:         public void destroyShell() {
242:                 shell.dispose();
243:                 shell = null;
244:         }
245:
246:         void render() {
247:                 SWTViewTestHelper.render(fixture.getViewContext(), shell);
248:         }
249:
250:         //
251:         // Nested types
252:         //
253:
254:         /**
255:          * A high-bidding reveal provider to make sure that we drill into the view
256:          * to find the tree, regardless of other possible contributions in the
257:          * current configuration.
258:          */
259:         private final class ViewRevealer implements EMFFormsRevealProvider {
260:
261:                 private final Runnable reveal;
262:
263:                 ViewRevealer(Runnable reveal) {
264:                         super();
265:
266:                         this.reveal = reveal;
267:                 }
268:
269:                 @Bid
270:                 public Double bid(VView view) {
271:                         return view == viewModel ? Double.MAX_VALUE : null;
272:                 }
273:
274:                 @Create
275:                 public RevealStep create(VView view, EObject model, RevealHelper helper) {
276:                         return view == viewModel
277:                                 ? helper.drillDown(this)
278:                                 : RevealStep.fail();
279:                 }
280:
281:                 @Reveal
282:                 private RevealStep drillDown(VView view, EObject model) {
283:                         return RevealStep.reveal(view, model, reveal);
284:                 }
285:         }
286:
287:         /**
288:          * A high-bidding reveal provider to mock revealing the detail object
289:          * that is not presented in the tree.
290:          */
291:         private final class DetailRevealer implements EMFFormsRevealProvider {
292:
293:                 private final Runnable reveal;
294:
295:                 DetailRevealer(Runnable reveal) {
296:                         super();
297:
298:                         this.reveal = reveal;
299:                 }
300:
301:                 @Bid
302:                 public Double bid(VView view, EObject object) {
303:                         // The detail is a generated view
304:•                        return view != viewModel && object == detailObj ? Double.MAX_VALUE : null;
305:                 }
306:
307:                 @Create
308:                 public RevealStep create(VView view, EObject model) {
309:                         return RevealStep.reveal(view, model, reveal);
310:                 }
311:
312:         }
313:
314: }