]> git.vpit.fr Git - perl/modules/Test-Valgrind.git/commitdiff
Add a new T::V::Command::Aggregate that aggregates several commands together
authorVincent Pit <vince@profvince.com>
Mon, 20 Apr 2009 09:57:44 +0000 (11:57 +0200)
committerVincent Pit <vince@profvince.com>
Mon, 20 Apr 2009 10:04:31 +0000 (12:04 +0200)
MANIFEST
lib/Test/Valgrind/Command.pm
lib/Test/Valgrind/Command/Aggregate.pm [new file with mode: 0644]
lib/Test/Valgrind/Session.pm
t/92-pod-coverage.t

index 785365d76cf859661c211b4fc0082cf698988fa0..8c3766006ff0e98bec5b9f9f047c7f8050ef4bd8 100644 (file)
--- a/MANIFEST
+++ b/MANIFEST
@@ -11,6 +11,7 @@ lib/Test/Valgrind/Action/Suppressions.pm
 lib/Test/Valgrind/Action/Test.pm
 lib/Test/Valgrind/Carp.pm
 lib/Test/Valgrind/Command.pm
+lib/Test/Valgrind/Command/Aggregate.pm
 lib/Test/Valgrind/Command/Perl.pm
 lib/Test/Valgrind/Command/PerlScript.pm
 lib/Test/Valgrind/Report.pm
index 0b491baba248d1768350139f2616b377522d48e6..eb5a3476a2e83cc3cbc345dc1fc659b9ef89bc10 100644 (file)
@@ -50,7 +50,7 @@ sub new {
  }
 
  my $args = delete $args{args};
- $class->_croak('Invalid argument list') unless $args and ref $args eq 'ARRAY';
+ $class->_croak('Invalid argument list') if $args and ref $args ne 'ARRAY';
 
  bless {
   args => $args,
diff --git a/lib/Test/Valgrind/Command/Aggregate.pm b/lib/Test/Valgrind/Command/Aggregate.pm
new file mode 100644 (file)
index 0000000..3b985da
--- /dev/null
@@ -0,0 +1,96 @@
+package Test::Valgrind::Command::Aggregate;
+
+use strict;
+use warnings;
+
+=head1 NAME
+
+Test::Valgrind::Command::Aggregate - A Test::Valgrind command that aggregates several other commands.
+
+=head1 VERSION
+
+Version 1.01
+
+=cut
+
+our $VERSION = '1.01';
+
+=head1 DESCRIPTION
+
+=cut
+
+use Scalar::Util ();
+
+use base qw/Test::Valgrind::Command Test::Valgrind::Carp/;
+
+=head1 METHODS
+
+This class inherits L<Test::Valgrind::Command>.
+
+=head2 C<< new commands => \@commands, ... >>
+
+=cut
+
+my $all_cmds = sub {
+ for (@{$_[0]}) {
+  return 0 unless Scalar::Util::blessed($_)
+                                         and $_->isa('Test::Valgrind::Command');
+ }
+ return 1;
+};
+
+sub new {
+ my $class = shift;
+ $class = ref($class) || $class;
+
+ my %args = @_;
+
+ my $cmds = delete $args{commands};
+ $class->_croak('Invalid commands list')
+                   unless $cmds and ref $cmds eq 'ARRAY' and $all_cmds->($cmds);
+
+ my $self = bless $class->SUPER::new(), $class;
+
+ $self->{commands} = [ @$cmds ];
+
+ $self;
+}
+
+=head2 C<commands>
+
+Read-only accessor for the C<commands> option.
+
+=cut
+
+sub commands { @{$_[0]->{commands} || []} }
+
+=head1 SEE ALSO
+
+L<Test::Valgrind>, L<Test::Valgrind::Command>.
+
+=head1 AUTHOR
+
+Vincent Pit, C<< <perl at profvince.com> >>, L<http://www.profvince.com>.
+
+You can contact me by mail or on C<irc.perl.org> (vincent).
+
+=head1 BUGS
+
+Please report any bugs or feature requests to C<bug-test-valgrind at rt.cpan.org>, or through the web interface at L<http://rt.cpan.org/NoAuth/ReportBug.html?Queue=Test-Valgrind>.
+I will be notified, and then you'll automatically be notified of progress on your bug as I make changes.
+
+=head1 SUPPORT
+
+You can find documentation for this module with the perldoc command.
+
+    perldoc Test::Valgrind::Command::Aggregate
+
+=head1 COPYRIGHT & LICENSE
+
+Copyright 2009 Vincent Pit, all rights reserved.
+
+This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.
+
+=cut
+
+1; # End of Test::Valgrind::Command::Aggregate
index d65ca9e8a0c3763e83ba54bf0e9db264c951208b..3174bdef84d6962962d1457bbf5882405cb0ea05 100644 (file)
@@ -176,14 +176,31 @@ sub extra_supps { @{$_[0]->{extra_supps} || []} }
 
 Runs the command C<$command> through C<valgrind> with the tool C<$tool>, which will report to the action C<$action>.
 
+If the command is a L<Test::Valgrind::Command::Aggregate> object, the action and the tool will be initialized once before running all the aggregated commands.
+
 =cut
 
 sub run {
  my $self = shift;
 
- $self->start(@_);
+ my %args = @_;
+
+ $self->start(%args);
  my $guard = bless sub { $self->finish } => 'Test::Valgrind::Session::Guard';
 
+ $self->_run($args{command});
+}
+
+sub _run {
+ my ($self, $cmd) = @_;
+
+ if ($cmd->isa('Test::Valgrind::Command::Aggregate')) {
+  $self->_run($_) for $cmd->commands;
+  return;
+ }
+
+ $self->command($cmd);
+
  $self->report(Test::Valgrind::Report->new_diag(
   'Using valgrind ' . $self->version . ' located at ' . $self->valgrind
  ));
index dcfcec8032252e4e095c308fb62aa7e89d2b4d0f..e78b413b29c2c1be90b974b2ac3bdcf013a3ce2d 100644 (file)
@@ -18,7 +18,7 @@ plan skip_all => "Pod::Coverage $min_pc required for testing POD coverage" if $@
 
 my $trustparents = { coverage_class => 'Pod::Coverage::CountParents' };
 
-plan tests => 15;
+plan tests => 16;
 
 pod_coverage_ok('Test::Valgrind');
 
@@ -30,6 +30,7 @@ pod_coverage_ok('Test::Valgrind::Action::Test', $trustparents);
 pod_coverage_ok('Test::Valgrind::Carp');
 
 pod_coverage_ok('Test::Valgrind::Command');
+pod_coverage_ok('Test::Valgrind::Command::Aggregate', $trustparents);
 pod_coverage_ok('Test::Valgrind::Command::Perl', $trustparents);
 pod_coverage_ok('Test::Valgrind::Command::PerlScript', $trustparents);