lithium\test\Unit::_compare PHP Method

_compare() protected method

Compare the expected with the result. If $result is null $expected equals $type and $result equals $expected.
protected _compare ( string $type, mixed $expected, mixed $result = null, string $trace = null ) : array
$type string The type of comparison either `'identical'` or `'equal'` (default).
$expected mixed The expected value.
$result mixed An optional result value, defaults to `null`
$trace string An optional trace used internally to track arrays and objects, defaults to `null`.
return array Data with the keys `trace'`, `'expected'` and `'result'`.
    protected function _compare($type, $expected, $result = null, $trace = null)
    {
        $compareTypes = function ($expected, $result, $trace) {
            $types = array('expected' => gettype($expected), 'result' => gettype($result));
            if ($types['expected'] !== $types['result']) {
                $expected = trim("({$types['expected']}) " . print_r($expected, true));
                $result = trim("({$types['result']}) " . print_r($result, true));
                return compact('trace', 'expected', 'result');
            }
        };
        if ($types = $compareTypes($expected, $result, $trace)) {
            return $types;
        }
        $data = array();
        if (!is_scalar($expected)) {
            foreach ($expected as $key => $value) {
                $newTrace = "{$trace}[{$key}]";
                $isObject = false;
                if (is_object($expected)) {
                    $isObject = true;
                    $expected = (array) $expected;
                    $result = (array) $result;
                }
                if (!array_key_exists($key, $result)) {
                    $trace = !$key ? null : $newTrace;
                    $expected = !$key ? $expected : $value;
                    $result = $key ? null : $result;
                    return compact('trace', 'expected', 'result');
                }
                $check = $result[$key];
                if ($isObject) {
                    $newTrace = $trace ? "{$trace}->{$key}" : $key;
                    $expected = (object) $expected;
                    $result = (object) $result;
                }
                if ($type === 'identical') {
                    if ($value === $check) {
                        if ($types = $compareTypes($value, $check, $trace)) {
                            return $types;
                        }
                        continue;
                    }
                    if ($check === array()) {
                        $trace = $newTrace;
                        return compact('trace', 'expected', 'result');
                    }
                    if (is_string($check)) {
                        $trace = $newTrace;
                        $expected = $value;
                        $result = $check;
                        return compact('trace', 'expected', 'result');
                    }
                } else {
                    if ($value == $check) {
                        if ($types = $compareTypes($value, $check, $trace)) {
                            return $types;
                        }
                        continue;
                    }
                    if (!is_array($value)) {
                        $trace = $newTrace;
                        return compact('trace', 'expected', 'result');
                    }
                }
                $compare = $this->_compare($type, $value, $check, $newTrace);
                if ($compare !== true) {
                    $data[] = $compare;
                }
            }
            if (!empty($data)) {
                return $data;
            }
        } elseif (!is_scalar($result)) {
            $data = $this->_compare($type, $result, $expected);
            if (!empty($data)) {
                return array('trace' => $data['trace'], 'expected' => $data['result'], 'result' => $data['expected']);
            }
        }
        if ($type === 'identical' ? $expected === $result : $expected == $result) {
            if ($types = $compareTypes($expected, $result, $trace)) {
                return $types;
            }
            return true;
        }
        return compact('trace', 'expected', 'result');
    }

Usage Example

 public function compare($type, $expected, $result = null, $trace = null)
 {
     return parent::_compare($type, $expected, $result, $trace);
 }