|
5 | 5 | import * as assert from 'assert'; |
6 | 6 | import { TextRangeCollection } from '../../client/language/textRangeCollection'; |
7 | 7 | import { Tokenizer } from '../../client/language/tokenizer'; |
8 | | -import { TokenType } from '../../client/language/types'; |
| 8 | +import { TokenizerMode, TokenType } from '../../client/language/types'; |
9 | 9 |
|
10 | 10 | // tslint:disable-next-line:max-func-body-length |
11 | 11 | suite('Language.Tokenizer', () => { |
@@ -380,4 +380,78 @@ suite('Language.Tokenizer', () => { |
380 | 380 | assert.equal(t.length, lengths[i], `Length ${t.length} at ${i} (text ${text.substr(t.start, t.length)}), expected ${lengths[i]}`); |
381 | 381 | } |
382 | 382 | }); |
| 383 | + |
| 384 | + [-1, 10].forEach(start => { |
| 385 | + test(`Exceptions: out-of-range start = ${start}`, () => { |
| 386 | + assert.throws(() => { |
| 387 | + new Tokenizer().tokenize('', start, 0, TokenizerMode.Full); |
| 388 | + }, new Error('Invalid range start')); |
| 389 | + }); |
| 390 | + }); |
| 391 | + [-1, 10].forEach(length => { |
| 392 | + test(`Exceptions: out-of-range length = ${length}`, () => { |
| 393 | + assert.throws(() => { |
| 394 | + new Tokenizer().tokenize('abc', 1, length, TokenizerMode.Full); |
| 395 | + }, new Error('Invalid range length')); |
| 396 | + }); |
| 397 | + }); |
| 398 | + [ |
| 399 | + ['(', TokenType.OpenBrace], |
| 400 | + [')', TokenType.CloseBrace], |
| 401 | + ['[', TokenType.OpenBracket], |
| 402 | + [']', TokenType.CloseBracket], |
| 403 | + ['{', TokenType.OpenCurly], |
| 404 | + ['}', TokenType.CloseCurly], |
| 405 | + [',', TokenType.Comma], |
| 406 | + [':', TokenType.Colon], |
| 407 | + [';', TokenType.Semicolon], |
| 408 | + ['.', TokenType.Operator] |
| 409 | + ].forEach(pair => { |
| 410 | + const text: string = pair[0] as string; |
| 411 | + const expected = pair[1]; |
| 412 | + test(`Character tokens: ${text}`, () => { |
| 413 | + const tokens = new Tokenizer().tokenize(text); |
| 414 | + assert.equal(tokens.getItemAt(0).type, expected); |
| 415 | + }); |
| 416 | + }); |
| 417 | + [ |
| 418 | + ['1', TokenType.Number], |
| 419 | + ['-1', TokenType.Number], |
| 420 | + ['+1', TokenType.Number], |
| 421 | + ['.1', TokenType.Number], |
| 422 | + ['-.1', TokenType.Number], |
| 423 | + ['+.1', TokenType.Number], |
| 424 | + ['1_1', TokenType.Number], |
| 425 | + ['_1', TokenType.Identifier], |
| 426 | + ['-0x1', TokenType.Number], |
| 427 | + ['-0X1', TokenType.Number], |
| 428 | + ['-0b1', TokenType.Number], |
| 429 | + ['-0B1', TokenType.Number], |
| 430 | + ['-0o1', TokenType.Number], |
| 431 | + ['-0O1', TokenType.Number] |
| 432 | + ].forEach(pair => { |
| 433 | + const text: string = pair[0] as string; |
| 434 | + const expected = pair[1]; |
| 435 | + test(`Possible numbers: ${text}`, () => { |
| 436 | + const tokens = new Tokenizer().tokenize(text); |
| 437 | + const token = tokens.getItemAt(0); |
| 438 | + assert.equal(token.type, expected); |
| 439 | + }); |
| 440 | + }); |
| 441 | + [ |
| 442 | + ['(-1', TokenType.Number], |
| 443 | + ['[+1', TokenType.Number], |
| 444 | + [',-1', TokenType.Number], |
| 445 | + [':+1', TokenType.Number], |
| 446 | + [';+1', TokenType.Number], |
| 447 | + ['=+1', TokenType.Number] |
| 448 | + ].forEach(pair => { |
| 449 | + const text: string = pair[0] as string; |
| 450 | + const expected = pair[1]; |
| 451 | + test(`Numbers after braces or operators: ${text}`, () => { |
| 452 | + const tokens = new Tokenizer().tokenize(text); |
| 453 | + const token = tokens.getItemAt(1); |
| 454 | + assert.equal(token.type, expected); |
| 455 | + }); |
| 456 | + }); |
383 | 457 | }); |
0 commit comments