public OrderingScenario(int bitCount, ulong value, OrderExpect result)
        {
            Guard.InRangeInclusive(bitCount, nameof(bitCount), 1, 64);

            ulong mask = ulong.MaxValue << bitCount;
            Guard.InRangeInclusive(value, nameof(value), 0, ~mask);

            BitCount = bitCount;
            Result = result;
            Value = value;
        }
Exemplo n.º 2
0
        public OrderingScenario(int bitCount, ulong value, OrderExpect result)
        {
            Guard.InRangeInclusive(bitCount, nameof(bitCount), 1, 64);

            ulong mask = ulong.MaxValue << bitCount;

            Guard.InRangeInclusive(value, nameof(value), 0, ~mask);

            BitCount = bitCount;
            Result   = result;
            Value    = value;
        }
        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());
            }
        }
Exemplo n.º 4
0
        private static OrderingScenario?CreateCombinedScenario(OrderingScenario primaryScenario, OrderingScenario secondaryScenario,
                                                               OrderingScenario tertiaryScenario)
        {
            OrderExpect result = CombineResult(primaryScenario, secondaryScenario, tertiaryScenario);

            if (result != OrderExpect.DoNotCare)
            {
                ulong sequence = CreateBitSequenceFor(primaryScenario, secondaryScenario, tertiaryScenario);
                var   combined = new OrderingScenario(12, sequence, result);

                if (!IsImpossibleCombination(combined))
                {
                    return(combined);
                }
            }

            return(null);
        }
        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());
            }
        }
Exemplo n.º 7
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());
            }
        }