public function testReduce()
{
$this->assertEquals(6, reduce(function ($a, $b) {
return $a + $b;
}, [1, 2, 3]));
$this->assertEquals('abc', reduce(function ($a, $b) {
return $a . $b;
}, new \ArrayIterator(['a', 'b', 'c']), ''));
$this->assertEquals(64, reduce('pow', array('a' => 3, 'b' => 2, 'c' => 1), 2));
$this->assertEquals(0, reduce(function ($a, $b) {
return $a * $b;
}, [], 0));
$this->assertEquals(1, reduce(function ($a, $b) {
return $a * $b;
}, [], 1));
$this->assertEquals(6, call_user_func(reduce, function ($a, $b) {
return $a + $b;
}, [1, 2, 3]));
$this->assertEquals('\\nspl\\a\\reduce', reduce);
}