diff --git a/src/Entity.d.ts b/src/Entity.d.ts index a391c436..1271b063 100644 --- a/src/Entity.d.ts +++ b/src/Entity.d.ts @@ -20,16 +20,16 @@ export class Entity { * @param includeRemoved Whether a component that is staled to be removed should be also considered */ getComponent>( - Component: ComponentConstructor, - includeRemoved?: boolean - ): C; + Component: ComponentConstructor, + includeRemoved?: boolean + ): Readonly | undefined; /** * Get a component that is slated to be removed from this entity. */ getRemovedComponent>( Component: ComponentConstructor - ): C; + ): Readonly | undefined; /** * Get an object containing all the components on this entity, where the object keys are the component types. @@ -52,7 +52,7 @@ export class Entity { */ getMutableComponent>( Component: ComponentConstructor - ): C; + ): C | undefined; /** * Add a component to the entity. diff --git a/src/Entity.js b/src/Entity.js index 2f9c4057..04aea57d 100644 --- a/src/Entity.js +++ b/src/Entity.js @@ -43,7 +43,11 @@ export class Entity { } getRemovedComponent(Component) { - return this._componentsToRemove[Component._typeId]; + const component = this._componentsToRemove[Component._typeId]; + + return process.env.NODE_ENV !== "production" + ? wrapImmutableComponent(Component, component) + : component; } getComponents() { @@ -60,6 +64,11 @@ export class Entity { getMutableComponent(Component) { var component = this._components[Component._typeId]; + + if (!component) { + return; + } + for (var i = 0; i < this.queries.length; i++) { var query = this.queries[i]; // @todo accelerate this check. Maybe having query._Components as an object diff --git a/test/unit/entity.test.js b/test/unit/entity.test.js index 285c5465..0cf87926 100644 --- a/test/unit/entity.test.js +++ b/test/unit/entity.test.js @@ -193,7 +193,7 @@ test("remove entity", async t => { t.is(world.entityManager.count(), 0); }); -test("get component includeRemoved", async t => { +test("get component development", async t => { var world = new World(); world.registerComponent(FooComponent); @@ -202,16 +202,92 @@ test("get component includeRemoved", async t => { var entity = world.createEntity(); entity.addComponent(FooComponent); const component = entity.getComponent(FooComponent); + + t.throws(() => (component.variableFoo = 4)); + entity.removeComponent(FooComponent); t.is(entity.hasComponent(FooComponent), false); t.is(entity.getComponent(FooComponent), undefined); - t.is(entity.hasRemovedComponent(FooComponent), true); - t.deepEqual(entity.getRemovedComponent(FooComponent), component); + const removedComponent = entity.getComponent(FooComponent, true); + + t.throws(() => (removedComponent.variableFoo = 14)); +}); + +test("get component production", async t => { + const oldNodeEnv = process.env.NODE_ENV; + process.env.NODE_ENV = "production"; + var world = new World(); + + world.registerComponent(FooComponent); + + // Sync + var entity = world.createEntity(); + entity.addComponent(FooComponent); + const component = entity.getComponent(FooComponent); + + t.notThrows(() => (component.variableFoo = 4)); + + entity.removeComponent(FooComponent); + + t.is(entity.hasComponent(FooComponent), false); + t.is(entity.getComponent(FooComponent), undefined); + + const removedComponent = entity.getComponent(FooComponent, true); + + t.notThrows(() => (removedComponent.variableFoo = 14)); + + process.env.NODE_ENV = oldNodeEnv; +}); + +test("get removed component development", async t => { + var world = new World(); + + world.registerComponent(FooComponent); + + // Sync + var entity = world.createEntity(); + entity.addComponent(FooComponent); + entity.removeComponent(FooComponent); + + const component = entity.getRemovedComponent(FooComponent); + + t.throws(() => (component.variableFoo = 4)); +}); + +test("get removed component production", async t => { + const oldNodeEnv = process.env.NODE_ENV; + process.env.NODE_ENV = "production"; + var world = new World(); + + world.registerComponent(FooComponent); + + // Sync + var entity = world.createEntity(); + entity.addComponent(FooComponent); + entity.removeComponent(FooComponent); + + const component = entity.getRemovedComponent(FooComponent); + + t.notThrows(() => (component.variableFoo = 4)); + + process.env.NODE_ENV = oldNodeEnv; +}); + +test("get mutable component", async t => { + var world = new World(); + + world.registerComponent(FooComponent); + + // Sync + var entity = world.createEntity(); + entity.addComponent(FooComponent); + const component = entity.getMutableComponent(FooComponent); + + t.notThrows(() => (component.variableFoo = 4)); - t.is(entity.hasComponent(FooComponent, true), true); - t.deepEqual(entity.getComponent(FooComponent, true), component); + t.deepEqual(entity.getMutableComponent(BarComponent), undefined); }); test("Delete entity from entitiesByNames", async t => {