|
@ -0,0 +1,134 @@ |
|
|
|
|
|
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); |
|
|
|
|
|
}); |
|
|
|
|
|
}); |