Passed
Pull Request — master (#108)
by Marco
02:35
created

ChangesTest::testMergeWith()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 25
Code Lines 16

Duplication

Lines 0
Ratio 0 %

Importance

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