File Coverage

blib/lib/Test2/Workflow/Build.pm
Criterion Covered Total %
statement 62 62 100.0
branch 13 14 92.8
condition 10 14 71.4
subroutine 11 11 100.0
pod 0 3 0.0
total 96 104 92.3


line stmt bran cond sub pod time code
1             package Test2::Workflow::Build;
2 45     45   112838 use strict;
  45         55  
  45         989  
3 45     45   126 use warnings;
  45         46  
  45         886  
4              
5 45     45   15645 use Test2::Workflow::Task::Group;
  45         88  
  45         1820  
6              
7             our @BUILD_FIELDS;
8              
9             BEGIN {
10 45     45   733 @BUILD_FIELDS = qw{
11             primary variant
12             setup teardown
13             variant_setup variant_teardown
14             primary_setup primary_teardown
15             stash
16             };
17             }
18              
19 45     45   190 use base 'Test2::Workflow::Task';
  45         44  
  45         2879  
20 45     45   193 use Test2::Util::HashBase @BUILD_FIELDS, qw/events defaults stack_stop/;
  45         47  
  45         175  
21              
22             sub init {
23 133     133 0 1205 my $self = shift;
24              
25             {
26 133         129 local $Carp::CarpLevel = $Carp::CarpLevel + 1;
  133         281  
27 133         644 $self->SUPER::init();
28             }
29              
30 133   50     2954 $self->{$_} ||= [] for @BUILD_FIELDS;
31 133   50     656 $self->{+DEFAULTS} ||= {};
32             }
33              
34             for my $field (@BUILD_FIELDS) {
35             my $code = sub {
36 777     777   1955 my $self = shift;
37 777         474 push @{$self->{$field}} => @_;
  777         3175  
38             };
39 45     45   16321 no strict 'refs';
  45         72  
  45         17414  
40             *{"add_$field"} = $code;
41             }
42              
43             sub populated {
44 181     181 0 186 my $self = shift;
45 181         261 for my $field (@BUILD_FIELDS) {
46 237 100       205 return 1 if @{$self->{$field}};
  237         841  
47             }
48 7         48 return 0;
49             }
50              
51             sub compile {
52 143     143 0 169 my $self = shift;
53              
54             warn "Workflow build '$self->{+NAME}' is empty " . $self->debug . "\n"
55 143 50 66     306 unless $self->populated || $self->{+SKIP};
56              
57 143         177 my ($primary_setup, $primary_teardown) = @_;
58 143   100     429 $primary_setup ||= [];
59 143   100     345 $primary_teardown ||= [];
60              
61 143         277 my $variant = $self->{+VARIANT};
62 143         178 my $setup = $self->{+SETUP};
63 143         132 my $teardown = $self->{+TEARDOWN};
64 143         138 my $variant_setup = $self->{+VARIANT_SETUP};
65 143         161 my $variant_teardown = $self->{+VARIANT_TEARDOWN};
66              
67 143         174 $primary_setup = [@$primary_setup, @{$self->{+PRIMARY_SETUP}}];
  143         226  
68 143         153 $primary_teardown = [@{$self->{+PRIMARY_TEARDOWN}}, @$primary_teardown];
  143         232  
69              
70             # Get primaries in order.
71             my $primary = [
72             map {
73 524 100       1815 $_->isa(__PACKAGE__)
74             ? $_->compile($primary_setup, $primary_teardown)
75             : $_;
76 143         156 } @{$self->{+PRIMARY}},
  143         205  
77             ];
78              
79 143 100 66     771 if (@$primary_setup || @$primary_teardown) {
80             $primary = [
81             map {
82 83         91 my $p = $_->clone;
  311         1111  
83 311 100       1518 $_->isa('Test2::Workflow::Task::Action') ? Test2::Workflow::Task::Group->new(
84             before => $primary_setup,
85             primary => [ $p ],
86             take => $p,
87             after => $primary_teardown,
88             ) : $_;
89             } @$primary
90             ];
91             }
92              
93             # Build variants
94 143 100       512 if (@$variant) {
95             $primary = [
96             map {
97 54         89 my $v = $_->clone;
  108         730  
98 108         310 Test2::Workflow::Task::Group->new(
99             before => $variant_setup,
100             primary => $primary,
101             after => $variant_teardown,
102             variant => $v,
103             take => $v,
104             );
105             } @$variant
106             ];
107             }
108              
109 143 100       695 my %params = map { Test2::Workflow::Task::Group->can($_) ? ($_ => $self->{$_}) : () } keys %$self;
  2306         6735  
110 143         763 delete $params{$_} for @BUILD_FIELDS;
111              
112 143         530 return Test2::Workflow::Task::Group->new(
113             %params,
114             before => $setup,
115             after => $teardown,
116             primary => $primary,
117             );
118             }
119              
120             1;
121              
122             __END__