--- /dev/null
+<?php
+/* This file is part of PHP test framework for ext/sybase_ct
+ *
+ * $Id$
+ */
+
+ // {{{ 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'
+ );
+
+ printf(
+ "\n%s: %s in %s on line %d\n",
+ $names[$errno],
+ $errstr,
+ $this->name,
+ $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>
+__;
+ // }}}
+?>