1 | <?php |
||
2 | |||
3 | declare(strict_types=1); |
||
4 | |||
5 | namespace RoaveTest\BackwardCompatibility; |
||
6 | |||
7 | use Generator; |
||
8 | use PHPUnit\Framework\TestCase; |
||
9 | use Roave\BackwardCompatibility\Change; |
||
10 | use Roave\BackwardCompatibility\Changes; |
||
11 | use function array_fill; |
||
12 | use function iterator_to_array; |
||
13 | use function random_int; |
||
14 | use function serialize; |
||
15 | use function unserialize; |
||
16 | |||
17 | /** |
||
18 | * @covers \Roave\BackwardCompatibility\Changes |
||
19 | */ |
||
20 | final class ChangesTest extends TestCase |
||
21 | { |
||
22 | public function testMergeWith() : void |
||
23 | { |
||
24 | $changes1 = Changes::fromList(Change::changed('a', true)); |
||
25 | $changes2 = Changes::fromList(Change::removed('b', false)); |
||
26 | |||
27 | $frozen1 = unserialize(serialize($changes1)); |
||
28 | $frozen2 = unserialize(serialize($changes2)); |
||
29 | |||
30 | Assertion::assertChangesEqual( |
||
31 | Changes::fromList( |
||
32 | Change::changed('a', true), |
||
33 | Change::removed('b', false) |
||
34 | ), |
||
35 | $changes1->mergeWith($changes2) |
||
36 | ); |
||
37 | Assertion::assertChangesEqual( |
||
38 | Changes::fromList( |
||
39 | Change::removed('b', false), |
||
40 | Change::changed('a', true) |
||
41 | ), |
||
42 | $changes2->mergeWith($changes1) |
||
43 | ); |
||
44 | |||
45 | self::assertEquals($frozen1, $changes1, 'Original Changes instance not mutated'); |
||
46 | self::assertEquals($frozen2, $changes2, 'Original Changes instance not mutated'); |
||
47 | } |
||
48 | |||
49 | public function testFromIteratorBuffersAllChangesWithoutLoadingThemEagerly() : void |
||
50 | { |
||
51 | $stopProducingValues = static function () : void { |
||
52 | self::fail('No values should have been produced'); |
||
53 | }; |
||
54 | |||
55 | $changesProvider = static function () use (&$stopProducingValues) : Generator { |
||
56 | $stopProducingValues(); |
||
57 | |||
58 | yield Change::changed('a', true); |
||
59 | |||
60 | $stopProducingValues(); |
||
61 | |||
62 | yield Change::changed('b', false); |
||
63 | }; |
||
64 | |||
65 | $changes = Changes::fromIterator($changesProvider()); |
||
66 | |||
67 | // Nesting one level deep - should still not traverse the iterator eagerly |
||
68 | $changes = Changes::fromIterator($changes); |
||
69 | $expectedChanges = [ |
||
70 | Change::changed('a', true), |
||
71 | Change::changed('b', false), |
||
72 | ]; |
||
73 | |||
74 | $stopProducingValues = static function () : void { |
||
0 ignored issues
–
show
Unused Code
introduced
by
![]() |
|||
75 | }; |
||
76 | |||
77 | self::assertEquals($expectedChanges, iterator_to_array($changes)); |
||
78 | self::assertEquals( |
||
79 | $expectedChanges, |
||
80 | iterator_to_array($changes), |
||
81 | 'Changes can be iterated upon more than once (they are buffered)' |
||
82 | ); |
||
83 | self::assertCount(2, $changes); |
||
84 | } |
||
85 | |||
86 | public function testMergeWithPreservesOriginalInstanceIfMergedWithEmptyChanges() : void |
||
87 | { |
||
88 | $changes = Changes::fromList(Change::changed('a', true)); |
||
89 | |||
90 | Assertion::assertChangesEqual($changes, $changes->mergeWith(Changes::empty())); |
||
91 | } |
||
92 | |||
93 | public function testFromList() : void |
||
94 | { |
||
95 | $change = Change::added('added', true); |
||
96 | |||
97 | self::assertSame( |
||
98 | [$change], |
||
99 | iterator_to_array(Changes::fromList($change)) |
||
100 | ); |
||
101 | } |
||
102 | |||
103 | public function testCount() : void |
||
104 | { |
||
105 | $count = random_int(1, 10); |
||
106 | |||
107 | self::assertCount( |
||
108 | $count, |
||
109 | Changes::fromList(...array_fill(0, $count, Change::added('foo', true))) |
||
110 | ); |
||
111 | } |
||
112 | } |
||
113 |