Completed
Branch master (f24788)
by Harry
02:03
created

RecursiveArrayMergerTest   A

Complexity

Total Complexity 19

Size/Duplication

Total Lines 250
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
wmc 19
eloc 124
dl 0
loc 250
rs 10
c 0
b 0
f 0

19 Methods

Rating   Name   Duplication   Size   Complexity  
A testRecursiveFunctionality() 0 14 1
A testNullsAreValuesWhenFirst() 0 11 1
A testStaticRandom() 0 9 1
A testSingleArrayReturnsTheArray() 0 7 1
A testStaticCalling() 0 9 1
A testCallable() 0 8 1
A testMergingMoreThanTwoArrays() 0 11 1
A testStaticLast() 0 9 1
A testStaticProduct() 0 9 1
A testStaticFirst() 0 9 1
A testSequentialTopLevelArraysAreAppended() 0 19 1
A testInjectingDifferentValueMerger() 0 8 1
A testNullsAreValuesWhenSecond() 0 11 1
A testStaticBoth() 0 9 1
A testStaticFirstNonNull() 0 9 1
A testStaticSum() 0 9 1
A testStaticLastNonNull() 0 9 1
A testDefaultFunctionality() 0 16 1
A testSequentialChildArraysAreAppended() 0 11 1
1
<?php
2
3
namespace Graze\ArrayMerger\Test\Unit;
4
5
use Graze\ArrayMerger\RecursiveArrayMerger;
6
use Graze\ArrayMerger\Test\TestCase;
7
use Graze\ArrayMerger\ValueMerger\FirstNonNullValue;
8
use Graze\ArrayMerger\ValueMerger\FirstValue;
9
use Graze\ArrayMerger\ValueMerger\LastNonNullValue;
10
use Graze\ArrayMerger\ValueMerger\LastValue;
11
12
class RecursiveArrayMergerTest extends TestCase
13
{
14
    public function testSingleArrayReturnsTheArray()
15
    {
16
        $merger = new RecursiveArrayMerger();
17
18
        $this->assertEquals(
19
            ['a' => 1, 'b' => 2],
20
            $merger->merge(['a' => 1, 'b' => 2])
21
        );
22
    }
23
24
    public function testDefaultFunctionality()
25
    {
26
        $a = ['first' => 1, 'second' => 2];
27
        $b = ['first' => 'a', 'second' => 'b'];
28
29
        $merger = new RecursiveArrayMerger();
30
31
        $this->assertEquals(
32
            ['first' => 'a', 'second' => 'b'],
33
            $merger->merge($a, $b),
34
            "Expected second result from merge"
35
        );
36
37
        $c = ['first' => 'c'];
38
39
        $this->assertEquals(['first' => 'c', 'second' => 2], $merger->merge($a, $c), "Expected Merge of 'a' and 'c'");
40
    }
41
42
    public function testNullsAreValuesWhenSecond()
43
    {
44
        $a = ['first' => 1, 'second' => 2];
45
        $b = ['first' => 'a', 'second' => null];
46
47
        $merger = new RecursiveArrayMerger();
48
49
        $this->assertEquals(
50
            ['first' => 'a', 'second' => null],
51
            $merger->merge($a, $b),
52
            "Expected second result from merge"
53
        );
54
    }
55
56
    public function testNullsAreValuesWhenFirst()
57
    {
58
        $a = ['first' => null, 'second' => 2];
59
        $b = ['first' => 'a', 'second' => null];
60
61
        $merger = new RecursiveArrayMerger(new FirstValue());
62
63
        $this->assertEquals(
64
            ['first' => null, 'second' => 2],
65
            $merger->merge($a, $b),
66
            "Expected first result from merge"
67
        );
68
    }
69
70
    public function testSequentialTopLevelArraysAreAppended()
71
    {
72
        $a = ['first', 'second'];
73
        $b = ['third', 'fourth'];
74
75
        $merger = new RecursiveArrayMerger(new FirstValue());
76
77
        $this->assertEquals(
78
            ['first', 'second'],
79
            $merger->merge($a, $b),
80
            "Expected appended array"
81
        );
82
83
        $merger = new RecursiveArrayMerger(new FirstValue(), RecursiveArrayMerger::FLAG_APPEND_VALUE_ARRAY);
84
85
        $this->assertEquals(
86
            ['first', 'second', 'third', 'fourth'],
87
            $merger->merge($a, $b),
88
            "Expected appended array"
89
        );
90
    }
91
92
    public function testSequentialChildArraysAreAppended()
93
    {
94
        $a = ['first' => ['child' => ['a', 'c', 'd']], 'second' => 2];
95
        $b = ['first' => ['child' => ['b', 'e']], 'second' => null];
96
97
        $merger = new RecursiveArrayMerger(new FirstValue(), RecursiveArrayMerger::FLAG_APPEND_VALUE_ARRAY);
98
99
        $this->assertEquals(
100
            ['first' => ['child' => ['a', 'c', 'd', 'b', 'e']], 'second' => 2],
101
            $merger->merge($a, $b),
102
            "Expected appended child array"
103
        );
104
    }
105
106
    public function testRecursiveFunctionality()
107
    {
108
        $a = ['first' => 1, 'second' => ['a' => 2, 'b' => 3]];
109
        $b = ['first' => 'b', 'second' => ['a' => 'cake']];
110
111
        $merger = new RecursiveArrayMerger();
112
113
        $this->assertEquals(['first' => 'b', 'second' => ['a' => 'cake', 'b' => 3]], $merger->merge($a, $b));
114
115
        $c = ['third' => ['stuff' => 'beep']];
116
117
        $this->assertEquals(
118
            ['first' => 1, 'second' => ['a' => 2, 'b' => 3], 'third' => ['stuff' => 'beep']],
119
            $merger->merge($a, $c)
120
        );
121
    }
122
123
    public function testInjectingDifferentValueMerger()
124
    {
125
        $merger = new RecursiveArrayMerger(new FirstNonNullValue());
126
127
        $a = ['first' => 1, 'second' => null];
128
        $b = ['first' => 2, 'second' => 'pants'];
129
130
        $this->assertEquals(['first' => 1, 'second' => 'pants'], $merger->merge($a, $b));
131
    }
132
133
    public function testMergingMoreThanTwoArrays()
134
    {
135
        $merger = new RecursiveArrayMerger(new LastNonNullValue());
136
137
        $a = ['first' => 1, 'second' => ['a' => 2, 'b' => 3]];
138
        $b = ['first' => 'b', 'second' => ['a' => 'cake']];
139
        $c = ['first' => null, 'second' => ['a' => null, 'c ' => null]];
140
141
        $this->assertEquals(
142
            ['first' => 'b', 'second' => ['a' => 'cake', 'b' => 3, 'c ' => null]],
143
            $merger->merge($a, $b, $c)
144
        );
145
    }
146
147
    public function testCallable()
148
    {
149
        $merger = new RecursiveArrayMerger('max');
150
151
        $a = ['first' => 1, 'second' => 5];
152
        $b = ['first' => 2, 'second' => 2];
153
154
        $this->assertEquals(['first' => 2, 'second' => 5], $merger->merge($a, $b));
155
    }
156
157
    public function testStaticCalling()
158
    {
159
        $a = ['first' => 1, 'second' => 2];
160
        $b = ['first' => 'a', 'second' => 'b'];
161
162
        $this->assertEquals(
163
            ['first' => 'a', 'second' => 'b'],
164
            RecursiveArrayMerger::mergeUsing(new LastValue(), $a, $b),
165
            "Expected second result from merge"
166
        );
167
    }
168
169
    public function testStaticFirstNonNull()
170
    {
171
        $a = ['first' => 1, 'second' => null];
172
        $b = ['first' => null, 'second' => 'b'];
173
174
        $this->assertEquals(
175
            ['first' => 1, 'second' => 'b'],
176
            RecursiveArrayMerger::firstNonNull($a, $b),
177
            "Expected first non null result from merge"
178
        );
179
    }
180
181
    public function testStaticFirst()
182
    {
183
        $a = ['first' => 1, 'second' => null];
184
        $b = ['first' => null, 'second' => 'b'];
185
186
        $this->assertEquals(
187
            ['first' => 1, 'second' => null],
188
            RecursiveArrayMerger::first($a, $b),
189
            "Expected first result from merge"
190
        );
191
    }
192
193
    public function testStaticLastNonNull()
194
    {
195
        $a = ['first' => 1, 'second' => null];
196
        $b = ['first' => null, 'second' => 'b'];
197
198
        $this->assertEquals(
199
            ['first' => 1, 'second' => 'b'],
200
            RecursiveArrayMerger::lastNonNull($a, $b),
201
            "Expected last non null result from merge"
202
        );
203
    }
204
205
    public function testStaticLast()
206
    {
207
        $a = ['first' => 1, 'second' => null];
208
        $b = ['first' => null, 'second' => 'b'];
209
210
        $this->assertEquals(
211
            ['first' => null, 'second' => 'b'],
212
            RecursiveArrayMerger::last($a, $b),
213
            "Expected second result from merge"
214
        );
215
    }
216
217
    public function testStaticProduct()
218
    {
219
        $a = ['first' => 1, 'second' => null];
220
        $b = ['first' => 2, 'second' => 'b'];
221
222
        $this->assertEquals(
223
            ['first' => 2, 'second' => 'b'],
224
            RecursiveArrayMerger::product($a, $b),
225
            "Expected product result from merge"
226
        );
227
    }
228
229
    public function testStaticSum()
230
    {
231
        $a = ['first' => 1, 'second' => null];
232
        $b = ['first' => 2, 'second' => 'b'];
233
234
        $this->assertEquals(
235
            ['first' => 3, 'second' => 'b'],
236
            RecursiveArrayMerger::sum($a, $b),
237
            "Expected summed result from merge"
238
        );
239
    }
240
241
    public function testStaticBoth()
242
    {
243
        $a = ['first' => 1, 'second' => null];
244
        $b = ['first' => null, 'second' => 'b'];
245
246
        $this->assertEquals(
247
            ['first' => [1, null], 'second' => [null, 'b']],
248
            RecursiveArrayMerger::both($a, $b),
249
            "Expected both results from merge"
250
        );
251
    }
252
253
    public function testStaticRandom()
254
    {
255
        $a = ['first' => 1, 'second' => null];
256
        $b = ['first' => null, 'second' => 'b'];
257
258
        $this->assertArrayHasKey(
259
            'first',
260
            RecursiveArrayMerger::random($a, $b),
261
            "Expected a random result from merge"
262
        );
263
    }
264
}
265