Acme-Parataxis
view release on metacpan or search on metacpan
t/023_priority.t view on Meta::CPAN
use v5.40;
use blib;
use Acme::Parataxis qw[async yield fiber];
use Test2::V1 -ipP;
$|++;
#
subtest 'Default priority and accessor' => sub {
my $f = fiber {1};
is $f->priority, 0, 'newly spawned fiber defaults to priority 0';
is $f->priority(10), 10, 'setter returns the new priority';
is $f->priority, 10, 'getter reflects the set priority';
};
subtest 'Higher priority resumes before lower priority' => sub {
my @log;
async {
my $low = fiber { push @log, 'l1'; yield; push @log, 'l2'; };
$low->priority(1);
my $high = fiber { push @log, 'h1'; yield; push @log, 'h2'; };
$high->priority(10);
yield;
push @log, 'main-end';
};
is "@log", 'l1 h1 h2 l2 main-end', 'priority 10 fiber resumed before priority 1 fiber';
};
subtest 'Re-prioritizing a queued fiber moves it' => sub {
my @log;
async {
my $a = fiber { push @log, 'a1'; yield; push @log, 'a2'; };
my $b = fiber { push @log, 'b1'; yield; push @log, 'b2'; };
$b->priority(5); # jump ahead of $a
$b->priority(0); # and back behind it
$b->priority(7); # ahead again
yield;
push @log, 'main-end';
};
is "@log", 'a1 b1 b2 a2 main-end', 're-prioritized fiber resumed before the lower-priority tie';
};
subtest 'Equal priorities keep FIFO order' => sub {
my @log;
async {
my $x = fiber { push @log, 'x1'; yield; push @log, 'x2'; };
my $y = fiber { push @log, 'y1'; yield; push @log, 'y2'; };
yield;
push @log, 'main-end';
};
is "@log", 'x1 y1 x2 y2 main-end', 'same-priority fibers resume in enqueue order';
};
subtest 'Changing priority of a running fiber is allowed' => sub {
my @log;
async {
fiber {
my $me = Acme::Parataxis->by_id( Acme::Parataxis::current_fid() );
is $me->priority(-3), -3, 'running fiber reads/writes its own priority';
push @log, 'start';
};
push @log, 'main-end';
};
is "@log", 'start main-end', 'both fibers completed';
};
#
done_testing();
( run in 0.520 second using v1.01-cache-2.11-cpan-eca53f54451 )