@ai-dev-tools/csharp-copilot-core 0.0.29 → 0.0.31

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 (304) hide show
  1. package/ReadMe.md +1 -1
  2. package/package.json +1 -1
  3. package/out/analyze/cecil.d.ts +0 -1
  4. package/out/analyze/cecil.js +0 -42
  5. package/out/analyze/cecil.js.map +0 -1
  6. package/out/analyze/checkCodeSyntax.d.ts +0 -7
  7. package/out/analyze/checkCodeSyntax.js +0 -67
  8. package/out/analyze/checkCodeSyntax.js.map +0 -1
  9. package/out/analyze/generateCodeDependency.d.ts +0 -6
  10. package/out/analyze/generateCodeDependency.js +0 -126
  11. package/out/analyze/generateCodeDependency.js.map +0 -1
  12. package/out/analyze/installAnalyzerTool.d.ts +0 -1
  13. package/out/analyze/installAnalyzerTool.js +0 -82
  14. package/out/analyze/installAnalyzerTool.js.map +0 -1
  15. package/out/batch/generateCodeTests.d.ts +0 -6
  16. package/out/batch/generateCodeTests.js +0 -147
  17. package/out/batch/generateCodeTests.js.map +0 -1
  18. package/out/batch/getFolderCodeFile.d.ts +0 -1
  19. package/out/batch/getFolderCodeFile.js +0 -19
  20. package/out/batch/getFolderCodeFile.js.map +0 -1
  21. package/out/batch/getProjectCodeFile.d.ts +0 -4
  22. package/out/batch/getProjectCodeFile.js +0 -86
  23. package/out/batch/getProjectCodeFile.js.map +0 -1
  24. package/out/batch/getSolutionCodeFile.d.ts +0 -8
  25. package/out/batch/getSolutionCodeFile.js +0 -70
  26. package/out/batch/getSolutionCodeFile.js.map +0 -1
  27. package/out/benchmark/formatToMarkdown.d.ts +0 -2
  28. package/out/benchmark/formatToMarkdown.js +0 -101
  29. package/out/benchmark/formatToMarkdown.js.map +0 -1
  30. package/out/benchmark/generateBenchmarkReport.d.ts +0 -1
  31. package/out/benchmark/generateBenchmarkReport.js +0 -82
  32. package/out/benchmark/generateBenchmarkReport.js.map +0 -1
  33. package/out/codeCoverage/codeCoverage.d.ts +0 -6
  34. package/out/codeCoverage/codeCoverage.js +0 -39
  35. package/out/codeCoverage/codeCoverage.js.map +0 -1
  36. package/out/codeCoverage/codeCoverageReport.d.ts +0 -6
  37. package/out/codeCoverage/codeCoverageReport.js +0 -76
  38. package/out/codeCoverage/codeCoverageReport.js.map +0 -1
  39. package/out/codeCoverage/extractCodeCoverageInfo.d.ts +0 -2
  40. package/out/codeCoverage/extractCodeCoverageInfo.js +0 -80
  41. package/out/codeCoverage/extractCodeCoverageInfo.js.map +0 -1
  42. package/out/codeCoverage/extractCoverageReportPath.d.ts +0 -1
  43. package/out/codeCoverage/extractCoverageReportPath.js +0 -24
  44. package/out/codeCoverage/extractCoverageReportPath.js.map +0 -1
  45. package/out/codeCoverage/generateCodeCoverageReport.d.ts +0 -1
  46. package/out/codeCoverage/generateCodeCoverageReport.js +0 -30
  47. package/out/codeCoverage/generateCodeCoverageReport.js.map +0 -1
  48. package/out/codeCoverage/getCodeCoverageSetting.d.ts +0 -1
  49. package/out/codeCoverage/getCodeCoverageSetting.js +0 -58
  50. package/out/codeCoverage/getCodeCoverageSetting.js.map +0 -1
  51. package/out/codeCoverage/reportTool.d.ts +0 -2
  52. package/out/codeCoverage/reportTool.js +0 -22
  53. package/out/codeCoverage/reportTool.js.map +0 -1
  54. package/out/codeCoverage/simplifyCoverageXml.d.ts +0 -2
  55. package/out/codeCoverage/simplifyCoverageXml.js +0 -117
  56. package/out/codeCoverage/simplifyCoverageXml.js.map +0 -1
  57. package/out/codebk/250804prompt/buildAfGuidelines.liquid +0 -15
  58. package/out/codebk/250804prompt/general/generalBuildAutofixGuidelines.liquid +0 -13
  59. package/out/codebk/250804prompt/general/generalUtGuidelines.liquid +0 -18
  60. package/out/codebk/250804prompt/generateUtAutoFix.liquid +0 -19
  61. package/out/codebk/250804prompt/generateUtGuidelines.liquid +0 -13
  62. package/out/codebk/250804prompt/generateUtSystem.liquid +0 -5
  63. package/out/codebk/250804prompt/generateUtUserInput.liquid +0 -27
  64. package/out/codebk/250804prompt/testAfGuidelines.liquid +0 -6
  65. package/out/codebk/250804prompt/xap/xapBuildAutofixGuidelines.liquid +0 -13
  66. package/out/codebk/250804prompt/xap/xapCodeCodeDependency.liquid +0 -0
  67. package/out/codebk/250804prompt/xap/xapCodeSample.liquid +0 -38
  68. package/out/codebk/250804prompt/xap/xapUtGuideline-240804.liquid +0 -36
  69. package/out/codebk/250804prompt/xap/xapUtGuideline.liquid +0 -36
  70. package/out/codebk/childProcessManager.d.ts +0 -1
  71. package/out/codebk/childProcessManager.js +0 -50
  72. package/out/codebk/childProcessManager.js.map +0 -1
  73. package/out/codebk/msBuidSpawn.d.ts +0 -1
  74. package/out/codebk/msBuidSpawn.js +0 -58
  75. package/out/codebk/msBuidSpawn.js.map +0 -1
  76. package/out/codebk/msBuild.d.ts +0 -1
  77. package/out/codebk/msBuild.js +0 -123
  78. package/out/codebk/msBuild.js.map +0 -1
  79. package/out/codebk/old/generateXapTestAutoFix.liquid +0 -12
  80. package/out/codebk/old/generateXapTestGuidelines-fm.liquid +0 -68
  81. package/out/codebk/old/generateXapTestGuidelines.liquid +0 -28
  82. package/out/codebk/old/xapGuideline-fm.liquid +0 -149
  83. package/out/codebk/old/xapGuideline.liquid +0 -37
  84. package/out/codebk/oldExec/checkCodeSyntax.d.ts +0 -1
  85. package/out/codebk/oldExec/checkCodeSyntax.js +0 -81
  86. package/out/codebk/oldExec/checkCodeSyntax.js.map +0 -1
  87. package/out/codebk/oldExec/codeCoverage.d.ts +0 -1
  88. package/out/codebk/oldExec/codeCoverage.js +0 -54
  89. package/out/codebk/oldExec/codeCoverage.js.map +0 -1
  90. package/out/codebk/oldExec/codeCoverageReport.d.ts +0 -1
  91. package/out/codebk/oldExec/codeCoverageReport.js +0 -64
  92. package/out/codebk/oldExec/codeCoverageReport.js.map +0 -1
  93. package/out/codebk/oldExec/containsMethods.d.ts +0 -1
  94. package/out/codebk/oldExec/containsMethods.js +0 -74
  95. package/out/codebk/oldExec/containsMethods.js.map +0 -1
  96. package/out/codebk/oldExec/generateCodeDependency.d.ts +0 -1
  97. package/out/codebk/oldExec/generateCodeDependency.js +0 -95
  98. package/out/codebk/oldExec/generateCodeDependency.js.map +0 -1
  99. package/out/codebk/oldExec/msBuild.d.ts +0 -1
  100. package/out/codebk/oldExec/msBuild.js +0 -53
  101. package/out/codebk/oldExec/msBuild.js.map +0 -1
  102. package/out/codebk/oldExec/vsTest.d.ts +0 -1
  103. package/out/codebk/oldExec/vsTest.js +0 -71
  104. package/out/codebk/oldExec/vsTest.js.map +0 -1
  105. package/out/codebk/prompts/general/generalUnitTestGuidelines-20250702.liquid +0 -56
  106. package/out/codebk/prompts/generateXapTestGuidelines-20250704.liquid +0 -21
  107. package/out/codebk/prompts/generateXapTestGuidelines-o.liquid +0 -29
  108. package/out/codebk/prompts/xap/xapGuideline-o.liquid +0 -45
  109. package/out/codebk/testbuildkill.d.ts +0 -1
  110. package/out/codebk/testbuildkill.js +0 -37
  111. package/out/codebk/testbuildkill.js.map +0 -1
  112. package/out/command/index.d.ts +0 -2
  113. package/out/command/index.js +0 -94
  114. package/out/command/index.js.map +0 -1
  115. package/out/command/utGenWrapper.d.ts +0 -4
  116. package/out/command/utGenWrapper.js +0 -46
  117. package/out/command/utGenWrapper.js.map +0 -1
  118. package/out/exit/childProcessManager.d.ts +0 -2
  119. package/out/exit/childProcessManager.js +0 -43
  120. package/out/exit/childProcessManager.js.map +0 -1
  121. package/out/exit/setupProcessSignalHandler.d.ts +0 -1
  122. package/out/exit/setupProcessSignalHandler.js +0 -18
  123. package/out/exit/setupProcessSignalHandler.js.map +0 -1
  124. package/out/gen/autoFix.d.ts +0 -4
  125. package/out/gen/autoFix.js +0 -125
  126. package/out/gen/autoFix.js.map +0 -1
  127. package/out/gen/csharpUtGen.d.ts +0 -2
  128. package/out/gen/csharpUtGen.js +0 -125
  129. package/out/gen/csharpUtGen.js.map +0 -1
  130. package/out/gen/ensureValidLLMResponse.d.ts +0 -1
  131. package/out/gen/ensureValidLLMResponse.js +0 -19
  132. package/out/gen/ensureValidLLMResponse.js.map +0 -1
  133. package/out/gen/postGen/extractCodeFromResponse.d.ts +0 -1
  134. package/out/gen/postGen/extractCodeFromResponse.js +0 -37
  135. package/out/gen/postGen/extractCodeFromResponse.js.map +0 -1
  136. package/out/gen/postGen/postGenProcess.d.ts +0 -1
  137. package/out/gen/postGen/postGenProcess.js +0 -37
  138. package/out/gen/postGen/postGenProcess.js.map +0 -1
  139. package/out/gen/postGen/removeComments.d.ts +0 -1
  140. package/out/gen/postGen/removeComments.js +0 -92
  141. package/out/gen/postGen/removeComments.js.map +0 -1
  142. package/out/gen/postGen/removeSingleLines.d.ts +0 -1
  143. package/out/gen/postGen/removeSingleLines.js +0 -28
  144. package/out/gen/postGen/removeSingleLines.js.map +0 -1
  145. package/out/gen/postGen/repairRequiredNameSpaces.d.ts +0 -2
  146. package/out/gen/postGen/repairRequiredNameSpaces.js +0 -141
  147. package/out/gen/postGen/repairRequiredNameSpaces.js.map +0 -1
  148. package/out/gen/postGen/validateTestCode.d.ts +0 -1
  149. package/out/gen/postGen/validateTestCode.js +0 -14
  150. package/out/gen/postGen/validateTestCode.js.map +0 -1
  151. package/out/gen/preGen/excludeFileName.d.ts +0 -1
  152. package/out/gen/preGen/excludeFileName.js +0 -49
  153. package/out/gen/preGen/excludeFileName.js.map +0 -1
  154. package/out/gen/preGen/excludeSpecificTag.d.ts +0 -1
  155. package/out/gen/preGen/excludeSpecificTag.js +0 -18
  156. package/out/gen/preGen/excludeSpecificTag.js.map +0 -1
  157. package/out/gen/preGen/preGenProcess.d.ts +0 -1
  158. package/out/gen/preGen/preGenProcess.js +0 -22
  159. package/out/gen/preGen/preGenProcess.js.map +0 -1
  160. package/out/gen/preGen/validateCode.d.ts +0 -3
  161. package/out/gen/preGen/validateCode.js +0 -62
  162. package/out/gen/preGen/validateCode.js.map +0 -1
  163. package/out/index.d.ts +0 -3
  164. package/out/index.js +0 -10
  165. package/out/index.js.map +0 -1
  166. package/out/llm/model/Gpt.d.ts +0 -1
  167. package/out/llm/model/Gpt.js +0 -93
  168. package/out/llm/model/Gpt.js.map +0 -1
  169. package/out/llm/preparePrompt.d.ts +0 -2
  170. package/out/llm/preparePrompt.js +0 -135
  171. package/out/llm/preparePrompt.js.map +0 -1
  172. package/out/llm/prompt/buildAfGuidelines.liquid +0 -15
  173. package/out/llm/prompt/general/generalBuildAutofixGuidelines.liquid +0 -13
  174. package/out/llm/prompt/general/generalUtGuidelines.liquid +0 -16
  175. package/out/llm/prompt/generateUtAutoFix.liquid +0 -23
  176. package/out/llm/prompt/generateUtDependency.liquid +0 -3
  177. package/out/llm/prompt/generateUtSystem.liquid +0 -5
  178. package/out/llm/prompt/generateUtTemplate.liquid +0 -32
  179. package/out/llm/prompt/generateUtUserInput.liquid +0 -4
  180. package/out/llm/prompt/xap/xapBuildAutofixGuidelines.liquid +0 -13
  181. package/out/llm/prompt/xap/xapCodeCodeDependency.liquid +0 -0
  182. package/out/llm/prompt/xap/xapCodeSample.liquid +0 -38
  183. package/out/llm/prompt/xap/xapUtGuideline.liquid +0 -37
  184. package/out/llm/sendRequestToLLM.d.ts +0 -4
  185. package/out/llm/sendRequestToLLM.js +0 -9
  186. package/out/llm/sendRequestToLLM.js.map +0 -1
  187. package/out/llm/sendRequestToSelfHostLLM.d.ts +0 -4
  188. package/out/llm/sendRequestToSelfHostLLM.js +0 -41
  189. package/out/llm/sendRequestToSelfHostLLM.js.map +0 -1
  190. package/out/metrics/appInsightTelemetry.d.ts +0 -6
  191. package/out/metrics/appInsightTelemetry.js +0 -77
  192. package/out/metrics/appInsightTelemetry.js.map +0 -1
  193. package/out/metrics/machineId.d.ts +0 -11
  194. package/out/metrics/machineId.js +0 -85
  195. package/out/metrics/machineId.js.map +0 -1
  196. package/out/setup/setup.d.ts +0 -1
  197. package/out/setup/setup.js +0 -10
  198. package/out/setup/setup.js.map +0 -1
  199. package/out/setup/setupConsole.d.ts +0 -1
  200. package/out/setup/setupConsole.js +0 -23
  201. package/out/setup/setupConsole.js.map +0 -1
  202. package/out/setup/setupLLMRequest.d.ts +0 -2
  203. package/out/setup/setupLLMRequest.js +0 -10
  204. package/out/setup/setupLLMRequest.js.map +0 -1
  205. package/out/tools/devenvcom.cmd +0 -13
  206. package/out/tools/devenvexe.cmd +0 -13
  207. package/out/tools/msbuildexe.cmd +0 -13
  208. package/out/tools/vstestexe.cmd +0 -13
  209. package/out/types/benchmark.d.ts +0 -11
  210. package/out/types/benchmark.js +0 -3
  211. package/out/types/benchmark.js.map +0 -1
  212. package/out/types/buildResult.d.ts +0 -8
  213. package/out/types/buildResult.js +0 -3
  214. package/out/types/buildResult.js.map +0 -1
  215. package/out/types/constants.d.ts +0 -6
  216. package/out/types/constants.js +0 -10
  217. package/out/types/constants.js.map +0 -1
  218. package/out/types/genResult.d.ts +0 -10
  219. package/out/types/genResult.js +0 -3
  220. package/out/types/genResult.js.map +0 -1
  221. package/out/types/testResult.d.ts +0 -12
  222. package/out/types/testResult.js +0 -3
  223. package/out/types/testResult.js.map +0 -1
  224. package/out/types/verifyResult.d.ts +0 -8
  225. package/out/types/verifyResult.js +0 -3
  226. package/out/types/verifyResult.js.map +0 -1
  227. package/out/utils/checkTestProject.d.ts +0 -2
  228. package/out/utils/checkTestProject.js +0 -79
  229. package/out/utils/checkTestProject.js.map +0 -1
  230. package/out/utils/checkXapCode.d.ts +0 -2
  231. package/out/utils/checkXapCode.js +0 -59
  232. package/out/utils/checkXapCode.js.map +0 -1
  233. package/out/utils/delay.d.ts +0 -1
  234. package/out/utils/delay.js +0 -7
  235. package/out/utils/delay.js.map +0 -1
  236. package/out/utils/detectTestFramework.d.ts +0 -1
  237. package/out/utils/detectTestFramework.js +0 -33
  238. package/out/utils/detectTestFramework.js.map +0 -1
  239. package/out/utils/fileUtils.d.ts +0 -2
  240. package/out/utils/fileUtils.js +0 -42
  241. package/out/utils/fileUtils.js.map +0 -1
  242. package/out/utils/generateCodeSha256.d.ts +0 -1
  243. package/out/utils/generateCodeSha256.js +0 -46
  244. package/out/utils/generateCodeSha256.js.map +0 -1
  245. package/out/utils/getCodeStructurePath.d.ts +0 -5
  246. package/out/utils/getCodeStructurePath.js +0 -155
  247. package/out/utils/getCodeStructurePath.js.map +0 -1
  248. package/out/utils/getOrCreateDir.d.ts +0 -2
  249. package/out/utils/getOrCreateDir.js +0 -63
  250. package/out/utils/getOrCreateDir.js.map +0 -1
  251. package/out/utils/getTestCodeInfo.d.ts +0 -2
  252. package/out/utils/getTestCodeInfo.js +0 -121
  253. package/out/utils/getTestCodeInfo.js.map +0 -1
  254. package/out/utils/getTestFile.d.ts +0 -13
  255. package/out/utils/getTestFile.js +0 -295
  256. package/out/utils/getTestFile.js.map +0 -1
  257. package/out/utils/parseBuildResult.d.ts +0 -3
  258. package/out/utils/parseBuildResult.js +0 -44
  259. package/out/utils/parseBuildResult.js.map +0 -1
  260. package/out/utils/parseSyntaxCheckResult.d.ts +0 -2
  261. package/out/utils/parseSyntaxCheckResult.js +0 -38
  262. package/out/utils/parseSyntaxCheckResult.js.map +0 -1
  263. package/out/utils/parseVstestResult.d.ts +0 -3
  264. package/out/utils/parseVstestResult.js +0 -61
  265. package/out/utils/parseVstestResult.js.map +0 -1
  266. package/out/utils/removeFailedTestMethods.d.ts +0 -3
  267. package/out/utils/removeFailedTestMethods.js +0 -207
  268. package/out/utils/removeFailedTestMethods.js.map +0 -1
  269. package/out/utils/runCommand.d.ts +0 -1
  270. package/out/utils/runCommand.js +0 -14
  271. package/out/utils/runCommand.js.map +0 -1
  272. package/out/utils/spawnExec.d.ts +0 -1
  273. package/out/utils/spawnExec.js +0 -80
  274. package/out/utils/spawnExec.js.map +0 -1
  275. package/out/utils/verifyBuildErrorCausedFile.d.ts +0 -1
  276. package/out/utils/verifyBuildErrorCausedFile.js +0 -60
  277. package/out/utils/verifyBuildErrorCausedFile.js.map +0 -1
  278. package/out/utils/verifyTestCode.d.ts +0 -2
  279. package/out/utils/verifyTestCode.js +0 -25
  280. package/out/utils/verifyTestCode.js.map +0 -1
  281. package/out/utils/writeGenCode.d.ts +0 -1
  282. package/out/utils/writeGenCode.js +0 -50
  283. package/out/utils/writeGenCode.js.map +0 -1
  284. package/out/vs/msBuild.d.ts +0 -13
  285. package/out/vs/msBuild.js +0 -49
  286. package/out/vs/msBuild.js.map +0 -1
  287. package/out/vs/vsTest.d.ts +0 -15
  288. package/out/vs/vsTest.js +0 -75
  289. package/out/vs/vsTest.js.map +0 -1
  290. package/out/vs/vsTools.d.ts +0 -7
  291. package/out/vs/vsTools.js +0 -177
  292. package/out/vs/vsTools.js.map +0 -1
  293. package/out/vsPlugin/getVsPluginVerifyResult.d.ts +0 -2
  294. package/out/vsPlugin/getVsPluginVerifyResult.js +0 -41
  295. package/out/vsPlugin/getVsPluginVerifyResult.js.map +0 -1
  296. package/out/vsPlugin/interactionConstants.d.ts +0 -2
  297. package/out/vsPlugin/interactionConstants.js +0 -10
  298. package/out/vsPlugin/interactionConstants.js.map +0 -1
  299. package/out/vsPlugin/sendStdToVsPlugin.d.ts +0 -1
  300. package/out/vsPlugin/sendStdToVsPlugin.js +0 -12
  301. package/out/vsPlugin/sendStdToVsPlugin.js.map +0 -1
  302. package/out/vsPlugin/stdListener.d.ts +0 -3
  303. package/out/vsPlugin/stdListener.js +0 -57
  304. package/out/vsPlugin/stdListener.js.map +0 -1
@@ -1,295 +0,0 @@
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.getExistingTestFile = getExistingTestFile;
37
- exports.createTestFile = createTestFile;
38
- exports.getOrCreatTestFile = getOrCreatTestFile;
39
- const fs = __importStar(require("fs"));
40
- const path = __importStar(require("path"));
41
- const getCodeStructurePath_1 = require("./getCodeStructurePath");
42
- const fast_xml_parser_1 = require("fast-xml-parser");
43
- const TEST_NAME_REGEX = /(Test|Tests)/i;
44
- const TEST_ATTR_REGEX = /\[(Fact|Theory|TestClass|TestMethod|Test)\]/;
45
- function findAllCsprojFiles(dir, excludedPaths) {
46
- const results = [];
47
- const entries = fs.readdirSync(dir, { withFileTypes: true });
48
- for (const entry of entries) {
49
- const fullPath = path.join(dir, entry.name);
50
- if (entry.name === ".vs" || excludedPaths.includes(fullPath)) {
51
- continue; // Skip excluded paths
52
- }
53
- if (entry.isDirectory()) {
54
- results.push(...findAllCsprojFiles(fullPath, excludedPaths));
55
- }
56
- else if (entry.isFile() && entry.name.endsWith('.csproj')) {
57
- results.push(fullPath);
58
- }
59
- }
60
- return results;
61
- }
62
- function isXapTestProject(csprojPath) {
63
- try {
64
- const content = fs.readFileSync(csprojPath, 'utf-8');
65
- const parser = new fast_xml_parser_1.XMLParser({ ignoreAttributes: false, ignoreDeclaration: true });
66
- const json = parser.parse(content);
67
- const project = json.Project;
68
- const propertyGroups = Array.isArray(project.PropertyGroup)
69
- ? project.PropertyGroup
70
- : [project.PropertyGroup];
71
- for (const group of propertyGroups) {
72
- if (group.XapProjectType === 'TestProject') {
73
- return true;
74
- }
75
- }
76
- }
77
- catch (err) {
78
- console.error(`Failed to parse ${csprojPath}: ${err.message}`);
79
- }
80
- return false;
81
- }
82
- function isGeneralTestProject(csprojPath) {
83
- try {
84
- const content = fs.readFileSync(csprojPath, 'utf-8');
85
- // 1. package reference (test framework)
86
- const referencesTestFramework = /<PackageReference\s+Include="(xunit|nunit|MSTest\.TestFramework|Microsoft\.NET\.Test\.Sdk)"/i.test(content);
87
- // 2. file name *.Tests.csproj
88
- const fileNameHasTests = (/\.Tests\.csproj$/i.test(path.basename(csprojPath))) || (/\.Test\.csproj$/i.test(path.basename(csprojPath)));
89
- // 3. path contains Tests
90
- const pathHasTests = /[\\/](Tests?|UnitTests?|IntegrationTests?)[\\/]/i.test(csprojPath);
91
- // 4. Project SDK is test type (optional)
92
- const sdkIsTestSdk = /<Project\s+Sdk="Microsoft\.NET\.Test\.Sdk"/i.test(content);
93
- // 组合判断
94
- return referencesTestFramework || sdkIsTestSdk || fileNameHasTests || pathHasTests;
95
- }
96
- catch (err) {
97
- console.error(`can't read csproj file: ${csprojPath}`);
98
- return false;
99
- }
100
- }
101
- function isFalconUnitTestProject(csprojPath) {
102
- const xmlContent = fs.readFileSync(csprojPath, 'utf-8');
103
- const parser = new fast_xml_parser_1.XMLParser({
104
- ignoreAttributes: false,
105
- attributeNamePrefix: ''
106
- });
107
- const parsed = parser.parse(xmlContent);
108
- // get PackageReference node
109
- const project = parsed.Project;
110
- const itemGroups = Array.isArray(project.ItemGroup) ? project.ItemGroup : [project.ItemGroup];
111
- let isFalconUnitTestProject = false;
112
- for (const group of itemGroups) {
113
- const refs = group.PackageReference;
114
- if (!refs)
115
- continue;
116
- // PackageReference
117
- const refList = Array.isArray(refs) ? refs : [refs];
118
- for (const ref of refList) {
119
- if (ref.Include === 'Microsoft.Falcon.CodeAnalyzers') {
120
- isFalconUnitTestProject = true;
121
- console.log('Found Microsoft.Falcon.CodeAnalyzers');
122
- break;
123
- }
124
- }
125
- if (isFalconUnitTestProject)
126
- break;
127
- }
128
- // if (!isFalconUnitTestProject) {
129
- // console.log('Microsoft.Falcon.CodeAnalyzers not found');
130
- // }
131
- return isFalconUnitTestProject;
132
- }
133
- function isProjectNameMatchedTestProject(csprojPath, projectAssemblyName, projectName) {
134
- const testProjectName = path.basename(csprojPath, '.csproj').toLowerCase();
135
- const fileNameEndWithTests = testProjectName.endsWith('.tests') || testProjectName.endsWith('.test') || testProjectName.endsWith('.unittest') || testProjectName.endsWith('.unittests');
136
- if (testProjectName.startsWith(projectName.toLowerCase()) && fileNameEndWithTests) {
137
- return true;
138
- }
139
- const testProjectAssemblyName = (0, getCodeStructurePath_1.getAssemblyName)(csprojPath);
140
- return testProjectAssemblyName?.toLowerCase()?.startsWith(projectAssemblyName.toLowerCase()) && fileNameEndWithTests;
141
- }
142
- function findTestProjectFromCsFile(csFilePath) {
143
- let currentDir = path.dirname(csFilePath);
144
- const repoRoot = (0, getCodeStructurePath_1.getCodeRepoRoot)(csFilePath);
145
- const projectFilePath = (0, getCodeStructurePath_1.getSourceFileCsprojFilePath)(csFilePath);
146
- const projectName = path.basename(projectFilePath, '.csproj');
147
- const projectAssemblyName = (0, getCodeStructurePath_1.getAssemblyName)(projectFilePath);
148
- const excludedPaths = [currentDir];
149
- const repoRootParentPath = path.dirname(repoRoot);
150
- // Start from the parent directory of the source file, because test project is usually in the parent directory
151
- currentDir = path.dirname(currentDir);
152
- while (currentDir !== repoRootParentPath) {
153
- const csprojFiles = findAllCsprojFiles(currentDir, excludedPaths);
154
- for (const csproj of csprojFiles) {
155
- if (isProjectNameMatchedTestProject(csproj, projectAssemblyName, projectName)) {
156
- return csproj;
157
- }
158
- else if (isXapTestProject(csproj)) {
159
- return csproj;
160
- }
161
- else if (isFalconUnitTestProject(csproj)) {
162
- const filename = path.basename(csproj, '.csproj').toLowerCase();
163
- if (filename.endsWith('unittest') || filename.endsWith('unittests')) {
164
- return csproj;
165
- }
166
- }
167
- else if (isGeneralTestProject(csproj)) {
168
- return csproj;
169
- }
170
- }
171
- // Add current directory to excluded paths to avoid re-checking
172
- excludedPaths.push(currentDir);
173
- currentDir = path.dirname(currentDir);
174
- }
175
- return null;
176
- }
177
- function findPossibleTestFiles(testProjectDir, className) {
178
- const results = [];
179
- const stack = [testProjectDir];
180
- while (stack.length > 0) {
181
- const currentDir = stack.pop();
182
- const entries = fs.readdirSync(currentDir, { withFileTypes: true });
183
- for (const entry of entries) {
184
- if (entry.name === "bin" || entry.name === "obj") {
185
- continue;
186
- }
187
- const fullPath = path.join(currentDir, entry.name);
188
- if (entry.isDirectory()) {
189
- stack.push(fullPath);
190
- }
191
- else if (entry.isFile() && entry.name.endsWith('.cs') && entry.name.includes(className)) {
192
- results.push(fullPath);
193
- }
194
- }
195
- }
196
- return results;
197
- }
198
- function fileContainsTestAttributes(filePath) {
199
- const content = fs.readFileSync(filePath, 'utf-8');
200
- return TEST_ATTR_REGEX.test(content);
201
- }
202
- function getExistingTestFile(sourceCodePath) {
203
- const absPath = path.resolve(sourceCodePath);
204
- const testProjectPath = findTestProjectFromCsFile(absPath);
205
- if (!testProjectPath) {
206
- console.error(`No test project found for ${sourceCodePath}`);
207
- return { testFilePath: null, testProjectPath: null };
208
- }
209
- const testProjectDir = path.dirname(testProjectPath);
210
- const className = path.basename(sourceCodePath, '.cs');
211
- const candidateFiles = findPossibleTestFiles(testProjectDir, className);
212
- for (const testFilePath of candidateFiles) {
213
- if (TEST_NAME_REGEX.test(path.basename(testFilePath))) {
214
- return { testFilePath, testProjectPath };
215
- }
216
- }
217
- return { testFilePath: null, testProjectPath: testProjectPath };
218
- }
219
- function createXapTestProject(sourceCodePath) {
220
- }
221
- function createTestFile(sourceCodePath) {
222
- const testProjectPath = findTestProjectFromCsFile(sourceCodePath);
223
- if (!testProjectPath) {
224
- console.error(`No test project found for ${sourceCodePath}`);
225
- return { testFilePath: null, testProjectPath: null };
226
- }
227
- const sourceFileName = path.basename(sourceCodePath, '.cs');
228
- const testFileName = `${sourceFileName}Tests.cs`;
229
- const sourceFileProjectPath = (0, getCodeStructurePath_1.getSourceFileProjectDir)(sourceCodePath);
230
- const sourceFileDir = path.dirname(sourceCodePath);
231
- const testFileRelativePath = sourceFileDir.replace(sourceFileProjectPath, "");
232
- const testProjecDir = path.dirname(testProjectPath);
233
- const testFilePath = path.join(testProjecDir, testFileRelativePath, testFileName);
234
- const testFileDir = path.dirname(testFilePath);
235
- // Create all missing directories recursively
236
- fs.mkdirSync(testFileDir, { recursive: true });
237
- console.log(`Created test file dir at ${testFilePath}`);
238
- return { testFilePath, testProjectPath };
239
- }
240
- function getOrCreatTestFile(sourceCodePath, testFilePath, isXapCode) {
241
- let finalTestFilePath = testFilePath;
242
- let finalTestProjectPath;
243
- let testFileExist = !!testFilePath && fs.existsSync(testFilePath);
244
- // if outputPath param is not provided, try to find an existing test file
245
- // if no existing test file found, create a new one in test project
246
- if (!testFilePath || testFilePath.trim() === '') {
247
- console.log(' Output path is missing. outputPath:', testFilePath, ', start looking for existing test project');
248
- let result = getExistingTestFile(sourceCodePath);
249
- if (result.testFilePath) {
250
- testFileExist = true;
251
- console.log(`Found existing test file: ${result.testFilePath}`);
252
- }
253
- else {
254
- console.log('No existing test file found, creating a new one.');
255
- result = createTestFile(sourceCodePath);
256
- }
257
- finalTestFilePath = result.testFilePath;
258
- finalTestProjectPath = result.testProjectPath;
259
- }
260
- return { testFilePath: finalTestFilePath, testProjectPath: finalTestProjectPath, testFileExist };
261
- }
262
- // Example usage
263
- // const csFilePath = "D:\\code\\CS.Service.Fundamental\\SharedSegments\\SharedSegments\\SharedSegments.Plugins\\Workflows\\LocationDetection\\AudienceResponseParser.cs";
264
- // const csFilePath = "D:\\code\\msnews-experiences\\experiences\\weather-right-rail\\src\\WeatherRightRail.connector.ts";
265
- // const testProjectPath = "D:\\code\\CS.Service.Fundamental\\SharedSegments\\SharedSegments\\SharedSegments.Tests\\SharedSegments.Tests.csproj";
266
- // if (!csFilePath) {
267
- // console.error('Usage: ts-node findTestFile.ts path/to/your/file.cs');
268
- // process.exit(1);
269
- // }
270
- // const start = Date.now();
271
- // const testFilePath = getExistingTestFile(csFilePath);
272
- // console.log(`Test file for ${csFilePath}:`, testFilePath ?? 'No test file found');
273
- // console.log(`Search completed in ${(Date.now() - start) / 1000} seconds`);
274
- // createXapTestFile(csFilePath);
275
- // const repoDir = getCodeRepoRoot("D:\\code\\CS.Service.Fundamental\\SharedSegments\\SharedSegments\\SharedSegments.Plugins\\Workflows\\LocationDetection\\AudienceResponseParser.cs");
276
- // console.log(`Code repository root directory: ${repoDir}`);
277
- // const result = getExistingTestFile("D:\\code\\CS.Service.Fundamental\\SharedSegments\\SharedSegments\\SharedSegments.Plugins\\Workflows\\Eplant\\EplantConfigManager.cs");
278
- // console.log(`Test file path: ${result.testFilePath}`);
279
- // console.log(`Test project path: ${result.testProjectPath}`);
280
- // falcon test project
281
- // const isFlaconUt = isFalconUnitTestProject("D:\\code\\WeatherNotification\\services\\WeatherUserInterest\\tests\\UnitTests\\Microsoft.Falcon.WeatherUserInterest.UnitTests.csproj");
282
- // console.log(`Is Falcon Unit Test Project: ${isFlaconUt}`);
283
- // const testProject = findTestProjectFromCsFile("D:\\code\\WeatherNotification\\services\\WeatherUserInterest\\src\\Service\\Microsoft.Falcon.WeatherUserInterest.csproj");
284
- // console.log(`Test project path: ${testProject}`);
285
- // const testFilePath = getOrCreatTestFile("D:\\code\\WeatherNotification\\services\\WeatherUserInterest\\src\\Service\\Components\\IUserInterestTable.cs", undefined, false);
286
- // console.log(`Test file path: ${testFilePath.testFilePath}`);
287
- // ads projects
288
- // const testProjectPath = findTestProjectFromCsFile("D:\\code\\UCMDynamics\\private\\DynamicCode\\Plugin\\UCMDynamics.AppointmentPlugin\\AppointmentOperation.cs");
289
- // console.log(`Test project path: ${testProjectPath}`);
290
- // const isValid = isGeneralTestProject("D:\\code\\UCMDynamics\\private\\DynamicCode\\Plugin\\UcmDynamics.AppointmentPlugin\\UcmDynamics.AppointmentPlugin.csproj");
291
- // // const isValid = isGeneralTestProject("D:\\code\\UCMDynamics\\private\\DynamicCode\\Plugin\\UcmDynamics.AppointmentPlugin.Tests\\UcmDynamics.AppointmentPlugin.Tests.csproj");
292
- // console.log(`Is General Test Project: ${isValid}`);
293
- // const testProjectPath = findTestProjectFromCsFile("D:\\code\\AIUnitTestExample\\src\\ToListinator.Analyzers\\ToListCountAnalyzer.cs");
294
- // console.log(`Test project path: ${testProjectPath}`);
295
- //# sourceMappingURL=getTestFile.js.map
@@ -1 +0,0 @@
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,3 +0,0 @@
1
- import { BuildResult } from "../types/buildResult";
2
- export declare function parseMsbuildErrors(buildOutput: string): BuildResult[];
3
- export declare function formatMsbuildResultToMarkdown(errors: BuildResult[]): string;
@@ -1,44 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.parseMsbuildErrors = parseMsbuildErrors;
4
- exports.formatMsbuildResultToMarkdown = formatMsbuildResultToMarkdown;
5
- function parseMsbuildErrors(buildOutput) {
6
- const errors = [];
7
- const lines = buildOutput.split(/\r?\n/);
8
- const regex = /^(.+\.cs)\((\d+),(\d+)(?:,\d+,\d+)?\): error (\w+): (.+?) \[(.+)\]$/;
9
- for (const line of lines) {
10
- const trimmed = line.trim();
11
- if (!trimmed.includes(': error '))
12
- continue;
13
- console.error("build error line:", trimmed);
14
- const match = regex.exec(trimmed);
15
- if (match) {
16
- const [, file, lineStr, columnStr, errorCode, message, project] = match;
17
- errors.push({
18
- file,
19
- line: parseInt(lineStr, 10),
20
- column: parseInt(columnStr, 10),
21
- errorCode,
22
- message,
23
- project,
24
- });
25
- }
26
- }
27
- return errors;
28
- }
29
- function formatMsbuildResultToMarkdown(errors) {
30
- if (errors.length === 0) {
31
- return `#### No MSBuild Errors`;
32
- }
33
- return errors
34
- .map(err => {
35
- const code = `[${err.errorCode}]`;
36
- const line = `Line ${err.line}`;
37
- const message = err.message.replace(/\s+/g, ' ').trim();
38
- return `${code} ${line} - ${message}`;
39
- })
40
- .join('\n');
41
- }
42
- // 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>'");
43
- // console.log(formatMsbuildResultToMarkdown(buildError));
44
- //# sourceMappingURL=parseBuildResult.js.map
@@ -1 +0,0 @@
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,2 +0,0 @@
1
- import { BuildResult } from "../types/buildResult";
2
- export declare function parseSyntaxCheckErrors(testFilePath: string, errorText: string): BuildResult[];
@@ -1,38 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.parseSyntaxCheckErrors = parseSyntaxCheckErrors;
4
- function parseSyntaxCheckErrors(testFilePath, errorText) {
5
- const result = [];
6
- const lines = errorText.split(/\r?\n/).map(line => line.trim()).filter(line => line.length > 0);
7
- const regex = /^\((\d+),(\d+)\):\s+error\s+(CS\d+):\s+(.+)$/;
8
- for (const line of lines) {
9
- const match = line.match(regex);
10
- if (match) {
11
- const [, lineStr, columnStr, errorCode, message] = match;
12
- result.push({
13
- file: testFilePath,
14
- line: Number(lineStr),
15
- column: Number(columnStr),
16
- errorCode,
17
- message,
18
- project: ""
19
- });
20
- }
21
- }
22
- return result;
23
- }
24
- // const buildErrorStr = `
25
- // (74,62): error CS1513: } expected
26
- // (74,62): error CS1513: } expected
27
- // (74,62): error CS1513: } expected
28
- // (23,60): error CS0246: The type or namespace name 'OneServiceRequest' could not be found (are you missing a using directive or an assembly reference?)
29
- // (36,60): error CS0246: The type or namespace name 'OneServiceRequest' could not be found (are you missing a using directive or an assembly reference?)
30
- // (38,44): error CS0103: The name 'WeatherParameters' does not exist in the current context
31
- // (48,60): error CS0246: The type or namespace name 'OneServiceRequest' could not be found (are you missing a using directive or an assembly reference?)
32
- // (63,60): error CS0246: The type or namespace name 'OneServiceRequest' could not be found (are you missing a using directive or an assembly reference?)
33
- // `;
34
- // const buildErrors = parseSyntaxCheckErrors("", buildErrorStr);
35
- // buildErrors.forEach(err => {
36
- // console.log(`File: ${err.file}, Line: ${err.line}, Column: ${err.column}, Code: ${err.errorCode}, Message: ${err.message}, Project: ${err.project}`);
37
- // });
38
- //# sourceMappingURL=parseSyntaxCheckResult.js.map
@@ -1 +0,0 @@
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,3 +0,0 @@
1
- import { TestResult } from "../types/testResult";
2
- export declare function parseVSTestOutput(output: string): TestResult;
3
- export declare function formatVSTestResultToMarkdown(result: TestResult): string;
@@ -1,61 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.parseVSTestOutput = parseVSTestOutput;
4
- exports.formatVSTestResultToMarkdown = formatVSTestResultToMarkdown;
5
- function parseVSTestOutput(output) {
6
- const passedTests = [];
7
- const failedTests = [];
8
- const lines = output.split(/\r?\n/);
9
- let currentFailedTest = null;
10
- for (let i = 0; i < lines.length; i++) {
11
- const line = lines[i].trim();
12
- // Match Passed tests
13
- const passMatch = line.match(/^Passed (.+) \[/);
14
- if (passMatch) {
15
- passedTests.push(passMatch[1]);
16
- continue;
17
- }
18
- // Match Failed tests
19
- const failMatch = line.match(/^Failed (.+) \[/);
20
- if (failMatch) {
21
- currentFailedTest = {
22
- name: failMatch[1],
23
- errorMessage: '',
24
- stackTrace: ''
25
- };
26
- // Read error message
27
- i += 2; // skip "Error Message:"
28
- const errorMessageLines = [];
29
- while (i < lines.length && !lines[i].trim().startsWith('Stack Trace:')) {
30
- errorMessageLines.push(lines[i].trim());
31
- i++;
32
- }
33
- currentFailedTest.errorMessage = errorMessageLines.join('\n');
34
- // Read stack trace
35
- i++; // skip "Stack Trace:"
36
- const stackTraceLines = [];
37
- while (i < lines.length && lines[i].trim() !== '') {
38
- stackTraceLines.push(lines[i].trim());
39
- i++;
40
- }
41
- currentFailedTest.stackTrace = stackTraceLines.join('\n');
42
- failedTests.push(currentFailedTest);
43
- currentFailedTest = null;
44
- }
45
- }
46
- return { passedTests, failedTests, totalTests: passedTests.length + failedTests.length, passed: passedTests.length, failed: failedTests.length };
47
- }
48
- function formatVSTestResultToMarkdown(result) {
49
- const lines = [];
50
- result.failedTests.forEach(test => {
51
- const lineNumbers = Array.from(test.stackTrace.matchAll(/:line (\d+)/g)).map(m => m[1]);
52
- lines.push(`#### ${test.name}`);
53
- if (lineNumbers.length > 0) {
54
- lines.push(`**line**: ${lineNumbers.join(', ')}`);
55
- }
56
- lines.push(`**Error Message**: ${test.errorMessage}`);
57
- lines.push('');
58
- });
59
- return lines.join('\n');
60
- }
61
- //# sourceMappingURL=parseVstestResult.js.map
@@ -1 +0,0 @@
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,3 +0,0 @@
1
- import { TestResult } from '../types/testResult';
2
- export declare function removeFailedTests(filePath: string, failedTestNames: string[]): string;
3
- export declare function removeFailedTestCasesInTestFile(vsTestRes: TestResult, testFilePath: string): void;