Skip to content

Package: SelectionTableCompositeStrategyProvider_PTest

SelectionTableCompositeStrategyProvider_PTest

nameinstructionbranchcomplexitylinemethod
SelectionTableCompositeStrategyProvider_PTest(String, String, String)
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%
closeShell()
M: 0 C: 7
100%
M: 0 C: 2
100%
M: 0 C: 2
100%
M: 0 C: 3
100%
M: 0 C: 1
100%
create()
M: 0 C: 116
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 19
100%
M: 0 C: 1
100%
createContext()
M: 0 C: 44
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 9
100%
M: 0 C: 1
100%
createFilteredViewProvider()
M: 0 C: 9
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 2
100%
M: 0 C: 1
100%
createLegacyViewProvider()
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%
createRealm()
M: 0 C: 6
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 2
100%
M: 0 C: 1
100%
destroyContext()
M: 0 C: 18
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 6
100%
M: 0 C: 1
100%
destroyRealm()
M: 0 C: 4
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 2
100%
M: 0 C: 1
100%
getURI(String)
M: 0 C: 8
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 2
100%
M: 0 C: 1
100%
loadViewModels()
M: 0 C: 35
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 6
100%
M: 0 C: 1
100%
parameters()
M: 0 C: 37
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 3
100%
M: 0 C: 1
100%
provides()
M: 0 C: 10
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 2
100%
M: 0 C: 1
100%
provides_not()
M: 0 C: 46
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 13
100%
M: 0 C: 1
100%
provides_not_byRequiredFilter()
M: 0 C: 24
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 5
100%
M: 0 C: 1
100%
static {...}
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%

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.swt.internal.reference.table;
15:
16: import static org.eclipse.emfforms.swt.internal.reference.table.SelectionTableCompositeStrategyProvider.VIEW_FILTER_KEY;
17: import static org.hamcrest.CoreMatchers.is;
18: import static org.hamcrest.CoreMatchers.notNullValue;
19: import static org.hamcrest.CoreMatchers.nullValue;
20: import static org.junit.Assert.assertThat;
21: import static org.junit.Assume.assumeThat;
22:
23: import java.net.URL;
24: import java.util.Arrays;
25: import java.util.Collection;
26: import java.util.HashSet;
27: import java.util.Set;
28:
29: import org.eclipse.emf.common.util.URI;
30: import org.eclipse.emf.ecore.EClass;
31: import org.eclipse.emf.ecore.EObject;
32: import org.eclipse.emf.ecore.EPackage;
33: import org.eclipse.emf.ecore.EParameter;
34: import org.eclipse.emf.ecore.EReference;
35: import org.eclipse.emf.ecore.EcoreFactory;
36: import org.eclipse.emf.ecore.EcorePackage;
37: import org.eclipse.emf.ecore.resource.Resource;
38: import org.eclipse.emf.ecore.resource.ResourceSet;
39: import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
40: import org.eclipse.emf.ecore.util.EcoreUtil;
41: import org.eclipse.emf.ecore.xml.type.XMLTypePackage;
42: import org.eclipse.emf.ecp.spi.common.ui.composites.SelectionComposite;
43: import org.eclipse.emf.ecp.test.common.DefaultRealm;
44: import org.eclipse.emf.ecp.ui.view.swt.reference.SelectionCompositeStrategy;
45: import org.eclipse.emf.ecp.view.spi.context.ViewModelContext;
46: import org.eclipse.emf.ecp.view.spi.context.ViewModelContextFactory;
47: import org.eclipse.emf.ecp.view.spi.model.VView;
48: import org.eclipse.emf.ecp.view.spi.model.VViewModelProperties;
49: import org.eclipse.emf.ecp.view.spi.model.VViewPackage;
50: import org.eclipse.emf.ecp.view.spi.provider.EMFFormsViewService;
51: import org.eclipse.emf.ecp.view.spi.provider.IFilteredViewProvider;
52: import org.eclipse.emf.ecp.view.spi.provider.IViewProvider;
53: import org.eclipse.emfforms.spi.core.services.databinding.emf.EMFFormsDatabindingEMF;
54: import org.eclipse.jface.viewers.StructuredViewer;
55: import org.eclipse.swt.SWT;
56: import org.eclipse.swt.layout.FillLayout;
57: import org.eclipse.swt.widgets.Shell;
58: import org.eclipse.swtbot.swt.finder.SWTBot;
59: import org.eclipse.swtbot.swt.finder.widgets.SWTBotTable;
60: import org.junit.After;
61: import org.junit.Before;
62: import org.junit.Test;
63: import org.junit.runner.RunWith;
64: import org.junit.runners.Parameterized;
65: import org.junit.runners.Parameterized.Parameters;
66:
67: /**
68: * Black-box tests for the {@link SelectionTableCompositeStrategyProvider} class.
69: */
70: @RunWith(Parameterized.class)
71: public class SelectionTableCompositeStrategyProvider_PTest {
72:
73:         private static final EReference REFERENCE = EcorePackage.Literals.ETYPED_ELEMENT__ETYPE;
74:
75:         /** Parameterized name of the "outer" view. */
76:         private final String mainView;
77:         /** Parameterized name of the view containing the table control for the table composite. */
78:         private final String tableCompositeView;
79:
80:         private DefaultRealm realm;
81:
82:         private ViewModelContext context;
83:         private EMFFormsViewService viewService;
84:         private IViewProvider viewProvider;
85:
86:         private VView eParameterView;
87:         private VView eTypedElementETypeView;
88:
89:         private EParameter domainModel;
90:
91:         private SelectionTableCompositeStrategyProvider fixture;
92:         private Shell shell;
93:
94:         /**
95:          * Initializes me.
96:          */
97:         public SelectionTableCompositeStrategyProvider_PTest(String name, String mainView, String tableComposite) {
98:                 super();
99:                 this.mainView = mainView;
100:                 tableCompositeView = tableComposite;
101:         }
102:
103:         @Parameters(name = "{0}")
104:         public static Object[] parameters() {
105:                 return new Object[][] {
106:                         { "legacy", "legacy_EParameter.view", "legacy_ETypedElement_eType.view" },
107:                         { "segments", "segments_EParameter.view", "segments_ETypedElement_eType.view" }
108:                 };
109:         }
110:
111:         @Test
112:         public void provides() {
113:                 assertThat("Expected to provide", fixture.provides(domainModel, REFERENCE), notNullValue());
114:         }
115:
116:         @Test
117:         public void provides_not() {
118:                 final EPackage oneOffPackage = EcoreFactory.eINSTANCE.createEPackage();
119:                 oneOffPackage.setName("oneoff");
120:                 oneOffPackage.setNsURI("http://oneoff");
121:                 final EClass oneOffClass = EcoreFactory.eINSTANCE.createEClass();
122:                 oneOffClass.setName("OneOff");
123:                 oneOffPackage.getEClassifiers().add(oneOffClass);
124:                 final EReference other = EcoreFactory.eINSTANCE.createEReference();
125:                 other.setName("other");
126:                 other.setEType(oneOffClass);
127:                 oneOffClass.getEStructuralFeatures().add(other);
128:                 final EObject oneOff = EcoreUtil.create(oneOffClass);
129:
130:                 assertThat("Expected not to provide", fixture.provides(oneOff, other), nullValue());
131:         }
132:
133:         @Test
134:         public void provides_not_byRequiredFilter() {
135:                 viewService.removeProvider(viewProvider);
136:                 viewProvider = createLegacyViewProvider();
137:                 viewService.addProvider(viewProvider);
138:
139:                 assertThat("Expected to provide", fixture.provides(domainModel, REFERENCE), nullValue());
140:         }
141:
142:         @Test
143:         public void create() {
144:                 assumeThat("Expected to provide", fixture.provides(domainModel, REFERENCE), notNullValue());
145:
146:                 final Set<EObject> extent = new HashSet<>();
147:                 extent.addAll(EcorePackage.eINSTANCE.getEClassifiers());
148:                 extent.addAll(XMLTypePackage.eINSTANCE.getEClassifiers());
149:
150:                 final SelectionCompositeStrategy strategy = fixture.create(domainModel, REFERENCE);
151:                 final SelectionComposite<? extends StructuredViewer> composite = strategy.getSelectionViewer(domainModel,
152:                         REFERENCE, extent);
153:
154:                 shell = new Shell();
155:                 shell.setSize(500, 300);
156:                 shell.setLayout(new FillLayout(SWT.VERTICAL));
157:                 composite.createUI(shell);
158:                 shell.open();
159:
160:                 final SWTBot bot = new SWTBot(shell);
161:                 final SWTBotTable table = bot.table();
162:                 assertThat("Wrong number of columns", table.columnCount(), is(4));
163:
164:                 // Note that the EPackage column name is provided explicitly by the view model.
165:                 // Otherwise, it would also be "Name" (it's the EPackage name)
166:                 assertThat(table.columns(), is(Arrays.asList("Selection", "Name", "Instance Type Name", "EPackage")));
167:
168:                 // Exercise the filter
169:                 bot.text().setText("DocumentRoot");
170:
171:                 // There should be only one match
172:                 assertThat("Filter failed", table.rowCount(), is(1));
173:         }
174:
175:         //
176:         // Test framework
177:         //
178:
179:         @Before
180:         public void createRealm() {
181:                 realm = new DefaultRealm();
182:         }
183:
184:         @Before
185:         public void createContext() {
186:                 loadViewModels();
187:                 domainModel = EcoreFactory.eINSTANCE.createEParameter();
188:                 context = ViewModelContextFactory.INSTANCE.createViewModelContext(eParameterView, domainModel);
189:
190:                 viewService = context.getService(EMFFormsViewService.class);
191:                 viewProvider = createFilteredViewProvider();
192:                 viewService.addProvider(viewProvider);
193:
194:                 fixture = new SelectionTableCompositeStrategyProvider();
195:                 fixture.setDatabinding(context.getService(EMFFormsDatabindingEMF.class));
196:         }
197:
198:         @After
199:         public void destroyContext() {
200:                 viewService.removeProvider(viewProvider);
201:                 viewService = null;
202:                 viewProvider = null;
203:
204:                 context.dispose();
205:                 context = null;
206:         }
207:
208:         @After
209:         public void closeShell() {
210:•                if (shell != null) {
211:                         shell.dispose();
212:                 }
213:         }
214:
215:         @After
216:         public void destroyRealm() {
217:                 realm.dispose();
218:         }
219:
220:         public void loadViewModels() {
221:                 final ResourceSet rset = new ResourceSetImpl();
222:                 Resource res = rset.getResource(getURI(mainView), true);
223:                 eParameterView = (VView) EcoreUtil.getObjectByType(res.getContents(), VViewPackage.Literals.VIEW);
224:                 res = rset.getResource(getURI(tableCompositeView), true);
225:                 eTypedElementETypeView = (VView) EcoreUtil.getObjectByType(res.getContents(), VViewPackage.Literals.VIEW);
226:         }
227:
228:         URI getURI(String fileName) {
229:                 final URL url = SelectionTableCompositeStrategyProvider_PTest.class.getResource(fileName);
230:                 return URI.createURI(url.toExternalForm());
231:         }
232:
233:         private IViewProvider createFilteredViewProvider() {
234:                 // Just delegate to an old-style provider
235:                 final IViewProvider delegate = createLegacyViewProvider();
236:
237:                 return new IFilteredViewProvider() {
238:
239:                         @Override
240:                         public double canProvideViewModel(EObject eObject, VViewModelProperties properties,
241:                                 Collection<String> requiredKeys) {
242:
243:                                 return delegate.canProvideViewModel(eObject, properties);
244:                         }
245:
246:                         @Override
247:                         public VView provideViewModel(EObject eObject, VViewModelProperties properties,
248:                                 Collection<String> requiredKeys) {
249:
250:                                 return delegate.provideViewModel(eObject, properties);
251:                         }
252:
253:                 };
254:         }
255:
256:         /**
257:          * Create a legacy provider that requires adaptation to the new filtering API
258:          * and so is not even consulted if there are required filter keys.
259:          *
260:          * @return the legacy view provider
261:          */
262:         private IViewProvider createLegacyViewProvider() {
263:                 return new IViewProvider() {
264:
265:                         @Override
266:                         public double canProvideViewModel(EObject eObject, VViewModelProperties properties) {
267:                                 return eObject == domainModel
268:                                         && REFERENCE.getName().equals(properties.get(VIEW_FILTER_KEY))
269:                                                 ? Double.POSITIVE_INFINITY
270:                                                 : NOT_APPLICABLE;
271:                         }
272:
273:                         @Override
274:                         public VView provideViewModel(EObject eObject, VViewModelProperties properties) {
275:                                 final VView result = EcoreUtil.copy(eTypedElementETypeView);
276:                                 result.setLoadingProperties(EcoreUtil.copy(properties));
277:                                 return result;
278:                         }
279:
280:                 };
281:         }
282:
283: }