Path: blob/main/extensions/copilot/script/testGeneration/editFromPatchTests.ts
13388 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*--------------------------------------------------------------------------------------------*/4import { promises as fs } from 'fs';5import minimist from 'minimist';6import * as path from 'path';78const fixturesRootsFolder = path.join(__dirname, '../../src/extension/test/node/fixtures/patch');9const simulationsRootFolder = path.join(__dirname, '../../.simulation');1011async function main(simulationFolder: string | undefined, all: boolean | undefined, annotationFilter: string = 'invalid patch'): Promise<void> {12if (!simulationFolder || !await checkExists(simulationsRootFolder)) {13const lastRunName = await findLastRun(simulationsRootFolder);14if (!lastRunName) {15console.log(`No run found in ${simulationsRootFolder}`);16return;17}18simulationFolder = path.join(simulationsRootFolder, lastRunName);19}20const outputFixturesFolder = path.join(fixturesRootsFolder, path.basename(simulationFolder));21console.log(`Looking for stest results in ${simulationFolder}`);22const entries = await fs.readdir(simulationFolder);23for (const entry of entries) {24for (let testRun = 0; testRun < 10; testRun++) {25const simTextPath = path.join(simulationFolder, entry, `0${testRun}-inline-simulator.txt`);26if (!await checkExists(simTextPath)) {27break;28}29const simText = JSON.parse(await fs.readFile(simTextPath, 'utf8')) as any[];30if (!all) {31const isInvalidPatch = (() => {32for (let i = 0; i < simText.length; i++) {33const data = simText[i];34if (data.kind === 'interaction' && Array.isArray(data.annotations)) {35for (const annotation of data.annotations) {36if (annotation.label === annotationFilter) {37return true;38}39}40}41}42return undefined;43})();44if (!isInvalidPatch) {45continue;46}47}48const simRequest = JSON.parse(await fs.readFile(path.join(simulationFolder, entry, `0${testRun}-sim-requests.txt`), 'utf8')) as any[];49const originalFileEntry = (() => {50for (let i = 0; i < simText.length; i++) {51const data = simText[i];52if (data.kind === 'initial') {53return data.file;54}55}56return undefined;57})();58if (!originalFileEntry) {59console.log('No original file path found');60break;61}62const original = await fs.readFile(path.join(simulationFolder, originalFileEntry.relativeDiskPath), 'utf8');63const modifedFilePath = (() => {64for (let i = 0; i < simText.length; i++) {65const data = simText[i];66if (data.kind === 'interaction' && Array.isArray(data.changedFiles)) {67for (const changedFile of data.changedFiles) {68if (changedFile.workspacePath === originalFileEntry.workspacePath) {69return changedFile.relativeDiskPath;70}71}72}73}74return undefined;75})();7677if (!modifedFilePath) {78console.log('No modified file path found');79break;80}81const modified = await fs.readFile(path.join(simulationFolder, modifedFilePath), 'utf8');82const response = simRequest[0].response.value.join('');8384const name = `${entry}0${testRun}`;85console.log(`Writing fixtures for ${name} at ${outputFixturesFolder}`);86await fs.mkdir(outputFixturesFolder, { recursive: true });87await fs.writeFile(path.join(outputFixturesFolder, `${name}.original.txt`), original);88await fs.writeFile(path.join(outputFixturesFolder, `${name}.expected.txt`), modified);89await fs.writeFile(path.join(outputFixturesFolder, `${name}.patch.txt`), response);90}9192}93}9495async function findLastRun(simulationsRootFolder: string): Promise<string | undefined> {96const entries = await fs.readdir(simulationsRootFolder);97return entries.filter(entry => entry.match(/^out-\d{8}-\d{6}$/)).sort().pop();98}99100async function checkExists(filePath: string): Promise<boolean> {101try {102await fs.stat(filePath);103return true;104} catch (error) {105return false;106}107}108109110if (require.main === module) {111const parsedArgs = minimist(process.argv);112if (parsedArgs.help) {113console.log('Usage: npx tsx editFromPatchTests.ts --simulation-folder <path-to-simulation-folder> --all --annotation <annotation>');114process.exit(0);115}116117118main(parsedArgs['simulation-folder'], parsedArgs['all'], parsedArgs['annotation']).catch(err => {119console.error(err);120process.exit(1);121});122123}124125126