public void OverridesObjectEquals()
        {
            var equals = ClosedMonadType.GetMethodsWithParameters()
                         .Where(x => x.Method.Name == "Equals")
                         .Single(x => x.Parameters.Count == 1 && x.Parameters[0].ParameterType == typeof(object));

            Assert.IsTrue(equals.Method.DeclaringType == ClosedMonadType);
        }
        public void NoMethods_OnMonadType_ContainOptionalArguments()
        {
            var methods = ClosedMonadType.GetMethodsWithParameters().ToArray();

            Assert.IsTrue(methods.Length > 0);

            var outcome = methods.SelectMany(x => x.Parameters.Select(y =>
                                                                      Outcome.FailIf(y.IsDefined(typeof(OptionalAttribute), true), String.Format("{0}.{1}.{2} is optional.", ClosedMonadType.Name, x.Method.Name, y.Name))))
                          .Combine();

            Assert.IsTrue(outcome.WasSuccessful, outcome.Observations.Delimit("\r\n"));
        }
        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);
        }