leetcode-cli
Version:
A cli tool to enjoy leetcode!
101 lines (80 loc) • 2.56 kB
JavaScript
var fs = require('fs');
var _ = require('underscore');
var h = require('../helper');
var chalk = require('../chalk');
var log = require('../log');
var core = require('../core');
var session = require('../session');
var cmd = {
command: 'test <filename>',
aliases: ['run'],
desc: 'send solution to leetcode and run test',
builder: {
testcase: {
alias: 't',
type: 'string',
default: '',
describe: 'Provide test case in command line'
},
i: {
type: 'boolean',
default: false,
describe: 'Provide test case interactively'
}
}
};
function printResult(actual, expect, k) {
if (!actual.hasOwnProperty(k)) return;
// HACk: leetcode still return 'Accepted' even the answer is wrong!!
var v = actual[k] || '';
if (k === 'state' && v === 'Accepted') return;
var ok = actual.ok;
if (expect && !_.isEqual(actual[k], expect[k])) ok = false;
var lines = _.isArray(v) ? v : [v];
lines.forEach(function(line) {
if (k !== 'state') line = k + ': ' + line;
log.info(' ' + h.prettyText(' ' + line, ok));
});
}
function runTest(argv) {
if (!fs.existsSync(argv.filename))
return log.error('File ' + argv.filename + ' not exist!');
// use the 1st section in filename as keyword
// e.g. two-sum.cpp, or two-sum.78502271.ac.cpp
var keyword = h.getFilename(argv.filename).split('.')[0];
core.getProblem(keyword, function(e, problem) {
if (e) return log.fail(e);
if (!problem.testable)
return log.fail('not testable? please submit directly!');
if (argv.testcase)
problem.testcase = argv.testcase.replace(/\\n/g, '\n');
if (!problem.testcase)
return log.fail('missing testcase?');
problem.file = argv.filename;
log.info('\nInput data:');
log.info(problem.testcase);
core.testProblem(problem, function(e, results) {
if (e) return log.fail(e);
for (var i = 0; i < results.length; ++i) {
log.info();
log.info(chalk.yellow(results[i].type));
printResult(results[i], null, 'state');
printResult(results[i], null, 'runtime');
printResult(results[i], results[i + 1], 'answer');
printResult(results[i], results[i + 1], 'stdout');
printResult(results[i], null, 'error');
}
});
});
}
cmd.handler = function(argv) {
session.argv = argv;
if (!argv.i)
return runTest(argv);
h.readStdin(function(e, data) {
if (e) return log.fail(e);
argv.testcase = data;
return runTest(argv);
});
};
module.exports = cmd;