use strict; use Test::Base; use HTML::Selector::XPath; eval { require HTML::TreeBuilder::XPath }; plan skip_all => "HTML::TreeBuilder::XPath is not installed." if $@; filters { selector => 'chomp', expected => [ 'lines', 'array' ] }; plan tests => 1 * blocks; run { my $block = shift; my $tree = HTML::TreeBuilder::XPath->new; $tree->parse($block->input); $tree->eof; my @nodes = $tree->findnodes( HTML::Selector::XPath->new($block->selector)->to_xpath ); is_deeply [ map $_->as_XML, @nodes ], $block->expected; } __END__ === --- input
foo
foo
--- selector div.foo --- expected
foo
=== --- input --- selector ul li --- expected
  • bar
  • baz
  • === --- input --- selector ul li:first-child --- expected
  • bar
  • === --- input --- selector li.bar --- expected
  • baz
  • baz
  • === --- input
    foo
    baz
    --- selector div#bar --- expected
    baz
    === --- input
    foo
    baz
    baz
    --- selector div#bar, div.baz --- expected
    baz
    baz
    === --- input
    foo
    baz
    baz
    --- selector div:not([lang|="en"]) --- expected
    foo
    === --- input
    foo
    baz
    baz
    --- selector div:not([class~="foo"]) --- expected
    foo
    baz
    === --- input
    foo
    baz
    baz
    --- selector div:not([class]) --- expected
    foo
    === --- SKIP --- input

    foo

    baz
    --- selector *:not(p) --- expected
    baz
    === --- input

    foo

    bar

    --- selector p.pastoral.marine --- expected

    foo