diff --git a/extensions/markdown/src/test/tableOfContentsProvider.test.ts b/extensions/markdown/src/test/tableOfContentsProvider.test.ts index f59a5c29697d2ce520e10fabd42f24ddc81d356d..3c200483ae26edc38e7129c73dbe1e073700a580 100644 --- a/extensions/markdown/src/test/tableOfContentsProvider.test.ts +++ b/extensions/markdown/src/test/tableOfContentsProvider.test.ts @@ -9,14 +9,69 @@ import * as vscode from 'vscode'; import { TableOfContentsProvider } from '../tableOfContentsProvider'; import { MarkdownEngine } from '../markdownEngine'; +const testFileName = vscode.Uri.parse('test.md'); + suite('markdown.TableOfContentsProvider', () => { - test('Should not return anything for empty document', async () => { - const doc = new InMemoryDocument(vscode.Uri.parse('test.md'), ''); + test('Lookup should not return anything for empty document', async () => { + const doc = new InMemoryDocument(testFileName, ''); const provider = new TableOfContentsProvider(new MarkdownEngine(), doc); assert.strictEqual(await provider.lookup(''), undefined); assert.strictEqual(await provider.lookup('foo'), undefined); }); + + test('Lookup should not return anything for document with no headers', async () => { + const doc = new InMemoryDocument(testFileName, 'a *b*\nc'); + const provider = new TableOfContentsProvider(new MarkdownEngine(), doc); + + assert.strictEqual(await provider.lookup(''), undefined); + assert.strictEqual(await provider.lookup('foo'), undefined); + assert.strictEqual(await provider.lookup('a'), undefined); + assert.strictEqual(await provider.lookup('b'), undefined); + }); + + test('Lookup should return basic #header', async () => { + const doc = new InMemoryDocument(testFileName, `# a\nx\n# c`); + const provider = new TableOfContentsProvider(new MarkdownEngine(), doc); + + { + const entry = await provider.lookup('a'); + assert.ok(entry); + assert.strictEqual(entry!.line, 0); + } + { + assert.strictEqual(await provider.lookup('x'), undefined); + } + { + const entry = await provider.lookup('c'); + assert.ok(entry); + assert.strictEqual(entry!.line, 2); + } + }); + + test('Lookups should be case in-sensitive', async () => { + const doc = new InMemoryDocument(testFileName, `# fOo\n`); + const provider = new TableOfContentsProvider(new MarkdownEngine(), doc); + + assert.strictEqual((await provider.lookup('fOo'))!.line, 0); + assert.strictEqual((await provider.lookup('foo'))!.line, 0); + assert.strictEqual((await provider.lookup('FOO'))!.line, 0); + }); + + test('Lookups should ignore leading and trailing white-space, and collapse internal whitespace', async () => { + const doc = new InMemoryDocument(testFileName, `# f o o \n`); + const provider = new TableOfContentsProvider(new MarkdownEngine(), doc); + + assert.strictEqual((await provider.lookup('f o o'))!.line, 0); + assert.strictEqual((await provider.lookup(' f o o'))!.line, 0); + assert.strictEqual((await provider.lookup(' f o o '))!.line, 0); + assert.strictEqual((await provider.lookup('f o o'))!.line, 0); + assert.strictEqual((await provider.lookup('f o o'))!.line, 0); + + assert.strictEqual(await provider.lookup('f'), undefined); + assert.strictEqual(await provider.lookup('foo'), undefined); + assert.strictEqual(await provider.lookup('fo o'), undefined); + }); }); class InMemoryDocument implements vscode.TextDocument { @@ -24,9 +79,9 @@ class InMemoryDocument implements vscode.TextDocument { constructor( public readonly uri: vscode.Uri, - contents: string + private readonly _contents: string ) { - this._lines = contents.split(/\n/g); + this._lines = this._contents.split(/\n/g); } fileName: string = ''; @@ -54,11 +109,11 @@ class InMemoryDocument implements vscode.TextDocument { offsetAt(_position: vscode.Position): never { throw new Error('Method not implemented.'); } - positionAt(_offset: number): never{ + positionAt(_offset: number): never { throw new Error('Method not implemented.'); } - getText(_range?: vscode.Range | undefined): never { - throw new Error('Method not implemented.'); + getText(_range?: vscode.Range | undefined): string { + return this._contents; } getWordRangeAtPosition(_position: vscode.Position, _regex?: RegExp | undefined): never { throw new Error('Method not implemented.');