On Fri Jun 22 18:45:22 2007, [EMAIL PROTECTED] wrote:
> Write unit tests for config/inter/progs.pm, 
> the module whose functionality executes Parrot 
> configuration step inter::progs.
> 

See patch attached, which includes two testfiles plus a small package,
stuffed under t/configure/testlib, which facilitates testing of prompts:
 Tie::Filehandle::Preempt::Stdin (taken from CPAN).

As with other patches, I'll commit this to trunk in about 3 days unless
someone objects.

kid51
Index: MANIFEST
===================================================================
--- MANIFEST    (revision 20840)
+++ MANIFEST    (working copy)
@@ -1,7 +1,7 @@
 # ex: set ro:
 # $Id$
 #
-# generated by tools/dev/mk_manifest_and_skip.pl Sat Aug 25 01:42:41 2007 UT
+# generated by tools/dev/mk_manifest_and_skip.pl Sat Aug 25 17:41:30 2007 UT
 #
 # See tools/dev/install_files.pl for documentation on the
 # format of this file.
@@ -2908,11 +2908,14 @@
 t/configure/103-init_install.t                              []
 t/configure/104-init_miniparrot.t                           []
 t/configure/106-init_headers.t                              []
+t/configure/107-inter_progs.01.t                            []
+t/configure/107-inter_progs.02.t                            []
 t/configure/base.t                                          []
 t/configure/config_steps.t                                  []
 t/configure/data.t                                          []
 t/configure/step.t                                          []
 t/configure/testlib/Make_VERSION_File.pm                    []
+t/configure/testlib/Tie/Filehandle/Preempt/Stdin.pm         []
 t/configure/testlib/init/alpha.pm                           []
 t/configure/testlib/init/beta.pm                            []
 t/configure/testlib/init/delta.pm                           []
Index: t/configure/107-inter_progs.01.t
===================================================================
--- t/configure/107-inter_progs.01.t    (revision 0)
+++ t/configure/107-inter_progs.01.t    (revision 0)
@@ -0,0 +1,111 @@
+#! perl
+# Copyright (C) 2007, The Perl Foundation.
+# $Id$
+# 107-inter_progs.01.t
+
+use strict;
+use warnings;
+use Test::More tests => 24;
+use Carp;
+use Data::Dumper;
+use lib qw( . lib ../lib ../../lib t/configure/testlib );
+use_ok('config::init::defaults');
+use_ok('config::init::install');
+use_ok('config::init::hints');
+use_ok('config::inter::progs');
+use Parrot::Configure;
+use Parrot::Configure::Options qw( process_options );
+use Parrot::IO::Capture::Mini;
+use Parrot::Configure::Test qw( test_step_thru_runstep);
+use Tie::Filehandle::Preempt::Stdin;
+
+=for hints_for_testing Testing and refactoring of inter::progs should
+entail understanding of issues discussed in the following RT tickets:
+http://rt.perl.org/rt3/Ticket/Display.html?id=43174;
+http://rt.perl.org/rt3/Ticket/Display.html?id=43173; and
+http://rt.perl.org/rt3/Ticket/Display.html?id=41168.  You will have to
+determine a way to test a user response to a prompt.
+
+=cut
+
+my $args = process_options( {
+    argv            => [ q{--ask} ],
+    mode            => q{configure},
+} );
+
+my $conf = Parrot::Configure->new;
+
+test_step_thru_runstep($conf, q{init::defaults}, $args);
+test_step_thru_runstep($conf, q{init::install}, $args);
+test_step_thru_runstep($conf, q{init::hints}, $args);
+
+my (@prompts, $object, @entered);
[EMAIL PROTECTED] = map { q{foo_} . $_ } 
+    qw| alpha beta gamma delta epsilon zeta eta theta iota kappa |;
+$object = tie *STDIN, 'Tie::Filehandle::Preempt::Stdin', @prompts;
+can_ok('Tie::Filehandle::Preempt::Stdin', ('READLINE'));
+isa_ok($object, 'Tie::Filehandle::Preempt::Stdin');
+
+my ($task, $step_name, @step_params, $step, $ret);
+my $pkg = q{inter::progs};
+
+$conf->add_steps($pkg);
+$conf->options->set(%{$args});
+
+$task = $conf->steps->[3];
+$step_name   = $task->step;
[EMAIL PROTECTED] = @{ $task->params };
+
+$step = $step_name->new();
+ok(defined $step, "$step_name constructor returned defined value");
+isa_ok($step, $step_name);
+ok($step->description(), "$step_name has description");
+
+# need to capture the --verbose output, because the fact that it does not end
+# in a newline confuses Test::Harness
+{
+    my $tie_out = tie *STDOUT, "Parrot::IO::Capture::Mini"
+        or croak "Unable to tie";
+    $ret = $step->runstep($conf);
+    my @more_lines = $tie_out->READLINE;
+    ok(@more_lines, "prompts were captured");
+    ok(defined $ret, "$step_name runstep() returned defined value");
+}
+
+$object = undef;
+untie *STDIN;
+
+pass("Completed all tests in $0");
+
+################### DOCUMENTATION ###################
+
+=head1 NAME
+
+107-inter_progs.01.t - test config::inter::progs
+
+=head1 SYNOPSIS
+
+    % prove t/configure/107-inter_progs.01.t
+
+=head1 DESCRIPTION
+
+The files in this directory test functionality used by F<Configure.pl>.
+
+The tests in this file test subroutines exported by config::inter::progs.
+
+=head1 AUTHOR
+
+James E Keenan
+
+=head1 SEE ALSO
+
+config::inter::progs, 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/107-inter_progs.01.t
___________________________________________________________________
Name: svn:mime-type
   + text/plain
Name: svn:keywords
   + Author Date Id Revision
Name: svn:eol-style
   + native

Index: t/configure/107-inter_progs.02.t
===================================================================
--- t/configure/107-inter_progs.02.t    (revision 0)
+++ t/configure/107-inter_progs.02.t    (revision 0)
@@ -0,0 +1,111 @@
+#! perl
+# Copyright (C) 2007, The Perl Foundation.
+# $Id$
+# 107-inter_progs.02.t
+
+use strict;
+use warnings;
+use Test::More tests => 24;
+use Carp;
+use Data::Dumper;
+use lib qw( . lib ../lib ../../lib t/configure/testlib );
+use_ok('config::init::defaults');
+use_ok('config::init::install');
+use_ok('config::init::hints');
+use_ok('config::inter::progs');
+use Parrot::Configure;
+use Parrot::Configure::Options qw( process_options );
+use Parrot::IO::Capture::Mini;
+use Parrot::Configure::Test qw( test_step_thru_runstep);
+use Tie::Filehandle::Preempt::Stdin;
+
+=for hints_for_testing Testing and refactoring of inter::progs should
+entail understanding of issues discussed in the following RT tickets:
+http://rt.perl.org/rt3/Ticket/Display.html?id=43174;
+http://rt.perl.org/rt3/Ticket/Display.html?id=43173; and
+http://rt.perl.org/rt3/Ticket/Display.html?id=41168.  You will have to
+determine a way to test a user response to a prompt.
+
+=cut
+
+my $args = process_options( {
+    argv            => [ q{--ask}, q{--debugging=0} ],
+    mode            => q{configure},
+} );
+
+my $conf = Parrot::Configure->new;
+
+test_step_thru_runstep($conf, q{init::defaults}, $args);
+test_step_thru_runstep($conf, q{init::install}, $args);
+test_step_thru_runstep($conf, q{init::hints}, $args);
+
+my (@prompts, $object, @entered);
[EMAIL PROTECTED] = map { q{foo_} . $_ } 
+    qw| alpha beta gamma delta epsilon zeta eta theta iota |;
+$object = tie *STDIN, 'Tie::Filehandle::Preempt::Stdin', @prompts;
+can_ok('Tie::Filehandle::Preempt::Stdin', ('READLINE'));
+isa_ok($object, 'Tie::Filehandle::Preempt::Stdin');
+
+my ($task, $step_name, @step_params, $step, $ret);
+my $pkg = q{inter::progs};
+
+$conf->add_steps($pkg);
+$conf->options->set(%{$args});
+
+$task = $conf->steps->[3];
+$step_name   = $task->step;
[EMAIL PROTECTED] = @{ $task->params };
+
+$step = $step_name->new();
+ok(defined $step, "$step_name constructor returned defined value");
+isa_ok($step, $step_name);
+ok($step->description(), "$step_name has description");
+
+# need to capture the --verbose output, because the fact that it does not end
+# in a newline confuses Test::Harness
+{
+    my $tie_out = tie *STDOUT, "Parrot::IO::Capture::Mini"
+        or croak "Unable to tie";
+    $ret = $step->runstep($conf);
+    my @more_lines = $tie_out->READLINE;
+    ok(@more_lines, "prompts were captured");
+    ok(defined $ret, "$step_name runstep() returned defined value");
+}
+
+$object = undef;
+untie *STDIN;
+
+pass("Completed all tests in $0");
+
+################### DOCUMENTATION ###################
+
+=head1 NAME
+
+107-inter_progs.02.t - test config::inter::progs
+
+=head1 SYNOPSIS
+
+    % prove t/configure/107-inter_progs.02.t
+
+=head1 DESCRIPTION
+
+The files in this directory test functionality used by F<Configure.pl>.
+
+The tests in this file test subroutines exported by config::inter::progs.
+
+=head1 AUTHOR
+
+James E Keenan
+
+=head1 SEE ALSO
+
+config::inter::progs, 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/107-inter_progs.02.t
___________________________________________________________________
Name: svn:mime-type
   + text/plain
Name: svn:keywords
   + Author Date Id Revision
Name: svn:eol-style
   + native

Index: t/configure/testlib/Tie/Filehandle/Preempt/Stdin.pm
===================================================================
--- t/configure/testlib/Tie/Filehandle/Preempt/Stdin.pm (revision 0)
+++ t/configure/testlib/Tie/Filehandle/Preempt/Stdin.pm (revision 0)
@@ -0,0 +1,142 @@
+package Tie::Filehandle::Preempt::Stdin;
+$VERSION = "0.01";
+use strict;
+use Carp;
+
+sub TIEHANDLE {
+    my $class = shift;
+    my @lines = @_;
+    bless [EMAIL PROTECTED], $class;
+}
+
+sub READLINE {
+    my $self = shift;
+    if (@$self) {
+        shift @$self;
+    } else {
+        croak "List of prompt responses has been exhausted: $!";
+    }
+}
+
+1;
+
+##### DOCUMENTATION #####
+
+=head1 NAME
+
+Tie::Filehandle::Preempt::Stdin - Preempt STDIN during testing.
+
+=head1 SYNOPSIS
+
+    use Tie::Filehandle::Preempt::Stdin;
+    @prompts = qw| alpha beta gamma |;
+    $object = tie *STDIN, 'Tie::Filehandle::Preempt::Stdin', @prompts;
+
+=head1 DESCRIPTION
+
+Suppose a program requires manual input from the keyboard operator.
+How do we test that we have properly handled operator input?  More
+specifically, how do we incorporate testing for user input in files
+built on Perl's standard testing apparatus (C<Test::Simple>, 
+C<Test::More>, etc.)?
+
+Tie::Filehandle::Preempt::Stdin offers one way to do it -- a relatively 
+simple and unsophisticated todo it.  The most difficult part is
+analyzing the program to be tested so that you recognize all the points
+at which input is needed via STDIN.  This in turn requires an
+understanding of all the different branches your program flow can take
+in response to standard input.  Once you know that, you construct a list
+of dummy data that will be fed to each test at the points the program,
+when put into production, would normally prompt for operator input.
+This list of dummy data 'pre-empts' standard input via a tie of
+filehandle STDIN; hence, the module's name.
+
+=head1 USAGE
+
+    @prompts = qw| alpha beta gamma |;
+    $object = tie *STDIN, 'Tie::Filehandle::Preempt::Stdin', @prompts;
+
+    print "Enter item 1:  ";
+    chomp($entry = <STDIN>);
+    # 'alpha' is supplied in lieu of standard input;
+    # do something with $entry
+
+    print "Enter item 2:  ";
+    chomp($entry = <STDIN>);
+    # 'beta' is supplied in lieu of standard input;
+    # do something with $entry
+
+    print "Enter item 3:  ";
+    chomp($entry = <STDIN>);
+    # 'gamma' is supplied in lieu of standard input;
+    # do something with $entry
+
+Should the number of elements in C<@prompts> be less than the number of
+points at which a given test prompts for operator input, you will get an
+error message: 
+
+    "List of prompt responses has been exhausted"
+
+and the program will C<croak>.
+
+=head1 BUGS
+
+Tie::Filehandle::Preempt::Stdin does not work properly when the source 
+code being tested uses only the Perl diamond operator for standard input.
+
+    print "Enter room whose data you wish to enter:  ";
+    chomp ($try = <>);
+
+This doesn't work; your program will hang.  You have to hard-code 
+C<STDIN> instead.
+
+    chomp ($try = <STDIN>);
+
+I don't know why this happens.  If this bothers you, look at
+C<IO::Scalar> which is reported to handle the diamond operator properly,
+but which, IMHO, has a more complex interface.
+
+=head1 SUPPORT
+
+Contact author or post on [EMAIL PROTECTED]
+
+=head1 AUTHOR
+
+James E Keenan.  CPAN ID: JKEENAN.  Mail to:  jkeenan [at] cpan [dot] org.
+
+=head1 ACKNOWLEDGEMENTS
+
+The author benefitted from -- but did not always agree with -- comments
+from the following members of Perlmonks:  chromatic, Revelation,
+tmoertel, NiJo and dragonchild.
+
+Thanks to Michael G Schwern and Kevin Scaldeferri for answering
+questions on the perl.qa mailing list.
+
+=head1 COPYRIGHT
+
+Copyright 2005 James E Keenan.  
+This program is free software; you can redistribute
+it and/or modify it under the same terms as Perl itself.
+
+The full text of the license can be found in the
+LICENSE file included with this module.
+
+Last revision:  Apr 17 2005.
+
+=head1 SEE ALSO
+
+perltie(1).
+
+I<Programming Perl> (3rd ed.), Larry Wall, Tom Christiansen
+and Jon Orwant.  O'Reilly & Associates, 1991.  Chapter 14:  Tied
+Variables:  section on ''Tying Filehandles,'' p. 384 ff.
+
+Perlmonks discussion starting at:
+L<http://www.perlmonks.org/index.pl?node_id=430997>.
+
+Postings on perl.qa at:  
+L<http://www.nntp.perl.org/group/perl.qa/4074> and
+L<http://www.nntp.perl.org/group/perl.qa/4076>.
+
+=cut

Property changes on: t/configure/testlib/Tie/Filehandle/Preempt/Stdin.pm
___________________________________________________________________
Name: svn:keywords
   + Author Date Id Revision
Name: svn:eol-style
   + native

Reply via email to