+#!perl -w
+use strict;
+
+use Test::More;
+use Config;
+use XS::APItest;
+use feature 'switch';
+use constant TRUTH => '0 but true';
+
+# Tests for grok_number. Not yet comprehensive.
+foreach my $leader ('', ' ', ' ') {
+ foreach my $trailer ('', ' ', ' ') {
+ foreach ((map {"0" x $_} 1 .. 12),
+ (map {("0" x $_) . "1"} 0 .. 12),
+ (map {"1" . ("0" x $_)} 1 .. 9),
+ (map {1 << $_} 0 .. 31),
+ (map {1 << $_} 0 .. 31),
+ (map {0xFFFFFFFF >> $_} reverse (0 .. 31)),
+ ) {
+ foreach my $sign ('', '-', '+') {
+ my $string = $leader . $sign . $_ . $trailer;
+ my ($flags, $value) = grok_number($string);
+ is($flags & IS_NUMBER_IN_UV, IS_NUMBER_IN_UV,
+ "'$string' is a UV");
+ is($flags & IS_NUMBER_NEG, $sign eq '-' ? IS_NUMBER_NEG : 0,
+ "'$string' sign");
+ is($value, abs $string, "value is correct");
+ }
+ }
+
+ {
+ my (@UV, @NV);
+ given ($Config{ivsize}) {
+ when (4) {
+ @UV = qw(429496729 4294967290 4294967294 4294967295);
+ @NV = qw(4294967296 4294967297 4294967300 4294967304);
+ }
+ when (8) {
+ @UV = qw(1844674407370955161 18446744073709551610
+ 18446744073709551614 18446744073709551615);
+ @NV = qw(18446744073709551616 18446744073709551617
+ 18446744073709551620 18446744073709551624);
+ }
+ default {
+ die "Unknown IV size $_";
+ }
+ }
+ foreach (@UV) {
+ my $string = $leader . $_ . $trailer;
+ my ($flags, $value) = grok_number($string);
+ is($flags & IS_NUMBER_IN_UV, IS_NUMBER_IN_UV,
+ "'$string' is a UV");
+ is($value, abs $string, "value is correct");
+ }
+ foreach (@NV) {
+ my $string = $leader . $_ . $trailer;
+ my ($flags, $value) = grok_number($string);
+ is($flags & IS_NUMBER_IN_UV, 0, "'$string' is an NV");
+ is($value, undef, "value is correct");
+ }
+ }
+
+ my $string = $leader . TRUTH . $trailer;
+ my ($flags, $value) = grok_number($string);
+
+ if ($string eq TRUTH) {
+ is($flags & IS_NUMBER_IN_UV, IS_NUMBER_IN_UV, "'$string' is a UV");
+ is($value, 0);
+ } else {
+ is($flags, 0, "'$string' is not a number");
+ is($value, undef);
+ }
+ }
+}
+
+done_testing();