Subversion Repositories web.creative

Rev

Details | Last modification | View Log

Rev Author Line No. Line
1 mjordaan 1
<?php
2
/*
3
 * This file is part of PHPUnit.
4
 *
5
 * (c) Sebastian Bergmann <sebastian@phpunit.de>
6
 *
7
 * For the full copyright and license information, please view the LICENSE
8
 * file that was distributed with this source code.
9
 */
10
 
11
/**
12
 * Base class for all test runners.
13
 */
14
abstract class PHPUnit_Runner_BaseTestRunner
15
{
16
    const STATUS_PASSED     = 0;
17
    const STATUS_SKIPPED    = 1;
18
    const STATUS_INCOMPLETE = 2;
19
    const STATUS_FAILURE    = 3;
20
    const STATUS_ERROR      = 4;
21
    const STATUS_RISKY      = 5;
22
    const STATUS_WARNING    = 6;
23
    const SUITE_METHODNAME  = 'suite';
24
 
25
    /**
26
     * Returns the loader to be used.
27
     *
28
     * @return PHPUnit_Runner_TestSuiteLoader
29
     */
30
    public function getLoader()
31
    {
32
        return new PHPUnit_Runner_StandardTestSuiteLoader;
33
    }
34
 
35
    /**
36
     * Returns the Test corresponding to the given suite.
37
     * This is a template method, subclasses override
38
     * the runFailed() and clearStatus() methods.
39
     *
40
     * @param string $suiteClassName
41
     * @param string $suiteClassFile
42
     * @param mixed  $suffixes
43
     *
44
     * @return PHPUnit_Framework_Test
45
     */
46
    public function getTest($suiteClassName, $suiteClassFile = '', $suffixes = '')
47
    {
48
        if (is_dir($suiteClassName) &&
49
            !is_file($suiteClassName . '.php') && empty($suiteClassFile)) {
50
            $facade = new File_Iterator_Facade;
51
            $files  = $facade->getFilesAsArray(
52
                $suiteClassName,
53
                $suffixes
54
            );
55
 
56
            $suite = new PHPUnit_Framework_TestSuite($suiteClassName);
57
            $suite->addTestFiles($files);
58
 
59
            return $suite;
60
        }
61
 
62
        try {
63
            $testClass = $this->loadSuiteClass(
64
                $suiteClassName,
65
                $suiteClassFile
66
            );
67
        } catch (PHPUnit_Framework_Exception $e) {
68
            $this->runFailed($e->getMessage());
69
 
70
            return;
71
        }
72
 
73
        try {
74
            $suiteMethod = $testClass->getMethod(self::SUITE_METHODNAME);
75
 
76
            if (!$suiteMethod->isStatic()) {
77
                $this->runFailed(
78
                    'suite() method must be static.'
79
                );
80
 
81
                return;
82
            }
83
 
84
            try {
85
                $test = $suiteMethod->invoke(null, $testClass->getName());
86
            } catch (ReflectionException $e) {
87
                $this->runFailed(
88
                    sprintf(
89
                        "Failed to invoke suite() method.\n%s",
90
                        $e->getMessage()
91
                    )
92
                );
93
 
94
                return;
95
            }
96
        } catch (ReflectionException $e) {
97
            try {
98
                $test = new PHPUnit_Framework_TestSuite($testClass);
99
            } catch (PHPUnit_Framework_Exception $e) {
100
                $test = new PHPUnit_Framework_TestSuite;
101
                $test->setName($suiteClassName);
102
            }
103
        }
104
 
105
        $this->clearStatus();
106
 
107
        return $test;
108
    }
109
 
110
    /**
111
     * Returns the loaded ReflectionClass for a suite name.
112
     *
113
     * @param string $suiteClassName
114
     * @param string $suiteClassFile
115
     *
116
     * @return ReflectionClass
117
     */
118
    protected function loadSuiteClass($suiteClassName, $suiteClassFile = '')
119
    {
120
        $loader = $this->getLoader();
121
 
122
        return $loader->load($suiteClassName, $suiteClassFile);
123
    }
124
 
125
    /**
126
     * Clears the status message.
127
     */
128
    protected function clearStatus()
129
    {
130
    }
131
 
132
    /**
133
     * Override to define how to handle a failed loading of
134
     * a test suite.
135
     *
136
     * @param string $message
137
     */
138
    abstract protected function runFailed($message);
139
}