@ai-dev-tools/csharp-copilot-core 0.0.19 → 0.0.29
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.
- package/ReadMe.md +174 -0
- package/devops/package.json +37 -0
- package/out/analyze/generateCodeDependency.d.ts +1 -1
- package/out/analyze/generateCodeDependency.js +7 -3
- package/out/analyze/generateCodeDependency.js.map +1 -1
- package/out/batch/getProjectCodeFile.js +1 -2
- package/out/batch/getProjectCodeFile.js.map +1 -1
- package/out/codeCoverage/codeCoverage.js +5 -1
- package/out/codeCoverage/codeCoverage.js.map +1 -1
- package/out/codeCoverage/codeCoverageReport.js +5 -1
- package/out/codeCoverage/codeCoverageReport.js.map +1 -1
- package/out/codeCoverage/extractCoverageReportPath.d.ts +1 -0
- package/out/codeCoverage/extractCoverageReportPath.js +24 -0
- package/out/codeCoverage/extractCoverageReportPath.js.map +1 -0
- package/out/codeCoverage/generateCodeCoverageReport.js +3 -0
- package/out/codeCoverage/generateCodeCoverageReport.js.map +1 -1
- package/out/codeCoverage/simplifyCoverageXml.js +2 -1
- package/out/codeCoverage/simplifyCoverageXml.js.map +1 -1
- package/out/command/index.js +11 -2
- package/out/command/index.js.map +1 -1
- package/out/command/utGenWrapper.d.ts +1 -0
- package/out/command/utGenWrapper.js +8 -2
- package/out/command/utGenWrapper.js.map +1 -1
- package/out/gen/autoFix.d.ts +3 -3
- package/out/gen/autoFix.js +8 -8
- package/out/gen/autoFix.js.map +1 -1
- package/out/gen/csharpUtGen.d.ts +1 -1
- package/out/gen/csharpUtGen.js +7 -33
- package/out/gen/csharpUtGen.js.map +1 -1
- package/out/gen/ensureValidLLMResponse.d.ts +1 -1
- package/out/gen/ensureValidLLMResponse.js +2 -2
- package/out/gen/ensureValidLLMResponse.js.map +1 -1
- package/out/gen/postGen/postGenProcess.d.ts +1 -1
- package/out/gen/postGen/postGenProcess.js +3 -2
- package/out/gen/postGen/postGenProcess.js.map +1 -1
- package/out/gen/postGen/repairRequiredNameSpaces.d.ts +2 -1
- package/out/gen/postGen/repairRequiredNameSpaces.js +29 -4
- package/out/gen/postGen/repairRequiredNameSpaces.js.map +1 -1
- package/out/index.d.ts +1 -0
- package/out/index.js +3 -1
- package/out/index.js.map +1 -1
- package/out/llm/model/{Gpt4o.js → Gpt.js} +5 -3
- package/out/llm/model/Gpt.js.map +1 -0
- package/out/llm/preparePrompt.js +26 -1
- package/out/llm/preparePrompt.js.map +1 -1
- package/out/llm/prompt/generateUtAutoFix.liquid +5 -1
- package/out/llm/prompt/generateUtTemplate.liquid +2 -0
- package/out/llm/sendRequestToLLM.js +0 -3
- package/out/llm/sendRequestToLLM.js.map +1 -1
- package/out/llm/sendRequestToSelfHostLLM.js +4 -4
- package/out/llm/sendRequestToSelfHostLLM.js.map +1 -1
- package/out/types/constants.d.ts +3 -0
- package/out/types/constants.js +4 -1
- package/out/types/constants.js.map +1 -1
- package/out/utils/detectTestFramework.js +7 -6
- package/out/utils/detectTestFramework.js.map +1 -1
- package/out/utils/getTestFile.js +1 -1
- package/out/utils/getTestFile.js.map +1 -1
- package/out/vs/msBuild.js +3 -35
- package/out/vs/msBuild.js.map +1 -1
- package/out/vs/vsTest.js +3 -35
- package/out/vs/vsTest.js.map +1 -1
- package/package.json +4 -3
- package/ai-dev-tools-csharp-copilot-core-0.0.19.tgz +0 -0
- package/out/atmpCache/deps/EplantRequestCategoryCondition_Conditions_Eplant_Workflows_SharedSegmentsPlugins_SharedSegments_SharedSegments_CSServiceFundamental_code_D.deps +0 -281
- package/out/atmpCache/deps/IdentitySelectAnalyzer_ToListinatorAnalyzers_src_AIUnitTestExample_code_d.deps +0 -1
- package/out/atmpCache/deps/SqmidHelperTests_Utils_HttpRequestParser_Overview_Workflows_SharedSegmentsTests_SharedSegments_SharedSegments_CSServiceFundamental_code_D.deps +0 -1
- package/out/atmpCache/deps/SqmidHelper_Utils_HttpRequestParser_Overview_Workflows_SharedSegmentsPlugins_SharedSegments_SharedSegments_CSServiceFundamental_code_D.deps +0 -1
- package/out/atmpCache/deps/ToListCountAnalyzerTests_ToListinatorTests_test_AIUnitTestExample_code_d.deps +0 -4037
- package/out/atmpCache/deps/ToListCountAnalyzer_ToListinatorAnalyzers_src_AIUnitTestExample_code_d.deps +0 -1
- package/out/atmpCache/deps/ToListCountCodeFixProvider_ToListinatorCodeFixes_src_AIUnitTestExample_code_d.deps +0 -1
- package/out/atmpCache/deps/ToListForEachAnalyzer_ToListinatorAnalyzers_src_AIUnitTestExample_code_d.deps +0 -1
- package/out/atmpCache/dllref/ToListinatorTests_ToListinatorTests_test_AIUnitTestExample_code_d.dllref +0 -202
- package/out/llm/model/Gpt4o.js.map +0 -1
- package/out/llm/model/claude4.d.ts +0 -1
- package/out/llm/model/claude4.js +0 -3
- package/out/llm/model/claude4.js.map +0 -1
- package/out/llm/prompt/generateUtGuidelines.liquid +0 -29
- package/out/llm/prompt/testAfGuidelines.liquid +0 -6
- package/out/llm/prompt/userCustomPrompt.liquid +0 -0
- package/out/llm/prompt/xap/xapUtGuideline-240804.liquid +0 -36
- /package/out/llm/model/{Gpt4o.d.ts → Gpt.d.ts} +0 -0
package/ReadMe.md
ADDED
|
@@ -0,0 +1,174 @@
|
|
|
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 @ai-dev-tools/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
|
+
1. put your npm token in ./npmrc: registry.npmjs.org/:_authToken=${NPM_TOKEN}
|
|
140
|
+
2. execute following cmd
|
|
141
|
+
```bash
|
|
142
|
+
npm logout
|
|
143
|
+
npm login --registry=https://registry.npmjs.org/
|
|
144
|
+
npm publish --registry https://registry.npmjs.org/ --access public --otp=YOUR_2FA_CODE
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
### del published package within 72 hours
|
|
148
|
+
|
|
149
|
+
```bash
|
|
150
|
+
npm unpublish @ai-dev-tools/csharp-copilot-core@1.0.19
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
Note:
|
|
154
|
+
if you want to publish to devops feeds, use the file in /devops
|
|
155
|
+
|
|
156
|
+
### Scripts
|
|
157
|
+
|
|
158
|
+
- `build`: Compile TypeScript and copy assets
|
|
159
|
+
- `copy-script`: Copy liquid templates and tools to output
|
|
160
|
+
- `setup-npm-auth`: Setup authentication for Azure Artifacts
|
|
161
|
+
|
|
162
|
+
## Dependencies
|
|
163
|
+
|
|
164
|
+
This project uses several key dependencies:
|
|
165
|
+
- **yargs**: Command-line argument parsing
|
|
166
|
+
- **liquidjs**: Template engine for code generation
|
|
167
|
+
- **applicationinsights**: Telemetry
|
|
168
|
+
- **edge-js**: .NET interop
|
|
169
|
+
- **fast-xml-parser**: XML parsing for test results
|
|
170
|
+
- **node-fetch**: HTTP requests for LLM APIs
|
|
171
|
+
|
|
172
|
+
## License
|
|
173
|
+
|
|
174
|
+
This is an internal Microsoft tool for AI-powered C# unit test generation.
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@aidevtools/csharp-copilot-core",
|
|
3
|
+
"version": "0.0.28",
|
|
4
|
+
"description": "Core library for csharp-copilot",
|
|
5
|
+
"main": "out/index.js",
|
|
6
|
+
"typings": "out/index.d.ts",
|
|
7
|
+
"scripts": {
|
|
8
|
+
"build": "tsc && npm run copy-script",
|
|
9
|
+
"copy-script": "cpy \"src/**/*.liquid\" \"tools/\" out",
|
|
10
|
+
"setup-npm-auth": "npm install -g @microsoft/artifacts-npm-credprovider --registry https://pkgs.dev.azure.com/mseng/226da8e7-b1c0-4167-9678-53f461e07706/_packaging/AzureArtifacts/npm/registry/ && set NUGET_CREDENTIALPROVIDER_VSTS_TOKENTYPE=SelfDescribing && artifacts-npm-credprovider"
|
|
11
|
+
},
|
|
12
|
+
"bin": {
|
|
13
|
+
"csharputc": "./out/command/index.js"
|
|
14
|
+
},
|
|
15
|
+
"publishConfig": {
|
|
16
|
+
"registry": "https://pkgs.dev.azure.com/msasg/ContentServices/_packaging/MSNews/npm/registry/"
|
|
17
|
+
},
|
|
18
|
+
"devDependencies": {
|
|
19
|
+
"@types/node": "^22.18.12",
|
|
20
|
+
"@types/node-fetch": "^2.6.12",
|
|
21
|
+
"cpy-cli": "^5.0.0",
|
|
22
|
+
"ts-node": "^10.9.2",
|
|
23
|
+
"typescript": "^5.8.3"
|
|
24
|
+
},
|
|
25
|
+
"dependencies": {
|
|
26
|
+
"@azure/identity": "^4.11.1",
|
|
27
|
+
"@types/yargs": "^17.0.33",
|
|
28
|
+
"applicationinsights": "1.8.10",
|
|
29
|
+
"edge-js": "^24.0.4",
|
|
30
|
+
"fast-glob": "^3.3.3",
|
|
31
|
+
"fast-xml-parser": "^5.2.5",
|
|
32
|
+
"liquidjs": "^10.21.1",
|
|
33
|
+
"node-fetch": "^2.7.0",
|
|
34
|
+
"tree-kill": "^1.2.2",
|
|
35
|
+
"yargs": "^17.7.2"
|
|
36
|
+
}
|
|
37
|
+
}
|
|
@@ -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;
|
|
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
|
-
|
|
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,
|
|
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,
|
|
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,
|
|
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
|
-
|
|
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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
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":";;
|
|
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
|
|
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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAKA,wFAuCC;AAWD,
|
|
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);"]}
|
package/out/command/index.js
CHANGED
|
@@ -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('
|
|
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('
|
|
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);
|
package/out/command/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/command/index.ts"],"names":[],"mappings":";;;;;;AAEA,
|
|
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>;
|