Path: blob/main/src/vs/workbench/services/configuration/test/common/configurationModels.test.ts
3297 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 { Registry } from '../../../../../platform/registry/common/platform.js';6import { StandaloneConfigurationModelParser, Configuration } from '../../common/configurationModels.js';7import { ConfigurationModelParser, ConfigurationModel, ConfigurationParseOptions } from '../../../../../platform/configuration/common/configurationModels.js';8import { IConfigurationRegistry, Extensions as ConfigurationExtensions, ConfigurationScope } from '../../../../../platform/configuration/common/configurationRegistry.js';9import { ResourceMap } from '../../../../../base/common/map.js';10import { WorkspaceFolder } from '../../../../../platform/workspace/common/workspace.js';11import { URI } from '../../../../../base/common/uri.js';12import { Workspace } from '../../../../../platform/workspace/test/common/testWorkspace.js';13import { ensureNoDisposablesAreLeakedInTestSuite } from '../../../../../base/test/common/utils.js';14import { NullLogService } from '../../../../../platform/log/common/log.js';1516suite('FolderSettingsModelParser', () => {1718ensureNoDisposablesAreLeakedInTestSuite();1920suiteSetup(() => {21const configurationRegistry = Registry.as<IConfigurationRegistry>(ConfigurationExtensions.Configuration);22configurationRegistry.registerConfiguration({23'id': 'FolderSettingsModelParser_1',24'type': 'object',25'properties': {26'FolderSettingsModelParser.window': {27'type': 'string',28'default': 'isSet'29},30'FolderSettingsModelParser.resource': {31'type': 'string',32'default': 'isSet',33scope: ConfigurationScope.RESOURCE,34},35'FolderSettingsModelParser.resourceLanguage': {36'type': 'string',37'default': 'isSet',38scope: ConfigurationScope.LANGUAGE_OVERRIDABLE,39},40'FolderSettingsModelParser.application': {41'type': 'string',42'default': 'isSet',43scope: ConfigurationScope.APPLICATION44},45'FolderSettingsModelParser.machine': {46'type': 'string',47'default': 'isSet',48scope: ConfigurationScope.MACHINE49}50}51});52});5354test('parse all folder settings', () => {55const testObject = new ConfigurationModelParser('settings', new NullLogService());5657testObject.parse(JSON.stringify({ 'FolderSettingsModelParser.window': 'window', 'FolderSettingsModelParser.resource': 'resource', 'FolderSettingsModelParser.application': 'application', 'FolderSettingsModelParser.machine': 'executable' }), { scopes: [ConfigurationScope.RESOURCE, ConfigurationScope.WINDOW] });5859const expected = Object.create(null);60expected['FolderSettingsModelParser'] = Object.create(null);61expected['FolderSettingsModelParser']['window'] = 'window';62expected['FolderSettingsModelParser']['resource'] = 'resource';63assert.deepStrictEqual(testObject.configurationModel.contents, expected);64});6566test('parse resource folder settings', () => {67const testObject = new ConfigurationModelParser('settings', new NullLogService());6869testObject.parse(JSON.stringify({ 'FolderSettingsModelParser.window': 'window', 'FolderSettingsModelParser.resource': 'resource', 'FolderSettingsModelParser.application': 'application', 'FolderSettingsModelParser.machine': 'executable' }), { scopes: [ConfigurationScope.RESOURCE] });7071const expected = Object.create(null);72expected['FolderSettingsModelParser'] = Object.create(null);73expected['FolderSettingsModelParser']['resource'] = 'resource';74assert.deepStrictEqual(testObject.configurationModel.contents, expected);75});7677test('parse resource and resource language settings', () => {78const testObject = new ConfigurationModelParser('settings', new NullLogService());7980testObject.parse(JSON.stringify({ '[json]': { 'FolderSettingsModelParser.window': 'window', 'FolderSettingsModelParser.resource': 'resource', 'FolderSettingsModelParser.resourceLanguage': 'resourceLanguage', 'FolderSettingsModelParser.application': 'application', 'FolderSettingsModelParser.machine': 'executable' } }), { scopes: [ConfigurationScope.RESOURCE, ConfigurationScope.LANGUAGE_OVERRIDABLE] });8182const expected = Object.create(null);83expected['FolderSettingsModelParser'] = Object.create(null);84expected['FolderSettingsModelParser']['resource'] = 'resource';85expected['FolderSettingsModelParser']['resourceLanguage'] = 'resourceLanguage';86assert.deepStrictEqual(testObject.configurationModel.overrides, [{ 'contents': expected, 'identifiers': ['json'], 'keys': ['FolderSettingsModelParser.resource', 'FolderSettingsModelParser.resourceLanguage'] }]);87});8889test('reparse folder settings excludes application and machine setting', () => {90const parseOptions: ConfigurationParseOptions = { scopes: [ConfigurationScope.RESOURCE, ConfigurationScope.WINDOW] };91const testObject = new ConfigurationModelParser('settings', new NullLogService());9293testObject.parse(JSON.stringify({ 'FolderSettingsModelParser.resource': 'resource', 'FolderSettingsModelParser.anotherApplicationSetting': 'executable' }), parseOptions);9495let expected = Object.create(null);96expected['FolderSettingsModelParser'] = Object.create(null);97expected['FolderSettingsModelParser']['resource'] = 'resource';98expected['FolderSettingsModelParser']['anotherApplicationSetting'] = 'executable';99assert.deepStrictEqual(testObject.configurationModel.contents, expected);100101const configurationRegistry = Registry.as<IConfigurationRegistry>(ConfigurationExtensions.Configuration);102configurationRegistry.registerConfiguration({103'id': 'FolderSettingsModelParser_2',104'type': 'object',105'properties': {106'FolderSettingsModelParser.anotherApplicationSetting': {107'type': 'string',108'default': 'isSet',109scope: ConfigurationScope.APPLICATION110},111'FolderSettingsModelParser.anotherMachineSetting': {112'type': 'string',113'default': 'isSet',114scope: ConfigurationScope.MACHINE115}116}117});118119testObject.reparse(parseOptions);120121expected = Object.create(null);122expected['FolderSettingsModelParser'] = Object.create(null);123expected['FolderSettingsModelParser']['resource'] = 'resource';124assert.deepStrictEqual(testObject.configurationModel.contents, expected);125});126127});128129suite('StandaloneConfigurationModelParser', () => {130131ensureNoDisposablesAreLeakedInTestSuite();132133test('parse tasks stand alone configuration model', () => {134const testObject = new StandaloneConfigurationModelParser('tasks', 'tasks', new NullLogService());135136testObject.parse(JSON.stringify({ 'version': '1.1.1', 'tasks': [] }));137138const expected = Object.create(null);139expected['tasks'] = Object.create(null);140expected['tasks']['version'] = '1.1.1';141expected['tasks']['tasks'] = [];142assert.deepStrictEqual(testObject.configurationModel.contents, expected);143});144145});146147suite('Workspace Configuration', () => {148149ensureNoDisposablesAreLeakedInTestSuite();150151const defaultConfigurationModel = toConfigurationModel({152'editor.lineNumbers': 'on',153'editor.fontSize': 12,154'window.zoomLevel': 1,155'[markdown]': {156'editor.wordWrap': 'off'157},158'window.title': 'custom',159'workbench.enableTabs': false,160'editor.insertSpaces': true161});162163test('Test compare same configurations', () => {164const workspace = new Workspace('a', [new WorkspaceFolder({ index: 0, name: 'a', uri: URI.file('folder1') }), new WorkspaceFolder({ index: 1, name: 'b', uri: URI.file('folder2') }), new WorkspaceFolder({ index: 2, name: 'c', uri: URI.file('folder3') })]);165const configuration1 = new Configuration(ConfigurationModel.createEmptyModel(new NullLogService()), ConfigurationModel.createEmptyModel(new NullLogService()), ConfigurationModel.createEmptyModel(new NullLogService()), ConfigurationModel.createEmptyModel(new NullLogService()), ConfigurationModel.createEmptyModel(new NullLogService()), ConfigurationModel.createEmptyModel(new NullLogService()), new ResourceMap<ConfigurationModel>(), ConfigurationModel.createEmptyModel(new NullLogService()), new ResourceMap<ConfigurationModel>(), workspace, new NullLogService());166configuration1.updateDefaultConfiguration(defaultConfigurationModel);167configuration1.updateLocalUserConfiguration(toConfigurationModel({ 'window.title': 'native', '[typescript]': { 'editor.insertSpaces': false } }));168configuration1.updateWorkspaceConfiguration(toConfigurationModel({ 'editor.lineNumbers': 'on' }));169configuration1.updateFolderConfiguration(URI.file('folder1'), toConfigurationModel({ 'editor.fontSize': 14 }));170configuration1.updateFolderConfiguration(URI.file('folder2'), toConfigurationModel({ 'editor.wordWrap': 'on' }));171172const configuration2 = new Configuration(ConfigurationModel.createEmptyModel(new NullLogService()), ConfigurationModel.createEmptyModel(new NullLogService()), ConfigurationModel.createEmptyModel(new NullLogService()), ConfigurationModel.createEmptyModel(new NullLogService()), ConfigurationModel.createEmptyModel(new NullLogService()), ConfigurationModel.createEmptyModel(new NullLogService()), new ResourceMap<ConfigurationModel>(), ConfigurationModel.createEmptyModel(new NullLogService()), new ResourceMap<ConfigurationModel>(), workspace, new NullLogService());173configuration2.updateDefaultConfiguration(defaultConfigurationModel);174configuration2.updateLocalUserConfiguration(toConfigurationModel({ 'window.title': 'native', '[typescript]': { 'editor.insertSpaces': false } }));175configuration2.updateWorkspaceConfiguration(toConfigurationModel({ 'editor.lineNumbers': 'on' }));176configuration2.updateFolderConfiguration(URI.file('folder1'), toConfigurationModel({ 'editor.fontSize': 14 }));177configuration2.updateFolderConfiguration(URI.file('folder2'), toConfigurationModel({ 'editor.wordWrap': 'on' }));178179const actual = configuration2.compare(configuration1);180181assert.deepStrictEqual(actual, { keys: [], overrides: [] });182});183184test('Test compare different configurations', () => {185const workspace = new Workspace('a', [new WorkspaceFolder({ index: 0, name: 'a', uri: URI.file('folder1') }), new WorkspaceFolder({ index: 1, name: 'b', uri: URI.file('folder2') }), new WorkspaceFolder({ index: 2, name: 'c', uri: URI.file('folder3') })]);186const configuration1 = new Configuration(ConfigurationModel.createEmptyModel(new NullLogService()), ConfigurationModel.createEmptyModel(new NullLogService()), ConfigurationModel.createEmptyModel(new NullLogService()), ConfigurationModel.createEmptyModel(new NullLogService()), ConfigurationModel.createEmptyModel(new NullLogService()), ConfigurationModel.createEmptyModel(new NullLogService()), new ResourceMap<ConfigurationModel>(), ConfigurationModel.createEmptyModel(new NullLogService()), new ResourceMap<ConfigurationModel>(), workspace, new NullLogService());187configuration1.updateDefaultConfiguration(defaultConfigurationModel);188configuration1.updateLocalUserConfiguration(toConfigurationModel({ 'window.title': 'native', '[typescript]': { 'editor.insertSpaces': false } }));189configuration1.updateWorkspaceConfiguration(toConfigurationModel({ 'editor.lineNumbers': 'on' }));190configuration1.updateFolderConfiguration(URI.file('folder1'), toConfigurationModel({ 'editor.fontSize': 14 }));191configuration1.updateFolderConfiguration(URI.file('folder2'), toConfigurationModel({ 'editor.wordWrap': 'on' }));192193const configuration2 = new Configuration(ConfigurationModel.createEmptyModel(new NullLogService()), ConfigurationModel.createEmptyModel(new NullLogService()), ConfigurationModel.createEmptyModel(new NullLogService()), ConfigurationModel.createEmptyModel(new NullLogService()), ConfigurationModel.createEmptyModel(new NullLogService()), ConfigurationModel.createEmptyModel(new NullLogService()), new ResourceMap<ConfigurationModel>(), ConfigurationModel.createEmptyModel(new NullLogService()), new ResourceMap<ConfigurationModel>(), workspace, new NullLogService());194configuration2.updateDefaultConfiguration(defaultConfigurationModel);195configuration2.updateLocalUserConfiguration(toConfigurationModel({ 'workbench.enableTabs': true, '[typescript]': { 'editor.insertSpaces': true } }));196configuration2.updateWorkspaceConfiguration(toConfigurationModel({ 'editor.fontSize': 11 }));197configuration2.updateFolderConfiguration(URI.file('folder1'), toConfigurationModel({ 'editor.insertSpaces': true }));198configuration2.updateFolderConfiguration(URI.file('folder2'), toConfigurationModel({199'[markdown]': {200'editor.wordWrap': 'on',201'editor.lineNumbers': 'relative'202},203}));204205const actual = configuration2.compare(configuration1);206207assert.deepStrictEqual(actual, { keys: ['editor.wordWrap', 'editor.fontSize', '[markdown]', 'window.title', 'workbench.enableTabs', '[typescript]'], overrides: [['markdown', ['editor.lineNumbers', 'editor.wordWrap']], ['typescript', ['editor.insertSpaces']]] });208});209210211});212213function toConfigurationModel(obj: any): ConfigurationModel {214const parser = new ConfigurationModelParser('test', new NullLogService());215parser.parse(JSON.stringify(obj));216return parser.configurationModel;217}218219220