internal void with_result_multiple_threads(string dbgWayToCallDesc, Func <LazyContextualInit <string>, Func <string>, string> wayToCall)
        {
            var counter     = new ThreadSafeIntCounter();
            var lazyCtxInit = new LazyContextualInit <string>();

            var threadResults = MultiThreadsTestUtils.TestOnThreads(threadIndex => wayToCall(lazyCtxInit, () => counter.Increment().ToString()));

            lazyCtxInit.IsInited.Should().BeTrue($"{nameof(dbgWayToCallDesc)}: {dbgWayToCallDesc}");
            counter.Value.Should().Be(1);

            threadResults.ForEach(x => x.Should().Be("1"));
        }
        internal void no_result_multiple_threads(string dbgWayToCallDesc, Func <LazyContextualInit, Action, bool> wayToCall)
        {
            var counter     = new ThreadSafeIntCounter();
            var lazyCtxInit = new LazyContextualInit();

            var threadResults = MultiThreadsTestUtils.TestOnThreads(threadIndex => wayToCall(lazyCtxInit, () => counter.Increment()));

            lazyCtxInit.IsInited.Should().BeTrue($"{nameof(dbgWayToCallDesc)}: {dbgWayToCallDesc}");
            counter.Value.Should().Be(1);

            threadResults.Where(isInitedByThisCall => isInitedByThisCall).Should().ContainSingle();
            threadResults.Where(isInitedByThisCall => !isInitedByThisCall).Should().HaveCount(threadResults.Count - 1);
        }
        internal void no_result_initialized_only_once_on_first_call(string dbgWayToCallDesc, Func <LazyContextualInit, Action, bool> wayToCall)
        {
            var counter     = new ThreadSafeIntCounter();
            var lazyCtxInit = new LazyContextualInit();

            lazyCtxInit.IsInited.Should().BeFalse();
            lazyCtxInit.IfNotInited.Should().NotBeNull();

            var isInitedByThisCall = wayToCall(lazyCtxInit, () => counter.Increment());

            isInitedByThisCall.Should().BeTrue($"{nameof(dbgWayToCallDesc)}: {dbgWayToCallDesc}");
            lazyCtxInit.IsInited.Should().BeTrue();
            lazyCtxInit.IfNotInited.Should().BeNull();
            counter.Value.Should().Be(1);

            isInitedByThisCall = wayToCall(lazyCtxInit, () => counter.Increment());

            isInitedByThisCall.Should().BeFalse($"{nameof(dbgWayToCallDesc)}: {dbgWayToCallDesc}");
            lazyCtxInit.IsInited.Should().BeTrue();
            counter.Value.Should().Be(1);
        }
        internal void with_result_initialized_only_once_on_first_call(string dbgWayToCallDesc
                                                                      , Func <LazyContextualInit <string>, Func <string>, string> wayToCall)
        {
            var counter     = new ThreadSafeIntCounter();
            var lazyCtxInit = new LazyContextualInit <string>();

            lazyCtxInit.IsInited.Should().BeFalse();
            lazyCtxInit.IfNotInited.Should().NotBeNull();
            var val1 = wayToCall(lazyCtxInit, () => counter.Increment().ToString());

            lazyCtxInit.IsInited.Should().BeTrue($"{nameof(dbgWayToCallDesc)}: {dbgWayToCallDesc}");
            lazyCtxInit.IfNotInited.Should().BeNull();
            val1.Should().Be("1");
            counter.Value.Should().Be(1);

            var val2 = wayToCall(lazyCtxInit, () => counter.Increment().ToString());

            lazyCtxInit.IsInited.Should().BeTrue();
            val2.Should().Be("1");
            counter.Value.Should().Be(1);
        }