Subversion-Projekte lars-tiefland.laravel_shop

Revision

Revision 148 | Details | Vergleich mit vorheriger | Letzte Änderung | Log anzeigen | RSS feed

Revision Autor Zeilennr. Zeile
148 lars 1
<?php declare(strict_types=1);
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
namespace PHPUnit\Runner;
11
 
12
use function array_diff;
13
use function array_values;
14
use function basename;
15
use function class_exists;
16
use function get_declared_classes;
17
use function sprintf;
18
use function stripos;
19
use function strlen;
20
use function substr;
21
use PHPUnit\Framework\TestCase;
22
use PHPUnit\Util\FileLoader;
23
use ReflectionClass;
24
use ReflectionException;
25
 
26
/**
27
 * @internal This class is not covered by the backward compatibility promise for PHPUnit
28
 *
29
 * @deprecated see https://github.com/sebastianbergmann/phpunit/issues/4039
30
 */
31
final class StandardTestSuiteLoader implements TestSuiteLoader
32
{
33
    /**
34
     * @throws Exception
35
     */
36
    public function load(string $suiteClassFile): ReflectionClass
37
    {
38
        $suiteClassName = basename($suiteClassFile, '.php');
39
        $loadedClasses  = get_declared_classes();
40
 
41
        if (!class_exists($suiteClassName, false)) {
42
            /* @noinspection UnusedFunctionResultInspection */
43
            FileLoader::checkAndLoad($suiteClassFile);
44
 
45
            $loadedClasses = array_values(
46
                array_diff(get_declared_classes(), $loadedClasses)
47
            );
48
 
49
            if (empty($loadedClasses)) {
150 lars 50
                throw new Exception(
51
                    sprintf(
52
                        'Class %s could not be found in %s',
53
                        $suiteClassName,
54
                        $suiteClassFile
55
                    )
56
                );
148 lars 57
            }
58
        }
59
 
60
        if (!class_exists($suiteClassName, false)) {
61
            $offset = 0 - strlen($suiteClassName);
62
 
63
            foreach ($loadedClasses as $loadedClass) {
64
                // @see https://github.com/sebastianbergmann/phpunit/issues/5020
65
                if (stripos(substr($loadedClass, $offset - 1), '\\' . $suiteClassName) === 0 ||
66
                    stripos(substr($loadedClass, $offset - 1), '_' . $suiteClassName) === 0) {
67
                    $suiteClassName = $loadedClass;
68
 
69
                    break;
70
                }
71
            }
72
        }
73
 
74
        if (!class_exists($suiteClassName, false)) {
150 lars 75
            throw new Exception(
76
                sprintf(
77
                    'Class %s could not be found in %s',
78
                    $suiteClassName,
79
                    $suiteClassFile
80
                )
81
            );
148 lars 82
        }
83
 
84
        try {
85
            $class = new ReflectionClass($suiteClassName);
86
            // @codeCoverageIgnoreStart
87
        } catch (ReflectionException $e) {
88
            throw new Exception(
89
                $e->getMessage(),
90
                $e->getCode(),
91
                $e
92
            );
93
        }
94
        // @codeCoverageIgnoreEnd
95
 
150 lars 96
        if ($class->isSubclassOf(TestCase::class)) {
97
            if ($class->isAbstract()) {
98
                throw new Exception(
99
                    sprintf(
100
                        'Class %s declared in %s is abstract',
101
                        $suiteClassName,
102
                        $suiteClassFile
103
                    )
104
                );
105
            }
106
 
148 lars 107
            return $class;
108
        }
109
 
110
        if ($class->hasMethod('suite')) {
111
            try {
112
                $method = $class->getMethod('suite');
113
                // @codeCoverageIgnoreStart
114
            } catch (ReflectionException $e) {
115
                throw new Exception(
150 lars 116
                    sprintf(
117
                        'Method %s::suite() declared in %s is abstract',
118
                        $suiteClassName,
119
                        $suiteClassFile
120
                    )
148 lars 121
                );
122
            }
123
 
150 lars 124
            if (!$method->isPublic()) {
125
                throw new Exception(
126
                    sprintf(
127
                        'Method %s::suite() declared in %s is not public',
128
                        $suiteClassName,
129
                        $suiteClassFile
130
                    )
131
                );
148 lars 132
            }
150 lars 133
 
134
            if (!$method->isStatic()) {
135
                throw new Exception(
136
                    sprintf(
137
                        'Method %s::suite() declared in %s is not static',
138
                        $suiteClassName,
139
                        $suiteClassFile
140
                    )
141
                );
142
            }
148 lars 143
        }
144
 
150 lars 145
        return $class;
148 lars 146
    }
147
 
148
    public function reload(ReflectionClass $aClass): ReflectionClass
149
    {
150
        return $aClass;
151
    }
152
}