PropertyDocumentedTypeChangedTest   A
last analyzed

Complexity

Total Complexity 2

Size/Duplication

Total Lines 203
Duplicated Lines 0 %

Importance

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

2 Methods

Rating   Name   Duplication   Size   Complexity  
A testDiffs() 0 13 1
A propertiesToBeTested() 0 175 1
1
<?php
2
3
declare(strict_types=1);
4
5
namespace RoaveTest\BackwardCompatibility\DetectChanges\BCBreak\PropertyBased;
6
7
use PHPUnit\Framework\TestCase;
8
use Roave\BackwardCompatibility\Change;
9
use Roave\BackwardCompatibility\DetectChanges\BCBreak\PropertyBased\PropertyDocumentedTypeChanged;
10
use Roave\BetterReflection\BetterReflection;
11
use Roave\BetterReflection\Reflection\ReflectionProperty;
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\PropertyBased\PropertyDocumentedTypeChanged
22
 */
23
final class PropertyDocumentedTypeChangedTest extends TestCase
24
{
25
    /**
26
     * @param string[] $expectedMessages
27
     *
28
     * @dataProvider propertiesToBeTested
29
     */
30
    public function testDiffs(
31
        ReflectionProperty $fromProperty,
32
        ReflectionProperty $toProperty,
33
        array $expectedMessages
34
    ) : void {
35
        $changes = (new PropertyDocumentedTypeChanged())
36
            ->__invoke($fromProperty, $toProperty);
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, ReflectionProperty|array<int, string>>>
48
     *
49
     * @psalm-return array<string, array{0: ReflectionProperty, 1: ReflectionProperty, 2: list<string>}>
50
     */
51
    public function propertiesToBeTested() : array
52
    {
53
        $astLocator = (new BetterReflection())->astLocator();
54
55
        $fromLocator = new StringSourceLocator(
56
            <<<'PHP'
57
<?php
58
59
class TheClass {
60
    public $publicNoDocblockToNoDocblock;
61
    public $publicNoDocblockToDocblock;
62
    
63
    /**
64
     * Hi
65
     */
66
    public $publicNoTypeDocblockToDocblock;
67
    
68
    /**
69
     * @var int
70
     */
71
    public $publicDocblockToSameDocblock;
72
    
73
    /**
74
     * @var int
75
     */
76
    public $publicDocblockToDifferentDocblock;
77
    
78
    /**
79
     * @var int
80
     */
81
    public $publicDocblockToNoDocblock;
82
    
83
    /**
84
     * @var int|float
85
     */
86
    public $publicCompositeTypeDocblockToSameTypeDocblock;
87
    
88
    /**
89
     * @var int|float
90
     */
91
    public $publicCompositeTypeDocblockToSameTypeDocblockWithDifferentSorting;
92
    
93
    /**
94
     * @var int|float
95
     */
96
    public $publicCompositeTypeDocblockToDifferentCompositeTypeDocblock;
97
    
98
    /**
99
     * @var int
100
     */
101
    private $privateDocblockToDifferentDocblock;
102
    
103
    /**
104
     * @var int|int
105
     */
106
    private $duplicatePropertyTypesBeingDeduplicatedAreNotBcBreaks;
107
    
108
    /**
109
     * @var int
110
     */
111
    private $propertyTypeBeingDuplicatedAreNotBcBreaks;
112
113
    /**
114
     * @var GenericType<T1, T2>
115
     */ 
116
    public $propertyWithComplexDocblockThatCannotBeParsed;
117
}
118
PHP
119
            ,
120
            $astLocator
121
        );
122
123
        $toLocator = new StringSourceLocator(
124
            <<<'PHP'
125
<?php
126
127
class TheClass {
128
    public $publicNoDocblockToNoDocblock;
129
    
130
    /**
131
     * @var int
132
     */
133
    public $publicNoDocblockToDocblock;
134
    
135
    /**
136
     * @var int
137
     */
138
    public $publicNoTypeDocblockToDocblock;
139
    
140
    /**
141
     * @var int
142
     */
143
    public $publicDocblockToSameDocblock;
144
    
145
    /**
146
     * @var float
147
     */
148
    public $publicDocblockToDifferentDocblock;
149
    
150
    public $publicDocblockToNoDocblock;
151
    
152
    /**
153
     * @var int|float
154
     */
155
    public $publicCompositeTypeDocblockToSameTypeDocblock;
156
    
157
    /**
158
     * @var float|int
159
     */
160
    public $publicCompositeTypeDocblockToSameTypeDocblockWithDifferentSorting;
161
    
162
    /**
163
     * @var int|float|string
164
     */
165
    public $publicCompositeTypeDocblockToDifferentCompositeTypeDocblock;
166
    
167
    /**
168
     * @var float
169
     */
170
    private $privateDocblockToDifferentDocblock;
171
    
172
    /**
173
     * @var int
174
     */
175
    private $duplicatePropertyTypesBeingDeduplicatedAreNotBcBreaks;
176
    
177
    /**
178
     * @var int|int
179
     */
180
    private $propertyTypeBeingDuplicatedAreNotBcBreaks;
181
182
    /**
183
     * @var GenericType<T1, T2>
184
     */ 
185
    public $propertyWithComplexDocblockThatCannotBeParsed;
186
}
187
PHP
188
            ,
189
            $astLocator
190
        );
191
192
        $fromClassReflector = new ClassReflector($fromLocator);
193
        $toClassReflector   = new ClassReflector($toLocator);
194
        $fromClass          = $fromClassReflector->reflect('TheClass');
195
        $toClass            = $toClassReflector->reflect('TheClass');
196
197
        $properties = [
198
            'publicNoDocblockToNoDocblock'                                      => [],
199
            'publicNoDocblockToDocblock'                                        => [],
200
            'publicNoTypeDocblockToDocblock'                                    => ['[BC] CHANGED: Type documentation for property TheClass#$publicNoTypeDocblockToDocblock changed from having no type to int'],
201
            'publicDocblockToSameDocblock'                                      => [],
202
            'publicDocblockToDifferentDocblock'                                 => ['[BC] CHANGED: Type documentation for property TheClass#$publicDocblockToDifferentDocblock changed from int to float'],
203
            'publicDocblockToNoDocblock'                                        => ['[BC] CHANGED: Type documentation for property TheClass#$publicDocblockToNoDocblock changed from int to having no type'],
204
            'publicCompositeTypeDocblockToSameTypeDocblock'                     => [],
205
            'publicCompositeTypeDocblockToSameTypeDocblockWithDifferentSorting' => [],
206
            'publicCompositeTypeDocblockToDifferentCompositeTypeDocblock'       => ['[BC] CHANGED: Type documentation for property TheClass#$publicCompositeTypeDocblockToDifferentCompositeTypeDocblock changed from float|int to float|int|string'],
207
            'privateDocblockToDifferentDocblock'                                => ['[BC] CHANGED: Type documentation for property TheClass#$privateDocblockToDifferentDocblock changed from int to float'],
208
            'duplicatePropertyTypesBeingDeduplicatedAreNotBcBreaks'             => [],
209
            'propertyTypeBeingDuplicatedAreNotBcBreaks'                         => [],
210
            'propertyWithComplexDocblockThatCannotBeParsed'                     => [],
211
        ];
212
213
        return TypeRestriction::array(array_combine(
214
            array_keys($properties),
215
            array_map(
216
                /** @psalm-param list<string> $errorMessages https://github.com/vimeo/psalm/issues/2772 */
217
                static function (string $property, array $errorMessages) use ($fromClass, $toClass) : array {
218
                    return [
219
                        TypeRestriction::object($fromClass->getProperty($property)),
220
                        TypeRestriction::object($toClass->getProperty($property)),
221
                        $errorMessages,
222
                    ];
223
                },
224
                array_keys($properties),
225
                $properties
226
            )
227
        ));
228
    }
229
}
230