1
0
mirror of https://github.com/videojs/video.js.git synced 2024-12-23 02:04:34 +02:00
video.js/test/unit/tracks/text-track-settings.test.js

411 lines
10 KiB
JavaScript
Raw Normal View History

/* eslint-env qunit */
import TextTrackSettings from '../../../src/js/tracks/text-track-settings.js';
import TestHelpers from '../test-helpers.js';
Broke up Lib and Util into smaller libraries of functions Broke out bind, guid, and element data functions from Lib Separated out more dom functions in to dom.js Broke out URL functions into url.js Removed setLocalStorage since it wasn't being used Moved browser tests out of lib Moved log functions into their own file Removed trim() since it wasn't being used Moved formatTime into its own file Moved round into its own file and renamed roundFloat() Moved capitalize into its own file and renamed as toTitleCase() Moved createTimeRange into its own file Removed Lib.arr.forEach infavor of the native forEach Removed Lib.obj.create in favor of native Object.create (ES6-sham) Removed obj.each in favor of native Object.getOwnPropertyNames().forEach() Removed obj.merge and copy. Using lodash.assign instead. Replaced Lib.obj.isPlain with lodash.isPlainObject Removed Lib.obj.isArray in favor of the native Array.isArray Also removed the lib.js tests file as all tests have been moved or removed. Removed Lib.isEmpty in favor of !Object.getOwnPropertyNames().length Switched Util.mergeOptions and deepMerge to use new mergeOptions() Moved Lib.TEST_VID to Html5.TEST_VID Removed Lib references everywhere. Woo! Attempting to fix sourcemap test errors by setting grunt-browserify version Switched to object.assign from lodash.assign Removed unused 'inherits' dependency Reorganzied test files and added '.test' to file names Combined js/core.js and js/video.js Moved events.js into the utils directory
2015-05-04 01:12:38 +02:00
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'});
player.language('test');
assert.equal(player.$('.vjs-font-percent legend').textContent, 'FONTSIZE', 'settings dialog 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');
});