use v6;
use Test;
plan 21;
{
is(eval(q{{
my $str;
for 1..2 {
my $sub = {
START { $str ~= $_ };
};
$sub();
$sub();
}
$str;
}}), '12');
};
{
my $var;
my $sub = sub ($x) { START { $var += $x } };
ok $var ~~ undef, 'START {...} has not run yet';
$sub(2);
is $var, 2, 'START {} has executed';
$sub(3);
is $var, 2, "START {} only runs once for each clone";
}
{
my $str ~= 'o';
{
START { $str ~= 'i' }
}
is $str, 'oi', 'START {} runs when we first try to use a block';
}
for <first second> {
my $sub = {
my $str = 'o';
START { $str ~= 'I' };
START { $str ~= 'i' };
":$str";
};
is $sub(), ':oIi', "START block set \$str to 3 ($_ time)";
is $sub(), ':o', "START wasn't invoked again (1-1) ($_ time)";
is $sub(), ':o', "START wasn't invoked again (1-2) ($_ time)";
}
my $ran;
for <first second> {
my $str = 'bana';
$ran = 0;
my $sub = {
START { $ran++; $str ~= 'na' };
};
$sub(); $sub();
is $ran, 1, "START block ran exactly once ($_ time)";
is $str, 'banana', "START block modified the correct variable ($_ time)";
}
{
my $was_in_start;
my $sub = {
my $var = START { $was_in_start++; 23 };
$var //= 42;
$var;
};
ok $was_in_start ~~ undef, 'START {} has not run yet';
is $sub(), 23, 'START {} block set our variable (2)';
is $sub(), 23, 'the returned value of START {} still there';
is $was_in_start, 1, 'our START {} block was invoked exactly once';
}
{
my $was_in_start;
my $sub = { START { $was_in_start++; undef } };
ok $sub() ~~ undef, 'START {} returned undef';
$sub();
$sub();
is $was_in_start, 1,
'our START { ...; undef } block was invoked exactly once';
}