public void PenaltyOverrun2()
        {
            // Arrange
            var scenarios = new List <OrderingScenario>
            {
                // Bits: PenaltyTime X > Y, OverrunTime X > Y, PenaltyTime Y > X, OverrunTime Y > X
                new(4, OrderingScenario.FromBits(0, 0, 0, 0), OrderExpect.IsEven),
                new(4, OrderingScenario.FromBits(0, 0, 0, 1), OrderExpect.WinnerIsY),
                new(4, OrderingScenario.FromBits(0, 0, 1, 0), OrderExpect.WinnerIsX),
                new(4, OrderingScenario.FromBits(0, 0, 1, 1), OrderExpect.WinnerIsX),
                new(4, OrderingScenario.FromBits(0, 1, 0, 0), OrderExpect.WinnerIsX),
                new(4, OrderingScenario.FromBits(0, 1, 0, 1), OrderExpect.DoNotCare),
                new(4, OrderingScenario.FromBits(0, 1, 1, 0), OrderExpect.WinnerIsX),
                new(4, OrderingScenario.FromBits(0, 1, 1, 1), OrderExpect.DoNotCare),
                new(4, OrderingScenario.FromBits(1, 0, 0, 0), OrderExpect.WinnerIsY),
                new(4, OrderingScenario.FromBits(1, 0, 0, 1), OrderExpect.WinnerIsY),
                new(4, OrderingScenario.FromBits(1, 0, 1, 0), OrderExpect.DoNotCare),
                new(4, OrderingScenario.FromBits(1, 0, 1, 1), OrderExpect.DoNotCare),
                new(4, OrderingScenario.FromBits(1, 1, 0, 0), OrderExpect.WinnerIsY),
                new(4, OrderingScenario.FromBits(1, 1, 0, 1), OrderExpect.DoNotCare),
                new(4, OrderingScenario.FromBits(1, 1, 1, 0), OrderExpect.DoNotCare),
                new(4, OrderingScenario.FromBits(1, 1, 1, 1), OrderExpect.DoNotCare)
            };

            CompetitionClassModel model = new CompetitionClassModel()
                                          .ChangeClassInfo(new CompetitionClassInfo()
                                                           .ChangeStandardCourseTime(StandardCourseTime));

            var comparer = new CompetitionRunResultRankingComparer(model, RankingComparisonMode.OnlyPhasePenaltyOverrun);

            foreach (OrderingScenario scenario in scenarios.Where(s => s.Result != OrderExpect.DoNotCare))
            {
                CompetitionRunResult xCompetitor = CreateCompetitorForPenaltyOverrun(scenario[0], scenario[1]);
                CompetitionRunResult yCompetitor = CreateCompetitorForPenaltyOverrun(scenario[2], scenario[3]);

                AssertCompetitorsAreCompatibleWithProposedScenario(xCompetitor, yCompetitor, scenario, model);

                // Act
                int result = comparer.Compare(xCompetitor, yCompetitor);

                // Assert
                OrderExpect actual = TranslateComparerResult(result);
                actual.Should().Be(scenario.Result, scenario.ToString());
            }
        }
        public void RunCompletion1()
        {
            // Arrange
            var scenarios = new List<OrderingScenario>
            {
                // Bits: X HasFinished, X IsEliminated, Y HasFinished, Y IsEliminated
                new OrderingScenario(4, OrderingScenario.FromBits(0, 0, 0, 0), OrderExpect.IsEven),
                new OrderingScenario(4, OrderingScenario.FromBits(0, 0, 0, 1), OrderExpect.WinnerIsY),
                new OrderingScenario(4, OrderingScenario.FromBits(0, 0, 1, 0), OrderExpect.WinnerIsY),
                new OrderingScenario(4, OrderingScenario.FromBits(0, 0, 1, 1), OrderExpect.WinnerIsY),
                new OrderingScenario(4, OrderingScenario.FromBits(0, 1, 0, 0), OrderExpect.WinnerIsX),
                new OrderingScenario(4, OrderingScenario.FromBits(0, 1, 0, 1), OrderExpect.IsEven),
                new OrderingScenario(4, OrderingScenario.FromBits(0, 1, 1, 0), OrderExpect.WinnerIsY),
                new OrderingScenario(4, OrderingScenario.FromBits(0, 1, 1, 1), OrderExpect.WinnerIsY),
                new OrderingScenario(4, OrderingScenario.FromBits(1, 0, 0, 0), OrderExpect.WinnerIsX),
                new OrderingScenario(4, OrderingScenario.FromBits(1, 0, 0, 1), OrderExpect.WinnerIsX),
                new OrderingScenario(4, OrderingScenario.FromBits(1, 0, 1, 0), OrderExpect.IsEven),
                new OrderingScenario(4, OrderingScenario.FromBits(1, 0, 1, 1), OrderExpect.WinnerIsX),
                new OrderingScenario(4, OrderingScenario.FromBits(1, 1, 0, 0), OrderExpect.WinnerIsX),
                new OrderingScenario(4, OrderingScenario.FromBits(1, 1, 0, 1), OrderExpect.WinnerIsX),
                new OrderingScenario(4, OrderingScenario.FromBits(1, 1, 1, 0), OrderExpect.WinnerIsY),
                new OrderingScenario(4, OrderingScenario.FromBits(1, 1, 1, 1), OrderExpect.IsEven)
            };

            var comparer = new CompetitionRunResultRankingComparer(new CompetitionClassModel(),
                RankingComparisonMode.OnlyPhaseCompletion);

            foreach (OrderingScenario scenario in scenarios.Where(s => s.Result != OrderExpect.DoNotCare))
            {
                CompetitionRunResult xCompetitor = CreateCompetitorForCompletion(scenario[0], scenario[1]);
                CompetitionRunResult yCompetitor = CreateCompetitorForCompletion(scenario[2], scenario[3]);

                // Act
                int result = comparer.Compare(xCompetitor, yCompetitor);

                // Assert
                OrderExpect actual = TranslateComparerResult(result);
                actual.Should().Be(scenario.Result, scenario.ToString());
            }
        }
        public void RunCompletion1()
        {
            // Arrange
            var scenarios = new List <OrderingScenario>
            {
                // Bits: X HasFinished, X IsEliminated, Y HasFinished, Y IsEliminated
                new(4, OrderingScenario.FromBits(0, 0, 0, 0), OrderExpect.IsEven),
                new(4, OrderingScenario.FromBits(0, 0, 0, 1), OrderExpect.WinnerIsY),
                new(4, OrderingScenario.FromBits(0, 0, 1, 0), OrderExpect.WinnerIsY),
                new(4, OrderingScenario.FromBits(0, 0, 1, 1), OrderExpect.WinnerIsY),
                new(4, OrderingScenario.FromBits(0, 1, 0, 0), OrderExpect.WinnerIsX),
                new(4, OrderingScenario.FromBits(0, 1, 0, 1), OrderExpect.IsEven),
                new(4, OrderingScenario.FromBits(0, 1, 1, 0), OrderExpect.WinnerIsY),
                new(4, OrderingScenario.FromBits(0, 1, 1, 1), OrderExpect.WinnerIsY),
                new(4, OrderingScenario.FromBits(1, 0, 0, 0), OrderExpect.WinnerIsX),
                new(4, OrderingScenario.FromBits(1, 0, 0, 1), OrderExpect.WinnerIsX),
                new(4, OrderingScenario.FromBits(1, 0, 1, 0), OrderExpect.IsEven),
                new(4, OrderingScenario.FromBits(1, 0, 1, 1), OrderExpect.WinnerIsX),
                new(4, OrderingScenario.FromBits(1, 1, 0, 0), OrderExpect.WinnerIsX),
                new(4, OrderingScenario.FromBits(1, 1, 0, 1), OrderExpect.WinnerIsX),
                new(4, OrderingScenario.FromBits(1, 1, 1, 0), OrderExpect.WinnerIsY),
                new(4, OrderingScenario.FromBits(1, 1, 1, 1), OrderExpect.IsEven)
            };

            var comparer = new CompetitionRunResultRankingComparer(new CompetitionClassModel(), RankingComparisonMode.OnlyPhaseCompletion);

            foreach (OrderingScenario scenario in scenarios.Where(s => s.Result != OrderExpect.DoNotCare))
            {
                CompetitionRunResult xCompetitor = CreateCompetitorForCompletion(scenario[0], scenario[1]);
                CompetitionRunResult yCompetitor = CreateCompetitorForCompletion(scenario[2], scenario[3]);

                // Act
                int result = comparer.Compare(xCompetitor, yCompetitor);

                // Assert
                OrderExpect actual = TranslateComparerResult(result);
                actual.Should().Be(scenario.Result, scenario.ToString());
            }
        }
        public void FinishNumber3()
        {
            // Arrange
            var scenarios = new List <OrderingScenario>
            {
                // Bits: FinishTime X > Y, CompetitorNumber X > Y, FinishTime Y > X, CompetitorNumber Y > X
                new(4, OrderingScenario.FromBits(0, 0, 0, 0), OrderExpect.DoNotCare),
                new(4, OrderingScenario.FromBits(0, 0, 0, 1), OrderExpect.WinnerIsX),
                new(4, OrderingScenario.FromBits(0, 0, 1, 0), OrderExpect.DoNotCare),
                new(4, OrderingScenario.FromBits(0, 0, 1, 1), OrderExpect.WinnerIsX),
                new(4, OrderingScenario.FromBits(0, 1, 0, 0), OrderExpect.WinnerIsY),
                new(4, OrderingScenario.FromBits(0, 1, 0, 1), OrderExpect.DoNotCare),
                new(4, OrderingScenario.FromBits(0, 1, 1, 0), OrderExpect.WinnerIsX),
                new(4, OrderingScenario.FromBits(0, 1, 1, 1), OrderExpect.DoNotCare),
                new(4, OrderingScenario.FromBits(1, 0, 0, 0), OrderExpect.DoNotCare),
                new(4, OrderingScenario.FromBits(1, 0, 0, 1), OrderExpect.WinnerIsY),
                new(4, OrderingScenario.FromBits(1, 0, 1, 0), OrderExpect.DoNotCare),
                new(4, OrderingScenario.FromBits(1, 0, 1, 1), OrderExpect.DoNotCare),
                new(4, OrderingScenario.FromBits(1, 1, 0, 0), OrderExpect.WinnerIsY),
                new(4, OrderingScenario.FromBits(1, 1, 0, 1), OrderExpect.DoNotCare),
                new(4, OrderingScenario.FromBits(1, 1, 1, 0), OrderExpect.DoNotCare),
                new(4, OrderingScenario.FromBits(1, 1, 1, 1), OrderExpect.DoNotCare)
            };

            var comparer = new CompetitionRunResultRankingComparer(new CompetitionClassModel(), RankingComparisonMode.OnlyPhaseFinishNumber);

            foreach (OrderingScenario scenario in scenarios.Where(s => s.Result != OrderExpect.DoNotCare))
            {
                CompetitionRunResult xCompetitor = CreateCompetitorForFinishWithNumber(scenario[0], scenario[1]);
                CompetitionRunResult yCompetitor = CreateCompetitorForFinishWithNumber(scenario[2], scenario[3]);

                // Act
                int result = comparer.Compare(xCompetitor, yCompetitor);

                // Assert
                OrderExpect actual = TranslateComparerResult(result);
                actual.Should().Be(scenario.Result, scenario.ToString());
            }
        }
        public void RunExploded()
        {
            // Arrange
            var runCompletionScenarios = new List<OrderingScenario>
            {
                // Bits: X HasFinished, X IsEliminated, Y HasFinished, Y IsEliminated
                new OrderingScenario(4, OrderingScenario.FromBits(0, 0, 0, 0), OrderExpect.IsEven),
                new OrderingScenario(4, OrderingScenario.FromBits(0, 0, 0, 1), OrderExpect.WinnerIsY),
                new OrderingScenario(4, OrderingScenario.FromBits(0, 0, 1, 0), OrderExpect.WinnerIsY),
                new OrderingScenario(4, OrderingScenario.FromBits(0, 0, 1, 1), OrderExpect.WinnerIsY),
                new OrderingScenario(4, OrderingScenario.FromBits(0, 1, 0, 0), OrderExpect.WinnerIsX),
                new OrderingScenario(4, OrderingScenario.FromBits(0, 1, 0, 1), OrderExpect.IsEven),
                new OrderingScenario(4, OrderingScenario.FromBits(0, 1, 1, 0), OrderExpect.WinnerIsY),
                new OrderingScenario(4, OrderingScenario.FromBits(0, 1, 1, 1), OrderExpect.WinnerIsY),
                new OrderingScenario(4, OrderingScenario.FromBits(1, 0, 0, 0), OrderExpect.WinnerIsX),
                new OrderingScenario(4, OrderingScenario.FromBits(1, 0, 0, 1), OrderExpect.WinnerIsX),
                new OrderingScenario(4, OrderingScenario.FromBits(1, 0, 1, 0), OrderExpect.IsEven),
                new OrderingScenario(4, OrderingScenario.FromBits(1, 0, 1, 1), OrderExpect.WinnerIsX),
                new OrderingScenario(4, OrderingScenario.FromBits(1, 1, 0, 0), OrderExpect.WinnerIsX),
                new OrderingScenario(4, OrderingScenario.FromBits(1, 1, 0, 1), OrderExpect.WinnerIsX),
                new OrderingScenario(4, OrderingScenario.FromBits(1, 1, 1, 0), OrderExpect.WinnerIsY),
                new OrderingScenario(4, OrderingScenario.FromBits(1, 1, 1, 1), OrderExpect.IsEven)
            };

            var penaltyOverrunScenarios = new List<OrderingScenario>
            {
                // Bits: PenaltyTime X > Y, OverrunTime X > Y, PenaltyTime Y > X, OverrunTime Y > X
                new OrderingScenario(4, OrderingScenario.FromBits(0, 0, 0, 0), OrderExpect.IsEven),
                new OrderingScenario(4, OrderingScenario.FromBits(0, 0, 0, 1), OrderExpect.WinnerIsY),
                new OrderingScenario(4, OrderingScenario.FromBits(0, 0, 1, 0), OrderExpect.WinnerIsX),
                new OrderingScenario(4, OrderingScenario.FromBits(0, 0, 1, 1), OrderExpect.WinnerIsX),
                new OrderingScenario(4, OrderingScenario.FromBits(0, 1, 0, 0), OrderExpect.WinnerIsX),
                new OrderingScenario(4, OrderingScenario.FromBits(0, 1, 0, 1), OrderExpect.DoNotCare),
                new OrderingScenario(4, OrderingScenario.FromBits(0, 1, 1, 0), OrderExpect.WinnerIsX),
                new OrderingScenario(4, OrderingScenario.FromBits(0, 1, 1, 1), OrderExpect.DoNotCare),
                new OrderingScenario(4, OrderingScenario.FromBits(1, 0, 0, 0), OrderExpect.WinnerIsY),
                new OrderingScenario(4, OrderingScenario.FromBits(1, 0, 0, 1), OrderExpect.WinnerIsY),
                new OrderingScenario(4, OrderingScenario.FromBits(1, 0, 1, 0), OrderExpect.DoNotCare),
                new OrderingScenario(4, OrderingScenario.FromBits(1, 0, 1, 1), OrderExpect.DoNotCare),
                new OrderingScenario(4, OrderingScenario.FromBits(1, 1, 0, 0), OrderExpect.WinnerIsY),
                new OrderingScenario(4, OrderingScenario.FromBits(1, 1, 0, 1), OrderExpect.DoNotCare),
                new OrderingScenario(4, OrderingScenario.FromBits(1, 1, 1, 0), OrderExpect.DoNotCare),
                new OrderingScenario(4, OrderingScenario.FromBits(1, 1, 1, 1), OrderExpect.DoNotCare)
            };

            var finishNumberScenarios = new List<OrderingScenario>
            {
                // Bits: FinishTime X > Y, CompetitorNumber X > Y, FinishTime Y > X, CompetitorNumber Y > X
                new OrderingScenario(4, OrderingScenario.FromBits(0, 0, 0, 0), OrderExpect.DoNotCare),
                new OrderingScenario(4, OrderingScenario.FromBits(0, 0, 0, 1), OrderExpect.WinnerIsX),
                new OrderingScenario(4, OrderingScenario.FromBits(0, 0, 1, 0), OrderExpect.DoNotCare),
                new OrderingScenario(4, OrderingScenario.FromBits(0, 0, 1, 1), OrderExpect.WinnerIsX),
                new OrderingScenario(4, OrderingScenario.FromBits(0, 1, 0, 0), OrderExpect.WinnerIsY),
                new OrderingScenario(4, OrderingScenario.FromBits(0, 1, 0, 1), OrderExpect.DoNotCare),
                new OrderingScenario(4, OrderingScenario.FromBits(0, 1, 1, 0), OrderExpect.WinnerIsX),
                new OrderingScenario(4, OrderingScenario.FromBits(0, 1, 1, 1), OrderExpect.DoNotCare),
                new OrderingScenario(4, OrderingScenario.FromBits(1, 0, 0, 0), OrderExpect.DoNotCare),
                new OrderingScenario(4, OrderingScenario.FromBits(1, 0, 0, 1), OrderExpect.WinnerIsY),
                new OrderingScenario(4, OrderingScenario.FromBits(1, 0, 1, 0), OrderExpect.DoNotCare),
                new OrderingScenario(4, OrderingScenario.FromBits(1, 0, 1, 1), OrderExpect.DoNotCare),
                new OrderingScenario(4, OrderingScenario.FromBits(1, 1, 0, 0), OrderExpect.WinnerIsY),
                new OrderingScenario(4, OrderingScenario.FromBits(1, 1, 0, 1), OrderExpect.DoNotCare),
                new OrderingScenario(4, OrderingScenario.FromBits(1, 1, 1, 0), OrderExpect.DoNotCare),
                new OrderingScenario(4, OrderingScenario.FromBits(1, 1, 1, 1), OrderExpect.DoNotCare)
            };

            IEnumerable<OrderingScenario> exploded = ExplodeCombinations(runCompletionScenarios, penaltyOverrunScenarios,
                finishNumberScenarios);

            CompetitionClassModel model = new CompetitionClassModel()
                .ChangeClassInfo(new CompetitionClassInfo()
                    .ChangeStandardCourseTime(StandardCourseTime));
            var comparer = new CompetitionRunResultRankingComparer(model, RankingComparisonMode.Regular);

            foreach (OrderingScenario scenario in exploded)
            {
                bool xHasFinished = scenario[0];
                bool xIsEliminated = scenario[1];
                bool yHasFinished = scenario[2];
                bool yIsEliminated = scenario[3];
                bool xPenaltyTimeIsGreater = scenario[4];
                bool xOverrunTimeIsGreater = scenario[5];
                bool yPenaltyTimeIsGreater = scenario[6];
                bool yOverrunTimeIsGreater = scenario[7];
                bool xFinishTimeIsGreater = scenario[8];
                bool xCompetitorNumberIsGreater = scenario[9];
                bool yFinishTimeIsGreater = scenario[10];
                bool yCompetitorNumberIsGreater = scenario[11];

                CompetitionRunResult xCompetitor = CreateCompetitorFor("X", xHasFinished, xIsEliminated, yHasFinished,
                    xPenaltyTimeIsGreater, xOverrunTimeIsGreater, yPenaltyTimeIsGreater, yOverrunTimeIsGreater,
                    xFinishTimeIsGreater, xCompetitorNumberIsGreater, yFinishTimeIsGreater, yCompetitorNumberIsGreater);
                CompetitionRunResult yCompetitor = CreateCompetitorFor("Y", yHasFinished, yIsEliminated, xHasFinished,
                    yPenaltyTimeIsGreater, yOverrunTimeIsGreater, xPenaltyTimeIsGreater, xOverrunTimeIsGreater,
                    yFinishTimeIsGreater, yCompetitorNumberIsGreater, xFinishTimeIsGreater, xCompetitorNumberIsGreater);

                AssertCompetitorsAreCompatibleWithProposedScenario(xCompetitor, yCompetitor, scenario, model);

                // Act
                int result = comparer.Compare(xCompetitor, yCompetitor);

                // Assert
                OrderExpect actual = TranslateComparerResult(result);
                actual.Should().Be(scenario.Result, scenario.ToString());
            }
        }
        public ClassPlacementCalculator([NotNull] CompetitionClassModel modelSnapshot)
        {
            Guard.NotNull(modelSnapshot, nameof(modelSnapshot));

            comparer = new CompetitionRunResultRankingComparer(modelSnapshot, RankingComparisonMode.Regular);
        }
        public void PenaltyOverrun2()
        {
            // Arrange
            var scenarios = new List<OrderingScenario>
            {
                // Bits: PenaltyTime X > Y, OverrunTime X > Y, PenaltyTime Y > X, OverrunTime Y > X
                new OrderingScenario(4, OrderingScenario.FromBits(0, 0, 0, 0), OrderExpect.IsEven),
                new OrderingScenario(4, OrderingScenario.FromBits(0, 0, 0, 1), OrderExpect.WinnerIsY),
                new OrderingScenario(4, OrderingScenario.FromBits(0, 0, 1, 0), OrderExpect.WinnerIsX),
                new OrderingScenario(4, OrderingScenario.FromBits(0, 0, 1, 1), OrderExpect.WinnerIsX),
                new OrderingScenario(4, OrderingScenario.FromBits(0, 1, 0, 0), OrderExpect.WinnerIsX),
                new OrderingScenario(4, OrderingScenario.FromBits(0, 1, 0, 1), OrderExpect.DoNotCare),
                new OrderingScenario(4, OrderingScenario.FromBits(0, 1, 1, 0), OrderExpect.WinnerIsX),
                new OrderingScenario(4, OrderingScenario.FromBits(0, 1, 1, 1), OrderExpect.DoNotCare),
                new OrderingScenario(4, OrderingScenario.FromBits(1, 0, 0, 0), OrderExpect.WinnerIsY),
                new OrderingScenario(4, OrderingScenario.FromBits(1, 0, 0, 1), OrderExpect.WinnerIsY),
                new OrderingScenario(4, OrderingScenario.FromBits(1, 0, 1, 0), OrderExpect.DoNotCare),
                new OrderingScenario(4, OrderingScenario.FromBits(1, 0, 1, 1), OrderExpect.DoNotCare),
                new OrderingScenario(4, OrderingScenario.FromBits(1, 1, 0, 0), OrderExpect.WinnerIsY),
                new OrderingScenario(4, OrderingScenario.FromBits(1, 1, 0, 1), OrderExpect.DoNotCare),
                new OrderingScenario(4, OrderingScenario.FromBits(1, 1, 1, 0), OrderExpect.DoNotCare),
                new OrderingScenario(4, OrderingScenario.FromBits(1, 1, 1, 1), OrderExpect.DoNotCare)
            };

            CompetitionClassModel model = new CompetitionClassModel()
                .ChangeClassInfo(new CompetitionClassInfo()
                    .ChangeStandardCourseTime(StandardCourseTime));
            var comparer = new CompetitionRunResultRankingComparer(model, RankingComparisonMode.OnlyPhasePenaltyOverrun);

            foreach (OrderingScenario scenario in scenarios.Where(s => s.Result != OrderExpect.DoNotCare))
            {
                CompetitionRunResult xCompetitor = CreateCompetitorForPenaltyOverrun(scenario[0], scenario[1]);
                CompetitionRunResult yCompetitor = CreateCompetitorForPenaltyOverrun(scenario[2], scenario[3]);

                AssertCompetitorsAreCompatibleWithProposedScenario(xCompetitor, yCompetitor, scenario, model);

                // Act
                int result = comparer.Compare(xCompetitor, yCompetitor);

                // Assert
                OrderExpect actual = TranslateComparerResult(result);
                actual.Should().Be(scenario.Result, scenario.ToString());
            }
        }
        public void FinishNumber3()
        {
            // Arrange
            var scenarios = new List<OrderingScenario>
            {
                // Bits: FinishTime X > Y, CompetitorNumber X > Y, FinishTime Y > X, CompetitorNumber Y > X
                new OrderingScenario(4, OrderingScenario.FromBits(0, 0, 0, 0), OrderExpect.DoNotCare),
                new OrderingScenario(4, OrderingScenario.FromBits(0, 0, 0, 1), OrderExpect.WinnerIsX),
                new OrderingScenario(4, OrderingScenario.FromBits(0, 0, 1, 0), OrderExpect.DoNotCare),
                new OrderingScenario(4, OrderingScenario.FromBits(0, 0, 1, 1), OrderExpect.WinnerIsX),
                new OrderingScenario(4, OrderingScenario.FromBits(0, 1, 0, 0), OrderExpect.WinnerIsY),
                new OrderingScenario(4, OrderingScenario.FromBits(0, 1, 0, 1), OrderExpect.DoNotCare),
                new OrderingScenario(4, OrderingScenario.FromBits(0, 1, 1, 0), OrderExpect.WinnerIsX),
                new OrderingScenario(4, OrderingScenario.FromBits(0, 1, 1, 1), OrderExpect.DoNotCare),
                new OrderingScenario(4, OrderingScenario.FromBits(1, 0, 0, 0), OrderExpect.DoNotCare),
                new OrderingScenario(4, OrderingScenario.FromBits(1, 0, 0, 1), OrderExpect.WinnerIsY),
                new OrderingScenario(4, OrderingScenario.FromBits(1, 0, 1, 0), OrderExpect.DoNotCare),
                new OrderingScenario(4, OrderingScenario.FromBits(1, 0, 1, 1), OrderExpect.DoNotCare),
                new OrderingScenario(4, OrderingScenario.FromBits(1, 1, 0, 0), OrderExpect.WinnerIsY),
                new OrderingScenario(4, OrderingScenario.FromBits(1, 1, 0, 1), OrderExpect.DoNotCare),
                new OrderingScenario(4, OrderingScenario.FromBits(1, 1, 1, 0), OrderExpect.DoNotCare),
                new OrderingScenario(4, OrderingScenario.FromBits(1, 1, 1, 1), OrderExpect.DoNotCare)
            };

            var comparer = new CompetitionRunResultRankingComparer(new CompetitionClassModel(),
                RankingComparisonMode.OnlyPhaseFinishNumber);

            foreach (OrderingScenario scenario in scenarios.Where(s => s.Result != OrderExpect.DoNotCare))
            {
                CompetitionRunResult xCompetitor = CreateCompetitorForFinishWithNumber(scenario[0], scenario[1]);
                CompetitionRunResult yCompetitor = CreateCompetitorForFinishWithNumber(scenario[2], scenario[3]);

                // Act
                int result = comparer.Compare(xCompetitor, yCompetitor);

                // Assert
                OrderExpect actual = TranslateComparerResult(result);
                actual.Should().Be(scenario.Result, scenario.ToString());
            }
        }
Exemplo n.º 9
0
        public void RunExploded()
        {
            // Arrange
            var runCompletionScenarios = new List <OrderingScenario>
            {
                // Bits: X HasFinished, X IsEliminated, Y HasFinished, Y IsEliminated
                new(4, OrderingScenario.FromBits(0, 0, 0, 0), OrderExpect.IsEven),
                new(4, OrderingScenario.FromBits(0, 0, 0, 1), OrderExpect.WinnerIsY),
                new(4, OrderingScenario.FromBits(0, 0, 1, 0), OrderExpect.WinnerIsY),
                new(4, OrderingScenario.FromBits(0, 0, 1, 1), OrderExpect.WinnerIsY),
                new(4, OrderingScenario.FromBits(0, 1, 0, 0), OrderExpect.WinnerIsX),
                new(4, OrderingScenario.FromBits(0, 1, 0, 1), OrderExpect.IsEven),
                new(4, OrderingScenario.FromBits(0, 1, 1, 0), OrderExpect.WinnerIsY),
                new(4, OrderingScenario.FromBits(0, 1, 1, 1), OrderExpect.WinnerIsY),
                new(4, OrderingScenario.FromBits(1, 0, 0, 0), OrderExpect.WinnerIsX),
                new(4, OrderingScenario.FromBits(1, 0, 0, 1), OrderExpect.WinnerIsX),
                new(4, OrderingScenario.FromBits(1, 0, 1, 0), OrderExpect.IsEven),
                new(4, OrderingScenario.FromBits(1, 0, 1, 1), OrderExpect.WinnerIsX),
                new(4, OrderingScenario.FromBits(1, 1, 0, 0), OrderExpect.WinnerIsX),
                new(4, OrderingScenario.FromBits(1, 1, 0, 1), OrderExpect.WinnerIsX),
                new(4, OrderingScenario.FromBits(1, 1, 1, 0), OrderExpect.WinnerIsY),
                new(4, OrderingScenario.FromBits(1, 1, 1, 1), OrderExpect.IsEven)
            };

            var penaltyOverrunScenarios = new List <OrderingScenario>
            {
                // Bits: PenaltyTime X > Y, OverrunTime X > Y, PenaltyTime Y > X, OverrunTime Y > X
                new(4, OrderingScenario.FromBits(0, 0, 0, 0), OrderExpect.IsEven),
                new(4, OrderingScenario.FromBits(0, 0, 0, 1), OrderExpect.WinnerIsY),
                new(4, OrderingScenario.FromBits(0, 0, 1, 0), OrderExpect.WinnerIsX),
                new(4, OrderingScenario.FromBits(0, 0, 1, 1), OrderExpect.WinnerIsX),
                new(4, OrderingScenario.FromBits(0, 1, 0, 0), OrderExpect.WinnerIsX),
                new(4, OrderingScenario.FromBits(0, 1, 0, 1), OrderExpect.DoNotCare),
                new(4, OrderingScenario.FromBits(0, 1, 1, 0), OrderExpect.WinnerIsX),
                new(4, OrderingScenario.FromBits(0, 1, 1, 1), OrderExpect.DoNotCare),
                new(4, OrderingScenario.FromBits(1, 0, 0, 0), OrderExpect.WinnerIsY),
                new(4, OrderingScenario.FromBits(1, 0, 0, 1), OrderExpect.WinnerIsY),
                new(4, OrderingScenario.FromBits(1, 0, 1, 0), OrderExpect.DoNotCare),
                new(4, OrderingScenario.FromBits(1, 0, 1, 1), OrderExpect.DoNotCare),
                new(4, OrderingScenario.FromBits(1, 1, 0, 0), OrderExpect.WinnerIsY),
                new(4, OrderingScenario.FromBits(1, 1, 0, 1), OrderExpect.DoNotCare),
                new(4, OrderingScenario.FromBits(1, 1, 1, 0), OrderExpect.DoNotCare),
                new(4, OrderingScenario.FromBits(1, 1, 1, 1), OrderExpect.DoNotCare)
            };

            var finishNumberScenarios = new List <OrderingScenario>
            {
                // Bits: FinishTime X > Y, CompetitorNumber X > Y, FinishTime Y > X, CompetitorNumber Y > X
                new(4, OrderingScenario.FromBits(0, 0, 0, 0), OrderExpect.DoNotCare),
                new(4, OrderingScenario.FromBits(0, 0, 0, 1), OrderExpect.WinnerIsX),
                new(4, OrderingScenario.FromBits(0, 0, 1, 0), OrderExpect.DoNotCare),
                new(4, OrderingScenario.FromBits(0, 0, 1, 1), OrderExpect.WinnerIsX),
                new(4, OrderingScenario.FromBits(0, 1, 0, 0), OrderExpect.WinnerIsY),
                new(4, OrderingScenario.FromBits(0, 1, 0, 1), OrderExpect.DoNotCare),
                new(4, OrderingScenario.FromBits(0, 1, 1, 0), OrderExpect.WinnerIsX),
                new(4, OrderingScenario.FromBits(0, 1, 1, 1), OrderExpect.DoNotCare),
                new(4, OrderingScenario.FromBits(1, 0, 0, 0), OrderExpect.DoNotCare),
                new(4, OrderingScenario.FromBits(1, 0, 0, 1), OrderExpect.WinnerIsY),
                new(4, OrderingScenario.FromBits(1, 0, 1, 0), OrderExpect.DoNotCare),
                new(4, OrderingScenario.FromBits(1, 0, 1, 1), OrderExpect.DoNotCare),
                new(4, OrderingScenario.FromBits(1, 1, 0, 0), OrderExpect.WinnerIsY),
                new(4, OrderingScenario.FromBits(1, 1, 0, 1), OrderExpect.DoNotCare),
                new(4, OrderingScenario.FromBits(1, 1, 1, 0), OrderExpect.DoNotCare),
                new(4, OrderingScenario.FromBits(1, 1, 1, 1), OrderExpect.DoNotCare)
            };

            IEnumerable <OrderingScenario> exploded = ExplodeCombinations(runCompletionScenarios, penaltyOverrunScenarios, finishNumberScenarios);

            CompetitionClassModel model = new CompetitionClassModel()
                                          .ChangeClassInfo(new CompetitionClassInfo()
                                                           .ChangeStandardCourseTime(StandardCourseTime));

            var comparer = new CompetitionRunResultRankingComparer(model, RankingComparisonMode.Regular);

            foreach (OrderingScenario scenario in exploded)
            {
                bool xHasFinished               = scenario[0];
                bool xIsEliminated              = scenario[1];
                bool yHasFinished               = scenario[2];
                bool yIsEliminated              = scenario[3];
                bool xPenaltyTimeIsGreater      = scenario[4];
                bool xOverrunTimeIsGreater      = scenario[5];
                bool yPenaltyTimeIsGreater      = scenario[6];
                bool yOverrunTimeIsGreater      = scenario[7];
                bool xFinishTimeIsGreater       = scenario[8];
                bool xCompetitorNumberIsGreater = scenario[9];
                bool yFinishTimeIsGreater       = scenario[10];
                bool yCompetitorNumberIsGreater = scenario[11];

                CompetitionRunResult xCompetitor = CreateCompetitorFor("X", xHasFinished, xIsEliminated, yHasFinished, xPenaltyTimeIsGreater,
                                                                       xOverrunTimeIsGreater, yPenaltyTimeIsGreater, yOverrunTimeIsGreater, xFinishTimeIsGreater, xCompetitorNumberIsGreater, yFinishTimeIsGreater,
                                                                       yCompetitorNumberIsGreater);

                CompetitionRunResult yCompetitor = CreateCompetitorFor("Y", yHasFinished, yIsEliminated, xHasFinished, yPenaltyTimeIsGreater,
                                                                       yOverrunTimeIsGreater, xPenaltyTimeIsGreater, xOverrunTimeIsGreater, yFinishTimeIsGreater, yCompetitorNumberIsGreater, xFinishTimeIsGreater,
                                                                       xCompetitorNumberIsGreater);

                AssertCompetitorsAreCompatibleWithProposedScenario(xCompetitor, yCompetitor, scenario, model);

                // Act
                int result = comparer.Compare(xCompetitor, yCompetitor);

                // Assert
                OrderExpect actual = TranslateComparerResult(result);
                actual.Should().Be(scenario.Result, scenario.ToString());
            }
        }