/* [<][>][^][v][top][bottom][index][help] */
DEFINITIONS
This source file includes following definitions.
- PHPTExpectancy
- matches
- matches
- fromFile
- onError
- run
<?php
/* This file is part of PHP test framework for ext/sybase_ct
*
* $Id: index.php,v 1.3 2005/02/06 14:08:11 thekid Exp $
*/
// {{{ class PHPTExpectancy
// Abstract base class for expectancies
class PHPTExpectancy {
var
$expected = '';
function PHPTExpectancy($expected) {
$this->expected= $expected;
}
function matches($output) { }
}
// }}}
// {{{ class PHPTRegexExpectancy
// Expectancy class for regular expressions
class PHPTRegexExpectancy extends PHPTExpectancy {
function matches($output) {
return preg_match('°^'.strtr(preg_quote(rtrim($this->expected), '°'), array(
'%s' => '(.+)',
'%d' => '([0-9]+)'
)).'°', $output);
}
}
// }}}
// {{{ class PHPTTest
// Represents a single .phpt-style test
class PHPTTest {
var
$name = '',
$description = '',
$skipif = '',
$code = '',
$expectancy = NULL,
$output = '';
function &fromFile($filename) {
$fd= fopen($filename, 'r');
$sections= array();
$current= NULL;
while (!feof($fd)) {
$line= fgets($fd, 0xFFFF);
if (1 == sscanf($line, '--%[^-]--', $section)) {
$sections[$section]= '';
$current= $section;
continue;
}
$sections[$current].= $line;
}
fclose($fd);
// Create instance from read data and return it
$t= &new PHPTTest(); {
$t->name= substr(realpath($filename), 0, -1);
$t->description= rtrim($sections['TEST']);
$t->skipif= $sections['SKIPIF'];
$t->code= $sections['FILE'];
if (isset($sections['EXPECTF'])) {
$t->expectancy= &new PHPTRegexExpectancy($sections['EXPECTF']);
} else {
// XXX TBI XXX
}
}
return $t;
}
function onError($errno, $errstr, $errfile, $errline) {
static $names= array(
E_NOTICE => 'Notice',
E_WARNING => 'Warning'
);
if (!(error_reporting() & $errno)) return;
printf(
"\n%s: %s in %s on line %d\n",
$names[$errno],
$errstr,
strstr($errfile, 'eval()\'d code') ? $this->name : $errfile,
$errline
);
}
function run() {
// Precondition check - will die if test needs to be skipped
eval('?>'.$this->skipif);
set_error_handler(array(&$this, 'onError')); {
error_reporting(E_ALL);
ob_start();
eval('?>'.$this->code);
$this->output= rtrim(ob_get_contents());
ob_end_clean();
} restore_error_handler();
return $this->expectancy->matches($this->output);
}
}
// }}}
// {{{ main
if (isset($_GET['phpinfo'])) {
phpinfo((int)$_GET['phpinfo']);
echo '<a href="?">Home</a>';
exit();
}
echo <<<__
<html>
<head>
<title>PHPT Test</title>
<style type="text/css">
body {
background-color: #ffffff;
color: #000000;
font-size: 75%;
}
body, td, th, h1, h2 {
font-family: sans-serif;
}
h1 {
font-size: 150%;
}
h2 {
font-size: 125%;
}
.header {
background: url(?=PHPE9568F34-D428-11d2-A769-00AA001ACF42);
background-position: right center;
background-repeat: no-repeat;
min-height: 70px;
background-color: #9999cc;
padding: 4px;
padding-right: 120px;
border: 1px solid #000000;
}
hr {
width: 600px;
background-color: #cccccc;
border: 0px;
height: 1px;
color: #000000;
}
</style>
</head>
<body>
__;
$test= basename($_SERVER['QUERY_STRING']);
if ($test && file_exists($test)) {
$t= &PHPTTest::fromFile($test);
echo '<div class="header"><h1>'.basename($t->name), ': ', $t->description.'</h1></div>';
echo '<a href="?">Back to test suite</a>';
flush();
// Run the test
$result= $t->run();
// Evaluate results
if ($result) {
echo '<h2>Passed</h2>';
} else {
echo '<h2>Failed</h2><hr/>';
echo '<h3>Actual output</h3>';
echo '<xmp>', $t->output, '</xmp><hr/>';
echo '<h3>Expectancy</h3>';
echo '<xmp>', $t->expectancy->expected, '</xmp>';
}
echo '<hr/>';
exit();
}
echo '<div class="header"><h1>Test suite</h1></div>';
// phpinfo() links
echo 'phpinfo(): ';
foreach (array(
1 => 'General',
4 => 'Configuration',
8 => 'Modules'
) as $const => $name) {
printf('<a href="?phpinfo=%d">%s</a> | ', $const, $name);
}
echo '<a href="?phpinfo=-1">(All)</a>';
echo '<h2>Select one to run</h2>';
echo '<ul>';
$d= dir(dirname(__FILE__));
while ($entry= $d->read()) {
if ('.phpt' != substr($entry, -5)) continue;
echo '<li><a href="?'.$entry.'">'.$entry.'</a></li>';
}
$d->close();
echo '</ul><hr/>';
echo <<<__
</body>
</html>
__;
// }}}
?>