public void CalculateTotalScore_5of5_Scored()
        {
            var cont = new RoundContestant();

            cont.EnsureListsAreInitialized();
            cont.RunJudgings.Add(new RunJudging()
            {
                Score = 2, RunNo = 1
            });
            cont.RunJudgings.Add(new RunJudging()
            {
                Score = 4, RunNo = 1
            });
            cont.RunJudgings.Add(new RunJudging()
            {
                Score = 6, RunNo = 1
            });
            cont.RunJudgings.Add(new RunJudging()
            {
                Score = 8, RunNo = 1
            });
            cont.RunJudgings.Add(new RunJudging()
            {
                Score = 9, RunNo = 1
            });

            cont.CalculateTotalScore(5, 1);

            Assert.AreEqual(5.8M, cont.TotalScore);
        }
        public void CalculateTotalScore_2runs_BestRunTaken()
        {
            var cont = new RoundContestant();

            cont.EnsureListsAreInitialized();
            cont.RunJudgings.Add(new RunJudging()
            {
                Score = 5, RunNo = 1
            });
            cont.RunJudgings.Add(new RunJudging()
            {
                Score = 10, RunNo = 1
            });
            cont.RunJudgings.Add(new RunJudging()
            {
                Score = 8, RunNo = 2
            });
            cont.RunJudgings.Add(new RunJudging()
            {
                Score = 10, RunNo = 2
            });

            cont.CalculateTotalScore(2, 2);

            Assert.AreEqual(9M, cont.TotalScore);
        }
        public void CalculateTotalScore_5of5butOneNull_ScoredAndCorrectAverage()
        {
            var cont = new RoundContestant();

            cont.EnsureListsAreInitialized();
            cont.RunJudgings.Add(new RunJudging()
            {
                Score = 5, RunNo = 1
            });
            cont.RunJudgings.Add(new RunJudging()
            {
                Score = 6, RunNo = 1
            });
            cont.RunJudgings.Add(new RunJudging()
            {
                Score = 6, RunNo = 1
            });
            cont.RunJudgings.Add(new RunJudging()
            {
                Score = 5, RunNo = 1
            });
            cont.RunJudgings.Add(new RunJudging()
            {
                Score = null, RunNo = 1
            });

            cont.CalculateTotalScore(5, 1);

            Assert.AreEqual(5.5M, cont.TotalScore);
        }
        public void CalculateTotalScore_4of5_notScored()
        {
            var cont = new RoundContestant();

            cont.EnsureListsAreInitialized();
            cont.RunJudgings.Add(new RunJudging()
            {
                Score = 5, RunNo = 1
            });
            cont.RunJudgings.Add(new RunJudging()
            {
                Score = 6, RunNo = 1
            });
            cont.RunJudgings.Add(new RunJudging()
            {
                Score = 6, RunNo = 1
            });
            cont.RunJudgings.Add(new RunJudging()
            {
                Score = 5, RunNo = 1
            });

            cont.CalculateTotalScore(5, 1);

            Assert.AreEqual(null, cont.TotalScore);
        }
        /// <summary>
        /// Replaces ALL runJudgings for all contestants represented in the list passed in. Recalculates totals.
        /// This means that if only judgements for 3 of 5 criteria are sent in for a given contestant,
        /// all 5 existing will still be deleted.
        /// </summary>
        public virtual void ReplaceAllRunJudgings(List <RunJudging> list, Tournament tourney)
        {
            var expectedJudgeEntriesPerRun = tourney.GetExpectedJudgementCountPerRun();
            // Delete the ones we're replacing
            var rcIds         = list.Select(p => p.RoundContestantId).Distinct().ToList();
            var oldJudgements = RunJudgings.Where(p => rcIds.Contains(p.RoundContestantId)).ToList();

            foreach (var old in oldJudgements)
            {
                RunJudgings.Remove(old);
            }

            // Insert new ones
            foreach (var score in list)
            {
                RunJudgings.Add(score);
            }

            // Update total score for all round contestants
            foreach (long rcId in rcIds)
            {
                RoundContestant contestant = GetRoundContestantGuarded(rcId);
                contestant.CalculateTotalScore(expectedJudgeEntriesPerRun, contestant.Round.RoundNo, contestant.Round.RunsPerContestant);
            }
            SaveChanges();
        }
        /// <summary>
        /// Replaces list of runJudging scores as well as calculates total on RoundContestant if done.
        /// Less optimized than ReplaceRunJudgings(ContestantRunViewModel model), as it fetches roundContestant for each runJudging line
        /// </summary>
        public virtual void ReplaceRunJudgings(List <RunJudging> list, Tournament tourney)
        {
            var expectedJudgeEntriesPerRun = tourney.GetExpectedJudgementCountPerRun();

            foreach (var score in list)
            {
                RunJudgings.Replace(score);
                RoundContestant contestant = GetRoundContestantGuarded(score.RoundContestantId);
                contestant.CalculateTotalScore(expectedJudgeEntriesPerRun, contestant.Round.RunsPerContestant);
            }
            SaveChanges();
        }
        /// <summary>
        /// Replaces list of runJudging scores as well as calculates total on RoundContestant if done
        /// </summary>
        /// <param name="model"></param>
        public virtual void ReplaceRunJudgings(ContestantRunViewModel model)
        {
            Tournament      tourney    = GetTournamentGuarded(model.TournamentId);
            RoundContestant contestant = GetRoundContestantGuarded(model.RoundContestantId);

            foreach (var score in model.Scores)
            {
                RunJudgings.Replace(score);
            }
            var expectedJudgeEntriesPerRun = tourney.GetExpectedJudgementCountPerRun();

            contestant.CalculateTotalScore(expectedJudgeEntriesPerRun, contestant.Round.RunsPerContestant);
            SaveChanges();
        }
        /// <summary>
        /// Replaces list of runJudging scores for a single round consteants. Calculates total on RoundContestant if all scores registerd.
        /// </summary>
        public virtual void ReplaceRunJudgings(long tournamentId, long roundContestantId, List <RunJudging> runJudgings)
        {
            Tournament      tourney    = GetTournamentGuarded(tournamentId);
            RoundContestant contestant = GetRoundContestantGuarded(roundContestantId);

            foreach (var score in runJudgings)
            {
                RunJudgings.Replace(score);
            }
            var expectedJudgeEntriesPerRun = tourney.GetExpectedJudgementCountPerRun();

            contestant.CalculateTotalScore(expectedJudgeEntriesPerRun, contestant.Round.RoundNo, contestant.Round.RunsPerContestant);
            SaveChanges();
        }
        public void CalculateTotalScore_2of2_Scored()
        {
            var cont = new RoundContestant();

            cont.EnsureListsAreInitialized();
            cont.RunJudgings.Add(new RunJudging()
            {
                Score = 5, RunNo = 1
            });
            cont.RunJudgings.Add(new RunJudging()
            {
                Score = 10, RunNo = 1
            });

            cont.CalculateTotalScore(2, 1);

            Assert.AreEqual(7.5M, cont.TotalScore);
        }