Fixed failed creating entities

Now throws when too many entities created
This commit is contained in:
Brychan Dempsey 2021-06-07 16:26:49 +12:00
parent cfd397e10a
commit 8ffe1db4af
3 changed files with 39 additions and 5 deletions

View File

@ -46,11 +46,15 @@ public class ECS {
} }
/** /**
* /**
* Creates a new entity * Creates a new entity
* @return the id of the new entity * @return the index of the new entity
* @throws IndexOutOfBoundsException
*/ */
Integer createEntity(){ Integer createEntity() throws IndexOutOfBoundsException{
return entityManager.addEntity(); int newEntity = entityManager.addEntity();
if (newEntity == -1) throw new IndexOutOfBoundsException("Could not create a new entity");
return newEntity;
} }
/** /**

View File

@ -65,6 +65,10 @@ class EntityManager{
} }
public void registerComponent(int component, int entity){ 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); entityRegistrations.get(entity).set(component);
} }

View File

@ -3,7 +3,9 @@ package nz.ac.massey.programming_project_159333_s1_2021;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals; 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.assertNull;
import static org.junit.jupiter.api.Assertions.assertThrows;
import java.util.BitSet; import java.util.BitSet;
@ -58,8 +60,15 @@ class AppTest {
@Test @Test
void testAssignMoreThanMax(){ void testAssignMoreThanMax(){
for (int i = 0; i < gameEngine.getMaxEntities() + 5; i++) { for (int i = 0; i < gameEngine.getMaxEntities() + 5; i++) {
int entity = gameEngine.createEntity(); if (i >= gameEngine.getMaxEntities()){
gameEngine.addComponent(entity, TestObject.class, new TestObject()); 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); 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 * Establish a simple ECS, with a single system and component