From 8ffe1db4af09f926d44b221d535210e5a53c6043 Mon Sep 17 00:00:00 2001 From: Brychan Dempsey Date: Mon, 7 Jun 2021 16:26:49 +1200 Subject: [PATCH] Fixed failed creating entities Now throws when too many entities created --- .../ECS.java | 10 +++++-- .../EntityManager.java | 4 +++ .../AppTest.java | 30 +++++++++++++++++-- 3 files changed, 39 insertions(+), 5 deletions(-) diff --git a/javaecs/src/main/java/nz/ac/massey/programming_project_159333_s1_2021/ECS.java b/javaecs/src/main/java/nz/ac/massey/programming_project_159333_s1_2021/ECS.java index 00937ea..b0061e0 100644 --- a/javaecs/src/main/java/nz/ac/massey/programming_project_159333_s1_2021/ECS.java +++ b/javaecs/src/main/java/nz/ac/massey/programming_project_159333_s1_2021/ECS.java @@ -46,11 +46,15 @@ public class ECS { } /** + * /** * Creates a new entity - * @return the id of the new entity + * @return the index of the new entity + * @throws IndexOutOfBoundsException */ - Integer createEntity(){ - return entityManager.addEntity(); + Integer createEntity() throws IndexOutOfBoundsException{ + int newEntity = entityManager.addEntity(); + if (newEntity == -1) throw new IndexOutOfBoundsException("Could not create a new entity"); + return newEntity; } /** diff --git a/javaecs/src/main/java/nz/ac/massey/programming_project_159333_s1_2021/EntityManager.java b/javaecs/src/main/java/nz/ac/massey/programming_project_159333_s1_2021/EntityManager.java index bc9edf6..50999b6 100644 --- a/javaecs/src/main/java/nz/ac/massey/programming_project_159333_s1_2021/EntityManager.java +++ b/javaecs/src/main/java/nz/ac/massey/programming_project_159333_s1_2021/EntityManager.java @@ -65,6 +65,10 @@ class EntityManager{ } public void registerComponent(int component, int entity){ + if (entity >= currentSize){ + System.err.println("Attempted to assign a component to non-existent entity: " + entity); + return; + } entityRegistrations.get(entity).set(component); } diff --git a/javaecs/src/test/java/nz/ac/massey/programming_project_159333_s1_2021/AppTest.java b/javaecs/src/test/java/nz/ac/massey/programming_project_159333_s1_2021/AppTest.java index a883222..e52124e 100644 --- a/javaecs/src/test/java/nz/ac/massey/programming_project_159333_s1_2021/AppTest.java +++ b/javaecs/src/test/java/nz/ac/massey/programming_project_159333_s1_2021/AppTest.java @@ -3,7 +3,9 @@ package nz.ac.massey.programming_project_159333_s1_2021; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertThrows; import java.util.BitSet; @@ -58,8 +60,15 @@ class AppTest { @Test void testAssignMoreThanMax(){ for (int i = 0; i < gameEngine.getMaxEntities() + 5; i++) { - int entity = gameEngine.createEntity(); - gameEngine.addComponent(entity, TestObject.class, new TestObject()); + if (i >= gameEngine.getMaxEntities()){ + assertThrows(IndexOutOfBoundsException.class, () -> { + int entity = gameEngine.createEntity(); + }); + } + else{ + int entity = gameEngine.createEntity(); + gameEngine.addComponent(entity, TestObject.class, new TestObject()); + } } } @@ -135,6 +144,23 @@ class AppTest { gameEngine.resizeMaximum(1024 - 255); } + /** + * Test large creations & deletions & smaller resize, to a value too small + */ + @Test + void testLargeCreateDeleteResizeTooSmall(){ + for (int i = 0; i < gameEngine.getMaxEntities(); i++) { + int entity = gameEngine.createEntity(); + gameEngine.addComponent(entity, TestObject.class, new TestObject()); + assertEquals(1, ((TestObject)gameEngine.getComponentData(entity, TestObject.class)).i); + } + for (int i = 256; i < 512; i++) { + gameEngine.destroyEntity(i); + } + assertFalse(gameEngine.resizeMaximum(512)); + + } + /** * Establish a simple ECS, with a single system and component