public void GetOrCreateValue_AfterTokenWasInvalidated_RefreshesRevision_ReturnsValue()
        {
            var cache     = new Cache <object, string>();
            var decorator = new InvalidationTokenBasedCacheDecorator <object, string> (cache, InvalidationToken.Create());
            var key       = new object();

            cache.Add(key, "Value1");

            decorator.InvalidationToken.Invalidate();

            var valueOnFirstCall = decorator.GetOrCreateValue(key, o => "Value2");

            Assert.That(valueOnFirstCall, Is.EqualTo("Value2"));

            var valueOnSecondCall = decorator.GetOrCreateValue(key, o => { throw new InvalidOperationException(); });

            Assert.That(valueOnSecondCall, Is.EqualTo("Value2"));
        }
        public void GetOrCreateValue_WithValueInCache_ReturnsValue()
        {
            var cache     = new Cache <object, string>();
            var decorator = new InvalidationTokenBasedCacheDecorator <object, string> (cache, InvalidationToken.Create());
            var key       = new object();

            cache.Add(key, "Value");

            var value = decorator.GetOrCreateValue(key, o => { throw new InvalidOperationException(); });

            Assert.That(value, Is.EqualTo("Value"));
        }
        public void GetOrCreateValue_WithValueNotInCache_CreatedValue_ReturnsValue()
        {
            var cache     = new Cache <object, string>();
            var decorator = new InvalidationTokenBasedCacheDecorator <object, string> (cache, InvalidationToken.Create());
            var key       = new object();

            var value = decorator.GetOrCreateValue(key, o => "Value");

            Assert.That(value, Is.EqualTo("Value"));

            string cachedValue;

            cache.TryGetValue(key, out cachedValue);
            Assert.That(cachedValue, Is.EqualTo("Value"));
        }
        public void GetOrCreateValue_AfterTokenWasInvalidated_CreatesNewValue_ReturnsValue()
        {
            var cache     = new Cache <object, string>();
            var decorator = new InvalidationTokenBasedCacheDecorator <object, string> (cache, InvalidationToken.Create());
            var key       = new object();

            cache.Add(key, "Value1");

            decorator.InvalidationToken.Invalidate();

            var value = decorator.GetOrCreateValue(key, o => "Value2");

            Assert.That(value, Is.EqualTo("Value2"));

            string cachedValue;

            cache.TryGetValue(key, out cachedValue);
            Assert.That(cachedValue, Is.EqualTo("Value2"));
        }