From b1670625854019657545fb91871b942b78954dd1 Mon Sep 17 00:00:00 2001 From: austin Date: Tue, 11 Apr 2023 17:56:11 -0400 Subject: [PATCH] Scaffolding for various unit tests --- assets/Data/creatures/elf.json | 2 +- assets/Data/creatures/human.json | 2 +- assets/Data/creatures/test.json | 2 +- .../java/electrosphere/engine/Globals.java | 4 + src/main/java/electrosphere/engine/Main.java | 34 ++- .../electrosphere/engine/cli/CLIParser.java | 12 +- src/main/java/electrosphere/entity/Scene.java | 8 + .../electrosphere/logger/LoggerInterface.java | 14 +- src/main/java/electrosphere/net/NetUtils.java | 8 +- .../java/electrosphere/net/server/Server.java | 5 + .../electrosphere/script/ScriptEngine.java | 5 +- .../main/sql}/auth/createAuthTables.sql | 0 .../main/sql}/auth/retrievePassHash.sql | 0 .../sql}/character/createCharacterTables.sql | 0 {Scripts => src/main/sql}/clearTables.sql | 0 {Scripts => src/main/sql}/createTables.sql | 0 .../main/sql}/structs/createStruct.sql | 0 .../main/sql}/structs/createStructsTables.sql | 0 .../main/sql}/structs/deleteStruct.sql | 0 .../main/sql}/structs/getStructDataByID.sql | 0 .../main/sql}/structs/getStructLocalPos.sql | 0 .../sql}/structs/getStructsAtWorldPos.sql | 0 .../main/sql}/towns/createTown.sql | 0 .../main/sql}/towns/createTownsTables.sql | 0 .../main/sql}/towns/deleteTown.sql | 0 .../main/sql}/towns/getTownsAtWorldPos.sql | 0 src/test/java/StartupTest.java | 22 -- src/test/java/TestRunner.java | 35 ++- src/test/java/db/DBTest.java | 5 + src/test/java/entity/InventoryStateTest.java | 5 + src/test/java/entity/LifeStateTest.java | 5 + .../java/entity/SpawningCreaturesTest.java | 46 ++++ src/test/java/networking/NetworkingTest.java | 5 + src/test/java/physics/PhysicsTest.java | 5 + src/test/java/script/ScriptTest.java | 5 + src/test/java/startup/StartupTest.java | 36 +++ src/test/java/testingutils/MainLoop.java | 237 ------------------ src/test/java/testutils/TestEntityUtils.java | 45 ++++ src/test/java/ui/UICreationTest.java | 5 + 39 files changed, 263 insertions(+), 289 deletions(-) rename {Scripts => src/main/sql}/auth/createAuthTables.sql (100%) rename {Scripts => src/main/sql}/auth/retrievePassHash.sql (100%) rename {Scripts => src/main/sql}/character/createCharacterTables.sql (100%) rename {Scripts => src/main/sql}/clearTables.sql (100%) rename {Scripts => src/main/sql}/createTables.sql (100%) rename {Scripts => src/main/sql}/structs/createStruct.sql (100%) rename {Scripts => src/main/sql}/structs/createStructsTables.sql (100%) rename {Scripts => src/main/sql}/structs/deleteStruct.sql (100%) rename {Scripts => src/main/sql}/structs/getStructDataByID.sql (100%) rename {Scripts => src/main/sql}/structs/getStructLocalPos.sql (100%) rename {Scripts => src/main/sql}/structs/getStructsAtWorldPos.sql (100%) rename {Scripts => src/main/sql}/towns/createTown.sql (100%) rename {Scripts => src/main/sql}/towns/createTownsTables.sql (100%) rename {Scripts => src/main/sql}/towns/deleteTown.sql (100%) rename {Scripts => src/main/sql}/towns/getTownsAtWorldPos.sql (100%) delete mode 100644 src/test/java/StartupTest.java create mode 100644 src/test/java/db/DBTest.java create mode 100644 src/test/java/entity/InventoryStateTest.java create mode 100644 src/test/java/entity/LifeStateTest.java create mode 100644 src/test/java/entity/SpawningCreaturesTest.java create mode 100644 src/test/java/networking/NetworkingTest.java create mode 100644 src/test/java/physics/PhysicsTest.java create mode 100644 src/test/java/script/ScriptTest.java create mode 100644 src/test/java/startup/StartupTest.java delete mode 100644 src/test/java/testingutils/MainLoop.java create mode 100644 src/test/java/testutils/TestEntityUtils.java create mode 100644 src/test/java/ui/UICreationTest.java diff --git a/assets/Data/creatures/elf.json b/assets/Data/creatures/elf.json index f0593759..df8a1dc0 100644 --- a/assets/Data/creatures/elf.json +++ b/assets/Data/creatures/elf.json @@ -323,7 +323,7 @@ "movementStart" : 0, "movementEnd" : 0, "movementGoal" : 0, - "initialMove" : false + "initialMove" : true } ], "healthSystem" : { diff --git a/assets/Data/creatures/human.json b/assets/Data/creatures/human.json index 8832fb17..8ec667e5 100644 --- a/assets/Data/creatures/human.json +++ b/assets/Data/creatures/human.json @@ -323,7 +323,7 @@ "movementStart" : 0, "movementEnd" : 0, "movementGoal" : 0, - "initialMove" : false + "initialMove" : true } ], "healthSystem" : { diff --git a/assets/Data/creatures/test.json b/assets/Data/creatures/test.json index 22435e2f..f97422a4 100644 --- a/assets/Data/creatures/test.json +++ b/assets/Data/creatures/test.json @@ -145,7 +145,7 @@ "movementStart" : 0, "movementEnd" : 0, "movementGoal" : 0, - "initialMove" : false + "initialMove" : true } ], "healthSystem" : { diff --git a/src/main/java/electrosphere/engine/Globals.java b/src/main/java/electrosphere/engine/Globals.java index 2fdbb86d..72940cde 100644 --- a/src/main/java/electrosphere/engine/Globals.java +++ b/src/main/java/electrosphere/engine/Globals.java @@ -309,6 +309,10 @@ public class Globals { + // + //Base engine creation flags + // + public static boolean HEADLESS = false; // diff --git a/src/main/java/electrosphere/engine/Main.java b/src/main/java/electrosphere/engine/Main.java index a0adaefc..c52d57ca 100644 --- a/src/main/java/electrosphere/engine/Main.java +++ b/src/main/java/electrosphere/engine/Main.java @@ -54,6 +54,13 @@ public class Main { //parse command line arguments CLIParser.parseCLIArgs(args); + startUp(); + + mainLoop(); + + } + + public static void startUp(){ //initialize logging interfaces LoggerInterface.initLoggers(); @@ -122,7 +129,7 @@ public class Main { // TerrainViewer.runViewer(); //create the drawing context - if(Globals.RUN_CLIENT){ + if(Globals.RUN_CLIENT && !Globals.HEADLESS){ Globals.renderingEngine = new RenderingEngine(); Globals.renderingEngine.createOpenglContext(); } @@ -150,14 +157,14 @@ public class Main { // } //create the audio context - if(Globals.RUN_CLIENT){ + if(Globals.RUN_CLIENT && !Globals.HEADLESS){ Globals.audioEngine = new AudioEngine(); Globals.audioEngine.init(); // Globals.audioEngine.setGain(0.1f); } //init default resources - if(Globals.RUN_CLIENT){ + if(Globals.RUN_CLIENT && !Globals.HEADLESS){ Globals.initDefaultGraphicalResources(); Globals.initDefaultAudioResources(); } @@ -175,17 +182,19 @@ public class Main { } //recapture the screen for rendering - if(Globals.RUN_CLIENT){ + if(Globals.RUN_CLIENT && !Globals.HEADLESS){ LoggerInterface.loggerStartup.INFO("Recapture screen"); Globals.controlHandler.setShouldRecapture(true); } // RenderUtils.recaptureScreen(); - - /// - /// C A M E R A C R E A T I O N - /// - // Vector3f cameraRotationVector = new Vector3f(); - + } + + public static void mainLoop(){ + mainLoop(0); + } + + public static void mainLoop(long maxFrames){ + //main loop while (running) { @@ -270,6 +279,10 @@ public class Main { } frameCount++; + if(maxFrames > 0 && frameCount > maxFrames){ + running = false; + } + } // @@ -289,7 +302,6 @@ public class Main { if(Globals.RUN_CLIENT){ Globals.audioEngine.shutdown(); } - } public static long getCurrentFrame(){ diff --git a/src/main/java/electrosphere/engine/cli/CLIParser.java b/src/main/java/electrosphere/engine/cli/CLIParser.java index 9a309f38..be389eb3 100644 --- a/src/main/java/electrosphere/engine/cli/CLIParser.java +++ b/src/main/java/electrosphere/engine/cli/CLIParser.java @@ -9,10 +9,14 @@ public class CLIParser { public static void parseCLIArgs(String args[]){ List argList = Arrays.asList(args); - for(String arg : argList){ - if(arg.equals("--headless")){ - Globals.RUN_CLIENT = false; - Globals.RUN_SERVER = true; + for(int i = 0; i < argList.size(); i++){ + String argCurrent = argList.get(i); + switch(argCurrent){ + case "--headless": { + Globals.RUN_CLIENT = false; + Globals.RUN_SERVER = true; + Globals.HEADLESS = true; + } break; } } } diff --git a/src/main/java/electrosphere/entity/Scene.java b/src/main/java/electrosphere/entity/Scene.java index d728a04f..e473f848 100644 --- a/src/main/java/electrosphere/entity/Scene.java +++ b/src/main/java/electrosphere/entity/Scene.java @@ -234,5 +234,13 @@ public class Scene { tree.simulate(deltaTime); } } + + /** + * Gets the list of all entities in the scene + * @return The list of all entities in the scene + */ + public List getEntityList(){ + return entityList; + } } diff --git a/src/main/java/electrosphere/logger/LoggerInterface.java b/src/main/java/electrosphere/logger/LoggerInterface.java index 97d49708..846a33f1 100644 --- a/src/main/java/electrosphere/logger/LoggerInterface.java +++ b/src/main/java/electrosphere/logger/LoggerInterface.java @@ -20,14 +20,14 @@ public class LoggerInterface { public static Logger loggerDB; public static void initLoggers(){ - loggerStartup = new Logger(LogLevel.INFO); - loggerNetworking = new Logger(LogLevel.INFO); - loggerFileIO = new Logger(LogLevel.INFO); - loggerGameLogic = new Logger(LogLevel.INFO); + loggerStartup = new Logger(LogLevel.WARNING); + loggerNetworking = new Logger(LogLevel.WARNING); + loggerFileIO = new Logger(LogLevel.WARNING); + loggerGameLogic = new Logger(LogLevel.WARNING); loggerRenderer = new Logger(LogLevel.WARNING); - loggerEngine = new Logger(LogLevel.INFO); - loggerAuth = new Logger(LogLevel.INFO); - loggerDB = new Logger(LogLevel.INFO); + loggerEngine = new Logger(LogLevel.WARNING); + loggerAuth = new Logger(LogLevel.WARNING); + loggerDB = new Logger(LogLevel.WARNING); loggerStartup.INFO("Initialized loggers"); } } diff --git a/src/main/java/electrosphere/net/NetUtils.java b/src/main/java/electrosphere/net/NetUtils.java index 5a88c28c..f7c305fb 100644 --- a/src/main/java/electrosphere/net/NetUtils.java +++ b/src/main/java/electrosphere/net/NetUtils.java @@ -14,7 +14,7 @@ public class NetUtils { public static final int DEFAULT_PORT = 34251; static int port = DEFAULT_PORT; - static String address = "127.0.0.1"; + static String address = "localhost"; // public static EntityMessage createSpawnEntityMessage(Entity e){ // EntityMessage rVal = EntityMessage.constructCreateMessage(e.getId(), CreatureUtils.getCreatureType(e), 0.0f, 0.0f, 0.0f); @@ -35,6 +35,12 @@ public class NetUtils { return address; } + /** + * Sets the port the program attempts to use + * If the port is set to 0, and it is creating the server, it will create the socket with port 0. + * This causes Java to find any available port. The Server class then re-calls setPort to update the static port with the found port. + * @param port The port to use when doing any networking + */ public static void setPort(int port) { NetUtils.port = port; } diff --git a/src/main/java/electrosphere/net/server/Server.java b/src/main/java/electrosphere/net/server/Server.java index 9cc5cd0e..f6ffd708 100644 --- a/src/main/java/electrosphere/net/server/Server.java +++ b/src/main/java/electrosphere/net/server/Server.java @@ -48,6 +48,11 @@ public class Server implements Runnable{ initServer(); try { serverSocket = new ServerSocket(port); + //if we set port to 0, java searches for any available port to open + //This then explicitly alerts NetUtils of the real port + if(port == 0){ + NetUtils.setPort(serverSocket.getLocalPort()); + } } catch(BindException ex){ System.err.println("Failed to bind server socket!"); ex.printStackTrace(); diff --git a/src/main/java/electrosphere/script/ScriptEngine.java b/src/main/java/electrosphere/script/ScriptEngine.java index e07c608d..8d79f39a 100644 --- a/src/main/java/electrosphere/script/ScriptEngine.java +++ b/src/main/java/electrosphere/script/ScriptEngine.java @@ -6,6 +6,7 @@ import java.util.HashMap; import java.util.Map; import org.graalvm.polyglot.Context; +import org.graalvm.polyglot.Engine; import org.graalvm.polyglot.Source; import org.graalvm.polyglot.Value; @@ -21,8 +22,10 @@ public class ScriptEngine { public void init(){ //init datastructures sourceMap = new HashMap(); + //create engine with flag to disable warning + Engine engine = Engine.newBuilder().option("engine.WarnInterpreterOnly", "false").build(); //create context - context = Context.create("js"); + context = Context.newBuilder("js").engine(engine).build(); //read scripts into source map readScriptsDirectory("/Scripts", FileUtils.getAssetFile("/Scripts")); //create bindings diff --git a/Scripts/auth/createAuthTables.sql b/src/main/sql/auth/createAuthTables.sql similarity index 100% rename from Scripts/auth/createAuthTables.sql rename to src/main/sql/auth/createAuthTables.sql diff --git a/Scripts/auth/retrievePassHash.sql b/src/main/sql/auth/retrievePassHash.sql similarity index 100% rename from Scripts/auth/retrievePassHash.sql rename to src/main/sql/auth/retrievePassHash.sql diff --git a/Scripts/character/createCharacterTables.sql b/src/main/sql/character/createCharacterTables.sql similarity index 100% rename from Scripts/character/createCharacterTables.sql rename to src/main/sql/character/createCharacterTables.sql diff --git a/Scripts/clearTables.sql b/src/main/sql/clearTables.sql similarity index 100% rename from Scripts/clearTables.sql rename to src/main/sql/clearTables.sql diff --git a/Scripts/createTables.sql b/src/main/sql/createTables.sql similarity index 100% rename from Scripts/createTables.sql rename to src/main/sql/createTables.sql diff --git a/Scripts/structs/createStruct.sql b/src/main/sql/structs/createStruct.sql similarity index 100% rename from Scripts/structs/createStruct.sql rename to src/main/sql/structs/createStruct.sql diff --git a/Scripts/structs/createStructsTables.sql b/src/main/sql/structs/createStructsTables.sql similarity index 100% rename from Scripts/structs/createStructsTables.sql rename to src/main/sql/structs/createStructsTables.sql diff --git a/Scripts/structs/deleteStruct.sql b/src/main/sql/structs/deleteStruct.sql similarity index 100% rename from Scripts/structs/deleteStruct.sql rename to src/main/sql/structs/deleteStruct.sql diff --git a/Scripts/structs/getStructDataByID.sql b/src/main/sql/structs/getStructDataByID.sql similarity index 100% rename from Scripts/structs/getStructDataByID.sql rename to src/main/sql/structs/getStructDataByID.sql diff --git a/Scripts/structs/getStructLocalPos.sql b/src/main/sql/structs/getStructLocalPos.sql similarity index 100% rename from Scripts/structs/getStructLocalPos.sql rename to src/main/sql/structs/getStructLocalPos.sql diff --git a/Scripts/structs/getStructsAtWorldPos.sql b/src/main/sql/structs/getStructsAtWorldPos.sql similarity index 100% rename from Scripts/structs/getStructsAtWorldPos.sql rename to src/main/sql/structs/getStructsAtWorldPos.sql diff --git a/Scripts/towns/createTown.sql b/src/main/sql/towns/createTown.sql similarity index 100% rename from Scripts/towns/createTown.sql rename to src/main/sql/towns/createTown.sql diff --git a/Scripts/towns/createTownsTables.sql b/src/main/sql/towns/createTownsTables.sql similarity index 100% rename from Scripts/towns/createTownsTables.sql rename to src/main/sql/towns/createTownsTables.sql diff --git a/Scripts/towns/deleteTown.sql b/src/main/sql/towns/deleteTown.sql similarity index 100% rename from Scripts/towns/deleteTown.sql rename to src/main/sql/towns/deleteTown.sql diff --git a/Scripts/towns/getTownsAtWorldPos.sql b/src/main/sql/towns/getTownsAtWorldPos.sql similarity index 100% rename from Scripts/towns/getTownsAtWorldPos.sql rename to src/main/sql/towns/getTownsAtWorldPos.sql diff --git a/src/test/java/StartupTest.java b/src/test/java/StartupTest.java deleted file mode 100644 index b7096ec6..00000000 --- a/src/test/java/StartupTest.java +++ /dev/null @@ -1,22 +0,0 @@ -import junit.framework.TestCase; -import testingutils.MainLoop; - -public class StartupTest extends TestCase { - - public void testStartupHeadless(){ - System.out.println("[Test] Startup Headless"); - MainLoop.startup(true); - MainLoop.timedMainLoop(3); - } - - public void testStartupGUI(){ - System.out.println("[Test] Startup GUI"); - MainLoop.startup(false); - MainLoop.timedMainLoop(10); - } - - public void testEmpty() { - - } - -} diff --git a/src/test/java/TestRunner.java b/src/test/java/TestRunner.java index 0ca25822..141ba19a 100644 --- a/src/test/java/TestRunner.java +++ b/src/test/java/TestRunner.java @@ -1,13 +1,42 @@ +import java.util.Arrays; +import java.util.LinkedList; +import java.util.List; + import org.junit.runner.JUnitCore; import org.junit.runner.Result; import org.junit.runner.notification.Failure; +import entity.SpawningCreaturesTest; +import startup.StartupTest; + public class TestRunner { + + static final List classes = Arrays.asList(new Class[]{ + StartupTest.class, + SpawningCreaturesTest.class, + }); + public static void main(String[] args){ - Result result = JUnitCore.runClasses(StartupTest.class); - for(Failure failure : result.getFailures()){ + + boolean success = true; + List failures = new LinkedList(); + + //run tests + for(Class classObject : classes){ + System.out.println("CLASS " + classObject.descriptorString()); + Result result = JUnitCore.runClasses(classObject); + for(Failure failure : result.getFailures()){ + failures.add(failure); + } + success = success && result.wasSuccessful(); + } + + //print failures + for(Failure failure : failures){ System.out.println(failure); } - System.out.println("Testing was successful: " + result.wasSuccessful()); + + System.out.println("Testing was successful: " + success); } + } diff --git a/src/test/java/db/DBTest.java b/src/test/java/db/DBTest.java new file mode 100644 index 00000000..666cd098 --- /dev/null +++ b/src/test/java/db/DBTest.java @@ -0,0 +1,5 @@ +package db; + +public class DBTest { + +} diff --git a/src/test/java/entity/InventoryStateTest.java b/src/test/java/entity/InventoryStateTest.java new file mode 100644 index 00000000..ff64c5f1 --- /dev/null +++ b/src/test/java/entity/InventoryStateTest.java @@ -0,0 +1,5 @@ +package entity; + +public class InventoryStateTest { + +} diff --git a/src/test/java/entity/LifeStateTest.java b/src/test/java/entity/LifeStateTest.java new file mode 100644 index 00000000..170d56e7 --- /dev/null +++ b/src/test/java/entity/LifeStateTest.java @@ -0,0 +1,5 @@ +package entity; + +public class LifeStateTest { + +} diff --git a/src/test/java/entity/SpawningCreaturesTest.java b/src/test/java/entity/SpawningCreaturesTest.java new file mode 100644 index 00000000..2035b8af --- /dev/null +++ b/src/test/java/entity/SpawningCreaturesTest.java @@ -0,0 +1,46 @@ +package entity; + +import org.joml.Vector3d; +import org.junit.Before; +import org.junit.Test; + +import electrosphere.engine.Globals; +import electrosphere.engine.Main; +import electrosphere.entity.types.creature.CreatureUtils; +import electrosphere.net.NetUtils; +import testutils.TestEntityUtils; + +public class SpawningCreaturesTest { + + @Before + public void initEngine(){ + System.out.println("[Test] Spawn many creatures"); + Globals.RUN_CLIENT = false; + Globals.RUN_SERVER = true; + Globals.HEADLESS = true; + NetUtils.setPort(0); + Main.startUp(); + } + + // @Test + // public void testSpawnCreature(){ + // System.out.println("[Test] Spawn creature"); + // Globals.RUN_CLIENT = false; + // Globals.RUN_SERVER = true; + // NetUtils.setPort(0); + // Main.startUp(); + // CreatureUtils.spawnBasicCreature("human", null); + // Main.mainLoop(1); + // assert TestEntityUtils.numberOfEntitiesInBox(new Vector3d(-1,-1,-1),new Vector3d(1,1,1)) == 1; + // } + + @Test + public void testSpawnMultipleCreatures(){ + for(int i = 0; i < 100; i++){ + CreatureUtils.spawnBasicCreature("human", null); + } + Main.mainLoop(1); + assert TestEntityUtils.numberOfEntitiesInBox(new Vector3d(-1,-1,-1),new Vector3d(1,1,1)) == 100; + } + +} diff --git a/src/test/java/networking/NetworkingTest.java b/src/test/java/networking/NetworkingTest.java new file mode 100644 index 00000000..e7e4a378 --- /dev/null +++ b/src/test/java/networking/NetworkingTest.java @@ -0,0 +1,5 @@ +package networking; + +public class NetworkingTest { + +} diff --git a/src/test/java/physics/PhysicsTest.java b/src/test/java/physics/PhysicsTest.java new file mode 100644 index 00000000..ebfe64cb --- /dev/null +++ b/src/test/java/physics/PhysicsTest.java @@ -0,0 +1,5 @@ +package physics; + +public class PhysicsTest { + +} diff --git a/src/test/java/script/ScriptTest.java b/src/test/java/script/ScriptTest.java new file mode 100644 index 00000000..c8411719 --- /dev/null +++ b/src/test/java/script/ScriptTest.java @@ -0,0 +1,5 @@ +package script; + +public class ScriptTest { + +} diff --git a/src/test/java/startup/StartupTest.java b/src/test/java/startup/StartupTest.java new file mode 100644 index 00000000..47c3f6dd --- /dev/null +++ b/src/test/java/startup/StartupTest.java @@ -0,0 +1,36 @@ +package startup; +import org.junit.Test; + +import electrosphere.engine.Globals; +import electrosphere.engine.Main; +import electrosphere.net.NetUtils; +import junit.framework.TestCase; + +public class StartupTest extends TestCase { + + @Test + public void testStartupHeadless(){ + System.out.println("[Test] Startup Headless"); + Globals.RUN_CLIENT = false; + Globals.RUN_SERVER = true; + NetUtils.setPort(0); + Main.startUp(); + Main.mainLoop(1); + } + + @Test + public void testStartupGUI(){ + System.out.println("[Test] Startup GUI"); + Globals.RUN_CLIENT = false; + Globals.RUN_SERVER = true; + NetUtils.setPort(0); + Main.startUp(); + Main.mainLoop(1); + } + + @Test + public void testEmpty() { + System.out.println("[Test] Empty test"); + } + +} diff --git a/src/test/java/testingutils/MainLoop.java b/src/test/java/testingutils/MainLoop.java deleted file mode 100644 index 9f2a8558..00000000 --- a/src/test/java/testingutils/MainLoop.java +++ /dev/null @@ -1,237 +0,0 @@ -package testingutils; - -import static org.lwjgl.glfw.GLFW.glfwGetTime; - -import java.util.concurrent.TimeUnit; - -import electrosphere.audio.AudioEngine; -import electrosphere.controls.ControlHandler; -import electrosphere.engine.Globals; -import electrosphere.engine.LoadingThread; -import electrosphere.engine.cli.CLIParser; -import electrosphere.game.client.ClientFunctions; -import electrosphere.game.config.UserSettings; -import electrosphere.logger.LoggerInterface; -import electrosphere.renderer.RenderingEngine; - -public class MainLoop { - - // - //Visualization Controls - // - //These are used in calculating the time between frames for visualization (camera) control and such - static double deltaTime = 0.0f; - static double lastFrame = 0.0f; - static long frameCount = 0; - public static float deltaFrames = 0; - - //target amount of time per frame - public static float targetFrameRate = 60.0f; - static float targetFramePeriod = 1.0f/targetFrameRate; - - //framestep variable - static int framestep = 2; - - - public static void startup(boolean headless){ - - // - // - // I N I T I A L I Z A T I O N - // - // - - //parse command line arguments - String[] args = new String[]{ - "Renderer" - }; - CLIParser.parseCLIArgs(args); - - //initialize logging interfaces - LoggerInterface.initLoggers(); - - //load user settings - UserSettings.loadUserSettings(); - - //controls - if(Globals.RUN_CLIENT){ - initControlHandler(); - } - - //init global variables - Globals.initGlobals(); - - //create the drawing context - if(Globals.RUN_CLIENT && !headless){ - Globals.renderingEngine = new RenderingEngine(); - Globals.renderingEngine.createOpenglContext(); - } - - //create the audio context - if(Globals.RUN_CLIENT && !headless){ - Globals.audioEngine = new AudioEngine(); - Globals.audioEngine.init(); - // Globals.audioEngine.setGain(0.1f); - } - - //init default resources - if(Globals.RUN_CLIENT && !headless){ - Globals.initDefaultGraphicalResources(); - Globals.initDefaultAudioResources(); - } - - //fire off a loading thread for the title menus/screen - LoggerInterface.loggerStartup.INFO("Fire off loading thread"); - if(Globals.RUN_CLIENT){ - LoadingThread serverThread = new LoadingThread(LoadingThread.LOAD_TITLE_MENU); - Globals.loadingThreadsList.add(serverThread); - serverThread.start(); - } else { - LoadingThread clientThread = new LoadingThread(LoadingThread.LOAD_ARENA); - Globals.loadingThreadsList.add(clientThread); - clientThread.start(); - } - - //recapture the screen for rendering - if(Globals.RUN_CLIENT){ - LoggerInterface.loggerStartup.INFO("Recapture screen"); - Globals.controlHandler.setShouldRecapture(true); - } - } - - public static void initControlHandler(){ - LoggerInterface.loggerStartup.INFO("Initialize control handler"); - Globals.controlHandler = ControlHandler.generateExampleControlsMap(); - Globals.controlHandler.setCallbacks(); - } - - - public static void run(MainLoop.MainLoopHaltingCallback haltingCallback){ - - - //main loop - while (haltingCallback.shouldRun()) { - - /* - Frame calculation - */ - double currentTime = glfwGetTime(); - deltaTime = currentTime - lastFrame; - deltaFrames = targetFrameRate * (float)deltaTime; - lastFrame = currentTime; - - - /// - /// A S S E T M A N A G E R S T U F F - /// - if(Globals.RUN_CLIENT){ - Globals.assetManager.loadAssetsInQueue(); - } - - - - - /// - /// C L I E N T N E T W O R K I N G S T U F F - /// - //Why is this its own function? Just to get the networking code out of main() - if(Globals.RUN_CLIENT && Globals.clientConnection != null){ - Globals.clientConnection.parseMessages(); - } - - - //handle framestep - if(framestep == 1){ - framestep = 0; - } - - - /// - /// I N P U T C O N T R O L S - /// - //Poll controls - if(Globals.RUN_CLIENT){ - Globals.controlHandler.pollControls(); - Globals.controlHandler.recaptureIfNecessary(); - } - - - - /// - /// C L I E N T S I M U L A T I O N S T U F F - /// - if(Globals.RUN_CLIENT && framestep > 0){ - ClientFunctions.runBeforeSimulationFunctions(); - } - if(Globals.microSimulation != null && Globals.microSimulation.isReady() && framestep > 0){ - Globals.microSimulation.simulate(); - } - if(Globals.RUN_CLIENT && framestep > 0){ - ClientFunctions.runClientFunctions(); - } - - /// - /// M A C R O S I M U L A T I O N S T U F F - /// - if(Globals.macroSimulation != null && Globals.macroSimulation.isReady() && framestep > 0){ - Globals.macroSimulation.simulate(); - } - - - if(Globals.RUN_CLIENT){ - Globals.renderingEngine.drawScreen(); - } - - if(deltaTime < targetFramePeriod){ - sleep((int)(1000.0 * (targetFramePeriod - deltaTime))); - } else { - sleep(1); - } - frameCount++; - - } - } - - static void sleep(int i) { - try { - TimeUnit.MILLISECONDS.sleep(i); - } catch (InterruptedException ex) { - System.out.println("Sleep somehow interrupted?!"); - } - } - - static boolean shouldRun = true; - - public static void timedMainLoop(int seconds){ - - Thread stopMainLoopThread = new Thread(new Runnable() { - @Override - public void run() { - try { - TimeUnit.SECONDS.sleep(3); - } catch (InterruptedException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - shouldRun = false; - }}); - stopMainLoopThread.start(); - - Globals.RUN_CLIENT = false; - - MainLoopHaltingCallback haltingCallback = new MainLoop.MainLoopHaltingCallback() { - @Override - public boolean shouldRun() { - return shouldRun; - }}; - - MainLoop.run(haltingCallback); - } - - public static abstract class MainLoopHaltingCallback { - - public abstract boolean shouldRun(); - - } - -} diff --git a/src/test/java/testutils/TestEntityUtils.java b/src/test/java/testutils/TestEntityUtils.java new file mode 100644 index 00000000..71e9750f --- /dev/null +++ b/src/test/java/testutils/TestEntityUtils.java @@ -0,0 +1,45 @@ +package testutils; + +import org.joml.Vector3d; + +import electrosphere.engine.Globals; +import electrosphere.entity.Entity; +import electrosphere.entity.EntityUtils; + +public class TestEntityUtils { + + /** + * Returns the number of entities in the bounding box defined by boxMin and boxMax, noninclusive. + * @param boxMin The minimum point for the bounding box + * @param boxMax The maximum point for the bounding box + * @return The number of entities in the bounding box + */ + public static int numberOfEntitiesInBox(Vector3d boxMin, Vector3d boxMax){ + double minX = boxMin.x < boxMax.x ? boxMin.x : boxMax.x; + double minY = boxMin.y < boxMax.y ? boxMin.y : boxMax.y; + double minZ = boxMin.z < boxMax.z ? boxMin.z : boxMax.z; + double maxX = boxMin.x > boxMax.x ? boxMin.x : boxMax.x; + double maxY = boxMin.y > boxMax.y ? boxMin.y : boxMax.y; + double maxZ = boxMin.z > boxMax.z ? boxMin.z : boxMax.z; + + int accumulator = 0; + + for(Entity entity : Globals.entityManager.getEntityList()){ + if(EntityUtils.getPosition(entity) != null){ + Vector3d position = EntityUtils.getPosition(entity); + if( + position.x > minX && + position.x < maxX && + position.y > minY && + position.y < maxY && + position.z > minZ && + position.z < maxZ + ){ + accumulator++; + } + } + } + return accumulator; + } + +} diff --git a/src/test/java/ui/UICreationTest.java b/src/test/java/ui/UICreationTest.java new file mode 100644 index 00000000..669da6e6 --- /dev/null +++ b/src/test/java/ui/UICreationTest.java @@ -0,0 +1,5 @@ +package ui; + +public class UICreationTest { + +}