22
33import { ErrorEvent , type Event , PlayerEventType , SourceDescription , THEOplayer } from 'react-native-theoplayer' ;
44import { getTestPlayer } from '../components/TestableTHEOplayerView' ;
5+ import { logPlayerBuffer } from './PlayerUtils' ;
56
67export interface TestOptions {
78 timeout : number ;
@@ -66,51 +67,52 @@ export const waitForPlayerEvents = async <EType extends Event<PlayerEventType>>(
6667 options = defaultTestOptions ,
6768) : Promise < Event < PlayerEventType > [ ] > => {
6869 const receivedEvents : Event < PlayerEventType > [ ] = [ ] ;
69- return withEventTimeOut (
70- new Promise < Event < PlayerEventType > [ ] > ( ( resolve , reject ) => {
71- const onError = ( err : ErrorEvent ) => {
72- console . error ( '[waitForPlayerEvents]' , err ) ;
73- player . removeEventListener ( PlayerEventType . ERROR , onError ) ;
74- reject ( err ) ;
75- } ;
76- let eventMap = expectedEvents . map ( ( _expected : Partial < EType > ) => ( {
77- event : _expected as Event < PlayerEventType > ,
78- onEvent ( receivedEvent : Event < PlayerEventType > ) {
79- if ( ! eventMap . length ) {
80- // No more events expected
81- return ;
70+ const eventsPromise = new Promise < Event < PlayerEventType > [ ] > ( ( resolve , reject ) => {
71+ const onError = ( err : ErrorEvent ) => {
72+ console . error ( '[waitForPlayerEvents]' , err ) ;
73+ player . removeEventListener ( PlayerEventType . ERROR , onError ) ;
74+ reject ( err ) ;
75+ } ;
76+ let eventMap = expectedEvents . map ( ( _expected : Partial < EType > ) => ( {
77+ event : _expected as Event < PlayerEventType > ,
78+ onEvent ( receivedEvent : Event < PlayerEventType > ) {
79+ if ( ! eventMap . length ) {
80+ // No more events expected
81+ return ;
82+ }
83+ const expectedEvent = eventMap [ 0 ] . event ;
84+ receivedEvents . push ( receivedEvent ) ;
85+ console . debug ( '[waitForPlayerEvents]' , `Received event ${ JSON . stringify ( receivedEvent . type ) } - waiting for ${ expectedEvent . type } ` ) ;
86+ const index = eventMap . findIndex ( ( e ) => propsMatch ( e . event , receivedEvent ) ) ;
87+ const isExpected = index <= 0 ;
88+
89+ // Check order
90+ if ( inOrder && eventMap . length && ! isExpected ) {
91+ const err = `Expected event '${ expectedEvent . type } ' but received '${ receivedEvent . type } '` ;
92+ console . error ( '[waitForPlayerEvents]' , err ) ;
93+ reject ( err ) ;
94+ }
95+ eventMap = eventMap . filter ( ( entry ) => {
96+ if ( entry . event . type === expectedEvent . type ) {
97+ player . removeEventListener ( expectedEvent . type , entry . onEvent ) ;
8298 }
83- const expectedEvent = eventMap [ 0 ] . event ;
84- receivedEvents . push ( receivedEvent ) ;
85- console . debug ( '[waitForPlayerEvents]' , `Received event ${ JSON . stringify ( receivedEvent . type ) } - waiting for ${ expectedEvent . type } ` ) ;
86- const index = eventMap . findIndex ( ( e ) => propsMatch ( e . event , receivedEvent ) ) ;
87- const isExpected = index <= 0 ;
88-
89- // Check order
90- if ( inOrder && eventMap . length && ! isExpected ) {
91- const err = `Expected event '${ expectedEvent . type } ' but received '${ receivedEvent . type } '` ;
92- console . error ( '[waitForPlayerEvents]' , err ) ;
93- reject ( err ) ;
94- }
95- eventMap = eventMap . filter ( ( entry ) => {
96- if ( entry . event . type === expectedEvent . type ) {
97- player . removeEventListener ( expectedEvent . type , entry . onEvent ) ;
98- }
99- return entry . event . type !== expectedEvent . type ;
100- } ) ;
101- if ( ! eventMap . length ) {
102- // Done
103- resolve ( receivedEvents ) ;
104- }
105- } ,
106- } ) ) ;
107- player . addEventListener ( PlayerEventType . ERROR , onError ) ;
108- eventMap . forEach ( ( { event, onEvent } ) => player . addEventListener ( event . type , onEvent ) ) ;
109- } ) ,
110- options . timeout ,
111- expectedEvents ,
112- receivedEvents ,
113- ) ;
99+ return entry . event . type !== expectedEvent . type ;
100+ } ) ;
101+ if ( ! eventMap . length ) {
102+ // Done
103+ resolve ( receivedEvents ) ;
104+ }
105+ } ,
106+ } ) ) ;
107+ player . addEventListener ( PlayerEventType . ERROR , onError ) ;
108+ eventMap . forEach ( ( { event, onEvent } ) => player . addEventListener ( event . type , onEvent ) ) ;
109+ } ) ;
110+
111+ // Add rejection on time-out
112+ const timeOutPromise = withEventTimeOut ( eventsPromise , options . timeout , expectedEvents , receivedEvents ) ;
113+
114+ // Add extra logging on error
115+ return withPlayerStateLogOnError ( player , timeOutPromise ) ;
114116} ;
115117
116118const withEventTimeOut = < EType extends Event < PlayerEventType > > (
@@ -137,6 +139,14 @@ const withEventTimeOut = <EType extends Event<PlayerEventType>>(
137139 } ) ;
138140} ;
139141
142+ const withPlayerStateLogOnError = async ( player : THEOplayer , promise : Promise < any > ) => {
143+ try {
144+ return await promise ;
145+ } catch ( e ) {
146+ throw e + ` buffer: ${ logPlayerBuffer ( player ) } ;` + ` currenTime: ${ player . currentTime } ;` + ` paused: ${ player . paused } ;` ;
147+ }
148+ } ;
149+
140150export function expect ( actual : any , desc ?: string ) {
141151 const descPrefix = desc ? `${ desc } : ` : '' ;
142152
0 commit comments