blob: 90a5fa2ed55b83684573c6d11056d890b251b4e3 [file] [log] [blame]
<?php
namespace LdapRecord\Testing;
use LdapRecord\LdapRecordException;
use PHPUnit\Framework\Constraint\Constraint;
use PHPUnit\Framework\Constraint\IsEqual;
use UnexpectedValueException;
class LdapExpectation
{
/**
* The value to return from the expectation.
*
* @var mixed
*/
protected $value;
/**
* The exception to throw from the expectation.
*
* @var null|LdapRecordException|\Exception
*/
protected $exception;
/**
* The amount of times the expectation should be called.
*
* @var int
*/
protected $count = 1;
/**
* The method that the expectation belongs to.
*
* @var string
*/
protected $method;
/**
* The methods argument's.
*
* @var array
*/
protected $args = [];
/**
* Whether the same expectation should be returned indefinitely.
*
* @var bool
*/
protected $indefinitely = true;
/**
* Whether the expectation should return errors.
*
* @var bool
*/
protected $errors = false;
/**
* The error number to return.
*
* @var int
*/
protected $errorCode = 1;
/**
* The last error string to return.
*
* @var string
*/
protected $errorMessage = '';
/**
* The diagnostic message string to return.
*
* @var string
*/
protected $errorDiagnosticMessage = '';
/**
* Constructor.
*
* @param string $method
*/
public function __construct($method)
{
$this->method = $method;
}
/**
* Set the arguments that the operation should receive.
*
* @param mixed $args
*
* @return $this
*/
public function with($args)
{
$args = is_array($args) ? $args : func_get_args();
foreach ($args as $key => $arg) {
if (! $arg instanceof Constraint) {
$args[$key] = new IsEqual($arg);
}
}
$this->args = $args;
return $this;
}
/**
* Set the expected value to return.
*
* @param mixed $value
*
* @return $this
*/
public function andReturn($value)
{
$this->value = $value;
return $this;
}
/**
* The error message to return from the expectation.
*
* @param int $code
* @param string $error
* @param string $diagnosticMessage
*
* @return $this
*/
public function andReturnError($code = 1, $error = '', $diagnosticMessage = '')
{
$this->errors = true;
$this->errorCode = $code;
$this->errorMessage = $error;
$this->errorDiagnosticMessage = $diagnosticMessage;
return $this;
}
/**
* Set the expected exception to throw.
*
* @param string|\Exception|LdapRecordException $exception
*
* @return $this
*/
public function andThrow($exception)
{
if (is_string($exception)) {
$exception = new LdapRecordException($exception);
}
$this->exception = $exception;
return $this;
}
/**
* Set the expectation to be only called once.
*
* @return $this
*/
public function once()
{
return $this->times(1);
}
/**
* Set the expectation to be only called twice.
*
* @return $this
*/
public function twice()
{
return $this->times(2);
}
/**
* Set the expectation to be called the given number of times.
*
* @param int $count
*
* @return $this
*/
public function times($count = 1)
{
$this->indefinitely = false;
$this->count = $count;
return $this;
}
/**
* Get the method the expectation belongs to.
*
* @return string
*/
public function getMethod()
{
if (is_null($this->method)) {
throw new UnexpectedValueException('An expectation must have a method.');
}
return $this->method;
}
/**
* Get the expected call count.
*
* @return int
*/
public function getExpectedCount()
{
return $this->count;
}
/**
* Get the expected arguments.
*
* @return Constraint[]
*/
public function getExpectedArgs()
{
return $this->args;
}
/**
* Get the expected exception.
*
* @return null|\Exception|LdapRecordException
*/
public function getExpectedException()
{
return $this->exception;
}
/**
* Get the expected value.
*
* @return mixed
*/
public function getExpectedValue()
{
return $this->value;
}
/**
* Determine whether the expectation is returning an error.
*
* @return bool
*/
public function isReturningError()
{
return $this->errors;
}
/**
* @return int
*/
public function getExpectedErrorCode()
{
return $this->errorCode;
}
/**
* @return string
*/
public function getExpectedErrorMessage()
{
return $this->errorMessage;
}
/**
* @return string
*/
public function getExpectedErrorDiagnosticMessage()
{
return $this->errorDiagnosticMessage;
}
/**
* Decrement the call count of the expectation.
*
* @return $this
*/
public function decrementCallCount()
{
if (! $this->indefinitely) {
$this->count -= 1;
}
return $this;
}
}