/* * Copyright 2000-2009 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 com.intellij.openapi.extensions.impl; import com.intellij.openapi.extensions.*; import junit.framework.TestCase; import org.jetbrains.annotations.NotNull; import org.picocontainer.MutablePicoContainer; import org.picocontainer.defaults.DefaultPicoContainer; import java.util.Arrays; import java.util.List; /** * @author AKireyev */ public class ExtensionsImplTest extends TestCase { public static final String EXTENSION_POINT_NAME_1 = "ext.point.one"; public static final String AREA_1 = "the.area.one"; public void testCreateAndAccess() { ExtensionsAreaImpl extensionsArea = new ExtensionsAreaImpl(null, new Extensions.SimpleLogProvider()); int numEP = extensionsArea.getExtensionPoints().length; extensionsArea.registerExtensionPoint(EXTENSION_POINT_NAME_1, Integer.class.getName()); assertEquals("Additional EP available", numEP + 1, extensionsArea.getExtensionPoints().length); assertNotNull("EP by name available", extensionsArea.getExtensionPoint(EXTENSION_POINT_NAME_1)); } public void testInvalidActions() { ExtensionsAreaImpl extensionsArea = new ExtensionsAreaImpl(null, new Extensions.SimpleLogProvider()); extensionsArea.registerExtensionPoint(EXTENSION_POINT_NAME_1, Integer.class.getName()); try { extensionsArea.registerExtensionPoint(EXTENSION_POINT_NAME_1, Boolean.class.getName()); fail("Should not allow duplicate registration"); } catch (RuntimeException e) { } } public void testUnregisterEP() { ExtensionsAreaImpl extensionsArea = new ExtensionsAreaImpl(null, new Extensions.SimpleLogProvider()); int numEP = extensionsArea.getExtensionPoints().length; extensionsArea.registerExtensionPoint(EXTENSION_POINT_NAME_1, Integer.class.getName()); final boolean removed[] = new boolean[1]; removed[0] = false; extensionsArea.getExtensionPoint(EXTENSION_POINT_NAME_1).addExtensionPointListener(new ExtensionPointListener() { @Override public void extensionAdded(@NotNull Object extension, final PluginDescriptor pluginDescriptor) { } @Override public void extensionRemoved(@NotNull Object extension, final PluginDescriptor pluginDescriptor) { removed[0] = true; } }); extensionsArea.getExtensionPoint(EXTENSION_POINT_NAME_1).registerExtension(new Integer(123)); extensionsArea.unregisterExtensionPoint(EXTENSION_POINT_NAME_1); assertTrue("Extension point should be removed", extensionsArea.getExtensionPoints().length == numEP); assertTrue("Extension point disposed", removed[0]); } public void testAvailabilityListener() { ExtensionsAreaImpl extensionsArea = new ExtensionsAreaImpl(null, new Extensions.SimpleLogProvider()); MyListener.reset(); extensionsArea.getExtensionPoint(EPAvailabilityListenerExtension.EXTENSION_POINT_NAME).registerExtension( new EPAvailabilityListenerExtension(EXTENSION_POINT_NAME_1, MyListener.class.getName())); assertEquals(0, MyListener.regcount); assertEquals(0, MyListener.remcount); extensionsArea.registerExtensionPoint(EXTENSION_POINT_NAME_1, Integer.class.getName()); assertEquals(1, MyListener.regcount); assertEquals(0, MyListener.remcount); MyListener.reset(); extensionsArea.unregisterExtensionPoint(EXTENSION_POINT_NAME_1); assertEquals(1, MyListener.remcount); assertEquals(0, MyListener.regcount); } public void testAvailability2Listeners() { ExtensionsAreaImpl extensionsArea = new ExtensionsAreaImpl(null, new Extensions.SimpleLogProvider()); MyListener.reset(); extensionsArea.registerExtensionPoint(EXTENSION_POINT_NAME_1, Integer.class.getName()); extensionsArea.getExtensionPoint(EPAvailabilityListenerExtension.EXTENSION_POINT_NAME).registerExtension( new EPAvailabilityListenerExtension(EXTENSION_POINT_NAME_1, MyListener.class.getName())); extensionsArea.getExtensionPoint(EPAvailabilityListenerExtension.EXTENSION_POINT_NAME).registerExtension( new EPAvailabilityListenerExtension(EXTENSION_POINT_NAME_1, MyListener.class.getName())); assertEquals(2, MyListener.regcount); assertEquals(0, MyListener.remcount); MyListener.reset(); extensionsArea.unregisterExtensionPoint(EXTENSION_POINT_NAME_1); assertEquals(2, MyListener.remcount); assertEquals(0, MyListener.regcount); } public void testAvailabilityListenerAfter() { ExtensionsAreaImpl extensionsArea = new ExtensionsAreaImpl(null, new Extensions.SimpleLogProvider()); extensionsArea.registerExtensionPoint(EXTENSION_POINT_NAME_1, Integer.class.getName()); MyListener.reset(); extensionsArea.getExtensionPoint(EPAvailabilityListenerExtension.EXTENSION_POINT_NAME).registerExtension( new EPAvailabilityListenerExtension(EXTENSION_POINT_NAME_1, MyListener.class.getName())); assertEquals(1, MyListener.regcount); assertEquals(0, MyListener.remcount); } public void testAvailabilityListenerDelay() { ExtensionsAreaImpl extensionsArea = new ExtensionsAreaImpl(null, new Extensions.SimpleLogProvider()); MyListener.reset(); extensionsArea.suspendInteractions(); extensionsArea.getExtensionPoint(EPAvailabilityListenerExtension.EXTENSION_POINT_NAME).registerExtension( new EPAvailabilityListenerExtension(EXTENSION_POINT_NAME_1, MyListener.class.getName())); assertEquals(0, MyListener.regcount); assertEquals(0, MyListener.remcount); extensionsArea.registerExtensionPoint(EXTENSION_POINT_NAME_1, Integer.class.getName()); assertEquals(0, MyListener.regcount); assertEquals(0, MyListener.remcount); extensionsArea.resumeInteractions(); assertEquals(1, MyListener.regcount); assertEquals(0, MyListener.remcount); MyListener.reset(); extensionsArea.suspendInteractions(); assertEquals(0, MyListener.regcount); assertEquals(0, MyListener.remcount); extensionsArea.unregisterExtensionPoint(EXTENSION_POINT_NAME_1); assertEquals(0, MyListener.regcount); assertEquals(0, MyListener.remcount); extensionsArea.resumeInteractions(); assertEquals(1, MyListener.remcount); assertEquals(0, MyListener.regcount); } public void testKillAvailabilityNotifications() { ExtensionsAreaImpl extensionsArea = new ExtensionsAreaImpl(null, new Extensions.SimpleLogProvider()); MyListener.reset(); extensionsArea.suspendInteractions(); extensionsArea.getExtensionPoint(EPAvailabilityListenerExtension.EXTENSION_POINT_NAME).registerExtension( new EPAvailabilityListenerExtension(EXTENSION_POINT_NAME_1, MyListener.class.getName())); assertEquals(0, MyListener.regcount); assertEquals(0, MyListener.remcount); extensionsArea.registerExtensionPoint(EXTENSION_POINT_NAME_1, Integer.class.getName()); assertEquals(0, MyListener.regcount); assertEquals(0, MyListener.remcount); extensionsArea.killPendingInteractions(); extensionsArea.resumeInteractions(); assertEquals(0, MyListener.regcount); assertEquals(0, MyListener.remcount); } public void testListenerAfterResume() { ExtensionsAreaImpl extensionsArea = new ExtensionsAreaImpl(null, new Extensions.SimpleLogProvider()); extensionsArea.suspendInteractions(); extensionsArea.resumeInteractions(); MyListener.reset(); extensionsArea.getExtensionPoint(EPAvailabilityListenerExtension.EXTENSION_POINT_NAME).registerExtension( new EPAvailabilityListenerExtension(EXTENSION_POINT_NAME_1, MyListener.class.getName())); assertEquals(0, MyListener.regcount); assertEquals(0, MyListener.remcount); extensionsArea.registerExtensionPoint(EXTENSION_POINT_NAME_1, Integer.class.getName()); assertEquals(1, MyListener.regcount); assertEquals(0, MyListener.remcount); MyListener.reset(); extensionsArea.unregisterExtensionPoint(EXTENSION_POINT_NAME_1); assertEquals(1, MyListener.remcount); assertEquals(0, MyListener.regcount); } public void _testPicoContainerDirectRegistration() throws Exception { ExtensionsAreaImpl parentArea = new ExtensionsAreaImpl(new DefaultPicoContainer(), new Extensions.SimpleLogProvider()); ExtensionsAreaImpl childArea = new ExtensionsAreaImpl(parentArea.getPicoContainer(), new Extensions.SimpleLogProvider()); Runnable runnable = new Runnable() { @Override public void run() { throw new UnsupportedOperationException("run is not implemented in : " + getClass()); } }; parentArea.getPicoContainer().registerComponentInstance(runnable); assertSame(runnable, parentArea.getPicoContainer().getComponentInstanceOfType(Runnable.class)); assertSame(runnable, childArea.getPicoContainer().getComponentInstanceOfType(Runnable.class)); final Runnable childRunnable = new Runnable() { @Override public void run() { throw new UnsupportedOperationException("This method is not yet implemented"); } }; childArea.getPicoContainer().registerComponentInstance(childRunnable); assertEquals(2, childArea.getPicoContainer().getComponentInstancesOfType(Runnable.class).size()); final List componentInstances = childArea.getPicoContainer().getComponentInstances(); assertTrue("parent instance found", componentInstances.contains(runnable)); assertTrue("child instance found", componentInstances.contains(childRunnable)); } public void testTryPicoContainer() { DefaultPicoContainer rootContainer = new DefaultPicoContainer(); rootContainer.registerComponentInstance("plugin1", new DefaultPicoContainer(rootContainer)); rootContainer.registerComponentInstance("plugin2", new DefaultPicoContainer(rootContainer)); // rootContainer.registerComponentImplementation("plugin2", DefaultPicoContainer.class); MutablePicoContainer container1 = (MutablePicoContainer)rootContainer.getComponentInstance("plugin1"); MutablePicoContainer container2 = (MutablePicoContainer)rootContainer.getComponentInstance("plugin2"); container1.registerComponentImplementation("component1", MyComponent1.class); container1.registerComponentImplementation("component1.1", MyComponent1.class); container2.registerComponentImplementation("component2", MyComponent2.class); MyInterface1 testInstance = new MyInterface1() { @Override public void run() { } }; rootContainer.registerComponentInstance(testInstance); MyComponent1 component1 = (MyComponent1)container1.getComponentInstance("component1"); assertEquals(testInstance, component1.testObject); rootContainer.registerComponentInstance("component1", component1); MyComponent1 component11 = (MyComponent1)container1.getComponentInstance("component1.1"); rootContainer.registerComponentInstance("component11", component11); MyComponent2 component2 = (MyComponent2)container2.getComponentInstance("component2"); assertEquals(testInstance, component2.testObject); assertTrue(Arrays.asList(component2.comp1).contains(component1)); assertTrue(Arrays.asList(component2.comp1).contains(component11)); rootContainer.registerComponentInstance("component2", component2); rootContainer.registerComponentImplementation(MyTestComponent.class); MyTestComponent testComponent = (MyTestComponent)rootContainer.getComponentInstance(MyTestComponent.class); assertTrue(Arrays.asList(testComponent.comp1).contains(component1)); assertTrue(Arrays.asList(testComponent.comp1).contains(component11)); assertEquals(component2, testComponent.comp2); } public void testTryPicoContainer2() { DefaultPicoContainer rootContainer = new DefaultPicoContainer(); rootContainer.registerComponentImplementation("component1", MyComponent1.class); rootContainer.registerComponentImplementation("component1.1", MyComponent1.class); rootContainer.registerComponentImplementation("component2", MyComponent2.class); rootContainer.registerComponentImplementation(MyTestComponent.class); MyInterface1 testInstance = new MyInterface1() { @Override public void run() { } }; rootContainer.registerComponentInstance(testInstance); MyTestComponent testComponent = (MyTestComponent)rootContainer.getComponentInstance(MyTestComponent.class); MyComponent2 component2 = (MyComponent2)rootContainer.getComponentInstance("component2"); MyComponent1 component11 = (MyComponent1)rootContainer.getComponentInstance("component1.1"); MyComponent1 component1 = (MyComponent1)rootContainer.getComponentInstance("component1"); assertEquals(testInstance, component1.testObject); assertEquals(testInstance, component2.testObject); assertTrue(Arrays.asList(component2.comp1).contains(component1)); assertTrue(Arrays.asList(component2.comp1).contains(component11)); assertTrue(Arrays.asList(testComponent.comp1).contains(component1)); assertTrue(Arrays.asList(testComponent.comp1).contains(component11)); assertEquals(component2, testComponent.comp2); } public void testExtensionsNamespaces() { ExtensionsAreaImpl extensionsArea = new ExtensionsAreaImpl(new DefaultPicoContainer(), new Extensions.SimpleLogProvider()); extensionsArea.registerExtensionPoint("plugin.ep1", TestExtensionClassOne.class.getName(), ExtensionPoint.Kind.BEAN_CLASS); extensionsArea.registerExtension("plugin", ExtensionComponentAdapterTest.readElement( "<plugin:ep1 xmlns:plugin=\"plugin\" order=\"LAST\"><text>3</text></plugin:ep1>")); extensionsArea.registerExtension("plugin", ExtensionComponentAdapterTest.readElement( "<ep1 xmlns=\"plugin\" order=\"FIRST\"><text>1</text></ep1>")); extensionsArea.registerExtension("plugin", ExtensionComponentAdapterTest.readElement( "<extension point=\"plugin.ep1\"><text>2</text></extension>")); ExtensionPoint extensionPoint = extensionsArea.getExtensionPoint("plugin.ep1"); TestExtensionClassOne[] extensions = (TestExtensionClassOne[]) extensionPoint.getExtensions(); assertEquals(3, extensions.length); assertEquals("1", extensions[0].getText()); assertEquals("2", extensions[1].getText()); assertEquals("3", extensions[2].getText()); } public void testExtensionsWithOrdering() { ExtensionsAreaImpl extensionsArea = new ExtensionsAreaImpl(new DefaultPicoContainer(), new Extensions.SimpleLogProvider()); extensionsArea.registerExtensionPoint("ep1", TestExtensionClassOne.class.getName(), ExtensionPoint.Kind.BEAN_CLASS); extensionsArea.registerExtension("", ExtensionComponentAdapterTest.readElement( "<extension point=\"ep1\" order=\"LAST\"><text>3</text></extension>")); extensionsArea.registerExtension("", ExtensionComponentAdapterTest.readElement( "<extension point=\"ep1\" order=\"FIRST\"><text>1</text></extension>")); extensionsArea.registerExtension("", ExtensionComponentAdapterTest.readElement( "<extension point=\"ep1\"><text>2</text></extension>")); ExtensionPoint extensionPoint = extensionsArea.getExtensionPoint("ep1"); TestExtensionClassOne[] extensions = (TestExtensionClassOne[]) extensionPoint.getExtensions(); assertEquals(3, extensions.length); assertEquals("1", extensions[0].getText()); assertEquals("2", extensions[1].getText()); assertEquals("3", extensions[2].getText()); } public void testExtensionsWithOrderingUpdate() { ExtensionsAreaImpl extensionsArea = new ExtensionsAreaImpl(new DefaultPicoContainer(), new Extensions.SimpleLogProvider()); extensionsArea.registerExtensionPoint("ep1", TestExtensionClassOne.class.getName(), ExtensionPoint.Kind.BEAN_CLASS); extensionsArea.registerExtension("", ExtensionComponentAdapterTest.readElement( "<extension point=\"ep1\" id=\"_7\" order=\"LAST\"><text>7</text></extension>")); extensionsArea.registerExtension("", ExtensionComponentAdapterTest.readElement( "<extension point=\"ep1\" id=\"fst\" order=\"FIRST\"><text>1</text></extension>")); extensionsArea.registerExtension("", ExtensionComponentAdapterTest.readElement( "<extension point=\"ep1\" id=\"id\"><text>3</text></extension>")); ExtensionPoint extensionPoint = extensionsArea.getExtensionPoint("ep1"); TestExtensionClassOne[] extensions = (TestExtensionClassOne[]) extensionPoint.getExtensions(); assertEquals(3, extensions.length); assertEquals("1", extensions[0].getText()); assertEquals("3", extensions[1].getText()); assertEquals("7", extensions[2].getText()); TestExtensionClassOne extension = new TestExtensionClassOne("xxx"); extensionPoint.registerExtension(extension); extensionPoint.unregisterExtension(extension); extensionsArea.registerExtension("", ExtensionComponentAdapterTest.readElement( "<extension point=\"ep1\" order=\"BEFORE id\"><text>2</text></extension>")); extensionsArea.registerExtension("", ExtensionComponentAdapterTest.readElement( "<extension point=\"ep1\" order=\"AFTER id\"><text>4</text></extension>")); extensionsArea.registerExtension("", ExtensionComponentAdapterTest.readElement( "<extension point=\"ep1\" order=\"last, after _7\"><text>8</text></extension>")); extensionsArea.registerExtension("", ExtensionComponentAdapterTest.readElement( "<extension point=\"ep1\" order=\"after:id, before _7, after fst\"><text>5</text></extension>")); extensionPoint.registerExtension(new TestExtensionClassOne("6")); extensions = (TestExtensionClassOne[]) extensionPoint.getExtensions(); assertEquals(8, extensions.length); assertEquals("1", extensions[0].getText()); assertEquals("2", extensions[1].getText()); assertEquals("3", extensions[2].getText()); assertEquals("4", extensions[3].getText()); assertEquals("5", extensions[4].getText()); assertEquals("6", extensions[5].getText()); assertEquals("7", extensions[6].getText()); assertEquals("8", extensions[7].getText()); } public interface MyInterface1 extends Runnable { } public interface MyInterface2 { } public interface MyInterface3 extends Runnable { } public interface MyInterface4 extends MyInterface1, MyInterface2, MyInterface3 { } public static class MyClass implements MyInterface4 { @Override public void run() { } } public static class MyComponent1 { public MyInterface1 testObject; public MyComponent1(MyInterface1 testObject) { this.testObject = testObject; } } public static class MyComponent2 { public MyInterface1 testObject; public MyComponent1[] comp1; public MyComponent2(MyComponent1[] comp1, MyInterface1 testObject) { this.comp1 = comp1; this.testObject = testObject; } } public static class MyTestComponent { public MyComponent1[] comp1; public MyComponent2 comp2; public MyTestComponent(MyComponent1[] comp1, MyComponent2 comp2) { this.comp1 = comp1; this.comp2 = comp2; } } public static class MyListener implements ExtensionPointAvailabilityListener { public static int regcount = 0; public static int remcount = 0; @Override public void extensionPointRegistered(ExtensionPoint extensionPoint) { regcount++; } @Override public void extensionPointRemoved(ExtensionPoint extensionPoint) { remcount++; } public static void reset() { regcount = 0; remcount = 0; } } }