summaryrefslogtreecommitdiff
path: root/javascript/videojs/test/unit/tracks/text-track-settings.test.js
diff options
context:
space:
mode:
Diffstat (limited to 'javascript/videojs/test/unit/tracks/text-track-settings.test.js')
-rw-r--r--javascript/videojs/test/unit/tracks/text-track-settings.test.js416
1 files changed, 416 insertions, 0 deletions
diff --git a/javascript/videojs/test/unit/tracks/text-track-settings.test.js b/javascript/videojs/test/unit/tracks/text-track-settings.test.js
new file mode 100644
index 0000000..1eec3e6
--- /dev/null
+++ b/javascript/videojs/test/unit/tracks/text-track-settings.test.js
@@ -0,0 +1,416 @@
+/* eslint-env qunit */
+import TextTrackSettings from '../../../src/js/tracks/text-track-settings.js';
+import TestHelpers from '../test-helpers.js';
+import * as Events from '../../../src/js/utils/events.js';
+import sinon from 'sinon';
+import window from 'global/window';
+import Component from '../../../src/js/component.js';
+import videojs from '../../../src/js/video.js';
+
+const tracks = [{
+ kind: 'captions',
+ label: 'test'
+}];
+
+const defaultSettings = {
+ backgroundColor: '#000',
+ backgroundOpacity: '1',
+ color: '#FFF',
+ fontFamily: 'proportionalSansSerif',
+ textOpacity: '1',
+ windowColor: '#000',
+ windowOpacity: '0'
+};
+
+QUnit.module('Text Track Settings', {
+ beforeEach() {
+ window.localStorage.clear();
+ this.oldComponentFocus = Component.prototype.focus;
+ this.oldComponentBlur = Component.prototype.blur;
+ Component.prototype.focus = function() {};
+ Component.prototype.blur = function() {};
+ },
+ afterEach() {
+ Component.prototype.focus = this.oldComponentFocus;
+ Component.prototype.blur = this.oldComponentBlur;
+ }
+});
+
+QUnit.test('should update settings', function(assert) {
+ const player = TestHelpers.makePlayer({
+ tracks,
+ persistTextTrackSettings: true
+ });
+
+ const newSettings = {
+ backgroundOpacity: '0.5',
+ textOpacity: '0.5',
+ windowOpacity: '0.5',
+ edgeStyle: 'raised',
+ fontFamily: 'monospaceSerif',
+ color: '#F00',
+ backgroundColor: '#FFF',
+ windowColor: '#FFF',
+ fontPercent: 1.25
+ };
+
+ player.textTrackSettings.setValues(newSettings);
+
+ assert.deepEqual(
+ player.textTrackSettings.getValues(),
+ newSettings,
+ 'values are updated'
+ );
+
+ assert.equal(
+ player.$('.vjs-text-color > select').selectedIndex,
+ 2,
+ 'text-color is set to new value'
+ );
+
+ assert.equal(
+ player.$('.vjs-bg-color > select').selectedIndex,
+ 1,
+ 'bg-color is set to new value'
+ );
+
+ assert.equal(
+ player.$('.vjs-window-color > select').selectedIndex,
+ 1,
+ 'window-color is set to new value'
+ );
+
+ assert.equal(
+ player.$('.vjs-text-opacity > select').selectedIndex,
+ 1,
+ 'text-opacity is set to new value'
+ );
+
+ assert.equal(
+ player.$('.vjs-bg-opacity > select').selectedIndex,
+ 1,
+ 'bg-opacity is set to new value'
+ );
+
+ assert.equal(
+ player.$('.vjs-window-opacity > select').selectedIndex,
+ 1,
+ 'window-opacity is set to new value'
+ );
+
+ assert.equal(
+ player.$('.vjs-edge-style select').selectedIndex,
+ 1,
+ 'edge-style is set to new value'
+ );
+
+ assert.equal(
+ player.$('.vjs-font-family select').selectedIndex,
+ 3,
+ 'font-family is set to new value'
+ );
+
+ assert.equal(
+ player.$('.vjs-font-percent select').selectedIndex,
+ 3,
+ 'font-percent is set to new value'
+ );
+
+ Events.trigger(player.$('.vjs-done-button'), 'click');
+
+ assert.deepEqual(
+ JSON.parse(window.localStorage.getItem('vjs-text-track-settings')),
+ newSettings,
+ 'values are saved'
+ );
+
+ player.dispose();
+});
+
+QUnit.test('should restore default settings', function(assert) {
+ const player = TestHelpers.makePlayer({
+ tracks,
+ persistTextTrackSettings: true
+ });
+
+ player.$('.vjs-text-color > select').selectedIndex = 1;
+ player.$('.vjs-bg-color > select').selectedIndex = 1;
+ player.$('.vjs-window-color > select').selectedIndex = 1;
+ player.$('.vjs-text-opacity > select').selectedIndex = 1;
+ player.$('.vjs-bg-opacity > select').selectedIndex = 1;
+ player.$('.vjs-window-opacity > select').selectedIndex = 1;
+ player.$('.vjs-edge-style select').selectedIndex = 1;
+ player.$('.vjs-font-family select').selectedIndex = 1;
+ player.$('.vjs-font-percent select').selectedIndex = 3;
+
+ Events.trigger(player.$('.vjs-done-button'), 'click');
+ Events.trigger(player.$('.vjs-default-button'), 'click');
+ Events.trigger(player.$('.vjs-done-button'), 'click');
+
+ assert.deepEqual(
+ player.textTrackSettings.getValues(),
+ defaultSettings,
+ 'values are defaulted'
+ );
+ // TODO:
+ // MikeA: need to figure out how to modify saveSettings
+ // to factor in defaults are no longer null
+ // assert.deepEqual(window.localStorage.getItem('vjs-text-track-settings'),
+ // defaultSettings,
+ // 'values are saved');
+
+ assert.equal(
+ player.$('.vjs-text-color > select').selectedIndex,
+ 0,
+ 'text-color is set to default value'
+ );
+
+ assert.equal(
+ player.$('.vjs-bg-color > select').selectedIndex,
+ 0,
+ 'bg-color is set to default value'
+ );
+
+ assert.equal(
+ player.$('.vjs-window-color > select').selectedIndex,
+ 0,
+ 'window-color is set to default value'
+ );
+
+ assert.equal(
+ player.$('.vjs-text-opacity > select').selectedIndex,
+ 0,
+ 'text-opacity is set to default value'
+ );
+
+ assert.equal(
+ player.$('.vjs-bg-opacity > select').selectedIndex,
+ 0,
+ 'bg-opacity is set to default value'
+ );
+
+ assert.equal(
+ player.$('.vjs-window-opacity > select').selectedIndex,
+ 0,
+ 'window-opacity is set to default value'
+ );
+
+ assert.equal(
+ player.$('.vjs-edge-style select').selectedIndex,
+ 0,
+ 'edge-style is set to default value'
+ );
+
+ assert.equal(
+ player.$('.vjs-font-family select').selectedIndex,
+ 0,
+ 'font-family is set to default value'
+ );
+
+ assert.equal(
+ player.$('.vjs-font-percent select').selectedIndex,
+ 2,
+ 'font-percent is set to default value'
+ );
+
+ player.dispose();
+});
+
+QUnit.test('should open on click', function(assert) {
+ const clock = sinon.useFakeTimers();
+ const player = TestHelpers.makePlayer({
+ tracks
+ });
+
+ clock.tick(1);
+
+ Events.trigger(player.$('.vjs-texttrack-settings'), 'click');
+ assert.ok(!player.textTrackSettings.hasClass('vjs-hidden'), 'settings open');
+
+ player.dispose();
+ clock.restore();
+});
+
+QUnit.test('should close on done click', function(assert) {
+ const clock = sinon.useFakeTimers();
+ const player = TestHelpers.makePlayer({
+ tracks
+ });
+
+ clock.tick(1);
+
+ Events.trigger(player.$('.vjs-texttrack-settings'), 'click');
+ Events.trigger(player.$('.vjs-done-button'), 'click');
+ assert.ok(player.textTrackSettings.hasClass('vjs-hidden'), 'settings closed');
+
+ player.dispose();
+ clock.restore();
+});
+
+QUnit.test('if persist option is set, restore settings on init', function(assert) {
+ const oldRestoreSettings = TextTrackSettings.prototype.restoreSettings;
+ let restore = 0;
+
+ TextTrackSettings.prototype.restoreSettings = function() {
+ restore++;
+ };
+
+ const player = TestHelpers.makePlayer({
+ tracks,
+ persistTextTrackSettings: true
+ });
+
+ assert.equal(restore, 1, 'restore was called');
+
+ TextTrackSettings.prototype.restoreSettings = oldRestoreSettings;
+
+ player.dispose();
+});
+
+QUnit.test('if persist option is set, save settings when "done"', function(assert) {
+ const player = TestHelpers.makePlayer({
+ tracks,
+ persistTextTrackSettings: true
+ });
+
+ const oldSaveSettings = TextTrackSettings.prototype.saveSettings;
+ let save = 0;
+
+ TextTrackSettings.prototype.saveSettings = function() {
+ save++;
+ };
+
+ Events.trigger(player.$('.vjs-done-button'), 'click');
+
+ assert.equal(save, 1, 'save was called');
+
+ TextTrackSettings.prototype.saveSettings = oldSaveSettings;
+
+ player.dispose();
+});
+
+QUnit.test('do not try to restore or save settings if persist option is not set', function(assert) {
+ const oldRestoreSettings = TextTrackSettings.prototype.restoreSettings;
+ const oldSaveSettings = TextTrackSettings.prototype.saveSettings;
+ let save = 0;
+ let restore = 0;
+
+ TextTrackSettings.prototype.restoreSettings = function() {
+ restore++;
+ };
+ TextTrackSettings.prototype.saveSettings = function() {
+ save++;
+ };
+
+ const player = TestHelpers.makePlayer({
+ tracks,
+ persistTextTrackSettings: false
+ });
+
+ assert.equal(restore, 0, 'restore was not called');
+
+ Events.trigger(player.$('.vjs-done-button'), 'click');
+
+ // saveSettings is called but does nothing
+ assert.equal(save, 1, 'save was not called');
+
+ TextTrackSettings.prototype.saveSettings = oldSaveSettings;
+ TextTrackSettings.prototype.restoreSettings = oldRestoreSettings;
+
+ player.dispose();
+});
+
+QUnit.test('should restore saved settings', function(assert) {
+ const newSettings = {
+ backgroundOpacity: '0.5',
+ textOpacity: '0.5',
+ windowOpacity: '0.5',
+ edgeStyle: 'raised',
+ fontFamily: 'monospaceSerif',
+ color: '#F00',
+ backgroundColor: '#FFF',
+ windowColor: '#FFF',
+ fontPercent: 1.25
+ };
+
+ window.localStorage.setItem('vjs-text-track-settings', JSON.stringify(newSettings));
+
+ const player = TestHelpers.makePlayer({
+ tracks,
+ persistTextTrackSettings: true
+ });
+
+ assert.deepEqual(player.textTrackSettings.getValues(), newSettings);
+
+ player.dispose();
+});
+
+QUnit.test('should not restore saved settings', function(assert) {
+ const newSettings = {
+ backgroundOpacity: '0.5',
+ textOpacity: '0.5',
+ windowOpacity: '0.5',
+ edgeStyle: 'raised',
+ fontFamily: 'monospaceSerif',
+ color: '#F00',
+ backgroundColor: '#FFF',
+ windowColor: '#FFF',
+ fontPercent: 1.25
+ };
+
+ window.localStorage.setItem('vjs-text-track-settings', JSON.stringify(newSettings));
+
+ const player = TestHelpers.makePlayer({
+ tracks,
+ persistTextTrackSettings: false
+ });
+
+ assert.deepEqual(player.textTrackSettings.getValues(), defaultSettings);
+
+ player.dispose();
+});
+
+QUnit.test('should update on languagechange', function(assert) {
+ const player = TestHelpers.makePlayer({
+ tracks
+ });
+
+ videojs.addLanguage('test', {
+ 'Font Size': 'FONTSIZE',
+ 'Color': 'COLOR',
+ 'White': 'WHITE'
+ });
+ player.language('test');
+
+ assert.equal(player.$('.vjs-font-percent legend').textContent, 'FONTSIZE', 'settings dialog updates on languagechange');
+ assert.equal(player.$('.vjs-text-color label').textContent, 'COLOR', 'settings dialog label updates on languagechange');
+ assert.equal(player.$('.vjs-text-color select option').textContent, 'WHITE', 'settings dialog select updates on languagechange');
+
+ player.dispose();
+});
+
+QUnit.test('should associate <label>s with <select>s', function(assert) {
+ const player = TestHelpers.makePlayer({
+ tracks
+ });
+
+ const firstLabelFor = player.textTrackSettings.el_.querySelector('label').getAttribute('for');
+
+ assert.ok(
+ videojs.dom.isEl(player.textTrackSettings.el_.querySelector(`#${firstLabelFor}`)),
+ 'label has a `for` attribute matching an `id`'
+ );
+
+});
+
+QUnit.test('should not duplicate ids', function(assert) {
+ const player = TestHelpers.makePlayer({
+ tracks
+ });
+
+ const elements = [...player.el().querySelectorAll('[id]')];
+ const ids = elements.map(el => el.id);
+ const duplicates = elements.filter(el => ids.filter(id => id === el.id).length > 1);
+
+ assert.strictEqual(duplicates.length, 0, 'there should be no duplicate ids');
+});