AncestorRemovedTest   A
last analyzed

Complexity

Total Complexity 2

Size/Duplication

Total Lines 90
Duplicated Lines 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 37
c 1
b 0
f 0
dl 0
loc 90
rs 10
wmc 2

2 Methods

Rating   Name   Duplication   Size   Complexity  
A interfacesToBeTested() 0 62 1
A testDiffs() 0 13 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\AncestorRemoved;
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\InterfaceBased\AncestorRemoved
22
 */
23
final class AncestorRemovedTest extends TestCase
24
{
25
    /**
26
     * @param string[] $expectedMessages
27
     *
28
     * @dataProvider interfacesToBeTested
29
     */
30
    public function testDiffs(
31
        ReflectionClass $fromInterface,
32
        ReflectionClass $toInterace,
33
        array $expectedMessages
34
    ) : void {
35
        $changes = (new AncestorRemoved())
36
            ->__invoke($fromInterface, $toInterace);
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 interfacesToBeTested() : array
52
    {
53
        $locator       = (new BetterReflection())->astLocator();
54
        $fromReflector = new ClassReflector(new StringSourceLocator(
55
            <<<'PHP'
56
<?php
57
58
interface IA {}
59
interface IB extends IA {}
60
interface IC extends IB {}
61
interface ID {}
62
interface ParentInterfaceAdded {}
63
interface ParentInterfaceRemoved extends IA {}
64
interface ParentInterfaceIndirectlyRemoved extends IB {}
65
interface ParentInterfaceVeryIndirectlyRemoved extends IC {}
66
interface ParentInterfaceOrderSwapped extends IA, ID {}
67
PHP
68
            ,
69
            $locator
70
        ));
71
        $toReflector   = new ClassReflector(new StringSourceLocator(
72
            <<<'PHP'
73
<?php
74
75
interface IA {}
76
interface IB {}
77
interface IC extends IB {}
78
interface ID {}
79
interface ParentInterfaceAdded extends IA {}
80
interface ParentInterfaceRemoved {}
81
interface ParentInterfaceIndirectlyRemoved extends IB {}
82
interface ParentInterfaceVeryIndirectlyRemoved extends IC {}
83
interface ParentInterfaceOrderSwapped extends ID, IA {}
84
PHP
85
            ,
86
            $locator
87
        ));
88
89
        $interfaces = [
90
            'IA' => [],
91
            'IB' => ['[BC] REMOVED: These ancestors of IB have been removed: ["IA"]'],
92
            'IC' => ['[BC] REMOVED: These ancestors of IC have been removed: ["IA"]'],
93
            'ParentInterfaceAdded' => [],
94
            'ParentInterfaceRemoved' => ['[BC] REMOVED: These ancestors of ParentInterfaceRemoved have been removed: ["IA"]'],
95
            'ParentInterfaceIndirectlyRemoved' => ['[BC] REMOVED: These ancestors of ParentInterfaceIndirectlyRemoved have been removed: ["IA"]'],
96
            'ParentInterfaceVeryIndirectlyRemoved' => ['[BC] REMOVED: These ancestors of ParentInterfaceVeryIndirectlyRemoved have been removed: ["IA"]'],
97
            'ParentInterfaceOrderSwapped' => [],
98
        ];
99
100
        return TypeRestriction::array(array_combine(
101
            array_keys($interfaces),
102
            array_map(
103
                /** @psalm-param list<string> $errors https://github.com/vimeo/psalm/issues/2772 */
104
                static function (string $interfaceName, array $errors) use ($fromReflector, $toReflector) : array {
105
                    return [
106
                        $fromReflector->reflect($interfaceName),
107
                        $toReflector->reflect($interfaceName),
108
                        $errors,
109
                    ];
110
                },
111
                array_keys($interfaces),
112
                $interfaces
113
            )
114
        ));
115
    }
116
}
117