@ai-dev-tools/csharp-copilot-core 0.0.19 → 0.0.28

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 (82) hide show
  1. package/ReadMe.md +172 -0
  2. package/out/analyze/generateCodeDependency.d.ts +1 -1
  3. package/out/analyze/generateCodeDependency.js +7 -3
  4. package/out/analyze/generateCodeDependency.js.map +1 -1
  5. package/out/batch/getProjectCodeFile.js +1 -2
  6. package/out/batch/getProjectCodeFile.js.map +1 -1
  7. package/out/codeCoverage/codeCoverage.js +5 -1
  8. package/out/codeCoverage/codeCoverage.js.map +1 -1
  9. package/out/codeCoverage/codeCoverageReport.js +5 -1
  10. package/out/codeCoverage/codeCoverageReport.js.map +1 -1
  11. package/out/codeCoverage/extractCoverageReportPath.d.ts +1 -0
  12. package/out/codeCoverage/extractCoverageReportPath.js +24 -0
  13. package/out/codeCoverage/extractCoverageReportPath.js.map +1 -0
  14. package/out/codeCoverage/generateCodeCoverageReport.js +3 -0
  15. package/out/codeCoverage/generateCodeCoverageReport.js.map +1 -1
  16. package/out/codeCoverage/simplifyCoverageXml.js +2 -1
  17. package/out/codeCoverage/simplifyCoverageXml.js.map +1 -1
  18. package/out/command/index.js +11 -2
  19. package/out/command/index.js.map +1 -1
  20. package/out/command/utGenWrapper.d.ts +1 -0
  21. package/out/command/utGenWrapper.js +8 -2
  22. package/out/command/utGenWrapper.js.map +1 -1
  23. package/out/gen/autoFix.d.ts +3 -3
  24. package/out/gen/autoFix.js +8 -8
  25. package/out/gen/autoFix.js.map +1 -1
  26. package/out/gen/csharpUtGen.d.ts +1 -1
  27. package/out/gen/csharpUtGen.js +7 -33
  28. package/out/gen/csharpUtGen.js.map +1 -1
  29. package/out/gen/ensureValidLLMResponse.d.ts +1 -1
  30. package/out/gen/ensureValidLLMResponse.js +2 -2
  31. package/out/gen/ensureValidLLMResponse.js.map +1 -1
  32. package/out/gen/postGen/postGenProcess.d.ts +1 -1
  33. package/out/gen/postGen/postGenProcess.js +3 -2
  34. package/out/gen/postGen/postGenProcess.js.map +1 -1
  35. package/out/gen/postGen/repairRequiredNameSpaces.d.ts +2 -1
  36. package/out/gen/postGen/repairRequiredNameSpaces.js +29 -4
  37. package/out/gen/postGen/repairRequiredNameSpaces.js.map +1 -1
  38. package/out/index.d.ts +1 -0
  39. package/out/index.js +3 -1
  40. package/out/index.js.map +1 -1
  41. package/out/llm/model/{Gpt4o.js → Gpt.js} +5 -3
  42. package/out/llm/model/Gpt.js.map +1 -0
  43. package/out/llm/preparePrompt.js +26 -1
  44. package/out/llm/preparePrompt.js.map +1 -1
  45. package/out/llm/prompt/generateUtAutoFix.liquid +5 -1
  46. package/out/llm/prompt/generateUtTemplate.liquid +2 -0
  47. package/out/llm/sendRequestToLLM.js +0 -3
  48. package/out/llm/sendRequestToLLM.js.map +1 -1
  49. package/out/llm/sendRequestToSelfHostLLM.js +4 -4
  50. package/out/llm/sendRequestToSelfHostLLM.js.map +1 -1
  51. package/out/types/constants.d.ts +3 -0
  52. package/out/types/constants.js +4 -1
  53. package/out/types/constants.js.map +1 -1
  54. package/out/utils/detectTestFramework.js +7 -6
  55. package/out/utils/detectTestFramework.js.map +1 -1
  56. package/out/utils/getTestFile.js +1 -1
  57. package/out/utils/getTestFile.js.map +1 -1
  58. package/out/vs/msBuild.js +3 -35
  59. package/out/vs/msBuild.js.map +1 -1
  60. package/out/vs/vsTest.js +3 -35
  61. package/out/vs/vsTest.js.map +1 -1
  62. package/package.json +4 -3
  63. package/publish/package.json +37 -0
  64. package/ai-dev-tools-csharp-copilot-core-0.0.19.tgz +0 -0
  65. package/out/atmpCache/deps/EplantRequestCategoryCondition_Conditions_Eplant_Workflows_SharedSegmentsPlugins_SharedSegments_SharedSegments_CSServiceFundamental_code_D.deps +0 -281
  66. package/out/atmpCache/deps/IdentitySelectAnalyzer_ToListinatorAnalyzers_src_AIUnitTestExample_code_d.deps +0 -1
  67. package/out/atmpCache/deps/SqmidHelperTests_Utils_HttpRequestParser_Overview_Workflows_SharedSegmentsTests_SharedSegments_SharedSegments_CSServiceFundamental_code_D.deps +0 -1
  68. package/out/atmpCache/deps/SqmidHelper_Utils_HttpRequestParser_Overview_Workflows_SharedSegmentsPlugins_SharedSegments_SharedSegments_CSServiceFundamental_code_D.deps +0 -1
  69. package/out/atmpCache/deps/ToListCountAnalyzerTests_ToListinatorTests_test_AIUnitTestExample_code_d.deps +0 -4037
  70. package/out/atmpCache/deps/ToListCountAnalyzer_ToListinatorAnalyzers_src_AIUnitTestExample_code_d.deps +0 -1
  71. package/out/atmpCache/deps/ToListCountCodeFixProvider_ToListinatorCodeFixes_src_AIUnitTestExample_code_d.deps +0 -1
  72. package/out/atmpCache/deps/ToListForEachAnalyzer_ToListinatorAnalyzers_src_AIUnitTestExample_code_d.deps +0 -1
  73. package/out/atmpCache/dllref/ToListinatorTests_ToListinatorTests_test_AIUnitTestExample_code_d.dllref +0 -202
  74. package/out/llm/model/Gpt4o.js.map +0 -1
  75. package/out/llm/model/claude4.d.ts +0 -1
  76. package/out/llm/model/claude4.js +0 -3
  77. package/out/llm/model/claude4.js.map +0 -1
  78. package/out/llm/prompt/generateUtGuidelines.liquid +0 -29
  79. package/out/llm/prompt/testAfGuidelines.liquid +0 -6
  80. package/out/llm/prompt/userCustomPrompt.liquid +0 -0
  81. package/out/llm/prompt/xap/xapUtGuideline-240804.liquid +0 -36
  82. /package/out/llm/model/{Gpt4o.d.ts → Gpt.d.ts} +0 -0
package/ReadMe.md ADDED
@@ -0,0 +1,172 @@
1
+ # C# Unit Test Copilot Core
2
+
3
+ Core library for csharp-copilot - AI-powered C# unit test generation tool.
4
+
5
+ ## Installation
6
+
7
+ ### Global Installation (Recommended)
8
+
9
+ Install the package globally to use the `csharputc` command anywhere:
10
+
11
+ ```bash
12
+ npm install -g @aidevtools/csharp-copilot-core
13
+ ```
14
+
15
+ Or if you're working with the source code:
16
+
17
+ ```bash
18
+ npm install -g .
19
+ ```
20
+
21
+ ### Local Development
22
+
23
+ If you want to run from source without global installation:
24
+
25
+ ```bash
26
+ # Build the project
27
+ npm run build
28
+
29
+ # Run directly
30
+ node out/command/index.js <command> [options]
31
+
32
+ # Or use npx
33
+ npx . <command> [options]
34
+ ```
35
+
36
+ ## Usage
37
+
38
+ The `csharputc` command provides several subcommands for different use cases:
39
+
40
+ ### Commands
41
+
42
+ #### 1. Generate Unit Tests for Single File
43
+ ```bash
44
+ csharputc utcmd -s <source-code-file-path>
45
+ ```
46
+
47
+ #### 2. Batch Generate Unit Tests for Project/Solution
48
+ ```bash
49
+ csharputc utbatch -s <project-or-solution-path>
50
+ ```
51
+
52
+ #### 3. Generate Benchmark Report
53
+ ```bash
54
+ csharputc utbenchmark -s <project-or-solution-path>
55
+ ```
56
+
57
+ #### 4. VS Plugin Integration
58
+ ```bash
59
+ csharputc utvsplugin
60
+ ```
61
+
62
+ ### Options
63
+
64
+ - `-s, --sourceCodePath`: Source code file path, project path, or solution path
65
+ - `-t, --testCodePath`: Target test file or directory
66
+ - `--af, --autofix`: Auto-fix generated test code (0/1, default: 0)
67
+ - `--keepFailedTest`: Keep failed test cases (0/1, default: 1)
68
+ - `--enableCov`: Run code coverage (0/1, default: 0)
69
+ - `--LLMModel`: LLM model to use (default: "gpt4o")
70
+ - `--source`: Where the test copilot is running (local/vsplugin, default: "local")
71
+ - `-m, --mode`: Work mode (generate/repair, default: "generate")
72
+ - `--np, --nugetPackagePath`: NuGet packages path for code analyzer
73
+
74
+ ### Examples
75
+
76
+ #### Generate tests for a single C# file:
77
+ ```bash
78
+ csharputc utcmd -s "C:\MyProject\MyClass.cs"
79
+ ```
80
+
81
+ #### Generate tests with auto-fix enabled:
82
+ ```bash
83
+ csharputc utcmd -s "C:\MyProject\MyClass.cs" --af 1
84
+ ```
85
+
86
+ #### Batch generate tests for entire project:
87
+ ```bash
88
+ csharputc utbatch -s "C:\MyProject\MyProject.csproj"
89
+ ```
90
+
91
+ #### Generate tests with code coverage:
92
+ ```bash
93
+ csharputc utcmd -s "C:\MyProject\MyClass.cs" --enableCov 1
94
+ ```
95
+
96
+ #### Generate benchmark report for solution:
97
+ ```bash
98
+ csharputc utbenchmark -s "C:\MySolution\MySolution.sln"
99
+ ```
100
+
101
+ #### Generate tests with custom test output path:
102
+ ```bash
103
+ csharputc utcmd -s "C:\MyProject\MyClass.cs" -t "C:\MyProject\Tests\MyClassTests.cs"
104
+ ```
105
+
106
+ ## Help
107
+
108
+ To see all available options and commands:
109
+
110
+ ```bash
111
+ csharputc --help
112
+ ```
113
+
114
+ To get help for a specific command:
115
+
116
+ ```bash
117
+ csharputc utcmd --help
118
+ csharputc utbatch --help
119
+ csharputc utbenchmark --help
120
+ csharputc utvsplugin --help
121
+ ```
122
+
123
+ ## Development
124
+
125
+ ### Build
126
+
127
+ ```bash
128
+ npm run build
129
+ ```
130
+
131
+ This will:
132
+ 1. Compile TypeScript files to JavaScript
133
+ 2. Copy liquid template files and tools to the output directory
134
+
135
+ ## Publish
136
+
137
+ ### publish to npmjs
138
+
139
+ ```bash
140
+ npm logout
141
+ npm login --registry=https://registry.npmjs.org/
142
+ $ npm publish --registry https://registry.npmjs.org/ --access public
143
+ ```
144
+
145
+ ### del published package within 72 hours
146
+
147
+ ```bash
148
+ npm unpublish @ai-dev-tools/csharp-copilot-core@1.0.19
149
+ ```
150
+
151
+ Note:
152
+ if you want to publish to devops feeds, use the file in /publish
153
+
154
+ ### Scripts
155
+
156
+ - `build`: Compile TypeScript and copy assets
157
+ - `copy-script`: Copy liquid templates and tools to output
158
+ - `setup-npm-auth`: Setup authentication for Azure Artifacts
159
+
160
+ ## Dependencies
161
+
162
+ This project uses several key dependencies:
163
+ - **yargs**: Command-line argument parsing
164
+ - **liquidjs**: Template engine for code generation
165
+ - **applicationinsights**: Telemetry
166
+ - **edge-js**: .NET interop
167
+ - **fast-xml-parser**: XML parsing for test results
168
+ - **node-fetch**: HTTP requests for LLM APIs
169
+
170
+ ## License
171
+
172
+ This is an internal Microsoft tool for AI-powered C# unit test generation.
@@ -1,4 +1,4 @@
1
- export declare function generateCodeDependency(sourceCodePath: string): Promise<string>;
1
+ export declare function generateCodeDependency(sourceCodePath: string, nugetPackagePath?: string): Promise<string>;
2
2
  export declare function codeAnalyzerErrorHandler(error: any): boolean;
3
3
  export declare function codeAnalyzerCloseHandler(code: any, stdout: any, stderr: any): {
4
4
  success: boolean;
@@ -42,7 +42,7 @@ const generateCodeSha256_1 = require("../utils/generateCodeSha256");
42
42
  const getOrCreateDir_1 = require("../utils/getOrCreateDir");
43
43
  const spawnExec_1 = require("../utils/spawnExec");
44
44
  const DepAnalyzerDir = "./deps/";
45
- async function generateCodeDependency(sourceCodePath) {
45
+ async function generateCodeDependency(sourceCodePath, nugetPackagePath = null) {
46
46
  const startTime = Date.now();
47
47
  const normalizedPath = path.normalize(sourceCodePath);
48
48
  const codeDepsFileName = normalizedPath.replace(".cs", "").replace(":", "").replaceAll(".", "").split("\\").reverse().join("_");
@@ -53,7 +53,7 @@ async function generateCodeDependency(sourceCodePath) {
53
53
  depsStr = getCachedCodeDeps(normalizedPath, codeDepsFilePath);
54
54
  }
55
55
  if (!depsStr) {
56
- const { success, message } = await runCsharpCodeAnalyzer(normalizedPath);
56
+ const { success, message } = await runCsharpCodeAnalyzer(normalizedPath, nugetPackagePath);
57
57
  if (!success) {
58
58
  console.error(`Code analysis failed: ${message}`);
59
59
  return "";
@@ -63,8 +63,12 @@ async function generateCodeDependency(sourceCodePath) {
63
63
  console.log(`Generate depencency time: ${(Date.now() - startTime) / 1000} seconds`);
64
64
  return depsStr;
65
65
  }
66
- function runCsharpCodeAnalyzer(sourceCodePath) {
66
+ function runCsharpCodeAnalyzer(sourceCodePath, nugetPackagePath = null) {
67
67
  const args = ['-c', sourceCodePath];
68
+ if (nugetPackagePath) {
69
+ args.push('-p');
70
+ args.push(nugetPackagePath);
71
+ }
68
72
  const workDir = (0, getOrCreateDir_1.getTmpCacheDir)(DepAnalyzerDir);
69
73
  console.log('📦 Running Csharp code analyzer...');
70
74
  return (0, spawnExec_1.runSpawn)("ccanalyzer", args, workDir, codeAnalyzerErrorHandler, codeAnalyzerCloseHandler);
@@ -1 +1 @@
1
- {"version":3,"file":"generateCodeDependency.js","sourceRoot":"","sources":["../../src/analyze/generateCodeDependency.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AASA,wDAuBC;AASD,4DAGC;AAED,4DAaC;AA3DD,uCAAyB;AACzB,2CAA6B;AAE7B,oEAAiE;AACjE,4DAAyD;AACzD,kDAA8C;AAE9C,MAAM,cAAc,GAAG,SAAS,CAAA;AAEzB,KAAK,UAAU,sBAAsB,CAAC,cAAsB;IAC/D,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAE7B,MAAM,cAAc,GAAG,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;IACtD,MAAM,gBAAgB,GAAG,cAAc,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAChI,MAAM,WAAW,GAAG,IAAA,+BAAc,EAAC,cAAc,CAAC,CAAC;IACnD,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,gBAAgB,GAAG,OAAO,CAAC,CAAC;IAC5E,IAAI,OAAO,CAAC;IACZ,IAAI,EAAE,CAAC,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;QAClC,OAAO,GAAG,iBAAiB,CAAC,cAAc,EAAE,gBAAgB,CAAC,CAAC;IAClE,CAAC;IACD,IAAI,CAAC,OAAO,EAAE,CAAC;QACX,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,MAAM,qBAAqB,CAAC,cAAc,CAAC,CAAC;QACzE,IAAI,CAAC,OAAO,EAAE,CAAC;YACX,OAAO,CAAC,KAAK,CAAC,yBAAyB,OAAO,EAAE,CAAC,CAAC;YAClD,OAAO,EAAE,CAAC;QACd,CAAC;QACD,OAAO,GAAG,aAAa,CAAC,gBAAgB,CAAC,CAAC;IAC9C,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,GAAG,IAAI,UAAU,CAAC,CAAC;IAEpF,OAAO,OAAO,CAAC;AACnB,CAAC;AAED,SAAS,qBAAqB,CAAC,cAAsB;IACjD,MAAM,IAAI,GAAG,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;IACpC,MAAM,OAAO,GAAG,IAAA,+BAAc,EAAC,cAAc,CAAC,CAAC;IAC/C,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;IAClD,OAAO,IAAA,oBAAQ,EAAC,YAAY,EAAE,IAAI,EAAE,OAAO,EAAE,wBAAwB,EAAE,wBAAwB,CAAC,CAAC;AACrG,CAAC;AAED,SAAgB,wBAAwB,CAAC,KAAK;IAC1C,OAAO,CAAC,KAAK,CAAC,sCAAsC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IACrE,OAAO,IAAI,CAAC;AAChB,CAAC;AAED,SAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM;IACzD,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,sCAAsC,IAAI,EAAE,CAAC,CAAC;QAC5D,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IAC/C,CAAC;IAED,IAAI,MAAM,EAAE,CAAC;QACT,OAAO,CAAC,KAAK,CAAC,qBAAqB,MAAM,EAAE,CAAC,CAAC;QAC7C,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IAC/C,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,4BAA4B,MAAM,EAAE,CAAC,CAAC;IAClD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;AAC9C,CAAC;AAED,SAAS,iBAAiB,CAAC,cAAsB,EAAE,YAAoB;IACnE,IAAI,CAAC;QACD,MAAM,WAAW,GAAG,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QAE3D,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAEzC,MAAM,YAAY,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QAC9B,MAAM,WAAW,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;QAErD,MAAM,aAAa,GAAG,IAAA,uCAAkB,EAAC,cAAc,CAAC,CAAC;QAEzD,IAAI,aAAa,KAAK,YAAY,EAAE,CAAC;YACjC,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;YACtD,OAAO,WAAW,CAAC;QACvB,CAAC;aAAM,CAAC;YACJ,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;YACjC,OAAO,IAAI,CAAC;QAChB,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QAC7B,OAAO,IAAI,CAAC;IAChB,CAAC;AACL,CAAC;AAED,SAAS,aAAa,CAAC,YAAoB;IACvC,MAAM,WAAW,GAAG,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;IAClE,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACzC,MAAM,aAAa,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChD,OAAO,aAAa,CAAC;AACzB,CAAC;AAED,wLAAwL;AACxL,4LAA4L;AAC5L,yJAAyJ;AACzJ,uLAAuL;AACvL,uLAAuL;AACvL,iPAAiP;AACjP,6TAA6T","sourcesContent":["import * as fs from 'fs';\r\nimport * as path from 'path';\r\n\r\nimport { generateCodeSha256 } from '../utils/generateCodeSha256';\r\nimport { getTmpCacheDir } from '../utils/getOrCreateDir';\r\nimport { runSpawn } from '../utils/spawnExec';\r\n\r\nconst DepAnalyzerDir = \"./deps/\"\r\n\r\nexport async function generateCodeDependency(sourceCodePath: string): Promise<string> {\r\n const startTime = Date.now();\r\n\r\n const normalizedPath = path.normalize(sourceCodePath);\r\n const codeDepsFileName = normalizedPath.replace(\".cs\", \"\").replace(\":\", \"\").replaceAll(\".\", \"\").split(\"\\\\\").reverse().join(\"_\");\r\n const codeDepsDir = getTmpCacheDir(DepAnalyzerDir);\r\n const codeDepsFilePath = path.join(codeDepsDir, codeDepsFileName + \".deps\");\r\n let depsStr;\r\n if (fs.existsSync(codeDepsFilePath)) {\r\n depsStr = getCachedCodeDeps(normalizedPath, codeDepsFilePath);\r\n }\r\n if (!depsStr) {\r\n const { success, message } = await runCsharpCodeAnalyzer(normalizedPath);\r\n if (!success) {\r\n console.error(`Code analysis failed: ${message}`);\r\n return \"\";\r\n }\r\n depsStr = getDependency(codeDepsFilePath);\r\n }\r\n\r\n console.log(`Generate depencency time: ${(Date.now() - startTime) / 1000} seconds`);\r\n\r\n return depsStr;\r\n}\r\n\r\nfunction runCsharpCodeAnalyzer(sourceCodePath: string): Promise<any> {\r\n const args = ['-c', sourceCodePath];\r\n const workDir = getTmpCacheDir(DepAnalyzerDir);\r\n console.log('📦 Running Csharp code analyzer...');\r\n return runSpawn(\"ccanalyzer\", args, workDir, codeAnalyzerErrorHandler, codeAnalyzerCloseHandler);\r\n}\r\n\r\nexport function codeAnalyzerErrorHandler(error) {\r\n console.error(`codeAnalyzerErrorHandler - failed: ${error.message}`);\r\n return true;\r\n}\r\n\r\nexport function codeAnalyzerCloseHandler(code, stdout, stderr) {\r\n if (code !== 0) {\r\n console.error(`Code Analyze failed with exit code ${code}`);\r\n return { success: false, message: stdout };\r\n }\r\n\r\n if (stderr) {\r\n console.error(`Warnings/Errors:\\n${stderr}`);\r\n return { success: false, message: stdout };\r\n }\r\n\r\n console.log(`Code Analyze succeeded:\\n${stdout}`);\r\n return { success: true, message: stdout };\r\n}\r\n\r\nfunction getCachedCodeDeps(sourceCodePath: string, depsFilePath: string) {\r\n try {\r\n const fileContent = fs.readFileSync(depsFilePath, 'utf-8');\r\n\r\n const lines = fileContent.split(/\\r?\\n/);\r\n\r\n const cachedSha256 = lines[0];\r\n const depsContent = lines.slice(1).join('\\n').trim();\r\n\r\n const currentSha256 = generateCodeSha256(sourceCodePath);\r\n\r\n if (currentSha256 === cachedSha256) {\r\n console.log('code unchanged, returning cached deps.');\r\n return depsContent;\r\n } else {\r\n console.log('code has changed.');\r\n return null;\r\n }\r\n } catch (err) {\r\n console.error('Error:', err);\r\n return null;\r\n }\r\n}\r\n\r\nfunction getDependency(depsFilePath: string) {\r\n const fileContent = fs.readFileSync(depsFilePath, 'utf-8').trim();\r\n const lines = fileContent.split(/\\r?\\n/);\r\n const dependencyStr = lines.slice(1).join('\\n');\r\n return dependencyStr;\r\n}\r\n\r\n// generateCodeDependency(\"D:\\\\code\\\\CS.Service.Fundamental\\\\SharedSegments\\\\SharedSegments\\\\SharedSegments.Plugins\\\\Workflows\\\\Eplant\\\\Conditions\\\\EplantRequestCategoryCondition.cs\");\r\n// generateCodeDependency(\"D:\\\\code\\\\CS.Service.Fundamental\\\\SharedSegments\\\\SharedSegments\\\\SharedSegments.Plugins\\\\Workflows\\\\Eplant\\\\ResponseBuilders\\\\EplantMigrateResponseBuilder.cs\");\r\n// generateCodeDependency(\"D:/code/CS.Service.Fundamental/SharedSegments/SharedSegments/SharedSegments.Plugins/Workflows/Eplant/EplantConfigManager.cs\");\r\n// generateCodeDependency(\"C:\\\\code\\\\CS.Service.Fundamental\\\\SharedSegments\\\\SharedSegments\\\\SharedSegments.Plugins\\\\Workflows\\\\Eplant\\\\ResponseBuilders\\\\EplantMeResponseBuilder.cs\");\r\n// generateCodeDependency(\"D:\\\\code\\\\CS.Service.Fundamental\\\\SharedSegments\\\\SharedSegments\\\\SharedSegments.Plugins\\\\Workflows\\\\Eplant\\\\RequestBuilders\\\\EplantRankRequestBuilder.cs\");\r\n// getDependency(\"D:\\\\code\\\\ai-dev-tools\\\\csharp-ut-copilot\\\\csharp-ut-core\\\\out\\\\atmpCache\\\\deps\\\\SqmidHelper_Utils_HttpRequestParser_Overview_Workflows_SharedSegmentsPlugins_SharedSegments_SharedSegments_CSServiceFundamental_code_D.deps\");\r\n// getCachedCodeDeps(\"D:\\\\code\\\\UCMDynamics\\\\private\\\\DynamicCode\\\\Plugin\\\\UCMDynamics.AppointmentPlugin\\\\AppointmentOperation.cs\", \"D:\\\\code\\\\ai-dev-tools\\\\csharp-ut-copilot\\\\csharp-ut-core\\\\out\\\\atmpCache\\\\deps\\\\AppointmentOperation_UCMDynamicsAppointmentPlugin_Plugin_DynamicCode_private_UCMDynamics_code_D.deps\");"]}
1
+ {"version":3,"file":"generateCodeDependency.js","sourceRoot":"","sources":["../../src/analyze/generateCodeDependency.ts"],"names":[],"mappings":"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","sourcesContent":["import * as fs from 'fs';\r\nimport * as path from 'path';\r\n\r\nimport { generateCodeSha256 } from '../utils/generateCodeSha256';\r\nimport { getTmpCacheDir } from '../utils/getOrCreateDir';\r\nimport { runSpawn } from '../utils/spawnExec';\r\n\r\nconst DepAnalyzerDir = \"./deps/\"\r\n\r\nexport async function generateCodeDependency(sourceCodePath: string, nugetPackagePath: string = null): Promise<string> {\r\n const startTime = Date.now();\r\n\r\n const normalizedPath = path.normalize(sourceCodePath);\r\n const codeDepsFileName = normalizedPath.replace(\".cs\", \"\").replace(\":\", \"\").replaceAll(\".\", \"\").split(\"\\\\\").reverse().join(\"_\");\r\n const codeDepsDir = getTmpCacheDir(DepAnalyzerDir);\r\n const codeDepsFilePath = path.join(codeDepsDir, codeDepsFileName + \".deps\");\r\n let depsStr;\r\n if (fs.existsSync(codeDepsFilePath)) {\r\n depsStr = getCachedCodeDeps(normalizedPath, codeDepsFilePath);\r\n }\r\n if (!depsStr) {\r\n const { success, message } = await runCsharpCodeAnalyzer(normalizedPath, nugetPackagePath);\r\n if (!success) {\r\n console.error(`Code analysis failed: ${message}`);\r\n return \"\";\r\n }\r\n depsStr = getDependency(codeDepsFilePath);\r\n }\r\n\r\n console.log(`Generate depencency time: ${(Date.now() - startTime) / 1000} seconds`);\r\n\r\n return depsStr;\r\n}\r\n\r\nfunction runCsharpCodeAnalyzer(sourceCodePath: string, nugetPackagePath = null): Promise<any> {\r\n const args = ['-c', sourceCodePath];\r\n if (nugetPackagePath) {\r\n args.push('-p');\r\n args.push(nugetPackagePath);\r\n }\r\n const workDir = getTmpCacheDir(DepAnalyzerDir);\r\n console.log('📦 Running Csharp code analyzer...');\r\n return runSpawn(\"ccanalyzer\", args, workDir, codeAnalyzerErrorHandler, codeAnalyzerCloseHandler);\r\n}\r\n\r\nexport function codeAnalyzerErrorHandler(error) {\r\n console.error(`codeAnalyzerErrorHandler - failed: ${error.message}`);\r\n return true;\r\n}\r\n\r\nexport function codeAnalyzerCloseHandler(code, stdout, stderr) {\r\n if (code !== 0) {\r\n console.error(`Code Analyze failed with exit code ${code}`);\r\n return { success: false, message: stdout };\r\n }\r\n\r\n if (stderr) {\r\n console.error(`Warnings/Errors:\\n${stderr}`);\r\n return { success: false, message: stdout };\r\n }\r\n\r\n console.log(`Code Analyze succeeded:\\n${stdout}`);\r\n return { success: true, message: stdout };\r\n}\r\n\r\nfunction getCachedCodeDeps(sourceCodePath: string, depsFilePath: string) {\r\n try {\r\n const fileContent = fs.readFileSync(depsFilePath, 'utf-8');\r\n\r\n const lines = fileContent.split(/\\r?\\n/);\r\n\r\n const cachedSha256 = lines[0];\r\n const depsContent = lines.slice(1).join('\\n').trim();\r\n\r\n const currentSha256 = generateCodeSha256(sourceCodePath);\r\n\r\n if (currentSha256 === cachedSha256) {\r\n console.log('code unchanged, returning cached deps.');\r\n return depsContent;\r\n } else {\r\n console.log('code has changed.');\r\n return null;\r\n }\r\n } catch (err) {\r\n console.error('Error:', err);\r\n return null;\r\n }\r\n}\r\n\r\nfunction getDependency(depsFilePath: string) {\r\n const fileContent = fs.readFileSync(depsFilePath, 'utf-8').trim();\r\n const lines = fileContent.split(/\\r?\\n/);\r\n const dependencyStr = lines.slice(1).join('\\n');\r\n return dependencyStr;\r\n}\r\n\r\n// generateCodeDependency(\"D:\\\\code\\\\CS.Service.Fundamental\\\\SharedSegments\\\\SharedSegments\\\\SharedSegments.Plugins\\\\Workflows\\\\Eplant\\\\Conditions\\\\EplantRequestCategoryCondition.cs\");\r\n// generateCodeDependency(\"D:\\\\code\\\\CS.Service.Fundamental\\\\SharedSegments\\\\SharedSegments\\\\SharedSegments.Plugins\\\\Workflows\\\\Eplant\\\\ResponseBuilders\\\\EplantMigrateResponseBuilder.cs\");\r\n// generateCodeDependency(\"D:/code/CS.Service.Fundamental/SharedSegments/SharedSegments/SharedSegments.Plugins/Workflows/Eplant/EplantConfigManager.cs\");\r\n// generateCodeDependency(\"C:\\\\code\\\\CS.Service.Fundamental\\\\SharedSegments\\\\SharedSegments\\\\SharedSegments.Plugins\\\\Workflows\\\\Eplant\\\\ResponseBuilders\\\\EplantMeResponseBuilder.cs\");\r\n// generateCodeDependency(\"D:\\\\code\\\\CS.Service.Fundamental\\\\SharedSegments\\\\SharedSegments\\\\SharedSegments.Plugins\\\\Workflows\\\\Eplant\\\\RequestBuilders\\\\EplantRankRequestBuilder.cs\");\r\n// getDependency(\"D:\\\\code\\\\ai-dev-tools\\\\csharp-ut-copilot\\\\csharp-ut-core\\\\out\\\\atmpCache\\\\deps\\\\SqmidHelper_Utils_HttpRequestParser_Overview_Workflows_SharedSegmentsPlugins_SharedSegments_SharedSegments_CSServiceFundamental_code_D.deps\");\r\n// getCachedCodeDeps(\"D:\\\\code\\\\UCMDynamics\\\\private\\\\DynamicCode\\\\Plugin\\\\UCMDynamics.AppointmentPlugin\\\\AppointmentOperation.cs\", \"D:\\\\code\\\\ai-dev-tools\\\\csharp-ut-copilot\\\\csharp-ut-core\\\\out\\\\atmpCache\\\\deps\\\\AppointmentOperation_UCMDynamicsAppointmentPlugin_Plugin_DynamicCode_private_UCMDynamics_code_D.deps\");"]}
@@ -79,8 +79,7 @@ async function getSourceFilesFromCsproj(csprojPath) {
79
79
  absolute: true,
80
80
  ignore: ['**/bin/**', '**/obj/**']
81
81
  });
82
- const normalizedCsFiles = csFiles.map(file => path.normalize(file));
83
- files.push(...normalizedCsFiles);
82
+ files.push(...csFiles);
84
83
  }
85
84
  return files;
86
85
  }
@@ -1 +1 @@
1
- {"version":3,"file":"getProjectCodeFile.js","sourceRoot":"","sources":["../../src/batch/getProjectCodeFile.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAUA,4DA+CC;AAzDD,uCAAyB;AACzB,2CAA6B;AAE7B,qDAA4C;AAC5C,gEAA6D;AAC7D,0DAA2B;AAE3B;;GAEG;AACI,KAAK,UAAU,wBAAwB,CAAC,UAAkB;IAC7D,IAAI,IAAA,mCAAgB,EAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,OAAO,CAAC,KAAK,CAAC,2BAA2B,UAAU,cAAc,CAAC,CAAC;QACnE,OAAO,EAAE,CAAC;IACd,CAAC;IAED,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IACjD,MAAM,MAAM,GAAG,IAAI,2BAAS,CAAC;QACzB,gBAAgB,EAAE,KAAK;QACvB,mBAAmB,EAAE,EAAE;KAC1B,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAEjC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC5C,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,EAAE,SAAS,IAAI,EAAE,CAAC;IAEnD,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;IAErE,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QACzB,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC;QAE/B,IAAI,QAAQ,EAAE,CAAC;YACX,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;YAErE,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;gBAC9B,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;oBACf,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;oBACxD,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACzB,CAAC;YACL,CAAC;QACL,CAAC;IACL,CAAC;IAED,wFAAwF;IACxF,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC;QAC5C,MAAM,OAAO,GAAG,MAAM,IAAA,mBAAE,EAAC,CAAC,SAAS,CAAC,EAAE;YAClC,GAAG,EAAE,UAAU;YACf,QAAQ,EAAE,IAAI;YACd,MAAM,EAAE,CAAC,WAAW,EAAE,WAAW,CAAC;SACrC,CAAC,CAAC;QACH,MAAM,iBAAiB,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;QACpE,KAAK,CAAC,IAAI,CAAC,GAAG,iBAAiB,CAAC,CAAC;IACrC,CAAC;IAED,OAAO,KAAK,CAAC;AACjB,CAAC","sourcesContent":["import * as fs from 'fs';\r\nimport * as path from 'path';\r\n\r\nimport { XMLParser } from 'fast-xml-parser';\r\nimport { checkTestProject } from '../utils/checkTestProject';\r\nimport fg from 'fast-glob';\r\n\r\n/**\r\n * parse .csproj to extract all source files\r\n */\r\nexport async function getSourceFilesFromCsproj(csprojPath: string): Promise<string[]> {\r\n if (checkTestProject(csprojPath)) {\r\n console.error(`This is a test project: ${csprojPath}, skip it...`);\r\n return [];\r\n }\r\n\r\n const xml = fs.readFileSync(csprojPath, 'utf-8');\r\n const parser = new XMLParser({\r\n ignoreAttributes: false,\r\n attributeNamePrefix: '',\r\n });\r\n const result = parser.parse(xml);\r\n\r\n const projectDir = path.dirname(csprojPath);\r\n const files: string[] = [];\r\n\r\n const itemGroups = result.Project?.ItemGroup ?? [];\r\n\r\n const groups = Array.isArray(itemGroups) ? itemGroups : [itemGroups];\r\n\r\n for (const group of groups) {\r\n const compiles = group.Compile;\r\n\r\n if (compiles) {\r\n const compileArray = Array.isArray(compiles) ? compiles : [compiles];\r\n\r\n for (const item of compileArray) {\r\n if (item.Include) {\r\n const filePath = path.resolve(projectDir, item.Include);\r\n files.push(filePath);\r\n }\r\n }\r\n }\r\n }\r\n\r\n // SDK-style project files contains all source files in the project directory as default\r\n if (files.length === 0 && result.Project?.Sdk) {\r\n const csFiles = await fg(['**/*.cs'], {\r\n cwd: projectDir,\r\n absolute: true,\r\n ignore: ['**/bin/**', '**/obj/**']\r\n });\r\n const normalizedCsFiles = csFiles.map(file => path.normalize(file));\r\n files.push(...normalizedCsFiles);\r\n }\r\n\r\n return files;\r\n}\r\n\r\n\r\n"]}
1
+ {"version":3,"file":"getProjectCodeFile.js","sourceRoot":"","sources":["../../src/batch/getProjectCodeFile.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAUA,4DA8CC;AAxDD,uCAAyB;AACzB,2CAA6B;AAE7B,qDAA4C;AAC5C,gEAA6D;AAC7D,0DAA2B;AAE3B;;GAEG;AACI,KAAK,UAAU,wBAAwB,CAAC,UAAkB;IAC7D,IAAI,IAAA,mCAAgB,EAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,OAAO,CAAC,KAAK,CAAC,2BAA2B,UAAU,cAAc,CAAC,CAAC;QACnE,OAAO,EAAE,CAAC;IACd,CAAC;IAED,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IACjD,MAAM,MAAM,GAAG,IAAI,2BAAS,CAAC;QACzB,gBAAgB,EAAE,KAAK;QACvB,mBAAmB,EAAE,EAAE;KAC1B,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAEjC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC5C,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,EAAE,SAAS,IAAI,EAAE,CAAC;IAEnD,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;IAErE,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QACzB,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC;QAE/B,IAAI,QAAQ,EAAE,CAAC;YACX,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;YAErE,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;gBAC9B,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;oBACf,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;oBACxD,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACzB,CAAC;YACL,CAAC;QACL,CAAC;IACL,CAAC;IAED,wFAAwF;IACxF,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC;QAC5C,MAAM,OAAO,GAAG,MAAM,IAAA,mBAAE,EAAC,CAAC,SAAS,CAAC,EAAE;YAClC,GAAG,EAAE,UAAU;YACf,QAAQ,EAAE,IAAI;YACd,MAAM,EAAE,CAAC,WAAW,EAAE,WAAW,CAAC;SACrC,CAAC,CAAC;QACH,KAAK,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC;IAC3B,CAAC;IAED,OAAO,KAAK,CAAC;AACjB,CAAC","sourcesContent":["import * as fs from 'fs';\r\nimport * as path from 'path';\r\n\r\nimport { XMLParser } from 'fast-xml-parser';\r\nimport { checkTestProject } from '../utils/checkTestProject';\r\nimport fg from 'fast-glob';\r\n\r\n/**\r\n * parse .csproj to extract all source files\r\n */\r\nexport async function getSourceFilesFromCsproj(csprojPath: string): Promise<string[]> {\r\n if (checkTestProject(csprojPath)) {\r\n console.error(`This is a test project: ${csprojPath}, skip it...`);\r\n return [];\r\n }\r\n\r\n const xml = fs.readFileSync(csprojPath, 'utf-8');\r\n const parser = new XMLParser({\r\n ignoreAttributes: false,\r\n attributeNamePrefix: '',\r\n });\r\n const result = parser.parse(xml);\r\n\r\n const projectDir = path.dirname(csprojPath);\r\n const files: string[] = [];\r\n\r\n const itemGroups = result.Project?.ItemGroup ?? [];\r\n\r\n const groups = Array.isArray(itemGroups) ? itemGroups : [itemGroups];\r\n\r\n for (const group of groups) {\r\n const compiles = group.Compile;\r\n\r\n if (compiles) {\r\n const compileArray = Array.isArray(compiles) ? compiles : [compiles];\r\n\r\n for (const item of compileArray) {\r\n if (item.Include) {\r\n const filePath = path.resolve(projectDir, item.Include);\r\n files.push(filePath);\r\n }\r\n }\r\n }\r\n }\r\n\r\n // SDK-style project files contains all source files in the project directory as default\r\n if (files.length === 0 && result.Project?.Sdk) {\r\n const csFiles = await fg(['**/*.cs'], {\r\n cwd: projectDir,\r\n absolute: true,\r\n ignore: ['**/bin/**', '**/obj/**']\r\n });\r\n files.push(...csFiles);\r\n }\r\n\r\n return files;\r\n}\r\n\r\n\r\n"]}
@@ -10,7 +10,10 @@ const vsTools_1 = require("../vs/vsTools");
10
10
  const CODECOVERAGEDIR = './codecoverage';
11
11
  function runCodeCoverage(testProjectDllPath, codeCoverageSettingPath) {
12
12
  const workDir = (0, getOrCreateDir_1.getTmpCacheDir)(CODECOVERAGEDIR);
13
- const args = [testProjectDllPath, `/Settings:${codeCoverageSettingPath}`, '/TestCaseFilter:TestCategory!=FunctionalGate&TestCategory!=LocalAH', '/EnableCodeCoverage', '/collect:Code Coverage;Format=Cobertura'];
13
+ const args = [testProjectDllPath, '/TestCaseFilter:TestCategory!=FunctionalGate&TestCategory!=LocalAH', '/EnableCodeCoverage', '/collect:Code Coverage;Format=Cobertura'];
14
+ if (!!codeCoverageSettingPath) {
15
+ args.push(`/Settings:${codeCoverageSettingPath}`);
16
+ }
14
17
  console.log(`Running Code coverage...`);
15
18
  return (0, spawnExec_1.runSpawn)(vsTools_1.vstestPath, args, workDir, codeCoverageErrorHandler, codeCoverageCloseHandler);
16
19
  }
@@ -32,4 +35,5 @@ function codeCoverageCloseHandler(code, stdout, stderr) {
32
35
  return { success: true, message: coberturaXmlPath };
33
36
  }
34
37
  // runCodeCoverage("D:\\code\\CS.Service.Fundamental\\SharedSegments\\SharedSegments\\SharedSegments.Tests\\bin\\Debug\\SharedSegments.Tests.dll", "D:\\code\\CS.Service.Fundamental\\SharedSegments\\CodeCoverage.runsettings");
38
+ // runCodeCoverage("D:\\code\\AIUnitTestExample\\test\\ToListinator.Tests\\bin\\Debug\\net8.0\\ToListinator.Tests.dll", null);
35
39
  //# sourceMappingURL=codeCoverage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"codeCoverage.js","sourceRoot":"","sources":["../../src/codeCoverage/codeCoverage.ts"],"names":[],"mappings":";;AAMA,0CAKC;AAED,4DAGC;AAED,4DAeC;AAjCD,uEAAoE;AACpE,4DAAyD;AACzD,kDAA8C;AAC9C,2CAA2C;AAE3C,MAAM,eAAe,GAAG,gBAAgB,CAAC;AACzC,SAAgB,eAAe,CAAC,kBAA0B,EAAE,uBAA+B;IACvF,MAAM,OAAO,GAAG,IAAA,+BAAc,EAAC,eAAe,CAAC,CAAC;IAChD,MAAM,IAAI,GAAG,CAAC,kBAAkB,EAAE,aAAa,uBAAuB,EAAE,EAAE,oEAAoE,EAAE,qBAAqB,EAAE,yCAAyC,CAAC,CAAC;IAClN,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;IACxC,OAAO,IAAA,oBAAQ,EAAC,oBAAU,EAAE,IAAI,EAAE,OAAO,EAAE,wBAAwB,EAAE,wBAAwB,CAAC,CAAC;AACnG,CAAC;AAED,SAAgB,wBAAwB,CAAC,KAAK;IAC1C,OAAO,CAAC,KAAK,CAAC,sCAAsC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IACrE,OAAO,IAAI,CAAC;AAChB,CAAC;AAED,SAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM;IACzD,MAAM,gBAAgB,GAAG,IAAA,iDAAuB,EAAC,MAAM,CAAC,CAAC;IAEzD,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAClC,OAAO,CAAC,KAAK,CAAC,kDAAkD,IAAI,EAAE,CAAC,CAAC;QACxE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IAC/C,CAAC;IAED,IAAI,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC9B,OAAO,CAAC,KAAK,CAAC,8CAA8C,MAAM,EAAE,CAAC,CAAC;QACtE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IAC/C,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;IAClD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,gBAAgB,EAAE,CAAC;AACxD,CAAC;AAED,iOAAiO","sourcesContent":["import { extractCoberturaXmlPath } from './extractCodeCoverageInfo';\r\nimport { getTmpCacheDir } from '../utils/getOrCreateDir';\r\nimport { runSpawn } from '../utils/spawnExec';\r\nimport { vstestPath } from '../vs/vsTools';\r\n\r\nconst CODECOVERAGEDIR = './codecoverage';\r\nexport function runCodeCoverage(testProjectDllPath: string, codeCoverageSettingPath: string): Promise<any> {\r\n const workDir = getTmpCacheDir(CODECOVERAGEDIR);\r\n const args = [testProjectDllPath, `/Settings:${codeCoverageSettingPath}`, '/TestCaseFilter:TestCategory!=FunctionalGate&TestCategory!=LocalAH', '/EnableCodeCoverage', '/collect:Code Coverage;Format=Cobertura'];\r\n console.log(`Running Code coverage...`);\r\n return runSpawn(vstestPath, args, workDir, codeCoverageErrorHandler, codeCoverageCloseHandler);\r\n}\r\n\r\nexport function codeCoverageErrorHandler(error) {\r\n console.error(`codeCoverageErrorHandler - failed: ${error.message}`);\r\n return true;\r\n}\r\n\r\nexport function codeCoverageCloseHandler(code, stdout, stderr) {\r\n const coberturaXmlPath = extractCoberturaXmlPath(stdout);\r\n \r\n if (code !== 0 && !coberturaXmlPath) {\r\n console.error(`Code coverage generation failed with exit code ${code}`);\r\n return { success: false, message: stdout };\r\n }\r\n\r\n if (stderr && !coberturaXmlPath) {\r\n console.error(`Code coverage generation Warnings/Errors:\\n${stdout}`);\r\n return { success: false, message: stdout };\r\n }\r\n\r\n console.log(`Code coverage generation succeeded`);\r\n return { success: true, message: coberturaXmlPath };\r\n}\r\n\r\n// runCodeCoverage(\"D:\\\\code\\\\CS.Service.Fundamental\\\\SharedSegments\\\\SharedSegments\\\\SharedSegments.Tests\\\\bin\\\\Debug\\\\SharedSegments.Tests.dll\", \"D:\\\\code\\\\CS.Service.Fundamental\\\\SharedSegments\\\\CodeCoverage.runsettings\");"]}
1
+ {"version":3,"file":"codeCoverage.js","sourceRoot":"","sources":["../../src/codeCoverage/codeCoverage.ts"],"names":[],"mappings":";;AAMA,0CAQC;AAED,4DAGC;AAED,4DAeC;AApCD,uEAAoE;AACpE,4DAAyD;AACzD,kDAA8C;AAC9C,2CAA2C;AAE3C,MAAM,eAAe,GAAG,gBAAgB,CAAC;AACzC,SAAgB,eAAe,CAAC,kBAA0B,EAAE,uBAA+B;IACvF,MAAM,OAAO,GAAG,IAAA,+BAAc,EAAC,eAAe,CAAC,CAAC;IAChD,MAAM,IAAI,GAAG,CAAC,kBAAkB,EAAE,oEAAoE,EAAE,qBAAqB,EAAE,yCAAyC,CAAC,CAAC;IAC1K,IAAI,CAAC,CAAC,uBAAuB,EAAE,CAAC;QAC5B,IAAI,CAAC,IAAI,CAAC,aAAa,uBAAuB,EAAE,CAAC,CAAC;IACtD,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;IACxC,OAAO,IAAA,oBAAQ,EAAC,oBAAU,EAAE,IAAI,EAAE,OAAO,EAAE,wBAAwB,EAAE,wBAAwB,CAAC,CAAC;AACnG,CAAC;AAED,SAAgB,wBAAwB,CAAC,KAAK;IAC1C,OAAO,CAAC,KAAK,CAAC,sCAAsC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IACrE,OAAO,IAAI,CAAC;AAChB,CAAC;AAED,SAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM;IACzD,MAAM,gBAAgB,GAAG,IAAA,iDAAuB,EAAC,MAAM,CAAC,CAAC;IAEzD,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAClC,OAAO,CAAC,KAAK,CAAC,kDAAkD,IAAI,EAAE,CAAC,CAAC;QACxE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IAC/C,CAAC;IAED,IAAI,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC9B,OAAO,CAAC,KAAK,CAAC,8CAA8C,MAAM,EAAE,CAAC,CAAC;QACtE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IAC/C,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;IAClD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,gBAAgB,EAAE,CAAC;AACxD,CAAC;AAED,iOAAiO;AACjO,8HAA8H","sourcesContent":["import { extractCoberturaXmlPath } from './extractCodeCoverageInfo';\r\nimport { getTmpCacheDir } from '../utils/getOrCreateDir';\r\nimport { runSpawn } from '../utils/spawnExec';\r\nimport { vstestPath } from '../vs/vsTools';\r\n\r\nconst CODECOVERAGEDIR = './codecoverage';\r\nexport function runCodeCoverage(testProjectDllPath: string, codeCoverageSettingPath: string): Promise<any> {\r\n const workDir = getTmpCacheDir(CODECOVERAGEDIR);\r\n const args = [testProjectDllPath, '/TestCaseFilter:TestCategory!=FunctionalGate&TestCategory!=LocalAH', '/EnableCodeCoverage', '/collect:Code Coverage;Format=Cobertura'];\r\n if (!!codeCoverageSettingPath) {\r\n args.push(`/Settings:${codeCoverageSettingPath}`);\r\n }\r\n console.log(`Running Code coverage...`);\r\n return runSpawn(vstestPath, args, workDir, codeCoverageErrorHandler, codeCoverageCloseHandler);\r\n}\r\n\r\nexport function codeCoverageErrorHandler(error) {\r\n console.error(`codeCoverageErrorHandler - failed: ${error.message}`);\r\n return true;\r\n}\r\n\r\nexport function codeCoverageCloseHandler(code, stdout, stderr) {\r\n const coberturaXmlPath = extractCoberturaXmlPath(stdout);\r\n \r\n if (code !== 0 && !coberturaXmlPath) {\r\n console.error(`Code coverage generation failed with exit code ${code}`);\r\n return { success: false, message: stdout };\r\n }\r\n\r\n if (stderr && !coberturaXmlPath) {\r\n console.error(`Code coverage generation Warnings/Errors:\\n${stdout}`);\r\n return { success: false, message: stdout };\r\n }\r\n\r\n console.log(`Code coverage generation succeeded`);\r\n return { success: true, message: coberturaXmlPath };\r\n}\r\n\r\n// runCodeCoverage(\"D:\\\\code\\\\CS.Service.Fundamental\\\\SharedSegments\\\\SharedSegments\\\\SharedSegments.Tests\\\\bin\\\\Debug\\\\SharedSegments.Tests.dll\", \"D:\\\\code\\\\CS.Service.Fundamental\\\\SharedSegments\\\\CodeCoverage.runsettings\");\r\n// runCodeCoverage(\"D:\\\\code\\\\AIUnitTestExample\\\\test\\\\ToListinator.Tests\\\\bin\\\\Debug\\\\net8.0\\\\ToListinator.Tests.dll\", null);"]}
@@ -38,6 +38,7 @@ exports.coverageReportErrorHandler = coverageReportErrorHandler;
38
38
  exports.coverageReportCloseHandler = coverageReportCloseHandler;
39
39
  const path = __importStar(require("path"));
40
40
  const reportTool_1 = require("./reportTool");
41
+ const extractCoverageReportPath_1 = require("./extractCoverageReportPath");
41
42
  const getOrCreateDir_1 = require("../utils/getOrCreateDir");
42
43
  const spawnExec_1 = require("../utils/spawnExec");
43
44
  const COVERAGEREPORT = "./coveragereport";
@@ -65,8 +66,11 @@ function coverageReportCloseHandler(code, stdout, stderr) {
65
66
  console.error(`Code coverage report Warnings/Errors:\n${stdout}`);
66
67
  return { success: false, message: stdout };
67
68
  }
68
- console.log(`Code coverage report succeeded`);
69
+ const reportRelativePath = (0, extractCoverageReportPath_1.extractCoverageReportPath)(stdout);
70
+ console.log(`Code coverage report succeeded, coverpage report path: ${(0, getOrCreateDir_1.getTmpCacheDir)(COVERAGEREPORT)}/${reportRelativePath}`);
69
71
  return { success: true, message: stdout };
70
72
  }
71
73
  // runCodeCoverageReport("D:\\code\\ai-dev-tools\\csharp-ut-copilot\\csharp-ut-core\\out\\atmpCache\\codecoverage\\TestResults\\3a4c5e07-ddfd-42e8-9a91-8064a4baed1e\\jixiongge_VECTORWC_2025-07-19.00_51_24.cobertura.xml");
74
+ // runCodeCoverageReport("D:\\atmp\\TestResults\\90eff6a0-e7ea-43a1-91d6-2ccc0938bddd\\jixiongge_VECTORWC_2025-08-05.11_52_48.cobertura.xml");
75
+ // runCodeCoverageReport("D:\\code\\ai-dev-tools\\csharp-ut-copilot\\csharp-ut-core\\out\\atmpCache\\codecoverage\\TestResults\\9f76b29e-b496-4382-9edf-5d6c059e08c3\\jixiongge_VECTORWC_2025-08-05.12_14_23.cobertura.xml");
72
76
  //# sourceMappingURL=codeCoverageReport.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"codeCoverageReport.js","sourceRoot":"","sources":["../../src/codeCoverage/codeCoverageReport.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAQA,sDAUC;AAED,gEAGC;AAED,gEAaC;AAtCD,2CAA6B;AAE7B,6CAAiF;AAEjF,4DAAyD;AACzD,kDAA8C;AAE9C,MAAM,cAAc,GAAG,kBAAkB,CAAC;AAC1C,SAAgB,qBAAqB,CAAC,eAAuB;IACzD,IAAI,CAAC,IAAA,uCAA0B,GAAE,EAAE,CAAC;QAChC,IAAA,kCAAqB,GAAE,CAAC;IAC5B,CAAC;IACD,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC,CAAA;IAC3D,MAAM,iBAAiB,GAAG,kBAAkB,YAAY,EAAE,CAAC;IAC3D,MAAM,IAAI,GAAG,CAAC,aAAa,eAAe,GAAG,EAAE,eAAe,iBAAiB,GAAG,EAAE,mBAAmB,CAAC,CAAC;IACzG,MAAM,OAAO,GAAG,IAAA,+BAAc,EAAC,cAAc,CAAC,CAAC;IAC/C,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;IAC/C,OAAO,IAAA,oBAAQ,EAAC,iBAAiB,EAAE,IAAI,EAAE,OAAO,EAAE,0BAA0B,EAAE,0BAA0B,CAAC,CAAC;AAC9G,CAAC;AAED,SAAgB,0BAA0B,CAAC,KAAK;IAC5C,OAAO,CAAC,KAAK,CAAC,wCAAwC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IACvE,OAAO,IAAI,CAAC;AAChB,CAAC;AAED,SAAgB,0BAA0B,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM;IAC3D,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,8CAA8C,IAAI,QAAQ,MAAM,OAAO,MAAM,EAAE,CAAC,CAAC;QAC/F,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IAC/C,CAAC;IAED,IAAI,MAAM,EAAE,CAAC;QACT,OAAO,CAAC,KAAK,CAAC,0CAA0C,MAAM,EAAE,CAAC,CAAC;QAClE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IAC/C,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;IAC9C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;AAC9C,CAAC;AAGD,6NAA6N","sourcesContent":["import * as path from 'path';\r\n\r\nimport { checkTestReportToolInstall, installTestReportTool } from './reportTool';\r\n\r\nimport { getTmpCacheDir } from '../utils/getOrCreateDir';\r\nimport { runSpawn } from '../utils/spawnExec';\r\n\r\nconst COVERAGEREPORT = \"./coveragereport\";\r\nexport function runCodeCoverageReport(coverageXmlPath: string): Promise<any> {\r\n if (!checkTestReportToolInstall()) {\r\n installTestReportTool();\r\n }\r\n const coverageName = path.basename(coverageXmlPath, \".xml\")\r\n const coverageReportDir = `CoverageReport-${coverageName}`;\r\n const args = [`-reports:\"${coverageXmlPath}\"`, `-targetdir:\"${coverageReportDir}\"`, '-reporttypes:Html'];\r\n const workDir = getTmpCacheDir(COVERAGEREPORT);\r\n console.log(`Running Code coverage report...`);\r\n return runSpawn(\"reportgenerator\", args, workDir, coverageReportErrorHandler, coverageReportCloseHandler);\r\n}\r\n\r\nexport function coverageReportErrorHandler(error) {\r\n console.error(`coverageReportErrorHandler - failed: ${error.message}`);\r\n return true;\r\n}\r\n\r\nexport function coverageReportCloseHandler(code, stdout, stderr) {\r\n if (code !== 0) {\r\n console.error(`Code coverage report failed with exit code ${code}: \\n ${stdout} \\n ${stderr}`);\r\n return { success: false, message: stdout };\r\n }\r\n\r\n if (stderr) {\r\n console.error(`Code coverage report Warnings/Errors:\\n${stdout}`);\r\n return { success: false, message: stdout };\r\n }\r\n\r\n console.log(`Code coverage report succeeded`);\r\n return { success: true, message: stdout };\r\n}\r\n\r\n\r\n// runCodeCoverageReport(\"D:\\\\code\\\\ai-dev-tools\\\\csharp-ut-copilot\\\\csharp-ut-core\\\\out\\\\atmpCache\\\\codecoverage\\\\TestResults\\\\3a4c5e07-ddfd-42e8-9a91-8064a4baed1e\\\\jixiongge_VECTORWC_2025-07-19.00_51_24.cobertura.xml\");"]}
1
+ {"version":3,"file":"codeCoverageReport.js","sourceRoot":"","sources":["../../src/codeCoverage/codeCoverageReport.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AASA,sDAUC;AAED,gEAGC;AAED,gEAcC;AAxCD,2CAA6B;AAE7B,6CAAiF;AAEjF,2EAAwE;AACxE,4DAAyD;AACzD,kDAA8C;AAE9C,MAAM,cAAc,GAAG,kBAAkB,CAAC;AAC1C,SAAgB,qBAAqB,CAAC,eAAuB;IACzD,IAAI,CAAC,IAAA,uCAA0B,GAAE,EAAE,CAAC;QAChC,IAAA,kCAAqB,GAAE,CAAC;IAC5B,CAAC;IACD,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC,CAAA;IAC3D,MAAM,iBAAiB,GAAG,kBAAkB,YAAY,EAAE,CAAC;IAC3D,MAAM,IAAI,GAAG,CAAC,aAAa,eAAe,GAAG,EAAE,eAAe,iBAAiB,GAAG,EAAE,mBAAmB,CAAC,CAAC;IACzG,MAAM,OAAO,GAAG,IAAA,+BAAc,EAAC,cAAc,CAAC,CAAC;IAC/C,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;IAC/C,OAAO,IAAA,oBAAQ,EAAC,iBAAiB,EAAE,IAAI,EAAE,OAAO,EAAE,0BAA0B,EAAE,0BAA0B,CAAC,CAAC;AAC9G,CAAC;AAED,SAAgB,0BAA0B,CAAC,KAAK;IAC5C,OAAO,CAAC,KAAK,CAAC,wCAAwC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IACvE,OAAO,IAAI,CAAC;AAChB,CAAC;AAED,SAAgB,0BAA0B,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM;IAC3D,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,8CAA8C,IAAI,QAAQ,MAAM,OAAO,MAAM,EAAE,CAAC,CAAC;QAC/F,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IAC/C,CAAC;IAED,IAAI,MAAM,EAAE,CAAC;QACT,OAAO,CAAC,KAAK,CAAC,0CAA0C,MAAM,EAAE,CAAC,CAAC;QAClE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IAC/C,CAAC;IAED,MAAM,kBAAkB,GAAG,IAAA,qDAAyB,EAAC,MAAM,CAAC,CAAC;IAC7D,OAAO,CAAC,GAAG,CAAC,0DAA0D,IAAA,+BAAc,EAAC,cAAc,CAAC,IAAI,kBAAkB,EAAE,CAAC,CAAC;IAC9H,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;AAC9C,CAAC;AAGD,6NAA6N;AAC7N,8IAA8I;AAC9I,6NAA6N","sourcesContent":["import * as path from 'path';\r\n\r\nimport { checkTestReportToolInstall, installTestReportTool } from './reportTool';\r\n\r\nimport { extractCoverageReportPath } from './extractCoverageReportPath';\r\nimport { getTmpCacheDir } from '../utils/getOrCreateDir';\r\nimport { runSpawn } from '../utils/spawnExec';\r\n\r\nconst COVERAGEREPORT = \"./coveragereport\";\r\nexport function runCodeCoverageReport(coverageXmlPath: string): Promise<any> {\r\n if (!checkTestReportToolInstall()) {\r\n installTestReportTool();\r\n }\r\n const coverageName = path.basename(coverageXmlPath, \".xml\")\r\n const coverageReportDir = `CoverageReport-${coverageName}`;\r\n const args = [`-reports:\"${coverageXmlPath}\"`, `-targetdir:\"${coverageReportDir}\"`, '-reporttypes:Html'];\r\n const workDir = getTmpCacheDir(COVERAGEREPORT);\r\n console.log(`Running Code coverage report...`);\r\n return runSpawn(\"reportgenerator\", args, workDir, coverageReportErrorHandler, coverageReportCloseHandler);\r\n}\r\n\r\nexport function coverageReportErrorHandler(error) {\r\n console.error(`coverageReportErrorHandler - failed: ${error.message}`);\r\n return true;\r\n}\r\n\r\nexport function coverageReportCloseHandler(code, stdout, stderr) {\r\n if (code !== 0) {\r\n console.error(`Code coverage report failed with exit code ${code}: \\n ${stdout} \\n ${stderr}`);\r\n return { success: false, message: stdout };\r\n }\r\n\r\n if (stderr) {\r\n console.error(`Code coverage report Warnings/Errors:\\n${stdout}`);\r\n return { success: false, message: stdout };\r\n }\r\n\r\n const reportRelativePath = extractCoverageReportPath(stdout);\r\n console.log(`Code coverage report succeeded, coverpage report path: ${getTmpCacheDir(COVERAGEREPORT)}/${reportRelativePath}`);\r\n return { success: true, message: stdout };\r\n}\r\n\r\n\r\n// runCodeCoverageReport(\"D:\\\\code\\\\ai-dev-tools\\\\csharp-ut-copilot\\\\csharp-ut-core\\\\out\\\\atmpCache\\\\codecoverage\\\\TestResults\\\\3a4c5e07-ddfd-42e8-9a91-8064a4baed1e\\\\jixiongge_VECTORWC_2025-07-19.00_51_24.cobertura.xml\");\r\n// runCodeCoverageReport(\"D:\\\\atmp\\\\TestResults\\\\90eff6a0-e7ea-43a1-91d6-2ccc0938bddd\\\\jixiongge_VECTORWC_2025-08-05.11_52_48.cobertura.xml\");\r\n// runCodeCoverageReport(\"D:\\\\code\\\\ai-dev-tools\\\\csharp-ut-copilot\\\\csharp-ut-core\\\\out\\\\atmpCache\\\\codecoverage\\\\TestResults\\\\9f76b29e-b496-4382-9edf-5d6c059e08c3\\\\jixiongge_VECTORWC_2025-08-05.12_14_23.cobertura.xml\");"]}
@@ -0,0 +1 @@
1
+ export declare function extractCoverageReportPath(log: string): string;
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.extractCoverageReportPath = extractCoverageReportPath;
4
+ function extractCoverageReportPath(log) {
5
+ const lines = log.split(/\r?\n/);
6
+ const resultLine = lines.find((line) => line.trim().includes("index.html"));
7
+ if (!resultLine)
8
+ return null;
9
+ const startIndex = resultLine.indexOf("'");
10
+ const endIndex = resultLine.lastIndexOf("'");
11
+ const reportRelativePath = resultLine.substring(startIndex + 1, endIndex);
12
+ return reportRelativePath;
13
+ }
14
+ // const log =
15
+ // `2025-08-05T14:27:36: Arguments
16
+ // 2025-08-05T14:27:36: -reports:D:\\code\\ai-dev-tools\\csharp-ut-copilot\\csharp-ut-core\\out\\atmpCache\\codecoverage\\TestResults\\2638fc6b-b1d0-4c73-8a5f-475f12da315e\\jixiongge_VECTORWC_2025-08-05.14_27_19.cobertura_simplified.xml
17
+ // 2025-08-05T14:27:36: -targetdir:CoverageReport-jixiongge_VECTORWC_2025-08-05.14_27_19.cobertura_simplified
18
+ // 2025-08-05T14:27:36: -reporttypes:Html
19
+ // 2025-08-05T14:27:36: Writing report file 'CoverageReport-jixiongge_VECTORWC_2025-08-05.14_27_19.cobertura_simplified\\index.html'
20
+ // 2025-08-05T14:27:36: Report generation took 0.1 seconds
21
+ // `;
22
+ // const path = extractCoverageReportPath(log);
23
+ // console.log(`Extracted coverage report path: ${path}`);
24
+ //# sourceMappingURL=extractCoverageReportPath.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extractCoverageReportPath.js","sourceRoot":"","sources":["../../src/codeCoverage/extractCoverageReportPath.ts"],"names":[],"mappings":";;AAAA,8DAWC;AAXD,SAAgB,yBAAyB,CAAC,GAAW;IAChD,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAElC,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC;IAC5E,IAAI,CAAC,UAAU;QAAE,OAAO,IAAI,CAAC;IAE7B,MAAM,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC3C,MAAM,QAAQ,GAAG,UAAU,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IAC7C,MAAM,kBAAkB,GAAG,UAAU,CAAC,SAAS,CAAC,UAAU,GAAG,CAAC,EAAE,QAAQ,CAAC,CAAC;IAE1E,OAAO,kBAAkB,CAAC;AAC9B,CAAC;AAED,cAAc;AACd,kCAAkC;AAClC,6OAA6O;AAC7O,8GAA8G;AAC9G,0CAA0C;AAC1C,oIAAoI;AACpI,0DAA0D;AAC1D,KAAK;AAEL,+CAA+C;AAC/C,0DAA0D","sourcesContent":["export function extractCoverageReportPath(log: string): string {\r\n const lines = log.split(/\\r?\\n/);\r\n\r\n const resultLine = lines.find((line) => line.trim().includes(\"index.html\"));\r\n if (!resultLine) return null;\r\n\r\n const startIndex = resultLine.indexOf(\"'\");\r\n const endIndex = resultLine.lastIndexOf(\"'\");\r\n const reportRelativePath = resultLine.substring(startIndex + 1, endIndex);\r\n\r\n return reportRelativePath;\r\n}\r\n\r\n// const log =\r\n// `2025-08-05T14:27:36: Arguments\r\n// 2025-08-05T14:27:36: -reports:D:\\\\code\\\\ai-dev-tools\\\\csharp-ut-copilot\\\\csharp-ut-core\\\\out\\\\atmpCache\\\\codecoverage\\\\TestResults\\\\2638fc6b-b1d0-4c73-8a5f-475f12da315e\\\\jixiongge_VECTORWC_2025-08-05.14_27_19.cobertura_simplified.xml\r\n// 2025-08-05T14:27:36: -targetdir:CoverageReport-jixiongge_VECTORWC_2025-08-05.14_27_19.cobertura_simplified\r\n// 2025-08-05T14:27:36: -reporttypes:Html\r\n// 2025-08-05T14:27:36: Writing report file 'CoverageReport-jixiongge_VECTORWC_2025-08-05.14_27_19.cobertura_simplified\\\\index.html'\r\n// 2025-08-05T14:27:36: Report generation took 0.1 seconds\r\n// `;\r\n\r\n// const path = extractCoverageReportPath(log);\r\n// console.log(`Extracted coverage report path: ${path}`);"]}
@@ -24,4 +24,7 @@ async function generateCodeCoverageReport(testProjectPaths, sourceCodePaths) {
24
24
  }
25
25
  // const testProjectPaths = ["C:\\Users\\jixiongge\\code\\CS.Service.Fundamental\\SharedSegments\\SharedSegments\\SharedSegments.Tests\\SharedSegments.Tests.csproj"];
26
26
  // generateCodeCoverageReport(testProjectPaths);
27
+ // getAllCsFiles("D:\\code\\AIUnitTestExample\\src").then(paths => {
28
+ // generateCodeCoverageReport(["D:\\code\\AIUnitTestExample\\test\\ToListinator.Tests\\ToListinator.Tests.csproj"], paths);
29
+ // });
27
30
  //# sourceMappingURL=generateCodeCoverageReport.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"generateCodeCoverageReport.js","sourceRoot":"","sources":["../../src/codeCoverage/generateCodeCoverageReport.ts"],"names":[],"mappings":";;AAMA,gEAiBC;AAvBD,wEAAgE;AAChE,qEAAkE;AAClE,iDAAiD;AACjD,6DAA6D;AAC7D,+DAAmE;AAE5D,KAAK,UAAU,0BAA0B,CAAC,gBAA0B,EAAE,eAAyB;IAClG,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC7B,KAAK,MAAM,eAAe,IAAI,gBAAgB,EAAC,CAAC;QAC5C,MAAM,OAAO,GAAG,IAAA,sCAAe,EAAC,eAAe,CAAC,CAAC;QACjD,MAAM,mBAAmB,GAAG,IAAA,+CAAsB,EAAC,eAAe,CAAC,CAAC;QACpE,MAAM,EAAC,OAAO,EAAE,OAAO,EAAC,GAAG,MAAM,IAAA,8BAAe,EAAC,OAAO,EAAE,mBAAmB,CAAC,CAAC;QAC/E,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YAC3B,OAAO,CAAC,KAAK,CAAC,8DAA8D,eAAe,sBAAsB,mBAAmB,YAAY,OAAO,EAAE,CAAC,CAAA;YAC1J,SAAS;QACb,CAAC;QAED,MAAM,gBAAgB,GAAG,OAAO,CAAC;QACjC,MAAM,iBAAiB,GAAG,IAAA,gDAA0B,EAAC,gBAAgB,EAAE,eAAe,CAAC,CAAC;QACxF,IAAA,0CAAqB,EAAC,iBAAiB,CAAC,CAAC;IAC7C,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,yCAAyC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,GAAG,IAAI,UAAU,CAAC,CAAC;AACpG,CAAC;AAED,sKAAsK;AACtK,gDAAgD","sourcesContent":["import { getBuiltDllPath } from \"../utils/getCodeStructurePath\";\r\nimport { getCodeCoverageSetting } from \"./getCodeCoverageSetting\";\r\nimport { runCodeCoverage } from \"./codeCoverage\";\r\nimport { runCodeCoverageReport } from \"./codeCoverageReport\";\r\nimport { simplifyCoverageXmlByFiles } from \"./simplifyCoverageXml\";\r\n\r\nexport async function generateCodeCoverageReport(testProjectPaths: string[], sourceCodePaths: string[]) {\r\n const startTime = Date.now();\r\n for (const testProjectPath of testProjectPaths){\r\n const dllPath = getBuiltDllPath(testProjectPath);\r\n const codeCoverageSetting = getCodeCoverageSetting(testProjectPath);\r\n const {success, message} = await runCodeCoverage(dllPath, codeCoverageSetting);\r\n if (!message.endsWith(\"xml\")) {\r\n console.error(`Generating code coverage report failed, test project path: ${testProjectPath}, coverageSetting: ${codeCoverageSetting}, error: ${message}`)\r\n continue;\r\n }\r\n\r\n const coberturaXmlPath = message;\r\n const simplifiedXmlPath = simplifyCoverageXmlByFiles(coberturaXmlPath, sourceCodePaths);\r\n runCodeCoverageReport(simplifiedXmlPath);\r\n }\r\n\r\n console.log(`code coverage report generation time: ${(Date.now() - startTime) / 1000} seconds`);\r\n}\r\n\r\n// const testProjectPaths = [\"C:\\\\Users\\\\jixiongge\\\\code\\\\CS.Service.Fundamental\\\\SharedSegments\\\\SharedSegments\\\\SharedSegments.Tests\\\\SharedSegments.Tests.csproj\"];\r\n// generateCodeCoverageReport(testProjectPaths);"]}
1
+ {"version":3,"file":"generateCodeCoverageReport.js","sourceRoot":"","sources":["../../src/codeCoverage/generateCodeCoverageReport.ts"],"names":[],"mappings":";;AAOA,gEAiBC;AAvBD,wEAAgE;AAChE,qEAAkE;AAClE,iDAAiD;AACjD,6DAA6D;AAC7D,+DAAmE;AAE5D,KAAK,UAAU,0BAA0B,CAAC,gBAA0B,EAAE,eAAyB;IAClG,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC7B,KAAK,MAAM,eAAe,IAAI,gBAAgB,EAAC,CAAC;QAC5C,MAAM,OAAO,GAAG,IAAA,sCAAe,EAAC,eAAe,CAAC,CAAC;QACjD,MAAM,mBAAmB,GAAG,IAAA,+CAAsB,EAAC,eAAe,CAAC,CAAC;QACpE,MAAM,EAAC,OAAO,EAAE,OAAO,EAAC,GAAG,MAAM,IAAA,8BAAe,EAAC,OAAO,EAAE,mBAAmB,CAAC,CAAC;QAC/E,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YAC3B,OAAO,CAAC,KAAK,CAAC,8DAA8D,eAAe,sBAAsB,mBAAmB,YAAY,OAAO,EAAE,CAAC,CAAA;YAC1J,SAAS;QACb,CAAC;QAED,MAAM,gBAAgB,GAAG,OAAO,CAAC;QACjC,MAAM,iBAAiB,GAAG,IAAA,gDAA0B,EAAC,gBAAgB,EAAE,eAAe,CAAC,CAAC;QACxF,IAAA,0CAAqB,EAAC,iBAAiB,CAAC,CAAC;IAC7C,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,yCAAyC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,GAAG,IAAI,UAAU,CAAC,CAAC;AACpG,CAAC;AAED,sKAAsK;AACtK,gDAAgD;AAChD,oEAAoE;AACpE,+HAA+H;AAC/H,MAAM","sourcesContent":["import { getAllCsFiles } from \"../batch/getFolderCodeFile\";\r\nimport { getBuiltDllPath } from \"../utils/getCodeStructurePath\";\r\nimport { getCodeCoverageSetting } from \"./getCodeCoverageSetting\";\r\nimport { runCodeCoverage } from \"./codeCoverage\";\r\nimport { runCodeCoverageReport } from \"./codeCoverageReport\";\r\nimport { simplifyCoverageXmlByFiles } from \"./simplifyCoverageXml\";\r\n\r\nexport async function generateCodeCoverageReport(testProjectPaths: string[], sourceCodePaths: string[]) {\r\n const startTime = Date.now();\r\n for (const testProjectPath of testProjectPaths){\r\n const dllPath = getBuiltDllPath(testProjectPath);\r\n const codeCoverageSetting = getCodeCoverageSetting(testProjectPath);\r\n const {success, message} = await runCodeCoverage(dllPath, codeCoverageSetting);\r\n if (!message.endsWith(\"xml\")) {\r\n console.error(`Generating code coverage report failed, test project path: ${testProjectPath}, coverageSetting: ${codeCoverageSetting}, error: ${message}`)\r\n continue;\r\n }\r\n\r\n const coberturaXmlPath = message;\r\n const simplifiedXmlPath = simplifyCoverageXmlByFiles(coberturaXmlPath, sourceCodePaths);\r\n runCodeCoverageReport(simplifiedXmlPath);\r\n }\r\n\r\n console.log(`code coverage report generation time: ${(Date.now() - startTime) / 1000} seconds`);\r\n}\r\n\r\n// const testProjectPaths = [\"C:\\\\Users\\\\jixiongge\\\\code\\\\CS.Service.Fundamental\\\\SharedSegments\\\\SharedSegments\\\\SharedSegments.Tests\\\\SharedSegments.Tests.csproj\"];\r\n// generateCodeCoverageReport(testProjectPaths);\r\n// getAllCsFiles(\"D:\\\\code\\\\AIUnitTestExample\\\\src\").then(paths => {\r\n// generateCodeCoverageReport([\"D:\\\\code\\\\AIUnitTestExample\\\\test\\\\ToListinator.Tests\\\\ToListinator.Tests.csproj\"], paths);\r\n// });"]}
@@ -90,13 +90,14 @@ function simplifyCoverageXmlByFiles(coverageXmlPath, filePaths) {
90
90
  const xmlObj = parser.parse(xmlRaw);
91
91
  // Cobertura root: <coverage><packages><package><classes><class>...
92
92
  const packages = xmlObj.coverage?.packages?.package ?? [];
93
+ const normalizedCsFilePaths = filePaths.map(file => path.normalize(file));
93
94
  for (const pkg of Array.isArray(packages) ? packages : [packages]) {
94
95
  const classes = pkg.classes?.class;
95
96
  if (!classes)
96
97
  continue;
97
98
  const filtered = (Array.isArray(classes) ? classes : [classes]).filter(cls => {
98
99
  const filename = path.normalize(cls['@_filename'] || '');
99
- return filePaths.includes(filename);
100
+ return normalizedCsFilePaths.includes(filename);
100
101
  });
101
102
  pkg.classes.class = filtered;
102
103
  }
@@ -1 +1 @@
1
- {"version":3,"file":"simplifyCoverageXml.js","sourceRoot":"","sources":["../../src/codeCoverage/simplifyCoverageXml.ts"],"names":[],"mappings":"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","sourcesContent":["import * as path from 'path';\r\n\r\nimport { XMLBuilder, XMLParser } from 'fast-xml-parser';\r\nimport { readFileSync, writeFileSync } from 'fs';\r\n\r\nexport function removeZeroLineRateClassFromCoverageXml(coverageXmlPath: string) {\r\n const outputPath = coverageXmlPath.replace(/\\.xml$/, '_refine.xml');\r\n const xmlData = readFileSync(coverageXmlPath, 'utf-8');\r\n const parser = new XMLParser({\r\n ignoreAttributes: false,\r\n attributeNamePrefix: '@_',\r\n allowBooleanAttributes: true,\r\n ignoreDeclaration: false\r\n });\r\n const json = parser.parse(xmlData);\r\n\r\n const packages = json.coverage.packages.package;\r\n const packagesArr = Array.isArray(packages) ? packages : [packages];\r\n\r\n const refinedPackages = packagesArr\r\n .map((pkg: any) => {\r\n const filteredClasses = filterClasses(pkg.classes);\r\n if (!filteredClasses) return null;\r\n\r\n return {\r\n ...pkg,\r\n classes: filteredClasses\r\n };\r\n })\r\n .filter(pkg => pkg !== null);\r\n\r\n json.coverage.packages.package = refinedPackages;\r\n\r\n const builder = new XMLBuilder({\r\n ignoreAttributes: false,\r\n attributeNamePrefix: '@_',\r\n format: true,\r\n suppressEmptyNode: true\r\n });\r\n\r\n const outputXml = builder.build(json);\r\n writeFileSync(outputPath, outputXml, 'utf-8');\r\n\r\n console.log(`generated Completed Path: ${outputPath}`);\r\n}\r\n\r\nfunction filterClasses(classesObj: any) {\r\n const classes = Array.isArray(classesObj.class)\r\n ? classesObj.class\r\n : [classesObj.class];\r\n\r\n const filtered = classes.filter((cls: any) => parseFloat(cls['@_line-rate']) > 0);\r\n return filtered.length > 0 ? { class: filtered } : null;\r\n}\r\n\r\nexport function simplifyCoverageXmlByFiles(coverageXmlPath: string, filePaths: string[]) {\r\n if (!coverageXmlPath || !filePaths || filePaths.length === 0) {\r\n console.error(`invalid parameters: coverageXmlPath and filePaths must be provided, coverageXmlPath: ${coverageXmlPath}, filePaths: ${filePaths}`);\r\n return coverageXmlPath;\r\n }\r\n\r\n const parser = new XMLParser({ ignoreAttributes: false });\r\n const builder = new XMLBuilder({ ignoreAttributes: false, format: true });\r\n\r\n const xmlRaw = readFileSync(coverageXmlPath, 'utf-8');\r\n const xmlObj = parser.parse(xmlRaw);\r\n\r\n // Cobertura root: <coverage><packages><package><classes><class>...\r\n const packages = xmlObj.coverage?.packages?.package ?? [];\r\n\r\n for (const pkg of Array.isArray(packages) ? packages : [packages]) {\r\n const classes = pkg.classes?.class;\r\n if (!classes) continue;\r\n\r\n const filtered = (Array.isArray(classes) ? classes : [classes]).filter(cls => {\r\n const filename = path.normalize(cls['@_filename'] || '');\r\n return filePaths.includes(filename);\r\n });\r\n\r\n pkg.classes.class = filtered;\r\n }\r\n\r\n const refinedXml = builder.build(xmlObj);\r\n const outPath = coverageXmlPath.replace(/\\.xml$/, '_simplified.xml');\r\n writeFileSync(outPath, refinedXml, 'utf-8');\r\n\r\n console.log(`Refined coverage written to: ${outPath}`);\r\n return outPath;\r\n}\r\n\r\n\r\n// removeZeroLineRateClassFromCoverageXml(\"D:\\\\atmp\\\\TestResults\\\\744711fc-6729-4298-bc08-31ba5ca088f1\\\\jixiongge_CPC-jixio-Z5J9N_2025-07-14.18_26_28.cobertura.xml\");\r\n\r\n// const filePaths = [\r\n// \"D:\\\\code\\\\CS.Service.Fundamental\\\\SharedSegments\\\\SharedSegments\\\\SharedSegments.Plugins\\\\Workflows\\\\Eplant\\\\Conditions\\\\EplantRequestCategoryCondition.cs\",\r\n// \"D:\\\\code\\\\CS.Service.Fundamental\\\\SharedSegments\\\\SharedSegments\\\\SharedSegments.Plugins\\\\Workflows\\\\Eplant\\\\Conditions\\\\EplantRequestTypeCondition.cs\",\r\n// \"D:\\\\code\\\\CS.Service.Fundamental\\\\SharedSegments\\\\SharedSegments\\\\SharedSegments.Plugins\\\\Workflows\\\\Eplant\\\\Conditions\\\\EplantUserUpdateCondition.cs\"\r\n// ];\r\n\r\n// simplifyCoverageXmlByFiles(\"D:\\\\atmp\\\\TestResults\\\\744711fc-6729-4298-bc08-31ba5ca088f1\\\\jixiongge_CPC-jixio-Z5J9N_2025-07-14.18_26_28.cobertura.xml\", filePaths);"]}
1
+ {"version":3,"file":"simplifyCoverageXml.js","sourceRoot":"","sources":["../../src/codeCoverage/simplifyCoverageXml.ts"],"names":[],"mappings":"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","sourcesContent":["import * as path from 'path';\r\n\r\nimport { XMLBuilder, XMLParser } from 'fast-xml-parser';\r\nimport { readFileSync, writeFileSync } from 'fs';\r\n\r\nexport function removeZeroLineRateClassFromCoverageXml(coverageXmlPath: string) {\r\n const outputPath = coverageXmlPath.replace(/\\.xml$/, '_refine.xml');\r\n const xmlData = readFileSync(coverageXmlPath, 'utf-8');\r\n const parser = new XMLParser({\r\n ignoreAttributes: false,\r\n attributeNamePrefix: '@_',\r\n allowBooleanAttributes: true,\r\n ignoreDeclaration: false\r\n });\r\n const json = parser.parse(xmlData);\r\n\r\n const packages = json.coverage.packages.package;\r\n const packagesArr = Array.isArray(packages) ? packages : [packages];\r\n\r\n const refinedPackages = packagesArr\r\n .map((pkg: any) => {\r\n const filteredClasses = filterClasses(pkg.classes);\r\n if (!filteredClasses) return null;\r\n\r\n return {\r\n ...pkg,\r\n classes: filteredClasses\r\n };\r\n })\r\n .filter(pkg => pkg !== null);\r\n\r\n json.coverage.packages.package = refinedPackages;\r\n\r\n const builder = new XMLBuilder({\r\n ignoreAttributes: false,\r\n attributeNamePrefix: '@_',\r\n format: true,\r\n suppressEmptyNode: true\r\n });\r\n\r\n const outputXml = builder.build(json);\r\n writeFileSync(outputPath, outputXml, 'utf-8');\r\n\r\n console.log(`generated Completed Path: ${outputPath}`);\r\n}\r\n\r\nfunction filterClasses(classesObj: any) {\r\n const classes = Array.isArray(classesObj.class)\r\n ? classesObj.class\r\n : [classesObj.class];\r\n\r\n const filtered = classes.filter((cls: any) => parseFloat(cls['@_line-rate']) > 0);\r\n return filtered.length > 0 ? { class: filtered } : null;\r\n}\r\n\r\nexport function simplifyCoverageXmlByFiles(coverageXmlPath: string, filePaths: string[]) {\r\n if (!coverageXmlPath || !filePaths || filePaths.length === 0) {\r\n console.error(`invalid parameters: coverageXmlPath and filePaths must be provided, coverageXmlPath: ${coverageXmlPath}, filePaths: ${filePaths}`);\r\n return coverageXmlPath;\r\n }\r\n\r\n const parser = new XMLParser({ ignoreAttributes: false });\r\n const builder = new XMLBuilder({ ignoreAttributes: false, format: true });\r\n\r\n const xmlRaw = readFileSync(coverageXmlPath, 'utf-8');\r\n const xmlObj = parser.parse(xmlRaw);\r\n\r\n // Cobertura root: <coverage><packages><package><classes><class>...\r\n const packages = xmlObj.coverage?.packages?.package ?? [];\r\n\r\n const normalizedCsFilePaths = filePaths.map(file => path.normalize(file));\r\n for (const pkg of Array.isArray(packages) ? packages : [packages]) {\r\n const classes = pkg.classes?.class;\r\n if (!classes) continue;\r\n\r\n const filtered = (Array.isArray(classes) ? classes : [classes]).filter(cls => {\r\n const filename = path.normalize(cls['@_filename'] || '');\r\n return normalizedCsFilePaths.includes(filename);\r\n });\r\n\r\n pkg.classes.class = filtered;\r\n }\r\n\r\n const refinedXml = builder.build(xmlObj);\r\n const outPath = coverageXmlPath.replace(/\\.xml$/, '_simplified.xml');\r\n writeFileSync(outPath, refinedXml, 'utf-8');\r\n\r\n console.log(`Refined coverage written to: ${outPath}`);\r\n return outPath;\r\n}\r\n\r\n\r\n// removeZeroLineRateClassFromCoverageXml(\"D:\\\\atmp\\\\TestResults\\\\744711fc-6729-4298-bc08-31ba5ca088f1\\\\jixiongge_CPC-jixio-Z5J9N_2025-07-14.18_26_28.cobertura.xml\");\r\n\r\n// const filePaths = [\r\n// \"D:\\\\code\\\\CS.Service.Fundamental\\\\SharedSegments\\\\SharedSegments\\\\SharedSegments.Plugins\\\\Workflows\\\\Eplant\\\\Conditions\\\\EplantRequestCategoryCondition.cs\",\r\n// \"D:\\\\code\\\\CS.Service.Fundamental\\\\SharedSegments\\\\SharedSegments\\\\SharedSegments.Plugins\\\\Workflows\\\\Eplant\\\\Conditions\\\\EplantRequestTypeCondition.cs\",\r\n// \"D:\\\\code\\\\CS.Service.Fundamental\\\\SharedSegments\\\\SharedSegments\\\\SharedSegments.Plugins\\\\Workflows\\\\Eplant\\\\Conditions\\\\EplantUserUpdateCondition.cs\"\r\n// ];\r\n\r\n// simplifyCoverageXmlByFiles(\"D:\\\\atmp\\\\TestResults\\\\744711fc-6729-4298-bc08-31ba5ca088f1\\\\jixiongge_CPC-jixio-Z5J9N_2025-07-14.18_26_28.cobertura.xml\", filePaths);"]}
@@ -16,7 +16,7 @@ const setupProcessSignalHandler_1 = require("../exit/setupProcessSignalHandler")
16
16
  function main() {
17
17
  (0, yargs_1.default)((0, helpers_1.hideBin)(process.argv))
18
18
  // Yargs(hideBin(hardcodedArgs))
19
- .scriptName('xap-ut')
19
+ .scriptName('csharp-ut')
20
20
  .option('source', {
21
21
  describe: 'where the test copilot is running',
22
22
  choices: ['local', 'vsplugin'],
@@ -63,14 +63,23 @@ function main() {
63
63
  choices: [0, 1], // 0 means not auto fix, 1 means auto fix
64
64
  default: 0,
65
65
  type: 'number',
66
+ })
67
+ .option('nugetPackagePath', {
68
+ alias: 'np',
69
+ describe: 'The path to the NuGet packages used by the code analyzer. Used scenario: when the code analyzer is executed in CI pipeline',
70
+ type: 'string',
66
71
  })
67
72
  .command('utcmd', 'Generate unit test using command line', () => { }, (c) => {
68
73
  console.log('Command executed with options:', c);
69
74
  (0, utGenWrapper_1.generateUtCode)(c);
70
75
  })
71
- .command('utbenchmark', 'Generate unit test report for all project/solution files using command line', () => { }, (c) => {
76
+ .command('utbatch', 'Generate unit test report for all project/solution files using command line', () => { }, (c) => {
72
77
  console.log('Command executed with options:', c);
73
78
  (0, utGenWrapper_1.generateBatchUtCode)(c);
79
+ })
80
+ .command('utbenchmark', 'Generate unit test report for all project/solution files using command line', () => { }, (c) => {
81
+ console.log('Command executed with options:', c);
82
+ (0, utGenWrapper_1.generateUtBenchmark)(c);
74
83
  })
75
84
  .command('utvsplugin', 'Generate unit test by interact with Visual Studio plugin', () => { }, (c) => {
76
85
  console.log('Command executed with options:', c);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/command/index.ts"],"names":[],"mappings":"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","sourcesContent":["#!/usr/bin/env node\r\n\r\nimport { generateBatchUtCode, generateUtCode, generateUtWithVsPlugin } from './utGenWrapper';\r\n\r\nimport Yargs from 'yargs/yargs';\r\nimport { hideBin } from 'yargs/helpers';\r\nimport { setupSignalHandlers } from '../exit/setupProcessSignalHandler';\r\n\r\n// const hardcodedArgs = ['', '', 'utcmd', '--s', 'D:\\\\code\\\\CS.Service.Fundamental\\\\SharedSegments\\\\SharedSegments\\\\SharedSegments.Plugins\\\\Workflows\\\\Overview\\\\HttpRequestParser\\\\Utils\\\\SqmidHelper.cs', '--keepFailedTest', \"1\", \"--af\", \"1\"];\r\n// const hardcodedArgs = ['', '', 'utcmd', '--s', 'D:\\\\code\\\\CS.Service.Fundamental\\\\SharedSegments\\\\SharedSegments\\\\SharedSegments.Plugins\\\\Workflows\\\\Eplant\\\\Conditions\\\\EplantRequestCategoryCondition.cs', '--keepFailedTest', \"1\", \"--af\", \"1\"];\r\n// const hardcodedArgs = ['', '', 'utcmd', '--s', 'D:\\\\code\\\\CS.Service.Fundamental\\\\SharedSegments\\\\SharedSegments\\\\SharedSegments.Plugins\\\\Workflows\\\\Eplant\\\\ResponseBuilders\\\\EplantMigrateResponseBuilder.cs', '--keepFailedTest', \"1\", \"--af\", \"1\"];\r\n// const hardcodedArgs = ['', '', 'utcmd', '--s', 'D:\\\\code\\\\CS.Service.Fundamental\\\\SharedSegments\\\\SharedSegments\\\\SharedSegments.Plugins\\\\Workflows\\\\Overview\\\\HttpRequestParser\\\\Utils\\\\WeatherParamsHttpConverter.cs', '--keepFailedTest', \"1\", \"--af\", \"1\"];\r\n// const hardcodedArgs = ['', '', 'utcmd', '--s', 'D:\\\\code\\\\CS.Service.Fundamental\\\\SharedSegments\\\\SharedSegments\\\\SharedSegments.Plugins\\\\Workflows\\\\Eplant\\\\RequestBuilders\\\\EplantRankRequestBuilder.cs', '--keepFailedTest', \"1\", \"--af\", \"1\"];\r\nfunction main() {\r\n Yargs(hideBin(process.argv))\r\n // Yargs(hideBin(hardcodedArgs))\r\n .scriptName('xap-ut')\r\n .option(\r\n 'source',\r\n {\r\n describe: 'where the test copilot is running',\r\n choices: ['local', 'vsplugin'],\r\n default: 'local',\r\n type: 'string',\r\n }\r\n )\r\n .option(\r\n 'mode',\r\n {\r\n alias: 'm',\r\n describe: 'test copilot work mode.', // Note: only generate is supported now\r\n choices: ['generate', 'repair'],\r\n default: 'generate',\r\n type: 'string',\r\n }\r\n )\r\n .option(\r\n 'keepFailedTest',\r\n {\r\n describe: 'whether to keep failed test cases',\r\n choices: [0, 1], // 0 means delete failed test cases, 1 means keep failed test cases\r\n default: 1,\r\n type: 'number',\r\n }\r\n )\r\n .option(\r\n 'enableCov',\r\n {\r\n describe: 'whether to run coverage',\r\n choices: [0, 1], // 0 means not run coverage, 1 means run coverage\r\n default: 0,\r\n type: 'number',\r\n }\r\n )\r\n .option(\r\n 'LLMModel',\r\n {\r\n describe: 'use which LLM model', // Note: only gpt4o is supported now\r\n default: \"gpt4o\",\r\n type: 'string',\r\n }\r\n )\r\n .option(\r\n 'sourceCodePath',\r\n {\r\n alias: 's',\r\n describe: 'source code file path / project path or solution path for batch generation',\r\n type: 'string',\r\n }\r\n )\r\n .option(\r\n 'testCodePath',\r\n {\r\n alias: 't',\r\n describe: 'Target file or directory',\r\n type: 'string',\r\n }\r\n )\r\n .option(\r\n 'autofix',\r\n {\r\n alias: 'af',\r\n describe: 'whether to auto fix generated test code',\r\n choices: [0, 1], // 0 means not auto fix, 1 means auto fix\r\n default: 0,\r\n type: 'number',\r\n }\r\n )\r\n .command(\r\n 'utcmd',\r\n 'Generate unit test using command line',\r\n () => {},\r\n (c) => {\r\n console.log('Command executed with options:', c);\r\n generateUtCode(c);\r\n }\r\n ) \r\n .command(\r\n 'utbenchmark',\r\n 'Generate unit test report for all project/solution files using command line',\r\n () => {},\r\n (c) => {\r\n console.log('Command executed with options:', c);\r\n generateBatchUtCode(c);\r\n }\r\n )\r\n .command(\r\n 'utvsplugin',\r\n 'Generate unit test by interact with Visual Studio plugin',\r\n () => {},\r\n (c) => {\r\n console.log('Command executed with options:', c);\r\n generateUtWithVsPlugin(c);\r\n }\r\n )\r\n .help()\r\n .alias('help', 'h')\r\n .parse();\r\n}\r\n\r\nsetupSignalHandlers();\r\nmain();"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/command/index.ts"],"names":[],"mappings":"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","sourcesContent":["#!/usr/bin/env node\r\n\r\nimport { generateBatchUtCode, generateUtBenchmark, generateUtCode, generateUtWithVsPlugin } from './utGenWrapper';\r\n\r\nimport Yargs from 'yargs/yargs';\r\nimport { hideBin } from 'yargs/helpers';\r\nimport { setupSignalHandlers } from '../exit/setupProcessSignalHandler';\r\n\r\n// const hardcodedArgs = ['', '', 'utcmd', '--s', 'D:\\\\code\\\\CS.Service.Fundamental\\\\SharedSegments\\\\SharedSegments\\\\SharedSegments.Plugins\\\\Workflows\\\\Overview\\\\HttpRequestParser\\\\Utils\\\\SqmidHelper.cs', '--keepFailedTest', \"1\", \"--af\", \"1\"];\r\n// const hardcodedArgs = ['', '', 'utcmd', '--s', 'D:\\\\code\\\\CS.Service.Fundamental\\\\SharedSegments\\\\SharedSegments\\\\SharedSegments.Plugins\\\\Workflows\\\\Eplant\\\\Conditions\\\\EplantRequestCategoryCondition.cs', '--keepFailedTest', \"1\", \"--af\", \"1\"];\r\n// const hardcodedArgs = ['', '', 'utcmd', '--s', 'D:\\\\code\\\\CS.Service.Fundamental\\\\SharedSegments\\\\SharedSegments\\\\SharedSegments.Plugins\\\\Workflows\\\\Eplant\\\\ResponseBuilders\\\\EplantMigrateResponseBuilder.cs', '--keepFailedTest', \"1\", \"--af\", \"1\"];\r\n// const hardcodedArgs = ['', '', 'utcmd', '--s', 'D:\\\\code\\\\CS.Service.Fundamental\\\\SharedSegments\\\\SharedSegments\\\\SharedSegments.Plugins\\\\Workflows\\\\Overview\\\\HttpRequestParser\\\\Utils\\\\WeatherParamsHttpConverter.cs', '--keepFailedTest', \"1\", \"--af\", \"1\"];\r\n// const hardcodedArgs = ['', '', 'utcmd', '--s', 'D:\\\\code\\\\CS.Service.Fundamental\\\\SharedSegments\\\\SharedSegments\\\\SharedSegments.Plugins\\\\Workflows\\\\Eplant\\\\RequestBuilders\\\\EplantRankRequestBuilder.cs', '--keepFailedTest', \"1\", \"--af\", \"1\"];\r\nfunction main() {\r\n Yargs(hideBin(process.argv))\r\n // Yargs(hideBin(hardcodedArgs))\r\n .scriptName('csharp-ut')\r\n .option(\r\n 'source',\r\n {\r\n describe: 'where the test copilot is running',\r\n choices: ['local', 'vsplugin'],\r\n default: 'local',\r\n type: 'string',\r\n }\r\n )\r\n .option(\r\n 'mode',\r\n {\r\n alias: 'm',\r\n describe: 'test copilot work mode.', // Note: only generate is supported now\r\n choices: ['generate', 'repair'],\r\n default: 'generate',\r\n type: 'string',\r\n }\r\n )\r\n .option(\r\n 'keepFailedTest',\r\n {\r\n describe: 'whether to keep failed test cases',\r\n choices: [0, 1], // 0 means delete failed test cases, 1 means keep failed test cases\r\n default: 1,\r\n type: 'number',\r\n }\r\n )\r\n .option(\r\n 'enableCov',\r\n {\r\n describe: 'whether to run coverage',\r\n choices: [0, 1], // 0 means not run coverage, 1 means run coverage\r\n default: 0,\r\n type: 'number',\r\n }\r\n )\r\n .option(\r\n 'LLMModel',\r\n {\r\n describe: 'use which LLM model', // Note: only gpt4o is supported now\r\n default: \"gpt4o\",\r\n type: 'string',\r\n }\r\n )\r\n .option(\r\n 'sourceCodePath',\r\n {\r\n alias: 's',\r\n describe: 'source code file path / project path or solution path for batch generation',\r\n type: 'string',\r\n }\r\n )\r\n .option(\r\n 'testCodePath',\r\n {\r\n alias: 't',\r\n describe: 'Target file or directory',\r\n type: 'string',\r\n }\r\n )\r\n .option(\r\n 'autofix',\r\n {\r\n alias: 'af',\r\n describe: 'whether to auto fix generated test code',\r\n choices: [0, 1], // 0 means not auto fix, 1 means auto fix\r\n default: 0,\r\n type: 'number',\r\n }\r\n )\r\n .option(\r\n 'nugetPackagePath',\r\n {\r\n alias: 'np',\r\n describe: 'The path to the NuGet packages used by the code analyzer. Used scenario: when the code analyzer is executed in CI pipeline',\r\n type: 'string',\r\n }\r\n )\r\n .command(\r\n 'utcmd',\r\n 'Generate unit test using command line',\r\n () => { },\r\n (c) => {\r\n console.log('Command executed with options:', c);\r\n generateUtCode(c);\r\n }\r\n )\r\n .command(\r\n 'utbatch',\r\n 'Generate unit test report for all project/solution files using command line',\r\n () => { },\r\n (c) => {\r\n console.log('Command executed with options:', c);\r\n generateBatchUtCode(c);\r\n }\r\n )\r\n .command(\r\n 'utbenchmark',\r\n 'Generate unit test report for all project/solution files using command line',\r\n () => { },\r\n (c) => {\r\n console.log('Command executed with options:', c);\r\n generateUtBenchmark(c);\r\n }\r\n )\r\n .command(\r\n 'utvsplugin',\r\n 'Generate unit test by interact with Visual Studio plugin',\r\n () => { },\r\n (c) => {\r\n console.log('Command executed with options:', c);\r\n generateUtWithVsPlugin(c);\r\n }\r\n )\r\n .help()\r\n .alias('help', 'h')\r\n .parse();\r\n}\r\n\r\nsetupSignalHandlers();\r\nmain();"]}
@@ -1,3 +1,4 @@
1
1
  export declare function generateUtCode(c: any): Promise<void>;
2
2
  export declare function generateBatchUtCode(c: any): Promise<void>;
3
+ export declare function generateUtBenchmark(c: any): Promise<void>;
3
4
  export declare function generateUtWithVsPlugin(c: any): Promise<void>;
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.generateUtCode = generateUtCode;
4
4
  exports.generateBatchUtCode = generateBatchUtCode;
5
+ exports.generateUtBenchmark = generateUtBenchmark;
5
6
  exports.generateUtWithVsPlugin = generateUtWithVsPlugin;
6
7
  const stdListener_1 = require("../vsPlugin/stdListener");
7
8
  const constants_1 = require("../types/constants");
@@ -10,13 +11,18 @@ const csharpUtGen_1 = require("../gen/csharpUtGen");
10
11
  async function generateUtCode(c) {
11
12
  const autofix = c.autofix === 1;
12
13
  const keepFailedTest = c.keepFailedTest === 1;
13
- await (0, csharpUtGen_1.generateCsharpUtCode)(c.sourceCodePath, c.testCodePath, autofix, keepFailedTest, constants_1.CSVSPLUGIN);
14
+ await (0, csharpUtGen_1.generateCsharpUtCode)(c.sourceCodePath, c.testCodePath, autofix, keepFailedTest, constants_1.CSHARPUTGEN, false, c.nugetPackagePath);
14
15
  }
15
16
  async function generateBatchUtCode(c) {
16
17
  const autofix = c.autofix === 1;
17
18
  const keepFailedTest = c.keepFailedTest === 1;
18
19
  await (0, generateCodeTests_1.generateBatchTests)(c.sourceCodePath, autofix, keepFailedTest);
19
20
  }
21
+ async function generateUtBenchmark(c) {
22
+ const autofix = c.autofix === 1;
23
+ const keepFailedTest = c.keepFailedTest === 1;
24
+ await (0, generateCodeTests_1.generateBatchTests)(c.sourceCodePath, autofix, keepFailedTest, true);
25
+ }
20
26
  async function generateUtWithVsPlugin(c) {
21
27
  try {
22
28
  const autofix = c.autofix === 1;
@@ -24,7 +30,7 @@ async function generateUtWithVsPlugin(c) {
24
30
  (0, stdListener_1.startStdListener)();
25
31
  }
26
32
  const keepFailedTest = c.keepFailedTest === 1;
27
- await (0, csharpUtGen_1.generateCsharpUtCode)(c.sourceCodePath, c.testCodePath, autofix, keepFailedTest, constants_1.CSVSPLUGIN, true);
33
+ await (0, csharpUtGen_1.generateCsharpUtCode)(c.sourceCodePath, c.testCodePath, autofix, keepFailedTest, constants_1.CSVSPLUGIN, true, c.nugetPackagePath);
28
34
  }
29
35
  catch (error) {
30
36
  console.error("Error generateUtWithVsPlugin:", error);