Completed
Pull Request — master (#37)
by Christian
02:07
created

FileListTest::fileListQueryDataProvider()   B

Complexity

Conditions 1
Paths 1

Size

Total Lines 173
Code Lines 117

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 173
rs 8.2857
cc 1
eloc 117
nc 1
nop 0

How to fix   Long Method   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
3
namespace uuf6429\ElderBrother\Action;
4
5
use uuf6429\ElderBrother\BaseProjectTest;
6
use uuf6429\ElderBrother\Change;
7
8
class FileListTest extends BaseProjectTest
9
{
10
    public static function setUpBeforeClass()
11
    {
12
        parent::setUpBeforeClass();
13
14
        foreach (
15
            [
16
                'src/Acme/Combinator.php' => '<?php namespace Acme; class Combinator {}',
17
                'src/Acme/Comparator.php' => '<?php namespace Acme; class Comparator {}',
18
                'src/Acme/config.yml' => '',
19
                'test/Acme/data.dml' => '',
20
                'test/Acme/AcmeTest.php' => '<?php namespace Acme; class AcmeTest extends \PHPUnit_Framework_TestCase {}',
21
                'README' => 'Please read me!',
22
                'LICENSE' => 'Copyright 1986',
23
                'CONTRIBUTE' => 'Meh.',
24
            ] as $filename => $content
25
        ) {
26
            if (!is_dir(dirname($filename))) {
27
                mkdir(dirname($filename), 0755, true);
28
            }
29
            file_put_contents($filename, $content);
30
        }
31
    }
32
33
    /**
34
     * @param string[] $expectedItems
35
     * @param \Closure $itemsProvider
36
     *
37
     * @dataProvider fileListQueryDataProvider
38
     */
39
    public function testFileListQuery($expectedItems, $itemsProvider)
40
    {
41
        $baseDir = getcwd();
42
        $actualItems = array_map(
43
            function ($file) use ($baseDir) {
44
                return str_replace([$baseDir . DIRECTORY_SEPARATOR, '\\'], ['', '/'], $file);
45
            },
46
            $itemsProvider()
47
        );
48
        sort($actualItems);
49
50
        $this->assertEquals($expectedItems, $actualItems);
51
        $this->assertSame($expectedItems, $actualItems);
52
    }
53
54
    /**
55
     * @return array
56
     */
57
    public function fileListQueryDataProvider()
58
    {
59
        return [
60
            // tests for filesystem item type
61
            'files' => [
62
                '$expectedItems' => [
63
                    'CONTRIBUTE',
64
                    'LICENSE',
65
                    'README',
66
                    'src/Acme/Combinator.php',
67
                    'src/Acme/Comparator.php',
68
                    'src/Acme/config.yml',
69
                    'test/Acme/AcmeTest.php',
70
                    'test/Acme/data.dml',
71
                ],
72
                '$itemsProvider' => function () {
73
                    return Change\FullChangeSet::get()->files()->toArray();
74
                },
75
            ],
76
            'directories' => [
77
                '$expectedItems' => [
78
                    'src',
79
                    'src/Acme',
80
                    'test',
81
                    'test/Acme',
82
                ],
83
                '$itemsProvider' => function () {
84
                    return Change\FullChangeSet::get()->directories()->toArray();
85
                },
86
            ],
87
88
            // tests for file name / path patterns
89
            'php files' => [
90
                '$expectedItems' => [
91
                    'src/Acme/Combinator.php',
92
                    'src/Acme/Comparator.php',
93
                    'test/Acme/AcmeTest.php',
94
                ],
95
                '$itemsProvider' => function () {
96
                    return Change\FullChangeSet::get()->name('*.php')->toArray();
97
                },
98
            ],
99
            'all items in src (3 files + 1 dir)' => [
100
                '$expectedItems' => [
101
                    'src/Acme',
102
                    'src/Acme/Combinator.php',
103
                    'src/Acme/Comparator.php',
104
                    'src/Acme/config.yml',
105
                ],
106
                '$itemsProvider' => function () {
107
                    return Change\FullChangeSet::get()->path('src/')->toArray();
108
                },
109
            ],
110
            'all items with Acme in their pathname' => [
111
                '$expectedItems' => [
112
                    'src/Acme',
113
                    'test/Acme',
114
                ],
115
                '$itemsProvider' => function () {
116
                    return Change\FullChangeSet::get()->name('Acme')->toArray();
117
                },
118
            ],
119
            'all php files not in src/' => [
120
                '$expectedItems' => [
121
                    'test/Acme/AcmeTest.php',
122
                ],
123
                '$itemsProvider' => function () {
124
                    return Change\FullChangeSet::get()->notPath('src/')->name('*.php')->toArray();
125
                },
126
            ],
127
128
            // tests for file contents
129
            'files containing "class"' => [
130
                '$expectedItems' => [
131
                    'src/Acme/Combinator.php',
132
                    'src/Acme/Comparator.php',
133
                    'test/Acme/AcmeTest.php',
134
                ],
135
                '$itemsProvider' => function () {
136
                    return Change\FullChangeSet::get()->contains('class')->toArray();
137
                },
138
            ],
139
            'base classes' => [
140
                '$expectedItems' => [
141
                    'src/Acme/Combinator.php',
142
                    'src/Acme/Comparator.php',
143
                ],
144
                '$itemsProvider' => function () {
145
                    return Change\FullChangeSet::get()
146
                        ->name('*.php')
147
                        ->notContains('/extends\\s+([\\w_\\\\]+)\\s*\\{/')
148
                        ->toArray();
149
                },
150
            ],
151
            'phpunit test classes' => [
152
                '$expectedItems' => [
153
                    'test/Acme/AcmeTest.php',
154
                ],
155
                '$itemsProvider' => function () {
156
                    return Change\FullChangeSet::get()
157
                        ->name('*.php')
158
                        ->contains('/class\\s+([\\w_]+)\\s+extends\\s\\\\?PHPUnit_Framework_TestCase\\s*{/')
159
                        ->toArray();
160
                },
161
            ],
162
            'files without ext' => [
163
                '$expectedItems' => [
164
                    'CONTRIBUTE',
165
                    'LICENSE',
166
                    'README',
167
                ],
168
                '$itemsProvider' => function () {
169
                    return Change\FullChangeSet::get()
170
                        ->files()
171
                        ->notName('*.*')
172
                        ->toArray();
173
                },
174
            ],
175
176
            // tests for custom filter
177
            'filter for some files' => [
178
                '$expectedItems' => [
179
                    'CONTRIBUTE',
180
                    'LICENSE',
181
                    'README',
182
                ],
183
                '$itemsProvider' => function () {
184
                    return Change\FullChangeSet::get()
185
                        ->filter(
186
                            function (\SplFileInfo $file) {
187
                                return in_array($file->getFilename(), ['README', 'LICENSE', 'CONTRIBUTE']);
188
                            }
189
                        )
190
                        ->toArray();
191
                },
192
            ],
193
194
            // tests for path depth
195
            'top level files' => [
196
                '$expectedItems' => [
197
                    'CONTRIBUTE',
198
                    'LICENSE',
199
                    'README',
200
                ],
201
                '$itemsProvider' => function () {
202
                    return Change\FullChangeSet::get()->files()->depth('< 2')->toArray();
203
                },
204
            ],
205
            'top level directories' => [
206
                '$expectedItems' => [
207
                    'src',
208
                    'src/Acme',
209
                    'test',
210
                    'test/Acme',
211
                ],
212
                '$itemsProvider' => function () {
213
                    return Change\FullChangeSet::get()->directories()->depth('< 2')->toArray();
214
                },
215
            ],
216
            'deep items' => [
217
                '$expectedItems' => [
218
                    'src/Acme/Combinator.php',
219
                    'src/Acme/Comparator.php',
220
                    'src/Acme/config.yml',
221
                    'test/Acme/AcmeTest.php',
222
                    'test/Acme/data.dml',
223
                ],
224
                '$itemsProvider' => function () {
225
                    return Change\FullChangeSet::get()->depth('> 1')->toArray();
226
                },
227
            ],
228
        ];
229
    }
230
}
231