File Coverage

blib/lib/Schedule/Easing/Numeric.pm
Criterion Covered Total %
statement 68 79 86.0
branch 32 40 80.0
condition 2 3 66.6
subroutine 12 12 100.0
pod 0 5 0.0
total 114 139 82.0


line stmt bran cond sub pod time code
1             package Schedule::Easing::Numeric;
2              
3 2     2   6066 use strict;
  2         4  
  2         86  
4 2     2   10 use warnings;
  2         5  
  2         111  
5 2     2   380 use parent qw/Schedule::Easing::Ease/;
  2         383  
  2         64  
6 2     2   184 use Carp qw/carp confess/;
  2         6  
  2         153  
7 2     2   20 use Scalar::Util qw/looks_like_number/;
  2         4  
  2         2295  
8              
9             our $VERSION='0.1.4';
10              
11             sub _default_keys {
12 20     20   40 my ($self)=@_;
13             return (
14 20         66 $self->SUPER::_default_keys(),
15             qw/ymin ymax/,
16             );
17             }
18             sub _default {
19 20     20   38 my ($self)=@_;
20             return (
21 20         94 $self->SUPER::_default(),
22             match=>qr/(?\d+)/,
23             ymin=>0,
24             ymax=>1,
25             );
26             }
27              
28             sub new {
29 20     20 0 250912 my ($ref,%opt)=@_;
30 20   66     104 my $class=ref($ref)||$ref;
31             my %self=(
32             type =>'numeric',
33             $class->_default(),
34             (ref($ref)?%$ref:()),
35 20 100       61 map {$_=>$opt{$_}} grep {defined($opt{$_})} $class->_default_keys()
  99         277  
  220         405  
36             );
37 20         117 return bless(\%self,$class)->validate()->init();
38             }
39              
40             sub validate {
41 20     20 0 53 my ($self)=@_;
42 20         73 $self->SUPER::validate();
43 19         31 foreach my $k (qw/ymin ymax/) {
44 37 50       72 if(!defined($$self{$k})) { confess("Must be defined: $k") }
  0         0  
45 37 100       105 if(!looks_like_number($$self{$k})) { confess("Must be numeric: $k") }
  2         655  
46             }
47 17 50       78 if($$self{ymin}>$$self{ymax}) {
    50          
48 0         0 (@$self{qw/ymin ymax/})=@$self{qw/ymax ymin/};
49 0         0 carp('ymin>ymax');
50 0         0 $$self{_err}=1;
51             }
52             elsif($$self{ymin}==$$self{ymax}) {
53 0         0 $$self{ymax}=1+$$self{ymin};
54 0         0 carp('ymin==ymax');
55 0         0 $$self{_err}=1;
56             }
57 17 100       111 if($$self{match}!~/\(\?.*?\)/) { confess("Match pattern does not contain 'value': $$self{match}") }
  2         819  
58 15         44 return $self;
59             }
60              
61             sub init {
62 15     15 0 33 my ($self)=@_;
63 15         86 $self->SUPER::init();
64 15         31 $$self{yrange}=$$self{ymax}-$$self{ymin};
65 15         60 return $self;
66             }
67              
68             sub includes {
69 96245     96245 0 246941 my ($self,$ts,%D)=@_;
70 96245 100       197744 if(!defined($ts)) { return 1 }
  1         3  
71 96244 100       195133 if(!defined($D{value})) { return 1 } # possibly a configuration for the default, but should never be called
  1         3  
72 96243 100       274367 if(!looks_like_number($D{value})) { return 1 } # possibly a config, but can't cast non-numerics at this time
  1         4  
73 96242         205614 my $p=$$self{_shaper}->($ts,@$self{qw/tsA tsB begin final/},@{$$self{shapeopt}});
  96242         243749  
74 96242 100       195284 if($p<=0) { return 0 }
  12020         24183  
75 84222 100       171815 if($p>=1) { return 1 }
  12018         32638  
76 72204 100       207562 if($D{value}-$$self{ymin}<=$p*$$self{yrange}) { return 1 }
  36113         89910  
77 36091         87051 return 0;
78             }
79              
80             sub schedule {
81 4137     4137 0 57839 my ($self,%D)=@_;
82 4137 50       9747 if(!defined($D{value})) { return 0 }
  0         0  
83 4137 50       11661 if(!looks_like_number($D{value})) { return 0 }
  0         0  
84 4137         10139 my $p=($D{value}-$$self{ymin})/$$self{yrange};
85 4137 100       10468 if($$self{begin}<$$self{final}) {
    50          
86 2137 100       5422 if($p<$$self{begin}) { return 0 }
  32         96  
87 2105 100       5367 if($p>$$self{final}) { return }
  13         26  
88             }
89             elsif($$self{begin}>$$self{final}) {
90 2000 50       3801 if($p>$$self{begin}) { return 0 }
  0         0  
91 2000 50       3821 if($p<$$self{final}) { return }
  0         0  
92             }
93 4092         8184 return $$self{_unshaper}->($p,@$self{qw/tsA tsB begin final/},@{$$self{shapeopt}});
  4092         11758  
94             }
95              
96             1;