From b03a6ddf64f2e801b137df180636b4a3e5161a48 Mon Sep 17 00:00:00 2001 From: Marco Alka Date: Fri, 9 Feb 2024 01:06:48 +0100 Subject: [PATCH] add more entity unit tests --- src/entity/entity.spec.ts | 8 ++++ src/entity/entity.test.ts | 92 +++++++++++++++++++++++++++++++++++++++ src/entity/entity.ts | 17 ++++++++ 3 files changed, 117 insertions(+) diff --git a/src/entity/entity.spec.ts b/src/entity/entity.spec.ts index 50526fd..7c79328 100644 --- a/src/entity/entity.spec.ts +++ b/src/entity/entity.spec.ts @@ -81,6 +81,14 @@ export interface IReadOnlyEntity { */ hasComponent(component: typeof Object | TObjectProto): boolean + /** + * Check if an event listener already exists on the entity + * Mostly intersting for testing the lib + * @param event + * @param handler + */ + hasEventListener(event: T, handler: IEventMap[T]): void + /** * Check if this entity has a given tag * @param tag diff --git a/src/entity/entity.test.ts b/src/entity/entity.test.ts index 64153c4..7c51246 100644 --- a/src/entity/entity.test.ts +++ b/src/entity/entity.test.ts @@ -10,6 +10,14 @@ describe('Test Entity', () => { assert.equal(Array.from(entity.getComponents()).length, 1); }); + it('addTag', () => { + const entity = new Entity(); + const tag = 'TEST'; + + entity.addTag(tag); + assert.equal(entity.getTagCount(), 1); + }); + it('clone', () => { const component = { a: 42 }; const entity = new Entity('1'); @@ -31,6 +39,69 @@ describe('Test Entity', () => { assert.equal(entity.getTags().next().value, clonedEntity.getTags().next().value); }); + it('getComponent', () => { + const entity = new Entity(); + + entity.addComponent(new Number(0)); + assert.equal(entity.getComponent(Number).toString(), '0'); + + entity.addComponent(new Date()); + assert.instanceOf(entity.getComponent(Date), Date); + }); + + it('getTag', () => { + const entity = new Entity(); + const tag = 'TEST'; + + entity.addTag(tag); + assert.equal(entity.getTags().next().value, tag); + }); + + it('getTags', () => { + const entity = new Entity(); + const tag1 = 'TEST1'; + const tag2 = 'TEST2'; + const tag3 = 'TEST3'; + + entity.addTag(tag1); + entity.addTag(tag2); + entity.addTag(tag3); + + // order should be equal! + const tags = entity.getTags() + assert.equal(tags.next().value, tag1); + assert.equal(tags.next().value, tag2); + assert.equal(tags.next().value, tag3); + }); + + it('hasComponent', () => { + const entity = new Entity(); + const component = new Date(); + + entity.addComponent(component); + assert.equal(entity.hasComponent(Date), true); + assert.equal(entity.hasComponent(component), true); + }); + + it('hasEvent', () => { + const entity = new Entity(); + const event = () => {}; + + entity.addEventListener('addTag', event); + assert.equal(entity.hasEventListener('addTag', event), true); + assert.equal(entity.hasEventListener('addTag', () => {}), false); + assert.equal(entity.hasEventListener('clone', event), false); + }); + + it('hasTag', () => { + const entity = new Entity(); + const tag = 'TEST'; + + entity.addTag(tag); + assert.equal(entity.hasTag(tag), true); + assert.equal(entity.hasTag('DOESNOTEXIST!!!'), false); + }); + it('removeComponent', () => { const component = {}; const entity = new Entity(); @@ -40,6 +111,27 @@ describe('Test Entity', () => { assert.equal(Array.from(entity.getComponents()).length, 0); }); + it ('removeEvent', () => { + const entity = new Entity(); + const event = () => {}; + + entity.addEventListener('addComponent', event); + entity.removeEventListener('addComponent', event); + + assert.equal(entity.hasEventListener('addComponent', event), false); + }); + + it('removeTag', () => { + const entity = new Entity(); + const tag = 'TEST'; + + entity.addTag(tag); + entity.removeTag(tag); + + assert.equal(entity.hasTag(tag), false); + assert.equal(Array.from(entity.getTags()).length, 0); + }); + it('Unique components', () => { const component = {}; const entity = new Entity(); diff --git a/src/entity/entity.ts b/src/entity/entity.ts index 720cc9b..dea9514 100644 --- a/src/entity/entity.ts +++ b/src/entity/entity.ts @@ -162,6 +162,23 @@ export class Entity implements IEntity { return this.components.has(this.getConstructor(component)); } + hasEventListener(event: T, handler: IEventMap[T]): boolean { + switch (event) { + case "addComponent": + return this.eventHandlers.addComponent.has(handler as TAddComponentEventHandler); + case "addTag": + return this.eventHandlers.addTag.has(handler as TAddTagEventHandler); + case "clone": + return this.eventHandlers.clone.has(handler as TCloneEventHandler); + case "removeComponent": + return this.eventHandlers.removeComponent.has(handler as TRemoveComponentEventHandler); + case "removeTag": + return this.eventHandlers.removeTag.has(handler as TRemoveTagEventHandler); + default: + return false; + } + } + hasTag(tag: TTag): boolean { return this.tags.has(tag); }