Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(264)

Side by Side Diff: runtime/vm/scanner_test.cc

Issue 23452043: Introduce newline tokens into the token stream. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 7 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
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
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
OLDNEW
« runtime/vm/scanner.cc ('K') | « runtime/vm/scanner.cc ('k') | runtime/vm/token.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698