our
$VERSION
=
'1.302210'
;
our
$DEFAULT_TOLERANCE
= 1e-08;
sub
init {
my
$self
=
shift
;
my
$input
=
$self
->{+INPUT};
if
(
exists
$self
->{+TOLERANCE} and
exists
$self
->{+PRECISION} ) {
confess
"can't set both tolerance and precision"
;
}
elsif
(!
exists
$self
->{+PRECISION} and !
exists
$self
->{+TOLERANCE}) {
$self
->{+TOLERANCE} =
$DEFAULT_TOLERANCE
}
confess
"input must be defined for 'Float' check"
unless
defined
$input
;
confess
"input must be a number for 'Float' check"
unless
length
(
$input
) &&
$input
=~ m/\S/;
confess
"precision must be an integer for 'Float' check"
if
exists
$self
->{+PRECISION} &&
$self
->{+PRECISION} !~ m/^\d+$/;
$self
->SUPER::init(
@_
);
}
sub
name {
my
$self
=
shift
;
my
$in
=
$self
->{+INPUT};
my
$precision
=
$self
->{+PRECISION};
if
(
defined
$precision
) {
return
sprintf
"%.*f"
,
$precision
,
$in
;
}
my
$tolerance
=
$self
->{+TOLERANCE};
return
"$in +/- $tolerance"
;
}
sub
operator {
my
$self
=
shift
;
return
''
unless
@_
;
my
(
$got
) =
@_
;
return
''
unless
defined
(
$got
);
return
''
unless
length
(
$got
) &&
$got
=~ m/\S/;
if
(
$self
->{+PRECISION} )
{
return
'ne'
if
$self
->{+NEGATE};
return
'eq'
;
}
return
'!='
if
$self
->{+NEGATE};
return
'=='
;
}
sub
verify {
my
$self
=
shift
;
my
%params
=
@_
;
my
(
$got
,
$exists
) =
@params
{
qw/got exists/
};
return
0
unless
$exists
;
return
0
unless
defined
$got
;
return
0
if
ref
$got
;
return
0
unless
length
(
$got
) &&
$got
=~ m/\S/;
my
$input
=
$self
->{+INPUT};
my
$negate
=
$self
->{+NEGATE};
my
$tolerance
=
$self
->{+TOLERANCE};
my
$precision
=
$self
->{+PRECISION};
my
@warnings
;
my
$out
;
{
local
$SIG
{__WARN__} =
sub
{
push
@warnings
=>
@_
};
my
$equal
= (
$input
==
$got
);
if
(!
$equal
) {
if
(
defined
$tolerance
) {
$equal
= 1
if
$got
>
$input
-
$tolerance
&&
$got
<
$input
+
$tolerance
;
}
else
{
$equal
=
sprintf
(
"%.*f"
,
$precision
,
$got
) eq
sprintf
(
"%.*f"
,
$precision
,
$input
);
}
}
$out
=
$negate
? !
$equal
:
$equal
;
}
for
my
$warn
(
@warnings
) {
if
(
$warn
=~ m/numeric/) {
$out
= 0;
next
;
}
warn
$warn
;
}
return
$out
;
}
1;