/* * Copyright (C) 2010 Brockmann Consult GmbH (info@brockmann-consult.de) * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free * Software Foundation; either version 3 of the License, or (at your option) * any later version. * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, see http://www.gnu.org/licenses/ */ package com.bc.ceres.core; import org.junit.Test; import javax.swing.*; import static org.junit.Assert.*; public class ExtensionManagerTest { @Test public void testThatFactoriesAreStoredInOrderTheyAreDefined() { ExtensionManager em = ExtensionManager.getInstance(); assertNotNull(em); ExtensionFactory[] ml = em.getExtensionFactories(Model.class); assertNotNull(ml); assertEquals(0, ml.length); DefaultModelGuiFactory df = new DefaultModelGuiFactory(); em.register(Model.class, df); ml = em.getExtensionFactories(Model.class); assertNotNull(ml); assertEquals(1, ml.length); assertSame(df, ml[0]); DefaultModelGuiFactory df2 = new DefaultModelGuiFactory(); em.register(Model.class, df2); ml = em.getExtensionFactories(Model.class); assertNotNull(ml); assertEquals(2, ml.length); assertSame(df, ml[0]); assertSame(df2, ml[1]); em.register(Model.class, df2); ml = em.getExtensionFactories(Model.class); assertNotNull(ml); assertEquals(2, ml.length); assertSame(df, ml[0]); assertSame(df2, ml[1]); SlimModelGuiFactory sf = new SlimModelGuiFactory(); em.register(SlimModel.class, sf); ExtensionFactory[] sl = em.getExtensionFactories(SlimModel.class); assertNotNull(sl); assertEquals(1, sl.length); assertSame(sf, sl[0]); RichModelGuiFactory rf = new RichModelGuiFactory(); em.register(RichModel.class, rf); ExtensionFactory[] rl = em.getExtensionFactories(RichModel.class); assertNotNull(rl); assertEquals(1, rl.length); assertSame(rf, rl[0]); em.unregister(Model.class, df); em.unregister(Model.class, df2); em.unregister(SlimModel.class, sf); em.unregister(RichModel.class, rf); assertEquals(0, em.getExtensionFactories(Model.class).length); assertEquals(0, em.getExtensionFactories(SlimModel.class).length); assertEquals(0, em.getExtensionFactories(RichModel.class).length); } @Test public void testModelWithIndependentGui() { ExtensionManager em = ExtensionManager.getInstance(); assertNotNull(em); // These models will be dynamically extended by special GUIs Model someModel = new SomeModel(); Model slimModel = new SlimModel(); Model richModel = new RichModel(); // The GUI factories DefaultModelGuiFactory defaultModelGuiFactory = new DefaultModelGuiFactory(); SlimModelGuiFactory slimModelGuiFactory = new SlimModelGuiFactory(); RichModelGuiFactory richModelGuiFactory = new RichModelGuiFactory(); ///////////////////////////////////////////////////////////////////// // Model --> null // SomeModel --> null // SlimModel --> null // RichModel --> null testFail(someModel, ModelGui.class); testFail(slimModel, ModelGui.class); testFail(richModel, ModelGui.class); testFail(someModel, DefaultModelGui.class); testFail(slimModel, DefaultModelGui.class); testFail(richModel, DefaultModelGui.class); testFail(someModel, SlimModelGui.class); testFail(slimModel, SlimModelGui.class); testFail(richModel, SlimModelGui.class); testFail(someModel, RichModelGui.class); testFail(slimModel, RichModelGui.class); testFail(richModel, RichModelGui.class); ///////////////////////////////////////////////////////////////////// // Model --> DefaultModelGui // SomeModel --> DefaultModelGui // SlimModel --> DefaultModelGui // RichModel --> DefaultModelGui em.register(Model.class, defaultModelGuiFactory); testSuccess(someModel, ModelGui.class, DefaultModelGui.class); testSuccess(slimModel, ModelGui.class, DefaultModelGui.class); testSuccess(richModel, ModelGui.class, DefaultModelGui.class); testSuccess(someModel, DefaultModelGui.class, DefaultModelGui.class); testSuccess(slimModel, DefaultModelGui.class, DefaultModelGui.class); testSuccess(richModel, DefaultModelGui.class, DefaultModelGui.class); testFail(someModel, SlimModelGui.class); testFail(slimModel, SlimModelGui.class); testFail(richModel, SlimModelGui.class); testFail(someModel, RichModelGui.class); testFail(slimModel, RichModelGui.class); testFail(richModel, RichModelGui.class); ///////////////////////////////////////////////////////////////////// // Model --> DefaultModelGui // SomeModel --> DefaultModelGui // SlimModel --> SlimModelGui // RichModel --> DefaultModelGui em.register(SlimModel.class, slimModelGuiFactory); testSuccess(someModel, ModelGui.class, DefaultModelGui.class); testSuccess(slimModel, ModelGui.class, SlimModelGui.class); testSuccess(richModel, ModelGui.class, DefaultModelGui.class); testSuccess(someModel, DefaultModelGui.class, DefaultModelGui.class); testSuccess(slimModel, DefaultModelGui.class, DefaultModelGui.class); testSuccess(richModel, DefaultModelGui.class, DefaultModelGui.class); testFail(someModel, SlimModelGui.class); testSuccess(slimModel, SlimModelGui.class, SlimModelGui.class); testFail(richModel, SlimModelGui.class); testFail(someModel, RichModelGui.class); testFail(slimModel, RichModelGui.class); testFail(richModel, RichModelGui.class); ///////////////////////////////////////////////////////////////////// // Any Model --> DefaultModelGui // SomeModel --> DefaultModelGui // SlimModel --> SlimModelGui // RichModel --> RichModelGui em.register(RichModel.class, richModelGuiFactory); testSuccess(someModel, ModelGui.class, DefaultModelGui.class); testSuccess(slimModel, ModelGui.class, SlimModelGui.class); testSuccess(richModel, ModelGui.class, RichModelGui.class); testSuccess(someModel, DefaultModelGui.class, DefaultModelGui.class); testSuccess(slimModel, DefaultModelGui.class, DefaultModelGui.class); testSuccess(richModel, DefaultModelGui.class, DefaultModelGui.class); testFail(someModel, SlimModelGui.class); testSuccess(slimModel, SlimModelGui.class, SlimModelGui.class); testFail(richModel, SlimModelGui.class); testFail(someModel, RichModelGui.class); testFail(slimModel, RichModelGui.class); testSuccess(richModel, RichModelGui.class, RichModelGui.class); ///////////////////////////////////////////////////////////////////// // Model --> null // SomeModel --> null // SlimModel --> null // RichModel --> null em.unregister(Model.class, defaultModelGuiFactory); em.unregister(SlimModel.class, slimModelGuiFactory); em.unregister(RichModel.class, richModelGuiFactory); testFail(someModel, ModelGui.class); testFail(slimModel, ModelGui.class); testFail(richModel, ModelGui.class); testFail(someModel, DefaultModelGui.class); testFail(slimModel, DefaultModelGui.class); testFail(richModel, DefaultModelGui.class); testFail(someModel, SlimModelGui.class); testFail(slimModel, SlimModelGui.class); testFail(richModel, SlimModelGui.class); testFail(someModel, RichModelGui.class); testFail(slimModel, RichModelGui.class); testFail(richModel, RichModelGui.class); } private static void testSuccess(Model model, Class<? extends ModelGui> requestedType, Class<? extends ModelGui> expectedType) { ModelGui modelGui = model.getExtension(requestedType); assertNotNull(modelGui); assertEquals(expectedType, modelGui.getClass()); assertSame(model, modelGui.getModel()); } // Note: this is a dummy test, it is a show case for usage of the ExtensionManager API. @Test public void testCompiles() { ExtensionManager em = ExtensionManager.getInstance(); JComponent component = new JButton(); JComponent extension1 = em.getExtension("", component.getClass()); JComponent extension2 = em.getExtension("", JComponent.class); JButton button = new JButton(); JComponent extension3 = em.getExtension("", button.getClass()); JComponent extension4 = em.getExtension("", JButton.class); JButton extension5 = em.getExtension("", button.getClass()); JButton extension6 = em.getExtension("", JButton.class); assertNull(extension1); assertNull(extension2); assertNull(extension3); assertNull(extension4); assertNull(extension5); assertNull(extension6); } private static void testFail(Model model, Class<? extends ModelGui> extensionType) { ModelGui modelGui = model.getExtension(extensionType); assertNull(modelGui); } static interface Model extends Extensible { } static class SomeModel extends ExtensibleObject implements Model { } static class SlimModel extends ExtensibleObject implements Model { } static class RichModel extends ExtensibleObject implements Model { } static abstract class ModelGui { Model model; protected ModelGui(Model model) { this.model = model; } public Model getModel() { return model; } } static class DefaultModelGui extends ModelGui { DefaultModelGui(Model model) { super(model); } } static class SlimModelGui extends ModelGui { SlimModelGui(Model model) { super(model); } } static class RichModelGui extends ModelGui { RichModelGui(Model model) { super(model); } } class DefaultModelGuiFactory extends SingleTypeExtensionFactory<Model, ModelGui> { DefaultModelGuiFactory() { super(ModelGui.class, DefaultModelGui.class); } @Override protected ModelGui getExtensionImpl(Model model, Class<ModelGui> extensionType) throws Throwable { return new DefaultModelGui(model); } } class SlimModelGuiFactory extends SingleTypeExtensionFactory<SlimModel, ModelGui> { SlimModelGuiFactory() { super(ModelGui.class, SlimModelGui.class); } @Override protected ModelGui getExtensionImpl(SlimModel model, Class<ModelGui> extensionType) throws Throwable { return new SlimModelGui(model); } } class RichModelGuiFactory extends SingleTypeExtensionFactory<RichModel, ModelGui> { RichModelGuiFactory() { super(ModelGui.class, RichModelGui.class); } @Override protected ModelGui getExtensionImpl(RichModel model, Class<ModelGui> extensionType) throws Throwable { return new RichModelGui(model); } } }