blob: a451a10d180257c9dd92e30063e39459820e18b7 [file] [log] [blame]
/**
* <copyright>
*
* Copyright (c) 2008-2013 BMW Car IT, itemis and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* BMW Car IT - Initial API and implementation
* itemis - [409367] Add a custom URI scheme to metamodel descriptor allowing mapping URI scheme to metamodel descriptor
*
* </copyright>
*/
package org.eclipse.sphinx.tests.emf.metamodel;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import java.net.URI;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.runtime.IExtensionRegistry;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.EcoreFactory;
import org.eclipse.emf.ecore.impl.EPackageRegistryImpl;
import org.eclipse.sphinx.emf.metamodel.IMetaModelDescriptor;
import org.eclipse.sphinx.emf.metamodel.MetaModelDescriptorRegistry;
import org.eclipse.sphinx.examples.hummingbird10.Hummingbird10MMDescriptor;
import org.eclipse.sphinx.examples.hummingbird10.Hummingbird10Package;
import org.eclipse.sphinx.tests.emf.internal.Activator;
import org.eclipse.sphinx.tests.emf.internal.mocks.MetaModelDescriptorExtensionRegistryMockFactory;
import org.eclipse.sphinx.tests.emf.metamodel.descs.Test1MM;
import org.eclipse.sphinx.tests.emf.metamodel.descs.Test1Release100;
import org.eclipse.sphinx.tests.emf.metamodel.descs.Test1Release101;
import org.eclipse.sphinx.tests.emf.metamodel.descs.Test1Release200;
import org.eclipse.sphinx.tests.emf.metamodel.descs.Test2MM;
import org.eclipse.sphinx.tests.emf.metamodel.descs.Test2Release100;
import org.junit.AfterClass;
import org.junit.Test;
@SuppressWarnings("nls")
public class MetaModelDescriptorRegistryTest {
private MetaModelDescriptorExtensionRegistryMockFactory mockFactory = new MetaModelDescriptorExtensionRegistryMockFactory();
@AfterClass
public static void tearDown() throws Exception {
MetaModelDescriptorRegistry.INSTANCE.setExtensionRegistry(null);
}
private void initMetaModelDescriptorRegistryWith(IMetaModelDescriptor... mmDescriptors) {
IExtensionRegistry extensionRegistry = mockFactory.createExtensionRegistryMock(Activator.getPlugin(), mmDescriptors);
MetaModelDescriptorRegistry.INSTANCE.setExtensionRegistry(extensionRegistry);
}
@Test
public void testGetDescriptors() {
initMetaModelDescriptorRegistryWith();
List<? extends IMetaModelDescriptor> descriptors = MetaModelDescriptorRegistry.INSTANCE.getDescriptors(new Test1MM());
assertEmptyList(descriptors);
initMetaModelDescriptorRegistryWith(Test1Release100.INSTANCE);
descriptors = MetaModelDescriptorRegistry.INSTANCE.getDescriptors(Test1Release100.INSTANCE);
assertNotNull(descriptors);
assertEquals(1, descriptors.size());
assertTrue(descriptors.contains(Test1Release100.INSTANCE));
descriptors = MetaModelDescriptorRegistry.INSTANCE.getDescriptors(Test2MM.INSTANCE);
assertEmptyList(descriptors);
initMetaModelDescriptorRegistryWith(Test2MM.INSTANCE);
descriptors = MetaModelDescriptorRegistry.INSTANCE.getDescriptors(Test2MM.INSTANCE);
assertNotNull(descriptors);
assertEquals(1, descriptors.size());
assertTrue(descriptors.contains(Test2MM.INSTANCE));
initMetaModelDescriptorRegistryWith(Test1Release100.INSTANCE, Test1MM.INSTANCE);
descriptors = MetaModelDescriptorRegistry.INSTANCE.getDescriptors(Test1MM.INSTANCE);
assertDescriptors(descriptors, Test1Release100.INSTANCE, Test1MM.INSTANCE);
initMetaModelDescriptorRegistryWith(Test1Release100.INSTANCE, Test1MM.INSTANCE);
descriptors = MetaModelDescriptorRegistry.INSTANCE.getDescriptors(Test1Release100.INSTANCE);
assertDescriptors(descriptors, Test1Release100.INSTANCE);
initMetaModelDescriptorRegistryWith(Test1Release100.INSTANCE, Test2MM.INSTANCE);
descriptors = MetaModelDescriptorRegistry.INSTANCE.getDescriptors(MetaModelDescriptorRegistry.ANY_MM);
assertDescriptors(descriptors, Test1Release100.INSTANCE, Test2MM.INSTANCE);
initMetaModelDescriptorRegistryWith(Test1Release100.INSTANCE, Test1MM.INSTANCE);
descriptors = MetaModelDescriptorRegistry.INSTANCE.getDescriptors((IMetaModelDescriptor) null);
assertEmptyList(descriptors);
}
@Test
public void testGetResolvedDescriptors() {
initMetaModelDescriptorRegistryWith();
List<IMetaModelDescriptor> resolvedReleases = MetaModelDescriptorRegistry.INSTANCE.getResolvedDescriptors(new Test1MM());
assertEmptyList(resolvedReleases);
initMetaModelDescriptorRegistryWith(Test1Release100.INSTANCE);
resolvedReleases = MetaModelDescriptorRegistry.INSTANCE.getResolvedDescriptors(new Test1MM());
assertNotNull(resolvedReleases);
if (Test1Release100.INSTANCE.getRootEPackage() == null) {
assertEquals(0, resolvedReleases.size());
} else {
assertEquals(1, resolvedReleases.size());
assertTrue(resolvedReleases.contains(Test1Release100.INSTANCE));
}
Test1MM test1MM = new Test1MM();
Test1Release100 test1Release100 = new Test1Release100();
EPackageRegistryImpl ePackageRegistry = new EPackageRegistryImpl();
test1MM.setEPackageRegistry(ePackageRegistry);
EPackage ePackage = EcoreFactory.eINSTANCE.createEPackage();
ePackageRegistry.put(test1Release100.getNamespace(), ePackage);
resolvedReleases = MetaModelDescriptorRegistry.INSTANCE.getResolvedDescriptors(new Test1MM());
assertNotNull(resolvedReleases);
assertEquals(1, resolvedReleases.size());
assertTrue(resolvedReleases.contains(Test1Release100.INSTANCE));
}
@Test
public void testGetDescriptorByName() {
initMetaModelDescriptorRegistryWith();
IMetaModelDescriptor version = MetaModelDescriptorRegistry.INSTANCE.getDescriptor(Test1MM.INSTANCE, Test1Release100.NAME);
assertNull(version);
initMetaModelDescriptorRegistryWith(Test1Release100.INSTANCE);
version = MetaModelDescriptorRegistry.INSTANCE.getDescriptor(Test1MM.INSTANCE, Test1Release100.NAME);
assertEquals(Test1Release100.INSTANCE, version);
version = MetaModelDescriptorRegistry.INSTANCE.getDescriptor(Test1MM.INSTANCE, Test1Release200.NAME);
assertNull(version);
}
@Test
public void testGetDescriptorByNamespace() {
initMetaModelDescriptorRegistryWith();
IMetaModelDescriptor version = MetaModelDescriptorRegistry.INSTANCE.getDescriptor(Test1Release100.INSTANCE.getNamespaceURI());
assertNull(version);
initMetaModelDescriptorRegistryWith(Test1Release100.INSTANCE);
version = MetaModelDescriptorRegistry.INSTANCE.getDescriptor(Test1Release100.INSTANCE.getNamespaceURI());
assertEquals(Test1Release100.INSTANCE, version);
version = MetaModelDescriptorRegistry.INSTANCE.getDescriptor(Test1MM.INSTANCE.getNamespaceURI());
assertNull(version);
}
@Test
public void testGetDescriptorByUri() {
initMetaModelDescriptorRegistryWith(Test1MM.INSTANCE, Test1Release200.INSTANCE, Test1Release100.INSTANCE, Test2MM.INSTANCE,
Test2Release100.INSTANCE);
// Input match MM Namespace
URI uri = URI.create("http://testA.sphinx.org");
IMetaModelDescriptor metaModelDescriptor = MetaModelDescriptorRegistry.INSTANCE.getDescriptor(uri);
assertNotNull(metaModelDescriptor);
assertEquals(Test1MM.INSTANCE, metaModelDescriptor);
uri = URI.create("http://testA.sphinx.org/2.0.0");
metaModelDescriptor = MetaModelDescriptorRegistry.INSTANCE.getDescriptor(uri);
assertNotNull(metaModelDescriptor);
assertEquals(Test1Release200.INSTANCE, metaModelDescriptor);
uri = URI.create("http://testA.sphinx.org/1.0.0");
metaModelDescriptor = MetaModelDescriptorRegistry.INSTANCE.getDescriptor(uri);
assertNotNull(metaModelDescriptor);
assertEquals(Test1Release100.INSTANCE, metaModelDescriptor);
// Input match EPackage NS URI pattern
uri = URI.create("http://testA.sphinx.org/2.0.0/1");
metaModelDescriptor = MetaModelDescriptorRegistry.INSTANCE.getDescriptor(uri);
assertNotNull(metaModelDescriptor);
assertEquals(Test1Release200.INSTANCE, metaModelDescriptor);
uri = URI.create("http://testA.sphinx.org/2.0.1");
metaModelDescriptor = MetaModelDescriptorRegistry.INSTANCE.getDescriptor(uri);
assertNull(metaModelDescriptor);
uri = URI.create("http://testA.sphinx.org/2.0.0/1a");
metaModelDescriptor = MetaModelDescriptorRegistry.INSTANCE.getDescriptor(uri);
assertNull(metaModelDescriptor);
uri = URI.create("2.0.0");
metaModelDescriptor = MetaModelDescriptorRegistry.INSTANCE.getDescriptor(uri);
assertNull(metaModelDescriptor);
// Input match compatible namespace
// Input matches compatible resource version desciptors
uri = URI.create("http://testA.sphinx.org/1.0.1");
metaModelDescriptor = MetaModelDescriptorRegistry.INSTANCE.getDescriptor(uri);
assertNotNull(metaModelDescriptor);
assertEquals(Test1Release100.INSTANCE, metaModelDescriptor);
uri = URI.create("http://testA.sphinx.org/1.0.2");
metaModelDescriptor = MetaModelDescriptorRegistry.INSTANCE.getDescriptor(uri);
assertNotNull(metaModelDescriptor);
assertEquals(Test1Release100.INSTANCE, metaModelDescriptor);
// Input Uri is address of ecore model without modelDescriptor
// New metamodel descriptor is created and add to MetaModelDescriptor
uri = URI.create(Hummingbird10Package.eNS_URI);
metaModelDescriptor = MetaModelDescriptorRegistry.INSTANCE.getDescriptor(uri);
assertNotNull(metaModelDescriptor);
assertEquals(Hummingbird10MMDescriptor.INSTANCE.getNamespaceURI(), metaModelDescriptor.getNamespaceURI());
// Input Uri is un-existing
uri = URI.create("http://testA.sphinx.org/3.0.0");
metaModelDescriptor = MetaModelDescriptorRegistry.INSTANCE.getDescriptor(uri);
assertNull(metaModelDescriptor);
// ====================
// Null input
URI nullUri = null;
assertNull(MetaModelDescriptorRegistry.INSTANCE.getDescriptor(nullUri));
}
@Test
public void testCompareDescriptor() {
Test1MM version100 = Test1Release100.INSTANCE;
Test1MM version101 = Test1Release101.INSTANCE;
Test1MM version200 = Test1Release200.INSTANCE;
int result;
result = version100.compareTo(version101);
assertEquals(-1, result);
result = version101.compareTo(version200);
assertEquals(-1, result);
result = version200.compareTo(version100);
assertEquals(1, result);
}
@Test
public void testGetDescriptorsFromURIScheme() {
List<IMetaModelDescriptor> targetMMDescriptors = new ArrayList<IMetaModelDescriptor>();
// Register two meta model descriptors
initMetaModelDescriptorRegistryWith(Test1MM.INSTANCE, Test2MM.INSTANCE);
// Get meta model descriptors that use URIs with given scheme "tr1" as proxy URIs.
org.eclipse.emf.common.util.URI uri = org.eclipse.emf.common.util.URI.createURI("tr1:/#test1Release.sphinx.org/scheme", true);
String uriScheme = uri.scheme();
assertEquals(uriScheme, "tr1");
List<IMetaModelDescriptor> mmDescriptors = MetaModelDescriptorRegistry.INSTANCE.getDescriptorsFromURIScheme(uriScheme);
targetMMDescriptors.add(Test1MM.INSTANCE);
assertEquals(targetMMDescriptors, mmDescriptors);
// Get meta model descriptors that use URIs with given scheme "tr2" as proxy URIs.
uri = org.eclipse.emf.common.util.URI.createURI("tr2:/#test2Release.sphinx.org/scheme", true);
uriScheme = uri.scheme();
assertEquals(uriScheme, "tr2");
mmDescriptors = MetaModelDescriptorRegistry.INSTANCE.getDescriptorsFromURIScheme(uriScheme);
targetMMDescriptors.clear();
targetMMDescriptors.add(Test2MM.INSTANCE);
assertEquals(targetMMDescriptors, mmDescriptors);
// Register three meta model descriptors
initMetaModelDescriptorRegistryWith(Test1MM.INSTANCE, Test1Release100.INSTANCE, Test2MM.INSTANCE);
// Get meta model descriptors that use URIs with given scheme "tr1" as proxy URIs.
uri = org.eclipse.emf.common.util.URI.createURI("tr1:/#test1Release100.sphinx.org/scheme", true);
uriScheme = uri.scheme();
assertEquals(uriScheme, "tr1");
mmDescriptors = MetaModelDescriptorRegistry.INSTANCE.getDescriptorsFromURIScheme(uriScheme);
targetMMDescriptors.clear();
targetMMDescriptors.add(Test1MM.INSTANCE);
targetMMDescriptors.add(Test1Release100.INSTANCE);
assertEquals(targetMMDescriptors, mmDescriptors);
}
private void assertDescriptors(List<? extends IMetaModelDescriptor> descriptors, IMetaModelDescriptor... expDescriptors) {
assertNotNull(descriptors);
assertEquals(expDescriptors.length, descriptors.size());
for (IMetaModelDescriptor expDescriptor : expDescriptors) {
descriptors.contains(expDescriptor);
}
}
private void assertEmptyList(List<? extends IMetaModelDescriptor> versions) {
assertNotNull(versions);
assertTrue(versions.isEmpty());
}
}