Path: blob/main/src/vs/editor/contrib/folding/test/browser/indentRangeProvider.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 { ensureNoDisposablesAreLeakedInTestSuite } from '../../../../../base/test/common/utils.js';7import { FoldingMarkers } from '../../../../common/languages/languageConfiguration.js';8import { computeRanges } from '../../browser/indentRangeProvider.js';9import { createTextModel } from '../../../../test/common/testTextModel.js';1011interface ExpectedIndentRange {12startLineNumber: number;13endLineNumber: number;14parentIndex: number;15}1617function assertRanges(lines: string[], expected: ExpectedIndentRange[], offside: boolean, markers?: FoldingMarkers): void {18const model = createTextModel(lines.join('\n'));19const actual = computeRanges(model, offside, markers);2021const actualRanges: ExpectedIndentRange[] = [];22for (let i = 0; i < actual.length; i++) {23actualRanges[i] = r(actual.getStartLineNumber(i), actual.getEndLineNumber(i), actual.getParentIndex(i));24}25assert.deepStrictEqual(actualRanges, expected);26model.dispose();27}2829function r(startLineNumber: number, endLineNumber: number, parentIndex: number, marker = false): ExpectedIndentRange {30return { startLineNumber, endLineNumber, parentIndex };31}3233suite('Indentation Folding', () => {34ensureNoDisposablesAreLeakedInTestSuite();35test('Fold one level', () => {36const range = [37'A',38' A',39' A',40' A'41];42assertRanges(range, [r(1, 4, -1)], true);43assertRanges(range, [r(1, 4, -1)], false);44});4546test('Fold two levels', () => {47const range = [48'A',49' A',50' A',51' A',52' A'53];54assertRanges(range, [r(1, 5, -1), r(3, 5, 0)], true);55assertRanges(range, [r(1, 5, -1), r(3, 5, 0)], false);56});5758test('Fold three levels', () => {59const range = [60'A',61' A',62' A',63' A',64'A'65];66assertRanges(range, [r(1, 4, -1), r(2, 4, 0), r(3, 4, 1)], true);67assertRanges(range, [r(1, 4, -1), r(2, 4, 0), r(3, 4, 1)], false);68});6970test('Fold decreasing indent', () => {71const range = [72' A',73' A',74'A'75];76assertRanges(range, [], true);77assertRanges(range, [], false);78});7980test('Fold Java', () => {81assertRanges([82/* 1*/ 'class A {',83/* 2*/ ' void foo() {',84/* 3*/ ' console.log();',85/* 4*/ ' console.log();',86/* 5*/ ' }',87/* 6*/ '',88/* 7*/ ' void bar() {',89/* 8*/ ' console.log();',90/* 9*/ ' }',91/*10*/ '}',92/*11*/ 'interface B {',93/*12*/ ' void bar();',94/*13*/ '}',95], [r(1, 9, -1), r(2, 4, 0), r(7, 8, 0), r(11, 12, -1)], false);96});9798test('Fold Javadoc', () => {99assertRanges([100/* 1*/ '/**',101/* 2*/ ' * Comment',102/* 3*/ ' */',103/* 4*/ 'class A {',104/* 5*/ ' void foo() {',105/* 6*/ ' }',106/* 7*/ '}',107], [r(1, 3, -1), r(4, 6, -1)], false);108});109test('Fold Whitespace Java', () => {110assertRanges([111/* 1*/ 'class A {',112/* 2*/ '',113/* 3*/ ' void foo() {',114/* 4*/ ' ',115/* 5*/ ' return 0;',116/* 6*/ ' }',117/* 7*/ ' ',118/* 8*/ '}',119], [r(1, 7, -1), r(3, 5, 0)], false);120});121122test('Fold Whitespace Python', () => {123assertRanges([124/* 1*/ 'def a:',125/* 2*/ ' pass',126/* 3*/ ' ',127/* 4*/ ' def b:',128/* 5*/ ' pass',129/* 6*/ ' ',130/* 7*/ ' ',131/* 8*/ 'def c: # since there was a deintent here'132], [r(1, 5, -1), r(4, 5, 0)], true);133});134135test('Fold Tabs', () => {136assertRanges([137/* 1*/ 'class A {',138/* 2*/ '\t\t',139/* 3*/ '\tvoid foo() {',140/* 4*/ '\t \t//hello',141/* 5*/ '\t return 0;',142/* 6*/ ' \t}',143/* 7*/ ' ',144/* 8*/ '}',145], [r(1, 7, -1), r(3, 5, 0)], false);146});147});148149const markers: FoldingMarkers = {150start: /^\s*#region\b/,151end: /^\s*#endregion\b/152};153154suite('Folding with regions', () => {155ensureNoDisposablesAreLeakedInTestSuite();156test('Inside region, indented', () => {157assertRanges([158/* 1*/ 'class A {',159/* 2*/ ' #region',160/* 3*/ ' void foo() {',161/* 4*/ ' ',162/* 5*/ ' return 0;',163/* 6*/ ' }',164/* 7*/ ' #endregion',165/* 8*/ '}',166], [r(1, 7, -1), r(2, 7, 0, true), r(3, 5, 1)], false, markers);167});168test('Inside region, not indented', () => {169assertRanges([170/* 1*/ 'var x;',171/* 2*/ '#region',172/* 3*/ 'void foo() {',173/* 4*/ ' ',174/* 5*/ ' return 0;',175/* 6*/ ' }',176/* 7*/ '#endregion',177/* 8*/ '',178], [r(2, 7, -1, true), r(3, 6, 0)], false, markers);179});180test('Empty Regions', () => {181assertRanges([182/* 1*/ 'var x;',183/* 2*/ '#region',184/* 3*/ '#endregion',185/* 4*/ '#region',186/* 5*/ '',187/* 6*/ '#endregion',188/* 7*/ 'var y;',189], [r(2, 3, -1, true), r(4, 6, -1, true)], false, markers);190});191test('Nested Regions', () => {192assertRanges([193/* 1*/ 'var x;',194/* 2*/ '#region',195/* 3*/ '#region',196/* 4*/ '',197/* 5*/ '#endregion',198/* 6*/ '#endregion',199/* 7*/ 'var y;',200], [r(2, 6, -1, true), r(3, 5, 0, true)], false, markers);201});202test('Nested Regions 2', () => {203assertRanges([204/* 1*/ 'class A {',205/* 2*/ ' #region',206/* 3*/ '',207/* 4*/ ' #region',208/* 5*/ '',209/* 6*/ ' #endregion',210/* 7*/ ' // comment',211/* 8*/ ' #endregion',212/* 9*/ '}',213], [r(1, 8, -1), r(2, 8, 0, true), r(4, 6, 1, true)], false, markers);214});215test('Incomplete Regions', () => {216assertRanges([217/* 1*/ 'class A {',218/* 2*/ '#region',219/* 3*/ ' // comment',220/* 4*/ '}',221], [r(2, 3, -1)], false, markers);222});223test('Incomplete Regions 2', () => {224assertRanges([225/* 1*/ '',226/* 2*/ '#region',227/* 3*/ '#region',228/* 4*/ '#region',229/* 5*/ ' // comment',230/* 6*/ '#endregion',231/* 7*/ '#endregion',232/* 8*/ ' // hello',233], [r(3, 7, -1, true), r(4, 6, 0, true)], false, markers);234});235test('Indented region before', () => {236assertRanges([237/* 1*/ 'if (x)',238/* 2*/ ' return;',239/* 3*/ '',240/* 4*/ '#region',241/* 5*/ ' // comment',242/* 6*/ '#endregion',243], [r(1, 3, -1), r(4, 6, -1, true)], false, markers);244});245test('Indented region before 2', () => {246assertRanges([247/* 1*/ 'if (x)',248/* 2*/ ' log();',249/* 3*/ '',250/* 4*/ ' #region',251/* 5*/ ' // comment',252/* 6*/ ' #endregion',253], [r(1, 6, -1), r(2, 6, 0), r(4, 6, 1, true)], false, markers);254});255test('Indented region in-between', () => {256assertRanges([257/* 1*/ '#region',258/* 2*/ ' // comment',259/* 3*/ ' if (x)',260/* 4*/ ' return;',261/* 5*/ '',262/* 6*/ '#endregion',263], [r(1, 6, -1, true), r(3, 5, 0)], false, markers);264});265test('Indented region after', () => {266assertRanges([267/* 1*/ '#region',268/* 2*/ ' // comment',269/* 3*/ '',270/* 4*/ '#endregion',271/* 5*/ ' if (x)',272/* 6*/ ' return;',273], [r(1, 4, -1, true), r(5, 6, -1)], false, markers);274});275test('With off-side', () => {276assertRanges([277/* 1*/ '#region',278/* 2*/ ' ',279/* 3*/ '',280/* 4*/ '#endregion',281/* 5*/ '',282], [r(1, 4, -1, true)], true, markers);283});284test('Nested with off-side', () => {285assertRanges([286/* 1*/ '#region',287/* 2*/ ' ',288/* 3*/ '#region',289/* 4*/ '',290/* 5*/ '#endregion',291/* 6*/ '',292/* 7*/ '#endregion',293/* 8*/ '',294], [r(1, 7, -1, true), r(3, 5, 0, true)], true, markers);295});296test('Issue 35981', () => {297assertRanges([298/* 1*/ 'function thisFoldsToEndOfPage() {',299/* 2*/ ' const variable = []',300/* 3*/ ' // #region',301/* 4*/ ' .reduce((a, b) => a,[]);',302/* 5*/ '}',303/* 6*/ '',304/* 7*/ 'function thisFoldsProperly() {',305/* 8*/ ' const foo = "bar"',306/* 9*/ '}',307], [r(1, 4, -1), r(2, 4, 0), r(7, 8, -1)], false, markers);308});309test('Misspelled Markers', () => {310assertRanges([311/* 1*/ '#Region',312/* 2*/ '#endregion',313/* 3*/ '#regionsandmore',314/* 4*/ '#endregion',315/* 5*/ '#region',316/* 6*/ '#end region',317/* 7*/ '#region',318/* 8*/ '#endregionff',319], [], true, markers);320});321test('Issue 79359', () => {322assertRanges([323/* 1*/ '#region',324/* 2*/ '',325/* 3*/ 'class A',326/* 4*/ ' foo',327/* 5*/ '',328/* 6*/ 'class A',329/* 7*/ ' foo',330/* 8*/ '',331/* 9*/ '#endregion',332], [r(1, 9, -1, true), r(3, 4, 0), r(6, 7, 0)], true, markers);333});334});335336337