File Coverage

lib/Cron/Toolkit/Pattern/Step.pm
Criterion Covered Total %
statement 33 34 97.0
branch 18 22 81.8
condition 5 6 83.3
subroutine 6 6 100.0
pod 0 3 0.0
total 62 71 87.3


line stmt bran cond sub pod time code
1             package Cron::Toolkit::Pattern::Step;
2 2     2   14 use strict;
  2         5  
  2         74  
3 2     2   10 use warnings;
  2         3  
  2         234  
4 2     2   14 use parent 'Cron::Toolkit::Pattern';
  2         16  
  2         22  
5              
6             sub type {
7 662     662 0 1029 return 'step';
8             }
9              
10             sub match {
11 699     699 0 808 my ($self, $value) = @_;
12 699         856 my $step = $self->{children}[1]{value};
13 699 50       906 return 0 if $step <= 0;
14 699         699 my $base = $self->{children}[0];
15              
16 699 100       956 if ( $base->type eq 'wildcard' ) {
    100          
    50          
17 118 100       336 return $value % $step == 0 ? 1 : 0;
18             }
19             elsif ( $base->type eq 'single' ) {
20 382 100 66     433 return $value >= $base->value && ( $value - $base->value ) % $step == 0 ? 1 : 0;
21             }
22             elsif ( $base->type eq 'range' ) {
23 199         300 my $min = $base->{children}[0]{value};
24 199         271 my $max = $base->{children}[1]{value};
25 199 100 100     1092 return $value >= $min && $value <= $max && ( $value - $min ) % $step == 0 ? 1 : 0;
26             }
27 0         0 return 0;
28             }
29              
30             sub to_english {
31 9     9 0 22 my ($self) = @_;
32              
33 9         29 my $step = $self->{children}[1]{value};
34 9         15 my $base = $self->{children}[0];
35 9         41 my $rv = "every $step " . $self->english_unit;
36 9 50       32 $rv .= 's' unless $step == 1;
37              
38 9 100       27 if ( $base->type eq 'range' ) {
    100          
39 2         8 my $from = $base->{children}[0]->english_value;
40 2         8 my $to = $base->{children}[1]->english_value;
41 2         6 $rv .= " from $from to $to";
42             }
43             elsif ($base->type eq 'single') {
44 1         3 $rv .= ' starting ';
45 1 50       4 $rv .= $base->field_type =~ /^second|minute|hour$/ ? 'at ' : 'on ';
46 1         3 $rv .= $base->english_value;
47             }
48 9         32 return $rv;
49             }
50              
51             1;