public void when_requesting_value_on_multiple_threads_then_value_is_created_once()
        {
            var mockValueFactory = Substitute.For <Func <object> >();
            var lazy             = new LazyLifecycleObject <object>(mockValueFactory);
            var obj = new object();

            mockValueFactory.Invoke().Returns(obj);

            object value1 = null;
            object value2 = null;

            Task.WaitAll(
                Task.Run(async() =>
            {
                await Task.Yield();
                value1 = lazy.Value;
            }),
                Task.Run(async() =>
            {
                await Task.Yield();
                value2 = lazy.Value;
            })
                );

            value1.ShouldBeTheSameAs(obj);
            value2.ShouldBeTheSameAs(obj);
            lazy.IsValueCreated.ShouldBeTrue();
            mockValueFactory.Received(1).Invoke();
        }
        public void when_initializing_then_value_is_not_created()
        {
            var mockValueFactory = Substitute.For <Func <object> >();
            var lazy             = new LazyLifecycleObject <object>(mockValueFactory);

            lazy.IsValueCreated.ShouldBeFalse();
            lazy.ToString().ShouldBe("Value is not created.");
            mockValueFactory.Received(0).Invoke();
        }
        public void when_requesting_value_then_value_is_created()
        {
            var mockValueFactory = Substitute.For <Func <object> >();
            var lazy             = new LazyLifecycleObject <object>(mockValueFactory);
            var obj = new object();

            mockValueFactory.Invoke().Returns(obj);

            var value = lazy.Value;

            value.ShouldBeTheSameAs(obj);
            lazy.IsValueCreated.ShouldBeTrue();
            lazy.ToString().ShouldBe(obj.ToString());
            mockValueFactory.Received(1).Invoke();
        }