ClassBecameFinalTest::testDiffs()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 13
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 7
nc 1
nop 3
dl 0
loc 13
rs 10
c 0
b 0
f 0
1
<?php
2
3
declare(strict_types=1);
4
5
namespace RoaveTest\BackwardCompatibility\DetectChanges\BCBreak\ClassBased;
6
7
use PHPUnit\Framework\TestCase;
8
use Roave\BackwardCompatibility\Change;
9
use Roave\BackwardCompatibility\DetectChanges\BCBreak\ClassBased\ClassBecameFinal;
10
use Roave\BetterReflection\BetterReflection;
11
use Roave\BetterReflection\Reflection\ReflectionClass;
12
use Roave\BetterReflection\Reflector\ClassReflector;
13
use Roave\BetterReflection\SourceLocator\Type\StringSourceLocator;
14
use function array_map;
15
use function iterator_to_array;
16
17
final class ClassBecameFinalTest extends TestCase
18
{
19
    /**
20
     * @param string[] $expectedMessages
21
     *
22
     * @dataProvider classesToBeTested
23
     */
24
    public function testDiffs(
25
        ReflectionClass $fromClass,
26
        ReflectionClass $toClass,
27
        array $expectedMessages
28
    ) : void {
29
        $changes = (new ClassBecameFinal())
30
            ->__invoke($fromClass, $toClass);
31
32
        self::assertSame(
33
            $expectedMessages,
34
            array_map(static function (Change $change) : string {
35
                return $change->__toString();
36
            }, iterator_to_array($changes))
37
        );
38
    }
39
40
    /**
41
     * @return array<string, array<int, ReflectionClass|array<int, string>>>
42
     *
43
     * @psalm-return array<string, array{0: ReflectionClass, 1: ReflectionClass, 2: list<string>}>
44
     */
45
    public function classesToBeTested() : array
46
    {
47
        $locator       = (new BetterReflection())->astLocator();
48
        $fromReflector = new ClassReflector(new StringSourceLocator(
49
            <<<'PHP'
50
<?php
51
52
class A {}
53
final class B {}
54
class C {}
55
final class D {}
56
PHP
57
            ,
58
            $locator
59
        ));
60
        $toReflector   = new ClassReflector(new StringSourceLocator(
61
            <<<'PHP'
62
<?php
63
64
final class A {}
65
class B {}
66
class C {}
67
final class D {}
68
PHP
69
            ,
70
            $locator
71
        ));
72
73
        return [
74
            'A' => [
75
                $fromReflector->reflect('A'),
76
                $toReflector->reflect('A'),
77
                ['[BC] CHANGED: Class A became final'],
78
            ],
79
            'B' => [
80
                $fromReflector->reflect('B'),
81
                $toReflector->reflect('B'),
82
                [],
83
            ],
84
            'C' => [
85
                $fromReflector->reflect('C'),
86
                $toReflector->reflect('C'),
87
                [],
88
            ],
89
            'D' => [
90
                $fromReflector->reflect('D'),
91
                $toReflector->reflect('D'),
92
                [],
93
            ],
94
        ];
95
    }
96
}
97