master

laravel/framework

Last updated at: 29/12/2023 09:23

FakeProcessSequence.php

TLDR

This file contains the FakeProcessSequence class, which is responsible for managing a sequence of fake process results or descriptions. It allows pushing new process results or descriptions onto the sequence and retrieving the next process in the sequence.

Methods

push

This method is used to push a new process result or description onto the sequence. It accepts a ProcessResultContract, FakeProcessDescription, an array, or a string as the process parameter. This method returns the FakeProcessSequence instance to allow for method chaining.

whenEmpty

This method is used to make the sequence return a default result when it is empty. It accepts a ProcessResultContract, FakeProcessDescription, an array, or a string as the process parameter. This method sets the failWhenEmpty property to false and assigns the emptyProcess property with the provided process result or description. It returns the FakeProcessSequence instance to allow for method chaining.

dontFailWhenEmpty

This method sets a default result of a FakeProcessResult when the sequence is empty. It internally calls the whenEmpty method with a new instance of FakeProcessResult as the process parameter and returns the FakeProcessSequence instance to allow for method chaining.

isEmpty

This method checks if the sequence is empty. It returns a boolean value indicating if the sequence has depleted all of its process results.

__invoke

This magic method allows invoking the FakeProcessSequence instance as if it were a function. It returns the next process in the sequence, which is either a ProcessResultContract or a FakeProcessDescription. Throws an OutOfBoundsException if the sequence is empty and failWhenEmpty is set to true.

Classes

There are no additional classes in this file.

<?php

namespace Illuminate\Process;

use Illuminate\Contracts\Process\ProcessResult as ProcessResultContract;
use OutOfBoundsException;

class FakeProcessSequence
{
    /**
     * The fake process results and descriptions.
     *
     * @var array
     */
    protected $processes = [];

    /**
     * Indicates that invoking this sequence when it is empty should throw an exception.
     *
     * @var bool
     */
    protected $failWhenEmpty = true;

    /**
     * The response that should be returned when the sequence is empty.
     *
     * @var \Illuminate\Contracts\Process\ProcessResult|\Illuminate\Process\FakeProcessDescription
     */
    protected $emptyProcess;

    /**
     * Create a new fake process sequence instance.
     *
     * @param  array  $processes
     * @return void
     */
    public function __construct(array $processes = [])
    {
        $this->processes = $processes;
    }

    /**
     * Push a new process result or description onto the sequence.
     *
     * @param  \Illuminate\Contracts\Process\ProcessResult|\Illuminate\Process\FakeProcessDescription|array|string  $process
     * @return $this
     */
    public function push(ProcessResultContract|FakeProcessDescription|array|string $process)
    {
        $this->processes[] = $this->toProcessResult($process);

        return $this;
    }

    /**
     * Make the sequence return a default result when it is empty.
     *
     * @param  \Illuminate\Contracts\Process\ProcessResult|\Illuminate\Process\FakeProcessDescription|array|string  $process
     * @return $this
     */
    public function whenEmpty(ProcessResultContract|FakeProcessDescription|array|string $process)
    {
        $this->failWhenEmpty = false;
        $this->emptyProcess = $this->toProcessResult($process);

        return $this;
    }

    /**
     * Convert the given result into an actual process result or description.
     *
     * @param  \Illuminate\Contracts\Process\ProcessResult|\Illuminate\Process\FakeProcessDescription|array|string  $process
     * @return \Illuminate\Contracts\Process\ProcessResult|\Illuminate\Process\FakeProcessDescription
     */
    protected function toProcessResult(ProcessResultContract|FakeProcessDescription|array|string $process)
    {
        return is_array($process) || is_string($process)
                ? new FakeProcessResult(output: $process)
                : $process;
    }

    /**
     * Make the sequence return a default result when it is empty.
     *
     * @return $this
     */
    public function dontFailWhenEmpty()
    {
        return $this->whenEmpty(new FakeProcessResult);
    }

    /**
     * Indicate that this sequence has depleted all of its process results.
     *
     * @return bool
     */
    public function isEmpty()
    {
        return count($this->processes) === 0;
    }

    /**
     * Get the next process in the sequence.
     *
     * @return \Illuminate\Contracts\Process\ProcessResult|\Illuminate\Process\FakeProcessDescription
     *
     * @throws \OutOfBoundsException
     */
    public function __invoke()
    {
        if ($this->failWhenEmpty && count($this->processes) === 0) {
            throw new OutOfBoundsException('A process was invoked, but the process result sequence is empty.');
        }

        if (! $this->failWhenEmpty && count($this->processes) === 0) {
            return value($this->emptyProcess ?? new FakeProcessResult);
        }

        return array_shift($this->processes);
    }
}