package Test::Assertions::TestScript; use strict; use Getopt::Long qw(:config pass_through bundling); use Log::Trace; use Test::Assertions qw( test );; use File::Basename; use vars qw( $VERSION $SAVE_OUTPUT $TRACE $TRACE_DEEP @TRACE_MODULE ); $VERSION = sprintf"%d.%03d", q$Revision: 1.18 $ =~ /: (\d+)\.(\d+)/; sub import { my $package = shift; my %options = @_; if ($0) { my $t_directory = dirname ( $0 ); chdir ( $t_directory ) or die "Could not chdir to unit test directory '$t_directory'\n"; } else { # this should never happen die "Could not find script location\n"; } unshift @INC, "./lib", "../lib"; my $additional_options = $options{options} || {}; GetOptions( 't' => \$TRACE, 'T' => \$TRACE_DEEP, 's' => \$SAVE_OUTPUT, 'trace-module=s@' => \@TRACE_MODULE, %$additional_options ); plan tests => $options{tests}; { package main; # Cheating to import into the right place import Test::Assertions qw( test ); } } INIT { package main; # Cheating to import into the right place import Log::Trace unless ($Test::Assertions::TestScript::TRACE || $Test::Assertions::TestScript::TRACE_DEEP); # still import the stubs import Log::Trace 'print' => { Deep => 0 } if $Test::Assertions::TestScript::TRACE; import Log::Trace 'print' => { Deep => 1 } if $Test::Assertions::TestScript::TRACE_DEEP; foreach (@Test::Assertions::TestScript::TRACE_MODULE) { eval "require $_"; import Log::Trace print => {Match => $_, Deep => 1}; } } 1; =head1 NAME Test::Assertions::TestScript - Base for test scripts =head1 SYNOPSIS use Test::Assertions::TestScript; use Module::To::Test qw( frobnicate ); ASSERT(frobnicate(),"Frobnicate returns true"); =head1 DESCRIPTION Test::Assertions::TestScript provides a base for writing test scripts. It performs some common actions such as setting up the @INC path and parsing command-line options, specifically: =over =item * The lib and t/lib directories are added to @INC. =item * The current directory is changed to the directory the script is in. =item * Test script command-line options are parsed. (See L) =item * The test set of functions from Test::Assertions are imported into your test script. =back Test::Assertions::TestScript makes certain assumptions about the filesystem layout of your project: =over 4 =item * Modules that you are testing are in the lib directory of your project. =item * Test scripts are in the t directory. =item * There may also be a t/lib directory for any modules written for the test process. =back Test::Assertions::TestScript should be Cd B any modules that you intend to test. =head1 OPTIONS Options can be supplied to the import function. These should be placed after the C or C. For example use Test::Assertions::TestScript( tests => 10, options => { 'b', \$opt_b }) The following options are defined: =over =item tests The number of tests to pass to C from Test::Assertions. For example to tell Test::Assertions::TestScript that the script contains 42 tests: use Test::Assertions::TestScript tests => 42; =item options A hashref of additional options to capture via Getopt::Long. The "options" import parameter is passed verbatim to GetOptions, so something along the following lines is required in order to capture the "-b" command line option: use Test::Assertions::TestScript( options => { 'b' => \$opt_b } ); =back =head1 COMMAND-LINE OPTIONS A script based on Test::Assertions::TestScript will detect the following command line options. =over =item -t Shallow tracing. Traces are Ced and AutoImport is turned on. =item -T Deep tracing. Traces are Ced and AutoImport is turned on. =item --trace-module=MODULE Imports tracing into MODULE specifically. Can be specified multiple times. =item -s Save generated output. You will need to write the actual code to do this in your testscript, but you can inspect $Test::Assertions::TestScript::SAVE_OUTPUT to see whether this argument was given. =back Be aware that all other command line options will be disregarded unless the C import parameter is used to capture them. =head1 VERSION $Revision: 1.18 $ =head1 AUTHOR Colin Robertson =head1 COPYRIGHT (c) BBC 2005-6. This program is free software; you can redistribute it and/or modify it under the GNU GPL. See the file COPYING in this distribution, or http://www.gnu.org/licenses/gpl.txt =cut