HTML5-DOM
view release on metacpan or search on metacpan
with_child => 1,
return => 'added',
check_offset => 3,
},
];
for my $test (@$test_manipulations_with_fragment) {
my $tree = HTML5::DOM->new->parse('
<ul>
<li>UNIX</li>
<li>Linux</li>
<li id="child">OSX</li>
<li>Windows</li>
<li>FreeBSD</li>
</ul>
');
my $arg = $tree->parseFragment('
<li>NetBSD</li>
<li>OpenBSD</li>
', 'ul');
my $arg_child1 = $arg->firstElementChild;
my $arg_child2 = $arg->lastElementChild;
my $method = $test->{method};
my $child = $tree->at('#child');
my $parent = $child->parent;
my $test_el = $test->{on_parent} ? $parent : $child;
my $result;
if ($test->{with_child}) {
$result = $test_el->$method($arg, $child);
} else {
$result = $test_el->$method($arg);
}
if ($test->{return} eq 'self') {
ok($result == $test_el, "$method with fragment: check return (self)");
} elsif ($test->{return} eq 'added') {
ok($result == $arg, "$method with fragment: check return (added)");
} elsif ($test->{return} eq 'removed') {
ok($result == $child, "$method with fragment: check return (removed)");
}
my $check_offset1 = $test->{check_offset};
my $check_offset2 = $check_offset1 + 1;
my $child_count = $test->{replace} ? 6 : 7;
my $children = $parent->children;
ok($children->item($check_offset1) == $arg_child1, "$method with fragment: check position 1");
ok($children->item($check_offset2) == $arg_child2, "$method with fragment: check position 2");
ok($children->length == $child_count, "$method with fragment: check child count");
ok($arg->childNodes->length == 0, "$method with fragment: check child count of arg");
}
#####################################
# HTML5::DOM::DocType
#####################################
my $doctype_lists = [
{
'in' => '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">',
'out' => '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">',
'name' => 'html',
'systemId' => 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd',
'publicId' => '-//W3C//DTD XHTML 1.0 Strict//EN',
}, {
'in' => '<!DOCTYPE html>',
'out' => '<!DOCTYPE html>',
'name' => 'html',
'systemId' => '',
'publicId' => '',
}, {
'in' => '<!DOCTYPE html PUBLIC>',
'out' => '<!DOCTYPE html>',
'name' => 'html',
'publicId' => '',
'systemId' => '',
}, {
'in' => '<!DOCTYPE html SYSTEM>',
'out' => '<!DOCTYPE html>',
'name' => 'html',
'publicId' => '',
'systemId' => ''
}, {
'in' => '<!DOCTYPE html allala>',
'out' => '<!DOCTYPE html>',
'name' => 'html',
'publicId' => '',
'systemId' => ''
}, {
'out' => '<!DOCTYPE html>',
'in' => '<!DOCTYPE html "allala">',
'name' => 'html',
'publicId' => '',
'systemId' => ''
}, {
'in' => '<!doctype HTML system "about:legacy-compat">',
'out' => '<!DOCTYPE html SYSTEM "about:legacy-compat">',
'name' => 'html',
'publicId' => '',
'systemId' => 'about:legacy-compat'
}, {
'in' => '<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0//EN">',
'out' => '<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0//EN">',
'name' => 'html',
'publicId' => '-//W3C//DTD HTML 4.0//EN',
'systemId' => ''
}, {
'in' => '<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">',
'out' => '<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">',
'name' => 'html',
'publicId' => '-//W3C//DTD HTML 4.0//EN',
'systemId' => 'http://www.w3.org/TR/REC-html40/strict.dtd'
}, {
'in' => '<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">',
'out' => '<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">',
'name' => 'html',
'publicId' => '-//W3C//DTD HTML 4.01//EN',
'systemId' => ''
}, {
'in' => '<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">',
'out' => '<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">',
'name' => 'html',
'publicId' => '-//W3C//DTD HTML 4.01//EN',
'systemId' => 'http://www.w3.org/TR/html4/strict.dtd'
}, {
'in' => '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">',
'out' => '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">',
'name' => 'html',
'publicId' => '-//W3C//DTD XHTML 1.0 Strict//EN',
'systemId' => 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd'
}, {
'in' => '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">',
'out' => '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">',
'name' => 'html',
'publicId' => '-//W3C//DTD XHTML 1.1//EN',
'systemId' => 'http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd'
}, {
'in' => '<!DOCTYPE html SYSTEM "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">',
'out' => '<!DOCTYPE html SYSTEM "-//W3C//DTD XHTML 1.1//EN">',
'name' => 'html',
'publicId' => '',
'systemId' => '-//W3C//DTD XHTML 1.1//EN',
}, {
'in' => '<!DOCTYPE OlOlLo>',
'out' => '<!DOCTYPE olollo>',
'name' => 'olollo',
'publicId' => '',
'systemId' => '',
}, {
'in' => '<!DOCTYPE html PUBLIC "" "xxx">',
'out' => '<!DOCTYPE html SYSTEM "xxx">',
'name' => 'html',
'publicId' => '',
'systemId' => 'xxx',
}, {
'in' => '<!DOCTYPE svg:svg PUBLIC "-//W3C//DTD XHTML 1.1 plus MathML 2.0 plus SVG 1.1//EN" "http://www.w3.org/2002/04/xhtml-math-svg/xhtml-math-svg.dtd">',
'out' => '<!DOCTYPE svg:svg PUBLIC "-//W3C//DTD XHTML 1.1 plus MathML 2.0 plus SVG 1.1//EN" "http://www.w3.org/2002/04/xhtml-math-svg/xhtml-math-svg.dtd">',
'name' => 'svg:svg',
'publicId' => '-//W3C//DTD XHTML 1.1 plus MathML 2.0 plus SVG 1.1//EN',
'systemId' => 'http://www.w3.org/2002/04/xhtml-math-svg/xhtml-math-svg.dtd'
}
];
# basic doctype tests
for my $dt (@$doctype_lists) {
my $tree = HTML5::DOM->new->parse($dt->{in});
if ($dt == $doctype_lists->[0]) {
isa_ok($tree->document->firstChild, 'HTML5::DOM::DocType', 'check doctype isa');
can_ok($tree->document->firstChild, @node_methods);
can_ok($tree->document->firstChild, qw|name publicId systemId|);
}
# check serialization
# ok($tree->document->firstChild->html eq $dt->{out}, 'check doctype serialization');
# check name
ok($tree->document->firstChild->name eq $dt->{name}, 'check doctype name');
# check systemId
ok($tree->document->firstChild->publicId eq $dt->{publicId}, 'check doctype publicId');
# check publicId
ok($tree->document->firstChild->systemId eq $dt->{systemId}, 'check doctype systemId');
}
# test change value
my $doctype_test_change = [
{
method => 'name',
value => 'svg'
},
{
method => 'publicId',
value => '-//W3C//DTD XHTML 1.1 plus MathML 2.0 plus SVG 1.1//EN'
},
{
method => 'systemId',
value => 'http://www.w3.org/2002/04/xhtml-math-svg/xhtml-math-svg.dtd'
}
];
for my $test (@$doctype_test_change) {
my @doctypes = (
'<!DOCTYPE>',
'<!DOCTYPE html>',
'<!DOCTYPE html SYSTEM "blabla">',
'<!DOCTYPE html PUBLIC "blabla">',
'<!DOCTYPE html PUBLIC "blabla" "blabla222">'
);
my $method = $test->{method};
for my $dt (@doctypes) {
my $tree = HTML5::DOM->new->parse($dt);
my @check;
for my $method2 (qw|name publicId systemId|) {
if ($method2 ne $method) {
push @check, {
method => $method2,
value => $tree->document->firstChild->$method2()
};
}
}
isa_ok($tree->document->firstChild->$method($test->{value}), 'HTML5::DOM::DocType');
ok($tree->document->firstChild->$method() eq $test->{value}, "$method: test new val");
for my $c (@check) {
my $method2 = $c->{method};
my $value = $tree->document->firstChild->$method2();
ok($tree->document->firstChild->$method2() eq $c->{value}, "$method: test old val of $method2");
}
}
}
#####################################
# HTML5::DOM::Element
#####################################
# classList
$tree = HTML5::DOM->new->parse('
<div class="red blue">ololo</div>
');
my $cl_test_node = $tree->at('.red');
isa_ok($cl_test_node->classList, 'HTML5::DOM::TokenList');
isa_ok($cl_test_node->classList->add('blue', 'right', 'red', 'brown'), 'HTML5::DOM::TokenList');
ok($cl_test_node->classList->text eq 'red blue right brown', 'class add '.$cl_test_node->classList->text);
isa_ok($cl_test_node->classList->remove('blue', 'right', 'red'), 'HTML5::DOM::TokenList');
ok($cl_test_node->classList->text eq 'brown', 'class remove');
isa_ok($cl_test_node->classList->add('blue', 'right', 'red', 'brown'), 'HTML5::DOM::TokenList');
isa_ok($cl_test_node->classList->replace('right', 'right2'), 'HTML5::DOM::TokenList');
( run in 0.830 second using v1.01-cache-2.11-cpan-119454b85a5 )