public void when_a_driver_is_not_on_the_track_lap_time_column_colours_are_not_translated_into_set_lap_time_messages(SessionType session)
        {
            In(session).OnLap(5).Assert(translator =>
            {
                var driver = translator.GetDriver(1);
                var message = new SetGridColumnColourMessage(1, GridColumn.LapTime, GridColumnColour.White);

                driver.SetColumnHasValue(GridColumn.LapTime, true);
                driver.LastLapTime = PT(120.765, PostedTimeType.Normal, 1);
                // In pits.
                driver.ChangeStatus(DriverStatus.InPits);
                Assert.Null(translator.Translate(message));
                // Out.
                driver.ChangeStatus(DriverStatus.Out);
                Assert.Null(translator.Translate(message));
                // Retired.
                driver.ChangeStatus(DriverStatus.Retired);
                Assert.Null(translator.Translate(message));
                // Stopped.
                driver.ChangeStatus(DriverStatus.Stopped);
                Assert.Null(translator.Translate(message));
            });
        }
 /// <inheritdoc/>
 public virtual void Visit(SetGridColumnColourMessage message)
 {
 }
 void IMessageVisitor.Visit(SetGridColumnColourMessage message)
 {
     Dispatch(message);
 }
        private Message TranslateSetSectorTimeColour(SetGridColumnColourMessage message, int sectorNumber)
        {
            var driver = GetDriver(message);

            if(!driver.IsOnTrack || driver.IsExpectingPitTimes)
            {
                return null;
            }

            var lastSectorTime = driver.GetLastSector(sectorNumber);
            var newTimeType = LiveData.ToPostedTimeType(message.Colour);

            if(driver.IsCurrentSectorNumber(sectorNumber))
            {
                return TranslateSetDriverSectorTimeMessage(
                    new SetDriverSectorTimeMessage(driver.Id, sectorNumber,
                        new PostedTime(lastSectorTime.Time, newTimeType, driver.LapNumber)));
            }
            if(driver.IsPreviousSectorNumber(sectorNumber))
            {
                // The feed often sends a colour update for the previous sector time to indicate that
                // it was a PB or SB, in which case we publish a replacement time.
                // TODO only publish a replacement when the type has been upgraded and not down-graded.
                return new ReplaceDriverSectorTimeMessage(driver.Id, sectorNumber,
                    new PostedTime(lastSectorTime.Time, newTimeType, lastSectorTime.LapNumber));
            }
            Log.DebugFormat("received completely out of order S{0} update when an S{1} update" +
                " was expected, cannot translate this message: {2}", sectorNumber,
                driver.CurrentSectorNumber, message);
            return null;
        }
        private Message TranslateSetLapTimeColour(SetGridColumnColourMessage message)
        {
            var driver = GetDriver(message);

            if(driver.IsOnTrack && driver.LastLapTime != null)
            {
                switch(message.Colour)
                {
                    case GridColumnColour.White:
                        return new SetDriverLapTimeMessage(driver.Id,
                            new PostedTime(driver.LastLapTime.Time,
                                LiveData.ToPostedTimeType(message.Colour), driver.LapNumber));
                    case GridColumnColour.Green:
                    case GridColumnColour.Magenta:
                        // The feed often sends a colour update for the previous lap time to indicate
                        // that it was a PB or SB, in which case we publish a replacement time.
                        return new ReplaceDriverLapTimeMessage(driver.Id,
                            new PostedTime(driver.LastLapTime.Time,
                                LiveData.ToPostedTimeType(message.Colour), driver.LastLapTime.LapNumber));
                }
            }

            return null;
        }
 private Message TranslateSetIntervalTimeColour(SetGridColumnColourMessage message)
 {
     return message.Colour == GridColumnColour.White ? GetDriver(message).LastIntervalMessage : null;
 }
 private Message TranslateSetGridColumnColourMessage(SetGridColumnColourMessage message)
 {
     if(message.Colour == GridColumnColour.Yellow || !GetDriver(message).ColumnHasValue(message.Column))
     {
         // Yellow indicates that the next column is about to / has received an update and this
         // column is no longer shows the latest information for the driver. Also, the feed often
         // seeds colour updates to columns which have no value.
         return null;
     }
     switch(message.Column)
     {
         case GridColumn.CarNumber:
             return TranslateSetCarNumberColour(message);
         case GridColumn.LapTime:
             return TranslateSetLapTimeColour(message);
         case GridColumn.Gap:
             return TranslateSetGapTimeColour(message);
         case GridColumn.S1:
             return TranslateSetSectorTimeColour(message, 1);
         case GridColumn.S2:
             return TranslateSetSectorTimeColour(message, 2);
         case GridColumn.S3:
             return TranslateSetSectorTimeColour(message, 3);
         case GridColumn.Interval:
             return TranslateSetIntervalTimeColour(message);
         default:
             return null;
     }
 }
 private Message TranslateSetCarNumberColour(SetGridColumnColourMessage message)
 {
     return CreateStatusMessageIfChanged(GetDriver(message), LiveData.ToDriverStatus(message.Colour));
 }
 /// <inheritdoc/>
 public override void Visit(SetGridColumnColourMessage message)
 {
     Translated = TranslateSetGridColumnColourMessage(message);
 }