File Coverage

blib/lib/Data/Focus/LensTester.pm
Criterion Covered Total %
statement 86 86 100.0
branch 11 16 68.7
condition 1 3 33.3
subroutine 20 20 100.0
pod 3 3 100.0
total 121 128 94.5


line stmt bran cond sub pod time code
1             package Data::Focus::LensTester;
2 5     5   17133 use strict;
  5         7  
  5         144  
3 5     5   17 use warnings;
  5         10  
  5         95  
4 5     5   27 use Carp;
  5         8  
  5         254  
5 5     5   21 use Test::More;
  5         7  
  5         27  
6 5     5   1359 use Data::Focus qw(focus);
  5         8  
  5         206  
7 5     5   20 use Scalar::Util qw(refaddr);
  5         5  
  5         3728  
8              
9             sub new {
10 4     4 1 108 my ($class, %args) = @_;
11 12         31 my $self = bless {
12 4         11 map { ($_ => $args{$_}) } qw(test_whole test_part parts)
13             }, $class;
14 4         12 foreach my $key (qw(test_whole test_part)) {
15 8 50       39 croak "$key must be a code-ref" if ref($self->{$key}) ne "CODE";
16             }
17 4 50       25 croak "parts must be an array-ref" if ref($self->{parts}) ne "ARRAY";
18 4         12 return $self;
19             }
20              
21             sub parts {
22 78     78 1 194402 return @{$_[0]->{parts}};
  78         470  
23             }
24              
25             sub test_lens_laws {
26 63     63 1 30101 my ($self, %args) = @_;
27 63         276 my @args = _get_args(%args);
28 63         130 my $exp_focal_points = $args[2];
29 63         199 $self->_test_focal_points(@args);
30 63         52244 $self->_test_set_set(@args);
31 63 100       44448 if($exp_focal_points == 0) {
    100          
32 22         92 $self->_test_get_set(@args);
33             }elsif($exp_focal_points == 1) {
34 23         108 $self->_test_get_set(@args);
35 23         24831 $self->_test_set_get(@args);
36             }else {
37 18         84 $self->_test_set_get(@args);
38             }
39             }
40              
41             sub _get_args {
42 95     95   242 my (%args) = @_;
43 95         194 my $lens = $args{lens};
44 95 50       180 croak "lens must be Data::Focus::Lens object" if !eval { $lens->isa("Data::Focus::Lens") };
  95         580  
45 95         226 my $target = $args{target};
46 95 50       305 croak "target must be a code-ref" if ref($target) ne "CODE";
47 95         220 my $exp_focal_points = $args{exp_focal_points};
48 95 50 33     886 croak "exp_focal_points must be Int" if !defined($exp_focal_points) || $exp_focal_points !~ /^\d+$/;
49 95         382 return ($target, $lens, $exp_focal_points);
50             }
51              
52             sub _test_focal_points {
53 95     95   174 my ($self, $target, $lens, $exp_focal_points) = @_;
54             subtest "focal points" => sub {
55 95     95   42969 my @ret = focus($target->())->list($lens);
56 95         752 is scalar(@ret), $exp_focal_points, "list() returns $exp_focal_points focal points";
57 95         883 };
58             }
59              
60             sub _test_set_set {
61 79     79   183 my ($self, $target, $lens, $exp_focal_points) = @_;
62             subtest "set-set law" => sub {
63 79     79   34148 foreach my $i1 (0 .. $#{$self->{parts}}) {
  79         386  
64 557         317334 foreach my $i2 (0 .. $#{$self->{parts}}) {
  557         1775  
65 4059 100       1803579 next if $i1 == $i2;
66 3502         3862 my ($part1, $part2) = @{$self->{parts}}[$i1, $i2];
  3502         7419  
67 3502         6743 my $left_target = $target->();
68 3502         14075 my $right_target = $target->();
69 3502         12670 my $left_result = focus( focus($left_target)->set($lens, $part1) )->set($lens, $part2);
70 3502         33096 my $right_result = focus($right_target)->set($lens, $part2);
71 3502         21164 $self->{test_whole}->($left_result, $right_result);
72             }
73             }
74 79         671 };
75             }
76              
77             sub _test_set_get {
78 57     57   149 my ($self, $target, $lens, $exp_focal_points) = @_;
79             subtest "set-get law" => sub {
80 57     57   28107 foreach my $part (@{$self->{parts}}) {
  57         257  
81 405         295221 my $left_target = $target->();
82 405         2300 my $left_set = focus($left_target)->set($lens, $part);
83 405         2862 my @left_parts = focus($left_set)->list($lens);
84 405         1988 $self->{test_part}->($_, $part) foreach @left_parts;
85             }
86 57         492 };
87             }
88              
89             sub _test_get_set {
90 45     45   105 my ($self, $target, $lens, $exp_focal_points) = @_;
91             subtest "get-set law" => sub {
92 45     45   22690 foreach my $part (@{$self->{parts}}) {
  45         181  
93 307         137867 my $left_target = $target->();
94 307         1608 my $left_result = focus($left_target)->set($lens, focus($left_target)->get($lens));
95 307         1944 $self->{test_whole}->($left_result, $target->());
96             }
97 45         402 };
98             }
99              
100             foreach my $method_base (qw(set_set set_get get_set)) {
101 5     5   25 no strict "refs";
  5         10  
  5         495  
102             my $method_impl = "_test_$method_base";
103             *{"test_$method_base"} = sub {
104 32     32   19807 my ($self, %args) = @_;
105 32         144 my @args = _get_args(%args);
106 32         130 $self->_test_focal_points(@args);
107 32         25994 $self->$method_impl(@args);
108             };
109             }
110              
111             1;
112             __END__