View source
<?php
class PHPUnit_Extensions_PhptTestCase implements PHPUnit_Framework_Test, PHPUnit_Framework_SelfDescribing {
private $filename;
private $settings = array(
'allow_url_fopen=1',
'auto_append_file=',
'auto_prepend_file=',
'disable_functions=',
'display_errors=1',
'docref_root=',
'docref_ext=.html',
'error_append_string=',
'error_prepend_string=',
'error_reporting=-1',
'html_errors=0',
'log_errors=0',
'magic_quotes_runtime=0',
'output_handler=',
'open_basedir=',
'output_buffering=Off',
'report_memleaks=0',
'report_zend_debug=0',
'safe_mode=0',
'track_errors=1',
'xdebug.default_enable=0',
);
public function __construct($filename) {
if (!is_string($filename)) {
throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string');
}
if (!is_file($filename)) {
throw new PHPUnit_Framework_Exception(sprintf('File "%s" does not exist.', $filename));
}
$this->filename = $filename;
}
public function count() {
return 1;
}
public function run(PHPUnit_Framework_TestResult $result = null) {
$sections = $this
->parse();
$code = $this
->render($sections['FILE']);
if ($result === null) {
$result = new PHPUnit_Framework_TestResult();
}
$php = PHPUnit_Util_PHP::factory();
$skip = false;
$time = 0;
$settings = $this->settings;
$result
->startTest($this);
if (isset($sections['INI'])) {
$settings = array_merge($settings, $this
->parseIniSection($sections['INI']));
}
if (isset($sections['SKIPIF'])) {
$jobResult = $php
->runJob($sections['SKIPIF'], $settings);
if (!strncasecmp('skip', ltrim($jobResult['stdout']), 4)) {
if (preg_match('/^\\s*skip\\s*(.+)\\s*/i', $jobResult['stdout'], $message)) {
$message = substr($message[1], 2);
}
else {
$message = '';
}
$result
->addFailure($this, new PHPUnit_Framework_SkippedTestError($message), 0);
$skip = true;
}
}
if (!$skip) {
PHP_Timer::start();
$jobResult = $php
->runJob($code, $settings);
$time = PHP_Timer::stop();
if (isset($sections['EXPECT'])) {
$assertion = 'assertEquals';
$expected = $sections['EXPECT'];
}
else {
$assertion = 'assertStringMatchesFormat';
$expected = $sections['EXPECTF'];
}
$output = preg_replace('/\\r\\n/', "\n", trim($jobResult['stdout']));
$expected = preg_replace('/\\r\\n/', "\n", trim($expected));
try {
PHPUnit_Framework_Assert::$assertion($expected, $output);
} catch (PHPUnit_Framework_AssertionFailedError $e) {
$result
->addFailure($this, $e, $time);
} catch (Throwable $t) {
$result
->addError($this, $t, $time);
} catch (Exception $e) {
$result
->addError($this, $e, $time);
}
}
$result
->endTest($this, $time);
return $result;
}
public function getName() {
return $this
->toString();
}
public function toString() {
return $this->filename;
}
private function parse() {
$sections = array();
$section = '';
foreach (file($this->filename) as $line) {
if (preg_match('/^--([_A-Z]+)--/', $line, $result)) {
$section = $result[1];
$sections[$section] = '';
continue;
}
elseif (empty($section)) {
throw new PHPUnit_Framework_Exception('Invalid PHPT file');
}
$sections[$section] .= $line;
}
if (!isset($sections['FILE']) || !isset($sections['EXPECT']) && !isset($sections['EXPECTF'])) {
throw new PHPUnit_Framework_Exception('Invalid PHPT file');
}
return $sections;
}
private function render($code) {
return str_replace(array(
'__DIR__',
'__FILE__',
), array(
"'" . dirname($this->filename) . "'",
"'" . $this->filename . "'",
), $code);
}
protected function parseIniSection($content) {
return preg_split('/\\n|\\r/', $content, -1, PREG_SPLIT_NO_EMPTY);
}
}