public async ValueTask <IEnumerable <Observation> > FindObservationAsync(Guid sequenceId) { var sequence = await context.Sequences .Include(s => s.Observations) .FirstOrDefaultAsync(s => s.Id == sequenceId); if (sequence == null) { Throws.SequenceNotFound(); } return(sequence.Observations .OrderBy(o => o.Date) .Select(o => { var trafficLight = new Light( o.Color, new TrafficLightDigits(o.High, o.Low)); var predictedDigits = o .Digits .Select(x => new TrafficLightDigits(x)) .ToArray(); return new Observation(sequenceId, trafficLight, predictedDigits); })); }
public void PredictDigits_WhenAllSectionsAreServiceable_ShouldReturnSingle() { var predictor = new DigitPredictor(new BrokenSectionsExpert()); var trafficLight = new Light(Color.Green, new TrafficLightDigits(Constants.Zero, new Digit(02))); var observation = new Observation(Guid.NewGuid(), new Light(Color.Green, new TrafficLightDigits(88)), null); var result = predictor .Predict(trafficLight, new[] { observation }) .ToArray(); Assert.Single(result); Assert.Equal(new TrafficLightDigits(02), result[0]); }
public void PredictDigits_WithoutPreviousObservations() { var predictor = new DigitPredictor(new BrokenSectionsExpert()); var trafficLight = new Light(Color.Green, new TrafficLightDigits(Constants.Zero, new Digit("0011101"))); var result = predictor .Predict(trafficLight, new Observation[0]) .ToArray(); Assert.Contains(new TrafficLightDigits(02), result); Assert.Contains(new TrafficLightDigits(08), result); Assert.Contains(new TrafficLightDigits(82), result); Assert.Contains(new TrafficLightDigits(88), result); }
public async Task SaveObservationAsync(Guid sequenceId, Light trafficLight, IEnumerable <TrafficLightDigits> digits) { var sequence = await context.Sequences.FindAsync(sequenceId); if (sequence == null) { Throws.SequenceNotFound(); } var observation = new ObservationEntity { Date = DateTimeOffset.UtcNow, Color = trafficLight.Color, High = trafficLight.Digits.High.ToBitString(), Low = trafficLight.Digits.Low.ToBitString(), Digits = digits.Select(x => x.ToNumber()).ToArray() }; sequence.Observations.Add(observation); await context.SaveChangesAsync(); }
public void IdentifyBrokenSections_WhenSection5IsBrokenInLow_ShouldBeSection5IsBroken() { var predictor = new BrokenSectionsExpert(); var trafficLight = new Light(Color.Green, new TrafficLightDigits(Constants.Zero, new Digit("1101001"))); var predictedDigits = new[] { new TrafficLightDigits(5), new TrafficLightDigits(6), new TrafficLightDigits(8), new TrafficLightDigits(9), new TrafficLightDigits(85), new TrafficLightDigits(86), new TrafficLightDigits(88), new TrafficLightDigits(89) }; var brokenSections = predictor.IdentifyBrokenSections(trafficLight, predictedDigits, new Observation[0]); Assert.Equal(new TrafficLightDigits(new Digit(), new Digit("0000010")), brokenSections); }
public void IdentifyBrokenSections_WithPreviousObservations() { var predictor = new BrokenSectionsExpert(); var light = new Light(Color.Green, new TrafficLightDigits(Constants.Zero, new Digit("1001101"))); var predictedDigits = new[] { new TrafficLightDigits(5), new TrafficLightDigits(85), }; var observations = new[] { new Observation(Guid.NewGuid(), new Light(Color.Green, new TrafficLightDigits(new Digit(0), new Digit("1101001"))), null), new Observation(Guid.NewGuid(), new Light(Color.Green, new TrafficLightDigits(new Digit(0), new Digit("0101000"))), null), new Observation(Guid.NewGuid(), new Light(Color.Green, new TrafficLightDigits(new Digit(0), new Digit("1001001"))), null), }; var brokenSections = predictor.IdentifyBrokenSections(light, predictedDigits, observations); Assert.Equal(new TrafficLightDigits(new Digit(), new Digit("0010010")), brokenSections); }