-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathrunner.js
105 lines (95 loc) · 3.86 KB
/
runner.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
"use strict";
var fs = require("fs");
var glob = require("glob");
var path = require("path");
var probsTyped = require("../index");
var defsDir = path.join(__dirname, "/defs");
var BOLD_ON = "\x1b[1m";
var BOLD_OFF = "\x1b[22m";
var RED = "\x1b[41m";
var FG_RED = "\x1b[31m";
var FG_GREEN = "\x1b[32m";
var RESET = "\x1b[0m";
var OKAY = BOLD_ON + FG_GREEN + " OK" + RESET + " ";
var FAIL = BOLD_ON + FG_RED + "FAIL" + RESET + " ";
glob(defsDir + "/*.d.ts", function(err, files) {
if (err) {
console.error(err);
process.exit(1);
return;
}
var exitCode = 0;
var numFails = 0;
files.forEach(function(f) {
f = path.resolve(f); // convert \ to / so we can replace with out dir
var outFile = f.replace(".d.ts", ".js.flow");
var expectedOutput = fs.readFileSync(outFile, "utf8");
var actualOutput = new String(probsTyped(fs.readFileSync(f, "utf8")));
// console.log("EXPECT: " + expectedOutput);
// console.log("ACTUAL: " + actualOutput);
var actualOutLines = actualOutput.split("\n");
var expectedOutLines = expectedOutput.split("\n");
// strictly filter out lines that start "//" on both input and output - we don't care about comments!
actualOutLines = actualOutLines.filter(function(line) {
return line.trim().indexOf("//") !== 0;
});
expectedOutLines = expectedOutLines.filter(function(line) {
return line.trim().indexOf("//") !== 0;
});
if (actualOutLines.length === expectedOutLines.length) {
var isOkay = true;
for (var lineNum = 0; lineNum < actualOutLines.length; lineNum++) {
if (actualOutLines[lineNum] === expectedOutLines[lineNum]) {
continue;
}
isOkay = false;
var lineLength = Math.max(actualOutLines[lineNum].length, expectedOutLines[lineNum].length);
for (var charNum = 0; charNum < lineLength; charNum++) {
if (actualOutLines[lineNum][charNum] === expectedOutLines[lineNum][charNum]) {
continue;
}
var badChar = escape(actualOutLines[lineNum][charNum]);
var actualSnippet = snippet(actualOutLines[lineNum], charNum);
var expectedSnippet = snippet(expectedOutLines[lineNum], charNum);
console.error(
"%s%s:%s:%s %s", FAIL, outFile, lineNum + 1, charNum + 1,
"Unexpected char: '" + badChar + "'. " +
"Got \"" + actualSnippet + "\", expected \"" + expectedSnippet + "\"."
);
numFails += 1;
break;
}
}
if (isOkay) {
console.log("%s%s", OKAY, outFile);
}
}
else {
console.error(
"%s%s:%s %s", FAIL, outFile, 0,
"Expected " + expectedOutLines.length + " lines, got " + actualOutLines.length
);
numFails += 1;
}
});
console.log("%s test failures out of %s tests.", numFails, files.length);
process.exit(numFails > 0 ? 1 : 0);
});
function snippet(line, charNum) {
var leftMinSnip = Math.max(charNum - 15, 0);
var leftMaxSnip = Math.max(charNum, 0);
var rightMinSnip = Math.min(charNum + 1, line.length);
var rightMaxSnip = Math.min(charNum + 15, line.length);
return (
escape(line.substring(leftMinSnip, leftMaxSnip)) +
RED + escape(line[charNum]) + RESET +
escape(line.substring(rightMinSnip, rightMaxSnip))
);
}
function escape(thing) {
if (thing === undefined) {
return "<missing>";
}
var escapedThing = JSON.stringify(thing);
return escapedThing.substring(1, escapedThing.length-1);
}