<?php

/**
 * HTML output for PHPUnit suite tests.
 *
 * Copied for PEAR_PackageFileManager from HTML_CSS
 * @version    $Id: testsuite.php,v 1.2 2004/03/21 23:06:20 cellog Exp $
 * @author     Laurent Laville <pear@laurent-laville.org>
 * @package    HTML_CSS
 */

require_once 'TestUnit.php';
require_once 'HTML_TestListener.php';
require_once 'PEAR/ErrorStack.php';

$title = 'PhpUnit test run, PEAR_ErrorStack package';
?>
<html>
<head>
<title><?php echo $title; ?></title>
<link rel="stylesheet" href="stylesheet.css" type="text/css" />
</head>
<body>
<h1><?php echo $title; ?></h1>
      <p>
	This page runs all the phpUnit self-tests, and produces nice HTML output.
      </p>
      <p>
	Unlike typical test run, <strong>expect many test cases to
	  fail</strong>.  Exactly those with <code>pass</code> in their name
	should succeed.
      </p>
      <p>
      For each test we display both the test result -- <span
      class="Pass">ok</span>, <span class="Failure">FAIL</span>, or
      <span class="Error">ERROR</span> -- and also a meta-result --
      <span class="Expected">as expected</span>, <span
      class="Unexpected">UNEXPECTED</span>, or <span
      class="Unknown">unknown</span> -- that indicates whether the
      expected test result occurred.  Although many test results will
      be 'FAIL' here, all meta-results should be 'as expected', except
      for a few 'unknown' meta-results (because of errors) when running
      in PHP3.
      </p>
      
<h2>Tests</h2>
	<?php
	$testcases = array(
    	    'Error_Stack_TestCase_singleton',
    	    'Error_Stack_TestCase_pushpop',
    	    'Error_Stack_TestCase_pushpopstatic',
    	    'Error_Stack_TestCase_pushpopcallback',
    	    'Error_Stack_TestCase_getErrorMessage',
    	    'Error_Stack_TestCase_getErrorMessageTemplate',
    	    'Error_Stack_TestCase_getErrors',
    	    'Error_Stack_TestCase_staticGetErrors',
	);
define('PEAR_LOG_EMERG',    0);     /** System is unusable */
define('PEAR_LOG_ALERT',    1);     /** Immediate action required */
define('PEAR_LOG_CRIT',     2);     /** Critical conditions */
define('PEAR_LOG_ERR',      3);     /** Error conditions */
define('PEAR_LOG_WARNING',  4);     /** Warning conditions */
define('PEAR_LOG_NOTICE',   5);     /** Normal but significant */
define('PEAR_LOG_INFO',     6);     /** Informational */
define('PEAR_LOG_DEBUG',    7);     /** Debug-level messages */
/**
* Mock Log object
*/
class BurfLog {
    var $testcase;
    var $method;
    var $expect = array();
    function setTestCase(&$testcase)
    {
        $this->testcase = &$testcase;
    }
    
    function curMethod($method)
    {
        $this->method = $method;
    }
    
    function pushExpect($message, $priority, $errarray)
    {
        unset($errarray['time']);
        unset($errarray['context']);
        array_push($this->expect, array($message, $priority, $errarray));
    }
    
    function clearExpect()
    {
        $this->expect = array();
    }

    function log($message, $priority, $errarray)
    {
        $this->testcase->wasLogged = true;
        if (!is_a($this->testcase, 'PHPUnit_TestCase')) {
            trigger_error('ERROR: burflog never set up', E_USER_ERROR);
            return;
        }
        if (!isset($this->method)) {
            $this->testcase->assertFalse(true, 'ERROR: burflog never set up');
            return;
        }
        if (!count($this->expect)) {
            $this->testcase->assertFalse(true, "method $this->method: logged, but no log expected");
            $this->testcase->assertFalse(true, "method $this->method: log message = $message");
            $this->testcase->assertFalse(true, "method $this->method: log priority = $priority");
            return;
        }
        unset($errarray['time']);
        unset($errarray['context']);
        $expect = array_pop($this->expect);
        $this->testcase->assertEquals($expect[0], $message, "method $this->method: wrong message");
        $this->testcase->assertEquals($expect[1], $priority, "method $this->method: wrong priority");
        $this->testcase->assertEquals($expect[2], $errarray, "method $this->method: wrong errarray");
    }
}
	
	$suite = new PHPUnit_TestSuite();

	foreach ($testcases as $testcase) {
    	    include_once $testcase . '.php';
            $suite->addTestSuite($testcase);
	}

	$listener = new HTML_TestListener();
    $finalresult = TestUnit::run($suite, $listener);
    $results = include_once dirname(__FILE__) . '/base_regression.php';
    $num = $results['number'];
    $failed = $results['failed'];
    $passed = $results['passed'];
    for ($i = 1; $i <= $num; $i++) {
        $bla = new Mock_PHPUnit;
        $bla->name = $i;
        $listener->startTest($bla);
    	if (isset($failed[$i])) {
    	    $listener->addFailure($bla, $failed[$i]);
            $finalresult->addFailure($bla, $a = 'context had additional ' . serialize($failed[$i]));
        }
        $listener->endTest($bla);
    }

	$finalresult->removeListener($listener);
    // hack in the base regression test count
    $finalresult->_runTests += count($results['failed']) + count($results['passed']);
	$finalresult->report();

	?>
</body>
</html>