From 83b9608be000b4e03925a00c5350432e9a4b5cc1 Mon Sep 17 00:00:00 2001 From: jcowman2 Date: Wed, 6 Nov 2019 23:05:40 -0600 Subject: [PATCH] fix(events): Properly execute nested TrackedEvents (finally) fix #83 --- src/events/impl/event-builders.ts | 2 +- test/unit/agents.test.ts | 5 +++-- test/unit/events.test.ts | 28 ++++++++++++++++++++++++++++ 3 files changed, 32 insertions(+), 3 deletions(-) diff --git a/src/events/impl/event-builders.ts b/src/events/impl/event-builders.ts index 0c9be59..1a72755 100644 --- a/src/events/impl/event-builders.ts +++ b/src/events/impl/event-builders.ts @@ -86,7 +86,7 @@ export const on = ( event.eventName = eventName; if (isTrackedEvent(eventFunc)) { - event.target = eventFunc.target; + event.target = () => eventFunc; // Boy oh boy this line gave me grief } else { event.target = eventFunc; } diff --git a/test/unit/agents.test.ts b/test/unit/agents.test.ts index bce6041..0f10fca 100644 --- a/test/unit/agents.test.ts +++ b/test/unit/agents.test.ts @@ -27,7 +27,8 @@ import { DEFAULT_EVENT_NAME, getUntrackedEventPK, TrackedEvent, - EventFunction + EventFunction, + isEventQueue } from "../../src/events"; import { on } from "../../src/events"; import { buildGameInstance } from "../../src/state"; @@ -2054,7 +2055,7 @@ describe("Agents", function() { ]); }); - it("Complicated nesting of TrackedEvents is okay", function() { + it("Setting complex tracked events as agent properties is okay", function() { Game.init(MD); const func = on("1", on("2", () => {}).then(on("3", () => {}))); const myGame = buildGameInstance(); diff --git a/test/unit/events.test.ts b/test/unit/events.test.ts index 391e722..a71a23a 100644 --- a/test/unit/events.test.ts +++ b/test/unit/events.test.ts @@ -483,6 +483,18 @@ describe("Events", function() { expect(isEventQueue(eq)).to.be.true; }); + it("Complicated nesting of TrackedEvents is okay", function() { + Game.init(MD); + const bar = on("BAR", game => game.output.write("bar")); + const inner = on("INNER", bar.then(bar)); + const func = on("OUTER", inner); + + const myGame = buildGameInstance(); + func(myGame); + + expect(myGame.output.lines[0].data).to.equal("bar"); + }); + describe("QTests", function() { // Start utility functions @@ -1003,5 +1015,21 @@ describe("Events", function() { expect(basePKs[0].minus(1).equals(basePKs[1])).to.be.true; expect(basePKs[0].equals(newGame.events.history[0].id)).to.be.true; }); + + it("When `on` has a TrackedEvent as its second argument, the event is considered caused by the outer", function() { + Game.init(MD); + const bar = on("BAR", game => game.output.write("bar")); + const outer = on("OUTER", bar); + + const myGame = buildGameInstance(); + outer(myGame); + + const [event1, event2] = myGame.events.history; + + expect(event1.name).to.equal("BAR"); + expect(event2.name).to.equal("OUTER"); + expect(event1.causedBy.equals(event2.id)).to.be.true; + expect(event2.caused[0].equals(event1.id)).to.be.true; + }); }); });