File Coverage

blib/lib/Language/P/Toy/Value/StringNumber.pm
Criterion Covered Total %
statement 32 40 80.0
branch 20 34 58.8
condition 4 6 66.6
subroutine 10 11 90.9
pod 0 8 0.0
total 66 99 66.6


line stmt bran cond sub pod time code
1             package Language::P::Toy::Value::StringNumber;
2              
3 30     30   165 use strict;
  30         65  
  30         952  
4 30     30   163 use warnings;
  30         68  
  30         1122  
5 30     30   207 use base qw(Language::P::Toy::Value::Scalar);
  30         86  
  30         20494  
6              
7             __PACKAGE__->mk_ro_accessors( qw(string integer float) );
8              
9 0     0 0 0 sub type { 11 }
10              
11             sub clone {
12 2656     2656 0 3456 my( $self, $level ) = @_;
13              
14 2656         14854 return Language::P::Toy::Value::StringNumber->new( { string => $self->{string},
15             integer => $self->{integer},
16             float => $self->{float},
17             } );
18             }
19              
20             sub as_string {
21 264     264 0 1618 my( $self ) = @_;
22              
23 264 100       2114 return $self->{string} if defined $self->{string};
24 28 100       424 return sprintf "%d", $self->{integer} if defined $self->{integer};
25 12 50       339 return sprintf "%.15g", $self->{float} if defined $self->{float};
26 0         0 Carp::confess();
27             }
28              
29             sub as_integer {
30 363     363 0 2736 my( $self ) = @_;
31              
32 363 100       4511 return $self->{integer} if defined $self->{integer};
33 179 50       619 return int( $self->{float} ) if defined $self->{float};
34 0 0       0 return $self->{string} + 0 if defined $self->{string};
35 0         0 return 0;
36             }
37              
38             sub as_float {
39 14088     14088 0 16774 my( $self ) = @_;
40              
41 14088 100       52942 return $self->{float} if defined $self->{float};
42 7125 50       130325 return $self->{integer} if defined $self->{integer};
43 0 0       0 return $self->{string} + 0.0 if defined $self->{string};
44 0         0 return 0.0;
45             }
46              
47             sub assign {
48 2735     2735 0 3704 my( $self, $other ) = @_;
49              
50 2735 50       7589 die unless ref( $self ) eq ref( $other ); # FIXME morph
51              
52 2735         5340 $self->{string} = $other->{string};
53 2735         4048 $self->{integer} = $other->{integer};
54 2735         30366 $self->{float} = $other->{float};
55             }
56              
57             sub as_boolean_int {
58 28     28 0 32 my( $self ) = @_;
59              
60 28 100       100 if( defined $self->{integer} ) {
    50          
    50          
61 17 50       102 return $self->{integer} != 0 ? 1 : 0;
62             } elsif( defined $self->{float} ) {
63 0 0       0 return $self->{float} != 0 ? 1 : 0;
64             } elsif( defined $self->{string} ) {
65 11 50 33     99 return length( $self->{string} ) && $self->{string} ne "0" ? 1 : 0;
66             }
67              
68 0         0 die;
69             }
70              
71             sub is_defined {
72 15     15 0 20 my( $self ) = @_;
73              
74 15 100 100     133 return defined $self->{float}
75             || defined $self->{integer}
76             || defined $self->{string} ? 1 : 0;
77             }
78              
79             1;