@typed/test
Version:
Simple test framework
108 lines • 4.69 kB
JavaScript
var __assign = (this && this.__assign) || Object.assign || function(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
import * as expand from 'glob-expand';
import * as fs from 'fs';
import * as path from 'path';
import * as rimraf from 'rimraf';
import * as tmp from 'tmp';
import * as ts from 'typescript';
import * as yargs from 'yargs';
import { displayTestResult, displayTestResults } from './displayTestResults';
import { flatten, map } from '167';
import { isTest, isTestCollection, isTestResult, isTestResults } from './tests';
import { red } from 'typed-colors';
tmp.setGracefulCleanup();
var cwd = process.cwd();
var temporaryDirectory = tmp.dirSync({ template: '.typed-test-XXXXXX' });
var configPath = ts.findConfigFile(cwd, function (fileName) { return fs.existsSync(fileName); });
var compilerOptions = ts.parseConfigFileTextToJson(configPath, fs.readFileSync(configPath).toString()).config.compilerOptions;
var options = ts.convertCompilerOptionsFromJson(__assign({}, compilerOptions, { module: 'commonjs', target: 'es5', noEmit: false, noEmitOnError: true, outDir: temporaryDirectory.name }), cwd).options;
var parsedArgs = yargs
.usage("\n$0 [fileGlobs]\n\n" +
" --require -r :: Require packages before running tests\n" +
" --timeout -t :: Set default timeout for tests")
.option('require', { alias: 'requires', requiresArg: false })
.option('timeout', { alias: 't' })
.showHelpOnFail(true).argv;
var globalTimeout = isNaN(parseFloat(parsedArgs.timeout)) ? 2000 : parseFloat(parsedArgs.timeout);
if (parsedArgs.help) {
yargs.showHelp();
}
else {
run(parsedArgs);
}
var failed = false;
function compile(fileNames) {
var program = ts.createProgram(fileNames, options);
var emitResult = program.emit();
var allDiagnostics = ts.getPreEmitDiagnostics(program).concat(emitResult.diagnostics);
allDiagnostics.forEach(function (diagnostic) {
var _a = diagnostic.file.getLineAndCharacterOfPosition(diagnostic.start), line = _a.line, character = _a.character;
var message = ts.flattenDiagnosticMessageText(diagnostic.messageText, '\n');
console.log(diagnostic.file.fileName + "\n (" + (line + 1) + "," + (character + 1) + "): " + message);
});
if (emitResult.emitSkipped) {
rimraf.sync(temporaryDirectory.name);
process.exit(1);
}
console.log(emitResult.emittedFiles);
}
function run(args) {
var fileGlobs = args._, requires = args.requires;
if (requires)
flatten([requires]).forEach(require);
var testFiles = map(function (file) { return path.join(cwd, file); }, expand({ cwd: cwd, filter: 'isFile' }, fileGlobs));
compile(testFiles);
var compiledTestFiles = map(function (file) { return path.join(cwd, file); }, expand({ cwd: cwd, filter: 'isFile' }, path.join(temporaryDirectory.name, '**/*.js')));
console.time("Tests Run In");
return Promise.all(compiledTestFiles.map(runTest(globalTimeout)))
.then(function (results) {
return flatten(results).forEach(function (result) { return console.log(result); });
})
.then(function () {
console.log();
console.timeEnd("Tests Run In");
if (failed) {
console.log("\n-------------------------------------" + red('Errors') + "-------------------------------------\n");
rimraf.sync(temporaryDirectory.name);
process.exit(1);
}
else {
rimraf.sync(temporaryDirectory.name);
process.exit(0);
}
});
}
function runTest(timeout) {
return function (filename) {
var pkg = require(filename);
var tests = [];
if (isTest(pkg) || isTestCollection(pkg))
tests.push(pkg);
for (var key in pkg)
if (isTest(pkg[key]) || isTestCollection(pkg[key]))
tests.push(pkg[key]);
var testResults = Promise.all(tests.map(function (test) { return test.run(timeout); }));
return testResults.then(function (results) {
return results
.map(function (result, i) {
if (result.passed === false) {
failed = true;
}
if (isTestResults(result))
return displayTestResults(tests[i].name, result);
if (isTestResult(result))
return displayTestResult(tests[i].name, result);
})
.filter(Boolean);
});
};
}
//# sourceMappingURL=cli.js.map