Skip to content

Package: EMockSettingsImpl

EMockSettingsImpl

nameinstructionbranchcomplexitylinemethod
EMockSettingsImpl()
M: 0 C: 16
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 4
100%
M: 0 C: 1
100%
defaultAnswer(Answer)
M: 0 C: 7
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 2
100%
M: 0 C: 1
100%
eClass(EClass)
M: 5 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 2 C: 0
0%
M: 1 C: 0
0%
eContainer(EObject)
M: 0 C: 5
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 2
100%
M: 0 C: 1
100%
eContents(EList)
M: 0 C: 5
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 2
100%
M: 0 C: 1
100%
getPackageName(Class)
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%
guessEClass(Class)
M: 1 C: 90
99%
M: 1 C: 13
93%
M: 1 C: 7
88%
M: 1 C: 18
95%
M: 0 C: 1
100%
invocationListeners(InvocationListener[])
M: 7 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 2 C: 0
0%
M: 1 C: 0
0%
lambda$2(String, EClass)
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%
make(Class)
M: 0 C: 58
100%
M: 1 C: 7
88%
M: 1 C: 4
80%
M: 0 C: 14
100%
M: 0 C: 1
100%
name(String)
M: 0 C: 7
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 2
100%
M: 0 C: 1
100%
updateAdditionalInterfaces(Class)
M: 0 C: 38
100%
M: 0 C: 4
100%
M: 0 C: 3
100%
M: 0 C: 5
100%
M: 0 C: 1
100%
verboseLogging()
M: 6 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 2 C: 0
0%
M: 1 C: 0
0%
wrap(List)
M: 2 C: 6
75%
M: 1 C: 1
50%
M: 1 C: 1
50%
M: 1 C: 2
67%
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.test.common.spi;
15:
16: import static org.mockito.Mockito.mock;
17: import static org.mockito.Mockito.when;
18:
19: import java.util.List;
20:
21: import org.eclipse.emf.common.notify.Adapter;
22: import org.eclipse.emf.common.notify.impl.BasicNotifierImpl;
23: import org.eclipse.emf.common.util.ECollections;
24: import org.eclipse.emf.common.util.EList;
25: import org.eclipse.emf.ecore.EClass;
26: import org.eclipse.emf.ecore.EClassifier;
27: import org.eclipse.emf.ecore.EObject;
28: import org.eclipse.emf.ecore.EPackage;
29: import org.eclipse.emf.ecore.EStructuralFeature;
30: import org.eclipse.emf.ecore.InternalEObject;
31: import org.eclipse.emf.ecore.util.BasicExtendedMetaData.EClassifierExtendedMetaData;
32: import org.eclipse.emf.ecore.util.BasicExtendedMetaData.EStructuralFeatureExtendedMetaData;
33: import org.mockito.MockSettings;
34: import org.mockito.Mockito;
35: import org.mockito.listeners.InvocationListener;
36: import org.mockito.stubbing.Answer;
37:
38: /**
39: * Implementation of the EMF mock settings protocol.
40: *
41: * @since 1.22
42: */
43: final class EMockSettingsImpl implements EMockSettings {
44:
45:         private final MockSettings settings = Mockito.withSettings();
46:
47:         private EClass eClass;
48:         private EList<? extends EObject> eContents;
49:         private EObject eContainer;
50:
51:         /**
52:          * Initializes me.
53:          */
54:         EMockSettingsImpl() {
55:                 super();
56:
57:                 settings.extraInterfaces(InternalEObject.class);
58:         }
59:
60:         @Override
61:         public EMockSettings name(String name) {
62:                 settings.name(name);
63:                 return this;
64:         }
65:
66:         @Override
67:         public EMockSettings defaultAnswer(Answer<?> defaultAnswer) {
68:                 settings.defaultAnswer(defaultAnswer);
69:                 return this;
70:         }
71:
72:         @Override
73:         public EMockSettings verboseLogging() {
74:                 settings.verboseLogging();
75:                 return null;
76:         }
77:
78:         @Override
79:         public EMockSettings invocationListeners(InvocationListener... listeners) {
80:                 settings.invocationListeners(listeners);
81:                 return this;
82:         }
83:
84:         @Override
85:         public EMockSettings eClass(EClass eClass) {
86:                 this.eClass = eClass;
87:                 return this;
88:         }
89:
90:         @Override
91:         public EMockSettings eContents(EList<? extends EObject> eContents) {
92:                 this.eContents = eContents;
93:                 return this;
94:         }
95:
96:         @Override
97:         public EMockSettings eContainer(EObject eContainer) {
98:                 this.eContainer = eContainer;
99:                 return this;
100:         }
101:
102:         <E extends EObject> E make(Class<E> type) {
103:                 updateAdditionalInterfaces(type);
104:                 final E result = mock(type, settings);
105:
106:                 EClass eClass = this.eClass;
107:•                if (eClass == null) {
108:                         eClass = guessEClass(type);
109:                 }
110:•                if (eClass != null) {
111:                         when(result.eClass()).thenReturn(eClass);
112:                 }
113:
114:•                if (eContents != null) {
115:                         when(result.eContents()).thenReturn(wrap(eContents));
116:                 }
117:•                if (eContainer != null) {
118:                         EMFMocking.eSetContainer(result, eContainer);
119:                 }
120:
121:                 // Many corners of the EMF framework and EMF Forms expect an adapter list
122:                 final EList<Adapter> adapterList = new BasicNotifierImpl.EAdapterList<>(result);
123:                 Mockito.when(result.eAdapters()).thenReturn(adapterList);
124:
125:                 return result;
126:         }
127:
128:         private <E> EList<E> wrap(List<? extends E> delegate) {
129:•                return delegate == ECollections.EMPTY_ELIST
130:                         ? ECollections.emptyEList()
131:                         : ECollections.unmodifiableEList(delegate);
132:         }
133:
134:         /**
135:          * Some EMF interfaces require additional internal-ish interfaces in their implementations.
136:          * For example, access to "extended metadata".
137:          *
138:          * @param type the type being mocked
139:          */
140:         private void updateAdditionalInterfaces(Class<?> type) {
141:•                if (EClassifier.class.isAssignableFrom(type)) {
142:                         settings.extraInterfaces(InternalEObject.class, EClassifierExtendedMetaData.Holder.class);
143:•                } else if (EStructuralFeature.class.isAssignableFrom(type)) {
144:                         settings.extraInterfaces(InternalEObject.class, EStructuralFeatureExtendedMetaData.Holder.class);
145:                 }
146:         }
147:
148:         private static EClass guessEClass(Class<? extends EObject> interfaceType) {
149:                 final String typeName = interfaceType.getName();
150:                 final String packageName = getPackageName(interfaceType);
151:
152:•                for (final Object next : EPackage.Registry.INSTANCE.values()) {
153:•                        final EPackage ePackage = next instanceof EPackage
154:                                 ? (EPackage) next
155:                                 : ((EPackage.Descriptor) next).getEPackage();
156:
157:•                        if (ePackage == null) {
158:                                 continue;
159:                         }
160:
161:                         final Class<?> ePackageImplClass = ePackage.getClass();
162:                         final Class<?>[] interfaces = ePackageImplClass.getInterfaces();
163:•                        for (final Class<?> iface : interfaces) {
164:•                                if (EPackage.class.isAssignableFrom(iface) && iface != EPackage.class) {
165:                                         // This is the package API interface
166:                                         final String ifacePackageName = getPackageName(iface);
167:•                                        if (ifacePackageName.equals(packageName)) {
168:                                                 // Find the EClass whose interface name is 'typeName'
169:                                                 return ePackage.getEClassifiers().stream()
170:                                                         .filter(EClass.class::isInstance).map(EClass.class::cast)
171:                                                         .filter(ec -> typeName.equals(ec.getInstanceClassName()))
172:                                                         .findAny().orElse(null);
173:                                         }
174:                                 }
175:                         }
176:                 }
177:
178:                 return null;
179:         }
180:
181:         private static String getPackageName(Class<?> classs) {
182:                 final String className = classs.getName();
183:                 return className.substring(0, className.lastIndexOf('.'));
184:         }
185:
186: }