public static void ToValue2()
        {
            var exp = new Obj();
            var ok  = Outcome.Of(exp);

            Assert.Same(exp, ok.ToValue());
        }
        public static void ValueOrDefault1()
        {
            var exp = new Obj();
            var ok  = Outcome.Of(exp);

            Assert.Same(exp, ok.ValueOrDefault());
        }
        public static void Of1()
        {
            var ok = Outcome.Of(1);

            Assert.True(ok.IsSuccess);
            Assert.False(ok.IsError);
        }
        public static void ValueOrThrow1()
        {
            var exp = new Obj();
            var ok  = Outcome.Of(exp);

            Assert.Same(exp, ok.ValueOrThrow());
            Assert.Equal(exp, ok.ValueOrThrow(error => new SimpleException(error)));
        }
        public static void ValueOrNone1()
        {
            var exp   = new Obj();
            var ok    = Outcome.Of(exp);
            var maybe = ok.ValueOrNone();

            Assert.True(maybe.IsSome);
        }
        public static void ToMaybe1()
        {
            var exp = new Obj();
            var ok  = Outcome.Of(exp);

            var maybe = ok.ToMaybe();

            Assert.True(maybe.IsSome);
        }
        public static void ValueOrElse1()
        {
            var exp   = new Obj();
            var ok    = Outcome.Of(exp);
            var other = new Obj("other");

            Assert.Same(exp, ok.ValueOrElse(other));
            Assert.Same(exp, ok.ValueOrElse(() => other));
        }
        public static void Deconstruct1()
        {
            var exp = new Obj();
            var ok  = Outcome.Of(exp);

            var(succeed, value, err) = ok;
            Assert.True(succeed);
            Assert.Equal(String.Empty, err);
            Assert.Same(exp, value);
        }
        public static void ValueOrThrow0()
        {
            var ok = Outcome.Of(new Obj());

            Assert.Throws <ArgumentNullException>("exceptionFactory", () => ok.ValueOrThrow(null));

            var nok = Outcome <Obj> .FromError("error");

            Assert.Throws <ArgumentNullException>("exceptionFactory", () => nok.ValueOrThrow(null));
        }
        public static void ToString1()
        {
            var value = new Obj("My value");
            var ok    = Outcome.Of(value);

            Assert.Contains(value.ToString(), ok.ToString(), StringComparison.OrdinalIgnoreCase);

            var error = "My error";
            var nok   = Outcome <Obj> .FromError(error);

            Assert.Contains(error, nok.ToString(), StringComparison.OrdinalIgnoreCase);
        }
        public static void GetHashCode2()
        {
            var nok1 = Outcome <Obj> .FromError("error");

            var nok2 = Outcome <Obj> .FromError("error");

            Assert.Equal(nok1.GetHashCode(), nok2.GetHashCode());
            Assert.Equal(nok1.GetHashCode(EqualityComparer <Obj> .Default), nok2.GetHashCode(EqualityComparer <Obj> .Default));

            var ok1 = Outcome.Of(Tuple.Create("1"));
            var ok2 = Outcome.Of(Tuple.Create("1"));

            Assert.Equal(ok1.GetHashCode(), ok2.GetHashCode());
            Assert.Equal(ok1.GetHashCode(EqualityComparer <Tuple <string> > .Default), ok2.GetHashCode(EqualityComparer <Tuple <string> > .Default));
        }
        public static void GetHashCode1()
        {
            var nok = Outcome <Obj> .FromError("error");

            Assert.Equal(nok.GetHashCode(), nok.GetHashCode());
            Assert.Equal(nok.GetHashCode(EqualityComparer <Obj> .Default), nok.GetHashCode(EqualityComparer <Obj> .Default));

            var ok1 = Outcome.Of(new Obj());

            Assert.Equal(ok1.GetHashCode(), ok1.GetHashCode());
            Assert.Equal(ok1.GetHashCode(EqualityComparer <Obj> .Default), ok1.GetHashCode(EqualityComparer <Obj> .Default));

            var ok2 = Outcome.Of(1);

            Assert.Equal(ok2.GetHashCode(), ok2.GetHashCode());
            Assert.Equal(ok2.GetHashCode(EqualityComparer <int> .Default), ok2.GetHashCode(EqualityComparer <int> .Default));
        }
        public static void GetHashCode3()
        {
            var nok1 = Outcome <int> .FromError("error1");

            var nok2 = Outcome <int> .FromError("error2");

            Assert.NotEqual(nok1.GetHashCode(), nok2.GetHashCode());
            Assert.NotEqual(nok1.GetHashCode(EqualityComparer <int> .Default), nok2.GetHashCode(EqualityComparer <int> .Default));

            var ok1 = Outcome.Of(1);
            var ok2 = Outcome.Of(2);

            Assert.NotEqual(ok1.GetHashCode(), ok2.GetHashCode());
            Assert.NotEqual(ok1.GetHashCode(EqualityComparer <int> .Default), ok2.GetHashCode(EqualityComparer <int> .Default));

            Assert.NotEqual(ok1.GetHashCode(), nok1.GetHashCode());
            Assert.NotEqual(ok1.GetHashCode(EqualityComparer <int> .Default), nok1.GetHashCode(EqualityComparer <int> .Default));
        }