File Coverage

blib/lib/VS/RuleEngine/Rule/InputUnderThreshold.pm
Criterion Covered Total %
statement 26 27 96.3
branch 4 6 66.6
condition 4 8 50.0
subroutine 6 6 100.0
pod 2 2 100.0
total 42 49 85.7


line stmt bran cond sub pod time code
1             package VS::RuleEngine::Rule::InputUnderThreshold;
2              
3 1     1   5454 use strict;
  1         3  
  1         41  
4 1     1   5 use warnings;
  1         3  
  1         494  
5              
6 1     1   6 use VS::RuleEngine::Constants;
  1         3  
  1         163  
7              
8 1     1   86 use base qw(VS::RuleEngine::Rule);
  1         1  
  1         1512  
9              
10             sub new {
11 7     7 1 20 my ($pkg, %args) = @_;
12 7         40 my $self = bless { %args }, $pkg;
13 7         27 return $self;
14             }
15              
16             sub evaluate {
17 7     7 1 11 my ($self, $input) = @_;
18            
19             # If we have nothing to match aginst it's a no match
20 7 50       7 return KV_NO_MATCH unless %{$self};
  7         25  
21            
22             # The order we evaulate each change in is not relevant
23 7         9 for my $key (keys %{$self}) {
  7         24  
24 11   50     33 my $v1 = $input->get($key) || 0;
25              
26 11         16 my $change = $self->{$key};
27            
28 11 100 66     59 if ($change && ($v1 / $change) >= 1) {
29 5         15 return KV_NO_MATCH;
30             }
31            
32 6 50 33     23 if (!$change && $v1) {
33 0         0 return KV_NO_MATCH;
34             }
35             }
36            
37             # All thresholds passed therefore we have a match
38 2         7 return KV_MATCH;
39             }
40              
41             1;
42              
43             =head1 NAME
44              
45             VS::RuleEngine::Rule::InputUnderThreshold - Generic rule for checking input thresholds
46              
47             =head1 SYNOPSIS
48              
49             use VS::RuleEngine::Declare;
50            
51             my $engine = engine {
52             rule 'valid_name' => instanceof "VS::RuleEngine::Rule::InputUnderThreshold" => with_args {
53             'input_1' => 5,
54             'input_2' => -5,
55             }
56             }
57            
58             =head1 DESCRIPTION
59              
60             This is a generic rule that checks if the value from an input is does not pass a
61             threshold relative to 0. This can be used to model change matrices where a row
62             represets a rule.
63              
64             The following table shows the conditions when it matches
65              
66             Input | Threshold | Result
67             ------+-----------+-------
68             x | 0 | match
69             > y | y > 0 | no match
70             > y | y < 0 | match
71             < y | y < 0 | no match
72             < y | y > 0 | match
73            
74             =head1 USAGE
75              
76             =head2 Rule arguments
77              
78             This rule expects a hash reference as its argument, which is what C<< with_args >> provides,
79             where the key is the name of an input and the value is the expected threshold value.
80              
81             =begin PRIVATE
82              
83             =over 4
84              
85             =item new
86              
87             L
88              
89             =item evaluate
90              
91             L
92              
93             =back
94              
95             =end PRIVATE
96              
97             =cut