From 9b55e9dfcc43bf3d9740822633366ec555c40c0b Mon Sep 17 00:00:00 2001 From: Cherrie Chang Date: Mon, 4 Nov 2024 17:42:18 -0500 Subject: [PATCH] add tests for dynamically removing timeline nodes --- .../jspsych/src/timeline/Timeline.spec.ts | 66 +++++++++++++++++++ 1 file changed, 66 insertions(+) diff --git a/packages/jspsych/src/timeline/Timeline.spec.ts b/packages/jspsych/src/timeline/Timeline.spec.ts index eb5ca3e74b..cb073e84de 100644 --- a/packages/jspsych/src/timeline/Timeline.spec.ts +++ b/packages/jspsych/src/timeline/Timeline.spec.ts @@ -75,6 +75,72 @@ describe("Timeline", () => { expect(timeline.children.length).toEqual(2); }); + it("respects dynamically removed end child node descriptions", async () => { + TestPlugin.setManualFinishTrialMode(); + + const timelineDescription: TimelineArray = [ + { type: TestPlugin }, + { type: TestPlugin }, + { timeline: [{ type: TestPlugin }] }, + ]; + const timeline = createTimeline(timelineDescription); + + const runPromise = timeline.run(); + expect(timeline.children.length).toEqual(1); // Only the first child is instantiated because they are incrementally instantiated now + + timelineDescription.pop(); + await TestPlugin.finishTrial(); + await TestPlugin.finishTrial(); + await runPromise; + + expect(timeline.children.length).toEqual(2); + expect(timeline.children).toEqual([expect.any(Trial), expect.any(Trial)]); + }); + + it("respects dynamically removed first child node descriptions", async () => { + TestPlugin.setManualFinishTrialMode(); + + const timelineDescription: TimelineArray = [ + { type: TestPlugin }, + { timeline: [{ type: TestPlugin }] }, + { type: TestPlugin }, + ]; + const timeline = createTimeline(timelineDescription); + + const runPromise = timeline.run(); + expect(timeline.children.length).toEqual(1); + + timelineDescription.shift(); + await TestPlugin.finishTrial(); + await TestPlugin.finishTrial(); + await runPromise; + + expect(timeline.children.length).toEqual(2); + expect(timeline.children).toEqual([expect.any(Timeline), expect.any(Trial)]); + }); + + it("respects dynamically removed middle child node descriptions", async () => { + TestPlugin.setManualFinishTrialMode(); + + const timelineDescription: TimelineArray = [ + { type: TestPlugin }, + { timeline: [{ type: TestPlugin }] }, + { type: TestPlugin }, + ]; + const timeline = createTimeline(timelineDescription); + + const runPromise = timeline.run(); + expect(timeline.children.length).toEqual(1); + + timelineDescription.splice(1, 1); + await TestPlugin.finishTrial(); + await TestPlugin.finishTrial(); + await runPromise; + + expect(timeline.children.length).toEqual(2); + expect(timeline.children).toEqual([expect.any(Trial), expect.any(Trial)]); + }); + describe("with `pause()` and `resume()` calls`", () => { beforeEach(() => { TestPlugin.setManualFinishTrialMode();