<?php  				
require_once(dirname(__FILE__) . '/debug.php');
trace_file_info(__FILE__);

class TestRunner {
	var $target;
	
	function TestRunner($target) {
		$this->target = $target;
	}
	
	function run_tests() {
		$methods = get_class_methods($this->target);
		if (!$methods) return;
		foreach($methods as $method) {
			if (substr($method, 0, 4) == 'test') {
				$this->run_test($method);
			}
		}
		$this->showTrace();
	}
	
	function showTrace() {
		echo get_trace_html();
	}	
	
	function displayStartTest($name) {
		echo "<h1>Running test: $name</h1><blockquote>";
	}
	
	function displayError($message) {
		echo "<p><font color=\"red\">$message</font></p>";
	}
	
	function displayEndTest($name) {
		echo "</blockquote>";
	}
	
	function run_test(&$test) {	
		$name = "$this->target#$test";
		$this->displayStartTest($name);
		try {
			$instance = new $this->target($this);
			$instance->setUp();
			$instance->$test();
		} catch (TestFailedException $e) {
			// Ignore
		} catch (Exception $e) {
			$message = $e->getMessage();
			$this->displayError("An unhandled exception occurred while running $test: $message");
		}
		$instance->tearDown();
		$this->displayEndTest($name);
	}
}

class TextTestRunner extends TestRunner {
	function showTrace() {
		echo get_trace_text();
	}
	
	function displayStartTest($name) {
		echo "=== Running test: $name\n";
	}
	
	function displayError($message) {
		echo "*** $message\n";
	}
	
	function displayEndTest($name) {
		echo "\n\n";
	}
}

class TestFailedException extends Exception {
}

class TestCase {
	var $runner;
	
	function __construct($runner) {
		$this->runner = $runner;
	}
	
	function setUp() {
	}
	
	function tearDown() {
	}
	
	function fail($message) {
		$this->runner->displayError("Test failed: $message");
		throw new TestFailedException();
	}
	
	function assertEquals($expected, $actual) {
		if ($expected != $actual) {
			$this->runner->displayError("Expected \"$expected\" but found \"$actual\"");
			throw new TestFailedException();
		}
	}

	function assertNull($actual) {
		if ($actual !== null) {
			$this->runner->displayError("Expected null but found \"$actual\"");
			throw new TestFailedException();
		}
	}

	function assertNotNull($actual) {
		if ($actual === null) {
			$this->runner->displayError("Expected a value, but got null.");
			throw new TestFailedException();
		}
	}
	
	function assertTrue($value) {
		if (!$value) {
			$this->runner->displayError("Expected true value (or equivalent).");
			throw new TestFailedException();
		}
	}
	
	function assertFalse($value) {
		if ($value) {
			$this->runner->displayError("Expected false value (or equivalent).");
			throw new TestFailedException();
		}
	}
	
	/**
	 * This function attempts to assert the sameness of the two parameters.
	 */
	function assertSame($value1, $value2) {
		if ($value1 !== $value2) {
			$this->runner->displayError("Values are not identical");
			throw new TestFailedException();
		}
	}
}
?>

