]> git.proxmox.com Git - pve-eslint.git/blob - eslint/tests/lib/rules/utils/fix-tracker.js
import 8.23.1 source
[pve-eslint.git] / eslint / tests / lib / rules / utils / fix-tracker.js
1 /**
2 * @fileoverview Tests for FixTracker.
3 * @author Alan Pierce
4 */
5 "use strict";
6
7 //------------------------------------------------------------------------------
8 // Requirements
9 //------------------------------------------------------------------------------
10
11 const assert = require("chai").assert,
12 espree = require("espree"),
13 FixTracker = require("../../../../lib/rules/utils/fix-tracker"),
14 ruleFixer = require("../../../../lib/linter/rule-fixer"),
15 { SourceCode } = require("../../../../lib/source-code"),
16 Traverser = require("../../../../lib/shared/traverser");
17
18 //------------------------------------------------------------------------------
19 // Helpers
20 //------------------------------------------------------------------------------
21
22 const DEFAULT_CONFIG = {
23 ecmaVersion: 6,
24 comment: true,
25 tokens: true,
26 range: true,
27 loc: true
28 };
29
30 /**
31 * Create a SourceCode instance from the given code. Also add parent pointers in
32 * the AST so that parent traversals will work.
33 * @param {string} text The text of the code.
34 * @returns {SourceCode} The SourceCode.
35 */
36 function createSourceCode(text) {
37 const ast = espree.parse(text, DEFAULT_CONFIG);
38
39 Traverser.traverse(ast, {
40 enter(node, parent) {
41 node.parent = parent;
42 }
43 });
44
45 return new SourceCode(text, ast);
46 }
47
48 //------------------------------------------------------------------------------
49 // Tests
50 //------------------------------------------------------------------------------
51
52 describe("FixTracker", () => {
53 describe("replaceTextRange", () => {
54 it("should expand to include an explicitly retained range", () => {
55 const sourceCode = createSourceCode("var foo = +bar;");
56 const result = new FixTracker(ruleFixer, sourceCode)
57 .retainRange([4, 14])
58 .replaceTextRange([10, 11], "-");
59
60 assert.deepStrictEqual(result, {
61 range: [4, 14],
62 text: "foo = -bar"
63 });
64 });
65
66 it("ignores a retained range that's smaller than the replaced range", () => {
67 const sourceCode = createSourceCode("abcdefghij");
68 const result = new FixTracker(ruleFixer, sourceCode)
69 .retainRange([5, 7])
70 .replaceTextRange([4, 8], "123");
71
72 assert.deepStrictEqual(result, {
73 range: [4, 8],
74 text: "123"
75 });
76 });
77
78 it("allows an unspecified retained range", () => {
79 const sourceCode = createSourceCode("abcdefghij");
80 const result = new FixTracker(ruleFixer, sourceCode)
81 .replaceTextRange([4, 8], "123");
82
83 assert.deepStrictEqual(result, {
84 range: [4, 8],
85 text: "123"
86 });
87 });
88 });
89
90 describe("remove", () => {
91 it("should expand to include an explicitly retained range", () => {
92 const sourceCode = createSourceCode("a = b + +c");
93 const result = new FixTracker(ruleFixer, sourceCode)
94 .retainRange([4, 10])
95 .remove(sourceCode.ast.tokens[4]);
96
97 assert.deepStrictEqual(result, {
98 range: [4, 10],
99 text: "b + c"
100 });
101 });
102 });
103
104 describe("retainEnclosingFunction", () => {
105 it("handles a normal enclosing function", () => {
106 const sourceCode = createSourceCode("f = function() { return x; }");
107 const xNode = sourceCode.ast.body[0].expression.right.body.body[0].argument;
108 const result = new FixTracker(ruleFixer, sourceCode)
109 .retainEnclosingFunction(xNode)
110 .replaceTextRange(xNode.range, "y");
111
112 assert.deepStrictEqual(result, {
113 range: [4, 28],
114 text: "function() { return y; }"
115 });
116 });
117
118 it("handles the case when there is no enclosing function", () => {
119 const sourceCode = createSourceCode("const a = b;");
120 const bNode = sourceCode.ast.body[0].declarations[0].init;
121 const result = new FixTracker(ruleFixer, sourceCode)
122 .retainEnclosingFunction(bNode)
123 .replaceTextRange(bNode.range, "c");
124
125 assert.deepStrictEqual(result, {
126 range: [0, 12],
127 text: "const a = c;"
128 });
129 });
130 });
131
132 describe("retainSurroundingTokens", () => {
133 it("handles a change to a binary operator", () => {
134 const sourceCode = createSourceCode("const i = j + k;");
135 const plusToken = sourceCode.ast.tokens[4];
136 const result = new FixTracker(ruleFixer, sourceCode)
137 .retainSurroundingTokens(plusToken)
138 .replaceTextRange(plusToken.range, "*");
139
140 assert.deepStrictEqual(result, {
141 range: [10, 15],
142 text: "j * k"
143 });
144 });
145 });
146 });