Path: blob/main/extensions/copilot/src/extension/inlineEdits/test/vscode-node/naturalLanguageHint.test.ts
13405 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 * as assert from 'assert';6import * as vscode from 'vscode';7import { LineCheck } from '../../vscode-node/naturalLanguageHint';89suite('LineCheck.isMostlyNaturalLanguage', () => {1011async function createMockDocument(lines: string[], languageId: string = 'typescript'): Promise<vscode.TextDocument> {12return await vscode.workspace.openTextDocument({ language: languageId, content: lines.join('\n') });13}1415test('should return false for lines with too little content', async () => {16const document = await createMockDocument(['']);17const position = new vscode.Position(0, 0);18const result = LineCheck.isNaturalLanguageDominated(document, position);19assert.strictEqual(result, false);20});2122test('should return true for lines with mostly natural language including interface', async () => {23const document = await createMockDocument(['interface Car with make, age and mileage']);24const position = new vscode.Position(0, 39);25const result = LineCheck.isNaturalLanguageDominated(document, position);26assert.strictEqual(result, true);27});2829test('should return false for lines with function declaration', async () => {30const document = await createMockDocument(['function foo(a:number, b:string) {', ' console.log the args here}']);31const position = new vscode.Position(1, 25);32const result = LineCheck.isNaturalLanguageDominated(document, position);33assert.strictEqual(result, true);34});35test('should return false for lines with too many keywords', async () => {36const document = await createMockDocument(['const let var function']);37const position = new vscode.Position(0, 21);38const result = LineCheck.isNaturalLanguageDominated(document, position);39assert.strictEqual(result, false);40});4142test('should return false for lines with too much punctuation', async () => {43const document = await createMockDocument(['word1, word2; word3.']);44const position = new vscode.Position(0, 19);45const result = LineCheck.isNaturalLanguageDominated(document, position);46assert.strictEqual(result, false);47});4849test('should return true for lines with mostly natural language', async () => {50const document = await createMockDocument(['This is a test sentence with words.']);51const position = new vscode.Position(0, 34);52const result = LineCheck.isNaturalLanguageDominated(document, position);53assert.strictEqual(result, true);54});5556test('should return false for lines with less than 4 tokens', async () => {57const document = await createMockDocument(['word1 word2']);58const position = new vscode.Position(0, 10);59const result = LineCheck.isNaturalLanguageDominated(document, position);60assert.strictEqual(result, false);61});6263test('should return false for lines with less than 2 spaces', async () => {64const document = await createMockDocument(['word1,word2,word3']);65const position = new vscode.Position(0, 16);66const result = LineCheck.isNaturalLanguageDominated(document, position);67assert.strictEqual(result, false);68});6970test('should return false for lines with class declaration', async () => {71const document = await createMockDocument(['class AbstractPaneCompositeBar extends Disposable']);72const position = new vscode.Position(0, 49);73const result = LineCheck.isNaturalLanguageDominated(document, position);74assert.strictEqual(result, false);75});7677test('Example of inline <tab> heuristic being too eager #8151', async () => {78const document = await createMockDocument([' const usedCacheEntries = await coll']);79const position = new vscode.Position(0, 36);80const result = LineCheck.isNaturalLanguageDominated(document, position);81assert.strictEqual(result, false);82});8384test('Eager inline chat hints #8240m, part 1', async () => {85const document = await createMockDocument(['return new SD']);86const position = new vscode.Position(0, 13);87const result = LineCheck.isNaturalLanguageDominated(document, position);88assert.strictEqual(result, false);89});9091test('Eager inline chat hints #8240, part 2', async () => {92const document = await createMockDocument([93'export class SummarizedDocumentInput {',94'',95' static async create(): SummarizedDocumentInput',96' ',97' }',98'}'99]);100const position = new vscode.Position(2, 47);101const result = LineCheck.isNaturalLanguageDominated(document, position);102assert.strictEqual(result, false);103});104105106test('Eager inline chat hints #8240m, part 3', async () => {107const document = await createMockDocument(['(token as Token).']);108const position = new vscode.Position(0, 17);109const result = LineCheck.isNaturalLanguageDominated(document, position);110assert.strictEqual(result, false);111});112113test('Inline hint trigger and keyword prefixes #10198', async () => {114const document = await createMockDocument(['class FooBarBazzFactory implemen']);115const position = new vscode.Position(0, 32);116const result = LineCheck.isNaturalLanguageDominated(document, position);117assert.strictEqual(result, false);118});119120test('Haskell', async () => {121const document = await createMockDocument(['reverse xs'], 'haskell');122const position = new vscode.Position(0, 10);123const result = LineCheck.isNaturalLanguageDominated(document, position);124assert.strictEqual(result, false);125});126127test('Haskell (trailing space)', async () => {128const document = await createMockDocument(['reverse xs '], 'haskell');129const position = new vscode.Position(0, 11);130const result = LineCheck.isNaturalLanguageDominated(document, position);131assert.strictEqual(result, false);132});133134test('Haskell 2', async () => {135const document = await createMockDocument(['sumfn a b'], 'haskell');136const position = new vscode.Position(0, 10);137const result = LineCheck.isNaturalLanguageDominated(document, position);138assert.strictEqual(result, false);139});140141test('https://github.com/microsoft/vscode-copilot/issues/11370', async () => {142const document = await createMockDocument([143'<h2 class="subtitle"›',144'Thanks for visiting our fun and colorful project! We hope you enjoyed your stay.',145'i am a new line',146'</h2>'], 'html');147const position = new vscode.Position(2, 15);148const result = LineCheck.isNaturalLanguageDominated(document, position);149assert.strictEqual(result, false);150});151});152153154