Added tests for LRUCache.

Moved core test code to reflect changes in core code.

Removed unused using directives.
This commit is contained in:
Harrison Deng 2021-04-19 14:40:11 -05:00
parent 35a2765559
commit f5a181d2f2
12 changed files with 137 additions and 17 deletions

View File

@ -1,9 +1,10 @@
using System;
using System.Collections;
using System.Collections.Generic;
namespace GameServiceWarden.Core.Module
namespace GameServiceWarden.Core.Collection
{
public class LRUCache<K, V>
public class LRUCache<K, V> : IEnumerable<V>
{
private class Node
{
@ -14,7 +15,7 @@ namespace GameServiceWarden.Core.Module
}
public int Size {get { return size; } }
public int Length {get { return valueDictionary.Count; } }
public int Count {get { return valueDictionary.Count; } }
private readonly int size;
private Node top;
private Node bottom;
@ -49,7 +50,7 @@ namespace GameServiceWarden.Core.Module
bottom = node;
} else if (valueDictionary.Count == Size) {
valueDictionary.Remove(bottom.key);
cleanupAction(bottom.value);
cleanupAction?.Invoke(bottom.value);
bottom = bottom.front;
}
valueDictionary[key] = node;
@ -68,10 +69,27 @@ namespace GameServiceWarden.Core.Module
return value.value;
}
public bool IsCached(K key) {
return valueDictionary.ContainsKey(key);
}
public void Clear() {
top = null;
bottom = null;
valueDictionary.Clear();
}
public IEnumerator<V> GetEnumerator()
{
foreach (Node node in valueDictionary.Values)
{
yield return node.value;
}
}
IEnumerator IEnumerable.GetEnumerator()
{
throw new NotImplementedException();
}
}
}

View File

@ -2,14 +2,10 @@ using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Collections.ObjectModel;
using System.IO;
using System.IO.Pipes;
using System.Linq;
using GameServiceWarden.API.Games;
using GameServiceWarden.Core.Persistence;
using GameServiceWarden.API.Module;
using System.Text;
using GameServiceWarden.Core.Collection;
namespace GameServiceWarden.Core.Module
{

View File

@ -0,0 +1,36 @@
using System;
namespace GameServiceWarden.Core.Tests.Collection
{
public class FakeDisposable : IDisposable
{
private string value;
private bool disposedValue;
public FakeDisposable(string value)
{
this.value = value;
}
public bool IsDisposed() {
return disposedValue;
}
protected virtual void Dispose(bool disposing)
{
if (!disposedValue)
{
if (disposing)
{
}
disposedValue = true;
}
}
public void Dispose()
{
Dispose(disposing: true);
GC.SuppressFinalize(this);
}
}
}

View File

@ -0,0 +1,72 @@
using GameServiceWarden.Core.Collection;
using Xunit;
namespace GameServiceWarden.Core.Tests.Collection
{
public class LRUCacheTest
{
[Fact]
public void Use_SufficientSpace_StoredUsed()
{
//Given
string data = "data";
LRUCache<int, string> cache = new LRUCache<int, string>(10);
//When
cache.Use(0, () => data);
//Then
Assert.Same(data, cache.Use(0, () => "other"));
}
[Fact]
public void Use_InsufficientSpace_LastUsedRemoved()
{
//Given
string[] data = new string[] { "a", "b", "c" };
LRUCache<int, string> cache = new LRUCache<int, string>(2);
//When
for (int i = 0; i < data.Length; i++)
{
cache.Use(i, () => data[i]);
}
//Then
Assert.Contains("c", cache);
Assert.Contains("b", cache);
Assert.DoesNotContain("a", cache);
}
[Fact]
public void IsCached_CachedData_True()
{
//Given
string[] data = new string[] { "a", "b", "c" };
LRUCache<int, string> cache = new LRUCache<int, string>(2);
//When
for (int i = 0; i < data.Length; i++)
{
cache.Use(i, () => data[i]);
}
//Then
Assert.True(cache.IsCached(2));
Assert.True(cache.IsCached(1));
Assert.False(cache.IsCached(0));
}
[Fact]
public void Use_CleanupDelSet_DataChanged()
{
//Given
FakeDisposable[] data = new FakeDisposable[] { new FakeDisposable("a"), new FakeDisposable("b"), new FakeDisposable("c")};
LRUCache<int, FakeDisposable> cache = new LRUCache<int, FakeDisposable>(2, (d) => d.Dispose());
//When
for (int i = 0; i < data.Length; i++)
{
cache.Use(i, () => data[i]);
}
//Then
Assert.True(data[0].IsDisposed());
Assert.False(data[1].IsDisposed());
Assert.False(data[2].IsDisposed());
}
}
}

View File

@ -4,7 +4,7 @@ using System.IO;
using System.Threading.Tasks;
using GameServiceWarden.API.Module;
namespace GameServiceWarden.Core.Tests.Modules.Games
namespace GameServiceWarden.Core.Tests.Modules
{
public class FakeService : IService
{

View File

@ -1,6 +1,6 @@
using GameServiceWarden.API.Module;
namespace GameServiceWarden.Core.Tests.Modules.Games
namespace GameServiceWarden.Core.Tests.Modules
{
public class FakeServiceConfigurable : IServiceConfigurable
{

View File

@ -3,7 +3,7 @@ using System.Collections.Generic;
using GameServiceWarden.API.Games;
using GameServiceWarden.Core.Module;
namespace GameServiceWarden.Core.Tests.Modules.Games
namespace GameServiceWarden.Core.Tests.Modules
{
public class FakeServiceManagerMonitor : IServiceManagerMonitor
{

View File

@ -1,7 +1,7 @@
using System.Collections.Generic;
using GameServiceWarden.API.Module;
namespace GameServiceWarden.Core.Tests.Modules.Games
namespace GameServiceWarden.Core.Tests.Modules
{
public class FakeServiceModule : IServiceModule
{

View File

@ -7,7 +7,7 @@ using Xunit;
using Xunit.Abstractions;
using System.Text;
namespace GameServiceWarden.Core.Tests.Modules.Games
namespace GameServiceWarden.Core.Tests.Modules
{
// Testing convention from: https://docs.microsoft.com/en-us/dotnet/core/testing/unit-testing-best-practices
// fakes are generic test objects,

View File

@ -12,7 +12,7 @@ using Xunit.Abstractions;
using System.Text;
[assembly: CollectionBehavior(DisableTestParallelization = true)]
namespace GameServiceWarden.Core.Tests.Modules.Games
namespace GameServiceWarden.Core.Tests.Modules
{
[CollectionDefinition("Service")]
public class ServiceManagerTest

View File

@ -1,10 +1,8 @@
using System.Collections;
using System.Collections.Generic;
using System.IO;
using GameServiceWarden.Core.Module;
using GameServiceWarden.Core.Persistence;
using GameServiceWarden.Core.Tests.Modules;
using GameServiceWarden.Core.Tests.Modules.Games;
using GameServiceWarden.API.Module;
using Xunit;