public void HasValue_ReturnsFalse_WhenProvidedWithNullValue()
        {
            var c = ClosedMonadType.GetConstructorsWithParameters()
                    .Single(x => x.Parameters.Count == 1 &&
                            x.Parameters[0].ParameterType == ValueType)
                    .Method;


            IMaybe maybe = c.Invoke(new object[] { null }) as IMaybe;

            Assert.IsNotNull(maybe);
            Assert.IsFalse(maybe.HasValue);
        }
        public void Value_ThrowsInvalidOperationException_WhenConstructedWithNullValue()
        {
            var c = ClosedMonadType.GetConstructorsWithParameters()
                    .Single(x => x.Parameters.Count == 1 &&
                            x.Parameters[0].ParameterType == ValueType)
                    .Method;


            IMaybe maybe = c.Invoke(new object[] { null }) as IMaybe;

            Assert.IsNotNull(maybe);
            Assert.Throws <InvalidOperationException>(() => { object value = maybe.Value; });
        }
        public void Constructor_ThrowsArgumentNullException_WhenConstructedWithNullComputationFunction()
        {
            var c = ClosedMonadType.GetConstructorsWithParameters()
                    .Single(x => x.Parameters.Count == 1 &&
                            x.Parameters[0].ParameterType == typeof(Func <>).MakeGenericType(ClosedMonadType))
                    .Method;

            var ex   = Assert.Throws <TargetInvocationException>(() => c.Invoke(new object[] { null }));
            var anex = ex.InnerException as ArgumentNullException;

            Assert.IsNotNull(anex);
            Assert.AreEqual("computation", anex.ParamName);
        }