Вход Регистрация
Файл: vendor/laravel/framework/src/Illuminate/Testing/Constraints/ArraySubset.php
Строк: 157
<?php

namespace IlluminateTestingConstraints;

use 
ArrayObject;
use 
PHPUnitFrameworkConstraintConstraint;
use 
SebastianBergmannComparatorComparisonFailure;
use 
Traversable;

/**
 * @internal This class is not meant to be used or overwritten outside the framework itself.
 */
final class ArraySubset extends Constraint
{
    
/**
     * @var iterable
     */
    
private $subset;

    
/**
     * @var bool
     */
    
private $strict;

    
/**
     * Create a new array subset constraint instance.
     *
     * @param  iterable  $subset
     * @param  bool  $strict
     * @return void
     */
    
public function __construct(iterable $subsetbool $strict false)
    {
        
$this->strict $strict;
        
$this->subset $subset;
    }

    
/**
     * Evaluates the constraint for parameter $other.
     *
     * If $returnResult is set to false (the default), an exception is thrown
     * in case of a failure. null is returned otherwise.
     *
     * If $returnResult is true, the result of the evaluation is returned as
     * a boolean value instead: true in case of success, false in case of a
     * failure.
     *
     * @param  mixed  $other
     * @param  string  $description
     * @param  bool  $returnResult
     * @return bool|null
     *
     * @throws PHPUnitFrameworkExpectationFailedException
     * @throws SebastianBergmannRecursionContextInvalidArgumentException
     */
    
public function evaluate($otherstring $description ''bool $returnResult false): ?bool
    
{
        
// type cast $other & $this->subset as an array to allow
        // support in standard array functions.
        
$other $this->toArray($other);
        
$this->subset $this->toArray($this->subset);

        
$patched array_replace_recursive($other$this->subset);

        if (
$this->strict) {
            
$result $other === $patched;
        } else {
            
$result $other == $patched;
        }

        if (
$returnResult) {
            return 
$result;
        }

        if (! 
$result) {
            
$f = new ComparisonFailure(
                
$patched,
                
$other,
                
var_export($patchedtrue),
                
var_export($othertrue)
            );

            
$this->fail($other$description$f);
        }

        return 
null;
    }

    
/**
     * Returns a string representation of the constraint.
     *
     * @return string
     *
     * @throws SebastianBergmannRecursionContextInvalidArgumentException
     */
    
public function toString(): string
    
{
        return 
'has the subset '.$this->exporter()->export($this->subset);
    }

    
/**
     * Returns the description of the failure.
     *
     * The beginning of failure messages is "Failed asserting that" in most
     * cases. This method should return the second part of that sentence.
     *
     * @param  mixed  $other
     * @return string
     *
     * @throws SebastianBergmannRecursionContextInvalidArgumentException
     */
    
protected function failureDescription($other): string
    
{
        return 
'an array '.$this->toString();
    }

    
/**
     * Returns the description of the failure.
     *
     * The beginning of failure messages is "Failed asserting that" in most
     * cases. This method should return the second part of that sentence.
     *
     * @param  iterable  $other
     * @return array
     */
    
private function toArray(iterable $other): array
    {
        if (
is_array($other)) {
            return 
$other;
        }

        if (
$other instanceof ArrayObject) {
            return 
$other->getArrayCopy();
        }

        if (
$other instanceof Traversable) {
            return 
iterator_to_array($other);
        }

        
// Keep BC even if we know that array would not be the expected one
        
return (array) $other;
    }
}
Онлайн: 0
Реклама