Passed
Pull Request — master (#38)
by Marco
02:23
created

ClassBecameTraitTest::testDiffs()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 13
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 13
rs 9.4285
c 0
b 0
f 0
cc 1
eloc 7
nc 1
nop 3
1
<?php
2
3
declare(strict_types=1);
4
5
namespace RoaveTest\ApiCompare\Comparator\BackwardsCompatibility\ClassBased;
6
7
use PHPUnit\Framework\TestCase;
8
use Roave\ApiCompare\Change;
9
use Roave\ApiCompare\Comparator\BackwardsCompatibility\ClassBased\ClassBecameTrait;
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_combine;
15
use function array_keys;
16
use function array_map;
17
use function iterator_to_array;
18
19
/**
20
 * @covers \Roave\ApiCompare\Comparator\BackwardsCompatibility\ClassBased\ClassBecameTrait
21
 */
22
final class ClassBecameTraitTest extends TestCase
23
{
24
    /**
25
     * @dataProvider classesToBeTested
26
     *
27
     * @param string[] $expectedMessages
28
     */
29
    public function testDiffs(
30
        ReflectionClass $fromClass,
31
        ReflectionClass $toClass,
32
        array $expectedMessages
33
    ) : void {
34
        $changes = (new ClassBecameTrait())
35
            ->compare($fromClass, $toClass);
36
37
        self::assertSame(
38
            $expectedMessages,
39
            array_map(function (Change $change) : string {
40
                return $change->__toString();
41
            }, iterator_to_array($changes))
42
        );
43
    }
44
45
    /** @return (string[]|ReflectionClass)[][] */
46
    public function classesToBeTested() : array
47
    {
48
        $locator       = (new BetterReflection())->astLocator();
49
        $fromReflector = new ClassReflector(new StringSourceLocator(
50
            <<<'PHP'
51
<?php
52
53
class ConcreteToAbstract {}
54
abstract class AbstractToConcrete {}
55
class ConcreteToConcrete {}
56
abstract class AbstractToAbstract {}
57
class ConcreteToInterface {}
58
interface InterfaceToConcrete {}
59
interface InterfaceToInterface {}
60
interface InterfaceToAbstract {}
61
abstract class AbstractToInterface {}
62
class ClassToTrait {}
63
trait TraitToClass {}
64
trait TraitToTrait {}
65
PHP
66
            ,
67
            $locator
68
        ));
69
        $toReflector   = new ClassReflector(new StringSourceLocator(
70
            <<<'PHP'
71
<?php
72
73
abstract class ConcreteToAbstract {}
74
class AbstractToConcrete {}
75
class ConcreteToConcrete {}
76
abstract class AbstractToAbstract {}
77
interface ConcreteToInterface {}
78
class InterfaceToConcrete {}
79
interface InterfaceToInterface {}
80
abstract class InterfaceToAbstract {}
81
interface AbstractToInterface {}
82
trait ClassToTrait {}
83
class TraitToClass {}
84
trait TraitToTrait {}
85
PHP
86
            ,
87
            $locator
88
        ));
89
90
        $classes = [
91
            'ConcreteToAbstract'   => [],
92
            'AbstractToConcrete'   => [],
93
            'ConcreteToConcrete'   => [],
94
            'AbstractToAbstract'   => [],
95
            'ConcreteToInterface'  => [],
96
            'InterfaceToConcrete'  => [],
97
            'InterfaceToInterface' => [],
98
            'InterfaceToAbstract'  => [],
99
            'AbstractToInterface'  => [],
100
            'ClassToTrait'         => ['[BC] CHANGED: Class ClassToTrait became a trait'],
101
            'TraitToClass'         => [],
102
            'TraitToTrait'         => [],
103
        ];
104
105
        return array_combine(
106
            array_keys($classes),
107
            array_map(
108
                function (string $className, array $errors) use ($fromReflector, $toReflector) : array {
109
                    return [
110
                        $fromReflector->reflect($className),
111
                        $toReflector->reflect($className),
112
                        $errors,
113
                    ];
114
                },
115
                array_keys($classes),
116
                $classes
117
            )
118
        );
119
    }
120
}
121