public void TestBasicScenario() { var tile1 = new TileInfo { North = 1 }; var tile2 = new TileInfo { North = 2 }; var mapByTileName = new Dictionary <TileInfo, short[]> { [tile1] = new short[5], [tile2] = new short[10], }; var repo = new MockRepository { GetElevationMapMock = tile => mapByTileName[tile] }; var cache = new ElevationMapCache(repo, 1000); //warm cache Check.That(cache.GetValue(tile1)).IsEqualTo(mapByTileName[tile1]); Check.That(cache.GetValue(tile2)).IsEqualTo(mapByTileName[tile2]); //set repo to fail on load repo.GetElevationMapMock = _ => throw new Exception("at this point, all tiles should be loaded from cache"); Check.That(cache.GetValue(tile1)).IsEqualTo(mapByTileName[tile1]); Check.That(cache.GetValue(tile2)).IsEqualTo(mapByTileName[tile2]); }
public void TestCacheInvalidation() { var tiles = Enumerable.Range(0, 5) .Select(i => new TileInfo { North = i }) .ToArray(); var mapByTile = tiles.ToDictionary(t => t, _ => new short[25]); var tileLoadCount = tiles.ToDictionary(t => t, _ => 0); var repo = new MockRepository { GetElevationMapMock = tile => { tileLoadCount[tile] = tileLoadCount[tile] + 1; return(mapByTile[tile]); } }; var cache = new ElevationMapCache(repo, 200); for (int j = 0; j < 3; j++) { for (int i = 0; i < 4; i++) { var tile = tiles[i]; Check.That(cache.GetValue(tile)).IsEqualTo(mapByTile[tile]); Thread.Sleep(1); } } Check.That(tileLoadCount[tiles[0]]).IsEqualTo(1); Check.That(tileLoadCount[tiles[1]]).IsEqualTo(1); Check.That(tileLoadCount[tiles[2]]).IsEqualTo(1); Check.That(tileLoadCount[tiles[3]]).IsEqualTo(1); Check.That(tileLoadCount[tiles[4]]).IsEqualTo(0); Check.That(cache.GetValue(tiles[4])).IsEqualTo(mapByTile[tiles[4]]); Check.That(cache.GetValue(tiles[3])).IsEqualTo(mapByTile[tiles[3]]); Check.That(cache.GetValue(tiles[2])).IsEqualTo(mapByTile[tiles[2]]); Check.That(cache.GetValue(tiles[1])).IsEqualTo(mapByTile[tiles[1]]); Check.That(cache.GetValue(tiles[0])).IsEqualTo(mapByTile[tiles[0]]); Check.That(tileLoadCount[tiles[4]]).IsEqualTo(1); Check.That(tileLoadCount[tiles[3]]).IsEqualTo(1); Check.That(tileLoadCount[tiles[2]]).IsEqualTo(1); Check.That(tileLoadCount[tiles[0]]).IsEqualTo(2); Check.That(tileLoadCount[tiles[1]]).IsEqualTo(2); }