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

ArrayMergerTest   A

Complexity

Total Complexity 18

Size/Duplication

Total Lines 240
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
wmc 18
eloc 120
dl 0
loc 240
rs 10
c 0
b 0
f 0

18 Methods

Rating   Name   Duplication   Size   Complexity  
A testMergingMoreThanTwoArrays() 0 11 1
A testStaticLastNonNull() 0 9 1
A testSequentialTopLevelArraysAreAppended() 0 19 1
A testDefaultFunctionality() 0 16 1
A testStaticSum() 0 9 1
A testStaticFirstNonNull() 0 9 1
A testStaticBoth() 0 9 1
A testSequentialChildArraysAreAppended() 0 11 1
A testStaticRandom() 0 9 1
A testStaticFirst() 0 9 1
A testStaticProduct() 0 9 1
A testSingleArrayReturnsTheArray() 0 7 1
A testNullsAreValuesWhenFirst() 0 11 1
A testInjectingDifferentValueMerger() 0 8 1
A testStaticLast() 0 9 1
A testNullsAreValuesWhenSecond() 0 11 1
A testStaticCalling() 0 9 1
A testNonRecursiveFunctionality() 0 14 1
1
<?php
2
3
namespace Graze\ArrayMerger\Test\Unit;
4
5
use Graze\ArrayMerger\ArrayMerger;
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 ArrayMergerTest extends TestCase
13
{
14
    public function testSingleArrayReturnsTheArray()
15
    {
16
        $merger = new ArrayMerger();
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 ArrayMerger();
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 ArrayMerger();
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 ArrayMerger(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 ArrayMerger(new FirstValue());
76
77
        $this->assertEquals(
78
            ['first', 'second'],
79
            $merger->merge($a, $b),
80
            "Expected a non appended array when the flag is not set"
81
        );
82
83
        $merger = new ArrayMerger(new FirstValue(), ArrayMerger::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' => ['a','c','d'], 'second' => 2];
95
        $b = ['first' => ['b','e'], 'second' => null];
96
97
        $merger = new ArrayMerger(new FirstValue(), ArrayMerger::FLAG_APPEND_VALUE_ARRAY);
98
99
        $this->assertEquals(
100
            ['first' => ['a','c','d','b','e'], 'second' => 2],
101
            $merger->merge($a, $b),
102
            "Expected appended child array"
103
        );
104
    }
105
106
    public function testNonRecursiveFunctionality()
107
    {
108
        $a = ['first' => 1, 'second' => ['a' => 2, 'b' => 3]];
109
        $b = ['first' => 'b', 'second' => ['a' => 'cake']];
110
111
        $merger = new ArrayMerger();
112
113
        $this->assertEquals(['first' => 'b', 'second' => ['a' => 'cake']], $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 ArrayMerger(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 ArrayMerger(new LastNonNullValue());
136
137
        $a = ['first' => 1, 'second' => null];
138
        $b = ['first' => 2, 'second' => 'pants'];
139
        $c = ['first' => null, 'second' => null, 'third' => 3];
140
141
        $this->assertEquals(
142
            ['first' => 2, 'second' => 'pants', 'third' => 3],
143
            $merger->merge($a, $b, $c)
144
        );
145
    }
146
147
    public function testStaticCalling()
148
    {
149
        $a = ['first' => 1, 'second' => 2];
150
        $b = ['first' => 'a', 'second' => 'b'];
151
152
        $this->assertEquals(
153
            ['first' => 'a', 'second' => 'b'],
154
            ArrayMerger::mergeUsing(new LastValue(), $a, $b),
155
            "Expected second result from merge"
156
        );
157
    }
158
159
    public function testStaticFirstNonNull()
160
    {
161
        $a = ['first' => 1, 'second' => null];
162
        $b = ['first' => null, 'second' => 'b'];
163
164
        $this->assertEquals(
165
            ['first' => 1, 'second' => 'b'],
166
            ArrayMerger::firstNonNull($a, $b),
167
            "Expected first non null result from merge"
168
        );
169
    }
170
171
    public function testStaticFirst()
172
    {
173
        $a = ['first' => 1, 'second' => null];
174
        $b = ['first' => null, 'second' => 'b'];
175
176
        $this->assertEquals(
177
            ['first' => 1, 'second' => null],
178
            ArrayMerger::first($a, $b),
179
            "Expected first result from merge"
180
        );
181
    }
182
183
    public function testStaticLastNonNull()
184
    {
185
        $a = ['first' => 1, 'second' => null];
186
        $b = ['first' => null, 'second' => 'b'];
187
188
        $this->assertEquals(
189
            ['first' => 1, 'second' => 'b'],
190
            ArrayMerger::lastNonNull($a, $b),
191
            "Expected last non null result from merge"
192
        );
193
    }
194
195
    public function testStaticLast()
196
    {
197
        $a = ['first' => 1, 'second' => null];
198
        $b = ['first' => null, 'second' => 'b'];
199
200
        $this->assertEquals(
201
            ['first' => null, 'second' => 'b'],
202
            ArrayMerger::last($a, $b),
203
            "Expected second result from merge"
204
        );
205
    }
206
207
    public function testStaticProduct()
208
    {
209
        $a = ['first' => 1, 'second' => null];
210
        $b = ['first' => 2, 'second' => 'b'];
211
212
        $this->assertEquals(
213
            ['first' => 2, 'second' => 'b'],
214
            ArrayMerger::product($a, $b),
215
            "Expected product result from merge"
216
        );
217
    }
218
219
    public function testStaticSum()
220
    {
221
        $a = ['first' => 1, 'second' => null];
222
        $b = ['first' => 2, 'second' => 'b'];
223
224
        $this->assertEquals(
225
            ['first' => 3, 'second' => 'b'],
226
            ArrayMerger::sum($a, $b),
227
            "Expected summed result from merge"
228
        );
229
    }
230
231
    public function testStaticBoth()
232
    {
233
        $a = ['first' => 1, 'second' => null];
234
        $b = ['first' => null, 'second' => 'b'];
235
236
        $this->assertEquals(
237
            ['first' => [1, null], 'second' => [null, 'b']],
238
            ArrayMerger::both($a, $b),
239
            "Expected both results from merge"
240
        );
241
    }
242
243
    public function testStaticRandom()
244
    {
245
        $a = ['first' => 1, 'second' => null];
246
        $b = ['first' => null, 'second' => 'b'];
247
248
        $this->assertArrayHasKey(
249
            'first',
250
            ArrayMerger::random($a, $b),
251
            "Expected a random result from merge"
252
        );
253
    }
254
}
255