DiffHistoryAnalyserTest   A
last analyzed

Complexity

Total Complexity 16

Size/Duplication

Total Lines 125
Duplicated Lines 0 %

Importance

Changes 2
Bugs 0 Features 0
Metric Value
eloc 55
c 2
b 0
f 0
dl 0
loc 125
rs 10
wmc 16

16 Methods

Rating   Name   Duplication   Size   Complexity  
A assertPreviousLocation() 0 5 1
A testLineAddedAfter() 0 5 1
A testLineRemovedBefore() 0 5 1
A removeLine() 0 7 1
A getPreviousLocation() 0 8 1
A testNoFileMutations() 0 4 1
A testLineAddedBeforeAndFileNameChanged() 0 5 1
A testLineAdded() 0 5 1
A setUp() 0 3 1
A addLine() 0 7 1
A addFile() 0 5 1
A assertNoPreviousLocation() 0 3 1
A testFileAdded() 0 5 1
A testLineRemovedAfter() 0 5 1
A testLineAddedBefore() 0 5 1
A renameAndAddLine() 0 7 1
1
<?php
2
3
declare(strict_types=1);
4
5
namespace DaveLiddament\StaticAnalysisResultsBaseliner\Tests\Unit\Plugins\GitDiffHistoryAnalyser;
6
7
use DaveLiddament\StaticAnalysisResultsBaseliner\Domain\Common\LineNumber;
8
use DaveLiddament\StaticAnalysisResultsBaseliner\Domain\Common\PreviousLocation;
9
use DaveLiddament\StaticAnalysisResultsBaseliner\Domain\Common\RelativeFileName;
10
use DaveLiddament\StaticAnalysisResultsBaseliner\Domain\HistoryAnalyser\UnifiedDiffParser\internal\FileMutationBuilder;
11
use DaveLiddament\StaticAnalysisResultsBaseliner\Domain\HistoryAnalyser\UnifiedDiffParser\internal\FileMutationsBuilder;
12
use DaveLiddament\StaticAnalysisResultsBaseliner\Domain\HistoryAnalyser\UnifiedDiffParser\LineMutation;
13
use DaveLiddament\StaticAnalysisResultsBaseliner\Domain\HistoryAnalyser\UnifiedDiffParser\NewFileName;
14
use DaveLiddament\StaticAnalysisResultsBaseliner\Domain\HistoryAnalyser\UnifiedDiffParser\OriginalFileName;
15
use DaveLiddament\StaticAnalysisResultsBaseliner\Plugins\GitDiffHistoryAnalyser\DiffHistoryAnalyser;
16
use PHPUnit\Framework\TestCase;
17
18
final class DiffHistoryAnalyserTest extends TestCase
19
{
20
    private const FILE_1 = 'foo/one.txt';
21
    private const FILE_2 = 'bar/two.txt';
22
23
    /**
24
     * @var FileMutationsBuilder
25
     */
26
    private $fileMutationsBuilder;
27
28
    protected function setUp(): void
29
    {
30
        $this->fileMutationsBuilder = new FileMutationsBuilder();
31
    }
32
33
    public function testNoFileMutations(): void
34
    {
35
        $previousLocation = $this->getPreviousLocation(self::FILE_1, 1);
36
        $this->assertPreviousLocation(self::FILE_1, 1, $previousLocation);
37
    }
38
39
    public function testFileAdded(): void
40
    {
41
        $this->addFile(self::FILE_1);
42
        $previousLocation = $this->getPreviousLocation(self::FILE_1, 1);
43
        $this->assertNoPreviousLocation($previousLocation);
44
    }
45
46
    public function testLineAdded(): void
47
    {
48
        $this->addLine(self::FILE_1, 1);
49
        $previousLocation = $this->getPreviousLocation(self::FILE_1, 1);
50
        $this->assertNoPreviousLocation($previousLocation);
51
    }
52
53
    public function testLineAddedBefore(): void
54
    {
55
        $this->addLine(self::FILE_1, 1);
56
        $previousLocation = $this->getPreviousLocation(self::FILE_1, 2);
57
        $this->assertPreviousLocation(self::FILE_1, 1, $previousLocation);
58
    }
59
60
    public function testLineRemovedBefore(): void
61
    {
62
        $this->removeLine(self::FILE_1, 2);
63
        $previousLocation = $this->getPreviousLocation(self::FILE_1, 2);
64
        $this->assertPreviousLocation(self::FILE_1, 3, $previousLocation);
65
    }
66
67
    public function testLineRemovedAfter(): void
68
    {
69
        $this->removeLine(self::FILE_1, 5);
70
        $previousLocation = $this->getPreviousLocation(self::FILE_1, 2);
71
        $this->assertPreviousLocation(self::FILE_1, 2, $previousLocation);
72
    }
73
74
    public function testLineAddedAfter(): void
75
    {
76
        $this->addLine(self::FILE_1, 5);
77
        $previousLocation = $this->getPreviousLocation(self::FILE_1, 2);
78
        $this->assertPreviousLocation(self::FILE_1, 2, $previousLocation);
79
    }
80
81
    public function testLineAddedBeforeAndFileNameChanged(): void
82
    {
83
        $this->renameAndAddLine(self::FILE_1, self::FILE_2, 1);
84
        $previousLocation = $this->getPreviousLocation(self::FILE_2, 2);
85
        $this->assertPreviousLocation(self::FILE_1, 1, $previousLocation);
86
    }
87
88
    public function addFile(string $fileName): void
89
    {
90
        $fileMutationBuilder = new FileMutationBuilder($this->fileMutationsBuilder);
91
        $fileMutationBuilder->setNewFileName(new NewFileName($fileName));
92
        $fileMutationBuilder->build();
93
    }
94
95
    public function addLine(string $fileName, int $lineNumber): void
96
    {
97
        $fileMutationBuilder = new FileMutationBuilder($this->fileMutationsBuilder);
98
        $fileMutationBuilder->setOriginalFileName(new OriginalFileName($fileName));
99
        $fileMutationBuilder->setNewFileName(new NewFileName($fileName));
100
        $fileMutationBuilder->addLineMutation(LineMutation::newLineNumber(new LineNumber($lineNumber)));
101
        $fileMutationBuilder->build();
102
    }
103
104
    public function removeLine(string $fileName, int $lineNumber): void
105
    {
106
        $fileMutationBuilder = new FileMutationBuilder($this->fileMutationsBuilder);
107
        $fileMutationBuilder->setOriginalFileName(new OriginalFileName($fileName));
108
        $fileMutationBuilder->setNewFileName(new NewFileName($fileName));
109
        $fileMutationBuilder->addLineMutation(LineMutation::originalLineNumber(new LineNumber($lineNumber)));
110
        $fileMutationBuilder->build();
111
    }
112
113
    public function renameAndAddLine(string $originalFileName, string $newFileName, int $lineNumber): void
114
    {
115
        $fileMutationBuilder = new FileMutationBuilder($this->fileMutationsBuilder);
116
        $fileMutationBuilder->setOriginalFileName(new OriginalFileName($originalFileName));
117
        $fileMutationBuilder->setNewFileName(new NewFileName($newFileName));
118
        $fileMutationBuilder->addLineMutation(LineMutation::newLineNumber(new LineNumber($lineNumber)));
119
        $fileMutationBuilder->build();
120
    }
121
122
    private function getPreviousLocation(string $fileName, int $lineNumber): PreviousLocation
123
    {
124
        $fileMutations = $this->fileMutationsBuilder->build();
125
        $diffHistoryAnalyser = new DiffHistoryAnalyser($fileMutations);
126
127
        return $diffHistoryAnalyser->getPreviousLocation(
128
            new RelativeFileName($fileName),
129
            new LineNumber($lineNumber),
130
        );
131
    }
132
133
    private function assertPreviousLocation(string $fileName, int $lineNumber, PreviousLocation $previousLocation): void
134
    {
135
        $this->assertFalse($previousLocation->isNoPreviousLocation());
136
        $this->assertSame($fileName, $previousLocation->getRelativeFileName()->getFileName());
137
        $this->assertSame($lineNumber, $previousLocation->getLineNumber()->getLineNumber());
138
    }
139
140
    private function assertNoPreviousLocation(PreviousLocation $previousLocation): void
141
    {
142
        $this->assertTrue($previousLocation->isNoPreviousLocation());
143
    }
144
}
145