OLD | NEW |
1 /// Additional feature tests that aren't based on test data. | 1 /// Additional feature tests that aren't based on test data. |
2 library parser_feature_test; | 2 library parser_feature_test; |
3 | 3 |
4 import 'package:unittest/unittest.dart'; | 4 import 'package:unittest/unittest.dart'; |
5 import 'package:html/dom.dart'; | 5 import 'package:html/dom.dart'; |
6 import 'package:html/parser.dart'; | 6 import 'package:html/parser.dart'; |
7 import 'package:html/src/constants.dart'; | 7 import 'package:html/src/constants.dart'; |
8 import 'package:html/src/encoding_parser.dart'; | 8 import 'package:html/src/encoding_parser.dart'; |
9 import 'package:html/src/treebuilder.dart'; | 9 import 'package:html/src/treebuilder.dart'; |
| 10 import 'package:source_span/source_span.dart'; |
10 | 11 |
11 main() { | 12 main() { |
| 13 _testElementSpans(); |
12 test('doctype is cloneable', () { | 14 test('doctype is cloneable', () { |
13 var doc = parse('<!doctype HTML>'); | 15 var doc = parse('<!doctype HTML>'); |
14 DocumentType doctype = doc.nodes[0]; | 16 DocumentType doctype = doc.nodes[0]; |
15 expect(doctype.clone(false).toString(), '<!DOCTYPE html>'); | 17 expect(doctype.clone(false).toString(), '<!DOCTYPE html>'); |
16 }); | 18 }); |
17 | 19 |
18 test('line counter', () { | 20 test('line counter', () { |
19 // http://groups.google.com/group/html5lib-discuss/browse_frm/thread/f4f00e4
a2f26d5c0 | 21 // http://groups.google.com/group/html5lib-discuss/browse_frm/thread/f4f00e4
a2f26d5c0 |
20 var doc = parse("<pre>\nx\n>\n</pre>"); | 22 var doc = parse("<pre>\nx\n>\n</pre>"); |
21 expect(doc.body.innerHtml, "<pre>x\n>\n</pre>"); | 23 expect(doc.body.innerHtml, "<pre>x\n>\n</pre>"); |
(...skipping 303 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
325 test('stops if no match', () { | 327 test('stops if no match', () { |
326 // missing closing tag | 328 // missing closing tag |
327 expect(getEncoding('<meta charset="utf-16"'), null); | 329 expect(getEncoding('<meta charset="utf-16"'), null); |
328 }); | 330 }); |
329 | 331 |
330 test('ignores whitespace', () { | 332 test('ignores whitespace', () { |
331 expect(getEncoding(' <meta charset="utf-16">'), 'utf-16'); | 333 expect(getEncoding(' <meta charset="utf-16">'), 'utf-16'); |
332 }); | 334 }); |
333 }); | 335 }); |
334 } | 336 } |
| 337 |
| 338 _testElementSpans() { |
| 339 assertSpan(SourceSpan span, int offset, int end, String text) { |
| 340 expect(span, isNotNull); |
| 341 expect(span.start.offset, offset); |
| 342 expect(span.end.offset, end); |
| 343 expect(span.text, text); |
| 344 } |
| 345 |
| 346 group('element spans', () { |
| 347 test('html and body', () { |
| 348 var text = '<html><body>123</body></html>'; |
| 349 var doc = parse(text, generateSpans: true); |
| 350 { |
| 351 var elem = doc.querySelector('html'); |
| 352 assertSpan(elem.sourceSpan, 0, 6, '<html>'); |
| 353 assertSpan(elem.endSourceSpan, 22, 29, '</html>'); |
| 354 } |
| 355 { |
| 356 var elem = doc.querySelector('body'); |
| 357 assertSpan(elem.sourceSpan, 6, 12, '<body>'); |
| 358 assertSpan(elem.endSourceSpan, 15, 22, '</body>'); |
| 359 } |
| 360 }); |
| 361 |
| 362 test('normal', () { |
| 363 var text = '<div><element><span></span></element></div>'; |
| 364 var doc = parse(text, generateSpans: true); |
| 365 var elem = doc.querySelector('element'); |
| 366 assertSpan(elem.sourceSpan, 5, 14, '<element>'); |
| 367 assertSpan(elem.endSourceSpan, 27, 37, '</element>'); |
| 368 }); |
| 369 |
| 370 test('block', () { |
| 371 var text = '<div>123</div>'; |
| 372 var doc = parse(text, generateSpans: true); |
| 373 var elem = doc.querySelector('div'); |
| 374 assertSpan(elem.sourceSpan, 0, 5, '<div>'); |
| 375 assertSpan(elem.endSourceSpan, 8, 14, '</div>'); |
| 376 }); |
| 377 |
| 378 test('form', () { |
| 379 var text = '<form>123</form>'; |
| 380 var doc = parse(text, generateSpans: true); |
| 381 var elem = doc.querySelector('form'); |
| 382 assertSpan(elem.sourceSpan, 0, 6, '<form>'); |
| 383 assertSpan(elem.endSourceSpan, 9, 16, '</form>'); |
| 384 }); |
| 385 |
| 386 test('p explicit end', () { |
| 387 var text = '<p>123</p>'; |
| 388 var doc = parse(text, generateSpans: true); |
| 389 var elem = doc.querySelector('p'); |
| 390 assertSpan(elem.sourceSpan, 0, 3, '<p>'); |
| 391 assertSpan(elem.endSourceSpan, 6, 10, '</p>'); |
| 392 }); |
| 393 |
| 394 test('p implicit end', () { |
| 395 var text = '<div><p>123<p>456</div>'; |
| 396 var doc = parse(text, generateSpans: true); |
| 397 var elem = doc.querySelector('p'); |
| 398 assertSpan(elem.sourceSpan, 5, 8, '<p>'); |
| 399 expect(elem.endSourceSpan, isNull); |
| 400 }); |
| 401 |
| 402 test('li', () { |
| 403 var text = '<li>123</li>'; |
| 404 var doc = parse(text, generateSpans: true); |
| 405 var elem = doc.querySelector('li'); |
| 406 assertSpan(elem.sourceSpan, 0, 4, '<li>'); |
| 407 assertSpan(elem.endSourceSpan, 7, 12, '</li>'); |
| 408 }); |
| 409 |
| 410 test('heading', () { |
| 411 var text = '<h1>123</h1>'; |
| 412 var doc = parse(text, generateSpans: true); |
| 413 var elem = doc.querySelector('h1'); |
| 414 assertSpan(elem.sourceSpan, 0, 4, '<h1>'); |
| 415 assertSpan(elem.endSourceSpan, 7, 12, '</h1>'); |
| 416 }); |
| 417 |
| 418 test('formatting', () { |
| 419 var text = '<b>123</b>'; |
| 420 var doc = parse(text, generateSpans: true); |
| 421 var elem = doc.querySelector('b'); |
| 422 assertSpan(elem.sourceSpan, 0, 3, '<b>'); |
| 423 assertSpan(elem.endSourceSpan, 6, 10, '</b>'); |
| 424 }); |
| 425 |
| 426 test('table tbody', () { |
| 427 var text = '<table><tbody> </tbody></table>'; |
| 428 var doc = parse(text, generateSpans: true); |
| 429 { |
| 430 var elem = doc.querySelector('tbody'); |
| 431 assertSpan(elem.sourceSpan, 7, 14, '<tbody>'); |
| 432 assertSpan(elem.endSourceSpan, 16, 24, '</tbody>'); |
| 433 } |
| 434 }); |
| 435 |
| 436 test('table tr td', () { |
| 437 var text = '<table><tr><td>123</td></tr></table>'; |
| 438 var doc = parse(text, generateSpans: true); |
| 439 { |
| 440 var elem = doc.querySelector('table'); |
| 441 assertSpan(elem.sourceSpan, 0, 7, '<table>'); |
| 442 assertSpan(elem.endSourceSpan, 28, 36, '</table>'); |
| 443 } |
| 444 { |
| 445 var elem = doc.querySelector('tr'); |
| 446 assertSpan(elem.sourceSpan, 7, 11, '<tr>'); |
| 447 assertSpan(elem.endSourceSpan, 23, 28, '</tr>'); |
| 448 } |
| 449 { |
| 450 var elem = doc.querySelector('td'); |
| 451 assertSpan(elem.sourceSpan, 11, 15, '<td>'); |
| 452 assertSpan(elem.endSourceSpan, 18, 23, '</td>'); |
| 453 } |
| 454 }); |
| 455 |
| 456 test('select optgroup option', () { |
| 457 var text = '<select><optgroup><option>123</option></optgroup></select>'; |
| 458 var doc = parse(text, generateSpans: true); |
| 459 { |
| 460 var elem = doc.querySelector('select'); |
| 461 assertSpan(elem.sourceSpan, 0, 8, '<select>'); |
| 462 assertSpan(elem.endSourceSpan, 49, 58, '</select>'); |
| 463 } |
| 464 { |
| 465 var elem = doc.querySelector('optgroup'); |
| 466 assertSpan(elem.sourceSpan, 8, 18, '<optgroup>'); |
| 467 assertSpan(elem.endSourceSpan, 38, 49, '</optgroup>'); |
| 468 } |
| 469 { |
| 470 var elem = doc.querySelector('option'); |
| 471 assertSpan(elem.sourceSpan, 18, 26, '<option>'); |
| 472 assertSpan(elem.endSourceSpan, 29, 38, '</option>'); |
| 473 } |
| 474 }); |
| 475 }); |
| 476 } |
OLD | NEW |