import htmlKeyboardResponse from "@jspsych/plugin-html-keyboard-response"; import { pressKey, startTimeline } from "@jspsych/test-utils"; import { initJsPsych, JsPsych } from "../../src"; describe("automatic progress bar", () => { test("progress bar does not display by default", async () => { const { jsPsych } = await startTimeline([ { type: htmlKeyboardResponse, stimulus: "foo", }, ]); expect(jsPsych.getDisplayContainerElement().querySelector("#jspsych-progressbar-container")) .toBeNull(); await pressKey("a"); }); test("progress bar displays when show_progress_bar is true", async () => { const { jsPsych } = await startTimeline( [ { type: htmlKeyboardResponse, stimulus: "foo", }, ], { show_progress_bar: true } ); expect(jsPsych.getDisplayContainerElement().querySelector("#jspsych-progressbar-container").innerHTML) .toMatch( 'Completion Progress
' ); }); test("progress bar automatically updates by default", async () => { const trial = { type: htmlKeyboardResponse, stimulus: "foo", }; const { jsPsych } = await startTimeline( [trial, trial, trial, trial], { show_progress_bar: true } ); const progressbarElement = jsPsych.getDisplayContainerElement().querySelector("#jspsych-progressbar-inner"); expect(progressbarElement.style.width).toEqual("0%"); await pressKey("a"); expect(progressbarElement.style.width).toEqual("25%"); await pressKey("a"); expect(progressbarElement.style.width).toEqual("50%"); await pressKey("a"); expect(progressbarElement.style.width).toEqual("75%"); await pressKey("a"); expect(progressbarElement.style.width).toEqual("100%"); }); test("progress bar does not automatically update when auto_update_progress_bar is false", async () => { const trial = { type: htmlKeyboardResponse, stimulus: "foo", }; const { jsPsych } = await startTimeline([trial, trial, trial, trial], { show_progress_bar: true, auto_update_progress_bar: false, }); const progressbarElement = jsPsych.getDisplayContainerElement().querySelector("#jspsych-progressbar-inner"); for (let i = 0; i < 4; i++) { expect(progressbarElement.style.width).toEqual("0%"); await pressKey("a"); } expect(progressbarElement.style.width).toEqual("0%"); }); test("set `progressBar.progress` manually", async () => { const jsPsychObject = initJsPsych({ show_progress_bar: true, auto_update_progress_bar: false, }); const timeline = [ { type: htmlKeyboardResponse, stimulus: "foo", on_finish: () => { jsPsych.progressBar.progress = 0.2; }, }, { type: htmlKeyboardResponse, stimulus: "foo", on_finish: () => { jsPsych.progressBar.progress = 0.8; }, }, ]; const { jsPsych } = await startTimeline(timeline, jsPsychObject); const progressbarElement = jsPsych.getDisplayContainerElement().querySelector("#jspsych-progressbar-inner"); expect(progressbarElement.style.width).toEqual("0%"); await pressKey("a"); expect(jsPsych.progressBar.progress).toEqual(0.2); expect(progressbarElement.style.width).toEqual("20%"); await pressKey("a"); expect(progressbarElement.style.width).toEqual("80%"); expect(jsPsych.progressBar.progress).toEqual(0.8); }); test("`progressBar.progress` -- automatic updates", async () => { const trial = { type: htmlKeyboardResponse, stimulus: "foo", }; const { jsPsych } = await startTimeline([trial, trial, trial, trial], { show_progress_bar: true, }); await pressKey("a"); expect(jsPsych.progressBar.progress).toEqual(0.25); await pressKey("a"); expect(jsPsych.progressBar.progress).toEqual(0.5); await pressKey("a"); expect(jsPsych.progressBar.progress).toEqual(0.75); await pressKey("a"); expect(jsPsych.progressBar.progress).toEqual(1); }); });