1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
|
<?php
// $Id$
/**
* Implementes getTestInstances to allow access to the test objects from outside
*/
class DrupalTestSuite extends TestSuite {
var $_cleanupModules = array();
function DrupalTestSuite($label) {
$this->TestSuite($label);
}
/**
* @return array of instantiated tests that this GroupTests holds
*/
function getTestInstances() {
for ($i = 0, $count = count($this->_test_cases); $i < $count; $i++) {
if (is_string($this->_test_cases[$i])) {
$class = $this->_test_cases[$i];
$this->_test_cases[$i] = &new $class();
}
}
return $this->_test_cases;
}
}
class DrupalTests extends DrupalTestSuite {
/**
* Constructor
* @param array $class_list list containing the classes of tests to be processed
* default: NULL - run all tests
*/
function DrupalTests($class_list = NULL) {
static $classes;
$this->DrupalTestSuite('Drupal Unit Tests');
/* Tricky part to avoid double inclusion */
if (!$classes) {
$files = array();
foreach (array_keys(module_rebuild_cache()) as $module) {
$module_path = drupal_get_path('module', $module);
$test = $module_path . "/$module.test";
if (file_exists($test)) {
$files[] = $test;
}
}
$existing_classes = get_declared_classes();
foreach ($files as $file) {
include_once($file);
}
$classes = array_diff(get_declared_classes(), $existing_classes);
}
if (!is_null($class_list)) {
$classes = $class_list;
}
if (count($classes) == 0) {
drupal_set_message('No test cases found.', 'error');
return;
}
$groups = array();
foreach ($classes as $class) {
if (!is_subclass_of($class, 'DrupalWebTestCase') && !is_subclass_of($class, 'DrupalUnitTestCase')) {
continue;
}
$this->_addClassToGroups($groups, $class);
}
foreach ($groups as $group_name => $group) {
$group_test = &new DrupalTestSuite($group_name);
foreach ($group as $key => $v) {
$group_test->addTestCase($group[$key]);
}
$this->addTestCase($group_test);
}
}
/**
* Adds a class to a groups array specified by the getInfo of the group
* @param array $groups Group of categorized tests
* @param string $class Name of a class
*/
function _addClassToGroups(&$groups, $class) {
$test = &new $class();
if (method_exists($test, 'getInfo')) {
$info = $test->getInfo();
$groups[$info['group']][] = $test;
}
}
/**
* Invokes run() on all of the held test cases, instantiating
* them if necessary.
* The Drupal version uses paintHeader instead of paintGroupStart
* to avoid collapsing of the very top level.
*
* @param SimpleReporter $reporter Current test reporter.
* @access public
*/
function run(&$reporter) {
cache_clear_all();
@set_time_limit(0);
ignore_user_abort(TRUE);
// Disable devel output, check simpletest settings page
if (!variable_get('simpletest_devel', FALSE)) {
$GLOBALS['devel_shutdown'] = FALSE;
}
$result = parent::run($reporter);
// Restores modules
foreach ($this->_cleanupModules as $name => $status) {
db_query("UPDATE {system} SET status = %d WHERE name = '%s' AND type = 'module'", $status, $name);
}
$this->_cleanupModules = array();
return $result;
}
}
|