codin
Version:
CodinGame CLI wrapper for Node.js (probably more languages later)
83 lines (70 loc) • 1.81 kB
JavaScript
;
const { existsSync, readFileSync, writeFileSync } = require('fs');
const parseArgs = require('minimist');
const read = require('./testreader');
const run = require('./runner');
const { fatal, failed } = require('./errors');
const args = parseArgs(process.argv.slice(2), {
alias: {
t: 'test',
s: 'size'
}
});
if (existsSync('codin.config.json')) {
const config = JSON.parse(readFileSync('codin.config.json'));
for (const [ key, value ] of Object.entries(config)) {
if (!args[key] || Array.isArray(args[key]) && args[key].length === 0) {
args[key] = value;
}
}
}
const readTests = () => {
if (args.test) {
const testfiles = Array.isArray(args.test)
? args.test
: [ args.test ];
return Promise.all(testfiles.map(read))
.then(x => x.flat());
}
return Promise.resolve([]);
};
const main = tests => {
for (const file of args._) {
if (tests.length === 0) {
const [ , stderr, code, error ] = run(file);
if (code > 0 || error) {
fatal(file, code, stderr, error);
}
} else {
let n = 0;
for (const { input, output: expected } of tests) {
n++;
const [ output, stderr, code, error ] =
run(file, input.join('\n'));
if (error) {
fatal(file, code, stderr, error);
}
const troutput = output.trim();
if (troutput !== expected.join('\n')) {
failed(n, file, input, expected, troutput, stderr);
}
}
}
}
};
if (args.save) {
writeFileSync('codin.config.json', JSON.stringify(args, null, '\t'));
}
if (args.size) {
const files = Array.isArray(args.size)
? args.size
: [ args.size ];
// eslint-disable-next-line global-require
const { statSync } = require('fs');
files.forEach(file =>
console.log(
file + ': ' +
statSync(file).size + ' bytes'));
}
readTests().then(main);