Completed
Push — master ( 899eaf...7feae9 )
by Dave
29s queued 14s
created

AbstractOutputFormatterTest::assertName()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 1
Metric Value
cc 1
eloc 2
c 1
b 0
f 1
nc 1
nop 1
dl 0
loc 4
rs 10
1
<?php
2
3
declare(strict_types=1);
4
5
namespace DaveLiddament\StaticAnalysisResultsBaseliner\Tests\Unit\Plugins\OutputFormatters;
6
7
use DaveLiddament\StaticAnalysisResultsBaseliner\Domain\Common\AbsoluteFileName;
8
use DaveLiddament\StaticAnalysisResultsBaseliner\Domain\Common\LineNumber;
9
use DaveLiddament\StaticAnalysisResultsBaseliner\Domain\Common\Location;
10
use DaveLiddament\StaticAnalysisResultsBaseliner\Domain\Common\ProjectRoot;
11
use DaveLiddament\StaticAnalysisResultsBaseliner\Domain\Common\Severity;
12
use DaveLiddament\StaticAnalysisResultsBaseliner\Domain\Common\Type;
13
use DaveLiddament\StaticAnalysisResultsBaseliner\Domain\OutputFormatter\OutputFormatter;
14
use DaveLiddament\StaticAnalysisResultsBaseliner\Domain\ResultsParser\AnalysisResult;
15
use DaveLiddament\StaticAnalysisResultsBaseliner\Domain\ResultsParser\AnalysisResults;
16
use DaveLiddament\StaticAnalysisResultsBaseliner\Domain\ResultsParser\AnalysisResultsBuilder;
17
use PHPUnit\Framework\TestCase;
18
19
abstract class AbstractOutputFormatterTest extends TestCase
20
{
21
    private const FILE_1 = '/FILE_1';
22
    private const FILE_2 = '/FILE_2';
23
    private const TYPE_1 = 'TYPE_1';
24
    private const TYPE_2 = 'TYPE_2';
25
26
    abstract protected function getOutputFormatter(): OutputFormatter;
27
28
    protected function assertName(string $expectedName): void
29
    {
30
        $outputFormatter = $this->getOutputFormatter();
31
        $this->assertSame($expectedName, $outputFormatter->getIdentifier());
32
    }
33
34
    protected function assertNoIssuesOutput(string $expectedOutput): void
35
    {
36
        $analysisResults = new AnalysisResults([]);
37
38
        $this->assertOutput($expectedOutput, $analysisResults);
39
    }
40
41
    protected function assertIssuesOutput(string $expectedOutput): void
42
    {
43
        $analysisResultsBuilder = new AnalysisResultsBuilder();
44
        $this->addAnalysisResult(
45
            $analysisResultsBuilder,
46
            self::FILE_1,
47
            10,
48
            self::TYPE_1,
49
            'MESSAGE_1',
50
            [
51
                'column' => '10',
52
            ],
53
            Severity::error(),
54
        );
55
        $this->addAnalysisResult(
56
            $analysisResultsBuilder,
57
            self::FILE_1,
58
            12,
59
            self::TYPE_2,
60
            'MESSAGE_2',
61
            [
62
                'column' => 'invalid',
63
            ],
64
            Severity::error(),
65
        );
66
        $this->addAnalysisResult(
67
            $analysisResultsBuilder,
68
            self::FILE_2,
69
            0,
70
            self::TYPE_1,
71
            'MESSAGE_3',
72
            [],
73
            Severity::warning()
74
        );
75
76
        $this->assertOutput($expectedOutput, $analysisResultsBuilder->build());
77
    }
78
79
    protected function assertIssuesOutputWithWarningsIgnored(string $expectedOutput): void
80
    {
81
        $analysisResultsBuilder = new AnalysisResultsBuilder();
82
        $this->addAnalysisResult(
83
            $analysisResultsBuilder,
84
            self::FILE_1,
85
            10,
86
            self::TYPE_1,
87
            'MESSAGE_1',
88
            [
89
                'column' => '10',
90
            ],
91
            Severity::error(),
92
        );
93
        $this->addAnalysisResult(
94
            $analysisResultsBuilder,
95
            self::FILE_1,
96
            12,
97
            self::TYPE_2,
98
            'MESSAGE_2',
99
            [
100
                'column' => 'invalid',
101
            ],
102
            Severity::error(),
103
        );
104
105
        $this->assertOutput($expectedOutput, $analysisResultsBuilder->build());
106
    }
107
108
    private function assertOutput(string $expectedOutput, AnalysisResults $analysisResults): void
109
    {
110
        $outputFormatter = $this->getOutputFormatter();
111
        $output = $outputFormatter->outputResults($analysisResults);
112
        $this->assertSame($expectedOutput, $output);
113
    }
114
115
    /** @param array<mixed> $data */
116
    private function addAnalysisResult(
117
        AnalysisResultsBuilder $analysisResultsBuilder,
118
        string $file,
119
        int $lineNumberAsInt,
120
        string $type,
121
        string $message,
122
        array $data,
123
        Severity $severity
124
    ): void {
125
        $projectRoot = ProjectRoot::fromCurrentWorkingDirectory('/');
126
        $absoluteFileName = new AbsoluteFileName($file);
127
        $lineNumber = new LineNumber($lineNumberAsInt);
128
        $location = Location::fromAbsoluteFileName($absoluteFileName, $projectRoot, $lineNumber);
129
130
        $analysisResult = new AnalysisResult($location, new Type($type), $message, $data, $severity);
131
132
        $analysisResultsBuilder->addAnalysisResult($analysisResult);
133
    }
134
}
135