#!/bin/env php PHK Manager - File: /src/PHK/UnitTest/PHPUnit.php
Package Home

PHK Manager

PHK Home

File: /src/PHK/UnitTest/PHPUnit.php

Size:14237
Storage flags:

<?php
//=============================================================================
//
// Copyright Francois Laupretre <phk@tekwire.net>
//
//   Licensed under the Apache License, Version 2.0 (the "License");
//   you may not use this file except in compliance with the License.
//   You may obtain a copy of the License at
//
//       http://www.apache.org/licenses/LICENSE-2.0
//
//   Unless required by applicable law or agreed to in writing, software
//   distributed under the License is distributed on an "AS IS" BASIS,
//   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//   See the License for the specific language governing permissions and
//   limitations under the License.
//
//=============================================================================
// Please note that most of this file is derived from the code published by
// the PHPUnit project (v 3.2.2).
// As such, please consider the following notice:
/*
 * PHPUnit
 *
 * Copyright (c) 2002-2007, Sebastian Bergmann <sb@sebastian-bergmann.de>.
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 *   * Redistributions of source code must retain the above copyright
 *     notice, this list of conditions and the following disclaimer.
 *
 *   * Redistributions in binary form must reproduce the above copyright
 *     notice, this list of conditions and the following disclaimer in
 *     the documentation and/or other materials provided with the
 *     distribution.
 *
 *   * Neither the name of Sebastian Bergmann nor the names of his
 *     contributors may be used to endorse or promote products derived
 *     from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
*/
//=============================================================================
/**
* @copyright Francois Laupretre <phk@tekwire.net>
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, V 2.0
* @category PHK
* @package PHK
*///==========================================================================

namespace PHK\UnitTest {

if (!
function_exists('PHK\UnitTest\_phk_load_phpunit_interface'))
{
function 
_phk_load_phpunit_interface()
{
if (!
class_exists('PHK\UnitTest\PHPUnit_Runner_PHKTestSuiteLoader',false))
{
//=============================================================================
/**
*/
class PHPUnit_Runner_PHKTestSuiteLoader implements \PHPUnit_Runner_TestSuiteLoader
{

//-------------------

public function load($suiteClassName$suiteClassFile '')
{
if (
class_exists($suiteClassNametrue))
    {
    return new \
ReflectionClass($suiteClassName);
    }
else throw new \
RuntimeException("Class $suiteClassName could not be found");
}

//-------------------

public function reload(\ReflectionClass $aClass)
{
return 
$aClass;
}

//---------------------------------
// End of class
//-------------------------
// End of class_exists
//=============================================================================

if (!class_exists('PHK\UnitTest\PHPUnit_TextUI_PHK',false))
{
//=============================================================================
/**
*/
class PHPUnit_TextUI_PHK
{
//-------------------

public static function main()
{
PHPUnit_Util_Filter::addFileToFilter(__FILE__'PHPUNIT');

self::handleLoader('PHK\UnitTest\PHPUnit_Runner_PHKTestSuiteLoader');

//----

$arguments=self::handleArguments();

$runner= new \PHPUnit_TextUI_TestRunner;

$suite $runner->getTest($arguments['test'],'',$arguments['syntaxCheck']);

try    {
    if (\
PHK\Tools\Util::envIsWeb()) echo "<pre>\n";

    
$result $runner->doRun($suite,$arguments);

    if (\
PHK\Tools\Util::envIsWeb()) echo "</pre>\n";
    }
catch (\
Exception $e)
    {
    throw new \
RuntimeException('Could not create and run test suite: '
        
$e->getMessage());
    }

if (!\
PHK\Tools\Util::envIsWeb())
    {
    if (
$result->wasSuccessful()) exit(\PHPUnit_TextUI_TestRunner::SUCCESS_EXIT);
    else if(
$result->errorCount() > 0)
        exit(\
PHPUnit_TextUI_TestRunner::EXCEPTION_EXIT);
    else exit(\
PHPUnit_TextUI_TestRunner::FAILURE_EXIT);
    }
}

//-------------------
/**
* @access protected
* @static
*/

protected static function handleArguments()
{
$arguments = array('syntaxCheck' => TRUE);

$longOptions = array(
    
'configuration=',
    
'exclude-group=',
    
'filter=',
    
'group=',
    
'help',
    
'loader=',
    
'log-json=',
    
'log-tap=',
    
'log-xml=',
    
'repeat=',
    
'skeleton',
    
'stop-on-failure',
    
'tap',
    
'testdox',
    
'testdox-html=',
    
'testdox-text=',
    
'no-syntax-check',
    
'verbose',
    
'version',
    
'wait');

if (
class_exists('Image_GraphViz'FALSE)) $longOptions[] = 'log-graphviz=';

if (
extension_loaded('pdo'))
    {
    
$longOptions[] = 'test-db-dsn=';
    
$longOptions[] = 'test-db-log-rev=';
    
$longOptions[] = 'test-db-log-prefix=';
    
$longOptions[] = 'test-db-log-info=';
    }

if (
extension_loaded('xdebug'))
    {
    
$longOptions[] = 'coverage-html=';
    
$longOptions[] = 'coverage-xml=';
    
$longOptions[] = 'log-metrics=';
    
$longOptions[] = 'log-pmd=';
    
$longOptions[] = 'report=';
    }

try
    {
    
//-- Tests if argv exists - allows to run in web mode

    
$options = \PHPUnit_Util_Getopt::getopt(
        isset(
$_SERVER['argv']) ? $_SERVER['argv'] : array(),'d:',$longOptions);
    }
catch (\
RuntimeException $e)
    {
    \
PHPUnit_TextUI_TestRunner::showError($e->getMessage());
    }

$arguments['test']=(isset($options[1][0]) ? $options[1][0] : 'AllTests');

$arguments['testFile'] = '';

foreach (
$options[0] as $option)
    {
    switch (
$option[0])
        {
        case 
'--configuration':
            
$arguments['configuration'] = $option[1];
            break;

        case 
'--coverage-xml':
            
$arguments['coverageXML'] = $option[1];
            break;

        case 
'd':
            
$ini explode('='$option[1]);
            if (isset(
$ini[0]))
                {
                if (isset(
$ini[1]))
                    {
                    
ini_set($ini[0], $ini[1]);
                    }
                else 
ini_set($ini[0], TRUE);
                }
            break;

        case 
'--help':
            
self::showHelp();
            exit(\
PHPUnit_TextUI_TestRunner::SUCCESS_EXIT);
            break;

        case 
'--filter':
            if (
preg_match('/^[a-zA-Z0-9_]/'$option[1]))
                
$arguments['filter'] = '/^' $option[1] . '$/';
            else
                
$arguments['filter'] = $option[1];
            break;

        case 
'--group':
            
$arguments['groups'] = explode(','$option[1]);
            break;

        case 
'--exclude-group':
            
$arguments['excludeGroups'] = explode(','$option[1]);
            break;

        case 
'--loader':
            
self::handleLoader($option[1]);
            break;

        case 
'--log-json':
            
$arguments['jsonLogfile'] = $option[1];
            break;

        case 
'--log-graphviz':
            
$arguments['graphvizLogfile'] = $option[1];
            break;

        case 
'--log-tap':
            
$arguments['tapLogfile'] = $option[1];
            break;

        case 
'--log-xml':
            
$arguments['xmlLogfile'] = $option[1];
            break;

        case 
'--log-pmd':
            
$arguments['pmdXML'] = $option[1];
            break;

        case 
'--log-metrics':
            
$arguments['metricsXML'] = $option[1];
            break;

        case 
'--repeat':
            
$arguments['repeat'] = (int)$option[1];
            break;

        case 
'--stop-on-failure':
            
$arguments['stopOnFailure'] = TRUE;
            break;

        case 
'--test-db-dsn':
            
$arguments['testDatabaseDSN'] = $option[1];
            break;

        case 
'--test-db-log-rev':
            
$arguments['testDatabaseLogRevision'] = $option[1];
            break;

        case 
'--test-db-prefix':
            
$arguments['testDatabasePrefix'] = $option[1];
            break;

        case 
'--test-db-log-info':
            
$arguments['testDatabaseLogInfo'] = $option[1];
            break;

        case 
'--coverage-html':
        case 
'--report':
            
$arguments['reportDirectory'] = $option[1];
            break;

        case 
'--skeleton':
            if (isset(
$arguments['test']))
                
self::doSkeleton($arguments['test'],'');
            else
                {
                
self::showHelp();
                exit(\
PHPUnit_TextUI_TestRunner::EXCEPTION_EXIT);
                }
            break;

        case 
'--tap':
            
$arguments['printer'] = new \PHPUnit_Util_Log_TAP;
            break;

        case 
'--testdox':
            
$arguments['printer'] = new \PHPUnit_Util_TestDox_ResultPrinter_Text;
            break;

        case 
'--testdox-html':
            
$arguments['testdoxHTMLFile'] = $option[1];
            break;

        case 
'--testdox-text':
            
$arguments['testdoxTextFile'] = $option[1];
            break;

        case 
'--no-syntax-check':
            
$arguments['syntaxCheck'] = FALSE;
            break;

        case 
'--verbose':
            
$arguments['verbose'] = TRUE;
            break;

        case 
'--version':
            \
PHPUnit_TextUI_TestRunner::printVersionString();
            exit(\
PHPUnit_TextUI_TestRunner::SUCCESS_EXIT);
            break;

        case 
'--wait':
            
$arguments['wait'] = TRUE;
            break;
        }
    }

if (!isset(
$arguments['test']) && isset($arguments['configuration']))
    {
    
$configuration= new \PHPUnit_Util_Configuration($arguments['configuration']);

    
$testSuite $configuration->getTestSuiteConfiguration();

    if (
$testSuite !== NULL$arguments['test'] = $testSuite;
    }

if ((isset(
$arguments['testDatabaseLogRevision'])
    && !isset(
$arguments['testDatabaseDSN'])))
    {
    
self::showHelp();
    exit(\
PHPUnit_TextUI_TestRunner::EXCEPTION_EXIT);
    }

return 
$arguments;
}

/**
* @param  string  $test
* @param  string  $testFile
* @access protected
* @static
*/
protected static function doSkeleton($test$testFile)
{
if (
$test !== FALSE)
    {
    \
PHPUnit_TextUI_TestRunner::printVersionString();

    try
        {
        
$skeleton = new \PHPUnit_Util_Skeleton($test$testFile);
        
$skeleton->write();
        }
    catch (\
Exception $e)
        {
        print 
$e->getMessage() . "\n";

        
printf('Could not write test class skeleton for "%s" to "%s".' "\n",
            
$test,$testFile);

        exit(\
PHPUnit_TextUI_TestRunner::FAILURE_EXIT);
        }

    
printf('Wrote test class skeleton for "%s" to "%s".' "\n",
        
$test,$skeleton->getTestSourceFile());

    exit(\
PHPUnit_TextUI_TestRunner::SUCCESS_EXIT);
    }
}

/**
* @param  string  $loaderName
* @access protected
* @static
*/
protected static function handleLoader($loaderName)
{
if (!
class_exists($loaderNameFALSE))
    {
    \
PHPUnit_Util_Fileloader::checkAndLoad(str_replace('_''/'$loaderName)
        . 
'.php');
    }

if (
class_exists($loaderNameFALSE))
    {
    
$class = new \ReflectionClass($loaderName);

    if (
$class->implementsInterface('PHPUnit_Runner_TestSuiteLoader') &&
        
$class->isInstantiable())
        {
        
$loader $class->newInstance();
        }
    }

if (!isset(
$loader))
    {
    \
PHPUnit_TextUI_TestRunner::showError(
        
sprintf('Could not use "%s" as loader.',$loaderName));
    }

\
PHPUnit_TextUI_TestRunner::setLoader($loader);
}

/**
* @access public
* @static
*/
public static function showHelp()
{
\
PHPUnit_TextUI_TestRunner::printVersionString();

print 
"Usage: php <package> [switches] [UnitTest]\n\n";

if (
class_exists('Image_GraphViz'FALSE)) {
    print 
"  --log-graphviz <file>  Log test execution in GraphViz markup.\n";
}

print 
"  --log-json <file>      Log test execution in JSON format.\n" .
      
"  --log-tap <file>       Log test execution in TAP format to file.\n" .
      
"  --log-xml <file>       Log test execution in XML format to file.\n";

if (
extension_loaded('xdebug')) {
    print 
"  --log-metrics <file>   Write metrics report in XML format.\n" .
          
"  --log-pmd <file>       Write violations report in PMD XML format.\n\n" .
          
"  --coverage-html <dir>  Generate code coverage report in HTML format.\n" .
          
"  --coverage-xml <file>  Write code coverage information in XML format.\n\n";
}

if (
extension_loaded('pdo')) {
    print 
"  --test-db-dsn <dsn>    DSN for the test database.\n" .
          
"  --test-db-log-rev <r>  Revision information for database logging.\n" .
          
"  --test-db-prefix ...   Prefix that should be stripped from filenames.\n" .
          
"  --test-db-log-info ... Additional information for database logging.\n\n";
}

print 
"  --testdox-html <file>  Write agile documentation in HTML format to file.\n" .
      
"  --testdox-text <file>  Write agile documentation in Text format to file.\n\n" .
      
"  --filter <pattern>     Filter which tests to run.\n" .
      
"  --group ...            Only runs tests from the specified group(s).\n" .
      
"  --exclude-group ...    Exclude tests from the specified group(s).\n\n" .
      
"  --loader <loader>      TestSuiteLoader implementation to use.\n" .
      
"  --repeat <times>       Runs the test(s) repeatedly.\n\n" .
      
"  --tap                  Report test execution progress in TAP format.\n" .
      
"  --testdox              Report test execution progress in TestDox format.\n\n" .
      
"  --no-syntax-check      Disable syntax check of test source files.\n" .
      
"  --stop-on-failure      Stop execution upon first error or failure.\n" .
      
"  --verbose              Output more verbose information.\n" .
      
"  --wait                 Waits for a keystroke after each test.\n\n" .
      
"  --skeleton             Generate skeleton UnitTest class for Unit in Unit.php.\n\n" .
      
"  --help                 Prints this usage information.\n" .
      
"  --version              Prints the version and exits.\n\n" .
      
"  --configuration <file> Read configuration from XML file.\n" .
      
"  -d key[=value]         Sets a php.ini value.\n";
}

//---------------------------------
// End of class PHPUnit_TextUI_PHK
//-------------------------
// End of class_exists('PHPUnit_TextUI_PHK')
//=============================================================================
// End of function \PHK\UnitTest\_phk_load_phpunit_interface
//=============================================================================
// End of function_exists(\PHK\UnitTest\_phk_load_phpunit_interface)
//===========================================================================
// End of namespace
//===========================================================================
?>

For more information about the PHK package format: http://phk.tekwire.net