/** * @dataProvider everything */ public function testThatIdenticalNonIntegerOrStringMapToTheSameScalarKey(\Pinq\ITraversable $traversable, array $data) { foreach ([new \stdClass(), [], [1], fopen('php://input', 'r'), 3.22, null, true] as $nonStringOrInt) { $withNonIntOrString = $traversable->indexBy(function () use($nonStringOrInt) { return $nonStringOrInt; }); $this->assertSame(empty($data) ? [] : [0 => reset($data)], $withNonIntOrString->asArray()); if (is_object($nonStringOrInt)) { //Cloned object longer identical, should map to individual keys $withNonIntOrString = $traversable->indexBy(function () use($nonStringOrInt) { return unserialize(serialize($nonStringOrInt)); }); $this->assertSame(array_values($data), $withNonIntOrString->asArray()); } } }
/** * @dataProvider assocMixedValues */ public function testThatKeysSupportNonScalarKeys(\Pinq\ITraversable $traversable, array $data) { $values = $traversable->indexBy(function () { return new \stdClass(); })->reindex(); $this->assertMatches($values, array_values($data)); }
/** * @dataProvider assocMixedValues */ public function testThatKeysSupportNonScalarKeys(\Pinq\ITraversable $traversable, array $data) { $keys = $traversable->indexBy(function () { return new \stdClass(); })->keys(); $expectedKeys = empty($data) ? [] : array_fill_keys(range(0, count($data) - 1), new \stdClass()); $this->assertEquals($expectedKeys, $keys->asArray()); }
/** * @dataProvider everything */ public function testThatIndexByDuplicateKeyWithForeachOnlyReturnsFirstAssociatedValue(\Pinq\ITraversable $traversable, array $data) { $indexedElements = $traversable->indexBy(function () { return null; }); $first = true; foreach ($indexedElements as $key => $element) { $this->assertSame($key, 0); $this->assertSame(reset($data), $element); $this->assertTrue($first); $first = false; } }
/** * @dataProvider dateTimes */ public function testGroupByDayOfWeekWithDateTimeKeys(\Pinq\ITraversable $traversable, array $data) { $datesGroupedByDayOfWeek = $traversable->indexBy(function (\DateTime $date) { return $date; })->select(function (\DateTime $date) { return $date->format('Y-m-d'); })->groupBy(function ($string, \DateTime $date) { return $date->format('l'); })->select(function (\Pinq\ITraversable $dateGroup) { return $dateGroup->keys()->asArray(); })->asArray(); $expectedDatesGroupedByDayOfWeek = []; foreach ($data as $date) { $dayOfWeek = $date->format('l'); if (!isset($expectedDatesGroupedByDayOfWeek[$dayOfWeek])) { $expectedDatesGroupedByDayOfWeek[$dayOfWeek] = []; } $expectedDatesGroupedByDayOfWeek[$dayOfWeek][] = $date; } $this->assertSame($expectedDatesGroupedByDayOfWeek, $datesGroupedByDayOfWeek); }
public function visitIndexBy(Segments\IndexBy $query) { $this->traversable = $this->traversable->indexBy($this->resolvedParameters[$query->getProjectionFunction()->getCallableId()]); }
/** * @dataProvider dates */ public function testThatOrderByMaintainsNonScalarKeys(\Pinq\ITraversable $dates, array $data) { $years = $dates->indexBy(function (\DateTime $date) { return $date; })->select(function (\DateTime $date) { return (int) $date->format('Y'); })->orderByDescending(function ($year, \DateTime $date) { return $year; })->select(function ($year, \DateTime $date) { return $date->format('Y'); })->implode(':'); $this->assertSame('2005:2004:2003:2002:2001:2000', $years); }