Path: blob/main/src/vs/editor/contrib/quickAccess/test/browser/gotoLineQuickAccess.test.ts
4780 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 { Event } from '../../../../../base/common/event.js';7import { ensureNoDisposablesAreLeakedInTestSuite } from '../../../../../base/test/common/utils.js';8import { IEditor } from '../../../../common/editorCommon.js';9import { withTestCodeEditor } from '../../../../test/browser/testCodeEditor.js';10import { AbstractGotoLineQuickAccessProvider } from '../../browser/gotoLineQuickAccess.js';11import { IStorageService } from '../../../../../platform/storage/common/storage.js';1213class TestGotoLineQuickAccessProvider extends AbstractGotoLineQuickAccessProvider {14protected override onDidActiveTextEditorControlChange = Event.None;15protected override activeTextEditorControl: IEditor | undefined;16constructor(private zeroBased: boolean) {17super();18}19protected override readonly storageService = {20getBoolean: () => this.zeroBased,21store: () => { }22} as unknown as IStorageService;2324public parsePositionTest(editor: IEditor, value: string) {25return super.parsePosition(editor, value);26}27}2829suite('AbstractGotoLineQuickAccessProvider', () => {30ensureNoDisposablesAreLeakedInTestSuite();3132function runTest(input: string, expectedLine: number, expectedColumn?: number, zeroBased = false) {33const provider = new TestGotoLineQuickAccessProvider(zeroBased);34withTestCodeEditor([35'line 1',36'line 2',37'line 3',38'line 4',39'line 5'40], {}, (editor, _) => {41const { lineNumber, column } = provider.parsePositionTest(editor, input);42assert.strictEqual(lineNumber, expectedLine);43assert.strictEqual(column, expectedColumn ?? 1);44});45}4647test('parsePosition works as expected', () => {48// :line49runTest('-100', 1);50runTest('-5', 1);51runTest('-1', 5);52runTest('0', 1);53runTest('1', 1);54runTest('2', 2);55runTest('5', 5);56runTest('6', 5);57runTest('7', 5);58runTest('100', 5);5960// :line,column61runTest('2:-100', 2, 1);62runTest('2:-5', 2, 2);63runTest('2:-1', 2, 6);64runTest('2:0', 2, 1);65runTest('2:1', 2, 1);66runTest('2:2', 2, 2);67runTest('2:6', 2, 6);68runTest('2:7', 2, 7);69runTest('2:8', 2, 7);70runTest('2:100', 2, 7);7172// ::offset (1-based)73runTest(':-1000', 1, 1);74runTest(':-10', 4, 5);75runTest(':-1', 5, 7);76runTest(':0', 1, 1);77runTest(':1', 1, 1);78runTest(':10', 2, 3);79runTest(':1000', 5, 7);8081// offset (0-based)82runTest(':-1000', 1, 1, true);83runTest(':-10', 4, 4, true);84runTest(':-1', 5, 6, true);85runTest(':0', 1, 1, true);86runTest(':1', 1, 2, true);87runTest(':10', 2, 4, true);88runTest(':1000', 5, 7, true);8990// :line#column91// :line,column92// spaces93runTest('-1#6', 5, 6);94runTest('2,4', 2, 4);95runTest(' 2 : 3 ', 2, 3);96});9798function runTabTest(input: string, expectedLine: number, expectedColumn?: number, zeroBased = false) {99const provider = new TestGotoLineQuickAccessProvider(zeroBased);100withTestCodeEditor([101'\tline 1',102'\t\tline 2',103'\tline 3'104], {}, (editor, _) => {105const { lineNumber, column } = provider.parsePositionTest(editor, input);106assert.strictEqual(lineNumber, expectedLine);107assert.strictEqual(column, expectedColumn ?? 1);108});109}110111test('parsePosition works with tabs', () => {112// :line,column113runTabTest('1:1', 1, 1);114runTabTest('1:2', 1, 1);115runTabTest('1:3', 1, 1);116runTabTest('1:4', 1, 2);117runTabTest('1:5', 1, 2);118runTabTest('1:6', 1, 3);119runTabTest('1:11', 1, 8);120runTabTest('1:12', 1, 8);121runTabTest('1:-5', 1, 3);122runTabTest('1:-6', 1, 2);123runTabTest('1:-7', 1, 2);124runTabTest('1:-8', 1, 1);125runTabTest('1:-9', 1, 1);126runTabTest('1:-10', 1, 1);127runTabTest('1:-11', 1, 1);128runTabTest('2:1', 2, 1);129runTabTest('2:2', 2, 1);130runTabTest('2:3', 2, 1);131runTabTest('2:4', 2, 2);132runTabTest('2:5', 2, 2);133runTabTest('2:8', 2, 3);134runTabTest('2:9', 2, 3);135runTabTest('2:11', 2, 5);136});137});138139140141