forked from palantir/tslint
/
codeFrameFormatterTests.ts
136 lines (118 loc) · 5.78 KB
/
codeFrameFormatterTests.ts
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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
/*
* Copyright 2013 Palantir Technologies, Inc.
*
* 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.
*/
import { assert } from "chai";
import chalk from "chalk";
import * as ts from "typescript";
import { IFormatter, TestUtils } from "../lint";
import { createFailure } from "./utils";
describe("CodeFrame Formatter", () => {
const TEST_FILE = "formatters/codeFrameFormatter.test.ts";
let sourceFile: ts.SourceFile;
let formatter: IFormatter;
let colorsEnabled: boolean;
before(() => {
colorsEnabled = chalk.enabled;
const Formatter = TestUtils.getFormatter("codeFrame");
sourceFile = TestUtils.getSourceFile(TEST_FILE);
formatter = new Formatter();
});
after(() => {
chalk.enabled = colorsEnabled;
});
it("formats failures with colors", () => {
chalk.enabled = true;
const maxPosition = sourceFile.getFullWidth();
const failures = [
createFailure(sourceFile, 0, 1, "first failure", "first-name", undefined, "error"),
createFailure(
sourceFile,
2,
3,
"&<>'\" should be escaped",
"escape",
undefined,
"error",
),
createFailure(
sourceFile,
maxPosition - 1,
maxPosition,
"last failure",
"last-name",
undefined,
"error",
),
createFailure(
sourceFile,
0,
maxPosition,
"full failure",
"full-name",
undefined,
"error",
),
createFailure(
sourceFile,
0,
maxPosition,
"warning failure",
"warning-name",
undefined,
"warning",
),
];
const expectedResultColored = `formatters/codeFrameFormatter.test.ts
\u001b[31mfirst failure\u001b[39m \u001b[90m(first-name)\u001b[39m
\u001b[0m\u001b[31m\u001b[1m>\u001b[22m\u001b[39m\u001b[90m 1 | \u001b[39mmodule \u001b[33mCodeFrameModule\u001b[39m {\u001b[0m
\u001b[0m \u001b[90m 2 | \u001b[39m \u001b[36mexport\u001b[39m \u001b[36mclass\u001b[39m \u001b[33mCodeFrameClass\u001b[39m {\u001b[0m
\u001b[0m \u001b[90m 3 | \u001b[39m private name\u001b[33m:\u001b[39m string\u001b[33m;\u001b[39m\u001b[0m
\u001b[0m \u001b[90m 4 | \u001b[39m\u001b[0m
\u001b[31mfull failure\u001b[39m \u001b[90m(full-name)\u001b[39m
\u001b[0m\u001b[31m\u001b[1m>\u001b[22m\u001b[39m\u001b[90m 1 | \u001b[39mmodule \u001b[33mCodeFrameModule\u001b[39m {\u001b[0m
\u001b[0m \u001b[90m 2 | \u001b[39m \u001b[36mexport\u001b[39m \u001b[36mclass\u001b[39m \u001b[33mCodeFrameClass\u001b[39m {\u001b[0m
\u001b[0m \u001b[90m 3 | \u001b[39m private name\u001b[33m:\u001b[39m string\u001b[33m;\u001b[39m\u001b[0m
\u001b[0m \u001b[90m 4 | \u001b[39m\u001b[0m
\u001b[33mwarning failure\u001b[39m \u001b[90m(warning-name)\u001b[39m
\u001b[0m\u001b[31m\u001b[1m>\u001b[22m\u001b[39m\u001b[90m 1 | \u001b[39mmodule \u001b[33mCodeFrameModule\u001b[39m {\u001b[0m
\u001b[0m \u001b[90m 2 | \u001b[39m \u001b[36mexport\u001b[39m \u001b[36mclass\u001b[39m \u001b[33mCodeFrameClass\u001b[39m {\u001b[0m
\u001b[0m \u001b[90m 3 | \u001b[39m private name\u001b[33m:\u001b[39m string\u001b[33m;\u001b[39m\u001b[0m
\u001b[0m \u001b[90m 4 | \u001b[39m\u001b[0m
\u001b[31m&<>\'" should be escaped\u001b[39m \u001b[90m(escape)\u001b[39m
\u001b[0m\u001b[31m\u001b[1m>\u001b[22m\u001b[39m\u001b[90m 1 | \u001b[39mmodule \u001b[33mCodeFrameModule\u001b[39m {\u001b[0m
\u001b[0m \u001b[90m | \u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[39m\u001b[0m
\u001b[0m \u001b[90m 2 | \u001b[39m \u001b[36mexport\u001b[39m \u001b[36mclass\u001b[39m \u001b[33mCodeFrameClass\u001b[39m {\u001b[0m
\u001b[0m \u001b[90m 3 | \u001b[39m private name\u001b[33m:\u001b[39m string\u001b[33m;\u001b[39m\u001b[0m
\u001b[0m \u001b[90m 4 | \u001b[39m\u001b[0m
\u001b[31mlast failure\u001b[39m \u001b[90m(last-name)\u001b[39m
\u001b[0m \u001b[90m 7 | \u001b[39m }\u001b[0m
\u001b[0m \u001b[90m 8 | \u001b[39m }\u001b[0m
\u001b[0m\u001b[31m\u001b[1m>\u001b[22m\u001b[39m\u001b[90m 9 | \u001b[39m}\u001b[0m
\u001b[0m \u001b[90m | \u001b[39m\u001b[31m\u001b[1m^\u001b[22m\u001b[39m\u001b[0m
\u001b[0m \u001b[90m 10 | \u001b[39m\u001b[0m
`;
/** Convert output lines to an array of trimmed lines for easier comparing */
function toTrimmedLines(lines: string): string[] {
return lines.split("\n").map(line => line.trim());
}
const expectedResult = toTrimmedLines(expectedResultColored);
const result = toTrimmedLines(formatter.format(failures));
assert.deepEqual(result, expectedResult);
});
it("handles no failures", () => {
const result = formatter.format([]);
assert.equal(result, "\n");
});
});