public void TestInitialise()
        {
            _Statistics = Factory.Singleton.Resolve<IStatistics>().Singleton;
            _Statistics.Initialise();
            _Statistics.ResetConnectionStatistics();
            _Statistics.ResetMessageCounters();

            _OriginalClassFactory = Factory.TakeSnapshot();

            _RuntimeEnvironment = TestUtilities.CreateMockSingleton<IRuntimeEnvironment>();
            _RuntimeEnvironment.Setup(r => r.IsTest).Returns(true);

            _Port30003Translator = TestUtilities.CreateMockImplementation<IBaseStationMessageTranslator>();
            _ModeSTranslator = TestUtilities.CreateMockImplementation<IModeSTranslator>();
            _AdsbTranslator = TestUtilities.CreateMockImplementation<IAdsbTranslator>();
            _RawMessageTranslator = new Mock<IRawMessageTranslator>(MockBehavior.Default) { DefaultValue = DefaultValue.Mock };
            _ModeSParity = TestUtilities.CreateMockImplementation<IModeSParity>();
            _ModeSMessage = new ModeSMessage();
            _AdsbMessage = new AdsbMessage(_ModeSMessage);
            _Port30003Message = new BaseStationMessage();
            _Port30003Translator.Setup(r => r.Translate(It.IsAny<string>())).Returns(_Port30003Message);
            _AdsbTranslator.Setup(r => r.Translate(It.IsAny<ModeSMessage>())).Returns(_AdsbMessage);
            _ModeSTranslator.Setup(r => r.Translate(It.IsAny<byte[]>())).Returns(_ModeSMessage);
            _ModeSTranslator.Setup(r => r.Translate(It.IsAny<byte[]>(), It.IsAny<int>())).Returns(_ModeSMessage);
            _RawMessageTranslator.Setup(r => r.Translate(It.IsAny<DateTime>(), It.IsAny<ModeSMessage>(), It.IsAny<AdsbMessage>())).Returns(_Port30003Message);

            _Listener = Factory.Singleton.Resolve<IListener>();
            _Provider = new MockListenerProvider();
            _BytesExtractor = new MockMessageBytesExtractor();

            _ExceptionCaughtEvent = new EventRecorder<EventArgs<Exception>>();
            _ConnectionStateChangedEvent = new EventRecorder<EventArgs>();
            _ModeSMessageReceivedEvent = new EventRecorder<ModeSMessageEventArgs>();
            _Port30003MessageReceivedEvent = new EventRecorder<BaseStationMessageEventArgs>();
            _SourceChangedEvent = new EventRecorder<EventArgs>();

            _Listener.ConnectionStateChanged += _ConnectionStateChangedEvent.Handler;
            _Listener.ExceptionCaught += _ExceptionCaughtEvent.Handler;
            _Listener.ModeSMessageReceived += _ModeSMessageReceivedEvent.Handler;
            _Listener.Port30003MessageReceived += _Port30003MessageReceivedEvent.Handler;
            _Listener.SourceChanged += _SourceChangedEvent.Handler;

            _ExceptionCaughtEvent.EventRaised += DefaultExceptionCaughtHandler;
        }
        public void Listener_ChangeSource_With_Reconnec_True_Connects_New_Provider_Even_If_Not_Originally_Connected()
        {
            var firstProvider = new MockListenerProvider();
            var firstExtractor = new MockMessageBytesExtractor();
            firstProvider.ConfigureForConnect();

            _Listener.ChangeSource(firstProvider.Object, firstExtractor.Object, _RawMessageTranslator.Object, false);

            _Provider.ConfigureForConnect();
            _Listener.ChangeSource(_Provider.Object, _BytesExtractor.Object, _RawMessageTranslator.Object, true);

            _Provider.Verify(p => p.BeginConnect(It.IsAny<AsyncCallback>()), Times.Once());
        }
        public void Listener_ChangeSource_Disconnects_Existing_Provider_Even_If_Not_Connected()
        {
            var firstProvider = new MockListenerProvider();
            var firstExtractor = new MockMessageBytesExtractor();
            firstProvider.ConfigureForConnect();

            _Listener.ChangeSource(firstProvider.Object, firstExtractor.Object, _RawMessageTranslator.Object, false);

            _Provider.ConfigureForConnect();
            _Listener.ChangeSource(_Provider.Object, _BytesExtractor.Object, _RawMessageTranslator.Object, false);

            firstProvider.Verify(p => p.Close(), Times.Once());
        }
        public void Listener_ChangeSource_AutoReconnect_Does_Not_Reconnect_If_Clear()
        {
            var firstProvider = new MockListenerProvider();
            var firstExtractor = new MockMessageBytesExtractor();
            firstProvider.ConfigureForConnect();

            _Listener.ChangeSource(firstProvider.Object, firstExtractor.Object, _RawMessageTranslator.Object, false);
            _Listener.Connect(false);

            _Provider.ConfigureForConnect();
            _Listener.ChangeSource(_Provider.Object, _BytesExtractor.Object, _RawMessageTranslator.Object, false);

            firstProvider.Verify(p => p.Close(), Times.Once());
            _Provider.Verify(p => p.BeginConnect(It.IsAny<AsyncCallback>()), Times.Never());
        }
        public void Listener_ChangeSource_AutoReconnect_Reconnects_If_Set()
        {
            var firstProvider = new MockListenerProvider();
            var firstExtractor = new MockMessageBytesExtractor();
            firstProvider.Setup(p => p.Close()).Callback(() => {
                Assert.AreSame(firstProvider.Object, _Listener.Provider);
                Assert.AreSame(firstExtractor.Object, _Listener.BytesExtractor);
            });
            firstProvider.ConfigureForConnect();

            _Listener.ChangeSource(firstProvider.Object, firstExtractor.Object, _RawMessageTranslator.Object, false);
            _Listener.Connect(false);

            _Provider.ConfigureForConnect();
            _Listener.ChangeSource(_Provider.Object, _BytesExtractor.Object, _RawMessageTranslator.Object, true);

            firstProvider.Verify(p => p.Close(), Times.Once());
            _Provider.Verify(p => p.BeginConnect(It.IsAny<AsyncCallback>()), Times.Once());
        }
        public void Listener_ChangeSource_Is_Not_Raised_If_Nothing_Changes()
        {
            var newProvider = new MockListenerProvider();
            var newExtractor = new MockMessageBytesExtractor();
            var newRawMessageTranslator = new Mock<IRawMessageTranslator>(MockBehavior.Default) { DefaultValue = DefaultValue.Mock };

            _Listener.ChangeSource(_Provider.Object, _BytesExtractor.Object, _RawMessageTranslator.Object, false);
            Assert.AreEqual(1, _SourceChangedEvent.CallCount);

            _Listener.ChangeSource(newProvider.Object, _BytesExtractor.Object, _RawMessageTranslator.Object, false);
            Assert.AreEqual(2, _SourceChangedEvent.CallCount);

            _Listener.ChangeSource(newProvider.Object, newExtractor.Object, _RawMessageTranslator.Object, false);
            Assert.AreEqual(3, _SourceChangedEvent.CallCount);

            _Listener.ChangeSource(newProvider.Object, newExtractor.Object, newRawMessageTranslator.Object, false);
            Assert.AreEqual(4, _SourceChangedEvent.CallCount);

            _Listener.ChangeSource(newProvider.Object, newExtractor.Object, newRawMessageTranslator.Object, false);
            Assert.AreEqual(4, _SourceChangedEvent.CallCount);
        }