File Coverage

blib/lib/Test2/Compare/Object.pm
Criterion Covered Total %
statement 84 84 100.0
branch 42 42 100.0
condition 10 12 83.3
subroutine 19 19 100.0
pod 9 10 90.0
total 164 167 98.2


line stmt bran cond sub pod time code
1             package Test2::Compare::Object;
2 169     169   1760 use strict;
  169         393  
  169         5426  
3 169     169   848 use warnings;
  169         347  
  169         4655  
4              
5 169     169   944 use Test2::Util qw/try/;
  169         368  
  169         7684  
6              
7 169     169   1041 use Test2::Compare::Meta();
  169         328  
  169         3123  
8              
9 169     169   814 use base 'Test2::Compare::Base';
  169         526  
  169         20165  
10              
11             our $VERSION = '0.000155';
12              
13 169     169   1224 use Test2::Util::HashBase qw/calls meta refcheck ending/;
  169         397  
  169         1194  
14              
15 169     169   44523 use Carp qw/croak confess/;
  169         410  
  169         9537  
16 169     169   1068 use Scalar::Util qw/reftype blessed/;
  169         357  
  169         158810  
17              
18             sub init {
19 2214     2214 0 32554 my $self = shift;
20 2214   100     11549 $self->{+CALLS} ||= [];
21 2214         6578 $self->SUPER::init();
22             }
23              
24 18     18 1 69 sub name { '' }
25              
26 5     5 1 28 sub meta_class { 'Test2::Compare::Meta' }
27 29     29 1 110 sub object_base { 'UNIVERSAL' }
28              
29             sub verify {
30 2232     2232 1 3706 my $self = shift;
31 2232         6619 my %params = @_;
32 2232         5153 my ($got, $exists) = @params{qw/got exists/};
33              
34 2232 100       4550 return 0 unless $exists;
35 2231 100       4370 return 0 unless defined $got;
36 2230 100       4432 return 0 unless ref($got);
37 2227 100       6487 return 0 unless blessed($got);
38 2225 100       6573 return 0 unless $got->isa($self->object_base);
39 2224         6775 return 1;
40             }
41              
42             sub add_prop {
43 3004     3004 1 6635 my $self = shift;
44 3004 100       9630 $self->{+META} = $self->meta_class->new unless defined $self->{+META};
45 3004         12054 $self->{+META}->add_prop(@_);
46             }
47              
48             sub add_field {
49 78     78 1 357 my $self = shift;
50 78 100       250 $self->{+REFCHECK} = Test2::Compare::Hash->new unless defined $self->{+REFCHECK};
51              
52             croak "Underlying reference does not have fields"
53 78 100       576 unless $self->{+REFCHECK}->can('add_field');
54              
55 77         239 $self->{+REFCHECK}->add_field(@_);
56             }
57              
58             sub add_item {
59 8     8 1 84 my $self = shift;
60 8 100       35 $self->{+REFCHECK} = Test2::Compare::Array->new unless defined $self->{+REFCHECK};
61              
62             croak "Underlying reference does not have items"
63 8 100       141 unless $self->{+REFCHECK}->can('add_item');
64              
65 7         24 $self->{+REFCHECK}->add_item(@_);
66             }
67              
68             sub add_call {
69 1852     1852 1 7381 my $self = shift;
70 1852         3963 my ($meth, $check, $name, $context) = @_;
71 1852 100 66     10178 $name ||= ref $meth eq 'ARRAY' ? $meth->[0]
    100          
72             : ref $meth eq 'CODE' ? '\&CODE'
73             : $meth;
74 1852   100     2758 push @{$self->{+CALLS}} => [$meth, $check, $name, $context || 'scalar'];
  1852         10256  
75             }
76              
77             sub deltas {
78 2225     2225 1 3772 my $self = shift;
79 2225         6124 my %params = @_;
80 2225         4774 my ($got, $convert, $seen) = @params{qw/got convert seen/};
81              
82 2225         3134 my @deltas;
83 2225         4211 my $meta = $self->{+META};
84 2225         3951 my $refcheck = $self->{+REFCHECK};
85              
86 2225 100       10008 push @deltas => $meta->deltas(%params) if defined $meta;
87              
88 2225         4260 for my $call (@{$self->{+CALLS}}) {
  2225         5760  
89 1942         5126 my ($meth, $check, $name, $context)= @$call;
90 1942   50     3947 $context ||= 'scalar';
91              
92 1942         4331 $check = $convert->($check);
93              
94 1942         4614 my @args;
95 1942 100       4448 if (ref($meth) eq 'ARRAY') {
96 26         48 ($meth,@args) = @{$meth};
  26         97  
97             }
98              
99 1942   100     9734 my $exists = ref($meth) || $got->can($meth);
100 1942         3229 my $val;
101             my ($ok, $err) = try {
102 1942 100   1942   28519 $val = $exists
    100          
    100          
103             ? ( $context eq 'list' ? [ $got->$meth(@args) ] :
104             $context eq 'hash' ? { $got->$meth(@args) } :
105             $got->$meth(@args)
106             )
107             : undef;
108 1942         11873 };
109              
110 1942 100       31748 if (!$ok) {
111 2         8 push @deltas => $self->delta_class->new(
112             verified => undef,
113             id => [METHOD => $name],
114             got => undef,
115             check => $check,
116             exception => $err,
117             );
118             }
119             else {
120 1940 100       9056 push @deltas => $check->run(
121             id => [METHOD => $name],
122             convert => $convert,
123             seen => $seen,
124             exists => $exists,
125             $exists ? (got => $val) : (),
126             );
127             }
128             }
129              
130 2225 100       6970 return @deltas unless defined $refcheck;
131              
132 1268         5089 $refcheck->set_ending($self->{+ENDING});
133              
134 1268 100       9320 if ($refcheck->verify(%params)) {
135 1265         4605 push @deltas => $refcheck->deltas(%params);
136             }
137             else {
138 3         35 push @deltas => $self->delta_class->new(
139             verified => undef,
140             id => [META => 'Object Ref'],
141             got => $got,
142             check => $refcheck,
143             );
144             }
145              
146 1268         4690 return @deltas;
147             }
148              
149             1;
150              
151             __END__