File Coverage

blib/lib/Games/Solitaire/Verify/FromOtherSolversBase.pm
Criterion Covered Total %
statement 90 124 72.5
branch 12 24 50.0
condition 0 3 0.0
subroutine 25 32 78.1
pod 1 1 100.0
total 128 184 69.5


line stmt bran cond sub pod time code
1             package Games::Solitaire::Verify::FromOtherSolversBase;
2             $Games::Solitaire::Verify::FromOtherSolversBase::VERSION = '0.2601';
3 5     5   284314 use strict;
  5         13  
  5         238  
4 5     5   24 use warnings;
  5         9  
  5         279  
5 5     5   812 use autodie;
  5         14679  
  5         27  
6              
7 5     5   25520 use List::Util qw(first);
  5         15  
  5         591  
8 5     5   3037 use Path::Tiny qw/ path /;
  5         44755  
  5         357  
9              
10 5     5   31 use parent 'Games::Solitaire::Verify::Base';
  5         8  
  5         40  
11              
12 5     5   2861 use Games::Solitaire::Verify::VariantsMap ();
  5         17  
  5         207  
13 5     5   2706 use Games::Solitaire::Verify::Solution ();
  5         17  
  5         142  
14 5     5   2565 use Games::Solitaire::Verify::State::LaxParser ();
  5         18  
  5         116  
15 5     5   29 use Games::Solitaire::Verify::Move ();
  5         24  
  5         129  
16              
17 5     5   3574 use Getopt::Long qw(GetOptionsFromArray);
  5         57663  
  5         21  
18              
19             sub _init
20             {
21 4     4   10 my ( $self, $args ) = @_;
22              
23 4         12 my $argv = $args->{'argv'};
24              
25 4         27 my $variant_map = Games::Solitaire::Verify::VariantsMap->new();
26              
27 4         15 my $variant_params = $variant_map->get_variant_by_id("freecell");
28              
29             GetOptionsFromArray(
30             $argv,
31             'g|game|variant=s' => sub {
32 4     4   3160 my ( undef, $game ) = @_;
33              
34 4         17 $variant_params = $variant_map->get_variant_by_id($game);
35              
36 4 50       28 if ( !defined($variant_params) )
37             {
38 0         0 die "Unknown variant '$game'!\n";
39             }
40             },
41             'freecells-num=i' => sub {
42 0     0   0 my ( undef, $n ) = @_;
43 0         0 $variant_params->num_freecells($n);
44             },
45             'stacks-num=i' => sub {
46 0     0   0 my ( undef, $n ) = @_;
47 0         0 $variant_params->num_columns($n);
48             },
49             'decks-num=i' => sub {
50 0     0   0 my ( undef, $n ) = @_;
51              
52 0 0 0     0 if ( !( ( $n == 1 ) || ( $n == 2 ) ) )
53             {
54 0         0 die "Decks should be 1 or 2.";
55             }
56              
57 0         0 $variant_params->num_decks($n);
58             },
59             'sequences-are-built-by=s' => sub {
60 0     0   0 my ( undef, $val ) = @_;
61              
62             my %seqs_build_by = (
63 0         0 ( map { $_ => $_ } (qw(alt_color suit rank)) ),
  0         0  
64             "alternate_color" => "alt_color",
65             );
66              
67 0         0 my $proc_val = $seqs_build_by{$val};
68              
69 0 0       0 if ( !defined($proc_val) )
70             {
71 0         0 die "Unknown sequences-are-built-by '$val'!";
72             }
73              
74 0         0 $variant_params->seqs_build_by($proc_val);
75             },
76             'empty-stacks-filled-by=s' => sub {
77 0     0   0 my ( undef, $val ) = @_;
78              
79             my %empty_stacks_filled_by_map =
80 0         0 ( map { $_ => 1 } (qw(kings any none)) );
  0         0  
81              
82 0 0       0 if ( !exists( $empty_stacks_filled_by_map{$val} ) )
83             {
84 0         0 die "Unknown empty stacks filled by '$val'!";
85             }
86              
87 0         0 $variant_params->empty_stacks_filled_by($val);
88             },
89             'sequence-move=s' => sub {
90 0     0   0 my ( undef, $val ) = @_;
91              
92 0         0 my %seq_moves = ( map { $_ => 1 } (qw(limited unlimited)) );
  0         0  
93              
94 0 0       0 if ( !exists( $seq_moves{$val} ) )
95             {
96 0         0 die "Unknown sequence move '$val'!";
97             }
98              
99 0         0 $variant_params->sequence_move($val);
100             },
101 4 50       79 ) or die "Cannot process command line arguments";
102              
103 4         488 my $filename = shift(@$argv);
104              
105 4 50       10 if ( !defined($filename) )
106             {
107 0         0 $filename = "-";
108             }
109              
110 4         8 my $sol_filename = shift(@$argv);
111              
112 4 50       10 if ( !defined($sol_filename) )
113             {
114 0         0 die "Solution filename not specified.";
115             }
116              
117 4         18 $self->_variant_params($variant_params);
118 4         12 $self->_filename($filename);
119 4         11 $self->_sol_filename($sol_filename);
120              
121 4         6 my $s = '';
122 4         13 $self->_buffer_ref( \$s );
123              
124 4         15 return;
125             }
126              
127             sub _append
128             {
129 643     643   920 my ( $self, $text ) = @_;
130              
131 643         738 ${ $self->_buffer_ref } .= $text;
  643         1612  
132              
133 643         964 return;
134             }
135              
136             sub _get_buffer
137             {
138 6     6   29 my ($self) = @_;
139              
140 6         7 return ${ $self->_buffer_ref };
  6         125  
141             }
142              
143             sub _read_initial_state
144             {
145 4     4   11 my $self = shift;
146              
147 4         18 $self->_st(
148             Games::Solitaire::Verify::State::LaxParser->new(
149             {
150             string => path( $self->_filename )->slurp_raw,
151             variant => 'custom',
152             'variant_params' => $self->_variant_params(),
153             }
154             )
155             );
156              
157 4         31 $self->_append("-=-=-=-=-=-=-=-=-=-=-=-\n\n");
158              
159 4         14 $self->_out_running_state;
160              
161 4         10 return;
162             }
163              
164             sub _out_running_state
165             {
166 320     320   462 my ($self) = @_;
167              
168 320         795 $self->_append( $self->_st->to_string() . "\n\n====================\n\n" );
169              
170 320         435 return;
171             }
172              
173             sub _perform_and_output_move
174             {
175 316     316   462 my ( $self, $move_s ) = @_;
176              
177 316         772 $self->_append("$move_s\n\n");
178              
179 316         1614 $self->_st->verify_and_perform_move(
180             Games::Solitaire::Verify::Move->new(
181             {
182             fcs_string => $move_s,
183             game => $self->_st->_variant(),
184             },
185             )
186             );
187 316         1199 $self->_out_running_state;
188              
189 316         951 return;
190             }
191              
192             sub _find_col_card
193             {
194 327     327   509 my ( $self, $card_s ) = @_;
195              
196             return first
197             {
198 1725     1725   3216 my $col = $self->_st->get_column($_);
199 1725 100       2561 ( $col->len == 0 ) ? 0 : $col->top->fast_s eq $card_s
200 327         1342 } ( 0 .. $self->_st->num_columns - 1 );
201             }
202              
203             sub _find_empty_col
204             {
205 11     11   39 my ($self) = @_;
206              
207             return
208 42     42   83 first { $self->_st->get_column($_)->len == 0 }
209 11         50 ( 0 .. $self->_st->num_columns - 1 );
210             }
211              
212             sub _find_fc_card
213             {
214 85     85   140 my ( $self, $card_s ) = @_;
215             return first
216             {
217 276     276   508 my $card = $self->_st->get_freecell($_);
218 276 100       495 defined($card) ? ( $card->fast_s eq $card_s ) : 0;
219 85         279 } ( 0 .. $self->_st->num_freecells - 1 );
220             }
221              
222             sub _find_card_src_string
223             {
224 245     245   425 my ( $self, $src_card_s ) = @_;
225              
226 245         418 my $src_col_idx = $self->_find_col_card($src_card_s);
227              
228 245 100       768 if ( not defined $src_col_idx )
229             {
230 85         164 my $src_fc_idx = $self->_find_fc_card($src_card_s);
231 85 100       237 if ( not defined($src_fc_idx) )
232             {
233 43         295 die "Cannot find card <$src_card_s>.";
234             }
235 42         143 return ( "a card", "freecell $src_fc_idx" );
236             }
237             else
238             {
239 160         494 return ( "1 cards", "stack $src_col_idx" );
240             }
241             }
242              
243             sub run
244             {
245 0     0 1   my ($self) = @_;
246              
247 0           $self->_process_main;
248              
249 0           print $self->_get_buffer;
250              
251 0           return;
252             }
253              
254             1;
255              
256             __END__