| OLD | NEW |
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, 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 #include "platform/assert.h" | 5 #include "platform/assert.h" |
| 6 #include "vm/os.h" | 6 #include "vm/os.h" |
| 7 #include "vm/scanner.h" | 7 #include "vm/scanner.h" |
| 8 #include "vm/token.h" | 8 #include "vm/token.h" |
| 9 #include "vm/unit_test.h" | 9 #include "vm/unit_test.h" |
| 10 | 10 |
| (...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 115 CheckKind(tokens, 3, Token::kINCR); | 115 CheckKind(tokens, 3, Token::kINCR); |
| 116 CheckKind(tokens, 4, Token::kSEMICOLON); | 116 CheckKind(tokens, 4, Token::kSEMICOLON); |
| 117 } | 117 } |
| 118 | 118 |
| 119 | 119 |
| 120 void CommentTest() { | 120 void CommentTest() { |
| 121 const Scanner::GrowableTokenStream& tokens = | 121 const Scanner::GrowableTokenStream& tokens = |
| 122 Scan("Foo( /*block \n" | 122 Scan("Foo( /*block \n" |
| 123 "comment*/ 0xff) // line comment;"); | 123 "comment*/ 0xff) // line comment;"); |
| 124 | 124 |
| 125 CheckNumTokens(tokens, 5); | 125 CheckNumTokens(tokens, 6); |
| 126 CheckIdent(tokens, 0, "Foo"); | 126 CheckIdent(tokens, 0, "Foo"); |
| 127 CheckLineNumber(tokens, 0, 1); | 127 CheckLineNumber(tokens, 0, 1); |
| 128 CheckKind(tokens, 1, Token::kLPAREN); | 128 CheckKind(tokens, 1, Token::kLPAREN); |
| 129 CheckInteger(tokens, 2, "0xff"); | 129 CheckKind(tokens, 2, Token::kNEWLINE); |
| 130 CheckKind(tokens, 3, Token::kRPAREN); | 130 CheckInteger(tokens, 3, "0xff"); |
| 131 CheckLineNumber(tokens, 3, 2); | 131 CheckKind(tokens, 4, Token::kRPAREN); |
| 132 CheckLineNumber(tokens, 4, 2); |
| 132 } | 133 } |
| 133 | 134 |
| 134 | 135 |
| 135 void GreedIsGood() { | 136 void GreedIsGood() { |
| 136 // means i++ + j | 137 // means i++ + j |
| 137 const Scanner::GrowableTokenStream& tokens = Scan("x=i+++j"); | 138 const Scanner::GrowableTokenStream& tokens = Scan("x=i+++j"); |
| 138 | 139 |
| 139 CheckNumTokens(tokens, 7); | 140 CheckNumTokens(tokens, 7); |
| 140 CheckIdent(tokens, 0, "x"); | 141 CheckIdent(tokens, 0, "x"); |
| 141 CheckKind(tokens, 1, Token::kASSIGN); | 142 CheckKind(tokens, 1, Token::kASSIGN); |
| (...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 263 EXPECT_EQ('\\', litchars[4]); | 264 EXPECT_EQ('\\', litchars[4]); |
| 264 } | 265 } |
| 265 | 266 |
| 266 | 267 |
| 267 void MultilineString() { | 268 void MultilineString() { |
| 268 // |mls = ''' | 269 // |mls = ''' |
| 269 // |1' x | 270 // |1' x |
| 270 // |2'''; | 271 // |2'''; |
| 271 const Scanner::GrowableTokenStream& tokens = Scan("mls = '''\n1' x\n2''';"); | 272 const Scanner::GrowableTokenStream& tokens = Scan("mls = '''\n1' x\n2''';"); |
| 272 | 273 |
| 273 EXPECT_EQ(5, tokens.length()); | 274 EXPECT_EQ(7, tokens.length()); |
| 274 CheckIdent(tokens, 0, "mls"); | 275 CheckIdent(tokens, 0, "mls"); |
| 275 CheckKind(tokens, 1, Token::kASSIGN); | 276 CheckKind(tokens, 1, Token::kASSIGN); |
| 276 CheckKind(tokens, 2, Token::kSTRING); | 277 CheckKind(tokens, 2, Token::kSTRING); |
| 277 CheckKind(tokens, 3, Token::kSEMICOLON); | 278 CheckKind(tokens, 3, Token::kNEWLINE); |
| 278 CheckKind(tokens, 4, Token::kEOS); | 279 CheckKind(tokens, 4, Token::kNEWLINE); |
| 280 CheckKind(tokens, 5, Token::kSEMICOLON); |
| 281 CheckKind(tokens, 6, Token::kEOS); |
| 279 CheckLineNumber(tokens, 0, 1); | 282 CheckLineNumber(tokens, 0, 1); |
| 280 CheckLineNumber(tokens, 4, 3); // Semicolon is on line 3. | 283 CheckLineNumber(tokens, 5, 3); // Semicolon is on line 3. |
| 281 const char* litchars = (tokens)[2].literal->ToCString(); | 284 const char* litchars = (tokens)[2].literal->ToCString(); |
| 282 EXPECT_EQ(6, (tokens)[2].literal->Length()); | 285 EXPECT_EQ(6, (tokens)[2].literal->Length()); |
| 283 | 286 |
| 284 EXPECT_EQ('1', litchars[0]); // First newline is dropped. | 287 EXPECT_EQ('1', litchars[0]); // First newline is dropped. |
| 285 EXPECT_EQ('\'', litchars[1]); | 288 EXPECT_EQ('\'', litchars[1]); |
| 286 EXPECT_EQ(' ', litchars[2]); | 289 EXPECT_EQ(' ', litchars[2]); |
| 287 EXPECT_EQ('x', litchars[3]); | 290 EXPECT_EQ('x', litchars[3]); |
| 288 EXPECT_EQ('\n', litchars[4]); | 291 EXPECT_EQ('\n', litchars[4]); |
| 289 EXPECT_EQ('2', litchars[5]); | 292 EXPECT_EQ('2', litchars[5]); |
| 290 } | 293 } |
| (...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 422 EXPECT_EQ(3, first_token_index); | 425 EXPECT_EQ(3, first_token_index); |
| 423 EXPECT_EQ(8, last_token_index); | 426 EXPECT_EQ(8, last_token_index); |
| 424 scanner.TokenRangeAtLine(100, &first_token_index, &last_token_index); | 427 scanner.TokenRangeAtLine(100, &first_token_index, &last_token_index); |
| 425 EXPECT(first_token_index < 0); | 428 EXPECT(first_token_index < 0); |
| 426 scanner.TokenRangeAtLine(1, &first_token_index, &last_token_index); | 429 scanner.TokenRangeAtLine(1, &first_token_index, &last_token_index); |
| 427 EXPECT_EQ(0, first_token_index); | 430 EXPECT_EQ(0, first_token_index); |
| 428 EXPECT(last_token_index < 0); | 431 EXPECT(last_token_index < 0); |
| 429 } | 432 } |
| 430 | 433 |
| 431 | 434 |
| 435 void NewlinesTest() { |
| 436 const char* source = |
| 437 "var es = /* a\n" |
| 438 " b\n" |
| 439 " */ \"\"\"\n" |
| 440 "c\n" |
| 441 "d\n" |
| 442 "\"\"\";"; |
| 443 |
| 444 const Scanner::GrowableTokenStream& tokens = Scan(source); |
| 445 |
| 446 EXPECT_EQ(11, tokens.length()); |
| 447 CheckKind(tokens, 0, Token::kVAR); |
| 448 CheckIdent(tokens, 1, "es"); |
| 449 CheckKind(tokens, 2, Token::kASSIGN); |
| 450 CheckKind(tokens, 3, Token::kNEWLINE); |
| 451 CheckKind(tokens, 4, Token::kNEWLINE); |
| 452 CheckKind(tokens, 5, Token::kSTRING); |
| 453 CheckKind(tokens, 6, Token::kNEWLINE); |
| 454 CheckKind(tokens, 7, Token::kNEWLINE); |
| 455 CheckKind(tokens, 8, Token::kNEWLINE); |
| 456 CheckKind(tokens, 9, Token::kSEMICOLON); |
| 457 CheckKind(tokens, 10, Token::kEOS); |
| 458 |
| 459 EXPECT_EQ(4, (tokens)[5].literal->Length()); |
| 460 const char* litchars = (tokens)[5].literal->ToCString(); |
| 461 EXPECT_EQ('c', litchars[0]); // First newline is dropped. |
| 462 EXPECT_EQ('\n', litchars[1]); |
| 463 EXPECT_EQ('d', litchars[2]); |
| 464 EXPECT_EQ('\n', litchars[3]); |
| 465 } |
| 466 |
| 467 |
| 432 TEST_CASE(Scanner_Test) { | 468 TEST_CASE(Scanner_Test) { |
| 433 ScanLargeText(); | 469 ScanLargeText(); |
| 434 | 470 |
| 435 BoringTest(); | 471 BoringTest(); |
| 436 CommentTest(); | 472 CommentTest(); |
| 437 GreedIsGood(); | 473 GreedIsGood(); |
| 438 StringEscapes(); | 474 StringEscapes(); |
| 439 InvalidStringEscapes(); | 475 InvalidStringEscapes(); |
| 440 RawString(); | 476 RawString(); |
| 441 MultilineString(); | 477 MultilineString(); |
| 442 EmptyString(); | 478 EmptyString(); |
| 443 EmptyMultilineString(); | 479 EmptyMultilineString(); |
| 444 NumberLiteral(); | 480 NumberLiteral(); |
| 445 InvalidText(); | 481 InvalidText(); |
| 446 FindLineTest(); | 482 FindLineTest(); |
| 483 NewlinesTest(); |
| 447 } | 484 } |
| 448 | 485 |
| 449 } // namespace dart | 486 } // namespace dart |
| OLD | NEW |