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

use Test::Tester;
use Test::More;
use Test::MockObject::Extends;

use Test::Selenium::Remote::WebElement;

# Start off by faking a bunch of Selenium::Remote::WebElement calls succeeding
my $successful_element = Test::Selenium::Remote::WebElement->new;
$successful_element = Test::MockObject::Extends->new($successful_element);

$successful_element->set_true(
    qw/
      clear
      click
      submit
      is_selected
      is_enabled
      is_displayed
      send_keys
      /
);

$successful_element->mock( 'get_tag_name', sub {'iframe'} );
$successful_element->mock( 'get_value',    sub {'my_value'} );
$successful_element->mock( 'get_text',     sub {"my_text\nis fantastic"} );

# Given input 'foo' to 'get_attribute', return 'my_foo';
$successful_element->mock( 'get_attribute', sub { 'my_' . $_[1] } );

check_test(
  sub { $successful_element->clear_ok },
  {
    ok => 1,
    name => "clear",
    diag => "",
  }
);

check_test(
  sub { $successful_element->clear_ok('test_name') },
  {
    ok => 1,
    name => "test_name",
    diag => "",
  }
);

check_test(
  sub { $successful_element->click_ok },
  {
    ok => 1,
    name => "click",
    diag => "",
  }
);

check_test(
  sub { $successful_element->submit_ok },
  {
    ok => 1,
    name => "submit",
    diag => "",
  }
);

check_test(
  sub { $successful_element->is_selected_ok },
  {
    ok => 1,
    name => "is_selected",
    diag => "",
  }
);

check_test(
  sub { $successful_element->is_enabled_ok },
  {
    ok => 1,
    name => "is_enabled",
    diag => "",
  }
);

check_test(
  sub { $successful_element->is_displayed_ok },
  {
    ok => 1,
    name => "is_displayed",
    diag => "",
  }
);

check_test(
  sub { $successful_element->send_keys_ok('Hello World', 'I sent keys') },
  {
    ok => 1,
    name => "I sent keys",
    diag => "",
  }
);

# tag_name_*
{
    check_test(
        sub {
            $successful_element->tag_name_is( 'iframe', 'Got an iframe tag?' );
        },
        {   ok   => 1,
            name => "Got an iframe tag?",
            diag => "",
        }
    );

    check_test(
        sub { $successful_element->tag_name_isnt( 'BOOM', 'Not BOOM.' ) },
        {   ok   => 1,
            name => "Not BOOM.",
            diag => "",
        }
    );

    check_test(
        sub {
            $successful_element->tag_name_like( qr/frame/,
                'Matches iframe tag?' );
        },
        {   ok   => 1,
            name => "Matches iframe tag?",
            diag => "",
        }
    );

    check_test(
        sub {
            $successful_element->tag_name_unlike( qr/BOOM/,
                "tag_name doesn't match BOOM" );
        },
        {   ok   => 1,
            name => "tag_name doesn't match BOOM",
            diag => "",
        }
    );
}

# value_*
{
    check_test(
        sub {
            $successful_element->value_is( 'my_value',
                'Got an my_value value?' );
        },
        {   ok   => 1,
            name => "Got an my_value value?",
            diag => "",
        }
    );

    check_test(
        sub { $successful_element->value_isnt( 'BOOM', 'Not BOOM.' ) },
        {   ok   => 1,
            name => "Not BOOM.",
            diag => "",
        }
    );

    check_test(
        sub {
            $successful_element->value_like( qr/val/,
                'Matches my_value value?' );
        },
        {   ok   => 1,
            name => "Matches my_value value?",
            diag => "",
        }
    );

    check_test(
        sub {
            $successful_element->value_unlike( qr/BOOM/,
                "value doesn't match BOOM" );
        },
        {   ok   => 1,
            name => "value doesn't match BOOM",
            diag => "",
        }
    );
}

# text_*
{
    check_test(
        sub {
            $successful_element->text_is( "my_text\nis fantastic",
                'Got an my_text value?' );
        },
        {   ok   => 1,
            name => "Got an my_text value?",
            diag => "",
        }
    );

    check_test(
        sub { $successful_element->text_isnt( 'BOOM', 'Not BOOM.' ) },
        {   ok   => 1,
            name => "Not BOOM.",
            diag => "",
        }
    );

    check_test(
        sub {
            $successful_element->text_like( qr/tex/,
                'Matches my_text value?' );
        },
        {   ok   => 1,
            name => "Matches my_text value?",
            diag => "",
        }
    );

    check_test(
        sub {
            $successful_element->text_unlike( qr/BOOM/,
                "text doesn't match BOOM" );
        },
        {   ok   => 1,
            name => "text doesn't match BOOM",
            diag => "",
        }
    );

}
{ 
    check_test(
        sub {
            $successful_element->attribute_is( 'foo', 'my_foo',
                'attribute_is matched' );
        },
        {   ok   => 1,
            name => "attribute_is matched",
            diag => "",
        }
    );

    check_test(
        sub {
            $successful_element->attribute_isnt( 'foo', 'not_foo',
                'attribute_is not_foo' );
        },
        {   ok   => 1,
            name => "attribute_is not_foo",
            diag => "",
        }
    );

    check_test(
        sub {
            $successful_element->attribute_like( 'foo',qr/foo/,
                'Matches my_attribute' );
        },
        {   ok   => 1,
            name => "Matches my_attribute",
            diag => "",
        }
    );

    check_test(
        sub {
            $successful_element->attribute_unlike( 'bar',qr/foo/,
                "Attribute does not match foo" );
        },
        {   ok   => 1,
            name => "Attribute does not match foo",
            diag => "",
        }
    );
}



#  css_attribute_is($attr_name,$match_str,$test_name);
#  css_attribute_isnt($attr_name,$match_str,$test_name);
#  css_attribute_like($attr_name,$match_re,$test_name);
#  css_attribute_unlike($attr_name,$match_re,$test_name);


done_testing();