Skip to content

Commit b086bf7

Browse files
committed
Refactor: test/submit logic.
Signed-off-by: Eric Wang <[email protected]>
1 parent e087242 commit b086bf7

File tree

4 files changed

+104
-94
lines changed

4 files changed

+104
-94
lines changed

Diff for: lib/commands/submit.js

+31-47
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,23 @@ var cmd = {
1515
}
1616
};
1717

18-
var INDENT = ' ';
18+
function printResult(actual, k) {
19+
if (!actual.hasOwnProperty(k)) return;
20+
21+
var v = actual[k] || '';
22+
var lines = _.isArray(v) ? v : [v];
23+
lines.forEach(function(line) {
24+
if (k !== 'state') line = k + ': ' + line;
25+
log.info(' ' + h.prettyText(' ' + line, actual.ok));
26+
});
27+
}
28+
29+
function printLine() {
30+
var args = _.toArray(arguments);
31+
var actual = args.shift();
32+
var line = util.format.apply(util, args);
33+
log.info(' ' + h.prettyText(' ' + line, actual.ok));
34+
}
1935

2036
cmd.handler = function(argv) {
2137
session.argv = argv;
@@ -36,71 +52,39 @@ cmd.handler = function(argv) {
3652
if (e) return log.fail(e);
3753

3854
var result = results[0];
39-
var ok = (result.status_code === 10) &&
40-
(result.total_correct === result.total_testcases);
41-
42-
var runOk = result.run_success;
43-
44-
var line = util.format(' %s', h.statusToName(result.status_code));
45-
log.info(INDENT + h.prettyText(line, ok));
46-
47-
// show "xxx_error" message
48-
_.chain(result)
49-
.pick(function(v, k, obj) {
50-
return /_error$/.test(k) && v.length > 0;
51-
})
52-
.values()
53-
.each(function(v) {
54-
log.info(INDENT + h.prettyText(' ' + v, ok));
55-
});
56-
57-
// show success ratio
58-
line = util.format(' %d/%d cases passed (%s)',
59-
result.total_correct,
60-
result.total_testcases,
61-
result.status_runtime);
62-
log.info(INDENT + h.prettyText(line, ok));
55+
56+
printResult(result, 'state');
57+
printLine(result, '%d/%d cases passed (%s)',
58+
result.passed, result.total, result.runtime);
6359

6460
// show beat ratio
65-
if (ok) {
61+
if (result.ok) {
6662
core.getSubmission({id: result.id}, function(e, submission) {
6763
if (e || !submission || !submission.distributionChart)
6864
return log.warn('Failed to get submission beat ratio.');
6965

7066
var lang = submission.distributionChart.lang;
7167
var scores = submission.distributionChart.distribution;
72-
var myRuntime = parseFloat(result.status_runtime);
68+
var myRuntime = parseFloat(result.runtime);
7369

7470
var ratio = 0.0;
7571
scores.forEach(function(score) {
7672
if (parseFloat(score[0]) > myRuntime)
7773
ratio += parseFloat(score[1]);
7874
});
7975

80-
line = util.format(' Your runtime beats %d %% of %s submissions',
81-
ratio.toFixed(2),
82-
lang);
83-
log.info(INDENT + h.prettyText(line, ok));
76+
printLine(result, 'Your runtime beats %d %% of %s submissions',
77+
ratio.toFixed(2), lang);
8478
});
85-
}
86-
87-
// show testcase
88-
var testcase = result.input || result.last_testcase;
89-
if (!ok && testcase) {
90-
line = util.format(' testcase: %s', util.inspect(testcase));
91-
log.info(INDENT + h.prettyText(line, ok));
92-
}
93-
94-
if (!ok && runOk) {
95-
line = util.format(' output: %s', result.code_output);
96-
log.info(INDENT + h.prettyText(line, ok));
97-
98-
line = util.format(' expected: %s', result.expected_output);
99-
log.info(INDENT + h.prettyText(line, ok));
79+
} else {
80+
printResult(result, 'error');
81+
printResult(result, 'testcase');
82+
printResult(result, 'answer');
83+
printResult(result, 'expected_answer');
10084
}
10185

10286
// update this problem status in local cache
103-
core.updateProblem(problem, {state: (ok ? 'ac' : 'notac')});
87+
core.updateProblem(problem, {state: (result.ok ? 'ac' : 'notac')});
10488
});
10589
});
10690
};

Diff for: lib/commands/test.js

+21-31
Original file line numberDiff line numberDiff line change
@@ -25,21 +25,20 @@ var cmd = {
2525
}
2626
};
2727

28-
function printLine(actual, expected, key) {
29-
if (!actual.hasOwnProperty(key)) return;
30-
31-
// hack: leetcode will return status_code = 10 even
32-
// if the answer is not right!
33-
if (key === 'status_code' && actual[key] === 10) return;
34-
35-
var ok = true;
36-
if (!actual.run_success) ok = false;
37-
else if (expected && !_.isEqual(actual[key], expected[key])) ok = false;
38-
39-
var line = (key === 'status_code') ?
40-
h.statusToName(actual[key]) :
41-
key.split('_').pop() + ': ' + actual[key];
42-
log.info(' ' + h.prettyText(' ' + line, ok));
28+
function printResult(actual, expect, k) {
29+
if (!actual.hasOwnProperty(k)) return;
30+
// HACk: leetcode still return 'Accepted' even the answer is wrong!!
31+
var v = actual[k] || '';
32+
if (k === 'state' && v === 'Accepted') return;
33+
34+
var ok = actual.ok;
35+
if (expect && !_.isEqual(actual[k], expect[k])) ok = false;
36+
37+
var lines = _.isArray(v) ? v : [v];
38+
lines.forEach(function(line) {
39+
if (k !== 'state') line = k + ': ' + line;
40+
log.info(' ' + h.prettyText(' ' + line, ok));
41+
});
4342
}
4443

4544
function runTest(argv) {
@@ -72,22 +71,13 @@ function runTest(argv) {
7271

7372
for (var i = 0; i < results.length; ++i) {
7473
log.info();
75-
log.info(chalk.yellow(results[i].name));
76-
77-
printLine(results[i], null, 'status_code');
78-
printLine(results[i], null, 'status_runtime');
79-
printLine(results[i], results[i + 1], 'code_answer');
80-
printLine(results[i], results[i + 1], 'code_output');
81-
82-
// show "xxx_error" message
83-
_.chain(results[i])
84-
.pick(function(v, k, obj) {
85-
return /_error$/.test(k) && v.length > 0;
86-
})
87-
.keys()
88-
.each(function(k) {
89-
printLine(results[i], null, k);
90-
});
74+
log.info(chalk.yellow(results[i].type));
75+
76+
printResult(results[i], null, 'state');
77+
printResult(results[i], null, 'runtime');
78+
printResult(results[i], results[i + 1], 'answer');
79+
printResult(results[i], results[i + 1], 'stdout');
80+
printResult(results[i], null, 'error');
9181
}
9282
});
9383
});

Diff for: lib/plugins/leetcode.js

+40-5
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
var util = require('util');
2+
13
var _ = require('underscore');
24
var cheerio = require('cheerio');
35
var he = require('he');
@@ -209,8 +211,8 @@ function verifyResult(opts, jobs, results, cb) {
209211

210212
var result = JSON.parse(body);
211213
if (result.state === 'SUCCESS') {
212-
result.name = jobs[0].name;
213-
result.id = jobs[0].id;
214+
result = formatResult(result);
215+
_.extendOwn(result, jobs[0]);
214216
results.push(result);
215217
jobs.shift();
216218
}
@@ -219,6 +221,39 @@ function verifyResult(opts, jobs, results, cb) {
219221
});
220222
}
221223

224+
function formatResult(result) {
225+
var x = {
226+
ok: result.run_success,
227+
answer: result.code_answer || '',
228+
runtime: result.status_runtime || '',
229+
state: h.statusToName(result.status_code),
230+
testcase: util.inspect(result.input || result.last_testcase || ''),
231+
passed: result.total_correct || 0,
232+
total: result.total_testcases || 0
233+
};
234+
235+
x.error = _.chain(result)
236+
.pick(function(v, k) {
237+
return /_error$/.test(k) && v.length > 0;
238+
})
239+
.values()
240+
.value();
241+
242+
if (result.judge_type === 'large') {
243+
x.answer = result.code_output;
244+
x.expected_answer = result.expected_output;
245+
} else {
246+
x.stdout = util.inspect((result.code_output || []).join('\n'));
247+
}
248+
249+
// make sure we pass eveything!
250+
if (x.passed !== x.total) x.ok = false;
251+
if (x.state !== 'Accepted') x.ok = false;
252+
if (x.error.length > 0) x.ok = false;
253+
254+
return x;
255+
}
256+
222257
plugin.testProblem = function(problem, cb) {
223258
log.debug('running leetcode.testProblem');
224259
var opts = makeOpts(config.URL_TEST.replace('$slug', problem.slug));
@@ -228,8 +263,8 @@ plugin.testProblem = function(problem, cb) {
228263
if (e) return cb(e);
229264

230265
var jobs = [
231-
{name: 'Your', id: task.interpret_id},
232-
{name: 'Expected', id: task.interpret_expected_id}
266+
{type: 'Actual', id: task.interpret_id},
267+
{type: 'Expected', id: task.interpret_expected_id}
233268
];
234269
verifyResult(opts, jobs, [], cb);
235270
});
@@ -243,7 +278,7 @@ plugin.submitProblem = function(problem, cb) {
243278
runCode(opts, problem, function(e, task) {
244279
if (e) return cb(e);
245280

246-
var jobs = [{name: 'Your', id: task.submission_id}];
281+
var jobs = [{type: 'Actual', id: task.submission_id}];
247282
verifyResult(opts, jobs, [], cb);
248283
});
249284
};

Diff for: test/plugins/test_leetcode.js

+12-11
Original file line numberDiff line numberDiff line change
@@ -391,19 +391,18 @@ describe('plugin:leetcode', function() {
391391

392392
nock('https://leetcode.com')
393393
.get('/submissions/detail/id1/check/')
394-
.reply(200, '{"state": "SUCCESS"}');
394+
.reply(200, '{"state": "SUCCESS", "run_success": true, "status_code": 10}');
395395

396396
nock('https://leetcode.com')
397397
.get('/submissions/detail/id2/check/')
398-
.reply(200, '{"state": "SUCCESS"}');
398+
.reply(200, '{"state": "SUCCESS", "run_success": false, "status_code": 15}');
399399

400400
plugin.testProblem(PROBLEM, function(e, results) {
401401
assert.equal(e, null);
402-
assert.deepEqual(results,
403-
[
404-
{id: 'id2', name: 'Your', state: 'SUCCESS'},
405-
{id: 'id1', name: 'Expected', state: 'SUCCESS'}
406-
]);
402+
assert.equal(results[0].id, 'id2');
403+
assert.equal(results[0].ok, false);
404+
assert.equal(results[1].id, 'id1');
405+
assert.equal(results[1].ok, true);
407406
done();
408407
});
409408
});
@@ -428,11 +427,12 @@ describe('plugin:leetcode', function() {
428427

429428
nock('https://leetcode.com')
430429
.get('/submissions/detail/id1/check/')
431-
.reply(200, '{"state": "SUCCESS"}');
430+
.reply(200, '{"state": "SUCCESS", "run_success": true, "status_code": 10}');
432431

433432
plugin.submitProblem(PROBLEM, function(e, results) {
434433
assert.equal(e, null);
435-
assert.deepEqual(results, [{id: 'id1', name: 'Your', state: 'SUCCESS'}]);
434+
assert.equal(results[0].id, 'id1');
435+
assert.equal(results[0].ok, true);
436436
done();
437437
});
438438
});
@@ -452,11 +452,12 @@ describe('plugin:leetcode', function() {
452452
.reply(200, '{"state": "STARTED"}');
453453
nock('https://leetcode.com')
454454
.get('/submissions/detail/id1/check/')
455-
.reply(200, '{"state": "SUCCESS"}');
455+
.reply(200, '{"state": "SUCCESS", "run_success": true, "status_code": 10}');
456456

457457
plugin.submitProblem(PROBLEM, function(e, results) {
458458
assert.equal(e, null);
459-
assert.deepEqual(results, [{id: 'id1', name: 'Your', state: 'SUCCESS'}]);
459+
assert.equal(results[0].id, 'id1');
460+
assert.equal(results[0].ok, true);
460461
done();
461462
});
462463
});

0 commit comments

Comments
 (0)