phalconplus Documentation v1.0.0-rc-1
Class
Class PhalconPlus Assert

# Assertion

    namespace PhalconPlus\Assert;
    use PhalconPlus\Enum\AssertionCode;

    /**
     *
     * @ref https://github.com/beberlei/assert
     */
    class Assertion
    {
        protected static function createException(value, message, code, propertyPath, array constraints = [])
        {
            return new \PhalconPlus\Assert\InvalidArgumentException(message, code, propertyPath, value, constraints);
        }

        public static function eq(var value1, var value2, var message = null, var propertyPath = null) -> boolean
        {
            if value1 != value2 {
                var v1, v2;
                let v1 = self::stringify(value1);
                let v2 = self::stringify(value2);

                if message === null {
                    let message = "Value " . v1 . " does not equal expected value " . v2 . ".";
                }

                throw static::createException(value1, message, AssertionCode::INVALID_SAME, propertyPath, ["expected": value2]);
            }

            return true;
        }

        public static function notEq(var value1, var value2, var message = null, var propertyPath = null) -> boolean
        {
            if value1 == value2 {
                let message = sprintf(
                    message ? message : "Value \"%s\" is equal to expected value \"%s\".",
                    static::stringify(value1),
                    static::stringify(value2)
                );

                throw static::createException(value1, message, AssertionCode::INVALID_NOT_EQ, propertyPath, ["expected": value2]);
            }

            return true;
        }

        public static function same(var value1, var value2, var message = null, var propertyPath = null) -> boolean
        {
            if value1 !== value2 {
                var v1, v2;
                let v1 = self::stringify(value1);
                let v2 = self::stringify(value2);

                if message === null {
                    let message = "Value " . v1 . " does not equal expected value " . v2 . ".";
                }

                throw static::createException(value1, message, AssertionCode::INVALID_EQ, propertyPath
                                              , ["expected": value2]);
            }

            return true;
        }

        public static function notEmpty(var value, var message = null, var propertyPath = null) -> boolean
        {
            if empty value {
                var v1;
                let v1 = self::stringify(value);
                if message === null {
                    let message = "Value " . v1 . " is empty, but non empty value was expected.";
                }
                throw static::createException(value, message, AssertionCode::VALUE_EMPTY, propertyPath);
            }

            return true;
        }

        public static function notNull(var value, var message = null, var propertyPath = null) -> boolean
        {
            if value === null {
                var v1;
                let v1 = self::stringify(value);
                if message === null {
                    let message = "Value " . v1 . " is null, but non null value was expected.";
                }
                throw static::createException(value, message, AssertionCode::VALUE_NULL, propertyPath);
            }
            return true;
        }

        public static function numeric(var value, var message = null, var propertyPath = null) -> boolean
        {
            if !is_numeric(value) {
                var v1;
                let v1 = self::stringify(value);
                if message === null {
                    let message = "Value " . v1 . " is not numeric.";
                }
                throw static::createException(value, message, AssertionCode::INVALID_NUMERIC, propertyPath);
            }

            return true;
        }

        public static function range(var value, int minValue, int maxValue, var message = null, var propertyPath = null) -> boolean
        {
            static::numeric(value, message, propertyPath);
            if value < minValue || value > maxValue {
                let message = sprintf(
                    message ? message : "Number \"%s\" was expected to be at least \"%d\" and at most \"%d\".",
                    static::stringify(value),
                    static::stringify(minValue),
                    static::stringify(maxValue)
                );
                throw static::createException(value, message, AssertionCode::INVALID_RANGE, propertyPath
                                              , ["min": minValue, "max": maxValue]);
            }

            return true;
        }

        public static function min(var value, int minValue, var message = null, var propertyPath = null) -> boolean
        {
            static::numeric(value, message, propertyPath);

            if value < minValue {
                let message = sprintf(
                    message ? message : "Number \"%s\" was expected to be at least \"%s\".",
                    static::stringify(value),
                    static::stringify(minValue)
                );
                throw static::createException(value, message, AssertionCode::INVALID_MIN, propertyPath
                                              , ["min": minValue]);
            }

            return true;
        }

        public static function max(var value, int maxValue, var message = null, var propertyPath = null) -> boolean
        {
            static::numeric(value, message, propertyPath);

            if value > maxValue {
                let message = sprintf(
                    message ? message : "Number \"%s\" was expected to be at most \"%s\".",
                    static::stringify(value),
                    static::stringify(maxValue)
                );
                throw static::createException(value, message, AssertionCode::INVALID_MAX, propertyPath
                                              , ["max": maxValue]);
            }

            return true;
        }

        public static function isString(var value, var message = null, var propertyPath = null) -> boolean
        {
            if !is_string(value) {
                let message = sprintf(
                    message ? message : "Value \"%s\" expected to be string, type %s given.",
                    static::stringify(value),
                    gettype(value)
                );
                throw static::createException(value, message, AssertionCode::INVALID_STRING, propertyPath);
            }

            return true;
        }

        public static function isArray(var value, var message = null, var propertyPath = null) -> boolean
        {
            if !is_array(value) {
                let message = sprintf(
                    message ? message : "Value \"%s\" is not an array.",
                    static::stringify(value)
                );
                throw static::createException(value, message, AssertionCode::INVALID_ARRAY, propertyPath);
            }
            return true;
        }

        public static function isJsonString(var value, var message = null, var propertyPath = null) -> boolean
        {
            static::isString(value, message, propertyPath);
            if null == json_decode(value) && JSON_ERROR_NONE != json_last_error() {
                let message = sprintf(
                    message ? message : "Value \"%s\" is not a valid JSON string.",
                    static::stringify(value)
                );

                throw static::createException(value, message, AssertionCode::INVALID_JSON_STRING, propertyPath);
            }

            return true;
        }

        private static function stringify(value)
        {
            if is_bool(value) {
                return value == true ? "TRUE" : "FALSE";
            }

            if value === NULL {
                return "NULL";
            }

            var val;
            if is_scalar(value) {
                let val = (string) value;
                if strlen(val) > 100 {
                    let val = substr(val, 0, 96) . " ...";
                }
                return val;
            }

            if is_array(value) || is_object(value) || is_resource(value) {
                let val = print_r(value, true);
                let val = preg_replace("/\s+/", " ", val);
                if strlen(val) > 160 {
                    return substr(val, 0, 156) . " ...";
                }
                return val;
            }

            return "unknown";
        }
    }