| OLD | NEW |
| 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 // This code was auto-generated, is not intended to be edited, and is subject to | 5 // This code was auto-generated, is not intended to be edited, and is subject to |
| 6 // significant change. Please see the README file for more information. | 6 // significant change. Please see the README file for more information. |
| 7 | 7 |
| 8 library engine.scanner_test; | 8 library engine.scanner_test; |
| 9 | 9 |
| 10 import 'package:analyzer/src/generated/java_core.dart'; | 10 import 'package:analyzer/src/generated/java_core.dart'; |
| (...skipping 231 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 242 * of a stream of tokens. | 242 * of a stream of tokens. |
| 243 */ | 243 */ |
| 244 class TokenStreamValidator { | 244 class TokenStreamValidator { |
| 245 /** | 245 /** |
| 246 * Validate that the stream of tokens that starts with the given token is corr
ect. | 246 * Validate that the stream of tokens that starts with the given token is corr
ect. |
| 247 * | 247 * |
| 248 * @param token the first token in the stream of tokens to be validated | 248 * @param token the first token in the stream of tokens to be validated |
| 249 */ | 249 */ |
| 250 void validate(Token token) { | 250 void validate(Token token) { |
| 251 JavaStringBuilder builder = new JavaStringBuilder(); | 251 JavaStringBuilder builder = new JavaStringBuilder(); |
| 252 validateStream(builder, token); | 252 _validateStream(builder, token); |
| 253 if (builder.length > 0) { | 253 if (builder.length > 0) { |
| 254 JUnitTestCase.fail(builder.toString()); | 254 JUnitTestCase.fail(builder.toString()); |
| 255 } | 255 } |
| 256 } | 256 } |
| 257 | 257 |
| 258 void validateStream(JavaStringBuilder builder, Token token) { | 258 void _validateStream(JavaStringBuilder builder, Token token) { |
| 259 if (token == null) { | 259 if (token == null) { |
| 260 return; | 260 return; |
| 261 } | 261 } |
| 262 Token previousToken = null; | 262 Token previousToken = null; |
| 263 int previousEnd = -1; | 263 int previousEnd = -1; |
| 264 Token currentToken = token; | 264 Token currentToken = token; |
| 265 while (currentToken != null && currentToken.type != TokenType.EOF) { | 265 while (currentToken != null && currentToken.type != TokenType.EOF) { |
| 266 validateStream(builder, currentToken.precedingComments); | 266 _validateStream(builder, currentToken.precedingComments); |
| 267 TokenType type = currentToken.type; | 267 TokenType type = currentToken.type; |
| 268 if (identical(type, TokenType.OPEN_CURLY_BRACKET) || identical(type, Token
Type.OPEN_PAREN) || identical(type, TokenType.OPEN_SQUARE_BRACKET) || identical(
type, TokenType.STRING_INTERPOLATION_EXPRESSION)) { | 268 if (identical(type, TokenType.OPEN_CURLY_BRACKET) || identical(type, Token
Type.OPEN_PAREN) || identical(type, TokenType.OPEN_SQUARE_BRACKET) || identical(
type, TokenType.STRING_INTERPOLATION_EXPRESSION)) { |
| 269 if (currentToken is! BeginToken) { | 269 if (currentToken is! BeginToken) { |
| 270 builder.append("\r\nExpected BeginToken, found "); | 270 builder.append("\r\nExpected BeginToken, found "); |
| 271 builder.append(currentToken.runtimeType.toString()); | 271 builder.append(currentToken.runtimeType.toString()); |
| 272 builder.append(" "); | 272 builder.append(" "); |
| 273 writeToken(builder, currentToken); | 273 _writeToken(builder, currentToken); |
| 274 } | 274 } |
| 275 } | 275 } |
| 276 int currentStart = currentToken.offset; | 276 int currentStart = currentToken.offset; |
| 277 int currentLength = currentToken.length; | 277 int currentLength = currentToken.length; |
| 278 int currentEnd = currentStart + currentLength - 1; | 278 int currentEnd = currentStart + currentLength - 1; |
| 279 if (currentStart <= previousEnd) { | 279 if (currentStart <= previousEnd) { |
| 280 builder.append("\r\nInvalid token sequence: "); | 280 builder.append("\r\nInvalid token sequence: "); |
| 281 writeToken(builder, previousToken); | 281 _writeToken(builder, previousToken); |
| 282 builder.append(" followed by "); | 282 builder.append(" followed by "); |
| 283 writeToken(builder, currentToken); | 283 _writeToken(builder, currentToken); |
| 284 } | 284 } |
| 285 previousEnd = currentEnd; | 285 previousEnd = currentEnd; |
| 286 previousToken = currentToken; | 286 previousToken = currentToken; |
| 287 currentToken = currentToken.next; | 287 currentToken = currentToken.next; |
| 288 } | 288 } |
| 289 } | 289 } |
| 290 | 290 |
| 291 void writeToken(JavaStringBuilder builder, Token token) { | 291 void _writeToken(JavaStringBuilder builder, Token token) { |
| 292 builder.append("["); | 292 builder.append("["); |
| 293 builder.append(token.type); | 293 builder.append(token.type); |
| 294 builder.append(", '"); | 294 builder.append(", '"); |
| 295 builder.append(token.lexeme); | 295 builder.append(token.lexeme); |
| 296 builder.append("', "); | 296 builder.append("', "); |
| 297 builder.append(token.offset); | 297 builder.append(token.offset); |
| 298 builder.append(", "); | 298 builder.append(", "); |
| 299 builder.append(token.length); | 299 builder.append(token.length); |
| 300 builder.append("]"); | 300 builder.append("]"); |
| 301 } | 301 } |
| 302 } | 302 } |
| 303 | 303 |
| 304 class ScannerTest extends JUnitTestCase { | 304 class ScannerTest extends JUnitTestCase { |
| 305 void test_ampersand() { | 305 void test_ampersand() { |
| 306 assertToken(TokenType.AMPERSAND, "&"); | 306 _assertToken(TokenType.AMPERSAND, "&"); |
| 307 } | 307 } |
| 308 | 308 |
| 309 void test_ampersand_ampersand() { | 309 void test_ampersand_ampersand() { |
| 310 assertToken(TokenType.AMPERSAND_AMPERSAND, "&&"); | 310 _assertToken(TokenType.AMPERSAND_AMPERSAND, "&&"); |
| 311 } | 311 } |
| 312 | 312 |
| 313 void test_ampersand_eq() { | 313 void test_ampersand_eq() { |
| 314 assertToken(TokenType.AMPERSAND_EQ, "&="); | 314 _assertToken(TokenType.AMPERSAND_EQ, "&="); |
| 315 } | 315 } |
| 316 | 316 |
| 317 void test_at() { | 317 void test_at() { |
| 318 assertToken(TokenType.AT, "@"); | 318 _assertToken(TokenType.AT, "@"); |
| 319 } | 319 } |
| 320 | 320 |
| 321 void test_backping() { | 321 void test_backping() { |
| 322 assertToken(TokenType.BACKPING, "`"); | 322 _assertToken(TokenType.BACKPING, "`"); |
| 323 } | 323 } |
| 324 | 324 |
| 325 void test_backslash() { | 325 void test_backslash() { |
| 326 assertToken(TokenType.BACKSLASH, "\\"); | 326 _assertToken(TokenType.BACKSLASH, "\\"); |
| 327 } | 327 } |
| 328 | 328 |
| 329 void test_bang() { | 329 void test_bang() { |
| 330 assertToken(TokenType.BANG, "!"); | 330 _assertToken(TokenType.BANG, "!"); |
| 331 } | 331 } |
| 332 | 332 |
| 333 void test_bang_eq() { | 333 void test_bang_eq() { |
| 334 assertToken(TokenType.BANG_EQ, "!="); | 334 _assertToken(TokenType.BANG_EQ, "!="); |
| 335 } | 335 } |
| 336 | 336 |
| 337 void test_bar() { | 337 void test_bar() { |
| 338 assertToken(TokenType.BAR, "|"); | 338 _assertToken(TokenType.BAR, "|"); |
| 339 } | 339 } |
| 340 | 340 |
| 341 void test_bar_bar() { | 341 void test_bar_bar() { |
| 342 assertToken(TokenType.BAR_BAR, "||"); | 342 _assertToken(TokenType.BAR_BAR, "||"); |
| 343 } | 343 } |
| 344 | 344 |
| 345 void test_bar_eq() { | 345 void test_bar_eq() { |
| 346 assertToken(TokenType.BAR_EQ, "|="); | 346 _assertToken(TokenType.BAR_EQ, "|="); |
| 347 } | 347 } |
| 348 | 348 |
| 349 void test_caret() { | 349 void test_caret() { |
| 350 assertToken(TokenType.CARET, "^"); | 350 _assertToken(TokenType.CARET, "^"); |
| 351 } | 351 } |
| 352 | 352 |
| 353 void test_caret_eq() { | 353 void test_caret_eq() { |
| 354 assertToken(TokenType.CARET_EQ, "^="); | 354 _assertToken(TokenType.CARET_EQ, "^="); |
| 355 } | 355 } |
| 356 | 356 |
| 357 void test_close_curly_bracket() { | 357 void test_close_curly_bracket() { |
| 358 assertToken(TokenType.CLOSE_CURLY_BRACKET, "}"); | 358 _assertToken(TokenType.CLOSE_CURLY_BRACKET, "}"); |
| 359 } | 359 } |
| 360 | 360 |
| 361 void test_close_paren() { | 361 void test_close_paren() { |
| 362 assertToken(TokenType.CLOSE_PAREN, ")"); | 362 _assertToken(TokenType.CLOSE_PAREN, ")"); |
| 363 } | 363 } |
| 364 | 364 |
| 365 void test_close_quare_bracket() { | 365 void test_close_quare_bracket() { |
| 366 assertToken(TokenType.CLOSE_SQUARE_BRACKET, "]"); | 366 _assertToken(TokenType.CLOSE_SQUARE_BRACKET, "]"); |
| 367 } | 367 } |
| 368 | 368 |
| 369 void test_colon() { | 369 void test_colon() { |
| 370 assertToken(TokenType.COLON, ":"); | 370 _assertToken(TokenType.COLON, ":"); |
| 371 } | 371 } |
| 372 | 372 |
| 373 void test_comma() { | 373 void test_comma() { |
| 374 assertToken(TokenType.COMMA, ","); | 374 _assertToken(TokenType.COMMA, ","); |
| 375 } | 375 } |
| 376 | 376 |
| 377 void test_comment_disabled_multi() { | 377 void test_comment_disabled_multi() { |
| 378 Scanner scanner = new Scanner(null, new CharSequenceReader("/* comment */ ")
, AnalysisErrorListener.NULL_LISTENER); | 378 Scanner scanner = new Scanner(null, new CharSequenceReader("/* comment */ ")
, AnalysisErrorListener.NULL_LISTENER); |
| 379 scanner.preserveComments = false; | 379 scanner.preserveComments = false; |
| 380 Token token = scanner.tokenize(); | 380 Token token = scanner.tokenize(); |
| 381 JUnitTestCase.assertNotNull(token); | 381 JUnitTestCase.assertNotNull(token); |
| 382 JUnitTestCase.assertNull(token.precedingComments); | 382 JUnitTestCase.assertNull(token.precedingComments); |
| 383 } | 383 } |
| 384 | 384 |
| 385 void test_comment_multi() { | 385 void test_comment_multi() { |
| 386 assertComment(TokenType.MULTI_LINE_COMMENT, "/* comment */"); | 386 _assertComment(TokenType.MULTI_LINE_COMMENT, "/* comment */"); |
| 387 } | 387 } |
| 388 | 388 |
| 389 void test_comment_multi_unterminated() { | 389 void test_comment_multi_unterminated() { |
| 390 assertError(ScannerErrorCode.UNTERMINATED_MULTI_LINE_COMMENT, 3, "/* x"); | 390 _assertError(ScannerErrorCode.UNTERMINATED_MULTI_LINE_COMMENT, 3, "/* x"); |
| 391 } | 391 } |
| 392 | 392 |
| 393 void test_comment_nested() { | 393 void test_comment_nested() { |
| 394 assertComment(TokenType.MULTI_LINE_COMMENT, "/* comment /* within a */ comme
nt */"); | 394 _assertComment(TokenType.MULTI_LINE_COMMENT, "/* comment /* within a */ comm
ent */"); |
| 395 } | 395 } |
| 396 | 396 |
| 397 void test_comment_single() { | 397 void test_comment_single() { |
| 398 assertComment(TokenType.SINGLE_LINE_COMMENT, "// comment"); | 398 _assertComment(TokenType.SINGLE_LINE_COMMENT, "// comment"); |
| 399 } | 399 } |
| 400 | 400 |
| 401 void test_double_both_e() { | 401 void test_double_both_e() { |
| 402 assertToken(TokenType.DOUBLE, "0.123e4"); | 402 _assertToken(TokenType.DOUBLE, "0.123e4"); |
| 403 } | 403 } |
| 404 | 404 |
| 405 void test_double_both_E() { | 405 void test_double_both_E() { |
| 406 assertToken(TokenType.DOUBLE, "0.123E4"); | 406 _assertToken(TokenType.DOUBLE, "0.123E4"); |
| 407 } | 407 } |
| 408 | 408 |
| 409 void test_double_fraction() { | 409 void test_double_fraction() { |
| 410 assertToken(TokenType.DOUBLE, ".123"); | 410 _assertToken(TokenType.DOUBLE, ".123"); |
| 411 } | 411 } |
| 412 | 412 |
| 413 void test_double_fraction_e() { | 413 void test_double_fraction_e() { |
| 414 assertToken(TokenType.DOUBLE, ".123e4"); | 414 _assertToken(TokenType.DOUBLE, ".123e4"); |
| 415 } | 415 } |
| 416 | 416 |
| 417 void test_double_fraction_E() { | 417 void test_double_fraction_E() { |
| 418 assertToken(TokenType.DOUBLE, ".123E4"); | 418 _assertToken(TokenType.DOUBLE, ".123E4"); |
| 419 } | 419 } |
| 420 | 420 |
| 421 void test_double_missingDigitInExponent() { | 421 void test_double_missingDigitInExponent() { |
| 422 assertError(ScannerErrorCode.MISSING_DIGIT, 1, "1e"); | 422 _assertError(ScannerErrorCode.MISSING_DIGIT, 1, "1e"); |
| 423 } | 423 } |
| 424 | 424 |
| 425 void test_double_whole_e() { | 425 void test_double_whole_e() { |
| 426 assertToken(TokenType.DOUBLE, "12e4"); | 426 _assertToken(TokenType.DOUBLE, "12e4"); |
| 427 } | 427 } |
| 428 | 428 |
| 429 void test_double_whole_E() { | 429 void test_double_whole_E() { |
| 430 assertToken(TokenType.DOUBLE, "12E4"); | 430 _assertToken(TokenType.DOUBLE, "12E4"); |
| 431 } | 431 } |
| 432 | 432 |
| 433 void test_eq() { | 433 void test_eq() { |
| 434 assertToken(TokenType.EQ, "="); | 434 _assertToken(TokenType.EQ, "="); |
| 435 } | 435 } |
| 436 | 436 |
| 437 void test_eq_eq() { | 437 void test_eq_eq() { |
| 438 assertToken(TokenType.EQ_EQ, "=="); | 438 _assertToken(TokenType.EQ_EQ, "=="); |
| 439 } | 439 } |
| 440 | 440 |
| 441 void test_gt() { | 441 void test_gt() { |
| 442 assertToken(TokenType.GT, ">"); | 442 _assertToken(TokenType.GT, ">"); |
| 443 } | 443 } |
| 444 | 444 |
| 445 void test_gt_eq() { | 445 void test_gt_eq() { |
| 446 assertToken(TokenType.GT_EQ, ">="); | 446 _assertToken(TokenType.GT_EQ, ">="); |
| 447 } | 447 } |
| 448 | 448 |
| 449 void test_gt_gt() { | 449 void test_gt_gt() { |
| 450 assertToken(TokenType.GT_GT, ">>"); | 450 _assertToken(TokenType.GT_GT, ">>"); |
| 451 } | 451 } |
| 452 | 452 |
| 453 void test_gt_gt_eq() { | 453 void test_gt_gt_eq() { |
| 454 assertToken(TokenType.GT_GT_EQ, ">>="); | 454 _assertToken(TokenType.GT_GT_EQ, ">>="); |
| 455 } | 455 } |
| 456 | 456 |
| 457 void test_hash() { | 457 void test_hash() { |
| 458 assertToken(TokenType.HASH, "#"); | 458 _assertToken(TokenType.HASH, "#"); |
| 459 } | 459 } |
| 460 | 460 |
| 461 void test_hexidecimal() { | 461 void test_hexidecimal() { |
| 462 assertToken(TokenType.HEXADECIMAL, "0x1A2B3C"); | 462 _assertToken(TokenType.HEXADECIMAL, "0x1A2B3C"); |
| 463 } | 463 } |
| 464 | 464 |
| 465 void test_hexidecimal_missingDigit() { | 465 void test_hexidecimal_missingDigit() { |
| 466 assertError(ScannerErrorCode.MISSING_HEX_DIGIT, 1, "0x"); | 466 _assertError(ScannerErrorCode.MISSING_HEX_DIGIT, 1, "0x"); |
| 467 } | 467 } |
| 468 | 468 |
| 469 void test_identifier() { | 469 void test_identifier() { |
| 470 assertToken(TokenType.IDENTIFIER, "result"); | 470 _assertToken(TokenType.IDENTIFIER, "result"); |
| 471 } | 471 } |
| 472 | 472 |
| 473 void test_illegalChar_cyrillicLetter_middle() { | 473 void test_illegalChar_cyrillicLetter_middle() { |
| 474 assertError(ScannerErrorCode.ILLEGAL_CHARACTER, 0, "Shche\u0433lov"); | 474 _assertError(ScannerErrorCode.ILLEGAL_CHARACTER, 0, "Shche\u0433lov"); |
| 475 } | 475 } |
| 476 | 476 |
| 477 void test_illegalChar_cyrillicLetter_start() { | 477 void test_illegalChar_cyrillicLetter_start() { |
| 478 assertError(ScannerErrorCode.ILLEGAL_CHARACTER, 0, "\u0429"); | 478 _assertError(ScannerErrorCode.ILLEGAL_CHARACTER, 0, "\u0429"); |
| 479 } | 479 } |
| 480 | 480 |
| 481 void test_illegalChar_nbsp() { | 481 void test_illegalChar_nbsp() { |
| 482 assertError(ScannerErrorCode.ILLEGAL_CHARACTER, 0, "\u00A0"); | 482 _assertError(ScannerErrorCode.ILLEGAL_CHARACTER, 0, "\u00A0"); |
| 483 } | 483 } |
| 484 | 484 |
| 485 void test_illegalChar_notLetter() { | 485 void test_illegalChar_notLetter() { |
| 486 assertError(ScannerErrorCode.ILLEGAL_CHARACTER, 0, "\u0312"); | 486 _assertError(ScannerErrorCode.ILLEGAL_CHARACTER, 0, "\u0312"); |
| 487 } | 487 } |
| 488 | 488 |
| 489 void test_index() { | 489 void test_index() { |
| 490 assertToken(TokenType.INDEX, "[]"); | 490 _assertToken(TokenType.INDEX, "[]"); |
| 491 } | 491 } |
| 492 | 492 |
| 493 void test_index_eq() { | 493 void test_index_eq() { |
| 494 assertToken(TokenType.INDEX_EQ, "[]="); | 494 _assertToken(TokenType.INDEX_EQ, "[]="); |
| 495 } | 495 } |
| 496 | 496 |
| 497 void test_int() { | 497 void test_int() { |
| 498 assertToken(TokenType.INT, "123"); | 498 _assertToken(TokenType.INT, "123"); |
| 499 } | 499 } |
| 500 | 500 |
| 501 void test_int_initialZero() { | 501 void test_int_initialZero() { |
| 502 assertToken(TokenType.INT, "0123"); | 502 _assertToken(TokenType.INT, "0123"); |
| 503 } | 503 } |
| 504 | 504 |
| 505 void test_keyword_abstract() { | 505 void test_keyword_abstract() { |
| 506 assertKeywordToken("abstract"); | 506 _assertKeywordToken("abstract"); |
| 507 } | 507 } |
| 508 | 508 |
| 509 void test_keyword_as() { | 509 void test_keyword_as() { |
| 510 assertKeywordToken("as"); | 510 _assertKeywordToken("as"); |
| 511 } | 511 } |
| 512 | 512 |
| 513 void test_keyword_assert() { | 513 void test_keyword_assert() { |
| 514 assertKeywordToken("assert"); | 514 _assertKeywordToken("assert"); |
| 515 } | 515 } |
| 516 | 516 |
| 517 void test_keyword_break() { | 517 void test_keyword_break() { |
| 518 assertKeywordToken("break"); | 518 _assertKeywordToken("break"); |
| 519 } | 519 } |
| 520 | 520 |
| 521 void test_keyword_case() { | 521 void test_keyword_case() { |
| 522 assertKeywordToken("case"); | 522 _assertKeywordToken("case"); |
| 523 } | 523 } |
| 524 | 524 |
| 525 void test_keyword_catch() { | 525 void test_keyword_catch() { |
| 526 assertKeywordToken("catch"); | 526 _assertKeywordToken("catch"); |
| 527 } | 527 } |
| 528 | 528 |
| 529 void test_keyword_class() { | 529 void test_keyword_class() { |
| 530 assertKeywordToken("class"); | 530 _assertKeywordToken("class"); |
| 531 } | 531 } |
| 532 | 532 |
| 533 void test_keyword_const() { | 533 void test_keyword_const() { |
| 534 assertKeywordToken("const"); | 534 _assertKeywordToken("const"); |
| 535 } | 535 } |
| 536 | 536 |
| 537 void test_keyword_continue() { | 537 void test_keyword_continue() { |
| 538 assertKeywordToken("continue"); | 538 _assertKeywordToken("continue"); |
| 539 } | 539 } |
| 540 | 540 |
| 541 void test_keyword_default() { | 541 void test_keyword_default() { |
| 542 assertKeywordToken("default"); | 542 _assertKeywordToken("default"); |
| 543 } | 543 } |
| 544 | 544 |
| 545 void test_keyword_do() { | 545 void test_keyword_do() { |
| 546 assertKeywordToken("do"); | 546 _assertKeywordToken("do"); |
| 547 } | 547 } |
| 548 | 548 |
| 549 void test_keyword_dynamic() { | 549 void test_keyword_dynamic() { |
| 550 assertKeywordToken("dynamic"); | 550 _assertKeywordToken("dynamic"); |
| 551 } | 551 } |
| 552 | 552 |
| 553 void test_keyword_else() { | 553 void test_keyword_else() { |
| 554 assertKeywordToken("else"); | 554 _assertKeywordToken("else"); |
| 555 } | 555 } |
| 556 | 556 |
| 557 void test_keyword_enum() { | 557 void test_keyword_enum() { |
| 558 assertKeywordToken("enum"); | 558 _assertKeywordToken("enum"); |
| 559 } | 559 } |
| 560 | 560 |
| 561 void test_keyword_export() { | 561 void test_keyword_export() { |
| 562 assertKeywordToken("export"); | 562 _assertKeywordToken("export"); |
| 563 } | 563 } |
| 564 | 564 |
| 565 void test_keyword_extends() { | 565 void test_keyword_extends() { |
| 566 assertKeywordToken("extends"); | 566 _assertKeywordToken("extends"); |
| 567 } | 567 } |
| 568 | 568 |
| 569 void test_keyword_factory() { | 569 void test_keyword_factory() { |
| 570 assertKeywordToken("factory"); | 570 _assertKeywordToken("factory"); |
| 571 } | 571 } |
| 572 | 572 |
| 573 void test_keyword_false() { | 573 void test_keyword_false() { |
| 574 assertKeywordToken("false"); | 574 _assertKeywordToken("false"); |
| 575 } | 575 } |
| 576 | 576 |
| 577 void test_keyword_final() { | 577 void test_keyword_final() { |
| 578 assertKeywordToken("final"); | 578 _assertKeywordToken("final"); |
| 579 } | 579 } |
| 580 | 580 |
| 581 void test_keyword_finally() { | 581 void test_keyword_finally() { |
| 582 assertKeywordToken("finally"); | 582 _assertKeywordToken("finally"); |
| 583 } | 583 } |
| 584 | 584 |
| 585 void test_keyword_for() { | 585 void test_keyword_for() { |
| 586 assertKeywordToken("for"); | 586 _assertKeywordToken("for"); |
| 587 } | 587 } |
| 588 | 588 |
| 589 void test_keyword_get() { | 589 void test_keyword_get() { |
| 590 assertKeywordToken("get"); | 590 _assertKeywordToken("get"); |
| 591 } | 591 } |
| 592 | 592 |
| 593 void test_keyword_if() { | 593 void test_keyword_if() { |
| 594 assertKeywordToken("if"); | 594 _assertKeywordToken("if"); |
| 595 } | 595 } |
| 596 | 596 |
| 597 void test_keyword_implements() { | 597 void test_keyword_implements() { |
| 598 assertKeywordToken("implements"); | 598 _assertKeywordToken("implements"); |
| 599 } | 599 } |
| 600 | 600 |
| 601 void test_keyword_import() { | 601 void test_keyword_import() { |
| 602 assertKeywordToken("import"); | 602 _assertKeywordToken("import"); |
| 603 } | 603 } |
| 604 | 604 |
| 605 void test_keyword_in() { | 605 void test_keyword_in() { |
| 606 assertKeywordToken("in"); | 606 _assertKeywordToken("in"); |
| 607 } | 607 } |
| 608 | 608 |
| 609 void test_keyword_is() { | 609 void test_keyword_is() { |
| 610 assertKeywordToken("is"); | 610 _assertKeywordToken("is"); |
| 611 } | 611 } |
| 612 | 612 |
| 613 void test_keyword_library() { | 613 void test_keyword_library() { |
| 614 assertKeywordToken("library"); | 614 _assertKeywordToken("library"); |
| 615 } | 615 } |
| 616 | 616 |
| 617 void test_keyword_new() { | 617 void test_keyword_new() { |
| 618 assertKeywordToken("new"); | 618 _assertKeywordToken("new"); |
| 619 } | 619 } |
| 620 | 620 |
| 621 void test_keyword_null() { | 621 void test_keyword_null() { |
| 622 assertKeywordToken("null"); | 622 _assertKeywordToken("null"); |
| 623 } | 623 } |
| 624 | 624 |
| 625 void test_keyword_operator() { | 625 void test_keyword_operator() { |
| 626 assertKeywordToken("operator"); | 626 _assertKeywordToken("operator"); |
| 627 } | 627 } |
| 628 | 628 |
| 629 void test_keyword_part() { | 629 void test_keyword_part() { |
| 630 assertKeywordToken("part"); | 630 _assertKeywordToken("part"); |
| 631 } | 631 } |
| 632 | 632 |
| 633 void test_keyword_rethrow() { | 633 void test_keyword_rethrow() { |
| 634 assertKeywordToken("rethrow"); | 634 _assertKeywordToken("rethrow"); |
| 635 } | 635 } |
| 636 | 636 |
| 637 void test_keyword_return() { | 637 void test_keyword_return() { |
| 638 assertKeywordToken("return"); | 638 _assertKeywordToken("return"); |
| 639 } | 639 } |
| 640 | 640 |
| 641 void test_keyword_set() { | 641 void test_keyword_set() { |
| 642 assertKeywordToken("set"); | 642 _assertKeywordToken("set"); |
| 643 } | 643 } |
| 644 | 644 |
| 645 void test_keyword_static() { | 645 void test_keyword_static() { |
| 646 assertKeywordToken("static"); | 646 _assertKeywordToken("static"); |
| 647 } | 647 } |
| 648 | 648 |
| 649 void test_keyword_super() { | 649 void test_keyword_super() { |
| 650 assertKeywordToken("super"); | 650 _assertKeywordToken("super"); |
| 651 } | 651 } |
| 652 | 652 |
| 653 void test_keyword_switch() { | 653 void test_keyword_switch() { |
| 654 assertKeywordToken("switch"); | 654 _assertKeywordToken("switch"); |
| 655 } | 655 } |
| 656 | 656 |
| 657 void test_keyword_this() { | 657 void test_keyword_this() { |
| 658 assertKeywordToken("this"); | 658 _assertKeywordToken("this"); |
| 659 } | 659 } |
| 660 | 660 |
| 661 void test_keyword_throw() { | 661 void test_keyword_throw() { |
| 662 assertKeywordToken("throw"); | 662 _assertKeywordToken("throw"); |
| 663 } | 663 } |
| 664 | 664 |
| 665 void test_keyword_true() { | 665 void test_keyword_true() { |
| 666 assertKeywordToken("true"); | 666 _assertKeywordToken("true"); |
| 667 } | 667 } |
| 668 | 668 |
| 669 void test_keyword_try() { | 669 void test_keyword_try() { |
| 670 assertKeywordToken("try"); | 670 _assertKeywordToken("try"); |
| 671 } | 671 } |
| 672 | 672 |
| 673 void test_keyword_typedef() { | 673 void test_keyword_typedef() { |
| 674 assertKeywordToken("typedef"); | 674 _assertKeywordToken("typedef"); |
| 675 } | 675 } |
| 676 | 676 |
| 677 void test_keyword_var() { | 677 void test_keyword_var() { |
| 678 assertKeywordToken("var"); | 678 _assertKeywordToken("var"); |
| 679 } | 679 } |
| 680 | 680 |
| 681 void test_keyword_void() { | 681 void test_keyword_void() { |
| 682 assertKeywordToken("void"); | 682 _assertKeywordToken("void"); |
| 683 } | 683 } |
| 684 | 684 |
| 685 void test_keyword_while() { | 685 void test_keyword_while() { |
| 686 assertKeywordToken("while"); | 686 _assertKeywordToken("while"); |
| 687 } | 687 } |
| 688 | 688 |
| 689 void test_keyword_with() { | 689 void test_keyword_with() { |
| 690 assertKeywordToken("with"); | 690 _assertKeywordToken("with"); |
| 691 } | 691 } |
| 692 | 692 |
| 693 void test_lineInfo_multilineComment() { | 693 void test_lineInfo_multilineComment() { |
| 694 String source = "/*\r *\r */"; | 694 String source = "/*\r *\r */"; |
| 695 assertLineInfo(source, [ | 695 _assertLineInfo(source, [ |
| 696 new ScannerTest_ExpectedLocation(0, 1, 1), | 696 new ScannerTest_ExpectedLocation(0, 1, 1), |
| 697 new ScannerTest_ExpectedLocation(4, 2, 2), | 697 new ScannerTest_ExpectedLocation(4, 2, 2), |
| 698 new ScannerTest_ExpectedLocation(source.length - 1, 3, 3)]); | 698 new ScannerTest_ExpectedLocation(source.length - 1, 3, 3)]); |
| 699 } | 699 } |
| 700 | 700 |
| 701 void test_lineInfo_multilineString() { | 701 void test_lineInfo_multilineString() { |
| 702 String source = "'''a\r\nbc\r\nd'''"; | 702 String source = "'''a\r\nbc\r\nd'''"; |
| 703 assertLineInfo(source, [ | 703 _assertLineInfo(source, [ |
| 704 new ScannerTest_ExpectedLocation(0, 1, 1), | 704 new ScannerTest_ExpectedLocation(0, 1, 1), |
| 705 new ScannerTest_ExpectedLocation(7, 2, 2), | 705 new ScannerTest_ExpectedLocation(7, 2, 2), |
| 706 new ScannerTest_ExpectedLocation(source.length - 1, 3, 4)]); | 706 new ScannerTest_ExpectedLocation(source.length - 1, 3, 4)]); |
| 707 } | 707 } |
| 708 | 708 |
| 709 void test_lineInfo_simpleClass() { | 709 void test_lineInfo_simpleClass() { |
| 710 String source = "class Test {\r\n String s = '...';\r\n int get x => s
.MISSING_GETTER;\r\n}"; | 710 String source = "class Test {\r\n String s = '...';\r\n int get x => s
.MISSING_GETTER;\r\n}"; |
| 711 assertLineInfo(source, [ | 711 _assertLineInfo(source, [ |
| 712 new ScannerTest_ExpectedLocation(0, 1, 1), | 712 new ScannerTest_ExpectedLocation(0, 1, 1), |
| 713 new ScannerTest_ExpectedLocation(source.indexOf("MISSING_GETTER"), 3, 20
), | 713 new ScannerTest_ExpectedLocation(source.indexOf("MISSING_GETTER"), 3, 20
), |
| 714 new ScannerTest_ExpectedLocation(source.length - 1, 4, 1)]); | 714 new ScannerTest_ExpectedLocation(source.length - 1, 4, 1)]); |
| 715 } | 715 } |
| 716 | 716 |
| 717 void test_lineInfo_slashN() { | 717 void test_lineInfo_slashN() { |
| 718 String source = "class Test {\n}"; | 718 String source = "class Test {\n}"; |
| 719 assertLineInfo(source, [ | 719 _assertLineInfo(source, [ |
| 720 new ScannerTest_ExpectedLocation(0, 1, 1), | 720 new ScannerTest_ExpectedLocation(0, 1, 1), |
| 721 new ScannerTest_ExpectedLocation(source.indexOf("}"), 2, 1)]); | 721 new ScannerTest_ExpectedLocation(source.indexOf("}"), 2, 1)]); |
| 722 } | 722 } |
| 723 | 723 |
| 724 void test_lt() { | 724 void test_lt() { |
| 725 assertToken(TokenType.LT, "<"); | 725 _assertToken(TokenType.LT, "<"); |
| 726 } | 726 } |
| 727 | 727 |
| 728 void test_lt_eq() { | 728 void test_lt_eq() { |
| 729 assertToken(TokenType.LT_EQ, "<="); | 729 _assertToken(TokenType.LT_EQ, "<="); |
| 730 } | 730 } |
| 731 | 731 |
| 732 void test_lt_lt() { | 732 void test_lt_lt() { |
| 733 assertToken(TokenType.LT_LT, "<<"); | 733 _assertToken(TokenType.LT_LT, "<<"); |
| 734 } | 734 } |
| 735 | 735 |
| 736 void test_lt_lt_eq() { | 736 void test_lt_lt_eq() { |
| 737 assertToken(TokenType.LT_LT_EQ, "<<="); | 737 _assertToken(TokenType.LT_LT_EQ, "<<="); |
| 738 } | 738 } |
| 739 | 739 |
| 740 void test_minus() { | 740 void test_minus() { |
| 741 assertToken(TokenType.MINUS, "-"); | 741 _assertToken(TokenType.MINUS, "-"); |
| 742 } | 742 } |
| 743 | 743 |
| 744 void test_minus_eq() { | 744 void test_minus_eq() { |
| 745 assertToken(TokenType.MINUS_EQ, "-="); | 745 _assertToken(TokenType.MINUS_EQ, "-="); |
| 746 } | 746 } |
| 747 | 747 |
| 748 void test_minus_minus() { | 748 void test_minus_minus() { |
| 749 assertToken(TokenType.MINUS_MINUS, "--"); | 749 _assertToken(TokenType.MINUS_MINUS, "--"); |
| 750 } | 750 } |
| 751 | 751 |
| 752 void test_open_curly_bracket() { | 752 void test_open_curly_bracket() { |
| 753 assertToken(TokenType.OPEN_CURLY_BRACKET, "{"); | 753 _assertToken(TokenType.OPEN_CURLY_BRACKET, "{"); |
| 754 } | 754 } |
| 755 | 755 |
| 756 void test_open_paren() { | 756 void test_open_paren() { |
| 757 assertToken(TokenType.OPEN_PAREN, "("); | 757 _assertToken(TokenType.OPEN_PAREN, "("); |
| 758 } | 758 } |
| 759 | 759 |
| 760 void test_open_square_bracket() { | 760 void test_open_square_bracket() { |
| 761 assertToken(TokenType.OPEN_SQUARE_BRACKET, "["); | 761 _assertToken(TokenType.OPEN_SQUARE_BRACKET, "["); |
| 762 } | 762 } |
| 763 | 763 |
| 764 void test_openSquareBracket() { | 764 void test_openSquareBracket() { |
| 765 assertToken(TokenType.OPEN_SQUARE_BRACKET, "["); | 765 _assertToken(TokenType.OPEN_SQUARE_BRACKET, "["); |
| 766 } | 766 } |
| 767 | 767 |
| 768 void test_percent() { | 768 void test_percent() { |
| 769 assertToken(TokenType.PERCENT, "%"); | 769 _assertToken(TokenType.PERCENT, "%"); |
| 770 } | 770 } |
| 771 | 771 |
| 772 void test_percent_eq() { | 772 void test_percent_eq() { |
| 773 assertToken(TokenType.PERCENT_EQ, "%="); | 773 _assertToken(TokenType.PERCENT_EQ, "%="); |
| 774 } | 774 } |
| 775 | 775 |
| 776 void test_period() { | 776 void test_period() { |
| 777 assertToken(TokenType.PERIOD, "."); | 777 _assertToken(TokenType.PERIOD, "."); |
| 778 } | 778 } |
| 779 | 779 |
| 780 void test_period_period() { | 780 void test_period_period() { |
| 781 assertToken(TokenType.PERIOD_PERIOD, ".."); | 781 _assertToken(TokenType.PERIOD_PERIOD, ".."); |
| 782 } | 782 } |
| 783 | 783 |
| 784 void test_period_period_period() { | 784 void test_period_period_period() { |
| 785 assertToken(TokenType.PERIOD_PERIOD_PERIOD, "..."); | 785 _assertToken(TokenType.PERIOD_PERIOD_PERIOD, "..."); |
| 786 } | 786 } |
| 787 | 787 |
| 788 void test_periodAfterNumberNotIncluded_identifier() { | 788 void test_periodAfterNumberNotIncluded_identifier() { |
| 789 assertTokens("42.isEven()", [ | 789 _assertTokens("42.isEven()", [ |
| 790 new StringToken(TokenType.INT, "42", 0), | 790 new StringToken(TokenType.INT, "42", 0), |
| 791 new Token(TokenType.PERIOD, 2), | 791 new Token(TokenType.PERIOD, 2), |
| 792 new StringToken(TokenType.IDENTIFIER, "isEven", 3), | 792 new StringToken(TokenType.IDENTIFIER, "isEven", 3), |
| 793 new Token(TokenType.OPEN_PAREN, 9), | 793 new Token(TokenType.OPEN_PAREN, 9), |
| 794 new Token(TokenType.CLOSE_PAREN, 10)]); | 794 new Token(TokenType.CLOSE_PAREN, 10)]); |
| 795 } | 795 } |
| 796 | 796 |
| 797 void test_periodAfterNumberNotIncluded_period() { | 797 void test_periodAfterNumberNotIncluded_period() { |
| 798 assertTokens("42..isEven()", [ | 798 _assertTokens("42..isEven()", [ |
| 799 new StringToken(TokenType.INT, "42", 0), | 799 new StringToken(TokenType.INT, "42", 0), |
| 800 new Token(TokenType.PERIOD_PERIOD, 2), | 800 new Token(TokenType.PERIOD_PERIOD, 2), |
| 801 new StringToken(TokenType.IDENTIFIER, "isEven", 4), | 801 new StringToken(TokenType.IDENTIFIER, "isEven", 4), |
| 802 new Token(TokenType.OPEN_PAREN, 10), | 802 new Token(TokenType.OPEN_PAREN, 10), |
| 803 new Token(TokenType.CLOSE_PAREN, 11)]); | 803 new Token(TokenType.CLOSE_PAREN, 11)]); |
| 804 } | 804 } |
| 805 | 805 |
| 806 void test_plus() { | 806 void test_plus() { |
| 807 assertToken(TokenType.PLUS, "+"); | 807 _assertToken(TokenType.PLUS, "+"); |
| 808 } | 808 } |
| 809 | 809 |
| 810 void test_plus_eq() { | 810 void test_plus_eq() { |
| 811 assertToken(TokenType.PLUS_EQ, "+="); | 811 _assertToken(TokenType.PLUS_EQ, "+="); |
| 812 } | 812 } |
| 813 | 813 |
| 814 void test_plus_plus() { | 814 void test_plus_plus() { |
| 815 assertToken(TokenType.PLUS_PLUS, "++"); | 815 _assertToken(TokenType.PLUS_PLUS, "++"); |
| 816 } | 816 } |
| 817 | 817 |
| 818 void test_question() { | 818 void test_question() { |
| 819 assertToken(TokenType.QUESTION, "?"); | 819 _assertToken(TokenType.QUESTION, "?"); |
| 820 } | 820 } |
| 821 | 821 |
| 822 void test_scriptTag_withArgs() { | 822 void test_scriptTag_withArgs() { |
| 823 assertToken(TokenType.SCRIPT_TAG, "#!/bin/dart -debug"); | 823 _assertToken(TokenType.SCRIPT_TAG, "#!/bin/dart -debug"); |
| 824 } | 824 } |
| 825 | 825 |
| 826 void test_scriptTag_withoutSpace() { | 826 void test_scriptTag_withoutSpace() { |
| 827 assertToken(TokenType.SCRIPT_TAG, "#!/bin/dart"); | 827 _assertToken(TokenType.SCRIPT_TAG, "#!/bin/dart"); |
| 828 } | 828 } |
| 829 | 829 |
| 830 void test_scriptTag_withSpace() { | 830 void test_scriptTag_withSpace() { |
| 831 assertToken(TokenType.SCRIPT_TAG, "#! /bin/dart"); | 831 _assertToken(TokenType.SCRIPT_TAG, "#! /bin/dart"); |
| 832 } | 832 } |
| 833 | 833 |
| 834 void test_semicolon() { | 834 void test_semicolon() { |
| 835 assertToken(TokenType.SEMICOLON, ";"); | 835 _assertToken(TokenType.SEMICOLON, ";"); |
| 836 } | 836 } |
| 837 | 837 |
| 838 void test_setSourceStart() { | 838 void test_setSourceStart() { |
| 839 int offsetDelta = 42; | 839 int offsetDelta = 42; |
| 840 GatheringErrorListener listener = new GatheringErrorListener(); | 840 GatheringErrorListener listener = new GatheringErrorListener(); |
| 841 Scanner scanner = new Scanner(null, new SubSequenceReader("a", offsetDelta),
listener); | 841 Scanner scanner = new Scanner(null, new SubSequenceReader("a", offsetDelta),
listener); |
| 842 scanner.setSourceStart(3, 9); | 842 scanner.setSourceStart(3, 9); |
| 843 scanner.tokenize(); | 843 scanner.tokenize(); |
| 844 List<int> lineStarts = scanner.lineStarts; | 844 List<int> lineStarts = scanner.lineStarts; |
| 845 JUnitTestCase.assertNotNull(lineStarts); | 845 JUnitTestCase.assertNotNull(lineStarts); |
| 846 JUnitTestCase.assertEquals(3, lineStarts.length); | 846 JUnitTestCase.assertEquals(3, lineStarts.length); |
| 847 JUnitTestCase.assertEquals(33, lineStarts[2]); | 847 JUnitTestCase.assertEquals(33, lineStarts[2]); |
| 848 } | 848 } |
| 849 | 849 |
| 850 void test_slash() { | 850 void test_slash() { |
| 851 assertToken(TokenType.SLASH, "/"); | 851 _assertToken(TokenType.SLASH, "/"); |
| 852 } | 852 } |
| 853 | 853 |
| 854 void test_slash_eq() { | 854 void test_slash_eq() { |
| 855 assertToken(TokenType.SLASH_EQ, "/="); | 855 _assertToken(TokenType.SLASH_EQ, "/="); |
| 856 } | 856 } |
| 857 | 857 |
| 858 void test_star() { | 858 void test_star() { |
| 859 assertToken(TokenType.STAR, "*"); | 859 _assertToken(TokenType.STAR, "*"); |
| 860 } | 860 } |
| 861 | 861 |
| 862 void test_star_eq() { | 862 void test_star_eq() { |
| 863 assertToken(TokenType.STAR_EQ, "*="); | 863 _assertToken(TokenType.STAR_EQ, "*="); |
| 864 } | 864 } |
| 865 | 865 |
| 866 void test_startAndEnd() { | 866 void test_startAndEnd() { |
| 867 Token token = scan("a"); | 867 Token token = _scan("a"); |
| 868 Token previous = token.previous; | 868 Token previous = token.previous; |
| 869 JUnitTestCase.assertEquals(token, previous.next); | 869 JUnitTestCase.assertEquals(token, previous.next); |
| 870 JUnitTestCase.assertEquals(previous, previous.previous); | 870 JUnitTestCase.assertEquals(previous, previous.previous); |
| 871 Token next = token.next; | 871 Token next = token.next; |
| 872 JUnitTestCase.assertEquals(next, next.next); | 872 JUnitTestCase.assertEquals(next, next.next); |
| 873 JUnitTestCase.assertEquals(token, next.previous); | 873 JUnitTestCase.assertEquals(token, next.previous); |
| 874 } | 874 } |
| 875 | 875 |
| 876 void test_string_multi_double() { | 876 void test_string_multi_double() { |
| 877 assertToken(TokenType.STRING, "\"\"\"line1\nline2\"\"\""); | 877 _assertToken(TokenType.STRING, "\"\"\"line1\nline2\"\"\""); |
| 878 } | 878 } |
| 879 | 879 |
| 880 void test_string_multi_embeddedQuotes() { | 880 void test_string_multi_embeddedQuotes() { |
| 881 assertToken(TokenType.STRING, "\"\"\"line1\n\"\"\nline2\"\"\""); | 881 _assertToken(TokenType.STRING, "\"\"\"line1\n\"\"\nline2\"\"\""); |
| 882 } | 882 } |
| 883 | 883 |
| 884 void test_string_multi_embeddedQuotes_escapedChar() { | 884 void test_string_multi_embeddedQuotes_escapedChar() { |
| 885 assertToken(TokenType.STRING, "\"\"\"a\"\"\\tb\"\"\""); | 885 _assertToken(TokenType.STRING, "\"\"\"a\"\"\\tb\"\"\""); |
| 886 } | 886 } |
| 887 | 887 |
| 888 void test_string_multi_interpolation_block() { | 888 void test_string_multi_interpolation_block() { |
| 889 assertTokens("\"Hello \${name}!\"", [ | 889 _assertTokens("\"Hello \${name}!\"", [ |
| 890 new StringToken(TokenType.STRING, "\"Hello ", 0), | 890 new StringToken(TokenType.STRING, "\"Hello ", 0), |
| 891 new StringToken(TokenType.STRING_INTERPOLATION_EXPRESSION, "\${", 7), | 891 new StringToken(TokenType.STRING_INTERPOLATION_EXPRESSION, "\${", 7), |
| 892 new StringToken(TokenType.IDENTIFIER, "name", 9), | 892 new StringToken(TokenType.IDENTIFIER, "name", 9), |
| 893 new Token(TokenType.CLOSE_CURLY_BRACKET, 13), | 893 new Token(TokenType.CLOSE_CURLY_BRACKET, 13), |
| 894 new StringToken(TokenType.STRING, "!\"", 14)]); | 894 new StringToken(TokenType.STRING, "!\"", 14)]); |
| 895 } | 895 } |
| 896 | 896 |
| 897 void test_string_multi_interpolation_identifier() { | 897 void test_string_multi_interpolation_identifier() { |
| 898 assertTokens("\"Hello \$name!\"", [ | 898 _assertTokens("\"Hello \$name!\"", [ |
| 899 new StringToken(TokenType.STRING, "\"Hello ", 0), | 899 new StringToken(TokenType.STRING, "\"Hello ", 0), |
| 900 new StringToken(TokenType.STRING_INTERPOLATION_IDENTIFIER, "\$", 7), | 900 new StringToken(TokenType.STRING_INTERPOLATION_IDENTIFIER, "\$", 7), |
| 901 new StringToken(TokenType.IDENTIFIER, "name", 8), | 901 new StringToken(TokenType.IDENTIFIER, "name", 8), |
| 902 new StringToken(TokenType.STRING, "!\"", 12)]); | 902 new StringToken(TokenType.STRING, "!\"", 12)]); |
| 903 } | 903 } |
| 904 | 904 |
| 905 void test_string_multi_single() { | 905 void test_string_multi_single() { |
| 906 assertToken(TokenType.STRING, "'''string'''"); | 906 _assertToken(TokenType.STRING, "'''string'''"); |
| 907 } | 907 } |
| 908 | 908 |
| 909 void test_string_multi_slashEnter() { | 909 void test_string_multi_slashEnter() { |
| 910 assertToken(TokenType.STRING, "'''\\\n'''"); | 910 _assertToken(TokenType.STRING, "'''\\\n'''"); |
| 911 } | 911 } |
| 912 | 912 |
| 913 void test_string_multi_unterminated() { | 913 void test_string_multi_unterminated() { |
| 914 assertError(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 8, "'''string"); | 914 _assertError(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 8, "'''string"); |
| 915 } | 915 } |
| 916 | 916 |
| 917 void test_string_raw_multi_double() { | 917 void test_string_raw_multi_double() { |
| 918 assertToken(TokenType.STRING, "r\"\"\"line1\nline2\"\"\""); | 918 _assertToken(TokenType.STRING, "r\"\"\"line1\nline2\"\"\""); |
| 919 } | 919 } |
| 920 | 920 |
| 921 void test_string_raw_multi_single() { | 921 void test_string_raw_multi_single() { |
| 922 assertToken(TokenType.STRING, "r'''string'''"); | 922 _assertToken(TokenType.STRING, "r'''string'''"); |
| 923 } | 923 } |
| 924 | 924 |
| 925 void test_string_raw_multi_unterminated() { | 925 void test_string_raw_multi_unterminated() { |
| 926 assertError(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 9, "r'''string"); | 926 _assertError(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 9, "r'''string"); |
| 927 } | 927 } |
| 928 | 928 |
| 929 void test_string_raw_simple_double() { | 929 void test_string_raw_simple_double() { |
| 930 assertToken(TokenType.STRING, "r\"string\""); | 930 _assertToken(TokenType.STRING, "r\"string\""); |
| 931 } | 931 } |
| 932 | 932 |
| 933 void test_string_raw_simple_single() { | 933 void test_string_raw_simple_single() { |
| 934 assertToken(TokenType.STRING, "r'string'"); | 934 _assertToken(TokenType.STRING, "r'string'"); |
| 935 } | 935 } |
| 936 | 936 |
| 937 void test_string_raw_simple_unterminated_eof() { | 937 void test_string_raw_simple_unterminated_eof() { |
| 938 assertError(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 7, "r'string"); | 938 _assertError(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 7, "r'string"); |
| 939 } | 939 } |
| 940 | 940 |
| 941 void test_string_raw_simple_unterminated_eol() { | 941 void test_string_raw_simple_unterminated_eol() { |
| 942 assertError(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 8, "r'string\n"); | 942 _assertError(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 8, "r'string\n"); |
| 943 } | 943 } |
| 944 | 944 |
| 945 void test_string_simple_double() { | 945 void test_string_simple_double() { |
| 946 assertToken(TokenType.STRING, "\"string\""); | 946 _assertToken(TokenType.STRING, "\"string\""); |
| 947 } | 947 } |
| 948 | 948 |
| 949 void test_string_simple_escapedDollar() { | 949 void test_string_simple_escapedDollar() { |
| 950 assertToken(TokenType.STRING, "'a\\\$b'"); | 950 _assertToken(TokenType.STRING, "'a\\\$b'"); |
| 951 } | 951 } |
| 952 | 952 |
| 953 void test_string_simple_interpolation_adjacentIdentifiers() { | 953 void test_string_simple_interpolation_adjacentIdentifiers() { |
| 954 assertTokens("'\$a\$b'", [ | 954 _assertTokens("'\$a\$b'", [ |
| 955 new StringToken(TokenType.STRING, "'", 0), | 955 new StringToken(TokenType.STRING, "'", 0), |
| 956 new StringToken(TokenType.STRING_INTERPOLATION_IDENTIFIER, "\$", 1), | 956 new StringToken(TokenType.STRING_INTERPOLATION_IDENTIFIER, "\$", 1), |
| 957 new StringToken(TokenType.IDENTIFIER, "a", 2), | 957 new StringToken(TokenType.IDENTIFIER, "a", 2), |
| 958 new StringToken(TokenType.STRING, "", 3), | 958 new StringToken(TokenType.STRING, "", 3), |
| 959 new StringToken(TokenType.STRING_INTERPOLATION_IDENTIFIER, "\$", 3), | 959 new StringToken(TokenType.STRING_INTERPOLATION_IDENTIFIER, "\$", 3), |
| 960 new StringToken(TokenType.IDENTIFIER, "b", 4), | 960 new StringToken(TokenType.IDENTIFIER, "b", 4), |
| 961 new StringToken(TokenType.STRING, "'", 5)]); | 961 new StringToken(TokenType.STRING, "'", 5)]); |
| 962 } | 962 } |
| 963 | 963 |
| 964 void test_string_simple_interpolation_block() { | 964 void test_string_simple_interpolation_block() { |
| 965 assertTokens("'Hello \${name}!'", [ | 965 _assertTokens("'Hello \${name}!'", [ |
| 966 new StringToken(TokenType.STRING, "'Hello ", 0), | 966 new StringToken(TokenType.STRING, "'Hello ", 0), |
| 967 new StringToken(TokenType.STRING_INTERPOLATION_EXPRESSION, "\${", 7), | 967 new StringToken(TokenType.STRING_INTERPOLATION_EXPRESSION, "\${", 7), |
| 968 new StringToken(TokenType.IDENTIFIER, "name", 9), | 968 new StringToken(TokenType.IDENTIFIER, "name", 9), |
| 969 new Token(TokenType.CLOSE_CURLY_BRACKET, 13), | 969 new Token(TokenType.CLOSE_CURLY_BRACKET, 13), |
| 970 new StringToken(TokenType.STRING, "!'", 14)]); | 970 new StringToken(TokenType.STRING, "!'", 14)]); |
| 971 } | 971 } |
| 972 | 972 |
| 973 void test_string_simple_interpolation_blockWithNestedMap() { | 973 void test_string_simple_interpolation_blockWithNestedMap() { |
| 974 assertTokens("'a \${f({'b' : 'c'})} d'", [ | 974 _assertTokens("'a \${f({'b' : 'c'})} d'", [ |
| 975 new StringToken(TokenType.STRING, "'a ", 0), | 975 new StringToken(TokenType.STRING, "'a ", 0), |
| 976 new StringToken(TokenType.STRING_INTERPOLATION_EXPRESSION, "\${", 3), | 976 new StringToken(TokenType.STRING_INTERPOLATION_EXPRESSION, "\${", 3), |
| 977 new StringToken(TokenType.IDENTIFIER, "f", 5), | 977 new StringToken(TokenType.IDENTIFIER, "f", 5), |
| 978 new Token(TokenType.OPEN_PAREN, 6), | 978 new Token(TokenType.OPEN_PAREN, 6), |
| 979 new Token(TokenType.OPEN_CURLY_BRACKET, 7), | 979 new Token(TokenType.OPEN_CURLY_BRACKET, 7), |
| 980 new StringToken(TokenType.STRING, "'b'", 8), | 980 new StringToken(TokenType.STRING, "'b'", 8), |
| 981 new Token(TokenType.COLON, 12), | 981 new Token(TokenType.COLON, 12), |
| 982 new StringToken(TokenType.STRING, "'c'", 14), | 982 new StringToken(TokenType.STRING, "'c'", 14), |
| 983 new Token(TokenType.CLOSE_CURLY_BRACKET, 17), | 983 new Token(TokenType.CLOSE_CURLY_BRACKET, 17), |
| 984 new Token(TokenType.CLOSE_PAREN, 18), | 984 new Token(TokenType.CLOSE_PAREN, 18), |
| 985 new Token(TokenType.CLOSE_CURLY_BRACKET, 19), | 985 new Token(TokenType.CLOSE_CURLY_BRACKET, 19), |
| 986 new StringToken(TokenType.STRING, " d'", 20)]); | 986 new StringToken(TokenType.STRING, " d'", 20)]); |
| 987 } | 987 } |
| 988 | 988 |
| 989 void test_string_simple_interpolation_firstAndLast() { | 989 void test_string_simple_interpolation_firstAndLast() { |
| 990 assertTokens("'\$greeting \$name'", [ | 990 _assertTokens("'\$greeting \$name'", [ |
| 991 new StringToken(TokenType.STRING, "'", 0), | 991 new StringToken(TokenType.STRING, "'", 0), |
| 992 new StringToken(TokenType.STRING_INTERPOLATION_IDENTIFIER, "\$", 1), | 992 new StringToken(TokenType.STRING_INTERPOLATION_IDENTIFIER, "\$", 1), |
| 993 new StringToken(TokenType.IDENTIFIER, "greeting", 2), | 993 new StringToken(TokenType.IDENTIFIER, "greeting", 2), |
| 994 new StringToken(TokenType.STRING, " ", 10), | 994 new StringToken(TokenType.STRING, " ", 10), |
| 995 new StringToken(TokenType.STRING_INTERPOLATION_IDENTIFIER, "\$", 11), | 995 new StringToken(TokenType.STRING_INTERPOLATION_IDENTIFIER, "\$", 11), |
| 996 new StringToken(TokenType.IDENTIFIER, "name", 12), | 996 new StringToken(TokenType.IDENTIFIER, "name", 12), |
| 997 new StringToken(TokenType.STRING, "'", 16)]); | 997 new StringToken(TokenType.STRING, "'", 16)]); |
| 998 } | 998 } |
| 999 | 999 |
| 1000 void test_string_simple_interpolation_identifier() { | 1000 void test_string_simple_interpolation_identifier() { |
| 1001 assertTokens("'Hello \$name!'", [ | 1001 _assertTokens("'Hello \$name!'", [ |
| 1002 new StringToken(TokenType.STRING, "'Hello ", 0), | 1002 new StringToken(TokenType.STRING, "'Hello ", 0), |
| 1003 new StringToken(TokenType.STRING_INTERPOLATION_IDENTIFIER, "\$", 7), | 1003 new StringToken(TokenType.STRING_INTERPOLATION_IDENTIFIER, "\$", 7), |
| 1004 new StringToken(TokenType.IDENTIFIER, "name", 8), | 1004 new StringToken(TokenType.IDENTIFIER, "name", 8), |
| 1005 new StringToken(TokenType.STRING, "!'", 12)]); | 1005 new StringToken(TokenType.STRING, "!'", 12)]); |
| 1006 } | 1006 } |
| 1007 | 1007 |
| 1008 void test_string_simple_interpolation_missingIdentifier() { | 1008 void test_string_simple_interpolation_missingIdentifier() { |
| 1009 assertTokens("'\$x\$'", [ | 1009 _assertTokens("'\$x\$'", [ |
| 1010 new StringToken(TokenType.STRING, "'", 0), | 1010 new StringToken(TokenType.STRING, "'", 0), |
| 1011 new StringToken(TokenType.STRING_INTERPOLATION_IDENTIFIER, "\$", 1), | 1011 new StringToken(TokenType.STRING_INTERPOLATION_IDENTIFIER, "\$", 1), |
| 1012 new StringToken(TokenType.IDENTIFIER, "x", 2), | 1012 new StringToken(TokenType.IDENTIFIER, "x", 2), |
| 1013 new StringToken(TokenType.STRING, "", 3), | 1013 new StringToken(TokenType.STRING, "", 3), |
| 1014 new StringToken(TokenType.STRING_INTERPOLATION_IDENTIFIER, "\$", 3), | 1014 new StringToken(TokenType.STRING_INTERPOLATION_IDENTIFIER, "\$", 3), |
| 1015 new StringToken(TokenType.STRING, "'", 4)]); | 1015 new StringToken(TokenType.STRING, "'", 4)]); |
| 1016 } | 1016 } |
| 1017 | 1017 |
| 1018 void test_string_simple_interpolation_nonIdentifier() { | 1018 void test_string_simple_interpolation_nonIdentifier() { |
| 1019 assertTokens("'\$1'", [ | 1019 _assertTokens("'\$1'", [ |
| 1020 new StringToken(TokenType.STRING, "'", 0), | 1020 new StringToken(TokenType.STRING, "'", 0), |
| 1021 new StringToken(TokenType.STRING_INTERPOLATION_IDENTIFIER, "\$", 1), | 1021 new StringToken(TokenType.STRING_INTERPOLATION_IDENTIFIER, "\$", 1), |
| 1022 new StringToken(TokenType.STRING, "1'", 2)]); | 1022 new StringToken(TokenType.STRING, "1'", 2)]); |
| 1023 } | 1023 } |
| 1024 | 1024 |
| 1025 void test_string_simple_single() { | 1025 void test_string_simple_single() { |
| 1026 assertToken(TokenType.STRING, "'string'"); | 1026 _assertToken(TokenType.STRING, "'string'"); |
| 1027 } | 1027 } |
| 1028 | 1028 |
| 1029 void test_string_simple_unterminated_eof() { | 1029 void test_string_simple_unterminated_eof() { |
| 1030 assertError(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 6, "'string"); | 1030 _assertError(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 6, "'string"); |
| 1031 } | 1031 } |
| 1032 | 1032 |
| 1033 void test_string_simple_unterminated_eol() { | 1033 void test_string_simple_unterminated_eol() { |
| 1034 assertError(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 7, "'string\r"); | 1034 _assertError(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 7, "'string\r"); |
| 1035 } | 1035 } |
| 1036 | 1036 |
| 1037 void test_tilde() { | 1037 void test_tilde() { |
| 1038 assertToken(TokenType.TILDE, "~"); | 1038 _assertToken(TokenType.TILDE, "~"); |
| 1039 } | 1039 } |
| 1040 | 1040 |
| 1041 void test_tilde_slash() { | 1041 void test_tilde_slash() { |
| 1042 assertToken(TokenType.TILDE_SLASH, "~/"); | 1042 _assertToken(TokenType.TILDE_SLASH, "~/"); |
| 1043 } | 1043 } |
| 1044 | 1044 |
| 1045 void test_tilde_slash_eq() { | 1045 void test_tilde_slash_eq() { |
| 1046 assertToken(TokenType.TILDE_SLASH_EQ, "~/="); | 1046 _assertToken(TokenType.TILDE_SLASH_EQ, "~/="); |
| 1047 } | 1047 } |
| 1048 | 1048 |
| 1049 void test_unclosedPairInInterpolation() { | 1049 void test_unclosedPairInInterpolation() { |
| 1050 GatheringErrorListener listener = new GatheringErrorListener(); | 1050 GatheringErrorListener listener = new GatheringErrorListener(); |
| 1051 scanWithListener("'\${(}'", listener); | 1051 _scanWithListener("'\${(}'", listener); |
| 1052 } | 1052 } |
| 1053 | 1053 |
| 1054 void assertComment(TokenType commentType, String source) { | 1054 void _assertComment(TokenType commentType, String source) { |
| 1055 // | 1055 // |
| 1056 // Test without a trailing end-of-line marker | 1056 // Test without a trailing end-of-line marker |
| 1057 // | 1057 // |
| 1058 Token token = scan(source); | 1058 Token token = _scan(source); |
| 1059 JUnitTestCase.assertNotNull(token); | 1059 JUnitTestCase.assertNotNull(token); |
| 1060 JUnitTestCase.assertEquals(TokenType.EOF, token.type); | 1060 JUnitTestCase.assertEquals(TokenType.EOF, token.type); |
| 1061 Token comment = token.precedingComments; | 1061 Token comment = token.precedingComments; |
| 1062 JUnitTestCase.assertNotNull(comment); | 1062 JUnitTestCase.assertNotNull(comment); |
| 1063 JUnitTestCase.assertEquals(commentType, comment.type); | 1063 JUnitTestCase.assertEquals(commentType, comment.type); |
| 1064 JUnitTestCase.assertEquals(0, comment.offset); | 1064 JUnitTestCase.assertEquals(0, comment.offset); |
| 1065 JUnitTestCase.assertEquals(source.length, comment.length); | 1065 JUnitTestCase.assertEquals(source.length, comment.length); |
| 1066 JUnitTestCase.assertEquals(source, comment.lexeme); | 1066 JUnitTestCase.assertEquals(source, comment.lexeme); |
| 1067 // | 1067 // |
| 1068 // Test with a trailing end-of-line marker | 1068 // Test with a trailing end-of-line marker |
| 1069 // | 1069 // |
| 1070 token = scan("${source}\n"); | 1070 token = _scan("${source}\n"); |
| 1071 JUnitTestCase.assertNotNull(token); | 1071 JUnitTestCase.assertNotNull(token); |
| 1072 JUnitTestCase.assertEquals(TokenType.EOF, token.type); | 1072 JUnitTestCase.assertEquals(TokenType.EOF, token.type); |
| 1073 comment = token.precedingComments; | 1073 comment = token.precedingComments; |
| 1074 JUnitTestCase.assertNotNull(comment); | 1074 JUnitTestCase.assertNotNull(comment); |
| 1075 JUnitTestCase.assertEquals(commentType, comment.type); | 1075 JUnitTestCase.assertEquals(commentType, comment.type); |
| 1076 JUnitTestCase.assertEquals(0, comment.offset); | 1076 JUnitTestCase.assertEquals(0, comment.offset); |
| 1077 JUnitTestCase.assertEquals(source.length, comment.length); | 1077 JUnitTestCase.assertEquals(source.length, comment.length); |
| 1078 JUnitTestCase.assertEquals(source, comment.lexeme); | 1078 JUnitTestCase.assertEquals(source, comment.lexeme); |
| 1079 } | 1079 } |
| 1080 | 1080 |
| 1081 /** | 1081 /** |
| 1082 * Assert that scanning the given source produces an error with the given code
. | 1082 * Assert that scanning the given source produces an error with the given code
. |
| 1083 * | 1083 * |
| 1084 * @param illegalCharacter | 1084 * @param illegalCharacter |
| 1085 * @param i | 1085 * @param i |
| 1086 * @param source the source to be scanned to produce the error | 1086 * @param source the source to be scanned to produce the error |
| 1087 */ | 1087 */ |
| 1088 void assertError(ScannerErrorCode expectedError, int expectedOffset, String so
urce) { | 1088 void _assertError(ScannerErrorCode expectedError, int expectedOffset, String s
ource) { |
| 1089 GatheringErrorListener listener = new GatheringErrorListener(); | 1089 GatheringErrorListener listener = new GatheringErrorListener(); |
| 1090 scanWithListener(source, listener); | 1090 _scanWithListener(source, listener); |
| 1091 listener.assertErrors([new AnalysisError.con2(null, expectedOffset, 1, expec
tedError, [source.codeUnitAt(expectedOffset)])]); | 1091 listener.assertErrors([new AnalysisError.con2(null, expectedOffset, 1, expec
tedError, [source.codeUnitAt(expectedOffset)])]); |
| 1092 } | 1092 } |
| 1093 | 1093 |
| 1094 /** | 1094 /** |
| 1095 * Assert that when scanned the given source contains a single keyword token w
ith the same lexeme | 1095 * Assert that when scanned the given source contains a single keyword token w
ith the same lexeme |
| 1096 * as the original source. | 1096 * as the original source. |
| 1097 * | 1097 * |
| 1098 * @param source the source to be scanned | 1098 * @param source the source to be scanned |
| 1099 */ | 1099 */ |
| 1100 void assertKeywordToken(String source) { | 1100 void _assertKeywordToken(String source) { |
| 1101 Token token = scan(source); | 1101 Token token = _scan(source); |
| 1102 JUnitTestCase.assertNotNull(token); | 1102 JUnitTestCase.assertNotNull(token); |
| 1103 JUnitTestCase.assertEquals(TokenType.KEYWORD, token.type); | 1103 JUnitTestCase.assertEquals(TokenType.KEYWORD, token.type); |
| 1104 JUnitTestCase.assertEquals(0, token.offset); | 1104 JUnitTestCase.assertEquals(0, token.offset); |
| 1105 JUnitTestCase.assertEquals(source.length, token.length); | 1105 JUnitTestCase.assertEquals(source.length, token.length); |
| 1106 JUnitTestCase.assertEquals(source, token.lexeme); | 1106 JUnitTestCase.assertEquals(source, token.lexeme); |
| 1107 Object value = token.value(); | 1107 Object value = token.value(); |
| 1108 JUnitTestCase.assertTrue(value is Keyword); | 1108 JUnitTestCase.assertTrue(value is Keyword); |
| 1109 JUnitTestCase.assertEquals(source, (value as Keyword).syntax); | 1109 JUnitTestCase.assertEquals(source, (value as Keyword).syntax); |
| 1110 token = scan(" ${source} "); | 1110 token = _scan(" ${source} "); |
| 1111 JUnitTestCase.assertNotNull(token); | 1111 JUnitTestCase.assertNotNull(token); |
| 1112 JUnitTestCase.assertEquals(TokenType.KEYWORD, token.type); | 1112 JUnitTestCase.assertEquals(TokenType.KEYWORD, token.type); |
| 1113 JUnitTestCase.assertEquals(1, token.offset); | 1113 JUnitTestCase.assertEquals(1, token.offset); |
| 1114 JUnitTestCase.assertEquals(source.length, token.length); | 1114 JUnitTestCase.assertEquals(source.length, token.length); |
| 1115 JUnitTestCase.assertEquals(source, token.lexeme); | 1115 JUnitTestCase.assertEquals(source, token.lexeme); |
| 1116 value = token.value(); | 1116 value = token.value(); |
| 1117 JUnitTestCase.assertTrue(value is Keyword); | 1117 JUnitTestCase.assertTrue(value is Keyword); |
| 1118 JUnitTestCase.assertEquals(source, (value as Keyword).syntax); | 1118 JUnitTestCase.assertEquals(source, (value as Keyword).syntax); |
| 1119 JUnitTestCase.assertEquals(TokenType.EOF, token.next.type); | 1119 JUnitTestCase.assertEquals(TokenType.EOF, token.next.type); |
| 1120 } | 1120 } |
| 1121 | 1121 |
| 1122 void assertLineInfo(String source, List<ScannerTest_ExpectedLocation> expected
Locations) { | 1122 void _assertLineInfo(String source, List<ScannerTest_ExpectedLocation> expecte
dLocations) { |
| 1123 GatheringErrorListener listener = new GatheringErrorListener(); | 1123 GatheringErrorListener listener = new GatheringErrorListener(); |
| 1124 scanWithListener(source, listener); | 1124 _scanWithListener(source, listener); |
| 1125 listener.assertNoErrors(); | 1125 listener.assertNoErrors(); |
| 1126 LineInfo info = listener.getLineInfo(new TestSource()); | 1126 LineInfo info = listener.getLineInfo(new TestSource()); |
| 1127 JUnitTestCase.assertNotNull(info); | 1127 JUnitTestCase.assertNotNull(info); |
| 1128 for (ScannerTest_ExpectedLocation expectedLocation in expectedLocations) { | 1128 for (ScannerTest_ExpectedLocation expectedLocation in expectedLocations) { |
| 1129 LineInfo_Location location = info.getLocation(expectedLocation._offset); | 1129 LineInfo_Location location = info.getLocation(expectedLocation._offset); |
| 1130 JUnitTestCase.assertEquals(expectedLocation._lineNumber, location.lineNumb
er); | 1130 JUnitTestCase.assertEquals(expectedLocation._lineNumber, location.lineNumb
er); |
| 1131 JUnitTestCase.assertEquals(expectedLocation._columnNumber, location.column
Number); | 1131 JUnitTestCase.assertEquals(expectedLocation._columnNumber, location.column
Number); |
| 1132 } | 1132 } |
| 1133 } | 1133 } |
| 1134 | 1134 |
| 1135 /** | 1135 /** |
| 1136 * Assert that the token scanned from the given source has the expected type. | 1136 * Assert that the token scanned from the given source has the expected type. |
| 1137 * | 1137 * |
| 1138 * @param expectedType the expected type of the token | 1138 * @param expectedType the expected type of the token |
| 1139 * @param source the source to be scanned to produce the actual token | 1139 * @param source the source to be scanned to produce the actual token |
| 1140 */ | 1140 */ |
| 1141 Token assertToken(TokenType expectedType, String source) { | 1141 Token _assertToken(TokenType expectedType, String source) { |
| 1142 Token originalToken = scan(source); | 1142 Token originalToken = _scan(source); |
| 1143 JUnitTestCase.assertNotNull(originalToken); | 1143 JUnitTestCase.assertNotNull(originalToken); |
| 1144 JUnitTestCase.assertEquals(expectedType, originalToken.type); | 1144 JUnitTestCase.assertEquals(expectedType, originalToken.type); |
| 1145 JUnitTestCase.assertEquals(0, originalToken.offset); | 1145 JUnitTestCase.assertEquals(0, originalToken.offset); |
| 1146 JUnitTestCase.assertEquals(source.length, originalToken.length); | 1146 JUnitTestCase.assertEquals(source.length, originalToken.length); |
| 1147 JUnitTestCase.assertEquals(source, originalToken.lexeme); | 1147 JUnitTestCase.assertEquals(source, originalToken.lexeme); |
| 1148 if (identical(expectedType, TokenType.SCRIPT_TAG)) { | 1148 if (identical(expectedType, TokenType.SCRIPT_TAG)) { |
| 1149 // Adding space before the script tag is not allowed, and adding text at t
he end changes nothing. | 1149 // Adding space before the script tag is not allowed, and adding text at t
he end changes nothing. |
| 1150 return originalToken; | 1150 return originalToken; |
| 1151 } else if (identical(expectedType, TokenType.SINGLE_LINE_COMMENT)) { | 1151 } else if (identical(expectedType, TokenType.SINGLE_LINE_COMMENT)) { |
| 1152 // Adding space to an end-of-line comment changes the comment. | 1152 // Adding space to an end-of-line comment changes the comment. |
| 1153 Token tokenWithSpaces = scan(" ${source}"); | 1153 Token tokenWithSpaces = _scan(" ${source}"); |
| 1154 JUnitTestCase.assertNotNull(tokenWithSpaces); | 1154 JUnitTestCase.assertNotNull(tokenWithSpaces); |
| 1155 JUnitTestCase.assertEquals(expectedType, tokenWithSpaces.type); | 1155 JUnitTestCase.assertEquals(expectedType, tokenWithSpaces.type); |
| 1156 JUnitTestCase.assertEquals(1, tokenWithSpaces.offset); | 1156 JUnitTestCase.assertEquals(1, tokenWithSpaces.offset); |
| 1157 JUnitTestCase.assertEquals(source.length, tokenWithSpaces.length); | 1157 JUnitTestCase.assertEquals(source.length, tokenWithSpaces.length); |
| 1158 JUnitTestCase.assertEquals(source, tokenWithSpaces.lexeme); | 1158 JUnitTestCase.assertEquals(source, tokenWithSpaces.lexeme); |
| 1159 return originalToken; | 1159 return originalToken; |
| 1160 } else if (identical(expectedType, TokenType.INT) || identical(expectedType,
TokenType.DOUBLE)) { | 1160 } else if (identical(expectedType, TokenType.INT) || identical(expectedType,
TokenType.DOUBLE)) { |
| 1161 Token tokenWithLowerD = scan("${source}d"); | 1161 Token tokenWithLowerD = _scan("${source}d"); |
| 1162 JUnitTestCase.assertNotNull(tokenWithLowerD); | 1162 JUnitTestCase.assertNotNull(tokenWithLowerD); |
| 1163 JUnitTestCase.assertEquals(expectedType, tokenWithLowerD.type); | 1163 JUnitTestCase.assertEquals(expectedType, tokenWithLowerD.type); |
| 1164 JUnitTestCase.assertEquals(0, tokenWithLowerD.offset); | 1164 JUnitTestCase.assertEquals(0, tokenWithLowerD.offset); |
| 1165 JUnitTestCase.assertEquals(source.length, tokenWithLowerD.length); | 1165 JUnitTestCase.assertEquals(source.length, tokenWithLowerD.length); |
| 1166 JUnitTestCase.assertEquals(source, tokenWithLowerD.lexeme); | 1166 JUnitTestCase.assertEquals(source, tokenWithLowerD.lexeme); |
| 1167 Token tokenWithUpperD = scan("${source}D"); | 1167 Token tokenWithUpperD = _scan("${source}D"); |
| 1168 JUnitTestCase.assertNotNull(tokenWithUpperD); | 1168 JUnitTestCase.assertNotNull(tokenWithUpperD); |
| 1169 JUnitTestCase.assertEquals(expectedType, tokenWithUpperD.type); | 1169 JUnitTestCase.assertEquals(expectedType, tokenWithUpperD.type); |
| 1170 JUnitTestCase.assertEquals(0, tokenWithUpperD.offset); | 1170 JUnitTestCase.assertEquals(0, tokenWithUpperD.offset); |
| 1171 JUnitTestCase.assertEquals(source.length, tokenWithUpperD.length); | 1171 JUnitTestCase.assertEquals(source.length, tokenWithUpperD.length); |
| 1172 JUnitTestCase.assertEquals(source, tokenWithUpperD.lexeme); | 1172 JUnitTestCase.assertEquals(source, tokenWithUpperD.lexeme); |
| 1173 } | 1173 } |
| 1174 Token tokenWithSpaces = scan(" ${source} "); | 1174 Token tokenWithSpaces = _scan(" ${source} "); |
| 1175 JUnitTestCase.assertNotNull(tokenWithSpaces); | 1175 JUnitTestCase.assertNotNull(tokenWithSpaces); |
| 1176 JUnitTestCase.assertEquals(expectedType, tokenWithSpaces.type); | 1176 JUnitTestCase.assertEquals(expectedType, tokenWithSpaces.type); |
| 1177 JUnitTestCase.assertEquals(1, tokenWithSpaces.offset); | 1177 JUnitTestCase.assertEquals(1, tokenWithSpaces.offset); |
| 1178 JUnitTestCase.assertEquals(source.length, tokenWithSpaces.length); | 1178 JUnitTestCase.assertEquals(source.length, tokenWithSpaces.length); |
| 1179 JUnitTestCase.assertEquals(source, tokenWithSpaces.lexeme); | 1179 JUnitTestCase.assertEquals(source, tokenWithSpaces.lexeme); |
| 1180 JUnitTestCase.assertEquals(TokenType.EOF, originalToken.next.type); | 1180 JUnitTestCase.assertEquals(TokenType.EOF, originalToken.next.type); |
| 1181 return originalToken; | 1181 return originalToken; |
| 1182 } | 1182 } |
| 1183 | 1183 |
| 1184 /** | 1184 /** |
| 1185 * Assert that when scanned the given source contains a sequence of tokens ide
ntical to the given | 1185 * Assert that when scanned the given source contains a sequence of tokens ide
ntical to the given |
| 1186 * tokens. | 1186 * tokens. |
| 1187 * | 1187 * |
| 1188 * @param source the source to be scanned | 1188 * @param source the source to be scanned |
| 1189 * @param expectedTokens the tokens that are expected to be in the source | 1189 * @param expectedTokens the tokens that are expected to be in the source |
| 1190 */ | 1190 */ |
| 1191 void assertTokens(String source, List<Token> expectedTokens) { | 1191 void _assertTokens(String source, List<Token> expectedTokens) { |
| 1192 Token token = scan(source); | 1192 Token token = _scan(source); |
| 1193 JUnitTestCase.assertNotNull(token); | 1193 JUnitTestCase.assertNotNull(token); |
| 1194 for (int i = 0; i < expectedTokens.length; i++) { | 1194 for (int i = 0; i < expectedTokens.length; i++) { |
| 1195 Token expectedToken = expectedTokens[i]; | 1195 Token expectedToken = expectedTokens[i]; |
| 1196 JUnitTestCase.assertEqualsMsg("Wrong type for token ${i}", expectedToken.t
ype, token.type); | 1196 JUnitTestCase.assertEqualsMsg("Wrong type for token ${i}", expectedToken.t
ype, token.type); |
| 1197 JUnitTestCase.assertEqualsMsg("Wrong offset for token ${i}", expectedToken
.offset, token.offset); | 1197 JUnitTestCase.assertEqualsMsg("Wrong offset for token ${i}", expectedToken
.offset, token.offset); |
| 1198 JUnitTestCase.assertEqualsMsg("Wrong length for token ${i}", expectedToken
.length, token.length); | 1198 JUnitTestCase.assertEqualsMsg("Wrong length for token ${i}", expectedToken
.length, token.length); |
| 1199 JUnitTestCase.assertEqualsMsg("Wrong lexeme for token ${i}", expectedToken
.lexeme, token.lexeme); | 1199 JUnitTestCase.assertEqualsMsg("Wrong lexeme for token ${i}", expectedToken
.lexeme, token.lexeme); |
| 1200 token = token.next; | 1200 token = token.next; |
| 1201 JUnitTestCase.assertNotNull(token); | 1201 JUnitTestCase.assertNotNull(token); |
| 1202 } | 1202 } |
| 1203 JUnitTestCase.assertEquals(TokenType.EOF, token.type); | 1203 JUnitTestCase.assertEquals(TokenType.EOF, token.type); |
| 1204 } | 1204 } |
| 1205 | 1205 |
| 1206 Token scan(String source) { | 1206 Token _scan(String source) { |
| 1207 GatheringErrorListener listener = new GatheringErrorListener(); | 1207 GatheringErrorListener listener = new GatheringErrorListener(); |
| 1208 Token token = scanWithListener(source, listener); | 1208 Token token = _scanWithListener(source, listener); |
| 1209 listener.assertNoErrors(); | 1209 listener.assertNoErrors(); |
| 1210 return token; | 1210 return token; |
| 1211 } | 1211 } |
| 1212 | 1212 |
| 1213 Token scanWithListener(String source, GatheringErrorListener listener) { | 1213 Token _scanWithListener(String source, GatheringErrorListener listener) { |
| 1214 Scanner scanner = new Scanner(null, new CharSequenceReader(source), listener
); | 1214 Scanner scanner = new Scanner(null, new CharSequenceReader(source), listener
); |
| 1215 Token result = scanner.tokenize(); | 1215 Token result = scanner.tokenize(); |
| 1216 listener.setLineInfo(new TestSource(), scanner.lineStarts); | 1216 listener.setLineInfo(new TestSource(), scanner.lineStarts); |
| 1217 return result; | 1217 return result; |
| 1218 } | 1218 } |
| 1219 | 1219 |
| 1220 static dartSuite() { | 1220 static dartSuite() { |
| 1221 _ut.group('ScannerTest', () { | 1221 _ut.group('ScannerTest', () { |
| 1222 _ut.test('test_ampersand', () { | 1222 _ut.test('test_ampersand', () { |
| 1223 final __test = new ScannerTest(); | 1223 final __test = new ScannerTest(); |
| (...skipping 684 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1908 | 1908 |
| 1909 /** | 1909 /** |
| 1910 * The first token from the token stream resulting from performing an incremen
tal scan, or | 1910 * The first token from the token stream resulting from performing an incremen
tal scan, or |
| 1911 * `null` if [scan] has not been invoked. | 1911 * `null` if [scan] has not been invoked. |
| 1912 */ | 1912 */ |
| 1913 Token _incrementalTokens; | 1913 Token _incrementalTokens; |
| 1914 | 1914 |
| 1915 void test_delete_identifier_beginning() { | 1915 void test_delete_identifier_beginning() { |
| 1916 // "abs + b;" | 1916 // "abs + b;" |
| 1917 // "s + b;") | 1917 // "s + b;") |
| 1918 scan("", "ab", "", "s + b;"); | 1918 _scan("", "ab", "", "s + b;"); |
| 1919 assertTokens(-1, 1, ["s", "+", "b", ";"]); | 1919 _assertTokens(-1, 1, ["s", "+", "b", ";"]); |
| 1920 JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange); | 1920 JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange); |
| 1921 } | 1921 } |
| 1922 | 1922 |
| 1923 void test_delete_identifier_end() { | 1923 void test_delete_identifier_end() { |
| 1924 // "abs + b;" | 1924 // "abs + b;" |
| 1925 // "a + b;") | 1925 // "a + b;") |
| 1926 scan("a", "bs", "", " + b;"); | 1926 _scan("a", "bs", "", " + b;"); |
| 1927 assertTokens(-1, 1, ["a", "+", "b", ";"]); | 1927 _assertTokens(-1, 1, ["a", "+", "b", ";"]); |
| 1928 JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange); | 1928 JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange); |
| 1929 } | 1929 } |
| 1930 | 1930 |
| 1931 void test_delete_identifier_middle() { | 1931 void test_delete_identifier_middle() { |
| 1932 // "abs + b;" | 1932 // "abs + b;" |
| 1933 // "as + b;") | 1933 // "as + b;") |
| 1934 scan("a", "b", "", "s + b;"); | 1934 _scan("a", "b", "", "s + b;"); |
| 1935 assertTokens(-1, 1, ["as", "+", "b", ";"]); | 1935 _assertTokens(-1, 1, ["as", "+", "b", ";"]); |
| 1936 JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange); | 1936 JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange); |
| 1937 } | 1937 } |
| 1938 | 1938 |
| 1939 void test_delete_mergeTokens() { | 1939 void test_delete_mergeTokens() { |
| 1940 // "a + b + c;" | 1940 // "a + b + c;" |
| 1941 // "ac;") | 1941 // "ac;") |
| 1942 scan("a", " + b + ", "", "c;"); | 1942 _scan("a", " + b + ", "", "c;"); |
| 1943 assertTokens(-1, 1, ["ac", ";"]); | 1943 _assertTokens(-1, 1, ["ac", ";"]); |
| 1944 JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange); | 1944 JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange); |
| 1945 } | 1945 } |
| 1946 | 1946 |
| 1947 void test_insert_afterIdentifier1() { | 1947 void test_insert_afterIdentifier1() { |
| 1948 // "a + b;" | 1948 // "a + b;" |
| 1949 // "abs + b;" | 1949 // "abs + b;" |
| 1950 scan("a", "", "bs", " + b;"); | 1950 _scan("a", "", "bs", " + b;"); |
| 1951 assertTokens(-1, 1, ["abs", "+", "b", ";"]); | 1951 _assertTokens(-1, 1, ["abs", "+", "b", ";"]); |
| 1952 assertReplaced(1, "+"); | 1952 _assertReplaced(1, "+"); |
| 1953 JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange); | 1953 JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange); |
| 1954 } | 1954 } |
| 1955 | 1955 |
| 1956 void test_insert_afterIdentifier2() { | 1956 void test_insert_afterIdentifier2() { |
| 1957 // "a + b;" | 1957 // "a + b;" |
| 1958 // "a + by;" | 1958 // "a + by;" |
| 1959 scan("a + b", "", "y", ";"); | 1959 _scan("a + b", "", "y", ";"); |
| 1960 assertTokens(1, 3, ["a", "+", "by", ";"]); | 1960 _assertTokens(1, 3, ["a", "+", "by", ";"]); |
| 1961 JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange); | 1961 JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange); |
| 1962 } | 1962 } |
| 1963 | 1963 |
| 1964 void test_insert_beforeIdentifier() { | 1964 void test_insert_beforeIdentifier() { |
| 1965 // "a + b;" | 1965 // "a + b;" |
| 1966 // "a + xb;") | 1966 // "a + xb;") |
| 1967 scan("a + ", "", "x", "b;"); | 1967 _scan("a + ", "", "x", "b;"); |
| 1968 assertTokens(1, 3, ["a", "+", "xb", ";"]); | 1968 _assertTokens(1, 3, ["a", "+", "xb", ";"]); |
| 1969 JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange); | 1969 JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange); |
| 1970 } | 1970 } |
| 1971 | 1971 |
| 1972 void test_insert_beforeIdentifier_firstToken() { | 1972 void test_insert_beforeIdentifier_firstToken() { |
| 1973 // "a + b;" | 1973 // "a + b;" |
| 1974 // "xa + b;" | 1974 // "xa + b;" |
| 1975 scan("", "", "x", "a + b;"); | 1975 _scan("", "", "x", "a + b;"); |
| 1976 assertTokens(-1, 1, ["xa", "+", "b", ";"]); | 1976 _assertTokens(-1, 1, ["xa", "+", "b", ";"]); |
| 1977 JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange); | 1977 JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange); |
| 1978 } | 1978 } |
| 1979 | 1979 |
| 1980 void test_insert_convertOneFunctionToTwo() { | 1980 void test_insert_convertOneFunctionToTwo() { |
| 1981 // "f() {}" | 1981 // "f() {}" |
| 1982 // "f() => 0; g() {}" | 1982 // "f() => 0; g() {}" |
| 1983 scan("f()", "", " => 0; g()", " {}"); | 1983 _scan("f()", "", " => 0; g()", " {}"); |
| 1984 assertTokens(2, 9, ["f", "(", ")", "=>", "0", ";", "g", "(", ")", "{", "}"])
; | 1984 _assertTokens(2, 9, ["f", "(", ")", "=>", "0", ";", "g", "(", ")", "{", "}"]
); |
| 1985 JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange); | 1985 JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange); |
| 1986 } | 1986 } |
| 1987 | 1987 |
| 1988 void test_insert_end() { | 1988 void test_insert_end() { |
| 1989 // "class A {}" | 1989 // "class A {}" |
| 1990 // "class A {} class B {}" | 1990 // "class A {} class B {}" |
| 1991 scan("class A {}", "", " class B {}", ""); | 1991 _scan("class A {}", "", " class B {}", ""); |
| 1992 assertTokens(3, 8, ["class", "A", "{", "}", "class", "B", "{", "}"]); | 1992 _assertTokens(3, 8, ["class", "A", "{", "}", "class", "B", "{", "}"]); |
| 1993 JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange); | 1993 JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange); |
| 1994 } | 1994 } |
| 1995 | 1995 |
| 1996 void test_insert_insideIdentifier() { | 1996 void test_insert_insideIdentifier() { |
| 1997 // "cob;" | 1997 // "cob;" |
| 1998 // "cow.b;" | 1998 // "cow.b;" |
| 1999 scan("co", "", "w.", "b;"); | 1999 _scan("co", "", "w.", "b;"); |
| 2000 assertTokens(-1, 3, ["cow", ".", "b", ";"]); | 2000 _assertTokens(-1, 3, ["cow", ".", "b", ";"]); |
| 2001 JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange); | 2001 JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange); |
| 2002 } | 2002 } |
| 2003 | 2003 |
| 2004 void test_insert_newIdentifier1() { | 2004 void test_insert_newIdentifier1() { |
| 2005 // "a; c;" | 2005 // "a; c;" |
| 2006 // "a; b c;" | 2006 // "a; b c;" |
| 2007 scan("a; ", "", "b", " c;"); | 2007 _scan("a; ", "", "b", " c;"); |
| 2008 assertTokens(1, 3, ["a", ";", "b", "c", ";"]); | 2008 _assertTokens(1, 3, ["a", ";", "b", "c", ";"]); |
| 2009 JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange); | 2009 JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange); |
| 2010 } | 2010 } |
| 2011 | 2011 |
| 2012 void test_insert_newIdentifier2() { | 2012 void test_insert_newIdentifier2() { |
| 2013 // "a; c;" | 2013 // "a; c;" |
| 2014 // "a;b c;" | 2014 // "a;b c;" |
| 2015 scan("a;", "", "b", " c;"); | 2015 _scan("a;", "", "b", " c;"); |
| 2016 assertTokens(1, 3, ["a", ";", "b", "c", ";"]); | 2016 _assertTokens(1, 3, ["a", ";", "b", "c", ";"]); |
| 2017 assertReplaced(1, ";"); | 2017 _assertReplaced(1, ";"); |
| 2018 JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange); | 2018 JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange); |
| 2019 } | 2019 } |
| 2020 | 2020 |
| 2021 void test_insert_period() { | 2021 void test_insert_period() { |
| 2022 // "a + b;" | 2022 // "a + b;" |
| 2023 // "a + b.;" | 2023 // "a + b.;" |
| 2024 scan("a + b", "", ".", ";"); | 2024 _scan("a + b", "", ".", ";"); |
| 2025 assertTokens(2, 4, ["a", "+", "b", ".", ";"]); | 2025 _assertTokens(2, 4, ["a", "+", "b", ".", ";"]); |
| 2026 } | 2026 } |
| 2027 | 2027 |
| 2028 void test_insert_period_betweenIdentifiers1() { | 2028 void test_insert_period_betweenIdentifiers1() { |
| 2029 // "a b;" | 2029 // "a b;" |
| 2030 // "a. b;" | 2030 // "a. b;" |
| 2031 scan("a", "", ".", " b;"); | 2031 _scan("a", "", ".", " b;"); |
| 2032 assertTokens(0, 2, ["a", ".", "b", ";"]); | 2032 _assertTokens(0, 2, ["a", ".", "b", ";"]); |
| 2033 JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange); | 2033 JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange); |
| 2034 } | 2034 } |
| 2035 | 2035 |
| 2036 void test_insert_period_betweenIdentifiers2() { | 2036 void test_insert_period_betweenIdentifiers2() { |
| 2037 // "a b;" | 2037 // "a b;" |
| 2038 // "a .b;" | 2038 // "a .b;" |
| 2039 scan("a ", "", ".", "b;"); | 2039 _scan("a ", "", ".", "b;"); |
| 2040 assertTokens(0, 2, ["a", ".", "b", ";"]); | 2040 _assertTokens(0, 2, ["a", ".", "b", ";"]); |
| 2041 } | 2041 } |
| 2042 | 2042 |
| 2043 void test_insert_period_betweenIdentifiers3() { | 2043 void test_insert_period_betweenIdentifiers3() { |
| 2044 // "a b;" | 2044 // "a b;" |
| 2045 // "a . b;" | 2045 // "a . b;" |
| 2046 scan("a ", "", ".", " b;"); | 2046 _scan("a ", "", ".", " b;"); |
| 2047 assertTokens(0, 2, ["a", ".", "b", ";"]); | 2047 _assertTokens(0, 2, ["a", ".", "b", ";"]); |
| 2048 JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange); | 2048 JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange); |
| 2049 } | 2049 } |
| 2050 | 2050 |
| 2051 void test_insert_period_insideExistingIdentifier() { | 2051 void test_insert_period_insideExistingIdentifier() { |
| 2052 // "ab;" | 2052 // "ab;" |
| 2053 // "a.b;" | 2053 // "a.b;" |
| 2054 scan("a", "", ".", "b;"); | 2054 _scan("a", "", ".", "b;"); |
| 2055 assertTokens(-1, 3, ["a", ".", "b", ";"]); | 2055 _assertTokens(-1, 3, ["a", ".", "b", ";"]); |
| 2056 JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange); | 2056 JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange); |
| 2057 } | 2057 } |
| 2058 | 2058 |
| 2059 void test_insert_periodAndIdentifier() { | 2059 void test_insert_periodAndIdentifier() { |
| 2060 // "a + b;" | 2060 // "a + b;" |
| 2061 // "a + b.x;" | 2061 // "a + b.x;" |
| 2062 scan("a + b", "", ".x", ";"); | 2062 _scan("a + b", "", ".x", ";"); |
| 2063 assertTokens(2, 5, ["a", "+", "b", ".", "x", ";"]); | 2063 _assertTokens(2, 5, ["a", "+", "b", ".", "x", ";"]); |
| 2064 } | 2064 } |
| 2065 | 2065 |
| 2066 void test_insert_whitespace_beginning_beforeToken() { | 2066 void test_insert_whitespace_beginning_beforeToken() { |
| 2067 // "a + b;" | 2067 // "a + b;" |
| 2068 // " a + b;" | 2068 // " a + b;" |
| 2069 scan("", "", " ", "a + b;"); | 2069 _scan("", "", " ", "a + b;"); |
| 2070 assertTokens(0, 1, ["a", "+", "b", ";"]); | 2070 _assertTokens(0, 1, ["a", "+", "b", ";"]); |
| 2071 JUnitTestCase.assertFalse(_incrementalScanner.hasNonWhitespaceChange); | 2071 JUnitTestCase.assertFalse(_incrementalScanner.hasNonWhitespaceChange); |
| 2072 } | 2072 } |
| 2073 | 2073 |
| 2074 void test_insert_whitespace_betweenTokens() { | 2074 void test_insert_whitespace_betweenTokens() { |
| 2075 // "a + b;" | 2075 // "a + b;" |
| 2076 // "a + b;" | 2076 // "a + b;" |
| 2077 scan("a ", "", " ", "+ b;"); | 2077 _scan("a ", "", " ", "+ b;"); |
| 2078 assertTokens(1, 2, ["a", "+", "b", ";"]); | 2078 _assertTokens(1, 2, ["a", "+", "b", ";"]); |
| 2079 JUnitTestCase.assertFalse(_incrementalScanner.hasNonWhitespaceChange); | 2079 JUnitTestCase.assertFalse(_incrementalScanner.hasNonWhitespaceChange); |
| 2080 } | 2080 } |
| 2081 | 2081 |
| 2082 void test_insert_whitespace_end_afterToken() { | 2082 void test_insert_whitespace_end_afterToken() { |
| 2083 // "a + b;" | 2083 // "a + b;" |
| 2084 // "a + b; " | 2084 // "a + b; " |
| 2085 scan("a + b;", "", " ", ""); | 2085 _scan("a + b;", "", " ", ""); |
| 2086 assertTokens(3, 4, ["a", "+", "b", ";"]); | 2086 _assertTokens(3, 4, ["a", "+", "b", ";"]); |
| 2087 JUnitTestCase.assertFalse(_incrementalScanner.hasNonWhitespaceChange); | 2087 JUnitTestCase.assertFalse(_incrementalScanner.hasNonWhitespaceChange); |
| 2088 } | 2088 } |
| 2089 | 2089 |
| 2090 void test_insert_whitespace_end_afterWhitespace() { | 2090 void test_insert_whitespace_end_afterWhitespace() { |
| 2091 // "a + b; " | 2091 // "a + b; " |
| 2092 // "a + b; " | 2092 // "a + b; " |
| 2093 scan("a + b; ", "", " ", ""); | 2093 _scan("a + b; ", "", " ", ""); |
| 2094 assertTokens(3, 4, ["a", "+", "b", ";"]); | 2094 _assertTokens(3, 4, ["a", "+", "b", ";"]); |
| 2095 JUnitTestCase.assertFalse(_incrementalScanner.hasNonWhitespaceChange); | 2095 JUnitTestCase.assertFalse(_incrementalScanner.hasNonWhitespaceChange); |
| 2096 } | 2096 } |
| 2097 | 2097 |
| 2098 void test_insert_whitespace_withMultipleComments() { | 2098 void test_insert_whitespace_withMultipleComments() { |
| 2099 // "//comment", "//comment2", "a + b;" | 2099 // "//comment", "//comment2", "a + b;" |
| 2100 // "//comment", "//comment2", "a + b;" | 2100 // "//comment", "//comment2", "a + b;" |
| 2101 scan(EngineTestCase.createSource(["//comment", "//comment2", "a"]), "", " ",
" + b;"); | 2101 _scan(EngineTestCase.createSource(["//comment", "//comment2", "a"]), "", " "
, " + b;"); |
| 2102 assertTokens(1, 2, ["a", "+", "b", ";"]); | 2102 _assertTokens(1, 2, ["a", "+", "b", ";"]); |
| 2103 JUnitTestCase.assertFalse(_incrementalScanner.hasNonWhitespaceChange); | 2103 JUnitTestCase.assertFalse(_incrementalScanner.hasNonWhitespaceChange); |
| 2104 } | 2104 } |
| 2105 | 2105 |
| 2106 void test_replace_identifier_beginning() { | 2106 void test_replace_identifier_beginning() { |
| 2107 // "bell + b;" | 2107 // "bell + b;" |
| 2108 // "fell + b;") | 2108 // "fell + b;") |
| 2109 scan("", "b", "f", "ell + b;"); | 2109 _scan("", "b", "f", "ell + b;"); |
| 2110 assertTokens(-1, 1, ["fell", "+", "b", ";"]); | 2110 _assertTokens(-1, 1, ["fell", "+", "b", ";"]); |
| 2111 JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange); | 2111 JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange); |
| 2112 } | 2112 } |
| 2113 | 2113 |
| 2114 void test_replace_identifier_end() { | 2114 void test_replace_identifier_end() { |
| 2115 // "bell + b;" | 2115 // "bell + b;" |
| 2116 // "belt + b;") | 2116 // "belt + b;") |
| 2117 scan("bel", "l", "t", " + b;"); | 2117 _scan("bel", "l", "t", " + b;"); |
| 2118 assertTokens(-1, 1, ["belt", "+", "b", ";"]); | 2118 _assertTokens(-1, 1, ["belt", "+", "b", ";"]); |
| 2119 JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange); | 2119 JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange); |
| 2120 } | 2120 } |
| 2121 | 2121 |
| 2122 void test_replace_identifier_middle() { | 2122 void test_replace_identifier_middle() { |
| 2123 // "first + b;" | 2123 // "first + b;" |
| 2124 // "frost + b;") | 2124 // "frost + b;") |
| 2125 scan("f", "ir", "ro", "st + b;"); | 2125 _scan("f", "ir", "ro", "st + b;"); |
| 2126 assertTokens(-1, 1, ["frost", "+", "b", ";"]); | 2126 _assertTokens(-1, 1, ["frost", "+", "b", ";"]); |
| 2127 JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange); | 2127 JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange); |
| 2128 } | 2128 } |
| 2129 | 2129 |
| 2130 void test_replace_multiple_partialFirstAndLast() { | 2130 void test_replace_multiple_partialFirstAndLast() { |
| 2131 // "aa + bb;" | 2131 // "aa + bb;" |
| 2132 // "ab * ab;") | 2132 // "ab * ab;") |
| 2133 scan("a", "a + b", "b * a", "b;"); | 2133 _scan("a", "a + b", "b * a", "b;"); |
| 2134 assertTokens(-1, 3, ["ab", "*", "ab", ";"]); | 2134 _assertTokens(-1, 3, ["ab", "*", "ab", ";"]); |
| 2135 JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange); | 2135 JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange); |
| 2136 } | 2136 } |
| 2137 | 2137 |
| 2138 void test_replace_operator_oneForMany() { | 2138 void test_replace_operator_oneForMany() { |
| 2139 // "a + b;" | 2139 // "a + b;" |
| 2140 // "a * c - b;") | 2140 // "a * c - b;") |
| 2141 scan("a ", "+", "* c -", " b;"); | 2141 _scan("a ", "+", "* c -", " b;"); |
| 2142 assertTokens(0, 4, ["a", "*", "c", "-", "b", ";"]); | 2142 _assertTokens(0, 4, ["a", "*", "c", "-", "b", ";"]); |
| 2143 JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange); | 2143 JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange); |
| 2144 } | 2144 } |
| 2145 | 2145 |
| 2146 void test_replace_operator_oneForOne() { | 2146 void test_replace_operator_oneForOne() { |
| 2147 // "a + b;" | 2147 // "a + b;" |
| 2148 // "a * b;") | 2148 // "a * b;") |
| 2149 scan("a ", "+", "*", " b;"); | 2149 _scan("a ", "+", "*", " b;"); |
| 2150 assertTokens(0, 2, ["a", "*", "b", ";"]); | 2150 _assertTokens(0, 2, ["a", "*", "b", ";"]); |
| 2151 JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange); | 2151 JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange); |
| 2152 } | 2152 } |
| 2153 | 2153 |
| 2154 void test_tokenMap() { | 2154 void test_tokenMap() { |
| 2155 // "main() {a + b;}" | 2155 // "main() {a + b;}" |
| 2156 // "main() { a + b;}" | 2156 // "main() { a + b;}" |
| 2157 scan("main() {", "", " ", "a + b;}"); | 2157 _scan("main() {", "", " ", "a + b;}"); |
| 2158 TokenMap tokenMap = _incrementalScanner.tokenMap; | 2158 TokenMap tokenMap = _incrementalScanner.tokenMap; |
| 2159 Token oldToken = _originalTokens; | 2159 Token oldToken = _originalTokens; |
| 2160 while (oldToken.type != TokenType.EOF) { | 2160 while (oldToken.type != TokenType.EOF) { |
| 2161 Token newToken = tokenMap.get(oldToken); | 2161 Token newToken = tokenMap.get(oldToken); |
| 2162 JUnitTestCase.assertNotSame(oldToken, newToken); | 2162 JUnitTestCase.assertNotSame(oldToken, newToken); |
| 2163 JUnitTestCase.assertSame(oldToken.type, newToken.type); | 2163 JUnitTestCase.assertSame(oldToken.type, newToken.type); |
| 2164 JUnitTestCase.assertEquals(oldToken.lexeme, newToken.lexeme); | 2164 JUnitTestCase.assertEquals(oldToken.lexeme, newToken.lexeme); |
| 2165 oldToken = oldToken.next; | 2165 oldToken = oldToken.next; |
| 2166 } | 2166 } |
| 2167 JUnitTestCase.assertFalse(_incrementalScanner.hasNonWhitespaceChange); | 2167 JUnitTestCase.assertFalse(_incrementalScanner.hasNonWhitespaceChange); |
| 2168 } | 2168 } |
| 2169 | 2169 |
| 2170 /** | 2170 /** |
| 2171 * Assert that the token at the given offset was replaced with a new token hav
ing the given | 2171 * Assert that the token at the given offset was replaced with a new token hav
ing the given |
| 2172 * lexeme. | 2172 * lexeme. |
| 2173 * | 2173 * |
| 2174 * @param tokenOffset the offset of the token being tested | 2174 * @param tokenOffset the offset of the token being tested |
| 2175 * @param lexeme the expected lexeme of the new token | 2175 * @param lexeme the expected lexeme of the new token |
| 2176 */ | 2176 */ |
| 2177 void assertReplaced(int tokenOffset, String lexeme) { | 2177 void _assertReplaced(int tokenOffset, String lexeme) { |
| 2178 Token oldToken = _originalTokens; | 2178 Token oldToken = _originalTokens; |
| 2179 for (int i = 0; i < tokenOffset; i++) { | 2179 for (int i = 0; i < tokenOffset; i++) { |
| 2180 oldToken = oldToken.next; | 2180 oldToken = oldToken.next; |
| 2181 } | 2181 } |
| 2182 JUnitTestCase.assertEquals(lexeme, oldToken.lexeme); | 2182 JUnitTestCase.assertEquals(lexeme, oldToken.lexeme); |
| 2183 Token newToken = _incrementalScanner.tokenMap.get(oldToken); | 2183 Token newToken = _incrementalScanner.tokenMap.get(oldToken); |
| 2184 JUnitTestCase.assertNotNull(newToken); | 2184 JUnitTestCase.assertNotNull(newToken); |
| 2185 JUnitTestCase.assertEquals(lexeme, newToken.lexeme); | 2185 JUnitTestCase.assertEquals(lexeme, newToken.lexeme); |
| 2186 JUnitTestCase.assertNotSame(oldToken, newToken); | 2186 JUnitTestCase.assertNotSame(oldToken, newToken); |
| 2187 } | 2187 } |
| 2188 | 2188 |
| 2189 /** | 2189 /** |
| 2190 * Assert that the result of the incremental scan matches the given list of le
xemes and that the | 2190 * Assert that the result of the incremental scan matches the given list of le
xemes and that the |
| 2191 * left and right tokens correspond to the tokens at the given indices. | 2191 * left and right tokens correspond to the tokens at the given indices. |
| 2192 * | 2192 * |
| 2193 * @param leftIndex the expected index of the left token | 2193 * @param leftIndex the expected index of the left token |
| 2194 * @param rightIndex the expected index of the right token | 2194 * @param rightIndex the expected index of the right token |
| 2195 * @param lexemes the expected lexemes of the resulting tokens | 2195 * @param lexemes the expected lexemes of the resulting tokens |
| 2196 */ | 2196 */ |
| 2197 void assertTokens(int leftIndex, int rightIndex, List<String> lexemes) { | 2197 void _assertTokens(int leftIndex, int rightIndex, List<String> lexemes) { |
| 2198 int count = lexemes.length; | 2198 int count = lexemes.length; |
| 2199 JUnitTestCase.assertTrueMsg("Invalid left index", leftIndex >= -1 && leftInd
ex < count); | 2199 JUnitTestCase.assertTrueMsg("Invalid left index", leftIndex >= -1 && leftInd
ex < count); |
| 2200 JUnitTestCase.assertTrueMsg("Invalid right index", rightIndex >= 0 && rightI
ndex <= count); | 2200 JUnitTestCase.assertTrueMsg("Invalid right index", rightIndex >= 0 && rightI
ndex <= count); |
| 2201 Token leftToken = null; | 2201 Token leftToken = null; |
| 2202 Token rightToken = null; | 2202 Token rightToken = null; |
| 2203 Token token = _incrementalTokens; | 2203 Token token = _incrementalTokens; |
| 2204 if (leftIndex < 0) { | 2204 if (leftIndex < 0) { |
| 2205 leftToken = token.previous; | 2205 leftToken = token.previous; |
| 2206 } | 2206 } |
| 2207 for (int i = 0; i < count; i++) { | 2207 for (int i = 0; i < count; i++) { |
| (...skipping 23 matching lines...) Expand all Loading... |
| 2231 /** | 2231 /** |
| 2232 * Given a description of the original and modified contents, perform an incre
mental scan of the | 2232 * Given a description of the original and modified contents, perform an incre
mental scan of the |
| 2233 * two pieces of text. Verify that the incremental scan produced the same toke
ns as those that | 2233 * two pieces of text. Verify that the incremental scan produced the same toke
ns as those that |
| 2234 * would be produced by a full scan of the new contents. | 2234 * would be produced by a full scan of the new contents. |
| 2235 * | 2235 * |
| 2236 * @param prefix the unchanged text before the edit region | 2236 * @param prefix the unchanged text before the edit region |
| 2237 * @param removed the text that was removed from the original contents | 2237 * @param removed the text that was removed from the original contents |
| 2238 * @param added the text that was added to the modified contents | 2238 * @param added the text that was added to the modified contents |
| 2239 * @param suffix the unchanged text after the edit region | 2239 * @param suffix the unchanged text after the edit region |
| 2240 */ | 2240 */ |
| 2241 void scan(String prefix, String removed, String added, String suffix) { | 2241 void _scan(String prefix, String removed, String added, String suffix) { |
| 2242 // | 2242 // |
| 2243 // Compute the information needed to perform the test. | 2243 // Compute the information needed to perform the test. |
| 2244 // | 2244 // |
| 2245 String originalContents = "${prefix}${removed}${suffix}"; | 2245 String originalContents = "${prefix}${removed}${suffix}"; |
| 2246 String modifiedContents = "${prefix}${added}${suffix}"; | 2246 String modifiedContents = "${prefix}${added}${suffix}"; |
| 2247 int replaceStart = prefix.length; | 2247 int replaceStart = prefix.length; |
| 2248 Source source = new TestSource(); | 2248 Source source = new TestSource(); |
| 2249 // | 2249 // |
| 2250 // Scan the original contents. | 2250 // Scan the original contents. |
| 2251 // | 2251 // |
| (...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2414 } | 2414 } |
| 2415 } | 2415 } |
| 2416 | 2416 |
| 2417 main() { | 2417 main() { |
| 2418 CharSequenceReaderTest.dartSuite(); | 2418 CharSequenceReaderTest.dartSuite(); |
| 2419 IncrementalScannerTest.dartSuite(); | 2419 IncrementalScannerTest.dartSuite(); |
| 2420 KeywordStateTest.dartSuite(); | 2420 KeywordStateTest.dartSuite(); |
| 2421 ScannerTest.dartSuite(); | 2421 ScannerTest.dartSuite(); |
| 2422 TokenTypeTest.dartSuite(); | 2422 TokenTypeTest.dartSuite(); |
| 2423 } | 2423 } |
| OLD | NEW |