| 
<?php
 function redunit_error_handler($errno,$errstr,$errfile,$errline) {
 $err = "REDUNITERROR: $errno,$errstr,$errfile,$errline";
 /* ignore certain errors like deprecated notices that have already been checked in main code */
 if (strpos($err,'PGSQL_ATTR_DISABLE_NATIVE_PREPARED_STATEMENT') !== FALSE) {
 return FALSE;
 }
 echo $err;
 throw new \Exception($err);
 return TRUE;
 }
 
 chdir( '..' );
 $xdebugSupported = (function_exists('xdebug_start_code_coverage'));
 
 if ($xdebugSupported) xdebug_start_code_coverage( XDEBUG_CC_UNUSED | XDEBUG_CC_DEAD_CODE );
 require 'testcontainer/rb.php';
 
 //load core classes
 require 'RedUNIT.php';
 error_reporting( E_ALL );
 
 //Load configuration file
 if ( file_exists( 'config/test.ini' ) ) {
 $ini = parse_ini_file( "config/test.ini", TRUE );
 $travis = FALSE;
 } elseif ( file_exists( 'config/test-travis.ini' ) ) {
 $ini = parse_ini_file( "config/test-travis.ini", TRUE );
 $travis = TRUE;
 } else {
 die( 'Cant find configuration file.' );
 }
 
 echo '*** RedUNIT ***'.PHP_EOL;
 echo 'Welcome to RedUNIT Unit testing framework for RedBeanPHP.'.PHP_EOL;
 echo PHP_EOL;
 
 echo sprintf('PHP version: %s', phpversion());
 echo PHP_EOL;
 
 /**
 * Define some globals.
 */
 global $pdo;
 global $currentDriver;
 
 //Load basic functions and classes
 require_once( 'helpers/functions.php' );
 require_once( 'helpers/classes.php' );
 
 //Load main classes
 require_once( 'RedUNIT/Base.php' );
 require_once( 'RedUNIT/Blackhole.php' );
 require_once( 'RedUNIT/Mysql.php' );
 require_once( 'RedUNIT/Postgres.php' );
 require_once( 'RedUNIT/Sqlite.php' );
 require_once( 'RedUNIT/CUBRID.php' );
 require_once( 'RedUNIT/Pretest.php' );
 
 $extraTestsFromHook = array();
 $hookPath = '';
 
 $colorMap = array(
 'mysql'  => '0;31',
 'pgsql'  => '0;32',
 'sqlite' => '0;34',
 'CUBRID' => '0;35',
 );
 
 @include 'cli/test_hook.php';
 
 //Configure the databases
 if ( isset( $ini['mysql'] ) ) {
 $dsn = "mysql:host={$ini['mysql']['host']};dbname={$ini['mysql']['schema']}";
 
 R::addDatabase( 'mysql', $dsn, $ini['mysql']['user'], $ini['mysql']['pass'], FALSE );
 R::addDatabase( 'mysqlc', $dsn, $ini['mysql']['user'], $ini['mysql']['pass'], FALSE );
 R::addDatabase( 'mysqlc2', $dsn, $ini['mysql']['user'], $ini['mysql']['pass'], FALSE );
 
 R::selectDatabase( 'mysql' );
 
 R::exec( ' SET GLOBAL sql_mode="" ' );
 }
 
 //HHVM on Travis does not yet support PostgreSQL.
 if ( defined( 'HHVM_VERSION' ) ) {
 unset( $ini['pgsql'] );
 } else {
 if ( isset( $ini['pgsql'] ) ) {
 $dsn = "pgsql:host={$ini['pgsql']['host']};dbname={$ini['pgsql']['schema']}";
 R::addDatabase( 'pgsql', $dsn, $ini['pgsql']['user'], $ini['pgsql']['pass'], FALSE );
 R::addDatabase( 'pgsqlc', $dsn, $ini['pgsql']['user'], $ini['pgsql']['pass'], FALSE );
 R::addDatabase( 'pgsqlc2', $dsn, $ini['pgsql']['user'], $ini['pgsql']['pass'], FALSE );
 }
 }
 
 if ( isset( $ini['sqlite'] ) ) {
 R::addDatabase( 'sqlite', 'sqlite:' . $ini['sqlite']['file'], NULL, NULL, FALSE );
 R::selectDatabase( 'sqlite' );
 }
 
 if ( isset( $ini['CUBRID'] ) ) {
 $dsn = "cubrid:host={$ini['CUBRID']['host']};port=33000;dbname={$ini['CUBRID']['schema']}";
 R::addDatabase( 'CUBRID', $dsn, $ini['CUBRID']['user'], $ini['CUBRID']['pass'], FALSE );
 R::selectDatabase( 'CUBRID' );
 R::exec( 'AUTOCOMMIT IS ON' );
 }
 
 // Function to activate a driver
 function activate_driver( $d )
 {
 R::selectDatabase( $d );
 }
 
 $arguments = $_SERVER['argc'];
 
 $mode = 'all';
 if ( $arguments > 1 ) {
 $mode = $_SERVER['argv'][1];
 }
 
 $classSpec = null;
 if ( $arguments > 2 ) {
 $classSpec = $_SERVER['argv'][2];
 }
 
 $covFilter = null;
 if ( $arguments > 3 ) {
 $covFilter = $_SERVER['argv'][3];
 }
 
 $path = 'RedUNIT/';
 
 // Possible Selections
 $packList = array();
 
 $allPacks = array(
 'Blackhole/Version',
 'Blackhole/Toolbox',
 'Blackhole/Fusebox',
 'Blackhole/Labels',
 'Blackhole/Tainted',
 'Blackhole/Meta',
 'Blackhole/Import',
 'Blackhole/Export',
 'Blackhole/Glue',
 'Blackhole/Plugins',
 'Blackhole/Debug',
 'Blackhole/Stub',
 'Base/Productivity',
 'Base/Quickexport',
 'Base/Hybrid',
 'Base/Concurrency',
 'Base/Dispense',
 'Base/Logging',
 'Base/Cursors',
 'Base/Indexes',
 'Base/Issue408',
 'Base/Threeway',
 'Base/Chill',
 'Base/Arrays',
 'Base/Boxing',
 'Base/Typechecking',
 'Base/Observers',
 'Base/Database',
 'Base/Exceptions',
 'Base/Foreignkeys',
 'Base/Namedparams',
 'Base/Prefixes',
 'Base/Copy',
 'Base/Dup',
 'Base/Update',
 'Base/Utf8',
 'Base/Batch',
 'Base/Bean',
 'Base/Writecache',
 'Base/Relations',
 'Base/Association',
 'Base/Aliasing',
 'Base/Cross',
 'Base/Finding',
 'Base/Partial',
 'Base/Facade',
 'Base/Frozen',
 'Base/Fuse',
 'Base/Tags',
 'Base/Xnull',
 'Base/Largenum',
 'Base/Issue90',
 'Base/Issue259',
 'Base/Issue303',
 'Base/Nuke',
 'Base/Keywords',
 'Base/Count',
 'Base/With',
 'Base/Joins',
 'Base/Traverse',
 'Base/Misc',
 'Base/Via',
 'Base/PullRequest530',
 'Base/Issue841',
 'Base/Either',
 'Mysql/Preexist',
 'Mysql/Double',
 'Mysql/Writer',
 'Mysql/Freeze',
 'Mysql/Setget',
 'Mysql/Foreignkeys',
 'Mysql/Parambind',
 'Mysql/Uuid',
 'Mysql/Bigint',
 'Mysql/Issue411',
 'Postgres/Setget',
 'Postgres/Foreignkeys',
 'Postgres/Parambind',
 'Postgres/Writer',
 'Postgres/Uuid',
 'Postgres/Bigint',
 'Postgres/Partial',
 'Postgres/Trees',
 'Sqlite/Setget',
 'Sqlite/Foreignkeys',
 'Sqlite/Parambind',
 'Sqlite/Writer',
 'Sqlite/Rebuild',
 'CUBRID/Writer',
 'CUBRID/Setget',
 );
 
 $suffix = array(
 'Blackhole/Misc',
 'Base/Close'
 );
 
 // Default (mode == all)
 if ( $mode == 'all' ) {
 $packList = $allPacks;
 } else {
 foreach ( $allPacks as $pack ) {
 if ( strpos( $pack, $mode ) === 0 ) $packList[] = $pack;
 }
 //Add plugin pack to list.
 if ( count($packList) === 0 && count($extraTestsFromHook) === 0 ) {
 $packList[] = $mode;
 }
 }
 
 // Always include the last ones.
 $packList = array_unique(array_merge( $packList, $suffix, $extraTestsFromHook ));
 $j = 0;
 foreach ( $packList as $testPack ) {
 $j++;
 if ( file_exists( $path . $testPack . '.php' ) ) require( $path . $testPack . '.php' );
 elseif ( file_exists( $hookPath . $testPack . '.php') ) require( $hookPath . $testPack . '.php' );
 $testPack = str_replace( '../', '', $testPack );
 if ($j === 1 && $classSpec) {
 $testClass = $classSpec;
 } else {
 $testClassName = str_replace( ' ', '\\', ( str_replace( '/', ' ', $testPack ) ) );
 $testClass     = '\\RedUNIT\\' . ucfirst( $testClassName );
 }
 $test          = new $testClass();
 $drivers       = $test->getTargetDrivers();
 maintestpack( str_replace( '_', ' ', get_class( $test ) ) );
 $round = 0;
 $test->setRound( $round );
 if ( $drivers && is_array( $drivers ) ) {
 foreach ( $drivers as $driver ) {
 if ( !isset( $ini[$driver] ) ) continue;
 echo PHP_EOL;
 echo '===== DRIVER : (' . $driver . ') =====';
 echo PHP_EOL;
 echo PHP_EOL;
 if ( isset( $colorMap[$driver] ) ) {
 echo "\033[{$colorMap[$driver]}m";
 }
 activate_driver( $driver );
 $currentDriver = $driver;
 $test->setCurrentDriver( $driver );
 $test->prepare();
 $test->run();
 $test->cleanUp();
 if ( isset ( $colorMap[$driver] ) ) {
 echo "\033[0m";
 }
 echo PHP_EOL;
 $test->setRound( ++$round );
 }
 } else {
 $test->prepare();
 $test->run();
 $test->cleanUp();
 }
 }
 
 if (!$xdebugSupported) {
 echo 'Done. No report - XDEBUG not installed.';
 exit(0);
 }
 
 $report = xdebug_get_code_coverage();
 $misses = 0;
 $hits = 0;
 
 $covLines = array();
 foreach( $report as $file => $lines ) {
 
 $pi = pathinfo( $file );
 
 if ( $covFilter !== null ) {
 if ( strpos( $file, $covFilter ) === FALSE ) continue;
 } else {
 if ( strpos( $file, '/rb.php' ) === FALSE ) {
 if ( strpos( $file, 'phar/' ) === FALSE ) continue;
 if ( strpos( $file, '.php' ) === FALSE ) continue;
 if ( strpos( $file, 'RedBeanPHP' ) === FALSE ) continue;
 }
 }
 $covLines[] = '***** File:'.$file.' ******';
 $fileData = file_get_contents( $file );
 $fileLines = explode( "\n", $fileData );
 $i = 1;
 foreach( $fileLines as $covLine ) {
 if ( isset( $lines [$i] ) ) {
 if ( $lines[$i] === 1 ) {
 $covLines[] = '[ OK      ] '.$covLine;
 $hits ++;
 } else if ( $lines[$i] === -1 ){
 $covLines[] = '[ MISSED! ] '.$covLine;
 $misses ++;
 } else {
 $covLines[] = '[ -       ] '.$covLine;
 }
 } else {
 $covLines[] = '[ -       ] '.$covLine;
 }
 $i ++;
 }
 }
 $covFile = implode( "\n", $covLines );
 @file_put_contents( 'cli/coverage_log.txt', $covFile );
 if ( $hits > 0 ) {
 $perc = ( $hits / ( $hits + $misses ) ) * 100;
 } else {
 $perc = 0;
 }
 echo 'Code Coverage: '.PHP_EOL;
 echo 'Hits: '.$hits.PHP_EOL;
 echo 'Misses: '.$misses.PHP_EOL;
 echo 'Percentage: '.$perc.' %'.PHP_EOL;
 exit( 0 );
 
 |