File Coverage

blib/lib/Games/Solitaire/BlackHole/Solver/App.pm
Criterion Covered Total %
statement 76 84 90.4
branch 18 30 60.0
condition 4 6 66.6
subroutine 5 5 100.0
pod 1 1 100.0
total 104 126 82.5


line stmt bran cond sub pod time code
1             package Games::Solitaire::BlackHole::Solver::App;
2             $Games::Solitaire::BlackHole::Solver::App::VERSION = '0.18.0';
3 9     9   356830 use 5.014;
  9         32  
4 9     9   5501 use Moo;
  9         87255  
  9         55  
5              
6             extends('Games::Solitaire::BlackHole::Solver::App::Base');
7              
8              
9             sub run
10             {
11 8     8 1 31468 my $self = shift;
12 8         75 my $RANK_KING = $self->_RANK_KING;
13              
14 8         87 $self->_process_cmd_line(
15             {
16             extra_flags => {}
17             }
18             );
19              
20 8         744 STDOUT->autoflush(1);
21 8 100       63275 if ( @ARGV > 1 )
22             {
23 2         36 $self->_do_not_err_on_exceeding_max_iters_limit(1);
24 2         12 return $self->_multi_filename_run();
25             }
26 6         83 $self->_do_not_err_on_exceeding_max_iters_limit(0);
27 6         9 my $global_verdict = 1;
28 6         20 foreach my $board_fn (@ARGV)
29             {
30 6         16 delete $self->{_BOARD_CTR};
31 6         11 my $verdict = 0;
32 6         45 $self->_calc_lines( $board_fn, );
33 6         45 $self->_set_up_solver( 0, [ 1, $RANK_KING ] );
34              
35 6         38 $self->_next_task;
36              
37             QUEUE_LOOP:
38 6         34 while ( my $state = $self->_get_next_state_wrapper )
39             {
40             # The foundation
41 34553         54040 my $no_cards = 1;
42              
43 34553         50019 my @_pending;
44              
45 34553         47291 if (1)
46             {
47 34553         85461 $self->_find_moves( \@_pending, $state, \$no_cards );
48             }
49              
50 34553 100       75259 if ($no_cards)
51             {
52 4         128 $self->_trace_solution( $state, );
53 4         12 $verdict = 1;
54              
55             # $self->_output_handle->print("END solved run\n");
56 4         14 last QUEUE_LOOP;
57             }
58             last QUEUE_LOOP
59 34549 50       107675 if not $self->_process_pending_items( \@_pending, $state );
60             }
61 6         74 $self->_end_report( $verdict, );
62 6 100       23 if ( not $verdict )
63             {
64 2         13 $global_verdict = 0;
65             }
66             }
67 6         48 return $self->_my_exit( $global_verdict, );
68             }
69              
70 9     9   21440 use Games::Solitaire::BlackHole::Solver::_BoardsStream ();
  9         38  
  9         5248  
71              
72             sub _multi_filename_run
73             {
74 2     2   7 my $self = shift;
75 2         14 my $RANK_KING = $self->_RANK_KING;
76              
77 2         9 my $SOFT_EXCEEDED = $self->_do_not_err_on_exceeding_max_iters_limit();
78 2         6 my $global_verdict = 1;
79 2         22 my $boards_stream =
80             Games::Solitaire::BlackHole::Solver::_BoardsStream->new( _width => 0, );
81             BOARD_FN:
82 2   66     3469 while ( $boards_stream->_fh() or @ARGV )
83             {
84 6         112 my $board_fn;
85 6         15 my $board_s = '';
86 6 50       39 if ( $boards_stream->_fh() )
    50          
87             {
88 0         0 ( $board_fn, $board_s ) = $boards_stream->_fetch();
89 0         0 $self->_pending_board_lines( [ split /\n/ms, $board_s ] );
90             }
91             elsif (@ARGV)
92             {
93 6         18 my $arg = shift(@ARGV);
94 6 50       23 if ( $arg eq "readconsec" )
95             {
96 0 0       0 my $fn = shift(@ARGV) or die "readconsec arguments";
97 0 0       0 my $_width = shift(@ARGV) or die "readconsec arguments";
98 0 0       0 my $_boardidx = shift(@ARGV) or die "readconsec arguments";
99 0         0 $boards_stream->_reset( $fn, $_width, $_boardidx, );
100 0         0 redo BOARD_FN;
101             }
102             else
103             {
104 6         18 $board_fn = $arg;
105             }
106             }
107 6         13 my $board_display_fn = $board_fn;
108 6         36 $board_display_fn =~
109 0         0 s#([^A-Za-z0-9_\-/\.=\\\:])#sprintf("%%{%x}", ord($1))#egms;
110 6         10 if (0)
111             {
112             die "dangerous board filename '${board_fn}'!";
113             }
114 6         41 $self->_output_handle->printf( "[= Starting file %s =]\n",
115             $board_display_fn );
116 6         112 delete $self->{_BOARD_CTR};
117 6         16 my $verdict = 0;
118 6         40 $self->_calc_lines( $board_fn, );
119 6         46 $self->_set_up_solver( 0, [ 1, $RANK_KING ] );
120              
121 6         40 $self->_next_task;
122              
123             MFN_QUEUE_LOOP:
124 6         46 while ( my $state = $self->_get_next_state_wrapper )
125             {
126             # The foundation
127 45293         75062 my $no_cards = 1;
128              
129 45293         69688 my @_pending;
130              
131 45293         65023 if (1)
132             {
133 45293         126266 $self->_find_moves( \@_pending, $state, \$no_cards );
134             }
135              
136 45293 100       101977 if ($no_cards)
137             {
138 1         21 $self->_trace_solution( $state, );
139 1         2 $verdict = 1;
140              
141             # $self->_output_handle->print("END solved run\n");
142 1         5 last MFN_QUEUE_LOOP;
143             }
144             last MFN_QUEUE_LOOP
145 45292 50       136548 if not $self->_process_pending_items( \@_pending, $state );
146             }
147 6 50       23 if ($SOFT_EXCEEDED)
148             {
149 6 100 66     36 if ( $SOFT_EXCEEDED and $self->_max_iters_limit_exceeded() )
150             {
151 4         10 $verdict = 0;
152             }
153             }
154 6         88 $self->_end_report( $verdict, );
155 6 100       17 if ( not $verdict )
156             {
157 5         10 $global_verdict = 0;
158             }
159 6         20 $self->_output_handle->printf( "[= END of file %s =]\n",
160             $board_display_fn );
161             }
162 2         54 return $self->_my_exit( $global_verdict, );
163             }
164              
165              
166             1;
167              
168             __END__