Path: blob/main/src/vs/workbench/contrib/markdown/test/browser/markdownSettingRenderer.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*--------------------------------------------------------------------------------------------*/4import assert from 'assert';5import { IAction } from '../../../../../base/common/actions.js';6import { URI } from '../../../../../base/common/uri.js';7import { ensureNoDisposablesAreLeakedInTestSuite } from '../../../../../base/test/common/utils.js';8import { ConfigurationScope, Extensions, IConfigurationNode, IConfigurationRegistry } from '../../../../../platform/configuration/common/configurationRegistry.js';9import { TestConfigurationService } from '../../../../../platform/configuration/test/common/testConfigurationService.js';10import { IContextMenuService } from '../../../../../platform/contextview/browser/contextView.js';11import { Registry } from '../../../../../platform/registry/common/platform.js';12import { SimpleSettingRenderer } from '../../browser/markdownSettingRenderer.js';13import { IPreferencesService } from '../../../../services/preferences/common/preferences.js';1415const configuration: IConfigurationNode = {16'id': 'examples',17'title': 'Examples',18'type': 'object',19'properties': {20'example.booleanSetting': {21'type': 'boolean',22'default': false,23'scope': ConfigurationScope.APPLICATION24},25'example.booleanSetting2': {26'type': 'boolean',27'default': true,28'scope': ConfigurationScope.APPLICATION29},30'example.stringSetting': {31'type': 'string',32'default': 'one',33'scope': ConfigurationScope.APPLICATION34},35'example.numberSetting': {36'type': 'number',37'default': 3,38'scope': ConfigurationScope.APPLICATION39}40}41};4243class MarkdownConfigurationService extends TestConfigurationService {44override async updateValue(key: string, value: any): Promise<void> {45const [section, setting] = key.split('.');46return this.setUserConfiguration(section, { [setting]: value });47}48}4950suite('Markdown Setting Renderer Test', () => {51ensureNoDisposablesAreLeakedInTestSuite();5253let configurationService: TestConfigurationService;54let preferencesService: IPreferencesService;55let contextMenuService: IContextMenuService;56let settingRenderer: SimpleSettingRenderer;5758suiteSetup(() => {59configurationService = new MarkdownConfigurationService();60preferencesService = <IPreferencesService>{61getSetting: (setting) => {62let type = 'boolean';63if (setting.includes('string')) {64type = 'string';65}66return { type, key: setting };67}68};69contextMenuService = <IContextMenuService>{};70Registry.as<IConfigurationRegistry>(Extensions.Configuration).registerConfiguration(configuration);71settingRenderer = new SimpleSettingRenderer(configurationService, contextMenuService, preferencesService, { publicLog2: () => { } } as any, { writeText: async () => { } } as any);72});7374suiteTeardown(() => {75Registry.as<IConfigurationRegistry>(Extensions.Configuration).deregisterConfigurations([configuration]);76});7778test('render code setting button with value', () => {79const htmlRenderer = settingRenderer.getHtmlRenderer();80const htmlNoValue = '<a href="code-oss://settings/example.booleanSetting" codesetting="true">';81const renderedHtmlNoValue = htmlRenderer({ block: false, raw: htmlNoValue, pre: false, text: '', type: 'html' });82assert.strictEqual(renderedHtmlNoValue,83`<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>84<span class="separator"></span>85<span class="setting-name">example.booleanSetting</span>86</a></code>`);87});8889test('actions with no value', () => {90const uri = URI.parse(settingRenderer.settingToUriString('example.booleanSetting'));91const actions = settingRenderer.getActions(uri);92assert.strictEqual(actions?.length, 2);93assert.strictEqual(actions[0].label, 'View "Example: Boolean Setting" in Settings');94});9596test('actions with value + updating and restoring', async () => {97await configurationService.setUserConfiguration('example', { stringSetting: 'two' });98const uri = URI.parse(settingRenderer.settingToUriString('example.stringSetting', 'three'));99100const verifyOriginalState = (actions: IAction[] | undefined): actions is IAction[] => {101assert.strictEqual(actions?.length, 3);102assert.strictEqual(actions[0].label, 'Set "Example: String Setting" to "three"');103assert.strictEqual(actions[1].label, 'View in Settings');104assert.strictEqual(configurationService.getValue('example.stringSetting'), 'two');105return true;106};107108const actions = settingRenderer.getActions(uri);109if (verifyOriginalState(actions)) {110// Update the value111await actions[0].run();112assert.strictEqual(configurationService.getValue('example.stringSetting'), 'three');113const actionsUpdated = settingRenderer.getActions(uri);114assert.strictEqual(actionsUpdated?.length, 3);115assert.strictEqual(actionsUpdated[0].label, 'Restore value of "Example: String Setting"');116assert.strictEqual(actions[1].label, 'View in Settings');117assert.strictEqual(actions[2].label, 'Copy Setting ID');118assert.strictEqual(configurationService.getValue('example.stringSetting'), 'three');119120// Restore the value121await actionsUpdated[0].run();122verifyOriginalState(settingRenderer.getActions(uri));123}124});125});126127128