File Coverage

examples/calculator/lib/Calculator.pm
Criterion Covered Total %
statement 46 46 100.0
branch 15 18 83.3
condition n/a
subroutine 10 10 100.0
pod 0 6 0.0
total 71 80 88.7


line stmt bran cond sub pod time code
1             package # hide from PAUSE indexer
2             Calculator;
3              
4 3     3   23 use strict;
  3         6  
  3         142  
5 3     3   16 use warnings;
  3         5  
  3         170  
6 3     3   18 use Moo;
  3         8  
  3         22  
7 3     3   1414 use Types::Standard qw( Num Str );
  3         9  
  3         56  
8              
9             has 'left' => ( is => 'rw', isa => Num, default => 0 );
10             has 'right' => ( is => 'rw', isa => Str, default => '' );
11             has 'operator' => ( is => 'rw', isa => Str, default => '+' );
12              
13             has 'display' => ( is => 'rw', isa => Str, default => '0' );
14             has 'equals' => ( is => 'rw', isa => Str, default => '' );
15              
16             sub key_in {
17 128     128 0 558 my ( $self, $seq ) = @_;
18 128         1255 my @possible = grep { /\S/ } split( //, $seq );
  462         1463  
19 128         664 $self->press($_) for @possible;
20             }
21              
22             sub press {
23 566     566 0 1320 my ( $self, $key ) = @_;
24              
25             # Numbers
26 566 100       2601 $self->digit($1) if $key =~ m/^([\d\.])$/;
27              
28             # Operators
29 566 100       17253 $self->key_operator($1) if $key =~ m/^([\+\-\/\*])$/;
30              
31             # Equals
32 566 100       4413 $self->equalsign if $key eq '=';
33              
34             # Clear
35 566 100       4657 $self->clear if $key eq 'C';
36             }
37              
38             sub clear {
39 60     60 0 141 my $self = shift;
40 60         1143 $self->left(0);
41 60         2679 $self->right('');
42 60         2586 $self->operator('+');
43 60         2571 $self->display('0');
44 60         2595 $self->equals('');
45             }
46              
47             sub equalsign {
48 56     56 0 115 my $self = shift;
49 56         223 $self->key_operator('+');
50 56         2530 my $result = $self->left;
51 56         413 $self->clear();
52 56         2441 $self->equals($result);
53 56         2193 $self->display($result);
54             }
55              
56             sub digit {
57 336     336 0 1067 my ( $self, $digit ) = @_;
58              
59             # Deal with decimal weirdness
60 336 100       1135 if ( $digit eq '.' ) {
61 38 50       1060 return if $self->right =~ m/\./;
62 38 50       4481 $digit = '0.' unless length( $self->right );
63             }
64              
65 336         7878 $self->right( $self->right . $digit );
66 336         17483 $self->display( $self->right );
67             }
68              
69             sub key_operator {
70 152     152 0 461 my ( $self, $operator ) = @_;
71              
72 152 50       3619 my $cmd =
    100          
73             $self->left
74             . $self->operator
75             . (
76             length( $self->right )
77             ? $self->right
78             : ( length( $self->equals ) ? $self->equals : '0' )
79             );
80              
81 152         14322 $self->right('');
82 152         7107 $self->equals('');
83              
84 152         13032 $self->left( ( eval $cmd ) + 0 );
85 152         8214 $self->display( $self->left );
86              
87 152         10257 $self->operator($operator);
88             }
89              
90             1;