var assert = require('assert'); var util = require('../lib/util'); // // The important thing with mergeOptions() is that 'enabled' is always set in target option. // describe('util.mergeOptions', function () { it('handles good input without global options', function () { var options = { someValue: "silly value", aBoolOption: false, anObject: { answer:42 }, anotherObject: { enabled: false, }, merge: null }; // Case with empty target var mergeTarget = {}; util.mergeOptions(mergeTarget, options, 'someValue'); assert(mergeTarget.someValue === undefined, 'Non-object option should not be copied'); assert(mergeTarget.anObject === undefined); util.mergeOptions(mergeTarget, options, 'aBoolOption'); assert(mergeTarget.aBoolOption !== undefined, 'option aBoolOption should now be an object'); assert(mergeTarget.aBoolOption.enabled === false, 'enabled value option aBoolOption should have been copied into object'); util.mergeOptions(mergeTarget, options, 'anObject'); assert(mergeTarget.anObject !== undefined, 'Option object is not copied'); assert(mergeTarget.anObject.answer === 42); assert(mergeTarget.anObject.enabled === true); util.mergeOptions(mergeTarget, options, 'anotherObject'); assert(mergeTarget.anotherObject.enabled === false, 'enabled value from options must have priority'); util.mergeOptions(mergeTarget, options, 'merge'); assert(mergeTarget.merge === undefined, 'Explicit null option should not be copied, there is no global option for it'); // Case with non-empty target mergeTarget = { someValue: false, aBoolOption: true, anObject: { answer: 49 }, anotherObject: { enabled: true, }, merge: 'hello' }; util.mergeOptions(mergeTarget, options, 'someValue'); assert(mergeTarget.someValue === false, 'Non-object option should not be copied'); assert(mergeTarget.anObject.answer === 49, 'Sibling option should not be changed'); util.mergeOptions(mergeTarget, options, 'aBoolOption'); assert(mergeTarget.aBoolOption !== true, 'option enabled should have been overwritten'); assert(mergeTarget.aBoolOption.enabled === false, 'enabled value option aBoolOption should have been copied into object'); util.mergeOptions(mergeTarget, options, 'anObject'); assert(mergeTarget.anObject.answer === 42); assert(mergeTarget.anObject.enabled === true); util.mergeOptions(mergeTarget, options, 'anotherObject'); assert(mergeTarget.anotherObject !== undefined, 'Option object is not copied'); assert(mergeTarget.anotherObject.enabled === false, 'enabled value from options must have priority'); util.mergeOptions(mergeTarget, options, 'merge'); assert(mergeTarget.merge === 'hello', 'Explicit null-option should not be copied, already present in target'); }); it('gracefully handles bad input', function () { var mergeTarget = {}; var options = { merge: null }; var errMsg = 'Non-object parameters should not be accepted'; assert.throws(() => util.mergeOptions(null, options, 'anything'), Error, errMsg); assert.throws(() => util.mergeOptions(undefined, options, 'anything'), Error, errMsg); assert.throws(() => util.mergeOptions(42, options, 'anything'), Error, errMsg); assert.throws(() => util.mergeOptions(mergeTarget, null, 'anything'), Error, errMsg); assert.throws(() => util.mergeOptions(mergeTarget, undefined, 'anything'), Error, errMsg); assert.throws(() => util.mergeOptions(mergeTarget, 42, 'anything'), Error, errMsg); assert.throws(() => util.mergeOptions(mergeTarget, options, null), Error, errMsg); assert.throws(() => util.mergeOptions(mergeTarget, options, undefined), Error, errMsg); assert.throws(() => util.mergeOptions(mergeTarget, options, 'anything', null), Error, errMsg); assert.throws(() => util.mergeOptions(mergeTarget, options, 'anything', 'not an object'), Error, errMsg); util.mergeOptions(mergeTarget, options, 'iDontExist'); assert(mergeTarget.iDontExist === undefined); }); it('handles good input with global options', function () { var mergeTarget = { }; var options = { merge: null, missingEnabled: { answer: 42 }, alsoMissingEnabled: { // has no enabled in globals answer: 42 } }; var globalOptions = { merge: { enabled: false }, missingEnabled: { enabled: false } }; util.mergeOptions(mergeTarget, options, 'merge', globalOptions); assert(mergeTarget.merge.enabled === false, "null-option should create an empty target object"); util.mergeOptions(mergeTarget, options, 'missingEnabled', globalOptions); assert(mergeTarget.missingEnabled.enabled === false); util.mergeOptions(mergeTarget, options, 'alsoMissingEnabled', globalOptions); assert(mergeTarget.alsoMissingEnabled.enabled === true); }); });