TraitBecameClassTest   A
last analyzed

Complexity

Total Complexity 2

Size/Duplication

Total Lines 85
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
eloc 36
c 0
b 0
f 0
dl 0
loc 85
rs 10
wmc 2

2 Methods

Rating   Name   Duplication   Size   Complexity  
A classesToBeTested() 0 57 1
A testDiffs() 0 13 1
1
<?php
2
3
declare(strict_types=1);
4
5
namespace RoaveTest\BackwardCompatibility\DetectChanges\BCBreak\TraitBased;
6
7
use PHPUnit\Framework\TestCase;
8
use Roave\BackwardCompatibility\Change;
9
use Roave\BackwardCompatibility\DetectChanges\BCBreak\TraitBased\TraitBecameClass;
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 RoaveTest\BackwardCompatibility\TypeRestriction;
15
use function array_combine;
16
use function array_keys;
17
use function array_map;
18
use function iterator_to_array;
19
20
/**
21
 * @covers \Roave\BackwardCompatibility\DetectChanges\BCBreak\TraitBased\TraitBecameClass
22
 */
23
final class TraitBecameClassTest extends TestCase
24
{
25
    /**
26
     * @param string[] $expectedMessages
27
     *
28
     * @dataProvider classesToBeTested
29
     */
30
    public function testDiffs(
31
        ReflectionClass $fromClass,
32
        ReflectionClass $toClass,
33
        array $expectedMessages
34
    ) : void {
35
        $changes = (new TraitBecameClass())
36
            ->__invoke($fromClass, $toClass);
37
38
        self::assertSame(
39
            $expectedMessages,
40
            array_map(static function (Change $change) : string {
41
                return $change->__toString();
42
            }, iterator_to_array($changes))
43
        );
44
    }
45
46
    /**
47
     * @return array<string, array<int, ReflectionClass|array<int, string>>>
48
     *
49
     * @psalm-return array<string, array{0: ReflectionClass, 1: ReflectionClass, 2: list<string>}>
50
     */
51
    public function classesToBeTested() : array
52
    {
53
        $locator       = (new BetterReflection())->astLocator();
54
        $fromReflector = new ClassReflector(new StringSourceLocator(
55
            <<<'PHP'
56
<?php
57
58
trait TraitToClass {}
59
trait TraitToInterface {}
60
class ClassToTrait {}
61
trait TraitToTrait {}
62
class ClassToClass {}
63
interface InterfaceToTrait {}
64
interface InterfaceToInterface {}
65
PHP
66
            ,
67
            $locator
68
        ));
69
        $toReflector   = new ClassReflector(new StringSourceLocator(
70
            <<<'PHP'
71
<?php
72
73
class TraitToClass {}
74
interface TraitToInterface {}
75
trait ClassToTrait {}
76
trait TraitToTrait {}
77
class ClassToClass {}
78
trait InterfaceToTrait {}
79
interface InterfaceToInterface {}
80
PHP
81
            ,
82
            $locator
83
        ));
84
85
        $classes = [
86
            'TraitToClass'         => ['[BC] CHANGED: Trait TraitToClass became a class'],
87
            'TraitToInterface'     => [],
88
            'ClassToTrait'         => [],
89
            'TraitToTrait'         => [],
90
            'ClassToClass'         => [],
91
            'InterfaceToTrait'     => [],
92
            'InterfaceToInterface' => [],
93
        ];
94
95
        return TypeRestriction::array(array_combine(
96
            array_keys($classes),
97
            array_map(
98
                /** @psalm-param list<string> $errors https://github.com/vimeo/psalm/issues/2772 */
99
                static function (string $className, array $errors) use ($fromReflector, $toReflector) : array {
100
                    return [
101
                        $fromReflector->reflect($className),
102
                        $toReflector->reflect($className),
103
                        $errors,
104
                    ];
105
                },
106
                array_keys($classes),
107
                $classes
108
            )
109
        ));
110
    }
111
}
112