Skip to content

Package: CategorizationRevealProvider_PTest$3

CategorizationRevealProvider_PTest$3

nameinstructionbranchcomplexitylinemethod
bid(VElement, EObject)
M: 0 C: 14
100%
M: 1 C: 3
75%
M: 1 C: 2
67%
M: 0 C: 1
100%
M: 0 C: 1
100%
create(VElement, EObject)
M: 1 C: 16
94%
M: 2 C: 2
50%
M: 2 C: 1
33%
M: 1 C: 2
67%
M: 0 C: 1
100%
{...}
M: 0 C: 12
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.spi.categorization.swt;
15:
16: import static org.eclipse.emf.ecp.common.spi.UniqueSetting.createSetting;
17: import static org.eclipse.emf.ecp.view.test.common.spi.EMFMocking.eMock;
18: import static org.eclipse.emf.ecp.view.test.common.spi.EMFMocking.withESettings;
19: import static org.hamcrest.CoreMatchers.is;
20: import static org.hamcrest.MatcherAssert.assertThat;
21: import static org.mockito.Mockito.mock;
22: import static org.mockito.Mockito.verify;
23: import static org.mockito.Mockito.when;
24:
25: import java.util.ArrayList;
26:
27: import org.eclipse.emf.ecore.EObject;
28: import org.eclipse.emf.ecore.EStructuralFeature;
29: import org.eclipse.emf.ecore.EcoreFactory;
30: import org.eclipse.emf.ecore.EcorePackage;
31: import org.eclipse.emf.ecp.test.common.DefaultRealm;
32: import org.eclipse.emf.ecp.view.internal.categorization.swt.CategorizationRevealProvider;
33: import org.eclipse.emf.ecp.view.spi.categorization.model.VCategorization;
34: import org.eclipse.emf.ecp.view.spi.categorization.model.VCategorizationElement;
35: import org.eclipse.emf.ecp.view.spi.categorization.model.VCategorizationFactory;
36: import org.eclipse.emf.ecp.view.spi.categorization.model.VCategory;
37: import org.eclipse.emf.ecp.view.spi.context.ViewModelContext;
38: import org.eclipse.emf.ecp.view.spi.model.VContainedContainer;
39: import org.eclipse.emf.ecp.view.spi.model.VContainer;
40: import org.eclipse.emf.ecp.view.spi.model.VControl;
41: import org.eclipse.emf.ecp.view.spi.model.VElement;
42: import org.eclipse.emf.ecp.view.spi.model.VViewFactory;
43: import org.eclipse.emf.ecp.view.spi.vertical.model.VVerticalFactory;
44: import org.eclipse.emf.ecp.view.spi.vertical.model.VVerticalLayout;
45: import org.eclipse.emf.ecp.view.test.common.spi.EMFFormsRevealServiceFixture;
46: import org.eclipse.emf.ecp.view.test.common.spi.EMFFormsViewContextFixture.DomainModel;
47: import org.eclipse.emf.ecp.view.test.common.spi.EMFFormsViewContextFixture.ViewModel;
48: import org.eclipse.emf.ecp.view.test.common.spi.EMFMockingRunner;
49: import org.eclipse.emf.ecp.view.test.common.spi.EMock;
50: import org.eclipse.emf.ecp.view.test.common.swt.spi.SWTViewTestHelper;
51: import org.eclipse.emfforms.bazaar.Bid;
52: import org.eclipse.emfforms.bazaar.Create;
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.RevealStep;
56: import org.eclipse.swt.widgets.Shell;
57: import org.junit.After;
58: import org.junit.Before;
59: import org.junit.Rule;
60: import org.junit.Test;
61: import org.junit.rules.TestRule;
62: import org.junit.runner.RunWith;
63:
64: /**
65: * Tests covering the {@link CategorizationRevealProvider} class.
66: */
67: @RunWith(EMFMockingRunner.class)
68: public class CategorizationRevealProvider_PTest {
69:
70:         @ViewModel
71:         private final VCategorizationElement categorizations = VCategorizationFactory.eINSTANCE
72:                 .createCategorizationElement();
73:
74:         @DomainModel
75:         private final EObject rootObject = EcoreFactory.eINSTANCE.createEClass();
76:
77:         @EMock
78:         private EObject obj1;
79:
80:         @EMock
81:         private EObject obj2;
82:
83:         private VCategorization mid1;
84:         private VCategory cat1;
85:         private VCategory cat2;
86:         private VCategory cat3;
87:
88:         @Rule
89:         public final TestRule realm = DefaultRealm.rule();
90:
91:         @Rule
92:         public final EMFFormsRevealServiceFixture<ViewModelContext> fixture = EMFFormsRevealServiceFixture.create(
93:                 ViewModelContext.class, this);
94:
95:         private Shell shell;
96:
97:         /**
98:          * Initializes me.
99:          */
100:         public CategorizationRevealProvider_PTest() {
101:                 super();
102:         }
103:
104:         @Test
105:         public void revealInTree() {
106:                 final VContainer container = (VContainer) cat3.getComposite();
107:
108:                 final Runnable reveal = mock(Runnable.class);
109:
110:                 final EMFFormsRevealProvider compositeRevealer = new EMFFormsRevealProvider() {
111:                         @Bid
112:                         public Double bid(VElement view, EObject model) {
113:                                 return view == container && model == obj1 ? Double.MAX_VALUE : null;
114:                         }
115:
116:                         @Create
117:                         public RevealStep create(VElement view, EObject model) {
118:                                 return view == container && model == obj1
119:                                         ? RevealStep.reveal(view, model, reveal)
120:                                         : RevealStep.fail();
121:                         }
122:                 };
123:                 fixture.addRevealProvider(compositeRevealer);
124:
125:                 render();
126:
127:                 fixture.reveal(obj1);
128:
129:                 assertThat("The category was not selected", categorizations.getCurrentSelection(), is(cat3));
130:
131:                 verify(reveal).run();
132:         }
133:
134:         @Test
135:         public void revealInTreeNested() {
136:                 // Introduce a couple of intermediary layers of categorization
137:                 final VCategorization int1 = VCategorizationFactory.eINSTANCE.createCategorization();
138:                 final VCategorization int2 = VCategorizationFactory.eINSTANCE.createCategorization();
139:                 int1.getCategorizations().add(int2);
140:                 int2.getCategorizations().addAll(new ArrayList<>(categorizations.getCategorizations()));
141:                 categorizations.getCategorizations().add(int1);
142:
143:                 final VContainer container = (VContainer) cat3.getComposite();
144:
145:                 final Runnable reveal = mock(Runnable.class);
146:
147:                 final EMFFormsRevealProvider compositeRevealer = new EMFFormsRevealProvider() {
148:                         @Bid
149:                         public Double bid(VElement view, EObject model) {
150:                                 return view == container && model == obj1 ? Double.MAX_VALUE : null;
151:                         }
152:
153:                         @Create
154:                         public RevealStep create(VElement view, EObject model) {
155:                                 return view == container && model == obj1
156:                                         ? RevealStep.reveal(view, model, reveal)
157:                                         : RevealStep.fail();
158:                         }
159:                 };
160:                 fixture.addRevealProvider(compositeRevealer);
161:
162:                 render();
163:
164:                 fixture.reveal(obj1);
165:
166:                 assertThat("The category was not selected", categorizations.getCurrentSelection(), is(cat3));
167:
168:                 verify(reveal).run();
169:         }
170:
171:         @Test
172:         public void revealInTabs() {
173:                 // Render mid1 and cat3 in tabs
174:                 categorizations.setMainCategoryDepth(1);
175:
176:                 final VContainer container = (VContainer) cat2.getComposite();
177:
178:                 final Runnable reveal = mock(Runnable.class);
179:
180:                 final EMFFormsRevealProvider compositeRevealer = new EMFFormsRevealProvider() {
181:                         @Bid
182:                         public Double bid(VElement view, EObject model) {
183:•                                return view == container && model == obj2 ? Double.MAX_VALUE : null;
184:                         }
185:
186:                         @Create
187:                         public RevealStep create(VElement view, EObject model) {
188:•                                return view == container && model == obj2
189:                                         ? RevealStep.reveal(view, model, reveal)
190:                                         : RevealStep.fail();
191:                         }
192:                 };
193:                 fixture.addRevealProvider(compositeRevealer);
194:
195:                 render();
196:
197:                 fixture.reveal(obj2);
198:
199:                 assertThat("The category was not selected", categorizations.getCurrentSelection(), is(cat2));
200:
201:                 verify(reveal).run();
202:         }
203:
204:         /**
205:          * Integration test for revealing a specific control (by feature) within a tree categorization,
206:          * which is the scenario that didn't work as reported in <a href="http://eclip.se/551066">bug 551066</a>.
207:          * The test relies on the fact that the non-default category containing the control to be revealed
208:          * would not end up being selected if the control within did not provide a successful reveal step.
209:          *
210:          * @see <a href="http://eclip.se/551066">bug 551066</a>
211:          */
212:         @Test
213:         public void revealSpecificControlInTree() {
214:                 final VVerticalLayout vertical = VVerticalFactory.eINSTANCE.createVerticalLayout();
215:                 cat3.setComposite(vertical);
216:
217:                 final VControl control = VViewFactory.eINSTANCE.createControl();
218:                 final EStructuralFeature feature = EcorePackage.Literals.ENAMED_ELEMENT__NAME;
219:                 control.setDomainModelReference(feature);
220:                 vertical.getChildren().add(control);
221:
222:                 // Revealing a control requires the settings mapper
223:                 final EMFFormsSettingToControlMapper mapper = mock(EMFFormsSettingToControlMapper.class);
224:                 when(mapper.hasControlsFor(rootObject)).thenReturn(true);
225:                 when(mapper.hasMapping(createSetting(rootObject, feature), control)).thenReturn(true);
226:                 fixture.putService(EMFFormsSettingToControlMapper.class, mapper);
227:
228:                 render();
229:
230:                 fixture.reveal(rootObject, feature);
231:
232:                 // The category would only be selected if the control within it was revealed.
233:                 // In the case of bug 551066, context injection of the ControlRevealProvider failed
234:                 // to create the provider because the name control renderer was not yet available
235:                 assertThat("The category was not selected", categorizations.getCurrentSelection(), is(cat3));
236:         }
237:
238:         //
239:         // Test framework
240:         //
241:
242:         @Before
243:         public void createViewModel() {
244:                 mid1 = VCategorizationFactory.eINSTANCE.createCategorization();
245:                 cat1 = VCategorizationFactory.eINSTANCE.createCategory();
246:                 cat2 = VCategorizationFactory.eINSTANCE.createCategory();
247:                 cat3 = VCategorizationFactory.eINSTANCE.createCategory();
248:
249:                 mid1.getCategorizations().add(cat1);
250:                 mid1.getCategorizations().add(cat2);
251:
252:                 categorizations.getCategorizations().add(mid1);
253:                 categorizations.getCategorizations().add(cat3);
254:
255:                 VContainedContainer container = eMock(VContainedContainer.class, withESettings().eContents().eContainer(cat1));
256:                 cat1.setComposite(container);
257:                 container = eMock(VContainedContainer.class, withESettings().eContents().eContainer(cat2));
258:                 cat2.setComposite(container);
259:                 container = eMock(VContainedContainer.class, withESettings().eContents().eContainer(cat3));
260:                 cat3.setComposite(container);
261:         }
262:
263:         @Before
264:         public void createShell() {
265:                 shell = new Shell();
266:         }
267:
268:         @After
269:         public void destroyShell() {
270:                 shell.dispose();
271:                 shell = null;
272:         }
273:
274:         void render() {
275:                 SWTViewTestHelper.render(fixture.getViewContext(), shell);
276:         }
277:
278: }