Completed
Push — master ( 41ae82...437c90 )
by Dave
13s queued 11s
created

DiffParserTest   A

Complexity

Total Complexity 9

Size/Duplication

Total Lines 284
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
eloc 135
c 0
b 0
f 0
dl 0
loc 284
rs 10
wmc 9

5 Methods

Rating   Name   Duplication   Size   Complexity  
A assertOriginalFileNameSame() 0 5 1
A testDiffParser() 0 25 3
A assertLineMutation() 0 12 2
A assertLineMutations() 0 6 2
B dataProvider() 0 206 1
1
<?php
2
3
declare(strict_types=1);
4
5
namespace DaveLiddament\StaticAnalysisResultsBaseliner\Tests\Unit\Core\HistoryAnalyser\UnifiedDiffParser;
6
7
use DaveLiddament\StaticAnalysisResultsBaseliner\Domain\Common\LineNumber;
8
use DaveLiddament\StaticAnalysisResultsBaseliner\Domain\HistoryAnalyser\UnifiedDiffParser\LineMutation;
9
use DaveLiddament\StaticAnalysisResultsBaseliner\Domain\HistoryAnalyser\UnifiedDiffParser\NewFileName;
10
use DaveLiddament\StaticAnalysisResultsBaseliner\Domain\HistoryAnalyser\UnifiedDiffParser\OriginalFileName;
11
use DaveLiddament\StaticAnalysisResultsBaseliner\Domain\HistoryAnalyser\UnifiedDiffParser\Parser;
12
use DaveLiddament\StaticAnalysisResultsBaseliner\Tests\Helpers\ResourceLoaderTrait;
13
use PHPUnit\Framework\TestCase;
14
15
class DiffParserTest extends TestCase
16
{
17
    use ResourceLoaderTrait;
18
19
    /**
20
     * @psalm-return array<string,array{string, array<int,array{0: OriginalFileName|null, 1: NewFileName, bool, bool, list<LineMutation>}>  }>
21
     */
22
    public function dataProvider()
23
    {
24
        return [
25
            'fileChanged' => [
26
                'fileChanged.diff',
27
                [
28
                    [
29
                        new OriginalFileName('src/Person.php'),
30
                        new NewFileName('src/Person.php'),
31
                        false,
32
                        false,
33
                        [
34
                            LineMutation::newLineNumber(new LineNumber(18)),
35
                            LineMutation::newLineNumber(new LineNumber(19)),
36
                            LineMutation::newLineNumber(new LineNumber(20)),
37
                            LineMutation::newLineNumber(new LineNumber(21)),
38
                            LineMutation::newLineNumber(new LineNumber(22)),
39
                            LineMutation::originalLineNumber(new LineNumber(21)),
40
                            LineMutation::newLineNumber(new LineNumber(26)),
41
                            LineMutation::newLineNumber(new LineNumber(29)),
42
                            LineMutation::newLineNumber(new LineNumber(40)),
43
                            LineMutation::newLineNumber(new LineNumber(41)),
44
                            LineMutation::newLineNumber(new LineNumber(42)),
45
                            LineMutation::newLineNumber(new LineNumber(43)),
46
                            LineMutation::newLineNumber(new LineNumber(44)),
47
                            LineMutation::newLineNumber(new LineNumber(45)),
48
                            LineMutation::newLineNumber(new LineNumber(46)),
49
                            LineMutation::newLineNumber(new LineNumber(47)),
50
                        ],
51
                    ],
52
                ],
53
            ],
54
55
            'binaryFileAdded' => [
56
                'binaryFileAdded.diff',
57
                [
58
                    // No mutations expected
59
                ],
60
            ],
61
62
            'binaryFileChanged' => [
63
                'binaryFileChanged.diff',
64
                [
65
                    // No mutations expected
66
                ],
67
            ],
68
69
            'binaryFileDeleted' => [
70
                'binaryFileDeleted.diff',
71
                [
72
                    // No mutations expected
73
                ],
74
            ],
75
76
            'binaryFileRenamed' => [
77
                'binaryFileRenamed.diff',
78
                [
79
                    [
80
                        new OriginalFileName('img.png'),
81
                        new NewFileName('img1.png'),
82
                        false,
83
                        false,
84
                        [],
85
                    ],
86
                ],
87
            ],
88
89
            'fileAdded' => [
90
                'fileAdded.diff',
91
                [
92
                    [
93
                        null,
94
                        new NewFileName('src/Person.php'),
95
                        true,
96
                        false,
97
                        [],
98
                    ],
99
                ],
100
            ],
101
102
            'fileRenamed' => [
103
                'fileRenamed.diff',
104
                [
105
                    [
106
                        new OriginalFileName('src/Printer.php'),
107
                        new NewFileName('src/Foo.php'),
108
                        false,
109
                        false,
110
                        [],
111
                    ],
112
                ],
113
            ],
114
115
            'fileDeleted' => [
116
                'fileDeleted.diff',
117
                [
118
                    // Deleted files are not added to FileMutations as we don't care about them
119
                ],
120
            ],
121
122
            'fileRenamedAndChanged' => [
123
                'fileRenamedAndChanged.diff',
124
                [
125
                    [
126
                        new OriginalFileName('src/User.php'),
127
                        new NewFileName('src/Person.php'),
128
                        false,
129
                        false,
130
                        [
131
                            LineMutation::originalLineNumber(new LineNumber(9)),
132
                            LineMutation::newLineNumber(new LineNumber(9)),
133
                            LineMutation::originalLineNumber(new LineNumber(23)),
134
                            LineMutation::newLineNumber(new LineNumber(23)),
135
                        ],
136
                    ],
137
                ],
138
            ],
139
140
            'file1RenameFile2Changed' => [
141
                'file1RenameFile2Changed.diff',
142
                [
143
                    [
144
                        new OriginalFileName('src/Bar.php'),
145
                        new NewFileName('src/Baz.php'),
146
                        false,
147
                        false,
148
                        [],
149
                    ],
150
                    [
151
                        new OriginalFileName('src/User.php'),
152
                        new NewFileName('src/User.php'),
153
                        false,
154
                        false,
155
                        [
156
                            LineMutation::originalLineNumber(new LineNumber(8)),
157
                        ],
158
                    ],
159
                ],
160
            ],
161
162
            '2filesChanged' => [
163
                '2filesChanged.diff',
164
                [
165
                    [
166
                        new OriginalFileName('src/Baz.php'),
167
                        new NewFileName('src/Baz.php'),
168
                        false,
169
                        false,
170
                        [
171
                            LineMutation::originalLineNumber(new LineNumber(5)),
172
                        ],
173
                    ],
174
                    [
175
                        new OriginalFileName('src/User.php'),
176
                        new NewFileName('src/User.php'),
177
                        false,
178
                        false,
179
                        [
180
                            LineMutation::originalLineNumber(new LineNumber(5)),
181
                        ],
182
                    ],
183
                ],
184
            ],
185
            '1lineFileChanged' => [
186
                '1lineFileChanged.diff',
187
                [
188
                    [
189
                        new OriginalFileName('message.txt'),
190
                        new NewFileName('message.txt'),
191
                        false,
192
                        false,
193
                        [
194
                            LineMutation::originalLineNumber(new LineNumber(1)),
195
                            LineMutation::newLineNumber(new LineNumber(1)),
196
                        ],
197
                    ],
198
                ],
199
            ],
200
            '1lineTo2LinesFileChanged' => [
201
                '1lineTo2LinesFileChanged.diff',
202
                [
203
                    [
204
                        new OriginalFileName('message.txt'),
205
                        new NewFileName('message.txt'),
206
                        false,
207
                        false,
208
                        [
209
                            LineMutation::originalLineNumber(new LineNumber(1)),
210
                            LineMutation::newLineNumber(new LineNumber(1)),
211
                            LineMutation::newLineNumber(new LineNumber(2)),
212
                        ],
213
                    ],
214
                ],
215
            ],
216
            '2lineTo1LineFileChanged' => [
217
                '2lineTo1LineFileChanged.diff',
218
                [
219
                    [
220
                        new OriginalFileName('message.txt'),
221
                        new NewFileName('message.txt'),
222
                        false,
223
                        false,
224
                        [
225
                            LineMutation::originalLineNumber(new LineNumber(1)),
226
                            LineMutation::originalLineNumber(new LineNumber(2)),
227
                            LineMutation::newLineNumber(new LineNumber(1)),
228
                        ],
229
                    ],
230
                ],
231
            ],
232
        ];
233
    }
234
235
    /**
236
     * @dataProvider dataProvider
237
     * @psalm-param array<int,array{0: OriginalFileName|null, 1: NewFileName, bool, bool, list<LineMutation>}> $expectedFileMutations
238
     */
239
    public function testDiffParser(string $inputFile, array $expectedFileMutations): void
240
    {
241
        $diffAsString = $this->getResource("validDiffs/$inputFile");
242
243
        $parser = new Parser();
244
        $fileMutations = $parser->parseDiff($diffAsString);
245
246
        // Add assertion so we don't get risky assertion warnings for diffs with no mutations
247
        $expectedFileMutationsCount = count($expectedFileMutations);
248
        $actualFileMutationsCount = $fileMutations->getCount();
249
250
        $this->assertSame($expectedFileMutationsCount, $actualFileMutationsCount);
251
252
        foreach ($expectedFileMutations as list($originalFileName, $newFileName, $isAdded, $isDeleted, $lineMutations)) {
253
            $actualFileMutation = $fileMutations->getFileMutation($newFileName);
254
            $this->assertNotNull($actualFileMutation, "No FileMutation for [{$newFileName->getFileName()}]");
255
256
            $this->assertSame($isAdded, $actualFileMutation->isAddedFile());
257
            $this->assertSame($isDeleted, $actualFileMutation->isDeletedFile());
258
259
            if (!$isAdded) {
260
                $this->assertOriginalFileNameSame($actualFileMutation->getOriginalFileName(), $originalFileName);
261
            }
262
263
            $this->assertLineMutations($actualFileMutation->getLineMutations(), $lineMutations);
264
        }
265
    }
266
267
    private function assertOriginalFileNameSame(?OriginalFileName $a, ?OriginalFileName $b): void
268
    {
269
        $this->assertNotNull($a);
270
        $this->assertNotNull($b);
271
        $this->assertSame($a->getFileName(), $b->getFileName());
0 ignored issues
show
Bug introduced by
The method getFileName() does not exist on null. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

271
        $this->assertSame($a->getFileName(), $b->/** @scrutinizer ignore-call */ getFileName());

This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces.

This is most likely a typographical error or the method has been renamed.

Loading history...
272
    }
273
274
    /**
275
     * @psalm-param list<LineMutation> $expectedLineMutations
276
     * @psalm-param list<LineMutation> $actualLineMutations
277
     */
278
    private function assertLineMutations(array $expectedLineMutations, array $actualLineMutations): void
279
    {
280
        $this->assertCount(count($expectedLineMutations), $actualLineMutations);
281
        foreach ($expectedLineMutations as $i => $expectedLineMutation) {
282
            $actualLineMutation = $actualLineMutations[$i];
283
            $this->assertLineMutation($expectedLineMutation, $actualLineMutation, $i);
284
        }
285
    }
286
287
    private function assertLineMutation(
288
        ?LineMutation $expectedLineMutation,
289
        ?LineMutation $actualLineMutation,
290
        int $i
291
    ): void {
292
        if (null === $expectedLineMutation) {
293
            $this->assertNull($actualLineMutation, "Error with line mutation [$i]");
294
295
            return;
296
        }
297
298
        $this->assertTrue($expectedLineMutation->isEqual($actualLineMutation), "Error with line mutation [$i]");
299
    }
300
}
301