Path: blob/main/src/vs/platform/configuration/test/common/configurations.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*--------------------------------------------------------------------------------------------*/45import assert from 'assert';6import { Event } from '../../../../base/common/event.js';7import { equals } from '../../../../base/common/objects.js';8import { ensureNoDisposablesAreLeakedInTestSuite } from '../../../../base/test/common/utils.js';9import { Extensions, IConfigurationNode, IConfigurationRegistry } from '../../common/configurationRegistry.js';10import { DefaultConfiguration } from '../../common/configurations.js';11import { NullLogService } from '../../../log/common/log.js';12import { Registry } from '../../../registry/common/platform.js';1314suite('DefaultConfiguration', () => {1516const disposables = ensureNoDisposablesAreLeakedInTestSuite();17const configurationRegistry = Registry.as<IConfigurationRegistry>(Extensions.Configuration);1819setup(() => reset());20teardown(() => reset());2122function reset() {23configurationRegistry.deregisterConfigurations(configurationRegistry.getConfigurations());24configurationRegistry.deregisterDefaultConfigurations(configurationRegistry.getRegisteredDefaultConfigurations());25}2627test('Test registering a property before initialize', async () => {28const testObject = disposables.add(new DefaultConfiguration(new NullLogService()));29configurationRegistry.registerConfiguration({30'id': 'a',31'order': 1,32'title': 'a',33'type': 'object',34'properties': {35'a': {36'description': 'a',37'type': 'boolean',38'default': false,39}40}41});42const actual = await testObject.initialize();43assert.strictEqual(actual.getValue('a'), false);44});4546test('Test registering a property and do not initialize', async () => {47const testObject = disposables.add(new DefaultConfiguration(new NullLogService()));48configurationRegistry.registerConfiguration({49'id': 'a',50'order': 1,51'title': 'a',52'type': 'object',53'properties': {54'a': {55'description': 'a',56'type': 'boolean',57'default': false,58}59}60});61assert.strictEqual(testObject.configurationModel.getValue('a'), undefined);62});6364test('Test registering a property after initialize', async () => {65const testObject = disposables.add(new DefaultConfiguration(new NullLogService()));66await testObject.initialize();67const promise = Event.toPromise(testObject.onDidChangeConfiguration);68configurationRegistry.registerConfiguration({69'id': 'a',70'order': 1,71'title': 'a',72'type': 'object',73'properties': {74'defaultConfiguration.testSetting1': {75'description': 'a',76'type': 'boolean',77'default': false,78}79}80});81const { defaults: actual, properties } = await promise;82assert.strictEqual(actual.getValue('defaultConfiguration.testSetting1'), false);83assert.deepStrictEqual(properties, ['defaultConfiguration.testSetting1']);84});8586test('Test registering nested properties', async () => {87const testObject = disposables.add(new DefaultConfiguration(new NullLogService()));88configurationRegistry.registerConfiguration({89'id': 'a',90'order': 1,91'title': 'a',92'type': 'object',93'properties': {94'a.b': {95'description': '1',96'type': 'object',97'default': {},98},99'a.b.c': {100'description': '2',101'type': 'object',102'default': '2',103}104}105});106107const actual = await testObject.initialize();108109assert.ok(equals(actual.getValue('a'), { b: { c: '2' } }));110assert.ok(equals(actual.contents, { 'a': { b: { c: '2' } } }));111assert.deepStrictEqual(actual.keys.sort(), ['a.b', 'a.b.c']);112});113114test('Test registering the same property again', async () => {115const testObject = disposables.add(new DefaultConfiguration(new NullLogService()));116configurationRegistry.registerConfiguration({117'id': 'a',118'order': 1,119'title': 'a',120'type': 'object',121'properties': {122'a': {123'description': 'a',124'type': 'boolean',125'default': true,126}127}128});129configurationRegistry.registerConfiguration({130'id': 'a',131'order': 1,132'title': 'a',133'type': 'object',134'properties': {135'a': {136'description': 'a',137'type': 'boolean',138'default': false,139}140}141});142const actual = await testObject.initialize();143assert.strictEqual(true, actual.getValue('a'));144});145146test('Test registering an override identifier', async () => {147const testObject = disposables.add(new DefaultConfiguration(new NullLogService()));148configurationRegistry.registerDefaultConfigurations([{149overrides: {150'[a]': {151'b': true152}153}154}]);155const actual = await testObject.initialize();156assert.ok(equals(actual.getValue('[a]'), { 'b': true }));157assert.ok(equals(actual.contents, { '[a]': { 'b': true } }));158assert.ok(equals(actual.overrides, [{ contents: { 'b': true }, identifiers: ['a'], keys: ['b'] }]));159assert.deepStrictEqual(actual.keys.sort(), ['[a]']);160assert.strictEqual(actual.getOverrideValue('b', 'a'), true);161});162163test('Test registering a normal property and override identifier', async () => {164const testObject = disposables.add(new DefaultConfiguration(new NullLogService()));165configurationRegistry.registerConfiguration({166'id': 'a',167'order': 1,168'title': 'a',169'type': 'object',170'properties': {171'b': {172'description': 'b',173'type': 'boolean',174'default': false,175}176}177});178179configurationRegistry.registerDefaultConfigurations([{180overrides: {181'[a]': {182'b': true183}184}185}]);186187const actual = await testObject.initialize();188assert.deepStrictEqual(actual.getValue('b'), false);189assert.ok(equals(actual.getValue('[a]'), { 'b': true }));190assert.ok(equals(actual.contents, { 'b': false, '[a]': { 'b': true } }));191assert.ok(equals(actual.overrides, [{ contents: { 'b': true }, identifiers: ['a'], keys: ['b'] }]));192assert.deepStrictEqual(actual.keys.sort(), ['[a]', 'b']);193assert.strictEqual(actual.getOverrideValue('b', 'a'), true);194});195196test('Test normal property is registered after override identifier', async () => {197const testObject = disposables.add(new DefaultConfiguration(new NullLogService()));198const promise = Event.toPromise(testObject.onDidChangeConfiguration);199configurationRegistry.registerDefaultConfigurations([{200overrides: {201'[a]': {202'b': true203}204}205}]);206207await testObject.initialize();208209configurationRegistry.registerConfiguration({210'id': 'a',211'order': 1,212'title': 'a',213'type': 'object',214'properties': {215'b': {216'description': 'b',217'type': 'boolean',218'default': false,219}220}221});222223const { defaults: actual, properties } = await promise;224assert.deepStrictEqual(actual.getValue('b'), false);225assert.ok(equals(actual.getValue('[a]'), { 'b': true }));226assert.ok(equals(actual.contents, { 'b': false, '[a]': { 'b': true } }));227assert.ok(equals(actual.overrides, [{ contents: { 'b': true }, identifiers: ['a'], keys: ['b'] }]));228assert.deepStrictEqual(actual.keys.sort(), ['[a]', 'b']);229assert.strictEqual(actual.getOverrideValue('b', 'a'), true);230assert.deepStrictEqual(properties, ['b']);231});232233test('Test override identifier is registered after property', async () => {234const testObject = disposables.add(new DefaultConfiguration(new NullLogService()));235const promise = Event.toPromise(testObject.onDidChangeConfiguration);236configurationRegistry.registerConfiguration({237'id': 'a',238'order': 1,239'title': 'a',240'type': 'object',241'properties': {242'b': {243'description': 'b',244'type': 'boolean',245'default': false,246}247}248});249await testObject.initialize();250251configurationRegistry.registerDefaultConfigurations([{252overrides: {253'[a]': {254'b': true255}256}257}]);258259const { defaults: actual, properties } = await promise;260assert.deepStrictEqual(actual.getValue('b'), false);261assert.ok(equals(actual.getValue('[a]'), { 'b': true }));262assert.ok(equals(actual.contents, { 'b': false, '[a]': { 'b': true } }));263assert.ok(equals(actual.overrides, [{ contents: { 'b': true }, identifiers: ['a'], keys: ['b'] }]));264assert.deepStrictEqual(actual.keys.sort(), ['[a]', 'b']);265assert.strictEqual(actual.getOverrideValue('b', 'a'), true);266assert.deepStrictEqual(properties, ['[a]']);267});268269test('Test register override identifier and property after initialize', async () => {270const testObject = disposables.add(new DefaultConfiguration(new NullLogService()));271272await testObject.initialize();273274configurationRegistry.registerConfiguration({275'id': 'a',276'order': 1,277'title': 'a',278'type': 'object',279'properties': {280'b': {281'description': 'b',282'type': 'boolean',283'default': false,284}285}286});287configurationRegistry.registerDefaultConfigurations([{288overrides: {289'[a]': {290'b': true291}292}293}]);294295const actual = testObject.configurationModel;296assert.deepStrictEqual(actual.getValue('b'), false);297assert.ok(equals(actual.getValue('[a]'), { 'b': true }));298assert.ok(equals(actual.contents, { 'b': false, '[a]': { 'b': true } }));299assert.ok(equals(actual.overrides, [{ contents: { 'b': true }, identifiers: ['a'], keys: ['b'] }]));300assert.deepStrictEqual(actual.keys.sort(), ['[a]', 'b']);301assert.strictEqual(actual.getOverrideValue('b', 'a'), true);302});303304test('Test deregistering a property', async () => {305const testObject = disposables.add(new DefaultConfiguration(new NullLogService()));306const promise = Event.toPromise(testObject.onDidChangeConfiguration);307const node: IConfigurationNode = {308'id': 'a',309'order': 1,310'title': 'a',311'type': 'object',312'properties': {313'a': {314'description': 'a',315'type': 'boolean',316'default': false,317}318}319};320configurationRegistry.registerConfiguration(node);321await testObject.initialize();322configurationRegistry.deregisterConfigurations([node]);323324const { defaults: actual, properties } = await promise;325assert.strictEqual(actual.getValue('a'), undefined);326assert.ok(equals(actual.contents, {}));327assert.deepStrictEqual(actual.keys, []);328assert.deepStrictEqual(properties, ['a']);329});330331test('Test deregistering an override identifier', async () => {332const testObject = disposables.add(new DefaultConfiguration(new NullLogService()));333configurationRegistry.registerConfiguration({334'id': 'a',335'order': 1,336'title': 'a',337'type': 'object',338'properties': {339'b': {340'description': 'b',341'type': 'boolean',342'default': false,343}344}345});346const node = {347overrides: {348'[a]': {349'b': true350}351}352};353configurationRegistry.registerDefaultConfigurations([node]);354await testObject.initialize();355configurationRegistry.deregisterDefaultConfigurations([node]);356assert.deepStrictEqual(testObject.configurationModel.getValue('[a]'), undefined);357assert.ok(equals(testObject.configurationModel.contents, { 'b': false }));358assert.ok(equals(testObject.configurationModel.overrides, []));359assert.deepStrictEqual(testObject.configurationModel.keys, ['b']);360assert.strictEqual(testObject.configurationModel.getOverrideValue('b', 'a'), undefined);361});362363test('Test deregistering a merged language object setting', async () => {364const testObject = disposables.add(new DefaultConfiguration(new NullLogService()));365configurationRegistry.registerConfiguration({366'id': 'b',367'order': 1,368'title': 'b',369'type': 'object',370'properties': {371'b': {372'description': 'b',373'type': 'object',374'default': {},375}376}377});378const node1 = {379overrides: {380'[a]': {381'b': {382'aa': '1',383'bb': '2'384}385}386},387source: { id: 'source1', displayName: 'source1' }388};389390const node2 = {391overrides: {392'[a]': {393'b': {394'bb': '20',395'cc': '30'396}397}398},399source: { id: 'source2', displayName: 'source2' }400};401configurationRegistry.registerDefaultConfigurations([node1]);402configurationRegistry.registerDefaultConfigurations([node2]);403await testObject.initialize();404405configurationRegistry.deregisterDefaultConfigurations([node1]);406assert.ok(equals(testObject.configurationModel.getValue('[a]'), { 'b': { 'bb': '20', 'cc': '30' } }));407assert.ok(equals(testObject.configurationModel.contents, { '[a]': { 'b': { 'bb': '20', 'cc': '30' } }, 'b': {} }));408assert.ok(equals(testObject.configurationModel.overrides, [{ contents: { 'b': { 'bb': '20', 'cc': '30' } }, identifiers: ['a'], keys: ['b'] }]));409assert.deepStrictEqual(testObject.configurationModel.keys.sort(), ['[a]', 'b']);410assert.ok(equals(testObject.configurationModel.getOverrideValue('b', 'a'), { 'bb': '20', 'cc': '30' }));411});412});413414415