DiffParserTest   A
last analyzed

Complexity

Total Complexity 9

Size/Duplication

Total Lines 285
Duplicated Lines 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 135
c 1
b 0
f 0
dl 0
loc 285
rs 10
wmc 9

5 Methods

Rating   Name   Duplication   Size   Complexity  
B dataProvider() 0 206 1
A assertOriginalFileNameSame() 0 5 1
A testDiffParser() 0 25 3
A assertLineMutation() 0 12 2
A assertLineMutations() 0 6 2
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
final class DiffParserTest extends TestCase
16
{
17
    use ResourceLoaderTrait;
18
19
    /**
20
     * @return array<string,array{string, array<int,array{0: OriginalFileName|null, 1: NewFileName, 2: bool, 3: bool, 4: list<LineMutation>}>}>
0 ignored issues
show
Documentation Bug introduced by
The doc comment array<string,array{strin... list<LineMutation>}>}> at position 6 could not be parsed: Expected ':' at position 6, but found 'string'.
Loading history...
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
     *
238
     * @param array<int,array{0: OriginalFileName|null, 1: NewFileName, 2: bool, 3: bool, 4: list<LineMutation>}> $expectedFileMutations
0 ignored issues
show
Documentation Bug introduced by
The doc comment array<int,array{0: Origi...4: list<LineMutation>}> at position 26 could not be parsed: Expected '}' at position 26, but found 'list'.
Loading history...
239
     */
240
    public function testDiffParser(string $inputFile, array $expectedFileMutations): void
241
    {
242
        $diffAsString = $this->getResource("validDiffs/$inputFile");
243
244
        $parser = new Parser();
245
        $fileMutations = $parser->parseDiff($diffAsString);
246
247
        // Add assertion so we don't get risky assertion warnings for diffs with no mutations
248
        $expectedFileMutationsCount = count($expectedFileMutations);
249
        $actualFileMutationsCount = $fileMutations->getCount();
250
251
        $this->assertSame($expectedFileMutationsCount, $actualFileMutationsCount);
252
253
        foreach ($expectedFileMutations as [$originalFileName, $newFileName, $isAdded, $isDeleted, $lineMutations]) {
254
            $actualFileMutation = $fileMutations->getFileMutation($newFileName);
255
            $this->assertNotNull($actualFileMutation, "No FileMutation for [{$newFileName->getFileName()}]");
256
257
            $this->assertSame($isAdded, $actualFileMutation->isAddedFile());
258
            $this->assertSame($isDeleted, $actualFileMutation->isDeletedFile());
259
260
            if (!$isAdded) {
261
                $this->assertOriginalFileNameSame($actualFileMutation->getOriginalFileName(), $originalFileName);
262
            }
263
264
            $this->assertLineMutations($actualFileMutation->getLineMutations(), $lineMutations);
265
        }
266
    }
267
268
    private function assertOriginalFileNameSame(?OriginalFileName $a, ?OriginalFileName $b): void
269
    {
270
        $this->assertNotNull($a);
271
        $this->assertNotNull($b);
272
        $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

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