File Coverage

blib/lib/App/Yath.pm
Criterion Covered Total %
statement 97 101 96.0
branch 25 30 83.3
condition 9 12 75.0
subroutine 17 18 94.4
pod 4 5 80.0
total 152 166 91.5


line stmt bran cond sub pod time code
1             package App::Yath;
2 22     22   138951 use strict;
  22         43  
  22         463  
3 22     22   66 use warnings;
  22         22  
  22         662  
4              
5             our $VERSION = '0.000013';
6              
7 22     22   7941 use Test2::Util::HashBase qw/args harness files exclude renderers/;
  22         30746  
  22         110  
8 22     22   10778 use Test2::Util qw/pkg_to_file/;
  22         20161  
  22         1029  
9              
10 22     22   6673 use Test2::Harness;
  22         65  
  22         483  
11 22     22   90 use Test2::Harness::Parser;
  22         22  
  22         285  
12 22     22   66 use Test2::Harness::Runner;
  22         22  
  22         354  
13              
14 22     22   12979 use Getopt::Long qw/GetOptionsFromArray/;
  22         158427  
  22         67  
15              
16             sub run {
17 44     44 1 7000 my $self = shift;
18 44         136 my $results = $self->{+HARNESS}->run(@{$self->{+FILES}});
  44         238  
19              
20 24         1114 $_->summary($results) for @{$self->{+RENDERERS}};
  24         314  
21              
22 24         158 my $failed = grep {!$_->passed} @$results;
  420         752  
23 24         57210 return $failed;
24             }
25              
26             sub init {
27 56     56 0 139292 my $self = shift;
28 56   100     309 $self->{+ARGS} ||= [];
29 56         56 my @args = @{$self->{+ARGS}};
  56         283  
30              
31 56         99 my (%env, @libs, @switches);
32 56         448 my %harness_args = (
33             env_vars => \%env,
34             libs => \@libs,
35             switches => \@switches,
36              
37             parser_class => '+Test2::Harness::Parser',
38             );
39              
40 56         101 my (@exclude, @render, @preload);
41 56 50       278 my $color = -t STDOUT ? 1 : 0;
42 56         116 my $jobs = 1;
43 56         53 my $merge = 0;
44 56         100 my $verbose = 0;
45 56         75 my $quiet = 0;
46 56         53 my $timeout = 0;
47              
48 56         95 my $runner_class = '+Test2::Harness::Runner';
49              
50 56         340 Getopt::Long::Configure("bundling");
51             GetOptionsFromArray \@args => (
52             'l|lib' => sub {
53 2     2   1396 push @libs, 'lib';
54             },
55             'b|blib' => sub {
56 2     2   113 push @libs, 'blib/lib', 'blib/arch';
57             },
58             'I|include=s@' => \@libs,
59             'R|renderer=s@' => \@render,
60             'L|preload=s@' => \@preload,
61              
62             'c|color=i' => \$color,
63             'h|help' => \&help,
64             'j|jobs=i' => \$jobs,
65             'm|merge' => \$merge,
66             'q|quiet' => \$quiet,
67             'v|verbose' => \$verbose,
68             'x|exclude=s@' => \@exclude,
69             't|timeout=i' => \$timeout,
70              
71             'parser|parser_class=s' => \$harness_args{parser_class},
72             'runner|runner_class=s' => \$runner_class,
73              
74             'S|switch=s@' => sub {
75 6     6   2924 push @switches => split '=', $_[1];
76             },
77 56 50       2964 ) or die "Could not parse the command line options given.\n";
78              
79 56 100 100     64106 die "You cannot combine preload (-L) with switches (-S).\n"
80             if @preload && @switches;
81              
82 54 100       217 unshift @render => 'EventStream'
83             unless $quiet;
84              
85             {
86 54         52 local $ENV{TB_NO_EARLY_INIT} = 1;
  54         400  
87 54         432 local @INC = (@libs, @INC);
88 54         170 load_module('', $_) for @preload;
89 54 50       1189 load_module('Test2::Harness::Runner::', $runner_class) if $runner_class;
90 54 50       1411 load_module('Test2::Harness::Parser::', $harness_args{parser_class}) if $harness_args{parser_class};
91 54         1039 load_module('Test2::Harness::Renderer::', $_) for @render;
92             }
93              
94 54         1232 $harness_args{timeout} = $timeout;
95 54         98 $harness_args{jobs} = $jobs;
96 54 100       625 $harness_args{runner} = $runner_class->new(merge => $merge, via => @preload ? 'do' : 'open3');
97              
98 54         220 my @renderers;
99 54         123 for my $r (@render) {
100 58         359 push @renderers => $r->new(
101             color => $color,
102             parallel => $jobs,
103             verbose => $verbose,
104             );
105             }
106              
107 54         258 $harness_args{listeners} = [ map { $_->listen } @renderers ];
  58         238  
108              
109 54         156 $self->{+RENDERERS} = \@renderers;
110 54         374 $self->{+HARNESS} = Test2::Harness->new(%harness_args, verbose => $verbose);
111              
112 54         204 $self->{+EXCLUDE} = \@exclude;
113 54         193 $self->{+FILES} = $self->expand_files(@args);
114             }
115              
116             sub load_module {
117 191     191 1 2312 my $prefix = shift;
118 191 100       600 $prefix = '' if $_[0] =~ s/^\+//;
119 191 100       365 $_[0] = "${prefix}$_[0]" if $prefix;
120 191         481 require(pkg_to_file($_[0]));
121             }
122              
123             sub expand_files {
124 62     62 1 797 my $self = shift;
125              
126 62         135 my @in = @_;
127 62 100 66     16135 push @in => 't' if !@in && -d 't';
128              
129 62         103 my (@files, @dirs);
130 62         110 for my $f (@in) {
131 104 100 50     1210 push @files => $f and next if -f $f;
132 100 50 50     644 push @dirs => $f and next if -d $f;
133 0         0 die "'$f' is not a valid test file or directory"
134             }
135              
136 62 100       140 if (@dirs) {
137 58         321 require File::Find;
138             File::Find::find(
139             sub {
140 22     22   14923 no warnings 'once';
  22         22  
  22         4056  
141 2224 100   2224   56987 push @files => $File::Find::name if -f $_ & m/\.t2?$/;
142             },
143             @dirs
144 58         4212 );
145             }
146              
147 62         276 my $exclude = $self->{+EXCLUDE};
148 62 100       181 if (@$exclude) {
149             @files = grep {
150 46         70 my $file = $_;
  872         568  
151 872         629 grep { $file !~ m/$_/ } @$exclude;
  874         1475  
152             } @files;
153             }
154              
155 62         462 return \@files;
156             }
157              
158             sub help {
159 0     0 1   my $self = shift;
160              
161 0           print <<" EOT";
162             Usage: $0 [OPTIONS] File1 File2 Directory ...
163              
164             Common Options:
165             -l --lib Add lib/ to \@INC.
166             -b --blib Add blib/lib and blib/arch to \@INC.
167             -I[dir] --include="dir" Add directories to \@INC.
168             -L[Module] --preload="Module" Add a module to preload. (Prefork)
169             -R[name] --renderer="name" Add a renderer. (See [name] section)
170             -S[s=val] --switch="s=val" Add switches to use when executing perl.
171             -c[n] --color=n Override the default color level. (0=off)
172             -h --help Show this usage help.
173             -j[n] --jobs=n How many tests to run concurrently.
174             -m --merge Merge STDERR and STDOUT from test files.
175             -q --quiet Do not use the default renderer.
176             -v --verbose Show every event, not just failures and diag.
177             -t --timeout=n Event timeout, kill tests that stall too long.
178             -x[pattern] --exclude=[pattern] Exclude any files that match the pattern.
179              
180             Other Options:
181             --parser=[name] --parser_class=[name] Override the default parser.
182             --runner=[name] --runner_class=[name] Override the default runner.
183              
184             [name]
185             -R[name] --renderer="name"
186             'Test2::Harness::Renderer::[name]' is implied. Prefix with '+' to give an
187             absolute module name.
188              
189             --parser=[name] --parser_class="name"
190             'Test2::Harness::Parser::[name]' is implied. Prefix with '+' to give an
191             absolute module name.
192              
193             --runner=[name] --runner_class="name"
194             'Test2::Harness::Runner::[name]' is implied. Prefix with '+' to give an
195             absolute module name.
196              
197             EOT
198              
199 0           exit 0;
200             }
201              
202             1;
203              
204             __END__