Path: blob/main/extensions/copilot/test/e2e/evaluators/pythonFix.ts
13394 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 { ITestingServicesAccessor } from '../../../src/platform/test/node/services';6import { extractCodeBlocks } from '../../../src/util/common/markdown';7import { isValidPythonFile } from '../../simulation/diagnosticProviders/python';8import { ScenarioEvaluator } from '../scenarioLoader';910async function pythonTestFnEvaluator(11accessor: ITestingServicesAccessor,12query: string,13response: string,14testFn: string15): Promise<{ success: boolean; errorMessage?: string }> {16const codeBlock = extractCodeBlocks(response).filter(x => x.language === 'python').at(0);17if (!codeBlock) {18return { success: false, errorMessage: 'No python code block found in response' };19}2021const testCode = '\n' + codeBlock.code + '\n\n' + testFn + '\n\n' + 'test()';2223const isValid = await isValidPythonFile(accessor, testCode);24return isValid ? { success: true } : { success: false, errorMessage: 'Unit test failed' };25}2627const testFnSubArrayMinMaxSum = `28def test():29assert subarray_min_max_sum([1,2,3,4,5,6,7,8,9]) == (36,44)30assert subarray_min_max_sum([1,1,1]) == (2,2)31assert subarray_min_max_sum([-1,-1,-1]) == (-2,-2)32assert subarray_min_max_sum([-1,0,1]) == (-1,1)33assert subarray_min_max_sum([1]) == None34`;3536const testFnPalindrome = `37def test():38assert palindrome('') == ''39assert palindrome('a') == 'a'40assert palindrome('aaaaaa') == 'aaaaaa'41assert palindrome('aaaaa') == 'aaaaa'42assert palindrome('abcddcba') == 'abcddcba'43assert palindrome('abcdcba') == 'abcdcba'44assert palindrome('xabcddcba') == 'abcddcba'45assert palindrome('axbcdcba') == 'abcdcba'46assert palindrome('abcxdcba') == 'abcdcba'47assert palindrome('abcdxcba') == 'abcxcba'48assert palindrome('abcdcxba') == 'abcdcba'49assert palindrome('abcdcbxa') == 'abcdcba'50assert palindrome('abcdcbax') == 'abcdcba'51assert palindrome('xabcdcbay') == None52assert palindrome('axbcdcbax') == None53`;5455const PythonTestFnEvaluatorGenerator = (testFn: string): ScenarioEvaluator => {56return (accessor: ITestingServicesAccessor, question: string, answer: string) =>57pythonTestFnEvaluator(accessor, question, answer, testFn);58};5960export const pythonFixEvaluators: { [key: string]: ScenarioEvaluator } = {61'case1.conversation.json': PythonTestFnEvaluatorGenerator(testFnSubArrayMinMaxSum),62'case2.conversation.json': PythonTestFnEvaluatorGenerator(testFnSubArrayMinMaxSum),63'case3.conversation.json': PythonTestFnEvaluatorGenerator(testFnSubArrayMinMaxSum),64'case4.conversation.json': PythonTestFnEvaluatorGenerator(testFnSubArrayMinMaxSum),65'case5.conversation.json': PythonTestFnEvaluatorGenerator(testFnSubArrayMinMaxSum),66'case6.conversation.json': PythonTestFnEvaluatorGenerator(testFnPalindrome),67'case7.conversation.json': PythonTestFnEvaluatorGenerator(testFnPalindrome),68'case8.conversation.json': PythonTestFnEvaluatorGenerator(testFnPalindrome),69'case9.conversation.json': PythonTestFnEvaluatorGenerator(testFnPalindrome),70'case10.conversation.json': PythonTestFnEvaluatorGenerator(testFnPalindrome),71'case11.conversation.json': PythonTestFnEvaluatorGenerator(testFnPalindrome),72'case12.conversation.json': PythonTestFnEvaluatorGenerator(testFnPalindrome),73};747576