public void TryGetValueNullResult()
        {
            // arrange
            var cacheSize = 10;
            var cache     = new TaskCache(cacheSize);
            var key       = "Foo";

            // act
            var result = cache.TryGetValue(key, out object value);

            // assert
            Assert.False(result);
        }
        public void TryGetValueNullResult()
        {
            // arrange
            var      cacheSize         = 10;
            TimeSpan slidingExpiration = TimeSpan.Zero;
            var      cache             = new TaskCache <string, string>(cacheSize,
                                                                        slidingExpiration);
            var key = "Foo";

            // act
            var result = cache.TryGetValue(key, out Task <string> value);

            // assert
            Assert.False(result);
        }
        public void TryGetValueKeyNull()
        {
            // arrange
            var      cacheSize         = 10;
            TimeSpan slidingExpiration = TimeSpan.Zero;
            var      cache             = new TaskCache <string, string>(cacheSize,
                                                                        slidingExpiration);
            string key = null;

            // act
            Action verify = () => cache.TryGetValue(key,
                                                    out Task <string> value);

            // assert
            Assert.Throws <ArgumentNullException>("key", verify);
        }
        public void TryGetValueResultByInteger()
        {
            // arrange
            var cacheSize = 10;
            var cache     = new TaskCache(cacheSize);
            var key       = 1;
            var expected  = "Bar";

            cache.TryAdd(key, expected);

            // act
            var result = cache.TryGetValue(key, out object actual);

            // assert
            Assert.True(result);
            Assert.Equal(expected, (string)actual);
        }
        public void VerifyExpirationTrue()
        {
            // arrange
            var cacheSize         = 10;
            var slidingExpiration = TimeSpan.FromMilliseconds(500);
            var cache             = new TaskCache <string, string>(cacheSize,
                                                                   slidingExpiration);
            var key = "Foo";

            cache.TryAdd(key, Task.FromResult("Bar"));

            // act
            var exists = cache.TryGetValue(key, out Task <string> actual);

            // assert
            Assert.True(exists);
        }
        public void TryAddNewCacheEntry()
        {
            // arrange
            var cacheSize = 10;
            var cache     = new TaskCache(cacheSize);
            var key       = "Foo";
            var expected  = "Bar";

            // act
            var added = cache.TryAdd(key, expected);

            // assert
            var exists = cache.TryGetValue(key, out object actual);

            Assert.True(added);
            Assert.True(exists);
            Assert.Equal(expected, (string)actual);
        }
        public void RemoveEntry()
        {
            // arrange
            var cacheSize = 10;
            var cache     = new TaskCache(cacheSize);
            var key       = "Foo";

            cache.TryAdd(key, "Bar");

            // act
            cache.Remove(key);

            // assert
            var exists = cache.TryGetValue(key, out object actual);

            Assert.False(exists);
            Assert.Null(actual);
        }
        public async Task VerifyExpirationFalse()
        {
            // arrange
            var cacheSize         = 10;
            var slidingExpiration = TimeSpan.FromMilliseconds(100);
            var cache             = new TaskCache <string, string>(cacheSize,
                                                                   slidingExpiration);
            var key = "Foo";

            cache.TryAdd(key, Task.FromResult("Bar"));
            await Task.Delay(300).ConfigureAwait(false);

            // act
            var exists = cache.TryGetValue(key, out Task <string> actual);

            // assert
            Assert.False(exists);
        }
        public async Task TryGetValueResult()
        {
            // arrange
            var      cacheSize         = 10;
            TimeSpan slidingExpiration = TimeSpan.Zero;
            var      cache             = new TaskCache <string, string>(cacheSize,
                                                                        slidingExpiration);
            var key      = "Foo";
            var expected = Task.FromResult("Bar");

            cache.TryAdd(key, expected);

            // act
            var result = cache.TryGetValue(key, out Task <string> actual);

            // assert
            Assert.True(result);
            Assert.Equal(await expected.ConfigureAwait(false),
                         await actual.ConfigureAwait(false));
        }
        public void RemoveEntry()
        {
            // arrange
            var      cacheSize         = 10;
            TimeSpan slidingExpiration = TimeSpan.Zero;
            var      cache             = new TaskCache <string, string>(cacheSize,
                                                                        slidingExpiration);
            var key = "Foo";

            cache.TryAdd(key, Task.FromResult("Bar"));

            // act
            cache.Remove(key);

            // assert
            var exists = cache.TryGetValue(key, out Task <string> actual);

            Assert.False(exists);
            Assert.Null(actual);
        }
        public void TryAddTwice()
        {
            // arrange
            var cacheSize = 10;
            var cache     = new TaskCache(cacheSize);
            var key       = "Foo";
            var expected  = "Bar";
            var another   = "Baz";

            // act
            var addedFirst  = cache.TryAdd(key, expected);
            var addedSecond = cache.TryAdd(key, another);

            // assert
            var exists = cache.TryGetValue(key, out object actual);

            Assert.True(addedFirst);
            Assert.False(addedSecond);
            Assert.True(exists);
            Assert.Equal(expected, (string)actual);
        }
        public async Task TryAddTwice()
        {
            // arrange
            var      cacheSize         = 10;
            TimeSpan slidingExpiration = TimeSpan.Zero;
            var      cache             = new TaskCache <string, string>(cacheSize,
                                                                        slidingExpiration);
            var key      = "Foo";
            var expected = Task.FromResult("Bar");
            var another  = Task.FromResult("Baz");

            // act
            var addedFirst  = cache.TryAdd(key, expected);
            var addedSecond = cache.TryAdd(key, another);

            // assert
            var exists = cache.TryGetValue(key, out Task <string> actual);

            Assert.True(addedFirst);
            Assert.False(addedSecond);
            Assert.True(exists);
            Assert.Equal(await expected.ConfigureAwait(false),
                         await actual.ConfigureAwait(false));
        }