diff --git a/src/vs/platform/configuration/common/configuration.ts b/src/vs/platform/configuration/common/configuration.ts index ffe876e4859..da2b28fb921 100644 --- a/src/vs/platform/configuration/common/configuration.ts +++ b/src/vs/platform/configuration/common/configuration.ts @@ -160,10 +160,12 @@ export function compare(from: IConfigurationModel | undefined, to: IConfiguratio if (to && from) { for (const key of from.keys) { - const value1 = getConfigurationValue(from.contents, key); - const value2 = getConfigurationValue(to.contents, key); - if (!objects.equals(value1, value2)) { - updated.push(key); + if (to.keys.indexOf(key) !== -1) { + const value1 = getConfigurationValue(from.contents, key); + const value2 = getConfigurationValue(to.contents, key); + if (!objects.equals(value1, value2)) { + updated.push(key); + } } } } @@ -173,7 +175,7 @@ export function compare(from: IConfigurationModel | undefined, to: IConfiguratio const result: IStringDictionary = {}; for (const override of overrides) { for (const identifier of override.identifiers) { - result[identifier] = override; + result[keyFromOverrideIdentifier(identifier)] = override; } } return result; @@ -185,7 +187,7 @@ export function compare(from: IConfigurationModel | undefined, to: IConfiguratio for (const key of added) { const override = toOverridesByIdentifier[key]; if (override) { - overrides.push([key, override.keys]); + overrides.push([overrideIdentifierFromKey(key), override.keys]); } } } @@ -193,7 +195,7 @@ export function compare(from: IConfigurationModel | undefined, to: IConfiguratio for (const key of removed) { const override = fromOverridesByIdentifier[key]; if (override) { - overrides.push([key, override.keys]); + overrides.push([overrideIdentifierFromKey(key), override.keys]); } } } @@ -204,7 +206,7 @@ export function compare(from: IConfigurationModel | undefined, to: IConfiguratio const toOverride = toOverridesByIdentifier[key]; if (fromOverride && toOverride) { const result = compare({ contents: fromOverride.contents, keys: fromOverride.keys, overrides: [] }, { contents: toOverride.contents, keys: toOverride.keys, overrides: [] }); - overrides.push([key, [...result.added, ...result.removed, ...result.updated]]); + overrides.push([overrideIdentifierFromKey(key), [...result.added, ...result.removed, ...result.updated]]); } } } diff --git a/src/vs/platform/configuration/common/configurationModels.ts b/src/vs/platform/configuration/common/configurationModels.ts index ecc33ce7e4d..704d5348f95 100644 --- a/src/vs/platform/configuration/common/configurationModels.ts +++ b/src/vs/platform/configuration/common/configurationModels.ts @@ -466,7 +466,8 @@ export class Configuration { compareAndUpdateDefaultConfiguration(defaults: ConfigurationModel, keys: string[]): IConfigurationChange { const overrides: [string, string[]][] = keys .filter(key => OVERRIDE_PROPERTY_PATTERN.test(key)) - .map(overrideIdentifier => { + .map(key => { + const overrideIdentifier = overrideIdentifierFromKey(key); const fromKeys = this._defaultConfiguration.getKeysForOverrideIdentifier(overrideIdentifier); const toKeys = defaults.getKeysForOverrideIdentifier(overrideIdentifier); const keys = [ @@ -489,6 +490,44 @@ export class Configuration { return { keys, overrides }; } + compareAndUpdateRemoteUserConfiguration(user: ConfigurationModel): IConfigurationChange { + const { added, updated, removed, overrides } = compare(this.remoteUserConfiguration, user); + let keys = [...added, ...updated, ...removed]; + if (keys.length) { + this.updateRemoteUserConfiguration(user); + } + return { keys, overrides }; + } + + compareAndUpdateWorkspaceConfiguration(workspaceConfiguration: ConfigurationModel): IConfigurationChange { + const { added, updated, removed, overrides } = compare(this.workspaceConfiguration, workspaceConfiguration); + let keys = [...added, ...updated, ...removed]; + if (keys.length) { + this.updateWorkspaceConfiguration(workspaceConfiguration); + } + return { keys, overrides }; + } + + compareAndUpdateFolderConfiguration(resource: URI, folderConfiguration: ConfigurationModel): IConfigurationChange { + const currentFolderConfiguration = this.folderConfigurations.get(resource); + const { added, updated, removed, overrides } = compare(currentFolderConfiguration, folderConfiguration); + let keys = [...added, ...updated, ...removed]; + if (keys.length) { + this.updateFolderConfiguration(resource, folderConfiguration); + } + return { keys, overrides }; + } + + compareAndDeleteFolderConfiguration(folder: URI): IConfigurationChange { + const folderConfig = this.folderConfigurations.get(folder); + if (!folderConfig) { + throw new Error('Unknown folder'); + } + this.deleteFolderConfiguration(folder); + const { added, updated, removed, overrides } = compare(folderConfig, undefined); + return { keys: [...added, ...updated, ...removed], overrides }; + } + get defaults(): ConfigurationModel { return this._defaultConfiguration; } @@ -675,7 +714,7 @@ export class ConfigurationChangeEvent implements IConfigurationChangeEvent { this.affectedKeys = values(keysSet); const configurationModel = new ConfigurationModel(); - this.affectedKeys.forEach(key => this.affectedKeysTree.setValue(key, {})); + this.affectedKeys.forEach(key => configurationModel.setValue(key, {})); this.affectedKeysTree = configurationModel.contents; } diff --git a/src/vs/platform/configuration/test/common/configurationModels.test.ts b/src/vs/platform/configuration/test/common/configurationModels.test.ts index 91e4cf5c864..2bc6ae07958 100644 --- a/src/vs/platform/configuration/test/common/configurationModels.test.ts +++ b/src/vs/platform/configuration/test/common/configurationModels.test.ts @@ -3,10 +3,13 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ import * as assert from 'assert'; -import { ConfigurationModel, DefaultConfigurationModel, ConfigurationChangeEvent, ConfigurationModelParser, Configuration } from 'vs/platform/configuration/common/configurationModels'; +import { ConfigurationModel, DefaultConfigurationModel, ConfigurationChangeEvent, ConfigurationModelParser, Configuration, mergeChanges, AllKeysConfigurationChangeEvent } from 'vs/platform/configuration/common/configurationModels'; import { Extensions, IConfigurationRegistry } from 'vs/platform/configuration/common/configurationRegistry'; import { Registry } from 'vs/platform/registry/common/platform'; import { URI } from 'vs/base/common/uri'; +import { Workspace, WorkspaceFolder } from 'vs/platform/workspace/common/workspace'; +import { join } from 'vs/base/common/path'; +import { ConfigurationTarget } from 'vs/platform/configuration/common/configuration'; suite('ConfigurationModel', () => { @@ -181,7 +184,7 @@ suite('ConfigurationModel', () => { let result = base.merge(add); assert.deepEqual(result.contents, { 'a': { 'b': 2 } }); - assert.deepEqual(result.overrides, [{ identifiers: ['c'], contents: { 'a': 2, 'b': 2 } }]); + assert.deepEqual(result.overrides, [{ identifiers: ['c'], contents: { 'a': 2, 'b': 2 }, keys: ['a'] }]); assert.deepEqual(result.override('c').contents, { 'a': 2, 'b': 2 }); assert.deepEqual(result.keys, ['a.b']); }); @@ -192,7 +195,7 @@ suite('ConfigurationModel', () => { 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.overrides, [{ identifiers: ['c'], contents: { 'a': { 'd': 1, 'e': 2 } }, keys: ['a'] }]); assert.deepEqual(result.override('c').contents, { 'a': { 'b': 2, 'd': 1, 'e': 2 }, 'f': 1 }); assert.deepEqual(result.keys, ['a.b', 'f']); }); @@ -203,7 +206,7 @@ suite('ConfigurationModel', () => { let result = new ConfigurationModel().merge(model1, model2); assert.deepEqual(result.contents, { 'a': { 'b': 2 }, 'f': 1 }); - assert.deepEqual(result.overrides, [{ identifiers: ['c'], contents: { 'a': { 'd': 1, 'e': 2 } } }]); + assert.deepEqual(result.overrides, [{ identifiers: ['c'], contents: { 'a': { 'd': 1, 'e': 2 } }, keys: ['a'] }]); assert.deepEqual(result.override('c').contents, { 'a': { 'b': 2, 'd': 1, 'e': 2 }, 'f': 1 }); assert.deepEqual(result.keys, ['a.b', 'f']); }); @@ -360,108 +363,6 @@ suite('CustomConfigurationModel', () => { }); }); -suite('ConfigurationChangeEvent', () => { - - test('changeEvent affecting keys', () => { - let testObject = new ConfigurationChangeEvent({ keys: ['window.zoomLevel', 'workbench.editor.enablePreview', 'files', '[markdown]'], overrides: [] }, undefined, anEmptyConfiguration()); - - assert.deepEqual(testObject.affectedKeys, ['window.zoomLevel', 'workbench.editor.enablePreview', 'files', '[markdown]']); - assert.ok(testObject.affectsConfiguration('window.zoomLevel')); - assert.ok(testObject.affectsConfiguration('window')); - assert.ok(testObject.affectsConfiguration('workbench.editor.enablePreview')); - assert.ok(testObject.affectsConfiguration('workbench.editor')); - assert.ok(testObject.affectsConfiguration('workbench')); - assert.ok(testObject.affectsConfiguration('files')); - assert.ok(!testObject.affectsConfiguration('files.exclude')); - assert.ok(testObject.affectsConfiguration('[markdown]')); - }); - - test('changeEvent affecting a root key and its children', () => { - let testObject = new ConfigurationChangeEvent({ keys: ['launch', 'launch.version', 'tasks'], overrides: [] }, undefined, anEmptyConfiguration()); - - assert.deepEqual(testObject.affectedKeys, ['launch.version', 'tasks']); - assert.ok(testObject.affectsConfiguration('launch')); - assert.ok(testObject.affectsConfiguration('launch.version')); - assert.ok(testObject.affectsConfiguration('tasks')); - }); - - test('changeEvent affecting keys for resources', () => { - const configuration = new Configuration(new ConfigurationModel(), new ConfigurationModel()); - configuration.updateLocalUserConfiguration(toConfigurationModel({ 'window.title': false })); - configuration.updateFolderConfiguration(URI.file('file1'), toConfigurationModel({ 'window.zoomLevel': false, 'window.restoreFullscreen': false })); - configuration.updateFolderConfiguration(URI.file('file2'), toConfigurationModel({ 'workbench.editor.enablePreview': false, 'window.restoreWindows': false })); - const testObject = new ConfigurationChangeEvent({ keys: ['window.title', 'window.zoomLevel', 'workbench.editor.enablePreview', 'window.restoreFullscreen', 'window.restoreWindows'], overrides: [] }, undefined, configuration); - - assert.deepEqual(testObject.affectedKeys, ['window.title', 'window.zoomLevel', 'window.restoreFullscreen', 'workbench.editor.enablePreview', 'window.restoreWindows']); - - assert.ok(testObject.affectsConfiguration('window.zoomLevel')); - assert.ok(testObject.affectsConfiguration('window.zoomLevel', { resource: URI.file('file1') })); - assert.ok(!testObject.affectsConfiguration('window.zoomLevel', { resource: URI.file('file2') })); - - assert.ok(testObject.affectsConfiguration('window.restoreFullscreen')); - assert.ok(testObject.affectsConfiguration('window.restoreFullscreen', { resource: URI.file('file1') })); - assert.ok(!testObject.affectsConfiguration('window.restoreFullscreen', { resource: URI.file('file2') })); - - assert.ok(testObject.affectsConfiguration('window.restoreWindows')); - assert.ok(testObject.affectsConfiguration('window.restoreWindows', { resource: URI.file('file2') })); - assert.ok(!testObject.affectsConfiguration('window.restoreWindows', { resource: URI.file('file1') })); - - assert.ok(testObject.affectsConfiguration('window.title')); - assert.ok(testObject.affectsConfiguration('window.title', { resource: URI.file('file1') })); - assert.ok(testObject.affectsConfiguration('window.title', { resource: URI.file('file2') })); - - assert.ok(testObject.affectsConfiguration('window')); - assert.ok(testObject.affectsConfiguration('window', { resource: URI.file('file1') })); - assert.ok(testObject.affectsConfiguration('window', { resource: URI.file('file2') })); - - assert.ok(testObject.affectsConfiguration('workbench.editor.enablePreview')); - assert.ok(testObject.affectsConfiguration('workbench.editor.enablePreview', { resource: URI.file('file2') })); - assert.ok(!testObject.affectsConfiguration('workbench.editor.enablePreview', { resource: URI.file('file1') })); - - assert.ok(testObject.affectsConfiguration('workbench.editor')); - assert.ok(testObject.affectsConfiguration('workbench.editor', { resource: URI.file('file2') })); - assert.ok(!testObject.affectsConfiguration('workbench.editor', { resource: URI.file('file1') })); - - assert.ok(testObject.affectsConfiguration('workbench')); - assert.ok(testObject.affectsConfiguration('workbench', { resource: URI.file('file2') })); - assert.ok(!testObject.affectsConfiguration('workbench', { resource: URI.file('file1') })); - - assert.ok(!testObject.affectsConfiguration('files')); - assert.ok(!testObject.affectsConfiguration('files', { resource: URI.file('file1') })); - assert.ok(!testObject.affectsConfiguration('files', { resource: URI.file('file2') })); - }); - - test('merging change events', () => { - let event1 = new ConfigurationChangeEvent().change(['window.zoomLevel', 'files']); - let event2 = new ConfigurationChangeEvent().change(['window.title'], URI.file('file1')).change(['[markdown]']); - - let actual = event1.change(event2); - - assert.deepEqual(actual.affectedKeys, ['window.zoomLevel', 'files', '[markdown]', 'window.title']); - - assert.ok(actual.affectsConfiguration('window.zoomLevel')); - assert.ok(actual.affectsConfiguration('window.zoomLevel', URI.file('file1'))); - assert.ok(actual.affectsConfiguration('window.zoomLevel', URI.file('file2'))); - - assert.ok(actual.affectsConfiguration('window')); - assert.ok(actual.affectsConfiguration('window', URI.file('file1'))); - assert.ok(actual.affectsConfiguration('window', URI.file('file2'))); - - assert.ok(actual.affectsConfiguration('files')); - assert.ok(actual.affectsConfiguration('files', URI.file('file1'))); - assert.ok(actual.affectsConfiguration('files', URI.file('file2'))); - - assert.ok(actual.affectsConfiguration('window.title')); - assert.ok(actual.affectsConfiguration('window.title', URI.file('file1'))); - assert.ok(!actual.affectsConfiguration('window.title', URI.file('file2'))); - - assert.ok(actual.affectsConfiguration('[markdown]')); - assert.ok(actual.affectsConfiguration('[markdown]', URI.file('file1'))); - assert.ok(actual.affectsConfiguration('[markdown]', URI.file('file2'))); - }); - -}); - suite('Configuration', () => { test('Test update value', () => { @@ -485,12 +386,549 @@ suite('Configuration', () => { assert.equal(testObject.getValue('a', {}, undefined), 2); }); + test('Test compare and update default configuration', () => { + const testObject = new Configuration(new ConfigurationModel(), new ConfigurationModel()); + testObject.updateDefaultConfiguration(toConfigurationModel({ + 'editor.lineNumbers': 'on', + })); + + const actual = testObject.compareAndUpdateDefaultConfiguration(toConfigurationModel({ + 'editor.lineNumbers': 'off', + '[markdown]': { + 'editor.wordWrap': 'off' + } + }), ['editor.lineNumbers', '[markdown]']); + + assert.deepEqual(actual, { keys: ['editor.lineNumbers', '[markdown]'], overrides: [['markdown', ['editor.wordWrap']]] }); + + }); + + test('Test compare and update user configuration', () => { + const testObject = new Configuration(new ConfigurationModel(), new ConfigurationModel()); + testObject.updateLocalUserConfiguration(toConfigurationModel({ + 'editor.lineNumbers': 'off', + 'editor.fontSize': 12, + '[typescript]': { + 'editor.wordWrap': 'off' + } + })); + + const actual = testObject.compareAndUpdateLocalUserConfiguration(toConfigurationModel({ + 'editor.lineNumbers': 'on', + 'window.zoomLevel': 1, + '[typescript]': { + 'editor.wordWrap': 'on', + 'editor.insertSpaces': false + } + })); + + assert.deepEqual(actual, { keys: ['window.zoomLevel', 'editor.lineNumbers', '[typescript]', 'editor.fontSize'], overrides: [['typescript', ['editor.insertSpaces', 'editor.wordWrap']]] }); + + }); + + test('Test compare and update workspace configuration', () => { + const testObject = new Configuration(new ConfigurationModel(), new ConfigurationModel()); + testObject.updateWorkspaceConfiguration(toConfigurationModel({ + 'editor.lineNumbers': 'off', + 'editor.fontSize': 12, + '[typescript]': { + 'editor.wordWrap': 'off' + } + })); + + const actual = testObject.compareAndUpdateWorkspaceConfiguration(toConfigurationModel({ + 'editor.lineNumbers': 'on', + 'window.zoomLevel': 1, + '[typescript]': { + 'editor.wordWrap': 'on', + 'editor.insertSpaces': false + } + })); + + assert.deepEqual(actual, { keys: ['window.zoomLevel', 'editor.lineNumbers', '[typescript]', 'editor.fontSize'], overrides: [['typescript', ['editor.insertSpaces', 'editor.wordWrap']]] }); + + }); + + test('Test compare and update workspace folder configuration', () => { + const testObject = new Configuration(new ConfigurationModel(), new ConfigurationModel()); + testObject.updateFolderConfiguration(URI.file('file1'), toConfigurationModel({ + 'editor.lineNumbers': 'off', + 'editor.fontSize': 12, + '[typescript]': { + 'editor.wordWrap': 'off' + } + })); + + const actual = testObject.compareAndUpdateFolderConfiguration(URI.file('file1'), toConfigurationModel({ + 'editor.lineNumbers': 'on', + 'window.zoomLevel': 1, + '[typescript]': { + 'editor.wordWrap': 'on', + 'editor.insertSpaces': false + } + })); + + assert.deepEqual(actual, { keys: ['window.zoomLevel', 'editor.lineNumbers', '[typescript]', 'editor.fontSize'], overrides: [['typescript', ['editor.insertSpaces', 'editor.wordWrap']]] }); + + }); + + test('Test compare and deletre workspace folder configuration', () => { + const testObject = new Configuration(new ConfigurationModel(), new ConfigurationModel()); + testObject.updateFolderConfiguration(URI.file('file1'), toConfigurationModel({ + 'editor.lineNumbers': 'off', + 'editor.fontSize': 12, + '[typescript]': { + 'editor.wordWrap': 'off' + } + })); + + const actual = testObject.compareAndDeleteFolderConfiguration(URI.file('file1')); + + assert.deepEqual(actual, { keys: ['editor.lineNumbers', 'editor.fontSize', '[typescript]'], overrides: [['typescript', ['editor.wordWrap']]] }); + + }); }); -function anEmptyConfiguration(): Configuration { - return new Configuration(new ConfigurationModel(), new ConfigurationModel()); -} +suite('ConfigurationChangeEvent', () => { + + test('changeEvent affecting keys with new configuration', () => { + const configuration = new Configuration(new ConfigurationModel(), new ConfigurationModel()); + const change = configuration.compareAndUpdateLocalUserConfiguration(toConfigurationModel({ + 'window.zoomLevel': 1, + 'workbench.editor.enablePreview': false, + 'files.autoSave': 'off', + })); + let testObject = new ConfigurationChangeEvent(change, undefined, configuration); + + assert.deepEqual(testObject.affectedKeys, ['window.zoomLevel', 'workbench.editor.enablePreview', 'files.autoSave']); + + assert.ok(testObject.affectsConfiguration('window.zoomLevel')); + assert.ok(testObject.affectsConfiguration('window')); + + assert.ok(testObject.affectsConfiguration('workbench.editor.enablePreview')); + assert.ok(testObject.affectsConfiguration('workbench.editor')); + assert.ok(testObject.affectsConfiguration('workbench')); + + assert.ok(testObject.affectsConfiguration('files')); + assert.ok(testObject.affectsConfiguration('files.autoSave')); + assert.ok(!testObject.affectsConfiguration('files.exclude')); + + assert.ok(!testObject.affectsConfiguration('[markdown]')); + assert.ok(!testObject.affectsConfiguration('editor')); + }); + + test('changeEvent affecting keys when configuration changed', () => { + const configuration = new Configuration(new ConfigurationModel(), new ConfigurationModel()); + configuration.updateLocalUserConfiguration(toConfigurationModel({ + 'window.zoomLevel': 2, + 'workbench.editor.enablePreview': true, + 'files.autoSave': 'off', + })); + const data = configuration.toData(); + const change = configuration.compareAndUpdateLocalUserConfiguration(toConfigurationModel({ + 'window.zoomLevel': 1, + 'workbench.editor.enablePreview': false, + 'files.autoSave': 'off', + })); + let testObject = new ConfigurationChangeEvent(change, { data }, configuration); + + assert.deepEqual(testObject.affectedKeys, ['window.zoomLevel', 'workbench.editor.enablePreview']); + + assert.ok(testObject.affectsConfiguration('window.zoomLevel')); + assert.ok(testObject.affectsConfiguration('window')); + + assert.ok(testObject.affectsConfiguration('workbench.editor.enablePreview')); + assert.ok(testObject.affectsConfiguration('workbench.editor')); + assert.ok(testObject.affectsConfiguration('workbench')); + + assert.ok(!testObject.affectsConfiguration('files')); + assert.ok(!testObject.affectsConfiguration('[markdown]')); + assert.ok(!testObject.affectsConfiguration('editor')); + }); + + test('changeEvent affecting overrides with new configuration', () => { + const configuration = new Configuration(new ConfigurationModel(), new ConfigurationModel()); + const change = configuration.compareAndUpdateLocalUserConfiguration(toConfigurationModel({ + 'files.autoSave': 'off', + '[markdown]': { + 'editor.wordWrap': 'off' + } + })); + let testObject = new ConfigurationChangeEvent(change, undefined, configuration); + + assert.deepEqual(testObject.affectedKeys, ['files.autoSave', '[markdown]', 'editor.wordWrap']); + + assert.ok(testObject.affectsConfiguration('files')); + assert.ok(testObject.affectsConfiguration('files.autoSave')); + assert.ok(!testObject.affectsConfiguration('files.exclude')); + + assert.ok(testObject.affectsConfiguration('[markdown]')); + assert.ok(!testObject.affectsConfiguration('[markdown].editor')); + assert.ok(!testObject.affectsConfiguration('[markdown].workbench')); + + assert.ok(testObject.affectsConfiguration('editor')); + assert.ok(testObject.affectsConfiguration('editor.wordWrap')); + assert.ok(testObject.affectsConfiguration('editor', { overrideIdentifier: 'markdown' })); + assert.ok(testObject.affectsConfiguration('editor.wordWrap', { overrideIdentifier: 'markdown' })); + assert.ok(!testObject.affectsConfiguration('editor', { overrideIdentifier: 'json' })); + assert.ok(!testObject.affectsConfiguration('editor.fontSize', { overrideIdentifier: 'markdown' })); + + assert.ok(!testObject.affectsConfiguration('editor.fontSize')); + assert.ok(!testObject.affectsConfiguration('window')); + }); + + test('changeEvent affecting overrides when configuration changed', () => { + const configuration = new Configuration(new ConfigurationModel(), new ConfigurationModel()); + configuration.updateLocalUserConfiguration(toConfigurationModel({ + 'workbench.editor.enablePreview': true, + '[markdown]': { + 'editor.fontSize': 12, + 'editor.wordWrap': 'off' + }, + 'files.autoSave': 'off', + })); + const data = configuration.toData(); + const change = configuration.compareAndUpdateLocalUserConfiguration(toConfigurationModel({ + 'files.autoSave': 'off', + '[markdown]': { + 'editor.fontSize': 13, + 'editor.wordWrap': 'off' + }, + 'window.zoomLevel': 1, + })); + let testObject = new ConfigurationChangeEvent(change, { data }, configuration); + + assert.deepEqual(testObject.affectedKeys, ['window.zoomLevel', '[markdown]', 'workbench.editor.enablePreview', 'editor.fontSize']); + + assert.ok(!testObject.affectsConfiguration('files')); + + assert.ok(testObject.affectsConfiguration('[markdown]')); + assert.ok(!testObject.affectsConfiguration('[markdown].editor')); + assert.ok(!testObject.affectsConfiguration('[markdown].editor.fontSize')); + assert.ok(!testObject.affectsConfiguration('[markdown].editor.wordWrap')); + assert.ok(!testObject.affectsConfiguration('[markdown].workbench')); + + assert.ok(testObject.affectsConfiguration('editor')); + assert.ok(testObject.affectsConfiguration('editor', { overrideIdentifier: 'markdown' })); + assert.ok(testObject.affectsConfiguration('editor.fontSize', { overrideIdentifier: 'markdown' })); + assert.ok(!testObject.affectsConfiguration('editor.wordWrap')); + assert.ok(!testObject.affectsConfiguration('editor.wordWrap', { overrideIdentifier: 'markdown' })); + assert.ok(!testObject.affectsConfiguration('editor', { overrideIdentifier: 'json' })); + assert.ok(!testObject.affectsConfiguration('editor.fontSize', { overrideIdentifier: 'json' })); + + assert.ok(testObject.affectsConfiguration('window')); + assert.ok(testObject.affectsConfiguration('window.zoomLevel')); + assert.ok(testObject.affectsConfiguration('window', { overrideIdentifier: 'markdown' })); + assert.ok(testObject.affectsConfiguration('window.zoomLevel', { overrideIdentifier: 'markdown' })); + + assert.ok(testObject.affectsConfiguration('workbench')); + assert.ok(testObject.affectsConfiguration('workbench.editor')); + assert.ok(testObject.affectsConfiguration('workbench.editor.enablePreview')); + assert.ok(testObject.affectsConfiguration('workbench', { overrideIdentifier: 'markdown' })); + assert.ok(testObject.affectsConfiguration('workbench.editor', { overrideIdentifier: 'markdown' })); + }); + + test('changeEvent affecting workspace folders', () => { + const configuration = new Configuration(new ConfigurationModel(), new ConfigurationModel()); + configuration.updateWorkspaceConfiguration(toConfigurationModel({ 'window.title': 'custom' })); + configuration.updateFolderConfiguration(URI.file('folder1'), toConfigurationModel({ 'window.zoomLevel': 2, 'window.restoreFullscreen': true })); + configuration.updateFolderConfiguration(URI.file('folder2'), toConfigurationModel({ 'workbench.editor.enablePreview': true, 'window.restoreWindows': true })); + const data = configuration.toData(); + const 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') })]); + const change = mergeChanges( + configuration.compareAndUpdateWorkspaceConfiguration(toConfigurationModel({ 'window.title': 'native' })), + configuration.compareAndUpdateFolderConfiguration(URI.file('folder1'), toConfigurationModel({ 'window.zoomLevel': 1, 'window.restoreFullscreen': false })), + configuration.compareAndUpdateFolderConfiguration(URI.file('folder2'), toConfigurationModel({ 'workbench.editor.enablePreview': false, 'window.restoreWindows': false })) + ); + let testObject = new ConfigurationChangeEvent(change, { data, workspace }, configuration, workspace); + + assert.deepEqual(testObject.affectedKeys, ['window.title', 'window.zoomLevel', 'window.restoreFullscreen', 'workbench.editor.enablePreview', 'window.restoreWindows']); + + assert.ok(testObject.affectsConfiguration('window.zoomLevel')); + assert.ok(testObject.affectsConfiguration('window.zoomLevel', { resource: URI.file('folder1') })); + assert.ok(testObject.affectsConfiguration('window.zoomLevel', { resource: URI.file(join('folder1', 'file1')) })); + assert.ok(!testObject.affectsConfiguration('window.zoomLevel', { resource: URI.file('file1') })); + assert.ok(!testObject.affectsConfiguration('window.zoomLevel', { resource: URI.file('file2') })); + assert.ok(!testObject.affectsConfiguration('window.zoomLevel', { resource: URI.file(join('folder2', 'file2')) })); + assert.ok(!testObject.affectsConfiguration('window.zoomLevel', { resource: URI.file(join('folder3', 'file3')) })); + + assert.ok(testObject.affectsConfiguration('window.restoreFullscreen')); + assert.ok(testObject.affectsConfiguration('window.restoreFullscreen', { resource: URI.file(join('folder1', 'file1')) })); + assert.ok(testObject.affectsConfiguration('window.restoreFullscreen', { resource: URI.file('folder1') })); + assert.ok(!testObject.affectsConfiguration('window.restoreFullscreen', { resource: URI.file('file1') })); + assert.ok(!testObject.affectsConfiguration('window.restoreFullscreen', { resource: URI.file('file2') })); + assert.ok(!testObject.affectsConfiguration('window.restoreFullscreen', { resource: URI.file(join('folder2', 'file2')) })); + assert.ok(!testObject.affectsConfiguration('window.restoreFullscreen', { resource: URI.file(join('folder3', 'file3')) })); + + assert.ok(testObject.affectsConfiguration('window.restoreWindows')); + assert.ok(testObject.affectsConfiguration('window.restoreWindows', { resource: URI.file('folder2') })); + assert.ok(testObject.affectsConfiguration('window.restoreWindows', { resource: URI.file(join('folder2', 'file2')) })); + assert.ok(!testObject.affectsConfiguration('window.restoreWindows', { resource: URI.file('file2') })); + assert.ok(!testObject.affectsConfiguration('window.restoreWindows', { resource: URI.file(join('folder1', 'file1')) })); + assert.ok(!testObject.affectsConfiguration('window.restoreWindows', { resource: URI.file(join('folder3', 'file3')) })); + + assert.ok(testObject.affectsConfiguration('window.title')); + assert.ok(testObject.affectsConfiguration('window.title', { resource: URI.file('folder1') })); + assert.ok(testObject.affectsConfiguration('window.title', { resource: URI.file(join('folder1', 'file1')) })); + assert.ok(testObject.affectsConfiguration('window.title', { resource: URI.file('folder2') })); + assert.ok(testObject.affectsConfiguration('window.title', { resource: URI.file(join('folder2', 'file2')) })); + assert.ok(testObject.affectsConfiguration('window.title', { resource: URI.file('folder3') })); + assert.ok(testObject.affectsConfiguration('window.title', { resource: URI.file(join('folder3', 'file3')) })); + assert.ok(testObject.affectsConfiguration('window.title', { resource: URI.file('file1') })); + assert.ok(testObject.affectsConfiguration('window.title', { resource: URI.file('file2') })); + assert.ok(testObject.affectsConfiguration('window.title', { resource: URI.file('file3') })); + + assert.ok(testObject.affectsConfiguration('window')); + assert.ok(testObject.affectsConfiguration('window', { resource: URI.file('folder1') })); + assert.ok(testObject.affectsConfiguration('window', { resource: URI.file(join('folder1', 'file1')) })); + assert.ok(testObject.affectsConfiguration('window', { resource: URI.file('folder2') })); + assert.ok(testObject.affectsConfiguration('window', { resource: URI.file(join('folder2', 'file2')) })); + assert.ok(testObject.affectsConfiguration('window', { resource: URI.file('folder3') })); + assert.ok(testObject.affectsConfiguration('window', { resource: URI.file(join('folder3', 'file3')) })); + assert.ok(testObject.affectsConfiguration('window', { resource: URI.file('file1') })); + assert.ok(testObject.affectsConfiguration('window', { resource: URI.file('file2') })); + assert.ok(testObject.affectsConfiguration('window', { resource: URI.file('file3') })); + + assert.ok(testObject.affectsConfiguration('workbench.editor.enablePreview')); + assert.ok(testObject.affectsConfiguration('workbench.editor.enablePreview', { resource: URI.file('folder2') })); + assert.ok(testObject.affectsConfiguration('workbench.editor.enablePreview', { resource: URI.file(join('folder2', 'file2')) })); + assert.ok(!testObject.affectsConfiguration('workbench.editor.enablePreview', { resource: URI.file('folder1') })); + assert.ok(!testObject.affectsConfiguration('workbench.editor.enablePreview', { resource: URI.file(join('folder1', 'file1')) })); + assert.ok(!testObject.affectsConfiguration('workbench.editor.enablePreview', { resource: URI.file('folder3') })); + + assert.ok(testObject.affectsConfiguration('workbench.editor')); + assert.ok(testObject.affectsConfiguration('workbench.editor', { resource: URI.file('folder2') })); + assert.ok(testObject.affectsConfiguration('workbench.editor', { resource: URI.file(join('folder2', 'file2')) })); + assert.ok(!testObject.affectsConfiguration('workbench.editor', { resource: URI.file('folder1') })); + assert.ok(!testObject.affectsConfiguration('workbench.editor', { resource: URI.file(join('folder1', 'file1')) })); + assert.ok(!testObject.affectsConfiguration('workbench.editor', { resource: URI.file('folder3') })); + + assert.ok(testObject.affectsConfiguration('workbench')); + assert.ok(testObject.affectsConfiguration('workbench', { resource: URI.file('folder2') })); + assert.ok(testObject.affectsConfiguration('workbench', { resource: URI.file(join('folder2', 'file2')) })); + assert.ok(!testObject.affectsConfiguration('workbench', { resource: URI.file('folder1') })); + assert.ok(!testObject.affectsConfiguration('workbench', { resource: URI.file('folder3') })); + + assert.ok(!testObject.affectsConfiguration('files')); + assert.ok(!testObject.affectsConfiguration('files', { resource: URI.file('folder1') })); + assert.ok(!testObject.affectsConfiguration('files', { resource: URI.file(join('folder1', 'file1')) })); + assert.ok(!testObject.affectsConfiguration('files', { resource: URI.file('folder2') })); + assert.ok(!testObject.affectsConfiguration('files', { resource: URI.file(join('folder2', 'file2')) })); + assert.ok(!testObject.affectsConfiguration('files', { resource: URI.file('folder3') })); + assert.ok(!testObject.affectsConfiguration('files', { resource: URI.file(join('folder3', 'file3')) })); + }); + + test('changeEvent - all', () => { + const configuration = new Configuration(new ConfigurationModel(), new ConfigurationModel()); + configuration.updateFolderConfiguration(URI.file('file1'), toConfigurationModel({ 'window.zoomLevel': 2, 'window.restoreFullscreen': true })); + const data = configuration.toData(); + const change = mergeChanges( + configuration.compareAndUpdateDefaultConfiguration(toConfigurationModel({ + 'editor.lineNumbers': 'off', + '[markdown]': { + 'editor.wordWrap': 'off' + } + }), ['editor.lineNumbers', '[markdown]']), + configuration.compareAndUpdateLocalUserConfiguration(toConfigurationModel({ + '[json]': { + 'editor.lineNumbers': 'relative' + } + })), + configuration.compareAndUpdateWorkspaceConfiguration(toConfigurationModel({ 'window.title': 'custom' })), + configuration.compareAndDeleteFolderConfiguration(URI.file('file1')), + configuration.compareAndUpdateFolderConfiguration(URI.file('file2'), toConfigurationModel({ 'workbench.editor.enablePreview': true, 'window.restoreWindows': true }))); + const workspace = new Workspace('a', [new WorkspaceFolder({ index: 0, name: 'a', uri: URI.file('file1') }), new WorkspaceFolder({ index: 1, name: 'b', uri: URI.file('file2') }), new WorkspaceFolder({ index: 2, name: 'c', uri: URI.file('folder3') })]); + const testObject = new ConfigurationChangeEvent(change, { data, workspace }, configuration, workspace); + + assert.deepEqual(testObject.affectedKeys, ['editor.lineNumbers', '[markdown]', '[json]', 'window.title', 'window.zoomLevel', 'window.restoreFullscreen', 'workbench.editor.enablePreview', 'window.restoreWindows', 'editor.wordWrap']); + + assert.ok(testObject.affectsConfiguration('window.title')); + assert.ok(testObject.affectsConfiguration('window.title', { resource: URI.file('file1') })); + assert.ok(testObject.affectsConfiguration('window.title', { resource: URI.file('file2') })); + + assert.ok(testObject.affectsConfiguration('window')); + assert.ok(testObject.affectsConfiguration('window', { resource: URI.file('file1') })); + assert.ok(testObject.affectsConfiguration('window', { resource: URI.file('file2') })); + + assert.ok(testObject.affectsConfiguration('window.zoomLevel')); + assert.ok(testObject.affectsConfiguration('window.zoomLevel', { resource: URI.file('file1') })); + assert.ok(!testObject.affectsConfiguration('window.zoomLevel', { resource: URI.file('file2') })); + + assert.ok(testObject.affectsConfiguration('window.restoreFullscreen')); + assert.ok(testObject.affectsConfiguration('window.restoreFullscreen', { resource: URI.file('file1') })); + assert.ok(!testObject.affectsConfiguration('window.restoreFullscreen', { resource: URI.file('file2') })); + + assert.ok(testObject.affectsConfiguration('window.restoreWindows')); + assert.ok(testObject.affectsConfiguration('window.restoreWindows', { resource: URI.file('file2') })); + assert.ok(!testObject.affectsConfiguration('window.restoreWindows', { resource: URI.file('file1') })); + + assert.ok(testObject.affectsConfiguration('workbench.editor.enablePreview')); + assert.ok(testObject.affectsConfiguration('workbench.editor.enablePreview', { resource: URI.file('file2') })); + assert.ok(!testObject.affectsConfiguration('workbench.editor.enablePreview', { resource: URI.file('file1') })); + + assert.ok(testObject.affectsConfiguration('workbench.editor')); + assert.ok(testObject.affectsConfiguration('workbench.editor', { resource: URI.file('file2') })); + assert.ok(!testObject.affectsConfiguration('workbench.editor', { resource: URI.file('file1') })); + + assert.ok(testObject.affectsConfiguration('workbench')); + assert.ok(testObject.affectsConfiguration('workbench', { resource: URI.file('file2') })); + assert.ok(!testObject.affectsConfiguration('workbench', { resource: URI.file('file1') })); + + assert.ok(!testObject.affectsConfiguration('files')); + assert.ok(!testObject.affectsConfiguration('files', { resource: URI.file('file1') })); + assert.ok(!testObject.affectsConfiguration('files', { resource: URI.file('file2') })); + + assert.ok(testObject.affectsConfiguration('editor')); + assert.ok(testObject.affectsConfiguration('editor', { resource: URI.file('file1') })); + assert.ok(testObject.affectsConfiguration('editor', { resource: URI.file('file2') })); + assert.ok(testObject.affectsConfiguration('editor', { resource: URI.file('file1'), overrideIdentifier: 'json' })); + assert.ok(testObject.affectsConfiguration('editor', { resource: URI.file('file1'), overrideIdentifier: 'markdown' })); + assert.ok(testObject.affectsConfiguration('editor', { resource: URI.file('file1'), overrideIdentifier: 'typescript' })); + assert.ok(testObject.affectsConfiguration('editor', { resource: URI.file('file2'), overrideIdentifier: 'json' })); + assert.ok(testObject.affectsConfiguration('editor', { resource: URI.file('file2'), overrideIdentifier: 'markdown' })); + assert.ok(testObject.affectsConfiguration('editor', { resource: URI.file('file2'), overrideIdentifier: 'typescript' })); + + assert.ok(testObject.affectsConfiguration('editor.lineNumbers')); + assert.ok(testObject.affectsConfiguration('editor.lineNumbers', { resource: URI.file('file1') })); + assert.ok(testObject.affectsConfiguration('editor.lineNumbers', { resource: URI.file('file2') })); + assert.ok(testObject.affectsConfiguration('editor.lineNumbers', { resource: URI.file('file1'), overrideIdentifier: 'json' })); + assert.ok(testObject.affectsConfiguration('editor.lineNumbers', { resource: URI.file('file1'), overrideIdentifier: 'markdown' })); + assert.ok(testObject.affectsConfiguration('editor.lineNumbers', { resource: URI.file('file1'), overrideIdentifier: 'typescript' })); + assert.ok(testObject.affectsConfiguration('editor.lineNumbers', { resource: URI.file('file2'), overrideIdentifier: 'json' })); + assert.ok(testObject.affectsConfiguration('editor.lineNumbers', { resource: URI.file('file2'), overrideIdentifier: 'markdown' })); + assert.ok(testObject.affectsConfiguration('editor.lineNumbers', { resource: URI.file('file2'), overrideIdentifier: 'typescript' })); + + assert.ok(testObject.affectsConfiguration('editor.wordWrap')); + assert.ok(!testObject.affectsConfiguration('editor.wordWrap', { resource: URI.file('file1') })); + assert.ok(!testObject.affectsConfiguration('editor.wordWrap', { resource: URI.file('file2') })); + assert.ok(!testObject.affectsConfiguration('editor.wordWrap', { resource: URI.file('file1'), overrideIdentifier: 'json' })); + assert.ok(testObject.affectsConfiguration('editor.wordWrap', { resource: URI.file('file1'), overrideIdentifier: 'markdown' })); + assert.ok(!testObject.affectsConfiguration('editor.wordWrap', { resource: URI.file('file1'), overrideIdentifier: 'typescript' })); + assert.ok(!testObject.affectsConfiguration('editor.wordWrap', { resource: URI.file('file2'), overrideIdentifier: 'json' })); + assert.ok(testObject.affectsConfiguration('editor.wordWrap', { resource: URI.file('file2'), overrideIdentifier: 'markdown' })); + assert.ok(!testObject.affectsConfiguration('editor.wordWrap', { resource: URI.file('file2'), overrideIdentifier: 'typescript' })); + + assert.ok(!testObject.affectsConfiguration('editor.fontSize')); + assert.ok(!testObject.affectsConfiguration('editor.fontSize', { resource: URI.file('file1') })); + assert.ok(!testObject.affectsConfiguration('editor.fontSize', { resource: URI.file('file2') })); + }); + + test('changeEvent affecting tasks and launches', () => { + const configuration = new Configuration(new ConfigurationModel(), new ConfigurationModel()); + const change = configuration.compareAndUpdateLocalUserConfiguration(toConfigurationModel({ + 'launch': { + 'configuraiton': {} + }, + 'launch.version': 1, + 'tasks': { + 'version': 2 + } + })); + let testObject = new ConfigurationChangeEvent(change, undefined, configuration); + + assert.deepEqual(testObject.affectedKeys, ['launch', 'launch.version', 'tasks']); + assert.ok(testObject.affectsConfiguration('launch')); + assert.ok(testObject.affectsConfiguration('launch.version')); + assert.ok(testObject.affectsConfiguration('tasks')); + }); + +}); + +suite('AllKeysConfigurationChangeEvent', () => { + + test('changeEvent', () => { + const configuration = new Configuration(new ConfigurationModel(), new ConfigurationModel()); + configuration.updateDefaultConfiguration(toConfigurationModel({ + 'editor.lineNumbers': 'off', + '[markdown]': { + 'editor.wordWrap': 'off' + } + })); + configuration.updateLocalUserConfiguration(toConfigurationModel({ + '[json]': { + 'editor.lineNumbers': 'relative' + } + })); + configuration.updateWorkspaceConfiguration(toConfigurationModel({ 'window.title': 'custom' })); + configuration.updateFolderConfiguration(URI.file('file1'), toConfigurationModel({ 'window.zoomLevel': 2, 'window.restoreFullscreen': true })); + configuration.updateFolderConfiguration(URI.file('file2'), toConfigurationModel({ 'workbench.editor.enablePreview': true, 'window.restoreWindows': true })); + const workspace = new Workspace('a', [new WorkspaceFolder({ index: 0, name: 'a', uri: URI.file('file1') }), new WorkspaceFolder({ index: 1, name: 'b', uri: URI.file('file2') }), new WorkspaceFolder({ index: 2, name: 'c', uri: URI.file('folder3') })]); + let testObject = new AllKeysConfigurationChangeEvent(configuration, workspace, ConfigurationTarget.USER, null); + + assert.deepEqual(testObject.affectedKeys, ['editor.lineNumbers', '[markdown]', '[json]', 'window.title', 'window.zoomLevel', 'window.restoreFullscreen', 'workbench.editor.enablePreview', 'window.restoreWindows']); + + assert.ok(testObject.affectsConfiguration('window.title')); + assert.ok(testObject.affectsConfiguration('window.title', { resource: URI.file('file1') })); + assert.ok(testObject.affectsConfiguration('window.title', { resource: URI.file('file2') })); + + assert.ok(testObject.affectsConfiguration('window')); + assert.ok(testObject.affectsConfiguration('window', { resource: URI.file('file1') })); + assert.ok(testObject.affectsConfiguration('window', { resource: URI.file('file2') })); + + assert.ok(testObject.affectsConfiguration('window.zoomLevel')); + assert.ok(testObject.affectsConfiguration('window.zoomLevel', { resource: URI.file('file1') })); + assert.ok(!testObject.affectsConfiguration('window.zoomLevel', { resource: URI.file('file2') })); + + assert.ok(testObject.affectsConfiguration('window.restoreFullscreen')); + assert.ok(testObject.affectsConfiguration('window.restoreFullscreen', { resource: URI.file('file1') })); + assert.ok(!testObject.affectsConfiguration('window.restoreFullscreen', { resource: URI.file('file2') })); + + assert.ok(testObject.affectsConfiguration('window.restoreWindows')); + assert.ok(testObject.affectsConfiguration('window.restoreWindows', { resource: URI.file('file2') })); + assert.ok(!testObject.affectsConfiguration('window.restoreWindows', { resource: URI.file('file1') })); + + assert.ok(testObject.affectsConfiguration('workbench.editor.enablePreview')); + assert.ok(testObject.affectsConfiguration('workbench.editor.enablePreview', { resource: URI.file('file2') })); + assert.ok(!testObject.affectsConfiguration('workbench.editor.enablePreview', { resource: URI.file('file1') })); + + assert.ok(testObject.affectsConfiguration('workbench.editor')); + assert.ok(testObject.affectsConfiguration('workbench.editor', { resource: URI.file('file2') })); + assert.ok(!testObject.affectsConfiguration('workbench.editor', { resource: URI.file('file1') })); + + assert.ok(testObject.affectsConfiguration('workbench')); + assert.ok(testObject.affectsConfiguration('workbench', { resource: URI.file('file2') })); + assert.ok(!testObject.affectsConfiguration('workbench', { resource: URI.file('file1') })); + + assert.ok(!testObject.affectsConfiguration('files')); + assert.ok(!testObject.affectsConfiguration('files', { resource: URI.file('file1') })); + assert.ok(!testObject.affectsConfiguration('files', { resource: URI.file('file2') })); + + assert.ok(testObject.affectsConfiguration('editor')); + assert.ok(testObject.affectsConfiguration('editor', { resource: URI.file('file1') })); + assert.ok(testObject.affectsConfiguration('editor', { resource: URI.file('file2') })); + assert.ok(testObject.affectsConfiguration('editor', { resource: URI.file('file1'), overrideIdentifier: 'json' })); + assert.ok(testObject.affectsConfiguration('editor', { resource: URI.file('file1'), overrideIdentifier: 'markdown' })); + assert.ok(testObject.affectsConfiguration('editor', { resource: URI.file('file1'), overrideIdentifier: 'typescript' })); + assert.ok(testObject.affectsConfiguration('editor', { resource: URI.file('file2'), overrideIdentifier: 'json' })); + assert.ok(testObject.affectsConfiguration('editor', { resource: URI.file('file2'), overrideIdentifier: 'markdown' })); + assert.ok(testObject.affectsConfiguration('editor', { resource: URI.file('file2'), overrideIdentifier: 'typescript' })); + + assert.ok(testObject.affectsConfiguration('editor.lineNumbers')); + assert.ok(testObject.affectsConfiguration('editor.lineNumbers', { resource: URI.file('file1') })); + assert.ok(testObject.affectsConfiguration('editor.lineNumbers', { resource: URI.file('file2') })); + assert.ok(testObject.affectsConfiguration('editor.lineNumbers', { resource: URI.file('file1'), overrideIdentifier: 'json' })); + assert.ok(testObject.affectsConfiguration('editor.lineNumbers', { resource: URI.file('file1'), overrideIdentifier: 'markdown' })); + assert.ok(testObject.affectsConfiguration('editor.lineNumbers', { resource: URI.file('file1'), overrideIdentifier: 'typescript' })); + assert.ok(testObject.affectsConfiguration('editor.lineNumbers', { resource: URI.file('file2'), overrideIdentifier: 'json' })); + assert.ok(testObject.affectsConfiguration('editor.lineNumbers', { resource: URI.file('file2'), overrideIdentifier: 'markdown' })); + assert.ok(testObject.affectsConfiguration('editor.lineNumbers', { resource: URI.file('file2'), overrideIdentifier: 'typescript' })); + + assert.ok(!testObject.affectsConfiguration('editor.wordWrap')); + assert.ok(!testObject.affectsConfiguration('editor.wordWrap', { resource: URI.file('file1') })); + assert.ok(!testObject.affectsConfiguration('editor.wordWrap', { resource: URI.file('file2') })); + assert.ok(!testObject.affectsConfiguration('editor.wordWrap', { resource: URI.file('file1'), overrideIdentifier: 'json' })); + assert.ok(!testObject.affectsConfiguration('editor.wordWrap', { resource: URI.file('file1'), overrideIdentifier: 'markdown' })); + assert.ok(!testObject.affectsConfiguration('editor.wordWrap', { resource: URI.file('file1'), overrideIdentifier: 'typescript' })); + assert.ok(!testObject.affectsConfiguration('editor.wordWrap', { resource: URI.file('file2'), overrideIdentifier: 'json' })); + assert.ok(!testObject.affectsConfiguration('editor.wordWrap', { resource: URI.file('file2'), overrideIdentifier: 'markdown' })); + assert.ok(!testObject.affectsConfiguration('editor.wordWrap', { resource: URI.file('file2'), overrideIdentifier: 'typescript' })); + + assert.ok(!testObject.affectsConfiguration('editor.fontSize')); + assert.ok(!testObject.affectsConfiguration('editor.fontSize', { resource: URI.file('file1') })); + assert.ok(!testObject.affectsConfiguration('editor.fontSize', { resource: URI.file('file2') })); + }); +}); function toConfigurationModel(obj: any): ConfigurationModel { const parser = new ConfigurationModelParser('test'); diff --git a/src/vs/workbench/api/common/extHostConfiguration.ts b/src/vs/workbench/api/common/extHostConfiguration.ts index e754474f4e3..ba79a5357fb 100644 --- a/src/vs/workbench/api/common/extHostConfiguration.ts +++ b/src/vs/workbench/api/common/extHostConfiguration.ts @@ -257,7 +257,7 @@ export class ExtHostConfigProvider { private _toConfigurationChangeEvent(change: IConfigurationChange, previous: { data: IConfigurationData, workspace: Workspace | undefined }): vscode.ConfigurationChangeEvent { const event = new ConfigurationChangeEvent(change, previous, this._configuration, this._extHostWorkspace.workspace); return Object.freeze({ - affectsConfiguration: (section: string, resource?: URI) => event.affectsConfiguration(section, { resource }) + affectsConfiguration: (section: string, resource?: URI) => event.affectsConfiguration(section, resource ? { resource } : undefined) }); } diff --git a/src/vs/workbench/services/configuration/common/configurationModels.ts b/src/vs/workbench/services/configuration/common/configurationModels.ts index cdebd413e5a..5159bd43fe8 100644 --- a/src/vs/workbench/services/configuration/common/configurationModels.ts +++ b/src/vs/workbench/services/configuration/common/configurationModels.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { equals } from 'vs/base/common/objects'; -import { compare, toValuesTree, IConfigurationModel, IConfigurationOverrides, IConfigurationValue, IConfigurationChange } from 'vs/platform/configuration/common/configuration'; +import { toValuesTree, IConfigurationModel, IConfigurationOverrides, IConfigurationValue, IConfigurationChange, overrideIdentifierFromKey } from 'vs/platform/configuration/common/configuration'; import { Configuration as BaseConfiguration, ConfigurationModelParser, ConfigurationModel } from 'vs/platform/configuration/common/configurationModels'; import { IStoredWorkspaceFolder } from 'vs/platform/workspaces/common/workspaces'; import { Workspace } from 'vs/platform/workspace/common/workspace'; @@ -115,62 +115,39 @@ export class Configuration extends BaseConfiguration { return super.keys(this._workspace); } - compareAndUpdateRemoteUserConfiguration(user: ConfigurationModel): IConfigurationChange { - const { added, updated, removed, overrides } = compare(this.remoteUserConfiguration, user); - let keys = [...added, ...updated, ...removed]; - if (keys.length) { - super.updateRemoteUserConfiguration(user); - } - return { keys, overrides }; - } - - compareAndUpdateWorkspaceConfiguration(workspaceConfiguration: ConfigurationModel): IConfigurationChange { - const { added, updated, removed, overrides } = compare(this.workspaceConfiguration, workspaceConfiguration); - let keys = [...added, ...updated, ...removed]; - if (keys.length) { - super.updateWorkspaceConfiguration(workspaceConfiguration); - } - return { keys, overrides }; - } - - compareAndUpdateFolderConfiguration(resource: URI, folderConfiguration: ConfigurationModel): IConfigurationChange { - const currentFolderConfiguration = this.folderConfigurations.get(resource); - const { added, updated, removed, overrides } = compare(currentFolderConfiguration, folderConfiguration); - let keys = [...added, ...updated, ...removed]; - if (keys.length) { - super.updateFolderConfiguration(resource, folderConfiguration); - } - return { keys, overrides }; - } - compareAndDeleteFolderConfiguration(folder: URI): IConfigurationChange { if (this._workspace && this._workspace.folders.length > 0 && this._workspace.folders[0].uri.toString() === folder.toString()) { // Do not remove workspace configuration return { keys: [], overrides: [] }; } - const folderConfig = this.folderConfigurations.get(folder); - if (!folderConfig) { - throw new Error('Unknown folder'); - } - super.deleteFolderConfiguration(folder); - const { added, updated, removed, overrides } = compare(folderConfig, undefined); - return { keys: [...added, ...updated, ...removed], overrides }; + return super.compareAndDeleteFolderConfiguration(folder); } compare(other: Configuration): IConfigurationChange { const compare = (fromKeys: string[], toKeys: string[], overrideIdentifier?: string): string[] => { - return [ - ...toKeys.filter(key => fromKeys.indexOf(key) === -1), - ...fromKeys.filter(key => toKeys.indexOf(key) === -1), - ...fromKeys.filter(key => !equals(this.getValue(key, { overrideIdentifier }), other.getValue(key, { overrideIdentifier })) - || (this._workspace && this._workspace.folders.some(folder => !equals(this.getValue(key, { resource: folder.uri, overrideIdentifier }), other.getValue(key, { resource: folder.uri, overrideIdentifier }))))) - ]; + const keys: string[] = []; + keys.push(...toKeys.filter(key => fromKeys.indexOf(key) === -1)); + keys.push(...fromKeys.filter(key => toKeys.indexOf(key) === -1)); + keys.push(...fromKeys.filter(key => { + // Ignore if the key does not exist in both models + if (toKeys.indexOf(key) === -1) { + return false; + } + // Compare workspace value + if (!equals(this.getValue(key, { overrideIdentifier }), other.getValue(key, { overrideIdentifier }))) { + return true; + } + // Compare workspace folder value + return this._workspace && this._workspace.folders.some(folder => !equals(this.getValue(key, { resource: folder.uri, overrideIdentifier }), other.getValue(key, { resource: folder.uri, overrideIdentifier }))); + })); + return keys; }; const keys = compare(this.allKeys(), other.allKeys()); const overrides: [string, string[]][] = []; for (const key of keys) { if (OVERRIDE_PROPERTY_PATTERN.test(key)) { - overrides.push([key, compare(this.getAllKeysForOverrideIdentifier(key), other.getAllKeysForOverrideIdentifier(key), key)]); + const overrideIdentifier = overrideIdentifierFromKey(key); + overrides.push([overrideIdentifier, compare(this.getAllKeysForOverrideIdentifier(overrideIdentifier), other.getAllKeysForOverrideIdentifier(overrideIdentifier), overrideIdentifier)]); } } return { keys, overrides }; diff --git a/src/vs/workbench/services/configuration/test/common/configurationModels.test.ts b/src/vs/workbench/services/configuration/test/common/configurationModels.test.ts index 950b215df35..83fcb92b685 100644 --- a/src/vs/workbench/services/configuration/test/common/configurationModels.test.ts +++ b/src/vs/workbench/services/configuration/test/common/configurationModels.test.ts @@ -3,15 +3,13 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ import * as assert from 'assert'; -import { join } from 'vs/base/common/path'; import { Registry } from 'vs/platform/registry/common/platform'; -import { WorkspaceConfigurationChangeEvent, StandaloneConfigurationModelParser, AllKeysConfigurationChangeEvent, Configuration } from 'vs/workbench/services/configuration/common/configurationModels'; -import { Workspace, WorkspaceFolder } from 'vs/platform/workspace/common/workspace'; -import { URI } from 'vs/base/common/uri'; -import { ConfigurationChangeEvent, ConfigurationModel, ConfigurationModelParser } from 'vs/platform/configuration/common/configurationModels'; -import { ConfigurationTarget } from 'vs/platform/configuration/common/configuration'; +import { StandaloneConfigurationModelParser, Configuration } from 'vs/workbench/services/configuration/common/configurationModels'; +import { ConfigurationModelParser, ConfigurationModel } from 'vs/platform/configuration/common/configurationModels'; import { IConfigurationRegistry, Extensions as ConfigurationExtensions, ConfigurationScope } from 'vs/platform/configuration/common/configurationRegistry'; import { ResourceMap } from 'vs/base/common/map'; +import { Workspace, WorkspaceFolder } from 'vs/platform/workspace/common/workspace'; +import { URI } from 'vs/base/common/uri'; suite('FolderSettingsModelParser', () => { @@ -66,7 +64,7 @@ suite('FolderSettingsModelParser', () => { testObject.parseContent(JSON.stringify({ '[json]': { 'FolderSettingsModelParser.window': 'window', 'FolderSettingsModelParser.resource': 'resource', 'FolderSettingsModelParser.application': 'application', 'FolderSettingsModelParser.machine': 'executable' } })); - assert.deepEqual(testObject.configurationModel.overrides, [{ 'contents': { 'FolderSettingsModelParser': { 'resource': 'resource' } }, 'identifiers': ['json'] }]); + assert.deepEqual(testObject.configurationModel.overrides, [{ 'contents': { 'FolderSettingsModelParser': { 'resource': 'resource' } }, 'identifiers': ['json'], 'keys': ['FolderSettingsModelParser.resource'] }]); }); test('reprocess folder settings excludes application and machine setting', () => { @@ -112,143 +110,72 @@ suite('StandaloneConfigurationModelParser', () => { }); -suite('WorkspaceConfigurationChangeEvent', () => { +suite('Workspace Configuration', () => { - test('changeEvent affecting workspace folders', () => { - let configurationChangeEvent = new ConfigurationChangeEvent(); - configurationChangeEvent.change(['window.title']); - configurationChangeEvent.change(['window.zoomLevel'], URI.file('folder1')); - configurationChangeEvent.change(['workbench.editor.enablePreview'], URI.file('folder2')); - configurationChangeEvent.change(['window.restoreFullscreen'], URI.file('folder1')); - configurationChangeEvent.change(['window.restoreWindows'], URI.file('folder2')); - configurationChangeEvent.telemetryData(ConfigurationTarget.WORKSPACE, {}); - - let testObject = new WorkspaceConfigurationChangeEvent(configurationChangeEvent, new Workspace('id', - [new WorkspaceFolder({ index: 0, name: '1', uri: URI.file('folder1') }), - new WorkspaceFolder({ index: 1, name: '2', uri: URI.file('folder2') }), - new WorkspaceFolder({ index: 2, name: '3', uri: URI.file('folder3') })])); - - assert.deepEqual(testObject.affectedKeys, ['window.title', 'window.zoomLevel', 'window.restoreFullscreen', 'workbench.editor.enablePreview', 'window.restoreWindows']); - assert.equal(testObject.source, ConfigurationTarget.WORKSPACE); - - assert.ok(testObject.affectsConfiguration('window.zoomLevel')); - assert.ok(testObject.affectsConfiguration('window.zoomLevel', URI.file('folder1'))); - assert.ok(testObject.affectsConfiguration('window.zoomLevel', URI.file(join('folder1', 'file1')))); - assert.ok(!testObject.affectsConfiguration('window.zoomLevel', URI.file('file1'))); - assert.ok(!testObject.affectsConfiguration('window.zoomLevel', URI.file('file2'))); - assert.ok(!testObject.affectsConfiguration('window.zoomLevel', URI.file(join('folder2', 'file2')))); - assert.ok(!testObject.affectsConfiguration('window.zoomLevel', URI.file(join('folder3', 'file3')))); - - assert.ok(testObject.affectsConfiguration('window.restoreFullscreen')); - assert.ok(testObject.affectsConfiguration('window.restoreFullscreen', URI.file(join('folder1', 'file1')))); - assert.ok(testObject.affectsConfiguration('window.restoreFullscreen', URI.file('folder1'))); - assert.ok(!testObject.affectsConfiguration('window.restoreFullscreen', URI.file('file1'))); - assert.ok(!testObject.affectsConfiguration('window.restoreFullscreen', URI.file('file2'))); - assert.ok(!testObject.affectsConfiguration('window.restoreFullscreen', URI.file(join('folder2', 'file2')))); - assert.ok(!testObject.affectsConfiguration('window.restoreFullscreen', URI.file(join('folder3', 'file3')))); - - assert.ok(testObject.affectsConfiguration('window.restoreWindows')); - assert.ok(testObject.affectsConfiguration('window.restoreWindows', URI.file('folder2'))); - assert.ok(testObject.affectsConfiguration('window.restoreWindows', URI.file(join('folder2', 'file2')))); - assert.ok(!testObject.affectsConfiguration('window.restoreWindows', URI.file('file2'))); - assert.ok(!testObject.affectsConfiguration('window.restoreWindows', URI.file(join('folder1', 'file1')))); - assert.ok(!testObject.affectsConfiguration('window.restoreWindows', URI.file(join('folder3', 'file3')))); - - assert.ok(testObject.affectsConfiguration('window.title')); - assert.ok(testObject.affectsConfiguration('window.title', URI.file('folder1'))); - assert.ok(testObject.affectsConfiguration('window.title', URI.file(join('folder1', 'file1')))); - assert.ok(testObject.affectsConfiguration('window.title', URI.file('folder2'))); - assert.ok(testObject.affectsConfiguration('window.title', URI.file(join('folder2', 'file2')))); - assert.ok(testObject.affectsConfiguration('window.title', URI.file('folder3'))); - assert.ok(testObject.affectsConfiguration('window.title', URI.file(join('folder3', 'file3')))); - assert.ok(testObject.affectsConfiguration('window.title', URI.file('file1'))); - assert.ok(testObject.affectsConfiguration('window.title', URI.file('file2'))); - assert.ok(testObject.affectsConfiguration('window.title', URI.file('file3'))); - - assert.ok(testObject.affectsConfiguration('window')); - assert.ok(testObject.affectsConfiguration('window', URI.file('folder1'))); - assert.ok(testObject.affectsConfiguration('window', URI.file(join('folder1', 'file1')))); - assert.ok(testObject.affectsConfiguration('window', URI.file('folder2'))); - assert.ok(testObject.affectsConfiguration('window', URI.file(join('folder2', 'file2')))); - assert.ok(testObject.affectsConfiguration('window', URI.file('folder3'))); - assert.ok(testObject.affectsConfiguration('window', URI.file(join('folder3', 'file3')))); - assert.ok(testObject.affectsConfiguration('window', URI.file('file1'))); - assert.ok(testObject.affectsConfiguration('window', URI.file('file2'))); - assert.ok(testObject.affectsConfiguration('window', URI.file('file3'))); - - assert.ok(testObject.affectsConfiguration('workbench.editor.enablePreview')); - assert.ok(testObject.affectsConfiguration('workbench.editor.enablePreview', URI.file('folder2'))); - assert.ok(testObject.affectsConfiguration('workbench.editor.enablePreview', URI.file(join('folder2', 'file2')))); - assert.ok(!testObject.affectsConfiguration('workbench.editor.enablePreview', URI.file('folder1'))); - assert.ok(!testObject.affectsConfiguration('workbench.editor.enablePreview', URI.file(join('folder1', 'file1')))); - assert.ok(!testObject.affectsConfiguration('workbench.editor.enablePreview', URI.file('folder3'))); - - assert.ok(testObject.affectsConfiguration('workbench.editor')); - assert.ok(testObject.affectsConfiguration('workbench.editor', URI.file('folder2'))); - assert.ok(testObject.affectsConfiguration('workbench.editor', URI.file(join('folder2', 'file2')))); - assert.ok(!testObject.affectsConfiguration('workbench.editor', URI.file('folder1'))); - assert.ok(!testObject.affectsConfiguration('workbench.editor', URI.file(join('folder1', 'file1')))); - assert.ok(!testObject.affectsConfiguration('workbench.editor', URI.file('folder3'))); - - assert.ok(testObject.affectsConfiguration('workbench')); - assert.ok(testObject.affectsConfiguration('workbench', URI.file('folder2'))); - assert.ok(testObject.affectsConfiguration('workbench', URI.file(join('folder2', 'file2')))); - assert.ok(!testObject.affectsConfiguration('workbench', URI.file('folder1'))); - assert.ok(!testObject.affectsConfiguration('workbench', URI.file('folder3'))); - - assert.ok(!testObject.affectsConfiguration('files')); - assert.ok(!testObject.affectsConfiguration('files', URI.file('folder1'))); - assert.ok(!testObject.affectsConfiguration('files', URI.file(join('folder1', 'file1')))); - assert.ok(!testObject.affectsConfiguration('files', URI.file('folder2'))); - assert.ok(!testObject.affectsConfiguration('files', URI.file(join('folder2', 'file2')))); - assert.ok(!testObject.affectsConfiguration('files', URI.file('folder3'))); - assert.ok(!testObject.affectsConfiguration('files', URI.file(join('folder3', 'file3')))); + const defaultConfigurationModel = toConfigurationModel({ + 'editor.lineNumbers': 'on', + 'editor.fontSize': 12, + 'window.zoomLevel': 1, + '[markdown]': { + 'editor.wordWrap': 'off' + }, + 'window.title': 'custom', + 'workbench.enableTabs': false, + 'editor.insertSpaces': true }); + test('Test compare same configurations', () => { + const 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') })]); + const configuration1 = new Configuration(new ConfigurationModel(), new ConfigurationModel(), new ConfigurationModel(), new ConfigurationModel(), new ResourceMap(), new ConfigurationModel(), new ResourceMap(), workspace); + configuration1.updateDefaultConfiguration(defaultConfigurationModel); + configuration1.updateLocalUserConfiguration(toConfigurationModel({ 'window.title': 'native', '[typescript]': { 'editor.insertSpaces': false } })); + configuration1.updateWorkspaceConfiguration(toConfigurationModel({ 'editor.lineNumbers': 'on' })); + configuration1.updateFolderConfiguration(URI.file('folder1'), toConfigurationModel({ 'editor.fontSize': 14 })); + configuration1.updateFolderConfiguration(URI.file('folder2'), toConfigurationModel({ 'editor.wordWrap': 'on' })); + + const configuration2 = new Configuration(new ConfigurationModel(), new ConfigurationModel(), new ConfigurationModel(), new ConfigurationModel(), new ResourceMap(), new ConfigurationModel(), new ResourceMap(), workspace); + configuration2.updateDefaultConfiguration(defaultConfigurationModel); + configuration2.updateLocalUserConfiguration(toConfigurationModel({ 'window.title': 'native', '[typescript]': { 'editor.insertSpaces': false } })); + configuration2.updateWorkspaceConfiguration(toConfigurationModel({ 'editor.lineNumbers': 'on' })); + configuration2.updateFolderConfiguration(URI.file('folder1'), toConfigurationModel({ 'editor.fontSize': 14 })); + configuration2.updateFolderConfiguration(URI.file('folder2'), toConfigurationModel({ 'editor.wordWrap': 'on' })); + + const actual = configuration2.compare(configuration1); + + assert.deepEqual(actual, { keys: [], overrides: [] }); + }); + + test('Test compare different configurations', () => { + const 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') })]); + const configuration1 = new Configuration(new ConfigurationModel(), new ConfigurationModel(), new ConfigurationModel(), new ConfigurationModel(), new ResourceMap(), new ConfigurationModel(), new ResourceMap(), workspace); + configuration1.updateDefaultConfiguration(defaultConfigurationModel); + configuration1.updateLocalUserConfiguration(toConfigurationModel({ 'window.title': 'native', '[typescript]': { 'editor.insertSpaces': false } })); + configuration1.updateWorkspaceConfiguration(toConfigurationModel({ 'editor.lineNumbers': 'on' })); + configuration1.updateFolderConfiguration(URI.file('folder1'), toConfigurationModel({ 'editor.fontSize': 14 })); + configuration1.updateFolderConfiguration(URI.file('folder2'), toConfigurationModel({ 'editor.wordWrap': 'on' })); + + const configuration2 = new Configuration(new ConfigurationModel(), new ConfigurationModel(), new ConfigurationModel(), new ConfigurationModel(), new ResourceMap(), new ConfigurationModel(), new ResourceMap(), workspace); + configuration2.updateDefaultConfiguration(defaultConfigurationModel); + configuration2.updateLocalUserConfiguration(toConfigurationModel({ 'workbench.enableTabs': true, '[typescript]': { 'editor.insertSpaces': true } })); + configuration2.updateWorkspaceConfiguration(toConfigurationModel({ 'editor.fontSize': 11 })); + configuration2.updateFolderConfiguration(URI.file('folder1'), toConfigurationModel({ 'editor.insertSpaces': true })); + configuration2.updateFolderConfiguration(URI.file('folder2'), toConfigurationModel({ + '[markdown]': { + 'editor.wordWrap': 'on', + 'editor.lineNumbers': 'relative' + }, + })); + + const actual = configuration2.compare(configuration1); + + assert.deepEqual(actual, { keys: ['editor.wordWrap', 'editor.fontSize', '[markdown]', 'window.title', 'workbench.enableTabs', '[typescript]'], overrides: [['markdown', ['editor.lineNumbers', 'editor.wordWrap']], ['typescript', ['editor.insertSpaces']]] }); + }); + + }); -suite('AllKeysConfigurationChangeEvent', () => { - - test('changeEvent affects keys for any resource', () => { - const configuraiton = new Configuration(new ConfigurationModel({}, ['window.title', 'window.zoomLevel', 'window.restoreFullscreen', 'workbench.editor.enablePreview', 'window.restoreWindows']), - new ConfigurationModel(), new ConfigurationModel(), new ConfigurationModel(), new ResourceMap(), new ConfigurationModel(), new ResourceMap(), null!); - let testObject = new AllKeysConfigurationChangeEvent(configuraiton, ConfigurationTarget.USER, null); - - assert.deepEqual(testObject.affectedKeys, ['window.title', 'window.zoomLevel', 'window.restoreFullscreen', 'workbench.editor.enablePreview', 'window.restoreWindows']); - - assert.ok(testObject.affectsConfiguration('window.zoomLevel')); - assert.ok(testObject.affectsConfiguration('window.zoomLevel', URI.file('file1'))); - assert.ok(testObject.affectsConfiguration('window.zoomLevel', URI.file('file2'))); - - assert.ok(testObject.affectsConfiguration('window.restoreFullscreen')); - assert.ok(testObject.affectsConfiguration('window.restoreFullscreen', URI.file('file1'))); - assert.ok(testObject.affectsConfiguration('window.restoreFullscreen', URI.file('file2'))); - - assert.ok(testObject.affectsConfiguration('window.restoreWindows')); - assert.ok(testObject.affectsConfiguration('window.restoreWindows', URI.file('file2'))); - assert.ok(testObject.affectsConfiguration('window.restoreWindows', URI.file('file1'))); - - assert.ok(testObject.affectsConfiguration('window.title')); - assert.ok(testObject.affectsConfiguration('window.title', URI.file('file1'))); - assert.ok(testObject.affectsConfiguration('window.title', URI.file('file2'))); - - assert.ok(testObject.affectsConfiguration('window')); - assert.ok(testObject.affectsConfiguration('window', URI.file('file1'))); - assert.ok(testObject.affectsConfiguration('window', URI.file('file2'))); - - assert.ok(testObject.affectsConfiguration('workbench.editor.enablePreview')); - assert.ok(testObject.affectsConfiguration('workbench.editor.enablePreview', URI.file('file2'))); - assert.ok(testObject.affectsConfiguration('workbench.editor.enablePreview', URI.file('file1'))); - - assert.ok(testObject.affectsConfiguration('workbench.editor')); - assert.ok(testObject.affectsConfiguration('workbench.editor', URI.file('file2'))); - assert.ok(testObject.affectsConfiguration('workbench.editor', URI.file('file1'))); - - assert.ok(testObject.affectsConfiguration('workbench')); - assert.ok(testObject.affectsConfiguration('workbench', URI.file('file2'))); - assert.ok(testObject.affectsConfiguration('workbench', URI.file('file1'))); - - assert.ok(!testObject.affectsConfiguration('files')); - assert.ok(!testObject.affectsConfiguration('files', URI.file('file1'))); - }); -}); +function toConfigurationModel(obj: any): ConfigurationModel { + const parser = new ConfigurationModelParser('test'); + parser.parseContent(JSON.stringify(obj)); + return parser.configurationModel; +} diff --git a/src/vs/workbench/test/electron-browser/api/extHostConfiguration.test.ts b/src/vs/workbench/test/electron-browser/api/extHostConfiguration.test.ts index 471099c29b3..a56f1d41f4c 100644 --- a/src/vs/workbench/test/electron-browser/api/extHostConfiguration.test.ts +++ b/src/vs/workbench/test/electron-browser/api/extHostConfiguration.test.ts @@ -608,7 +608,7 @@ suite('ExtHostConfiguration', function () { createConfigurationData({ 'farboo': { 'config': false, - 'updatedconfig': false + 'updatedConfig': false } }), new NullLogService() @@ -617,16 +617,16 @@ suite('ExtHostConfiguration', function () { const newConfigData = createConfigurationData({ 'farboo': { 'config': false, - 'updatedconfig': true, + 'updatedConfig': true, 'newConfig': true, } }); - const configEventData: IConfigurationChange = { keys: ['farboo.updatedConfig'], overrides: [] }; + const configEventData: IConfigurationChange = { keys: ['farboo.updatedConfig', 'farboo.newConfig'], overrides: [] }; testObject.onDidChangeConfiguration(e => { assert.deepEqual(testObject.getConfiguration().get('farboo'), { 'config': false, - 'updatedconfig': true, + 'updatedConfig': true, 'newConfig': true, }); @@ -640,7 +640,7 @@ suite('ExtHostConfiguration', function () { assert.ok(e.affectsConfiguration('farboo.newConfig')); assert.ok(e.affectsConfiguration('farboo.newConfig', workspaceFolder.uri)); - assert.ok(!e.affectsConfiguration('farboo.newConfig', URI.file('any'))); + assert.ok(e.affectsConfiguration('farboo.newConfig', URI.file('any'))); assert.ok(!e.affectsConfiguration('farboo.config')); assert.ok(!e.affectsConfiguration('farboo.config', workspaceFolder.uri));