
Tests that the NowPlaying information is updated correctly as attributes change.

* NowPlaying should not be active before playback has started.
RUN(video.src = findMediaFile("video", "resources/test"))
EVENT(canplaythrough)
RUN(nowPlayingState = internals.nowPlayingState)
EXPECTED (nowPlayingState.registeredAsNowPlayingApplication == 'false') OK

* Start to play, NowPlaying should become active.
RUN(video.play())
EVENT(playing)
RUN(video.pause())

* Title should be page title because video has no title.
RUN(nowPlayingState = internals.nowPlayingState)
EXPECTED (nowPlayingState.registeredAsNowPlayingApplication == 'true') OK
EXPECTED (nowPlayingState.title == 'Page Title') OK
EXPECTED (nowPlayingState.duration > '0') OK

* Set video title, it should be used.
RUN(video.title = "Video Title")
RUN(nowPlayingState = internals.nowPlayingState)
EXPECTED (nowPlayingState.registeredAsNowPlayingApplication == 'true') OK
EXPECTED (nowPlayingState.title == 'Video Title') OK
EXPECTED (nowPlayingState.duration > '0') OK

* Clear video and page titles, page domain should be used.
RUN(video.title = "")
RUN(document.title = "")
RUN(nowPlayingState = internals.nowPlayingState)
EXPECTED (nowPlayingState.registeredAsNowPlayingApplication == 'true') OK
EXPECTED (nowPlayingState.title == '127.0.0.1') OK
EXPECTED (nowPlayingState.duration > '0') OK

* Change currentTime, state should be updated.
RUN(video.currentTime = video.currentTime + 0.5)
RUN(nowPlayingState = internals.nowPlayingState)
EXPECTED (nowPlayingState.registeredAsNowPlayingApplication == 'true') OK
EXPECTED (nowPlayingState.title == '127.0.0.1') OK
EXPECTED (nowPlayingState.duration > '0') OK

END OF TEST

