| 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
Loading history...
|
|||
| 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 |