Please review patch attached, which provides --fatal and --fatal-step
options.
Index: MANIFEST
===================================================================
--- MANIFEST    (revision 22201)
+++ MANIFEST    (working copy)
@@ -1,7 +1,7 @@
 # ex: set ro:
 # $Id$
 #
-# generated by tools/dev/mk_manifest_and_skip.pl Thu Oct 18 00:43:31 2007 UT
+# generated by tools/dev/mk_manifest_and_skip.pl Thu Oct 18 02:54:19 2007 UT
 #
 # See tools/dev/install_files.pl for documentation on the
 # format of this file.
@@ -2953,6 +2953,15 @@
 t/configure/037-run_single_step.t                           []
 t/configure/038-run_single_step.t                           []
 t/configure/039-slurp_file.t                                []
+t/configure/050-fatal.t                                     []
+t/configure/051-fatal_step.t                                []
+t/configure/052-fatal_step.t                                []
+t/configure/053-fatal_step.t                                []
+t/configure/054-fatal_step.t                                []
+t/configure/055-fatal_step.t                                []
+t/configure/056-fatal_step.t                                []
+t/configure/057-fatal_step.t                                []
+t/configure/058-fatal_step.t                                []
 t/configure/101-init_manifest-01.t                          []
 t/configure/101-init_manifest-02.t                          []
 t/configure/102-init_defaults-01.t                          []
Index: lib/Parrot/Configure/Options/Conf.pm
===================================================================
--- lib/Parrot/Configure/Options/Conf.pm        (revision 22201)
+++ lib/Parrot/Configure/Options/Conf.pm        (working copy)
@@ -29,6 +29,8 @@
     define
     exec-prefix
     execcapable
+    fatal
+    fatal-step
     floatval
     gc
     help
@@ -82,10 +84,10 @@
 our $parrot_version = Parrot::BuildUtil::parrot_version();
 our $svnid          = '$Id$',
 
-    my %short_circuits = (
+my %short_circuits = (
     help    => \&print_help,
     version => \&print_version,
-    );
+);
 
 our %options_components = (
     'valid_options'  => [EMAIL PROTECTED],
@@ -122,6 +124,10 @@
    --verbose=2          Output every setting change
    --verbose-step=N     Set verbose for step N only
    --verbose-step=regex Set verbose for step matching description
+   --fatal              Failure of any configuration step will cause
+                        Configure.pl to halt
+   --fatal-step         Comma-delimited string of configuration steps
+                        which upon failure cause Configure.pl to halt
    --nomanicheck        Don't check the MANIFEST
    --step=(gen::languages)
                         Execute a single configure step
Index: lib/Parrot/Configure.pm
===================================================================
--- lib/Parrot/Configure.pm     (revision 22201)
+++ lib/Parrot/Configure.pm     (working copy)
@@ -221,9 +221,36 @@
     my $conf = shift;
 
     my $n = 0;    # step number
-    my ( $verbose, $verbose_step, $ask ) = $conf->options->get(qw( verbose 
verbose-step ask ));
+    my ( $verbose, $verbose_step, $fatal, $fatal_step, $ask ) =
+        $conf->options->get(qw( verbose verbose-step fatal fatal-step ask ));
 
+    $conf->{log} = [];
+    my %steps_to_die_for = ();
+    # If the --fatal option is true, then all config steps are mapped into
+    # %steps_to_die_for and there is no consideration of --fatal-step.
+    if ($fatal) {
+        %steps_to_die_for = map {$_, 1} @{ $conf->{list_of_steps} };
+    }
+    # We make certain that argument to --fatal-step is a comma-delimited
+    # string of configuration steps, each of which is a string delimited by
+    # two colons, the first half of which is one of init|inter|auto|gen
+    # (This will be modified to take a step sequence number.)
+    elsif ( defined ( $fatal_step ) ) {
+        %steps_to_die_for = $conf->_handle_fatal_step_option( $fatal_step );
+    }
+    else {
+        # No action needed; this is the default case where no step is fatal
+    }
+
     foreach my $task ( $conf->steps ) {
+        my $red_flag;
+        my $step_name   = $task->step;
+        if ( scalar ( keys ( %steps_to_die_for ) ) ) {
+            if ( $steps_to_die_for{$step_name} ) {
+                $red_flag++;
+            }
+        }
+
         $n++;
         my $rv = $conf->_run_this_step(
             {
@@ -234,10 +261,51 @@
                 n            => $n,
             }
         );
+        if ( ! defined $rv ) {
+            if ( $red_flag ) {
+                return;
+            } else {
+                $conf->{log}->[$n] = {
+                    step    => $step_name,
+                };
+            }
+        }
     }
     return 1;
 }
 
+sub _handle_fatal_step_option {
+    my $conf = shift;
+    my ($fatal_step) = @_;
+    my %steps_to_die_for = ();
+    my $named_step_pattern =    qr/(?:init|inter|auto|gen)::[a-z]+/;
+    my $unit_step_pattern = qr/\d+|$named_step_pattern/;
+    if ( $fatal_step =~ /^
+        $unit_step_pattern
+        (, $unit_step_pattern)*
+        $/x
+    ) {
+        my @fatal_steps = split /,/, $fatal_step;
+        for my $s (@fatal_steps) {
+            if ($s =~ /^\d+$/) {
+                die "No configuration step corresponding to $fatal_step"
+                    unless defined $conf->{list_of_steps}->[$s - 1];
+                my $step_name = $conf->{list_of_steps}->[$s - 1];
+                if ($step_name =~ /$named_step_pattern/) {
+                    $steps_to_die_for{$step_name}++;
+                } else {
+                    die "Configuration step corresponding to $s is invalid";
+                }
+            } else {
+                $steps_to_die_for{$s}++;
+            }
+        }
+    } else {
+        die "Argument to 'fatal-step' option must be comma-delimited string of 
valid configuration steps or configuration step sequence numbers";
+    }
+    return %steps_to_die_for;
+}
+
 =item * C<run_single_step()>
 
 The invoking L<Parrot::Configure> object is passed as the first argument to
@@ -252,7 +320,8 @@
     my $conf     = shift;
     my $taskname = shift;
 
-    my ( $verbose, $verbose_step, $ask ) = $conf->options->get(qw( verbose 
verbose-step ask ));
+    my ( $verbose, $verbose_step, $ask ) =
+        $conf->options->get(qw( verbose verbose-step ask ));
 
     my $task = ( $conf->steps() )[0];
     if ( $task->{"Parrot::Configure::Task::step"} eq $taskname ) {
@@ -337,10 +406,11 @@
 
         # A Parrot configuration step can run successfully, but if it fails to
         # achieve its objective it is supposed to return an undefined status.
-        if ($ret) {
+        if ( $ret ) {
             _finish_printing_result(
                 {
                     step        => $step,
+                    step_name   => $step_name,
                     args        => $args,
                     description => $step->description,
                 }
Index: Configure.pl
===================================================================
--- Configure.pl        (revision 22201)
+++ Configure.pl        (working copy)
@@ -44,6 +44,15 @@
 
 Run C<--verbose=2> for step number C<N> or matching description.
 
+=item C<--fatal>
+
+Tells Configure.pl to halt completely if any configuration step fails.
+
+=item C<--fatal-step={init::alpha,inter::beta,auto::gamma}>
+
+Tells Configure.pl to halt completely if any configuration step in
+comma-delimited string individually fails.
+
 =item C<--nomanicheck>
 
 Tells Configure.pl not to run the MANIFEST check.
@@ -343,9 +352,10 @@
 # as command-line option
 $opttest->run_build_tests();
 
+my $make = $conf->data->get('make');
 # from Parrot::Configure::Messages
-print_conclusion( $conf->data->get('make') );
-exit(0);
+my $rv = print_conclusion( $conf, $make );
+exit($rv);
 
 ################### DOCUMENTATION ###################
 
Index: t/configure/054-fatal_step.t
===================================================================
--- t/configure/054-fatal_step.t        (revision 0)
+++ t/configure/054-fatal_step.t        (revision 0)
@@ -0,0 +1,104 @@
+#! perl
+# Copyright (C) 2007, The Perl Foundation.
+# $Id$
+# 054-fatal_step.t
+
+use strict;
+use warnings;
+
+use Test::More tests => 13;
+use Carp;
+use lib qw( lib t/configure/testlib );
+use Parrot::Configure;
+use Parrot::Configure::Options qw( process_options );
+use Parrot::IO::Capture::Mini;
+
+$| = 1;
+is( $|, 1, "output autoflush is set" );
+
+my $args = process_options(
+    {
+        argv => [ qw( --fatal-step=init::alpha ) ],
+        mode => q{configure},
+    }
+);
+ok( defined $args, "process_options returned successfully" );
+my %args = %$args;
+
+my $conf = Parrot::Configure->new;
+ok( defined $conf, "Parrot::Configure->new() returned okay" );
+
+my $step        = q{init::kappa};
+my $description = 'Determining if your computer does kappa';
+
+$conf->add_steps($step);
+my @confsteps = @{ $conf->steps };
+isnt( scalar @confsteps, 0,
+    "Parrot::Configure object 'steps' key holds non-empty array reference" );
+is( scalar @confsteps, 1, "Parrot::Configure object 'steps' key holds ref to 
1-element array" );
+my $nontaskcount = 0;
+foreach my $k (@confsteps) {
+    $nontaskcount++ unless $k->isa("Parrot::Configure::Task");
+}
+is( $nontaskcount, 0, "Each step is a Parrot::Configure::Task object" );
+is( $confsteps[0]->step, $step, "'step' element of Parrot::Configure::Task 
struct identified" );
+is( ref( $confsteps[0]->params ),
+    'ARRAY', "'params' element of Parrot::Configure::Task struct is array ref" 
);
+ok( !ref( $confsteps[0]->object ),
+    "'object' element of Parrot::Configure::Task struct is not yet a ref" );
+
+$conf->options->set(%args);
+is( $conf->options->{c}->{debugging},
+    1, "command-line option '--debugging' has been stored in object" );
+
+my $rv;
+my ( $tie, @lines );
+{
+    $tie = tie *STDOUT, "Parrot::IO::Capture::Mini"
+        or croak "Unable to tie";
+    $rv    = $conf->runsteps;
+    @lines = $tie->READLINE;
+}
+ok($rv, "runsteps() returned true value");
+my $bigmsg = join q{}, @lines;
+like(
+    $bigmsg,
+    qr/$description\.\.\./s,
+    "Got STDOUT message expected upon running $step"
+);
+
+pass("Completed all tests in $0");
+
+################### DOCUMENTATION ###################
+
+=head1 NAME
+
+054-fatal_step.t - test bad step failure case in Parrot::Configure
+
+=head1 SYNOPSIS
+
+    % prove t/configure/054-fatal_step.t
+
+=head1 DESCRIPTION
+
+The files in this directory test functionality used by F<Configure.pl>.
+
+The tests in this file examine what happens when a valid value is specified 
for the C<--fatal-step> but a different configuration step is run.
+
+=head1 AUTHOR
+
+James E Keenan
+
+=head1 SEE ALSO
+
+Parrot::Configure, F<Configure.pl>.
+
+=cut
+
+# Local Variables:
+#   mode: cperl
+#   cperl-indent-level: 4
+#   fill-column: 100
+# End:
+# vim: expandtab shiftwidth=4:
+

Property changes on: t/configure/054-fatal_step.t
___________________________________________________________________
Name: svn:mime-type
   + text/plain
Name: svn:keywords
   + Author Date Id Revision
Name: svn:eol-style
   + native

Index: t/configure/058-fatal_step.t
===================================================================
--- t/configure/058-fatal_step.t        (revision 0)
+++ t/configure/058-fatal_step.t        (revision 0)
@@ -0,0 +1,95 @@
+#! perl
+# Copyright (C) 2007, The Perl Foundation.
+# $Id$
+# 058-fatal_step.t
+
+use strict;
+use warnings;
+
+use Test::More tests => 12;
+use Carp;
+use lib qw( lib t/configure/testlib );
+use Parrot::Configure;
+use Parrot::Configure::Options qw( process_options );
+use Parrot::IO::Capture::Mini;
+
+$| = 1;
+is( $|, 1, "output autoflush is set" );
+
+my $s = 1;
+my $args = process_options(
+    {
+        argv => [ qq{--fatal-step=$s} ],
+        mode => q{configure},
+    }
+);
+ok( defined $args, "process_options returned successfully" );
+my %args = %$args;
+
+my $conf = Parrot::Configure->new;
+ok( defined $conf, "Parrot::Configure->new() returned okay" );
+
+my $step        = q{foo::zeta};
+my $description = 'Determining if your computer does zeta';
+
+$conf->add_steps($step);
+my @confsteps = @{ $conf->steps };
+isnt( scalar @confsteps, 0,
+    "Parrot::Configure object 'steps' key holds non-empty array reference" );
+is( scalar @confsteps, 1, "Parrot::Configure object 'steps' key holds ref to 
1-element array" );
+my $nontaskcount = 0;
+foreach my $k (@confsteps) {
+    $nontaskcount++ unless $k->isa("Parrot::Configure::Task");
+}
+is( $nontaskcount, 0, "Each step is a Parrot::Configure::Task object" );
+is( $confsteps[0]->step, $step, "'step' element of Parrot::Configure::Task 
struct identified" );
+is( ref( $confsteps[0]->params ),
+    'ARRAY', "'params' element of Parrot::Configure::Task struct is array ref" 
);
+ok( !ref( $confsteps[0]->object ),
+    "'object' element of Parrot::Configure::Task struct is not yet a ref" );
+
+$conf->options->set(%args);
+is( $conf->options->{c}->{debugging},
+    1, "command-line option '--debugging' has been stored in object" );
+
+my $rv;
+eval { $rv = $conf->runsteps; };
+like($@, qr/^Configuration step corresponding to $s is invalid/,
+    "Got expected error message when value to --fatal-step option was 
misspecified");
+
+pass("Completed all tests in $0");
+
+################### DOCUMENTATION ###################
+
+=head1 NAME
+
+058-fatal_step.t - test bad step failure case in Parrot::Configure
+
+=head1 SYNOPSIS
+
+    % prove t/configure/058-fatal_step.t
+
+=head1 DESCRIPTION
+
+The files in this directory test functionality used by F<Configure.pl>.
+
+The tests in this file examine what happens when you misspecify the value for
+the C<--fatal-step> option.
+
+=head1 AUTHOR
+
+James E Keenan
+
+=head1 SEE ALSO
+
+Parrot::Configure, F<Configure.pl>.
+
+=cut
+
+# Local Variables:
+#   mode: cperl
+#   cperl-indent-level: 4
+#   fill-column: 100
+# End:
+# vim: expandtab shiftwidth=4:
+

Property changes on: t/configure/058-fatal_step.t
___________________________________________________________________
Name: svn:mime-type
   + text/plain
Name: svn:keywords
   + Author Date Id Revision
Name: svn:eol-style
   + native

Index: t/configure/051-fatal_step.t
===================================================================
--- t/configure/051-fatal_step.t        (revision 0)
+++ t/configure/051-fatal_step.t        (revision 0)
@@ -0,0 +1,120 @@
+#! perl
+# Copyright (C) 2007, The Perl Foundation.
+# $Id$
+# 051-fatal_step.t
+
+use strict;
+use warnings;
+
+use Test::More tests => 14;
+use Carp;
+use lib qw( lib t/configure/testlib );
+use Parrot::Configure;
+use Parrot::Configure::Options qw( process_options );
+use Parrot::IO::Capture::Mini;
+
+$| = 1;
+is( $|, 1, "output autoflush is set" );
+
+my $args = process_options(
+    {
+        argv => [ qw( --fatal-step=init::zeta ) ],
+        mode => q{configure},
+    }
+);
+ok( defined $args, "process_options returned successfully" );
+my %args = %$args;
+
+my $conf = Parrot::Configure->new;
+ok( defined $conf, "Parrot::Configure->new() returned okay" );
+
+my $step        = q{init::zeta};
+my $description = 'Determining if your computer does zeta';
+
+$conf->add_steps($step);
+my @confsteps = @{ $conf->steps };
+isnt( scalar @confsteps, 0,
+    "Parrot::Configure object 'steps' key holds non-empty array reference" );
+is( scalar @confsteps, 1, "Parrot::Configure object 'steps' key holds ref to 
1-element array" );
+my $nontaskcount = 0;
+foreach my $k (@confsteps) {
+    $nontaskcount++ unless $k->isa("Parrot::Configure::Task");
+}
+is( $nontaskcount, 0, "Each step is a Parrot::Configure::Task object" );
+is( $confsteps[0]->step, $step, "'step' element of Parrot::Configure::Task 
struct identified" );
+is( ref( $confsteps[0]->params ),
+    'ARRAY', "'params' element of Parrot::Configure::Task struct is array ref" 
);
+ok( !ref( $confsteps[0]->object ),
+    "'object' element of Parrot::Configure::Task struct is not yet a ref" );
+
+$conf->options->set(%args);
+is( $conf->options->{c}->{debugging},
+    1, "command-line option '--debugging' has been stored in object" );
+
+my $rv;
+my ( $tie, @lines );
+my ( $errtie, @errlines );
+{
+    $tie = tie *STDOUT, "Parrot::IO::Capture::Mini"
+        or croak "Unable to tie";
+    $errtie = tie *STDERR, "Parrot::IO::Capture::Mini"
+        or croak "Unable to tie";
+    $rv    = $conf->runsteps;
+    @lines = $tie->READLINE;
+    @errlines = $errtie->READLINE;
+    $tie = undef;
+    $errtie = undef;
+}
+untie *STDOUT;
+untie *STDERR;
+ok(! defined $rv, 'runsteps() returned undef');
+my $bigmsg = join q{}, @lines;
+like(
+    $bigmsg,
+    qr/$description\.\.\./s,
+    "Got STDOUT message expected upon running $step"
+);
+my $errbigmsg = join q{}, @errlines;
+like(
+    $errbigmsg,
+    qr/step $step failed:/s,
+    "Got STDERR message expected upon running $step"
+);
+
+pass("Completed all tests in $0");
+
+################### DOCUMENTATION ###################
+
+=head1 NAME
+
+051-fatal_step.t - test bad step failure case in Parrot::Configure
+
+=head1 SYNOPSIS
+
+    % prove t/configure/051-fatal_step.t
+
+=head1 DESCRIPTION
+
+The files in this directory test functionality used by F<Configure.pl>.
+
+The tests in this file examine what happens when you set the C<--fatal-step>
+option for a single configuration step and that step returns an undefined
+value.
+
+=head1 AUTHOR
+
+James E Keenan
+
+=head1 SEE ALSO
+
+Parrot::Configure, F<Configure.pl>.
+
+=cut
+
+# Local Variables:
+#   mode: cperl
+#   cperl-indent-level: 4
+#   fill-column: 100
+# End:
+# vim: expandtab shiftwidth=4:
+

Property changes on: t/configure/051-fatal_step.t
___________________________________________________________________
Name: svn:mime-type
   + text/plain
Name: svn:keywords
   + Author Date Id Revision
Name: svn:eol-style
   + native

Index: t/configure/050-fatal.t
===================================================================
--- t/configure/050-fatal.t     (revision 0)
+++ t/configure/050-fatal.t     (revision 0)
@@ -0,0 +1,90 @@
+#! perl
+# Copyright (C) 2007, The Perl Foundation.
+# $Id$
+# 050-fatal.t
+
+use strict;
+use warnings;
+
+use Test::More tests =>  6;
+use Carp;
+use lib qw( lib t/configure/testlib );
+use Parrot::Configure;
+use Parrot::Configure::Options qw( process_options );
+use Parrot::Configure::Step::List qw( get_steps_list );
+use Parrot::IO::Capture::Mini;
+
+$| = 1;
+is($|, 1, "output autoflush is set");
+
+my $args = process_options( {
+    argv    => [ q{--fatal} ],
+    mode    => q{configure},
+} );
+ok(defined $args, "process_options returned successfully");
+my %args = %$args;
+
+my $conf = Parrot::Configure->new;
+ok(defined $conf, "Parrot::Configure->new() returned okay");
+
+my $first_step = q{init::zeta};
+my $description = 'Determining if your computer does zeta';
+
+$conf->add_steps( $first_step, get_steps_list() );
+
+$conf->options->set(%args);
+is($conf->options->{c}->{debugging}, 1,
+    "command-line option '--debugging' has been stored in object");
+
+my $rv;
+my (@lines, @errlines);
+{
+    my ($tie, $errtie);
+    $tie = tie *STDOUT, "Parrot::IO::Capture::Mini"
+        or croak "Unable to tie";
+    $errtie = tie *STDERR, "Parrot::IO::Capture::Mini"
+        or croak "Unable to tie";
+    $rv = $conf->runsteps;
+    @lines = $tie->READLINE;
+    @errlines = $errtie->READLINE;
+}
+untie *STDOUT;
+untie *STDERR;
+
+ok(! defined $rv, "runsteps returned undefined value as expected");
+
+pass("Completed all tests in $0");
+
+################### DOCUMENTATION ###################
+
+=head1 NAME
+
+050-fatal.t - see what happens when C<--fatal-step> is set for all 
configuration steps
+
+=head1 SYNOPSIS
+
+    % prove t/configure/050-fatal.t
+
+=head1 DESCRIPTION
+
+The files in this directory test functionality used by F<Configure.pl>.
+
+The tests in this file examine what happens when you require the failure of
+any configuration step to cause all configuration to cease.
+
+=head1 AUTHOR
+
+James E Keenan
+
+=head1 SEE ALSO
+
+Parrot::Configure, F<Configure.pl>.
+
+=cut
+
+# Local Variables:
+#   mode: cperl
+#   cperl-indent-level: 4
+#   fill-column: 100
+# End:
+# vim: expandtab shiftwidth=4:

Property changes on: t/configure/050-fatal.t
___________________________________________________________________
Name: svn:mime-type
   + text/plain
Name: svn:keywords
   + Author Date Id Revision
Name: svn:eol-style
   + native

Index: t/configure/055-fatal_step.t
===================================================================
--- t/configure/055-fatal_step.t        (revision 0)
+++ t/configure/055-fatal_step.t        (revision 0)
@@ -0,0 +1,120 @@
+#! perl
+# Copyright (C) 2007, The Perl Foundation.
+# $Id$
+# 055-fatal_step.t
+
+use strict;
+use warnings;
+
+use Test::More tests => 14;
+use Carp;
+use lib qw( lib t/configure/testlib );
+use Parrot::Configure;
+use Parrot::Configure::Options qw( process_options );
+use Parrot::IO::Capture::Mini;
+
+$| = 1;
+is( $|, 1, "output autoflush is set" );
+
+my $args = process_options(
+    {
+        argv => [ qw( --fatal-step=1 ) ],
+        mode => q{configure},
+    }
+);
+ok( defined $args, "process_options returned successfully" );
+my %args = %$args;
+
+my $conf = Parrot::Configure->new;
+ok( defined $conf, "Parrot::Configure->new() returned okay" );
+
+my $step        = q{init::zeta};
+my $description = 'Determining if your computer does zeta';
+
+$conf->add_steps($step);
+my @confsteps = @{ $conf->steps };
+isnt( scalar @confsteps, 0,
+    "Parrot::Configure object 'steps' key holds non-empty array reference" );
+is( scalar @confsteps, 1, "Parrot::Configure object 'steps' key holds ref to 
1-element array" );
+my $nontaskcount = 0;
+foreach my $k (@confsteps) {
+    $nontaskcount++ unless $k->isa("Parrot::Configure::Task");
+}
+is( $nontaskcount, 0, "Each step is a Parrot::Configure::Task object" );
+is( $confsteps[0]->step, $step, "'step' element of Parrot::Configure::Task 
struct identified" );
+is( ref( $confsteps[0]->params ),
+    'ARRAY', "'params' element of Parrot::Configure::Task struct is array ref" 
);
+ok( !ref( $confsteps[0]->object ),
+    "'object' element of Parrot::Configure::Task struct is not yet a ref" );
+
+$conf->options->set(%args);
+is( $conf->options->{c}->{debugging},
+    1, "command-line option '--debugging' has been stored in object" );
+
+my $rv;
+my ( $tie, @lines );
+my ( $errtie, @errlines );
+{
+    $tie = tie *STDOUT, "Parrot::IO::Capture::Mini"
+        or croak "Unable to tie";
+    $errtie = tie *STDERR, "Parrot::IO::Capture::Mini"
+        or croak "Unable to tie";
+    $rv    = $conf->runsteps;
+    @lines = $tie->READLINE;
+    @errlines = $errtie->READLINE;
+    $tie = undef;
+    $errtie = undef;
+}
+untie *STDOUT;
+untie *STDERR;
+ok(! defined $rv, 'runsteps() returned undef');
+my $bigmsg = join q{}, @lines;
+like(
+    $bigmsg,
+    qr/$description\.\.\./s,
+    "Got STDOUT message expected upon running $step"
+);
+my $errbigmsg = join q{}, @errlines;
+like(
+    $errbigmsg,
+    qr/step $step failed:/s,
+    "Got STDERR message expected upon running $step"
+);
+
+pass("Completed all tests in $0");
+
+################### DOCUMENTATION ###################
+
+=head1 NAME
+
+055-fatal_step.t - test bad step failure case in Parrot::Configure
+
+=head1 SYNOPSIS
+
+    % prove t/configure/055-fatal_step.t
+
+=head1 DESCRIPTION
+
+The files in this directory test functionality used by F<Configure.pl>.
+
+The tests in this file examine what happens when you set the C<--fatal-step>
+option for a single configuration step via s configuration sequence number and
+that step returns an undefined value.
+
+=head1 AUTHOR
+
+James E Keenan
+
+=head1 SEE ALSO
+
+Parrot::Configure, F<Configure.pl>.
+
+=cut
+
+# Local Variables:
+#   mode: cperl
+#   cperl-indent-level: 4
+#   fill-column: 100
+# End:
+# vim: expandtab shiftwidth=4:
+

Property changes on: t/configure/055-fatal_step.t
___________________________________________________________________
Name: svn:mime-type
   + text/plain
Name: svn:keywords
   + Author Date Id Revision
Name: svn:eol-style
   + native

Index: t/configure/052-fatal_step.t
===================================================================
--- t/configure/052-fatal_step.t        (revision 0)
+++ t/configure/052-fatal_step.t        (revision 0)
@@ -0,0 +1,120 @@
+#! perl
+# Copyright (C) 2007, The Perl Foundation.
+# $Id$
+# 052-fatal_step.t
+
+use strict;
+use warnings;
+
+use Test::More tests => 14;
+use Carp;
+use lib qw( lib t/configure/testlib );
+use Parrot::Configure;
+use Parrot::Configure::Options qw( process_options );
+use Parrot::IO::Capture::Mini;
+
+$| = 1;
+is( $|, 1, "output autoflush is set" );
+
+my $args = process_options(
+    {
+        argv => [ q{--fatal-step=init::zeta,init::manifest} ],
+        mode => q{configure},
+    }
+);
+ok( defined $args, "process_options returned successfully" );
+my %args = %$args;
+
+my $conf = Parrot::Configure->new;
+ok( defined $conf, "Parrot::Configure->new() returned okay" );
+
+my $step        = q{init::zeta};
+my $description = 'Determining if your computer does zeta';
+
+$conf->add_steps($step);
+my @confsteps = @{ $conf->steps };
+isnt( scalar @confsteps, 0,
+    "Parrot::Configure object 'steps' key holds non-empty array reference" );
+is( scalar @confsteps, 1, "Parrot::Configure object 'steps' key holds ref to 
1-element array" );
+my $nontaskcount = 0;
+foreach my $k (@confsteps) {
+    $nontaskcount++ unless $k->isa("Parrot::Configure::Task");
+}
+is( $nontaskcount, 0, "Each step is a Parrot::Configure::Task object" );
+is( $confsteps[0]->step, $step, "'step' element of Parrot::Configure::Task 
struct identified" );
+is( ref( $confsteps[0]->params ),
+    'ARRAY', "'params' element of Parrot::Configure::Task struct is array ref" 
);
+ok( !ref( $confsteps[0]->object ),
+    "'object' element of Parrot::Configure::Task struct is not yet a ref" );
+
+$conf->options->set(%args);
+is( $conf->options->{c}->{debugging},
+    1, "command-line option '--debugging' has been stored in object" );
+
+my $rv;
+my ( $tie, @lines );
+my ( $errtie, @errlines );
+{
+    $tie = tie *STDOUT, "Parrot::IO::Capture::Mini"
+        or croak "Unable to tie";
+    $errtie = tie *STDERR, "Parrot::IO::Capture::Mini"
+        or croak "Unable to tie";
+    $rv    = $conf->runsteps;
+    @lines = $tie->READLINE;
+    @errlines = $errtie->READLINE;
+    $tie = undef;
+    $errtie = undef;
+}
+untie *STDOUT;
+untie *STDERR;
+ok(! defined $rv, 'runsteps() returned undef');
+my $bigmsg = join q{}, @lines;
+like(
+    $bigmsg,
+    qr/$description\.\.\./s,
+    "Got STDOUT message expected upon running $step"
+);
+my $errbigmsg = join q{}, @errlines;
+like(
+    $errbigmsg,
+    qr/step $step failed:/s,
+    "Got STDERR message expected upon running $step"
+);
+
+pass("Completed all tests in $0");
+
+################### DOCUMENTATION ###################
+
+=head1 NAME
+
+052-fatal_step.t - test bad step failure case in Parrot::Configure
+
+=head1 SYNOPSIS
+
+    % prove t/configure/052-fatal_step.t
+
+=head1 DESCRIPTION
+
+The files in this directory test functionality used by F<Configure.pl>.
+
+The tests in this file examine what happens when you set the C<--fatal-step>
+option for multiple configuration steps and one of those steps returns an
+undefined value.
+
+=head1 AUTHOR
+
+James E Keenan
+
+=head1 SEE ALSO
+
+Parrot::Configure, F<Configure.pl>.
+
+=cut
+
+# Local Variables:
+#   mode: cperl
+#   cperl-indent-level: 4
+#   fill-column: 100
+# End:
+# vim: expandtab shiftwidth=4:
+

Property changes on: t/configure/052-fatal_step.t
___________________________________________________________________
Name: svn:mime-type
   + text/plain
Name: svn:keywords
   + Author Date Id Revision
Name: svn:eol-style
   + native

Index: t/configure/056-fatal_step.t
===================================================================
--- t/configure/056-fatal_step.t        (revision 0)
+++ t/configure/056-fatal_step.t        (revision 0)
@@ -0,0 +1,120 @@
+#! perl
+# Copyright (C) 2007, The Perl Foundation.
+# $Id$
+# 056-fatal_step.t
+
+use strict;
+use warnings;
+
+use Test::More tests => 14;
+use Carp;
+use lib qw( lib t/configure/testlib );
+use Parrot::Configure;
+use Parrot::Configure::Options qw( process_options );
+use Parrot::IO::Capture::Mini;
+
+$| = 1;
+is( $|, 1, "output autoflush is set" );
+
+my $args = process_options(
+    {
+        argv => [ q{--fatal-step=1,init::manifest} ],
+        mode => q{configure},
+    }
+);
+ok( defined $args, "process_options returned successfully" );
+my %args = %$args;
+
+my $conf = Parrot::Configure->new;
+ok( defined $conf, "Parrot::Configure->new() returned okay" );
+
+my $step        = q{init::zeta};
+my $description = 'Determining if your computer does zeta';
+
+$conf->add_steps($step);
+my @confsteps = @{ $conf->steps };
+isnt( scalar @confsteps, 0,
+    "Parrot::Configure object 'steps' key holds non-empty array reference" );
+is( scalar @confsteps, 1, "Parrot::Configure object 'steps' key holds ref to 
1-element array" );
+my $nontaskcount = 0;
+foreach my $k (@confsteps) {
+    $nontaskcount++ unless $k->isa("Parrot::Configure::Task");
+}
+is( $nontaskcount, 0, "Each step is a Parrot::Configure::Task object" );
+is( $confsteps[0]->step, $step, "'step' element of Parrot::Configure::Task 
struct identified" );
+is( ref( $confsteps[0]->params ),
+    'ARRAY', "'params' element of Parrot::Configure::Task struct is array ref" 
);
+ok( !ref( $confsteps[0]->object ),
+    "'object' element of Parrot::Configure::Task struct is not yet a ref" );
+
+$conf->options->set(%args);
+is( $conf->options->{c}->{debugging},
+    1, "command-line option '--debugging' has been stored in object" );
+
+my $rv;
+my ( $tie, @lines );
+my ( $errtie, @errlines );
+{
+    $tie = tie *STDOUT, "Parrot::IO::Capture::Mini"
+        or croak "Unable to tie";
+    $errtie = tie *STDERR, "Parrot::IO::Capture::Mini"
+        or croak "Unable to tie";
+    $rv    = $conf->runsteps;
+    @lines = $tie->READLINE;
+    @errlines = $errtie->READLINE;
+    $tie = undef;
+    $errtie = undef;
+}
+untie *STDOUT;
+untie *STDERR;
+ok(! defined $rv, 'runsteps() returned undef');
+my $bigmsg = join q{}, @lines;
+like(
+    $bigmsg,
+    qr/$description\.\.\./s,
+    "Got STDOUT message expected upon running $step"
+);
+my $errbigmsg = join q{}, @errlines;
+like(
+    $errbigmsg,
+    qr/step $step failed:/s,
+    "Got STDERR message expected upon running $step"
+);
+
+pass("Completed all tests in $0");
+
+################### DOCUMENTATION ###################
+
+=head1 NAME
+
+056-fatal_step.t - test bad step failure case in Parrot::Configure
+
+=head1 SYNOPSIS
+
+    % prove t/configure/056-fatal_step.t
+
+=head1 DESCRIPTION
+
+The files in this directory test functionality used by F<Configure.pl>.
+
+The tests in this file examine what happens when you set the C<--fatal-step>
+option for multiple configuration steps (some via step sequence number) and
+one of those steps returns an undefined value.
+
+=head1 AUTHOR
+
+James E Keenan
+
+=head1 SEE ALSO
+
+Parrot::Configure, F<Configure.pl>.
+
+=cut
+
+# Local Variables:
+#   mode: cperl
+#   cperl-indent-level: 4
+#   fill-column: 100
+# End:
+# vim: expandtab shiftwidth=4:
+

Property changes on: t/configure/056-fatal_step.t
___________________________________________________________________
Name: svn:mime-type
   + text/plain
Name: svn:keywords
   + Author Date Id Revision
Name: svn:eol-style
   + native

Index: t/configure/053-fatal_step.t
===================================================================
--- t/configure/053-fatal_step.t        (revision 0)
+++ t/configure/053-fatal_step.t        (revision 0)
@@ -0,0 +1,95 @@
+#! perl
+# Copyright (C) 2007, The Perl Foundation.
+# $Id$
+# 053-fatal_step.t
+
+use strict;
+use warnings;
+
+use Test::More tests => 12;
+use Carp;
+use lib qw( lib t/configure/testlib );
+use Parrot::Configure;
+use Parrot::Configure::Options qw( process_options );
+use Parrot::IO::Capture::Mini;
+
+$| = 1;
+is( $|, 1, "output autoflush is set" );
+
+my $args = process_options(
+    {
+        argv => [ qw( --fatal-step=foo::zeta ) ],
+        mode => q{configure},
+    }
+);
+ok( defined $args, "process_options returned successfully" );
+my %args = %$args;
+
+my $conf = Parrot::Configure->new;
+ok( defined $conf, "Parrot::Configure->new() returned okay" );
+
+my $step        = q{foo::zeta};
+my $description = 'Determining if your computer does zeta';
+
+$conf->add_steps($step);
+my @confsteps = @{ $conf->steps };
+isnt( scalar @confsteps, 0,
+    "Parrot::Configure object 'steps' key holds non-empty array reference" );
+is( scalar @confsteps, 1, "Parrot::Configure object 'steps' key holds ref to 
1-element array" );
+my $nontaskcount = 0;
+foreach my $k (@confsteps) {
+    $nontaskcount++ unless $k->isa("Parrot::Configure::Task");
+}
+is( $nontaskcount, 0, "Each step is a Parrot::Configure::Task object" );
+is( $confsteps[0]->step, $step, "'step' element of Parrot::Configure::Task 
struct identified" );
+is( ref( $confsteps[0]->params ),
+    'ARRAY', "'params' element of Parrot::Configure::Task struct is array ref" 
);
+ok( !ref( $confsteps[0]->object ),
+    "'object' element of Parrot::Configure::Task struct is not yet a ref" );
+
+$conf->options->set(%args);
+is( $conf->options->{c}->{debugging},
+    1, "command-line option '--debugging' has been stored in object" );
+
+my $rv;
+eval { $rv = $conf->runsteps; };
+like($@, qr/^Argument to 'fatal-step' option/,
+    "Got expected error message when value to --fatal-step option was 
misspecified");
+
+
+pass("Completed all tests in $0");
+
+################### DOCUMENTATION ###################
+
+=head1 NAME
+
+053-fatal_step.t - test bad step failure case in Parrot::Configure
+
+=head1 SYNOPSIS
+
+    % prove t/configure/053-fatal_step.t
+
+=head1 DESCRIPTION
+
+The files in this directory test functionality used by F<Configure.pl>.
+
+The tests in this file examine what happens when you misspecify the value for
+the C<--fatal-step> option.
+
+=head1 AUTHOR
+
+James E Keenan
+
+=head1 SEE ALSO
+
+Parrot::Configure, F<Configure.pl>.
+
+=cut
+
+# Local Variables:
+#   mode: cperl
+#   cperl-indent-level: 4
+#   fill-column: 100
+# End:
+# vim: expandtab shiftwidth=4:
+

Property changes on: t/configure/053-fatal_step.t
___________________________________________________________________
Name: svn:mime-type
   + text/plain
Name: svn:keywords
   + Author Date Id Revision
Name: svn:eol-style
   + native

Index: t/configure/057-fatal_step.t
===================================================================
--- t/configure/057-fatal_step.t        (revision 0)
+++ t/configure/057-fatal_step.t        (revision 0)
@@ -0,0 +1,95 @@
+#! perl
+# Copyright (C) 2007, The Perl Foundation.
+# $Id$
+# 057-fatal_step.t
+
+use strict;
+use warnings;
+
+use Test::More tests => 12;
+use Carp;
+use lib qw( lib t/configure/testlib );
+use Parrot::Configure;
+use Parrot::Configure::Options qw( process_options );
+use Parrot::IO::Capture::Mini;
+
+$| = 1;
+is( $|, 1, "output autoflush is set" );
+
+my $fatal_step_sequence_number = 1079;
+my $args = process_options(
+    {
+        argv => [ qq{--fatal-step=$fatal_step_sequence_number} ],
+        mode => q{configure},
+    }
+);
+ok( defined $args, "process_options returned successfully" );
+my %args = %$args;
+
+my $conf = Parrot::Configure->new;
+ok( defined $conf, "Parrot::Configure->new() returned okay" );
+
+my $step        = q{init::zeta};
+my $description = 'Determining if your computer does zeta';
+
+$conf->add_steps($step);
+my @confsteps = @{ $conf->steps };
+isnt( scalar @confsteps, 0,
+    "Parrot::Configure object 'steps' key holds non-empty array reference" );
+is( scalar @confsteps, 1, "Parrot::Configure object 'steps' key holds ref to 
1-element array" );
+my $nontaskcount = 0;
+foreach my $k (@confsteps) {
+    $nontaskcount++ unless $k->isa("Parrot::Configure::Task");
+}
+is( $nontaskcount, 0, "Each step is a Parrot::Configure::Task object" );
+is( $confsteps[0]->step, $step, "'step' element of Parrot::Configure::Task 
struct identified" );
+is( ref( $confsteps[0]->params ),
+    'ARRAY', "'params' element of Parrot::Configure::Task struct is array ref" 
);
+ok( !ref( $confsteps[0]->object ),
+    "'object' element of Parrot::Configure::Task struct is not yet a ref" );
+
+$conf->options->set(%args);
+is( $conf->options->{c}->{debugging},
+    1, "command-line option '--debugging' has been stored in object" );
+
+my $rv;
+eval { $rv = $conf->runsteps; };
+like($@, qr/^No configuration step corresponding to 
$fatal_step_sequence_number/,
+    "Got expected error message when value to --fatal-step option was 
misspecified");
+
+pass("Completed all tests in $0");
+
+################### DOCUMENTATION ###################
+
+=head1 NAME
+
+057-fatal_step.t - test bad step failure case in Parrot::Configure
+
+=head1 SYNOPSIS
+
+    % prove t/configure/057-fatal_step.t
+
+=head1 DESCRIPTION
+
+The files in this directory test functionality used by F<Configure.pl>.
+
+The tests in this file examine what happens when you misspecify the value for
+the C<--fatal-step> option.
+
+=head1 AUTHOR
+
+James E Keenan
+
+=head1 SEE ALSO
+
+Parrot::Configure, F<Configure.pl>.
+
+=cut
+
+# Local Variables:
+#   mode: cperl
+#   cperl-indent-level: 4
+#   fill-column: 100
+# End:
+# vim: expandtab shiftwidth=4:
+

Property changes on: t/configure/057-fatal_step.t
___________________________________________________________________
Name: svn:mime-type
   + text/plain
Name: svn:keywords
   + Author Date Id Revision
Name: svn:eol-style
   + native

Reply via email to