/[suikacvs]/messaging/manakai/t/DOM-Node.t
Suika

Contents of /messaging/manakai/t/DOM-Node.t

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.17 - (hide annotations) (download) (as text)
Sat Jul 14 10:28:52 2007 UTC (17 years, 4 months ago) by wakaba
Branch: MAIN
Changes since 1.16: +41 -5 lines
File MIME type: application/x-troff
++ manakai/t/ChangeLog	14 Jul 2007 10:27:21 -0000
	* DOM-Node.t: Tests for |append_child| family on
	leaf node types are added.

	* DOM-Text.t: Tests for |split_text| are added.

2007-07-14  Wakaba  <wakaba@suika.fam.cx>

++ manakai/lib/Message/DOM/ChangeLog	14 Jul 2007 10:24:01 -0000
	* CDATASection.pm: Removed (merged with |Text.pm|).

	* Text.pm (Message::DOM::Text::CDATASection): New.

	* Comment.pm: Removed (merged with |DOMCharacterData.pm|).

	* DOMCharacterData.pm (Message::DOM::CharacterData::Comment): New.

2007-07-14  Wakaba  <wakaba@suika.fam.cx>

1 wakaba 1.1 #!/usr/bin/perl
2     use strict;
3     use Test;
4 wakaba 1.17 BEGIN { plan tests => 4918 }
5 wakaba 1.1
6     require Message::DOM::DOMImplementation;
7 wakaba 1.3 use Message::Util::Error;
8 wakaba 1.1
9     my $dom = Message::DOM::DOMImplementation->____new;
10     my $doc = $dom->create_document;
11    
12 wakaba 1.4
13     sub create_nodes () {
14     (
15     $doc->create_attribute ('attr1'),
16     $doc->create_attribute_definition ('at1'),
17     $doc->create_cdata_section ('cdata1'),
18     $doc->create_comment ('comment1'),
19     $doc->create_element ('element1'),
20     $doc->create_element_type_definition ('et1'),
21     $doc->create_general_entity ('entity1'),
22     $doc->create_entity_reference ('entity-reference1'),
23     $doc->implementation->create_document,
24     $doc->create_document_fragment,
25     $doc->create_document_type_definition ('dt1'),
26     $doc->create_notation ('notation1'),
27     $doc->create_processing_instruction ('pi1', 'pi1data'),
28     $doc->create_text_node ('text1'),
29     );
30     } # create_nodes
31    
32     sub create_parent_nodes () {
33     (
34     $doc->create_attribute ('attr1'),
35     $doc->create_attribute_definition ('at1'),
36     $doc->create_element ('element1'),
37     $doc->create_general_entity ('entity1'),
38     $doc->create_entity_reference ('entity-reference1'),
39     $doc->implementation->create_document,
40     $doc->create_document_fragment,
41     $doc->create_document_type_definition ('dt1'),
42     );
43     } # create_parent_nodes
44    
45 wakaba 1.17 sub create_leaf_nodes () {
46     (
47     $doc->create_cdata_section ('cdata1'),
48     $doc->create_comment ('comment1'),
49     $doc->create_notation ('notation1'),
50     $doc->create_processing_instruction ('pi1', 'pi1data'),
51     $doc->create_text_node ('text1'),
52     );
53     } # create_leaf_nodes
54    
55 wakaba 1.1 ## Constants
56     my $constants = [
57     [ELEMENT_NODE => 1],
58     [ATTRIBUTE_NODE => 2],
59     [TEXT_NODE => 3],
60     [CDATA_SECTION_NODE => 4],
61     [ENTITY_REFERENCE_NODE => 5],
62     [ENTITY_NODE => 6],
63     [PROCESSING_INSTRUCTION_NODE => 7],
64     [COMMENT_NODE => 8],
65     [DOCUMENT_NODE => 9],
66     [DOCUMENT_TYPE_NODE => 10],
67     [DOCUMENT_FRAGMENT_NODE => 11],
68     [NOTATION_NODE => 12],
69     [ELEMENT_TYPE_DEFINITION_NODE => 81001],
70     [ATTRIBUTE_DEFINITION_NODE => 81002],
71 wakaba 1.6
72     [DOCUMENT_POSITION_DISCONNECTED => 0x01],
73     [DOCUMENT_POSITION_PRECEDING => 0x02],
74     [DOCUMENT_POSITION_FOLLOWING => 0x04],
75     [DOCUMENT_POSITION_CONTAINS => 0x08],
76     [DOCUMENT_POSITION_CONTAINED_BY => 0x10],
77     [DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC => 0x20],
78 wakaba 1.16
79     [NODE_CLONED => 1],
80     [NODE_IMPORTED => 2],
81     [NODE_DELETED => 3],
82     [NODE_RENAMED => 4],
83     [NODE_ADOPTED => 5],
84 wakaba 1.1 ];
85    
86     my $tests = {
87 wakaba 1.4 attr1 => {
88     node => sub { return $doc->create_attribute ('a') },
89     attr_get => {
90     manakai_attribute_type => 0,
91     base_uri => undef,
92 wakaba 1.6 manakai_expanded_uri => 'a',
93 wakaba 1.4 first_child => undef,
94     last_child => undef,
95     local_name => 'a',
96     manakai_local_name => 'a',
97     namespace_uri => undef,
98     next_sibling => undef,
99     node_name => 'a',
100 wakaba 1.7 node_type => 2,
101 wakaba 1.4 name => 'a',
102     node_value => '',
103     owner_document => $doc,
104     parent_node => undef,
105     prefix => undef,
106     previous_sibling => undef,
107     value => '',
108     attributes => undef,
109     },
110     attr_get_bool => {
111 wakaba 1.6 has_attributes => 0,
112     has_child_nodes => 0,
113 wakaba 1.15 is_id => 0,
114 wakaba 1.10 manakai_read_only => 0,
115 wakaba 1.4 specified => 1,
116     },
117     },
118     attr2 => {
119 wakaba 1.1 node => sub {
120     my $attr = $doc->create_attribute ('a');
121     $attr->value ('b');
122     return $attr;
123     },
124     attr_get => {
125 wakaba 1.4 manakai_attribute_type => 0,
126     base_uri => undef,
127 wakaba 1.6 manakai_expanded_uri => 'a',
128 wakaba 1.2 local_name => 'a',
129     manakai_local_name => 'a',
130     namespace_uri => undef,
131     next_sibling => undef,
132 wakaba 1.1 node_name => 'a',
133 wakaba 1.7 node_type => 2,
134 wakaba 1.1 name => 'a',
135     node_value => 'b',
136 wakaba 1.2 owner_document => $doc,
137     parent_node => undef,
138     prefix => undef,
139     previous_sibling => undef,
140 wakaba 1.1 value => 'b',
141     attributes => undef,
142     },
143 wakaba 1.4 attr_get_bool => {
144 wakaba 1.6 has_attributes => 0,
145     has_child_nodes => 1,
146 wakaba 1.15 is_id => 0,
147 wakaba 1.10 manakai_read_only => 0,
148 wakaba 1.4 specified => 1,
149     },
150 wakaba 1.1 },
151     attr_ns_default => {
152 wakaba 1.4 node => sub { return $doc->create_attribute_ns (undef, 'a') },
153 wakaba 1.1 attr_get => {
154 wakaba 1.4 base_uri => undef,
155 wakaba 1.6 manakai_expanded_uri => 'a',
156 wakaba 1.2 local_name => 'a',
157     manakai_local_name => 'a',
158     namespace_uri => undef,
159     next_sibling => undef,
160 wakaba 1.1 node_name => 'a',
161 wakaba 1.7 node_type => 2,
162 wakaba 1.1 name => 'a',
163 wakaba 1.4 node_value => '',
164 wakaba 1.2 owner_document => $doc,
165     parent_node => undef,
166     prefix => undef,
167 wakaba 1.4 value => '',
168 wakaba 1.1 attributes => undef,
169 wakaba 1.2 previous_sibling => undef,
170 wakaba 1.1 },
171 wakaba 1.6 attr_get_bool => {
172     has_attributes => 0,
173     has_child_nodes => 0,
174 wakaba 1.15 is_id => 0,
175 wakaba 1.10 manakai_read_only => 0,
176 wakaba 1.6 specified => 1,
177     },
178 wakaba 1.1 },
179     attr_ns_prefixed => {
180 wakaba 1.4 node => sub { return $doc->create_attribute_ns ('http://test/', 'a:b') },
181 wakaba 1.1 attr_get => {
182 wakaba 1.4 base_uri => undef,
183 wakaba 1.6 manakai_expanded_uri => 'http://test/b',
184 wakaba 1.2 local_name => 'b',
185     manakai_local_name => 'b',
186     namespace_uri => 'http://test/',
187     next_sibling => undef,
188 wakaba 1.1 node_name => 'a:b',
189 wakaba 1.7 node_type => 2,
190 wakaba 1.1 name => 'a:b',
191 wakaba 1.4 node_value => '',
192 wakaba 1.2 owner_document => $doc,
193     parent_node => undef,
194     prefix => 'a',
195 wakaba 1.4 value => '',
196 wakaba 1.1 attributes => undef,
197 wakaba 1.2 previous_sibling => undef,
198 wakaba 1.1 },
199 wakaba 1.6 attr_get_bool => {
200     has_attributes => 0,
201     has_child_nodes => 0,
202 wakaba 1.15 is_id => 0,
203 wakaba 1.10 manakai_read_only => 0,
204 wakaba 1.6 specified => 1,
205     },
206 wakaba 1.1 },
207 wakaba 1.8 attr_ns_prefixed_array => {
208     node => sub { $doc->create_attribute_ns ('http://test/', ['a', 'b']) },
209     attr_get => {
210     base_uri => undef,
211     manakai_expanded_uri => 'http://test/b',
212     local_name => 'b',
213     manakai_local_name => 'b',
214     namespace_uri => 'http://test/',
215     next_sibling => undef,
216     node_name => 'a:b',
217     node_type => 2,
218     name => 'a:b',
219     node_value => '',
220     owner_document => $doc,
221     parent_node => undef,
222     prefix => 'a',
223     value => '',
224     attributes => undef,
225     previous_sibling => undef,
226     },
227     attr_get_bool => {
228     has_attributes => 0,
229     has_child_nodes => 0,
230 wakaba 1.15 is_id => 0,
231 wakaba 1.10 manakai_read_only => 0,
232 wakaba 1.8 specified => 1,
233     },
234     },
235 wakaba 1.1 cdatasection => {
236     node => sub { return $doc->create_cdata_section ('cdatadata') },
237     attr_get => {
238 wakaba 1.4 base_uri => undef,
239 wakaba 1.6 manakai_expanded_uri => undef,
240 wakaba 1.2 first_child => undef,
241     last_child => undef,
242     local_name => undef,
243     manakai_local_name => undef,
244     namespace_uri => undef,
245     next_sibling => undef,
246 wakaba 1.1 node_name => '#cdata-section',
247 wakaba 1.7 node_type => 4,
248 wakaba 1.1 node_value => 'cdatadata',
249 wakaba 1.2 owner_document => $doc,
250     parent_node => undef,
251     prefix => undef,
252 wakaba 1.1 data => 'cdatadata',
253     attributes => undef,
254 wakaba 1.2 previous_sibling => undef,
255 wakaba 1.1 },
256 wakaba 1.6 attr_get_bool => {
257     has_attributes => 0,
258     has_child_nodes => 0,
259 wakaba 1.9 is_element_content_whitespace => 0,
260 wakaba 1.10 manakai_read_only => 0,
261 wakaba 1.6 },
262 wakaba 1.1 },
263     cdatasectionmde => {
264     node => sub { return $doc->create_cdata_section ('cdata]]>data') },
265     attr_get => {
266 wakaba 1.4 base_uri => undef,
267 wakaba 1.6 manakai_expanded_uri => undef,
268 wakaba 1.2 first_child => undef,
269     last_child => undef,
270     local_name => undef,
271     manakai_local_name => undef,
272     namespace_uri => undef,
273     next_sibling => undef,
274 wakaba 1.1 node_name => '#cdata-section',
275 wakaba 1.7 node_type => 4,
276 wakaba 1.1 node_value => 'cdata]]>data',
277 wakaba 1.2 owner_document => $doc,
278     parent_node => undef,
279     prefix => undef,
280 wakaba 1.1 data => 'cdata]]>data',
281     attributes => undef,
282 wakaba 1.2 previous_sibling => undef,
283 wakaba 1.1 },
284 wakaba 1.6 attr_get_bool => {
285     has_attributes => 0,
286     has_child_nodes => 0,
287 wakaba 1.9 is_element_content_whitespace => 0,
288 wakaba 1.10 manakai_read_only => 0,
289 wakaba 1.6 },
290 wakaba 1.1 },
291     comment => {
292     node => sub { return $doc->create_comment ('commentdata') },
293     attr_get => {
294 wakaba 1.4 base_uri => undef,
295 wakaba 1.6 manakai_expanded_uri => undef,
296 wakaba 1.2 first_child => undef,
297     last_child => undef,
298     local_name => undef,
299     manakai_local_name => undef,
300     namespace_uri => undef,
301     next_sibling => undef,
302 wakaba 1.1 node_name => '#comment',
303 wakaba 1.7 node_type => 8,
304 wakaba 1.1 node_value => 'commentdata',
305 wakaba 1.2 owner_document => $doc,
306     parent_node => undef,
307     prefix => undef,
308 wakaba 1.1 data => 'commentdata',
309     attributes => undef,
310 wakaba 1.2 previous_sibling => undef,
311 wakaba 1.6 },
312     attr_get_bool => {
313     has_attributes => 0,
314     has_child_nodes => 0,
315 wakaba 1.10 manakai_read_only => 0,
316 wakaba 1.1 },
317     },
318     commentcom1 => {
319     node => sub { return $doc->create_comment ('comment--data') },
320     attr_get => {
321 wakaba 1.4 base_uri => undef,
322 wakaba 1.6 manakai_expanded_uri => undef,
323 wakaba 1.2 first_child => undef,
324     last_child => undef,
325     local_name => undef,
326     manakai_local_name => undef,
327     namespace_uri => undef,
328     next_sibling => undef,
329 wakaba 1.1 node_name => '#comment',
330 wakaba 1.7 node_type => 8,
331 wakaba 1.1 node_value => 'comment--data',
332 wakaba 1.2 owner_document => $doc,
333     parent_node => undef,
334     prefix => undef,
335 wakaba 1.1 data => 'comment--data',
336     attributes => undef,
337 wakaba 1.2 previous_sibling => undef,
338 wakaba 1.1 },
339 wakaba 1.6 attr_get_bool => {
340     has_attributes => 0,
341     has_child_nodes => 0,
342 wakaba 1.10 manakai_read_only => 0,
343 wakaba 1.6 },
344 wakaba 1.1 },
345     commentcom2 => {
346     node => sub { return $doc->create_comment ('commentdata-') },
347     attr_get => {
348 wakaba 1.4 base_uri => undef,
349 wakaba 1.6 manakai_expanded_uri => undef,
350 wakaba 1.2 first_child => undef,
351     last_child => undef,
352     local_name => undef,
353     manakai_local_name => undef,
354     namespace_uri => undef,
355     next_sibling => undef,
356 wakaba 1.1 node_name => '#comment',
357 wakaba 1.7 node_type => 8,
358 wakaba 1.1 node_value => 'commentdata-',
359 wakaba 1.2 owner_document => $doc,
360     parent_node => undef,
361     prefix => undef,
362 wakaba 1.1 data => 'commentdata-',
363     attributes => undef,
364 wakaba 1.2 previous_sibling => undef,
365 wakaba 1.1 },
366 wakaba 1.6 attr_get_bool => {
367     has_attributes => 0,
368     has_child_nodes => 0,
369 wakaba 1.10 manakai_read_only => 0,
370 wakaba 1.6 },
371 wakaba 1.1 },
372     document => {
373     node => sub { return $doc },
374     attr_get => {
375     attributes => undef,
376 wakaba 1.4 base_uri => undef,
377     document_uri => undef,
378     manakai_entity_base_uri => undef,
379 wakaba 1.6 manakai_expanded_uri => undef,
380 wakaba 1.2 first_child => undef,
381     implementation => $dom,
382     last_child => undef,
383 wakaba 1.1 local_name => undef,
384 wakaba 1.2 manakai_local_name => undef,
385 wakaba 1.1 namespace_uri => undef,
386 wakaba 1.2 next_sibling => undef,
387 wakaba 1.1 node_name => '#document',
388 wakaba 1.7 node_type => 9,
389 wakaba 1.1 node_value => undef,
390 wakaba 1.2 owner_document => undef,
391 wakaba 1.1 parent_node => undef,
392     prefix => undef,
393 wakaba 1.2 previous_sibling => undef,
394 wakaba 1.4 xml_encoding => undef,
395     xml_version => '1.0',
396     },
397     attr_get_bool => {
398     all_declarations_processed => 0,
399 wakaba 1.6 has_attributes => 0,
400     has_child_nodes => 0,
401 wakaba 1.4 manakai_is_html => 0,
402 wakaba 1.10 manakai_read_only => 0,
403 wakaba 1.4 strict_error_checking => 1,
404     xml_standalone => 0,
405 wakaba 1.1 },
406     },
407     document_fragment => {
408     node => sub { return $doc->create_document_fragment },
409     attr_get => {
410     attributes => undef,
411 wakaba 1.4 base_uri => undef,
412 wakaba 1.6 manakai_expanded_uri => undef,
413 wakaba 1.2 first_child => undef,
414     last_child => undef,
415     local_name => undef,
416     manakai_local_name => undef,
417     namespace_uri => undef,
418     next_sibling => undef,
419 wakaba 1.1 node_name => '#document-fragment',
420 wakaba 1.7 node_type => 11,
421 wakaba 1.1 node_value => undef,
422 wakaba 1.2 owner_document => $doc,
423     parent_node => undef,
424     prefix => undef,
425     previous_sibling => undef,
426 wakaba 1.1 },
427 wakaba 1.6 attr_get_bool => {
428     has_attributes => 0,
429     has_child_nodes => 0,
430 wakaba 1.10 manakai_read_only => 0,
431 wakaba 1.6 },
432 wakaba 1.1 },
433     document_type => {
434 wakaba 1.14 node => sub {
435     return $doc->implementation->create_document_type ('n', '', '');
436     },
437 wakaba 1.1 attr_get => {
438     attributes => undef,
439 wakaba 1.4 base_uri => undef,
440     declaration_base_uri => undef,
441     manakai_declaration_base_uri => undef,
442 wakaba 1.6 manakai_expanded_uri => undef,
443 wakaba 1.2 first_child => undef,
444     implementation => $dom,
445 wakaba 1.14 internal_subset => '',
446 wakaba 1.2 last_child => undef,
447     local_name => undef,
448     manakai_local_name => undef,
449     namespace_uri => undef,
450     next_sibling => undef,
451 wakaba 1.1 node_name => 'n',
452 wakaba 1.7 node_type => 10,
453 wakaba 1.1 node_value => undef,
454 wakaba 1.2 owner_document => undef,
455     parent_node => undef,
456     prefix => undef,
457     previous_sibling => undef,
458 wakaba 1.14 public_id => '',
459     system_id => '',
460 wakaba 1.1 },
461 wakaba 1.6 attr_get_bool => {
462     has_attributes => 0,
463     has_child_nodes => 0,
464 wakaba 1.10 manakai_read_only => 1,
465 wakaba 1.6 },
466 wakaba 1.1 },
467     document_type_definition => {
468     node => sub { return $doc->create_document_type_definition ('n') },
469     attr_get => {
470     attributes => undef,
471 wakaba 1.4 base_uri => undef,
472     declaration_base_uri => undef,
473     manakai_declaration_base_uri => undef,
474 wakaba 1.6 manakai_expanded_uri => undef,
475 wakaba 1.2 first_child => undef,
476     implementation => $dom,
477 wakaba 1.14 internal_subset => '',
478 wakaba 1.2 last_child => undef,
479     local_name => undef,
480     manakai_local_name => undef,
481     namespace_uri => undef,
482     next_sibling => undef,
483 wakaba 1.1 node_name => 'n',
484 wakaba 1.7 node_type => 10,
485 wakaba 1.1 node_value => undef,
486 wakaba 1.2 owner_document => $doc,
487     parent_node => undef,
488     prefix => undef,
489     previous_sibling => undef,
490 wakaba 1.14 public_id => '',
491     system_id => '',
492 wakaba 1.1 },
493 wakaba 1.6 attr_get_bool => {
494     has_attributes => 0,
495     has_child_nodes => 0,
496 wakaba 1.10 manakai_read_only => 0,
497 wakaba 1.6 },
498 wakaba 1.1 },
499     element => {
500     node => sub { return $doc->create_element ('e') },
501     attr_get => {
502 wakaba 1.4 base_uri => undef,
503     manakai_base_uri => undef,
504 wakaba 1.6 manakai_expanded_uri => 'e',
505 wakaba 1.2 first_child => undef,
506     last_child => undef,
507     local_name => 'e',
508     manakai_local_name => 'e',
509     namespace_uri => undef,
510     next_sibling => undef,
511 wakaba 1.1 node_name => 'e',
512 wakaba 1.7 node_type => 1,
513 wakaba 1.1 node_value => undef,
514 wakaba 1.2 owner_document => $doc,
515     parent_node => undef,
516     prefix => undef,
517     previous_sibling => undef,
518 wakaba 1.13 tag_name => 'e',
519 wakaba 1.1 },
520 wakaba 1.6 attr_get_bool => {
521     has_attributes => 0,
522     has_child_nodes => 0,
523 wakaba 1.10 manakai_read_only => 0,
524 wakaba 1.6 },
525 wakaba 1.1 },
526     element_ns_default => {
527     node => sub { return $doc->create_element_ns ('http://test/', 'f') },
528     attr_get => {
529 wakaba 1.4 base_uri => undef,
530     manakai_base_uri => undef,
531 wakaba 1.6 manakai_expanded_uri => 'http://test/f',
532 wakaba 1.2 first_child => undef,
533     last_child => undef,
534     local_name => 'f',
535     manakai_local_name => 'f',
536     namespace_uri => 'http://test/',
537     next_sibling => undef,
538 wakaba 1.1 node_name => 'f',
539 wakaba 1.7 node_type => 1,
540 wakaba 1.1 node_value => undef,
541 wakaba 1.2 owner_document => $doc,
542     parent_node => undef,
543     prefix => undef,
544     previous_sibling => undef,
545 wakaba 1.13 tag_name => 'f',
546 wakaba 1.1 },
547 wakaba 1.6 attr_get_bool => {
548     has_attributes => 0,
549     has_child_nodes => 0,
550 wakaba 1.10 manakai_read_only => 0,
551 wakaba 1.6 },
552 wakaba 1.1 },
553     element_ns_prefiexed => {
554     node => sub { return $doc->create_element_ns ('http://test/', 'e:f') },
555     attr_get => {
556 wakaba 1.4 base_uri => undef,
557     manakai_base_uri => undef,
558 wakaba 1.6 manakai_expanded_uri => 'http://test/f',
559 wakaba 1.2 first_child => undef,
560     last_child => undef,
561     local_name => 'f',
562     manakai_local_name => 'f',
563     namespace_uri => 'http://test/',
564     next_sibling => undef,
565 wakaba 1.1 node_name => 'e:f',
566 wakaba 1.7 node_type => 1,
567 wakaba 1.1 node_value => undef,
568 wakaba 1.2 owner_document => $doc,
569     parent_node => undef,
570     prefix => 'e',
571     previous_sibling => undef,
572 wakaba 1.13 tag_name => 'e:f',
573 wakaba 1.1 },
574 wakaba 1.6 attr_get_bool => {
575     has_attributes => 0,
576     has_child_nodes => 0,
577 wakaba 1.10 manakai_read_only => 0,
578 wakaba 1.6 },
579 wakaba 1.1 },
580     entity => {
581     node => sub { return $doc->create_general_entity ('e') },
582     attr_get => {
583     attributes => undef,
584 wakaba 1.4 base_uri => undef,
585     manakai_declaration_base_uri => undef,
586     manakai_entity_base_uri => undef,
587     manakai_entity_uri => undef,
588 wakaba 1.6 manakai_expanded_uri => undef,
589 wakaba 1.2 first_child => undef,
590     last_child => undef,
591     next_sibling => undef,
592 wakaba 1.1 node_name => 'e',
593 wakaba 1.7 node_type => 6,
594 wakaba 1.1 node_value => undef,
595 wakaba 1.5 notation_name => undef,
596 wakaba 1.2 owner_document => $doc,
597 wakaba 1.14 owner_document_type_definition => undef,
598 wakaba 1.2 parent_node => undef,
599     previous_sibling => undef,
600 wakaba 1.4 public_id => undef,
601     system_id => undef,
602 wakaba 1.1 },
603 wakaba 1.6 attr_get_bool => {
604     has_attributes => 0,
605     has_child_nodes => 0,
606 wakaba 1.10 manakai_read_only => 0,
607 wakaba 1.6 },
608 wakaba 1.1 },
609     entity_reference => {
610     node => sub { return $doc->create_entity_reference ('e') },
611     attr_get => {
612     attributes => undef,
613 wakaba 1.4 base_uri => undef,
614     manakai_entity_base_uri => undef,
615 wakaba 1.6 manakai_expanded_uri => undef,
616 wakaba 1.2 first_child => undef,
617     last_child => undef,
618     local_name => undef,
619     manakai_local_name => undef,
620     namespace_uri => undef,
621     next_sibling => undef,
622 wakaba 1.1 node_name => 'e',
623 wakaba 1.7 node_type => 5,
624 wakaba 1.1 node_value => undef,
625 wakaba 1.2 owner_document => $doc,
626     parent_node => undef,
627     prefix => undef,
628     previous_sibling => undef,
629 wakaba 1.1 },
630 wakaba 1.4 attr_get_bool => {
631     manakai_expanded => 0,
632     manakai_external => 0,
633 wakaba 1.6 has_attributes => 0,
634     has_child_nodes => 0,
635 wakaba 1.10 manakai_read_only => 1,
636 wakaba 1.4 },
637 wakaba 1.1 },
638     notation => {
639     node => sub { return $doc->create_notation ('e') },
640     attr_get => {
641     attributes => undef,
642 wakaba 1.4 base_uri => undef,
643     manakai_declaration_base_uri => undef,
644 wakaba 1.6 manakai_expanded_uri => undef,
645 wakaba 1.2 first_child => undef,
646     last_child => undef,
647     local_name => undef,
648     manakai_local_name => undef,
649     namespace_uri => undef,
650     next_sibling => undef,
651 wakaba 1.1 node_name => 'e',
652 wakaba 1.7 node_type => 12,
653 wakaba 1.1 node_value => undef,
654 wakaba 1.2 owner_document => $doc,
655 wakaba 1.14 owner_document_type_definition => undef,
656 wakaba 1.2 parent_node => undef,
657     prefix => undef,
658     previous_sibling => undef,
659 wakaba 1.4 public_id => undef,
660     system_id => undef,
661 wakaba 1.1 },
662 wakaba 1.6 attr_get_bool => {
663     has_attributes => 0,
664     has_child_nodes => 0,
665 wakaba 1.10 manakai_read_only => 0,
666 wakaba 1.6 },
667 wakaba 1.1 },
668     processing_instruction => {
669     node => sub { return $doc->create_processing_instruction ('t', 'd') },
670     attr_get => {
671     attributes => undef,
672 wakaba 1.4 base_uri => undef,
673     manakai_base_uri => undef,
674 wakaba 1.6 manakai_expanded_uri => undef,
675 wakaba 1.2 first_child => undef,
676     last_child => undef,
677     local_name => undef,
678     manakai_local_name => undef,
679     namespace_uri => undef,
680     next_sibling => undef,
681 wakaba 1.1 node_name => 't',
682 wakaba 1.7 node_type => 7,
683 wakaba 1.1 node_value => 'd',
684 wakaba 1.2 owner_document => $doc,
685     parent_node => undef,
686     prefix => undef,
687     previous_sibling => undef,
688 wakaba 1.1 },
689 wakaba 1.6 attr_get_bool => {
690     has_attributes => 0,
691     has_child_nodes => 0,
692 wakaba 1.10 manakai_read_only => 0,
693 wakaba 1.6 },
694 wakaba 1.1 },
695     text => {
696     node => sub { return $doc->create_text_node ('textdata') },
697     attr_get => {
698     attributes => undef,
699 wakaba 1.4 base_uri => undef,
700 wakaba 1.6 manakai_expanded_uri => undef,
701 wakaba 1.2 first_child => undef,
702     last_child => undef,
703     local_name => undef,
704     manakai_local_name => undef,
705     namespace_uri => undef,
706     next_sibling => undef,
707 wakaba 1.1 node_name => '#text',
708 wakaba 1.7 node_type => 3,
709 wakaba 1.1 node_value => 'textdata',
710 wakaba 1.2 owner_document => $doc,
711     parent_node => undef,
712     prefix => undef,
713     previous_sibling => undef,
714 wakaba 1.1 },
715 wakaba 1.6 attr_get_bool => {
716     has_attributes => 0,
717     has_child_nodes => 0,
718 wakaba 1.9 is_element_content_whitespace => 0,
719 wakaba 1.10 manakai_read_only => 0,
720 wakaba 1.6 },
721 wakaba 1.1 },
722     element_type_definition => {
723     node => sub { return $doc->create_element_type_definition ('e') },
724     attr_get => {
725     attributes => undef,
726 wakaba 1.4 base_uri => undef,
727 wakaba 1.6 manakai_expanded_uri => undef,
728 wakaba 1.2 first_child => undef,
729     last_child => undef,
730     local_name => undef,
731     manakai_local_name => undef,
732     namespace_uri => undef,
733     next_sibling => undef,
734 wakaba 1.1 node_name => 'e',
735 wakaba 1.7 node_type => 81001,
736 wakaba 1.1 node_value => undef,
737 wakaba 1.2 owner_document => $doc,
738 wakaba 1.14 owner_document_type_definition => undef,
739 wakaba 1.2 parent_node => undef,
740     prefix => undef,
741     previous_sibling => undef,
742 wakaba 1.1 },
743 wakaba 1.6 attr_get_bool => {
744     has_attributes => 0,
745     has_child_nodes => 0,
746 wakaba 1.10 manakai_read_only => 0,
747 wakaba 1.6 },
748 wakaba 1.1 },
749     attribute_definition => {
750     node => sub { return $doc->create_attribute_definition ('e') },
751     attr_get => {
752     attributes => undef,
753 wakaba 1.4 base_uri => undef,
754     declared_type => 0,
755     default_type => 0,
756 wakaba 1.6 manakai_expanded_uri => undef,
757 wakaba 1.2 first_child => undef,
758     last_child => undef,
759     local_name => undef,
760     manakai_local_name => undef,
761     namespace_uri => undef,
762     next_sibling => undef,
763 wakaba 1.1 node_name => 'e',
764 wakaba 1.7 node_type => 81002,
765 wakaba 1.16 node_value => '',
766 wakaba 1.2 owner_document => $doc,
767 wakaba 1.14 owner_element_type_definition => undef,
768 wakaba 1.2 parent_node => undef,
769     prefix => undef,
770     previous_sibling => undef,
771 wakaba 1.16 text_content => '',
772 wakaba 1.1 },
773 wakaba 1.6 attr_get_bool => {
774     has_attributes => 0,
775     has_child_nodes => 0,
776 wakaba 1.10 manakai_read_only => 0,
777 wakaba 1.6 },
778 wakaba 1.1 },
779     };
780    
781     for my $test_id (sort {$a cmp $b} keys %$tests) {
782     my $test_def = $tests->{$test_id};
783     my $node = $test_def->{node}->();
784    
785     for (@$constants) {
786     my $const_name = $_->[0];
787     ok $node->can ($const_name) ? 1 : 0, 1, "$test_id->can ($const_name)";
788     ok $node->$const_name, $_->[1], "$test_id.$const_name";
789     }
790    
791     for my $attr_name (sort {$a cmp $b} keys %{$test_def->{attr_get}}) {
792     my $expected = $test_def->{attr_get}->{$attr_name};
793     ok $node->can ($attr_name) ? 1 : 0, 1, "$test_id->can ($attr_name)";
794     my $actual = $node->$attr_name;
795     ok $actual, $expected, "$test_id.$attr_name.get";
796     }
797 wakaba 1.4
798     for my $attr_name (sort {$a cmp $b} keys %{$test_def->{attr_get_bool} or {}}) {
799     my $expected = $test_def->{attr_get_bool}->{$attr_name} ? 1 : 0;
800     ok $node->can ($attr_name) ? 1 : 0, 1, "$test_id->can ($attr_name)";
801     my $actual = $node->$attr_name ? 1 : 0;
802     ok $actual, $expected, "$test_id.$attr_name.get";
803     }
804 wakaba 1.1 }
805    
806 wakaba 1.2 ## Child node accessors' tests
807     for my $parent (create_parent_nodes ()) {
808 wakaba 1.12 my $doc = $parent->owner_document || $parent;
809 wakaba 1.2 my $node1;
810     my $node2;
811     my $node3;
812     if ($parent->node_type == $parent->DOCUMENT_TYPE_NODE) {
813     $node1 = $doc->create_processing_instruction ('pi1', 'data1');
814     $node2 = $doc->create_processing_instruction ('pi2', 'data2');
815     $node3 = $doc->create_processing_instruction ('pi3', 'data3');
816     } elsif ($parent->node_type == $parent->DOCUMENT_NODE) {
817     $node1 = $doc->create_comment ('comment1');
818     $node2 = $doc->create_comment ('comment2');
819     $node3 = $doc->create_comment ('comment3');
820     } else {
821     $node1 = $doc->create_text_node ('text1');
822     $node2 = $doc->create_text_node ('text2');
823     $node3 = $doc->create_text_node ('text3');
824     }
825    
826 wakaba 1.12 $parent->manakai_set_read_only (0, 1);
827 wakaba 1.2 $parent->append_child ($node1);
828     ok $parent->first_child, $node1, $parent->node_name."->first_child [1]";
829     ok $parent->last_child, $node1, $parent->node_name."->last_child [1]";
830     ok $node1->next_sibling, undef, $parent->node_name."->next_sibling [1]";
831     ok $node1->previous_sibling, undef, $parent->node_name."->previous_sibling [1]";
832    
833     $parent->append_child ($node2);
834     ok $parent->first_child, $node1, $parent->node_name."->first_child [2]";
835     ok $parent->last_child, $node2, $parent->node_name."->last_child [2]";
836     ok $node1->next_sibling, $node2, $parent->node_name."1->next_sibling [2]";
837     ok $node1->previous_sibling, undef, $parent->node_name."1->previous_sibling [2]";
838     ok $node2->next_sibling, undef, $parent->node_name."2->next_sibling [2]";
839     ok $node2->previous_sibling, $node1, $parent->node_name."2->previous_sibling [2]";
840    
841     $parent->append_child ($node3);
842     ok $parent->first_child, $node1, $parent->node_name."->first_child [3]";
843     ok $parent->last_child, $node3, $parent->node_name."->last_child [3]";
844     ok $node1->next_sibling, $node2, $parent->node_name."1->next_sibling [3]";
845     ok $node1->previous_sibling, undef, $parent->node_name."1->previous_sibling [3]";
846     ok $node2->next_sibling, $node3, $parent->node_name."2->next_sibling [3]";
847     ok $node2->previous_sibling, $node1, $parent->node_name."2->previous_sibling [3]";
848     ok $node3->next_sibling, undef, $parent->node_name."3->next_sibling [3]";
849     ok $node3->previous_sibling, $node2, $parent->node_name."3->previous_sibling [3]";
850     }
851    
852 wakaba 1.3 ## |prefix| setter
853     for my $node (create_nodes ()) {
854     $node->manakai_set_read_only (0);
855    
856     $node->prefix ('non-null');
857     if ($node->node_type == $node->ELEMENT_NODE or
858     $node->node_type == $node->ATTRIBUTE_NODE) {
859     ok $node->prefix, 'non-null', $node->node_name . '->prefix (non-null)';
860     } else {
861     ok $node->prefix, undef, $node->node_name . '->prefix (non-null)';
862     }
863    
864     $node->prefix (undef);
865     if ($node->node_type == $node->ELEMENT_NODE or
866     $node->node_type == $node->ATTRIBUTE_NODE) {
867     ok $node->prefix, undef, $node->node_name . '->prefix (null)';
868     } else {
869     ok $node->prefix, undef, $node->node_name . '->prefix (null)';
870     }
871    
872     $node->manakai_set_read_only (1);
873     my $err_type;
874     try {
875     $node->prefix ('non-null');
876     } catch Message::IF::DOMException with {
877     my $err = shift;
878     $err_type = $err->type;
879     };
880     if ($node->node_type == $node->ELEMENT_NODE or
881     $node->node_type == $node->ATTRIBUTE_NODE) {
882     ok $err_type, 'NO_MODIFICATION_ALLOWED_ERR',
883     $node->node_name . '->prefix exception (read-only)';
884     ok $node->prefix, undef, $node->node_name . '->prefix (read-only)';
885     } else {
886     ok $err_type, undef, $node->node_name . '->prefix exception (read-only)';
887     ok $node->prefix, undef, $node->node_name . '->prefix (read-only)';
888     }
889     }
890    
891     ## |text_content|
892     {
893     my $doc2 = $doc->implementation->create_document;
894     $doc2->dom_config->set_parameter
895     ('http://suika.fam.cx/www/2006/dom-config/strict-document-children' => 1);
896     for my $node (
897     $doc2,
898     $doc->create_document_type_definition ('dt1'),
899     $doc->implementation->create_document_type ('doctype1'),
900     $doc->create_notation ('notation1'),
901     $doc->create_element_type_definition ('et1'),
902     ) {
903     ok $node->can ('text_content') ? 1 : 0, 1,
904     $node->node_name . '->can text_content';
905    
906     ok $node->text_content, undef, $node->node_name . '->text_content';
907    
908     $node->manakai_set_read_only (0);
909     $node->text_content ('new-text-content');
910     ok $node->text_content, undef, $node->node_name . '->text_content set';
911    
912     $node->manakai_set_read_only (1);
913     $node->text_content ('new-text-content');
914     ok $node->text_content, undef,
915     $node->node_name . '->text_content set (read-only)';
916     }
917    
918     $doc2->dom_config->set_parameter
919     ('http://suika.fam.cx/www/2006/dom-config/strict-document-children' => 0);
920     for my $node (
921     $doc2,
922     $doc->create_attribute ('attr1'),
923     $doc->create_attribute_definition ('at1'),
924     $doc->create_element ('element1'),
925     $doc->create_general_entity ('entity1'),
926     $doc->create_entity_reference ('entity-reference1'),
927     $doc->create_document_fragment,
928     ) {
929     ok $node->can ('text_content') ? 1 : 0, 1,
930     $node->node_name . '->can text_content';
931    
932     ok $node->text_content, '', $node->node_name . '->text_content';
933    
934     $node->manakai_set_read_only (0);
935     $node->text_content ('text1');
936     ok $node->text_content, 'text1', $node->node_name . '->text_content set';
937     ok 0+@{$node->child_nodes}, 1,
938     $node->node_name . '->text_content set child_nodes length';
939    
940     $node->text_content ('');
941     ok $node->text_content, '', $node->node_name . '->text_content set empty';
942     ok 0+@{$node->child_nodes}, 0,
943     $node->node_name . '->text_content set empty child_nodes length';
944    
945     $node->text_content ('text2');
946     $node->text_content ('');
947     ok $node->text_content, '', $node->node_name . '->text_content set empty';
948     ok 0+@{$node->child_nodes}, 0,
949     $node->node_name . '->text_content set empty child_nodes length';
950    
951     $node->text_content ('text3');
952     $node->manakai_set_read_only (1);
953     try {
954     $node->text_content ('new-text-content');
955     ok undef, 'NO_MODIFICATION_ALLOWED_ERR',
956     $node->node_name . '->text_content set (read-only)';
957     } catch Message::IF::DOMException with {
958     my $err = shift;
959     ok $err->type, 'NO_MODIFICATION_ALLOWED_ERR',
960     $node->node_name . '->text_content set (read-only)';
961     };
962     ok $node->text_content, 'text3',
963     $node->node_name . '->text_content set (read-only) text_content';
964     }
965    
966    
967     for (0..2) {
968     my $el;
969     my $ce;
970    
971     [
972     sub {
973     $el = $doc->create_element ('nestingElement');
974     $ce = $doc->create_element ('el2');
975     },
976     sub {
977     $el = $doc->create_element ('elementWithEntityReference');
978     $ce = $doc->create_entity_reference ('ent');
979     $ce->manakai_set_read_only (0, 1);
980     },
981     sub {
982     $el = $doc->create_general_entity ('generalEntityWithChild');
983     $ce = $doc->create_element ('el');
984     $el->manakai_set_read_only (0, 1);
985     },
986     ]->[$_]->();
987     $el->append_child ($ce);
988    
989     ok $el->text_content, '', $el->node_name . '->text_content [1]';
990    
991     $ce->text_content ('gc');
992     ok $el->text_content, 'gc', $el->node_name . '->text_content [2]';
993    
994     $el->manakai_append_text ('cc');
995     ok $el->text_content, 'gccc', $el->node_name . '->text_content [3]';
996    
997     $el->text_content ('nc');
998     ok $el->text_content, 'nc', $el->node_name . '->text_content [4]';
999     ok 0+@{$el->child_nodes}, 1,
1000     $el->node_name . '->text_content child_nodes length [4]';
1001     ok $ce->parent_node, undef,
1002     $el->node_name . '->text_content old_child parent_node [4]';
1003     }
1004     }
1005    
1006 wakaba 1.4 ## |manakaiReadOnly| and |manakaiSetReadOnly|
1007     {
1008     for my $node (create_nodes ()) {
1009     $node->manakai_set_read_only (1, 0);
1010     ok $node->manakai_read_only ? 1 : 0, 1,
1011     $node->node_name . '->manakai_set_read_only (1, 0) [1]';
1012    
1013     $node->manakai_set_read_only (0, 0);
1014     ok $node->manakai_read_only ? 1 : 0, 0,
1015     $node->node_name . '->manakai_set_read_only (0, 0)';
1016    
1017     $node->manakai_set_read_only (1, 0);
1018     ok $node->manakai_read_only ? 1 : 0, 1,
1019     $node->node_name . '->manakai_set_read_only (1, 0) [2]';
1020     }
1021    
1022     {
1023     my $el = $doc->create_element ('readOnlyElement1');
1024     my $c1 = $doc->create_element ('c1');
1025     $el->append_child ($c1);
1026     my $c2 = $doc->create_text_node ('c2');
1027     $el->append_child ($c2);
1028     my $c3 = $doc->create_element ('c3');
1029     $el->append_child ($c3);
1030     my $c4 = $doc->create_attribute ('c4');
1031     $el->set_attribute_node ($c4);
1032     my $c5 = $doc->create_entity_reference ('c5');
1033     $el->append_child ($c5);
1034    
1035     $el->manakai_set_read_only (1, 1);
1036     for ($c1, $c2, $c3, $c4, $c5) {
1037     ok $_->manakai_read_only ? 1 : 0, 1,
1038     $el->node_name . '->read_only (1, 1) ' . $_->node_name . ' [1]';
1039     }
1040    
1041     $el->manakai_set_read_only (0, 1);
1042     for ($c1, $c2, $c3, $c4, $c5) {
1043     ok $_->manakai_read_only ? 1 : 0, 0,
1044     $el->node_name . '->read_only (1, 0) ' . $_->node_name;
1045     }
1046    
1047     $el->manakai_set_read_only (1, 1);
1048     for ($c1, $c2, $c3, $c4, $c5) {
1049     ok $_->manakai_read_only ? 1 : 0, 1,
1050     $el->node_name . '->read_only (1, 1) ' . $_->node_name . ' [2]';
1051     }
1052     }
1053    
1054     {
1055     my $dtd = $doc->create_document_type_definition ('readOnlyDTDef1');
1056     my $c1 = $doc->create_processing_instruction ('c1', '');
1057     $dtd->append_child ($c1);
1058     my $c2 = $doc->create_element_type_definition ('c2');
1059     $dtd->set_element_type_definition_node ($c2);
1060     my $c3 = $doc->create_general_entity ('c3');
1061     $dtd->set_general_entity_node ($c3);
1062     my $c4 = $doc->create_notation ('c4');
1063     $dtd->set_notation_node ($c4);
1064     my $c5 = $doc->create_text_node ('c5');
1065     $c3->append_child ($c5);
1066    
1067     $dtd->manakai_set_read_only (1, 1);
1068     for ($c1, $c2, $c3, $c4, $c5) {
1069     ok $_->manakai_read_only ? 1 : 0, 1,
1070     $dtd->node_name . '->read_only (1, 1) ' . $_->node_name . ' [1]';
1071     }
1072    
1073     $dtd->manakai_set_read_only (0, 1);
1074     for ($c1, $c2, $c3, $c4, $c5) {
1075     ok $_->manakai_read_only ? 1 : 0, 0,
1076     $dtd->node_name . '->read_only (1, 0) ' . $_->node_name;
1077     }
1078    
1079     $dtd->manakai_set_read_only (1, 1);
1080     for ($c1, $c2, $c3, $c4, $c5) {
1081     ok $_->manakai_read_only ? 1 : 0, 1,
1082     $dtd->node_name . '->read_only (1, 1) ' . $_->node_name . ' [2]';
1083     }
1084     }
1085    
1086     {
1087     my $et = $doc->create_element_type_definition ('readOnlyETDef1');
1088     my $c1 = $doc->create_element ('c1');
1089     $et->set_attribute_definition_node ($c1);
1090     my $c2 = $doc->create_text_node ('c2');
1091     $c1->append_child ($c2);
1092    
1093     $et->manakai_set_read_only (1, 1);
1094     for ($c1, $c2) {
1095     ok $_->manakai_read_only ? 1 : 0, 1,
1096     $et->node_name . '->read_only (1, 1) ' . $_->node_name . ' [1]';
1097     }
1098    
1099     $et->manakai_set_read_only (0, 1);
1100     for ($c1, $c2) {
1101     ok $_->manakai_read_only ? 1 : 0, 0,
1102     $et->node_name . '->read_only (1, 0) ' . $_->node_name;
1103     }
1104    
1105     $et->manakai_set_read_only (1, 1);
1106     for ($c1, $c2) {
1107     ok $_->manakai_read_only ? 1 : 0, 1,
1108     $et->node_name . '->read_only (1, 1) ' . $_->node_name . ' [2]';
1109     }
1110     }
1111     }
1112    
1113     ## |manakaiAppendText|
1114     {
1115     my $doc2 = $doc->implementation->create_document;
1116    
1117     $doc2->dom_config->set_parameter
1118     ('http://suika.fam.cx/www/2006/dom-config/strict-document-children' => 1);
1119     for my $node (
1120     $doc2,
1121     $doc->create_notation ('Notation_manakaiAppendText'),
1122     $doc->create_document_type_definition ('DT_manakaiAppendText'),
1123     $doc->create_element_type_definition ('ET_manakaiAppendText'),
1124     ) {
1125     ok $node->can ('manakai_append_text') ? 1 : 0, 1, $node->node_name . 'can';
1126    
1127     $node->manakai_append_text ('aaaa');
1128     ok $node->text_content, undef, $node->node_name . ' [1]';
1129     ok 0+@{$node->child_nodes}, 0, $node->node_name . ' childNodes @{} 0+ [1]';
1130     }
1131    
1132     $doc2->dom_config->set_parameter
1133     ('http://suika.fam.cx/www/2006/dom-config/strict-document-children' => 0);
1134     for my $node (
1135     $doc->create_attribute ('Attr_manakaiAppendText'),
1136     $doc->create_element ('Element_manakaiAppendText'),
1137     $doc2,
1138     $doc->create_document_fragment,
1139     $doc->create_general_entity ('Entity_manakaiAppendText'),
1140     $doc->create_entity_reference ('ER_manakaiAppendText'),
1141     $doc->create_attribute_definition ('AT_manakaiAppendText'),
1142     ) {
1143     $node->manakai_set_read_only (0, 1);
1144     ok $node->can ('manakai_append_text') ? 1 : 0, 1, $node->node_name . 'can';
1145    
1146     $node->manakai_append_text ('string');
1147     ok $node->text_content, 'string', $node->node_name . ' [1]';
1148     ok 0+@{$node->child_nodes}, 1, $node->node_name . ' childNodes @{} 0+ [1]';
1149    
1150     $node->manakai_append_text ('STRING');
1151     ok $node->text_content, 'stringSTRING', $node->node_name . ' [2]';
1152     ok 0+@{$node->child_nodes}, 1, $node->node_name . ' childNodes @{} 0+ [2]';
1153    
1154 wakaba 1.12 my $er = ($node->owner_document || $node)->create_entity_reference ('er');
1155 wakaba 1.4 $node->append_child ($er);
1156    
1157     $node->manakai_append_text ('text');
1158     ok $node->text_content, 'stringSTRINGtext', $node->node_name . ' [3]';
1159     ok 0+@{$node->child_nodes}, 3, $node->node_name . ' childNodes @{} 0+ [3]';
1160     }
1161    
1162     for my $node (
1163     $doc->create_text_node (''),
1164     $doc->create_cdata_section (''),
1165     $doc->create_comment (''),
1166     $doc->create_processing_instruction ('PI_manakaiAppendText'),
1167     ) {
1168     ok $node->can ('manakai_append_text') ? 1 : 0, 1, $node->node_name . 'can';
1169    
1170     $node->manakai_append_text ('aaaa');
1171     ok $node->text_content, 'aaaa', $node->node_name . ' [1]';
1172     ok 0+@{$node->child_nodes}, 0, $node->node_name . ' childNodes @{} 0+ [1]';
1173    
1174     $node->manakai_append_text ('bbbb');
1175     ok $node->text_content, 'aaaabbbb', $node->node_name . ' [1]';
1176     ok 0+@{$node->child_nodes}, 0, $node->node_name . ' childNodes @{} 0+ [1]';
1177     }
1178     }
1179    
1180     ## |baseURI|
1181     {
1182     my $doc2 = $doc->implementation->create_document;
1183    
1184     $doc2->document_uri (q<ftp://suika.fam.cx/>);
1185     ok $doc2->base_uri, q<ftp://suika.fam.cx/>, 'Document->base_uri [1]';
1186    
1187     $doc2->document_uri (undef);
1188     ok $doc2->base_uri, undef, 'Document->base_uri [2]';
1189     ok $doc2->manakai_entity_base_uri, undef, 'Document->base_uri ebu [2]';
1190    
1191     $doc2->manakai_entity_base_uri (q<https://suika.fam.cx/>);
1192     ok $doc2->base_uri, q<https://suika.fam.cx/>, 'Document->base_uri [3]';
1193     ok $doc2->manakai_entity_base_uri, q<https://suika.fam.cx/>,
1194     'Document->base_uri ebu [3]';
1195    
1196     $doc2->manakai_entity_base_uri (undef);
1197     ok $doc2->base_uri, undef, 'Document->base_uri [4]';
1198     ok $doc2->manakai_entity_base_uri, undef, 'Document->base_uri ebu [4]';
1199    
1200     $doc2->document_uri (q<ftp://suika.fam.cx/>);
1201     $doc2->manakai_entity_base_uri (q<https://suika.fam.cx/>);
1202     ok $doc2->base_uri, q<https://suika.fam.cx/>, 'Document->base_uri [5]';
1203     ok $doc2->manakai_entity_base_uri, q<https://suika.fam.cx/>,
1204     'Document->base_uri ebu [5]';
1205     }
1206    
1207     for my $method (qw/
1208     create_document_fragment
1209     create_element_type_definition
1210     create_attribute_definition
1211     /) {
1212     my $doc2 = $doc->implementation->create_document;
1213    
1214     my $node = $doc2->$method ('a');
1215    
1216     $doc2->document_uri (q<ftp://doc.test/>);
1217     ok $node->base_uri, q<ftp://doc.test/>, $node->node_name . '->base_uri [1]';
1218    
1219     $doc2->manakai_entity_base_uri (q<ftp://suika.fam.cx/>);
1220     ok $node->base_uri, q<ftp://suika.fam.cx/>,
1221     $node->node_name . '->base_uri [2]';
1222     }
1223    
1224     {
1225     my $doc2 = $doc->implementation->create_document;
1226    
1227     my $attr = $doc2->create_attribute_ns (undef, 'attr');
1228    
1229     $doc2->document_uri (q<http://www.example.com/>);
1230     ok $attr->base_uri, q<http://www.example.com/>, 'Attr->base_uri [1]';
1231    
1232     my $el = $doc2->create_element_ns (undef, 'element');
1233     $el->set_attribute_ns ('http://www.w3.org/XML/1998/namespace',
1234     'xml:base' => q<http://www.example.org/>);
1235     $el->set_attribute_node_ns ($attr);
1236     ok $attr->base_uri, q<http://www.example.org/>, 'Attr->base_uri [2]';
1237     }
1238    
1239     for my $i (0..1) {
1240     my $xb = [
1241     ['http://www.w3.org/XML/1998/namespace', 'xml:base'],
1242     [undef, [undef, 'xml:base']],
1243     ]->[$i];
1244    
1245     my $doc2 = $doc->implementation->create_document;
1246 wakaba 1.8 $doc2->strict_error_checking (0);
1247 wakaba 1.4
1248     my $attr = $doc2->create_attribute_ns (@$xb);
1249     $attr->value (q<http://attr.test/>);
1250    
1251     ok $attr->base_uri, undef, 'xml:base->base_uri [0]' . $i;
1252    
1253     $doc2->document_uri (q<http://doc.test/>);
1254     ok $attr->base_uri, q<http://doc.test/>, 'xml:base->base_uri [1]' . $i;
1255    
1256     my $el = $doc2->create_element_ns (undef, 'e');
1257     $el->set_attribute_node_ns ($attr);
1258     ok $attr->base_uri, q<http://doc.test/>, 'xml:base->base_uri [2]' . $i;
1259    
1260     my $pel = $doc2->create_element_ns (undef, 'e');
1261     $pel->set_attribute_ns (@$xb, q<http://pel.test/>);
1262     $pel->append_child ($el);
1263     ok $attr->base_uri, q<http://pel.test/>, 'xml:base->base_uri [3]' . $i;
1264     }
1265    
1266     for my $i (0..1) {
1267     my $xb = [
1268     ['http://www.w3.org/XML/1998/namespace', 'xml:base'],
1269     [undef, [undef, 'xml:base']],
1270     ]->[$i];
1271    
1272     my $doc2 = $doc->implementation->create_document;
1273 wakaba 1.15 $doc2->strict_error_checking (0);
1274 wakaba 1.4
1275     my $el = $doc2->create_element_ns (undef, 'el');
1276    
1277     ok $el->base_uri, undef, "Element->base_uri [0]";
1278     ok $el->manakai_base_uri, undef, "Element->manakai_base_uri [0]";
1279    
1280     $doc2->document_uri (q<http://foo.example/>);
1281     ok $el->base_uri, q<http://foo.example/>, "Element->base_uri [1]";
1282     ok $el->manakai_base_uri, undef, "Element->manakai_base_uri [1]";
1283    
1284     $el->set_attribute_ns (@$xb => q<http://www.example.com/>);
1285     ok $el->base_uri, q<http://www.example.com/>, "Element->base_uri [2]";
1286     ok $el->manakai_base_uri, undef, "Element->manakai_base_uri [2]";
1287    
1288     $el->set_attribute_ns (@$xb => q<bar>);
1289     ok $el->base_uri, q<http://foo.example/bar>, "Element->base_uri [3]";
1290     ok $el->manakai_base_uri, undef, "Element->manakai_base_uri [3]";
1291    
1292     $el->manakai_base_uri (q<http://baz.example/>);
1293     ok $el->base_uri, q<http://baz.example/>, "Element->base_uri [4]";
1294     ok $el->manakai_base_uri, q<http://baz.example/>,
1295     "Element->manakai_base_uri [4]";
1296    
1297     $el->manakai_base_uri (undef);
1298     ok $el->base_uri, q<http://foo.example/bar>, "Element->base_uri [5]";
1299     ok $el->manakai_base_uri, undef, "Element->manakai_base_uri [5]";
1300     }
1301    
1302     {
1303     my $doc2 = $doc->implementation->create_document;
1304    
1305     my $el = $doc2->create_element_ns (undef, 'el');
1306    
1307     ok $el->base_uri, undef, "Element->base_uri [6]";
1308    
1309     $doc2->document_uri (q<http://doc.test/>);
1310     ok $el->base_uri, q<http://doc.test/>, "Element->base_uri [7]";
1311    
1312     my $el0 = $doc2->create_element_ns (undef, 'e');
1313     $el0->set_attribute_ns ('http://www.w3.org/XML/1998/namespace', 'xml:base',
1314     q<http://el.test/>);
1315     $el0->append_child ($el);
1316     ok $el->base_uri, q<http://el.test/>, "Element->base_uri [8]";
1317    
1318     my $ent = $doc2->create_entity_reference ('ent');
1319     $ent->manakai_set_read_only (0, 1);
1320     $ent->manakai_external (1);
1321     $ent->manakai_entity_base_uri (q<http://ent.test/>);
1322     $el0->append_child ($ent);
1323     $ent->append_child ($el);
1324     ok $el->base_uri, q<http://ent.test/>, "Element->base_uri [9]";
1325     }
1326    
1327     for (qw/create_text_node create_cdata_section create_comment/) {
1328     my $doc2 = $doc->implementation->create_document;
1329     my $node = $doc2->$_ ('');
1330    
1331     $doc2->document_uri (q<http://doc.test/>);
1332     ok $node->base_uri, q<http://doc.test/>, $node->node_name . "->base_uri [0]";
1333    
1334     my $el = $doc2->create_element_ns (undef, 'e');
1335     $el->set_attribute_ns ('http://www.w3.org/XML/1998/namespace', 'xml:base',
1336     q<http://el.test/>);
1337     $el->append_child ($node);
1338     ok $node->base_uri, q<http://el.test/>, $node->node_name . "->base_uri [1]";
1339    
1340     my $ent = $doc2->create_entity_reference ('ent');
1341     $ent->manakai_set_read_only (0, 1);
1342     $ent->manakai_external (1);
1343     $ent->manakai_entity_base_uri (q<http://ent.test/>);
1344     $el->append_child ($ent);
1345     $ent->append_child ($node);
1346     ok $node->base_uri, q<http://ent.test/>, $node->node_name . "->base_uri [2]";
1347     }
1348    
1349     {
1350     my $doc2 = $doc->implementation->create_document;
1351     my $ent = $doc2->create_general_entity ('ent');
1352    
1353     $doc2->document_uri (q<http://base.example/>);
1354     ok $ent->base_uri, q<http://base.example/>, "Entity->base_uri [1]";
1355    
1356     $ent->manakai_entity_base_uri (q<http://www.example.com/>);
1357     ok $ent->base_uri, q<http://base.example/>, "Entity->base_uri [2]";
1358    
1359     $ent->manakai_declaration_base_uri (q<http://www.example/>);
1360     ok $ent->base_uri, q<http://base.example/>, "Entity->base_uri [3]";
1361     }
1362    
1363     {
1364     my $doc2 = $doc->implementation->create_document;
1365    
1366     my $ent = $doc2->create_entity_reference ('ent');
1367     $ent->manakai_set_read_only (0, 1);
1368    
1369     $doc2->document_uri (q<http://base.example/>);
1370     ok $ent->base_uri, q<http://base.example/>, "ER->base_uri [1]";
1371    
1372     $ent->manakai_entity_base_uri (q<http://www.example.com/>);
1373     ok $ent->base_uri, q<http://base.example/>;
1374    
1375     my $el = $doc2->create_element_ns (undef, 'el');
1376     $el->set_attribute_ns ('http://www.w3.org/XML/1998/namespace', 'xml:base',
1377     q<http://el.test/>);
1378     $el->append_child ($ent);
1379     ok $ent->base_uri, q<http://el.test/>, "ER->base_uri [2]";
1380    
1381     my $xent = $doc2->create_entity_reference ('ext');
1382     $xent->manakai_set_read_only (0, 1);
1383     $xent->manakai_entity_base_uri (q<http://ent.test/>);
1384     $xent->manakai_external (1);
1385     $el->append_child ($xent);
1386     $xent->append_child ($ent);
1387     ok $ent->base_uri, q<http://ent.test/>, "ER->base_uri [3]";
1388     }
1389    
1390     {
1391     my $doc2 = $doc->implementation->create_document;
1392    
1393     my $pi = $doc2->create_processing_instruction ('i');
1394    
1395     ok $pi->base_uri, undef, "PI->base_uri [0]";
1396     ok $pi->manakai_base_uri, undef, "PI->manakai_base_uri [0]";
1397    
1398     $doc2->document_uri (q<http://doc.test/>);
1399     ok $pi->base_uri, q<http://doc.test/>, "PI->base_uri [1]";
1400     ok $pi->manakai_base_uri, undef, "PI->manakai_base_uri [1]";
1401    
1402     my $el = $doc2->create_element_ns (undef, 'e');
1403     $el->set_attribute_ns ('http://www.w3.org/XML/1998/namespace', 'xml:base',
1404     q<http://el.test/>);
1405     $el->append_child ($pi);
1406     ok $pi->base_uri, q<http://el.test/>, "PI->base_uri [2]";
1407     ok $pi->manakai_base_uri, undef, "PI->manakai_base_uri [2]";
1408    
1409     my $ent = $doc2->create_entity_reference ('ent');
1410     $ent->manakai_set_read_only (0, 1);
1411     $ent->manakai_external (1);
1412     $ent->manakai_entity_base_uri (q<http://ent.test/>);
1413     $el->append_child ($ent);
1414     $ent->append_child ($pi);
1415     ok $pi->base_uri, q<http://ent.test/>, "PI->base_uri [3]";
1416     ok $pi->manakai_base_uri, undef, "PI->manakai_base_uri [3]";
1417    
1418     $pi->manakai_base_uri (q<http://pi.ent/>);
1419     ok $pi->base_uri, q<http://pi.ent/>, "PI->base_uri [4]";
1420     ok $pi->manakai_base_uri, q<http://pi.ent/>, "PI->manakai_base_uri [4]";
1421    
1422     $pi->manakai_base_uri (undef);
1423     ok $pi->base_uri, q<http://ent.test/>, "PI->base_uri [5]";
1424     ok $pi->manakai_base_uri, undef, "PI->manakai_base_uri [5]";
1425     }
1426    
1427     {
1428     my $doc2 = $doc->implementation->create_document;
1429    
1430     my $pi = $doc2->create_notation ('i');
1431    
1432     $doc2->document_uri (q<http://doc.test/>);
1433     ok $pi->base_uri, q<http://doc.test/>, "Notation->base_uri [1]";
1434    
1435     $pi->manakai_declaration_base_uri (q<http://www.example/>);
1436     ok $pi->base_uri, q<http://doc.test/>, "Notation->base_uri [2]";
1437     }
1438    
1439     {
1440     my $dt = $doc->implementation->create_document_type ('name');
1441     ok $dt->base_uri, undef, "DT->base_uri [0]";
1442    
1443     my $doc2 = $doc->implementation->create_document;
1444     $doc2->append_child ($dt);
1445     $doc2->document_uri (q<http://doc.test/>);
1446     ok $dt->owner_document, $doc2;
1447     ok $dt->base_uri, q<http://doc.test/>, "DT->base_uri [1]";
1448     }
1449    
1450 wakaba 1.6 ## |hasAttribute|
1451     {
1452     my $el = $doc->create_element ('e');
1453     ok $el->has_attributes ? 1 : 0, 0, "Element->has_attributes [0]";
1454    
1455     $el->set_attribute (a => 'b');
1456     ok $el->has_attributes ? 1 : 0, 1, "Element->has_attributes [1]";
1457    
1458     $el->set_attribute (c => 'd');
1459     ok $el->has_attributes ? 1 : 0, 1, "Element->has_attributes [2]";
1460    
1461     $el->remove_attribute ('c');
1462     ok $el->has_attributes ? 1 : 0, 1, "Element->has_attributes [3]";
1463    
1464     $el->get_attribute_node ('a')->specified (0);
1465     ok $el->has_attributes ? 1 : 0, 1, "Element->has_attributes [4]";
1466    
1467     $el->remove_attribute ('a');
1468     ok $el->has_attributes ? 1 : 0, 0, "Element->has_attributes [5]";
1469     }
1470    
1471     ## |hasChildNodes|
1472     {
1473     my $doc2 = $doc->implementation->create_document;
1474    
1475     ok $doc2->has_child_nodes ? 1 : 0, 0, "Document->has_child_nodes [0]";
1476    
1477     $doc2->append_child ($doc2->create_comment (''));
1478     ok $doc2->has_child_nodes ? 1 : 0, 1, "Document->has_child_nodes [1]";
1479    
1480     $doc2->append_child ($doc2->create_comment (''));
1481     ok $doc2->has_child_nodes ? 1 : 0, 1, "Document->has_child_nodes [2]";
1482    
1483     $doc2->remove_child ($doc2->first_child);
1484     ok $doc2->has_child_nodes ? 1 : 0, 1, "Document->has_child_nodes [3]";
1485    
1486     $doc2->remove_child ($doc2->first_child);
1487     ok $doc2->has_child_nodes ? 1 : 0, 0, "Document->has_child_nodes [4]";
1488     }
1489    
1490     ## |compareDocumentPosition|
1491     {
1492     my $e1 = $doc->create_element ('e1');
1493     my $e2 = $doc->create_element ('e2');
1494    
1495     my $dp2 = $e1->compare_document_position ($e2);
1496    
1497     ok $dp2 & $e1->DOCUMENT_POSITION_DISCONNECTED ? 1 : 0, 1, "cdp [1]";
1498     ok $dp2 & $e1->DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC ? 1 : 0, 1, "edp [2]";
1499     ok (($dp2 & $e1->DOCUMENT_POSITION_PRECEDING ||
1500     $dp2 & $e1->DOCUMENT_POSITION_FOLLOWING) ? 1 : 0, 1, "cdp [3]");
1501    
1502     my $dp1 = $e2->compare_document_position ($e1);
1503    
1504     ok $dp1 & $e1->DOCUMENT_POSITION_DISCONNECTED ? 1 : 0, 1, "cdp [4]";
1505     ok $dp1 & $e1->DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC ? 1 : 0, 1, "cdp [5]";
1506     ok (($dp1 & $e1->DOCUMENT_POSITION_PRECEDING ||
1507     $dp1 & $e1->DOCUMENT_POSITION_FOLLOWING) ? 1 : 0, 1, "cdp [6]");
1508     }
1509    
1510     {
1511     my $e1 = $doc->create_element ('e1');
1512     my $e2 = $doc->create_element ('e2');
1513    
1514     my $pe = $doc->create_element ('pe');
1515     $pe->append_child ($e1);
1516     $pe->append_child ($e2);
1517    
1518     my $dp2 = $e1->compare_document_position ($e2);
1519    
1520     ok $dp2 & $e1->DOCUMENT_POSITION_FOLLOWING ? 1 : 0, 1, "cde [7]";
1521    
1522     my $dp1 = $e2->compare_document_position ($e1);
1523    
1524     ok $dp1 & $e1->DOCUMENT_POSITION_PRECEDING ? 1 : 0, 1, "cde [8]";
1525     }
1526     ## TODO: Apparently compare_document_position requires more tests.
1527    
1528     ## |lookupNamespaceURI|
1529     {
1530     for my $node (create_nodes ()) {
1531     ok $node->lookup_namespace_uri ('ns1'), undef, $node->node_name . " lnu [0]";
1532     ok $node->lookup_namespace_uri ('xml'), undef, $node->node_name . " lnu [1]";
1533     ok $node->lookup_namespace_uri ('xmlns'), undef, $node->node_name . " lnu [2]";
1534     ok $node->lookup_namespace_uri (''), undef, $node->node_name . " lnu [3]";
1535     ok $node->lookup_namespace_uri (undef), undef, $node->node_name . " lnu [4]";
1536     }
1537    
1538     my $el = $doc->create_element_ns ('about:', 'el');
1539     ok $el->lookup_namespace_uri ('ns1'), undef, 'Element->lnu [0]';
1540    
1541     $el->prefix ('ns1');
1542     ok $el->lookup_namespace_uri ('ns1'), 'about:', 'Element->lnu [1]';
1543    
1544     $el->set_attribute_ns ('http://www.w3.org/2000/xmlns/', 'xmlns:ns1', 'DAV:');
1545     ok $el->lookup_namespace_uri ('ns1'), 'about:', 'Element->lnu [2]';
1546    
1547     $el->prefix (undef);
1548     ok $el->lookup_namespace_uri ('ns1'), 'DAV:', 'Element->lnu [3]';
1549     }
1550    
1551     ## |lookupPrefix|
1552     {
1553     for my $node (create_nodes ()) {
1554     ok $node->lookup_prefix ('http://test/'), undef, $node->node_name . "lp [0]";
1555     ok $node->lookup_prefix ('http://www.w3.org/XML/1998/namespace'), undef, $node->node_name . "lp [1]";
1556     ok $node->lookup_prefix ('http://www.w3.org/2000/xmlns/'), undef, $node->node_name . "lp [2]";
1557     ok $node->lookup_prefix ('http://www.w3.org/1999/xhtml'), undef, $node->node_name . "lp [3]";
1558     ok $node->lookup_prefix (''), undef, $node->node_name . "lp [4]";
1559     ok $node->lookup_prefix (undef), undef, $node->node_name . "lp [5]";
1560     }
1561    
1562     my $el = $doc->create_element_ns ('http://test/', 'e');
1563     ok $el->lookup_prefix ('ns'), undef, "Element->lp [0]";;
1564    
1565     my $el2 = $doc->create_element_ns ('http://test/', 'f');
1566     $el2->append_child ($el);
1567     $el2->prefix ('ns');
1568     ok $el->lookup_prefix ('http://test/'), 'ns', "Element->lp [1]";
1569    
1570     $el->set_attribute_ns ('http://www.w3.org/2000/xmlns/', 'xmlns:a',
1571     'http://test/');
1572     ok $el->lookup_prefix ('http://test/'), 'a', "Element->lp [2]";
1573    
1574     $el->prefix ('b');
1575     ok $el->lookup_prefix ('http://test/'), 'b', "Element->lp [3]";
1576     }
1577    
1578     ## |isDefaultNamespace|
1579     {
1580     for my $node (create_nodes ()) {
1581     next if $node->node_type == 1;
1582     ok $node->is_default_namespace ('about:') ? 1 : 0, 0, $node->node_name."idn[0]";
1583     ok $node->is_default_namespace ('http://www.w3.org/XML/1998/namespace') ? 1 : 0, 0, $node->node_name."idn[2]";
1584     ok $node->is_default_namespace ('http://www.w3.org/2000/xmlns/') ? 1 : 0, 0, $node->node_name."idn[3]";
1585     ok $node->is_default_namespace ('') ? 1 : 0, 0, $node->node_name."idn[4]";
1586     ok $node->is_default_namespace (undef) ? 1 : 0, 0, $node->node_name."idn[5]";
1587     }
1588    
1589     my $el = $doc->create_element_ns ('about:', 'el');
1590     ok $el->is_default_namespace ('about:') ? 1 : 0, 1, "Element->idn [0]";
1591    
1592     $el->prefix ('ns1');
1593     ok $el->is_default_namespace ('about:') ? 1 : 0, 0, "Element->idn [1]";
1594    
1595     $el->set_attribute_ns ('http://www.w3.org/2000/xmlns/', 'xmlns', 'DAV:');
1596     ok $el->is_default_namespace ('about:') ? 1 : 0, 0, "Element->idn [2]";
1597    
1598     $el->set_attribute_ns ('http://www.w3.org/2000/xmlns/', 'xmlns', 'about:');
1599     ok $el->is_default_namespace ('about:') ? 1 : 0, 1, "Element->idn [3]";
1600    
1601     $el->set_attribute_ns ('http://www.w3.org/2000/xmlns/', 'xmlns', '');
1602     ok $el->is_default_namespace ('about:') ? 1 : 0, 0, "Element->idn [4]";
1603     }
1604    
1605     {
1606     my $el = $doc->create_element_ns ('about:', 'p:el');
1607     ok $el->is_default_namespace ('about:') ? 1 : 0, 0, "Element->idn [5]";
1608    
1609     $el->prefix ('ns1');
1610     ok $el->is_default_namespace ('about:') ? 1 : 0, 0, "Element->idn [6]";
1611    
1612     $el->set_attribute_ns ('http://www.w3.org/2000/xmlns/', 'xmlns', 'DAV:');
1613     ok $el->is_default_namespace ('about:') ? 1 : 0, 0, "Element->idn [7]";
1614    
1615     $el->set_attribute_ns ('http://www.w3.org/2000/xmlns/', 'xmlns', 'about:');
1616     ok $el->is_default_namespace ('about:') ? 1 : 0, 1, "Element->idn [8]";
1617    
1618     $el->set_attribute_ns ('http://www.w3.org/2000/xmlns/', 'xmlns', '');
1619     ok $el->is_default_namespace ('about:') ? 1 : 0, 0, "Element->idn [9]";
1620     }
1621    
1622     {
1623     my $el = $doc->create_element ('e');
1624    
1625     ## NOTE: This might look like strange, but it is how it is defined!
1626     ok $el->is_default_namespace (undef) ? 1 : 0, 0, "Element->idn [10]";
1627     ok $el->is_default_namespace ('') ? 1 : 0, 0, "Element->idn [11]";
1628    
1629     $el->set_attribute_ns ('http://www.w3.org/2000/xmlns/', 'xmlns', 'DAV:');
1630     ok $el->is_default_namespace (undef) ? 1 : 0, 0, "Element->idn [12]";
1631     ok $el->is_default_namespace ('') ? 1 : 0, 0, "Element->idn [13]";
1632    
1633     $el->set_attribute_ns ('http://www.w3.org/2000/xmlns/', 'xmlns', '');
1634     ok $el->is_default_namespace (undef) ? 1 : 0, 0, "Element->idn [14]";
1635     ok $el->is_default_namespace ('') ? 1 : 0, 0, "Element->idn [15]";
1636     }
1637    
1638     ## |manakaiParentElement|
1639     {
1640     my $el = $doc->create_element ('el');
1641     ok $el->manakai_parent_element, undef, "mpe [0]";
1642    
1643     my $el2 = $doc->create_element ('el2');
1644     $el->append_child ($el2);
1645     ok $el2->manakai_parent_element, $el, "mpe [1]";
1646    
1647     my $er1 = $doc->create_entity_reference ('er1');
1648     $er1->manakai_set_read_only (0, 1);
1649     $el->append_child ($er1);
1650     $er1->append_child ($el2);
1651     ok $el2->manakai_parent_element, $el, "mpe [1]";
1652     }
1653    
1654     {
1655     my $el = $doc->create_element ('el');
1656     my $t1 = $doc->create_text_node ('t1');
1657     my $t2 = $doc->create_text_node ('t2');
1658     $el->append_child ($t1);
1659     $el->append_child ($t2);
1660     $el->normalize;
1661    
1662     ok $el->text_content, 't1t2', 'normalize [0]';
1663     ok 0+@{$el->child_nodes}, 1, 'normalize [1]';
1664     }
1665    
1666     {
1667     my $el = $doc->create_element ('el');
1668     my $t1 = $doc->create_text_node ('t1');
1669     my $t2 = $doc->create_text_node ('t2');
1670     my $t3 = $doc->create_text_node ('t3');
1671     my $t4 = $doc->create_text_node ('t4');
1672     $el->append_child ($t1);
1673     $el->append_child ($t2);
1674     $el->append_child ($t3);
1675     $el->append_child ($t4);
1676     $el->normalize;
1677    
1678     ok $el->text_content, 't1t2t3t4', 'normalize [2]';
1679     ok 0+@{$el->child_nodes}, 1, 'normalize [3]';
1680     }
1681    
1682     {
1683     my $el = $doc->create_element ('el');
1684     my $t1 = $doc->create_text_node ('t1');
1685     my $t2 = $doc->create_text_node ('t2');
1686     my $c1 = $doc->create_cdata_section ('c1');
1687     my $t3 = $doc->create_text_node ('t3');
1688     my $t4 = $doc->create_text_node ('t4');
1689     $el->append_child ($t1);
1690     $el->append_child ($t2);
1691     $el->append_child ($c1);
1692     $el->append_child ($t3);
1693     $el->append_child ($t4);
1694     $el->normalize;
1695    
1696     ok $el->text_content, 't1t2c1t3t4', 'normalize [4]';
1697     ok 0+@{$el->child_nodes}, 3, 'normalize [5]';
1698     ok $el->first_child->text_content, 't1t2', 'normalize [6]';
1699     ok $el->last_child->text_content, 't3t4', 'normalize [7]';
1700     }
1701    
1702     {
1703     my $el = $doc->create_element ('el');
1704     my $t1 = $doc->create_text_node ('t1');
1705     my $t2 = $doc->create_text_node ('');
1706     $el->append_child ($t1);
1707     $el->append_child ($t2);
1708     $el->normalize;
1709    
1710     ok $el->text_content, 't1', 'normalize [8]';
1711     ok 0+@{$el->child_nodes}, 1, 'normalize [9]';
1712     }
1713    
1714     {
1715     my $el = $doc->create_element ('el');
1716     my $t1 = $doc->create_text_node ('');
1717     my $t2 = $doc->create_text_node ('t2');
1718     $el->append_child ($t1);
1719     $el->append_child ($t2);
1720     $el->normalize;
1721    
1722     ok $el->text_content, 't2', 'normalize [10]';
1723     ok 0+@{$el->child_nodes}, 1, 'normalize [11]';
1724     }
1725    
1726     {
1727     my $el = $doc->create_element ('el');
1728     my $t1 = $doc->create_text_node ('');
1729     $el->append_child ($t1);
1730     $el->normalize;
1731    
1732     ok $el->text_content, '', 'normalize [12]';
1733     ok 0+@{$el->child_nodes}, 0, 'normalize [13]';
1734     }
1735    
1736     {
1737     my $pe = $doc->create_element ('pe');
1738     my $el = $doc->create_element ('el');
1739     my $t1 = $doc->create_text_node ('t1');
1740     my $t2 = $doc->create_text_node ('t2');
1741     $el->append_child ($t1);
1742     $el->append_child ($t2);
1743     $pe->append_child ($el);
1744     $pe->normalize;
1745    
1746     ok $el->text_content, 't1t2', 'normalize [14]';
1747     ok 0+@{$el->child_nodes}, 1, 'normalize [15]';
1748     }
1749    
1750     {
1751     my $pe = $doc->create_element ('pe');
1752     my $el = $doc->create_attribute ('a');
1753     my $t1 = $doc->create_text_node ('t1');
1754     my $t2 = $doc->create_text_node ('t2');
1755     $el->append_child ($t1);
1756     $el->append_child ($t2);
1757     $pe->set_attribute_node ($el);
1758     $pe->normalize;
1759    
1760     ok $el->text_content, 't1t2', 'normalize [16]';
1761     ok 0+@{$el->child_nodes}, 1, 'normalize [17]';
1762     }
1763    
1764     {
1765     my $pe = $doc->create_element_type_definition ('pe');
1766     my $el = $doc->create_attribute_definition ('a');
1767     my $t1 = $doc->create_text_node ('t1');
1768     my $t2 = $doc->create_text_node ('t2');
1769     $el->append_child ($t1);
1770     $el->append_child ($t2);
1771     $pe->set_attribute_definition_node ($el);
1772     $pe->normalize;
1773    
1774     ok $el->text_content, 't1t2', 'normalize [16]';
1775     ok 0+@{$el->child_nodes}, 1, 'normalize [17]';
1776     }
1777    
1778     {
1779     my $dt = $doc->create_document_type_definition ('dt');
1780     my $pe = $doc->create_element_type_definition ('pe');
1781     my $el = $doc->create_attribute_definition ('a');
1782     my $t1 = $doc->create_text_node ('t1');
1783     my $t2 = $doc->create_text_node ('t2');
1784     $el->append_child ($t1);
1785     $el->append_child ($t2);
1786     $pe->set_attribute_definition_node ($el);
1787     $dt->set_element_type_definition_node ($pe);
1788     $dt->normalize;
1789    
1790     ok $el->text_content, 't1t2', 'normalize [18]';
1791     ok 0+@{$el->child_nodes}, 1, 'normalize [19]';
1792     }
1793    
1794     {
1795     my $pe = $doc->create_document_type_definition ('pe');
1796     my $el = $doc->create_general_entity ('a');
1797     my $t1 = $doc->create_text_node ('t1');
1798     my $t2 = $doc->create_text_node ('t2');
1799     $el->append_child ($t1);
1800     $el->append_child ($t2);
1801     $pe->set_general_entity_node ($el);
1802     $pe->normalize;
1803    
1804     ok $el->text_content, 't1t2', 'normalize [20]';
1805     ok 0+@{$el->child_nodes}, 1, 'normalize [21]';
1806     }
1807 wakaba 1.4
1808 wakaba 1.11 ## |getFeature| and |isSupported|
1809     for my $node (create_nodes ()) {
1810     for (
1811     [Core => '1.0', 1],
1812     [Core => '2.0', 1],
1813     [Core => '3.0', 1],
1814     ['+Core' => '3.0', 1],
1815     ['++Core' => '3.0', 0],
1816     [Core => '', 1],
1817     [Core => undef, 1],
1818     [Core => 3, 0],
1819     [XML => '1.0', 1],
1820     [XML => '2.0', 1],
1821     [XML => '3.0', 1],
1822     [XML => '', 1],
1823     [XML => undef, 1],
1824     ['+XML' => undef, 1],
1825     [XMLVersion => '1.0', 1],
1826     [XMLVersion => '1.1', 1],
1827     [XMLVersion => '', 1],
1828     [XMLVersion => undef, 1],
1829     ['+XMLVersion' => undef, 1],
1830     [unknown => 3, 0],
1831     [unknown => '', 0],
1832     [unknown => undef, 0],
1833     ['+unknown' => undef, 0],
1834 wakaba 1.13 [q<http://suika.fam.cx/www/2006/feature/xdoctype> => '', 1],
1835     [q<http://suika.fam.cx/www/2006/feature/xdoctype> => '3.0', 1],
1836 wakaba 1.11 ) {
1837     my $label = $node->node_name . ' ' . $_->[0] . ', ' .
1838     (defined $_->[1] ? $_->[1] : 'undef');
1839     ok $node->can ('get_feature') ? 1 : 0, 1, 'can get_feature ' . $label;
1840     ok $node->get_feature ($_->[0], $_->[1]), $_->[2] ? $node : undef,
1841     'get_feature ' . $label;
1842     ok $node->can ('is_supported') ? 1 : 0, 1, 'can is_supported ' . $label;
1843     ok $node->is_supported ($_->[0], $_->[1]) ? 1 : 0, $_->[2],
1844     'is_supported ' . $label;
1845     }
1846     }
1847    
1848     ## |isEqualNode|
1849     for my $node (create_nodes ()) {
1850     ok $node->can ('is_equal_node') ? 1 : 0, 1, $node->node_name . '->is_eq_n can';
1851    
1852     ok $node->is_equal_node ($node) ? 1 : 0, 1, $node->node_name . '->iseq self';
1853     ok $node == $node ? 1 : 0, 1, $node->node_name . ' == self';
1854     ok $node != $node ? 1 : 0, 0, $node->node_name . ' != self';
1855     ok $node == 'node' ? 1 : 0, 0, $node->node_name . ' == string';
1856     ok $node != 'node' ? 1 : 0, 1, $node->node_name . ' != string';
1857     ok $node == 0 ? 1 : 0, 0, $node->node_name . ' == num';
1858     ok $node != 0 ? 1 : 0, 1, $node->node_name . ' != num';
1859     ok $node == '' ? 1 : 0, 0, $node->node_name . ' == empty';
1860     ok $node != '' ? 1 : 0, 1, $node->node_name . ' != empty';
1861     ok $node == undef () ? 1 : 0, 0, $node->node_name . ' == undef';
1862     ok $node != undef () ? 1 : 0, 1, $node->node_name . ' != undef';
1863     }
1864    
1865     {
1866     my $el1 = $doc->create_element_ns (undef, 'type');
1867     my $el2 = $doc->create_element_ns (undef, 'type');
1868     my $el3 = $doc->create_element_ns (undef, 'TYPE');
1869    
1870     ok $el1 == $el2 ? 1 : 0, 1, 'Element == [1]';
1871     ok $el1 != $el2 ? 1 : 0, 0, 'Element != [1]';
1872     ok $el1 == $el3 ? 1 : 0, 0, 'Element == [2]';
1873     ok $el1 != $el3 ? 1 : 0, 1, 'Element != [2]';
1874    
1875     my $el4 = $doc->create_element_ns ('about:', 'type');
1876     my $el5 = $doc->create_element_ns ('about:', 'type');
1877     my $el6 = $doc->create_element_ns ('about:', 'TYPE');
1878     my $el7 = $doc->create_element_ns ('DAV:', 'type');
1879    
1880     ok $el1 == $el4 ? 1 : 0, 0, 'Element == [3]';
1881     ok $el1 != $el4 ? 1 : 0, 1, 'Element != [3]';
1882     ok $el4 == $el5 ? 1 : 0, 1, 'Element == [4]';
1883     ok $el4 != $el5 ? 1 : 0, 0, 'Element != [4]';
1884     ok $el4 == $el6 ? 1 : 0, 0, 'Element == [5]';
1885     ok $el4 != $el6 ? 1 : 0, 1, 'Element != [5]';
1886     ok $el4 == $el7 ? 1 : 0, 0, 'Element == [6]';
1887     ok $el4 != $el7 ? 1 : 0, 1, 'Element != [6]';
1888    
1889     $el5->prefix ('prefix');
1890     ok $el4 == $el5 ? 1 : 0, 0, 'Element == [7]';
1891     ok $el4 != $el5 ? 1 : 0, 1, 'Element != [7]';
1892     }
1893    
1894     ## |getUserData|, |setUserData|
1895     {
1896     my $node = $dom->create_document;
1897    
1898     my $data = ['2'];
1899     my $handler = sub { 1 };
1900    
1901     ok $node->set_user_data ('key1', $data, $handler), undef,
1902     'set_user_data [1]';
1903    
1904     my $key1_data = $node->get_user_data ('key1');
1905     ok $key1_data, $data, 'set_user_data [2]';
1906     ok $key1_data->[0], $data->[0], 'set_user_data [3]';
1907    
1908     my $data2 = ['4'];
1909     ok $node->set_user_data ('key1', $data2, undef), $data, 'set_user_data [4]';
1910     ok $node->get_user_data ('key1'), $data2, 'set_user_data [5]';
1911    
1912     $node->set_user_data (key1 => undef, $handler);
1913     ok $node->get_user_data ('key1'), undef, 'set_user_data [6]';
1914    
1915     $node->set_user_data (key1 => undef, undef);
1916     ok $node->get_user_data ('key1'), undef, 'set_user_data [7]';
1917     }
1918    
1919 wakaba 1.12 ## |removeChild|
1920     {
1921     my $el = $doc->create_element ('p');
1922     my $c1 = $doc->create_element ('e');
1923     $el->append_child ($c1);
1924     my $c2 = $doc->create_element ('f');
1925     $el->append_child ($c2);
1926     my $c3 = $doc->create_element ('g');
1927     $el->append_child ($c3);
1928     ok $el->can ('remove_child') ? 1 : 0, 1, 'Node->remove_child can [0]';
1929    
1930     my $return = $el->remove_child ($c1);
1931     ok $return, $c1, 'Node->remove_child return [1]';
1932     ok $c1->parent_node, undef, 'Node->remove_child parent_node [1]';
1933     ok $el->first_child, $c2, 'Node->remove_child first_child [1]';
1934     ok $el->last_child, $c3, 'Node->remove_child last_child [1]';
1935     ok 0+@{$el->child_nodes}, 2, 'Node->remove_child child_nodes [1]';
1936     }
1937     {
1938     my $el = $doc->create_element ('p');
1939     my $c1 = $doc->create_element ('e');
1940     $el->append_child ($c1);
1941     my $c2 = $doc->create_element ('f');
1942     $el->append_child ($c2);
1943     my $c3 = $doc->create_element ('g');
1944     $el->append_child ($c3);
1945    
1946     my $return = $el->remove_child ($c2);
1947     ok $return, $c2, 'Node->remove_child return [2]';
1948     ok $c2->parent_node, undef, 'Node->remove_child parent_node [2]';
1949     ok $el->first_child, $c1, 'Node->remove_child first_child [2]';
1950     ok $el->last_child, $c3, 'Node->remove_child last_child [2]';
1951     ok 0+@{$el->child_nodes}, 2, 'Node->remove_child child_nodes [2]';
1952     }
1953     {
1954     my $el = $doc->create_element ('p');
1955     my $c1 = $doc->create_element ('e');
1956     $el->append_child ($c1);
1957     my $c2 = $doc->create_element ('f');
1958     $el->append_child ($c2);
1959     my $c3 = $doc->create_element ('g');
1960     $el->append_child ($c3);
1961    
1962     my $return = $el->remove_child ($c3);
1963     ok $return, $c3, 'Node->remove_child return [3]';
1964     ok $c3->parent_node, undef, 'Node->remove_child parent_node [3]';
1965     ok $el->first_child, $c1, 'Node->remove_child first_child [3]';
1966     ok $el->last_child, $c2, 'Node->remove_child last_child [3]';
1967     ok 0+@{$el->child_nodes}, 2, 'Node->remove_child child_nodes [3]';
1968     }
1969     {
1970     my $el = $doc->create_element ('p');
1971     my $c1 = $doc->create_element ('e');
1972     $el->append_child ($c1);
1973    
1974     my $return = $el->remove_child ($c1);
1975     ok $return, $c1, 'Node->remove_child return [4]';
1976     ok $c1->parent_node, undef, 'Node->remove_child parent_node [4]';
1977     ok $el->first_child, undef, 'Node->remove_child first_child [4]';
1978     ok $el->last_child, undef, 'Node->remove_child last_child [4]';
1979     ok 0+@{$el->child_nodes}, 0, 'Node->remove_child child_nodes [4]';
1980     }
1981    
1982 wakaba 1.17 ## |appendChild|, |insertBefore|, |replaceChild|
1983     for my $node (create_leaf_nodes) {
1984     for my $method_name (qw/append_child insert_before replace_child/) {
1985     ok $node->can ($method_name) ? 1 : 0, 1,
1986     $node->node_name . '->can ' . $method_name;
1987    
1988     for my $node2 (create_nodes) {
1989     try {
1990     if ($method_name eq 'replace_child') {
1991     $node->replace_child ($node2, $node2);
1992     } else {
1993     $node->$method_name ($node2);
1994     }
1995     ok 1, 0,
1996     $node->node_name . '->' . $method_name . ' ' . $node2->node_name;
1997     } catch Message::IF::DOMException with {
1998     if ($_[0]->type eq 'HIERARCHY_REQUEST_ERR' or
1999     ($_[0]->type eq 'WRONG_DOCUMENT_ERR' and
2000     ($node2->owner_document or $node2) ne $doc) or
2001     ($_[0]->type eq 'NOT_FOUND_ERR' and
2002     $method_name eq 'replace_child')) {
2003     ok 1, 1,
2004     $node->node_name . '->' . $method_name . ' ' . $node2->node_name;
2005     }
2006     };
2007     }
2008     }
2009     }
2010    
2011 wakaba 1.2 ## TODO: parent_node tests, as with append_child tests
2012    
2013 wakaba 1.3 ## TODO: text_content tests for CharacterData and PI
2014    
2015 wakaba 1.11 ## |UserDataHandler|, |setData|, and |NODE_DELETED|
2016     ## NOTE: This should be the last test, since it does define
2017     ## Node.DESTORY.
2018     {
2019     my $doc = $dom->create_document ('http://test/', 'ex');
2020     my $node = $doc->document_element;
2021    
2022     $node->set_user_data (key => {}, sub {
2023     my ($op, $key, $data, $src, $dest) = @_;
2024    
2025     ok $op, 3, 'set_user_data operation [8]'; # NODE_DELETED
2026     ok $key, 'key', 'set_user_data key [8]';
2027     ok ref $data, 'HASH', 'set_user_data data [8]';
2028     ok $src, undef, 'set_user_data src [8]';
2029     ok $dest, undef, 'set_user_data dest [8]';
2030     });
2031    
2032     undef $node;
2033     undef $doc;
2034    
2035     ## NOTE: We cannot control exactly when it is called.
2036     }
2037    
2038 wakaba 1.4 =head1 LICENSE
2039    
2040     Copyright 2007 Wakaba <w@suika.fam.cx>
2041 wakaba 1.3
2042 wakaba 1.4 This program is free software; you can redistribute it and/or
2043     modify it under the same terms as Perl itself.
2044 wakaba 1.2
2045 wakaba 1.4 =cut
2046 wakaba 1.2
2047 wakaba 1.17 ## $Date: 2007/07/14 09:19:11 $

admin@suikawiki.org
ViewVC Help
Powered by ViewVC 1.1.24