From b0bc14793f6ee68ca2eca11bb35c423d06d05e6a Mon Sep 17 00:00:00 2001 From: extio-de Date: Thu, 25 Dec 2025 11:56:09 +0100 Subject: [PATCH] Refactor Renderer Module Management - Renamed `moduleManager` to `moduleService` in RendererData for clarity. - Updated G2DRenderer to use the new module service methods with string IDs instead of class references. - Modified RendererWorkingSet interface and implementation to use string IDs for module identification instead of class types. - Adjusted tests in ModuleManagerTest and RendererWorkingSetImplTest to reflect changes in module management and identification. - Ensured consistency across the codebase by replacing class references with module IDs in method calls and assertions. --- .../game_engine/module/AbstractModule.java | 8 +- .../game_engine/module/ModuleService.java | 18 +- .../game_engine/module/ModuleServiceImpl.java | 209 +++++++--------- .../game_engine/renderer/RendererData.java | 11 +- .../game_engine/renderer/g2d/G2DRenderer.java | 30 ++- .../renderer/work/RendererWorkingSet.java | 17 +- .../renderer/work/RendererWorkingSetImpl.java | 33 ++- .../de/extio/game_engine/demo/DemoModule.java | 4 +- .../game_engine/module/ModuleManagerTest.java | 223 +++++++++--------- .../work/RendererWorkingSetImplTest.java | 115 ++++----- 10 files changed, 308 insertions(+), 360 deletions(-) diff --git a/src/main/java/de/extio/game_engine/module/AbstractModule.java b/src/main/java/de/extio/game_engine/module/AbstractModule.java index 7d8735c..a4c40c3 100644 --- a/src/main/java/de/extio/game_engine/module/AbstractModule.java +++ b/src/main/java/de/extio/game_engine/module/AbstractModule.java @@ -12,12 +12,18 @@ public abstract class AbstractModule { protected static final Logger LOGGER = LoggerFactory.getLogger(AbstractModule.class); + protected String id = "Module_" + System.identityHashCode(this); + private ModuleService moduleService; public AbstractModule() { } + public String getId() { + return this.id; + } + public void onLoad() { } @@ -46,7 +52,7 @@ public abstract class AbstractModule { return moduleService; } - public void setModuleService(ModuleService moduleService) { + public void setModuleService(final ModuleService moduleService) { this.moduleService = moduleService; } diff --git a/src/main/java/de/extio/game_engine/module/ModuleService.java b/src/main/java/de/extio/game_engine/module/ModuleService.java index 4d51a2a..9cd9f51 100644 --- a/src/main/java/de/extio/game_engine/module/ModuleService.java +++ b/src/main/java/de/extio/game_engine/module/ModuleService.java @@ -4,9 +4,9 @@ import java.util.List; public interface ModuleService { - void loadModule(Class clazz); + void loadModule(AbstractModule module); - void unloadModule(Class clazz); + void unloadModule(String id); List getModulesAll(); @@ -16,23 +16,17 @@ public interface ModuleService { List getModulesDisplayedClientModules(); - void changeActiveState(String className, boolean active); - - void changeActiveState(Class clazz, boolean active); + void changeActiveState(String id, boolean active); void deactivateAll(); - void changeDisplayState(String className, boolean active); + void changeDisplayState(String id, boolean display); - void changeDisplayState(Class clazz, boolean display); - - boolean isDisplayed(String className); - - boolean isDisplayed(Class clazz); + boolean isDisplayed(String id); void hideAll(); - void hideExcept(String... classNames); + void hideExcept(String... ids); void restoreVisibility(); diff --git a/src/main/java/de/extio/game_engine/module/ModuleServiceImpl.java b/src/main/java/de/extio/game_engine/module/ModuleServiceImpl.java index f2aaf64..ea7c6df 100644 --- a/src/main/java/de/extio/game_engine/module/ModuleServiceImpl.java +++ b/src/main/java/de/extio/game_engine/module/ModuleServiceImpl.java @@ -3,6 +3,7 @@ package de.extio.game_engine.module; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; +import java.util.concurrent.ConcurrentHashMap; import java.util.EnumMap; import java.util.HashSet; import java.util.List; @@ -24,6 +25,8 @@ public class ModuleServiceImpl implements InitializingBean, ModuleService { private final List modulesAll = Collections.synchronizedList(new ArrayList<>()); + private final Map modulesByIdMap = new ConcurrentHashMap<>(); + private final RendererWorkingSet rendererWorkingSet; private List modulesAllView = List.of(); @@ -77,26 +80,19 @@ public class ModuleServiceImpl implements InitializingBean, ModuleService { } @Override - public synchronized void loadModule(final Class clazz) { - synchronized (this.modulesAll) { - if (this.modulesAll.stream().anyMatch(module -> clazz.isInstance(module))) { - LOGGER.debug("AbstractModule already loaded: " + clazz.getName()); - return; - } + public synchronized void loadModule(final AbstractModule module) { + if (this.modulesByIdMap.containsKey(module.getId())) { + LOGGER.debug("AbstractModule already loaded: " + module.getId()); + return; } - try { - final AbstractModule module = AbstractModule.class.cast(clazz.getDeclaredConstructor().newInstance()); - this.load(module); - } - catch (final Exception e) { - LOGGER.error("Error loading module " + clazz.getName(), e); - } + this.load(module); } private void load(final AbstractModule module) { module.setModuleService(this); this.modulesAll.add(module); + this.modulesByIdMap.put(module.getId(), module); this.sortModules(this.modulesAll); synchronized (this.modulesAll) { this.modulesAllView = List.copyOf(this.modulesAll); @@ -106,20 +102,18 @@ public class ModuleServiceImpl implements InitializingBean, ModuleService { } @Override - public synchronized void unloadModule(final Class clazz) { + public synchronized void unloadModule(final String id) { try { - AbstractModule module; - synchronized (this.modulesAll) { - module = this.modulesAll.stream().filter(mod -> clazz.isInstance(mod)).findAny().orElse(null); - } + final AbstractModule module = this.modulesByIdMap.get(id); if (module == null) { - LOGGER.debug("AbstractModule not loaded: " + clazz.getName()); + LOGGER.debug("AbstractModule not loaded: " + id); return; } - this.changeActiveState(clazz, false); + this.changeActiveState(id, false); this.modulesAll.remove(module); + this.modulesByIdMap.remove(id); this.sortModules(this.modulesAll); synchronized (this.modulesAll) { this.modulesAllView = List.copyOf(this.modulesAll); @@ -127,48 +121,37 @@ public class ModuleServiceImpl implements InitializingBean, ModuleService { this.invokeSafe(module, m -> m.onUnload()); if (module instanceof final AbstractClientModule clientModule) { - this.rendererWorkingSet.clear(clientModule.getClass()); + this.rendererWorkingSet.clear(clientModule.getId()); } - LOGGER.info("Unloaded module " + clazz.getName()); + LOGGER.info("Unloaded module " + id); } catch (final Exception e) { - LOGGER.error("Error unloading module " + clazz.getName(), e); + LOGGER.error("Error unloading module " + id, e); } } @Override - public void changeActiveState(final String className, final boolean active) { - try { - final var clazz = Class.forName(className); - this.changeActiveState(clazz.asSubclass(AbstractModule.class), active); - } - catch (final ClassNotFoundException e) { - LOGGER.error("Class not found: " + className, e); - } - } - - @Override - public synchronized void changeActiveState(final Class clazz, final boolean active) { + public synchronized void changeActiveState(final String id, final boolean active) { this.modulesActiveView.stream() - .filter(module -> clazz.isAssignableFrom(module.getClass())) + .filter(module -> module.getId().equals(id)) .findAny() .ifPresentOrElse(module -> { if (!active) { if (module instanceof final AbstractClientModule clientModule) { - this.changeDisplayState(clientModule.getClass(), false); + this.changeDisplayState(clientModule.getId(), false); } this.modulesActive.remove(module); this.sortModules(this.modulesActive); synchronized (this.modulesActive) { this.modulesActiveView = List.copyOf(this.modulesActive); this.modulesActiveClientModulesView = this.modulesActive.stream() - .filter(m -> m instanceof AbstractClientModule) - .map(m -> (AbstractClientModule) m) - .toList(); + .filter(m -> m instanceof AbstractClientModule) + .map(m -> (AbstractClientModule) m) + .toList(); } if (module instanceof final AbstractClientModule clientModule) { - this.rendererWorkingSet.clear(clientModule.getClass()); + this.rendererWorkingSet.clear(clientModule.getId()); } synchronized (this.executorCallbackMap) { final var subscriptions = module.executorCallbackSubscriptions(); @@ -180,39 +163,35 @@ public class ModuleServiceImpl implements InitializingBean, ModuleService { } this.invokeSafe(module, AbstractModule::onDeactivate); - LOGGER.info("Deactivated " + clazz.getName()); + LOGGER.info("Deactivated " + id); } }, () -> { if (active) { - synchronized (this.modulesAll) { - this.modulesAll.stream() - .filter(module -> clazz.isAssignableFrom(module.getClass())) - .findFirst() - .ifPresent(module -> { - if (module instanceof final AbstractClientModule clientModule && clientModule.isAlwaysDisplay()) { - this.changeDisplayState(clientModule.getClass(), true); - } - this.modulesActive.add(module); - this.sortModules(this.modulesActive); - synchronized (this.modulesActive) { - this.modulesActiveView = List.copyOf(this.modulesActive); - this.modulesActiveClientModulesView = this.modulesActive.stream() - .filter(m -> m instanceof AbstractClientModule) - .map(m -> (AbstractClientModule) m) - .toList(); - } - synchronized (this.executorCallbackMap) { - final var subscriptions = module.executorCallbackSubscriptions(); - if (subscriptions != null) { - for (final var subscription : subscriptions) { - executorCallbackMap.computeIfAbsent(subscription, k -> Collections.synchronizedList(new ArrayList<>())).add(module); - } - } - } - this.invokeSafe(module, AbstractModule::onActivate); - - LOGGER.info("Activated " + clazz.getName()); - }); + final AbstractModule module = this.modulesByIdMap.get(id); + if (module != null) { + if (module instanceof final AbstractClientModule clientModule && clientModule.isAlwaysDisplay()) { + this.changeDisplayState(clientModule.getId(), true); + } + this.modulesActive.add(module); + this.sortModules(this.modulesActive); + synchronized (this.modulesActive) { + this.modulesActiveView = List.copyOf(this.modulesActive); + this.modulesActiveClientModulesView = this.modulesActive.stream() + .filter(m -> m instanceof AbstractClientModule) + .map(m -> (AbstractClientModule) m) + .toList(); + } + synchronized (this.executorCallbackMap) { + final var subscriptions = module.executorCallbackSubscriptions(); + if (subscriptions != null) { + for (final var subscription : subscriptions) { + executorCallbackMap.computeIfAbsent(subscription, k -> Collections.synchronizedList(new ArrayList<>())).add(module); + } + } + } + this.invokeSafe(module, AbstractModule::onActivate); + + LOGGER.info("Activated " + id); } } }); @@ -221,71 +200,41 @@ public class ModuleServiceImpl implements InitializingBean, ModuleService { @Override public void deactivateAll() { for (final AbstractModule module : this.modulesActiveView) { - this.changeActiveState(module.getClass(), false); + this.changeActiveState(module.getId(), false); } this.lastVisibleStates.clear(); } @Override - public void changeDisplayState(final String className, final boolean active) { - try { - final var clazz = Class.forName(className); - this.changeDisplayState(clazz.asSubclass(AbstractClientModule.class), active); - } - catch (final ClassNotFoundException e) { - LOGGER.error("Class not found: " + className, e); - } - } - - @Override - public synchronized void changeDisplayState(final Class clazz, final boolean display) { - synchronized (this.modulesAll) { + public synchronized void changeDisplayState(final String id, final boolean display) { + final AbstractModule module = this.modulesByIdMap.get(id); + if (module instanceof final AbstractClientModule clientModule) { synchronized (this.modulesDisplayed) { - for (final var module : this.modulesAll) { - if (module instanceof final AbstractClientModule clientModule && clazz.isAssignableFrom(module.getClass())) { - final boolean curDisplayed = this.modulesDisplayed.stream().anyMatch(mod -> clazz.isAssignableFrom(mod.getClass())); - - final boolean doDisplay = display || clientModule.isAlwaysDisplay(); - if (doDisplay && !curDisplayed) { - this.modulesDisplayed.add(clientModule); - clientModule.setDisplayed(true); - LOGGER.info("Displayed {}", clazz.getName()); - this.invokeSafe(clientModule, m -> ((AbstractClientModule) m).onShow()); - } - else if (!doDisplay && curDisplayed) { - clientModule.setDisplayed(false); - this.modulesDisplayed.removeIf(mod -> clazz.isAssignableFrom(mod.getClass())); - LOGGER.info("Hidden {}", clazz.getName()); - this.invokeSafe(clientModule, m -> ((AbstractClientModule) m).onHide()); - } - this.modulesDisplayedClientModulesView = List.copyOf(this.modulesDisplayed); - - break; - } + final boolean curDisplayed = this.modulesDisplayed.stream().anyMatch(mod -> mod.getId().equals(id)); + + final boolean doDisplay = display || clientModule.isAlwaysDisplay(); + if (doDisplay && !curDisplayed) { + this.modulesDisplayed.add(clientModule); + clientModule.setDisplayed(true); + LOGGER.info("Displayed {}", id); + this.invokeSafe(clientModule, m -> ((AbstractClientModule) m).onShow()); } + else if (!doDisplay && curDisplayed) { + clientModule.setDisplayed(false); + this.modulesDisplayed.removeIf(mod -> mod.getId().equals(id)); + LOGGER.info("Hidden {}", id); + this.invokeSafe(clientModule, m -> ((AbstractClientModule) m).onHide()); + } + this.modulesDisplayedClientModulesView = List.copyOf(this.modulesDisplayed); } } } @Override - public boolean isDisplayed(final String className) { - try { - final var clazz = Class.forName(className); - return this.isDisplayed(clazz.asSubclass(AbstractClientModule.class)); - } - catch (final ClassNotFoundException e) { - LOGGER.error("Class not found: " + className, e); - return false; - } - } - - @Override - public boolean isDisplayed(final Class clazz) { - final var modules = this.modulesDisplayedClientModulesView; - for (int i = 0; i < modules.size(); i++) { - if (clazz.isAssignableFrom(modules.get(i).getClass())) { - return true; - } + public boolean isDisplayed(final String id) { + final var module = this.modulesByIdMap.get(id); + if (module != null && module instanceof final AbstractClientModule clientModule) { + return clientModule.isDisplayed(); } return false; } @@ -297,23 +246,23 @@ public class ModuleServiceImpl implements InitializingBean, ModuleService { final var modules = this.modulesDisplayedClientModulesView; for (final var module : modules) { if ((module instanceof final AbstractClientModule clientModule) && !clientModule.isAlwaysDisplay()) { - this.changeDisplayState(clientModule.getClass(), false); + this.changeDisplayState(clientModule.getId(), false); } } } @Override @SafeVarargs - public final void hideExcept(final String... classNames) { + public final void hideExcept(final String... ids) { final List state = new ArrayList<>(); - final var keep = new HashSet<>(Arrays.asList(classNames)); + final var keep = new HashSet<>(Arrays.asList(ids)); final var modules = this.modulesDisplayedClientModulesView; for (final var module : modules) { if (module instanceof final AbstractClientModule clientModule && !clientModule.isAlwaysDisplay() && - !keep.contains(clientModule.getClass().getName())) { - this.changeDisplayState(clientModule.getClass(), false); + !keep.contains(clientModule.getId())) { + this.changeDisplayState(clientModule.getId(), false); state.add(clientModule); } } @@ -331,7 +280,7 @@ public class ModuleServiceImpl implements InitializingBean, ModuleService { synchronized (this.lastVisibleStates) { for (final AbstractClientModule module : this.lastVisibleStates.pop()) { - this.changeDisplayState(module.getClass(), true); + this.changeDisplayState(module.getId(), true); } } } diff --git a/src/main/java/de/extio/game_engine/renderer/RendererData.java b/src/main/java/de/extio/game_engine/renderer/RendererData.java index cab4f06..47df2fe 100644 --- a/src/main/java/de/extio/game_engine/renderer/RendererData.java +++ b/src/main/java/de/extio/game_engine/renderer/RendererData.java @@ -1,7 +1,6 @@ package de.extio.game_engine.renderer; import java.util.concurrent.atomic.AtomicLong; -import java.util.function.Consumer; import org.springframework.context.ApplicationContext; @@ -40,7 +39,7 @@ public class RendererData { private final RendererWorkingSet rendererWorkingSet; - private final ModuleService moduleManager; + private final ModuleService moduleService; private final ModuleExecutor moduleExecutor; @@ -48,7 +47,7 @@ public class RendererData { private RendererLoop rendererLoop; - public RendererData(final ApplicationContext applicationContext, final Renderer renderer, final RendererControl rendererControl, final RenderingBoPool renderingBoPool, final KeycodeRegistry keycodeRegistry, final EventService eventService, final StorageService storageService, final RendererWorkingSet rendererWorkingSet, final ModuleService moduleManager, final ModuleExecutor moduleExecutor, final StaticResourceService staticResourceService) { + public RendererData(final ApplicationContext applicationContext, final Renderer renderer, final RendererControl rendererControl, final RenderingBoPool renderingBoPool, final KeycodeRegistry keycodeRegistry, final EventService eventService, final StorageService storageService, final RendererWorkingSet rendererWorkingSet, final ModuleService moduleService, final ModuleExecutor moduleExecutor, final StaticResourceService staticResourceService) { this.applicationContext = applicationContext; this.renderer = renderer; this.rendererControl = rendererControl; @@ -57,7 +56,7 @@ public class RendererData { this.eventService = eventService; this.storageService = storageService; this.rendererWorkingSet = rendererWorkingSet; - this.moduleManager = moduleManager; + this.moduleService = moduleService; this.moduleExecutor = moduleExecutor; this.staticResourceService = staticResourceService; } @@ -118,8 +117,8 @@ public class RendererData { return rendererWorkingSet; } - public ModuleService getModuleManager() { - return moduleManager; + public ModuleService getModuleService() { + return moduleService; } public ModuleExecutor getModuleExecutor() { diff --git a/src/main/java/de/extio/game_engine/renderer/g2d/G2DRenderer.java b/src/main/java/de/extio/game_engine/renderer/g2d/G2DRenderer.java index ebf0051..6442992 100644 --- a/src/main/java/de/extio/game_engine/renderer/g2d/G2DRenderer.java +++ b/src/main/java/de/extio/game_engine/renderer/g2d/G2DRenderer.java @@ -56,6 +56,8 @@ public class G2DRenderer implements Renderer { private volatile G2DMainFrame mainFrame; + private String rendererModuleId; + private RendererData rendererData; private long fpsMeasurement; @@ -71,7 +73,7 @@ public class G2DRenderer implements Renderer { private String title; private volatile boolean takeScreenshot; - + private StaticResource previousDefaultFont = null; public G2DRenderer() { @@ -89,10 +91,12 @@ public class G2DRenderer implements Renderer { public void show() { try { LOGGER.info("show()"); - - this.rendererData.getModuleManager().loadModule(G2DRendererModule.class); - this.rendererData.getModuleManager().changeActiveState(G2DRendererModule.class, true); - this.rendererData.getModuleManager().changeDisplayState(G2DRendererModule.class, true); + + final var rendererModule = new G2DRendererModule(); + this.rendererModuleId = rendererModule.getId(); + this.rendererData.getModuleService().loadModule(rendererModule); + this.rendererData.getModuleService().changeActiveState(rendererModule.getId(), true); + this.rendererData.getModuleService().changeDisplayState(rendererModule.getId(), true); EventQueue.invokeAndWait(() -> { this.rendererData.getRendererControl().applyVideoOptions(); @@ -100,8 +104,8 @@ public class G2DRenderer implements Renderer { EventQueue.invokeAndWait(() -> { // this invokeAndWait() call is also important to wait until applyVideoOptions() has been completed, which also puts events to AWT event queue LOGGER.debug("Viewport initialized"); - this.rendererData.getRendererWorkingSet().add(G2DRendererModule.class, this.rendererData.getRenderingBoPool().acquire("G2DRenderer_background", G2DDrawBackground.class)); - this.rendererData.getRendererWorkingSet().add(G2DRendererModule.class, this.rendererData.getRenderingBoPool().acquire("G2DRenderer_tooltip", G2DDrawControlTooltip.class)); + this.rendererData.getRendererWorkingSet().add(this.rendererModuleId, this.rendererData.getRenderingBoPool().acquire("G2DRenderer_background", G2DDrawBackground.class)); + this.rendererData.getRendererWorkingSet().add(this.rendererModuleId, this.rendererData.getRenderingBoPool().acquire("G2DRenderer_tooltip", G2DDrawControlTooltip.class)); }); } catch (InvocationTargetException | InterruptedException e) { @@ -152,7 +156,7 @@ public class G2DRenderer implements Renderer { // Some race condition happens rarely (mainly Windows 11) that window size is not initialized after entering full screen. Put a plaster on it... throw new G2DRendererWindowNotInitializedException(); } - + if (this.previousDefaultFont == null && this.rendererData.getUiOptions().getFontResource() != null && !this.rendererData.getUiOptions().getFontResource().equals(this.previousDefaultFont)) { this.previousDefaultFont = this.rendererData.getUiOptions().getFontResource(); G2DDrawFont.updateDefaultFont(this.rendererData.getStaticResourceService(), this.rendererData.getUiOptions().getFontResource()); @@ -169,8 +173,8 @@ public class G2DRenderer implements Renderer { } this.drawStatistics(); - this.rendererData.getRendererWorkingSet().commit(G2DRendererModule.class, true); - this.rendererData.getRendererWorkingSet().getLiveSet(this.renderingBOs, clientModuleClass -> this.rendererData.getModuleManager().isDisplayed(clientModuleClass)); + this.rendererData.getRendererWorkingSet().commit(this.rendererModuleId, true); + this.rendererData.getRendererWorkingSet().getLiveSet(this.renderingBOs, this.rendererData.getModuleService()::isDisplayed); this.renderingBOs.sort((bo0, bo1) -> bo0.getLayer().compareTo(bo1.getLayer())); Graphics2D screenGraphics = null; @@ -195,7 +199,7 @@ public class G2DRenderer implements Renderer { } } - this.rendererData.getRendererWorkingSet().get(G2DRendererModule.class, "G2DRenderer_tooltip").closeStatic(); + this.rendererData.getRendererWorkingSet().get(this.rendererModuleId, "G2DRenderer_tooltip").closeStatic(); // // Rendering cycle END @@ -251,14 +255,14 @@ public class G2DRenderer implements Renderer { .setColor(RgbaColor.WHITE) .setLayer(RenderingBoLayer.TOP) .withPositionAbsoluteAnchorTopRight(100, 35); - this.rendererData.getRendererWorkingSet().add(G2DRendererModule.class, drawFont); + this.rendererData.getRendererWorkingSet().add(this.rendererModuleId, drawFont); this.fpsHistory.add(Integer.valueOf((int) this.frameDur)); final var drawFpsHistory = this.rendererData.getRenderingBoPool().acquire("g2DRenderer_fpsHistory", G2DDrawFpsHistory.class) .setHistory(this.fpsHistory) .setLayer(RenderingBoLayer.TOP) .withPositionAbsoluteAnchorTopRight(100, 50); - this.rendererData.getRendererWorkingSet().add(G2DRendererModule.class, drawFpsHistory); + this.rendererData.getRendererWorkingSet().add(this.rendererModuleId, drawFpsHistory); } private void frameCap() throws InterruptedException { diff --git a/src/main/java/de/extio/game_engine/renderer/work/RendererWorkingSet.java b/src/main/java/de/extio/game_engine/renderer/work/RendererWorkingSet.java index 22af4de..e0779a7 100644 --- a/src/main/java/de/extio/game_engine/renderer/work/RendererWorkingSet.java +++ b/src/main/java/de/extio/game_engine/renderer/work/RendererWorkingSet.java @@ -4,23 +4,22 @@ import java.util.List; import java.util.Map; import java.util.function.Predicate; -import de.extio.game_engine.module.AbstractClientModule; import de.extio.game_engine.renderer.model.RenderingBo; public interface RendererWorkingSet { - void add(Class producer, RenderingBo work); + void add(String producerId, RenderingBo work); - void add(Class producer, List work); + void add(String producerId, List work); - RenderingBo get(Class producer, String id); + RenderingBo get(String producerId, String id); - Map getUncommittedWork(Class producer); + Map getUncommittedWork(String producerId); - Map commit(Class producer, boolean clone); + Map commit(String producerId, boolean clone); - void clear(Class producer); + void clear(String producerId); - void getLiveSet(List combinedLiveSet, Predicate> filter); + void getLiveSet(List combinedLiveSet, Predicate filter); -} +} \ No newline at end of file diff --git a/src/main/java/de/extio/game_engine/renderer/work/RendererWorkingSetImpl.java b/src/main/java/de/extio/game_engine/renderer/work/RendererWorkingSetImpl.java index adc4287..6984fb1 100644 --- a/src/main/java/de/extio/game_engine/renderer/work/RendererWorkingSetImpl.java +++ b/src/main/java/de/extio/game_engine/renderer/work/RendererWorkingSetImpl.java @@ -13,12 +13,11 @@ import java.util.concurrent.ConcurrentMap; import java.util.concurrent.atomic.AtomicReference; import java.util.function.Predicate; -import de.extio.game_engine.module.AbstractClientModule; import de.extio.game_engine.renderer.model.RenderingBo; public class RendererWorkingSetImpl implements RendererWorkingSet { - private final ConcurrentMap, RendererWork> workingSet = new ConcurrentHashMap<>(); + private final ConcurrentMap workingSet = new ConcurrentHashMap<>(); private final BlockingQueue> mapsPool = new ArrayBlockingQueue<>(100); @@ -31,34 +30,34 @@ public class RendererWorkingSetImpl implements RendererWorkingSet { } @Override - public void add(final Class producer, final RenderingBo work) { - this.getWorkingSetByProducer(producer) + public void add(final String producerId, final RenderingBo work) { + this.getWorkingSetByProducer(producerId) .next() .put(work.getId(), work); } @Override - public void add(final Class producer, final List work) { - final var nextMap = this.getWorkingSetByProducer(producer).next(); + public void add(final String producerId, final List work) { + final var nextMap = this.getWorkingSetByProducer(producerId).next(); for (final RenderingBo bo : work) { nextMap.put(bo.getId(), bo); } } @Override - public Map getUncommittedWork(final Class producer) { - return this.getWorkingSetByProducer(producer).next(); + public Map getUncommittedWork(final String producerId) { + return this.getWorkingSetByProducer(producerId).next(); } @Override - public RenderingBo get(final Class producer, final String id) { - return this.getWorkingSetByProducer(producer).next().get(id); + public RenderingBo get(final String producerId, final String id) { + return this.getWorkingSetByProducer(producerId).next().get(id); } @Override - public Map commit(final Class producer, final boolean clone) { + public Map commit(final String producerId, final boolean clone) { final AtomicReference> previousWork = new AtomicReference<>(); - final RendererWork rendererWork = this.workingSet.compute(producer, (k, v) -> { + final RendererWork rendererWork = this.workingSet.compute(producerId, (k, v) -> { if (v == null) { return new RendererWork(this.obtainMapFromPool(), this.obtainMapFromPool()); } @@ -82,8 +81,8 @@ public class RendererWorkingSetImpl implements RendererWorkingSet { } @Override - public void clear(final Class producer) { - final RendererWork rendererWork = this.workingSet.remove(producer); + public void clear(final String producerId) { + final RendererWork rendererWork = this.workingSet.remove(producerId); if (rendererWork != null) { this.releaseBoClasses(rendererWork.live()); this.releaseBoClasses(rendererWork.next()); @@ -91,7 +90,7 @@ public class RendererWorkingSetImpl implements RendererWorkingSet { } @Override - public void getLiveSet(final List combinedLiveSet, final Predicate> filter) { + public void getLiveSet(final List combinedLiveSet, final Predicate filter) { this.workingSet.forEach((producer, rendererWork) -> { if (filter == null || filter.test(producer)) { combinedLiveSet.addAll(rendererWork.live().values()); @@ -99,8 +98,8 @@ public class RendererWorkingSetImpl implements RendererWorkingSet { }); } - private RendererWork getWorkingSetByProducer(final Class producer) { - return this.workingSet.computeIfAbsent(producer, k -> new RendererWork(this.obtainMapFromPool(), this.obtainMapFromPool())); + private RendererWork getWorkingSetByProducer(final String producerId) { + return this.workingSet.computeIfAbsent(producerId, k -> new RendererWork(this.obtainMapFromPool(), this.obtainMapFromPool())); } private void releaseBoClasses(final Map work) { diff --git a/src/test/java/de/extio/game_engine/demo/DemoModule.java b/src/test/java/de/extio/game_engine/demo/DemoModule.java index 282bd09..e5ce443 100644 --- a/src/test/java/de/extio/game_engine/demo/DemoModule.java +++ b/src/test/java/de/extio/game_engine/demo/DemoModule.java @@ -15,8 +15,8 @@ public class DemoModule extends AbstractClientModule { @Override public void onLoad() { - this.getModuleService().changeActiveState(this.getClass(), true); - this.getModuleService().changeDisplayState(this.getClass(), true); + this.getModuleService().changeActiveState(this.getId(), true); + this.getModuleService().changeDisplayState(this.getId(), true); } @Override diff --git a/src/test/java/de/extio/game_engine/module/ModuleManagerTest.java b/src/test/java/de/extio/game_engine/module/ModuleManagerTest.java index 7e92efd..4a4a19b 100644 --- a/src/test/java/de/extio/game_engine/module/ModuleManagerTest.java +++ b/src/test/java/de/extio/game_engine/module/ModuleManagerTest.java @@ -71,7 +71,8 @@ public class ModuleManagerTest { @Test public void testLoadModule() { - this.moduleManager.loadModule(AlwaysDisplayModule.class); + final var newModule = new AlwaysDisplayModule(); + this.moduleManager.loadModule(newModule); assertEquals(3, this.moduleManager.getModulesAll().size()); assertTrue(this.moduleManager.getModulesAll().stream().anyMatch(m -> m instanceof AlwaysDisplayModule)); @@ -81,14 +82,14 @@ public class ModuleManagerTest { public void testLoadModule_AlreadyLoaded() { final int initialSize = this.moduleManager.getModulesAll().size(); - this.moduleManager.loadModule(TestModule.class); + this.moduleManager.loadModule(this.testModule); assertEquals(initialSize, this.moduleManager.getModulesAll().size()); } @Test public void testUnloadModule() { - this.moduleManager.unloadModule(TestModule.class); + this.moduleManager.unloadModule(this.testModule.getId()); assertEquals(1, this.moduleManager.getModulesAll().size()); assertFalse(this.moduleManager.getModulesAll().contains(this.testModule)); @@ -99,17 +100,17 @@ public class ModuleManagerTest { public void testUnloadModule_NotLoaded() { final int initialSize = this.moduleManager.getModulesAll().size(); - this.moduleManager.unloadModule(AlwaysDisplayModule.class); + this.moduleManager.unloadModule("NonExistentModule"); assertEquals(initialSize, this.moduleManager.getModulesAll().size()); } @Test public void testUnloadModule_DeactivatesFirst() { - this.moduleManager.changeActiveState(TestModule.class, true); + this.moduleManager.changeActiveState(this.testModule.getId(), true); assertTrue(this.moduleManager.getModulesActive().contains(this.testModule)); - this.moduleManager.unloadModule(TestModule.class); + this.moduleManager.unloadModule(this.testModule.getId()); assertFalse(this.moduleManager.getModulesActive().contains(this.testModule)); assertTrue(this.testModule.onDeactivateCalled); @@ -117,7 +118,7 @@ public class ModuleManagerTest { @Test public void testChangeActiveState_Activate() { - this.moduleManager.changeActiveState(TestModule.class, true); + this.moduleManager.changeActiveState(this.testModule.getId(), true); assertTrue(this.moduleManager.getModulesActive().contains(this.testModule)); assertTrue(this.testModule.onActivateCalled); @@ -125,10 +126,10 @@ public class ModuleManagerTest { @Test public void testChangeActiveState_Deactivate() { - this.moduleManager.changeActiveState(TestModule.class, true); + this.moduleManager.changeActiveState(this.testModule.getId(), true); this.testModule.onActivateCalled = false; - this.moduleManager.changeActiveState(TestModule.class, false); + this.moduleManager.changeActiveState(this.testModule.getId(), false); assertFalse(this.moduleManager.getModulesActive().contains(this.testModule)); assertTrue(this.testModule.onDeactivateCalled); @@ -136,42 +137,35 @@ public class ModuleManagerTest { @Test public void testChangeActiveState_AlreadyActive() { - this.moduleManager.changeActiveState(TestModule.class, true); + this.moduleManager.changeActiveState(this.testModule.getId(), true); this.testModule.onActivateCalled = false; - this.moduleManager.changeActiveState(TestModule.class, true); + this.moduleManager.changeActiveState(this.testModule.getId(), true); assertFalse(this.testModule.onActivateCalled); } @Test public void testChangeActiveState_AlreadyInactive() { - this.moduleManager.changeActiveState(TestModule.class, false); + this.moduleManager.changeActiveState(this.testModule.getId(), false); assertFalse(this.testModule.onDeactivateCalled); } - @Test - public void testChangeActiveState_ByClassName() { - this.moduleManager.changeActiveState(TestModule.class.getName(), true); - - assertTrue(this.moduleManager.getModulesActive().contains(this.testModule)); - assertTrue(this.testModule.onActivateCalled); - } - @Test public void testChangeActiveState_AlwaysDisplayModule() { - this.moduleManager.loadModule(AlwaysDisplayModule.class); + final var alwaysDisplayModule = new AlwaysDisplayModule(); + this.moduleManager.loadModule(alwaysDisplayModule); - this.moduleManager.changeActiveState(AlwaysDisplayModule.class, true); + this.moduleManager.changeActiveState(alwaysDisplayModule.getId(), true); - assertTrue(this.moduleManager.isDisplayed(AlwaysDisplayModule.class)); + assertTrue(this.moduleManager.isDisplayed(alwaysDisplayModule.getId())); } @Test public void testDeactivateAll() { - this.moduleManager.changeActiveState(TestModule.class, true); - this.moduleManager.changeActiveState(TestClientModule.class, true); + this.moduleManager.changeActiveState(this.testModule.getId(), true); + this.moduleManager.changeActiveState(this.testClientModule.getId(), true); this.moduleManager.deactivateAll(); @@ -182,34 +176,34 @@ public class ModuleManagerTest { @Test public void testChangeDisplayState_Show() { - this.moduleManager.changeActiveState(TestClientModule.class, true); + this.moduleManager.changeActiveState(this.testClientModule.getId(), true); this.testClientModule.onShowCalled = false; - this.moduleManager.changeDisplayState(TestClientModule.class, true); + this.moduleManager.changeDisplayState(this.testClientModule.getId(), true); - assertTrue(this.moduleManager.isDisplayed(TestClientModule.class)); + assertTrue(this.moduleManager.isDisplayed(this.testClientModule.getId())); assertTrue(this.testClientModule.onShowCalled); } @Test public void testChangeDisplayState_Hide() { - this.moduleManager.changeActiveState(TestClientModule.class, true); - this.moduleManager.changeDisplayState(TestClientModule.class, true); + this.moduleManager.changeActiveState(this.testClientModule.getId(), true); + this.moduleManager.changeDisplayState(this.testClientModule.getId(), true); this.testClientModule.onHideCalled = false; - this.moduleManager.changeDisplayState(TestClientModule.class, false); + this.moduleManager.changeDisplayState(this.testClientModule.getId(), false); - assertFalse(this.moduleManager.isDisplayed(TestClientModule.class)); + assertFalse(this.moduleManager.isDisplayed(this.testClientModule.getId())); assertTrue(this.testClientModule.onHideCalled); } @Test public void testChangeDisplayState_AlreadyShown() { - this.moduleManager.changeActiveState(TestClientModule.class, true); - this.moduleManager.changeDisplayState(TestClientModule.class, true); + this.moduleManager.changeActiveState(this.testClientModule.getId(), true); + this.moduleManager.changeDisplayState(this.testClientModule.getId(), true); this.testClientModule.onShowCalled = false; - this.moduleManager.changeDisplayState(TestClientModule.class, true); + this.moduleManager.changeDisplayState(this.testClientModule.getId(), true); assertFalse(this.testClientModule.onShowCalled, "onShow should not be called when already shown"); } @@ -218,111 +212,98 @@ public class ModuleManagerTest { public void testChangeDisplayState_AlreadyHidden() { this.testClientModule.onHideCalled = false; - this.moduleManager.changeDisplayState(TestClientModule.class, false); + this.moduleManager.changeDisplayState(this.testClientModule.getId(), false); assertFalse(this.testClientModule.onHideCalled, "onHide should not be called when already hidden"); } - @Test - public void testChangeDisplayState_ByClassName() { - this.moduleManager.changeActiveState(TestClientModule.class, true); - this.testClientModule.onShowCalled = false; - - this.moduleManager.changeDisplayState(TestClientModule.class.getName(), true); - - assertTrue(this.moduleManager.isDisplayed(TestClientModule.class)); - } - @Test public void testChangeDisplayState_AlwaysDisplayModule() { - this.moduleManager.loadModule(AlwaysDisplayModule.class); - this.moduleManager.changeActiveState(AlwaysDisplayModule.class, true); + final var alwaysDisplayModule = new AlwaysDisplayModule(); + this.moduleManager.loadModule(alwaysDisplayModule); + this.moduleManager.changeActiveState(alwaysDisplayModule.getId(), true); - this.moduleManager.changeDisplayState(AlwaysDisplayModule.class, false); + this.moduleManager.changeDisplayState(alwaysDisplayModule.getId(), false); - assertTrue(this.moduleManager.isDisplayed(AlwaysDisplayModule.class)); - } - - @Test - public void testIsDisplayed_ByClassName() { - this.moduleManager.changeActiveState(TestClientModule.class, true); - this.moduleManager.changeDisplayState(TestClientModule.class, true); - - assertTrue(this.moduleManager.isDisplayed(TestClientModule.class.getName())); + assertTrue(this.moduleManager.isDisplayed(alwaysDisplayModule.getId())); } @Test public void testHideAll() { - this.moduleManager.changeActiveState(TestClientModule.class, true); - this.moduleManager.changeDisplayState(TestClientModule.class, true); + this.moduleManager.changeActiveState(this.testClientModule.getId(), true); + this.moduleManager.changeDisplayState(this.testClientModule.getId(), true); this.testClientModule.onHideCalled = false; this.moduleManager.hideAll(); - assertFalse(this.moduleManager.isDisplayed(TestClientModule.class)); + assertFalse(this.moduleManager.isDisplayed(this.testClientModule.getId())); assertTrue(this.testClientModule.onHideCalled); } @Test public void testHideAll_DoesNotHideAlwaysDisplay() { - this.moduleManager.loadModule(AlwaysDisplayModule.class); - this.moduleManager.changeActiveState(AlwaysDisplayModule.class, true); - this.moduleManager.changeActiveState(TestClientModule.class, true); - this.moduleManager.changeDisplayState(TestClientModule.class, true); + final var alwaysDisplayModule = new AlwaysDisplayModule(); + this.moduleManager.loadModule(alwaysDisplayModule); + this.moduleManager.changeActiveState(alwaysDisplayModule.getId(), true); + this.moduleManager.changeActiveState(this.testClientModule.getId(), true); + this.moduleManager.changeDisplayState(this.testClientModule.getId(), true); this.moduleManager.hideAll(); - assertTrue(this.moduleManager.isDisplayed(AlwaysDisplayModule.class)); - assertFalse(this.moduleManager.isDisplayed(TestClientModule.class)); + assertTrue(this.moduleManager.isDisplayed(alwaysDisplayModule.getId())); + assertFalse(this.moduleManager.isDisplayed(this.testClientModule.getId())); } @Test public void testHideExcept() { - this.moduleManager.loadModule(AlwaysDisplayModule.class); - this.moduleManager.changeActiveState(TestClientModule.class, true); - this.moduleManager.changeDisplayState(TestClientModule.class, true); - this.moduleManager.changeActiveState(AlwaysDisplayModule.class, true); + final var alwaysDisplayModule = new AlwaysDisplayModule(); + this.moduleManager.loadModule(alwaysDisplayModule); + this.moduleManager.changeActiveState(this.testClientModule.getId(), true); + this.moduleManager.changeDisplayState(this.testClientModule.getId(), true); + this.moduleManager.changeActiveState(alwaysDisplayModule.getId(), true); this.testClientModule.onHideCalled = false; - this.moduleManager.hideExcept(AlwaysDisplayModule.class.getName()); + this.moduleManager.hideExcept(alwaysDisplayModule.getId()); - assertTrue(this.moduleManager.isDisplayed(AlwaysDisplayModule.class)); - assertFalse(this.moduleManager.isDisplayed(TestClientModule.class)); + assertTrue(this.moduleManager.isDisplayed(alwaysDisplayModule.getId())); + assertFalse(this.moduleManager.isDisplayed(this.testClientModule.getId())); assertTrue(this.testClientModule.onHideCalled); } @Test public void testHideExcept_MultipleExceptions() { - this.moduleManager.loadModule(AlwaysDisplayModule.class); - this.moduleManager.loadModule(HighPriorityModule.class); - this.moduleManager.changeActiveState(TestClientModule.class, true); - this.moduleManager.changeDisplayState(TestClientModule.class, true); - this.moduleManager.changeActiveState(AlwaysDisplayModule.class, true); - this.moduleManager.changeActiveState(HighPriorityModule.class, true); - this.moduleManager.changeDisplayState(HighPriorityModule.class, true); + final var alwaysDisplayModule = new AlwaysDisplayModule(); + final var highPriorityModule = new HighPriorityModule(); + this.moduleManager.loadModule(alwaysDisplayModule); + this.moduleManager.loadModule(highPriorityModule); + this.moduleManager.changeActiveState(this.testClientModule.getId(), true); + this.moduleManager.changeDisplayState(this.testClientModule.getId(), true); + this.moduleManager.changeActiveState(alwaysDisplayModule.getId(), true); + this.moduleManager.changeActiveState(highPriorityModule.getId(), true); + this.moduleManager.changeDisplayState(highPriorityModule.getId(), true); this.moduleManager.hideExcept( - AlwaysDisplayModule.class.getName(), - HighPriorityModule.class.getName() + alwaysDisplayModule.getId(), + highPriorityModule.getId() ); - assertTrue(this.moduleManager.isDisplayed(AlwaysDisplayModule.class)); - assertTrue(this.moduleManager.isDisplayed(HighPriorityModule.class)); - assertFalse(this.moduleManager.isDisplayed(TestClientModule.class)); + assertTrue(this.moduleManager.isDisplayed(alwaysDisplayModule.getId())); + assertTrue(this.moduleManager.isDisplayed(highPriorityModule.getId())); + assertFalse(this.moduleManager.isDisplayed(this.testClientModule.getId())); } @Test public void testRestoreVisibility() { - this.moduleManager.changeActiveState(TestClientModule.class, true); - this.moduleManager.changeDisplayState(TestClientModule.class, true); + this.moduleManager.changeActiveState(this.testClientModule.getId(), true); + this.moduleManager.changeDisplayState(this.testClientModule.getId(), true); this.moduleManager.hideExcept(); - assertFalse(this.moduleManager.isDisplayed(TestClientModule.class)); + assertFalse(this.moduleManager.isDisplayed(this.testClientModule.getId())); this.testClientModule.onShowCalled = false; this.moduleManager.restoreVisibility(); - assertTrue(this.moduleManager.isDisplayed(TestClientModule.class)); + assertTrue(this.moduleManager.isDisplayed(this.testClientModule.getId())); assertTrue(this.testClientModule.onShowCalled); } @@ -330,15 +311,15 @@ public class ModuleManagerTest { public void testRestoreVisibility_NoState() { this.moduleManager.restoreVisibility(); - assertFalse(this.moduleManager.isDisplayed(TestClientModule.class)); + assertFalse(this.moduleManager.isDisplayed(this.testClientModule.getId())); } @Test public void testIsModal() { assertFalse(this.moduleManager.isModal()); - this.moduleManager.changeActiveState(TestClientModule.class, true); - this.moduleManager.changeDisplayState(TestClientModule.class, true); + this.moduleManager.changeActiveState(this.testClientModule.getId(), true); + this.moduleManager.changeDisplayState(this.testClientModule.getId(), true); this.moduleManager.hideExcept(); assertTrue(this.moduleManager.isModal()); @@ -350,7 +331,8 @@ public class ModuleManagerTest { @Test public void testModuleSorting_Priority() { - this.moduleManager.loadModule(HighPriorityModule.class); + final var highPriorityModule = new HighPriorityModule(); + this.moduleManager.loadModule(highPriorityModule); final List modules = this.moduleManager.getModulesAll(); @@ -385,20 +367,20 @@ public class ModuleManagerTest { @Test public void testDeactivate_HidesDisplayedClientModule() { - this.moduleManager.changeActiveState(TestClientModule.class, true); - this.moduleManager.changeDisplayState(TestClientModule.class, true); + this.moduleManager.changeActiveState(this.testClientModule.getId(), true); + this.moduleManager.changeDisplayState(this.testClientModule.getId(), true); this.testClientModule.onHideCalled = false; - this.moduleManager.changeActiveState(TestClientModule.class, false); + this.moduleManager.changeActiveState(this.testClientModule.getId(), false); - assertFalse(this.moduleManager.isDisplayed(TestClientModule.class)); + assertFalse(this.moduleManager.isDisplayed(this.testClientModule.getId())); assertTrue(this.testClientModule.onHideCalled); } @Test public void testDeactivateAll_ClearsVisibilityStack() { - this.moduleManager.changeActiveState(TestClientModule.class, true); - this.moduleManager.changeDisplayState(TestClientModule.class, true); + this.moduleManager.changeActiveState(this.testClientModule.getId(), true); + this.moduleManager.changeDisplayState(this.testClientModule.getId(), true); this.moduleManager.hideExcept(); assertTrue(this.moduleManager.isModal()); @@ -417,8 +399,9 @@ public class ModuleManagerTest { @Test public void testGetSubscribersForCallback_WithSubscriber() { - this.moduleManager.loadModule(CallbackSubscriberModule.class); - this.moduleManager.changeActiveState(CallbackSubscriberModule.class, true); + final var callbackSubscriberModule = new CallbackSubscriberModule(); + this.moduleManager.loadModule(callbackSubscriberModule); + this.moduleManager.changeActiveState(callbackSubscriberModule.getId(), true); final List subscribers = this.moduleManager.getSubscribersForCallback(ModuleExecutorCallbacks.UI_PRE); @@ -428,8 +411,9 @@ public class ModuleManagerTest { @Test public void testGetSubscribersForCallback_MultipleCallbacks() { - this.moduleManager.loadModule(MultiCallbackSubscriberModule.class); - this.moduleManager.changeActiveState(MultiCallbackSubscriberModule.class, true); + final var multiCallbackSubscriberModule = new MultiCallbackSubscriberModule(); + this.moduleManager.loadModule(multiCallbackSubscriberModule); + this.moduleManager.changeActiveState(multiCallbackSubscriberModule.getId(), true); final List uiPreSubscribers = this.moduleManager.getSubscribersForCallback(ModuleExecutorCallbacks.UI_PRE); final List runSubscribers = this.moduleManager.getSubscribersForCallback(ModuleExecutorCallbacks.RUN); @@ -446,8 +430,9 @@ public class ModuleManagerTest { @Test public void testGetSubscribersForCallback_UnsubscribedCallbackEmpty() { - this.moduleManager.loadModule(CallbackSubscriberModule.class); - this.moduleManager.changeActiveState(CallbackSubscriberModule.class, true); + final var callbackSubscriberModule = new CallbackSubscriberModule(); + this.moduleManager.loadModule(callbackSubscriberModule); + this.moduleManager.changeActiveState(callbackSubscriberModule.getId(), true); final List runSubscribers = this.moduleManager.getSubscribersForCallback(ModuleExecutorCallbacks.RUN); @@ -456,13 +441,14 @@ public class ModuleManagerTest { @Test public void testGetSubscribersForCallback_RemovedOnDeactivate() { - this.moduleManager.loadModule(CallbackSubscriberModule.class); - this.moduleManager.changeActiveState(CallbackSubscriberModule.class, true); + final var callbackSubscriberModule = new CallbackSubscriberModule(); + this.moduleManager.loadModule(callbackSubscriberModule); + this.moduleManager.changeActiveState(callbackSubscriberModule.getId(), true); List subscribers = this.moduleManager.getSubscribersForCallback(ModuleExecutorCallbacks.UI_PRE); assertEquals(1, subscribers.size()); - this.moduleManager.changeActiveState(CallbackSubscriberModule.class, false); + this.moduleManager.changeActiveState(callbackSubscriberModule.getId(), false); subscribers = this.moduleManager.getSubscribersForCallback(ModuleExecutorCallbacks.UI_PRE); assertTrue(subscribers.isEmpty()); @@ -470,10 +456,12 @@ public class ModuleManagerTest { @Test public void testGetSubscribersForCallback_MultipleModules() { - this.moduleManager.loadModule(CallbackSubscriberModule.class); - this.moduleManager.loadModule(MultiCallbackSubscriberModule.class); - this.moduleManager.changeActiveState(CallbackSubscriberModule.class, true); - this.moduleManager.changeActiveState(MultiCallbackSubscriberModule.class, true); + final var callbackSubscriberModule = new CallbackSubscriberModule(); + final var multiCallbackSubscriberModule = new MultiCallbackSubscriberModule(); + this.moduleManager.loadModule(callbackSubscriberModule); + this.moduleManager.loadModule(multiCallbackSubscriberModule); + this.moduleManager.changeActiveState(callbackSubscriberModule.getId(), true); + this.moduleManager.changeActiveState(multiCallbackSubscriberModule.getId(), true); final List uiPreSubscribers = this.moduleManager.getSubscribersForCallback(ModuleExecutorCallbacks.UI_PRE); @@ -484,14 +472,15 @@ public class ModuleManagerTest { @Test public void testGetSubscribersForCallback_ReactivateModule() { - this.moduleManager.loadModule(CallbackSubscriberModule.class); - this.moduleManager.changeActiveState(CallbackSubscriberModule.class, true); - this.moduleManager.changeActiveState(CallbackSubscriberModule.class, false); + final var callbackSubscriberModule = new CallbackSubscriberModule(); + this.moduleManager.loadModule(callbackSubscriberModule); + this.moduleManager.changeActiveState(callbackSubscriberModule.getId(), true); + this.moduleManager.changeActiveState(callbackSubscriberModule.getId(), false); List subscribers = this.moduleManager.getSubscribersForCallback(ModuleExecutorCallbacks.UI_PRE); assertTrue(subscribers.isEmpty()); - this.moduleManager.changeActiveState(CallbackSubscriberModule.class, true); + this.moduleManager.changeActiveState(callbackSubscriberModule.getId(), true); subscribers = this.moduleManager.getSubscribersForCallback(ModuleExecutorCallbacks.UI_PRE); assertEquals(1, subscribers.size()); diff --git a/src/test/java/de/extio/game_engine/renderer/work/RendererWorkingSetImplTest.java b/src/test/java/de/extio/game_engine/renderer/work/RendererWorkingSetImplTest.java index 32a7e58..cefecd5 100644 --- a/src/test/java/de/extio/game_engine/renderer/work/RendererWorkingSetImplTest.java +++ b/src/test/java/de/extio/game_engine/renderer/work/RendererWorkingSetImplTest.java @@ -32,19 +32,28 @@ public class RendererWorkingSetImplTest { private RenderingBoPool renderingBoPool; + private TestModuleA moduleA; + + private TestModuleB moduleB; + + private TestModuleC moduleC; + @BeforeEach void setUp() { this.renderingBoPool = mock(RenderingBoPool.class); this.workingSet = new RendererWorkingSetImpl(this.renderingBoPool); + this.moduleA = new TestModuleA(); + this.moduleB = new TestModuleB(); + this.moduleC = new TestModuleC(); } @Test void addSingleAddsToUncommittedWork() { final RenderingBo bo1 = mock(RenderingBo.class); when(bo1.getId()).thenReturn("bo1"); - this.workingSet.add(TestModuleA.class, bo1); + this.workingSet.add(this.moduleA.getId(), bo1); - final var uncommitted = this.workingSet.getUncommittedWork(TestModuleA.class); + final var uncommitted = this.workingSet.getUncommittedWork(this.moduleA.getId()); assertNotNull(uncommitted); assertEquals(Map.of("bo1", bo1), uncommitted); } @@ -56,9 +65,9 @@ public class RendererWorkingSetImplTest { final RenderingBo bo2 = mock(RenderingBo.class); when(bo2.getId()).thenReturn("bo2"); - this.workingSet.add(TestModuleA.class, List.of(bo1, bo2)); + this.workingSet.add(this.moduleA.getId(), List.of(bo1, bo2)); - final var uncommitted = this.workingSet.getUncommittedWork(TestModuleA.class); + final var uncommitted = this.workingSet.getUncommittedWork(this.moduleA.getId()); assertEquals(Map.of("bo1", bo1, "bo2", bo2), uncommitted); } @@ -69,11 +78,11 @@ public class RendererWorkingSetImplTest { final RenderingBo bo2 = mock(RenderingBo.class); when(bo2.getId()).thenReturn("bo2"); - this.workingSet.add(TestModuleA.class, bo1); - this.workingSet.add(TestModuleA.class, bo2); + this.workingSet.add(this.moduleA.getId(), bo1); + this.workingSet.add(this.moduleA.getId(), bo2); - final var returnedUncommitted = this.workingSet.commit(TestModuleA.class, false); - final var currentUncommitted = this.workingSet.getUncommittedWork(TestModuleA.class); + final var returnedUncommitted = this.workingSet.commit(this.moduleA.getId(), false); + final var currentUncommitted = this.workingSet.getUncommittedWork(this.moduleA.getId()); assertSame(currentUncommitted, returnedUncommitted); assertTrue(currentUncommitted.isEmpty()); @@ -93,11 +102,11 @@ public class RendererWorkingSetImplTest { final RenderingBo bo3 = mock(RenderingBo.class); when(bo3.getId()).thenReturn("bo3"); - this.workingSet.add(TestModuleA.class, bo1); - this.workingSet.add(TestModuleA.class, bo2); + this.workingSet.add(this.moduleA.getId(), bo1); + this.workingSet.add(this.moduleA.getId(), bo2); - final var returnedUncommitted = this.workingSet.commit(TestModuleA.class, true); - final var currentUncommitted = this.workingSet.getUncommittedWork(TestModuleA.class); + final var returnedUncommitted = this.workingSet.commit(this.moduleA.getId(), true); + final var currentUncommitted = this.workingSet.getUncommittedWork(this.moduleA.getId()); assertSame(currentUncommitted, returnedUncommitted); assertEquals(Map.of("bo1", bo1, "bo2", bo2), currentUncommitted); @@ -107,7 +116,7 @@ public class RendererWorkingSetImplTest { assertEquals(2, live.size()); assertTrue(live.containsAll(List.of(bo1, bo2))); - this.workingSet.add(TestModuleA.class, bo3); + this.workingSet.add(this.moduleA.getId(), bo3); final List liveAfterAdd = new ArrayList<>(); this.workingSet.getLiveSet(liveAfterAdd, null); assertEquals(2, liveAfterAdd.size()); @@ -123,12 +132,12 @@ public class RendererWorkingSetImplTest { final RenderingBo bo3 = mock(RenderingBo.class); when(bo3.getId()).thenReturn("bo3"); - this.workingSet.add(TestModuleA.class, bo1); - this.workingSet.add(TestModuleA.class, bo2); - this.workingSet.add(TestModuleB.class, bo3); + this.workingSet.add(this.moduleA.getId(), bo1); + this.workingSet.add(this.moduleA.getId(), bo2); + this.workingSet.add(this.moduleB.getId(), bo3); - this.workingSet.commit(TestModuleA.class, false); - this.workingSet.commit(TestModuleB.class, false); + this.workingSet.commit(this.moduleA.getId(), false); + this.workingSet.commit(this.moduleB.getId(), false); final List live = new ArrayList<>(); this.workingSet.getLiveSet(live, null); @@ -138,7 +147,7 @@ public class RendererWorkingSetImplTest { @Test void commitOnUnknownProducerCreatesEmptyState() { - final var returnedUncommitted = this.workingSet.commit(TestModuleC.class, false); + final var returnedUncommitted = this.workingSet.commit(this.moduleC.getId(), false); assertNotNull(returnedUncommitted); assertTrue(returnedUncommitted.isEmpty()); @@ -154,24 +163,24 @@ public class RendererWorkingSetImplTest { final var bo2 = new TestBoB(); bo2.setId("bo2"); - this.workingSet.add(TestModuleA.class, bo1); - this.workingSet.commit(TestModuleA.class, false); - this.workingSet.add(TestModuleA.class, bo2); + this.workingSet.add(this.moduleA.getId(), bo1); + this.workingSet.commit(this.moduleA.getId(), false); + this.workingSet.add(this.moduleA.getId(), bo2); // Before clear final List liveBefore = new ArrayList<>(); this.workingSet.getLiveSet(liveBefore, null); assertTrue(liveBefore.contains(bo1)); - assertNotNull(this.workingSet.get(TestModuleA.class, "bo2")); + assertNotNull(this.workingSet.get(this.moduleA.getId(), "bo2")); - this.workingSet.clear(TestModuleA.class); + this.workingSet.clear(this.moduleA.getId()); // After clear final List liveAfter = new ArrayList<>(); this.workingSet.getLiveSet(liveAfter, null); assertTrue(liveAfter.isEmpty()); - final var uncommittedAfter = this.workingSet.getUncommittedWork(TestModuleA.class); + final var uncommittedAfter = this.workingSet.getUncommittedWork(this.moduleA.getId()); assertTrue(uncommittedAfter.isEmpty()); verify(this.renderingBoPool, times(1)).release(bo1); @@ -184,10 +193,10 @@ public class RendererWorkingSetImplTest { void clearOnUnknownProducerDoesNothing() { final RenderingBo bo1 = mock(RenderingBo.class); when(bo1.getId()).thenReturn("bo1"); - this.workingSet.add(TestModuleA.class, bo1); - this.workingSet.commit(TestModuleA.class, false); + this.workingSet.add(this.moduleA.getId(), bo1); + this.workingSet.commit(this.moduleA.getId(), false); - this.workingSet.clear(TestModuleC.class); + this.workingSet.clear(this.moduleC.getId()); final List live = new ArrayList<>(); this.workingSet.getLiveSet(live, null); @@ -202,14 +211,14 @@ public class RendererWorkingSetImplTest { final var bo2 = new TestBoA(); bo2.setId("bo2"); - this.workingSet.add(TestModuleA.class, bo1); - this.workingSet.add(TestModuleA.class, bo2); - this.workingSet.commit(TestModuleA.class, false); + this.workingSet.add(this.moduleA.getId(), bo1); + this.workingSet.add(this.moduleA.getId(), bo2); + this.workingSet.commit(this.moduleA.getId(), false); final var bo3 = new TestBoB(); bo3.setId("bo3"); - this.workingSet.add(TestModuleA.class, bo3); - this.workingSet.commit(TestModuleA.class, false); + this.workingSet.add(this.moduleA.getId(), bo3); + this.workingSet.commit(this.moduleA.getId(), false); verify(this.renderingBoPool, times(1)).release(bo1); verify(this.renderingBoPool, times(1)).release(bo2); @@ -227,12 +236,12 @@ public class RendererWorkingSetImplTest { final RenderingBo bo2 = mock(RenderingBo.class); when(bo2.getId()).thenReturn("bo2"); - this.workingSet.add(TestModuleA.class, bo1); - this.workingSet.add(TestModuleA.class, bo2); + this.workingSet.add(this.moduleA.getId(), bo1); + this.workingSet.add(this.moduleA.getId(), bo2); - final var retrieved1 = this.workingSet.get(TestModuleA.class, "bo1"); - final var retrieved2 = this.workingSet.get(TestModuleA.class, "bo2"); - final var notFound = this.workingSet.get(TestModuleA.class, "nonexistent"); + final var retrieved1 = this.workingSet.get(this.moduleA.getId(), "bo1"); + final var retrieved2 = this.workingSet.get(this.moduleA.getId(), "bo2"); + final var notFound = this.workingSet.get(this.moduleA.getId(), "nonexistent"); assertSame(bo1, retrieved1); assertSame(bo2, retrieved2); @@ -246,16 +255,16 @@ public class RendererWorkingSetImplTest { final RenderingBo bo2 = mock(RenderingBo.class); when(bo2.getId()).thenReturn("bo2"); - this.workingSet.add(TestModuleA.class, bo1); - this.workingSet.add(TestModuleA.class, bo2); - final var committedWork = this.workingSet.commit(TestModuleA.class, false); + this.workingSet.add(this.moduleA.getId(), bo1); + this.workingSet.add(this.moduleA.getId(), bo2); + final var committedWork = this.workingSet.commit(this.moduleA.getId(), false); // After commit without clone, the uncommitted work should be empty assertTrue(committedWork.isEmpty()); // get() only retrieves from next set, not live set, so it returns null after commit - final var retrieved1 = this.workingSet.get(TestModuleA.class, "bo1"); - final var retrieved2 = this.workingSet.get(TestModuleA.class, "bo2"); + final var retrieved1 = this.workingSet.get(this.moduleA.getId(), "bo1"); + final var retrieved2 = this.workingSet.get(this.moduleA.getId(), "bo2"); assertTrue(retrieved1 == null); assertTrue(retrieved2 == null); @@ -268,13 +277,13 @@ public class RendererWorkingSetImplTest { final RenderingBo bo1_replacement = mock(RenderingBo.class); when(bo1_replacement.getId()).thenReturn("bo1"); - this.workingSet.add(TestModuleA.class, bo1); - final var uncommittedBefore = this.workingSet.getUncommittedWork(TestModuleA.class); + this.workingSet.add(this.moduleA.getId(), bo1); + final var uncommittedBefore = this.workingSet.getUncommittedWork(this.moduleA.getId()); assertEquals(1, uncommittedBefore.size()); assertSame(bo1, uncommittedBefore.get("bo1")); - this.workingSet.add(TestModuleA.class, bo1_replacement); - final var uncommittedAfter = this.workingSet.getUncommittedWork(TestModuleA.class); + this.workingSet.add(this.moduleA.getId(), bo1_replacement); + final var uncommittedAfter = this.workingSet.getUncommittedWork(this.moduleA.getId()); assertEquals(1, uncommittedAfter.size()); assertSame(bo1_replacement, uncommittedAfter.get("bo1")); } @@ -288,12 +297,12 @@ public class RendererWorkingSetImplTest { final var boA2 = new TestBoA(); boA2.setId("boA2"); - this.workingSet.add(TestModuleA.class, boA1); - this.workingSet.add(TestModuleB.class, boB1); - this.workingSet.add(TestModuleA.class, boA2); + this.workingSet.add(this.moduleA.getId(), boA1); + this.workingSet.add(this.moduleB.getId(), boB1); + this.workingSet.add(this.moduleA.getId(), boA2); - this.workingSet.commit(TestModuleA.class, false); - this.workingSet.commit(TestModuleB.class, false); + this.workingSet.commit(this.moduleA.getId(), false); + this.workingSet.commit(this.moduleB.getId(), false); final List allLive = new ArrayList<>(); this.workingSet.getLiveSet(allLive, null); @@ -301,7 +310,7 @@ public class RendererWorkingSetImplTest { assertTrue(allLive.containsAll(List.of(boA1, boB1, boA2))); final List filteredLive = new ArrayList<>(); - this.workingSet.getLiveSet(filteredLive, TestModuleA.class::equals); + this.workingSet.getLiveSet(filteredLive, this.moduleA.getId()::equals); assertEquals(2, filteredLive.size()); assertTrue(filteredLive.containsAll(List.of(boA1, boA2))); assertFalse(filteredLive.contains(boB1));