/**
  * @param \SplFileInfo|string $cwd
  * @return PromiseInterface
  */
 public function enqueue($cwd = null)
 {
     $process = $this->factory->make($cwd);
     /** @var Promise $promise */
     $promise = new Promise(function () use($process, &$promise) {
         if ($process->isStarted()) {
             $process->wait();
         }
         $process->isSuccessful() ? $promise->resolve($process) : $promise->reject($process);
     });
     $this->queue->add($process);
     $process->setOptions([ProcessQueue::PROMISE_KEY => $promise]);
     return $promise;
 }
 /** @depends testAdd */
 public function testInvoke()
 {
     $queue = new ProcessQueue();
     $process = new Process('pwd');
     $queue->add($process);
     /** @var Process $pending */
     foreach ($queue() as $pending) {
         $this->assertInstanceOf(Process::class, $pending);
         $this->assertFalse($pending->isStarted());
         $pending->start();
     }
     $this->assertEmpty($queue);
     $this->assertCount(0, $queue);
     $this->assertTrue($process->isTerminated());
 }