public function testSelectRejectSortBy() { // from js $numbers = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); $numbers = __u($numbers)->chain()->select(function ($n) { return $n % 2 === 0; })->reject(function ($n) { return $n % 4 === 0; })->sortBy(function ($n) { return -$n; })->value(); $this->assertEquals(array(10, 6, 2), $numbers, 'filtered and reversed the numbers in OO-style call'); $numbers = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); $numbers = __u::chain($numbers)->select(function ($n) { return $n % 2 === 0; })->reject(function ($n) { return $n % 4 === 0; })->sortBy(function ($n) { return -$n; })->value(); $this->assertEquals(array(10, 6, 2), $numbers, 'filtered and reversed the numbers in static call'); }
public function testSize() { // from js $items = (object) array('one' => 1, 'two' => 2, 'three' => 3); $this->assertEquals(3, __u::size($items), 'can compute the size of an object'); // extra $this->assertEquals(0, __u::size(array())); $this->assertEquals(1, __u::size(array(1))); $this->assertEquals(3, __u::size(array(1, 2, 3))); $this->assertEquals(6, __u::size(array(null, false, array(), array(1, 2, array('a', 'b')), 1, 2))); $this->assertEquals(3, __u(array(1, 2, 3))->size(), 'works with OO-style calls'); // docs $stooge = new StdClass(); $stooge->name = 'moe'; $stooge->age = 40; $this->assertEquals(2, __u::size($stooge)); }
public function testRange() { // from js $this->assertEquals(array(), __u::range(0), 'range with 0 as a first argument generates an empty array'); $this->assertEquals(array(0, 1, 2, 3), __u::range(4), 'range with a single positive argument generates an array of elements 0,1,2,...,n-1'); $this->assertEquals(array(5, 6, 7), __u::range(5, 8), 'range with two arguments a & b, a<b generates an array of elements a,a+1,a+2,...,b-2,b-1'); $this->assertEquals(array(), __u::range(8, 5), 'range with two arguments a & b, b<a generates an empty array'); $this->assertEquals(array(3, 6, 9), __u::range(3, 10, 3), 'range with three arguments a & b & c, c < b-a, a < b generates an array of elements a,a+c,a+2c,...,b - (multiplier of a) < c'); $this->assertEquals(array(3), __u::range(3, 10, 15), 'range with three arguments a & b & c, c > b-a, a < b generates an array with a single element, equal to a'); $this->assertEquals(array(12, 10, 8), __u::range(12, 7, -2), 'range with three arguments a & b & c, a > b, c < 0 generates an array of elements a,a-c,a-2c and ends with the number not less than b'); $this->assertEquals(array(0, -1, -2, -3, -4, -5, -6, -7, -8, -9), __u::range(0, -10, -1), 'final example in the Python docs'); // extra $this->assertEquals(array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9), __u::range(10)); $this->assertEquals(array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), __u::range(1, 11)); $this->assertEquals(array(0, 5, 10, 15, 20, 25), __u::range(0, 30, 5)); $this->assertEquals(array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9), __u(10)->range(), 'works in OO-style calls and 1 parameter'); $this->assertEquals(array(10, 11, 12), __u(10)->range(13), 'works in OO-style calls and 2 parameters'); $this->assertEquals(array(3, 6, 9), __u(3)->range(10, 3), 'works in OO-style calls and 3 parameters'); // docs $this->assertEquals(array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9), __u::range(10)); $this->assertEquals(array(1, 2, 3, 4), __u::range(1, 5)); $this->assertEquals(array(0, 5, 10, 15, 20, 25), __u::range(0, 30, 5)); $this->assertEquals(array(0, -1, -2, -3, -4), __u::range(0, -5, -1)); $this->assertEquals(array(), __u::range(0)); }
public function testEscape() { // from js $this->assertEquals('Curly & Moe', __u::escape('Curly & Moe')); $this->assertEquals('Curly &amp; Moe', __u::escape('Curly & Moe')); // extra $this->assertEquals('Curly & Moe', __u('Curly & Moe')->escape()); $this->assertEquals('Curly &amp; Moe', __u('Curly & Moe')->escape()); }
public function getInstance() { if (!isset(self::$_instance)) { $c = __CLASS__; self::$_instance = new $c(); } return self::$_instance; }
public function testTap() { // from js $intercepted = null; $interceptor = function ($obj) use(&$intercepted) { $intercepted = $obj; }; $returned = __u::tap(1, $interceptor); $this->assertEquals(1, $intercepted, 'passed tapped object to interceptor'); $this->assertEquals(1, $returned, 'returns tapped object'); $returned = __u(array(1, 2, 3))->chain()->map(function ($n) { return $n * 2; })->max()->tap($interceptor)->value(); $this->assertTrue($returned === 6 && $intercepted === 6, 'can use tapped objects in a chain'); $returned = __u::chain(array(1, 2, 3))->map(function ($n) { return $n * 2; })->max()->tap($interceptor)->value(); $this->assertTrue($returned === 6 && $intercepted === 6, 'can use tapped objects in a chain with static call'); // docs $interceptor = function ($obj) { return $obj * 2; }; $result = __u(array(1, 2, 3))->chain()->max()->tap($interceptor)->value(); $this->assertEquals(3, $result); }
public function testAfter() { // from js $testAfter = function ($afterAmount, $timesCalled) { $afterCalled = 0; $after = __u::after($afterAmount, function () use(&$afterCalled) { $afterCalled++; }); while ($timesCalled--) { $after(); } return $afterCalled; }; $this->assertEquals(1, $testAfter(5, 5), 'after(N) should fire after being called N times'); $this->assertEquals(0, $testAfter(5, 4), 'after(N) should not fire unless called N times'); $this->assertEquals(1, $testAfter(0, 0), 'after(0) should fire immediately'); // extra $testAfterAgain = function ($afterAmount, $timesCalled) { $afterCalled = 0; $after = __u($afterAmount)->after(function () use(&$afterCalled) { $afterCalled++; }); while ($timesCalled--) { $after(); } return $afterCalled; }; $this->assertEquals(1, $testAfterAgain(5, 5), 'after(N) should fire after being called N times in OO-style call'); $this->assertEquals(0, $testAfterAgain(5, 4), 'after(N) should not fire unless called N times in OO-style call'); // docs $str = ''; $func = __u::after(3, function () use(&$str) { $str = 'x'; }); $func(); $func(); $func(); $this->assertEquals('x', $str); }