From 92bdb5410824caf9eccba61319d8438091e45298 Mon Sep 17 00:00:00 2001 From: austin Date: Thu, 29 May 2025 11:23:34 -0400 Subject: [PATCH] fix most tests --- docs/src/progress/renderertodo.md | 3 + .../loadingthreads/ViewportLoading.java | 4 + .../server/service/LODEmitterService.java | 26 ++++++ .../state/equip/ServerEquipStateTests.java | 11 ++- .../state/inventory/InventoryUtilsTests.java | 84 +++++++++++-------- .../entity/types/item/ItemUtilsTests.java | 15 ++-- 6 files changed, 103 insertions(+), 40 deletions(-) diff --git a/docs/src/progress/renderertodo.md b/docs/src/progress/renderertodo.md index 22e001be..c9f1302c 100644 --- a/docs/src/progress/renderertodo.md +++ b/docs/src/progress/renderertodo.md @@ -2050,6 +2050,9 @@ More verbose loading display (05/29/2025) Scaffolding towns and character jobs data +Properly async-ify inventory/item related tests +Fix viewport interaction with lod emitter service +Fix most tests diff --git a/src/main/java/electrosphere/engine/loadingthreads/ViewportLoading.java b/src/main/java/electrosphere/engine/loadingthreads/ViewportLoading.java index 83b79b45..ef115810 100644 --- a/src/main/java/electrosphere/engine/loadingthreads/ViewportLoading.java +++ b/src/main/java/electrosphere/engine/loadingthreads/ViewportLoading.java @@ -40,6 +40,10 @@ public class ViewportLoading { //init realm manager with viewport realm Globals.serverState.realmManager.createViewportRealm(new Vector3d(0,0,0), new Vector3d(16,16,16)); + // + //Disable LOD service + Globals.serverState.lodEmitterService.setDisable(true); + // //connect client to server LoggerInterface.loggerEngine.INFO("run server: " + EngineState.EngineFlags.RUN_SERVER + " run client: " + EngineState.EngineFlags.RUN_CLIENT); diff --git a/src/main/java/electrosphere/server/service/LODEmitterService.java b/src/main/java/electrosphere/server/service/LODEmitterService.java index 5b7b6093..b44c59d9 100644 --- a/src/main/java/electrosphere/server/service/LODEmitterService.java +++ b/src/main/java/electrosphere/server/service/LODEmitterService.java @@ -35,6 +35,11 @@ public class LODEmitterService extends SignalServiceImpl { */ private ReentrantLock lock = new ReentrantLock(); + /** + * Disables lod checking (always returns that everything is full LOD) + */ + private boolean disable; + /** * Creates the LOD emitter service */ @@ -95,6 +100,9 @@ public class LODEmitterService extends SignalServiceImpl { * @return true if it is full lod, false otherwise */ public boolean isFullLod(Vector3d position){ + if(this.disable){ + return true; + } for(Entity emitter : this.getEmitters()){ Vector3d emitterLoc = EntityUtils.getPosition(emitter); double dist = position.distance(emitterLoc); @@ -110,5 +118,23 @@ public class LODEmitterService extends SignalServiceImpl { } return false; } + + /** + * Gets the disabled status of the lod emitter service + * @return true if it is disabled, false otherwise + */ + public boolean getDisable() { + return disable; + } + + /** + * Sets the disabled status of the lod emitter service + * @param disable true to disable it, false otherwise + */ + public void setDisable(boolean disable) { + this.disable = disable; + } + + } diff --git a/src/test/java/electrosphere/entity/state/equip/ServerEquipStateTests.java b/src/test/java/electrosphere/entity/state/equip/ServerEquipStateTests.java index 832f6f00..5ee96b79 100644 --- a/src/test/java/electrosphere/entity/state/equip/ServerEquipStateTests.java +++ b/src/test/java/electrosphere/entity/state/equip/ServerEquipStateTests.java @@ -1,5 +1,6 @@ package electrosphere.entity.state.equip; +import static electrosphere.test.testutils.Assertions.assertEventually; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -42,7 +43,10 @@ public class ServerEquipStateTests extends EntityTestTemplate { serverEquipState.commandAttemptEquip(inInventoryItem, serverEquipState.getEquipPoint("handsCombined")); //propagate to client - TestEngineUtils.simulateFrames(2); + assertEventually(() -> { + List children = AttachUtils.getChildrenList(creature); + return children.size() == 1; + }); // //verify was equipped @@ -75,7 +79,10 @@ public class ServerEquipStateTests extends EntityTestTemplate { serverEquipState.commandAttemptEquip(inInventoryItem, serverEquipState.getEquipPoint("handsCombined")); //render a frame so network propagates to client - TestEngineUtils.simulateFrames(1); + assertEventually(() -> { + List children = AttachUtils.getChildrenList(creature); + return children.size() == 1; + }); //attempt to equip second katana Entity inInventoryItem2 = ServerInventoryState.attemptStoreItemAnyInventory(creature, katana2); diff --git a/src/test/java/electrosphere/entity/state/inventory/InventoryUtilsTests.java b/src/test/java/electrosphere/entity/state/inventory/InventoryUtilsTests.java index 595e3d2e..1a9dbed1 100644 --- a/src/test/java/electrosphere/entity/state/inventory/InventoryUtilsTests.java +++ b/src/test/java/electrosphere/entity/state/inventory/InventoryUtilsTests.java @@ -1,5 +1,6 @@ package electrosphere.entity.state.inventory; +import static electrosphere.test.testutils.Assertions.assertEventually; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertNotNull; @@ -35,13 +36,17 @@ public class InventoryUtilsTests extends EntityTestTemplate { Entity katana = ItemUtils.serverSpawnBasicItem(Globals.serverState.realmManager.first(), new Vector3d(0,0,0), "Katana2H"); //wait for entities to propagate to client - TestEngineUtils.simulateFrames(1); + assertEventually(() -> { + Set localCreatureSet = Globals.clientState.clientSceneWrapper.getScene().getEntitiesWithTag(EntityTags.CREATURE); + return localCreatureSet.size() == 1; + }); + assertEventually(() -> { + Set localItemSet = Globals.clientState.clientSceneWrapper.getScene().getEntitiesWithTag(EntityTags.ITEM); + return localItemSet.size() == 1; + }); //verify the client got the extra entities Set clientSideCreatures = Globals.clientState.clientSceneWrapper.getScene().getEntitiesWithTag(EntityTags.CREATURE); - assertEquals(1, clientSideCreatures.size()); - Set clientSideItems = Globals.clientState.clientSceneWrapper.getScene().getEntitiesWithTag(EntityTags.ITEM); - assertEquals(1, clientSideItems.size()); //grab player entity Entity clientCreature = clientSideCreatures.iterator().next(); @@ -51,23 +56,26 @@ public class InventoryUtilsTests extends EntityTestTemplate { //attempt to store ClientInventoryState.clientAttemptStoreItem(clientCreature, clientKatana); - //propagate to client - TestEngineUtils.simulateFrames(2); + //wait for the store to propagate + assertEventually(() -> { + Set localCreatureSet = Globals.clientState.clientSceneWrapper.getScene().getEntitiesWithTag(EntityTags.CREATURE); + return localCreatureSet.size() == 1; + }); + assertEventually(() -> { + Set localItemSet = Globals.clientState.clientSceneWrapper.getScene().getEntitiesWithTag(EntityTags.ITEM); + return localItemSet.size() == 1; + }); //verify we still have everything clientSideCreatures = Globals.clientState.clientSceneWrapper.getScene().getEntitiesWithTag(EntityTags.CREATURE); - assertEquals(1, clientSideCreatures.size()); - clientSideItems = Globals.clientState.clientSceneWrapper.getScene().getEntitiesWithTag(EntityTags.ITEM); - assertEquals(1, clientSideItems.size()); - //grab the item in particular - Entity child = clientSideItems.iterator().next(); - // //verify was created properly - assertTrue(ItemUtils.isItem(child)); - assertTrue(ItemUtils.isWeapon(child)); - assertNotNull(ItemUtils.getContainingParent(child)); + assertEventually(() -> { + Set localItemSet = Globals.clientState.clientSceneWrapper.getScene().getEntitiesWithTag(EntityTags.ITEM); + Entity localChild = localItemSet.iterator().next(); + return ItemUtils.isItem(localChild) && ItemUtils.isWeapon(localChild) && ItemUtils.getContainingParent(localChild) != null; + }); // //verify the item is stored in the inventory properly @@ -88,15 +96,17 @@ public class InventoryUtilsTests extends EntityTestTemplate { Entity katana = ItemUtils.serverSpawnBasicItem(Globals.serverState.realmManager.first(), new Vector3d(0,0,0), "Katana2H"); //wait for entities to propagate to client - TestEngineUtils.simulateFrames(1); - - //verify the client got the extra entities - Set clientSideCreatures = Globals.clientState.clientSceneWrapper.getScene().getEntitiesWithTag(EntityTags.CREATURE); - assertEquals(1, clientSideCreatures.size()); - Set clientSideItems = Globals.clientState.clientSceneWrapper.getScene().getEntitiesWithTag(EntityTags.ITEM); - assertEquals(1, clientSideItems.size()); + assertEventually(() -> { + Set localCreatureSet = Globals.clientState.clientSceneWrapper.getScene().getEntitiesWithTag(EntityTags.CREATURE); + return localCreatureSet.size() == 1; + }); + assertEventually(() -> { + Set localItemSet = Globals.clientState.clientSceneWrapper.getScene().getEntitiesWithTag(EntityTags.ITEM); + return localItemSet.size() == 1; + }); //grab player entity + Set clientSideCreatures = Globals.clientState.clientSceneWrapper.getScene().getEntitiesWithTag(EntityTags.CREATURE); Entity clientCreature = clientSideCreatures.iterator().next(); Entity clientKatana = TestEngineUtils.getClientEquivalent(katana); Globals.clientState.playerEntity = clientCreature; @@ -104,16 +114,25 @@ public class InventoryUtilsTests extends EntityTestTemplate { //attempt to store ClientInventoryState.clientAttemptStoreItem(clientCreature, clientKatana); - //allow time for client->server->client communication - TestEngineUtils.simulateFrames(2); + //wait for item to store + assertEventually(() -> { + Set localItemSet = Globals.clientState.clientSceneWrapper.getScene().getEntitiesWithTag(EntityTags.ITEM); + Entity localChild = localItemSet.iterator().next(); + return ItemUtils.isItem(localChild) && ItemUtils.isWeapon(localChild) && ItemUtils.getContainingParent(localChild) != null; + }); //attempt to eject + Set clientSideItems = Globals.clientState.clientSceneWrapper.getScene().getEntitiesWithTag(EntityTags.ITEM); clientSideItems = Globals.clientState.clientSceneWrapper.getScene().getEntitiesWithTag(EntityTags.ITEM); clientKatana = clientSideItems.iterator().next(); ClientInventoryState.clientAttemptEjectItem(clientCreature, clientKatana); - //allow time for client->server->client communication - TestEngineUtils.simulateFrames(2); + //wait for item to eject + assertEventually(() -> { + Set localItemSet = Globals.clientState.clientSceneWrapper.getScene().getEntitiesWithTag(EntityTags.ITEM); + Entity localChild = localItemSet.iterator().next(); + return ItemUtils.isItem(localChild) && ItemUtils.isWeapon(localChild) && ItemUtils.getContainingParent(localChild) == null; + }); //verify we still have everything clientSideCreatures = Globals.clientState.clientSceneWrapper.getScene().getEntitiesWithTag(EntityTags.CREATURE); @@ -148,15 +167,13 @@ public class InventoryUtilsTests extends EntityTestTemplate { TestEngineUtils.spawnPlayerEntity(); //wait for entities to propagate to client - TestEngineUtils.simulateFrames(1); - - //verify the client got the extra entities - Set clientSideCreatures = Globals.clientState.clientSceneWrapper.getScene().getEntitiesWithTag(EntityTags.CREATURE); - assertEquals(1, clientSideCreatures.size()); - Set clientSideItems = Globals.clientState.clientSceneWrapper.getScene().getEntitiesWithTag(EntityTags.ITEM); - assertEquals(0, clientSideItems.size()); + assertEventually(() -> { + Set localCreatureSet = Globals.clientState.clientSceneWrapper.getScene().getEntitiesWithTag(EntityTags.CREATURE); + return localCreatureSet.size() == 1; + }); //grab player entity + Set clientSideCreatures = Globals.clientState.clientSceneWrapper.getScene().getEntitiesWithTag(EntityTags.CREATURE); Entity clientCreature = clientSideCreatures.iterator().next(); Globals.clientState.playerEntity = clientCreature; @@ -165,6 +182,7 @@ public class InventoryUtilsTests extends EntityTestTemplate { //verify we still have everything clientSideCreatures = Globals.clientState.clientSceneWrapper.getScene().getEntitiesWithTag(EntityTags.CREATURE); + Set clientSideItems = Globals.clientState.clientSceneWrapper.getScene().getEntitiesWithTag(EntityTags.ITEM); assertEquals(1, clientSideCreatures.size()); clientSideItems = Globals.clientState.clientSceneWrapper.getScene().getEntitiesWithTag(EntityTags.ITEM); assertEquals(1, clientSideItems.size()); diff --git a/src/test/java/electrosphere/entity/types/item/ItemUtilsTests.java b/src/test/java/electrosphere/entity/types/item/ItemUtilsTests.java index 34f1f209..efde120f 100644 --- a/src/test/java/electrosphere/entity/types/item/ItemUtilsTests.java +++ b/src/test/java/electrosphere/entity/types/item/ItemUtilsTests.java @@ -1,5 +1,6 @@ package electrosphere.entity.types.item; +import static electrosphere.test.testutils.Assertions.assertEventually; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertNull; @@ -35,13 +36,14 @@ public class ItemUtilsTests extends EntityTestTemplate { TestEngineUtils.spawnPlayerEntity(); //wait for entities to propagate to client - TestEngineUtils.simulateFrames(1); + assertEventually(() -> { + Set localCreatureSet = Globals.clientState.clientSceneWrapper.getScene().getEntitiesWithTag(EntityTags.CREATURE); + return localCreatureSet.size() == 1; + }); //verify the client got the extra entities Set clientSideCreatures = Globals.clientState.clientSceneWrapper.getScene().getEntitiesWithTag(EntityTags.CREATURE); - assertEquals(1, clientSideCreatures.size()); Set clientSideItems = Globals.clientState.clientSceneWrapper.getScene().getEntitiesWithTag(EntityTags.ITEM); - assertEquals(0, clientSideItems.size()); //get server equivalent of client entity Entity serverEquivalent = TestEngineUtils.getServerEquivalent(clientSideCreatures.iterator().next()); @@ -59,9 +61,12 @@ public class ItemUtilsTests extends EntityTestTemplate { //verify we still have everything clientSideCreatures = Globals.clientState.clientSceneWrapper.getScene().getEntitiesWithTag(EntityTags.CREATURE); - assertEquals(1, clientSideCreatures.size()); clientSideItems = Globals.clientState.clientSceneWrapper.getScene().getEntitiesWithTag(EntityTags.ITEM); - assertEquals(1, clientSideItems.size()); + assertEventually(() -> { + Set localItemSet = Globals.clientState.clientSceneWrapper.getScene().getEntitiesWithTag(EntityTags.ITEM); + Entity child = localItemSet.iterator().next(); + return ItemUtils.getContainingParent(child) != null; + }); //grab the item in particular Entity child = clientSideItems.iterator().next();