Path: blob/main/src/vs/editor/test/browser/config/editorConfiguration.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 { ensureNoDisposablesAreLeakedInTestSuite } from '../../../../base/test/common/utils.js';7import { IEnvConfiguration } from '../../../browser/config/editorConfiguration.js';8import { migrateOptions } from '../../../browser/config/migrateOptions.js';9import { ConfigurationChangedEvent, EditorOption, IEditorHoverOptions, IQuickSuggestionsOptions } from '../../../common/config/editorOptions.js';10import { EditorZoom } from '../../../common/config/editorZoom.js';11import { TestConfiguration } from './testConfiguration.js';12import { AccessibilitySupport } from '../../../../platform/accessibility/common/accessibility.js';1314suite('Common Editor Config', () => {1516ensureNoDisposablesAreLeakedInTestSuite();1718test('Zoom Level', () => {1920//Zoom levels are defined to go between -5, 20 inclusive21const zoom = EditorZoom;2223zoom.setZoomLevel(0);24assert.strictEqual(zoom.getZoomLevel(), 0);2526zoom.setZoomLevel(-0);27assert.strictEqual(zoom.getZoomLevel(), 0);2829zoom.setZoomLevel(5);30assert.strictEqual(zoom.getZoomLevel(), 5);3132zoom.setZoomLevel(-1);33assert.strictEqual(zoom.getZoomLevel(), -1);3435zoom.setZoomLevel(9);36assert.strictEqual(zoom.getZoomLevel(), 9);3738zoom.setZoomLevel(-9);39assert.strictEqual(zoom.getZoomLevel(), -5);4041zoom.setZoomLevel(20);42assert.strictEqual(zoom.getZoomLevel(), 20);4344zoom.setZoomLevel(-10);45assert.strictEqual(zoom.getZoomLevel(), -5);4647zoom.setZoomLevel(9.1);48assert.strictEqual(zoom.getZoomLevel(), 9.1);4950zoom.setZoomLevel(-9.1);51assert.strictEqual(zoom.getZoomLevel(), -5);5253zoom.setZoomLevel(Infinity);54assert.strictEqual(zoom.getZoomLevel(), 20);5556zoom.setZoomLevel(Number.NEGATIVE_INFINITY);57assert.strictEqual(zoom.getZoomLevel(), -5);58});5960class TestWrappingConfiguration extends TestConfiguration {61protected override _readEnvConfiguration(): IEnvConfiguration {62return {63extraEditorClassName: '',64outerWidth: 1000,65outerHeight: 100,66emptySelectionClipboard: true,67pixelRatio: 1,68accessibilitySupport: AccessibilitySupport.Unknown,69editContextSupported: true,70};71}72}7374function assertWrapping(config: TestConfiguration, isViewportWrapping: boolean, wrappingColumn: number): void {75const options = config.options;76const wrappingInfo = options.get(EditorOption.wrappingInfo);77assert.strictEqual(wrappingInfo.isViewportWrapping, isViewportWrapping);78assert.strictEqual(wrappingInfo.wrappingColumn, wrappingColumn);79}8081test('wordWrap default', () => {82const config = new TestWrappingConfiguration({});83assertWrapping(config, false, -1);84config.dispose();85});8687test('wordWrap compat false', () => {88const config = new TestWrappingConfiguration({89wordWrap: <any>false90});91assertWrapping(config, false, -1);92config.dispose();93});9495test('wordWrap compat true', () => {96const config = new TestWrappingConfiguration({97wordWrap: <any>true98});99assertWrapping(config, true, 80);100config.dispose();101});102103test('wordWrap on', () => {104const config = new TestWrappingConfiguration({105wordWrap: 'on'106});107assertWrapping(config, true, 80);108config.dispose();109});110111test('wordWrap on without minimap', () => {112const config = new TestWrappingConfiguration({113wordWrap: 'on',114minimap: {115enabled: false116}117});118assertWrapping(config, true, 88);119config.dispose();120});121122test('wordWrap on does not use wordWrapColumn', () => {123const config = new TestWrappingConfiguration({124wordWrap: 'on',125wordWrapColumn: 10126});127assertWrapping(config, true, 80);128config.dispose();129});130131test('wordWrap off', () => {132const config = new TestWrappingConfiguration({133wordWrap: 'off'134});135assertWrapping(config, false, -1);136config.dispose();137});138139test('wordWrap off does not use wordWrapColumn', () => {140const config = new TestWrappingConfiguration({141wordWrap: 'off',142wordWrapColumn: 10143});144assertWrapping(config, false, -1);145config.dispose();146});147148test('wordWrap wordWrapColumn uses default wordWrapColumn', () => {149const config = new TestWrappingConfiguration({150wordWrap: 'wordWrapColumn'151});152assertWrapping(config, false, 80);153config.dispose();154});155156test('wordWrap wordWrapColumn uses wordWrapColumn', () => {157const config = new TestWrappingConfiguration({158wordWrap: 'wordWrapColumn',159wordWrapColumn: 100160});161assertWrapping(config, false, 100);162config.dispose();163});164165test('wordWrap wordWrapColumn validates wordWrapColumn', () => {166const config = new TestWrappingConfiguration({167wordWrap: 'wordWrapColumn',168wordWrapColumn: -1169});170assertWrapping(config, false, 1);171config.dispose();172});173174test('wordWrap bounded uses default wordWrapColumn', () => {175const config = new TestWrappingConfiguration({176wordWrap: 'bounded'177});178assertWrapping(config, true, 80);179config.dispose();180});181182test('wordWrap bounded uses wordWrapColumn', () => {183const config = new TestWrappingConfiguration({184wordWrap: 'bounded',185wordWrapColumn: 40186});187assertWrapping(config, true, 40);188config.dispose();189});190191test('wordWrap bounded validates wordWrapColumn', () => {192const config = new TestWrappingConfiguration({193wordWrap: 'bounded',194wordWrapColumn: -1195});196assertWrapping(config, true, 1);197config.dispose();198});199200test('issue #53152: Cannot assign to read only property \'enabled\' of object', () => {201const hoverOptions: IEditorHoverOptions = {};202Object.defineProperty(hoverOptions, 'enabled', {203writable: false,204value: true205});206const config = new TestConfiguration({ hover: hoverOptions });207208assert.strictEqual(config.options.get(EditorOption.hover).enabled, true);209config.updateOptions({ hover: { enabled: false } });210assert.strictEqual(config.options.get(EditorOption.hover).enabled, false);211212config.dispose();213});214215test('does not emit event when nothing changes', () => {216const config = new TestConfiguration({ glyphMargin: true, roundedSelection: false });217let event: ConfigurationChangedEvent | null = null;218const disposable = config.onDidChange(e => event = e);219assert.strictEqual(config.options.get(EditorOption.glyphMargin), true);220221config.updateOptions({ glyphMargin: true });222config.updateOptions({ roundedSelection: false });223assert.strictEqual(event, null);224config.dispose();225disposable.dispose();226});227228test('issue #94931: Unable to open source file', () => {229const config = new TestConfiguration({ quickSuggestions: null! });230const actual = <Readonly<Required<IQuickSuggestionsOptions>>>config.options.get(EditorOption.quickSuggestions);231assert.deepStrictEqual(actual, {232other: 'on',233comments: 'off',234strings: 'off'235});236config.dispose();237});238239test('issue #102920: Can\'t snap or split view with JSON files', () => {240const config = new TestConfiguration({ quickSuggestions: null! });241config.updateOptions({ quickSuggestions: { strings: true } });242const actual = <Readonly<Required<IQuickSuggestionsOptions>>>config.options.get(EditorOption.quickSuggestions);243assert.deepStrictEqual(actual, {244other: 'on',245comments: 'off',246strings: 'on'247});248config.dispose();249});250251test('issue #151926: Untyped editor options apply', () => {252const config = new TestConfiguration({});253config.updateOptions({ unicodeHighlight: { allowedCharacters: { 'x': true } } });254const actual = config.options.get(EditorOption.unicodeHighlighting);255assert.deepStrictEqual(actual,256{257nonBasicASCII: "inUntrustedWorkspace",258invisibleCharacters: true,259ambiguousCharacters: true,260includeComments: "inUntrustedWorkspace",261includeStrings: "inUntrustedWorkspace",262allowedCharacters: { "x": true },263allowedLocales: { "_os": true, "_vscode": true }264}265);266config.dispose();267});268});269270suite('migrateOptions', () => {271272ensureNoDisposablesAreLeakedInTestSuite();273274function migrate(options: any): any {275migrateOptions(options);276return options;277}278279test('wordWrap', () => {280assert.deepStrictEqual(migrate({ wordWrap: true }), { wordWrap: 'on' });281assert.deepStrictEqual(migrate({ wordWrap: false }), { wordWrap: 'off' });282});283test('lineNumbers', () => {284assert.deepStrictEqual(migrate({ lineNumbers: true }), { lineNumbers: 'on' });285assert.deepStrictEqual(migrate({ lineNumbers: false }), { lineNumbers: 'off' });286});287test('autoClosingBrackets', () => {288assert.deepStrictEqual(migrate({ autoClosingBrackets: false }), { autoClosingBrackets: 'never', autoClosingQuotes: 'never', autoSurround: 'never' });289});290test('cursorBlinking', () => {291assert.deepStrictEqual(migrate({ cursorBlinking: 'visible' }), { cursorBlinking: 'solid' });292});293test('renderWhitespace', () => {294assert.deepStrictEqual(migrate({ renderWhitespace: true }), { renderWhitespace: 'boundary' });295assert.deepStrictEqual(migrate({ renderWhitespace: false }), { renderWhitespace: 'none' });296});297test('renderLineHighlight', () => {298assert.deepStrictEqual(migrate({ renderLineHighlight: true }), { renderLineHighlight: 'line' });299assert.deepStrictEqual(migrate({ renderLineHighlight: false }), { renderLineHighlight: 'none' });300});301test('acceptSuggestionOnEnter', () => {302assert.deepStrictEqual(migrate({ acceptSuggestionOnEnter: true }), { acceptSuggestionOnEnter: 'on' });303assert.deepStrictEqual(migrate({ acceptSuggestionOnEnter: false }), { acceptSuggestionOnEnter: 'off' });304});305test('tabCompletion', () => {306assert.deepStrictEqual(migrate({ tabCompletion: true }), { tabCompletion: 'onlySnippets' });307assert.deepStrictEqual(migrate({ tabCompletion: false }), { tabCompletion: 'off' });308});309test('suggest.filteredTypes', () => {310assert.deepStrictEqual(311migrate({312suggest: {313filteredTypes: {314method: false,315function: false,316constructor: false,317deprecated: false,318field: false,319variable: false,320class: false,321struct: false,322interface: false,323module: false,324property: false,325event: false,326operator: false,327unit: false,328value: false,329constant: false,330enum: false,331enumMember: false,332keyword: false,333text: false,334color: false,335file: false,336reference: false,337folder: false,338typeParameter: false,339snippet: false,340}341}342}), {343suggest: {344filteredTypes: undefined,345showMethods: false,346showFunctions: false,347showConstructors: false,348showDeprecated: false,349showFields: false,350showVariables: false,351showClasses: false,352showStructs: false,353showInterfaces: false,354showModules: false,355showProperties: false,356showEvents: false,357showOperators: false,358showUnits: false,359showValues: false,360showConstants: false,361showEnums: false,362showEnumMembers: false,363showKeywords: false,364showWords: false,365showColors: false,366showFiles: false,367showReferences: false,368showFolders: false,369showTypeParameters: false,370showSnippets: false,371}372});373});374test('quickSuggestions', () => {375assert.deepStrictEqual(migrate({ quickSuggestions: true }), { quickSuggestions: { comments: 'on', strings: 'on', other: 'on' } });376assert.deepStrictEqual(migrate({ quickSuggestions: false }), { quickSuggestions: { comments: 'off', strings: 'off', other: 'off' } });377assert.deepStrictEqual(migrate({ quickSuggestions: { comments: 'on', strings: 'off' } }), { quickSuggestions: { comments: 'on', strings: 'off' } });378});379test('hover', () => {380assert.deepStrictEqual(migrate({ hover: true }), { hover: { enabled: true } });381assert.deepStrictEqual(migrate({ hover: false }), { hover: { enabled: false } });382});383test('parameterHints', () => {384assert.deepStrictEqual(migrate({ parameterHints: true }), { parameterHints: { enabled: true } });385assert.deepStrictEqual(migrate({ parameterHints: false }), { parameterHints: { enabled: false } });386});387test('autoIndent', () => {388assert.deepStrictEqual(migrate({ autoIndent: true }), { autoIndent: 'full' });389assert.deepStrictEqual(migrate({ autoIndent: false }), { autoIndent: 'advanced' });390});391test('matchBrackets', () => {392assert.deepStrictEqual(migrate({ matchBrackets: true }), { matchBrackets: 'always' });393assert.deepStrictEqual(migrate({ matchBrackets: false }), { matchBrackets: 'never' });394});395test('renderIndentGuides, highlightActiveIndentGuide', () => {396assert.deepStrictEqual(migrate({ renderIndentGuides: true }), { renderIndentGuides: undefined, guides: { indentation: true } });397assert.deepStrictEqual(migrate({ renderIndentGuides: false }), { renderIndentGuides: undefined, guides: { indentation: false } });398assert.deepStrictEqual(migrate({ highlightActiveIndentGuide: true }), { highlightActiveIndentGuide: undefined, guides: { highlightActiveIndentation: true } });399assert.deepStrictEqual(migrate({ highlightActiveIndentGuide: false }), { highlightActiveIndentGuide: undefined, guides: { highlightActiveIndentation: false } });400});401402test('migration does not overwrite new setting', () => {403assert.deepStrictEqual(migrate({ renderIndentGuides: true, guides: { indentation: false } }), { renderIndentGuides: undefined, guides: { indentation: false } });404assert.deepStrictEqual(migrate({ highlightActiveIndentGuide: true, guides: { highlightActiveIndentation: false } }), { highlightActiveIndentGuide: undefined, guides: { highlightActiveIndentation: false } });405});406});407408409