public void TestMatchesStatsEmpty() { var request = new HttpRequest(HttpMethod.Get, Stream.Null); var urlArgs = new Dictionary <string, string> { { "endpoint", "test.com-8080" } }; var response = StatsRoutes.GetServerStatsByEndpoint(urlArgs, request); var actual = JsonConvert.DeserializeObject <MatchesStats>(response.Content); var expected = new MatchesStats { Top5Maps = new List <string>(), Top5GameModes = new List <string>() }; Assert.AreEqual(HttpStatusCode.OK, response.StatusCode); Assert.AreEqual(actual, expected); }
public void TestMatchesStatsNormal() { var server = new GameServer { Endpoint = "test.com-8080", GameModes = new List <GameMode>(), Name = "test" }; var expected = new MatchesStats(); var modes = new[] { "DM", "TDM", "DE", "DB", "KL", "MN" }; var modesFrequency = new Dictionary <string, int>(); var maps = new[] { "Dust", "Mirage", "Nuke", "Assault", "Mansion" }; var mapsFrequency = new Dictionary <string, int>(); var daysFrequency = new Dictionary <DateTime, int>(); var timestamp = DateTime.Now; var rand = new Random(); using (var db = new ServerDatabase()) { db.GameServers.Add(server); db.SaveChanges(); var count = rand.Next(99, 170); for (var j = 0; j < count; j++) { var timespan = new TimeSpan(rand.Next(0, 17), 0, 0, 0); var day = timestamp.Add(timespan); var mode = modes[rand.Next(0, modes.Length - 1)]; var map = maps[rand.Next(0, maps.Length - 1)]; var population = rand.Next(1, 50); var match = new GameMatch { Timestamp = day, Server = server, GameMode = mode, Map = map, TotalPlayers = population }; db.GameMatches.Add(match); if (modesFrequency.ContainsKey(mode)) { modesFrequency[mode]++; } else { modesFrequency[mode] = 1; } if (mapsFrequency.ContainsKey(map)) { mapsFrequency[map]++; } else { mapsFrequency[map] = 1; } if (daysFrequency.ContainsKey(day)) { daysFrequency[day]++; } else { daysFrequency[day] = 1; } if (population > expected.MaximumPopulation) { expected.MaximumPopulation = population; } expected.AveragePopulation += population; } expected.AveragePopulation /= count; expected.TotalMatchesPlayed = count; db.SaveChanges(); } expected.AverageMatchesPerDay = (double)daysFrequency.Sum(x => x.Value) / daysFrequency.Count; expected.MaximumMatchesPerDay = daysFrequency.Max(x => x.Value); expected.Top5GameModes = modesFrequency .OrderByDescending(x => x.Value) .Select(x => x.Key); expected.Top5Maps = mapsFrequency .OrderByDescending(x => x.Value) .Select(x => x.Key); var request = new HttpRequest(HttpMethod.Get, Stream.Null); var urlArgs = new Dictionary <string, string> { { "endpoint", "test.com-8080" } }; var response = StatsRoutes.GetServerStatsByEndpoint(urlArgs, request); var actual = JsonConvert.DeserializeObject <MatchesStats>(response.Content); Assert.AreEqual(HttpStatusCode.OK, response.StatusCode); Assert.AreEqual(actual, expected); }
private static MatchesStats GetServerStatsByField(Expression <Func <GameMatch, bool> > selector) { using (var db = new ServerDatabase()) { var stats = new MatchesStats(); if (!db.GameMatches.Any(selector)) { stats.Top5GameModes = new List <string>(); stats.Top5Maps = new List <string>(); return(stats); } var generalStats = db.GameMatches .Where(selector) .Include(match => match.Scoreboard) .GroupBy(match => 1) .Select(group => new { TotalMatchesPlayed = group.Count(), MaximumPopulation = group.Max(match => match.TotalPlayers), AveragePopulation = group.Average(match => match.TotalPlayers) }) .Single(); stats.AveragePopulation = generalStats.AveragePopulation; stats.MaximumPopulation = generalStats.MaximumPopulation; stats.TotalMatchesPlayed = generalStats.TotalMatchesPlayed; var matchesPerDay = db.GameMatches .Where(selector) .GroupBy(match => new { match.Timestamp.Year, match.Timestamp.Month, match.Timestamp.Day }) .Select(group => group.Count()) .GroupBy(count => 1) .Select(group => new { Max = group.Max(), Average = group.Average() }) .Single(); stats.AverageMatchesPerDay = matchesPerDay.Average; stats.MaximumMatchesPerDay = matchesPerDay.Max; stats.Top5Maps = db.GameMatches .Where(selector) .GroupBy(match => match.Map) .OrderByDescending(group => group.Count()) .Select(group => group.Key) .Take(5) .ToList(); stats.Top5GameModes = db.GameMatches .Where(selector) .GroupBy(match => match.GameMode) .OrderByDescending(group => group.Count()) .Select(group => group.Key) .Take(5) .ToList(); return(stats); } }