import { pressKey , simulateTimeline , startTimeline } from "@jspsych/test-utils" ; import serialReactionTime from "." ; jest . useFakeTimers ( ) ; const getCellElement = ( cellId ) => document . querySelector ( `#jspsych-serial-reaction-time-stimulus-cell-${ cellId }` ) as HTMLElement ; describe ( "serial-reaction-time plugin" , ( ) => { test ( "default behavior" , async ( ) => { const { expectFinished , getData } = await startTimeline ( [ { type : serialReactionTime , target : [ 0 , 0 ] , } , ] ) ; expect ( getCellElement ( "0-0" ) . style . backgroundColor ) . toBe ( "rgb(153, 153, 153)" ) ; expect ( getCellElement ( "0-1" ) . style . backgroundColor ) . toBe ( "" ) ; expect ( getCellElement ( "0-2" ) . style . backgroundColor ) . toBe ( "" ) ; expect ( getCellElement ( "0-3" ) . style . backgroundColor ) . toBe ( "" ) ; pressKey ( "3" ) ; await expectFinished ( ) ; expect ( getData ( ) . last ( 1 ) . values ( ) [ 0 ] . correct ) . toBe ( true ) ; } ) ; test ( "response ends trial is false" , async ( ) => { const { getHTML , expectFinished , getData } = await startTimeline ( [ { type : serialReactionTime , target : [ 0 , 0 ] , response_ends_trial : false , trial_duration : 1000 , } , ] ) ; expect ( getCellElement ( "0-0" ) . style . backgroundColor ) . toBe ( "rgb(153, 153, 153)" ) ; expect ( getCellElement ( "0-1" ) . style . backgroundColor ) . toBe ( "" ) ; expect ( getCellElement ( "0-2" ) . style . backgroundColor ) . toBe ( "" ) ; expect ( getCellElement ( "0-3" ) . style . backgroundColor ) . toBe ( "" ) ; pressKey ( "3" ) ; expect ( getHTML ( ) ) . not . toBe ( "" ) ; jest . advanceTimersByTime ( 1000 ) ; await expectFinished ( ) ; expect ( getData ( ) . last ( 1 ) . values ( ) [ 0 ] . correct ) . toBe ( true ) ; } ) ; test ( "responses are scored correctly" , async ( ) => { const { getHTML , expectFinished , getData } = await startTimeline ( [ { type : serialReactionTime , target : [ 0 , 0 ] , } , { type : serialReactionTime , target : [ 0 , 1 ] , } , ] ) ; expect ( getCellElement ( "0-0" ) . style . backgroundColor ) . toBe ( "rgb(153, 153, 153)" ) ; expect ( getCellElement ( "0-1" ) . style . backgroundColor ) . toBe ( "" ) ; expect ( getCellElement ( "0-2" ) . style . backgroundColor ) . toBe ( "" ) ; expect ( getCellElement ( "0-3" ) . style . backgroundColor ) . toBe ( "" ) ; pressKey ( "3" ) ; jest . runAllTimers ( ) ; expect ( getCellElement ( "0-0" ) . style . backgroundColor ) . toBe ( "" ) ; expect ( getCellElement ( "0-1" ) . style . backgroundColor ) . toBe ( "rgb(153, 153, 153)" ) ; expect ( getCellElement ( "0-2" ) . style . backgroundColor ) . toBe ( "" ) ; expect ( getCellElement ( "0-3" ) . style . backgroundColor ) . toBe ( "" ) ; pressKey ( "3" ) ; await expectFinished ( ) ; var trial_data = getData ( ) . last ( 2 ) . values ( ) ; expect ( trial_data [ 0 ] . correct ) . toBe ( true ) ; expect ( trial_data [ 1 ] . correct ) . toBe ( false ) ; } ) ; } ) ; describe ( "serial-reaction-time plugin simulation" , ( ) => { test ( "data-only mode works" , async ( ) => { const { expectFinished , getData } = await simulateTimeline ( [ { type : serialReactionTime , grid : [ [ 1 , 1 , 1 , 1 ] ] , target : [ 0 , 0 ] , choices : [ [ "a" , "b" , "c" , "d" ] ] , } , ] ) ; await expectFinished ( ) ; const data = getData ( ) . values ( ) [ 0 ] ; expect ( data . correct ) . toBe ( data . response == "a" ) ; expect ( data . rt ) . toBeGreaterThan ( 0 ) ; } ) ; test ( "visual mode works" , async ( ) => { const { expectFinished , expectRunning , getData } = await simulateTimeline ( [ { type : serialReactionTime , grid : [ [ 1 , 1 , 1 , 1 ] ] , target : [ 0 , 0 ] , choices : [ [ "a" , "b" , "c" , "d" ] ] , } , ] , "visual" ) ; await expectRunning ( ) ; jest . runAllTimers ( ) ; await expectFinished ( ) ; const data = getData ( ) . values ( ) [ 0 ] ; expect ( data . correct ) . toBe ( data . response == "a" ) ; expect ( data . rt ) . toBeGreaterThan ( 0 ) ; } ) ; } ) ;