diff options
author | Jerry D. Hedden <jdhedden@cpan.org> | 2008-01-14 14:56:48 -0500 |
---|---|---|
committer | Rafael Garcia-Suarez <rgarciasuarez@gmail.com> | 2008-01-15 11:11:07 +0000 |
commit | a2309040b8fe324ae09c064137c624b4292d93c1 (patch) | |
tree | 94472c2597f4c1ce4778668ea9af0743628a3a89 /t | |
parent | 3e946625bd318900adc25217434a05ce37064aba (diff) | |
download | perl-a2309040b8fe324ae09c064137c624b4292d93c1.tar.gz |
Fix range operator
From: "Jerry D. Hedden" <jdhedden@cpan.org>
Message-ID: <1ff86f510801141656i325ac69ev8a0af47f9fe72a1e@mail.gmail.com>
p4raw-id: //depot/perl@32979
Diffstat (limited to 't')
-rwxr-xr-x | t/op/range.t | 156 |
1 files changed, 155 insertions, 1 deletions
diff --git a/t/op/range.t b/t/op/range.t index 3cef292446..6759f88366 100755 --- a/t/op/range.t +++ b/t/op/range.t @@ -9,7 +9,7 @@ require 'test.pl'; use Config; -plan (45); +plan (115); is(join(':',1..5), '1:2:3:4:5'); @@ -188,3 +188,157 @@ is(join(":", map "[$_]", @foo), '[]'); @foo=(); push @foo, $_ for $1..""; is(join(":", map "[$_]", @foo), ''); } + +# Test upper range limit +my $MAX_INT = ~0>>1; + +foreach my $ii (-3 .. 3) { + my ($first, $last); + eval { + my $lim=0; + for ($MAX_INT-10 .. $MAX_INT+$ii) { + if (! defined($first)) { + $first = $_; + } + $last = $_; + last if ($lim++ > 100); # Protect against integer wrap + } + }; + if ($ii <= 0) { + ok(! $@, 'Upper bound accepted: ' . ($MAX_INT+$ii)); + is($first, $MAX_INT-10, 'Lower bound okay'); + is($last, $MAX_INT+$ii, 'Upper bound okay'); + } else { + ok($@, 'Upper bound rejected: ' . ($MAX_INT+$ii)); + } +} + +foreach my $ii (-3 .. 3) { + my ($first, $last); + eval { + my $lim=0; + for ($MAX_INT+$ii .. $MAX_INT) { + if (! defined($first)) { + $first = $_; + } + $last = $_; + last if ($lim++ > 100); + } + }; + if ($ii <= 0) { + ok(! $@, 'Lower bound accepted: ' . ($MAX_INT+$ii)); + is($first, $MAX_INT+$ii, 'Lower bound okay'); + is($last, $MAX_INT, 'Upper bound okay'); + } else { + ok($@, 'Lower bound rejected: ' . ($MAX_INT+$ii)); + } +} + +{ + my $first; + eval { + my $lim=0; + for ($MAX_INT .. $MAX_INT-1) { + if (! defined($first)) { + $first = $_; + } + $last = $_; + last if ($lim++ > 100); + } + }; + ok(! $@, 'Range accepted'); + ok(! defined($first), 'Range ineffectual'); +} + +foreach my $ii (~0, ~0+1, ~0+(~0>>4)) { + eval { + my $lim=0; + for ($MAX_INT-10 .. $ii) { + last if ($lim++ > 100); + } + }; + ok($@, 'Upper bound rejected: ' . $ii); +} + +# Test lower range limit +my $MIN_INT = -1-$MAX_INT; + +if (! $Config{d_nv_preserves_uv}) { + # $MIN_INT needs adjustment when IV won't fit into an NV + my $NV = $MIN_INT - 1; + my $OFFSET = 1; + while (($NV + $OFFSET) == $MIN_INT) { + $OFFSET++ + } + $MIN_INT += $OFFSET; +} + +foreach my $ii (-3 .. 3) { + my ($first, $last); + eval { + my $lim=0; + for ($MIN_INT+$ii .. $MIN_INT+10) { + if (! defined($first)) { + $first = $_; + } + $last = $_; + last if ($lim++ > 100); + } + }; + if ($ii >= 0) { + ok(! $@, 'Lower bound accepted: ' . ($MIN_INT+$ii)); + is($first, $MIN_INT+$ii, 'Lower bound okay'); + is($last, $MIN_INT+10, 'Upper bound okay'); + } else { + ok($@, 'Lower bound rejected: ' . ($MIN_INT+$ii)); + } +} + +foreach my $ii (-3 .. 3) { + my ($first, $last); + eval { + my $lim=0; + for ($MIN_INT .. $MIN_INT+$ii) { + if (! defined($first)) { + $first = $_; + } + $last = $_; + last if ($lim++ > 100); + } + }; + if ($ii >= 0) { + ok(! $@, 'Upper bound accepted: ' . ($MIN_INT+$ii)); + is($first, $MIN_INT, 'Lower bound okay'); + is($last, $MIN_INT+$ii, 'Upper bound okay'); + } else { + ok($@, 'Upper bound rejected: ' . ($MIN_INT+$ii)); + } +} + +{ + my $first; + eval { + my $lim=0; + for ($MIN_INT+1 .. $MIN_INT) { + if (! defined($first)) { + $first = $_; + } + $last = $_; + last if ($lim++ > 100); + } + }; + ok(! $@, 'Range accepted'); + ok(! defined($first), 'Range ineffectual'); +} + +foreach my $ii (~0, ~0+1, ~0+(~0>>4)) { + eval { + my $lim=0; + for (-$ii .. $MIN_INT+10) { + last if ($lim++ > 100); + } + }; + ok($@, 'Lower bound rejected: ' . -$ii); +} + +# EOF |