import { flushPromises } from "@jspsych/test-utils"; import { JsPsych, JsPsychPlugin, TrialType } from "jspsych"; import { ParameterInfos } from "../src/modules/plugins"; import { SimulationMode, SimulationOptions, TrialResult } from "../src/timeline"; import { PromiseWrapper } from "../src/timeline/util"; export const testPluginInfo = { name: "test", version: "0.0.1", parameters: {}, data: {}, citations: { apa: "Test plugin APA citation", bibtex: "Test plugin BibTeX citation", }, }; class TestPlugin implements JsPsychPlugin { static info = testPluginInfo; static setParameterInfos(parameters: ParameterInfos) { TestPlugin.info = { ...testPluginInfo, parameters }; } static resetPluginInfo() { TestPlugin.info = testPluginInfo; } static defaultTrialResult: Record = { my: "result" }; private static finishTrialMode: "immediate" | "manual" = "immediate"; /** * Disables immediate finishing of the `trial` method of all `TestPlugin` instances. Instead, any * running trial can be finished by invoking `TestPlugin.finishTrial()`. */ static setManualFinishTrialMode() { TestPlugin.finishTrialMode = "manual"; } /** * Makes the `trial` method of all instances of `TestPlugin` finish immediately and allows to * manually finish the trial by invoking `TestPlugin.finishTrial()` instead. */ static setImmediateFinishTrialMode() { TestPlugin.finishTrialMode = "immediate"; } private static trialPromise = new PromiseWrapper>(); /** * Resolves the promise returned by `trial()` with the provided `result` or * `TestPlugin.defaultTrialResult` if no `result` object was passed. **/ static async finishTrial(result?: Record) { TestPlugin.trialPromise.resolve(result ?? TestPlugin.defaultTrialResult); await flushPromises(); } static defaultTrialImplementation( display_element: HTMLElement, trial: TrialType, on_load: () => void ): void | Promise { on_load(); if (TestPlugin.finishTrialMode === "immediate") { return Promise.resolve(TestPlugin.defaultTrialResult); } return TestPlugin.trialPromise.get(); } public static trial = TestPlugin.defaultTrialImplementation; static defaultSimulateImplementation( trial: TrialType, simulation_mode: SimulationMode, simulation_options: SimulationOptions, on_load?: () => void ): void | Promise { return TestPlugin.defaultTrialImplementation(document.createElement("div"), trial, on_load); } public static simulate = TestPlugin.defaultSimulateImplementation; /** Resets all static properties including function implementations */ static reset() { TestPlugin.defaultTrialResult = { my: "result" }; TestPlugin.trial = TestPlugin.defaultTrialImplementation; TestPlugin.simulate = TestPlugin.defaultSimulateImplementation; TestPlugin.resetPluginInfo(); TestPlugin.setImmediateFinishTrialMode(); } constructor(private jsPsych: JsPsych) {} trial = jest.fn(TestPlugin.trial); simulate = jest.fn(TestPlugin.simulate); } export default TestPlugin;