- Added a test framework to Drupal along with a first batch of tests for
Drupal core! This is an important milestone for the project so enable
the module and check it out ... :)
Thanks to Rok Žlender, Károly Négyesi, Jimmy Berry, Kevin Bridges, Charlie
Gordon, Douglas Hubler, Miglius Alaburda, Andy Kirkham, Dimitri13, Kieran
Lal, Moshe Weitzman, and the many other people that helped with testing
over the past years and that drove this home.
It all works but it is still rough around the edges (i.e. documentation
is still being written, the coding style is not 100% yet, a number of
tests still fail) but we spent the entire weekend working on it in Paris
and made a ton of progress. The best way to help and to get up to speed,
is to start writing and contributing some tests ... as well as fixing
some of the failures.
For those willing to help with improving the test framework, here are
some next steps and issues to resolve:
- How to best approach unit tests and mock functions?
- How to test drupal_mail() and drupal_http_request()?
- How to improve the admin UI so we have a nice progress bar?
- How best to do code coverage?
- See http://g.d.o/node/10099 for more ...
2008-04-20 18:24:07 +00:00
<?php
// $Id $
/**
* @file
2008-05-26 19:43:46 +00:00
* This script runs Drupal tests from command line.
- Added a test framework to Drupal along with a first batch of tests for
Drupal core! This is an important milestone for the project so enable
the module and check it out ... :)
Thanks to Rok Žlender, Károly Négyesi, Jimmy Berry, Kevin Bridges, Charlie
Gordon, Douglas Hubler, Miglius Alaburda, Andy Kirkham, Dimitri13, Kieran
Lal, Moshe Weitzman, and the many other people that helped with testing
over the past years and that drove this home.
It all works but it is still rough around the edges (i.e. documentation
is still being written, the coding style is not 100% yet, a number of
tests still fail) but we spent the entire weekend working on it in Paris
and made a ton of progress. The best way to help and to get up to speed,
is to start writing and contributing some tests ... as well as fixing
some of the failures.
For those willing to help with improving the test framework, here are
some next steps and issues to resolve:
- How to best approach unit tests and mock functions?
- How to test drupal_mail() and drupal_http_request()?
- How to improve the admin UI so we have a nice progress bar?
- How best to do code coverage?
- See http://g.d.o/node/10099 for more ...
2008-04-20 18:24:07 +00:00
*/
2008-07-07 06:22:18 +00:00
define( 'SIMPLETEST_SCRIPT_COLOR_PASS' , 32) ; // Green.
define( 'SIMPLETEST_SCRIPT_COLOR_FAIL' , 31) ; // Red.
define( 'SIMPLETEST_SCRIPT_COLOR_EXCEPTION' , 33) ; // Brown.
// Set defaults and get overrides.
list( $args , $count ) = simpletest_script_parse_args( ) ;
simpletest_script_init( ) ;
if ( $args [ 'help' ] || $count = = 0) {
simpletest_script_help( ) ;
exit;
}
if ( $args [ 'execute-batch' ] ) {
simpletest_script_execute_batch( ) ;
}
// Bootstrap to perform initial validation or other opperations.
drupal_bootstrap( DRUPAL_BOOTSTRAP_FULL) ;
if ( !module_exists( 'simpletest' ) ) {
simpletest_script_print_error( "The simpletest module must be enabled before this script can run." ) ;
exit;
}
if ( $args [ 'clean' ] ) {
// Clean up left-over times and directories.
simpletest_clean_environment( ) ;
echo "\nEnvironment cleaned.\n" ;
// Get the status messages and print them.
$messages = array_pop( drupal_get_messages( 'status' ) ) ;
foreach( $messages as $text ) {
echo " - " . $text . "\n" ;
}
exit;
}
// Load SimpleTest files.
$all_tests = simpletest_get_all_tests( ) ;
$groups = simpletest_categorize_tests( $all_tests ) ;
$test_list = array( ) ;
if ( $args [ 'list' ] ) {
// Display all availabe tests.
echo "\nAvailable test groups & classes\n" ;
echo "-------------------------------\n\n" ;
foreach ( $groups as $group = > $tests ) {
echo $group . "\n" ;
foreach ( $tests as $class_name = > $instance ) {
$info = $instance ->getInfo( ) ;
echo " - " . $info [ 'name' ] . ' (' . $class_name . ')' . "\n" ;
}
}
exit;
}
$test_list = simpletest_script_get_test_list( ) ;
// If not in 'safe mode' , increase the maximum execution time.
if ( !ini_get( 'safe_mode' ) ) {
set_time_limit( 0) ;
}
simpletest_script_reporter_init( ) ;
// Setup database for test results.
db_query( 'INSERT INTO {simpletest_test_id} VALUES (default)' ) ;
$test_id = db_last_insert_id( 'simpletest_test_id' , 'test_id' ) ;
// Execute tests.
simpletest_script_command( $args [ 'concurrency' ] , $test_id , implode( "," , $test_list ) ) ;
// Display results before database is cleared.
simpletest_script_reporter_display_results( ) ;
// Cleanup our test results.
db_query( "DELETE FROM {simpletest} WHERE test_id = %d" , $test_id ) ;
/**
* Print help text.
*/
function simpletest_script_help( ) {
global $args ;
2008-05-26 19:43:46 +00:00
echo <<< EOF
Run Drupal tests from the shell.
2008-07-07 06:22:18 +00:00
Usage: { $args [ 'script' ] } [ OPTIONS] <tests>
Example: { $args [ 'script' ] } Profile
2008-05-26 19:43:46 +00:00
All arguments are long options.
--help Print this page.
2008-05-28 12:35:32 +00:00
--list Display all available test groups.
2008-05-26 19:43:46 +00:00
--clean Cleans up database tables or directories from previous, failed,
tests and then exits ( no tests are run) .
2008-05-28 12:35:32 +00:00
--url Immediately preceeds a URL to set the host and path. You will
need this parameter if Drupal is in a subdirectory on your
2008-05-26 19:43:46 +00:00
localhost and you have not set \$ base_url in settings.php.
2008-06-29 12:22:28 +00:00
--concurrency [ num]
2008-08-18 18:52:31 +00:00
Run tests in parallel, up to [ num] tests at a time. This requires
the Process Control Extension ( PCNTL) to be compiled in PHP, not
supported under Windows.
2008-06-24 21:59:20 +00:00
2008-05-28 12:35:32 +00:00
--all Run all available tests.
2008-05-26 19:43:46 +00:00
2008-06-29 12:22:28 +00:00
--class Run tests identified by specific class names, instead of group names.
2008-08-18 18:52:31 +00:00
--file Run tests identifiled by specific file names, instead of group names.
Specify the path and the extension ( i.e. 'modules/user/user.test' ) .
2008-05-26 19:43:46 +00:00
2008-07-07 06:22:18 +00:00
--color Output the rusults with color highlighting.
--verbose Output detailed assertion messages in addition to summary.
2008-05-26 19:43:46 +00:00
<test1>[ ,<test2>[ ,<test3> ...] ]
One or more tests to be run. By default, these are interpreted
as the names of test groups as shown at ?q= admin/build/testing.
These group names typically correspond to module names like "User"
or "Profile" or "System" , but there is also a group "XML-RPC" .
If --class is specified then these are interpreted as the names of
specific test classes whose test methods will be run. Tests must
be separated by commas. Ignored if --all is specified.
2008-05-28 12:35:32 +00:00
To run this script you will normally invoke it from the root directory of your
2008-07-07 06:22:18 +00:00
Drupal installation as the webserver user, or root, with
2008-05-26 19:43:46 +00:00
2008-07-07 06:22:18 +00:00
php ./scripts/{ $args [ 'script' ] }
2008-05-26 19:43:46 +00:00
\n
EOF;
}
2008-07-07 06:22:18 +00:00
/**
* Parse execution argument and ensure that all are valid.
*
* @return The list of arguments.
*/
function simpletest_script_parse_args( ) {
// Set default values.
$args = array(
'script' = > '' ,
'help' = > FALSE,
'list' = > FALSE,
'clean' = > FALSE,
'url' = > '' ,
'concurrency' = > 1,
'all' = > FALSE,
'class' = > FALSE,
2008-08-18 18:52:31 +00:00
'file' = > FALSE,
2008-07-07 06:22:18 +00:00
'color' = > FALSE,
'verbose' = > FALSE,
'test_names' = > array( ) ,
// Used internally.
'test-id' = > NULL,
'execute-batch' = > FALSE
) ;
// Override with set values.
$args [ 'script' ] = basename( array_shift( $_SERVER [ 'argv' ] ) ) ;
$count = 0;
while ( $arg = array_shift( $_SERVER [ 'argv' ] ) ) {
if ( preg_match( '/--(\S+)/' , $arg , $matches ) ) {
// Argument found.
if ( array_key_exists( $matches [ 1] , $args ) ) {
// Argument found in list.
$previous_arg = $matches [ 1] ;
if ( is_bool( $args [ $previous_arg ] ) ) {
$args [ $matches [ 1] ] = TRUE;
}
else {
$args [ $matches [ 1] ] = array_shift( $_SERVER [ 'argv' ] ) ;
}
// Clear an extrenious values.
$args [ 'test_names' ] = array( ) ;
$count ++;
}
else {
// Argument not found in list.
simpletest_script_print_error( " Unknown argument ' $arg '. " ) ;
exit;
}
}
else {
// Values found without an argument should be test names.
$args [ 'test_names' ] += explode( ',' , $arg ) ;
}
- Added a test framework to Drupal along with a first batch of tests for
Drupal core! This is an important milestone for the project so enable
the module and check it out ... :)
Thanks to Rok Žlender, Károly Négyesi, Jimmy Berry, Kevin Bridges, Charlie
Gordon, Douglas Hubler, Miglius Alaburda, Andy Kirkham, Dimitri13, Kieran
Lal, Moshe Weitzman, and the many other people that helped with testing
over the past years and that drove this home.
It all works but it is still rough around the edges (i.e. documentation
is still being written, the coding style is not 100% yet, a number of
tests still fail) but we spent the entire weekend working on it in Paris
and made a ton of progress. The best way to help and to get up to speed,
is to start writing and contributing some tests ... as well as fixing
some of the failures.
For those willing to help with improving the test framework, here are
some next steps and issues to resolve:
- How to best approach unit tests and mock functions?
- How to test drupal_mail() and drupal_http_request()?
- How to improve the admin UI so we have a nice progress bar?
- How best to do code coverage?
- See http://g.d.o/node/10099 for more ...
2008-04-20 18:24:07 +00:00
}
2008-07-24 06:46:28 +00:00
// Validate the concurrency argument
if ( !is_numeric( $args [ 'concurrency' ] ) || $args [ 'concurrency' ] <= 0) {
simpletest_script_print_error( "--concurrency must be a strictly positive integer." ) ;
exit;
}
else if ( $args [ 'concurrency' ] > 1 && !function_exists( 'pcntl_fork' ) ) {
simpletest_script_print_error( "Parallel test execution requires the Process Control extension to be compiled in PHP. Please see http://php.net/manual/en/intro.pcntl.php for more information." ) ;
exit;
}
2008-07-07 06:22:18 +00:00
return array( $args , $count ) ;
- Added a test framework to Drupal along with a first batch of tests for
Drupal core! This is an important milestone for the project so enable
the module and check it out ... :)
Thanks to Rok Žlender, Károly Négyesi, Jimmy Berry, Kevin Bridges, Charlie
Gordon, Douglas Hubler, Miglius Alaburda, Andy Kirkham, Dimitri13, Kieran
Lal, Moshe Weitzman, and the many other people that helped with testing
over the past years and that drove this home.
It all works but it is still rough around the edges (i.e. documentation
is still being written, the coding style is not 100% yet, a number of
tests still fail) but we spent the entire weekend working on it in Paris
and made a ton of progress. The best way to help and to get up to speed,
is to start writing and contributing some tests ... as well as fixing
some of the failures.
For those willing to help with improving the test framework, here are
some next steps and issues to resolve:
- How to best approach unit tests and mock functions?
- How to test drupal_mail() and drupal_http_request()?
- How to improve the admin UI so we have a nice progress bar?
- How best to do code coverage?
- See http://g.d.o/node/10099 for more ...
2008-04-20 18:24:07 +00:00
}
2008-07-07 06:22:18 +00:00
/**
* Initialize script variables and perform general setup requirements.
*/
function simpletest_script_init( ) {
global $args , $php ;
$host = 'localhost' ;
$path = '' ;
$php = "/usr/bin/php" ; // TODO Get dynamically if possible.
// Get url from arguments.
if ( !empty( $args [ 'url' ] ) ) {
$parsed_url = parse_url( $args [ 'url' ] ) ;
$host = $parsed_url [ 'host' ] ;
$path = $parsed_url [ 'path' ] ;
}
$_SERVER [ 'HTTP_HOST' ] = $host ;
$_SERVER [ 'REMOTE_ADDR' ] = '127.0.0.1' ;
$_SERVER [ 'SERVER_ADDR' ] = '127.0.0.1' ;
$_SERVER [ 'SERVER_SOFTWARE' ] = 'Apache' ;
$_SERVER [ 'SERVER_NAME' ] = 'localhost' ;
$_SERVER [ 'REQUEST_URI' ] = $path .'/' ;
$_SERVER [ 'SCRIPT_NAME' ] = $path .'/index.php' ;
$_SERVER [ 'PHP_SELF' ] = $path .'/index.php' ;
$_SERVER [ 'HTTP_USER_AGENT' ] = 'Drupal command line' ;
chdir( realpath( dirname( __FILE__) . '/..' ) ) ;
require_once './includes/bootstrap.inc' ;
}
/**
* Execute a batch of tests.
*/
function simpletest_script_execute_batch( ) {
global $args ;
if ( is_null( $args [ 'test-id' ] ) ) {
simpletest_script_print_error( "--execute-batch should not be called interactively." ) ;
2008-06-29 12:22:28 +00:00
exit;
}
2008-07-24 06:46:28 +00:00
if ( $args [ 'concurrency' ] = = 1) {
2008-07-07 06:22:18 +00:00
// Fallback to mono-threaded execution.
if ( count( $args [ 'test_names' ] ) > 1) {
foreach ( $args [ 'test_names' ] as $test_class ) {
// Execute each test in its separate Drupal environment.
simpletest_script_command( 1, $args [ 'test-id' ] , $test_class ) ;
2008-06-29 12:22:28 +00:00
}
exit;
}
else {
2008-07-07 06:22:18 +00:00
// Execute an individual test.
$test_class = array_shift( $args [ 'test_names' ] ) ;
2008-06-29 12:22:28 +00:00
drupal_bootstrap( DRUPAL_BOOTSTRAP_FULL) ;
2008-07-07 06:22:18 +00:00
simpletest_script_run_one_test( $args [ 'test-id' ] , $test_class ) ;
2008-06-29 12:22:28 +00:00
exit;
}
}
else {
2008-07-07 06:22:18 +00:00
// Multi-threaded execution.
2008-06-29 12:22:28 +00:00
$children = array( ) ;
2008-07-07 06:22:18 +00:00
while ( !empty( $args [ 'test_names' ] ) || !empty( $children ) ) {
// Fork children safely since Drupal is not bootstrapped yet.
2008-07-24 06:46:28 +00:00
while ( count( $children ) < $args [ 'concurrency' ] ) {
2008-07-07 06:22:18 +00:00
if ( empty( $args [ 'test_names' ] ) ) break;
2008-06-29 12:22:28 +00:00
$child = array( ) ;
2008-07-07 06:22:18 +00:00
$child [ 'test_class' ] = $test_class = array_shift( $args [ 'test_names' ] ) ;
2008-06-29 12:22:28 +00:00
$child [ 'pid' ] = pcntl_fork( ) ;
if ( !$child [ 'pid' ] ) {
2008-07-07 06:22:18 +00:00
// This is the child process, bootstrap and execute the test.
2008-06-29 12:22:28 +00:00
drupal_bootstrap( DRUPAL_BOOTSTRAP_FULL) ;
2008-07-24 06:46:28 +00:00
simpletest_script_run_one_test( $args [ 'test-id' ] , $test_class ) ;
2008-06-29 12:22:28 +00:00
exit;
}
else {
2008-07-07 06:22:18 +00:00
// Register our new child.
2008-06-29 12:22:28 +00:00
$children [ ] = $child ;
}
}
2008-07-07 06:22:18 +00:00
// Wait for children every 200ms.
2008-06-29 12:22:28 +00:00
usleep( 200000) ;
2008-07-07 06:22:18 +00:00
// Check if some children finished.
foreach ( $children as $cid = > $child ) {
2008-06-29 12:22:28 +00:00
if ( pcntl_waitpid( $child [ 'pid' ] , $status , WUNTRACED | WNOHANG) ) {
2008-07-07 06:22:18 +00:00
// This particular child exited.
2008-06-29 12:22:28 +00:00
unset( $children [ $cid ] ) ;
}
}
}
exit;
}
}
2008-07-07 06:22:18 +00:00
/**
* Run a single test ( assume a Drupal bootstrapped environnement) .
*/
function simpletest_script_run_one_test( $test_id , $test_class ) {
simpletest_get_all_tests( ) ;
$test = new $test_class ( $test_id ) ;
$test ->run( ) ;
$info = $test ->getInfo( ) ;
2008-05-26 19:43:46 +00:00
2008-07-07 06:22:18 +00:00
$status = ( ( isset( $test ->_results[ '#fail' ] ) && $test ->_results[ '#fail' ] > 0)
|| ( isset( $test ->_results[ '#exception' ] ) && $test ->_results[ '#exception' ] > 0) ? 'fail' : 'pass' ) ;
simpletest_script_print( $info [ 'name' ] . ' ' . _simpletest_format_summary_line( $test ->_results) . "\n" , simpletest_script_color_code( $status ) ) ;
2008-05-26 19:43:46 +00:00
}
2008-07-07 06:22:18 +00:00
/**
* Execute a command to run batch of tests in separate process.
*/
function simpletest_script_command( $concurrency , $test_id , $tests ) {
global $args , $php ;
2008-06-24 21:59:20 +00:00
2008-07-07 06:22:18 +00:00
$command = " $php ./scripts/{ $args ['script']} --url { $args ['url']} " ;
if ( $args [ 'color' ] ) {
$command .= ' --color' ;
2008-05-26 19:43:46 +00:00
}
2008-07-07 06:22:18 +00:00
$command .= " --concurrency $concurrency --test-id $test_id --execute-batch $tests " ;
passthru( $command ) ;
2008-06-24 21:59:20 +00:00
}
2008-07-07 06:22:18 +00:00
/**
* Get list of tests based on arguments. If --all specfied then
* returns all available tests, otherwise reads list of tests.
*
* Will print error and exit if no valid tests were found.
*
* @return List of tests.
*/
function simpletest_script_get_test_list( ) {
global $args , $all_tests , $groups ;
$test_list = array( ) ;
if ( $args [ 'all' ] ) {
$test_list = array_keys( $all_tests ) ;
2008-06-24 21:59:20 +00:00
}
else {
2008-08-18 18:52:31 +00:00
if ( $args [ 'class' ] ) {
2008-07-07 06:22:18 +00:00
// Check for valid class names.
foreach ( $args [ 'test_names' ] as $class_name ) {
if ( isset( $all_tests [ $class_name ] ) ) {
2008-06-29 12:22:28 +00:00
$test_list [ ] = $class_name ;
}
}
}
2008-08-18 18:52:31 +00:00
else if ( $args [ 'file' ] ) {
$files = array( ) ;
foreach ( $args [ 'test_names' ] as $file ) {
$files [ realpath( $file ) ] = 1;
}
// Check for valid class names.
foreach ( $all_tests as $class_name = > $instance ) {
$refclass = new ReflectionClass( $class_name ) ;
$file = $refclass ->getFileName( ) ;
if ( isset( $files [ $file ] ) ) {
$test_list [ ] = $class_name ;
}
}
}
2008-07-07 06:22:18 +00:00
else {
// Check for valid group names and get all valid classes in group.
foreach ( $args [ 'test_names' ] as $group_name ) {
if ( isset( $groups [ $group_name ] ) ) {
foreach( $groups [ $group_name ] as $class_name = > $instance ) {
$test_list [ ] = $class_name ;
}
}
}
}
2008-05-26 19:43:46 +00:00
}
2008-06-29 12:22:28 +00:00
2008-07-07 06:22:18 +00:00
if ( empty( $test_list ) ) {
simpletest_script_print_error( 'No valid tests were specified.' ) ;
exit;
}
return $test_list ;
2008-05-26 19:43:46 +00:00
}
2008-07-07 06:22:18 +00:00
/**
* Initialize the reporter.
*/
function simpletest_script_reporter_init( ) {
global $args , $all_tests , $test_list ;
- Added a test framework to Drupal along with a first batch of tests for
Drupal core! This is an important milestone for the project so enable
the module and check it out ... :)
Thanks to Rok Žlender, Károly Négyesi, Jimmy Berry, Kevin Bridges, Charlie
Gordon, Douglas Hubler, Miglius Alaburda, Andy Kirkham, Dimitri13, Kieran
Lal, Moshe Weitzman, and the many other people that helped with testing
over the past years and that drove this home.
It all works but it is still rough around the edges (i.e. documentation
is still being written, the coding style is not 100% yet, a number of
tests still fail) but we spent the entire weekend working on it in Paris
and made a ton of progress. The best way to help and to get up to speed,
is to start writing and contributing some tests ... as well as fixing
some of the failures.
For those willing to help with improving the test framework, here are
some next steps and issues to resolve:
- How to best approach unit tests and mock functions?
- How to test drupal_mail() and drupal_http_request()?
- How to improve the admin UI so we have a nice progress bar?
- How best to do code coverage?
- See http://g.d.o/node/10099 for more ...
2008-04-20 18:24:07 +00:00
2008-07-07 06:22:18 +00:00
echo "\n" ;
echo "Drupal test run\n" ;
echo "---------------\n" ;
echo "\n" ;
2008-06-29 12:22:28 +00:00
2008-07-07 06:22:18 +00:00
// Tell the user about what tests are to be run.
if ( $args [ 'all' ] ) {
echo "All tests will run.\n\n" ;
}
else {
echo "Tests to be run:\n" ;
foreach ( $test_list as $class_name ) {
$info = $all_tests [ $class_name ] ->getInfo( ) ;
echo " - " . $info [ 'name' ] . ' (' . $class_name . ')' . "\n" ;
}
echo "\n" ;
2008-05-26 19:43:46 +00:00
}
2008-07-07 06:22:18 +00:00
echo "Test run started: " . format_date( time( ) , 'long' ) . "\n" ;
echo "\n" ;
echo "Test summary:\n" ;
echo "-------------\n" ;
2008-06-29 12:22:28 +00:00
echo "\n" ;
2008-05-26 19:43:46 +00:00
}
2008-07-07 06:22:18 +00:00
/**
* Display test results.
*/
function simpletest_script_reporter_display_results( ) {
global $args , $test_id , $results_map ;
2008-06-29 12:22:28 +00:00
2008-07-07 06:22:18 +00:00
echo "\n" ;
echo "Test run ended: " . format_date( time( ) , 'long' ) . "\n" ;
echo "\n" ;
2008-06-29 12:22:28 +00:00
2008-07-07 06:22:18 +00:00
if ( $args [ 'verbose' ] ) {
// Report results.
echo "Detailed test results:\n" ;
echo "----------------------\n" ;
echo "\n" ;
$results_map = array(
'pass' = > 'Pass' ,
'fail' = > 'Fail' ,
'exception' = > 'Exception'
2008-06-29 12:22:28 +00:00
) ;
2008-07-07 06:22:18 +00:00
$results = db_query( "SELECT * FROM {simpletest} WHERE test_id = %d ORDER BY test_class, message_id" , $test_id ) ;
$test_class = '' ;
while ( $result = db_fetch_object( $results ) ) {
if ( isset( $results_map [ $result ->status] ) ) {
if ( $result ->test_class != $test_class ) {
// Display test class every time results are for new test class.
echo " \n\n---- $result ->test_class ----\n\n\n " ;
$test_class = $result ->test_class;
}
simpletest_script_format_result( $result ) ;
}
}
2008-05-26 19:43:46 +00:00
}
}
2008-07-07 06:22:18 +00:00
/**
* Format the result so that it fits within the default 80 character
* terminal size.
*
* @param $result The result object to format.
*/
function simpletest_script_format_result( $result ) {
global $results_map , $color ;
$summary = sprintf( "%-10.10s %-10.10s %-30.30s %-5.5s %-20.20s\n" ,
$results_map [ $result ->status] , $result ->message_group, basename( $result ->file) , $result ->line, $result ->caller) ;
simpletest_script_print( $summary , simpletest_script_color_code( $result ->status) ) ;
2008-06-29 12:22:28 +00:00
2008-07-07 06:22:18 +00:00
$lines = explode( "\n" , wordwrap( trim( strip_tags( $result ->message) ) , 76) ) ;
foreach ( $lines as $line ) {
echo " $line \n " ;
}
}
2008-06-29 12:22:28 +00:00
2008-06-24 21:59:20 +00:00
/**
2008-07-07 06:22:18 +00:00
* Print error message prefixed with " ERROR: " and displayed in fail color
* if color output is enabled.
*
* @param $message The message to print.
2008-06-24 21:59:20 +00:00
*/
2008-07-07 06:22:18 +00:00
function simpletest_script_print_error( $message ) {
simpletest_script_print( " ERROR: $message \n " , SIMPLETEST_SCRIPT_COLOR_FAIL) ;
2008-06-24 21:59:20 +00:00
}
2008-06-24 21:51:03 +00:00
2008-07-07 06:22:18 +00:00
/**
* Print a message to the console, if color is enabled then the specified
* color code will be used.
*
* @param $message The message to print.
* @param $color_code The color code to use for coloring.
*/
function simpletest_script_print( $message , $color_code ) {
global $args ;
if ( $args [ 'color' ] ) {
echo "\033[" . $color_code . "m" . $message . "\033[0m" ;
}
else {
echo $message ;
}
}
/**
* Get the color code associated with the specified status.
*
* @param $status The status string to get code for .
* @return Color code.
*/
function simpletest_script_color_code( $status ) {
switch ( $status ) {
case 'pass' :
return SIMPLETEST_SCRIPT_COLOR_PASS;
case 'fail' :
return SIMPLETEST_SCRIPT_COLOR_FAIL;
case 'exception' :
return SIMPLETEST_SCRIPT_COLOR_EXCEPTION;
}
return 0; // Default formatting.
}