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
3296 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
settingRenderer = new SimpleSettingRenderer(configurationService, contextMenuService, preferencesService, { publicLog2: () => { } } as any, { writeText: async () => { } } as any);
73
});
74
75
suiteTeardown(() => {
76
Registry.as<IConfigurationRegistry>(Extensions.Configuration).deregisterConfigurations([configuration]);
77
});
78
79
test('render code setting button with value', () => {
80
const htmlRenderer = settingRenderer.getHtmlRenderer();
81
const htmlNoValue = '<a href="code-oss://settings/example.booleanSetting" codesetting="true">';
82
const renderedHtmlNoValue = htmlRenderer({ block: false, raw: htmlNoValue, pre: false, text: '', type: 'html' });
83
assert.strictEqual(renderedHtmlNoValue,
84
`<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>
85
<span class="separator"></span>
86
<span class="setting-name">example.booleanSetting</span>
87
</a></code>`);
88
});
89
90
test('actions with no value', () => {
91
const uri = URI.parse(settingRenderer.settingToUriString('example.booleanSetting'));
92
const actions = settingRenderer.getActions(uri);
93
assert.strictEqual(actions?.length, 2);
94
assert.strictEqual(actions[0].label, 'View "Example: Boolean Setting" in Settings');
95
});
96
97
test('actions with value + updating and restoring', async () => {
98
await configurationService.setUserConfiguration('example', { stringSetting: 'two' });
99
const uri = URI.parse(settingRenderer.settingToUriString('example.stringSetting', 'three'));
100
101
const verifyOriginalState = (actions: IAction[] | undefined): actions is IAction[] => {
102
assert.strictEqual(actions?.length, 3);
103
assert.strictEqual(actions[0].label, 'Set "Example: String Setting" to "three"');
104
assert.strictEqual(actions[1].label, 'View in Settings');
105
assert.strictEqual(configurationService.getValue('example.stringSetting'), 'two');
106
return true;
107
};
108
109
const actions = settingRenderer.getActions(uri);
110
if (verifyOriginalState(actions)) {
111
// Update the value
112
await actions[0].run();
113
assert.strictEqual(configurationService.getValue('example.stringSetting'), 'three');
114
const actionsUpdated = settingRenderer.getActions(uri);
115
assert.strictEqual(actionsUpdated?.length, 3);
116
assert.strictEqual(actionsUpdated[0].label, 'Restore value of "Example: String Setting"');
117
assert.strictEqual(actions[1].label, 'View in Settings');
118
assert.strictEqual(actions[2].label, 'Copy Setting ID');
119
assert.strictEqual(configurationService.getValue('example.stringSetting'), 'three');
120
121
// Restore the value
122
await actionsUpdated[0].run();
123
verifyOriginalState(settingRenderer.getActions(uri));
124
}
125
});
126
});
127
128