/** * Takes an instance of an object (usually a Collection object) containing test * instances. Adds affected tests to the test collection. * * @param object $report Instance of Report which is calling apply. * @param array $tests The test to apply this filter on * @param array $options Not used. * @return object Returns the instance of `$tests`. */ public static function apply($report, $tests, array $options = array()) { $affected = array(); $testsClasses = $tests->map('get_class', array('collect' => false)); foreach ($tests as $test) { $affected = array_merge($affected, self::_affected($test->subject())); } $affected = array_unique($affected); foreach ($affected as $class) { $test = Unit::get($class); if ($test && !in_array($test, $testsClasses)) { $tests[] = new $test(); } $report->collect(__CLASS__, array($class => $test)); } return $tests; }
/** * Runs tests given a path to a directory or file containing tests. The path to the * test(s) may be absolute or relative to the current working directory. * * {{{ * li3 test lithium/tests/cases/core/ObjectTest.php * li3 test lithium/tests/cases/core * }}} * * If you are in the working directory of an application or plugin and wish to run all tests, * simply execute the following: * * {{{ * li3 test tests/cases * }}} * * If you are in the working directory of an application and wish to run a plugin, execute one * of the following: * * {{{ * li3 test libraries/<plugin>/tests/cases * li3 test <plugin>/tests/cases * }}} * * * This will run `<library>/tests/cases/<package>/<class>Test.php`: * * {{{ * li3 test <library>/<package>/<class>.php * }}} * * @param string $path Absolute or relative path to tests or a file which * corresponding test should be run. * @return boolean Will exit with status `1` if one or more tests failed otherwise with `0`. */ public function run($path = null) { if (!($path = $this->_path($path))) { return false; } if (!preg_match('/(tests|Test\\.php)/', $path)) { if (!($path = Unit::get($path))) { $this->error('Cannot map path to test path.'); return static::EXIT_NO_TEST; } } $handlers = $this->_handlers; if (!isset($handlers[$this->format]) || !is_callable($handlers[$this->format])) { $this->error(sprintf('No handler for format `%s`... ', $this->format)); return false; } $filters = $this->filters ? array_map('trim', explode(',', $this->filters)) : array(); $params = compact('filters') + array('format' => $this->format); $runner = function ($options = array()) use($path, $params) { error_reporting(E_ALL | E_STRICT | E_DEPRECATED); return Dispatcher::run($path, $params + $options); }; $report = $handlers[$this->format]($runner, $path); $stats = $report->stats(); return $stats['success']; }