1
0
mirror of https://github.com/videojs/video.js.git synced 2024-12-21 01:39:04 +02:00

remove merge-options in favor of obj.merge

This commit is contained in:
Pat O'Neill 2022-05-13 12:59:49 -04:00
parent a5fd093a42
commit f641c0f6d3
18 changed files with 86 additions and 104 deletions

View File

@ -10,7 +10,7 @@ import * as Dom from './utils/dom.js';
import * as Fn from './utils/fn.js'; import * as Fn from './utils/fn.js';
import * as Guid from './utils/guid.js'; import * as Guid from './utils/guid.js';
import {toTitleCase, toLowerCase} from './utils/str.js'; import {toTitleCase, toLowerCase} from './utils/str.js';
import mergeOptions from './utils/merge-options.js'; import {merge} from './utils/obj.js';
import computedStyle from './utils/computed-style'; import computedStyle from './utils/computed-style';
import Map from './utils/map.js'; import Map from './utils/map.js';
import Set from './utils/set.js'; import Set from './utils/set.js';
@ -69,10 +69,10 @@ class Component {
this.parentComponent_ = null; this.parentComponent_ = null;
// Make a copy of prototype.options_ to protect against overriding defaults // Make a copy of prototype.options_ to protect against overriding defaults
this.options_ = mergeOptions({}, this.options_); this.options_ = merge({}, this.options_);
// Updated options with supplied options // Updated options with supplied options
options = this.options_ = mergeOptions(this.options_, options); options = this.options_ = merge(this.options_, options);
// Get ID from options or options element if one is supplied // Get ID from options or options element if one is supplied
this.id_ = options.id || (options.el && options.el.id); this.id_ = options.id || (options.el && options.el.id);
@ -215,7 +215,7 @@ class Component {
/** /**
* Deep merge of options objects with new options. * Deep merge of options objects with new options.
* > Note: When both `obj` and `options` contain properties whose values are objects. * > Note: When both `obj` and `options` contain properties whose values are objects.
* The two properties get merged using {@link module:mergeOptions} * The two properties get merged using {@link module:obj.merge}
* *
* @param {Object} obj * @param {Object} obj
* The object that contains new options. * The object that contains new options.
@ -228,7 +228,7 @@ class Component {
return this.options_; return this.options_;
} }
this.options_ = mergeOptions(this.options_, obj); this.options_ = merge(this.options_, obj);
return this.options_; return this.options_;
} }

View File

@ -1,5 +1,5 @@
import Component from './component.js'; import Component from './component.js';
import mergeOptions from './utils/merge-options.js'; import {merge} from './utils/obj.js';
import document from 'global/document'; import document from 'global/document';
import * as browser from './utils/browser.js'; import * as browser from './utils/browser.js';
import window from 'global/window'; import window from 'global/window';
@ -40,7 +40,7 @@ class LiveTracker extends Component {
*/ */
constructor(player, options) { constructor(player, options) {
// LiveTracker does not need an element // LiveTracker does not need an element
const options_ = mergeOptions(defaults, options, {createEl: false}); const options_ = merge(defaults, options, {createEl: false});
super(player, options_); super(player, options_);

View File

@ -23,8 +23,6 @@ import * as stylesheet from './utils/stylesheet.js';
import FullscreenApi from './fullscreen-api.js'; import FullscreenApi from './fullscreen-api.js';
import MediaError from './media-error.js'; import MediaError from './media-error.js';
import safeParseTuple from 'safe-json-parse/tuple'; import safeParseTuple from 'safe-json-parse/tuple';
import {assign} from './utils/obj';
import mergeOptions from './utils/merge-options.js';
import {silencePromise, isPromise} from './utils/promise'; import {silencePromise, isPromise} from './utils/promise';
import textTrackConverter from './tracks/text-track-list-converter.js'; import textTrackConverter from './tracks/text-track-list-converter.js';
import ModalDialog from './modal-dialog'; import ModalDialog from './modal-dialog';
@ -34,7 +32,7 @@ import {ALL as TRACK_TYPES} from './tracks/track-types';
import filterSource from './utils/filter-source'; import filterSource from './utils/filter-source';
import {getMimetype, findMimetype} from './utils/mimetypes'; import {getMimetype, findMimetype} from './utils/mimetypes';
import {hooks} from './utils/hooks'; import {hooks} from './utils/hooks';
import {isObject} from './utils/obj'; import {assign, merge, isObject} from './utils/obj';
import keycode from 'keycode'; import keycode from 'keycode';
// The following imports are used only to ensure that the corresponding modules // The following imports are used only to ensure that the corresponding modules
@ -504,7 +502,7 @@ class Player extends Component {
// as well so they don't need to reach back into the player for options later. // as well so they don't need to reach back into the player for options later.
// We also need to do another copy of this.options_ so we don't end up with // We also need to do another copy of this.options_ so we don't end up with
// an infinite loop. // an infinite loop.
const playerOptionsCopy = mergeOptions(this.options_); const playerOptionsCopy = merge(this.options_);
// Load plugins // Load plugins
if (options.plugins) { if (options.plugins) {
@ -1535,7 +1533,7 @@ class Player extends Component {
} }
// update `currentSource` cache always // update `currentSource` cache always
this.cache_.source = mergeOptions({}, srcObj, {src, type}); this.cache_.source = merge({}, srcObj, {src, type});
const matchingSources = this.cache_.sources.filter((s) => s.src && s.src === src); const matchingSources = this.cache_.sources.filter((s) => s.src && s.src === src);
const sourceElSources = []; const sourceElSources = [];
@ -4648,7 +4646,7 @@ class Player extends Component {
* An array of of supported languages * An array of of supported languages
*/ */
languages() { languages() {
return mergeOptions(Player.prototype.options_.languages, this.languages_); return merge(Player.prototype.options_.languages, this.languages_);
} }
/** /**
@ -4659,7 +4657,7 @@ class Player extends Component {
* Object representing the current of track info * Object representing the current of track info
*/ */
toJSON() { toJSON() {
const options = mergeOptions(this.options_); const options = merge(this.options_);
const tracks = options.tracks; const tracks = options.tracks;
options.tracks = []; options.tracks = [];
@ -4668,7 +4666,7 @@ class Player extends Component {
let track = tracks[i]; let track = tracks[i];
// deep merge tracks and null out player so no circular references // deep merge tracks and null out player so no circular references
track = mergeOptions(track); track = merge(track);
track.player = undefined; track.player = undefined;
options.tracks[i] = track; options.tracks[i] = track;
} }
@ -4942,7 +4940,7 @@ class Player extends Component {
this.reset(); this.reset();
// Clone the media object so it cannot be mutated from outside. // Clone the media object so it cannot be mutated from outside.
this.cache_.media = mergeOptions(media); this.cache_.media = merge(media);
const {artwork, poster, src, textTracks} = this.cache_.media; const {artwork, poster, src, textTracks} = this.cache_.media;
@ -5001,7 +4999,7 @@ class Player extends Component {
return media; return media;
} }
return mergeOptions(this.cache_.media); return merge(this.cache_.media);
} }
/** /**

View File

@ -4,7 +4,7 @@
import window from 'global/window'; import window from 'global/window';
import { debounce } from './utils/fn.js'; import { debounce } from './utils/fn.js';
import * as Events from './utils/events.js'; import * as Events from './utils/events.js';
import mergeOptions from './utils/merge-options.js'; import {merge} from './utils/obj.js';
import Component from './component.js'; import Component from './component.js';
/** /**
@ -47,7 +47,7 @@ class ResizeManager extends Component {
} }
// Only create an element when ResizeObserver isn't available // Only create an element when ResizeObserver isn't available
const options_ = mergeOptions({ const options_ = merge({
createEl: !RESIZE_OBSERVER_AVAILABLE, createEl: !RESIZE_OBSERVER_AVAILABLE,
reportTouchActivity: false reportTouchActivity: false
}, options); }, options);

View File

@ -8,8 +8,7 @@ import log from '../utils/log.js';
import * as browser from '../utils/browser.js'; import * as browser from '../utils/browser.js';
import document from 'global/document'; import document from 'global/document';
import window from 'global/window'; import window from 'global/window';
import {assign} from '../utils/obj'; import {assign, merge} from '../utils/obj';
import mergeOptions from '../utils/merge-options.js';
import {toTitleCase} from '../utils/str.js'; import {toTitleCase} from '../utils/str.js';
import {NORMAL as TRACK_TYPES, REMOTE} from '../tracks/track-types'; import {NORMAL as TRACK_TYPES, REMOTE} from '../tracks/track-types';
import setupSourceset from './setup-sourceset'; import setupSourceset from './setup-sourceset';
@ -385,7 +384,7 @@ class Html5 extends Tech {
// determine if native controls should be used // determine if native controls should be used
const tagAttributes = this.options_.tag && Dom.getAttributes(this.options_.tag); const tagAttributes = this.options_.tag && Dom.getAttributes(this.options_.tag);
const attributes = mergeOptions({}, tagAttributes); const attributes = merge({}, tagAttributes);
if (!browser.TOUCH_ENABLED || this.options_.nativeControlsForTouch !== true) { if (!browser.TOUCH_ENABLED || this.options_.nativeControlsForTouch !== true) {
delete attributes.controls; delete attributes.controls;

View File

@ -4,7 +4,7 @@
import Component from '../component.js'; import Component from '../component.js';
import Tech from './tech.js'; import Tech from './tech.js';
import {toTitleCase} from '../utils/str.js'; import {toTitleCase} from '../utils/str.js';
import mergeOptions from '../utils/merge-options.js'; import {merge} from '../utils/obj.js';
/** /**
* The `MediaLoader` is the `Component` that decides which playback technology to load * The `MediaLoader` is the `Component` that decides which playback technology to load
@ -28,7 +28,7 @@ class MediaLoader extends Component {
*/ */
constructor(player, options, ready) { constructor(player, options, ready) {
// MediaLoader has no element // MediaLoader has no element
const options_ = mergeOptions({createEl: false}, options); const options_ = merge({createEl: false}, options);
super(player, options_, ready); super(player, options_, ready);

View File

@ -1,6 +1,6 @@
import window from 'global/window'; import window from 'global/window';
import document from 'global/document'; import document from 'global/document';
import mergeOptions from '../utils/merge-options'; import {merge} from '../utils/obj';
import {getAbsoluteURL} from '../utils/url'; import {getAbsoluteURL} from '../utils/url';
/** /**
@ -183,7 +183,7 @@ const firstSourceWatch = function(tech) {
el[k] = appendWrapper(old[k]); el[k] = appendWrapper(old[k]);
}); });
Object.defineProperty(el, 'innerHTML', mergeOptions(innerDescriptor, { Object.defineProperty(el, 'innerHTML', merge(innerDescriptor, {
set: appendWrapper(innerDescriptor.set) set: appendWrapper(innerDescriptor.set)
})); }));
@ -252,7 +252,7 @@ const setupSourceset = function(tech) {
const oldSetAttribute = el.setAttribute; const oldSetAttribute = el.setAttribute;
const oldLoad = el.load; const oldLoad = el.load;
Object.defineProperty(el, 'src', mergeOptions(srcDescriptor, { Object.defineProperty(el, 'src', merge(srcDescriptor, {
set: (v) => { set: (v) => {
const retval = srcDescriptor.set.call(el, v); const retval = srcDescriptor.set.call(el, v);

View File

@ -3,7 +3,6 @@
*/ */
import Component from '../component'; import Component from '../component';
import mergeOptions from '../utils/merge-options.js';
import * as Fn from '../utils/fn.js'; import * as Fn from '../utils/fn.js';
import log from '../utils/log.js'; import log from '../utils/log.js';
import { createTimeRange } from '../utils/time-ranges.js'; import { createTimeRange } from '../utils/time-ranges.js';
@ -11,7 +10,7 @@ import { bufferedPercent } from '../utils/buffer.js';
import MediaError from '../media-error.js'; import MediaError from '../media-error.js';
import window from 'global/window'; import window from 'global/window';
import document from 'global/document'; import document from 'global/document';
import {isPlain} from '../utils/obj'; import {isPlain, merge} from '../utils/obj';
import * as TRACK_TYPES from '../tracks/track-types'; import * as TRACK_TYPES from '../tracks/track-types';
import {toTitleCase, toLowerCase} from '../utils/str.js'; import {toTitleCase, toLowerCase} from '../utils/str.js';
import vtt from 'videojs-vtt.js'; import vtt from 'videojs-vtt.js';
@ -743,7 +742,7 @@ class Tech extends Component {
* The track element that gets created. * The track element that gets created.
*/ */
createRemoteTextTrack(options) { createRemoteTextTrack(options) {
const track = mergeOptions(options, { const track = merge(options, {
tech: this tech: this
}); });

View File

@ -1,6 +1,6 @@
import {AudioTrackKind} from './track-enums'; import {AudioTrackKind} from './track-enums';
import Track from './track'; import Track from './track';
import merge from '../utils/merge-options'; import {merge} from '../utils/obj';
/** /**
* A representation of a single `AudioTrack`. If it is part of an {@link AudioTrackList} * A representation of a single `AudioTrack`. If it is part of an {@link AudioTrackList}

View File

@ -9,7 +9,7 @@ import window from 'global/window';
import Track from './track.js'; import Track from './track.js';
import { isCrossOrigin } from '../utils/url.js'; import { isCrossOrigin } from '../utils/url.js';
import XHR from '@videojs/xhr'; import XHR from '@videojs/xhr';
import merge from '../utils/merge-options'; import {merge} from '../utils/obj';
/** /**
* Takes a webvtt file contents and parses it into cues * Takes a webvtt file contents and parses it into cues

View File

@ -1,6 +1,6 @@
import {VideoTrackKind} from './track-enums'; import {VideoTrackKind} from './track-enums';
import Track from './track'; import Track from './track';
import merge from '../utils/merge-options'; import {merge} from '../utils/obj';
/** /**
* A representation of a single `VideoTrack`. * A representation of a single `VideoTrack`.

View File

@ -1,7 +0,0 @@
/**
* @file merge-options.js
* @module merge-options
*/
import {merge} from './obj';
export default merge;

View File

@ -109,7 +109,6 @@ const normalizeId = (id) => id.indexOf('#') === 0 ? id.slice(1) : id;
* @borrows module:format-time.formatTime as formatTime * @borrows module:format-time.formatTime as formatTime
* @borrows module:format-time.resetFormatTime as resetFormatTime * @borrows module:format-time.resetFormatTime as resetFormatTime
* @borrows module:format-time.setFormatTime as setFormatTime * @borrows module:format-time.setFormatTime as setFormatTime
* @borrows module:merge-options.mergeOptions as mergeOptions
* @borrows module:middleware.use as use * @borrows module:middleware.use as use
* @borrows Player.players as players * @borrows Player.players as players
* @borrows Plugin.registerPlugin as registerPlugin * @borrows Plugin.registerPlugin as registerPlugin

View File

@ -208,8 +208,6 @@ QUnit.test('should export useful components to the public', function(assert) {
assert.ok(videojs.getComponent('ChaptersButton'), 'ChaptersButton should be public'); assert.ok(videojs.getComponent('ChaptersButton'), 'ChaptersButton should be public');
assert.ok(videojs.getComponent('ChaptersTrackMenuItem'), assert.ok(videojs.getComponent('ChaptersTrackMenuItem'),
'ChaptersTrackMenuItem should be public'); 'ChaptersTrackMenuItem should be public');
assert.ok(videojs.mergeOptions, 'mergeOptions should be public');
}); });
QUnit.test('should be able to initialize player twice on the same tag using string reference', function(assert) { QUnit.test('should be able to initialize player twice on the same tag using string reference', function(assert) {

View File

@ -63,7 +63,7 @@ QUnit.module('autoplay', {
videoTag.setAttribute(a, attributes[a]); videoTag.setAttribute(a, attributes[a]);
}); });
this.player = videojs(videoTag.id, videojs.mergeOptions({techOrder: ['techFaker']}, options)); this.player = videojs(videoTag.id, videojs.obj.merge({techOrder: ['techFaker']}, options));
const oldMuted = this.player.muted; const oldMuted = this.player.muted;
this.player.play = () => { this.player.play = () => {

View File

@ -51,7 +51,7 @@ const mainModule = function(playReturnValue, middlewareTermination, subhooks) {
}; };
this.checkState = (assertName, options = {}) => { this.checkState = (assertName, options = {}) => {
const expectedState = videojs.mergeOptions({ const expectedState = videojs.obj.merge({
playCalls: 0, playCalls: 0,
techLoaded: false, techLoaded: false,
techReady: false, techReady: false,

View File

@ -1,36 +0,0 @@
/* eslint-env qunit */
import mergeOptions from '../../../src/js/utils/merge-options.js';
QUnit.module('merge-options');
QUnit.test('should merge options objects', function(assert) {
const ob1 = {
a: true,
b: { b1: true, b2: true, b3: true },
c: true
};
const ob2 = {
// override value
a: false,
// merge sub-option values
b: { b1: true, b2: false, b4: true },
// add new option
d: true
};
const ob3 = mergeOptions(ob1, ob2);
assert.deepEqual(ob3, {
a: false,
b: { b1: true, b2: false, b3: true, b4: true },
c: true,
d: true
}, 'options objects merged correctly');
});
QUnit.test('should ignore non-objects', function(assert) {
const obj = { a: 1 };
assert.deepEqual(mergeOptions(obj, true), obj, 'ignored non-object input');
});

View File

@ -1,6 +1,6 @@
/* eslint-env qunit */ /* eslint-env qunit */
import sinon from 'sinon'; import sinon from 'sinon';
import * as Obj from '../../../src/js/utils/obj'; import * as obj from '../../../src/js/utils/obj';
QUnit.module('utils/obj'); QUnit.module('utils/obj');
@ -24,7 +24,7 @@ const passFail = (assert, fn, descriptor, passes, failures) => {
QUnit.test('each', function(assert) { QUnit.test('each', function(assert) {
const spy = sinon.spy(); const spy = sinon.spy();
Obj.each({ obj.each({
a: 1, a: 1,
b: 'foo', b: 'foo',
c: null c: null
@ -35,12 +35,12 @@ QUnit.test('each', function(assert) {
assert.ok(spy.calledWith('foo', 'b')); assert.ok(spy.calledWith('foo', 'b'));
assert.ok(spy.calledWith(null, 'c')); assert.ok(spy.calledWith(null, 'c'));
Obj.each({}, spy); obj.each({}, spy);
assert.strictEqual(spy.callCount, 3, 'an empty object was not iterated over'); assert.strictEqual(spy.callCount, 3, 'an empty object was not iterated over');
}); });
QUnit.test('reduce', function(assert) { QUnit.test('reduce', function(assert) {
const first = Obj.reduce({ const first = obj.reduce({
a: 1, a: 1,
b: 2, b: 2,
c: 3, c: 3,
@ -49,7 +49,7 @@ QUnit.test('reduce', function(assert) {
assert.strictEqual(first, 10); assert.strictEqual(first, 10);
const second = Obj.reduce({ const second = obj.reduce({
a: 1, a: 1,
b: 2, b: 2,
c: 3, c: 3,
@ -58,7 +58,7 @@ QUnit.test('reduce', function(assert) {
assert.strictEqual(second, 20); assert.strictEqual(second, 20);
const third = Obj.reduce({ const third = obj.reduce({
a: 1, a: 1,
b: 2, b: 2,
c: 3, c: 3,
@ -75,7 +75,7 @@ QUnit.test('reduce', function(assert) {
}); });
QUnit.test('isObject', function(assert) { QUnit.test('isObject', function(assert) {
passFail(assert, Obj.isObject, 'an object', { passFail(assert, obj.isObject, 'an object', {
'plain object': {}, 'plain object': {},
'constructed object': new Foo(), 'constructed object': new Foo(),
'array': [], 'array': [],
@ -91,7 +91,7 @@ QUnit.test('isObject', function(assert) {
}); });
QUnit.test('isPlain', function(assert) { QUnit.test('isPlain', function(assert) {
passFail(assert, Obj.isPlain, 'a plain object', { passFail(assert, obj.isPlain, 'a plain object', {
'plain object': {} 'plain object': {}
}, { }, {
'constructed object': new Foo(), 'constructed object': new Foo(),
@ -134,21 +134,21 @@ QUnit.module('utils/obj.assign', function() {
QUnit.test('override object', function(assert) { QUnit.test('override object', function(assert) {
const foo = {foo: 'yellow'}; const foo = {foo: 'yellow'};
assert.deepEqual(Obj.assign(foo, {foo: 'blue'}), {foo: 'blue'}, 'Obj.assign should return overriden result'); assert.deepEqual(obj.assign(foo, {foo: 'blue'}), {foo: 'blue'}, 'obj.assign should return overriden result');
assert.deepEqual(foo, {foo: 'blue'}, 'foo should be modified directly'); assert.deepEqual(foo, {foo: 'blue'}, 'foo should be modified directly');
}); });
QUnit.test('new object', function(assert) { QUnit.test('new object', function(assert) {
const foo = {foo: 'yellow'}; const foo = {foo: 'yellow'};
assert.deepEqual(Obj.assign({}, foo, {foo: 'blue'}), {foo: 'blue'}, 'Obj.assign should return result'); assert.deepEqual(obj.assign({}, foo, {foo: 'blue'}), {foo: 'blue'}, 'obj.assign should return result');
assert.deepEqual(foo, {foo: 'yellow'}, 'foo should not be modified'); assert.deepEqual(foo, {foo: 'yellow'}, 'foo should not be modified');
}); });
QUnit.test('empty override', function(assert) { QUnit.test('empty override', function(assert) {
const foo = {foo: 'yellow'}; const foo = {foo: 'yellow'};
assert.deepEqual(Obj.assign(foo, {}), {foo: 'yellow'}, 'Obj.assign should return result'); assert.deepEqual(obj.assign(foo, {}), {foo: 'yellow'}, 'obj.assign should return result');
assert.deepEqual(foo, {foo: 'yellow'}, 'foo should not be modified'); assert.deepEqual(foo, {foo: 'yellow'}, 'foo should not be modified');
}); });
@ -157,7 +157,7 @@ QUnit.module('utils/obj.assign', function() {
const bar = {foo: 'bar'}; const bar = {foo: 'bar'};
const baz = {foo: 'baz'}; const baz = {foo: 'baz'};
assert.deepEqual(Obj.assign(foo, bar, baz), baz, 'Obj.assign should return result'); assert.deepEqual(obj.assign(foo, bar, baz), baz, 'obj.assign should return result');
assert.deepEqual(foo, baz, 'foo should be overridden'); assert.deepEqual(foo, baz, 'foo should be overridden');
}); });
@ -165,7 +165,7 @@ QUnit.module('utils/obj.assign', function() {
const foo = {}; const foo = {};
const expected = {one: 1, two: 2, three: 3}; const expected = {one: 1, two: 2, three: 3};
assert.deepEqual(Obj.assign(foo, {one: 1}, {two: 2}, {three: 3}), expected, 'Obj.assign should return result'); assert.deepEqual(obj.assign(foo, {one: 1}, {two: 2}, {three: 3}), expected, 'obj.assign should return result');
assert.deepEqual(foo, expected, 'foo should be equal to result'); assert.deepEqual(foo, expected, 'foo should be equal to result');
}); });
@ -199,23 +199,55 @@ QUnit.module('utils/obj.assign', function() {
red: 'nope' red: 'nope'
}; };
assert.deepEqual(Obj.assign(foo, baz), expected, 'Obj.assign should return result'); assert.deepEqual(obj.assign(foo, baz), expected, 'obj.assign should return result');
assert.deepEqual(foo, expected, 'foo is overridden'); assert.deepEqual(foo, expected, 'foo is overridden');
}); });
QUnit.test('negative tests', function(assert) { QUnit.test('negative tests', function(assert) {
const expected = {foo: 11}; const expected = {foo: 11};
assert.deepEqual(Obj.assign({}, expected, undefined), expected, 'assign should undefined'); assert.deepEqual(obj.assign({}, expected, undefined), expected, 'assign should undefined');
assert.deepEqual(Obj.assign({}, expected, null), expected, 'assign should ignore null'); assert.deepEqual(obj.assign({}, expected, null), expected, 'assign should ignore null');
assert.deepEqual(Obj.assign({}, expected, []), expected, 'assign should ignore Array'); assert.deepEqual(obj.assign({}, expected, []), expected, 'assign should ignore Array');
assert.deepEqual(Obj.assign({}, expected, ''), expected, 'assign should ignore string'); assert.deepEqual(obj.assign({}, expected, ''), expected, 'assign should ignore string');
assert.deepEqual(Obj.assign({}, expected, 11), expected, 'assign should ignore number'); assert.deepEqual(obj.assign({}, expected, 11), expected, 'assign should ignore number');
assert.deepEqual(Obj.assign({}, expected, new RegExp()), expected, 'assign should ignore RegExp'); assert.deepEqual(obj.assign({}, expected, new RegExp()), expected, 'assign should ignore RegExp');
assert.deepEqual(Obj.assign({}, expected, new Date()), expected, 'assign should ignore Date'); assert.deepEqual(obj.assign({}, expected, new Date()), expected, 'assign should ignore Date');
assert.deepEqual(Obj.assign({}, expected, true), expected, 'assign should ignore boolean'); assert.deepEqual(obj.assign({}, expected, true), expected, 'assign should ignore boolean');
assert.deepEqual(Obj.assign({}, expected, () => {}), expected, 'assign should ignore function'); assert.deepEqual(obj.assign({}, expected, () => {}), expected, 'assign should ignore function');
}); });
}); });
}); });
QUnit.test('utils/obj.merge', function(assert) {
const ob1 = {
a: true,
b: {b1: true, b2: true, b3: true},
c: true
};
const ob2 = {
// override value
a: false,
// merge sub-option values
b: { b1: true, b2: false, b4: true },
// add new option
d: true
};
const ob3 = obj.merge(ob1, ob2);
assert.deepEqual(ob3, {
a: false,
b: {b1: true, b2: false, b3: true, b4: true},
c: true,
d: true
}, 'options objects merged correctly');
});
QUnit.test('utils/obj.merge: should ignore non-objects', function(assert) {
const target = {a: 1};
assert.deepEqual(obj.merge(target, true), target, 'ignored non-object input');
});