Skip to content

增加重试上次测试用例按钮 retest #238

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Jul 29, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
## version 2.19.13

- 增加重试上次测试用例按钮 retest

## version 2.19.12

- 配置 filePath 文件名 ${name} ${camelcasename} ${pascalcasename} ${kebabcasename} ${kebab-case-name} ${snakecasename} ${snake_case_name} 原本参数使用英文名
Expand Down
9 changes: 6 additions & 3 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"name": "vscode-leetcode-problem-rating",
"displayName": "LeetCode",
"description": "%main.description%",
"version": "2.19.12",
"version": "2.19.13",
"author": "ccagml",
"publisher": "ccagml",
"license": "MIT",
Expand Down Expand Up @@ -1025,6 +1025,7 @@
"case",
"allcase",
"test",
"retest",
"solution",
"debug"
],
Expand All @@ -1039,7 +1040,8 @@
"description",
"case",
"allcase",
"debug"
"debug",
"retest"
],
"enumDescriptions": [
"%main.contributes.configuration.properties.leetcode-problem-rating.editor.shortcuts.items.enumDescriptions.0%",
Expand All @@ -1049,7 +1051,8 @@
"%main.contributes.configuration.properties.leetcode-problem-rating.editor.shortcuts.items.enumDescriptions.4%",
"%main.contributes.configuration.properties.leetcode-problem-rating.editor.shortcuts.items.enumDescriptions.5%",
"%main.contributes.configuration.properties.leetcode-problem-rating.editor.shortcuts.items.enumDescriptions.6%",
"%main.contributes.configuration.properties.leetcode-problem-rating.editor.shortcuts.items.enumDescriptions.7%"
"%main.contributes.configuration.properties.leetcode-problem-rating.editor.shortcuts.items.enumDescriptions.7%",
"%main.contributes.configuration.properties.leetcode-problem-rating.editor.shortcuts.items.enumDescriptions.8%"
]
},
"description": "%main.contributes.configuration.properties.leetcode-problem-rating.editor.shortcuts.description%"
Expand Down
2 changes: 2 additions & 0 deletions package.nls.json
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,8 @@
"main.contributes.configuration.properties.leetcode-problem-rating.editor.shortcuts.items.enumDescriptions.4": "Show the problem description page.",
"main.contributes.configuration.properties.leetcode-problem-rating.editor.shortcuts.items.enumDescriptions.5": "Test default case",
"main.contributes.configuration.properties.leetcode-problem-rating.editor.shortcuts.items.enumDescriptions.6": "Test all default case",
"main.contributes.configuration.properties.leetcode-problem-rating.editor.shortcuts.items.enumDescriptions.7": "Debug solution",
"main.contributes.configuration.properties.leetcode-problem-rating.editor.shortcuts.items.enumDescriptions.8": "Test all default case",
"main.contributes.configuration.properties.leetcode-problem-rating.hideScore.enumDescriptions.0": "Don't hide",
"main.contributes.configuration.properties.leetcode-problem-rating.hideScore.enumDescriptions.1": "Hide questions with scores",
"main.contributes.configuration.properties.leetcode-problem-rating.hideScore.enumDescriptions.2": "Hide questions with no scores",
Expand Down
2 changes: 2 additions & 0 deletions package.nls.zh-cn.json
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,8 @@
"main.contributes.configuration.properties.leetcode-problem-rating.editor.shortcuts.items.enumDescriptions.4": "展示题目介绍",
"main.contributes.configuration.properties.leetcode-problem-rating.editor.shortcuts.items.enumDescriptions.5": "测试默认用例",
"main.contributes.configuration.properties.leetcode-problem-rating.editor.shortcuts.items.enumDescriptions.6": "测试所有用例",
"main.contributes.configuration.properties.leetcode-problem-rating.editor.shortcuts.items.enumDescriptions.7": "调试代码",
"main.contributes.configuration.properties.leetcode-problem-rating.editor.shortcuts.items.enumDescriptions.8": "重新执行用例",
"main.contributes.configuration.properties.leetcode-problem-rating.hideScore.enumDescriptions.0": "不处理",
"main.contributes.configuration.properties.leetcode-problem-rating.hideScore.enumDescriptions.1": "隐藏有分数的题目",
"main.contributes.configuration.properties.leetcode-problem-rating.hideScore.enumDescriptions.2": "隐藏没有分数的题目",
Expand Down
125 changes: 92 additions & 33 deletions src/controller/TreeViewController.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import * as lodash from "lodash";
import * as path from "path";
import * as vscode from "vscode";
import { toNumber } from "lodash";
import * as fs from "fs";
import { Disposable, Uri, window, workspace, ConfigurationChangeEvent } from "vscode";
import {
SearchNode,
Expand All @@ -30,6 +31,9 @@ import {
SORT_ORDER,
Endpoint,
OutPutType,
TestSolutionType,
ITestSolutionData,
defaultTestSolutionData,
} from "../model/Model";
import {
isHideSolvedProblem,
Expand Down Expand Up @@ -75,6 +79,7 @@ import * as fse from "fs-extra";
import { submissionService } from "../service/SubmissionService";
import { bricksDataService } from "../service/BricksDataService";
import { groupDao } from "../dao/groupDao";
import { fileMeta, ProblemMeta } from "../utils/problemUtils";

// 视图控制器
class TreeViewController implements Disposable {
Expand Down Expand Up @@ -118,8 +123,10 @@ class TreeViewController implements Disposable {

try {
const result: string = await executeService.submitSolution(filePath);
submissionService.show(result);
eventService.emit("submit", submissionService.getSubmitEvent());

eventService.emit("submitSolutionResult", result);
// submissionService.show(result);
// eventService.emit("submit", submissionService.getSubmitEvent());
} catch (error) {
await promptForOpenOutputChannel("提交出错了. 请查看控制台信息~", OutPutType.error);
return;
Expand Down Expand Up @@ -147,12 +154,6 @@ class TreeViewController implements Disposable {
}
const picks: Array<IQuickItemEx<string>> = [];
picks.push(
// {
// label: "$(three-bars) Default test cases",
// description: "",
// detail: "默认用例",
// value: ":default",
// },
{
label: "$(pencil) Write directly...",
description: "",
Expand All @@ -165,12 +166,6 @@ class TreeViewController implements Disposable {
detail: "文件中的测试用例",
value: ":file",
}
// {
// label: "All Default test cases...",
// description: "",
// detail: "所有的测试用例",
// value: ":alldefault",
// },
);
const choice: IQuickItemEx<string> | undefined = await vscode.window.showQuickPick(picks);
if (!choice) {
Expand All @@ -180,10 +175,10 @@ class TreeViewController implements Disposable {
let result: string | undefined;
let testString: string | undefined;
let testFile: vscode.Uri[] | undefined;

let tsd: ITestSolutionData = Object.assign({}, defaultTestSolutionData, {});

switch (choice.value) {
case ":default":
result = await executeService.testSolution(filePath);
break;
case ":direct":
testString = await vscode.window.showInputBox({
prompt: "Enter the test cases.",
Expand All @@ -193,34 +188,39 @@ class TreeViewController implements Disposable {
ignoreFocusOut: true,
});
if (testString) {
result = await executeService.testSolution(filePath, this.parseTestString(testString));
tsd.filePath = filePath;
tsd.testString = this.parseTestString(testString);
tsd.allCase = false;
tsd.type = TestSolutionType.Type_1;
result = await executeService.testSolution(tsd.filePath, tsd.testString, tsd.allCase);
tsd.result = result;
}
break;
case ":file":
testFile = await this.showFileSelectDialog(filePath);
if (testFile && testFile.length) {
const input: string = (await fse.readFile(testFile[0].fsPath, "utf-8")).trim();
if (input) {
result = await executeService.testSolution(
filePath,
this.parseTestString(input.replace(/\r?\n/g, "\\n"))
);
tsd.filePath = filePath;
tsd.testString = this.parseTestString(input.replace(/\r?\n/g, "\\n"));
tsd.allCase = false;
result = await executeService.testSolution(tsd.filePath, tsd.testString, tsd.allCase);
tsd.result = result;
tsd.type = TestSolutionType.Type_2;
} else {
vscode.window.showErrorMessage("The selected test file must not be empty.");
}
}
break;
case ":alldefault":
result = await executeService.testSolution(filePath, undefined, true);
break;
default:
break;
}
if (!result) {
return;
}
submissionService.show(result);
eventService.emit("submit", submissionService.getSubmitEvent());
// submissionService.show(result);
// eventService.emit("submit", submissionService.getSubmitEvent());
eventService.emit("testSolutionResult", result, tsd);
} catch (error) {
await promptForOpenOutputChannel("提交测试出错了. 请查看控制台信息~", OutPutType.error);
}
Expand Down Expand Up @@ -263,12 +263,64 @@ class TreeViewController implements Disposable {
return;
}

let result: string | undefined = await executeService.testSolution(filePath, undefined, allCase || false);
let tsd: ITestSolutionData = Object.assign({}, defaultTestSolutionData, {});
tsd.filePath = filePath;
tsd.testString = undefined;
tsd.allCase = allCase || false;
tsd.type = TestSolutionType.Type_3;
let result: string | undefined = await executeService.testSolution(tsd.filePath, tsd.testString, tsd.allCase);
tsd.result = result;
if (!result) {
return;
}
// submissionService.show(result);
// eventService.emit("submit", submissionService.getSubmitEvent());
eventService.emit("testSolutionResult", result, tsd);
} catch (error) {
await promptForOpenOutputChannel("提交测试出错了. 请查看控制台信息~", OutPutType.error);
}
}

// 提交测试用例
/**
* It takes the current file, and sends it to the server to be tested
* @param [uri] - The file path of the file to be submitted. If it is not passed, the currently active
* file is submitted.
*/
public async reTestSolution(uri?: vscode.Uri): Promise<void> {
try {
if (statusBarService.getStatus() === UserStatus.SignedOut) {
return;
}

const filePath: string | undefined = await getTextEditorFilePathByUri(uri);
if (!filePath) {
return;
}
const fileContent: Buffer = fs.readFileSync(filePath);
const meta: ProblemMeta | null = fileMeta(fileContent.toString());

let qid: string | undefined = undefined;
if (meta?.id != undefined) {
qid = this.getQidByFid(meta?.id);
}

if (qid == undefined) {
return;
}

let tsd: ITestSolutionData | undefined = submissionService.getTSDByQid(qid);
if (tsd == undefined) {
return;
}

let result: string | undefined = await executeService.testSolution(tsd.filePath, tsd.testString, tsd.allCase);
if (!result) {
return;
}
submissionService.show(result);
eventService.emit("submit", submissionService.getSubmitEvent());
// submissionService.show(result);
// eventService.emit("submit", submissionService.getSubmitEvent());
eventService.emit("testSolutionResult", result, tsd);
} catch (error) {
await promptForOpenOutputChannel("提交测试出错了. 请查看控制台信息~", OutPutType.error);
}
Expand All @@ -294,12 +346,19 @@ class TreeViewController implements Disposable {
return;
}

let result: string | undefined = await executeService.testSolution(filePath, testcase, false);
let tsd: ITestSolutionData = Object.assign({}, defaultTestSolutionData, {});
tsd.filePath = filePath;
tsd.testString = testcase;
tsd.allCase = false;
tsd.type = TestSolutionType.Type_4;
let result: string | undefined = await executeService.testSolution(tsd.filePath, tsd.testString, tsd.allCase);
tsd.result = result;
if (!result) {
return;
}
submissionService.show(result);
eventService.emit("submit", submissionService.getSubmitEvent());
// submissionService.show(result);
// eventService.emit("submit", submissionService.getSubmitEvent());
eventService.emit("testSolutionResult", result, tsd);
} catch (error) {
await promptForOpenOutputChannel("提交测试出错了. 请查看控制台信息~", OutPutType.error);
}
Expand Down
2 changes: 1 addition & 1 deletion src/debugex/debugCpp.ts
Original file line number Diff line number Diff line change
Expand Up @@ -192,7 +192,7 @@ class DebugCpp extends DebugBase {
insertCode += `${indent}(new Solution())->${problemType.funName}(arg1, arg0);\n`;
} else if (templateId === "146") {
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`;
}else {
} else {
insertCode += `${indent}(new Solution())->${problemType.funName}(${callArgs.join(", ")});\n`;
}

Expand Down
1 change: 1 addition & 0 deletions src/extension.ts
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,7 @@ export async function activate(context: ExtensionContext): Promise<void> {
commands.registerCommand("lcpr.getHelp", (input: NodeModel | Uri) => treeViewController.getHelp(input)),
commands.registerCommand("lcpr.refreshExplorer", () => treeDataService.refresh()),
commands.registerCommand("lcpr.testSolution", (uri?: Uri) => treeViewController.testSolution(uri)),
commands.registerCommand("lcpr.reTestSolution", (uri?: Uri) => treeViewController.reTestSolution(uri)),
commands.registerCommand("lcpr.testCaseDef", (uri?, allCase?) => treeViewController.testCaseDef(uri, allCase)),
commands.registerCommand("lcpr.tesCaseArea", (uri, testCase?) => treeViewController.tesCaseArea(uri, testCase)),
commands.registerCommand("lcpr.submitSolution", (uri?: Uri) => treeViewController.submitSolution(uri)),
Expand Down
25 changes: 25 additions & 0 deletions src/model/Model.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,31 @@ export enum UserStatus {
SignedOut = 2,
}

export enum TestSolutionType {
Type_1 = 1,
Type_2 = 2,
Type_3 = 3,
Type_4 = 4,
Type_5 = 5,
Type_6 = 6,
}

export interface ITestSolutionData {
filePath: string;
testString: undefined | string;
allCase: undefined | boolean;
type: TestSolutionType;
result: string | undefined;
}

export const defaultTestSolutionData: ITestSolutionData = {
filePath: "",
testString: undefined,
allCase: undefined,
type: TestSolutionType.Type_1,
result: undefined,
};

export const loginArgsMapping: Map<string, string> = new Map([
["LeetCode", "-l"],
["Cookie", "-c"],
Expand Down
10 changes: 9 additions & 1 deletion src/service/EventService.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,13 @@

import { EventEmitter } from "events";

import { IProblem, UserStatus } from "../model/Model";
import { IProblem, ITestSolutionData, UserStatus } from "../model/Model";
import { ISubmitEvent } from "../model/Model";
import { statusBarService } from "../service/StatusBarService";
import { treeDataService } from "../service/TreeDataService";
import { bricksDataService } from "./BricksDataService";
import { statusBarTimeService } from "./StatusBarTimeService";
import { submissionService } from "./SubmissionService";

class EventService extends EventEmitter {
constructor() {
Expand Down Expand Up @@ -56,6 +57,13 @@ class EventService extends EventEmitter {
this.on("groupUpdate", () => {
bricksDataService.refresh();
});

this.on("testSolutionResult", (resultString: string, tsd: ITestSolutionData) => {
submissionService.show(resultString, tsd);
});
this.on("submitSolutionResult", (resultString: string) => {
submissionService.show(resultString);
});
}
}

Expand Down
10 changes: 10 additions & 0 deletions src/service/FileButtonService.ts
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,16 @@ export class FileButtonService implements vscode.CodeLensProvider {
);
}

if (shortcuts.indexOf("retest") >= 0) {
temp_result.push(
new vscode.CodeLens(range, {
title: "ReTest",
command: "lcpr.reTestSolution",
arguments: [document.uri],
})
);
}

if (shortcuts.indexOf("star") >= 0 && node) {
temp_result.push(
new vscode.CodeLens(range, {
Expand Down
Loading