Code Coverage
 
Classes and Traits
Functions and Methods
Lines
Total
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
3 / 3
CRAP
100.00% covered (success)
100.00%
19 / 19
AbstractExpectation
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
3 / 3
14
100.00% covered (success)
100.00%
19 / 19
 filterDefinition
100.00% covered (success)
100.00%
1 / 1
11
100.00% covered (success)
100.00%
14 / 14
 fromDefinition
100.00% covered (success)
100.00%
1 / 1
2
100.00% covered (success)
100.00%
4 / 4
 jsonSerialize
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
1 / 1
<?php
/**
 * Copyright (c) Tony Bogdanov <tonybogdanov@gmail.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */
namespace DataExpectation;
use DataExpectation\Exceptions\InvalidExpectationDefinitionException;
use DataExpectation\Exceptions\InvalidExpectationNameException;
/**
 * Class AbstractExpectation
 *
 * @package DataExpectation
 * @author Tony Bogdanov <tonybogdanov@gmail.com>
 */
abstract class AbstractExpectation implements ExpectationInterface {
    /**
     * @var string
     */
    protected static $namespace;
    /**
     * @param $data
     *
     * @return mixed
     * @throws InvalidExpectationNameException
     */
    protected static function filterDefinition( $data ) {
        if (
            ! is_array( $data ) || 2 !== count( $data ) ||
            ! isset( $data['expectationName'] ) || ! is_string( $data['expectationName'] ) ||
            ! isset( $data['expectationArguments'] ) || ! is_array( $data['expectationArguments'] )
        ) {
            if ( is_array( $data ) ) {
                return array_combine( array_keys( $data ), array_map( function ( $argument ) {
                    return static::filterDefinition( $argument );
                }, $data ) );
            }
            return $data;
        }
        if ( ! isset( static::$namespace ) ) {
            static::$namespace = implode( '\\', array_slice( explode( '\\', static::class ), 0, -1 ) );
        }
        $className = static::$namespace . '\\' . $data['expectationName'];
        if ( ! class_exists( $className ) || ! is_a( $className, ExpectationInterface::class, true ) ) {
            throw new InvalidExpectationNameException( $data['expectationName'] );
        }
        return new $className( ...array_map( function ( $argument ) {
            return static::filterDefinition( $argument );
        }, $data['expectationArguments'] ) );
    }
    /**
     * @param array $definition
     *
     * @return ExpectationInterface
     * @throws InvalidExpectationDefinitionException
     * @throws InvalidExpectationNameException
     */
    public static function fromDefinition( array $definition ): ExpectationInterface {
        $expectation = static::filterDefinition( $definition );
        if ( ! ( $expectation instanceof ExpectationInterface ) ) {
            throw new InvalidExpectationDefinitionException( $expectation );
        }
        return $expectation;
    }
    /**
     * @return array
     */
    public function jsonSerialize(): array {
        return [
            'expectationName' => array_slice( explode( '\\', static::class ), -1 )[0],
            'expectationArguments' => [],
        ];
    }
}