refactored test runner a bit
This commit is contained in:
parent
2b64eeb21f
commit
c4bcc9082b
88
src/TUnit/framework/BaseTestRunner.php
Normal file
88
src/TUnit/framework/BaseTestRunner.php
Normal file
@ -0,0 +1,88 @@
|
||||
<?php
|
||||
|
||||
abstract class BaseTestRunner {
|
||||
|
||||
protected $tests;
|
||||
protected $listeners;
|
||||
protected $options;
|
||||
|
||||
public function __construct(array $tests = array(), array $listeners = array(), array $options = array()) {
|
||||
$this->tests = $tests;
|
||||
$this->listeners = $listeners;
|
||||
$this->options = (!empty($options)) ? $this->parseOptions($options) : array();
|
||||
}
|
||||
|
||||
public final function warn($message) {
|
||||
foreach ($this->listeners as $listener) {
|
||||
$listener->onFrameworkWarning($message);
|
||||
}
|
||||
}
|
||||
|
||||
public final function error($message) {
|
||||
foreach ($this->listeners as $listener) {
|
||||
$listener->onFrameworkError($message);
|
||||
}
|
||||
}
|
||||
|
||||
public final function addTest(Testable $test) {
|
||||
$this->tests[] = $test;
|
||||
return $this;
|
||||
}
|
||||
|
||||
public final function addListener(TestListener $listener) {
|
||||
$this->listeners[] = $listener;
|
||||
return $this;
|
||||
}
|
||||
|
||||
public final function setOptions(array $options) {
|
||||
$this->options = $this->parseOptions($options);
|
||||
return $this;
|
||||
}
|
||||
|
||||
protected final function parseOptions(array $unparsed) {
|
||||
$allowedOptions = $this->getAllowableOptions();
|
||||
$options = array_fill_keys(array_key($allowedOptions), null);
|
||||
foreach ($unparsed as $option => $value) {
|
||||
if (!isset($allowedOptions[$option])) {
|
||||
throw new InvalidOptionException($option);
|
||||
}
|
||||
if (gettype($value) !== $allowedOptions[$option]) {
|
||||
throw new InvalidOptionException($option, 'Expected a value of type ' . $allowedOptions[$option] . ', got ' . gettype($value));
|
||||
}
|
||||
|
||||
$options[$option] = $value;
|
||||
}
|
||||
|
||||
return $options;
|
||||
}
|
||||
|
||||
public function runTests() {
|
||||
$results = array();
|
||||
foreach ($this->tests as $test) {
|
||||
if ($test instanceof Testable) {
|
||||
try {
|
||||
$results[] = $test->run($this->listeners);
|
||||
} catch (TUnitException $e) {
|
||||
$this->error($e->getMessage());
|
||||
}
|
||||
} else {
|
||||
$this->warn('Unable to run test because it is not an instance of Testable (' . gettype($test) . ')');
|
||||
}
|
||||
}
|
||||
|
||||
return $results;
|
||||
}
|
||||
|
||||
public function publishResults(array $testResults) {
|
||||
foreach ($this->listeners as $listener) {
|
||||
$listener->publishTestResults($testResults);
|
||||
}
|
||||
}
|
||||
|
||||
public abstract function run();
|
||||
|
||||
protected abstract function getAllowableOptions();
|
||||
|
||||
}
|
||||
|
||||
?>
|
@ -1,51 +1,19 @@
|
||||
<?php
|
||||
|
||||
class TestRunner {
|
||||
|
||||
protected $tests;
|
||||
protected $listeners;
|
||||
|
||||
public function __construct(array $tests = array(), array $listeners = array()) {
|
||||
$this->tests = $tests;
|
||||
$this->listeners = $listeners;
|
||||
}
|
||||
|
||||
public final function addTest(Testable $test) {
|
||||
$this->tests[] = $test;
|
||||
return $this;
|
||||
}
|
||||
|
||||
public final function addListener(TestListener $listener) {
|
||||
$this->listeners[] = $listener;
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function runTests() {
|
||||
$results = array();
|
||||
foreach ($this->tests as $test) {
|
||||
if ($test instanceof Testable) {
|
||||
$results[] = $test->run($this->listeners);
|
||||
} else {
|
||||
foreach ($this->listeners as $listener) {
|
||||
$listener->onFrameworkWarning('Unable to run test because it is not an instance of Testable (' . gettype($test) . ')');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $results;
|
||||
}
|
||||
|
||||
public function publishResults(array $testResults) {
|
||||
foreach ($this->listeners as $listener) {
|
||||
$listener->publishTestResults($testResults);
|
||||
}
|
||||
}
|
||||
class ConsoleTestRunner extends BaseTestRunner {
|
||||
|
||||
public function run() {
|
||||
self::printMeta();
|
||||
$this->publishResults($this->runTests());
|
||||
}
|
||||
|
||||
protected function getAllowableOptions() {
|
||||
return array(
|
||||
'recursive' => 'boolean',
|
||||
'bootstrap' => 'string'
|
||||
);
|
||||
}
|
||||
|
||||
public static function printMeta() {
|
||||
fwrite(STDOUT, Product::NAME . ' ' . Product::VERSION . ' (build date: ' . Product::DATE . ')' . "\n");
|
||||
fwrite(STDOUT, ' by ' . Product::AUTHOR . "\n\n");
|
||||
|
18
src/TUnit/framework/exceptions/Exceptions.php
Normal file
18
src/TUnit/framework/exceptions/Exceptions.php
Normal file
@ -0,0 +1,18 @@
|
||||
<?php
|
||||
|
||||
class TUnitException extends Exception {}
|
||||
|
||||
class InvalidOptionException extends TUnitException {
|
||||
|
||||
public function __construct($switch, $message = '') {
|
||||
if (!empty($message)) {
|
||||
$message = ': ' . $message;
|
||||
}
|
||||
|
||||
$message = 'Invalid option (' . $option . ')' . $message;
|
||||
parent::__construct($message);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
?>
|
@ -3,7 +3,7 @@
|
||||
/**
|
||||
* Autoload manifest
|
||||
*
|
||||
* Autogenerated by manifester.php on 2009-06-19 01:41:57
|
||||
* Autogenerated by manifester.php on 2009-06-19 20:34:30
|
||||
*
|
||||
* @package TUnit
|
||||
* @version 0.4.0
|
||||
@ -13,11 +13,13 @@
|
||||
return array(
|
||||
'Assert' => 'TUnit/framework/Assert.php',
|
||||
'Autoloader' => 'TUnit/util/Autoloader.php',
|
||||
'BaseTestRunner' => 'TUnit/framework/BaseTestRunner.php',
|
||||
'Cli' => 'TUnit/util/cli.php',
|
||||
'CliSwitch' => 'TUnit/util/cli.php',
|
||||
'CliSwitchCollection' => 'TUnit/util/cli.php',
|
||||
'CombinedTestResult' => 'TUnit/framework/result/CombinedTestResult.php',
|
||||
'ConsoleListener' => 'TUnit/framework/listeners/ConsoleListener.php',
|
||||
'ConsoleTestRunner' => 'TUnit/framework/TestRunner.php',
|
||||
'Constraint' => 'TUnit/framework/constraints/Constraint.php',
|
||||
'DefaultConstraint' => 'TUnit/framework/constraints/DefaultConstraint.php',
|
||||
'EmptyConstraint' => 'TUnit/framework/constraints/SimpleConstraints.php',
|
||||
@ -30,6 +32,7 @@
|
||||
'IdenticalConstraint' => 'TUnit/framework/constraints/IdenticalConstraint.php',
|
||||
'IgnoredTest' => 'TUnit/framework/result/FailedTest.php',
|
||||
'IgnoredTestResult' => 'TUnit/framework/result/IgnoredTestResult.php',
|
||||
'InvalidOptionException' => 'TUnit/framework/exceptions/Exceptions.php',
|
||||
'InvocationExpectation' => 'TUnit/framework/mock/InvocationExpectation.php',
|
||||
'InvocationTracker' => 'TUnit/framework/mock/InvocationTracker.php',
|
||||
'IssetConstraint' => 'TUnit/framework/constraints/SimpleConstraints.php',
|
||||
@ -47,13 +50,13 @@
|
||||
'RecursiveTestIterator' => 'TUnit/util/RecursiveTestIterator.php',
|
||||
'SimpleConstraint' => 'TUnit/framework/constraints/SimpleConstraints.php',
|
||||
'SingleTestResult' => 'TUnit/framework/result/SingleTestResult.php',
|
||||
'TUnitException' => 'TUnit/framework/exceptions/Exceptions.php',
|
||||
'TestAccumulator' => 'TUnit/util/TestAccumulator.php',
|
||||
'TestCase' => 'TUnit/framework/test/TestCase.php',
|
||||
'TestFailure' => 'TUnit/framework/result/FailedTest.php',
|
||||
'TestListener' => 'TUnit/framework/listeners/TestListener.php',
|
||||
'TestMethod' => 'TUnit/framework/test/TestMethod.php',
|
||||
'TestResult' => 'TUnit/framework/result/TestResult.php',
|
||||
'TestRunner' => 'TUnit/framework/TestRunner.php',
|
||||
'TestSuite' => 'TUnit/framework/test/TestSuite.php',
|
||||
'Testable' => 'TUnit/framework/test/Testable.php',
|
||||
'TrueConstraint' => 'TUnit/framework/constraints/SimpleConstraints.php',
|
||||
|
@ -22,30 +22,35 @@
|
||||
$switches = new CliSwitchCollection();
|
||||
$switches->addSwitch(new CliSwitch(null, null, true, '<files>', 'Files and/or directories to parse for test cases'))
|
||||
->addSwitch(new CliSwitch('help', 'h', false, null, 'Display this help message (--usage is an alias)'))
|
||||
->addSwitch(new CliSwitch('recursive', null, false, null, 'Recurse into subdirectories'));
|
||||
->addSwitch(new CliSwitch('recursive', null, false, null, 'Recurse into subdirectories'))
|
||||
->addSwitch(new CliSwitch('bootstrap', 'b', false, 'file', 'File to include before each test'));
|
||||
|
||||
array_shift($argv);
|
||||
$args = Cli::parseArgs($argv, $switches);
|
||||
//print_r($args); exit;
|
||||
|
||||
if (isset($args['help'])) {
|
||||
$localSwitches = $args['switches'];
|
||||
$localArgs = $args['args'];
|
||||
|
||||
if (isset($localSwitches['help'])) {
|
||||
usage();
|
||||
exit(0);
|
||||
}
|
||||
|
||||
if (empty($args['args'])) {
|
||||
if (empty($localArgs)) {
|
||||
usage();
|
||||
exit(1);
|
||||
}
|
||||
|
||||
//accumulate tests
|
||||
$tests = TestAccumulator::getTests($args['args'], isset($args['recursive']));
|
||||
$tests = TestAccumulator::getTests($localArgs, isset($localSwitches['recursive']));
|
||||
|
||||
if (empty($tests)) {
|
||||
fwrite(STDERR, 'Found no TestCase subclasses in the given files');
|
||||
exit(1);
|
||||
}
|
||||
|
||||
$runner = new TestRunner(array(new TestSuite('Main Test Suite', $tests)), array(new ConsoleListener(/*ConsoleListener::VERBOSITY_HIGH*/)));
|
||||
$runner = new ConsoleTestRunner(array(new TestSuite('Main Test Suite', $tests)), array(new ConsoleListener(/*ConsoleListener::VERBOSITY_HIGH*/)), $localSwitches);
|
||||
$runner->run();
|
||||
exit(0);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user