testFromIteratorBuffersAllChangesWithoutLoadingThemEagerly()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 35
Code Lines 19

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 19
c 1
b 0
f 0
nc 1
nop 0
dl 0
loc 35
rs 9.6333
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
The assignment to $stopProducingValues is dead and can be removed.
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