File Coverage

blib/lib/Test/Workflow/Block.pm
Criterion Covered Total %
statement 57 65 87.6
branch 24 30 80.0
condition 24 41 58.5
subroutine 9 9 100.0
pod 0 3 0.0
total 114 148 77.0


line stmt bran cond sub pod time code
1             package Test::Workflow::Block;
2 137     137   714 use strict;
  137         247  
  137         2888  
3 137     137   501 use warnings;
  137         232  
  137         2941  
4              
5 137     137   847 use Fennec::Util qw/accessors/;
  137         224  
  137         710  
6 137     137   25898 use Carp qw/croak/;
  137         224  
  137         5872  
7 137     137   773 use B ();
  137         245  
  137         2948  
8 137     137   789 use Scalar::Util qw/blessed/;
  137         242  
  137         107800  
9             require Time::HiRes;
10              
11             our @CARP_NOT = qw{
12             Test::Workflow
13             Test::Workflow::Meta
14             Test::Workflow::Block
15             Test::Workflow::Layer
16             };
17              
18             accessors qw{
19             name start_line end_line code verbose package diag skip todo should_fail subtype
20             };
21              
22             sub new {
23 1286     1286 0 1720 my $class = shift;
24 1286         2358 my ( $caller, $name, @args ) = @_;
25 1286         1395 my $code;
26              
27 1286 50 33     7061 croak "You must provide a caller (got: $caller)"
      33        
      33        
28             unless $caller && ref $caller && ref $caller eq 'ARRAY' && @$caller;
29 1286 50 33     3555 croak "You must provide a name"
30             unless $name and !ref $name;
31              
32             # If code is first, grab it
33 1286 100 66     3284 $code = shift(@args)
34             if ref $args[0]
35             && ref $args[0] eq 'CODE';
36              
37             # If code is last, grab it
38 1286   100     2910 my $ref = ref $args[-1] || '';
39 1286 100 100     3252 if ( !$code && $ref eq 'CODE' ) {
40 704         964 $code = pop(@args);
41              
42             # if code was last, and in key => code form, pop the key
43 704 100       2028 pop(@args) if $args[-1] =~ m/^(code|method|sub)$/;
44             }
45              
46             # Code must be a param
47 1286         2685 my %proto = @args;
48 1286   66     2480 $code ||= $proto{code} || $proto{method} || $proto{sub};
      66        
49              
50 1286 50 33     3455 croak "You must provide a codeblock"
51             unless $code
52             && ref $code eq 'CODE';
53              
54 1286         7728 my $start_line = B::svref_2object($code)->START->line;
55 1286         2486 my $end_line = $caller->[2];
56 1286 100       2274 $start_line-- unless $start_line == $end_line;
57              
58 1286 100       8486 %proto = (
59             %proto,
60             code => $code,
61             name => $name,
62             package => $caller->[0],
63             start_line => $start_line,
64             end_line => $end_line,
65             diag => ( $start_line == $end_line )
66             ? "line $start_line"
67             : "lines $start_line -> $end_line",
68             );
69              
70 1286         4118 return bless( \%proto, $class );
71             }
72              
73             sub clone_with {
74 79     79 0 104 my $self = shift;
75 79         186 my %params = @_;
76 79         776 bless( {%$self, %params}, blessed($self) );
77             }
78              
79             sub run {
80 610     610 0 1822 my $self = shift;
81 610         1475 my ( $instance, $layer ) = @_;
82 610         4039 my $meta = $instance->TEST_WORKFLOW;
83 610         2216 my $name = "Group: " . $self->name;
84 610   66     6393 my $debug = $instance->can('FENNEC') && $instance->FENNEC->debug;
85              
86 610 100       2708 return $meta->skip->( $name, $self->skip )
87             if $self->skip;
88              
89 606         1517 my $ref = ref $self;
90 606         5117 $ref =~ s/^.*:://;
91 606 50       1800 if ($debug) {
92 0         0 my $collector = Fennec::Runner->new->collector;
93 0         0 my ($sec, $ms) = Time::HiRes::gettimeofday();
94 0         0 my $msg = sprintf(
95             "FENNEC_DEBUG_BLOCK:PID:%d\0START_LINE:%d\0END_LINE:%d\0TYPE:%s\0NAME:%s\0SEC:%d\0MSEC:%d\0STATE:START\n",
96             $$,
97             $self->start_line,
98             $self->end_line,
99             $self->subtype,
100             $self->name,
101             $sec,
102             $ms,
103             );
104 0         0 $collector->diag($msg);
105             }
106              
107 606 100       2023 $meta->todo_start->( $self->todo )
108             if $self->todo;
109              
110 606   50     16366 my $success = eval { $self->code->(@_); 1 } || $self->should_fail || 0;
111 596   100     3316 my $error = $@ || "Error masked!";
112 596         1214 chomp($error);
113              
114 596 100       1869 $meta->todo_end->()
115             if $self->todo;
116              
117 596 50       6707 if ($debug) {
118 0         0 my $collector = Fennec::Runner->new->collector;
119 0         0 my ($sec, $ms) = Time::HiRes::gettimeofday();
120 0         0 my $msg = sprintf(
121             "FENNEC_DEBUG_BLOCK:PID:%d\0START_LINE:%d\0END_LINE:%d\0TYPE:%s\0NAME:%s\0SEC:%d\0MSEC:%d\0STATE:END\n",
122             $$,
123             $self->start_line,
124             $self->end_line,
125             $self->subtype,
126             $self->name,
127             $sec,
128             $ms,
129             );
130 0         0 $collector->diag($msg);
131             }
132              
133 596 100 66     3923 return if $success && !$self->verbose;
134              
135 172   50     1620 $meta->ok->( $success || 0, $name );
136 172 50       10536 $meta->diag->( " ================================" . "\n Error: " . $error . "\n Package: " . $self->package . "\n Block: '" . $self->name . "' on " . $self->diag . "\n\n" ) unless $success;
137             }
138              
139             1;
140              
141             __END__