Path: blob/main/src/vs/platform/configuration/test/common/configuration.test.ts
3296 views
/*---------------------------------------------------------------------------------------------1* Copyright (c) Microsoft Corporation. All rights reserved.2* Licensed under the MIT License. See License.txt in the project root for license information.3*--------------------------------------------------------------------------------------------*/4import assert from 'assert';5import { merge, removeFromValueTree } from '../../common/configuration.js';6import { mergeChanges } from '../../common/configurationModels.js';7import { ensureNoDisposablesAreLeakedInTestSuite } from '../../../../base/test/common/utils.js';89suite('Configuration', () => {1011ensureNoDisposablesAreLeakedInTestSuite();1213test('simple merge', () => {14let base = { 'a': 1, 'b': 2 };15merge(base, { 'a': 3, 'c': 4 }, true);16assert.deepStrictEqual(base, { 'a': 3, 'b': 2, 'c': 4 });17base = { 'a': 1, 'b': 2 };18merge(base, { 'a': 3, 'c': 4 }, false);19assert.deepStrictEqual(base, { 'a': 1, 'b': 2, 'c': 4 });20});2122test('object merge', () => {23const base = { 'a': { 'b': 1, 'c': true, 'd': 2 } };24merge(base, { 'a': { 'b': undefined, 'c': false, 'e': 'a' } }, true);25assert.deepStrictEqual(base, { 'a': { 'b': undefined, 'c': false, 'd': 2, 'e': 'a' } });26});2728test('array merge', () => {29const base = { 'a': ['b', 'c'] };30merge(base, { 'a': ['b', 'd'] }, true);31assert.deepStrictEqual(base, { 'a': ['b', 'd'] });32});3334test('removeFromValueTree: remove a non existing key', () => {35const target = { 'a': { 'b': 2 } };3637removeFromValueTree(target, 'c');3839assert.deepStrictEqual(target, { 'a': { 'b': 2 } });40});4142test('removeFromValueTree: remove a multi segmented key from an object that has only sub sections of the key', () => {43const target = { 'a': { 'b': 2 } };4445removeFromValueTree(target, 'a.b.c');4647assert.deepStrictEqual(target, { 'a': { 'b': 2 } });48});4950test('removeFromValueTree: remove a single segmented key', () => {51const target = { 'a': 1 };5253removeFromValueTree(target, 'a');5455assert.deepStrictEqual(target, {});56});5758test('removeFromValueTree: remove a single segmented key when its value is undefined', () => {59const target = { 'a': undefined };6061removeFromValueTree(target, 'a');6263assert.deepStrictEqual(target, {});64});6566test('removeFromValueTree: remove a multi segmented key when its value is undefined', () => {67const target = { 'a': { 'b': 1 } };6869removeFromValueTree(target, 'a.b');7071assert.deepStrictEqual(target, {});72});7374test('removeFromValueTree: remove a multi segmented key when its value is array', () => {75const target = { 'a': { 'b': [1] } };7677removeFromValueTree(target, 'a.b');7879assert.deepStrictEqual(target, {});80});8182test('removeFromValueTree: remove a multi segmented key first segment value is array', () => {83const target = { 'a': [1] };8485removeFromValueTree(target, 'a.0');8687assert.deepStrictEqual(target, { 'a': [1] });88});8990test('removeFromValueTree: remove when key is the first segmenet', () => {91const target = { 'a': { 'b': 1 } };9293removeFromValueTree(target, 'a');9495assert.deepStrictEqual(target, {});96});9798test('removeFromValueTree: remove a multi segmented key when the first node has more values', () => {99const target = { 'a': { 'b': { 'c': 1 }, 'd': 1 } };100101removeFromValueTree(target, 'a.b.c');102103assert.deepStrictEqual(target, { 'a': { 'd': 1 } });104});105106test('removeFromValueTree: remove a multi segmented key when in between node has more values', () => {107const target = { 'a': { 'b': { 'c': { 'd': 1 }, 'd': 1 } } };108109removeFromValueTree(target, 'a.b.c.d');110111assert.deepStrictEqual(target, { 'a': { 'b': { 'd': 1 } } });112});113114test('removeFromValueTree: remove a multi segmented key when the last but one node has more values', () => {115const target = { 'a': { 'b': { 'c': 1, 'd': 1 } } };116117removeFromValueTree(target, 'a.b.c');118119assert.deepStrictEqual(target, { 'a': { 'b': { 'd': 1 } } });120});121122});123124suite('Configuration Changes: Merge', () => {125126ensureNoDisposablesAreLeakedInTestSuite();127128test('merge only keys', () => {129const actual = mergeChanges({ keys: ['a', 'b'], overrides: [] }, { keys: ['c', 'd'], overrides: [] });130assert.deepStrictEqual(actual, { keys: ['a', 'b', 'c', 'd'], overrides: [] });131});132133test('merge only keys with duplicates', () => {134const actual = mergeChanges({ keys: ['a', 'b'], overrides: [] }, { keys: ['c', 'd'], overrides: [] }, { keys: ['a', 'd', 'e'], overrides: [] });135assert.deepStrictEqual(actual, { keys: ['a', 'b', 'c', 'd', 'e'], overrides: [] });136});137138test('merge only overrides', () => {139const actual = mergeChanges({ keys: [], overrides: [['a', ['1', '2']]] }, { keys: [], overrides: [['b', ['3', '4']]] });140assert.deepStrictEqual(actual, { keys: [], overrides: [['a', ['1', '2']], ['b', ['3', '4']]] });141});142143test('merge only overrides with duplicates', () => {144const actual = mergeChanges({ keys: [], overrides: [['a', ['1', '2']], ['b', ['5', '4']]] }, { keys: [], overrides: [['b', ['3', '4']]] }, { keys: [], overrides: [['c', ['1', '4']], ['a', ['2', '3']]] });145assert.deepStrictEqual(actual, { keys: [], overrides: [['a', ['1', '2', '3']], ['b', ['5', '4', '3']], ['c', ['1', '4']]] });146});147148test('merge', () => {149const actual = mergeChanges({ keys: ['b', 'b'], overrides: [['a', ['1', '2']], ['b', ['5', '4']]] }, { keys: ['b'], overrides: [['b', ['3', '4']]] }, { keys: ['c', 'a'], overrides: [['c', ['1', '4']], ['a', ['2', '3']]] });150assert.deepStrictEqual(actual, { keys: ['b', 'c', 'a'], overrides: [['a', ['1', '2', '3']], ['b', ['5', '4', '3']], ['c', ['1', '4']]] });151});152153test('merge single change', () => {154const actual = mergeChanges({ keys: ['b', 'b'], overrides: [['a', ['1', '2']], ['b', ['5', '4']]] });155assert.deepStrictEqual(actual, { keys: ['b', 'b'], overrides: [['a', ['1', '2']], ['b', ['5', '4']]] });156});157158test('merge no changes', () => {159const actual = mergeChanges();160assert.deepStrictEqual(actual, { keys: [], overrides: [] });161});162163});164165166