BaseLineAnalysisResultTest   A
last analyzed

Complexity

Total Complexity 10

Size/Duplication

Total Lines 160
Duplicated Lines 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
wmc 10
eloc 73
dl 0
loc 160
rs 10
c 1
b 0
f 0

10 Methods

Rating   Name   Duplication   Size   Complexity  
A invalidArrayDataProvider() 0 29 1
A testIsMatchDifferentLineNumber() 0 8 1
A testIsMatchDifferentFileName() 0 8 1
A testIsActualMatch() 0 5 1
A testBuild() 0 8 1
A setUp() 0 6 1
A testIsMatchDifferentType() 0 5 1
A testConvertToAndFromArray() 0 17 1
A testInvalidArray() 0 4 1
A createBaseLineResult() 0 11 1
1
<?php
2
3
declare(strict_types=1);
4
5
namespace DaveLiddament\StaticAnalysisResultsBaseliner\Tests\Unit\Core\BaseLiner;
6
7
use DaveLiddament\StaticAnalysisResultsBaseliner\Domain\BaseLiner\BaseLineAnalysisResult;
8
use DaveLiddament\StaticAnalysisResultsBaseliner\Domain\Common\LineNumber;
9
use DaveLiddament\StaticAnalysisResultsBaseliner\Domain\Common\PreviousLocation;
10
use DaveLiddament\StaticAnalysisResultsBaseliner\Domain\Common\RelativeFileName;
11
use DaveLiddament\StaticAnalysisResultsBaseliner\Domain\Common\Severity;
12
use DaveLiddament\StaticAnalysisResultsBaseliner\Domain\Common\Type;
13
use DaveLiddament\StaticAnalysisResultsBaseliner\Domain\Utils\ArrayParseException;
14
use PHPUnit\Framework\TestCase;
15
16
final class BaseLineAnalysisResultTest extends TestCase
17
{
18
    private const FILE_NAME_1 = 'fileName1';
19
    private const FILE_NAME_2 = 'fileName2';
20
    private const LINE_NUMBER_1 = 1;
21
    private const LINE_NUMBER_2 = 2;
22
    private const TYPE_1 = 'TYPE_1';
23
    private const TYPE_2 = 'TYPE_2';
24
    private const MESSAGE_1 = 'MESSAGE_1';
25
26
    /**
27
     * @var RelativeFileName
28
     */
29
    private $relativeFileName;
30
31
    /**
32
     * @var LineNumber
33
     */
34
    private $lineNumber;
35
36
    /**
37
     * @var Type
38
     */
39
    private $type;
40
41
    /**
42
     * @var Severity
43
     */
44
    private $severity;
45
46
    protected function setUp(): void
47
    {
48
        $this->relativeFileName = new RelativeFileName(self::FILE_NAME_1);
49
        $this->lineNumber = new LineNumber(self::LINE_NUMBER_1);
50
        $this->type = new Type(self::TYPE_1);
51
        $this->severity = Severity::error();
52
    }
53
54
    public function testBuild(): void
55
    {
56
        $baseLineAnalysisResult = $this->createBaseLineResult();
57
58
        $this->assertSame($this->relativeFileName, $baseLineAnalysisResult->getFileName());
59
        $this->assertSame($this->lineNumber, $baseLineAnalysisResult->getLineNumber());
60
        $this->assertSame($this->type, $baseLineAnalysisResult->getType());
61
        $this->assertSame(self::MESSAGE_1, $baseLineAnalysisResult->getMessage());
62
    }
63
64
    public function testConvertToAndFromArray(): void
65
    {
66
        $originalResult = $this->createBaseLineResult();
67
68
        $asArray = $originalResult->asArray();
69
        $unserialisedBaseLineAnalysisResult = BaseLineAnalysisResult::fromArray($asArray);
70
71
        // Should not be identical objects
72
        $this->assertNotSame($this->relativeFileName, $unserialisedBaseLineAnalysisResult->getFileName());
73
        $this->assertNotSame($this->lineNumber, $unserialisedBaseLineAnalysisResult->getLineNumber());
74
        $this->assertNotSame($this->type, $unserialisedBaseLineAnalysisResult->getType());
75
76
        // Values should be the same though
77
        $this->assertTrue($this->relativeFileName->isEqual($unserialisedBaseLineAnalysisResult->getFileName()));
78
        $this->assertTrue($this->lineNumber->isEqual($unserialisedBaseLineAnalysisResult->getLineNumber()));
79
        $this->assertTrue($this->type->isEqual($unserialisedBaseLineAnalysisResult->getType()));
80
        $this->assertSame(self::MESSAGE_1, $unserialisedBaseLineAnalysisResult->getMessage());
81
    }
82
83
    public function testIsActualMatch(): void
84
    {
85
        $baseLineAnalysisResult = $this->createBaseLineResult();
86
        $location = PreviousLocation::fromFileNameAndLineNumber($this->relativeFileName, $this->lineNumber);
87
        $this->assertTrue($baseLineAnalysisResult->isMatch($location, new Type(self::TYPE_1)));
88
    }
89
90
    public function testIsMatchDifferentType(): void
91
    {
92
        $baseLineAnalysisResult = $this->createBaseLineResult();
93
        $location = PreviousLocation::fromFileNameAndLineNumber($this->relativeFileName, $this->lineNumber);
94
        $this->assertFalse($baseLineAnalysisResult->isMatch($location, new Type(self::TYPE_2)));
95
    }
96
97
    public function testIsMatchDifferentFileName(): void
98
    {
99
        $baseLineAnalysisResult = $this->createBaseLineResult();
100
        $previousLocation = PreviousLocation::fromFileNameAndLineNumber(
101
            new RelativeFileName(self::FILE_NAME_2),
102
            $this->lineNumber,
103
        );
104
        $this->assertFalse($baseLineAnalysisResult->isMatch($previousLocation, new Type(self::TYPE_1)));
105
    }
106
107
    public function testIsMatchDifferentLineNumber(): void
108
    {
109
        $baseLineAnalysisResult = $this->createBaseLineResult();
110
        $previousLocation = PreviousLocation::fromFileNameAndLineNumber(
111
            $this->relativeFileName,
112
            new LineNumber(self::LINE_NUMBER_2),
113
        );
114
        $this->assertFalse($baseLineAnalysisResult->isMatch($previousLocation, new Type(self::TYPE_1)));
115
    }
116
117
    /**
118
     * @return array<string,array{array<mixed>}>
0 ignored issues
show
Documentation Bug introduced by
The doc comment array<string,array{array<mixed>}> at position 6 could not be parsed: Expected ':' at position 6, but found 'array'.
Loading history...
119
     */
120
    public function invalidArrayDataProvider(): array
121
    {
122
        return [
123
            'missingLineNumber' => [
124
                [
125
                    'fileName' => self::FILE_NAME_1,
126
                    'type' => self::TYPE_1,
127
                    'message' => self::MESSAGE_1,
128
                ],
129
            ],
130
            'missingFileName' => [
131
                [
132
                    'lineNumber' => self::LINE_NUMBER_1,
133
                    'type' => self::TYPE_1,
134
                    'message' => self::MESSAGE_1,
135
                ],
136
            ],
137
            'missingType' => [
138
                [
139
                    'lineNumber' => self::LINE_NUMBER_1,
140
                    'fileName' => self::FILE_NAME_1,
141
                    'message' => self::MESSAGE_1,
142
                ],
143
            ],
144
            'missingMessage' => [
145
                [
146
                    'lineNumber' => self::LINE_NUMBER_1,
147
                    'fileName' => self::FILE_NAME_1,
148
                    'type' => self::TYPE_1,
149
                ],
150
            ],
151
        ];
152
    }
153
154
    /**
155
     * @dataProvider invalidArrayDataProvider
156
     *
157
     * @param array<mixed> $asArray
158
     */
159
    public function testInvalidArray(array $asArray): void
160
    {
161
        $this->expectException(ArrayParseException::class);
162
        BaseLineAnalysisResult::fromArray($asArray);
163
    }
164
165
    private function createBaseLineResult(): BaseLineAnalysisResult
166
    {
167
        $baseLineAnalysisResult = BaseLineAnalysisResult::make(
168
            $this->relativeFileName,
169
            $this->lineNumber,
170
            $this->type,
171
            self::MESSAGE_1,
172
            $this->severity,
173
        );
174
175
        return $baseLineAnalysisResult;
176
    }
177
}
178