Path: blob/main/src/vs/workbench/api/test/browser/extHostConfiguration.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 { URI, UriComponents } from '../../../../base/common/uri.js';7import { ExtHostWorkspace } from '../../common/extHostWorkspace.js';8import { ConfigurationInspect, ExtHostConfigProvider } from '../../common/extHostConfiguration.js';9import { MainThreadConfigurationShape, IConfigurationInitData } from '../../common/extHost.protocol.js';10import { ConfigurationModel, ConfigurationModelParser } from '../../../../platform/configuration/common/configurationModels.js';11import { TestRPCProtocol } from '../common/testRPCProtocol.js';12import { mock } from '../../../../base/test/common/mock.js';13import { IWorkspaceFolder, WorkspaceFolder } from '../../../../platform/workspace/common/workspace.js';14import { ConfigurationTarget, IConfigurationModel, IConfigurationChange } from '../../../../platform/configuration/common/configuration.js';15import { NullLogService } from '../../../../platform/log/common/log.js';16import { IExtHostInitDataService } from '../../common/extHostInitDataService.js';17import { IExtHostFileSystemInfo } from '../../common/extHostFileSystemInfo.js';18import { FileSystemProviderCapabilities } from '../../../../platform/files/common/files.js';19import { isLinux } from '../../../../base/common/platform.js';20import { IURITransformerService } from '../../common/extHostUriTransformerService.js';21import { ensureNoDisposablesAreLeakedInTestSuite } from '../../../../base/test/common/utils.js';2223suite('ExtHostConfiguration', function () {2425class RecordingShape extends mock<MainThreadConfigurationShape>() {26lastArgs!: [ConfigurationTarget, string, any];27override $updateConfigurationOption(target: ConfigurationTarget, key: string, value: any): Promise<void> {28this.lastArgs = [target, key, value];29return Promise.resolve(undefined);30}31}3233function createExtHostWorkspace(): ExtHostWorkspace {34return new ExtHostWorkspace(new TestRPCProtocol(), new class extends mock<IExtHostInitDataService>() { }, new class extends mock<IExtHostFileSystemInfo>() { override getCapabilities() { return isLinux ? FileSystemProviderCapabilities.PathCaseSensitive : undefined; } }, new NullLogService(), new class extends mock<IURITransformerService>() { });35}3637function createExtHostConfiguration(contents: any = Object.create(null), shape?: MainThreadConfigurationShape) {38if (!shape) {39shape = new class extends mock<MainThreadConfigurationShape>() { };40}41return new ExtHostConfigProvider(shape, createExtHostWorkspace(), createConfigurationData(contents), new NullLogService());42}4344function createConfigurationData(contents: any): IConfigurationInitData {45return {46defaults: new ConfigurationModel(contents, [], [], undefined, new NullLogService()),47policy: ConfigurationModel.createEmptyModel(new NullLogService()),48application: ConfigurationModel.createEmptyModel(new NullLogService()),49userLocal: new ConfigurationModel(contents, [], [], undefined, new NullLogService()),50userRemote: ConfigurationModel.createEmptyModel(new NullLogService()),51workspace: ConfigurationModel.createEmptyModel(new NullLogService()),52folders: [],53configurationScopes: []54};55}5657const store = ensureNoDisposablesAreLeakedInTestSuite();5859test('getConfiguration fails regression test 1.7.1 -> 1.8 #15552', function () {60const extHostConfig = createExtHostConfiguration({61'search': {62'exclude': {63'**/node_modules': true64}65}66});6768assert.strictEqual(extHostConfig.getConfiguration('search.exclude')['**/node_modules'], true);69assert.strictEqual(extHostConfig.getConfiguration('search.exclude').get('**/node_modules'), true);70assert.strictEqual(extHostConfig.getConfiguration('search').get<any>('exclude')['**/node_modules'], true);7172assert.strictEqual(extHostConfig.getConfiguration('search.exclude').has('**/node_modules'), true);73assert.strictEqual(extHostConfig.getConfiguration('search').has('exclude.**/node_modules'), true);74});7576test('has/get', () => {7778const all = createExtHostConfiguration({79'farboo': {80'config0': true,81'nested': {82'config1': 42,83'config2': 'Das Pferd frisst kein Reis.'84},85'config4': ''86}87});8889const config = all.getConfiguration('farboo');9091assert.ok(config.has('config0'));92assert.strictEqual(config.get('config0'), true);93assert.strictEqual(config.get('config4'), '');94assert.strictEqual(config['config0'], true);95assert.strictEqual(config['config4'], '');9697assert.ok(config.has('nested.config1'));98assert.strictEqual(config.get('nested.config1'), 42);99assert.ok(config.has('nested.config2'));100assert.strictEqual(config.get('nested.config2'), 'Das Pferd frisst kein Reis.');101102assert.ok(config.has('nested'));103assert.deepStrictEqual(config.get('nested'), { config1: 42, config2: 'Das Pferd frisst kein Reis.' });104});105106test('get nested config', () => {107108const all = createExtHostConfiguration({109'farboo': {110'config0': true,111'nested': {112'config1': 42,113'config2': 'Das Pferd frisst kein Reis.'114},115'config4': ''116}117});118119assert.deepStrictEqual(all.getConfiguration('farboo.nested').get('config1'), 42);120assert.deepStrictEqual(all.getConfiguration('farboo.nested').get('config2'), 'Das Pferd frisst kein Reis.');121assert.deepStrictEqual(all.getConfiguration('farboo.nested')['config1'], 42);122assert.deepStrictEqual(all.getConfiguration('farboo.nested')['config2'], 'Das Pferd frisst kein Reis.');123assert.deepStrictEqual(all.getConfiguration('farboo.nested1').get('config1'), undefined);124assert.deepStrictEqual(all.getConfiguration('farboo.nested1').get('config2'), undefined);125assert.deepStrictEqual(all.getConfiguration('farboo.config0.config1').get('a'), undefined);126assert.deepStrictEqual(all.getConfiguration('farboo.config0.config1')['a'], undefined);127});128129test('can modify the returned configuration', function () {130131const all = createExtHostConfiguration({132'farboo': {133'config0': true,134'nested': {135'config1': 42,136'config2': 'Das Pferd frisst kein Reis.'137},138'config4': ''139},140'workbench': {141'colorCustomizations': {142'statusBar.foreground': 'somevalue'143}144}145});146147let testObject = all.getConfiguration();148let actual = testObject.get<any>('farboo')!;149actual['nested']['config1'] = 41;150assert.strictEqual(41, actual['nested']['config1']);151actual['farboo1'] = 'newValue';152assert.strictEqual('newValue', actual['farboo1']);153154testObject = all.getConfiguration();155actual = testObject.get('farboo')!;156assert.strictEqual(actual['nested']['config1'], 42);157assert.strictEqual(actual['farboo1'], undefined);158159testObject = all.getConfiguration();160actual = testObject.get('farboo')!;161assert.strictEqual(actual['config0'], true);162actual['config0'] = false;163assert.strictEqual(actual['config0'], false);164165testObject = all.getConfiguration();166actual = testObject.get('farboo')!;167assert.strictEqual(actual['config0'], true);168169testObject = all.getConfiguration();170actual = testObject.inspect('farboo')!;171actual['value'] = 'effectiveValue';172assert.strictEqual('effectiveValue', actual['value']);173174testObject = all.getConfiguration('workbench');175actual = testObject.get('colorCustomizations')!;176actual['statusBar.foreground'] = undefined;177assert.strictEqual(actual['statusBar.foreground'], undefined);178testObject = all.getConfiguration('workbench');179actual = testObject.get('colorCustomizations')!;180assert.strictEqual(actual['statusBar.foreground'], 'somevalue');181});182183test('Stringify returned configuration', function () {184185const all = createExtHostConfiguration({186'farboo': {187'config0': true,188'nested': {189'config1': 42,190'config2': 'Das Pferd frisst kein Reis.'191},192'config4': ''193},194'workbench': {195'colorCustomizations': {196'statusBar.foreground': 'somevalue'197},198'emptyobjectkey': {199}200}201});202203const testObject = all.getConfiguration();204let actual: any = testObject.get('farboo');205assert.deepStrictEqual(JSON.stringify({206'config0': true,207'nested': {208'config1': 42,209'config2': 'Das Pferd frisst kein Reis.'210},211'config4': ''212}), JSON.stringify(actual));213214assert.deepStrictEqual(undefined, JSON.stringify(testObject.get('unknownkey')));215216actual = testObject.get('farboo')!;217actual['config0'] = false;218assert.deepStrictEqual(JSON.stringify({219'config0': false,220'nested': {221'config1': 42,222'config2': 'Das Pferd frisst kein Reis.'223},224'config4': ''225}), JSON.stringify(actual));226227actual = testObject.get<any>('workbench')!['colorCustomizations']!;228actual['statusBar.background'] = 'anothervalue';229assert.deepStrictEqual(JSON.stringify({230'statusBar.foreground': 'somevalue',231'statusBar.background': 'anothervalue'232}), JSON.stringify(actual));233234actual = testObject.get('workbench');235actual['unknownkey'] = 'somevalue';236assert.deepStrictEqual(JSON.stringify({237'colorCustomizations': {238'statusBar.foreground': 'somevalue'239},240'emptyobjectkey': {},241'unknownkey': 'somevalue'242}), JSON.stringify(actual));243244actual = all.getConfiguration('workbench').get('emptyobjectkey');245actual = {246...(actual || {}),247'statusBar.background': `#0ff`,248'statusBar.foreground': `#ff0`,249};250assert.deepStrictEqual(JSON.stringify({251'statusBar.background': `#0ff`,252'statusBar.foreground': `#ff0`,253}), JSON.stringify(actual));254255actual = all.getConfiguration('workbench').get('unknownkey');256actual = {257...(actual || {}),258'statusBar.background': `#0ff`,259'statusBar.foreground': `#ff0`,260};261assert.deepStrictEqual(JSON.stringify({262'statusBar.background': `#0ff`,263'statusBar.foreground': `#ff0`,264}), JSON.stringify(actual));265});266267test('cannot modify returned configuration', function () {268269const all = createExtHostConfiguration({270'farboo': {271'config0': true,272'nested': {273'config1': 42,274'config2': 'Das Pferd frisst kein Reis.'275},276'config4': ''277}278});279280const testObject: any = all.getConfiguration();281282try {283testObject['get'] = null;284assert.fail('This should be readonly');285} catch (e) {286}287288try {289testObject['farboo']['config0'] = false;290assert.fail('This should be readonly');291} catch (e) {292}293294try {295testObject['farboo']['farboo1'] = 'hello';296assert.fail('This should be readonly');297} catch (e) {298}299});300301test('inspect in no workspace context', function () {302const testObject = new ExtHostConfigProvider(303new class extends mock<MainThreadConfigurationShape>() { },304createExtHostWorkspace(),305{306defaults: new ConfigurationModel({307'editor': {308'wordWrap': 'off',309'lineNumbers': 'on',310'fontSize': '12px'311}312}, ['editor.wordWrap'], [], undefined, new NullLogService()),313policy: ConfigurationModel.createEmptyModel(new NullLogService()),314application: ConfigurationModel.createEmptyModel(new NullLogService()),315userLocal: new ConfigurationModel({316'editor': {317'wordWrap': 'on',318'lineNumbers': 'off'319}320}, ['editor.wordWrap', 'editor.lineNumbers'], [], undefined, new NullLogService()),321userRemote: new ConfigurationModel({322'editor': {323'lineNumbers': 'relative'324}325}, ['editor.lineNumbers'], [], {326'editor': {327'lineNumbers': 'relative',328'fontSize': '14px'329}330}, new NullLogService()),331workspace: new ConfigurationModel({}, [], [], undefined, new NullLogService()),332folders: [],333configurationScopes: []334},335new NullLogService()336);337338let actual: ConfigurationInspect<string> = testObject.getConfiguration().inspect('editor.wordWrap')!;339assert.strictEqual(actual.defaultValue, 'off');340assert.strictEqual(actual.globalLocalValue, 'on');341assert.strictEqual(actual.globalRemoteValue, undefined);342assert.strictEqual(actual.globalValue, 'on');343assert.strictEqual(actual.workspaceValue, undefined);344assert.strictEqual(actual.workspaceFolderValue, undefined);345346actual = testObject.getConfiguration('editor').inspect('wordWrap')!;347assert.strictEqual(actual.defaultValue, 'off');348assert.strictEqual(actual.globalLocalValue, 'on');349assert.strictEqual(actual.globalRemoteValue, undefined);350assert.strictEqual(actual.globalValue, 'on');351assert.strictEqual(actual.workspaceValue, undefined);352assert.strictEqual(actual.workspaceFolderValue, undefined);353354actual = testObject.getConfiguration('editor').inspect('lineNumbers')!;355assert.strictEqual(actual.defaultValue, 'on');356assert.strictEqual(actual.globalLocalValue, 'off');357assert.strictEqual(actual.globalRemoteValue, 'relative');358assert.strictEqual(actual.globalValue, 'relative');359assert.strictEqual(actual.workspaceValue, undefined);360assert.strictEqual(actual.workspaceFolderValue, undefined);361362assert.strictEqual(testObject.getConfiguration('editor').get('fontSize'), '12px');363364actual = testObject.getConfiguration('editor').inspect('fontSize')!;365assert.strictEqual(actual.defaultValue, '12px');366assert.strictEqual(actual.globalLocalValue, undefined);367assert.strictEqual(actual.globalRemoteValue, '14px');368assert.strictEqual(actual.globalValue, undefined);369assert.strictEqual(actual.workspaceValue, undefined);370assert.strictEqual(actual.workspaceFolderValue, undefined);371});372373test('inspect in single root context', function () {374const workspaceUri = URI.file('foo');375const folders: [UriComponents, IConfigurationModel][] = [];376const workspace = new ConfigurationModel({377'editor': {378'wordWrap': 'bounded'379}380}, ['editor.wordWrap'], [], undefined, new NullLogService());381folders.push([workspaceUri, workspace]);382const extHostWorkspace = createExtHostWorkspace();383extHostWorkspace.$initializeWorkspace({384'id': 'foo',385'folders': [aWorkspaceFolder(URI.file('foo'), 0)],386'name': 'foo'387}, true);388const testObject = new ExtHostConfigProvider(389new class extends mock<MainThreadConfigurationShape>() { },390extHostWorkspace,391{392defaults: new ConfigurationModel({393'editor': {394'wordWrap': 'off'395}396}, ['editor.wordWrap'], [], undefined, new NullLogService()),397policy: ConfigurationModel.createEmptyModel(new NullLogService()),398application: ConfigurationModel.createEmptyModel(new NullLogService()),399userLocal: new ConfigurationModel({400'editor': {401'wordWrap': 'on'402}403}, ['editor.wordWrap'], [], undefined, new NullLogService()),404userRemote: ConfigurationModel.createEmptyModel(new NullLogService()),405workspace,406folders,407configurationScopes: []408},409new NullLogService()410);411412let actual1: ConfigurationInspect<string> = testObject.getConfiguration().inspect('editor.wordWrap')!;413assert.strictEqual(actual1.defaultValue, 'off');414assert.strictEqual(actual1.globalLocalValue, 'on');415assert.strictEqual(actual1.globalRemoteValue, undefined);416assert.strictEqual(actual1.globalValue, 'on');417assert.strictEqual(actual1.workspaceValue, 'bounded');418assert.strictEqual(actual1.workspaceFolderValue, undefined);419420actual1 = testObject.getConfiguration('editor').inspect('wordWrap')!;421assert.strictEqual(actual1.defaultValue, 'off');422assert.strictEqual(actual1.globalLocalValue, 'on');423assert.strictEqual(actual1.globalRemoteValue, undefined);424assert.strictEqual(actual1.globalValue, 'on');425assert.strictEqual(actual1.workspaceValue, 'bounded');426assert.strictEqual(actual1.workspaceFolderValue, undefined);427428let actual2: ConfigurationInspect<string> = testObject.getConfiguration(undefined, workspaceUri).inspect('editor.wordWrap')!;429assert.strictEqual(actual2.defaultValue, 'off');430assert.strictEqual(actual2.globalLocalValue, 'on');431assert.strictEqual(actual2.globalRemoteValue, undefined);432assert.strictEqual(actual2.globalValue, 'on');433assert.strictEqual(actual2.workspaceValue, 'bounded');434assert.strictEqual(actual2.workspaceFolderValue, 'bounded');435436actual2 = testObject.getConfiguration('editor', workspaceUri).inspect('wordWrap')!;437assert.strictEqual(actual2.defaultValue, 'off');438assert.strictEqual(actual2.globalLocalValue, 'on');439assert.strictEqual(actual2.globalRemoteValue, undefined);440assert.strictEqual(actual2.globalValue, 'on');441assert.strictEqual(actual2.workspaceValue, 'bounded');442assert.strictEqual(actual2.workspaceFolderValue, 'bounded');443});444445test('inspect in multi root context', function () {446const workspace = new ConfigurationModel({447'editor': {448'wordWrap': 'bounded'449}450}, ['editor.wordWrap'], [], undefined, new NullLogService());451452const firstRoot = URI.file('foo1');453const secondRoot = URI.file('foo2');454const thirdRoot = URI.file('foo3');455const folders: [UriComponents, IConfigurationModel][] = [];456folders.push([firstRoot, new ConfigurationModel({457'editor': {458'wordWrap': 'off',459'lineNumbers': 'relative'460}461}, ['editor.wordWrap'], [], undefined, new NullLogService())]);462folders.push([secondRoot, new ConfigurationModel({463'editor': {464'wordWrap': 'on'465}466}, ['editor.wordWrap'], [], undefined, new NullLogService())]);467folders.push([thirdRoot, new ConfigurationModel({}, [], [], undefined, new NullLogService())]);468469const extHostWorkspace = createExtHostWorkspace();470extHostWorkspace.$initializeWorkspace({471'id': 'foo',472'folders': [aWorkspaceFolder(firstRoot, 0), aWorkspaceFolder(secondRoot, 1)],473'name': 'foo'474}, true);475const testObject = new ExtHostConfigProvider(476new class extends mock<MainThreadConfigurationShape>() { },477extHostWorkspace,478{479defaults: new ConfigurationModel({480'editor': {481'wordWrap': 'off',482'lineNumbers': 'on'483}484}, ['editor.wordWrap'], [], undefined, new NullLogService()),485policy: ConfigurationModel.createEmptyModel(new NullLogService()),486application: ConfigurationModel.createEmptyModel(new NullLogService()),487userLocal: new ConfigurationModel({488'editor': {489'wordWrap': 'on'490}491}, ['editor.wordWrap'], [], undefined, new NullLogService()),492userRemote: ConfigurationModel.createEmptyModel(new NullLogService()),493workspace,494folders,495configurationScopes: []496},497new NullLogService()498);499500let actual1: ConfigurationInspect<string> = testObject.getConfiguration().inspect('editor.wordWrap')!;501assert.strictEqual(actual1.defaultValue, 'off');502assert.strictEqual(actual1.globalValue, 'on');503assert.strictEqual(actual1.globalLocalValue, 'on');504assert.strictEqual(actual1.globalRemoteValue, undefined);505assert.strictEqual(actual1.workspaceValue, 'bounded');506assert.strictEqual(actual1.workspaceFolderValue, undefined);507508actual1 = testObject.getConfiguration('editor').inspect('wordWrap')!;509assert.strictEqual(actual1.defaultValue, 'off');510assert.strictEqual(actual1.globalValue, 'on');511assert.strictEqual(actual1.globalLocalValue, 'on');512assert.strictEqual(actual1.globalRemoteValue, undefined);513assert.strictEqual(actual1.workspaceValue, 'bounded');514assert.strictEqual(actual1.workspaceFolderValue, undefined);515516actual1 = testObject.getConfiguration('editor').inspect('lineNumbers')!;517assert.strictEqual(actual1.defaultValue, 'on');518assert.strictEqual(actual1.globalValue, undefined);519assert.strictEqual(actual1.globalLocalValue, undefined);520assert.strictEqual(actual1.globalRemoteValue, undefined);521assert.strictEqual(actual1.workspaceValue, undefined);522assert.strictEqual(actual1.workspaceFolderValue, undefined);523524let actual2: ConfigurationInspect<string> = testObject.getConfiguration(undefined, firstRoot).inspect('editor.wordWrap')!;525assert.strictEqual(actual2.defaultValue, 'off');526assert.strictEqual(actual2.globalValue, 'on');527assert.strictEqual(actual2.globalLocalValue, 'on');528assert.strictEqual(actual2.globalRemoteValue, undefined);529assert.strictEqual(actual2.workspaceValue, 'bounded');530assert.strictEqual(actual2.workspaceFolderValue, 'off');531532actual2 = testObject.getConfiguration('editor', firstRoot).inspect('wordWrap')!;533assert.strictEqual(actual2.defaultValue, 'off');534assert.strictEqual(actual2.globalValue, 'on');535assert.strictEqual(actual2.globalLocalValue, 'on');536assert.strictEqual(actual2.globalRemoteValue, undefined);537assert.strictEqual(actual2.workspaceValue, 'bounded');538assert.strictEqual(actual2.workspaceFolderValue, 'off');539540actual2 = testObject.getConfiguration('editor', firstRoot).inspect('lineNumbers')!;541assert.strictEqual(actual2.defaultValue, 'on');542assert.strictEqual(actual2.globalValue, undefined);543assert.strictEqual(actual2.globalLocalValue, undefined);544assert.strictEqual(actual2.globalRemoteValue, undefined);545assert.strictEqual(actual2.workspaceValue, undefined);546assert.strictEqual(actual2.workspaceFolderValue, 'relative');547548actual2 = testObject.getConfiguration(undefined, secondRoot).inspect('editor.wordWrap')!;549assert.strictEqual(actual2.defaultValue, 'off');550assert.strictEqual(actual2.globalValue, 'on');551assert.strictEqual(actual2.globalLocalValue, 'on');552assert.strictEqual(actual2.globalRemoteValue, undefined);553assert.strictEqual(actual2.workspaceValue, 'bounded');554assert.strictEqual(actual2.workspaceFolderValue, 'on');555556actual2 = testObject.getConfiguration('editor', secondRoot).inspect('wordWrap')!;557assert.strictEqual(actual2.defaultValue, 'off');558assert.strictEqual(actual2.globalValue, 'on');559assert.strictEqual(actual2.globalLocalValue, 'on');560assert.strictEqual(actual2.globalRemoteValue, undefined);561assert.strictEqual(actual2.workspaceValue, 'bounded');562assert.strictEqual(actual2.workspaceFolderValue, 'on');563564actual2 = testObject.getConfiguration(undefined, thirdRoot).inspect('editor.wordWrap')!;565assert.strictEqual(actual2.defaultValue, 'off');566assert.strictEqual(actual2.globalValue, 'on');567assert.strictEqual(actual2.globalLocalValue, 'on');568assert.strictEqual(actual2.globalRemoteValue, undefined);569assert.strictEqual(actual2.workspaceValue, 'bounded');570assert.ok(Object.keys(actual2).indexOf('workspaceFolderValue') !== -1);571assert.strictEqual(actual2.workspaceFolderValue, undefined);572573actual2 = testObject.getConfiguration('editor', thirdRoot).inspect('wordWrap')!;574assert.strictEqual(actual2.defaultValue, 'off');575assert.strictEqual(actual2.globalValue, 'on');576assert.strictEqual(actual2.globalLocalValue, 'on');577assert.strictEqual(actual2.globalRemoteValue, undefined);578assert.strictEqual(actual2.workspaceValue, 'bounded');579assert.ok(Object.keys(actual2).indexOf('workspaceFolderValue') !== -1);580assert.strictEqual(actual2.workspaceFolderValue, undefined);581});582583test('inspect with language overrides', function () {584const firstRoot = URI.file('foo1');585const secondRoot = URI.file('foo2');586const folders: [UriComponents, IConfigurationModel][] = [];587folders.push([firstRoot, toConfigurationModel({588'editor.wordWrap': 'bounded',589'[typescript]': {590'editor.wordWrap': 'unbounded',591}592})]);593folders.push([secondRoot, toConfigurationModel({})]);594595const extHostWorkspace = createExtHostWorkspace();596extHostWorkspace.$initializeWorkspace({597'id': 'foo',598'folders': [aWorkspaceFolder(firstRoot, 0), aWorkspaceFolder(secondRoot, 1)],599'name': 'foo'600}, true);601const testObject = new ExtHostConfigProvider(602new class extends mock<MainThreadConfigurationShape>() { },603extHostWorkspace,604{605defaults: toConfigurationModel({606'editor.wordWrap': 'off',607'[markdown]': {608'editor.wordWrap': 'bounded',609}610}),611policy: ConfigurationModel.createEmptyModel(new NullLogService()),612application: ConfigurationModel.createEmptyModel(new NullLogService()),613userLocal: toConfigurationModel({614'editor.wordWrap': 'bounded',615'[typescript]': {616'editor.lineNumbers': 'off',617}618}),619userRemote: ConfigurationModel.createEmptyModel(new NullLogService()),620workspace: toConfigurationModel({621'[typescript]': {622'editor.wordWrap': 'unbounded',623'editor.lineNumbers': 'off',624}625}),626folders,627configurationScopes: []628},629new NullLogService()630);631632let actual: ConfigurationInspect<string> = testObject.getConfiguration(undefined, { uri: firstRoot, languageId: 'typescript' }).inspect('editor.wordWrap')!;633assert.strictEqual(actual.defaultValue, 'off');634assert.strictEqual(actual.globalValue, 'bounded');635assert.strictEqual(actual.globalLocalValue, 'bounded');636assert.strictEqual(actual.globalRemoteValue, undefined);637assert.strictEqual(actual.workspaceValue, undefined);638assert.strictEqual(actual.workspaceFolderValue, 'bounded');639assert.strictEqual(actual.defaultLanguageValue, undefined);640assert.strictEqual(actual.globalLanguageValue, undefined);641assert.strictEqual(actual.workspaceLanguageValue, 'unbounded');642assert.strictEqual(actual.workspaceFolderLanguageValue, 'unbounded');643assert.deepStrictEqual(actual.languageIds, ['markdown', 'typescript']);644645actual = testObject.getConfiguration(undefined, { uri: secondRoot, languageId: 'typescript' }).inspect('editor.wordWrap')!;646assert.strictEqual(actual.defaultValue, 'off');647assert.strictEqual(actual.globalValue, 'bounded');648assert.strictEqual(actual.globalLocalValue, 'bounded');649assert.strictEqual(actual.globalRemoteValue, undefined);650assert.strictEqual(actual.workspaceValue, undefined);651assert.strictEqual(actual.workspaceFolderValue, undefined);652assert.strictEqual(actual.defaultLanguageValue, undefined);653assert.strictEqual(actual.globalLanguageValue, undefined);654assert.strictEqual(actual.workspaceLanguageValue, 'unbounded');655assert.strictEqual(actual.workspaceFolderLanguageValue, undefined);656assert.deepStrictEqual(actual.languageIds, ['markdown', 'typescript']);657});658659test('application is not set in inspect', () => {660661const testObject = new ExtHostConfigProvider(662new class extends mock<MainThreadConfigurationShape>() { },663createExtHostWorkspace(),664{665defaults: new ConfigurationModel({666'editor': {667'wordWrap': 'off',668'lineNumbers': 'on',669'fontSize': '12px'670}671}, ['editor.wordWrap'], [], undefined, new NullLogService()),672policy: ConfigurationModel.createEmptyModel(new NullLogService()),673application: new ConfigurationModel({674'editor': {675'wordWrap': 'on'676}677}, ['editor.wordWrap'], [], undefined, new NullLogService()),678userLocal: new ConfigurationModel({679'editor': {680'wordWrap': 'auto',681'lineNumbers': 'off'682}683}, ['editor.wordWrap'], [], undefined, new NullLogService()),684userRemote: ConfigurationModel.createEmptyModel(new NullLogService()),685workspace: new ConfigurationModel({}, [], [], undefined, new NullLogService()),686folders: [],687configurationScopes: []688},689new NullLogService()690);691692let actual: ConfigurationInspect<string> = testObject.getConfiguration().inspect('editor.wordWrap')!;693assert.strictEqual(actual.defaultValue, 'off');694assert.strictEqual(actual.globalValue, 'auto');695assert.strictEqual(actual.globalLocalValue, 'auto');696assert.strictEqual(actual.globalRemoteValue, undefined);697assert.strictEqual(actual.workspaceValue, undefined);698assert.strictEqual(actual.workspaceFolderValue, undefined);699assert.strictEqual(testObject.getConfiguration().get('editor.wordWrap'), 'auto');700701actual = testObject.getConfiguration().inspect('editor.lineNumbers')!;702assert.strictEqual(actual.defaultValue, 'on');703assert.strictEqual(actual.globalValue, 'off');704assert.strictEqual(actual.globalLocalValue, 'off');705assert.strictEqual(actual.globalRemoteValue, undefined);706assert.strictEqual(actual.workspaceValue, undefined);707assert.strictEqual(actual.workspaceFolderValue, undefined);708assert.strictEqual(testObject.getConfiguration().get('editor.lineNumbers'), 'off');709710actual = testObject.getConfiguration().inspect('editor.fontSize')!;711assert.strictEqual(actual.defaultValue, '12px');712assert.strictEqual(actual.globalLocalValue, undefined);713assert.strictEqual(actual.globalRemoteValue, undefined);714assert.strictEqual(actual.globalValue, undefined);715assert.strictEqual(actual.workspaceValue, undefined);716assert.strictEqual(actual.workspaceFolderValue, undefined);717assert.strictEqual(testObject.getConfiguration().get('editor.fontSize'), '12px');718});719720test('getConfiguration vs get', function () {721722const all = createExtHostConfiguration({723'farboo': {724'config0': true,725'config4': 38726}727});728729let config = all.getConfiguration('farboo.config0');730assert.strictEqual(config.get(''), undefined);731assert.strictEqual(config.has(''), false);732733config = all.getConfiguration('farboo');734assert.strictEqual(config.get('config0'), true);735assert.strictEqual(config.has('config0'), true);736});737738test('name vs property', function () {739const all = createExtHostConfiguration({740'farboo': {741'get': 'get-prop'742}743});744const config = all.getConfiguration('farboo');745746assert.ok(config.has('get'));747assert.strictEqual(config.get('get'), 'get-prop');748assert.deepStrictEqual(config['get'], config.get);749assert.throws(() => config['get'] = <any>'get-prop');750});751752test('update: no target passes null', function () {753const shape = new RecordingShape();754const allConfig = createExtHostConfiguration({755'foo': {756'bar': 1,757'far': 1758}759}, shape);760761const config = allConfig.getConfiguration('foo');762config.update('bar', 42);763764assert.strictEqual(shape.lastArgs[0], null);765});766767test('update/section to key', function () {768769const shape = new RecordingShape();770const allConfig = createExtHostConfiguration({771'foo': {772'bar': 1,773'far': 1774}775}, shape);776777let config = allConfig.getConfiguration('foo');778config.update('bar', 42, true);779780assert.strictEqual(shape.lastArgs[0], ConfigurationTarget.USER);781assert.strictEqual(shape.lastArgs[1], 'foo.bar');782assert.strictEqual(shape.lastArgs[2], 42);783784config = allConfig.getConfiguration('');785config.update('bar', 42, true);786assert.strictEqual(shape.lastArgs[1], 'bar');787788config.update('foo.bar', 42, true);789assert.strictEqual(shape.lastArgs[1], 'foo.bar');790});791792test('update, what is #15834', function () {793const shape = new RecordingShape();794const allConfig = createExtHostConfiguration({795'editor': {796'formatOnSave': true797}798}, shape);799800allConfig.getConfiguration('editor').update('formatOnSave', { extensions: ['ts'] });801assert.strictEqual(shape.lastArgs[1], 'editor.formatOnSave');802assert.deepStrictEqual(shape.lastArgs[2], { extensions: ['ts'] });803});804805test('update/error-state not OK', function () {806807const shape = new class extends mock<MainThreadConfigurationShape>() {808override $updateConfigurationOption(target: ConfigurationTarget, key: string, value: any): Promise<any> {809return Promise.reject(new Error('Unknown Key')); // something !== OK810}811};812813return createExtHostConfiguration({}, shape)814.getConfiguration('')815.update('', true, false)816.then(() => assert.ok(false), err => { /* expecting rejection */ });817});818819test('configuration change event', (done) => {820821const workspaceFolder = aWorkspaceFolder(URI.file('folder1'), 0);822const extHostWorkspace = createExtHostWorkspace();823extHostWorkspace.$initializeWorkspace({824'id': 'foo',825'folders': [workspaceFolder],826'name': 'foo'827}, true);828const testObject = new ExtHostConfigProvider(829new class extends mock<MainThreadConfigurationShape>() { },830extHostWorkspace,831createConfigurationData({832'farboo': {833'config': false,834'updatedConfig': false835}836}),837new NullLogService()838);839840const newConfigData = createConfigurationData({841'farboo': {842'config': false,843'updatedConfig': true,844'newConfig': true,845}846});847const configEventData: IConfigurationChange = { keys: ['farboo.updatedConfig', 'farboo.newConfig'], overrides: [] };848store.add(testObject.onDidChangeConfiguration(e => {849850assert.deepStrictEqual(testObject.getConfiguration().get('farboo'), {851'config': false,852'updatedConfig': true,853'newConfig': true,854});855856assert.ok(e.affectsConfiguration('farboo'));857assert.ok(e.affectsConfiguration('farboo', workspaceFolder.uri));858assert.ok(e.affectsConfiguration('farboo', URI.file('any')));859860assert.ok(e.affectsConfiguration('farboo.updatedConfig'));861assert.ok(e.affectsConfiguration('farboo.updatedConfig', workspaceFolder.uri));862assert.ok(e.affectsConfiguration('farboo.updatedConfig', URI.file('any')));863864assert.ok(e.affectsConfiguration('farboo.newConfig'));865assert.ok(e.affectsConfiguration('farboo.newConfig', workspaceFolder.uri));866assert.ok(e.affectsConfiguration('farboo.newConfig', URI.file('any')));867868assert.ok(!e.affectsConfiguration('farboo.config'));869assert.ok(!e.affectsConfiguration('farboo.config', workspaceFolder.uri));870assert.ok(!e.affectsConfiguration('farboo.config', URI.file('any')));871done();872}));873874testObject.$acceptConfigurationChanged(newConfigData, configEventData);875});876877test('get return instance of array value', function () {878const testObject = createExtHostConfiguration({ 'far': { 'boo': [] } });879880const value: string[] = testObject.getConfiguration().get('far.boo', []);881value.push('a');882883const actual = testObject.getConfiguration().get('far.boo', []);884assert.deepStrictEqual(actual, []);885});886887function aWorkspaceFolder(uri: URI, index: number, name: string = ''): IWorkspaceFolder {888return new WorkspaceFolder({ uri, name, index });889}890891function toConfigurationModel(obj: any): ConfigurationModel {892const parser = new ConfigurationModelParser('test', new NullLogService());893parser.parse(JSON.stringify(obj));894return parser.configurationModel;895}896897});898899900