Skip to content

Commit b139e34

Browse files
committed
- Let workspace configuration service fire change event during reload configuration and if configuration changes - Tests
1 parent f042999 commit b139e34

2 files changed

Lines changed: 79 additions & 0 deletions

File tree

src/vs/workbench/services/configuration/node/configurationService.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,16 @@ export class WorkspaceConfigurationService extends Disposable implements IWorksp
167167

168168
// Load configuration
169169
return this.baseConfigurationService.reloadConfiguration().then(() => {
170+
const current = this.cachedConfig;
170171
return this.doLoadConfiguration().then(configuration => {
172+
// emit this as update to listeners if changed
173+
if (!objects.equals(current, this.cachedConfig)) {
174+
this._onDidUpdateConfiguration.fire({
175+
config: configuration.consolidated,
176+
source: ConfigurationSource.Workspace,
177+
sourceConfig: configuration.workspace
178+
});
179+
}
171180
return section ? configuration.consolidated[section] : configuration.consolidated;
172181
});
173182
});

src/vs/workbench/services/configuration/test/node/configurationService.test.ts

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import assert = require('assert');
99
import os = require('os');
1010
import path = require('path');
1111
import fs = require('fs');
12+
import * as sinon from 'sinon';
1213
import { TPromise } from 'vs/base/common/winjs.base';
1314
import { Registry } from 'vs/platform/platform';
1415
import { ParsedArgs } from 'vs/platform/environment/common/environment';
@@ -227,6 +228,75 @@ suite('WorkspaceConfigurationService - Node', () => {
227228
});
228229
});
229230

231+
test('workspace reload should triggers event if content changed', (done: () => void) => {
232+
createWorkspace((workspaceDir, globalSettingsFile, cleanUp) => {
233+
const workspaceContextService = new WorkspaceContextService({ resource: URI.file(workspaceDir) });
234+
const environmentService = new SettingsTestEnvironmentService(parseArgs(process.argv), process.execPath, globalSettingsFile);
235+
const service = new WorkspaceConfigurationService(workspaceContextService, environmentService);
236+
237+
return service.initialize().then(() => {
238+
const settingsFile = path.join(workspaceDir, '.vscode', 'settings.json');
239+
fs.writeFileSync(settingsFile, '{ "testworkbench.editor.icons": true }');
240+
241+
const target = sinon.stub();
242+
service.onDidUpdateConfiguration(event => target());
243+
244+
fs.writeFileSync(settingsFile, '{ "testworkbench.editor.icons": false }');
245+
246+
service.reloadConfiguration().done(() => {
247+
assert.ok(target.calledOnce);
248+
service.dispose();
249+
250+
cleanUp(done);
251+
});
252+
});
253+
});
254+
});
255+
256+
test('workspace reload should not trigger event if nothing changed', (done: () => void) => {
257+
createWorkspace((workspaceDir, globalSettingsFile, cleanUp) => {
258+
const workspaceContextService = new WorkspaceContextService({ resource: URI.file(workspaceDir) });
259+
const environmentService = new SettingsTestEnvironmentService(parseArgs(process.argv), process.execPath, globalSettingsFile);
260+
const service = new WorkspaceConfigurationService(workspaceContextService, environmentService);
261+
262+
return service.initialize().then(() => {
263+
const settingsFile = path.join(workspaceDir, '.vscode', 'settings.json');
264+
fs.writeFileSync(settingsFile, '{ "testworkbench.editor.icons": true }');
265+
266+
service.reloadConfiguration().done(() => {
267+
const target = sinon.stub();
268+
service.onDidUpdateConfiguration(event => target());
269+
270+
service.reloadConfiguration().done(() => {
271+
assert.ok(!target.called);
272+
service.dispose();
273+
274+
cleanUp(done);
275+
});
276+
});
277+
});
278+
});
279+
});
280+
281+
test('workspace reload should not trigger event if there is no model', (done: () => void) => {
282+
createWorkspace((workspaceDir, globalSettingsFile, cleanUp) => {
283+
const workspaceContextService = new WorkspaceContextService({ resource: URI.file(workspaceDir) });
284+
const environmentService = new SettingsTestEnvironmentService(parseArgs(process.argv), process.execPath, globalSettingsFile);
285+
const service = new WorkspaceConfigurationService(workspaceContextService, environmentService);
286+
287+
return service.initialize().then(() => {
288+
const target = sinon.stub();
289+
service.onDidUpdateConfiguration(event => target());
290+
service.reloadConfiguration().done(() => {
291+
assert.ok(!target.called);
292+
service.dispose();
293+
cleanUp(done);
294+
});
295+
});
296+
});
297+
});
298+
299+
230300
test('lookup', (done: () => void) => {
231301
const configurationRegistry = <IConfigurationRegistry>Registry.as(ConfigurationExtensions.Configuration);
232302
configurationRegistry.registerConfiguration({

0 commit comments

Comments
 (0)