1use strict;
2use warnings;
3
4package Test::Deep::Number;
5
6use Test::Deep::Cmp;
7
8use Scalar::Util;
9
10sub init
11{
12	my $self = shift;
13
14	$self->{val} = shift(@_) + 0;
15	$self->{tolerance} = shift;
16}
17
18sub descend
19{
20	my $self = shift;
21	my $got = shift;
22	$self->data->{got_string} = $got;
23	{
24		no warnings 'numeric';
25		$got += 0;
26	}
27
28	$self->data->{got} = $got;
29	if (defined(my $tolerance = $self->{tolerance}))
30	{
31		return abs($got - $self->{val}) <= $tolerance;
32	}
33	else
34	{
35		return $got == $self->{val};
36	}
37}
38
39sub diag_message
40{
41	my $self = shift;
42
43	my $where = shift;
44
45	return "Comparing $where as a number";
46}
47
48sub renderGot
49{
50	my $self = shift;
51	my $val = shift;
52
53	my $got_string = $self->data->{got_string};
54	if ("$val" ne "$got_string")
55	{
56		$got_string = $self->SUPER::renderGot($got_string);
57		return "$val ($got_string)"
58	}
59	else
60	{
61		return $val;
62	}
63}
64sub renderExp
65{
66	my $self = shift;
67
68	my $exp = $self->{val};
69
70	if (defined(my $tolerance = $self->{tolerance}))
71	{
72		return "$exp +/- $tolerance";
73	}
74	else
75	{
76		return $exp;
77	}
78}
79
801;
81