use strict; use warnings; use Test::More; our $RAND = sub { 0 }; BEGIN { *CORE::GLOBAL::rand = sub { $RAND->() }; } use Data::WeightedRoundRobin; my $looped; RERUN: subtest 'empty' => sub { my $dwr = Data::WeightedRoundRobin->new; is $dwr->next, undef, 'next ok' for 1..3; }; subtest 'a value' => sub { my $dwr = Data::WeightedRoundRobin->new([qw/foo/]); is $dwr->next, 'foo', 'next ok' for 1..3; }; subtest 'foo: 100, bar: 100' => sub { my $dwr = Data::WeightedRoundRobin->new([qw/foo bar/]); my $rands = [0, 100, 10, 200]; local $RAND = sub { shift @$rands }; is $dwr->next, 'bar', 'rand 0'; is $dwr->next, 'foo', 'rand 100'; is $dwr->next, 'bar', 'rand 10'; is $dwr->next, 'foo', 'rand 200'; }; subtest 'foo: 50, bar: 100' => sub { my $dwr = Data::WeightedRoundRobin->new([ { value => 'foo', weight => 50 }, { value => 'bar', weight => 100 }, ]); my $rands = [0, 100, 99, 150]; local $RAND = sub { shift @$rands }; is $dwr->next, 'bar', 'rand 0'; is $dwr->next, 'foo', 'rand 100'; is $dwr->next, 'bar', 'rand 99'; is $dwr->next, 'foo', 'rand 150'; }; subtest 'foo: 50, bar: 100, baz: 20' => sub { my $dwr = Data::WeightedRoundRobin->new([ { value => 'foo', weight => 50 }, { value => 'bar', weight => 100 }, { value => 'baz', weight => 20 }, ]); my $rands = [0, 100, 99, 150, 110, 120]; local $RAND = sub { shift @$rands }; is $dwr->next, 'bar', 'rand 0'; is $dwr->next, 'baz', 'rand 100'; is $dwr->next, 'bar', 'rand 99'; is $dwr->next, 'foo', 'rand 150'; is $dwr->next, 'baz', 'rand 110'; is $dwr->next, 'foo', 'rand 120'; }; subtest 'with refarenced data' => sub { my $dwr = Data::WeightedRoundRobin->new([ { key => 'foo', value => [qw/f o o/], weight => 50 }, { value => 'bar', weight => 100 }, { value => 'baz', weight => 20 }, ]); my $rands = [0, 100, 99, 150, 110, 120]; local $RAND = sub { shift @$rands }; is $dwr->next, 'bar', 'rand 0'; is $dwr->next, 'baz', 'rand 100'; is $dwr->next, 'bar', 'rand 99'; is_deeply $dwr->next, [qw/f o o/], 'rand 150'; is $dwr->next, 'baz', 'rand 110'; is_deeply $dwr->next, [qw/f o o/], 'rand 120'; }; unless ($looped++) { local $Data::WeightedRoundRobin::BTREE_BORDER = 0; goto RERUN; } done_testing;