From b3de1a42477c19f62321ec3f9e420ec985fdd26f Mon Sep 17 00:00:00 2001 From: undefined Date: Fri, 15 Oct 2021 19:43:07 +0800 Subject: [PATCH] ui: ensure testcase order --- packages/hydrojudge/package.json | 2 +- packages/hydrojudge/src/hosts/hydro.ts | 22 +--------- packages/hydrojudge/src/service.ts | 22 +--------- packages/hydrooj/package.json | 2 +- packages/hydrooj/src/handler/judge.ts | 1 + packages/hydrooj/src/interface.ts | 40 +++++++++---------- packages/ui-default/package.json | 2 +- .../templates/record_detail_status.html | 10 ++--- 8 files changed, 30 insertions(+), 71 deletions(-) diff --git a/packages/hydrojudge/package.json b/packages/hydrojudge/package.json index 2dca96d5..d7ff2a13 100644 --- a/packages/hydrojudge/package.json +++ b/packages/hydrojudge/package.json @@ -1,7 +1,7 @@ { "name": "@hydrooj/hydrojudge", "bin": "bin/hydrojudge.js", - "version": "2.11.9", + "version": "2.11.10", "main": "package.json", "author": "undefined ", "repository": "https://github.com/hydro-dev/Hydro.git", diff --git a/packages/hydrojudge/src/hosts/hydro.ts b/packages/hydrojudge/src/hosts/hydro.ts index 8bb6a85b..24ee7a15 100644 --- a/packages/hydrojudge/src/hosts/hydro.ts +++ b/packages/hydrojudge/src/hosts/hydro.ts @@ -39,8 +39,6 @@ class JudgeTask { data: any[]; folder: string; config: any; - nextId = 1; - nextWaiting = []; getLang: (name: string) => LangConfig; constructor(session: Hydro, request, ws: WebSocket) { @@ -135,30 +133,14 @@ class JudgeTask { delete data.judge_text; if (data.case) { data.case = { + id, status: data.case.status, time: data.case.time_ms || data.case.time, memory: data.case.memory_kb || data.case.memory, message: data.case.message || data.case.judgeText || data.case.judge_text || '', }; } - if (id) { - if (id === this.nextId) { - this.ws.send(JSON.stringify(data)); - this.nextId++; - let t = true; - while (t) { - t = false; - for (const i in this.nextWaiting) { - if (this.nextId === this.nextWaiting[i].id) { - this.ws.send(JSON.stringify(this.nextWaiting[i].data)); - this.nextId++; - this.nextWaiting.splice(+i, 1); - t = true; - } - } - } - } else this.nextWaiting.push({ data, id }); - } else this.ws.send(JSON.stringify(data)); + this.ws.send(JSON.stringify(data)); } end(data) { diff --git a/packages/hydrojudge/src/service.ts b/packages/hydrojudge/src/service.ts index e760e510..627ab254 100644 --- a/packages/hydrojudge/src/service.ts +++ b/packages/hydrojudge/src/service.ts @@ -100,8 +100,6 @@ async function postInit() { } function getNext(that) { - that.nextId = 1; - that.nextWaiting = []; return (data, id = 0) => { logger.debug('Next: %d %o', id, data); data.rid = new ObjectID(that.rid); @@ -113,30 +111,14 @@ async function postInit() { delete data.compiler_text; if (data.case) { data.case = { + id, status: data.case.status, time: data.case.time_ms || data.case.time, memory: data.case.memory_kb || data.case.memory, message: data.case.message || data.case.judgeText || '', }; } - if (id) { - if (id === that.nextId) { - _judge.next(data); - that.nextId++; - let t = true; - while (t) { - t = false; - for (const i in that.nextWaiting) { - if (that.nextId === that.nextWaiting[i].id) { - _judge.next(that.nextWaiting[i].data); - that.nextId++; - that.nextWaiting.splice(i, 1); - t = true; - } - } - } - } else that.nextWaiting.push({ data, id }); - } else _judge.next(data); + _judge.next(data); }; } diff --git a/packages/hydrooj/package.json b/packages/hydrooj/package.json index 0b7b68c1..932f4c88 100644 --- a/packages/hydrooj/package.json +++ b/packages/hydrooj/package.json @@ -1,6 +1,6 @@ { "name": "hydrooj", - "version": "2.39.23", + "version": "2.39.24", "bin": "bin/hydrooj.js", "main": "src/loader", "module": "src/loader", diff --git a/packages/hydrooj/src/handler/judge.ts b/packages/hydrooj/src/handler/judge.ts index c20e55de..37066dd5 100644 --- a/packages/hydrooj/src/handler/judge.ts +++ b/packages/hydrooj/src/handler/judge.ts @@ -59,6 +59,7 @@ export async function next(body: JudgeResultBody) { const $push: any = {}; if (body.case) { const c: TestCase = { + id: body.case.id || 0, memory: body.case.memory, time: body.case.time, message: body.case.message || '', diff --git a/packages/hydrooj/src/interface.ts b/packages/hydrooj/src/interface.ts index 06c29d92..5d426744 100644 --- a/packages/hydrooj/src/interface.ts +++ b/packages/hydrooj/src/interface.ts @@ -270,10 +270,11 @@ export interface ProblemStatusDoc extends StatusDoc { } export interface TestCase { - time: number, - memory: number, - status: number, - message: string, + id?: number; + time: number; + memory: number; + status: number; + message: string; } export interface RecordDoc { @@ -476,26 +477,23 @@ export interface Script { } export interface JudgeResultBody { - domainId: string, - rid: ObjectID, - judger?: number, - progress?: number + domainId: string; + rid: ObjectID; + judger?: number; + progress?: number; case?: { - status: number, - time: number, - memory: number, - message?: string, + id?: number; + status: number; + time: number; + memory: number; + message?: string; }, - status?: number, - score?: number, - time?: number, - memory?: number, - message?: string, + status?: number; + score?: number; + time?: number; + memory?: number; + message?: string; compilerText?: string, - - // For pretest - stdout?: string, - stderr?: string, } export interface Task { diff --git a/packages/ui-default/package.json b/packages/ui-default/package.json index 22471b9f..707d8fbc 100644 --- a/packages/ui-default/package.json +++ b/packages/ui-default/package.json @@ -1,6 +1,6 @@ { "name": "@hydrooj/ui-default", - "version": "4.25.6", + "version": "4.25.7", "author": "undefined ", "license": "AGPL-3.0", "main": "hydro.js", diff --git a/packages/ui-default/templates/record_detail_status.html b/packages/ui-default/templates/record_detail_status.html index 20c9de7e..8cf6592a 100644 --- a/packages/ui-default/templates/record_detail_status.html +++ b/packages/ui-default/templates/record_detail_status.html @@ -36,21 +36,17 @@ - {%- for rcdoc in rdoc.testCases -%} + {%- for rcdoc in rdoc.testCases|sort(false,false,'id') -%} - #{{ loop.index }} + #{{ rcdoc.id or loop.index }} {{ model.builtin.STATUS_TEXTS[rcdoc['status']] }} - {% if rdoc.domainId=='bzoj' and rcdoc.status!=STATUS.STATUS_ACCEPTED and not dl %} - {% set dl=true %} - input - output - {% endif %}{{ formatJudgeTexts([rcdoc.message]) if rcdoc.message else '' }} + {{ formatJudgeTexts([rcdoc.message]) if rcdoc.message else '' }} {% if rcdoc['status'] == STATUS.STATUS_TIME_LIMIT_EXCEEDED or rcdoc['status'] == STATUS.STATUS_MEMORY_LIMIT_EXCEEDED or rcdoc['status'] == STATUS.STATUS_OUTPUT_LIMIT_EXCEEDED %}≥{% endif %}{{ rcdoc.time|round|int }}ms {% if rcdoc['status'] == STATUS.STATUS_TIME_LIMIT_EXCEEDED or rcdoc['status'] == STATUS.STATUS_MEMORY_LIMIT_EXCEEDED or rcdoc['status'] == STATUS.STATUS_OUTPUT_LIMIT_EXCEEDED %}≥{% endif %}{{ size(rcdoc.memory, 1024) }}