/** * @dataProvider everything */ public function testThatAppendWithEmptyReturnsSameAsTheOriginalButReindexedKeys(\Pinq\ITraversable $traversable, array $data) { $appendedWithTraversable = $traversable->append([]); $appendedWithArray = $traversable->append([]); $appendedWithIterator = $traversable->append(new \ArrayObject([])); $this->assertMatches($appendedWithTraversable, array_values($data)); $this->assertMatches($appendedWithArray, array_values($data)); $this->assertMatches($appendedWithIterator, array_values($data)); }
/** * @dataProvider emptyData */ public function testThatUniqueMaintainsReferences(\Pinq\ITraversable $traversable) { $data = $this->makeRefs(array_merge(range(1, 10, 2), range(1, 10))); $traversable->append($data)->unique()->iterate(function (&$i) { $i *= 10; }); $this->assertSame([10, 30, 50, 70, 90, 1, 20, 3, 40, 5, 60, 7, 80, 9, 100], $data); }
/** * @dataProvider emptyData */ public function testThatSliceMaintainsReferences(\Pinq\ITraversable $traversable) { $data = $this->makeRefs(range('Z', 'A')); $traversable->append($data)->skip(10)->take(7)->slice(5, 3)->iterate(function (&$i) { $i = "-{$i}{$i}-"; }); $this->assertSame('ZYXWVUTSRQPONML-KK--JJ-IHGFEDCBA', implode('', $data)); }
/** * @dataProvider emptyData */ public function testThatWhereInMaintainsReferences(\Pinq\ITraversable $traversable) { $data = $this->makeRefs(range(100, 50, -10)); $traversable->append($data)->whereIn([70, 90])->iterate(function (&$i) { $i /= 10; }); $this->assertSame([100, 9, 80, 7, 60, 50], $data); }
/** * @dataProvider emptyData */ public function testThatIntersectMaintainsReferences(\Pinq\ITraversable $traversable) { $data = $this->makeRefs(range('A', 'Z', 2)); //Every 2nd letter: A, C, E, G... $traversable->append($data)->intersect(range('A', 'Z', 3))->iterate(function (&$i) { $i .= ':'; }); $this->assertSame(explode(' ', 'A: C E G: I K M: O Q S: U W Y:'), $data); }
/** * @dataProvider emptyData */ public function testThatIndexByMaintainsReferences(\Pinq\ITraversable $traversable) { $data = $this->makeRefs(range('A', 'G', 2)); $traversable->append($data)->indexBy(function ($i) { return $i . '-key'; })->iterate(function (&$i) { $i .= ':'; }); $this->assertSame(['A:', 'C:', 'E:', 'G:'], $data); }
/** * @dataProvider emptyData */ public function testThatSelectDoesNotMaintainReferences(\Pinq\ITraversable $traversable) { $data = $this->makeRefs(range('Z', 'A')); $traversable->append($data)->select(function &(&$i) { return $i; })->iterate(function (&$i) { $i .= $i; }); $this->assertSame(range('Z', 'A'), $data); }
/** * @dataProvider emptyData */ public function testThatWhereMaintainsReferences(\Pinq\ITraversable $traversable) { $data = $this->makeRefs(range(0, 30, 2)); $traversable->append($data)->where(function ($i) { return $i % 3 === 0; })->iterate(function (&$i) { $i .= '?'; }); $this->assertSame(['0?', 2, 4, '6?', 8, 10, '12?', 14, 16, '18?', 20, 22, '24?', 26, 28, '30?'], $data); }
/** * @dataProvider emptyData */ public function testThatReindexMaintainsReferences(\Pinq\ITraversable $traversable) { $data = $this->makeRefs(range('a', 'z')); $traversable->append($data)->indexBy(function ($i) { return $i; })->reindex()->iterate(function (&$i) { $i .= ';'; }); $this->assertSame('a;b;c;d;e;f;g;h;i;j;k;l;m;n;o;p;q;r;s;t;u;v;w;x;y;z;', implode('', $data)); }
/** * @dataProvider emptyData */ public function testThatSelectManyMaintainsReferences(\Pinq\ITraversable $traversable) { $data = $this->makeRefs(range(100, 1, -1)); $traversable->append($data)->groupBy(function ($i) { return $i % 3; })->selectMany(function (\Pinq\ITraversable $group) { return $group; })->iterate(function (&$i) { $i *= 10; }); $this->assertSame(range(1000, 10, -10), $data); }
/** * @dataProvider theImplementations */ public function testWithNonDeterministicQueryValuesAreNeverCached(\Pinq\ITraversable $traversable, array $data) { $query = $traversable->append(range(1, 50))->where(function ($i) { return (bool) mt_rand(0, 1); })->orderByDescending(function ($i) { return (int) ($i / 10); })->thenByAscending(function ($i) { return $i; })->slice(0, 50)->select(function ($i) { return ++$i; })->groupBy(function ($i) { return $i % 3; })->selectMany(function (\Pinq\ITraversable $group) { return $group; })->difference(range(15, 30, 2))->groupJoin(range(2, 10))->on(function ($i, $d) { return $i % $d === 0; })->to(function ($i, \Pinq\ITraversable $factors) { return $i . ':' . $factors->implode(','); }); $this->assertNotEquals($query->asArray(), $query->asArray()); }
public function visitOperation(Segments\Operation $query) { $otherValues = self::evaluateSource($query->getSource(), $this->resolvedParameters); switch ($query->getOperationType()) { case Segments\Operation::UNION: $this->traversable = $this->traversable->union($otherValues); break; case Segments\Operation::INTERSECT: $this->traversable = $this->traversable->intersect($otherValues); break; case Segments\Operation::DIFFERENCE: $this->traversable = $this->traversable->difference($otherValues); break; case Segments\Operation::APPEND: $this->traversable = $this->traversable->append($otherValues); break; case Segments\Operation::WHERE_IN: $this->traversable = $this->traversable->whereIn($otherValues); break; case Segments\Operation::EXCEPT: $this->traversable = $this->traversable->except($otherValues); break; } }
/** * @dataProvider emptyData */ public function testThatOrderByMaintainsReferences(\Pinq\ITraversable $traversable) { $data = $this->makeRefs(range(1, 100)); $traversable->append($data)->orderByAscending(function ($i) { return (int) ($i / 10); })->thenByDescending(function ($i) { return $i; })->iterate(function (&$i) { $i *= 10; }); $this->assertSame(range(10, 1000, 10), $data); }
/** * @dataProvider emptyData */ public function testThatInterationPassesReferences(\Pinq\ITraversable $traversable) { $data = $this->makeRefs(range('A', 'Z')); $traversable->append($data)->iterate(function (&$i) { $i = null; }); $this->assertSame(array_fill_keys(range(0, 25), null), $data); }
/** * @dataProvider emptyData */ public function testThatGroupByMaintainsArrayReferences(\Pinq\ITraversable $traversable, array $data) { $data = $this->makeRefs([[1], [2], [1, 2], [3, 5], [4, 2]]); $traversable->append($data)->groupBy(function ($i) { return count($i); })[2]->iterate(function (&$i) { $i['foo'] = $i[0]; }); $this->assertSame($data, [[1], [2], [1, 2, 'foo' => 1], [3, 5, 'foo' => 3], [4, 2, 'foo' => 4]]); }
/** * @dataProvider emptyData */ public function testThatGroupJoinOnEqualityMaintainsGroupedDataReferences(\Pinq\ITraversable $traversable) { $joinData = $this->makeRefs(range(1, 100)); $traversable->append(range(1, 100, 10))->groupJoin($joinData)->onEquality(function ($o) { return (int) ($o / 10); }, function ($i) { return (int) ($i / 10); })->to(function ($o, \Pinq\ITraversable $group) { return $group; })[3]->iterate(function (&$i) { $i *= 10; }); $this->assertSame(array_merge(range(1, 29), range(300, 390, 10), range(40, 100)), $joinData); }