File Coverage

blib/lib/Test/Stub/Generator.pm
Criterion Covered Total %
statement 65 71 91.5
branch 15 16 93.7
condition 9 10 90.0
subroutine 19 21 90.4
pod 2 6 33.3
total 110 124 88.7


line stmt bran cond sub pod time code
1             package Test::Stub::Generator;
2 12     12   352161 use 5.008005;
  12         52  
  12         528  
3 12     12   70 use strict;
  12         19  
  12         464  
4 12     12   74 use warnings;
  12         21  
  12         387  
5              
6 12     12   58 use Test::More;
  12         24  
  12         80  
7 12     12   15179 use Test::Deep;
  12         140292  
  12         3113  
8              
9 12     12   105 use Exporter qw(import);
  12         29  
  12         429  
10 12     12   68 use Carp qw(croak);
  12         21  
  12         599  
11 12     12   11157 use Class::Monadic;
  12         291295  
  12         1010  
12 12     12   113 use Data::Util qw(is_array_ref is_code_ref);
  12         30  
  12         9983  
13              
14             our $VERSION = "0.02";
15             our @EXPORT = qw(make_subroutine make_method);
16             our @EXPORT_OK = qw(
17             make_subroutine_utils
18             make_method_utils
19             make_repeat_subroutine
20             make_repeat_method
21             );
22              
23             sub make_subroutine {
24 8     8 1 525224 my (@args) = @_;
25 8         50 return _convert_build( [@args], is_object => 0 );
26             }
27              
28             sub make_subroutine_utils {
29 0     0 0 0 my (@args) = @_;
30 0         0 return _convert_build( [@args], is_object => 0, want_utils => 1 );
31             }
32              
33             sub make_repeat_subroutine {
34 1     1 0 2054 my (@args) = @_;
35 1         7 return _convert_build( [@args], is_object => 0, is_repeat => 1 );
36             }
37              
38             sub make_method {
39 2     2 1 7980 my (@args) = @_;
40 2         11 return _convert_build( [@args], is_object => 1 );
41             }
42              
43             sub make_method_utils {
44 4     4 0 38 my (@args) = @_;
45 4         19 return _convert_build( [@args], is_object => 1, want_utils => 1 );
46             }
47              
48             sub make_repeat_method {
49 0     0 0 0 my (@args) = @_;
50 0         0 return _convert_build( [@args], is_object => 1, is_repeat => 1 );
51             }
52              
53             sub _convert_build {
54 15     15   60 my ($args, %inner_opts) = @_;
55 15         35 my ($exp_ret_list, $opts) = @$args;
56 15 100       433 $exp_ret_list = [$exp_ret_list] unless is_array_ref $exp_ret_list;
57 15   100     105 $opts ||= {};
58 15         33 return _build( $exp_ret_list, { %{ $opts }, %inner_opts } );
  15         115  
59             }
60              
61             sub _build {
62 15     15   36 my ($exp_ret_list, $opts) = @_;
63              
64 15   50     142 my $message = $opts->{message} || "[stub] arguments are as You expected";
65 15   100     81 my $is_object = $opts->{is_object} || 0;
66 15   100     632634 my $is_repeat = $opts->{is_repeat} || 0;
67 15   100     83 my $want_utils = $opts->{want_utils} || 0;
68 15         25 my $call_count = 0;
69              
70             my $method = sub {
71 35     35   6409 my $input = [@_];
72 35 100       118 shift @$input if $is_object;
73 35         70 $call_count++;
74              
75 35 100       119 my $element = $is_repeat ? $exp_ret_list->[0] : shift @$exp_ret_list;
76 35 50       104 unless ( defined $element ) {
77 0         0 fail 'expects and return are already empty.';
78 0         0 return undef;
79             }
80              
81 35         73 my $expects = $element->{expects};
82 35         135 my $return = $element->{return};
83              
84 35 100       140 cmp_deeply($input, $expects, $message)
85             or note explain +{ input => $input, expects => $expects };
86              
87 35 100       383778 return is_code_ref($return) ? $return->() : $return;
88 15         127 };
89              
90 15 100       58 unless ($want_utils) {
91 11         76 return $method;
92             }
93              
94 4         49 my $utils = bless( {}, 'Test::Stub::Generator::Util' );
95             Class::Monadic->initialize($utils)->add_methods(
96             has_next => sub {
97 2 100   2   35 return @$exp_ret_list ? 1 : 0;
98             },
99             is_repeat => sub {
100 2     2   91 return $is_repeat;
101             },
102             called_count => sub {
103 4     4   37 return $call_count;
104             },
105 4         47 );
106              
107 4         466 return ($method, $utils);
108             }
109              
110             1;
111             __END__