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);
        }
Exemple #3
0
        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);
            }
        }