| Index: test/parser_feature_test.dart
|
| diff --git a/test/parser_feature_test.dart b/test/parser_feature_test.dart
|
| index 568819b5e885143dbd68f5f6ec160d0619acf704..54d68a945845ac4d4d03f87f991fc5c713ad3d79 100644
|
| --- a/test/parser_feature_test.dart
|
| +++ b/test/parser_feature_test.dart
|
| @@ -7,8 +7,10 @@ import 'package:html/parser.dart';
|
| import 'package:html/src/constants.dart';
|
| import 'package:html/src/encoding_parser.dart';
|
| import 'package:html/src/treebuilder.dart';
|
| +import 'package:source_span/source_span.dart';
|
|
|
| main() {
|
| + _testElementSpans();
|
| test('doctype is cloneable', () {
|
| var doc = parse('<!doctype HTML>');
|
| DocumentType doctype = doc.nodes[0];
|
| @@ -332,3 +334,143 @@ On line 4, column 3 of ParseError: Unexpected DOCTYPE. Ignored.
|
| });
|
| });
|
| }
|
| +
|
| +_testElementSpans() {
|
| + assertSpan(SourceSpan span, int offset, int end, String text) {
|
| + expect(span, isNotNull);
|
| + expect(span.start.offset, offset);
|
| + expect(span.end.offset, end);
|
| + expect(span.text, text);
|
| + }
|
| +
|
| + group('element spans', () {
|
| + test('html and body', () {
|
| + var text = '<html><body>123</body></html>';
|
| + var doc = parse(text, generateSpans: true);
|
| + {
|
| + var elem = doc.querySelector('html');
|
| + assertSpan(elem.sourceSpan, 0, 6, '<html>');
|
| + assertSpan(elem.endSourceSpan, 22, 29, '</html>');
|
| + }
|
| + {
|
| + var elem = doc.querySelector('body');
|
| + assertSpan(elem.sourceSpan, 6, 12, '<body>');
|
| + assertSpan(elem.endSourceSpan, 15, 22, '</body>');
|
| + }
|
| + });
|
| +
|
| + test('normal', () {
|
| + var text = '<div><element><span></span></element></div>';
|
| + var doc = parse(text, generateSpans: true);
|
| + var elem = doc.querySelector('element');
|
| + assertSpan(elem.sourceSpan, 5, 14, '<element>');
|
| + assertSpan(elem.endSourceSpan, 27, 37, '</element>');
|
| + });
|
| +
|
| + test('block', () {
|
| + var text = '<div>123</div>';
|
| + var doc = parse(text, generateSpans: true);
|
| + var elem = doc.querySelector('div');
|
| + assertSpan(elem.sourceSpan, 0, 5, '<div>');
|
| + assertSpan(elem.endSourceSpan, 8, 14, '</div>');
|
| + });
|
| +
|
| + test('form', () {
|
| + var text = '<form>123</form>';
|
| + var doc = parse(text, generateSpans: true);
|
| + var elem = doc.querySelector('form');
|
| + assertSpan(elem.sourceSpan, 0, 6, '<form>');
|
| + assertSpan(elem.endSourceSpan, 9, 16, '</form>');
|
| + });
|
| +
|
| + test('p explicit end', () {
|
| + var text = '<p>123</p>';
|
| + var doc = parse(text, generateSpans: true);
|
| + var elem = doc.querySelector('p');
|
| + assertSpan(elem.sourceSpan, 0, 3, '<p>');
|
| + assertSpan(elem.endSourceSpan, 6, 10, '</p>');
|
| + });
|
| +
|
| + test('p implicit end', () {
|
| + var text = '<div><p>123<p>456</div>';
|
| + var doc = parse(text, generateSpans: true);
|
| + var elem = doc.querySelector('p');
|
| + assertSpan(elem.sourceSpan, 5, 8, '<p>');
|
| + expect(elem.endSourceSpan, isNull);
|
| + });
|
| +
|
| + test('li', () {
|
| + var text = '<li>123</li>';
|
| + var doc = parse(text, generateSpans: true);
|
| + var elem = doc.querySelector('li');
|
| + assertSpan(elem.sourceSpan, 0, 4, '<li>');
|
| + assertSpan(elem.endSourceSpan, 7, 12, '</li>');
|
| + });
|
| +
|
| + test('heading', () {
|
| + var text = '<h1>123</h1>';
|
| + var doc = parse(text, generateSpans: true);
|
| + var elem = doc.querySelector('h1');
|
| + assertSpan(elem.sourceSpan, 0, 4, '<h1>');
|
| + assertSpan(elem.endSourceSpan, 7, 12, '</h1>');
|
| + });
|
| +
|
| + test('formatting', () {
|
| + var text = '<b>123</b>';
|
| + var doc = parse(text, generateSpans: true);
|
| + var elem = doc.querySelector('b');
|
| + assertSpan(elem.sourceSpan, 0, 3, '<b>');
|
| + assertSpan(elem.endSourceSpan, 6, 10, '</b>');
|
| + });
|
| +
|
| + test('table tbody', () {
|
| + var text = '<table><tbody> </tbody></table>';
|
| + var doc = parse(text, generateSpans: true);
|
| + {
|
| + var elem = doc.querySelector('tbody');
|
| + assertSpan(elem.sourceSpan, 7, 14, '<tbody>');
|
| + assertSpan(elem.endSourceSpan, 16, 24, '</tbody>');
|
| + }
|
| + });
|
| +
|
| + test('table tr td', () {
|
| + var text = '<table><tr><td>123</td></tr></table>';
|
| + var doc = parse(text, generateSpans: true);
|
| + {
|
| + var elem = doc.querySelector('table');
|
| + assertSpan(elem.sourceSpan, 0, 7, '<table>');
|
| + assertSpan(elem.endSourceSpan, 28, 36, '</table>');
|
| + }
|
| + {
|
| + var elem = doc.querySelector('tr');
|
| + assertSpan(elem.sourceSpan, 7, 11, '<tr>');
|
| + assertSpan(elem.endSourceSpan, 23, 28, '</tr>');
|
| + }
|
| + {
|
| + var elem = doc.querySelector('td');
|
| + assertSpan(elem.sourceSpan, 11, 15, '<td>');
|
| + assertSpan(elem.endSourceSpan, 18, 23, '</td>');
|
| + }
|
| + });
|
| +
|
| + test('select optgroup option', () {
|
| + var text = '<select><optgroup><option>123</option></optgroup></select>';
|
| + var doc = parse(text, generateSpans: true);
|
| + {
|
| + var elem = doc.querySelector('select');
|
| + assertSpan(elem.sourceSpan, 0, 8, '<select>');
|
| + assertSpan(elem.endSourceSpan, 49, 58, '</select>');
|
| + }
|
| + {
|
| + var elem = doc.querySelector('optgroup');
|
| + assertSpan(elem.sourceSpan, 8, 18, '<optgroup>');
|
| + assertSpan(elem.endSourceSpan, 38, 49, '</optgroup>');
|
| + }
|
| + {
|
| + var elem = doc.querySelector('option');
|
| + assertSpan(elem.sourceSpan, 18, 26, '<option>');
|
| + assertSpan(elem.endSourceSpan, 29, 38, '</option>');
|
| + }
|
| + });
|
| + });
|
| +}
|
|
|