diff --git a/_infrastructure/tests/compile-runner.bat b/_infrastructure/tests/compile-runner.bat deleted file mode 100644 index 53e014841..000000000 --- a/_infrastructure/tests/compile-runner.bat +++ /dev/null @@ -1 +0,0 @@ -tsc runner.ts --out runner.js --module commonjs \ No newline at end of file diff --git a/_infrastructure/tests/runner.js b/_infrastructure/tests/runner.js deleted file mode 100644 index 3721f7e11..000000000 --- a/_infrastructure/tests/runner.js +++ /dev/null @@ -1,1170 +0,0 @@ -// -// Copyright (c) Microsoft Corporation. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -var ExecResult = (function () { - function ExecResult() { - this.stdout = ""; - this.stderr = ""; - } - return ExecResult; -})(); - -var WindowsScriptHostExec = (function () { - function WindowsScriptHostExec() { - } - WindowsScriptHostExec.prototype.exec = function (filename, cmdLineArgs, handleResult) { - var result = new ExecResult(); - var shell = new ActiveXObject('WScript.Shell'); - try { - var process = shell.Exec(filename + ' ' + cmdLineArgs.join(' ')); - } catch (e) { - result.stderr = e.message; - result.exitCode = 1; - handleResult(result); - return; - } - - while (process.Status != 0) { - } - - result.exitCode = process.ExitCode; - if (!process.StdOut.AtEndOfStream) - result.stdout = process.StdOut.ReadAll(); - if (!process.StdErr.AtEndOfStream) - result.stderr = process.StdErr.ReadAll(); - - handleResult(result); - }; - return WindowsScriptHostExec; -})(); - -var NodeExec = (function () { - function NodeExec() { - } - NodeExec.prototype.exec = function (filename, cmdLineArgs, handleResult) { - var nodeExec = require('child_process').exec; - - var result = new ExecResult(); - result.exitCode = null; - var cmdLine = filename + ' ' + cmdLineArgs.join(' '); - - var process = nodeExec(cmdLine, function (error, stdout, stderr) { - result.stdout = stdout; - result.stderr = stderr; - result.exitCode = error ? error.code : 0; - handleResult(result); - }); - }; - return NodeExec; -})(); - -var Exec = (function () { - var global = Function("return this;").call(null); - if (typeof global.ActiveXObject !== "undefined") { - return new WindowsScriptHostExec(); - } else { - return new NodeExec(); - } -})(); -// -// Copyright (c) Microsoft Corporation. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -var IOUtils; -(function (IOUtils) { - // Creates the directory including its parent if not already present - function createDirectoryStructure(ioHost, dirName) { - if (ioHost.directoryExists(dirName)) { - return; - } - - var parentDirectory = ioHost.dirName(dirName); - if (parentDirectory != "") { - createDirectoryStructure(ioHost, parentDirectory); - } - ioHost.createDirectory(dirName); - } - - // Creates a file including its directory structure if not already present - function createFileAndFolderStructure(ioHost, fileName, useUTF8) { - var path = ioHost.resolvePath(fileName); - var dirName = ioHost.dirName(path); - createDirectoryStructure(ioHost, dirName); - return ioHost.createFile(path, useUTF8); - } - IOUtils.createFileAndFolderStructure = createFileAndFolderStructure; - - function throwIOError(message, error) { - var errorMessage = message; - if (error && error.message) { - errorMessage += (" " + error.message); - } - throw new Error(errorMessage); - } - IOUtils.throwIOError = throwIOError; -})(IOUtils || (IOUtils = {})); - -var IO = (function () { - // Create an IO object for use inside WindowsScriptHost hosts - // Depends on WSCript and FileSystemObject - function getWindowsScriptHostIO() { - var fso = new ActiveXObject("Scripting.FileSystemObject"); - var streamObjectPool = []; - - function getStreamObject() { - if (streamObjectPool.length > 0) { - return streamObjectPool.pop(); - } else { - return new ActiveXObject("ADODB.Stream"); - } - } - - function releaseStreamObject(obj) { - streamObjectPool.push(obj); - } - - var args = []; - for (var i = 0; i < WScript.Arguments.length; i++) { - args[i] = WScript.Arguments.Item(i); - } - - return { - readFile: function (path) { - try { - var streamObj = getStreamObject(); - streamObj.Open(); - streamObj.Type = 2; - streamObj.Charset = 'x-ansi'; - streamObj.LoadFromFile(path); - var bomChar = streamObj.ReadText(2); - streamObj.Position = 0; - if ((bomChar.charCodeAt(0) == 0xFE && bomChar.charCodeAt(1) == 0xFF) || (bomChar.charCodeAt(0) == 0xFF && bomChar.charCodeAt(1) == 0xFE)) { - streamObj.Charset = 'unicode'; - } else if (bomChar.charCodeAt(0) == 0xEF && bomChar.charCodeAt(1) == 0xBB) { - streamObj.Charset = 'utf-8'; - } - - // Read the whole file - var str = streamObj.ReadText(-1); - streamObj.Close(); - releaseStreamObject(streamObj); - return str; - } catch (err) { - IOUtils.throwIOError("Error reading file \"" + path + "\".", err); - } - }, - writeFile: function (path, contents) { - var file = this.createFile(path); - file.Write(contents); - file.Close(); - }, - fileExists: function (path) { - return fso.FileExists(path); - }, - resolvePath: function (path) { - return fso.GetAbsolutePathName(path); - }, - dirName: function (path) { - return fso.GetParentFolderName(path); - }, - findFile: function (rootPath, partialFilePath) { - var path = fso.GetAbsolutePathName(rootPath) + "/" + partialFilePath; - - while (true) { - if (fso.FileExists(path)) { - try { - var content = this.readFile(path); - return { content: content, path: path }; - } catch (err) { - //Tools.CompilerDiagnostics.debugPrint("Could not find " + path + ", trying parent"); - } - } else { - rootPath = fso.GetParentFolderName(fso.GetAbsolutePathName(rootPath)); - - if (rootPath == "") { - return null; - } else { - path = fso.BuildPath(rootPath, partialFilePath); - } - } - } - }, - deleteFile: function (path) { - try { - if (fso.FileExists(path)) { - fso.DeleteFile(path, true); - } - } catch (e) { - IOUtils.throwIOError("Couldn't delete file '" + path + "'.", e); - } - }, - createFile: function (path, useUTF8) { - try { - var streamObj = getStreamObject(); - streamObj.Charset = useUTF8 ? 'utf-8' : 'x-ansi'; - streamObj.Open(); - return { - Write: function (str) { - streamObj.WriteText(str, 0); - }, - WriteLine: function (str) { - streamObj.WriteText(str, 1); - }, - Close: function () { - try { - streamObj.SaveToFile(path, 2); - } catch (saveError) { - IOUtils.throwIOError("Couldn't write to file '" + path + "'.", saveError); - } finally { - if (streamObj.State != 0) { - streamObj.Close(); - } - releaseStreamObject(streamObj); - } - } - }; - } catch (creationError) { - IOUtils.throwIOError("Couldn't write to file '" + path + "'.", creationError); - } - }, - directoryExists: function (path) { - return fso.FolderExists(path); - }, - createDirectory: function (path) { - try { - if (!this.directoryExists(path)) { - fso.CreateFolder(path); - } - } catch (e) { - IOUtils.throwIOError("Couldn't create directory '" + path + "'.", e); - } - }, - dir: function (path, spec, options) { - options = options || {}; - function filesInFolder(folder, root) { - var paths = []; - var fc; - - if (options.recursive) { - fc = new Enumerator(folder.subfolders); - - for (; !fc.atEnd(); fc.moveNext()) { - paths = paths.concat(filesInFolder(fc.item(), root + "/" + fc.item().Name)); - } - } - - fc = new Enumerator(folder.files); - - for (; !fc.atEnd(); fc.moveNext()) { - if (!spec || fc.item().Name.match(spec)) { - paths.push(root + "/" + fc.item().Name); - } - } - - return paths; - } - - var folder = fso.GetFolder(path); - var paths = []; - - return filesInFolder(folder, path); - }, - print: function (str) { - WScript.StdOut.Write(str); - }, - printLine: function (str) { - WScript.Echo(str); - }, - arguments: args, - stderr: WScript.StdErr, - stdout: WScript.StdOut, - watchFile: null, - run: function (source, filename) { - try { - eval(source); - } catch (e) { - IOUtils.throwIOError("Error while executing file '" + filename + "'.", e); - } - }, - getExecutingFilePath: function () { - return WScript.ScriptFullName; - }, - quit: function (exitCode) { - if (typeof exitCode === "undefined") { exitCode = 0; } - try { - WScript.Quit(exitCode); - } catch (e) { - } - } - }; - } - ; - - // Create an IO object for use inside Node.js hosts - // Depends on 'fs' and 'path' modules - function getNodeIO() { - var _fs = require('fs'); - var _path = require('path'); - var _module = require('module'); - - return { - readFile: function (file) { - try { - var buffer = _fs.readFileSync(file); - switch (buffer[0]) { - case 0xFE: - if (buffer[1] == 0xFF) { - // utf16-be. Reading the buffer as big endian is not supported, so convert it to - // Little Endian first - var i = 0; - while ((i + 1) < buffer.length) { - var temp = buffer[i]; - buffer[i] = buffer[i + 1]; - buffer[i + 1] = temp; - i += 2; - } - return buffer.toString("ucs2", 2); - } - break; - case 0xFF: - if (buffer[1] == 0xFE) { - // utf16-le - return buffer.toString("ucs2", 2); - } - break; - case 0xEF: - if (buffer[1] == 0xBB) { - // utf-8 - return buffer.toString("utf8", 3); - } - } - - // Default behaviour - return buffer.toString(); - } catch (e) { - IOUtils.throwIOError("Error reading file \"" + file + "\".", e); - } - }, - writeFile: _fs.writeFileSync, - deleteFile: function (path) { - try { - _fs.unlinkSync(path); - } catch (e) { - IOUtils.throwIOError("Couldn't delete file '" + path + "'.", e); - } - }, - fileExists: function (path) { - return _fs.existsSync(path); - }, - createFile: function (path, useUTF8) { - function mkdirRecursiveSync(path) { - var stats = _fs.statSync(path); - if (stats.isFile()) { - IOUtils.throwIOError("\"" + path + "\" exists but isn't a directory.", null); - } else if (stats.isDirectory()) { - return; - } else { - mkdirRecursiveSync(_path.dirname(path)); - _fs.mkdirSync(path, 0775); - } - } - - mkdirRecursiveSync(_path.dirname(path)); - - try { - var fd = _fs.openSync(path, 'w'); - } catch (e) { - IOUtils.throwIOError("Couldn't write to file '" + path + "'.", e); - } - return { - Write: function (str) { - _fs.writeSync(fd, str); - }, - WriteLine: function (str) { - _fs.writeSync(fd, str + '\r\n'); - }, - Close: function () { - _fs.closeSync(fd); - fd = null; - } - }; - }, - dir: function dir(path, spec, options) { - options = options || {}; - - function filesInFolder(folder, deep) { - var paths = []; - - var files = _fs.readdirSync(folder); - for (var i = 0; i < files.length; i++) { - var stat = _fs.statSync(folder + "/" + files[i]); - if (options.recursive && stat.isDirectory()) { - if (deep < (options.deep || 100)) { - paths = paths.concat(filesInFolder(folder + "/" + files[i], 1)); - } - } else if (stat.isFile() && (!spec || files[i].match(spec))) { - paths.push(folder + "/" + files[i]); - } - } - - return paths; - } - - return filesInFolder(path, 0); - }, - createDirectory: function (path) { - try { - if (!this.directoryExists(path)) { - _fs.mkdirSync(path); - } - } catch (e) { - IOUtils.throwIOError("Couldn't create directory '" + path + "'.", e); - } - }, - directoryExists: function (path) { - return _fs.existsSync(path) && _fs.lstatSync(path).isDirectory(); - }, - resolvePath: function (path) { - return _path.resolve(path); - }, - dirName: function (path) { - return _path.dirname(path); - }, - findFile: function (rootPath, partialFilePath) { - var path = rootPath + "/" + partialFilePath; - - while (true) { - if (_fs.existsSync(path)) { - try { - var content = this.readFile(path); - return { content: content, path: path }; - } catch (err) { - //Tools.CompilerDiagnostics.debugPrint(("Could not find " + path) + ", trying parent"); - } - } else { - var parentPath = _path.resolve(rootPath, ".."); - - if (rootPath === parentPath) { - return null; - } else { - rootPath = parentPath; - path = _path.resolve(rootPath, partialFilePath); - } - } - } - }, - print: function (str) { - process.stdout.write(str); - }, - printLine: function (str) { - process.stdout.write(str + '\n'); - }, - arguments: process.argv.slice(2), - stderr: { - Write: function (str) { - process.stderr.write(str); - }, - WriteLine: function (str) { - process.stderr.write(str + '\n'); - }, - Close: function () { - } - }, - stdout: { - Write: function (str) { - process.stdout.write(str); - }, - WriteLine: function (str) { - process.stdout.write(str + '\n'); - }, - Close: function () { - } - }, - watchFile: function (filename, callback) { - var firstRun = true; - var processingChange = false; - - var fileChanged = function (curr, prev) { - if (!firstRun) { - if (curr.mtime < prev.mtime) { - return; - } - - _fs.unwatchFile(filename, fileChanged); - if (!processingChange) { - processingChange = true; - callback(filename); - setTimeout(function () { - processingChange = false; - }, 100); - } - } - firstRun = false; - _fs.watchFile(filename, { persistent: true, interval: 500 }, fileChanged); - }; - - fileChanged(); - return { - filename: filename, - close: function () { - _fs.unwatchFile(filename, fileChanged); - } - }; - }, - run: function (source, filename) { - require.main.filename = filename; - require.main.paths = _module._nodeModulePaths(_path.dirname(_fs.realpathSync(filename))); - require.main._compile(source, filename); - }, - getExecutingFilePath: function () { - return process.mainModule.filename; - }, - quit: process.exit - }; - } - ; - - if (typeof ActiveXObject === "function") - return getWindowsScriptHostIO(); -else if (typeof require === "function") - return getNodeIO(); -else - return null; -})(); -var DefinitelyTyped; -(function (DefinitelyTyped) { - /// - /// - /// - (function (TestManager) { - var path = require('path'); - - function endsWith(str, suffix) { - return str.indexOf(suffix, str.length - suffix.length) !== -1; - } - - var Iterator = (function () { - function Iterator(list) { - this.list = list; - this.index = -1; - } - Iterator.prototype.next = function () { - this.index++; - return this.list[this.index]; - }; - - Iterator.prototype.hasNext = function () { - return this.list[1 + this.index] != null; - }; - return Iterator; - })(); - - var Tsc = (function () { - function Tsc() { - } - Tsc.run = function (tsfile, callback) { - var command = 'node ./_infrastructure/tests/typescript/tsc.js --module commonjs '; - if (IO.fileExists(tsfile + '.tscparams')) { - command += '@' + tsfile + '.tscparams'; - } else { - command += '--noImplicitAny'; - } - Exec.exec(command, [tsfile], function (ExecResult) { - callback(ExecResult); - }); - }; - return Tsc; - })(); - - var Test = (function () { - function Test(tsfile) { - this.tsfile = tsfile; - } - Test.prototype.run = function (callback) { - Tsc.run(this.tsfile, callback); - }; - return Test; - })(); - - var Typing = (function () { - function Typing(name, baseDir) { - this.name = name; - this.fileHandler = new FileHandler(baseDir + '/' + name + '/', /.\.ts/g); - } - return Typing; - })(); - - ///////////////////////////////// - // Given a document root + ts file pattern this class returns: - // all the TS files OR just tests OR just definition files - ///////////////////////////////// - var FileHandler = (function () { - function FileHandler(path, pattern) { - this.path = path; - this.files = []; - this.typings = []; - this.files = IO.dir(path, pattern, { recursive: true }).sort(); - } - FileHandler.prototype.allTS = function () { - return this.files; - }; - - FileHandler.prototype.allTests = function () { - var tests = []; - - for (var i = 0; i < this.files.length; i++) { - if (endsWith(this.files[i].toUpperCase(), '-TESTS.TS')) { - tests.push(this.files[i]); - } - } - - return tests; - }; - - FileHandler.prototype.allTypings = function () { - var typings = {}; - - for (var i = 0; i < this.files.length; i++) { - var file = this.files[i]; - var firName = path.dirname(file.substr(this.path.length + 1)).replace('\\', '/'); - var dir = firName.split('/')[0]; - - if (!typings[dir]) - typings[dir] = true; - } - - var list = []; - for (var attr in typings) { - list.push(attr); - } - - return list; - }; - return FileHandler; - })(); - - ///////////////////////////////// - // Timer.start starts a timer - // Timer.end stops the timer and sets asString to the pretty print value - ///////////////////////////////// - var Timer = (function () { - function Timer() { - this.time = 0; - } - Timer.prettyDate = function (date1, date2) { - var diff = ((date2 - date1) / 1000), day_diff = Math.floor(diff / 86400); - - if (isNaN(day_diff) || day_diff < 0 || day_diff >= 31) - return; - - return (day_diff == 0 && (diff < 60 && (diff + " seconds") || diff < 120 && "1 minute" || diff < 3600 && Math.floor(diff / 60) + " minutes" || diff < 7200 && "1 hour" || diff < 86400 && Math.floor(diff / 3600) + " hours") || day_diff == 1 && "Yesterday" || day_diff < 7 && day_diff + " days" || day_diff < 31 && Math.ceil(day_diff / 7) + " weeks"); - }; - - Timer.prototype.start = function () { - this.time = 0; - this.startTime = this.now(); - }; - - Timer.prototype.now = function () { - return Date.now(); - }; - - Timer.prototype.end = function () { - this.time = (this.now() - this.startTime) / 1000; - this.asString = Timer.prettyDate(this.startTime, this.now()); - }; - return Timer; - })(); - - ///////////////////////////////// - // All the common things that we pring are functions of this class - ///////////////////////////////// - var Print = (function () { - function Print(version, typings, tsFiles) { - this.version = version; - this.typings = typings; - this.tsFiles = tsFiles; - } - Print.prototype.out = function (s) { - process.stdout.write(s); - }; - - Print.prototype.printHeader = function () { - this.out('=============================================================================\n'); - this.out(' \33[36m\33[1mDefinitelyTyped test runner 0.3.0\33[0m\n'); - this.out('=============================================================================\n'); - this.out(' \33[36m\33[1mTypescript version:\33[0m ' + this.version + '\n'); - this.out(' \33[36m\33[1mTypings :\33[0m ' + this.typings + '\n'); - this.out(' \33[36m\33[1mTypeScript files :\33[0m ' + this.tsFiles + '\n'); - }; - - Print.prototype.printSyntaxCheckingHeader = function () { - this.out('============================ \33[34m\33[1mSyntax checking\33[0m ================================\n'); - }; - - Print.prototype.printTypingTestsHeader = function () { - this.out('============================= \33[34m\33[1mTyping tests\33[0m ==================================\n'); - }; - - Print.prototype.printSuccessCharacter = function () { - this.out('\33[36m\33[1m.\33[0m'); - }; - - Print.prototype.printFailureCharacter = function () { - this.out('x'); - }; - - Print.prototype.printDiv = function () { - this.out('-----------------------------------------------------------------------------\n'); - }; - - Print.prototype.printBoldDiv = function () { - this.out('=============================================================================\n'); - }; - - Print.prototype.printErrorsHeader = function () { - this.out('=============================================================================\n'); - this.out(' \33[34m\33[1mErrors in files\33[0m \n'); - this.out('=============================================================================\n'); - }; - - Print.prototype.printErrorsForFile = function (file) { - this.out('----------------- For file:' + file.formatName()); - this.printBreak(); - this.out(file.execResult.stderr); - this.printBreak(); - }; - - Print.prototype.printfilesWithSintaxErrorMessage = function () { - this.out(' \33[36m\33[1mFiles with syntax error\33[0m\n'); - }; - - Print.prototype.printFailedTestMessage = function () { - this.out(' \33[36m\33[1mFailed tests\33[0m\n'); - }; - - Print.prototype.printTypingsWithoutTestsMessage = function () { - this.out(' \33[36m\33[1mTyping without tests\33[0m\n'); - }; - - Print.prototype.printTotalMessage = function () { - this.out(' \33[36m\33[1mTotal\33[0m\n'); - }; - - Print.prototype.printErrorFile = function (file) { - this.out(' - ' + file + '\n'); - }; - - Print.prototype.printTypingsWithoutTest = function (file) { - this.out(' - \33[33m\33[1m' + file + '\33[0m\n'); - }; - - Print.prototype.printBreak = function () { - this.out('\n'); - }; - - Print.prototype.printSuccessCount = function (current, total) { - this.out(' \33[36m\33[1mSuccessful :\33[0m \33[32m\33[1m' + ((current / total) * 100).toFixed(2) + '% (' + current + '/' + total + ')\33[0m\n'); - }; - - Print.prototype.printFailedCount = function (current, total) { - this.out(' \33[36m\33[1mFailure :\33[0m \33[31m\33[1m' + ((current / total) * 100).toFixed(2) + '% (' + current + '/' + total + ')\33[0m\n'); - }; - - Print.prototype.printElapsedTime = function (time, s) { - this.out(' \33[36m\33[1mElapsed time :\33[0m ~' + time + ' (' + s + 's)\n'); - }; - - Print.prototype.printSyntaxErrorCount = function (current, total) { - this.out(' \33[36m\33[1mSyntax error :\33[0m \33[31m\33[1m' + ((current / total) * 100).toFixed(2) + '% (' + current + '/' + total + ')\33[0m\n'); - }; - - Print.prototype.printTestErrorCount = function (current, total) { - this.out(' \33[36m\33[1mFailed tests :\33[0m \33[31m\33[1m' + ((current / total) * 100).toFixed(2) + '% (' + current + '/' + total + ')\33[0m\n'); - }; - - Print.prototype.printWithoutTestCount = function (current, total) { - this.out(' \33[36m\33[1mWithout tests :\33[0m \33[33m\33[1m' + ((current / total) * 100).toFixed(2) + '% (' + current + '/' + total + ')\33[0m\n'); - }; - return Print; - })(); - - ///////////////////////////// - // Represents the results of a test file execution - ///////////////////////////// - var File = (function () { - function File(baseDir, filePathWithName, execResult) { - this.baseDir = baseDir; - this.filePathWithName = filePathWithName; - this.execResult = execResult; - } - // From '/complete/path/to/file' to 'specfolder/specfile.d.ts' - File.prototype.formatName = function () { - var dirName = path.dirname(this.filePathWithName.substr(this.baseDir.length + 1)).replace('\\', '/'); - var dir = dirName.split('/')[0]; - var file = path.basename(this.filePathWithName, '.ts'); - var ext = path.extname(this.filePathWithName); - - return dir + ((dirName.split('/').length > 1) ? '/-/' : '/') + '\33[36m\33[1m' + file + '\33[0m' + ext; - }; - return File; - })(); - - ///////////////////////////// - // Determine syntax errors in typings - ///////////////////////////// - var SyntaxChecking = (function () { - function SyntaxChecking(fileHandler, out) { - this.fileHandler = fileHandler; - this.out = out; - this.files = []; - this.timer = new Timer(); - } - SyntaxChecking.prototype.getFailedFiles = function () { - var list = []; - - for (var i = 0; i < this.files.length; i++) { - if (this.files[i].execResult.exitCode) { - list.push(this.files[i]); - } - } - - return list; - }; - - SyntaxChecking.prototype.getSuccessFiles = function () { - var list = []; - - for (var i = 0; i < this.files.length; i++) { - if (!this.files[i].execResult.exitCode) { - list.push(this.files[i]); - } - } - - return list; - }; - - SyntaxChecking.prototype.printStats = function () { - this.out.printDiv(); - this.out.printElapsedTime(this.timer.asString, this.timer.time); - this.out.printSuccessCount(this.getSuccessFiles().length, this.files.length); - this.out.printFailedCount(this.getFailedFiles().length, this.files.length); - }; - - SyntaxChecking.prototype.printFailedFiles = function () { - if (this.getFailedFiles().length > 0) { - this.out.printDiv(); - - this.out.printfilesWithSintaxErrorMessage(); - - this.out.printDiv(); - - for (var i = 0; i < this.getFailedFiles().length; i++) { - var errorFile = this.getFailedFiles()[i]; - this.out.printErrorFile(errorFile.formatName()); - } - } - }; - - SyntaxChecking.prototype.run = function (it, file, len, maxLen, callback) { - var _this = this; - if (!endsWith(file.toUpperCase(), '-TESTS.TS') && endsWith(file.toUpperCase(), '.TS') && file.indexOf('../_infrastructure') < 0) { - new Test(file).run(function (execResult) { - if (execResult.exitCode === 1) { - _this.out.printFailureCharacter(); - len++; - } else { - _this.out.printSuccessCharacter(); - len++; - } - - _this.files.push(new File(_this.fileHandler.path, file, execResult)); - - if (len > maxLen) { - len = 0; - _this.out.printBreak(); - } - - if (it.hasNext()) { - _this.run(it, it.next(), len, maxLen, callback); - } else { - _this.out.printBreak(); - _this.timer.end(); - _this.printFailedFiles(); - _this.printStats(); - - callback(_this.getFailedFiles().length, _this.files.length); - } - }); - } else if (it.hasNext()) { - this.run(it, it.next(), len, maxLen, callback); - } else { - this.out.printBreak(); - this.timer.end(); - this.printStats(); - this.printFailedFiles(); - - callback(this.getFailedFiles().length, this.files.length); - } - }; - - SyntaxChecking.prototype.start = function (callback) { - this.timer.start(); - - var tsFiles = this.fileHandler.allTS(); - - var it = new Iterator(tsFiles); - - var len = 0; - var maxLen = 76; - - if (it.hasNext()) { - this.run(it, it.next(), len, maxLen, callback); - } - }; - return SyntaxChecking; - })(); - - ///////////////////////////// - // Determines errors in typing tests - ///////////////////////////// - var TestEval = (function () { - function TestEval(fileHandler, out) { - this.fileHandler = fileHandler; - this.out = out; - this.files = []; - this.timer = new Timer(); - } - TestEval.prototype.getFailedFiles = function () { - var list = []; - - for (var i = 0; i < this.files.length; i++) { - if (this.files[i].execResult.exitCode) { - list.push(this.files[i]); - } - } - - return list; - }; - - TestEval.prototype.getSuccessFiles = function () { - var list = []; - - for (var i = 0; i < this.files.length; i++) { - if (!this.files[i].execResult.exitCode) { - list.push(this.files[i]); - } - } - - return list; - }; - - TestEval.prototype.printStats = function () { - this.out.printDiv(); - this.out.printElapsedTime(this.timer.asString, this.timer.time); - this.out.printSuccessCount(this.getSuccessFiles().length, this.files.length); - this.out.printFailedCount(this.getFailedFiles().length, this.files.length); - }; - - TestEval.prototype.printFailedFiles = function () { - if (this.getFailedFiles().length > 0) { - this.out.printDiv(); - - this.out.printFailedTestMessage(); - - this.out.printDiv(); - - for (var i = 0; i < this.getFailedFiles().length; i++) { - var errorFile = this.getFailedFiles()[i]; - this.out.printErrorFile(errorFile.formatName()); - } - } - }; - - TestEval.prototype.run = function (it, file, len, maxLen, callback) { - var _this = this; - if (endsWith(file.toUpperCase(), '-TESTS.TS')) { - new Test(file).run(function (execResult) { - if (execResult.exitCode === 1) { - _this.out.printFailureCharacter(); - len++; - } else { - _this.out.printSuccessCharacter(); - len++; - } - - _this.files.push(new File(_this.fileHandler.path, file, execResult)); - - if (len > maxLen) { - len = 0; - _this.out.printBreak(); - } - - if (it.hasNext()) { - _this.run(it, it.next(), len, maxLen, callback); - } else { - _this.out.printBreak(); - _this.timer.end(); - _this.printFailedFiles(); - _this.printStats(); - - callback(_this.getFailedFiles().length, _this.files.length); - } - }); - } else if (it.hasNext()) { - this.run(it, it.next(), len, maxLen, callback); - } else { - this.out.printBreak(); - this.timer.end(); - this.printFailedFiles(); - this.printStats(); - - callback(this.getFailedFiles().length, this.files.length); - } - }; - - TestEval.prototype.start = function (callback) { - this.timer.start(); - - var tsFiles = this.fileHandler.allTS(); - - var it = new Iterator(tsFiles); - - var len = 0; - var maxLen = 76; - - if (it.hasNext()) { - this.run(it, it.next(), len, maxLen, callback); - } - }; - return TestEval; - })(); - - ///////////////////////////////// - // The main class to kick things off - ///////////////////////////////// - var TestRunner = (function () { - function TestRunner(dtPath) { - this.dtPath = dtPath; - this.typings = []; - this.fh = new FileHandler(dtPath, /.\.ts/g); - this.out = new Print('0.9.1.1', this.fh.allTypings().length, this.fh.allTS().length); - this.sc = new SyntaxChecking(this.fh, this.out); - this.te = new TestEval(this.fh, this.out); - - var tpgs = this.fh.allTypings(); - for (var i = 0; i < tpgs.length; i++) { - this.typings.push(new Typing(tpgs[i], this.dtPath)); - } - } - TestRunner.prototype.printTypingsWithoutTest = function () { - var count = 0; - - if (this.typings.length > 0) { - this.out.printDiv(); - - this.out.printTypingsWithoutTestsMessage(); - - this.out.printDiv(); - - for (var i = 0; i < this.typings.length; i++) { - var typing = this.typings[i]; - if (typing.fileHandler.allTests().length == 0) { - if (typing.name != '_infrastructure' && typing.name != '_ReSharper.DefinitelyTyped' && typing.name != 'obj' && typing.name != 'bin' && typing.name != 'Properties') { - this.out.printTypingsWithoutTest(typing.name); - count++; - } - } - } - } - - return count; - }; - - TestRunner.prototype.printErrorsDetected = function () { - var _this = this; - this.out.printErrorsHeader(); - - var printErrorsForFileIfFound = function (file) { - if (file.execResult.exitCode) - _this.out.printErrorsForFile(file); - }; - - // sc errors: - this.sc.files.forEach(printErrorsForFileIfFound); - this.out.printBoldDiv(); - - // te errors: - this.te.files.forEach(printErrorsForFileIfFound); - this.out.printBoldDiv(); - }; - - TestRunner.prototype.run = function () { - var _this = this; - var timer = new Timer(); - timer.start(); - - this.out.printHeader(); - - // Run syntax tests - this.out.printSyntaxCheckingHeader(); - this.sc.start(function (syntaxFailedCount, syntaxTotal) { - // Now run typing tests - _this.out.printTypingTestsHeader(); - _this.te.start(function (testFailedCount, testTotal) { - // Get the tests without any typing and simultaneously print their names - var totalTypingsWithoutTest = _this.printTypingsWithoutTest(); - - // End total timer and print final messages - timer.end(); - - _this.out.printDiv(); - _this.out.printTotalMessage(); - _this.out.printDiv(); - - _this.out.printElapsedTime(timer.asString, timer.time); - _this.out.printSyntaxErrorCount(syntaxFailedCount, syntaxTotal); - _this.out.printTestErrorCount(testFailedCount, testTotal); - _this.out.printWithoutTestCount(totalTypingsWithoutTest, _this.fh.allTypings().length); - - _this.out.printDiv(); - - if (syntaxFailedCount > 0 || testFailedCount > 0) { - _this.printErrorsDetected(); - process.exit(1); - } - }); - }); - }; - return TestRunner; - })(); - TestManager.TestRunner = TestRunner; - })(DefinitelyTyped.TestManager || (DefinitelyTyped.TestManager = {})); - var TestManager = DefinitelyTyped.TestManager; -})(DefinitelyTyped || (DefinitelyTyped = {})); - -var dtPath = __dirname + '/../..'; - -var runner = new DefinitelyTyped.TestManager.TestRunner(dtPath); -runner.run(); diff --git a/_infrastructure/tests/runner.ts b/_infrastructure/tests/runner.ts deleted file mode 100644 index 68682f536..000000000 --- a/_infrastructure/tests/runner.ts +++ /dev/null @@ -1,627 +0,0 @@ -/// - -/// -/// - -module DefinitelyTyped.TestManager { - - var path = require('path'); - - function endsWith(str, suffix) { - return str.indexOf(suffix, str.length - suffix.length) !== -1; - } - - class Iterator { - index: number = -1; - - constructor(public list: any[]) { } - - public next() { - this.index++; - return this.list[this.index]; - } - - public hasNext() { - return this.list[1 + this.index] != null; - } - } - - interface TscCallback { - (result: ExecResult): void; - } - - class Tsc { - public static run(tsfile: string, callback: TscCallback) { - var command = 'node ./_infrastructure/tests/typescript/tsc.js --module commonjs '; - if (IO.fileExists(tsfile + '.tscparams')) { - command += '@' + tsfile + '.tscparams'; - } else { - command += '--noImplicitAny'; - } - Exec.exec(command, [tsfile], (ExecResult) => { - callback(ExecResult); - }); - } - } - - class Test { - constructor(public tsfile: string) { } - - public run(callback: TscCallback) { - Tsc.run(this.tsfile, callback); - } - } - - class Typing { - public fileHandler: FileHandler; - - constructor(public name: string, baseDir: string) { - this.fileHandler = new FileHandler(baseDir + '/' + name + '/', /.\.ts/g); - } - } - - ///////////////////////////////// - // Given a document root + ts file pattern this class returns: - // all the TS files OR just tests OR just definition files - ///////////////////////////////// - class FileHandler { - public files: string[] = []; - public typings: Typing[] = []; - - constructor(public path: string, pattern: any) { - this.files = IO.dir(path, pattern, { recursive: true }).sort(); - } - - public allTS(): string[] { - return this.files; - } - - public allTests(): string[] { - var tests = []; - - for (var i = 0; i < this.files.length; i++) { - if (endsWith(this.files[i].toUpperCase(), '-TESTS.TS')) { - tests.push(this.files[i]); - } - } - - return tests; - } - - public allTypings(): string[] { - var typings = {}; - - for (var i = 0; i < this.files.length; i++) { - var file = this.files[i]; - var firName = path.dirname(file.substr(this.path.length + 1)).replace('\\', '/'); - var dir = firName.split('/')[0]; - - if (!typings[dir]) typings[dir] = true; - } - - var list = []; - for (var attr in typings) { - list.push(attr); - } - - return list; - } - } - - ///////////////////////////////// - // Timer.start starts a timer - // Timer.end stops the timer and sets asString to the pretty print value - ///////////////////////////////// - class Timer { - public startTime; - public time = 0; - public asString: string; - - private static prettyDate(date1, date2): string { - var diff = ((date2 - date1) / 1000), - day_diff = Math.floor(diff / 86400); - - if (isNaN(day_diff) || day_diff < 0 || day_diff >= 31) - return; - - return (day_diff == 0 && ( - diff < 60 && (diff + " seconds") || - diff < 120 && "1 minute" || - diff < 3600 && Math.floor(diff / 60) + " minutes" || - diff < 7200 && "1 hour" || - diff < 86400 && Math.floor(diff / 3600) + " hours") || - day_diff == 1 && "Yesterday" || - day_diff < 7 && day_diff + " days" || - day_diff < 31 && Math.ceil(day_diff / 7) + " weeks"); - } - - public start() { - this.time = 0; - this.startTime = this.now(); - } - - private now() { - return Date.now(); - } - - public end() { - this.time = (this.now() - this.startTime) / 1000; - this.asString = Timer.prettyDate(this.startTime, this.now()); - } - } - - ///////////////////////////////// - // All the common things that we pring are functions of this class - ///////////////////////////////// - class Print { - constructor(public version: string, public typings: number, public tsFiles: number) { } - - public out(s) { - process.stdout.write(s); - } - - public printHeader() { - this.out('=============================================================================\n'); - this.out(' \33[36m\33[1mDefinitelyTyped test runner 0.3.0\33[0m\n'); - this.out('=============================================================================\n'); - this.out(' \33[36m\33[1mTypescript version:\33[0m ' + this.version + '\n'); - this.out(' \33[36m\33[1mTypings :\33[0m ' + this.typings + '\n'); - this.out(' \33[36m\33[1mTypeScript files :\33[0m ' + this.tsFiles + '\n'); - } - - public printSyntaxCheckingHeader() { - this.out('============================ \33[34m\33[1mSyntax checking\33[0m ================================\n'); - } - - public printTypingTestsHeader() { - this.out('============================= \33[34m\33[1mTyping tests\33[0m ==================================\n'); - } - - public printSuccessCharacter() { - this.out('\33[36m\33[1m.\33[0m'); - } - - public printFailureCharacter() { - this.out('x'); - } - - public printDiv() { - this.out('-----------------------------------------------------------------------------\n'); - } - - public printBoldDiv() { - this.out('=============================================================================\n'); - } - - public printErrorsHeader() { - this.out('=============================================================================\n'); - this.out(' \33[34m\33[1mErrors in files\33[0m \n'); - this.out('=============================================================================\n'); - } - - public printErrorsForFile(file: File) { - this.out('----------------- For file:' + file.formatName() ); - this.printBreak(); - this.out(file.execResult.stderr); - this.printBreak(); - } - - public printfilesWithSintaxErrorMessage() { - this.out(' \33[36m\33[1mFiles with syntax error\33[0m\n'); - } - - public printFailedTestMessage() { - this.out(' \33[36m\33[1mFailed tests\33[0m\n'); - } - - public printTypingsWithoutTestsMessage() { - this.out(' \33[36m\33[1mTyping without tests\33[0m\n'); - } - - public printTotalMessage() { - this.out(' \33[36m\33[1mTotal\33[0m\n'); - } - - public printErrorFile(file: string) { - this.out(' - ' + file + '\n'); - } - - public printTypingsWithoutTest(file) { - this.out(' - \33[33m\33[1m' + file + '\33[0m\n'); - } - - public printBreak() { - this.out('\n'); - } - - public printSuccessCount(current: number, total: number) { - this.out(' \33[36m\33[1mSuccessful :\33[0m \33[32m\33[1m' + ((current / total) * 100).toFixed(2) + '% (' + current + '/' + total + ')\33[0m\n'); - } - - public printFailedCount(current: number, total: number) { - this.out(' \33[36m\33[1mFailure :\33[0m \33[31m\33[1m' + ((current / total) * 100).toFixed(2) + '% (' + current + '/' + total + ')\33[0m\n'); - } - - public printElapsedTime(time, s) { - this.out(' \33[36m\33[1mElapsed time :\33[0m ~' + time + ' (' + s + 's)\n'); - } - - public printSyntaxErrorCount(current: number, total: number) { - this.out(' \33[36m\33[1mSyntax error :\33[0m \33[31m\33[1m' + ((current / total) * 100).toFixed(2) + '% (' + current + '/' + total + ')\33[0m\n'); - } - - public printTestErrorCount(current: number, total: number) { - this.out(' \33[36m\33[1mFailed tests :\33[0m \33[31m\33[1m' + ((current / total) * 100).toFixed(2) + '% (' + current + '/' + total + ')\33[0m\n'); - } - - public printWithoutTestCount(current: number, total: number) { - this.out(' \33[36m\33[1mWithout tests :\33[0m \33[33m\33[1m' + ((current / total) * 100).toFixed(2) + '% (' + current + '/' + total + ')\33[0m\n'); - } - } - - ///////////////////////////// - // Represents the results of a test file execution - ///////////////////////////// - class File { - static baseDir: string; - - constructor(public baseDir: string, public filePathWithName: string, public execResult: ExecResult) { } - - // From '/complete/path/to/file' to 'specfolder/specfile.d.ts' - public formatName(): string { - var dirName = path.dirname(this.filePathWithName.substr(this.baseDir.length + 1)).replace('\\', '/'); - var dir = dirName.split('/')[0]; - var file = path.basename(this.filePathWithName, '.ts'); - var ext = path.extname(this.filePathWithName); - - return dir + ((dirName.split('/').length > 1) ? '/-/' : '/') + '\33[36m\33[1m' + file + '\33[0m' + ext; - } - } - - - ///////////////////////////// - // Determine syntax errors in typings - ///////////////////////////// - class SyntaxChecking { - - private timer: Timer; - - public files: File[] = []; - - private getFailedFiles(): File[] { - var list: File[] = []; - - for (var i = 0; i < this.files.length; i++) { - if (this.files[i].execResult.exitCode) { - list.push(this.files[i]); - } - } - - return list; - } - - private getSuccessFiles(): File[] { - var list: File[] = []; - - for (var i = 0; i < this.files.length; i++) { - if (!this.files[i].execResult.exitCode) { - list.push(this.files[i]); - } - } - - return list; - } - - constructor(public fileHandler: FileHandler, public out: Print) { - this.timer = new Timer(); - } - - private printStats() { - this.out.printDiv(); - this.out.printElapsedTime(this.timer.asString, this.timer.time); - this.out.printSuccessCount(this.getSuccessFiles().length, this.files.length); - this.out.printFailedCount(this.getFailedFiles().length, this.files.length); - } - - private printFailedFiles() { - if (this.getFailedFiles().length > 0) { - this.out.printDiv(); - - this.out.printfilesWithSintaxErrorMessage(); - - this.out.printDiv(); - - for (var i = 0; i < this.getFailedFiles().length; i++) { - var errorFile = this.getFailedFiles()[i]; - this.out.printErrorFile(errorFile.formatName()); - } - } - } - - private run(it, file, len, maxLen, callback: Function) { - if (!endsWith(file.toUpperCase(), '-TESTS.TS') && endsWith(file.toUpperCase(), '.TS') && file.indexOf('../_infrastructure') < 0) { - new Test(file).run((execResult) => { - - if (execResult.exitCode === 1) { - this.out.printFailureCharacter(); - len++; - } else { - this.out.printSuccessCharacter(); - len++; - } - - this.files.push(new File(this.fileHandler.path, file, execResult)); - - if (len > maxLen) { - len = 0; - this.out.printBreak(); - } - - if (it.hasNext()) { - this.run(it, it.next(), len, maxLen, callback); - } else { - this.out.printBreak(); - this.timer.end(); - this.printFailedFiles(); - this.printStats(); - - callback(this.getFailedFiles().length, this.files.length); - } - }); - } else if (it.hasNext()) { - this.run(it, it.next(), len, maxLen, callback); - } else { - this.out.printBreak(); - this.timer.end(); - this.printStats(); - this.printFailedFiles(); - - callback(this.getFailedFiles().length, this.files.length); - } - } - - public start(callback: Function) { - this.timer.start(); - - var tsFiles = this.fileHandler.allTS(); - - var it = new Iterator(tsFiles); - - var len = 0; - var maxLen = 76; - - if (it.hasNext()) { - this.run(it, it.next(), len, maxLen, callback); - } - } - } - - ///////////////////////////// - // Determines errors in typing tests - ///////////////////////////// - class TestEval { - - private timer: Timer; - - public files: File[] = []; - - private getFailedFiles(): File[] { - var list: File[] = []; - - for (var i = 0; i < this.files.length; i++) { - if (this.files[i].execResult.exitCode) { - list.push(this.files[i]); - } - } - - return list; - } - - private getSuccessFiles(): File[] { - var list: File[] = []; - - for (var i = 0; i < this.files.length; i++) { - if (!this.files[i].execResult.exitCode) { - list.push(this.files[i]); - } - } - - return list; - } - - constructor(public fileHandler: FileHandler, public out: Print) { - this.timer = new Timer(); - } - - private printStats() { - this.out.printDiv(); - this.out.printElapsedTime(this.timer.asString, this.timer.time); - this.out.printSuccessCount(this.getSuccessFiles().length, this.files.length); - this.out.printFailedCount(this.getFailedFiles().length, this.files.length); - } - - private printFailedFiles() { - if (this.getFailedFiles().length > 0) { - this.out.printDiv(); - - this.out.printFailedTestMessage(); - - this.out.printDiv(); - - for (var i = 0; i < this.getFailedFiles().length; i++) { - var errorFile = this.getFailedFiles()[i]; - this.out.printErrorFile(errorFile.formatName()); - } - } - } - - private run(it, file, len, maxLen, callback: Function) { - if (endsWith(file.toUpperCase(), '-TESTS.TS')) { - new Test(file).run((execResult) => { - - if (execResult.exitCode === 1) { - this.out.printFailureCharacter(); - len++; - } else { - this.out.printSuccessCharacter(); - len++; - } - - this.files.push(new File(this.fileHandler.path, file, execResult)); - - if (len > maxLen) { - len = 0; - this.out.printBreak(); - } - - if (it.hasNext()) { - this.run(it, it.next(), len, maxLen, callback); - } else { - this.out.printBreak(); - this.timer.end(); - this.printFailedFiles(); - this.printStats(); - - callback(this.getFailedFiles().length, this.files.length); - } - }); - } else if (it.hasNext()) { - this.run(it, it.next(), len, maxLen, callback); - } else { - this.out.printBreak(); - this.timer.end(); - this.printFailedFiles(); - this.printStats(); - - callback(this.getFailedFiles().length, this.files.length); - } - } - - public start(callback: Function) { - this.timer.start(); - - var tsFiles = this.fileHandler.allTS(); - - var it = new Iterator(tsFiles); - - var len = 0; - var maxLen = 76; - - if (it.hasNext()) { - this.run(it, it.next(), len, maxLen, callback); - } - } - } - - ///////////////////////////////// - // The main class to kick things off - ///////////////////////////////// - export class TestRunner { - private fh: FileHandler; - private out: Print; - private sc: SyntaxChecking; - private te: TestEval; - private typings: Typing[] = []; - - private printTypingsWithoutTest() { - var count = 0; - - if (this.typings.length > 0) { - this.out.printDiv(); - - this.out.printTypingsWithoutTestsMessage(); - - this.out.printDiv(); - - for (var i = 0; i < this.typings.length; i++) { - var typing = this.typings[i]; - if (typing.fileHandler.allTests().length == 0) { - if (typing.name != '_infrastructure' - && typing.name != '_ReSharper.DefinitelyTyped' - && typing.name != 'obj' - && typing.name != 'bin' - && typing.name != 'Properties') { - this.out.printTypingsWithoutTest(typing.name); - count++; - } - } - } - } - - return count; - } - - private printErrorsDetected() { - this.out.printErrorsHeader(); - - var printErrorsForFileIfFound = (file: File) => { - if (file.execResult.exitCode) - this.out.printErrorsForFile(file); - }; - - // sc errors: - this.sc.files.forEach(printErrorsForFileIfFound); - this.out.printBoldDiv(); - - // te errors: - this.te.files.forEach(printErrorsForFileIfFound); - this.out.printBoldDiv(); - } - - constructor(public dtPath: string) { - this.fh = new FileHandler(dtPath, /.\.ts/g); - this.out = new Print('0.9.1.1', this.fh.allTypings().length, this.fh.allTS().length); - this.sc = new SyntaxChecking(this.fh, this.out); - this.te = new TestEval(this.fh, this.out); - - var tpgs = this.fh.allTypings(); - for (var i = 0; i < tpgs.length; i++) { - this.typings.push(new Typing(tpgs[i], this.dtPath)); - } - } - - public run() { - var timer = new Timer(); - timer.start(); - - this.out.printHeader(); - - // Run syntax tests - this.out.printSyntaxCheckingHeader(); - this.sc.start((syntaxFailedCount, syntaxTotal) => { - - // Now run typing tests - this.out.printTypingTestsHeader(); - this.te.start((testFailedCount, testTotal) => { - - // Get the tests without any typing and simultaneously print their names - var totalTypingsWithoutTest = this.printTypingsWithoutTest(); - - // End total timer and print final messages - timer.end(); - - this.out.printDiv(); - this.out.printTotalMessage(); - this.out.printDiv(); - - this.out.printElapsedTime(timer.asString, timer.time); - this.out.printSyntaxErrorCount(syntaxFailedCount, syntaxTotal); - this.out.printTestErrorCount(testFailedCount, testTotal); - this.out.printWithoutTestCount(totalTypingsWithoutTest, this.fh.allTypings().length); - - this.out.printDiv(); - - if (syntaxFailedCount > 0 || testFailedCount > 0) { - this.printErrorsDetected(); - process.exit(1); - } - }); - }); - } - } -} - -var dtPath = __dirname + '/../..'; - -var runner = new DefinitelyTyped.TestManager.TestRunner(dtPath); -runner.run();