/// <summary>
        /// Starts a chain of assertions on <paramref name="value"/>.
        /// Asserts that <paramref name="value"/> is not `null`.
        /// </summary>
        public static Assertable <T> HasValue <T>(T value, string name = null)
            where T : class
        {
            var parameter = DebugValueExpressionVisitor.GetDebugExpresssion(name ?? "value", value);

            if (value == null)
            {
                TestFrameworkProvider.Fail(GetDiagnosticMessage(Expression.NotEqual(parameter, Expression.Constant(null, typeof(T))), null, s_emptyContext));
                return(Assertable <T> .NoOp());
            }

            return(Assertable <T> .FromValueExpression(value, parameter));
        }
        /// <summary>
        /// Starts a chain of assertions on the result of <paramref name="valueExpression"/>.
        /// Asserts that the result of <paramref name="valueExpression"/> is not `null`.
        /// </summary>
        public static Assertable <T> HasValue <T>(Expression <Func <T> > valueExpression)
            where T : class
        {
            if (valueExpression == null)
            {
                throw new ArgumentNullException(nameof(valueExpression));
            }

            var(value, message) = GetValueOrNullMessage(valueExpression, s_emptyContext);

            if (message != null)
            {
                TestFrameworkProvider.Fail(message);
                return(Assertable <T> .NoOp());
            }

            return(Assertable <T> .FromValueExpression(value, valueExpression.Body));
        }