public void DisposePropagatesToAllChildren()
        {
            using var source = CachedObjectFactory
                               .ConfigureFor(() => DateTime.UtcNow)
                               .Build();

            var cachedObjects = new ICachedObject <DateTime> [10];

            var previous = source;

            for (var i = 0; i < 10; i++)
            {
                var current = previous.Map(x => x.AddDays(1));
                cachedObjects[i] = current;
                previous         = current;
            }

            cachedObjects.Last().Initialize();

            foreach (var cachedObject in cachedObjects)
            {
                cachedObject.State.Should().Be(CachedObjectState.Ready);
            }

            source.Dispose();

            foreach (var cachedObject in cachedObjects)
            {
                cachedObject.State.Should().Be(CachedObjectState.Disposed);
            }
        }
        public void MappedCachedObjectsCanBeChained()
        {
            using var source = CachedObjectFactory
                               .ConfigureFor(() => DateTime.UtcNow)
                               .Build();

            var cachedObjects = new ICachedObject <DateTime> [10];

            var previous = source;

            for (var i = 0; i < 10; i++)
            {
                var current = previous.Map(x => x.AddDays(1));
                cachedObjects[i] = current;
                previous         = current;
            }

            foreach (var cachedObject in cachedObjects)
            {
                cachedObject.State.Should().Be(CachedObjectState.PendingInitialization);
            }

            cachedObjects.Last().Initialize();

            foreach (var cachedObject in cachedObjects)
            {
                cachedObject.State.Should().Be(CachedObjectState.Ready);
            }

            for (var i = 0; i < 10; i++)
            {
                cachedObjects[i].Value.Should().Be(source.Value.AddDays(i + 1));
            }
        }