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
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
<?php
namespace Codeception\Test;
use Codeception\Test\Loader\Cept as CeptLoader;
use Codeception\Test\Loader\Cest as CestLoader;
use Codeception\Test\Loader\Unit as UnitLoader;
use Codeception\Test\Loader\Gherkin as GherkinLoader;
use Symfony\Component\Finder\Finder;
/**
* Loads all Codeception supported test formats from a directory.
*
* ``` php
* <?php
* $testLoader = new \Codeception\TestLoader('tests/unit');
* $testLoader->loadTests();
* $tests = $testLoader->getTests();
* ?>
* ```
* You can load specific file
*
* ``` php
* <?php
* $testLoader = new \Codeception\TestLoader('tests/unit');
* $testLoader->loadTest('UserTest.php');
* $testLoader->loadTest('PostTest.php');
* $tests = $testLoader->getTests();
* ?>
* ```
* or a subdirectory
*
* ``` php
* <?php
* $testLoader = new \Codeception\TestLoader('tests/unit');
* $testLoader->loadTest('models'); // all tests from tests/unit/models
* $tests = $testLoader->getTests();
* ?>
* ```
*
*/
class Loader
{
protected $formats = [];
protected $tests = [];
protected $path;
public function __construct(array $suiteSettings)
{
$this->path = $suiteSettings['path'];
$this->formats = [
new CeptLoader(),
new CestLoader(),
new UnitLoader(),
new GherkinLoader($suiteSettings)
];
}
public function getTests()
{
return $this->tests;
}
protected function relativeName($file)
{
return str_replace([$this->path, '\\'], ['', '/'], $file);
}
protected function findPath($path)
{
if (!file_exists($path)
&& substr($path, -strlen('.php')) !== '.php'
&& file_exists($newPath = $path . '.php')
) {
return $newPath;
}
return $path;
}
protected function makePath($originalPath)
{
$path = $this->path . $this->relativeName($originalPath);
if (file_exists($newPath = $this->findPath($path))
|| file_exists($newPath = $this->findPath(getcwd() . "/{$originalPath}"))
) {
$path = $newPath;
}
if (!file_exists($path)) {
throw new \Exception("File or path $originalPath not found");
}
return $path;
}
public function loadTest($path)
{
$path = $this->makePath($path);
foreach ($this->formats as $format) {
/** @var $format Loader **/
if (preg_match($format->getPattern(), $path)) {
$format->loadTests($path);
$this->tests = $format->getTests();
return;
}
}
if (is_dir($path)) {
$currentPath = $this->path;
$this->path = $path;
$this->loadTests();
$this->path = $currentPath;
return;
}
throw new \Exception('Test format not supported. Please, check you use the right suffix. Available filetypes: Cept, Cest, Test');
}
public function loadTests($fileName = null)
{
if ($fileName) {
return $this->loadTest($fileName);
}
$finder = Finder::create()->files()->sortByName()->in($this->path)->followLinks();
foreach ($this->formats as $format) {
/** @var $format Loader **/
$formatFinder = clone($finder);
$testFiles = $formatFinder->name($format->getPattern());
foreach ($testFiles as $test) {
$pathname = str_replace(["//", "\\\\"], ["/", "\\"], $test->getPathname());
$format->loadTests($pathname);
}
$this->tests = array_merge($this->tests, $format->getTests());
}
}
}