Selaa lähdekoodia

while at it, start rewriting the test classes with moo too

Emmanuel Peroumalnaik 12 vuotta sitten
vanhempi
sitoutus
a44c85b1d6
2 muutettua tiedostoa jossa 247 lisäystä ja 288 poistoa
  1. 69 129
      lib/Test/Selenium/Remote/WebElement.pm
  2. 178 159
      t/Test-Selenium-Remote-WebElement.t

+ 69 - 129
lib/Test/Selenium/Remote/WebElement.pm

@@ -1,146 +1,86 @@
 package Test::Selenium::Remote::WebElement;
 use parent 'Selenium::Remote::WebElement';
-
-use Test::More;
+use Moo;
 use Test::Builder;
- 
-our $AUTOLOAD;
-
-our $Test = Test::Builder->new;
-$Test->exported_to(__PACKAGE__);
 
-our %comparator = (
-    is     => 'is_eq',
-    isnt   => 'isnt_eq',
-    like   => 'like',
-    unlike => 'unlike',
+has _builder => (
+    is      => 'lazy',
+    builder => sub { return Test::Builder->new() },
+    handles => [qw/is_eq isnt_eq like unlike/],
 );
 
-our %one_arg = map { $_ => 1 } qw(
-    get_attribute
-    send_keys
 
-);
-sub one_arg {
-    my $self   = shift;
-    my $method = shift;
-    return $one_arg{$method};
+sub _check_main_method {
+    my $self           = shift;
+    my $method         = shift;
+    my $method_to_test = shift;
+    $method = "get_$method";
+    my $rv = $self->$method();
+
+    # +2 because of the delegation on _builder
+    local $Test::Builder::Level = $Test::Builder::Level + 2;
+    return $self->$method_to_test( $rv, @_ );
+}
+
+
+sub text_is {
+    my $self = shift;
+    return $self->_check_main_method( 'text', 'is_eq', @_ );
+}
+
+sub text_isnt {
+    my $self = shift;
+    return $self->_check_main_method( 'text', 'isnt_eq', @_ );
+}
+
+sub text_like {
+    my $self = shift;
+    return $self->_check_main_method( 'text', 'like', @_ );
 }
 
-our %no_arg = map { $_ => 1 } qw(
-    clear
-    click
-    get_text
-    get_value
-    get_tag_name
-    is_enabled
-    is_selected
-    submit
-    );
-
-sub no_arg {
-    my $self   = shift;
-    my $method = shift;
-    return $no_arg{$method};
+sub text_unlike {
+    my $self = shift;
+    return $self->_check_main_method( 'text', 'unlike', @_ );
 }
 
-our %no_return = map { $_ => 1 } qw(send_keys click clear submit);
+sub tag_name_is {
+    my $self = shift;
+    return $self->_check_main_method( 'tag_name', 'is_eq', @_ );
+}
+
+sub tag_name_isnt {
+    my $self = shift;
+    return $self->_check_main_method( 'tag_name', 'isnt_eq', @_ );
+}
+
+sub tag_name_like {
+    my $self = shift;
+    return $self->_check_main_method( 'tag_name', 'like', @_ );
+}
+
+sub tag_name_unlike {
+    my $self = shift;
+    return $self->_check_main_method( 'tag_name', 'unlike', @_ );
+}
+
+sub value_is {
+    my $self = shift;
+    return $self->_check_main_method( 'value', 'is_eq', @_ );
+}
+
+sub value_isnt {
+    my $self = shift;
+    return $self->_check_main_method( 'value', 'isnt_eq', @_ );
+}
 
-sub no_return {
-    my $self   = shift;
-    my $method = shift;
-    return $no_return{$method};
+sub value_like {
+    my $self = shift;
+    return $self->_check_main_method( 'value', 'like', @_ );
 }
 
-sub AUTOLOAD {
-    my $name = $AUTOLOAD;
-    $name =~ s/.*:://;
-    return if $name eq 'DESTROY';
-    my $self = $_[0];
- 
-    my $sub;
-    if ($name =~ /(\w+)_(is|isnt|like|unlike)$/i) {
-        my $getter = "get_$1";
-        my $comparator = $comparator{lc $2};
- 
-        $sub = sub {
-            my( $self, $str, $name ) = @_;
-            # There is no verbose option currently
-            #diag "Test::Selenium::Remote::WebElement running $getter (@_[1..$#_])" if $self->{verbose};
-            $name = "$getter, '$str'" if !defined $name;
-            no strict 'refs';
-            return $Test->$comparator( $self->$getter, $str, $name );
-        };
-    }
-    elsif ($name =~ /(\w+?)_?ok$/i) {
-        my $cmd = $1;
- 
-        # make a subroutine for ok() around the selenium command
-        $sub = sub {
-            my( $self, $arg1, $arg2, $name );
-            $self = $_[0];
-            if ($self->no_arg($cmd)) {
-                $name = $_[1];
-            }
-            elsif ($self->one_arg($cmd)) {
-                $arg1 = $_[1];
-                $name = $_[2];
-            }
-            else {
-                $arg1 = $_[1];
-                $arg2 = $_[2];
-                $name = $_[3];
-            }
-
-            if (!defined $name) {
-                $name = $cmd;
-                $name .= ", $arg1" if defined $arg1;
-                $name .= ", $arg2" if defined $arg2;
-            }
-            # There is no verbose option currently
-            # diag "Test::Selenium::Remote::WebElement running $cmd (@_[1..$#_])" if $self->{verbose};
- 
-            local $Test::Builder::Level = $Test::Builder::Level + 1;
-            my $rc = '';
-            eval { 
-                if ($self->no_arg($cmd)) {
-                    $rc = $self->$cmd();
-                }
-                elsif ($self->one_arg($cmd)) {
-                    $rc = $self->$cmd( $arg1 );
-                }
-                else {
-                    $rc = $self->$cmd( $arg1, $arg2 );
-                }
-            };
-            die $@ if $@ and $@ =~ /Can't locate object method/;
-            diag($@) if $@;
-            if ($self->no_return($cmd)) {
-                $rc = ok( 1, "$name... no return value" );
-            }
-            else {
-                $rc = ok( $rc, $name );
-            }
-            return $rc;
-        };
-    }
- 
-    # jump directly to the new subroutine, avoiding an extra frame stack
-    if ($sub) {
-        no strict 'refs';
-        *{$AUTOLOAD} = $sub;
-        goto &$AUTOLOAD;
-    }
-    else {
-        # try to pass through to Selenium::Remote::WebElement
-        my $sel = 'Selenium::Remote::WebElement';
-        my $sub = "${sel}::${name}";
-        goto &$sub if exists &$sub;
-        my ($package, $filename, $line) = caller;
-        die qq(Can't locate object method "$name" via package ")
-            . __PACKAGE__
-            . qq(" (also tried "$sel") at $filename line $line\n);
-    }
+sub value_unlike {
+    my $self = shift;
+    return $self->_check_main_method( 'value', 'unlike', @_ );
 }
 
 1;

+ 178 - 159
t/Test-Selenium-Remote-WebElement.t

@@ -7,210 +7,227 @@ 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->set_list('get_tag_name','iframe');
-$successful_element->set_list('get_value','my_value');
-$successful_element->set_list('get_text','my_text');
+$successful_element = Test::MockObject::Extends->new($successful_element);
 
-# 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... no return value",
-    diag => "",
-  }
+$successful_element->set_true(
+    qw/
+      clear
+      click
+      submit
+      is_selected
+      is_enabled
+      is_displayed
+      send_keys
+      /
 );
 
-check_test(
-  sub { $successful_element->clear_ok('test_name') },
-  {
-    ok => 1,
-    name => "test_name... no return value",
-    diag => "",
-  }
-);
+$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"} );
 
-check_test(
-  sub { $successful_element->click_ok },
-  {
-    ok => 1,
-    name => "click... no return value",
-    diag => "",
-  }
-);
+# Given input 'foo' to 'get_attribute', return 'my_foo';
+$successful_element->mock( 'get_attribute', sub { 'my_' . $_[1] } );
 
-check_test(
-  sub { $successful_element->submit_ok },
-  {
-    ok => 1,
-    name => "submit... no return value",
-    diag => "",
-  }
-);
+# check_test(
+#   sub { $successful_element->clear_ok },
+#   {
+#     ok => 1,
+#     name => "clear... no return value",
+#     diag => "",
+#   }
+# );
 
-check_test(
-  sub { $successful_element->is_selected_ok },
-  {
-    ok => 1,
-    name => "is_selected",
-    diag => "",
-  }
-);
+# check_test(
+#   sub { $successful_element->clear_ok('test_name') },
+#   {
+#     ok => 1,
+#     name => "test_name... no return value",
+#     diag => "",
+#   }
+# );
 
-check_test(
-  sub { $successful_element->is_enabled_ok },
-  {
-    ok => 1,
-    name => "is_enabled",
-    diag => "",
-  }
-);
+# check_test(
+#   sub { $successful_element->click_ok },
+#   {
+#     ok => 1,
+#     name => "click... no return value",
+#     diag => "",
+#   }
+# );
 
-check_test(
-  sub { $successful_element->is_displayed_ok },
-  {
-    ok => 1,
-    name => "is_displayed",
-    diag => "",
-  }
-);
+# check_test(
+#   sub { $successful_element->submit_ok },
+#   {
+#     ok => 1,
+#     name => "submit... no return value",
+#     diag => "",
+#   }
+# );
 
-check_test(
-  sub { $successful_element->send_keys_ok('Hello World', 'I sent keys') },
-  {
-    ok => 1,
-    name => "I sent keys... no return value",
-    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... no return value",
+#     diag => "",
+#   }
+# );
 
 # tag_name_*
 {
     check_test(
-      sub { $successful_element->tag_name_is('iframe','Got an iframe tag?') },
-      {
-        ok => 1,
-        name => "Got an iframe tag?",
-        diag => "",
-      }
+        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 => "",
-      }
+        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 => "",
-      }
+        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 => "",
-      }
+        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 => "",
-      }
+        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 => "",
-      }
+        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 => "",
-      }
+        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 => "",
-      }
+        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','Got an my_text value?') },
-      {
-        ok => 1,
-        name => "Got an my_text value?",
-        diag => "",
-      }
+        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 => "",
-      }
+        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 => "",
-      }
+        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 => "",
-      }
+        sub {
+            $successful_element->text_unlike( qr/BOOM/,
+                "text doesn't match BOOM" );
+        },
+        {   ok   => 1,
+            name => "text doesn't match BOOM",
+            diag => "",
+        }
     );
 }
 
@@ -221,12 +238,14 @@ check_test(
 {
     local $TODO = 'not implemented yet.';
     check_test(
-      sub { $successful_element->attribute_is('foo', 'my_foo', 'attribute_is matched') },
-      {
-        ok => 1,
-        name => "attribute_is matched",
-        diag => "",
-      }
+        sub {
+            $successful_element->attribute_is( 'foo', 'my_foo',
+                'attribute_is matched' );
+        },
+        {   ok   => 1,
+            name => "attribute_is matched",
+            diag => "",
+        }
     );
 
 }