Skip to content

Commit 3e20f9c

Browse files
committed
增加重试上次测试用例按钮 retest
1 parent 58925a2 commit 3e20f9c

File tree

12 files changed

+169
-40
lines changed

12 files changed

+169
-40
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
## version 2.19.13
2+
3+
- 增加重试上次测试用例按钮 retest
4+
15
## version 2.19.12
26

37
- 配置 filePath 文件名 ${name} ${camelcasename} ${pascalcasename} ${kebabcasename} ${kebab-case-name} ${snakecasename} ${snake_case_name} 原本参数使用英文名

package.json

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"name": "vscode-leetcode-problem-rating",
33
"displayName": "LeetCode",
44
"description": "%main.description%",
5-
"version": "2.19.12",
5+
"version": "2.19.13",
66
"author": "ccagml",
77
"publisher": "ccagml",
88
"license": "MIT",
@@ -1025,6 +1025,7 @@
10251025
"case",
10261026
"allcase",
10271027
"test",
1028+
"retest",
10281029
"solution",
10291030
"debug"
10301031
],
@@ -1039,7 +1040,8 @@
10391040
"description",
10401041
"case",
10411042
"allcase",
1042-
"debug"
1043+
"debug",
1044+
"retest"
10431045
],
10441046
"enumDescriptions": [
10451047
"%main.contributes.configuration.properties.leetcode-problem-rating.editor.shortcuts.items.enumDescriptions.0%",
@@ -1049,7 +1051,8 @@
10491051
"%main.contributes.configuration.properties.leetcode-problem-rating.editor.shortcuts.items.enumDescriptions.4%",
10501052
"%main.contributes.configuration.properties.leetcode-problem-rating.editor.shortcuts.items.enumDescriptions.5%",
10511053
"%main.contributes.configuration.properties.leetcode-problem-rating.editor.shortcuts.items.enumDescriptions.6%",
1052-
"%main.contributes.configuration.properties.leetcode-problem-rating.editor.shortcuts.items.enumDescriptions.7%"
1054+
"%main.contributes.configuration.properties.leetcode-problem-rating.editor.shortcuts.items.enumDescriptions.7%",
1055+
"%main.contributes.configuration.properties.leetcode-problem-rating.editor.shortcuts.items.enumDescriptions.8%"
10531056
]
10541057
},
10551058
"description": "%main.contributes.configuration.properties.leetcode-problem-rating.editor.shortcuts.description%"

package.nls.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,8 @@
115115
"main.contributes.configuration.properties.leetcode-problem-rating.editor.shortcuts.items.enumDescriptions.4": "Show the problem description page.",
116116
"main.contributes.configuration.properties.leetcode-problem-rating.editor.shortcuts.items.enumDescriptions.5": "Test default case",
117117
"main.contributes.configuration.properties.leetcode-problem-rating.editor.shortcuts.items.enumDescriptions.6": "Test all default case",
118+
"main.contributes.configuration.properties.leetcode-problem-rating.editor.shortcuts.items.enumDescriptions.7": "Debug solution",
119+
"main.contributes.configuration.properties.leetcode-problem-rating.editor.shortcuts.items.enumDescriptions.8": "Test all default case",
118120
"main.contributes.configuration.properties.leetcode-problem-rating.hideScore.enumDescriptions.0": "Don't hide",
119121
"main.contributes.configuration.properties.leetcode-problem-rating.hideScore.enumDescriptions.1": "Hide questions with scores",
120122
"main.contributes.configuration.properties.leetcode-problem-rating.hideScore.enumDescriptions.2": "Hide questions with no scores",

package.nls.zh-cn.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,8 @@
115115
"main.contributes.configuration.properties.leetcode-problem-rating.editor.shortcuts.items.enumDescriptions.4": "展示题目介绍",
116116
"main.contributes.configuration.properties.leetcode-problem-rating.editor.shortcuts.items.enumDescriptions.5": "测试默认用例",
117117
"main.contributes.configuration.properties.leetcode-problem-rating.editor.shortcuts.items.enumDescriptions.6": "测试所有用例",
118+
"main.contributes.configuration.properties.leetcode-problem-rating.editor.shortcuts.items.enumDescriptions.7": "调试代码",
119+
"main.contributes.configuration.properties.leetcode-problem-rating.editor.shortcuts.items.enumDescriptions.8": "重新执行用例",
118120
"main.contributes.configuration.properties.leetcode-problem-rating.hideScore.enumDescriptions.0": "不处理",
119121
"main.contributes.configuration.properties.leetcode-problem-rating.hideScore.enumDescriptions.1": "隐藏有分数的题目",
120122
"main.contributes.configuration.properties.leetcode-problem-rating.hideScore.enumDescriptions.2": "隐藏没有分数的题目",

src/controller/TreeViewController.ts

Lines changed: 92 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import * as lodash from "lodash";
1111
import * as path from "path";
1212
import * as vscode from "vscode";
1313
import { toNumber } from "lodash";
14+
import * as fs from "fs";
1415
import { Disposable, Uri, window, workspace, ConfigurationChangeEvent } from "vscode";
1516
import {
1617
SearchNode,
@@ -30,6 +31,9 @@ import {
3031
SORT_ORDER,
3132
Endpoint,
3233
OutPutType,
34+
TestSolutionType,
35+
ITestSolutionData,
36+
defaultTestSolutionData,
3337
} from "../model/Model";
3438
import {
3539
isHideSolvedProblem,
@@ -75,6 +79,7 @@ import * as fse from "fs-extra";
7579
import { submissionService } from "../service/SubmissionService";
7680
import { bricksDataService } from "../service/BricksDataService";
7781
import { groupDao } from "../dao/groupDao";
82+
import { fileMeta, ProblemMeta } from "../utils/problemUtils";
7883

7984
// 视图控制器
8085
class TreeViewController implements Disposable {
@@ -118,8 +123,10 @@ class TreeViewController implements Disposable {
118123

119124
try {
120125
const result: string = await executeService.submitSolution(filePath);
121-
submissionService.show(result);
122-
eventService.emit("submit", submissionService.getSubmitEvent());
126+
127+
eventService.emit("submitSolutionResult", result);
128+
// submissionService.show(result);
129+
// eventService.emit("submit", submissionService.getSubmitEvent());
123130
} catch (error) {
124131
await promptForOpenOutputChannel("提交出错了. 请查看控制台信息~", OutPutType.error);
125132
return;
@@ -147,12 +154,6 @@ class TreeViewController implements Disposable {
147154
}
148155
const picks: Array<IQuickItemEx<string>> = [];
149156
picks.push(
150-
// {
151-
// label: "$(three-bars) Default test cases",
152-
// description: "",
153-
// detail: "默认用例",
154-
// value: ":default",
155-
// },
156157
{
157158
label: "$(pencil) Write directly...",
158159
description: "",
@@ -165,12 +166,6 @@ class TreeViewController implements Disposable {
165166
detail: "文件中的测试用例",
166167
value: ":file",
167168
}
168-
// {
169-
// label: "All Default test cases...",
170-
// description: "",
171-
// detail: "所有的测试用例",
172-
// value: ":alldefault",
173-
// },
174169
);
175170
const choice: IQuickItemEx<string> | undefined = await vscode.window.showQuickPick(picks);
176171
if (!choice) {
@@ -180,10 +175,10 @@ class TreeViewController implements Disposable {
180175
let result: string | undefined;
181176
let testString: string | undefined;
182177
let testFile: vscode.Uri[] | undefined;
178+
179+
let tsd: ITestSolutionData = Object.assign({}, defaultTestSolutionData, {});
180+
183181
switch (choice.value) {
184-
case ":default":
185-
result = await executeService.testSolution(filePath);
186-
break;
187182
case ":direct":
188183
testString = await vscode.window.showInputBox({
189184
prompt: "Enter the test cases.",
@@ -193,34 +188,39 @@ class TreeViewController implements Disposable {
193188
ignoreFocusOut: true,
194189
});
195190
if (testString) {
196-
result = await executeService.testSolution(filePath, this.parseTestString(testString));
191+
tsd.filePath = filePath;
192+
tsd.testString = this.parseTestString(testString);
193+
tsd.allCase = false;
194+
tsd.type = TestSolutionType.Type_1;
195+
result = await executeService.testSolution(tsd.filePath, tsd.testString, tsd.allCase);
196+
tsd.result = result;
197197
}
198198
break;
199199
case ":file":
200200
testFile = await this.showFileSelectDialog(filePath);
201201
if (testFile && testFile.length) {
202202
const input: string = (await fse.readFile(testFile[0].fsPath, "utf-8")).trim();
203203
if (input) {
204-
result = await executeService.testSolution(
205-
filePath,
206-
this.parseTestString(input.replace(/\r?\n/g, "\\n"))
207-
);
204+
tsd.filePath = filePath;
205+
tsd.testString = this.parseTestString(input.replace(/\r?\n/g, "\\n"));
206+
tsd.allCase = false;
207+
result = await executeService.testSolution(tsd.filePath, tsd.testString, tsd.allCase);
208+
tsd.result = result;
209+
tsd.type = TestSolutionType.Type_2;
208210
} else {
209211
vscode.window.showErrorMessage("The selected test file must not be empty.");
210212
}
211213
}
212214
break;
213-
case ":alldefault":
214-
result = await executeService.testSolution(filePath, undefined, true);
215-
break;
216215
default:
217216
break;
218217
}
219218
if (!result) {
220219
return;
221220
}
222-
submissionService.show(result);
223-
eventService.emit("submit", submissionService.getSubmitEvent());
221+
// submissionService.show(result);
222+
// eventService.emit("submit", submissionService.getSubmitEvent());
223+
eventService.emit("testSolutionResult", result, tsd);
224224
} catch (error) {
225225
await promptForOpenOutputChannel("提交测试出错了. 请查看控制台信息~", OutPutType.error);
226226
}
@@ -263,12 +263,64 @@ class TreeViewController implements Disposable {
263263
return;
264264
}
265265

266-
let result: string | undefined = await executeService.testSolution(filePath, undefined, allCase || false);
266+
let tsd: ITestSolutionData = Object.assign({}, defaultTestSolutionData, {});
267+
tsd.filePath = filePath;
268+
tsd.testString = undefined;
269+
tsd.allCase = allCase || false;
270+
tsd.type = TestSolutionType.Type_3;
271+
let result: string | undefined = await executeService.testSolution(tsd.filePath, tsd.testString, tsd.allCase);
272+
tsd.result = result;
273+
if (!result) {
274+
return;
275+
}
276+
// submissionService.show(result);
277+
// eventService.emit("submit", submissionService.getSubmitEvent());
278+
eventService.emit("testSolutionResult", result, tsd);
279+
} catch (error) {
280+
await promptForOpenOutputChannel("提交测试出错了. 请查看控制台信息~", OutPutType.error);
281+
}
282+
}
283+
284+
// 提交测试用例
285+
/**
286+
* It takes the current file, and sends it to the server to be tested
287+
* @param [uri] - The file path of the file to be submitted. If it is not passed, the currently active
288+
* file is submitted.
289+
*/
290+
public async reTestSolution(uri?: vscode.Uri): Promise<void> {
291+
try {
292+
if (statusBarService.getStatus() === UserStatus.SignedOut) {
293+
return;
294+
}
295+
296+
const filePath: string | undefined = await getTextEditorFilePathByUri(uri);
297+
if (!filePath) {
298+
return;
299+
}
300+
const fileContent: Buffer = fs.readFileSync(filePath);
301+
const meta: ProblemMeta | null = fileMeta(fileContent.toString());
302+
303+
let qid: string | undefined = undefined;
304+
if (meta?.id != undefined) {
305+
qid = this.getQidByFid(meta?.id);
306+
}
307+
308+
if (qid == undefined) {
309+
return;
310+
}
311+
312+
let tsd: ITestSolutionData | undefined = submissionService.getTSDByQid(qid);
313+
if (tsd == undefined) {
314+
return;
315+
}
316+
317+
let result: string | undefined = await executeService.testSolution(tsd.filePath, tsd.testString, tsd.allCase);
267318
if (!result) {
268319
return;
269320
}
270-
submissionService.show(result);
271-
eventService.emit("submit", submissionService.getSubmitEvent());
321+
// submissionService.show(result);
322+
// eventService.emit("submit", submissionService.getSubmitEvent());
323+
eventService.emit("testSolutionResult", result, tsd);
272324
} catch (error) {
273325
await promptForOpenOutputChannel("提交测试出错了. 请查看控制台信息~", OutPutType.error);
274326
}
@@ -294,12 +346,19 @@ class TreeViewController implements Disposable {
294346
return;
295347
}
296348

297-
let result: string | undefined = await executeService.testSolution(filePath, testcase, false);
349+
let tsd: ITestSolutionData = Object.assign({}, defaultTestSolutionData, {});
350+
tsd.filePath = filePath;
351+
tsd.testString = testcase;
352+
tsd.allCase = false;
353+
tsd.type = TestSolutionType.Type_4;
354+
let result: string | undefined = await executeService.testSolution(tsd.filePath, tsd.testString, tsd.allCase);
355+
tsd.result = result;
298356
if (!result) {
299357
return;
300358
}
301-
submissionService.show(result);
302-
eventService.emit("submit", submissionService.getSubmitEvent());
359+
// submissionService.show(result);
360+
// eventService.emit("submit", submissionService.getSubmitEvent());
361+
eventService.emit("testSolutionResult", result, tsd);
303362
} catch (error) {
304363
await promptForOpenOutputChannel("提交测试出错了. 请查看控制台信息~", OutPutType.error);
305364
}

src/debugex/debugCpp.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -192,7 +192,7 @@ class DebugCpp extends DebugBase {
192192
insertCode += `${indent}(new Solution())->${problemType.funName}(arg1, arg0);\n`;
193193
} else if (templateId === "146") {
194194
insertCode += `LRUCache *lc; for (int i = 0; i < arg0.size(); i++) { if (arg0[i].compare("LRUCache") == 0) { lc = new LRUCache(arg1[i][0]); } else if (arg0[i].compare("put") == 0) { lc->put(arg1[i][0], arg1[i][1]); } else if (arg0[i].compare("get") == 0) { lc->get(arg1[i][0]); } } \n`;
195-
}else {
195+
} else {
196196
insertCode += `${indent}(new Solution())->${problemType.funName}(${callArgs.join(", ")});\n`;
197197
}
198198

src/extension.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ export async function activate(context: ExtensionContext): Promise<void> {
7676
commands.registerCommand("lcpr.getHelp", (input: NodeModel | Uri) => treeViewController.getHelp(input)),
7777
commands.registerCommand("lcpr.refreshExplorer", () => treeDataService.refresh()),
7878
commands.registerCommand("lcpr.testSolution", (uri?: Uri) => treeViewController.testSolution(uri)),
79+
commands.registerCommand("lcpr.reTestSolution", (uri?: Uri) => treeViewController.reTestSolution(uri)),
7980
commands.registerCommand("lcpr.testCaseDef", (uri?, allCase?) => treeViewController.testCaseDef(uri, allCase)),
8081
commands.registerCommand("lcpr.tesCaseArea", (uri, testCase?) => treeViewController.tesCaseArea(uri, testCase)),
8182
commands.registerCommand("lcpr.submitSolution", (uri?: Uri) => treeViewController.submitSolution(uri)),

src/model/Model.ts

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,31 @@ export enum UserStatus {
2828
SignedOut = 2,
2929
}
3030

31+
export enum TestSolutionType {
32+
Type_1 = 1,
33+
Type_2 = 2,
34+
Type_3 = 3,
35+
Type_4 = 4,
36+
Type_5 = 5,
37+
Type_6 = 6,
38+
}
39+
40+
export interface ITestSolutionData {
41+
filePath: string;
42+
testString: undefined | string;
43+
allCase: undefined | boolean;
44+
type: TestSolutionType;
45+
result: string | undefined;
46+
}
47+
48+
export const defaultTestSolutionData: ITestSolutionData = {
49+
filePath: "",
50+
testString: undefined,
51+
allCase: undefined,
52+
type: TestSolutionType.Type_1,
53+
result: undefined,
54+
};
55+
3156
export const loginArgsMapping: Map<string, string> = new Map([
3257
["LeetCode", "-l"],
3358
["Cookie", "-c"],

src/service/EventService.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,13 @@
99

1010
import { EventEmitter } from "events";
1111

12-
import { IProblem, UserStatus } from "../model/Model";
12+
import { IProblem, ITestSolutionData, UserStatus } from "../model/Model";
1313
import { ISubmitEvent } from "../model/Model";
1414
import { statusBarService } from "../service/StatusBarService";
1515
import { treeDataService } from "../service/TreeDataService";
1616
import { bricksDataService } from "./BricksDataService";
1717
import { statusBarTimeService } from "./StatusBarTimeService";
18+
import { submissionService } from "./SubmissionService";
1819

1920
class EventService extends EventEmitter {
2021
constructor() {
@@ -56,6 +57,13 @@ class EventService extends EventEmitter {
5657
this.on("groupUpdate", () => {
5758
bricksDataService.refresh();
5859
});
60+
61+
this.on("testSolutionResult", (resultString: string, tsd: ITestSolutionData) => {
62+
submissionService.show(resultString, tsd);
63+
});
64+
this.on("submitSolutionResult", (resultString: string) => {
65+
submissionService.show(resultString);
66+
});
5967
}
6068
}
6169

src/service/FileButtonService.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,16 @@ export class FileButtonService implements vscode.CodeLensProvider {
7373
);
7474
}
7575

76+
if (shortcuts.indexOf("retest") >= 0) {
77+
temp_result.push(
78+
new vscode.CodeLens(range, {
79+
title: "ReTest",
80+
command: "lcpr.reTestSolution",
81+
arguments: [document.uri],
82+
})
83+
);
84+
}
85+
7686
if (shortcuts.indexOf("star") >= 0 && node) {
7787
temp_result.push(
7888
new vscode.CodeLens(range, {

0 commit comments

Comments
 (0)