This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
f8ef0724ed90b554cdfcf4d53656b90ea424dfa8
[perl5.git] / t / op / infnan.t
1 #!./perl
2
3 BEGIN {
4     chdir 't' if -d 't';
5     @INC = '../lib';
6     require './test.pl';
7 }
8
9 my $PInf = "Inf"  + 0;
10 my $NInf = "-Inf" + 0;
11 my $NaN  = "NaN"  + 0;
12
13 my @PInf = ("Inf", "inf", "INF", "Infinity", "INFINITY",
14             "1.#INF", "1#INF");
15 my @NInf = map { "-$_" } @PInf;
16
17 my @NaN = ("NAN", "nan", "qnan", "SNAN", "NanQ", "NANS",
18            "1.#QNAN", "1#SNAN", "1.#NAN", "1#IND",
19            "NaN123", "NAN(123)", "nan%",
20            "nanonano"); # RIP, Robin Williams.
21
22 my $inf_tests = 6 + 6 * @PInf + 4;
23 my $nan_tests = 5 + 2 * @NaN + 2;
24 my $infnan_tests = 4;
25
26 plan tests => $inf_tests + $nan_tests + $infnan_tests;
27
28 my $has_inf;
29 my $has_nan;
30
31 SKIP: {
32   if ($PInf == 1 && $NINf == 1) {
33     skip $inf_tests, "no infinity found";
34   }
35
36   $has_inf = 1;
37
38   ok($PInf > 0, "positive infinity");
39   ok($NInf < 0, "negative infinity");
40
41   is($PInf,  "Inf", "$PInf value stringifies as Inf");
42   is($NInf, "-Inf", "$PInf value stringifies as -Inf");
43
44   is(sprintf("%g", $PInf), "Inf", "$PInf sprintf %g is Inf");
45   is(sprintf("%a", $PInf), "Inf", "$PInf sprintf %a is Inf");
46
47   for my $i (@PInf) {
48     is($i + 0, $PInf, "$i is +Inf");
49     ok($i > 0, "$i is positive");
50     is("@{[$i+0]}", "Inf", "$i value stringifies as Inf");
51   }
52
53   for my $i (@NInf) {
54     is($i + 0, $NInf, "$i is -Inf");
55     ok($i < 0, "$i is negative");
56     is("@{[$i+0]}", "-Inf", "$i value stringifies as -Inf");
57   }
58
59   is($PInf + $PInf, $PInf, "+inf plus +inf is +inf");
60   is($NInf + $NInf, $NInf, "-inf plus -inf is -inf");
61
62   is(1/$PInf, 0, "one per +Inf is zero");
63   is(1/$NInf, 0, "one per -Inf is zero");
64 }
65
66 SKIP: {
67   if ($NaN == 1) {
68     skip $nan_tests, "no nan found";
69   }
70
71   $has_nan = 1;
72
73   ok($NaN != $NaN, "nan is not nan numerically");
74   ok($NaN eq $NaN, "nan is nan stringifically");
75
76   is("$NaN", "NaN", "$NaN value stringies as NaN");
77
78   is(sprintf("%g", $NaN), "NaN", "$NaN sprintf %g is NaN");
79   is(sprintf("%a", $NaN), "NaN", "$NaN sprintf %a is Inf");
80
81   for my $i (@NaN) {
82     cmp_ok($i + 0, '!=', $i + 0, "$i is nan");
83     is("@{[$i+0]}", "NaN", "$i value stringifies as NaN");
84   }
85
86   # is() okay with $NaN because eq is used.
87   is($NaN * 0, $NaN, "NaN times zero is NaN");
88   is($NaN * 2, $NaN, "NaN times two is NaN");
89 }
90
91 SKIP: {
92   unless ($has_inf && $has_nan) {
93     skip $infnan_tests, "no both inf and nan";
94   }
95
96   # is() okay with $NaN because eq is used.
97   is($PInf * 0,     $NaN, "inf times zero is nan");
98   is($PInf * $NaN,  $NaN, "inf times nan is nan");
99   is($PInf + $NaN,  $NaN, "inf plus nan is nan");
100   is($PInf - $PInf, $NaN, "inf minus inf is nan");
101 }