use v6-alpha;
use Test;
plan 31;
=kwid
Mostly copied from Perl 5.8.4 s t/op/inc.t
Verify that addition/subtraction properly upgrade to doubles.
These tests are only significant on machines with 32 bit longs,
and two s complement negation, but should not fail anywhere.
=cut
my $a = 2147483647;
my $c=$a++;
is($a, 2147483648, "var incremented after post-autoincrement");
is($c, 2147483647, "during post-autoincrement return value is not yet incremented");
$a = 2147483647;
$c=++$a;
is($a, 2147483648, "var incremented after pre-autoincrement");
is($c, 2147483648, "during pre-autoincrement return value is incremented");
$a = 2147483647;
$a=$a+1;
is($a, 2147483648, 'simple assignment: $a = $a+1');
$a = -2147483648;
$c=$a--;
is($a, -2147483649, "var decremented after post-autodecrement");
is($c, -2147483648, "during post-autodecrement return value is not yet decremented");
$a = -2147483648;
$c=--$a;
is($a, -2147483649, "var decremented after pre-autodecrement");
is($c, -2147483649, "during pre-autodecrement return value is decremented");
$a = -2147483648;
$a=$a-1;
is($a, -2147483649, 'simple assignment: $a = $a-1');
$a = 2147483648;
$a = -$a;
$c=$a--;
is($a, -2147483649, "post-decrement negative value");
$a = 2147483648;
$a = -$a;
$c=--$a;
is($a, -2147483649, "pre-decrement negative value");
$a = 2147483648;
$a = -$a;
$a=$a-1;
is($a, -2147483649, 'assign $a = -$a; $a = $a-1');
$a = 2147483648;
my $b = -$a;
$c=$b--;
is($b, ((-$a)-1), "commpare -- to -1 op with same origin var");
is($a, 2147483648, "make sure origin var remains unchanged");
$a = 2147483648;
$b = -$a;
$c=--$b;
is($b, ((-$a)-1), "same thing with predecremenet");
$a = 2147483648;
$b = -$a;
$b= $b - 1;
is($b, -(++$a), 'est oder of predecrement in -(++$a)');
$a = undef;
is($a++, 0, 'undef++ == 0');
$a = undef;
is($a--, undef, 'undef-- is undefined');
$a = 'x';
is($a++, 'x', 'magical ++ should not be numified');
isa_ok($a, "Str", "it isa Str");
my %a = ('a' => 1);
%a{"a"}++;
is(%a{'a'}, 2, "hash key");
my %b = ('b' => 1);
my $var = 'b';
%b{$var}++;
is(%b{$var}, 2, "hash key via var");
my @a = (1);
@a[0]++;
is(@a[0], 2, "array elem");
my @b = (1);
my $moo = 0;
@b[$moo]++;
is(@b[$moo], 2, "array elem via var");
is($moo, 0, "var was not touched");
# Test that the expression to increment will only be evaluated once.
{
my $was_in_foo;
my sub foo () { $was_in_foo++; 0 };
my @array = (42);
is(++@array[+foo()], 43, "++ evaluates the expression to increment only once (1)");
is($was_in_foo, 1, "++ evaluates the expression to increment only once (2)");
}
# Test case courtesy of Limbic_Region
{
my $curr = 4;
my @array = 1..5;
is @array[$curr], 5, "postincrements in array subscripts work";
@array[ --$curr ]++;
is $curr, 3, "postincrements in array subscripts work";
is @array[$curr], 5, "postincrements in array subscripts work";
}