Path: blob/main/extensions/copilot/src/extension/test/node/editFromDiffGeneration.spec.ts
13399 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*--------------------------------------------------------------------------------------------*/456import { deepStrictEqual } from 'assert';7import { promises as fs, readdirSync } from 'fs';8import { suite, test } from 'vitest';9import * as path from '../../../util/vs/base/common/path';10import { Reporter, createEditsFromPseudoDiff, createEditsFromRealDiff } from '../../prompt/node/editFromDiffGeneration';11import { Lines } from '../../prompt/node/editGeneration';12import { applyEdits } from '../../prompt/node/intents';1314suite('Real Diff Apply', function () {15createTestsFromFixtures(path.join(__dirname, './fixtures/gitdiff'), (original: string, diff: string, expected: string, messages: string[]) => {16const reporter = new ReporterImpl();17const linesEdits = createEditsFromRealDiff(Lines.fromString(original), Lines.fromString(diff), reporter);18const actual = applyEdits(original, linesEdits.map(e => e.toTextEdit()));19deepStrictEqual(Lines.fromString(actual), Lines.fromString(expected));20deepStrictEqual(reporter.messages, messages);21deepStrictEqual(reporter.recovered, []);22});23});2425suite('Pseudo Diff Apply', function () {26createTestsFromFixtures(path.join(__dirname, './fixtures/pseudodiff'), (original: string, diff: string, expected: string, messages: string[]) => {27const reporter = new ReporterImpl();28const linesEdits = createEditsFromPseudoDiff(Lines.fromString(original), Lines.fromString(diff), reporter);29const actual = applyEdits(original, linesEdits.map(e => e.toTextEdit()));30deepStrictEqual(Lines.fromString(actual), Lines.fromString(expected));31deepStrictEqual(reporter.messages, messages);32});33});3435class ReporterImpl implements Reporter {36public recovered: [number, number][] = [];37public messages: string[] = [];3839recovery(originalLine: number, newLine: number) {40this.recovered.push([originalLine, newLine]);41}42warning(message: string) {43this.messages.push(message);44}45}464748function createTestsFromFixtures(testDir: string, runTest: (original: string, diff: string, expected: string, messages: string[]) => void) {49const entries = readdirSync(testDir);50for (const entry of entries) {5152const match = entry.match(/^(\d\d-\w+)-([^.]+)$/);53if (match) {54test(`${match[1]} - ${match[2].replace(/_/g, ' ')}`, async () => {55const expected = await fs.readFile(path.join(testDir, entry), 'utf8');56const diff = await fs.readFile(path.join(testDir, `${entry}.diff`), 'utf8');57const original = await fs.readFile(path.join(testDir, match[1]), 'utf8');58let messages = [];59try {60messages = JSON.parse(await fs.readFile(path.join(testDir, `${entry}.messages`), 'utf8'));61} catch (e) {62// ignore63}64runTest(original, diff, expected, messages);65});66}67}68}697071