diff options
Diffstat (limited to 'javascript/videojs/test/unit/player-play.test.js')
| -rw-r--r-- | javascript/videojs/test/unit/player-play.test.js | 139 |
1 files changed, 139 insertions, 0 deletions
diff --git a/javascript/videojs/test/unit/player-play.test.js b/javascript/videojs/test/unit/player-play.test.js new file mode 100644 index 0000000..439e5df --- /dev/null +++ b/javascript/videojs/test/unit/player-play.test.js @@ -0,0 +1,139 @@ +/* eslint-env qunit */ +import sinon from 'sinon'; +import {silencePromise} from '../../src/js/utils/promise'; +import TestHelpers from './test-helpers'; +import * as browser from '../../src/js/utils/browser.js'; + +QUnit.module('Player#play', { + + beforeEach() { + this.clock = sinon.useFakeTimers(); + this.player = TestHelpers.makePlayer({}); + this.techPlayCallCount = 0; + this.techCurrentTimeCallCount = 0; + this.initTime = 0; + this.player.tech_.play = () => { + this.techPlayCallCount++; + }; + this.player.tech_.setCurrentTime = (seconds) => { + this.techCurrentTimeCallCount++; + this.initTime = seconds; + }; + }, + + afterEach() { + this.player.dispose(); + this.clock.restore(); + } +}); + +QUnit.test('tech not ready + no source = wait for ready, then loadstart', function(assert) { + + // Mock the player/tech not being ready. + this.player.isReady_ = false; + + // Attempt to play. + this.player.play(); + this.clock.tick(100); + assert.strictEqual(this.techPlayCallCount, 0, 'tech_.play was not called because the tech was not ready'); + + // Ready the player. + this.player.triggerReady(); + this.clock.tick(100); + assert.strictEqual(this.techPlayCallCount, 0, 'tech_.play was not called because there was no source'); + + // Add a source and trigger loadstart. + this.player.src('xyz.mp4'); + this.clock.tick(100); + this.player.trigger('loadstart'); + assert.strictEqual(this.techPlayCallCount, 1, 'tech_.play was called'); +}); + +QUnit.test('tech not ready + has source = wait for ready', function(assert) { + + // Mock the player/tech not being ready, but having a source. + this.player.isReady_ = false; + this.player.src('xyz.mp4'); + this.clock.tick(100); + + // Attempt to play. + this.player.play(); + this.clock.tick(100); + assert.strictEqual(this.techPlayCallCount, 0, 'tech_.play was not called because the tech was not ready'); + + // Ready the player. + this.player.triggerReady(); + this.clock.tick(100); + assert.strictEqual(this.techPlayCallCount, 1, 'tech_.play was called'); +}); + +QUnit.test('tech ready + no source = wait for loadstart', function(assert) { + + // Attempt to play. + this.player.play(); + this.clock.tick(100); + assert.strictEqual(this.techPlayCallCount, 0, 'tech_.play was not called because the tech was not ready'); + + // Add a source and trigger loadstart. + this.player.src('xyz.mp4'); + this.clock.tick(100); + this.player.trigger('loadstart'); + assert.strictEqual(this.techPlayCallCount, 1, 'tech_.play was called'); +}); + +QUnit.test('tech ready + has source = play immediately!', function(assert) { + + // Mock the player having a source. + this.player.src('xyz.mp4'); + this.clock.tick(100); + + // Attempt to play, but silence the promise that might be returned. + silencePromise(this.player.play()); + assert.strictEqual(this.techPlayCallCount, 1, 'tech_.play was called'); +}); + +QUnit.test('tech ready + has source + changing source = wait for loadstart', function(assert) { + + // Mock the player having a source and in the process of changing its source. + this.player.src('xyz.mp4'); + this.clock.tick(100); + this.player.src('abc.mp4'); + this.player.play(); + this.clock.tick(100); + assert.strictEqual(this.techPlayCallCount, 0, 'tech_.play was not called because the source was changing'); + + this.player.trigger('loadstart'); + assert.strictEqual(this.techPlayCallCount, 1, 'tech_.play was called'); +}); + +QUnit.test('play call from native replay calls resetProgressBar_', function(assert) { + const origSafari = browser.IS_ANY_SAFARI; + const origIOS = browser.IS_IOS; + + browser.stub_IS_ANY_SAFARI(true); + + // Mock the player having a source. + this.player.src('xyz.mp4'); + this.clock.tick(100); + + // Attempt to play, but silence the promise that might be returned. + silencePromise(this.player.play()); + assert.strictEqual(this.techPlayCallCount, 1, 'tech_.play was called'); + + // add vjs-ended for replay logic and play again. + this.player.addClass('vjs-ended'); + + silencePromise(this.player.play()); + assert.strictEqual(this.techPlayCallCount, 2, 'tech_.play was called'); + assert.strictEqual(this.techCurrentTimeCallCount, 1, 'tech_.currentTime was called'); + + // Reset safari stub and try replay in iOS. + browser.stub_IS_ANY_SAFARI(origSafari); + browser.stub_IS_IOS(true); + + silencePromise(this.player.play()); + assert.strictEqual(this.techPlayCallCount, 3, 'tech_.play was called'); + assert.strictEqual(this.techCurrentTimeCallCount, 2, 'tech_.currentTime was called'); + + browser.stub_IS_IOS(origIOS); +}); |
