File Coverage

blib/lib/Games/Solitaire/Verify/App/CmdLine.pm
Criterion Covered Total %
statement 24 87 27.5
branch 0 20 0.0
condition 0 3 0.0
subroutine 8 19 42.1
pod 1 1 100.0
total 33 130 25.3


line stmt bran cond sub pod time code
1             package Games::Solitaire::Verify::App::CmdLine;
2             $Games::Solitaire::Verify::App::CmdLine::VERSION = '0.2601';
3 1     1   283838 use strict;
  1         1  
  1         43  
4 1     1   6 use warnings;
  1         3  
  1         78  
5              
6 1     1   6 use parent 'Games::Solitaire::Verify::Base';
  1         3  
  1         9  
7              
8 1     1   763 use Data::Dumper qw(Dumper);
  1         9620  
  1         94  
9              
10 1     1   976 use Getopt::Long qw(GetOptionsFromArray);
  1         15551  
  1         6  
11 1     1   971 use Pod::Usage qw/ pod2usage /;
  1         63841  
  1         86  
12              
13 1     1   665 use Games::Solitaire::Verify::VariantsMap ();
  1         6  
  1         45  
14 1     1   707 use Games::Solitaire::Verify::Solution ();
  1         6  
  1         1101  
15              
16             __PACKAGE__->mk_acc_ref(
17             [
18             qw(
19             _filename
20             _max_rank
21             _variant_params
22             )
23             ]
24             );
25              
26             sub _init
27             {
28 0     0     my ( $self, $args ) = @_;
29              
30 0           my $argv = $args->{'argv'};
31              
32 0           my $variant_map = Games::Solitaire::Verify::VariantsMap->new();
33              
34 0           my $variant_params = $variant_map->get_variant_by_id("freecell");
35 0           my $max_rank = 13;
36              
37             GetOptionsFromArray(
38             $argv,
39             'help|h' => sub {
40 0     0     pod2usage(1);
41             },
42             'g|game|variant=s' => sub {
43 0     0     my ( undef, $game ) = @_;
44              
45 0           $variant_params = $variant_map->get_variant_by_id($game);
46              
47 0 0         if ( !defined($variant_params) )
48             {
49 0           die "Unknown variant '$game'!\n";
50             }
51             },
52             'freecells-num=i' => sub {
53 0     0     my ( undef, $n ) = @_;
54 0           $variant_params->num_freecells($n);
55             },
56             'stacks-num=i' => sub {
57 0     0     my ( undef, $n ) = @_;
58 0           $variant_params->num_columns($n);
59             },
60             'decks-num=i' => sub {
61 0     0     my ( undef, $n ) = @_;
62              
63 0 0 0       if ( !( ( $n == 1 ) || ( $n == 2 ) ) )
64             {
65 0           die "Decks should be 1 or 2.";
66             }
67              
68 0           $variant_params->num_decks($n);
69             },
70             'max-rank=i' => sub {
71 0     0     my ( undef, $n ) = @_;
72              
73 0           $max_rank = $n;
74              
75 0           return;
76             },
77             'sequences-are-built-by=s' => sub {
78 0     0     my ( undef, $val ) = @_;
79              
80             my %seqs_build_by = (
81 0           ( map { $_ => $_ } (qw(alt_color suit rank)) ),
  0            
82             "alternate_color" => "alt_color",
83             );
84              
85 0           my $proc_val = $seqs_build_by{$val};
86              
87 0 0         if ( !defined($proc_val) )
88             {
89 0           die "Unknown sequences-are-built-by '$val'!";
90             }
91              
92 0           $variant_params->seqs_build_by($proc_val);
93             },
94             'empty-stacks-filled-by=s' => sub {
95 0     0     my ( undef, $val ) = @_;
96              
97             my %empty_stacks_filled_by_map =
98 0           ( map { $_ => 1 } (qw(kings any none)) );
  0            
99              
100 0 0         if ( !exists( $empty_stacks_filled_by_map{$val} ) )
101             {
102 0           die "Unknown empty stacks filled by '$val'!";
103             }
104              
105 0           $variant_params->empty_stacks_filled_by($val);
106             },
107             'sequence-move=s' => sub {
108 0     0     my ( undef, $val ) = @_;
109              
110 0           my %seq_moves = ( map { $_ => 1 } (qw(limited unlimited)) );
  0            
111              
112 0 0         if ( !exists( $seq_moves{$val} ) )
113             {
114 0           die "Unknown sequence move '$val'!";
115             }
116              
117 0           $variant_params->sequence_move($val);
118             },
119 0 0         ) or die "Cannot process command line arguments";
120              
121 0           my $filename = shift(@$argv);
122              
123 0 0         if ( !defined($filename) )
124             {
125 0           $filename = "-";
126             }
127              
128 0           $self->_variant_params($variant_params);
129 0           $self->_filename($filename);
130 0           $self->_max_rank($max_rank);
131              
132 0           return;
133             }
134              
135             sub run
136             {
137 0     0 1   my $self = shift;
138              
139 0           my $filename = $self->_filename();
140 0           my $variant_params = $self->_variant_params();
141              
142 0           my $fh;
143              
144 0 0         if ( $filename eq "-" )
145             {
146 0           $fh = *STDIN;
147             }
148             else
149             {
150 0 0         open $fh, "<", $filename
151             or die "Cannot open '$filename' - $!";
152             }
153              
154 0           my $solution = Games::Solitaire::Verify::Solution->new(
155             {
156             max_rank => scalar( $self->_max_rank ),
157             input_fh => $fh,
158             variant => "custom",
159             variant_params => $variant_params,
160             },
161             );
162              
163 0           my $verdict = $solution->verify();
164 0 0         if ( !$verdict )
165             {
166 0           print "Solution is OK.\n";
167 0           exit(0);
168             }
169             else
170             {
171 0           print STDERR Dumper($verdict);
172 0           print "Solution is Wrong.\n";
173 0           exit(-1);
174             }
175             }
176              
177             1;
178              
179             __END__