View source
<?php
require_once __DIR__ . '/../lib/ArrayHelper.php';
class ArrayHelperTest extends DrupalUnitTestCase {
public static function getInfo() {
return array(
'name' => 'ArrayHelper',
'description' => 'Tests for the ArrayHelper class.',
'group' => 'Helper',
);
}
function testNestedValue() {
$input = array(
0 => array(
'test' => 'foo',
'keys' => array(
'first',
'a',
),
),
1 => (object) array(
'test' => 'bar',
'keys' => array(
'second',
'b',
),
),
2 => new ArrayHelperTestObject(array(
'test' => 'foo',
'keys' => array(
'third',
'c',
),
)),
);
$this
->assertIdentical(ArrayHelper::filterByNestedValue($input, array(
'test',
), 'foo'), array(
0 => $input[0],
2 => $input[2],
));
$this
->assertIdentical(ArrayHelper::filterByNestedValue($input, array(
'test',
), 'bar'), array(
1 => $input[1],
));
$this
->assertIdentical(ArrayHelper::filterByNestedValue($input, array(
'test',
), 'ferzle'), array());
$this
->assertIdentical(ArrayHelper::extractNestedValuesToArray($input, array(
'test',
)), array(
0 => 'foo',
1 => 'bar',
2 => 'foo',
));
$this
->assertIdentical(ArrayHelper::extractNestedValuesToArray($input, array(
'test',
), array(
'keys',
0,
)), array(
'first' => 'foo',
'second' => 'bar',
'third' => 'foo',
));
$this
->assertIdentical(ArrayHelper::extractNestedValuesToArray($input, array(
'test',
), array(
'keys',
1,
)), array(
'a' => 'foo',
'b' => 'bar',
'c' => 'foo',
));
$this
->assertIdentical(ArrayHelper::extractNestedValuesToArray($input, array(
'invalid',
)), array());
}
function testMapKeys() {
$input = array(
'a' => 1,
'b' => '1',
'c' => 1,
0 => '2',
1 => 2,
);
$expected = array(
'#a' => 1,
'#b' => '1',
'#c' => 1,
'#0' => '2',
'#1' => 2,
);
$result = ArrayHelper::mapKeys(function ($value) {
return '#' . $value;
}, $input);
$this
->assertIdentical($result, $expected);
}
function testFilterKeys() {
$input = array_fill_keys(range(0, 10), 'test');
$expected1 = array_fill_keys(array(
0,
3,
6,
9,
), 'test');
$expected2 = array_fill_keys(array(
1,
2,
4,
5,
7,
8,
10,
), 'test');
$result = ArrayHelper::filterKeys($input, function ($value) {
return $value % 3 === 0;
}, $input);
$this
->assertIdentical($result, $expected1);
$result = ArrayHelper::filterKeys($input, function ($value) {
return $value % 3;
}, $input);
$this
->assertIdentical($result, $expected2);
}
public function testSpliceAssociativeValues() {
$input = array(
0 => 'value1',
'key1' => 'value2',
1 => 'value3',
'key2' => 'value4',
);
$result = ArrayHelper::spliceAssociativeValues($input, array(
'newkey' => 'newvalue',
), 2);
$this
->assertIdentical($result, array(
0 => 'value1',
'key1' => 'value2',
'newkey' => 'newvalue',
1 => 'value3',
'key2' => 'value4',
));
$result = ArrayHelper::spliceAssociativeValues($input, array(
'newkey' => 'newvalue',
), 1, 1);
$this
->assertIdentical($result, array(
0 => 'value1',
'newkey' => 'newvalue',
1 => 'value3',
'key2' => 'value4',
));
$result = ArrayHelper::spliceAssociativeValues($input, array(
'newkey' => 'newvalue',
), 2, 1);
$this
->assertIdentical($result, array(
0 => 'value1',
'key1' => 'value2',
'newkey' => 'newvalue',
'key2' => 'value4',
));
}
public function testChunkEvenly() {
$input = array_combine(range(10, 1, -1), range(1, 10));
$result = ArrayHelper::chunkEvenly($input, 3);
$this
->assertIdentical($result, array(
0 => array(
1,
2,
3,
4,
),
1 => array(
5,
6,
7,
),
2 => array(
8,
9,
10,
),
));
$result = ArrayHelper::chunkEvenly($input, 4, TRUE);
$this
->assertIdentical($result, array(
0 => array(
10 => 1,
9 => 2,
8 => 3,
),
1 => array(
7 => 4,
6 => 5,
5 => 6,
),
2 => array(
4 => 7,
3 => 8,
),
3 => array(
2 => 9,
1 => 10,
),
));
$result = ArrayHelper::chunkEvenly($input, 11);
$this
->assertIdentical($result, array(
0 => array(
1,
),
1 => array(
2,
),
2 => array(
3,
),
3 => array(
4,
),
4 => array(
5,
),
5 => array(
6,
),
6 => array(
7,
),
7 => array(
8,
),
8 => array(
9,
),
9 => array(
10,
),
));
$this
->assertIdentical(ArrayHelper::chunkEvenly(array(), 1), array());
$this
->assertIdentical(ArrayHelper::chunkEvenly(array(), 5), array());
try {
$this
->assertIdentical(ArrayHelper::chunkEvenly($input, 0), array());
throw new Exception();
} catch (InvalidArgumentException $e) {
$this
->pass("InvalidArgumentException thrown.");
} catch (Exception $e) {
$this
->fail("InvalidArgumentException not thrown.");
}
try {
$this
->assertIdentical(ArrayHelper::chunkEvenly($input, 'invalid'), array());
throw new Exception();
} catch (InvalidArgumentException $e) {
$this
->pass("InvalidArgumentException thrown.");
} catch (Exception $e) {
$this
->fail("InvalidArgumentException not thrown.");
}
}
}
class ArrayHelperTestObject {
private $data;
public function __construct(array $data = array()) {
$this->data = $data;
}
public function __get($key) {
if (array_key_exists($key, $this->data)) {
return $this->data[$key];
}
}
public function __set($key, $value) {
$this->data[$key] = $value;
}
}