summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTony Cook <tony@develop-help.com>2014-05-01 15:37:08 +1000
committerTony Cook <tony@develop-help.com>2014-07-03 15:59:12 +1000
commite222d7e21c7c7259563eb80c17e899cf857a1ace (patch)
tree50f0a5b84f476ac336daf5c6a2cc6cb07bfcb826
parent3f7602fa4cd6923ae409dbb4a71c27905a0abd30 (diff)
downloadperl-e222d7e21c7c7259563eb80c17e899cf857a1ace.tar.gz
extra tests for grok_number(_flags)()
-rw-r--r--ext/XS-APItest/Makefile.PL2
-rw-r--r--ext/XS-APItest/numeric.xs16
-rw-r--r--ext/XS-APItest/t/grok.t35
3 files changed, 52 insertions, 1 deletions
diff --git a/ext/XS-APItest/Makefile.PL b/ext/XS-APItest/Makefile.PL
index 031ce8a0b0..173e5c97c5 100644
--- a/ext/XS-APItest/Makefile.PL
+++ b/ext/XS-APItest/Makefile.PL
@@ -24,7 +24,7 @@ my @names = (qw(HV_DELETE HV_DISABLE_UVAR_XKEY HV_FETCH_ISSTORE
G_KEEPERR G_NODEBUG G_METHOD G_FAKINGEVAL
IS_NUMBER_IN_UV IS_NUMBER_GREATER_THAN_UV_MAX
IS_NUMBER_NOT_INT IS_NUMBER_NEG IS_NUMBER_INFINITY
- IS_NUMBER_NAN
+ IS_NUMBER_NAN IS_NUMBER_TRAILING PERL_SCAN_TRAILING
),
{name=>"G_WANT", default=>["IV", "G_ARRAY|G_VOID"]});
diff --git a/ext/XS-APItest/numeric.xs b/ext/XS-APItest/numeric.xs
index b06258d3c1..ab48dba19e 100644
--- a/ext/XS-APItest/numeric.xs
+++ b/ext/XS-APItest/numeric.xs
@@ -14,3 +14,19 @@ grok_number(number)
PUSHs(sv_2mortal(newSViv(result)));
if (result & IS_NUMBER_IN_UV)
PUSHs(sv_2mortal(newSVuv(value)));
+
+void
+grok_number_flags(number, flags)
+ SV *number
+ U32 flags
+ PREINIT:
+ STRLEN len;
+ const char *pv = SvPV(number, len);
+ UV value;
+ int result;
+ PPCODE:
+ EXTEND(SP,2);
+ result = grok_number_flags(pv, len, &value, flags);
+ PUSHs(sv_2mortal(newSViv(result)));
+ if (result & IS_NUMBER_IN_UV)
+ PUSHs(sv_2mortal(newSVuv(value)));
diff --git a/ext/XS-APItest/t/grok.t b/ext/XS-APItest/t/grok.t
index 99fbc5d3da..2e035ee565 100644
--- a/ext/XS-APItest/t/grok.t
+++ b/ext/XS-APItest/t/grok.t
@@ -74,4 +74,39 @@ foreach my $leader ('', ' ', ' ') {
}
}
+# format tests
+my @groks =
+ (
+ # input, in flags, out uv, out flags
+ [ "1", 0, 1, IS_NUMBER_IN_UV ],
+ [ "1x", 0, undef, 0 ],
+ [ "1x", PERL_SCAN_TRAILING, 1, IS_NUMBER_IN_UV | IS_NUMBER_TRAILING ],
+ [ "3.1", 0, 3, IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT ],
+ [ "3.1a", 0, undef, 0 ],
+ [ "3.1a", PERL_SCAN_TRAILING, 3,
+ IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT | IS_NUMBER_TRAILING ],
+ [ "3e5", 0, undef, IS_NUMBER_NOT_INT ],
+ [ "3e", 0, undef, 0 ],
+ [ "3e", PERL_SCAN_TRAILING, 3, IS_NUMBER_IN_UV | IS_NUMBER_TRAILING ],
+ [ "3e+", 0, undef, 0 ],
+ [ "3e+", PERL_SCAN_TRAILING, 3, IS_NUMBER_IN_UV | IS_NUMBER_TRAILING ],
+ [ "Inf", 0, undef,
+ IS_NUMBER_INFINITY | IS_NUMBER_NOT_INT ],
+ [ "In", 0, undef, 0 ],
+ [ "Infin",0, undef, 0 ],
+ # this doesn't work and hasn't been needed yet
+ #[ "Infin",PERL_SCAN_TRAILING, undef,
+ # IS_NUMBER_INFINITY | IS_NUMBER_NOT_INT | IS_NUMBER_TRAILING ],
+ [ "nan", 0, undef, IS_NUMBER_NAN | IS_NUMBER_NOT_INT ],
+ [ "nanx", 0, undef, 0 ],
+ [ "nanx", PERL_SCAN_TRAILING, undef,
+ IS_NUMBER_NAN | IS_NUMBER_NOT_INT | IS_NUMBER_TRAILING],
+ );
+
+for my $grok (@groks) {
+ my ($out_flags, $out_uv) = grok_number_flags($grok->[0], $grok->[1]);
+ is($out_uv, $grok->[2], "'$grok->[0]' flags $grok->[1] - check number");
+ is($out_flags, $grok->[3], "'$grok->[0]' flags $grok->[1] - check flags");
+}
+
done_testing();