The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use strict;
use warnings;

use Test::More;

use lib 't/lib';

use WQTest;

WQTest::test {
    my $class = shift;

    subtest 'data()' => sub { test_data($class) };

    subtest 'name()' => sub { test_name($class) };

    subtest 'id()' => sub { test_id($class) };

};

sub test_data {
    my $class = shift;

    my $wq = $class->new_from_html(q{
        <div>
            <a></a>
        </div>
    });

    subtest setter => sub {
        $wq->find('a')->data( foo => 'bar' );
        pass;
    };

    subtest 'getter' => sub {
       is $wq->find('a')->data('foo') => 'bar';
    };

}

sub test_name {
    my $class = shift;

    my $wq = $class->new_from_html(q{
        <div>
            <a name="foo"></a>
            <b></b>
            <c name="bar" />
        </div>
    });

    subtest 'getter' => sub {
        is_deeply [ $wq->find('a,b,c')->name ], [ 'foo', undef, 'bar' ], "getter, list context";
        is scalar $wq->find('a,b,c')->name, 'foo', "getter, scalar context";
    };

    subtest setter => sub {
        $wq->find('a,b,c')->name( 'quux' );
        is $wq->find($_)->name => 'quux' for 'a'..'c';
    }
}


sub test_id { 
    my $class = shift;

    my $wq = $class->new_from_html(q{
    <div>
        <a></a>
        <b id="foo"></b>
        <c id="bar">1</c>
        <c>2</c>
        <c id="baz">3</c>
    </div>
});

    is_deeply [ $wq->find('a')->id ] => [ undef ], "no id, list context";
    is scalar $wq->find('a')->id  => undef, "no id, scalar context";

    is $wq->find('#foo')->id => 'foo', 'single element';
    is scalar($wq->find('#foo')->id) => 'foo', 'single element, scalar context';

    is_deeply [ $wq->find('c')->id ], [ 'bar', undef, 'baz' ], 'many elements, list context';
    is_deeply scalar $wq->find('c')->id, 'bar', 'many elements, scalar context';

    $wq->find('b')->id('fool');
    is $wq->find('#fool')->tagname => 'b', 'change id, scalar';

    isa_ok $wq->find('c')->id('buz'), 'Web::Query';

    is $wq->find('c')->id('buz')->size => 1, 'only the first element';
    is $wq->find('#buz')->text => 1, "change first element";

    my $i = 0;
    $wq->find('c')->id(sub{ 'new_'.$i++ });

    is $wq->find('#new_'.$_)->size => 1 for 0..2;
}