You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
146 lines
3.7 KiB
146 lines
3.7 KiB
<?php
|
|
/**
|
|
* li₃: the most RAD framework for PHP (http://li3.me)
|
|
*
|
|
* Copyright 2009, Union of RAD. All rights reserved. This source
|
|
* code is distributed under the terms of the BSD 3-Clause License.
|
|
* The full license text can be found in the LICENSE.txt file.
|
|
*/
|
|
|
|
namespace lithium\test;
|
|
|
|
use Exception;
|
|
use lithium\test\Unit;
|
|
use lithium\core\Libraries;
|
|
use lithium\util\Collection;
|
|
|
|
/**
|
|
* A `Collection` of tests that represents a test group.
|
|
*
|
|
* Tests are added to this group either on `construct` by passing a fully-namespaced test class
|
|
* or namespace string-based path, e.g.
|
|
*
|
|
* ```
|
|
* $group = new Group(['data' => [
|
|
* 'data\ModelTest',
|
|
* new \lithium\tests\cases\core\LibrariesTest()
|
|
* ]]);
|
|
* ```
|
|
*
|
|
* Or they can be added programmatically:
|
|
*
|
|
* ```
|
|
* $group->add('data\ModelTest');
|
|
* ```
|
|
*/
|
|
class Group extends \lithium\util\Collection {
|
|
|
|
/**
|
|
* auto init for setting up items passed into constructor
|
|
*
|
|
* @return void
|
|
*/
|
|
protected function _init() {
|
|
parent::_init();
|
|
$data = $this->_data;
|
|
$this->_data = [];
|
|
|
|
foreach ($data as $item) {
|
|
$this->add($item);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Get all test cases. By default, does not include function or integration tests.
|
|
*
|
|
* @param array $options
|
|
* @return array
|
|
*/
|
|
public static function all(array $options = []) {
|
|
$defaults = [
|
|
'filter' => '/cases/',
|
|
'exclude' => '/mocks/',
|
|
'recursive' => true
|
|
];
|
|
return Libraries::locate('tests', null, $options + $defaults);
|
|
}
|
|
|
|
/**
|
|
* Add a tests to the group.
|
|
*
|
|
* @param string $test The test to be added.
|
|
* @param array $options Method options. Currently not used in this method.
|
|
* @return array Updated list of tests contained within this collection.
|
|
*/
|
|
public function add($test = null, array $options = []) {
|
|
$resolve = function($test) {
|
|
switch (true) {
|
|
case !$test:
|
|
return [];
|
|
case is_object($test) && $test instanceof Unit:
|
|
return [get_class($test)];
|
|
case is_string($test) && !file_exists(Libraries::path($test)):
|
|
return $this->_resolve($test);
|
|
default:
|
|
return (array) $test;
|
|
}
|
|
};
|
|
if (is_array($test)) {
|
|
foreach ($test as $t) {
|
|
$this->_data = array_filter(array_merge($this->_data, $resolve($t)));
|
|
}
|
|
return $this->_data;
|
|
}
|
|
return $this->_data = array_merge($this->_data, $resolve($test));
|
|
}
|
|
|
|
/**
|
|
* Get the collection of tests
|
|
*
|
|
* @param string|array $params
|
|
* @param array $options
|
|
* @return lithium\util\Collection
|
|
*/
|
|
public function tests($params = [], array $options = []) {
|
|
$tests = new Collection();
|
|
|
|
foreach ($this->_data as $test) {
|
|
if (!class_exists($test)) {
|
|
throw new Exception("Test case `{$test}` not found.");
|
|
}
|
|
$tests[] = new $test;
|
|
}
|
|
return $tests;
|
|
}
|
|
|
|
/**
|
|
* Resolves a unit test class (or classes) from a class or namespace path string.
|
|
*
|
|
* @param string $test The path string in which to find the test case(s). This may be a
|
|
* library, a namespace, or a fully-namespaced class reference.
|
|
* @return array Returns an array containing one or more fully-namespaced class references to
|
|
* unit tests.
|
|
*/
|
|
protected function _resolve($test) {
|
|
if (strpos($test, '\\') === false && Libraries::get($test)) {
|
|
return (array) Libraries::find($test, [
|
|
'recursive' => true,
|
|
'filter' => '/(cases|integration|functional)\\\.*Test$/',
|
|
'exclude' => '/tests\\\mocks/'
|
|
]);
|
|
}
|
|
if (!$test = trim($test, '\\')) {
|
|
return [];
|
|
}
|
|
list($library, $path) = explode('\\', $test, 2) + [$test, null];
|
|
|
|
return (array) Libraries::find($library, [
|
|
'recursive' => true,
|
|
'path' => '/' . str_replace('\\', '/', $path),
|
|
'filter' => '/(cases|integration|functional)\\\.*Test$/',
|
|
'exclude' => strstr($test, 'tests\mocks') ? '' : '/tests\\\mocks/'
|
|
]);
|
|
}
|
|
}
|
|
|
|
?>
|