Configuration for G2D rendering; Add RendererLoop; Bootstrapping

This commit is contained in:
extio-de
2025-12-20 19:20:54 +01:00
parent de56825824
commit c19307e4f3
25 changed files with 280 additions and 89 deletions

View File

@@ -16,4 +16,6 @@ public interface Renderer {
void setTitle(final String title);
void setRendererData(final RendererData rendererData);
}

View File

@@ -0,0 +1,51 @@
package de.extio.game_engine.renderer;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Consumer;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
import de.extio.game_engine.renderer.model.RenderingBo;
@AutoConfiguration
@ConditionalOnProperty(name = "game-engine.renderer.enabled", havingValue = "true", matchIfMissing = true)
public class RendererConfiguration {
@SuppressWarnings("unchecked")
@Bean
public RenderingBoPool renderingBoPool(final List<RenderingBo> renderingBoImplementations) {
final Map<Class<? extends RenderingBo>, Class<? extends RenderingBo>> mapping = new HashMap<>();
for (final var impl : renderingBoImplementations) {
for (final var interf : impl.getClass().getInterfaces()) {
if (RenderingBo.class.isAssignableFrom(interf)) {
mapping.put((Class<? extends RenderingBo>) interf, impl.getClass());
}
}
}
return new RenderingBoPoolImpl(mapping);
}
@Bean
public RendererData rendererData(final Renderer renderer, final RendererControl rendererControl, final RenderingBoPool renderingBoPool, @Qualifier("gameEngineEventConsumer") final Consumer<Object> eventConsumer) {
final var rendererData = new RendererData(renderer, rendererControl, renderingBoPool, eventConsumer);
renderer.setRendererData(rendererData);
rendererControl.setRendererData(rendererData);
renderingBoPool.setRendererData(rendererData);
return rendererData;
}
@Bean
public RendererLoop rendererLoop(final RendererData rendererData) {
final var rendererLoop = new RendererLoop(rendererData);
rendererData.setRendererLoop(rendererLoop);
rendererLoop.start();
return rendererLoop;
}
}

View File

@@ -39,5 +39,7 @@ public interface RendererControl {
void setFrameRate(int frameRate);
long getFrame();
void setRendererData(final RendererData rendererData);
}

View File

@@ -1,5 +1,6 @@
package de.extio.game_engine.renderer;
import java.util.concurrent.atomic.AtomicLong;
import java.util.function.Consumer;
import de.extio.game_engine.renderer.model.options.UiOptions;
@@ -7,28 +8,33 @@ import de.extio.game_engine.renderer.model.options.VideoOptions;
public class RendererData {
private Renderer renderer;
private final Renderer renderer;
private RendererControl rendererControl;
private final RendererControl rendererControl;
private RenderingBoPool renderingBoPool;
private final RenderingBoPool renderingBoPool;
private final Consumer<Object> eventConsumer;
private final UiOptions uiOptions = new UiOptions();
private final VideoOptions videoOptions = new VideoOptions();
private long frame;
private final AtomicLong frame = new AtomicLong();
private Consumer<Object> eventConsumer;
private RendererLoop rendererLoop;
public RendererData(final Renderer renderer, final RendererControl rendererControl, final RenderingBoPool renderingBoPool, final Consumer<Object> eventConsumer) {
this.renderer = renderer;
this.rendererControl = rendererControl;
this.renderingBoPool = renderingBoPool;
this.eventConsumer = eventConsumer;
}
public RendererControl getRendererControl() {
return this.rendererControl;
}
public void setRendererControl(final RendererControl rendererControl) {
this.rendererControl = rendererControl;
}
public UiOptions getUiOptions() {
return this.uiOptions;
}
@@ -37,26 +43,18 @@ public class RendererData {
return this.renderingBoPool;
}
public void setRenderingBoPool(final RenderingBoPool renderingBoPool) {
this.renderingBoPool = renderingBoPool;
}
public long getFrame() {
return this.frame;
return this.frame.get();
}
public void setFrame(final long frame) {
this.frame = frame;
public long nextFrame() {
return this.frame.incrementAndGet();
}
public Renderer getRenderer() {
return this.renderer;
}
public void setRenderer(final Renderer renderer) {
this.renderer = renderer;
}
public VideoOptions getVideoOptions() {
return this.videoOptions;
}
@@ -64,9 +62,13 @@ public class RendererData {
public Consumer<Object> getEventConsumer() {
return this.eventConsumer;
}
public void setEventConsumer(final Consumer<Object> eventConsumer) {
this.eventConsumer = eventConsumer;
public void setRendererLoop(final RendererLoop rendererLoop) {
this.rendererLoop = rendererLoop;
}
public RendererLoop getRendererLoop() {
return this.rendererLoop;
}
}

View File

@@ -1,21 +0,0 @@
package de.extio.game_engine.renderer;
import java.util.function.Consumer;
import de.extio.game_engine.renderer.g2d.G2DRenderer;
import de.extio.game_engine.renderer.g2d.G2DRendererControl;
public class RendererFactory {
public static Renderer createG2DRenderer(final RenderingBoPool renderingBoPool, final Consumer<Object> eventConsumer) {
final var rendererData = new RendererData();
final var renderer = new G2DRenderer(rendererData);
rendererData.setRendererControl(new G2DRendererControl(renderer, rendererData));
rendererData.setRenderingBoPool(renderingBoPool);
rendererData.setRenderer(renderer);
rendererData.setEventConsumer(eventConsumer);
return renderer;
}
}

View File

@@ -0,0 +1,60 @@
package de.extio.game_engine.renderer;
import java.util.ArrayList;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class RendererLoop extends Thread {
private static final Logger LOGGER = LoggerFactory.getLogger(RendererLoop.class);
private final RendererData rendererData;
private volatile boolean running = true;
public RendererLoop(final RendererData rendererData) {
this.rendererData = rendererData;
this.setName("Renderer-Loop");
this.setDaemon(false);
}
@Override
public void run() {
try {
this.rendererData.getRenderer().show();
LOGGER.info("Renderer loop started");
int exceptionCount = 0;
while (this.running) {
try {
this.rendererData.nextFrame();
this.rendererData.getRenderer().run(new ArrayList<>()); // TODO: Pass actual renderables
exceptionCount = 0;
}
catch (final InterruptedException e) {
LOGGER.info("Renderer loop interrupted, shutting down");
Thread.currentThread().interrupt();
break;
}
catch (final Exception e) {
LOGGER.error("Renderer loop caught exception", e);
if (++exceptionCount >= 10) {
LOGGER.error("Renderer loop exceeded maximum exception count, shutting down");
break;
}
}
}
LOGGER.info("Renderer loop exited");
}
catch (final Throwable t) {
LOGGER.error("Renderer loop crashed", t);
}
}
public void shutdown() {
this.running = false;
}
}

View File

@@ -21,4 +21,6 @@ public interface RenderingBoPool {
*/
void release(RenderingBo obj);
void setRendererData(RendererData rendererData);
}

View File

@@ -9,9 +9,7 @@ import de.extio.game_engine.renderer.model.RenderingBo;
public class RenderingBoPoolImpl implements RenderingBoPool {
public final static Map<Class<? extends RenderingBo>, Class<? extends RenderingBo>> INTERFACE_TO_BO_G2D = new HashMap<>();
private final RendererData rendererData;
public final Map<Class<? extends RenderingBo>, Class<? extends RenderingBo>> mapping;
private final Map<Class<? extends RenderingBo>, Stack<RenderingBo>> pool = new HashMap<>();
@@ -19,6 +17,8 @@ public class RenderingBoPoolImpl implements RenderingBoPool {
private final LastReverseMapping lastReverseMapping = new LastReverseMapping();
private RendererData rendererData;
private static class LastMapping {
volatile Class<? extends RenderingBo> clazz;
@@ -34,11 +34,11 @@ public class RenderingBoPoolImpl implements RenderingBoPool {
volatile Stack<RenderingBo> pooled;
}
public RenderingBoPoolImpl(final RendererData rendererData) {
this.rendererData = rendererData;
public RenderingBoPoolImpl(final Map<Class<? extends RenderingBo>, Class<? extends RenderingBo>> mapping) {
this.mapping = mapping;
}
@Override
@SuppressWarnings("unchecked")
public <T extends RenderingBo> T acquire(final Class<T> clazz) {
@@ -54,7 +54,7 @@ public class RenderingBoPoolImpl implements RenderingBoPool {
impl = clazz;
}
else {
impl = INTERFACE_TO_BO_G2D.get(clazz);
impl = mapping.get(clazz);
if (impl == null) {
throw new IllegalArgumentException(clazz.getSimpleName() + " not mapped");
}
@@ -114,5 +114,10 @@ public class RenderingBoPoolImpl implements RenderingBoPool {
throw new RuntimeException(e);
}
}
@Override
public void setRendererData(final RendererData rendererData) {
this.rendererData = rendererData;
}
}

View File

@@ -0,0 +1,25 @@
package de.extio.game_engine.renderer.g2d;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
@AutoConfiguration
@ConditionalOnProperty(name = "game-engine.renderer.enabled", havingValue = "true", matchIfMissing = true)
@ConditionalOnProperty(name = "game-engine.renderer.strategy", havingValue = "g2d", matchIfMissing = true)
public class G2DAutoConfiguration {
@Bean
public G2DRenderer g2dRenderer(@Value("${game-engine.renderer.title:}") final String title) {
final var renderer = new G2DRenderer();
renderer.setTitle(title);
return renderer;
}
@Bean
public G2DRendererControl g2dRendererControl(final G2DRenderer renderer) {
return new G2DRendererControl(renderer);
}
}

View File

@@ -39,7 +39,6 @@ import de.extio.game_engine.renderer.model.event.MouseMoveEvent;
import de.extio.game_engine.spatial2.model.CoordI2;
import de.extio.game_engine.spatial2.model.ImmutableCoordI2;
@SuppressWarnings("serial")
public class G2DMainFrame extends Frame {
private static final Logger LOGGER = LoggerFactory.getLogger(G2DMainFrame.class);
@@ -62,8 +61,10 @@ public class G2DMainFrame extends Frame {
this.setBackground(Color.BLACK);
try (var in = this.getClass().getClassLoader().getResourceAsStream("icon.png")) {
final var icon = ImageIO.read(in);
this.setIconImage(icon);
if (in != null) {
final var icon = ImageIO.read(in);
this.setIconImage(icon);
}
}
catch (final IOException e) {
LOGGER.error(e.getMessage(), e);
@@ -93,7 +94,7 @@ public class G2DMainFrame extends Frame {
@Override
public void windowClosing(final WindowEvent e) {
System.exit(0);
G2DMainFrame.this.rendererData.getRendererLoop().shutdown();
}
@Override

View File

@@ -19,25 +19,15 @@ import org.slf4j.LoggerFactory;
import de.extio.game_engine.renderer.Renderer;
import de.extio.game_engine.renderer.RendererData;
import de.extio.game_engine.renderer.RenderingBoPoolImpl;
import de.extio.game_engine.renderer.g2d.bo.rendering.G2DAbstractRenderingBo;
import de.extio.game_engine.renderer.g2d.bo.rendering.G2DDrawBackground;
import de.extio.game_engine.renderer.g2d.bo.rendering.G2DDrawEffect;
import de.extio.game_engine.renderer.g2d.bo.rendering.G2DDrawFont;
import de.extio.game_engine.renderer.g2d.bo.rendering.G2DDrawFpsHistory;
import de.extio.game_engine.renderer.g2d.bo.rendering.G2DDrawImage;
import de.extio.game_engine.renderer.g2d.bo.rendering.G2DDrawTest;
import de.extio.game_engine.renderer.g2d.bo.rendering.G2DDrawWindow;
import de.extio.game_engine.renderer.g2d.control.G2DDrawControl;
import de.extio.game_engine.renderer.g2d.control.G2DDrawControlTooltip;
import de.extio.game_engine.renderer.model.RenderingBo;
import de.extio.game_engine.renderer.model.RenderingBoLayer;
import de.extio.game_engine.renderer.model.bo.ControlRenderingBo;
import de.extio.game_engine.renderer.model.bo.DrawEffectRenderingBo;
import de.extio.game_engine.renderer.model.bo.DrawFontRenderingBo;
import de.extio.game_engine.renderer.model.bo.DrawImageRenderingBo;
import de.extio.game_engine.renderer.model.bo.DrawTestRenderingBo;
import de.extio.game_engine.renderer.model.bo.DrawWindowRenderingBo;
import de.extio.game_engine.renderer.model.color.RgbaColor;
import de.extio.game_engine.renderer.model.event.TakeScreenshotEvent;
import de.extio.game_engine.util.RingBuffer;
@@ -48,11 +38,11 @@ public class G2DRenderer implements Renderer {
private static final long SLEEP_PRECISION = TimeUnit.MILLISECONDS.toNanos(3);
private final RingBuffer<Integer> fpsHistory = new RingBuffer<>(90);
private volatile G2DMainFrame mainFrame;
private final RendererData rendererData;
private final RingBuffer<Integer> fpsHistory = new RingBuffer<>(90);
private RendererData rendererData;
private long fpsMeasurement;
@@ -70,28 +60,20 @@ public class G2DRenderer implements Renderer {
private volatile boolean takeScreenshot;
public G2DRenderer(final RendererData rendererData) {
public G2DRenderer() {
LOGGER.info("ctor");
System.setProperty("sun.java2d.uiScale", "1");
System.setProperty("awt.nativeDoubleBuffering", "true");
System.setProperty("awt.useSystemAAFontSettings", "on");
System.setProperty("swing.aatext", "true");
this.rendererData = rendererData;
// TODO: Discover with spring dm
RenderingBoPoolImpl.INTERFACE_TO_BO_G2D.put(DrawFontRenderingBo.class, G2DDrawFont.class);
RenderingBoPoolImpl.INTERFACE_TO_BO_G2D.put(DrawImageRenderingBo.class, G2DDrawImage.class);
RenderingBoPoolImpl.INTERFACE_TO_BO_G2D.put(ControlRenderingBo.class, G2DDrawControl.class);
RenderingBoPoolImpl.INTERFACE_TO_BO_G2D.put(DrawWindowRenderingBo.class, G2DDrawWindow.class);
RenderingBoPoolImpl.INTERFACE_TO_BO_G2D.put(DrawTestRenderingBo.class, G2DDrawTest.class);
RenderingBoPoolImpl.INTERFACE_TO_BO_G2D.put(DrawEffectRenderingBo.class, G2DDrawEffect.class);
}
@Override
public void show() {
try {
LOGGER.info("show()");
EventQueue.invokeAndWait(() -> {
this.rendererData.getRendererControl().applyVideoOptions();
});
@@ -316,7 +298,7 @@ public class G2DRenderer implements Renderer {
@Override
public void setTitle(final String title) {
this.title = title;
if (this.mainFrame != null) {
if (this.mainFrame != null && title != null) {
this.mainFrame.setTitle(title);
}
}
@@ -324,4 +306,9 @@ public class G2DRenderer implements Renderer {
public String getTitle() {
return this.title;
}
@Override
public void setRendererData(final RendererData rendererData) {
this.rendererData = rendererData;
}
}

View File

@@ -19,10 +19,10 @@ public class G2DRendererControl implements RendererControl {
private final static CoordI2 NO_SCALING_UPPER_LIMIT = ImmutableCoordI2.create(2560, 1440);
private final RendererData rendererData;
private final G2DRenderer renderer;
private RendererData rendererData;
private CoordI2 absoluteViewportDimension = REFERENCE_RESOLUTION;
private CoordI2 effectiveViewportDimension = REFERENCE_RESOLUTION;
@@ -37,9 +37,8 @@ public class G2DRendererControl implements RendererControl {
private volatile long videoOptionsAppliedAt;
public G2DRendererControl(final G2DRenderer renderer, final RendererData rendererData) {
public G2DRendererControl(final G2DRenderer renderer) {
this.renderer = renderer;
this.rendererData = rendererData;
}
@Override
@@ -82,7 +81,7 @@ public class G2DRendererControl implements RendererControl {
else {
mainFrame.windowed();
}
mainFrame.setTitle(this.renderer.getTitle());
mainFrame.setTitle(this.renderer.getTitle() == null ? "" : this.renderer.getTitle());
if (this.rendererData.getVideoOptions().getFrameRateTarget() == 0) {
this.rendererData.getVideoOptions().setFrameRateTarget(this.frameRate);
}
@@ -252,4 +251,9 @@ public class G2DRendererControl implements RendererControl {
public long getFrame() {
return this.rendererData.getFrame();
}
@Override
public void setRendererData(final RendererData rendererData) {
this.rendererData = rendererData;
}
}

View File

@@ -14,6 +14,8 @@ import java.util.Objects;
import javax.imageio.ImageIO;
import org.springframework.stereotype.Component;
import de.extio.game_engine.renderer.g2d.G2DRendererControl;
import de.extio.game_engine.renderer.model.RenderingBoLayer;
import de.extio.game_engine.renderer.model.color.ImmutableRgbaColor;
@@ -23,6 +25,7 @@ import de.extio.game_engine.spatial2.model.ImmutableCoordI2;
import de.extio.game_engine.spatial2.model.MutableCoordI2;
import de.extio.game_engine.util.rng.ThreadLocalXorShift128Random;
@Component
public class G2DDrawBackground extends G2DAbstractRenderingBo {
private static VolatileImage BACKGROUND_IMAGE;

View File

@@ -6,6 +6,8 @@ import java.awt.Graphics2D;
import java.util.ArrayList;
import java.util.List;
import org.springframework.stereotype.Component;
import de.extio.game_engine.renderer.g2d.G2DRenderer;
import de.extio.game_engine.renderer.g2d.control.components.ComponentRenderingSupport;
import de.extio.game_engine.renderer.model.RenderingBoLayer;
@@ -17,6 +19,7 @@ import de.extio.game_engine.spatial2.model.CoordI2;
import de.extio.game_engine.spatial2.model.ImmutableCoordI2;
import de.extio.game_engine.spatial2.model.MutableCoordI2;
@Component
public class G2DDrawEffect extends G2DAbstractRenderingBo implements DrawEffectRenderingBo {
private DrawEffectRenderingBoEffects effect;

View File

@@ -8,6 +8,8 @@ import java.awt.font.TextAttribute;
import java.util.HashMap;
import java.util.Map;
import org.springframework.stereotype.Component;
import de.extio.game_engine.renderer.model.RenderingBoLayer;
import de.extio.game_engine.renderer.model.bo.DrawFontRenderingBo;
import de.extio.game_engine.renderer.model.bo.DrawFontRenderingBoTextAlignment;
@@ -15,6 +17,7 @@ import de.extio.game_engine.spatial2.model.CoordI2;
import de.extio.game_engine.spatial2.model.ImmutableCoordI2;
import de.extio.game_engine.spatial2.model.MutableCoordI2;
@Component
public class G2DDrawFont extends G2DAbstractRenderingBo implements DrawFontRenderingBo {
private final static float FONT_SIZE_MIN = 12.0F;

View File

@@ -4,8 +4,11 @@ import java.awt.Color;
import java.awt.Graphics2D;
import java.util.Collection;
import org.springframework.stereotype.Component;
import de.extio.game_engine.renderer.model.RenderingBoLayer;
@Component
public class G2DDrawFpsHistory extends G2DAbstractRenderingBo {
private Collection<Integer> history;

View File

@@ -12,10 +12,13 @@ import java.util.Map;
import javax.imageio.ImageIO;
import org.springframework.stereotype.Component;
import de.extio.game_engine.renderer.g2d.G2DRenderer;
import de.extio.game_engine.renderer.model.RenderingBoLayer;
import de.extio.game_engine.renderer.model.bo.DrawImageRenderingBo;
@Component
public class G2DDrawImage extends G2DAbstractRenderingBo implements DrawImageRenderingBo {
private static Map<String, CachedImage> IMAGE_CACHE = new HashMap<>();

View File

@@ -2,9 +2,12 @@ package de.extio.game_engine.renderer.g2d.bo.rendering;
import java.awt.Graphics2D;
import org.springframework.stereotype.Component;
import de.extio.game_engine.renderer.model.RenderingBoLayer;
import de.extio.game_engine.renderer.model.bo.DrawTestRenderingBo;
@Component
public class G2DDrawTest extends G2DAbstractRenderingBo implements DrawTestRenderingBo {
// private static BufferedImage TILE;

View File

@@ -2,12 +2,15 @@ package de.extio.game_engine.renderer.g2d.bo.rendering;
import java.awt.Graphics2D;
import org.springframework.stereotype.Component;
import de.extio.game_engine.renderer.g2d.control.components.ComponentRenderingSupport;
import de.extio.game_engine.renderer.model.RenderingBoLayer;
import de.extio.game_engine.renderer.model.bo.DrawWindowRenderingBo;
import de.extio.game_engine.renderer.model.color.ImmutableRgbaColor;
import de.extio.game_engine.renderer.model.color.RgbaColor;
@Component
public class G2DDrawWindow extends G2DAbstractRenderingBo implements DrawWindowRenderingBo {
private static final RgbaColor COLOR_WINDOW = new ImmutableRgbaColor(ComponentRenderingSupport.COLOR_COMPONENT_BORDER1.getRed(), ComponentRenderingSupport.COLOR_COMPONENT_BORDER1.getGreen(), ComponentRenderingSupport.COLOR_COMPONENT_BORDER1.getBlue());

View File

@@ -8,12 +8,15 @@ import java.awt.image.BufferedImage;
import java.util.HashMap;
import java.util.Map;
import org.springframework.stereotype.Component;
import de.extio.game_engine.renderer.g2d.G2DRenderer;
import de.extio.game_engine.renderer.model.RenderingBoLayer;
import de.extio.game_engine.renderer.model.bo.DrawWindowRenderingBo;
import de.extio.game_engine.renderer.model.color.ImmutableRgbaColor;
import de.extio.game_engine.renderer.model.color.RgbaColor;
@Component
public class G2DDrawWindow2 extends G2DAbstractRenderingBo implements DrawWindowRenderingBo {
private static final Map<Long, G2DWindowCacheEntry> CACHE = new HashMap<>();

View File

@@ -8,6 +8,7 @@ import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import de.extio.game_engine.renderer.g2d.bo.rendering.G2DAbstractRenderingBo;
import de.extio.game_engine.renderer.g2d.control.impl.G2DBaseControlImpl;
@@ -26,6 +27,7 @@ import de.extio.game_engine.renderer.model.bo.ControlRenderingBo;
import de.extio.game_engine.renderer.model.bo.DrawFontRenderingBoTextAlignment;
import de.extio.game_engine.renderer.model.color.RgbaColor;
@Component
public class G2DDrawControl extends G2DAbstractRenderingBo implements ControlRenderingBo {
private final static Logger LOGGER = LoggerFactory.getLogger(G2DDrawControl.class);

View File

@@ -3,12 +3,15 @@ package de.extio.game_engine.renderer.g2d.control;
import java.awt.Color;
import java.awt.Graphics2D;
import org.springframework.stereotype.Component;
import de.extio.game_engine.renderer.g2d.bo.rendering.G2DAbstractRenderingBo;
import de.extio.game_engine.renderer.g2d.bo.rendering.G2DDrawFont;
import de.extio.game_engine.renderer.model.RenderingBoLayer;
import de.extio.game_engine.renderer.model.color.MutableRgbaColor;
import de.extio.game_engine.spatial2.model.CoordI2;
@Component
public class G2DDrawControlTooltip extends G2DAbstractRenderingBo {
public static record TooltipRecord(CoordI2 position, String text) {

View File

@@ -15,7 +15,7 @@ public final class UiOptions {
private boolean backgroundScrollingReverse1;
private boolean drawFps;
private boolean drawFps = true;
private CoordI2 backgroundOffset0 = MutableCoordI2.create();

View File

@@ -2,7 +2,7 @@ package de.extio.game_engine.renderer.model.options;
public final class VideoOptions {
private VideoOptionsVideoMode videoMode = VideoOptionsVideoMode.BORDERLESS;
private VideoOptionsVideoMode videoMode = VideoOptionsVideoMode.WINDOW;
private int fullScreenNumber = -1;

View File

@@ -0,0 +1,42 @@
package de.extio.game_engine;
import java.util.function.Consumer;
import org.junit.jupiter.api.Test;
import org.springframework.boot.SpringBootConfiguration;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.test.context.ContextConfiguration;
@SpringBootTest
@ContextConfiguration(classes = BootstrapTest.TestConfig.class)
public class BootstrapTest {
static {
System.setProperty("java.awt.headless", "false");
}
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(basePackages = "de.extio.game_engine")
static class TestConfig {
@Bean(name = "gameEngineEventConsumer")
public Consumer<Object> eventConsumer() {
return event -> {
};
}
}
@Test
void contextLoads() {
try {
Thread.sleep(100000);
} catch (final InterruptedException e) {
Thread.currentThread().interrupt();
}
}
}