This is an automated email from the git hooks/post-receive script. intrigeri pushed a commit to annotated tag 0.24 in repository libtest-bdd-cucumber-perl.
commit a76181a3490d829120ee356f21c5c37235ef7cf3 Author: Peter Sergeant <[email protected]> Date: Sat Jun 7 12:59:26 2014 +0100 Removed Ouch --- CHANGES | 6 ++ TODO | 1 - dist.ini | 9 ++- lib/Test/BDD/Cucumber/Errors.pm | 129 ++++++++++++++++++++++++++++++++++++++ lib/Test/BDD/Cucumber/Parser.pm | 27 ++++---- t/500_error_formatter.t | 135 ++++++++++++++++++++++++++++++++++++++++ 6 files changed, 288 insertions(+), 19 deletions(-) diff --git a/CHANGES b/CHANGES index 7c9151c..c74fe71 100644 --- a/CHANGES +++ b/CHANGES @@ -1,4 +1,10 @@ ----- +0.24: 07 Jun 2014 + - Replacing string `eval` with block `eval` for requiring test harnesses - + thanks Paul Cochrane + - Module metadata now points to repository and bug tracker - thanks Peter + Rabbitson + - Removed Ouch 0.23: 05 Jun 2014 - Another attempt to fix up the weird regex test bug - Remove our experiment with ShareDir diff --git a/TODO b/TODO index 1b6dc66..238603e 100644 --- a/TODO +++ b/TODO @@ -13,7 +13,6 @@ - [ ] Add support for explicit outlines - [ ] Simplify Parser - [ ] Add a jUnit outputer -- [ ] Remove Ouch - [ ] Fix indentation - [ ] Quoting in tables is broken - [ ] Placeholders in Pystrings diff --git a/dist.ini b/dist.ini index af7c009..de0d179 100644 --- a/dist.ini +++ b/dist.ini @@ -1,5 +1,5 @@ name = Test-BDD-Cucumber -version = 0.23 +version = 0.24 abstract = Feature-complete Cucumber-style testing in Perl main_module = lib/Test/BDD/Cucumber.pm author = ['Peter Sergeant <[email protected]>','Ben Rogers <[email protected]>'] @@ -7,6 +7,12 @@ license = Perl_5 is_trial = 0 copyright_holder = Peter Sergeant +[MetaResources] +bugtracker.web = https://github.com/sheriff/test-bdd-cucumber-perl/issues +repository.url = https://github.com/sheriff/test-bdd-cucumber-perl.git +repository.web = https://github.com/sheriff/test-bdd-cucumber-perl +repository.type = git + [@Basic] [PkgVersion] [PodVersion] @@ -23,7 +29,6 @@ Getopt::Long = 0 JSON::MaybeXS = 0 Module::Runtime = 0 Moose = 0 -Ouch = 0 Path::Class = 0 Storable = 0 Term::ANSIColor = 3.00 diff --git a/lib/Test/BDD/Cucumber/Errors.pm b/lib/Test/BDD/Cucumber/Errors.pm new file mode 100644 index 0000000..33128ed --- /dev/null +++ b/lib/Test/BDD/Cucumber/Errors.pm @@ -0,0 +1,129 @@ +package Test::BDD::Cucumber::Errors; + +use strict; +use warnings; + +require Exporter; +our @ISA = qw(Exporter); +our @EXPORT_OK = qw(parse_error_from_line); + +=head1 NAME + +Test::BDD::Cucumber::Errors - Consistently formatted errors + +=head1 DESCRIPTION + +Consistently formatted errors + +=head1 NOTE + +This module is not intended to help throw error classes, simply to provide +helpers for consistently formatting certain errors. Most of the errors thrown in +practice are errors with the input test scenarios, and it's helpful to have the +location of the error and context when debugging those. Perhaps in the future +these can return error objects. + +=head1 SYNOPSIS + + use Test::BDD::Cucumber::Errors qw/parse_error_from_line/; + + parse_error_from_line( + "Your input was bad", + $line + ); + +=head1 PARSER ERRORS + +=head2 parse_error_from_line + +Generates a parser error from a L<Test::BDD::Cucumber::Model::Line> object, and +error reason: + + parse_error_from_line( + "Your input was bad", + $line + ); + +=cut + +sub parse_error_from_line { + my ( $message, $line ) = @_; + + my $error = "-- Parse Error --\n\n $message\n"; + $error .= " at [%s] line %d\n"; + $error .= " thrown by: [%s] line %d\n\n"; + $error .= "-- [%s] --\n\n"; + $error .= "%s"; + $error .= "\n%s\n"; + + # Get the caller data + my ( $caller_filename, $caller_line ) = (caller())[1,2]; + + # Get the simplistic filename and line number it occured on + my $feature_filename = $line->document->filename || "(no filename)"; + my $feature_line = $line->number; + + # Get the context lines + my ( $start_line, @lines ) = + _get_context_range( $line->document, $feature_line ); + + my $formatted_lines; + for ( 0 .. 4 ) { + my $actual_line = $start_line + $_; + my $mark = ($feature_line == $actual_line) ? '*' : '|'; + $formatted_lines .= + sprintf("% 3d%s %s\n", + $actual_line, $mark, $lines[$_] + ); + } + + return( + sprintf( $error, + $feature_filename, $feature_line, + $caller_filename, $caller_line, + $feature_filename, $formatted_lines, + ('-' x ((length $feature_filename) + 8)) + ) + ); +} + +sub _get_context_range { + my ( $document, $number ) = @_; + + # Context range + my $min_range = 1; + my $max_range = (scalar @{$document->lines}); + + my @range = ( + $number - 2, $number - 1, + $number, + $number + 1, $number + 2 + ); + + # Push the range higher if needed + while ( $range[0] < $min_range ) { + @range = map { $_+1 } @range; + } + + # Push the range lower if needed + while ( $range[4] > $max_range ) { + @range = map { $_-1 } @range; + } + + # Then cut it off + @range = grep { $_ >= $min_range } @range; + + return( $range[0], map { $document->lines->[$_ - 1]->raw_content } @range ); +} + +=head1 AUTHOR + +Peter Sergeant C<[email protected]> + +=head1 LICENSE + +Copyright 2014, Peter Sergeant; Licensed under the same terms as Perl + +=cut + +1; diff --git a/lib/Test/BDD/Cucumber/Parser.pm b/lib/Test/BDD/Cucumber/Parser.pm index f3e5a4f..2b4e2b9 100644 --- a/lib/Test/BDD/Cucumber/Parser.pm +++ b/lib/Test/BDD/Cucumber/Parser.pm @@ -28,7 +28,6 @@ L<Test::BDD::Cucumber::Model::Feature> object on success. use strict; use warnings; -use Ouch; use File::Slurp; use Test::BDD::Cucumber::Model::Document; @@ -37,10 +36,13 @@ use Test::BDD::Cucumber::Model::Scenario; use Test::BDD::Cucumber::Model::Step; use Test::BDD::Cucumber::Model::TagSpec; use Test::BDD::Cucumber::I18n qw(langdef); +use Test::BDD::Cucumber::Errors qw/parse_error_from_line/; # https://github.com/cucumber/cucumber/wiki/Multiline-Step-Arguments # https://github.com/cucumber/cucumber/wiki/Scenario-outlines + + sub parse_string { my ( $class, $string, $tag_scheme ) = @_; @@ -59,13 +61,13 @@ sub parse_file { sub _construct { my ( $class, $document, $tag_scheme ) = @_; - + my $feature = Test::BDD::Cucumber::Model::Feature->new({ document => $document }); my @lines = $class->_remove_next_blanks( @{ $document->lines } ); $feature->language($class->_extract_language(\@lines)); - my $self = { langdef => + my $self = { langdef => langdef($feature->language) }; bless $self, $class; @@ -120,7 +122,7 @@ sub _extract_feature_name { push( @feature_tags, @tags ); } else { - ouch 'parse_error', "Malformed feature line", $line; + die parse_error_from_line( "Malformed feature line", $line ); } } @@ -159,8 +161,8 @@ sub _extract_scenarios { # Only one background section, and it must be the first if ( $scenarios++ && $type =~ m/^($langdef->{background})/ ) { - ouch 'parse_error', "Background not allowed after scenarios", - $line; + die parse_error_from_line( "Background not allowed after scenarios", + $line); } # Create the scenario @@ -189,7 +191,7 @@ sub _extract_scenarios { push( @scenario_tags, @tags ); } else { - ouch 'parse_error', "Malformed scenario line", $line; + die parse_error_from_line( "Malformed scenario line", $line ); } } @@ -241,8 +243,7 @@ m/^((?:$langdef->{given})|(?:$langdef->{and})|(?:$langdef->{when})|(?:$langdef-> return $self->_extract_table( 6, $scenario, $self->_remove_next_blanks(@lines) ); } else { - warn $line->content; - ouch 'parse_error', "Malformed step line", $line; + die parse_error_from_line( "Malformed step line", $line ); } } @@ -309,7 +310,7 @@ sub _extract_table { } if ( @columns ) { - ouch 'parse_error', "Inconsistent number of rows in table", $line + die parse_error_from_line( "Inconsistent number of rows in table", $line ) unless @rows == @columns; $target->columns( [ @columns ] ) if $target->can('columns'); my $i = 0; @@ -332,12 +333,6 @@ sub _pipe_array { 1; -=head1 ERROR HANDLING - -L<Test::BDD::Cucumber> uses L<Ouch> for exception handling. Errors originating in this -class tend to have a code of C<parse_error> and a L<Test::BDD::Cucumber::Model::Line> -object for data. - =head1 AUTHOR Peter Sergeant C<[email protected]> diff --git a/t/500_error_formatter.t b/t/500_error_formatter.t new file mode 100644 index 0000000..8dd7dbc --- /dev/null +++ b/t/500_error_formatter.t @@ -0,0 +1,135 @@ +#!perl + +use strict; +use warnings; + +use Test::More; +use Test::BDD::Cucumber::Parser; +use Test::BDD::Cucumber::Errors qw/parse_error_from_line/; + +my $feature = Test::BDD::Cucumber::Parser->parse_string( join '', (<DATA>) ); + +# Test different offsets +my @tests = ( + [ 0 => + 1, + "# Somehow I don't see this replacing the other tests this module has...", + "Feature: Simple tests of Digest.pm", + " As a developer planning to use Digest.pm", + "", + " Background:", + ], + [ 1 => + 1, + "# Somehow I don't see this replacing the other tests this module has...", + "Feature: Simple tests of Digest.pm", + " As a developer planning to use Digest.pm", + "", + " Background:", + ], + [ 2 => + 1, + "# Somehow I don't see this replacing the other tests this module has...", + "Feature: Simple tests of Digest.pm", + " As a developer planning to use Digest.pm", + "", + " Background:", + ], + [ 4 => + 2, + "Feature: Simple tests of Digest.pm", + " As a developer planning to use Digest.pm", + "", + " Background:", + ' Given a usable "Digest" class', + ], + [ 10 => + 8, + ' Scenario: Check MD5', + ' Given a Digest MD5 object', + ' When I\'ve added "foo bar baz" to the object', + ' And I\'ve added "bat ban shan" to the object', + ' Then the hex output is "bcb56b3dd4674d5d7459c95e4c8a41d5"', + ], + [ 12 => + 9, + ' Given a Digest MD5 object', + ' When I\'ve added "foo bar baz" to the object', + ' And I\'ve added "bat ban shan" to the object', + ' Then the hex output is "bcb56b3dd4674d5d7459c95e4c8a41d5"', + ' Then the base64 output is "1B2M2Y8AsgTpgAmY7PhCfg"', + ], + [ 13 => + 9, + ' Given a Digest MD5 object', + ' When I\'ve added "foo bar baz" to the object', + ' And I\'ve added "bat ban shan" to the object', + ' Then the hex output is "bcb56b3dd4674d5d7459c95e4c8a41d5"', + ' Then the base64 output is "1B2M2Y8AsgTpgAmY7PhCfg"', + ], + [ 14 => + 9, + ' Given a Digest MD5 object', + ' When I\'ve added "foo bar baz" to the object', + ' And I\'ve added "bat ban shan" to the object', + ' Then the hex output is "bcb56b3dd4674d5d7459c95e4c8a41d5"', + ' Then the base64 output is "1B2M2Y8AsgTpgAmY7PhCfg"', + ], +); + +for ( @tests ) { + my ( $offset, $expected_offset, @lines ) = @$_; + is_deeply( + [ + Test::BDD::Cucumber::Errors::_get_context_range( + $feature->document, $offset ) + ], + [ + $expected_offset, + @lines + ], + "Offset $offset works" + ) +} + +my $make_error = parse_error_from_line( + "Foo bar baz", $feature->document->lines->[1] +); + +is( $make_error, +"-- Parse Error -- + + Foo bar baz + at [(no filename)] line 2 + thrown by: [t/500_error_formatter.t] line 95 + +-- [(no filename)] -- + + 1| # Somehow I don't see this replacing the other tests this module has... + 2* Feature: Simple tests of Digest.pm + 3| As a developer planning to use Digest.pm + 4| "." + 5| Background: + +--------------------- +", + "Error example matches" +); + + +done_testing(); + +__DATA__ +# Somehow I don't see this replacing the other tests this module has... +Feature: Simple tests of Digest.pm + As a developer planning to use Digest.pm + + Background: + Given a usable "Digest" class + + Scenario: Check MD5 + Given a Digest MD5 object + When I've added "foo bar baz" to the object + And I've added "bat ban shan" to the object + Then the hex output is "bcb56b3dd4674d5d7459c95e4c8a41d5" + Then the base64 output is "1B2M2Y8AsgTpgAmY7PhCfg" \ No newline at end of file -- Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-perl/packages/libtest-bdd-cucumber-perl.git _______________________________________________ Pkg-perl-cvs-commits mailing list [email protected] http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/pkg-perl-cvs-commits
