-
Notifications
You must be signed in to change notification settings - Fork 28
/
Copy pathtokenTests.ts
89 lines (81 loc) · 3.71 KB
/
tokenTests.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
import { assert } from 'chai';
import * as ts from 'typescript';
import { forEachToken, getNextToken, getPreviousToken, forEachTokenWithTrivia } from '../util/util';
import { findTestFiles, getSourceFile, getFirstToken } from './utils';
const testFiles = findTestFiles('test/files/token');
describe('forEachToken', () => {
it('visits every token in the SourceFile', () => {
for (const file of testFiles) {
const sourceFile = getSourceFile(file);
let result = '';
forEachToken(sourceFile, (token) => {
result += sourceFile.text.substring(token.pos, token.end);
});
assert.strictEqual(result, sourceFile.text, file);
}
});
});
describe('forEachTokenWithTrivia', () => {
it('visits every token in the SourceFile once', () => {
for (const file of testFiles) {
const sourceFile = getSourceFile(file);
let result = '';
forEachTokenWithTrivia(sourceFile, (text, _kind, range) => {
result += text.substring(range.pos, range.end);
});
assert.strictEqual(stripBom(result), stripBom(sourceFile.text), file);
}
function stripBom(text: string) {
return text.charCodeAt(0) === 0xFEFF ? text.slice(1) : text;
}
});
});
describe('getNextToken', () => {
it('returns undefined when passed SourceFile or EndOfFileToken', () => {
const sourceFile = ts.createSourceFile('get-next-token.ts', '', ts.ScriptTarget.ESNext, true);
assert.isUndefined(getNextToken(sourceFile));
assert.isUndefined(getNextToken(sourceFile.endOfFileToken));
});
it('returns EndOfFileToken even if there is no trivia before EOF', () => {
const sourceFile = ts.createSourceFile('get-next-token.ts', ';', ts.ScriptTarget.ESNext, true);
const token = getNextToken(getFirstToken(sourceFile));
assert.isDefined(token);
assert.strictEqual(token!.kind, ts.SyntaxKind.EndOfFileToken);
});
it('visits every token when called in a loop', () => {
for (const file of testFiles) {
const sourceFile = getSourceFile(file);
let result = '';
let token: ts.Node | undefined = getFirstToken(sourceFile);
do {
result += sourceFile.text.substring(token.pos, token.end);
token = getNextToken(token, sourceFile);
} while (token !== undefined);
assert.strictEqual(result, sourceFile.text, file);
}
});
});
describe('getPreviousToken', () => {
it('returns undefined if there is nothing before the node', () => {
const sourceFile = ts.createSourceFile('get-previous-token.ts', ';', ts.ScriptTarget.ESNext, true);
assert.isUndefined(getPreviousToken(sourceFile), 'SourceFile');
assert.isUndefined(getPreviousToken(sourceFile.statements[0]), 'Statement');
assert.isUndefined(getPreviousToken(sourceFile.getFirstToken()!), 'Token');
const token = getPreviousToken(sourceFile.endOfFileToken);
assert.isDefined(token);
assert.strictEqual(token!.kind, ts.SyntaxKind.SemicolonToken);
assert.isUndefined(getPreviousToken(token!));
});
it('visits every token when called in a loop', () => {
for (const file of testFiles) {
const sourceFile = getSourceFile(file);
let result = '';
let token: ts.Node | undefined = sourceFile.endOfFileToken;
do {
result = sourceFile.text.substring(token.pos, token.end) + result;
token = getPreviousToken(token, sourceFile);
} while (token !== undefined);
assert.strictEqual(result, sourceFile.text, file);
}
});
});