test('simple merge', () => {
		let base = new ConfigurationModel({ 'a': 1, 'b': 2 }, ['a', 'b']);
		let add = new ConfigurationModel({ 'a': 3, 'c': 4 }, ['a', 'c']);
		let result = base.merge(add);

		assert.deepEqual(result.contents, { 'a': 3, 'b': 2, 'c': 4 });
		assert.deepEqual(result.keys, ['a', 'b', 'c']);
	});
	test('setValue for a key that has sections and not defined', () => {
		let testObject = new ConfigurationModel({ 'a': { 'b': 1 }, 'f': 1 }, ['a.b', 'f']);

		testObject.setValue('b.c', 1);

		assert.deepEqual(testObject.contents, { 'a': { 'b': 1 }, 'b': { 'c': 1 }, 'f': 1 });
		assert.deepEqual(testObject.keys, ['a.b', 'f', 'b.c']);
	});
	test('removeValue: remove a multi segemented key', () => {
		let testObject = new ConfigurationModel({ 'a': { 'b': 1 } }, ['a.b']);

		testObject.removeValue('a.b');

		assert.deepEqual(testObject.contents, {});
		assert.deepEqual(testObject.keys, []);
	});
	test('removeValue: remove a non existing key', () => {
		let testObject = new ConfigurationModel({ 'a': { 'b': 2 } }, ['a.b']);

		testObject.removeValue('a.b.c');

		assert.deepEqual(testObject.contents, { 'a': { 'b': 2 } });
		assert.deepEqual(testObject.keys, ['a.b']);
	});
	test('removeValue: remove a single segmented key', () => {
		let testObject = new ConfigurationModel({ 'a': 1 }, ['a']);

		testObject.removeValue('a');

		assert.deepEqual(testObject.contents, {});
		assert.deepEqual(testObject.keys, []);
	});
	test('setValueInOverrides adds a nested key to overrides if exist', () => {
		let testObject = new ConfigurationModel({ 'a': 1, 'b': 1 }, ['a'], [{ identifiers: ['or'], contents: { 'a': { 'c': 1 } } }]);

		testObject.setValueInOverrides('or', 'a.c', 2);

		assert.deepEqual(testObject.overrides[0].contents, { 'a': { 'c': 2 } });
		assert.deepEqual(testObject.override('or').contents, { 'a': { 'c': 2 }, 'b': 1 });
	});
	test('setValueInOverrides adds to overrides if does not exist', () => {
		let testObject = new ConfigurationModel({ 'a': 1, 'b': 1 }, ['a']);

		testObject.setValueInOverrides('or', 'a', 2);

		assert.deepEqual(testObject.overrides[0].contents, { 'a': 2 });
		assert.deepEqual(testObject.override('or').contents, { 'a': 2, 'b': 1 });
	});
	test('recursive merge', () => {
		let base = new ConfigurationModel({ 'a': { 'b': 1 } }, ['a.b']);
		let add = new ConfigurationModel({ 'a': { 'b': 2 } }, ['a.b']);
		let result = base.merge(add);

		assert.deepEqual(result.contents, { 'a': { 'b': 2 } });
		assert.deepEqual(result.getValue('a'), { 'b': 2 });
		assert.deepEqual(result.keys, ['a.b']);
	});
	test('recursive merge overrides', () => {
		let base = new ConfigurationModel({ 'a': { 'b': 1 }, 'f': 1 }, ['a.b', 'f'], [{ identifiers: ['c'], contents: { 'a': { 'd': 1 } } }]);
		let add = new ConfigurationModel({ 'a': { 'b': 2 } }, ['a.b'], [{ identifiers: ['c'], contents: { 'a': { 'e': 2 } } }]);
		let result = base.merge(add);

		assert.deepEqual(result.contents, { 'a': { 'b': 2 }, 'f': 1 });
		assert.deepEqual(result.overrides, [{ identifiers: ['c'], contents: { 'a': { 'd': 1, 'e': 2 } } }]);
		assert.deepEqual(result.override('c').contents, { 'a': { 'b': 2, 'd': 1, 'e': 2 }, 'f': 1 });
		assert.deepEqual(result.keys, ['a.b', 'f']);
	});
	test('setValueInOverrides adds new overrides if exist', () => {
		let testObject = new ConfigurationModel({ 'a': 1, 'b': 1 }, ['a'], [{ identifiers: ['or1'], contents: { 'a': 2 } }]);

		testObject.setValueInOverrides('or2', 'b', 2);

		assert.deepEqual(testObject.overrides[0].contents, { 'a': 2 });
		assert.deepEqual(testObject.overrides[1].contents, { 'b': 2 });
		assert.deepEqual(testObject.override('or1').contents, { 'a': 2, 'b': 1 });
		assert.deepEqual(testObject.override('or2').contents, { 'a': 1, 'b': 2 });
	});