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:html5lib/dom.dart'; | 5 import 'package:html5lib/dom.dart'; |
6 import 'package:html5lib/parser.dart'; | 6 import 'package:html5lib/parser.dart'; |
7 import 'package:html5lib/src/constants.dart'; | 7 import 'package:html5lib/src/constants.dart'; |
8 import 'package:html5lib/src/treebuilder.dart'; | 8 import 'package:html5lib/src/treebuilder.dart'; |
9 | 9 |
10 main() { | 10 main() { |
11 test('doctype is cloneable', () { | 11 test('doctype is cloneable', () { |
12 var doc = parse('<!DOCTYPE HTML>'); | 12 var doc = parse('<!doctype HTML>'); |
13 DocumentType doctype = doc.nodes[0]; | 13 DocumentType doctype = doc.nodes[0]; |
14 expect(doctype.clone().outerHtml, '<!DOCTYPE html>'); | 14 expect(doctype.clone().toString(), '<!DOCTYPE html>'); |
15 }); | 15 }); |
16 | 16 |
17 test('line counter', () { | 17 test('line counter', () { |
18 // http://groups.google.com/group/html5lib-discuss/browse_frm/thread/f4f00e4
a2f26d5c0 | 18 // http://groups.google.com/group/html5lib-discuss/browse_frm/thread/f4f00e4
a2f26d5c0 |
19 var doc = parse("<pre>\nx\n>\n</pre>"); | 19 var doc = parse("<pre>\nx\n>\n</pre>"); |
20 expect(doc.body.innerHtml, "<pre>x\n>\n</pre>"); | 20 expect(doc.body.innerHtml, "<pre>x\n>\n</pre>"); |
21 }); | 21 }); |
22 | 22 |
23 test('namespace html elements on', () { | 23 test('namespace html elements on', () { |
24 var doc = new HtmlParser('', tree: new TreeBuilder(true)).parse(); | 24 var doc = new HtmlParser('', tree: new TreeBuilder(true)).parse(); |
25 expect(doc.nodes[0].namespace, Namespaces.html); | 25 expect(doc.nodes[0].namespaceUri, Namespaces.html); |
26 }); | 26 }); |
27 | 27 |
28 test('namespace html elements off', () { | 28 test('namespace html elements off', () { |
29 var doc = new HtmlParser('', tree: new TreeBuilder(false)).parse(); | 29 var doc = new HtmlParser('', tree: new TreeBuilder(false)).parse(); |
30 expect(doc.nodes[0].namespace, null); | 30 expect(doc.nodes[0].namespaceUri, null); |
31 }); | 31 }); |
32 | 32 |
33 test('parse error spans - full', () { | 33 test('parse error spans - full', () { |
34 var parser = new HtmlParser(''' | 34 var parser = new HtmlParser(''' |
35 <!DOCTYPE html> | 35 <!DOCTYPE html> |
36 <html> | 36 <html> |
37 <body> | 37 <body> |
38 <!DOCTYPE html> | 38 <!DOCTYPE html> |
39 </body> | 39 </body> |
40 </html> | 40 </html> |
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
149 doc = parse('<body><script></script></body>'); | 149 doc = parse('<body><script></script></body>'); |
150 expect(doc.body.innerHtml, '<script></script>'); | 150 expect(doc.body.innerHtml, '<script></script>'); |
151 doc = parse('<br>'); | 151 doc = parse('<br>'); |
152 expect(doc.body.innerHtml, '<br>'); | 152 expect(doc.body.innerHtml, '<br>'); |
153 doc = parse('<br><foo><bar>'); | 153 doc = parse('<br><foo><bar>'); |
154 expect(doc.body.innerHtml, '<br><foo><bar></bar></foo>'); | 154 expect(doc.body.innerHtml, '<br><foo><bar></bar></foo>'); |
155 }); | 155 }); |
156 | 156 |
157 test('empty document has html, body, and head', () { | 157 test('empty document has html, body, and head', () { |
158 var doc = parse(''); | 158 var doc = parse(''); |
159 expect(doc.outerHtml, '<html><head></head><body></body></html>'); | 159 var html = '<html><head></head><body></body></html>'; |
| 160 expect(doc.outerHtml, html); |
| 161 expect(doc.documentElement.outerHtml, html); |
160 expect(doc.head.outerHtml, '<head></head>'); | 162 expect(doc.head.outerHtml, '<head></head>'); |
161 expect(doc.body.outerHtml, '<body></body>'); | 163 expect(doc.body.outerHtml, '<body></body>'); |
162 }); | 164 }); |
163 | 165 |
164 test('strange table case', () { | 166 test('strange table case', () { |
165 var doc = parseFragment('<table><tbody><foo>'); | 167 var doc = parse('<table><tbody><foo>').body; |
166 expect(doc.outerHtml, '<foo></foo><table><tbody></tbody></table>'); | 168 expect(doc.innerHtml, '<foo></foo><table><tbody></tbody></table>'); |
167 }); | 169 }); |
168 | 170 |
169 group('html serialization', () { | 171 group('html serialization', () { |
170 test('attribute order', () { | 172 test('attribute order', () { |
171 // Note: the spec only requires a stable order. | 173 // Note: the spec only requires a stable order. |
172 // However, we preserve the input order via LinkedHashMap | 174 // However, we preserve the input order via LinkedHashMap |
173 var doc = parseFragment('<foo d=1 a=2 c=3 b=4>'); | 175 var body = parse('<foo d=1 a=2 c=3 b=4>').body; |
174 expect(doc.outerHtml, '<foo d="1" a="2" c="3" b="4"></foo>'); | 176 expect(body.innerHtml, '<foo d="1" a="2" c="3" b="4"></foo>'); |
175 expect(doc.querySelector('foo').attributes.remove('a'), '2'); | 177 expect(body.querySelector('foo').attributes.remove('a'), '2'); |
176 expect(doc.outerHtml, '<foo d="1" c="3" b="4"></foo>'); | 178 expect(body.innerHtml, '<foo d="1" c="3" b="4"></foo>'); |
177 doc.querySelector('foo').attributes['a'] = '0'; | 179 body.querySelector('foo').attributes['a'] = '0'; |
178 expect(doc.outerHtml, '<foo d="1" c="3" b="4" a="0"></foo>'); | 180 expect(body.innerHtml, '<foo d="1" c="3" b="4" a="0"></foo>'); |
179 }); | 181 }); |
180 | 182 |
181 test('escaping Text node in <script>', () { | 183 test('escaping Text node in <script>', () { |
182 var doc = parseFragment('<script>a && b</script>'); | 184 Element e = parseFragment('<script>a && b</script>').firstChild; |
183 expect(doc.outerHtml, '<script>a && b</script>'); | 185 expect(e.outerHtml, '<script>a && b</script>'); |
184 }); | 186 }); |
185 | 187 |
186 test('escaping Text node in <span>', () { | 188 test('escaping Text node in <span>', () { |
187 var doc = parseFragment('<span>a && b</span>'); | 189 Element e = parseFragment('<span>a && b</span>').firstChild; |
188 expect(doc.outerHtml, '<span>a && b</span>'); | 190 expect(e.outerHtml, '<span>a && b</span>'); |
189 }); | 191 }); |
190 | 192 |
191 test('Escaping attributes', () { | 193 test('Escaping attributes', () { |
192 var doc = parseFragment('<div class="a<b>">'); | 194 Element e = parseFragment('<div class="a<b>">').firstChild; |
193 expect(doc.outerHtml, '<div class="a<b>"></div>'); | 195 expect(e.outerHtml, '<div class="a<b>"></div>'); |
194 doc = parseFragment('<div class=\'a"b\'>'); | 196 e = parseFragment('<div class=\'a"b\'>').firstChild; |
195 expect(doc.outerHtml, '<div class="a"b"></div>'); | 197 expect(e.outerHtml, '<div class="a"b"></div>'); |
196 }); | 198 }); |
197 | 199 |
198 test('Escaping non-breaking space', () { | 200 test('Escaping non-breaking space', () { |
199 var text = '<span>foO\u00A0bar</span>'; | 201 var text = '<span>foO\u00A0bar</span>'; |
200 expect(text.codeUnitAt(text.indexOf('O') + 1), 0xA0); | 202 expect(text.codeUnitAt(text.indexOf('O') + 1), 0xA0); |
201 var doc = parseFragment(text); | 203 Element e = parseFragment(text).firstChild; |
202 expect(doc.outerHtml, '<span>foO bar</span>'); | 204 expect(e.outerHtml, '<span>foO bar</span>'); |
203 }); | 205 }); |
204 | 206 |
205 test('Newline after <pre>', () { | 207 test('Newline after <pre>', () { |
206 var doc = parseFragment('<pre>\n\nsome text</span>'); | 208 Element e = parseFragment('<pre>\n\nsome text</span>').firstChild; |
207 expect(doc.querySelector('pre').nodes[0].data, '\nsome text'); | 209 expect((e.firstChild as Text).data, '\nsome text'); |
208 expect(doc.outerHtml, '<pre>\n\nsome text</pre>'); | 210 expect(e.outerHtml, '<pre>\n\nsome text</pre>'); |
209 | 211 |
210 doc = parseFragment('<pre>\nsome text</span>'); | 212 e = parseFragment('<pre>\nsome text</span>').firstChild; |
211 expect(doc.querySelector('pre').nodes[0].data, 'some text'); | 213 expect((e.firstChild as Text).data, 'some text'); |
212 expect(doc.outerHtml, '<pre>some text</pre>'); | 214 expect(e.outerHtml, '<pre>some text</pre>'); |
213 }); | 215 }); |
214 | 216 |
215 test('xml namespaces', () { | 217 test('xml namespaces', () { |
216 // Note: this is a nonsensical example, but it triggers the behavior | 218 // Note: this is a nonsensical example, but it triggers the behavior |
217 // we're looking for with attribute names in foreign content. | 219 // we're looking for with attribute names in foreign content. |
218 var doc = parse(''' | 220 var doc = parse(''' |
219 <body> | 221 <body> |
220 <svg> | 222 <svg> |
221 <desc xlink:type="simple" | 223 <desc xlink:type="simple" |
222 xlink:href="http://example.com/logo.png" | 224 xlink:href="http://example.com/logo.png" |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
281 expect((c as Comment).data, 'foo'); | 283 expect((c as Comment).data, 'foo'); |
282 expect(c.text, 'foo'); | 284 expect(c.text, 'foo'); |
283 expect(e.text, 'bar'); | 285 expect(e.text, 'bar'); |
284 | 286 |
285 c.text = 'qux'; | 287 c.text = 'qux'; |
286 expect(c.data, 'qux'); | 288 expect(c.data, 'qux'); |
287 expect(c.text, 'qux'); | 289 expect(c.text, 'qux'); |
288 expect(e.text, 'bar'); | 290 expect(e.text, 'bar'); |
289 }); | 291 }); |
290 } | 292 } |
OLD | NEW |