File Coverage

blib/lib/Games/Tournament/Swiss/Procedure/Dummy.pm
Criterion Covered Total %
statement 63 65 96.9
branch 13 18 72.2
condition 3 3 100.0
subroutine 11 11 100.0
pod 5 5 100.0
total 95 102 93.1


line stmt bran cond sub pod time code
1             package Games::Tournament::Swiss::Procedure::Dummy;
2             $Games::Tournament::Swiss::Procedure::Dummy::VERSION = '0.21';
3             # Last Edit: 2016 Jan 01, 13:44:45
4             # $Id: $
5              
6 8     8   1069 use warnings;
  8         13  
  8         230  
7 8     8   37 use strict;
  8         13  
  8         228  
8              
9 8     8   36 use constant ROLES => @Games::Tournament::Swiss::Config::roles;
  8         11  
  8         455  
10 8     8   51 use constant FIRSTROUND => $Games::Tournament::Swiss::Config::firstround;
  8         13  
  8         380  
11              
12 8     8   38 use base qw/Games::Tournament::Swiss/;
  8         14  
  8         507  
13 8     8   214 use Games::Tournament::Contestant::Swiss;
  8         14  
  8         5200  
14              
15             =head1 NAME
16              
17             Games::Tournament::Swiss::Procedure::Dummy - A brain-dead pairing algorithm
18              
19             =cut
20              
21             =head1 SYNOPSIS
22              
23             $tourney = Games::Tournament::Swiss->new( rounds => 2, entrants => [ $a, $b, $c ] );
24             %groups = $tourney->formBrackets;
25             $pairing = $tourney->pairing( \%groups );
26             @pairs = $pairing->matchPlayers;
27              
28             =head1 DESCRIPTION
29              
30             A test module swappable in to allow testing the non-Games::Tournament::Procedure parts of Games::Tournament::Swiss
31              
32             =head1 METHODS
33              
34             =head2 new
35              
36             $pairing = Games::Tournament::Swiss::Procedure::Dummy->new(TODO \@groups );
37              
38             Creates a stupid algorithm object that on matchPlayers will just pair the nth player with the n+1th in each score group, downfloating the last player if the number in the bracket is odd, ignoring the FIDE Swiss Rules. You can swap in this module in your configuration file, instead of your real algorithm to test the non-algorithm parts of your program are working.
39              
40             =cut
41              
42             sub new {
43 13     13 1 20 my $self = shift;
44 13         20 my $index = 0;
45 13         78 my %args = @_;
46 13         24 my $round = $args{round};
47 13         22 my $brackets = $args{brackets};
48 13         30 my $banner = "Round $round: ";
49 13         75 for my $bracket ( reverse sort keys %$brackets ) {
50 49         161 my $members = $brackets->{$bracket}->members;
51 49         158 my $score = $brackets->{$bracket}->score;
52 49         71 $banner .= "@{[map { $_->pairingNumber } @$members]} ($score), ";
  49         80  
  127         290  
53             }
54 13         2159 print $banner . "\n";
55 13         146 return bless {
56             round => $round,
57             brackets => $brackets,
58             matches => []
59             },
60             "Games::Tournament::Swiss::Procedure";
61             }
62              
63              
64             =head2 matchPlayers
65              
66             @pairs = $pairing->matchPlayers;
67              
68             Run a brain-dead algorithm that instead of pairing the players according to the rules creates matches between the nth and n+1th player of a bracket, downfloating the last player of the group if the number of players is odd. If there is an odd number of total players, the last gets a Bye.
69              
70             =cut
71              
72             sub matchPlayers {
73 13     13 1 216 my $self = shift;
74 13         40 my $brackets = $self->brackets;
75 13         24 my $downfloater;
76             # my @allMatches = @{ $self->matches };
77             my %allMatches;
78 13         21 my $number = 1;
79 13         53 for my $score ( reverse sort keys %$brackets ) {
80 49         64 my @bracketMatches;
81 49         153 my $players = $brackets->{$score}->members;
82 49 100       113 if ($downfloater) {
83 20         40 unshift @$players, $downfloater;
84 20         35 undef $downfloater;
85             }
86 49 100       132 $downfloater = pop @$players if @$players % 2;
87 49         120 for my $table ( 0 .. @$players / 2 - 1 ) {
88 62         145 push @bracketMatches, Games::Tournament::Card->new(
89             round => $self->round,
90             result => undef,
91             score => $score,
92             contestants => {
93             (ROLES)[0] => $players->[ 2 * $table ],
94             (ROLES)[1] => $players->[ 2 * $table + 1 ]
95             },
96              
97             # floats => \%floats
98             );
99             }
100 49 100 100     189 if ( $number == keys %$brackets and $downfloater ) {
101 3         8 push @bracketMatches, Games::Tournament::Card->new(
102             round => $self->round,
103             result => undef,
104             contestants => { Bye => $downfloater },
105              
106             # floats => \%floats
107             );
108             }
109 49         95 $allMatches{$score} = \@bracketMatches;
110 49         99 $number++;
111             }
112 13         43 $self->matches( \%allMatches );
113             }
114              
115              
116             =head2 brackets
117              
118             $pairing->brackets
119              
120             Gets/sets all the brackets which we are pairing, as an anonymous array of score group (bracket) objects. The order of this array is important. The brackets are paired in order.
121              
122             =cut
123              
124             sub brackets {
125 13     13 1 18 my $self = shift;
126 13         21 my $brackets = shift;
127 13 50       71 if ( defined $brackets ) { $self->{brackets} = $brackets; }
  0 50       0  
128 13         33 elsif ( $self->{brackets} ) { return $self->{brackets}; }
129             }
130              
131              
132             =head2 round
133              
134             $pairing->round
135              
136             What round is this round's results we're pairing on the basis of?
137              
138             =cut
139              
140             sub round {
141 65     65 1 81 my $self = shift;
142 65         105 my $round = shift;
143 65 50       204 if ( defined $round ) { $self->{round} = $round; }
  0 50       0  
144 65         440 elsif ( $self->{round} ) { return $self->{round}; }
145             }
146              
147              
148             =head2 matches
149              
150             $group->matches
151              
152             Gets/sets the matches which we have made.
153              
154             =cut
155              
156             sub matches {
157 16     16 1 30 my $self = shift;
158 16         22 my $matches = shift;
159 16 100       50 if ( defined $matches ) { $self->{matches} = $matches; }
  13 50       60  
160 3         15 elsif ( $self->{matches} ) { return $self->{matches}; }
161             }
162              
163             =head1 AUTHOR
164              
165             Dr Bean, C<< >>
166              
167             =head1 BUGS
168              
169             Please report any bugs or feature requests to
170             C, or through the web interface at
171             L.
172             I will be notified, and then you'll automatically be notified of progress on
173             your bug as I make changes.
174              
175             =head1 SUPPORT
176              
177             You can find documentation for this module with the perldoc command.
178              
179             perldoc Games::Tournament::Swiss
180              
181             You can also look for information at:
182              
183             =over 4
184              
185             =item * AnnoCPAN: Annotated CPAN documentation
186              
187             L
188              
189             =item * CPAN Ratings
190              
191             L
192              
193             =item * RT: CPAN's request tracker
194              
195             L
196              
197             =item * Search CPAN
198              
199             L
200              
201             =back
202              
203             =head1 ACKNOWLEDGEMENTS
204              
205             See L for the FIDE's Swiss rules.
206              
207             =head1 COPYRIGHT & LICENSE
208              
209             Copyright 2006 Dr Bean, all rights reserved.
210              
211             This program is free software; you can redistribute it and/or modify it
212             under the same terms as Perl itself.
213              
214             =cut
215              
216             1; # End of Games::Tournament::Swiss::Procedure
217              
218             # vim: set ts=8 sts=4 sw=4 noet: