/* * Copyright 2003-2012 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package jetbrains.mps.smodel.language; import jetbrains.mps.smodel.structure.Extension; import jetbrains.mps.smodel.structure.ExtensionDescriptor; import jetbrains.mps.smodel.structure.ExtensionPoint; import org.jmock.Expectations; import org.jmock.Mockery; import org.jmock.integration.junit4.JMock; import org.jmock.integration.junit4.JUnitRuleMockery; import org.junit.After; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; import java.util.*; import static org.junit.Assert.*; public class ExtensionRegistryTest { private static final String EP1 = "foo.bar"; private static final String EP2 = "baz.qux"; @Rule public final JUnitRuleMockery context = new JUnitRuleMockery(); private ExtensionRegistry myExtensionRegistry; @Before public void createContext() { if (ExtensionRegistry.getInstance() == null) { myExtensionRegistry = new ExtensionRegistry(null, null); myExtensionRegistry.init(); } } @After public void checkAndCleanup() { if (myExtensionRegistry != null) { assert myExtensionRegistry == ExtensionRegistry.getInstance(); ExtensionRegistry.getInstance().dispose(); assertNull(ExtensionRegistry.getInstance()); this.myExtensionRegistry = null; } } @Test public void singleExtension() { ExtensionPoint ep1 = mockExtensionPoint("ep1", EP1); ExtensionDescriptor ed = mockExtensionDescriptor("ed1", new ExtensionPoint[]{ep1}, new Extension[]{mockExtension("e1", EP1)} ); ExtensionRegistry.getInstance().registerExtensionDescriptor(ed); assertEquals(ep1, ExtensionRegistry.getInstance().getExtensionPoint(EP1)); ExtensionRegistry.getInstance().unregisterExtensionDescriptor(ed); assertNull(ExtensionRegistry.getInstance().getExtensionPoint(EP1)); } @Test public void regularExtensions() { ExtensionPoint ep1 = mockExtensionPoint("ep1", EP1); ExtensionDescriptor ed1 = mockExtensionDescriptor("ed1", new ExtensionPoint[]{ep1}, new Extension[]{} ); ExtensionDescriptor ed2 = mockExtensionDescriptor("ed2", new ExtensionPoint[]{}, new Extension[]{mockExtension("e1", EP1)} ); ExtensionRegistry.getInstance().registerExtensionDescriptor(ed1); ExtensionRegistry.getInstance().registerExtensionDescriptor(ed2); ExtensionRegistry.getInstance().unregisterExtensionDescriptor(ed2); ExtensionRegistry.getInstance().registerExtensionDescriptor(ed1); } @Test public void reversedExtensions() { ExtensionPoint ep1 = mockExtensionPoint("ep1", EP1); ExtensionDescriptor ed1 = mockExtensionDescriptor("ed1", new ExtensionPoint[]{ep1}, new Extension[]{} ); ExtensionDescriptor ed2 = mockExtensionDescriptor("ed2", new ExtensionPoint[]{}, new Extension[]{mockExtension("e1", EP1)} ); ExtensionRegistry.getInstance().registerExtensionDescriptor(ed2); ExtensionRegistry.getInstance().registerExtensionDescriptor(ed1); ExtensionRegistry.getInstance().unregisterExtensionDescriptor(ed1); ExtensionRegistry.getInstance().unregisterExtensionDescriptor(ed2); } @Test public void stripedExtensions() { ExtensionPoint ep1 = mockExtensionPoint("ep1", EP1); ExtensionDescriptor ed1 = mockExtensionDescriptor("ed1", new ExtensionPoint[]{ep1}, new Extension[]{} ); ExtensionDescriptor ed2 = mockExtensionDescriptor("ed2", new ExtensionPoint[]{}, new Extension[]{mockExtension("e1", EP1)} ); ExtensionRegistry.getInstance().registerExtensionDescriptor(ed1); ExtensionRegistry.getInstance().registerExtensionDescriptor(ed2); ExtensionRegistry.getInstance().unregisterExtensionDescriptor(ed1); ExtensionRegistry.getInstance().unregisterExtensionDescriptor(ed2); } @Test public void reversedStripedExtensions() { ExtensionPoint ep1 = mockExtensionPoint("ep1", EP1); ExtensionDescriptor ed1 = mockExtensionDescriptor("ed1", new ExtensionPoint[]{ep1}, new Extension[]{} ); ExtensionDescriptor ed2 = mockExtensionDescriptor("ed2", new ExtensionPoint[]{}, new Extension[]{mockExtension("e1", EP1)} ); ExtensionRegistry.getInstance().registerExtensionDescriptor(ed2); ExtensionRegistry.getInstance().registerExtensionDescriptor(ed1); ExtensionRegistry.getInstance().unregisterExtensionDescriptor(ed2); ExtensionRegistry.getInstance().unregisterExtensionDescriptor(ed1); } @Test public void allExtensions() { ExtensionPoint ep1 = mockExtensionPoint("ep1", EP1); ExtensionDescriptor ed1 = mockExtensionDescriptor("ed1", new ExtensionPoint[]{ep1}, new Extension[]{} ); ExtensionDescriptor ed2 = mockExtensionDescriptor("ed2", new ExtensionPoint[]{}, new Extension[]{mockExtension("e1", EP1)} ); ExtensionDescriptor ed3 = mockExtensionDescriptor("ed3", new ExtensionPoint[]{}, new Extension[]{mockExtension("e2", EP1)} ); ExtensionRegistry.getInstance().registerExtensionDescriptor(ed3); ExtensionRegistry.getInstance().registerExtensionDescriptor(ed2); ExtensionRegistry.getInstance().registerExtensionDescriptor(ed1); Iterable<Extension<?>> extensions = ep1.getExtensions(); List<Extension> extensionList = new ArrayList(); for (Iterator<Extension> it = ExtensionRegistry.getInstance().getExtensions(ep1).iterator(); it.hasNext(); ) { extensionList.add(it.next()); } assertSame(2, extensionList.size()); Collections.sort(extensionList, new Comparator<Extension>() { @Override public int compare(Extension o1, Extension o2) { return String.CASE_INSENSITIVE_ORDER.compare(String.valueOf(o1), String.valueOf(o2)); } }); assertEquals("[e1, e2]", extensionList.toString()); ExtensionRegistry.getInstance().unregisterExtensionDescriptor(ed3); ExtensionRegistry.getInstance().unregisterExtensionDescriptor(ed2); ExtensionRegistry.getInstance().unregisterExtensionDescriptor(ed1); } private ExtensionDescriptor mockExtensionDescriptor(String name, final ExtensionPoint[] extensionPoints, final Extension[] extensions) { final ExtensionDescriptor ed = context.mock(ExtensionDescriptor.class, name); context.checking(new Expectations() { { atLeast(1).of(ed).getExtensionPoints(); will(returnValue(Arrays.asList(extensionPoints))); atLeast(1).of(ed).getExtensions(); will(returnValue(Arrays.asList(extensions))); } }); return ed; } private Extension mockExtension(String name, final String id) { final Extension e = context.mock(Extension.class, name); context.checking(new Expectations() { { atLeast(1).of(e).getExtensionPointId(); will(returnValue(id)); exactly(1).of(e).activate(); exactly(1).of(e).deactivate(); } }); return e; } private ExtensionPoint mockExtensionPoint(String name, final String id) { final ExtensionPoint ep = new ExtensionPoint(id); return ep; } }