public void WhenNoConfusionMoveThroughManyRoomsShouldTurnOfLightImmediately() { var(motionEvents, scheduler, lampDictionary) = new LightAutomationServiceBuilder(_context).WithMotion ( OnNext(Time.Tics(1000), new MotionEnvelope(Detectors.livingRoomDetector)), OnNext(Time.Tics(2000), new MotionEnvelope(Detectors.hallwayDetectorLivingRoom)), OnNext(Time.Tics(3000), new MotionEnvelope(Detectors.hallwayDetectorToilet)), OnNext(Time.Tics(4000), new MotionEnvelope(Detectors.kitchenDetector)) ).Build(); scheduler.AdvanceJustAfter(TimeSpan.FromSeconds(2)); Assert.AreEqual(true, lampDictionary[Detectors.livingRoomDetector].IsTurnedOn); Assert.AreEqual(true, lampDictionary[Detectors.hallwayDetectorLivingRoom].IsTurnedOn); // scheduler.AdvanceJustAfter(TimeSpan.FromSeconds(3)); // Assert.AreEqual(false, lampDictionary[Detectors.livingRoomDetector].IsTurnedOn); //Assert.AreEqual(true, lampDictionary[Detectors.hallwayDetectorLivingRoom].IsTurnedOn); //Assert.AreEqual(true, lampDictionary[Detectors.hallwayDetectorToilet].IsTurnedOn); //scheduler.AdvanceJustAfter(TimeSpan.FromSeconds(4)); //Assert.AreEqual(false, lampDictionary[Detectors.livingRoomDetector].IsTurnedOn); //Assert.AreEqual(false, lampDictionary[Detectors.hallwayDetectorLivingRoom].IsTurnedOn); //Assert.AreEqual(true, lampDictionary[Detectors.hallwayDetectorToilet].IsTurnedOn); //Assert.AreEqual(true, lampDictionary[Detectors.kitchenDetector].IsTurnedOn); //scheduler.AdvanceJustAfter(TimeSpan.FromSeconds(5)); //Assert.AreEqual(false, lampDictionary[Detectors.livingRoomDetector].IsTurnedOn); //Assert.AreEqual(false, lampDictionary[Detectors.hallwayDetectorLivingRoom].IsTurnedOn); //Assert.AreEqual(false, lampDictionary[Detectors.hallwayDetectorToilet].IsTurnedOn); //Assert.AreEqual(true, lampDictionary[Detectors.kitchenDetector].IsTurnedOn); }
public async Task WhenCrossPassingNumberOfPeopleSlouldBeCorrect() { var(motionEvents, scheduler, lampDictionary) = new LightAutomationServiceBuilder(_context).WithMotion ( OnNext(Time.Tics(500), new MotionEnvelope(Detectors.kitchenDetector)), OnNext(Time.Tics(501), new MotionEnvelope(Detectors.livingRoomDetector)), OnNext(Time.Tics(1500), new MotionEnvelope(Detectors.hallwayDetectorToilet)), OnNext(Time.Tics(1501), new MotionEnvelope(Detectors.hallwayDetectorLivingRoom)), //OnNext(Time.Tics(2000), new MotionEnvelope(HallwaylivingRoomDetector)), <- Undetected due motion detectors lag after previous move //OnNext(Time.Tics(2000), new MotionEnvelope(HallwaytoiletDetector)), <- Undetected due motion detectors lag after previous move OnNext(Time.Tics(3000), new MotionEnvelope(Detectors.livingRoomDetector)), OnNext(Time.Tics(3001), new MotionEnvelope(Detectors.kitchenDetector)) ).Build(); scheduler.AdvanceJustAfterEnd(motionEvents); var status = await _context.Query <MotionStatus>(MotionServiceStatusQuery.Create()); var kitchen = await _context.Query <int>(NumberOfPeopleQuery.Create(Detectors.kitchenDetector)); var living = await _context.Query <int>(NumberOfPeopleQuery.Create(Detectors.livingRoomDetector)); Assert.AreEqual(1, kitchen); Assert.AreEqual(1, living); //Assert.AreEqual(2, status.NumberOfPersonsInHouse); //TODO }
public async Task WhenTwoPersonsStartsFromOneRoomAndSplitToTwoOthersNumbersOfPeopleShouldBeCorrect() { var(motionEvents, scheduler, lampDictionary) = new LightAutomationServiceBuilder(_context).WithMotion ( OnNext(Time.Tics(1000), new MotionEnvelope(Detectors.livingRoomDetector)), OnNext(Time.Tics(2000), new MotionEnvelope(Detectors.hallwayDetectorLivingRoom)), OnNext(Time.Tics(2900), new MotionEnvelope(Detectors.bathroomDetector)), OnNext(Time.Tics(3000), new MotionEnvelope(Detectors.hallwayDetectorToilet)), OnNext(Time.Tics(4000), new MotionEnvelope(Detectors.kitchenDetector)) ).Build(); scheduler.AdvanceJustAfter(TimeSpan.FromSeconds(4)); var status = await _context.Query <MotionStatus>(MotionServiceStatusQuery.Create()); Assert.AreEqual(1, await _context.Query <int>(NumberOfPeopleQuery.Create(Detectors.kitchenDetector))); Assert.AreEqual(1, await _context.Query <int>(NumberOfPeopleQuery.Create(Detectors.bathroomDetector))); // Assert.AreEqual(2, status.NumberOfPersonsInHouse); Assert.AreEqual(true, lampDictionary[Detectors.kitchenDetector].IsTurnedOn); Assert.AreEqual(true, lampDictionary[Detectors.bathroomDetector].IsTurnedOn); Assert.AreEqual(false, lampDictionary[Detectors.hallwayDetectorLivingRoom].IsTurnedOn); //Assert.AreEqual(false, lampDictionary[Detectors.livingRoomDetector].IsTurnedOn); scheduler.AdvanceJustAfter(TimeSpan.FromSeconds(5)); Assert.AreEqual(false, lampDictionary[Detectors.hallwayDetectorToilet].IsTurnedOn); }
public async Task WhenTurnOnJustAfterTurnOffServiceShouldIncreaseTurnOffTimeout() { var(motionEvents, scheduler, lampDictionary) = new LightAutomationServiceBuilder(_context).WithMotion ( OnNext(Time.Tics(500), new MotionEnvelope(Detectors.kitchenDetector)), OnNext(Time.Tics(12000), new MotionEnvelope(Detectors.kitchenDetector)) ).Build(); scheduler.AdvanceJustAfterEnd(motionEvents); Assert.AreEqual(false, await _context.Query <bool>(AutomationStateQuery.Create(Detectors.kitchenDetector))); }
public void WhenLeaveFromOnePersonRoomWithNoConfusionShouldTurnOffLightImmediately() { var(motionEvents, scheduler, lampDictionary) = new LightAutomationServiceBuilder(_context).WithMotion ( OnNext(Time.Tics(500), new MotionEnvelope(Detectors.toiletDetector)), OnNext(Time.Tics(1500), new MotionEnvelope(Detectors.hallwayDetectorToilet)) ).Build(); scheduler.AdvanceJustAfterEnd(motionEvents); Assert.AreEqual(false, lampDictionary[Detectors.toiletDetector].IsTurnedOn); }
public async Task MoveInRoomShouldNotTurnOnLightWhenAutomationIsDisabled() { var(motionEvents, scheduler, lampDictionary) = new LightAutomationServiceBuilder(_context).WithMotion ( OnNext(Time.Tics(500), new MotionEnvelope(Detectors.toiletDetector)) ).Build(); _context.Send(DisableAutomationCommand.Create(Detectors.toiletDetector)); scheduler.AdvanceToEnd(motionEvents); Assert.AreEqual(false, lampDictionary[Detectors.toiletDetector].IsTurnedOn); Assert.AreEqual(true, await _context.Query <bool>(AutomationStateQuery.Create(Detectors.toiletDetector))); }
public LightAutomationEnviromentBuilder WithRepeatedMotions(string roomUid, int numberOfMotions, TimeSpan waitTime) { long ticks = 0; for (int i = 0; i < numberOfMotions; i++) { ticks += Time.Tics((int)waitTime.TotalMilliseconds); _motionEvents.Add(new Recorded <Notification <MotionEnvelope> >(ticks, Notification.CreateOnNext(new MotionEnvelope(roomUid)))); } return(this); }
public void MoveInRoomShouldTurnOnLightWhenAutomationIsReEnabled() { var(motionEvents, scheduler, lampDictionary) = new LightAutomationServiceBuilder(_context).WithMotion ( OnNext(Time.Tics(500), new MotionEnvelope(Detectors.toiletDetector)), OnNext(Time.Tics(2500), new MotionEnvelope(Detectors.toiletDetector)) ).Build(); _context.Send(DisableAutomationCommand.Create(Detectors.toiletDetector)); motionEvents.Subscribe(_ => _context.Send(EnableAutomationCommand.Create(Detectors.toiletDetector))); scheduler.AdvanceToEnd(motionEvents); Assert.AreEqual(true, lampDictionary[Detectors.toiletDetector].IsTurnedOn); }
public void Leave_FromRoomWithConfusion_ShouldTurnOffLightAfterConfusionResolved() { new LightAutomationEnviromentBuilder(_context).WithServiceConfig(Default().Build()).WithMotions(new Dictionary <int, string> { { 500, Detectors.kitchenDetector }, { 1500, Detectors.hallwayDetectorToilet } }).Start(); AdvanceJustAfterEnd(); LampState(Detectors.kitchenDetector).Should().BeTrue(); AdvanceTo(Time.Tics(2500)); LampState(Detectors.kitchenDetector).Should().BeFalse(); }
public void MoveInRoomShouldTurnOnLight() { var(motionEvents, scheduler, lampDictionary) = new LightAutomationServiceBuilder(_context).WithMotion ( OnNext(Time.Tics(500), new MotionEnvelope(Detectors.toiletDetector)), OnNext(Time.Tics(1500), new MotionEnvelope(Detectors.kitchenDetector)), OnNext(Time.Tics(2000), new MotionEnvelope(Detectors.livingRoomDetector)) ).Build(); scheduler.AdvanceToEnd(motionEvents); Assert.AreEqual(true, lampDictionary[Detectors.toiletDetector].IsTurnedOn); Assert.AreEqual(true, lampDictionary[Detectors.kitchenDetector].IsTurnedOn); Assert.AreEqual(true, lampDictionary[Detectors.livingRoomDetector].IsTurnedOn); }
public void WhenLeaveFromOnePersonRoomWithConfusionShouldTurnOffWhenConfusionResolved() { var confusionResolutionTime = TimeSpan.FromMilliseconds(5000); var(motionEvents, scheduler, lampDictionary) = new LightAutomationServiceBuilder(_context).WithMotion ( OnNext(Time.Tics(500), new MotionEnvelope(Detectors.toiletDetector)), OnNext(Time.Tics(1000), new MotionEnvelope(Detectors.kitchenDetector)), OnNext(Time.Tics(1500), new MotionEnvelope(Detectors.hallwayDetectorToilet)), OnNext(Time.Tics(2000), new MotionEnvelope(Detectors.hallwayDetectorLivingRoom)), OnNext(Time.Tics(3000), new MotionEnvelope(Detectors.kitchenDetector)) ).Build(); scheduler.AdvanceTo(confusionResolutionTime + TimeSpan.FromMilliseconds(1500)); Assert.AreEqual(false, lampDictionary[Detectors.toiletDetector].IsTurnedOn); }
public async Task WhenNoMoveInRoomShouldTurnOffAfterTurnOffTimeout() { var(motionEvents, scheduler, lampDictionary) = new LightAutomationServiceBuilder(_context).WithMotion ( OnNext(Time.Tics(500), new MotionEnvelope(Detectors.kitchenDetector)) ).Build(); var area = await _context.Query <AreaDescriptor>(AreaDescriptorQuery.Create(Detectors.toiletDetector)); scheduler.AdvanceJustAfterEnd(motionEvents); Assert.AreEqual(true, lampDictionary[Detectors.kitchenDetector].IsTurnedOn); scheduler.AdvanceTo(area.TurnOffTimeout); Assert.AreEqual(true, lampDictionary[Detectors.kitchenDetector].IsTurnedOn); scheduler.AdvanceJustAfter(area.TurnOffTimeout); Assert.AreEqual(false, lampDictionary[Detectors.kitchenDetector].IsTurnedOn); }
public void MoveInRoomShouldNotTurnOnLightOnNightWhenWorkinghoursAreDaylight() { var(motionEvents, scheduler, lampDictionary) = new LightAutomationServiceBuilder(_context).WithWorkingTime(WorkingTime.DayLight).WithMotion ( OnNext(Time.Tics(500), new MotionEnvelope(Detectors.toiletDetector)), OnNext(Time.Tics(1500), new MotionEnvelope(Detectors.kitchenDetector)), OnNext(Time.Tics(2000), new MotionEnvelope(Detectors.livingRoomDetector)) ).Build(); SystemTime.Set(TimeSpan.FromHours(21)); scheduler.AdvanceToEnd(motionEvents); Assert.AreEqual(false, lampDictionary[Detectors.toiletDetector].IsTurnedOn); Assert.AreEqual(false, lampDictionary[Detectors.kitchenDetector].IsTurnedOn); Assert.AreEqual(false, lampDictionary[Detectors.livingRoomDetector].IsTurnedOn); }
public async Task AnalyzeMoveShouldCountPeopleNumberInRoom() { var(motionEvents, scheduler, lampDictionary) = new LightAutomationServiceBuilder(_context).WithConfusionResolutionTime(TimeSpan.FromMilliseconds(5000)) .WithMotion ( OnNext(Time.Tics(500), new MotionEnvelope(Detectors.toiletDetector)), OnNext(Time.Tics(1500), new MotionEnvelope(Detectors.hallwayDetectorToilet)), OnNext(Time.Tics(2000), new MotionEnvelope(Detectors.kitchenDetector)), OnNext(Time.Tics(2500), new MotionEnvelope(Detectors.livingRoomDetector)), OnNext(Time.Tics(3000), new MotionEnvelope(Detectors.hallwayDetectorLivingRoom)), OnNext(Time.Tics(3500), new MotionEnvelope(Detectors.hallwayDetectorToilet)), OnNext(Time.Tics(4000), new MotionEnvelope(Detectors.kitchenDetector)) ).Build(); scheduler.AdvanceTo(TimeSpan.FromMilliseconds(11000)); var num = await _context.Query <int>(NumberOfPeopleQuery.Create(Detectors.kitchenDetector)); Assert.AreEqual(2, num); }
public async Task MoveInFirstPathShouldNotConfusedNextPathWhenItIsSure() { var(motionEvents, scheduler, lampDictionary) = new LightAutomationServiceBuilder(_context).WithMotion ( // First path OnNext(Time.Tics(500), new MotionEnvelope(Detectors.toiletDetector)), OnNext(Time.Tics(1500), new MotionEnvelope(Detectors.hallwayDetectorToilet)), OnNext(Time.Tics(2000), new MotionEnvelope(Detectors.kitchenDetector)), // Second path OnNext(Time.Tics(2500), new MotionEnvelope(Detectors.livingRoomDetector)), OnNext(Time.Tics(3000), new MotionEnvelope(Detectors.hallwayDetectorLivingRoom)) ).Build(); scheduler.AdvanceJustAfterEnd(motionEvents); var status = await _context.Query <MotionStatus>(MotionServiceStatusQuery.Create()); Assert.AreEqual(0, status.NumberOfConfusions); Assert.AreEqual(true, lampDictionary[Detectors.kitchenDetector].IsTurnedOn); }
public static void AdvanceJustAfterEnd <T>(this TestScheduler scheduler, ITestableObservable <T> events, int timeAfter = 500) { scheduler.AdvanceTo(events.Messages.Max(x => x.Time) + Time.Tics(timeAfter)); }
public LightAutomationEnviromentBuilder WithMotions(Dictionary <int, string> motions) { _motionEvents.AddRange(motions.Select(x => new Recorded <Notification <MotionEnvelope> >(Time.Tics(x.Key), Notification.CreateOnNext(new MotionEnvelope(x.Value))))); return(this); }
public static void AdvanceAfterElement <T>(this TestScheduler scheduler, ITestableObservable <T> events, int elementIndex, int timeAfter = 500) { scheduler.AdvanceTo(events.Messages.ElementAt(elementIndex).Time + Time.Tics(timeAfter)); }