@ai-dev-tools/csharp-copilot-core 0.0.30 → 0.0.32

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/out/analyze/generateCodeDependency.js +3 -2
  2. package/out/analyze/generateCodeDependency.js.map +1 -1
  3. package/out/analyze/installAnalyzerTool.js +3 -2
  4. package/out/analyze/installAnalyzerTool.js.map +1 -1
  5. package/out/batch/generateCodeTests.d.ts +2 -2
  6. package/out/batch/generateCodeTests.js +55 -39
  7. package/out/batch/generateCodeTests.js.map +1 -1
  8. package/out/benchmark/generateBenchmarkReport.d.ts +1 -1
  9. package/out/benchmark/generateBenchmarkReport.js +2 -2
  10. package/out/benchmark/generateBenchmarkReport.js.map +1 -1
  11. package/out/codeCoverage/extractCodeCoverageInfo.js +2 -1
  12. package/out/codeCoverage/extractCodeCoverageInfo.js.map +1 -1
  13. package/out/codeCoverage/extractCoverageReportPath.js +2 -1
  14. package/out/codeCoverage/extractCoverageReportPath.js.map +1 -1
  15. package/out/codeCoverage/reportTool.js +2 -1
  16. package/out/codeCoverage/reportTool.js.map +1 -1
  17. package/out/command/index.js +3 -7
  18. package/out/command/index.js.map +1 -1
  19. package/out/command/utGenWrapper.d.ts +0 -1
  20. package/out/command/utGenWrapper.js +30 -23
  21. package/out/command/utGenWrapper.js.map +1 -1
  22. package/out/gen/autoFix.js +5 -1
  23. package/out/gen/autoFix.js.map +1 -1
  24. package/out/gen/postGen/addAiAnnotation.d.ts +1 -0
  25. package/out/gen/postGen/addAiAnnotation.js +57 -0
  26. package/out/gen/postGen/addAiAnnotation.js.map +1 -0
  27. package/out/gen/postGen/extractCodeFromResponse.js +2 -1
  28. package/out/gen/postGen/extractCodeFromResponse.js.map +1 -1
  29. package/out/gen/postGen/postGenProcess.js +2 -0
  30. package/out/gen/postGen/postGenProcess.js.map +1 -1
  31. package/out/gen/postGen/removeSingleLines.js +2 -1
  32. package/out/gen/postGen/removeSingleLines.js.map +1 -1
  33. package/out/gen/postGen/repairRequiredNameSpaces.js +2 -1
  34. package/out/gen/postGen/repairRequiredNameSpaces.js.map +1 -1
  35. package/out/gen/preGen/excludeSpecificTag.js +2 -1
  36. package/out/gen/preGen/excludeSpecificTag.js.map +1 -1
  37. package/out/gen/preGen/validateCode.js +2 -1
  38. package/out/gen/preGen/validateCode.js.map +1 -1
  39. package/out/types/constants.d.ts +4 -0
  40. package/out/types/constants.js +5 -1
  41. package/out/types/constants.js.map +1 -1
  42. package/out/utils/getTestFile.js +2 -0
  43. package/out/utils/getTestFile.js.map +1 -1
  44. package/out/utils/parseBuildResult.js +2 -1
  45. package/out/utils/parseBuildResult.js.map +1 -1
  46. package/out/utils/parseSyntaxCheckResult.js +2 -1
  47. package/out/utils/parseSyntaxCheckResult.js.map +1 -1
  48. package/out/utils/parseVstestResult.js +2 -1
  49. package/out/utils/parseVstestResult.js.map +1 -1
  50. package/out/utils/removeFailedTestMethods.js +2 -1
  51. package/out/utils/removeFailedTestMethods.js.map +1 -1
  52. package/out/utils/writeFailedVerifyResult.d.ts +1 -0
  53. package/out/utils/writeFailedVerifyResult.js +67 -0
  54. package/out/utils/writeFailedVerifyResult.js.map +1 -0
  55. package/out/utils/writeGenCode.d.ts +1 -1
  56. package/out/utils/writeGenCode.js +17 -4
  57. package/out/utils/writeGenCode.js.map +1 -1
  58. package/out/vsPlugin/stdListener.js +1 -1
  59. package/out/vsPlugin/stdListener.js.map +1 -1
  60. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"getTestFile.js","sourceRoot":"","sources":["../../src/utils/getTestFile.ts"],"names":[],"mappings":"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","sourcesContent":["import * as fs from 'fs';\r\nimport * as path from 'path';\r\n\r\nimport { getAssemblyName, getCodeRepoRoot, getSourceFileCsprojFilePath, getSourceFileProjectDir } from './getCodeStructurePath';\r\n\r\nimport { XMLParser } from 'fast-xml-parser';\r\n\r\nconst TEST_NAME_REGEX = /(Test|Tests)/i;\r\nconst TEST_ATTR_REGEX = /\\[(Fact|Theory|TestClass|TestMethod|Test)\\]/;\r\n\r\nfunction findAllCsprojFiles(dir: string, excludedPaths: string[]): string[] {\r\n const results: string[] = [];\r\n const entries = fs.readdirSync(dir, { withFileTypes: true });\r\n\r\n for (const entry of entries) {\r\n const fullPath = path.join(dir, entry.name);\r\n if (entry.name === \".vs\" || excludedPaths.includes(fullPath)) {\r\n continue; // Skip excluded paths\r\n }\r\n\r\n if (entry.isDirectory()) {\r\n results.push(...findAllCsprojFiles(fullPath, excludedPaths));\r\n } else if (entry.isFile() && entry.name.endsWith('.csproj')) {\r\n results.push(fullPath);\r\n }\r\n }\r\n\r\n return results;\r\n}\r\n\r\nfunction isXapTestProject(csprojPath: string): boolean {\r\n try {\r\n const content = fs.readFileSync(csprojPath, 'utf-8');\r\n const parser = new XMLParser({ ignoreAttributes: false, ignoreDeclaration: true });\r\n const json = parser.parse(content);\r\n const project = json.Project;\r\n\r\n const propertyGroups = Array.isArray(project.PropertyGroup)\r\n ? project.PropertyGroup\r\n : [project.PropertyGroup];\r\n\r\n for (const group of propertyGroups) {\r\n if (group.XapProjectType === 'TestProject') {\r\n return true;\r\n }\r\n }\r\n } catch (err: any) {\r\n console.error(`Failed to parse ${csprojPath}: ${err.message}`);\r\n }\r\n return false;\r\n}\r\n\r\nfunction isGeneralTestProject(csprojPath: string): boolean {\r\n try {\r\n const content = fs.readFileSync(csprojPath, 'utf-8');\r\n\r\n // 1. package reference (test framework)\r\n const referencesTestFramework = /<PackageReference\\s+Include=\"(xunit|nunit|MSTest\\.TestFramework|Microsoft\\.NET\\.Test\\.Sdk)\"/i.test(content);\r\n\r\n // 2. file name *.Tests.csproj\r\n const fileNameHasTests = (/\\.Tests\\.csproj$/i.test(path.basename(csprojPath))) || (/\\.Test\\.csproj$/i.test(path.basename(csprojPath)));\r\n\r\n // 3. path contains Tests\r\n const pathHasTests = /[\\\\/](Tests?|UnitTests?|IntegrationTests?)[\\\\/]/i.test(csprojPath);\r\n\r\n // 4. Project SDK is test type (optional)\r\n const sdkIsTestSdk = /<Project\\s+Sdk=\"Microsoft\\.NET\\.Test\\.Sdk\"/i.test(content);\r\n\r\n // 组合判断\r\n return referencesTestFramework || sdkIsTestSdk || fileNameHasTests || pathHasTests;\r\n } catch (err) {\r\n console.error(`can't read csproj file: ${csprojPath}`);\r\n return false;\r\n }\r\n}\r\n\r\nfunction isFalconUnitTestProject(csprojPath: string): boolean {\r\n const xmlContent = fs.readFileSync(csprojPath, 'utf-8');\r\n\r\n const parser = new XMLParser({\r\n ignoreAttributes: false,\r\n attributeNamePrefix: ''\r\n });\r\n const parsed = parser.parse(xmlContent);\r\n\r\n // get PackageReference node\r\n const project = parsed.Project;\r\n const itemGroups = Array.isArray(project.ItemGroup) ? project.ItemGroup : [project.ItemGroup];\r\n\r\n let isFalconUnitTestProject = false;\r\n\r\n for (const group of itemGroups) {\r\n const refs = group.PackageReference;\r\n if (!refs) continue;\r\n\r\n // PackageReference\r\n const refList = Array.isArray(refs) ? refs : [refs];\r\n\r\n for (const ref of refList) {\r\n if (ref.Include === 'Microsoft.Falcon.CodeAnalyzers') {\r\n isFalconUnitTestProject = true;\r\n console.log('Found Microsoft.Falcon.CodeAnalyzers');\r\n break;\r\n }\r\n }\r\n\r\n if (isFalconUnitTestProject) break;\r\n }\r\n\r\n // if (!isFalconUnitTestProject) {\r\n // console.log('Microsoft.Falcon.CodeAnalyzers not found');\r\n // }\r\n\r\n return isFalconUnitTestProject;\r\n}\r\n\r\nfunction isProjectNameMatchedTestProject(csprojPath: string, projectAssemblyName: string, projectName: string) {\r\n const testProjectName = path.basename(csprojPath, '.csproj').toLowerCase();\r\n const fileNameEndWithTests = testProjectName.endsWith('.tests') || testProjectName.endsWith('.test') || testProjectName.endsWith('.unittest') || testProjectName.endsWith('.unittests');\r\n if (testProjectName.startsWith(projectName.toLowerCase()) && fileNameEndWithTests) {\r\n return true;\r\n }\r\n const testProjectAssemblyName = getAssemblyName(csprojPath);\r\n return testProjectAssemblyName?.toLowerCase()?.startsWith(projectAssemblyName.toLowerCase()) && fileNameEndWithTests;\r\n}\r\n\r\nfunction findTestProjectFromCsFile(csFilePath: string): string | null {\r\n let currentDir = path.dirname(csFilePath);\r\n const repoRoot = getCodeRepoRoot(csFilePath);\r\n const projectFilePath = getSourceFileCsprojFilePath(csFilePath);\r\n const projectName = path.basename(projectFilePath, '.csproj');\r\n const projectAssemblyName = getAssemblyName(projectFilePath);\r\n\r\n const excludedPaths: string[] = [currentDir];\r\n const repoRootParentPath = path.dirname(repoRoot);\r\n // Start from the parent directory of the source file, because test project is usually in the parent directory\r\n currentDir = path.dirname(currentDir);\r\n while (currentDir !== repoRootParentPath) {\r\n const csprojFiles = findAllCsprojFiles(currentDir, excludedPaths);\r\n for (const csproj of csprojFiles) {\r\n if (isProjectNameMatchedTestProject(csproj, projectAssemblyName, projectName)) {\r\n return csproj;\r\n } else if (isXapTestProject(csproj)) {\r\n return csproj;\r\n } else if (isFalconUnitTestProject(csproj)) {\r\n const filename = path.basename(csproj, '.csproj').toLowerCase();\r\n if (filename.endsWith('unittest') || filename.endsWith('unittests')) {\r\n return csproj;\r\n }\r\n } else if (isGeneralTestProject(csproj)) {\r\n return csproj;\r\n }\r\n }\r\n // Add current directory to excluded paths to avoid re-checking\r\n excludedPaths.push(currentDir);\r\n currentDir = path.dirname(currentDir);\r\n }\r\n\r\n return null;\r\n}\r\n\r\nfunction findPossibleTestFiles(testProjectDir: string, className: string): string[] {\r\n const results: string[] = [];\r\n const stack: string[] = [testProjectDir];\r\n\r\n while (stack.length > 0) {\r\n const currentDir = stack.pop()!;\r\n const entries = fs.readdirSync(currentDir, { withFileTypes: true });\r\n\r\n for (const entry of entries) {\r\n if (entry.name === \"bin\" || entry.name === \"obj\") {\r\n continue;\r\n }\r\n const fullPath = path.join(currentDir, entry.name);\r\n if (entry.isDirectory()) {\r\n stack.push(fullPath);\r\n } else if (entry.isFile() && entry.name.endsWith('.cs') && entry.name.includes(className)) {\r\n results.push(fullPath);\r\n }\r\n }\r\n }\r\n\r\n return results;\r\n}\r\n\r\nfunction fileContainsTestAttributes(filePath: string): boolean {\r\n const content = fs.readFileSync(filePath, 'utf-8');\r\n return TEST_ATTR_REGEX.test(content);\r\n}\r\n\r\nexport function getExistingTestFile(sourceCodePath: string) {\r\n const absPath = path.resolve(sourceCodePath);\r\n const testProjectPath = findTestProjectFromCsFile(absPath);\r\n\r\n if (!testProjectPath) {\r\n console.error(`No test project found for ${sourceCodePath}`);\r\n return { testFilePath: null, testProjectPath: null };\r\n }\r\n\r\n const testProjectDir = path.dirname(testProjectPath);\r\n const className = path.basename(sourceCodePath, '.cs');\r\n const candidateFiles = findPossibleTestFiles(testProjectDir, className);\r\n\r\n for (const testFilePath of candidateFiles) {\r\n if (TEST_NAME_REGEX.test(path.basename(testFilePath))) {\r\n return { testFilePath, testProjectPath };\r\n }\r\n }\r\n\r\n return { testFilePath: null, testProjectPath: testProjectPath };\r\n}\r\n\r\nfunction createXapTestProject(sourceCodePath: string) {\r\n}\r\n\r\nexport function createTestFile(sourceCodePath: string) {\r\n const testProjectPath = findTestProjectFromCsFile(sourceCodePath);\r\n if (!testProjectPath) {\r\n console.error(`No test project found for ${sourceCodePath}`);\r\n return { testFilePath: null, testProjectPath: null };\r\n }\r\n const sourceFileName = path.basename(sourceCodePath, '.cs');\r\n const testFileName = `${sourceFileName}Tests.cs`;\r\n const sourceFileProjectPath = getSourceFileProjectDir(sourceCodePath);\r\n const sourceFileDir = path.dirname(sourceCodePath);\r\n const testFileRelativePath = sourceFileDir.replace(sourceFileProjectPath, \"\");\r\n const testProjecDir = path.dirname(testProjectPath);\r\n const testFilePath = path.join(testProjecDir, testFileRelativePath, testFileName);\r\n const testFileDir = path.dirname(testFilePath);\r\n // Create all missing directories recursively\r\n fs.mkdirSync(testFileDir, { recursive: true });\r\n console.log(`Created test file dir at ${testFilePath}`);\r\n return { testFilePath, testProjectPath };\r\n}\r\n\r\nexport function getOrCreatTestFile(sourceCodePath: string, testFilePath: string, isXapCode: boolean) {\r\n let finalTestFilePath = testFilePath;\r\n let finalTestProjectPath;\r\n let testFileExist = !!testFilePath && fs.existsSync(testFilePath);\r\n // if outputPath param is not provided, try to find an existing test file\r\n // if no existing test file found, create a new one in test project\r\n if (!testFilePath || testFilePath.trim() === '') {\r\n console.log(' Output path is missing. outputPath:', testFilePath, ', start looking for existing test project');\r\n let result = getExistingTestFile(sourceCodePath);\r\n if (result.testFilePath) {\r\n testFileExist = true;\r\n console.log(`Found existing test file: ${result.testFilePath}`);\r\n } else {\r\n console.log('No existing test file found, creating a new one.');\r\n result = createTestFile(sourceCodePath);\r\n }\r\n finalTestFilePath = result.testFilePath;\r\n finalTestProjectPath = result.testProjectPath;\r\n }\r\n\r\n return { testFilePath: finalTestFilePath, testProjectPath: finalTestProjectPath, testFileExist };\r\n\r\n}\r\n\r\n\r\n\r\n// Example usage\r\n// const csFilePath = \"D:\\\\code\\\\CS.Service.Fundamental\\\\SharedSegments\\\\SharedSegments\\\\SharedSegments.Plugins\\\\Workflows\\\\LocationDetection\\\\AudienceResponseParser.cs\";\r\n// const csFilePath = \"D:\\\\code\\\\msnews-experiences\\\\experiences\\\\weather-right-rail\\\\src\\\\WeatherRightRail.connector.ts\";\r\n// const testProjectPath = \"D:\\\\code\\\\CS.Service.Fundamental\\\\SharedSegments\\\\SharedSegments\\\\SharedSegments.Tests\\\\SharedSegments.Tests.csproj\";\r\n// if (!csFilePath) {\r\n// console.error('Usage: ts-node findTestFile.ts path/to/your/file.cs');\r\n// process.exit(1);\r\n// }\r\n\r\n// const start = Date.now();\r\n// const testFilePath = getExistingTestFile(csFilePath);\r\n// console.log(`Test file for ${csFilePath}:`, testFilePath ?? 'No test file found');\r\n// console.log(`Search completed in ${(Date.now() - start) / 1000} seconds`);\r\n// createXapTestFile(csFilePath);\r\n\r\n// const repoDir = getCodeRepoRoot(\"D:\\\\code\\\\CS.Service.Fundamental\\\\SharedSegments\\\\SharedSegments\\\\SharedSegments.Plugins\\\\Workflows\\\\LocationDetection\\\\AudienceResponseParser.cs\");\r\n// console.log(`Code repository root directory: ${repoDir}`);\r\n\r\n// const result = getExistingTestFile(\"D:\\\\code\\\\CS.Service.Fundamental\\\\SharedSegments\\\\SharedSegments\\\\SharedSegments.Plugins\\\\Workflows\\\\Eplant\\\\EplantConfigManager.cs\");\r\n// console.log(`Test file path: ${result.testFilePath}`);\r\n// console.log(`Test project path: ${result.testProjectPath}`);\r\n\r\n\r\n// falcon test project\r\n// const isFlaconUt = isFalconUnitTestProject(\"D:\\\\code\\\\WeatherNotification\\\\services\\\\WeatherUserInterest\\\\tests\\\\UnitTests\\\\Microsoft.Falcon.WeatherUserInterest.UnitTests.csproj\");\r\n// console.log(`Is Falcon Unit Test Project: ${isFlaconUt}`);\r\n// const testProject = findTestProjectFromCsFile(\"D:\\\\code\\\\WeatherNotification\\\\services\\\\WeatherUserInterest\\\\src\\\\Service\\\\Microsoft.Falcon.WeatherUserInterest.csproj\");\r\n// console.log(`Test project path: ${testProject}`);\r\n// const testFilePath = getOrCreatTestFile(\"D:\\\\code\\\\WeatherNotification\\\\services\\\\WeatherUserInterest\\\\src\\\\Service\\\\Components\\\\IUserInterestTable.cs\", undefined, false);\r\n// console.log(`Test file path: ${testFilePath.testFilePath}`);\r\n\r\n// ads projects\r\n// const testProjectPath = findTestProjectFromCsFile(\"D:\\\\code\\\\UCMDynamics\\\\private\\\\DynamicCode\\\\Plugin\\\\UCMDynamics.AppointmentPlugin\\\\AppointmentOperation.cs\");\r\n// console.log(`Test project path: ${testProjectPath}`);\r\n// const isValid = isGeneralTestProject(\"D:\\\\code\\\\UCMDynamics\\\\private\\\\DynamicCode\\\\Plugin\\\\UcmDynamics.AppointmentPlugin\\\\UcmDynamics.AppointmentPlugin.csproj\");\r\n// // const isValid = isGeneralTestProject(\"D:\\\\code\\\\UCMDynamics\\\\private\\\\DynamicCode\\\\Plugin\\\\UcmDynamics.AppointmentPlugin.Tests\\\\UcmDynamics.AppointmentPlugin.Tests.csproj\");\r\n// console.log(`Is General Test Project: ${isValid}`);\r\n\r\n// const testProjectPath = findTestProjectFromCsFile(\"D:\\\\code\\\\AIUnitTestExample\\\\src\\\\ToListinator.Analyzers\\\\ToListCountAnalyzer.cs\");\r\n// console.log(`Test project path: ${testProjectPath}`);"]}
1
+ {"version":3,"file":"getTestFile.js","sourceRoot":"","sources":["../../src/utils/getTestFile.ts"],"names":[],"mappings":"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","sourcesContent":["import * as fs from 'fs';\r\nimport * as path from 'path';\r\n\r\nimport { getAssemblyName, getCodeRepoRoot, getSourceFileCsprojFilePath, getSourceFileProjectDir } from './getCodeStructurePath';\r\n\r\nimport { XMLParser } from 'fast-xml-parser';\r\n\r\nconst TEST_NAME_REGEX = /(Test|Tests)/i;\r\nconst TEST_ATTR_REGEX = /\\[(Fact|Theory|TestClass|TestMethod|Test)\\]/;\r\n\r\nfunction findAllCsprojFiles(dir: string, excludedPaths: string[]): string[] {\r\n const results: string[] = [];\r\n const entries = fs.readdirSync(dir, { withFileTypes: true });\r\n\r\n for (const entry of entries) {\r\n const fullPath = path.join(dir, entry.name);\r\n if (entry.name === \".vs\" || excludedPaths.includes(fullPath)) {\r\n continue; // Skip excluded paths\r\n }\r\n\r\n if (entry.isDirectory()) {\r\n results.push(...findAllCsprojFiles(fullPath, excludedPaths));\r\n } else if (entry.isFile() && entry.name.endsWith('.csproj')) {\r\n results.push(fullPath);\r\n }\r\n }\r\n\r\n return results;\r\n}\r\n\r\nfunction isXapTestProject(csprojPath: string): boolean {\r\n try {\r\n const content = fs.readFileSync(csprojPath, 'utf-8');\r\n const parser = new XMLParser({ ignoreAttributes: false, ignoreDeclaration: true });\r\n const json = parser.parse(content);\r\n const project = json.Project;\r\n\r\n const propertyGroups = Array.isArray(project.PropertyGroup)\r\n ? project.PropertyGroup\r\n : [project.PropertyGroup];\r\n\r\n for (const group of propertyGroups) {\r\n if (group.XapProjectType === 'TestProject') {\r\n return true;\r\n }\r\n }\r\n } catch (err: any) {\r\n console.error(`Failed to parse ${csprojPath}: ${err.message}`);\r\n }\r\n return false;\r\n}\r\n\r\nfunction isGeneralTestProject(csprojPath: string): boolean {\r\n try {\r\n const content = fs.readFileSync(csprojPath, 'utf-8');\r\n\r\n // 1. package reference (test framework)\r\n const referencesTestFramework = /<PackageReference\\s+Include=\"(xunit|nunit|MSTest\\.TestFramework|Microsoft\\.NET\\.Test\\.Sdk)\"/i.test(content);\r\n\r\n // 2. file name *.Tests.csproj\r\n const fileNameHasTests = (/\\.Tests\\.csproj$/i.test(path.basename(csprojPath))) || (/\\.Test\\.csproj$/i.test(path.basename(csprojPath)));\r\n\r\n // 3. path contains Tests\r\n const pathHasTests = /[\\\\/](Tests?|UnitTests?|IntegrationTests?)[\\\\/]/i.test(csprojPath);\r\n\r\n // 4. Project SDK is test type (optional)\r\n const sdkIsTestSdk = /<Project\\s+Sdk=\"Microsoft\\.NET\\.Test\\.Sdk\"/i.test(content);\r\n\r\n // 组合判断\r\n return referencesTestFramework || sdkIsTestSdk || fileNameHasTests || pathHasTests;\r\n } catch (err) {\r\n console.error(`can't read csproj file: ${csprojPath}`);\r\n return false;\r\n }\r\n}\r\n\r\nfunction isFalconUnitTestProject(csprojPath: string): boolean {\r\n const xmlContent = fs.readFileSync(csprojPath, 'utf-8');\r\n\r\n const parser = new XMLParser({\r\n ignoreAttributes: false,\r\n attributeNamePrefix: ''\r\n });\r\n const parsed = parser.parse(xmlContent);\r\n\r\n // get PackageReference node\r\n const project = parsed.Project;\r\n const itemGroups = Array.isArray(project.ItemGroup) ? project.ItemGroup : [project.ItemGroup];\r\n\r\n let isFalconUnitTestProject = false;\r\n\r\n for (const group of itemGroups) {\r\n if(!group) continue;\r\n const refs = group.PackageReference;\r\n if (!refs) continue;\r\n\r\n // PackageReference\r\n const refList = Array.isArray(refs) ? refs : [refs];\r\n\r\n for (const ref of refList) {\r\n if (ref.Include === 'Microsoft.Falcon.CodeAnalyzers') {\r\n isFalconUnitTestProject = true;\r\n console.log('Found Microsoft.Falcon.CodeAnalyzers');\r\n break;\r\n }\r\n }\r\n\r\n if (isFalconUnitTestProject) break;\r\n }\r\n\r\n // if (!isFalconUnitTestProject) {\r\n // console.log('Microsoft.Falcon.CodeAnalyzers not found');\r\n // }\r\n\r\n return isFalconUnitTestProject;\r\n}\r\n\r\nfunction isProjectNameMatchedTestProject(csprojPath: string, projectAssemblyName: string, projectName: string) {\r\n const testProjectName = path.basename(csprojPath, '.csproj').toLowerCase();\r\n const fileNameEndWithTests = testProjectName.endsWith('.tests') || testProjectName.endsWith('.test') || testProjectName.endsWith('.unittest') || testProjectName.endsWith('.unittests');\r\n if (testProjectName.startsWith(projectName.toLowerCase()) && fileNameEndWithTests) {\r\n return true;\r\n }\r\n const testProjectAssemblyName = getAssemblyName(csprojPath);\r\n return testProjectAssemblyName?.toLowerCase()?.startsWith(projectAssemblyName.toLowerCase()) && fileNameEndWithTests;\r\n}\r\n\r\nfunction findTestProjectFromCsFile(csFilePath: string): string | null {\r\n let currentDir = path.dirname(csFilePath);\r\n const repoRoot = getCodeRepoRoot(csFilePath);\r\n const projectFilePath = getSourceFileCsprojFilePath(csFilePath);\r\n const projectName = path.basename(projectFilePath, '.csproj');\r\n const projectAssemblyName = getAssemblyName(projectFilePath);\r\n\r\n const excludedPaths: string[] = [currentDir];\r\n const repoRootParentPath = path.dirname(repoRoot);\r\n // Start from the parent directory of the source file, because test project is usually in the parent directory\r\n currentDir = path.dirname(currentDir);\r\n while (currentDir !== repoRootParentPath) {\r\n const csprojFiles = findAllCsprojFiles(currentDir, excludedPaths);\r\n for (const csproj of csprojFiles) {\r\n if (isProjectNameMatchedTestProject(csproj, projectAssemblyName, projectName)) {\r\n return csproj;\r\n } else if (isXapTestProject(csproj)) {\r\n return csproj;\r\n } else if (isFalconUnitTestProject(csproj)) {\r\n const filename = path.basename(csproj, '.csproj').toLowerCase();\r\n if (filename.endsWith('unittest') || filename.endsWith('unittests')) {\r\n return csproj;\r\n }\r\n } else if (isGeneralTestProject(csproj)) {\r\n return csproj;\r\n }\r\n }\r\n // Add current directory to excluded paths to avoid re-checking\r\n excludedPaths.push(currentDir);\r\n currentDir = path.dirname(currentDir);\r\n }\r\n\r\n return null;\r\n}\r\n\r\nfunction findPossibleTestFiles(testProjectDir: string, className: string): string[] {\r\n const results: string[] = [];\r\n const stack: string[] = [testProjectDir];\r\n\r\n while (stack.length > 0) {\r\n const currentDir = stack.pop()!;\r\n const entries = fs.readdirSync(currentDir, { withFileTypes: true });\r\n\r\n for (const entry of entries) {\r\n if (entry.name === \"bin\" || entry.name === \"obj\") {\r\n continue;\r\n }\r\n const fullPath = path.join(currentDir, entry.name);\r\n if (entry.isDirectory()) {\r\n stack.push(fullPath);\r\n } else if (entry.isFile() && entry.name.endsWith('.cs') && entry.name.includes(className)) {\r\n results.push(fullPath);\r\n }\r\n }\r\n }\r\n\r\n return results;\r\n}\r\n\r\nfunction fileContainsTestAttributes(filePath: string): boolean {\r\n const content = fs.readFileSync(filePath, 'utf-8');\r\n return TEST_ATTR_REGEX.test(content);\r\n}\r\n\r\nexport function getExistingTestFile(sourceCodePath: string) {\r\n const absPath = path.resolve(sourceCodePath);\r\n const testProjectPath = findTestProjectFromCsFile(absPath);\r\n\r\n if (!testProjectPath) {\r\n console.error(`No test project found for ${sourceCodePath}`);\r\n return { testFilePath: null, testProjectPath: null };\r\n }\r\n\r\n const testProjectDir = path.dirname(testProjectPath);\r\n const className = path.basename(sourceCodePath, '.cs');\r\n const candidateFiles = findPossibleTestFiles(testProjectDir, className);\r\n\r\n for (const testFilePath of candidateFiles) {\r\n if (TEST_NAME_REGEX.test(path.basename(testFilePath))) {\r\n return { testFilePath, testProjectPath };\r\n }\r\n }\r\n\r\n return { testFilePath: null, testProjectPath: testProjectPath };\r\n}\r\n\r\nfunction createXapTestProject(sourceCodePath: string) {\r\n}\r\n\r\nexport function createTestFile(sourceCodePath: string) {\r\n const testProjectPath = findTestProjectFromCsFile(sourceCodePath);\r\n if (!testProjectPath) {\r\n console.error(`No test project found for ${sourceCodePath}`);\r\n return { testFilePath: null, testProjectPath: null };\r\n }\r\n const sourceFileName = path.basename(sourceCodePath, '.cs');\r\n const testFileName = `${sourceFileName}Tests.cs`;\r\n const sourceFileProjectPath = getSourceFileProjectDir(sourceCodePath);\r\n const sourceFileDir = path.dirname(sourceCodePath);\r\n const testFileRelativePath = sourceFileDir.replace(sourceFileProjectPath, \"\");\r\n const testProjecDir = path.dirname(testProjectPath);\r\n const testFilePath = path.join(testProjecDir, testFileRelativePath, testFileName);\r\n const testFileDir = path.dirname(testFilePath);\r\n // Create all missing directories recursively\r\n fs.mkdirSync(testFileDir, { recursive: true });\r\n console.log(`Created test file dir at ${testFilePath}`);\r\n return { testFilePath, testProjectPath };\r\n}\r\n\r\nexport function getOrCreatTestFile(sourceCodePath: string, testFilePath: string, isXapCode: boolean) {\r\n let finalTestFilePath = testFilePath;\r\n let finalTestProjectPath;\r\n let testFileExist = !!testFilePath && fs.existsSync(testFilePath);\r\n // if outputPath param is not provided, try to find an existing test file\r\n // if no existing test file found, create a new one in test project\r\n if (!testFilePath || testFilePath.trim() === '') {\r\n console.log(' Output path is missing. outputPath:', testFilePath, ', start looking for existing test project');\r\n let result = getExistingTestFile(sourceCodePath);\r\n if (result.testFilePath) {\r\n testFileExist = true;\r\n console.log(`Found existing test file: ${result.testFilePath}`);\r\n } else {\r\n console.log('No existing test file found, creating a new one.');\r\n result = createTestFile(sourceCodePath);\r\n }\r\n finalTestFilePath = result.testFilePath;\r\n finalTestProjectPath = result.testProjectPath;\r\n }\r\n\r\n return { testFilePath: finalTestFilePath, testProjectPath: finalTestProjectPath, testFileExist };\r\n\r\n}\r\n\r\n\r\n\r\n// Example usage\r\n// const csFilePath = \"D:\\\\code\\\\CS.Service.Fundamental\\\\SharedSegments\\\\SharedSegments\\\\SharedSegments.Plugins\\\\Workflows\\\\LocationDetection\\\\AudienceResponseParser.cs\";\r\n// const csFilePath = \"D:\\\\code\\\\msnews-experiences\\\\experiences\\\\weather-right-rail\\\\src\\\\WeatherRightRail.connector.ts\";\r\n// const testProjectPath = \"D:\\\\code\\\\CS.Service.Fundamental\\\\SharedSegments\\\\SharedSegments\\\\SharedSegments.Tests\\\\SharedSegments.Tests.csproj\";\r\n// if (!csFilePath) {\r\n// console.error('Usage: ts-node findTestFile.ts path/to/your/file.cs');\r\n// process.exit(1);\r\n// }\r\n\r\n// const start = Date.now();\r\n// const testFilePath = getExistingTestFile(csFilePath);\r\n// console.log(`Test file for ${csFilePath}:`, testFilePath ?? 'No test file found');\r\n// console.log(`Search completed in ${(Date.now() - start) / 1000} seconds`);\r\n// createXapTestFile(csFilePath);\r\n\r\n// const repoDir = getCodeRepoRoot(\"D:\\\\code\\\\CS.Service.Fundamental\\\\SharedSegments\\\\SharedSegments\\\\SharedSegments.Plugins\\\\Workflows\\\\LocationDetection\\\\AudienceResponseParser.cs\");\r\n// console.log(`Code repository root directory: ${repoDir}`);\r\n\r\n// const result = getExistingTestFile(\"D:\\\\code\\\\CS.Service.Fundamental\\\\SharedSegments\\\\SharedSegments\\\\SharedSegments.Plugins\\\\Workflows\\\\Eplant\\\\EplantConfigManager.cs\");\r\n// console.log(`Test file path: ${result.testFilePath}`);\r\n// console.log(`Test project path: ${result.testProjectPath}`);\r\n\r\n\r\n// falcon test project\r\n// const isFlaconUt = isFalconUnitTestProject(\"D:\\\\code\\\\WeatherNotification\\\\services\\\\WeatherUserInterest\\\\tests\\\\UnitTests\\\\Microsoft.Falcon.WeatherUserInterest.UnitTests.csproj\");\r\n// console.log(`Is Falcon Unit Test Project: ${isFlaconUt}`);\r\n// const testProject = findTestProjectFromCsFile(\"D:\\\\code\\\\WeatherNotification\\\\services\\\\WeatherUserInterest\\\\src\\\\Service\\\\Microsoft.Falcon.WeatherUserInterest.csproj\");\r\n// console.log(`Test project path: ${testProject}`);\r\n// const testFilePath = getOrCreatTestFile(\"D:\\\\code\\\\WeatherNotification\\\\services\\\\WeatherUserInterest\\\\src\\\\Service\\\\Components\\\\IUserInterestTable.cs\", undefined, false);\r\n// console.log(`Test file path: ${testFilePath.testFilePath}`);\r\n\r\n// ads projects\r\n// const testProjectPath = findTestProjectFromCsFile(\"D:\\\\code\\\\UCMDynamics\\\\private\\\\DynamicCode\\\\Plugin\\\\UCMDynamics.AppointmentPlugin\\\\AppointmentOperation.cs\");\r\n// console.log(`Test project path: ${testProjectPath}`);\r\n// const isValid = isGeneralTestProject(\"D:\\\\code\\\\UCMDynamics\\\\private\\\\DynamicCode\\\\Plugin\\\\UcmDynamics.AppointmentPlugin\\\\UcmDynamics.AppointmentPlugin.csproj\");\r\n// // const isValid = isGeneralTestProject(\"D:\\\\code\\\\UCMDynamics\\\\private\\\\DynamicCode\\\\Plugin\\\\UcmDynamics.AppointmentPlugin.Tests\\\\UcmDynamics.AppointmentPlugin.Tests.csproj\");\r\n// console.log(`Is General Test Project: ${isValid}`);\r\n\r\n// const testProjectPath = findTestProjectFromCsFile(\"D:\\\\code\\\\AIUnitTestExample\\\\src\\\\ToListinator.Analyzers\\\\ToListCountAnalyzer.cs\");\r\n// console.log(`Test project path: ${testProjectPath}`);"]}
@@ -2,9 +2,10 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.parseMsbuildErrors = parseMsbuildErrors;
4
4
  exports.formatMsbuildResultToMarkdown = formatMsbuildResultToMarkdown;
5
+ const constants_1 = require("../types/constants");
5
6
  function parseMsbuildErrors(buildOutput) {
6
7
  const errors = [];
7
- const lines = buildOutput.split(/\r?\n/);
8
+ const lines = buildOutput.split(constants_1.LINESEPARATOR);
8
9
  const regex = /^(.+\.cs)\((\d+),(\d+)(?:,\d+,\d+)?\): error (\w+): (.+?) \[(.+)\]$/;
9
10
  for (const line of lines) {
10
11
  const trimmed = line.trim();
@@ -1 +1 @@
1
- {"version":3,"file":"parseBuildResult.js","sourceRoot":"","sources":["../../src/utils/parseBuildResult.ts"],"names":[],"mappings":";;AAEA,gDA0BC;AAED,sEAaC;AAzCD,SAAgB,kBAAkB,CAAC,WAAmB;IAClD,MAAM,MAAM,GAAkB,EAAE,CAAC;IACjC,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAEzC,MAAM,KAAK,GAAG,qEAAqE,CAAC;IAEpF,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACvB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC;YAAE,SAAS;QAE5C,OAAO,CAAC,KAAK,CAAC,mBAAmB,EAAE,OAAO,CAAC,CAAC;QAC5C,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAClC,IAAI,KAAK,EAAE,CAAC;YACR,MAAM,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,KAAK,CAAC;YACxE,MAAM,CAAC,IAAI,CAAC;gBACR,IAAI;gBACJ,IAAI,EAAE,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC;gBAC3B,MAAM,EAAE,QAAQ,CAAC,SAAS,EAAE,EAAE,CAAC;gBAC/B,SAAS;gBACT,OAAO;gBACP,OAAO;aACV,CAAC,CAAC;QACP,CAAC;IACL,CAAC;IAED,OAAO,MAAM,CAAC;AAClB,CAAC;AAED,SAAgB,6BAA6B,CAAC,MAAqB;IAC/D,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO,wBAAwB,CAAC;IACpC,CAAC;IAED,OAAO,MAAM;SACR,GAAG,CAAC,GAAG,CAAC,EAAE;QACP,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,SAAS,GAAG,CAAC;QAClC,MAAM,IAAI,GAAG,QAAQ,GAAG,CAAC,IAAI,EAAE,CAAC;QAChC,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;QACxD,OAAO,GAAG,IAAI,IAAI,IAAI,MAAM,OAAO,EAAE,CAAC;IAC1C,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAC;AACpB,CAAC;AAED,qTAAqT;AACrT,0DAA0D","sourcesContent":["import { BuildResult } from \"../types/buildResult\";\r\n\r\nexport function parseMsbuildErrors(buildOutput: string): BuildResult[] {\r\n const errors: BuildResult[] = [];\r\n const lines = buildOutput.split(/\\r?\\n/);\r\n\r\n const regex = /^(.+\\.cs)\\((\\d+),(\\d+)(?:,\\d+,\\d+)?\\): error (\\w+): (.+?) \\[(.+)\\]$/;\r\n\r\n for (const line of lines) {\r\n const trimmed = line.trim();\r\n if (!trimmed.includes(': error ')) continue;\r\n\r\n console.error(\"build error line:\", trimmed);\r\n const match = regex.exec(trimmed);\r\n if (match) {\r\n const [, file, lineStr, columnStr, errorCode, message, project] = match;\r\n errors.push({\r\n file,\r\n line: parseInt(lineStr, 10),\r\n column: parseInt(columnStr, 10),\r\n errorCode,\r\n message,\r\n project,\r\n });\r\n }\r\n }\r\n\r\n return errors;\r\n}\r\n\r\nexport function formatMsbuildResultToMarkdown(errors: BuildResult[]): string {\r\n if (errors.length === 0) {\r\n return `#### No MSBuild Errors`;\r\n }\r\n\r\n return errors\r\n .map(err => {\r\n const code = `[${err.errorCode}]`;\r\n const line = `Line ${err.line}`;\r\n const message = err.message.replace(/\\s+/g, ' ').trim();\r\n return `${code} ${line} - ${message}`;\r\n })\r\n .join('\\n');\r\n}\r\n\r\n// const buildError = parseMsbuildErrors(\"D:\\code\\CS.Service.Fundamental\\SharedSegments\\SharedSegments\\SharedSegments.Tests\\Workflows\\Overview\\HttpRequestParser\\Utils\\SqmidHelperTests.cs(37,58): error CS1503: Argument 1: cannot convert from 'int' to 'System.Collections.Generic.IDictionary<string, string>'\");\r\n// console.log(formatMsbuildResultToMarkdown(buildError));"]}
1
+ {"version":3,"file":"parseBuildResult.js","sourceRoot":"","sources":["../../src/utils/parseBuildResult.ts"],"names":[],"mappings":";;AAGA,gDA0BC;AAED,sEAaC;AA3CD,kDAAmD;AAEnD,SAAgB,kBAAkB,CAAC,WAAmB;IAClD,MAAM,MAAM,GAAkB,EAAE,CAAC;IACjC,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,yBAAa,CAAC,CAAC;IAE/C,MAAM,KAAK,GAAG,qEAAqE,CAAC;IAEpF,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACvB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC;YAAE,SAAS;QAE5C,OAAO,CAAC,KAAK,CAAC,mBAAmB,EAAE,OAAO,CAAC,CAAC;QAC5C,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAClC,IAAI,KAAK,EAAE,CAAC;YACR,MAAM,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,KAAK,CAAC;YACxE,MAAM,CAAC,IAAI,CAAC;gBACR,IAAI;gBACJ,IAAI,EAAE,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC;gBAC3B,MAAM,EAAE,QAAQ,CAAC,SAAS,EAAE,EAAE,CAAC;gBAC/B,SAAS;gBACT,OAAO;gBACP,OAAO;aACV,CAAC,CAAC;QACP,CAAC;IACL,CAAC;IAED,OAAO,MAAM,CAAC;AAClB,CAAC;AAED,SAAgB,6BAA6B,CAAC,MAAqB;IAC/D,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO,wBAAwB,CAAC;IACpC,CAAC;IAED,OAAO,MAAM;SACR,GAAG,CAAC,GAAG,CAAC,EAAE;QACP,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,SAAS,GAAG,CAAC;QAClC,MAAM,IAAI,GAAG,QAAQ,GAAG,CAAC,IAAI,EAAE,CAAC;QAChC,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;QACxD,OAAO,GAAG,IAAI,IAAI,IAAI,MAAM,OAAO,EAAE,CAAC;IAC1C,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAC;AACpB,CAAC;AAED,qTAAqT;AACrT,0DAA0D","sourcesContent":["import { BuildResult } from \"../types/buildResult\";\r\nimport { LINESEPARATOR } from \"../types/constants\";\r\n\r\nexport function parseMsbuildErrors(buildOutput: string): BuildResult[] {\r\n const errors: BuildResult[] = [];\r\n const lines = buildOutput.split(LINESEPARATOR);\r\n\r\n const regex = /^(.+\\.cs)\\((\\d+),(\\d+)(?:,\\d+,\\d+)?\\): error (\\w+): (.+?) \\[(.+)\\]$/;\r\n\r\n for (const line of lines) {\r\n const trimmed = line.trim();\r\n if (!trimmed.includes(': error ')) continue;\r\n\r\n console.error(\"build error line:\", trimmed);\r\n const match = regex.exec(trimmed);\r\n if (match) {\r\n const [, file, lineStr, columnStr, errorCode, message, project] = match;\r\n errors.push({\r\n file,\r\n line: parseInt(lineStr, 10),\r\n column: parseInt(columnStr, 10),\r\n errorCode,\r\n message,\r\n project,\r\n });\r\n }\r\n }\r\n\r\n return errors;\r\n}\r\n\r\nexport function formatMsbuildResultToMarkdown(errors: BuildResult[]): string {\r\n if (errors.length === 0) {\r\n return `#### No MSBuild Errors`;\r\n }\r\n\r\n return errors\r\n .map(err => {\r\n const code = `[${err.errorCode}]`;\r\n const line = `Line ${err.line}`;\r\n const message = err.message.replace(/\\s+/g, ' ').trim();\r\n return `${code} ${line} - ${message}`;\r\n })\r\n .join('\\n');\r\n}\r\n\r\n// const buildError = parseMsbuildErrors(\"D:\\code\\CS.Service.Fundamental\\SharedSegments\\SharedSegments\\SharedSegments.Tests\\Workflows\\Overview\\HttpRequestParser\\Utils\\SqmidHelperTests.cs(37,58): error CS1503: Argument 1: cannot convert from 'int' to 'System.Collections.Generic.IDictionary<string, string>'\");\r\n// console.log(formatMsbuildResultToMarkdown(buildError));"]}
@@ -1,9 +1,10 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.parseSyntaxCheckErrors = parseSyntaxCheckErrors;
4
+ const constants_1 = require("../types/constants");
4
5
  function parseSyntaxCheckErrors(testFilePath, errorText) {
5
6
  const result = [];
6
- const lines = errorText.split(/\r?\n/).map(line => line.trim()).filter(line => line.length > 0);
7
+ const lines = errorText.split(constants_1.LINESEPARATOR).map(line => line.trim()).filter(line => line.length > 0);
7
8
  const regex = /^\((\d+),(\d+)\):\s+error\s+(CS\d+):\s+(.+)$/;
8
9
  for (const line of lines) {
9
10
  const match = line.match(regex);
@@ -1 +1 @@
1
- {"version":3,"file":"parseSyntaxCheckResult.js","sourceRoot":"","sources":["../../src/utils/parseSyntaxCheckResult.ts"],"names":[],"mappings":";;AAEA,wDAuBC;AAvBD,SAAgB,sBAAsB,CAAC,YAAoB,EAAE,SAAiB;IAC1E,MAAM,MAAM,GAAkB,EAAE,CAAC;IAEjC,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAEhG,MAAM,KAAK,GAAG,8CAA8C,CAAC;IAE7D,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACvB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAChC,IAAI,KAAK,EAAE,CAAC;YACR,MAAM,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,CAAC,GAAG,KAAK,CAAC;YACzD,MAAM,CAAC,IAAI,CAAC;gBACR,IAAI,EAAE,YAAY;gBAClB,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC;gBACrB,MAAM,EAAE,MAAM,CAAC,SAAS,CAAC;gBACzB,SAAS;gBACT,OAAO;gBACP,OAAO,EAAE,EAAE;aACd,CAAC,CAAC;QACP,CAAC;IACL,CAAC;IAED,OAAO,MAAM,CAAC;AAClB,CAAC;AAED,0BAA0B;AAC1B,oCAAoC;AACpC,oCAAoC;AACpC,oCAAoC;AACpC,yJAAyJ;AACzJ,yJAAyJ;AACzJ,4FAA4F;AAC5F,yJAAyJ;AACzJ,yJAAyJ;AACzJ,KAAK;AAEL,iEAAiE;AACjE,+BAA+B;AAC/B,4JAA4J;AAC5J,MAAM","sourcesContent":["import { BuildResult } from \"../types/buildResult\";\r\n\r\nexport function parseSyntaxCheckErrors(testFilePath: string, errorText: string): BuildResult[] {\r\n const result: BuildResult[] = [];\r\n\r\n const lines = errorText.split(/\\r?\\n/).map(line => line.trim()).filter(line => line.length > 0);\r\n\r\n const regex = /^\\((\\d+),(\\d+)\\):\\s+error\\s+(CS\\d+):\\s+(.+)$/;\r\n\r\n for (const line of lines) {\r\n const match = line.match(regex);\r\n if (match) {\r\n const [, lineStr, columnStr, errorCode, message] = match;\r\n result.push({\r\n file: testFilePath,\r\n line: Number(lineStr),\r\n column: Number(columnStr),\r\n errorCode,\r\n message,\r\n project: \"\"\r\n });\r\n }\r\n }\r\n\r\n return result;\r\n}\r\n\r\n// const buildErrorStr = `\r\n// (74,62): error CS1513: } expected\r\n// (74,62): error CS1513: } expected\r\n// (74,62): error CS1513: } expected\r\n// (23,60): error CS0246: The type or namespace name 'OneServiceRequest' could not be found (are you missing a using directive or an assembly reference?)\r\n// (36,60): error CS0246: The type or namespace name 'OneServiceRequest' could not be found (are you missing a using directive or an assembly reference?)\r\n// (38,44): error CS0103: The name 'WeatherParameters' does not exist in the current context\r\n// (48,60): error CS0246: The type or namespace name 'OneServiceRequest' could not be found (are you missing a using directive or an assembly reference?)\r\n// (63,60): error CS0246: The type or namespace name 'OneServiceRequest' could not be found (are you missing a using directive or an assembly reference?)\r\n// `;\r\n\r\n// const buildErrors = parseSyntaxCheckErrors(\"\", buildErrorStr);\r\n// buildErrors.forEach(err => {\r\n// console.log(`File: ${err.file}, Line: ${err.line}, Column: ${err.column}, Code: ${err.errorCode}, Message: ${err.message}, Project: ${err.project}`);\r\n// });"]}
1
+ {"version":3,"file":"parseSyntaxCheckResult.js","sourceRoot":"","sources":["../../src/utils/parseSyntaxCheckResult.ts"],"names":[],"mappings":";;AAGA,wDAuBC;AAzBD,kDAAmD;AAEnD,SAAgB,sBAAsB,CAAC,YAAoB,EAAE,SAAiB;IAC1E,MAAM,MAAM,GAAkB,EAAE,CAAC;IAEjC,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,yBAAa,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAEtG,MAAM,KAAK,GAAG,8CAA8C,CAAC;IAE7D,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACvB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAChC,IAAI,KAAK,EAAE,CAAC;YACR,MAAM,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,CAAC,GAAG,KAAK,CAAC;YACzD,MAAM,CAAC,IAAI,CAAC;gBACR,IAAI,EAAE,YAAY;gBAClB,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC;gBACrB,MAAM,EAAE,MAAM,CAAC,SAAS,CAAC;gBACzB,SAAS;gBACT,OAAO;gBACP,OAAO,EAAE,EAAE;aACd,CAAC,CAAC;QACP,CAAC;IACL,CAAC;IAED,OAAO,MAAM,CAAC;AAClB,CAAC;AAED,0BAA0B;AAC1B,oCAAoC;AACpC,oCAAoC;AACpC,oCAAoC;AACpC,yJAAyJ;AACzJ,yJAAyJ;AACzJ,4FAA4F;AAC5F,yJAAyJ;AACzJ,yJAAyJ;AACzJ,KAAK;AAEL,iEAAiE;AACjE,+BAA+B;AAC/B,4JAA4J;AAC5J,MAAM","sourcesContent":["import { BuildResult } from \"../types/buildResult\";\r\nimport { LINESEPARATOR } from \"../types/constants\";\r\n\r\nexport function parseSyntaxCheckErrors(testFilePath: string, errorText: string): BuildResult[] {\r\n const result: BuildResult[] = [];\r\n\r\n const lines = errorText.split(LINESEPARATOR).map(line => line.trim()).filter(line => line.length > 0);\r\n\r\n const regex = /^\\((\\d+),(\\d+)\\):\\s+error\\s+(CS\\d+):\\s+(.+)$/;\r\n\r\n for (const line of lines) {\r\n const match = line.match(regex);\r\n if (match) {\r\n const [, lineStr, columnStr, errorCode, message] = match;\r\n result.push({\r\n file: testFilePath,\r\n line: Number(lineStr),\r\n column: Number(columnStr),\r\n errorCode,\r\n message,\r\n project: \"\"\r\n });\r\n }\r\n }\r\n\r\n return result;\r\n}\r\n\r\n// const buildErrorStr = `\r\n// (74,62): error CS1513: } expected\r\n// (74,62): error CS1513: } expected\r\n// (74,62): error CS1513: } expected\r\n// (23,60): error CS0246: The type or namespace name 'OneServiceRequest' could not be found (are you missing a using directive or an assembly reference?)\r\n// (36,60): error CS0246: The type or namespace name 'OneServiceRequest' could not be found (are you missing a using directive or an assembly reference?)\r\n// (38,44): error CS0103: The name 'WeatherParameters' does not exist in the current context\r\n// (48,60): error CS0246: The type or namespace name 'OneServiceRequest' could not be found (are you missing a using directive or an assembly reference?)\r\n// (63,60): error CS0246: The type or namespace name 'OneServiceRequest' could not be found (are you missing a using directive or an assembly reference?)\r\n// `;\r\n\r\n// const buildErrors = parseSyntaxCheckErrors(\"\", buildErrorStr);\r\n// buildErrors.forEach(err => {\r\n// console.log(`File: ${err.file}, Line: ${err.line}, Column: ${err.column}, Code: ${err.errorCode}, Message: ${err.message}, Project: ${err.project}`);\r\n// });"]}
@@ -2,10 +2,11 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.parseVSTestOutput = parseVSTestOutput;
4
4
  exports.formatVSTestResultToMarkdown = formatVSTestResultToMarkdown;
5
+ const constants_1 = require("../types/constants");
5
6
  function parseVSTestOutput(output) {
6
7
  const passedTests = [];
7
8
  const failedTests = [];
8
- const lines = output.split(/\r?\n/);
9
+ const lines = output.split(constants_1.LINESEPARATOR);
9
10
  let currentFailedTest = null;
10
11
  for (let i = 0; i < lines.length; i++) {
11
12
  const line = lines[i].trim();
@@ -1 +1 @@
1
- {"version":3,"file":"parseVstestResult.js","sourceRoot":"","sources":["../../src/utils/parseVstestResult.ts"],"names":[],"mappings":"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","sourcesContent":["import { FailedTest, TestResult } from \"../types/testResult\";\r\n\r\nexport function parseVSTestOutput(output: string): TestResult {\r\n const passedTests: string[] = [];\r\n const failedTests: FailedTest[] = [];\r\n\r\n const lines = output.split(/\\r?\\n/);\r\n let currentFailedTest: FailedTest | null = null;\r\n\r\n for (let i = 0; i < lines.length; i++) {\r\n const line = lines[i].trim();\r\n\r\n // Match Passed tests\r\n const passMatch = line.match(/^Passed (.+) \\[/);\r\n if (passMatch) {\r\n passedTests.push(passMatch[1]);\r\n continue;\r\n }\r\n\r\n // Match Failed tests\r\n const failMatch = line.match(/^Failed (.+) \\[/);\r\n if (failMatch) {\r\n currentFailedTest = {\r\n name: failMatch[1],\r\n errorMessage: '',\r\n stackTrace: ''\r\n };\r\n\r\n // Read error message\r\n i+=2; // skip \"Error Message:\"\r\n const errorMessageLines: string[] = [];\r\n while (i < lines.length && !lines[i].trim().startsWith('Stack Trace:')) {\r\n errorMessageLines.push(lines[i].trim());\r\n i++;\r\n }\r\n currentFailedTest.errorMessage = errorMessageLines.join('\\n');\r\n\r\n // Read stack trace\r\n i++; // skip \"Stack Trace:\"\r\n const stackTraceLines: string[] = [];\r\n while (i < lines.length && lines[i].trim() !== '') {\r\n stackTraceLines.push(lines[i].trim());\r\n i++;\r\n }\r\n currentFailedTest.stackTrace = stackTraceLines.join('\\n');\r\n\r\n failedTests.push(currentFailedTest);\r\n currentFailedTest = null;\r\n }\r\n }\r\n\r\n return { passedTests, failedTests, totalTests: passedTests.length + failedTests.length, passed: passedTests.length, failed: failedTests.length };\r\n}\r\n\r\n\r\nexport function formatVSTestResultToMarkdown(result: TestResult): string {\r\n const lines: string[] = [];\r\n result.failedTests.forEach(test => {\r\n const lineNumbers = Array.from(\r\n test.stackTrace.matchAll(/:line (\\d+)/g)\r\n ).map(m => m[1]);\r\n\r\n lines.push(`#### ${test.name}`);\r\n if (lineNumbers.length > 0) {\r\n lines.push(`**line**: ${lineNumbers.join(', ')}`);\r\n }\r\n \r\n lines.push(`**Error Message**: ${test.errorMessage}`);\r\n lines.push('');\r\n });\r\n\r\n return lines.join('\\n');\r\n}"]}
1
+ {"version":3,"file":"parseVstestResult.js","sourceRoot":"","sources":["../../src/utils/parseVstestResult.ts"],"names":[],"mappings":"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","sourcesContent":["import { LINESEPARATOR } from \"../types/constants\";\r\nimport { FailedTest, TestResult } from \"../types/testResult\";\r\n\r\nexport function parseVSTestOutput(output: string): TestResult {\r\n const passedTests: string[] = [];\r\n const failedTests: FailedTest[] = [];\r\n\r\n const lines = output.split(LINESEPARATOR);\r\n let currentFailedTest: FailedTest | null = null;\r\n\r\n for (let i = 0; i < lines.length; i++) {\r\n const line = lines[i].trim();\r\n\r\n // Match Passed tests\r\n const passMatch = line.match(/^Passed (.+) \\[/);\r\n if (passMatch) {\r\n passedTests.push(passMatch[1]);\r\n continue;\r\n }\r\n\r\n // Match Failed tests\r\n const failMatch = line.match(/^Failed (.+) \\[/);\r\n if (failMatch) {\r\n currentFailedTest = {\r\n name: failMatch[1],\r\n errorMessage: '',\r\n stackTrace: ''\r\n };\r\n\r\n // Read error message\r\n i+=2; // skip \"Error Message:\"\r\n const errorMessageLines: string[] = [];\r\n while (i < lines.length && !lines[i].trim().startsWith('Stack Trace:')) {\r\n errorMessageLines.push(lines[i].trim());\r\n i++;\r\n }\r\n currentFailedTest.errorMessage = errorMessageLines.join('\\n');\r\n\r\n // Read stack trace\r\n i++; // skip \"Stack Trace:\"\r\n const stackTraceLines: string[] = [];\r\n while (i < lines.length && lines[i].trim() !== '') {\r\n stackTraceLines.push(lines[i].trim());\r\n i++;\r\n }\r\n currentFailedTest.stackTrace = stackTraceLines.join('\\n');\r\n\r\n failedTests.push(currentFailedTest);\r\n currentFailedTest = null;\r\n }\r\n }\r\n\r\n return { passedTests, failedTests, totalTests: passedTests.length + failedTests.length, passed: passedTests.length, failed: failedTests.length };\r\n}\r\n\r\n\r\nexport function formatVSTestResultToMarkdown(result: TestResult): string {\r\n const lines: string[] = [];\r\n result.failedTests.forEach(test => {\r\n const lineNumbers = Array.from(\r\n test.stackTrace.matchAll(/:line (\\d+)/g)\r\n ).map(m => m[1]);\r\n\r\n lines.push(`#### ${test.name}`);\r\n if (lineNumbers.length > 0) {\r\n lines.push(`**line**: ${lineNumbers.join(', ')}`);\r\n }\r\n \r\n lines.push(`**Error Message**: ${test.errorMessage}`);\r\n lines.push('');\r\n });\r\n\r\n return lines.join('\\n');\r\n}"]}
@@ -36,13 +36,14 @@ Object.defineProperty(exports, "__esModule", { value: true });
36
36
  exports.removeFailedTests = removeFailedTests;
37
37
  exports.removeFailedTestCasesInTestFile = removeFailedTestCasesInTestFile;
38
38
  const fs = __importStar(require("fs"));
39
+ const constants_1 = require("../types/constants");
39
40
  function removeFailedTests(filePath, failedTestNames) {
40
41
  try {
41
42
  if (!fs.existsSync(filePath)) {
42
43
  throw new Error(`File not exist ${filePath}`);
43
44
  }
44
45
  const content = fs.readFileSync(filePath, 'utf-8');
45
- const lines = content.split(/\r?\n/);
46
+ const lines = content.split(constants_1.LINESEPARATOR);
46
47
  // get all test methods in the file
47
48
  const testMethods = findTestMethods(lines);
48
49
  // filter out methods that match the failed test names
@@ -1 +1 @@
1
- {"version":3,"file":"removeFailedTestMethods.js","sourceRoot":"","sources":["../../src/utils/removeFailedTestMethods.ts"],"names":[],"mappings":"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","sourcesContent":["import * as fs from 'fs';\r\n\r\nimport { TestResult } from '../types/testResult';\r\n\r\ninterface TestMethodInfo {\r\n startLine: number;\r\n endLine: number;\r\n methodName: string;\r\n}\r\n\r\nexport function removeFailedTests(filePath: string, failedTestNames: string[]) {\r\n try {\r\n if (!fs.existsSync(filePath)) {\r\n throw new Error(`File not exist ${filePath}`);\r\n }\r\n\r\n const content = fs.readFileSync(filePath, 'utf-8');\r\n const lines = content.split(/\\r?\\n/);\r\n\r\n // get all test methods in the file\r\n const testMethods = findTestMethods(lines);\r\n\r\n // filter out methods that match the failed test names\r\n const methodsToRemove = testMethods.filter(method =>\r\n failedTestNames.includes(method.methodName)\r\n );\r\n\r\n if (methodsToRemove.length === 0) {\r\n console.log('Can not find any failed test methods to remove.');\r\n return;\r\n }\r\n\r\n // sort methods by start line in descending order\r\n // to avoid index issues when removing lines\r\n methodsToRemove.sort((a, b) => b.startLine - a.startLine);\r\n\r\n // delete the test methods from the lines\r\n let modifiedLines = [...lines];\r\n for (const method of methodsToRemove) {\r\n modifiedLines = removeTestMethod(modifiedLines, method);\r\n }\r\n\r\n // cleanup empty lines\r\n modifiedLines = cleanupEmptyLines(modifiedLines);\r\n\r\n\r\n const modifiedContent = modifiedLines.join('\\n');\r\n return modifiedContent;\r\n\r\n } catch (error) {\r\n console.error('Error removing failed tests:', error);\r\n throw error;\r\n }\r\n}\r\n\r\n/**\r\n * find all test methods in the file\r\n */\r\nfunction findTestMethods(lines: string[]): TestMethodInfo[] {\r\n const testMethods: TestMethodInfo[] = [];\r\n\r\n for (let i = 0; i < lines.length; i++) {\r\n const line = lines[i].trim();\r\n\r\n // find [TestMethod] attribute\r\n if (line === '[TestMethod]' || line.startsWith('[TestMethod(')) {\r\n // find the method definition starting from this line\r\n const methodInfo = findMethodDefinition(lines, i);\r\n if (methodInfo) {\r\n testMethods.push(methodInfo);\r\n }\r\n }\r\n }\r\n\r\n return testMethods;\r\n}\r\n\r\n/**\r\n * find the method definition based on the line number of [TestMethod]\r\n */\r\nfunction findMethodDefinition(lines: string[], testMethodLine: number): TestMethodInfo | null {\r\n let methodStartLine = testMethodLine;\r\n let methodName = '';\r\n let braceCount = 0;\r\n let methodFound = false;\r\n let methodEndLine = -1;\r\n\r\n // find the start of the method definition\r\n while (methodStartLine > 0 &&\r\n (lines[methodStartLine - 1].trim() === '' ||\r\n lines[methodStartLine - 1].trim().startsWith('['))) {\r\n methodStartLine--;\r\n }\r\n\r\n // find the method definition starting from the line after [TestMethod]\r\n for (let i = testMethodLine; i < lines.length; i++) {\r\n const line = lines[i].trim();\r\n\r\n // skip empty lines and section headers\r\n if (line === '' || line.startsWith('[')) {\r\n continue;\r\n }\r\n\r\n // find the method definition\r\n if (!methodFound && isMethodDefinition(line)) {\r\n methodName = extractMethodName(line);\r\n methodFound = true;\r\n\r\n // if the method is defined in a single line, we can directly set the end line\r\n const openBraces = (line.match(/{/g) || []).length;\r\n const closeBraces = (line.match(/}/g) || []).length;\r\n braceCount += openBraces - closeBraces;\r\n\r\n if (braceCount === 0 && openBraces > 0) {\r\n // single line method definition\r\n methodEndLine = i;\r\n break;\r\n }\r\n continue;\r\n }\r\n\r\n // if we have found the method definition, count braces\r\n if (methodFound) {\r\n const openBraces = (line.match(/{/g) || []).length;\r\n const closeBraces = (line.match(/}/g) || []).length;\r\n braceCount += openBraces - closeBraces;\r\n\r\n if (braceCount === 0) {\r\n methodEndLine = i;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n if (methodFound && methodEndLine !== -1) {\r\n return {\r\n startLine: methodStartLine,\r\n endLine: methodEndLine,\r\n methodName: methodName\r\n };\r\n }\r\n\r\n return null;\r\n}\r\n\r\n/**\r\n * check if a line is a method definition\r\n */\r\nfunction isMethodDefinition(line: string): boolean {\r\n // simple regex to match method definitions\r\n // supports public, protected, internal, static, async, and method name with parameters\r\n const methodPattern = /^\\s*(public|function|protected|internal)?\\s*(static\\s+)?(async\\s+)?\\w+\\s+\\w+\\s*\\(/;\r\n return methodPattern.test(line);\r\n}\r\n\r\n/**\r\n * extract method name from a method definition line\r\n */\r\nfunction extractMethodName(line: string): string {\r\n const match = line.match(/\\b(\\w+)\\s*\\(/);\r\n return match ? match[1] : '';\r\n}\r\n\r\n/**\r\n * delete specific testt method block from lines\r\n */\r\nfunction removeTestMethod(lines: string[], method: TestMethodInfo): string[] {\r\n const newLines = [...lines];\r\n\r\n // delete methodn block(include [TestMethod] tag)\r\n newLines.splice(method.startLine, method.endLine - method.startLine + 1);\r\n\r\n return newLines;\r\n}\r\n\r\n/**\r\n * clean extra empty line, ensure only one empty line between methods\r\n */\r\nfunction cleanupEmptyLines(lines: string[]): string[] {\r\n const result: string[] = [];\r\n let emptyLineCount = 0;\r\n\r\n for (let i = 0; i < lines.length; i++) {\r\n const line = lines[i];\r\n const isEmptyLine = line.trim() === '';\r\n\r\n if (isEmptyLine) {\r\n emptyLineCount++;\r\n // keep one empty line between methods\r\n if (emptyLineCount === 1) {\r\n result.push(line);\r\n }\r\n } else {\r\n emptyLineCount = 0;\r\n result.push(line);\r\n }\r\n }\r\n\r\n // remove trailing empty lines\r\n while (result.length > 0 && result[result.length - 1].trim() === '') {\r\n result.pop();\r\n }\r\n\r\n return result;\r\n}\r\n\r\n\r\nexport function removeFailedTestCasesInTestFile(vsTestRes: TestResult, testFilePath: string): void {\r\n const failedTestMethods = vsTestRes?.failedTests?.map(test => test.name) || [];\r\n const succeedTestCode = removeFailedTests(testFilePath, failedTestMethods);\r\n fs.writeFileSync(testFilePath, succeedTestCode, 'utf-8');\r\n console.log(`Removed failed test cases from file: ${testFilePath}`);\r\n}\r\n\r\n// const testCode = removeFailedTests(\"D:\\\\code\\\\CS.Service.Fundamental\\\\SharedSegments\\\\SharedSegments\\\\SharedSegments.Tests\\\\Workflows\\\\Overview\\\\HttpRequestParser\\\\Utils\\\\SqmidHelperTests.cs\", [\"GetSqmidFromCookie_InvalidBlisIdFormat_ReturnsEmptyString\", \"GetSqmidFromCookie_MissingUsrLocCookie_ReturnsEmptyString\"]);\r\n// console.log(testCode);"]}
1
+ {"version":3,"file":"removeFailedTestMethods.js","sourceRoot":"","sources":["../../src/utils/removeFailedTestMethods.ts"],"names":[],"mappings":"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","sourcesContent":["import * as fs from 'fs';\r\n\r\nimport { TestResult } from '../types/testResult';\r\nimport { LINESEPARATOR } from '../types/constants';\r\n\r\ninterface TestMethodInfo {\r\n startLine: number;\r\n endLine: number;\r\n methodName: string;\r\n}\r\n\r\nexport function removeFailedTests(filePath: string, failedTestNames: string[]) {\r\n try {\r\n if (!fs.existsSync(filePath)) {\r\n throw new Error(`File not exist ${filePath}`);\r\n }\r\n\r\n const content = fs.readFileSync(filePath, 'utf-8');\r\n const lines = content.split(LINESEPARATOR);\r\n\r\n // get all test methods in the file\r\n const testMethods = findTestMethods(lines);\r\n\r\n // filter out methods that match the failed test names\r\n const methodsToRemove = testMethods.filter(method =>\r\n failedTestNames.includes(method.methodName)\r\n );\r\n\r\n if (methodsToRemove.length === 0) {\r\n console.log('Can not find any failed test methods to remove.');\r\n return;\r\n }\r\n\r\n // sort methods by start line in descending order\r\n // to avoid index issues when removing lines\r\n methodsToRemove.sort((a, b) => b.startLine - a.startLine);\r\n\r\n // delete the test methods from the lines\r\n let modifiedLines = [...lines];\r\n for (const method of methodsToRemove) {\r\n modifiedLines = removeTestMethod(modifiedLines, method);\r\n }\r\n\r\n // cleanup empty lines\r\n modifiedLines = cleanupEmptyLines(modifiedLines);\r\n\r\n\r\n const modifiedContent = modifiedLines.join('\\n');\r\n return modifiedContent;\r\n\r\n } catch (error) {\r\n console.error('Error removing failed tests:', error);\r\n throw error;\r\n }\r\n}\r\n\r\n/**\r\n * find all test methods in the file\r\n */\r\nfunction findTestMethods(lines: string[]): TestMethodInfo[] {\r\n const testMethods: TestMethodInfo[] = [];\r\n\r\n for (let i = 0; i < lines.length; i++) {\r\n const line = lines[i].trim();\r\n\r\n // find [TestMethod] attribute\r\n if (line === '[TestMethod]' || line.startsWith('[TestMethod(')) {\r\n // find the method definition starting from this line\r\n const methodInfo = findMethodDefinition(lines, i);\r\n if (methodInfo) {\r\n testMethods.push(methodInfo);\r\n }\r\n }\r\n }\r\n\r\n return testMethods;\r\n}\r\n\r\n/**\r\n * find the method definition based on the line number of [TestMethod]\r\n */\r\nfunction findMethodDefinition(lines: string[], testMethodLine: number): TestMethodInfo | null {\r\n let methodStartLine = testMethodLine;\r\n let methodName = '';\r\n let braceCount = 0;\r\n let methodFound = false;\r\n let methodEndLine = -1;\r\n\r\n // find the start of the method definition\r\n while (methodStartLine > 0 &&\r\n (lines[methodStartLine - 1].trim() === '' ||\r\n lines[methodStartLine - 1].trim().startsWith('['))) {\r\n methodStartLine--;\r\n }\r\n\r\n // find the method definition starting from the line after [TestMethod]\r\n for (let i = testMethodLine; i < lines.length; i++) {\r\n const line = lines[i].trim();\r\n\r\n // skip empty lines and section headers\r\n if (line === '' || line.startsWith('[')) {\r\n continue;\r\n }\r\n\r\n // find the method definition\r\n if (!methodFound && isMethodDefinition(line)) {\r\n methodName = extractMethodName(line);\r\n methodFound = true;\r\n\r\n // if the method is defined in a single line, we can directly set the end line\r\n const openBraces = (line.match(/{/g) || []).length;\r\n const closeBraces = (line.match(/}/g) || []).length;\r\n braceCount += openBraces - closeBraces;\r\n\r\n if (braceCount === 0 && openBraces > 0) {\r\n // single line method definition\r\n methodEndLine = i;\r\n break;\r\n }\r\n continue;\r\n }\r\n\r\n // if we have found the method definition, count braces\r\n if (methodFound) {\r\n const openBraces = (line.match(/{/g) || []).length;\r\n const closeBraces = (line.match(/}/g) || []).length;\r\n braceCount += openBraces - closeBraces;\r\n\r\n if (braceCount === 0) {\r\n methodEndLine = i;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n if (methodFound && methodEndLine !== -1) {\r\n return {\r\n startLine: methodStartLine,\r\n endLine: methodEndLine,\r\n methodName: methodName\r\n };\r\n }\r\n\r\n return null;\r\n}\r\n\r\n/**\r\n * check if a line is a method definition\r\n */\r\nfunction isMethodDefinition(line: string): boolean {\r\n // simple regex to match method definitions\r\n // supports public, protected, internal, static, async, and method name with parameters\r\n const methodPattern = /^\\s*(public|function|protected|internal)?\\s*(static\\s+)?(async\\s+)?\\w+\\s+\\w+\\s*\\(/;\r\n return methodPattern.test(line);\r\n}\r\n\r\n/**\r\n * extract method name from a method definition line\r\n */\r\nfunction extractMethodName(line: string): string {\r\n const match = line.match(/\\b(\\w+)\\s*\\(/);\r\n return match ? match[1] : '';\r\n}\r\n\r\n/**\r\n * delete specific testt method block from lines\r\n */\r\nfunction removeTestMethod(lines: string[], method: TestMethodInfo): string[] {\r\n const newLines = [...lines];\r\n\r\n // delete methodn block(include [TestMethod] tag)\r\n newLines.splice(method.startLine, method.endLine - method.startLine + 1);\r\n\r\n return newLines;\r\n}\r\n\r\n/**\r\n * clean extra empty line, ensure only one empty line between methods\r\n */\r\nfunction cleanupEmptyLines(lines: string[]): string[] {\r\n const result: string[] = [];\r\n let emptyLineCount = 0;\r\n\r\n for (let i = 0; i < lines.length; i++) {\r\n const line = lines[i];\r\n const isEmptyLine = line.trim() === '';\r\n\r\n if (isEmptyLine) {\r\n emptyLineCount++;\r\n // keep one empty line between methods\r\n if (emptyLineCount === 1) {\r\n result.push(line);\r\n }\r\n } else {\r\n emptyLineCount = 0;\r\n result.push(line);\r\n }\r\n }\r\n\r\n // remove trailing empty lines\r\n while (result.length > 0 && result[result.length - 1].trim() === '') {\r\n result.pop();\r\n }\r\n\r\n return result;\r\n}\r\n\r\n\r\nexport function removeFailedTestCasesInTestFile(vsTestRes: TestResult, testFilePath: string): void {\r\n const failedTestMethods = vsTestRes?.failedTests?.map(test => test.name) || [];\r\n const succeedTestCode = removeFailedTests(testFilePath, failedTestMethods);\r\n fs.writeFileSync(testFilePath, succeedTestCode, 'utf-8');\r\n console.log(`Removed failed test cases from file: ${testFilePath}`);\r\n}\r\n\r\n// const testCode = removeFailedTests(\"D:\\\\code\\\\CS.Service.Fundamental\\\\SharedSegments\\\\SharedSegments\\\\SharedSegments.Tests\\\\Workflows\\\\Overview\\\\HttpRequestParser\\\\Utils\\\\SqmidHelperTests.cs\", [\"GetSqmidFromCookie_InvalidBlisIdFormat_ReturnsEmptyString\", \"GetSqmidFromCookie_MissingUsrLocCookie_ReturnsEmptyString\"]);\r\n// console.log(testCode);"]}
@@ -0,0 +1 @@
1
+ export declare function writeFailedVerifyResult(sourceCodePath: string, genCnt: number, sourceCodeProjectPath: string, errorMessage: string, isBuildFailure: boolean): void;
@@ -0,0 +1,67 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.writeFailedVerifyResult = writeFailedVerifyResult;
37
+ const path = __importStar(require("path"));
38
+ const fs = __importStar(require("fs"));
39
+ const getOrCreateDir_1 = require("./getOrCreateDir");
40
+ const fileUtils_1 = require("./fileUtils");
41
+ const TESTFILEINFODIR = './failedVerifyResults';
42
+ const BUILDERRORDIRNAME = 'buildErrors';
43
+ const TESTERRORDIRNAME = 'testErrors';
44
+ function writeFailedVerifyResult(sourceCodePath, genCnt, sourceCodeProjectPath, errorMessage, isBuildFailure) {
45
+ const sourceFileName = path.basename(sourceCodePath, '.cs');
46
+ let testFileName = `${sourceFileName}Tests${genCnt}.cs`;
47
+ const errorSubDir = isBuildFailure ? BUILDERRORDIRNAME : TESTERRORDIRNAME;
48
+ const classifiedFileDir = path.join(TESTFILEINFODIR, errorSubDir);
49
+ let testFileDir = (0, getOrCreateDir_1.getTmpCacheDir)(classifiedFileDir);
50
+ if (sourceCodeProjectPath && fs.existsSync(sourceCodeProjectPath)) {
51
+ // Get the directory containing the .csproj file
52
+ const projectDir = path.dirname(sourceCodeProjectPath);
53
+ // Get the relative path from project directory to source file
54
+ const relativePath = path.relative(projectDir, sourceCodePath);
55
+ // Parse the relative path
56
+ const parsedPath = path.parse(relativePath);
57
+ testFileDir = (0, getOrCreateDir_1.getTmpCacheDir)(path.join(classifiedFileDir, parsedPath.dir));
58
+ }
59
+ const testFilePath = path.join(testFileDir, testFileName);
60
+ (0, fileUtils_1.writeTestCode)(errorMessage, testFilePath);
61
+ console.log(`Generated error message written to: ${testFilePath}`);
62
+ }
63
+ // writeFailedVerifyResult("Q:\\MyProject\\TestTestReport\\TestTestReport\\Multiply.cs", 4,
64
+ // "Q:\\MyProject\\TestTestReport\\TestTestReport\\TestTestReport.csproj",
65
+ // "Sample error message222",
66
+ // true);
67
+ //# sourceMappingURL=writeFailedVerifyResult.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"writeFailedVerifyResult.js","sourceRoot":"","sources":["../../src/utils/writeFailedVerifyResult.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AASA,0DAqBC;AA9BD,2CAA6B;AAC7B,uCAAyB;AAEzB,qDAAkD;AAClD,2CAA4C;AAE5C,MAAM,eAAe,GAAG,uBAAuB,CAAC;AAChD,MAAM,iBAAiB,GAAG,aAAa,CAAC;AACxC,MAAM,gBAAgB,GAAG,YAAY,CAAC;AACtC,SAAgB,uBAAuB,CAAC,cAAsB,EAAE,MAAc,EAAE,qBAA6B,EAAE,YAAoB,EAAE,cAAuB;IACxJ,MAAM,cAAc,GAAG,IAAI,CAAC,QAAQ,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;IAC5D,IAAI,YAAY,GAAG,GAAG,cAAc,QAAQ,MAAM,KAAK,CAAC;IACxD,MAAM,WAAW,GAAG,cAAc,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,gBAAgB,CAAC;IAC1E,MAAM,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,WAAW,CAAC,CAAC;IAClE,IAAI,WAAW,GAAG,IAAA,+BAAc,EAAC,iBAAiB,CAAC,CAAC;IAEpD,IAAI,qBAAqB,IAAI,EAAE,CAAC,UAAU,CAAC,qBAAqB,CAAC,EAAE,CAAC;QAChE,gDAAgD;QAChD,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;QACvD,8DAA8D;QAC9D,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;QAC/D,0BAA0B;QAC1B,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QAC5C,WAAW,GAAG,IAAA,+BAAc,EAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;IAC/E,CAAC;IAED,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;IAE1D,IAAA,yBAAa,EAAC,YAAY,EAAE,YAAY,CAAC,CAAC;IAC1C,OAAO,CAAC,GAAG,CAAC,uCAAuC,YAAY,EAAE,CAAC,CAAC;AACvE,CAAC;AAED,4FAA4F;AAC5F,+EAA+E;AAC/E,mCAAmC;AACnC,gBAAgB","sourcesContent":["import * as path from 'path';\r\nimport * as fs from 'fs';\r\n\r\nimport { getTmpCacheDir } from './getOrCreateDir';\r\nimport { writeTestCode } from './fileUtils';\r\n\r\nconst TESTFILEINFODIR = './failedVerifyResults';\r\nconst BUILDERRORDIRNAME = 'buildErrors';\r\nconst TESTERRORDIRNAME = 'testErrors';\r\nexport function writeFailedVerifyResult(sourceCodePath: string, genCnt: number, sourceCodeProjectPath: string, errorMessage: string, isBuildFailure: boolean) {\r\n const sourceFileName = path.basename(sourceCodePath, '.cs');\r\n let testFileName = `${sourceFileName}Tests${genCnt}.cs`;\r\n const errorSubDir = isBuildFailure ? BUILDERRORDIRNAME : TESTERRORDIRNAME;\r\n const classifiedFileDir = path.join(TESTFILEINFODIR, errorSubDir);\r\n let testFileDir = getTmpCacheDir(classifiedFileDir);\r\n \r\n if (sourceCodeProjectPath && fs.existsSync(sourceCodeProjectPath)) {\r\n // Get the directory containing the .csproj file\r\n const projectDir = path.dirname(sourceCodeProjectPath);\r\n // Get the relative path from project directory to source file\r\n const relativePath = path.relative(projectDir, sourceCodePath);\r\n // Parse the relative path\r\n const parsedPath = path.parse(relativePath);\r\n testFileDir = getTmpCacheDir(path.join(classifiedFileDir, parsedPath.dir));\r\n } \r\n \r\n const testFilePath = path.join(testFileDir, testFileName);\r\n \r\n writeTestCode(errorMessage, testFilePath);\r\n console.log(`Generated error message written to: ${testFilePath}`);\r\n}\r\n\r\n// writeFailedVerifyResult(\"Q:\\\\MyProject\\\\TestTestReport\\\\TestTestReport\\\\Multiply.cs\", 4,\r\n// \"Q:\\\\MyProject\\\\TestTestReport\\\\TestTestReport\\\\TestTestReport.csproj\",\r\n// \"Sample error message222\",\r\n// true);\r\n"]}
@@ -1 +1 @@
1
- export declare function writeGenCode(sourceCodePath: string, genCode: string, genCnt: number): void;
1
+ export declare function writeGenCode(sourceCodePath: string, genCode: string, genCnt: number, sourceCodeProjectPath: string): void;
@@ -35,16 +35,29 @@ var __importStar = (this && this.__importStar) || (function () {
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
36
  exports.writeGenCode = writeGenCode;
37
37
  const path = __importStar(require("path"));
38
+ const fs = __importStar(require("fs"));
38
39
  const getOrCreateDir_1 = require("./getOrCreateDir");
39
40
  const fileUtils_1 = require("./fileUtils");
40
41
  const TESTFILEDIR = './testFiles';
41
- function writeGenCode(sourceCodePath, genCode, genCnt) {
42
+ function writeGenCode(sourceCodePath, genCode, genCnt, sourceCodeProjectPath) {
42
43
  const sourceFileName = path.basename(sourceCodePath, '.cs');
43
- const testFileName = `${sourceFileName}Tests${genCnt}.cs`;
44
- const testFileDir = (0, getOrCreateDir_1.getTmpCacheDir)(TESTFILEDIR);
44
+ let testFileName = `${sourceFileName}Tests${genCnt}.cs`;
45
+ let testFileDir = (0, getOrCreateDir_1.getTmpCacheDir)(TESTFILEDIR);
46
+ if (sourceCodeProjectPath && fs.existsSync(sourceCodeProjectPath)) {
47
+ // Get the directory containing the .csproj file
48
+ const projectDir = path.dirname(sourceCodeProjectPath);
49
+ // Get the relative path from project directory to source file
50
+ const relativePath = path.relative(projectDir, sourceCodePath);
51
+ // Parse the relative path
52
+ const parsedPath = path.parse(relativePath);
53
+ testFileDir = (0, getOrCreateDir_1.getTmpCacheDir)(path.join(TESTFILEDIR, parsedPath.dir));
54
+ }
45
55
  const testFilePath = path.join(testFileDir, testFileName);
46
56
  (0, fileUtils_1.writeTestCode)(genCode, testFilePath);
47
57
  console.log(`Generated code written to: ${testFilePath}`);
48
58
  }
49
- // writeGenCode('D:/code/CS.Service.Fundamental/SharedSegments/SharedSegments/SharedSegments.Plugins/Workflows/Eplant/EplantConfigManager.cs', 'public class EplantConfigManagerTests { }', 1);
59
+ // writeGenCode("Q:\\MyProject\\TestTestReport\\TestTestReport\\TestFolder\\Summary.cs",
60
+ // "public class SummaryTests { }",
61
+ // 2,
62
+ // "Q:\\MyProject\\TestTestReport\\TestTestReport\\TestTestReport.csproj");
50
63
  //# sourceMappingURL=writeGenCode.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"writeGenCode.js","sourceRoot":"","sources":["../../src/utils/writeGenCode.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAMA,oCAOC;AAbD,2CAA6B;AAE7B,qDAAkD;AAClD,2CAA4C;AAE5C,MAAM,WAAW,GAAG,aAAa,CAAC;AAClC,SAAgB,YAAY,CAAC,cAAsB,EAAE,OAAe,EAAE,MAAc;IAChF,MAAM,cAAc,GAAG,IAAI,CAAC,QAAQ,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;IAC5D,MAAM,YAAY,GAAG,GAAG,cAAc,QAAQ,MAAM,KAAK,CAAC;IAC1D,MAAM,WAAW,GAAG,IAAA,+BAAc,EAAC,WAAW,CAAC,CAAC;IAChD,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;IAC1D,IAAA,yBAAa,EAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IACrC,OAAO,CAAC,GAAG,CAAC,8BAA8B,YAAY,EAAE,CAAC,CAAC;AAC9D,CAAC;AAED,+LAA+L","sourcesContent":["import * as path from 'path';\r\n\r\nimport { getTmpCacheDir } from './getOrCreateDir';\r\nimport { writeTestCode } from './fileUtils';\r\n\r\nconst TESTFILEDIR = './testFiles';\r\nexport function writeGenCode(sourceCodePath: string, genCode: string, genCnt: number) {\r\n const sourceFileName = path.basename(sourceCodePath, '.cs');\r\n const testFileName = `${sourceFileName}Tests${genCnt}.cs`;\r\n const testFileDir = getTmpCacheDir(TESTFILEDIR);\r\n const testFilePath = path.join(testFileDir, testFileName);\r\n writeTestCode(genCode, testFilePath);\r\n console.log(`Generated code written to: ${testFilePath}`);\r\n}\r\n\r\n// writeGenCode('D:/code/CS.Service.Fundamental/SharedSegments/SharedSegments/SharedSegments.Plugins/Workflows/Eplant/EplantConfigManager.cs', 'public class EplantConfigManagerTests { }', 1);"]}
1
+ {"version":3,"file":"writeGenCode.js","sourceRoot":"","sources":["../../src/utils/writeGenCode.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAOA,oCAmBC;AA1BD,2CAA6B;AAC7B,uCAAyB;AAEzB,qDAAkD;AAClD,2CAA4C;AAE5C,MAAM,WAAW,GAAG,aAAa,CAAC;AAClC,SAAgB,YAAY,CAAC,cAAsB,EAAE,OAAe,EAAE,MAAc,EAAE,qBAA6B;IAC/G,MAAM,cAAc,GAAG,IAAI,CAAC,QAAQ,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;IAC5D,IAAI,YAAY,GAAG,GAAG,cAAc,QAAQ,MAAM,KAAK,CAAC;IACxD,IAAI,WAAW,GAAG,IAAA,+BAAc,EAAC,WAAW,CAAC,CAAC;IAE9C,IAAI,qBAAqB,IAAI,EAAE,CAAC,UAAU,CAAC,qBAAqB,CAAC,EAAE,CAAC;QAChE,gDAAgD;QAChD,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;QACvD,8DAA8D;QAC9D,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;QAC/D,0BAA0B;QAC1B,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QAC5C,WAAW,GAAG,IAAA,+BAAc,EAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;IACzE,CAAC;IAED,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;IAE1D,IAAA,yBAAa,EAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IACrC,OAAO,CAAC,GAAG,CAAC,8BAA8B,YAAY,EAAE,CAAC,CAAC;AAC9D,CAAC;AAED,yFAAyF;AACzF,uCAAuC;AACvC,UAAU;AACV,gFAAgF","sourcesContent":["import * as path from 'path';\r\nimport * as fs from 'fs';\r\n\r\nimport { getTmpCacheDir } from './getOrCreateDir';\r\nimport { writeTestCode } from './fileUtils';\r\n\r\nconst TESTFILEDIR = './testFiles';\r\nexport function writeGenCode(sourceCodePath: string, genCode: string, genCnt: number, sourceCodeProjectPath: string) {\r\n const sourceFileName = path.basename(sourceCodePath, '.cs');\r\n let testFileName = `${sourceFileName}Tests${genCnt}.cs`;\r\n let testFileDir = getTmpCacheDir(TESTFILEDIR);\r\n\r\n if (sourceCodeProjectPath && fs.existsSync(sourceCodeProjectPath)) {\r\n // Get the directory containing the .csproj file\r\n const projectDir = path.dirname(sourceCodeProjectPath);\r\n // Get the relative path from project directory to source file\r\n const relativePath = path.relative(projectDir, sourceCodePath);\r\n // Parse the relative path\r\n const parsedPath = path.parse(relativePath);\r\n testFileDir = getTmpCacheDir(path.join(TESTFILEDIR, parsedPath.dir));\r\n }\r\n \r\n const testFilePath = path.join(testFileDir, testFileName);\r\n \r\n writeTestCode(genCode, testFilePath);\r\n console.log(`Generated code written to: ${testFilePath}`);\r\n}\r\n\r\n// writeGenCode(\"Q:\\\\MyProject\\\\TestTestReport\\\\TestTestReport\\\\TestFolder\\\\Summary.cs\",\r\n// \"public class SummaryTests { }\",\r\n// 2,\r\n// \"Q:\\\\MyProject\\\\TestTestReport\\\\TestTestReport\\\\TestTestReport.csproj\");"]}
@@ -48,7 +48,7 @@ async function dispatchCommand(msg) {
48
48
  switch (msg.command) {
49
49
  case interactionConstants_1.VERIFYTESTCODE:
50
50
  console.log("Received VERIFYTESTCODE command response." + JSON.stringify(msg));
51
- exports.vsPluginEventEmitter.emit(interactionConstants_1.VERIFYTESTCODE, msg);
51
+ exports.vsPluginEventEmitter.emit(interactionConstants_1.VERIFYTESTCODE, msg.verifyResult);
52
52
  break;
53
53
  default:
54
54
  console.log(`Unknown command: ${msg.command}`);
@@ -1 +1 @@
1
- {"version":3,"file":"stdListener.js","sourceRoot":"","sources":["../../src/vsPlugin/stdListener.ts"],"names":[],"mappings":";;;;;;AA0BA,4CAqBC;AA/CD,oDAAkC;AAClC,iEAAwD;AACxD,wDAAgC;AAwBhC,SAAgB,gBAAgB;IAC5B,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IAClC,yBAAiB,GAAI,kBAAQ,CAAC,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;IACxE,4BAAoB,GAAG,IAAI,gBAAY,EAAE,CAAC;IAC1C,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;IAElD,yBAAiB,CAAC,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QACxC,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QACnB,IAAI,CAAC,IAAI;YAAE,OAAO;QAElB,IAAI,CAAC;YACD,MAAM,aAAa,CAAC,IAAI,CAAC,CAAC;QAC9B,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAChB,OAAO,CAAC,KAAK,CAAC,4BAA4B,IAAI,EAAE,CAAC,CAAC;QACtD,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,yBAAiB,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;QAC/B,OAAO,CAAC,KAAK,CAAC,oDAAoD,CAAC,CAAC;QACpE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC,CAAC,CAAC;AACP,CAAC;AAGD,KAAK,UAAU,aAAa,CAAC,IAAY;IACrC,IAAI,CAAC;QACD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAE7B,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,sBAAsB,GAAG,EAAE,CAAC,CAAC;YACzC,OAAO;QACX,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,qBAAqB,GAAG,EAAE,CAAC,CAAC;QACxC,eAAe,CAAC,GAAG,CAAC,CAAC;IACzB,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,CAAC,GAAG,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAAC;QACrC,OAAO;IACX,CAAC;AACL,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,GAAG;IAC9B,QAAQ,GAAG,CAAC,OAAO,EAAE,CAAC;QAClB,KAAK,qCAAc;YACf,OAAO,CAAC,GAAG,CAAC,2CAA2C,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;YAC/E,4BAAoB,CAAC,IAAI,CAAC,qCAAc,EAAE,GAAG,CAAC,CAAC;YAC/C,MAAM;QAEV;YACI,OAAO,CAAC,GAAG,CAAC,oBAAoB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;IACvD,CAAC;AACL,CAAC","sourcesContent":["import EventEmitter from \"events\";\r\nimport { VERIFYTESTCODE } from \"./interactionConstants\";\r\nimport readline from 'readline';\r\n\r\n// export function startStdListener() {\r\n// console.log(\"VS plugin std listener starting...\");\r\n\r\n// process.stdin.setEncoding('utf8');\r\n\r\n// let buffer = '';\r\n// process.stdin.on('data', async (chunk: string) => {\r\n// buffer += chunk;\r\n// let newlineIndex: number;\r\n// while ((newlineIndex = buffer.indexOf('\\n')) >= 0) {\r\n// const line = buffer.slice(0, newlineIndex).trim();\r\n// buffer = buffer.slice(newlineIndex + 1);\r\n// if (line) {\r\n// handleMessage(line)\r\n// }\r\n// }\r\n// });\r\n// }\r\n\r\nexport let readLineInterface;\r\nexport let vsPluginEventEmitter;\r\n\r\nexport function startStdListener() {\r\n process.stdin.setEncoding('utf8');\r\n readLineInterface = readline.createInterface({ input: process.stdin });\r\n vsPluginEventEmitter = new EventEmitter();\r\n console.log(\"VS plugin std listener starting...\");\r\n\r\n readLineInterface.on(\"line\", async (line) => {\r\n line = line.trim();\r\n if (!line) return;\r\n\r\n try {\r\n await handleMessage(line);\r\n } catch (err: any) {\r\n console.error(`Failed to parse message: ${line}`);\r\n }\r\n });\r\n\r\n readLineInterface.on(\"close\", () => {\r\n console.error(\"readLineInterface closed. Node.js process exiting.\");\r\n process.exit(0);\r\n });\r\n}\r\n\r\n\r\nasync function handleMessage(line: string) {\r\n try {\r\n const msg = JSON.parse(line);\r\n\r\n if (!msg?.command) {\r\n console.log(`No command in msg: ${msg}`);\r\n return;\r\n }\r\n\r\n console.log(`Received command: ${msg}`);\r\n dispatchCommand(msg);\r\n } catch {\r\n console.log(\"invalid JSON: \" + line);\r\n return;\r\n }\r\n}\r\n\r\nasync function dispatchCommand(msg) {\r\n switch (msg.command) {\r\n case VERIFYTESTCODE:\r\n console.log(\"Received VERIFYTESTCODE command response.\" + JSON.stringify(msg));\r\n vsPluginEventEmitter.emit(VERIFYTESTCODE, msg);\r\n break;\r\n\r\n default:\r\n console.log(`Unknown command: ${msg.command}`);\r\n }\r\n}"]}
1
+ {"version":3,"file":"stdListener.js","sourceRoot":"","sources":["../../src/vsPlugin/stdListener.ts"],"names":[],"mappings":";;;;;;AA0BA,4CAqBC;AA/CD,oDAAkC;AAClC,iEAAwD;AACxD,wDAAgC;AAwBhC,SAAgB,gBAAgB;IAC5B,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IAClC,yBAAiB,GAAI,kBAAQ,CAAC,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;IACxE,4BAAoB,GAAG,IAAI,gBAAY,EAAE,CAAC;IAC1C,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;IAElD,yBAAiB,CAAC,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QACxC,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QACnB,IAAI,CAAC,IAAI;YAAE,OAAO;QAElB,IAAI,CAAC;YACD,MAAM,aAAa,CAAC,IAAI,CAAC,CAAC;QAC9B,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAChB,OAAO,CAAC,KAAK,CAAC,4BAA4B,IAAI,EAAE,CAAC,CAAC;QACtD,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,yBAAiB,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;QAC/B,OAAO,CAAC,KAAK,CAAC,oDAAoD,CAAC,CAAC;QACpE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC,CAAC,CAAC;AACP,CAAC;AAGD,KAAK,UAAU,aAAa,CAAC,IAAY;IACrC,IAAI,CAAC;QACD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAE7B,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,sBAAsB,GAAG,EAAE,CAAC,CAAC;YACzC,OAAO;QACX,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,qBAAqB,GAAG,EAAE,CAAC,CAAC;QACxC,eAAe,CAAC,GAAG,CAAC,CAAC;IACzB,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,CAAC,GAAG,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAAC;QACrC,OAAO;IACX,CAAC;AACL,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,GAAG;IAC9B,QAAQ,GAAG,CAAC,OAAO,EAAE,CAAC;QAClB,KAAK,qCAAc;YACf,OAAO,CAAC,GAAG,CAAC,2CAA2C,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;YAC/E,4BAAoB,CAAC,IAAI,CAAC,qCAAc,EAAE,GAAG,CAAC,YAAY,CAAC,CAAC;YAC5D,MAAM;QAEV;YACI,OAAO,CAAC,GAAG,CAAC,oBAAoB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;IACvD,CAAC;AACL,CAAC","sourcesContent":["import EventEmitter from \"events\";\r\nimport { VERIFYTESTCODE } from \"./interactionConstants\";\r\nimport readline from 'readline';\r\n\r\n// export function startStdListener() {\r\n// console.log(\"VS plugin std listener starting...\");\r\n\r\n// process.stdin.setEncoding('utf8');\r\n\r\n// let buffer = '';\r\n// process.stdin.on('data', async (chunk: string) => {\r\n// buffer += chunk;\r\n// let newlineIndex: number;\r\n// while ((newlineIndex = buffer.indexOf('\\n')) >= 0) {\r\n// const line = buffer.slice(0, newlineIndex).trim();\r\n// buffer = buffer.slice(newlineIndex + 1);\r\n// if (line) {\r\n// handleMessage(line)\r\n// }\r\n// }\r\n// });\r\n// }\r\n\r\nexport let readLineInterface;\r\nexport let vsPluginEventEmitter;\r\n\r\nexport function startStdListener() {\r\n process.stdin.setEncoding('utf8');\r\n readLineInterface = readline.createInterface({ input: process.stdin });\r\n vsPluginEventEmitter = new EventEmitter();\r\n console.log(\"VS plugin std listener starting...\");\r\n\r\n readLineInterface.on(\"line\", async (line) => {\r\n line = line.trim();\r\n if (!line) return;\r\n\r\n try {\r\n await handleMessage(line);\r\n } catch (err: any) {\r\n console.error(`Failed to parse message: ${line}`);\r\n }\r\n });\r\n\r\n readLineInterface.on(\"close\", () => {\r\n console.error(\"readLineInterface closed. Node.js process exiting.\");\r\n process.exit(0);\r\n });\r\n}\r\n\r\n\r\nasync function handleMessage(line: string) {\r\n try {\r\n const msg = JSON.parse(line);\r\n\r\n if (!msg?.command) {\r\n console.log(`No command in msg: ${msg}`);\r\n return;\r\n }\r\n\r\n console.log(`Received command: ${msg}`);\r\n dispatchCommand(msg);\r\n } catch {\r\n console.log(\"invalid JSON: \" + line);\r\n return;\r\n }\r\n}\r\n\r\nasync function dispatchCommand(msg) {\r\n switch (msg.command) {\r\n case VERIFYTESTCODE:\r\n console.log(\"Received VERIFYTESTCODE command response.\" + JSON.stringify(msg));\r\n vsPluginEventEmitter.emit(VERIFYTESTCODE, msg.verifyResult);\r\n break;\r\n\r\n default:\r\n console.log(`Unknown command: ${msg.command}`);\r\n }\r\n}"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ai-dev-tools/csharp-copilot-core",
3
- "version": "0.0.30",
3
+ "version": "0.0.32",
4
4
  "description": "Core library for csharp-copilot",
5
5
  "main": "out/index.js",
6
6
  "typings": "out/index.d.ts",