summaryrefslogtreecommitdiff
path: root/javascript/videojs/test/unit/player-play.test.js
diff options
context:
space:
mode:
Diffstat (limited to 'javascript/videojs/test/unit/player-play.test.js')
-rw-r--r--javascript/videojs/test/unit/player-play.test.js139
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);
+});