File Coverage

blib/lib/Test/NameNote.pm
Criterion Covered Total %
statement 27 29 93.1
branch 5 6 83.3
condition 4 9 44.4
subroutine 8 8 100.0
pod 1 1 100.0
total 45 53 84.9


line stmt bran cond sub pod time code
1             package Test::NameNote;
2 3     3   51434 use strict;
  3         9  
  3         114  
3 3     3   17 use warnings;
  3         6  
  3         168  
4             our $VERSION = '0.04';
5              
6             =head1 NAME
7              
8             Test::NameNote - add notes to test names
9              
10             =head1 SYNOPSIS
11              
12             Adds notes to test names in L-based test scripts.
13              
14             use Test::More tests => 10;
15             use Test::NameNote;
16              
17             ok foo(), "foo true";
18             foreach my $foo (0, 1) {
19             my $n1 = Test::NameNote->new("foo=$foo");
20             foreach my $bar (0, 1) {
21             my $n2 = Test::NameNote->new("bar=$bar");
22             is thing($foo, $bar), "thing", "thing returns thing";
23             is thang($foo, $bar), "thang", "thang returns thang";
24             }
25             }
26             ok bar(), "bar true";
27              
28             # prints:
29             1..10
30             ok 1 - foo true
31             ok 2 - thing returns thing (foo=0,bar=0)
32             ok 3 - thang returns thang (foo=0,bar=0)
33             ok 4 - thing returns thing (foo=0,bar=1)
34             ok 5 - thang returns thang (foo=0,bar=1)
35             ok 6 - thing returns thing (foo=1,bar=0)
36             ok 7 - thang returns thang (foo=1,bar=0)
37             ok 8 - thing returns thing (foo=1,bar=1)
38             ok 9 - thang returns thang (foo=1,bar=1)
39             ok 10 - bar true
40              
41             =cut
42              
43 3     3   38 use Test::Builder;
  3         7  
  3         68  
44 3     3   2854 use Sub::Prepend 'prepend';
  3         4091  
  3         1055  
45              
46             our @_notes;
47             our $_wrapped_test_group_ok = 0;
48              
49             _wrap('Test::Builder::ok');
50              
51             sub _wrap {
52 3     3   6 my $target = shift;
53              
54             prepend $target => sub {
55 26 100   26   8173 if (@_notes) {
56             # Append any current notes to the test name in $_[2].
57 16         27 my $note = join ',', map {$$_} @_notes;
  29         72  
58 16 100 66     83 if (defined $_[2] and length $_[2]) {
59 15         36 $note = "$_[2] ($note)";
60             }
61 16         96 @_ = (@_[0,1], $note, @_[3,-1]);
62             }
63 3         19 };
64             }
65              
66             =head1 CONSTRUCTORS
67              
68             =over
69              
70             =item new ( NOTE )
71              
72             Builds a new C object for the specifed NOTE text. The note
73             will be added to the names of all L tests run while the
74             object is in scope.
75              
76             =cut
77              
78             sub new {
79 17     17 1 1722 my ($pkg, $note) = @_;
80              
81 17 50 33     93 if (!$_wrapped_test_group_ok and
82             exists &Test::Builder::_HijackedByTestGroup::ok) {
83 0         0 _wrap('Test::Builder::_HijackedByTestGroup::ok');
84 0         0 $_wrapped_test_group_ok = 1;
85             }
86              
87 17         29 push @_notes, \$note;
88 17   33     113 return bless { NoteRef => \$note }, ref($pkg)||$pkg;
89             }
90              
91             =back
92              
93             =cut
94              
95             sub DESTROY {
96 17     17   3195 my $self = shift;
97              
98 17         29 @_notes = grep {$_ ne $self->{NoteRef}} @_notes;
  29         147  
99             }
100              
101             =head1 AUTHOR
102              
103             Nick Cleaton, C<< >>
104              
105             =head1 COPYRIGHT & LICENSE
106              
107             Copyright 2009 Nick Cleaton, all rights reserved.
108              
109             This program is free software; you can redistribute it and/or modify it under
110             the same terms as Perl itself.
111              
112             =cut
113              
114             1;