function it_should_sort_on_priority(TaskInterface $task1, TaskInterface $task2, TaskInterface $task3, GrumPHP $grumPHP) { $this->beConstructedWith(array($task1, $task2, $task3)); $task1->getName()->willReturn('task1'); $task2->getName()->willReturn('task2'); $task3->getName()->willReturn('task3'); $grumPHP->getTaskMetadata('task1')->willReturn(array('priority' => 100)); $grumPHP->getTaskMetadata('task2')->willReturn(array('priority' => 200)); $grumPHP->getTaskMetadata('task3')->willReturn(array('priority' => 100)); $result = $this->sortByPriority($grumPHP); $result->shouldBeAnInstanceOf('GrumPHP\\Collection\\TasksCollection'); $result->count()->shouldBe(3); $tasks = $result->toArray(); $tasks[0]->shouldBe($task2); $tasks[1]->shouldBe($task1); $tasks[2]->shouldBe($task3); }
/** * This method sorts the tasks by highest priority first. * * @param GrumPHP $grumPHP * * @return TasksCollection */ public function sortByPriority(GrumPHP $grumPHP) { $priorityQueue = new SplPriorityQueue(); $stableSortIndex = PHP_INT_MAX; foreach ($this->getIterator() as $task) { $metadata = $grumPHP->getTaskMetadata($task->getName()); $priorityQueue->insert($task, array($metadata['priority'], $stableSortIndex--)); } return new TasksCollection(array_values(iterator_to_array($priorityQueue))); }