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);
            }));
        }
Пример #2
0
        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]);
        }
Пример #3
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();
        }
Пример #5
0
        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);
        }
Пример #6
0
        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);
        }