Completed
Pull Request — master (#30)
by Christian
02:15
created

FileListTest::testFileListQuery()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 14
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Importance

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