InterfaceBecameClassTest   A
last analyzed

Complexity

Total Complexity 2

Size/Duplication

Total Lines 100
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
eloc 41
c 0
b 0
f 0
dl 0
loc 100
rs 10
wmc 2

2 Methods

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