public void For2SameInputEvents_ShouldExecuteDataParserOnce()
            {
                var testScheduler = new TestScheduler();

                //arrange
                var target = new SerialPortDevice(_serialPortMock.Object, _dataParserMock.Object, testScheduler);

                //act

                target.ObserveDataReceived(10d);

                //input events
                _serialPortMock.Raise(port => port.DataReceived += null, "Test message 1");
                _serialPortMock.Raise(port => port.DataReceived += null, "Test message 1");

                //assert
                _dataParserMock.Verify(x => x.Parse(It.IsAny <string>()), Times.Once);
            }
            public void ForNoInputFor5sec_ShouldNotThrowTimeoutException()
            {
                var testScheduler = new TestScheduler();
                //arrange
                var target = new SerialPortDevice(_serialPortMock.Object, _dataParserMock.Object, testScheduler);

                //act && assert
                try
                {
                    target.ObserveDataReceived(10d);

                    //input event
                    _serialPortMock.Raise(port => port.DataReceived += null, "Test message");
                    //wait 5 sec - less than timeout limit
                    testScheduler.AdvanceBy(TimeSpan.FromSeconds(5).Ticks);
                }
                catch (Exception)
                {
                    Assert.Fail("Exception was thrown but it shouldn't");
                }
            }
            public void ForNoInputFor20sec_ShouldThrowTimeoutException()
            {
                var testScheduler = new TestScheduler();
                //arrange
                var target = new SerialPortDevice(_serialPortMock.Object, _dataParserMock.Object, testScheduler);

                //act && assert
                try
                {
                    target.ObserveDataReceived(10d);

                    //input event
                    _serialPortMock.Raise(port => port.DataReceived += null, "Test message");
                    //wait 20 sec. - more than timeout limit
                    testScheduler.AdvanceBy(TimeSpan.FromSeconds(20).Ticks);
                    Assert.Fail("No exception was thrown");
                }
                catch (Exception ex)
                {
                    Assert.IsTrue(ex is TimeoutException);
                }
            }