blob: 12653098c0842fd7e995f010fa5a9abb3a928ee7 [file] [log] [blame]
/*
* 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;
}
}
}