Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/workbench/contrib/markdown/test/browser/markdownSettingRenderer.test.ts
5272 views
1
/*---------------------------------------------------------------------------------------------
2
* Copyright (c) Microsoft Corporation. All rights reserved.
3
* Licensed under the MIT License. See License.txt in the project root for license information.
4
*--------------------------------------------------------------------------------------------*/
5
import assert from 'assert';
6
import { IAction } from '../../../../../base/common/actions.js';
7
import { URI } from '../../../../../base/common/uri.js';
8
import { ensureNoDisposablesAreLeakedInTestSuite } from '../../../../../base/test/common/utils.js';
9
import { ConfigurationScope, Extensions, IConfigurationNode, IConfigurationRegistry } from '../../../../../platform/configuration/common/configurationRegistry.js';
10
import { TestConfigurationService } from '../../../../../platform/configuration/test/common/testConfigurationService.js';
11
import { IContextMenuService } from '../../../../../platform/contextview/browser/contextView.js';
12
import { Registry } from '../../../../../platform/registry/common/platform.js';
13
import { SimpleSettingRenderer } from '../../browser/markdownSettingRenderer.js';
14
import { IPreferencesService } from '../../../../services/preferences/common/preferences.js';
15
16
const configuration: IConfigurationNode = {
17
'id': 'examples',
18
'title': 'Examples',
19
'type': 'object',
20
'properties': {
21
'example.booleanSetting': {
22
'type': 'boolean',
23
'default': false,
24
'scope': ConfigurationScope.APPLICATION
25
},
26
'example.booleanSetting2': {
27
'type': 'boolean',
28
'default': true,
29
'scope': ConfigurationScope.APPLICATION
30
},
31
'example.stringSetting': {
32
'type': 'string',
33
'default': 'one',
34
'scope': ConfigurationScope.APPLICATION
35
},
36
'example.numberSetting': {
37
'type': 'number',
38
'default': 3,
39
'scope': ConfigurationScope.APPLICATION
40
}
41
}
42
};
43
44
class MarkdownConfigurationService extends TestConfigurationService {
45
override async updateValue(key: string, value: any): Promise<void> {
46
const [section, setting] = key.split('.');
47
return this.setUserConfiguration(section, { [setting]: value });
48
}
49
}
50
51
suite('Markdown Setting Renderer Test', () => {
52
ensureNoDisposablesAreLeakedInTestSuite();
53
54
let configurationService: TestConfigurationService;
55
let preferencesService: IPreferencesService;
56
let contextMenuService: IContextMenuService;
57
let settingRenderer: SimpleSettingRenderer;
58
59
suiteSetup(() => {
60
configurationService = new MarkdownConfigurationService();
61
preferencesService = <IPreferencesService>{
62
getSetting: (setting) => {
63
let type = 'boolean';
64
if (setting.includes('string')) {
65
type = 'string';
66
}
67
return { type, key: setting };
68
}
69
};
70
contextMenuService = <IContextMenuService>{};
71
Registry.as<IConfigurationRegistry>(Extensions.Configuration).registerConfiguration(configuration);
72
// eslint-disable-next-line local/code-no-any-casts
73
settingRenderer = new SimpleSettingRenderer(configurationService, contextMenuService, preferencesService, { publicLog2: () => { } } as any, { writeText: async () => { } } as any);
74
});
75
76
suiteTeardown(() => {
77
Registry.as<IConfigurationRegistry>(Extensions.Configuration).deregisterConfigurations([configuration]);
78
});
79
80
test('render code setting button with value', () => {
81
const htmlRenderer = settingRenderer.getHtmlRenderer();
82
const htmlNoValue = '<a href="code-oss://settings/example.booleanSetting" codesetting="true">';
83
const renderedHtmlNoValue = htmlRenderer({ block: false, raw: htmlNoValue, pre: false, text: '', type: 'html' });
84
assert.strictEqual(renderedHtmlNoValue,
85
`<code tabindex="0"><a href="code-setting://example.booleanSetting/true" class="codesetting" title="View or change setting" aria-role="button"><svg width="14" height="14" viewBox="0 0 15 15" xmlns="http://www.w3.org/2000/svg" fill="currentColor"><path d="M9.1 4.4L8.6 2H7.4l-.5 2.4-.7.3-2-1.3-.9.8 1.3 2-.2.7-2.4.5v1.2l2.4.5.3.8-1.3 2 .8.8 2-1.3.8.3.4 2.3h1.2l.5-2.4.8-.3 2 1.3.8-.8-1.3-2 .3-.8 2.3-.4V7.4l-2.4-.5-.3-.8 1.3-2-.8-.8-2 1.3-.7-.2zM9.4 1l.5 2.4L12 2.1l2 2-1.4 2.1 2.4.4v2.8l-2.4.5L14 12l-2 2-2.1-1.4-.5 2.4H6.6l-.5-2.4L4 13.9l-2-2 1.4-2.1L1 9.4V6.6l2.4-.5L2.1 4l2-2 2.1 1.4.4-2.4h2.8zm.6 7c0 1.1-.9 2-2 2s-2-.9-2-2 .9-2 2-2 2 .9 2 2zM8 9c.6 0 1-.4 1-1s-.4-1-1-1-1 .4-1 1 .4 1 1 1z"/></svg>
86
<span class="separator"></span>
87
<span class="setting-name">example.booleanSetting</span>
88
</a></code>`);
89
});
90
91
test('actions with no value', () => {
92
const uri = URI.parse(settingRenderer.settingToUriString('example.booleanSetting'));
93
const actions = settingRenderer.getActions(uri);
94
assert.strictEqual(actions?.length, 2);
95
assert.strictEqual(actions[0].label, 'View "Example: Boolean Setting" in Settings');
96
});
97
98
test('actions with value + updating and restoring', async () => {
99
await configurationService.setUserConfiguration('example', { stringSetting: 'two' });
100
const uri = URI.parse(settingRenderer.settingToUriString('example.stringSetting', 'three'));
101
102
const verifyOriginalState = (actions: IAction[] | undefined): actions is IAction[] => {
103
assert.strictEqual(actions?.length, 3);
104
assert.strictEqual(actions[0].label, 'Set "Example: String Setting" to "three"');
105
assert.strictEqual(actions[1].label, 'View in Settings');
106
assert.strictEqual(configurationService.getValue('example.stringSetting'), 'two');
107
return true;
108
};
109
110
const actions = settingRenderer.getActions(uri);
111
if (verifyOriginalState(actions)) {
112
// Update the value
113
await actions[0].run();
114
assert.strictEqual(configurationService.getValue('example.stringSetting'), 'three');
115
const actionsUpdated = settingRenderer.getActions(uri);
116
assert.strictEqual(actionsUpdated?.length, 3);
117
assert.strictEqual(actionsUpdated[0].label, 'Restore value of "Example: String Setting"');
118
assert.strictEqual(actions[1].label, 'View in Settings');
119
assert.strictEqual(actions[2].label, 'Copy Setting ID');
120
assert.strictEqual(configurationService.getValue('example.stringSetting'), 'three');
121
122
// Restore the value
123
await actionsUpdated[0].run();
124
verifyOriginalState(settingRenderer.getActions(uri));
125
}
126
});
127
});
128
129