File Coverage

blib/lib/Test2/Workflow.pm
Criterion Covered Total %
statement 67 71 94.3
branch 21 28 75.0
condition 2 6 33.3
subroutine 14 14 100.0
pod 5 6 83.3
total 109 125 87.2


line stmt bran cond sub pod time code
1             package Test2::Workflow;
2 44     44   260791 use strict;
  44         48  
  44         921  
3 44     44   113 use warnings;
  44         52  
  44         1769  
4              
5             our $VERSION = "0.000018";
6              
7             our @EXPORT_OK = qw/parse_args current_build build root_build init_root build_stack/;
8 44     44   117 use base 'Exporter';
  44         42  
  44         2273  
9              
10 44     44   14778 use Test2::Workflow::Build;
  44         89  
  44         863  
11 44     44   176 use Test2::Workflow::Task::Group;
  44         37  
  44         637  
12 44     44   123 use Test2::API qw/intercept/;
  44         54  
  44         1627  
13 44     44   143 use Scalar::Util qw/blessed/;
  44         33  
  44         26368  
14              
15             sub parse_args {
16 734     734 1 1316 my %input = @_;
17 734         1007 my $args = delete $input{args};
18 734         600 my %out;
19             my %props;
20              
21 734   33     1557 my $caller = $out{frame} = $input{caller} || caller(defined $input{level} ? $input{level} : 1);
22 734         916 delete @input{qw/caller level/};
23              
24 734         965 for my $arg (@$args) {
25 1692 100       2691 if (my $r = ref($arg)) {
26 958 100       1673 if ($r eq 'HASH') {
    50          
27 224         537 %props = (%props, %$arg);
28             }
29             elsif ($r eq 'CODE') {
30             die "Code is already set, did you provide multiple code blocks at $caller->[1] line $caller->[2].\n"
31 734 50       1103 if $out{code};
32              
33 734         800 $out{code} = $arg
34             }
35             else {
36 0         0 die "Not sure what to do with $arg at $caller->[1] line $caller->[2].\n";
37             }
38 958         1154 next;
39             }
40              
41 734 50       1913 if ($arg =~ m/^\d+$/) {
42 0         0 push @{$out{lines}} => $arg;
  0         0  
43 0         0 next;
44             }
45              
46             die "Name is already set to '$out{name}', cannot set to '$arg', did you specify multiple names at $caller->[1] line $caller->[2].\n"
47 734 50       1193 if $out{name};
48              
49 734         919 $out{name} = $arg;
50             }
51              
52             die "a name must be provided, and must be truthy at $caller->[1] line $caller->[2].\n"
53 734 50       1132 unless $out{name};
54              
55             die "a codeblock must be provided at $caller->[1] line $caller->[2].\n"
56 734 50       1005 unless $out{code};
57              
58 734         2819 return { %props, %out, %input };
59             }
60              
61             {
62             my %ROOT_BUILDS;
63             my @BUILD_STACK;
64              
65 835     835 1 1886 sub root_build { $ROOT_BUILDS{$_[0]} }
66 725 100   725 1 3182 sub current_build { @BUILD_STACK ? $BUILD_STACK[-1] : undef }
67 642     642 0 1131 sub build_stack { @BUILD_STACK }
68              
69             sub init_root {
70 42     42 1 130 my ($pkg, %args) = @_;
71 42   33     464 $ROOT_BUILDS{$pkg} ||= Test2::Workflow::Build->new(
72             name => $pkg,
73             flat => 1,
74             iso => 0,
75             async => 0,
76             is_root => 1,
77             %args,
78             );
79              
80 42         215 return $ROOT_BUILDS{$pkg};
81             }
82              
83             sub build {
84 91     91 1 289 my %params = @_;
85 91         261 my $args = parse_args(%params);
86              
87 91         678 my $build = Test2::Workflow::Build->new(%$args);
88              
89 91 100       432 return $build if $args->{skip};
90              
91 86         115 push @BUILD_STACK => $build;
92              
93 86         189 my ($ok, $err);
94             my $events = intercept {
95 86 100   86   79039 my $todo = $args->{todo} ? Test2::Todo->new(reason => $args->{todo}) : undef;
96 86         318 $ok = eval { $args->{code}->(); 1 };
  86         220  
  81         145  
97 86         2171 $err = $@;
98 86 100       221 $todo->end if $todo;
99 86         586 };
100              
101             # Clear the stash
102 86         40427 $build->{stash} = [];
103 86         405 $build->set_events($events);
104              
105 86         910 pop @BUILD_STACK;
106              
107 86 100       201 unless($ok) {
108 5         20 my $hub = Test2::API::test2_stack->top;
109 5         40 my $count = @$events;
110 5 50       55 my $list = $count
111             ? "Overview of unseen events:\n" . join "" => map " " . blessed($_) . " " . $_->trace->debug . "\n", @$events
112             : "";
113 5         205 die <<" EOT";
114             Exception in build '$args->{name}' with $count unseen event(s).
115             $err
116             $list
117             EOT
118             }
119              
120 81         296 return $build;
121             }
122             }
123              
124             1;
125              
126             __END__