public void TestOnStart() { _changeLedAsyncCount = 0; _changeLedCount = 0; _bumpEventCount = 0; Mock <IRobotMessenger> robotMessengerMock = new Mock <IRobotMessenger>(); UnitTestExampleSkill moqExampleSkill = new UnitTestExampleSkill(); IBumpSensorEvent bumpEvent1 = new BumpSensorEvent { EventId = 1, IsContacted = true, SensorPosition = BumpSensorPosition.FrontRight }; IBumpSensorEvent bumpEvent2 = new BumpSensorEvent { EventId = 1, IsContacted = false, SensorPosition = BumpSensorPosition.FrontRight }; IRobotCommandResponse successfulActionResponse = new RobotCommandResponse { ResponseType = MessageType.ActionResponse, Status = ResponseStatus.Success }; //Add Wait mocks robotMessengerMock.SetupSequence ( x => x.Wait ( It.IsAny <int>() ) ).Returns(() => { Task.WaitAll(Task.Delay(2000)); return(true); }).Returns(() => { Task.WaitAll(Task.Delay(1500)); return(true); }); //Setup mock to ensure Change LED Async has been called the appropriate amount of times robotMessengerMock.Setup ( x => x.ChangeLEDAsync ( It.IsAny <uint>(), It.IsAny <uint>(), It.IsAny <uint>() ) ).Returns(Task.Factory.StartNew(() => { ++_changeLedAsyncCount; return(successfulActionResponse); }).AsAsyncOperation()); //Setup mock to ensure Change LED has been called the appropriate amount of times robotMessengerMock.Setup ( x => x.ChangeLED ( It.IsAny <uint>(), It.IsAny <uint>(), It.IsAny <uint>(), It.IsAny <ProcessCommandResponse>() ) ).Callback(() => { ++_changeLedCount; moqExampleSkill.OnResponse(successfulActionResponse); }); //Setup mock to ensure bump event is registered and has a properly structured callback robotMessengerMock.Setup ( x => x.RegisterBumpSensorEvent ( It.IsAny <ProcessBumpSensorEventResponse>(), It.IsAny <int>(), It.IsAny <bool>(), It.IsAny <IList <BumpSensorValidation> >(), It.IsAny <string>(), null ) ).Callback(() => { ++_bumpEventCount; moqExampleSkill.BumpCallback(bumpEvent1); ++_bumpEventCount; Task.WaitAll(Task.Delay(2000)); moqExampleSkill.BumpCallback(bumpEvent2); } ); //Load mock messenger into skill moqExampleSkill.LoadRobotConnection(robotMessengerMock.Object); //OnStart will trigger the skill's action //RegisterBumpSensorEvent will cause two simulated bump events to be fired when called moqExampleSkill.OnStart(this, null); //If my skill looped forever and I wanted to check data at intervals I might do this... //_ = Task.Run(() => moqExampleSkill.OnStart(this, null)); //Task.WaitAll(Task.Delay(5000)); //Test Assert.IsTrue(_bumpEventCount == 2); Assert.IsTrue(_changeLedAsyncCount == 1); Assert.IsTrue(_changeLedCount == 2); }
/// <summary> /// Callback when an event is registered so we can setup simulated events /// Under development /// </summary> /// <param name="eventDetails"></param> /// <param name="command"></param> private void HandleEventRegistered(object sender, RegisterEventDetails details) { //TODO Use the event details to multi real register with specific filters var eventDetails = details.EventDetails; switch (eventDetails.EventType) { //Based on the event that was registered, then setup an event to be triggered when the commands come in case EventType.LocomotionCommand: _locomotionCommandEventDetails = eventDetails; break; case EventType.HaltCommand: _haltCommandEventDetails = eventDetails; break; case EventType.AudioPlayComplete: _audioPlayCompleteCommandEventDetails = eventDetails; break; //Record event id we registered under for manually managed events so we can send events under that id case EventType.TouchSensor: if (_capTouchRegistered) { return; } _capTouchRegistered = true; //Startup Cap Touch events... _ = Task.Run(async() => { await Task.Delay(8000); MockedRobot.TriggerRobotEvent(CapTouchEvent.GetMockEvent(true, CapTouchPosition.Chin, eventDetails.EventId)); await Task.Delay(1000); MockedRobot.TriggerRobotEvent(CapTouchEvent.GetMockEvent(false, CapTouchPosition.Chin, eventDetails.EventId)); await Task.Delay(3000); MockedRobot.TriggerRobotEvent(CapTouchEvent.GetMockEvent(true, CapTouchPosition.Chin, eventDetails.EventId)); await Task.Delay(1000); MockedRobot.TriggerRobotEvent(CapTouchEvent.GetMockEvent(false, CapTouchPosition.Chin, eventDetails.EventId)); }); break; case EventType.KeyPhraseRecognized: if (_keyPhraseRecRegistered) { return; } _keyPhraseRecRegistered = true; _ = Task.Run(async() => { await Task.Delay(5000); if (_keyPhraseRecRunning) { MockedRobot.TriggerRobotEvent(new KeyPhraseRecognizedEvent(50, eventDetails.EventId)); } await Task.Delay(7000); if (_keyPhraseRecRunning) { MockedRobot.TriggerRobotEvent(new KeyPhraseRecognizedEvent(70, eventDetails.EventId)); } await Task.Delay(5000); if (_keyPhraseRecRunning) { MockedRobot.TriggerRobotEvent(new KeyPhraseRecognizedEvent(80, eventDetails.EventId)); } await Task.Delay(4000); if (_keyPhraseRecRunning) { MockedRobot.TriggerRobotEvent(new KeyPhraseRecognizedEvent(70, eventDetails.EventId)); } }); break; case EventType.BumpSensor: if (_bumpRegistered) { return; } _bumpRegistered = true; _ = Task.Run(async() => { await Task.Delay(10000); MockedRobot.TriggerRobotEvent(BumpSensorEvent.GetMockEvent(true, BumpSensorPosition.FrontLeft, eventDetails.EventId)); await Task.Delay(3000); MockedRobot.TriggerRobotEvent(BumpSensorEvent.GetMockEvent(true, BumpSensorPosition.FrontRight, eventDetails.EventId)); await Task.Delay(5000); MockedRobot.TriggerRobotEvent(BumpSensorEvent.GetMockEvent(false, BumpSensorPosition.FrontLeft, eventDetails.EventId)); await Task.Delay(1000); MockedRobot.TriggerRobotEvent(BumpSensorEvent.GetMockEvent(false, BumpSensorPosition.FrontRight, eventDetails.EventId)); }); break; case EventType.FaceRecognition: if (_faceRecRegistered) { return; } _faceRecRegistered = true; _ = Task.Run(async() => { await Task.Delay(5000); if (_faceRecRunning || _faceDetectRunning) { MockedRobot.TriggerRobotEvent(new FaceRecognitionEvent(5, 1, 1, _faceRecRunning ? "brad" : "unknown_person", 2, eventDetails.EventId)); } await Task.Delay(2000); if (_faceRecRunning || _faceDetectRunning) { MockedRobot.TriggerRobotEvent(new FaceRecognitionEvent(5, 1, 1, _faceRecRunning ? "joe" : "unknown_person", 2, eventDetails.EventId)); } await Task.Delay(4000); if (_faceRecRunning || _faceDetectRunning) { MockedRobot.TriggerRobotEvent(new FaceRecognitionEvent(5, 1, 1, "unknown_person", 2, eventDetails.EventId)); } }); break; } }