jsPsych/packages/jspsych/tests/core/progressbar.test.ts
2022-10-12 17:43:15 +02:00

132 lines
3.8 KiB
TypeScript

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