public void GivenOneMessageIsInvalid_WhenSendMultipleMessages_MustSendAtLeastTheValidMessages()
        {
            _testee.MonitorEvents();

            // PLC sends valid handshake
            _tagListener
            .Setup(t => t.ReadTagSynchronously(It.IsAny <Tag>()))
            .Callback <Tag>(tag => { tag.Value = DataStateEnum.DataChannelFree; });
            int writeCalls = 0;

            _tagController
            .Setup(t => t.WriteTag(It.IsAny <Tag>(), It.IsAny <object>()))
            .Callback(() => writeCalls++);

            Action act = () =>
            {
                var udt        = new ValidDataUdtTest();
                var invalidUdt = new InvalidDataUdtTest();

                _testee.AddAsyncWriteTask(_tag, udt);
                _testee.AddAsyncWriteTask(_tag, invalidUdt);
                _testee.AddAsyncWriteTask(_tag, udt);
                _testee.WaitWriteComplete();
            };

            act.ShouldNotThrow("DataChannelManager must never throw an exception, but only error events");
            _testee.ShouldRaise("CommunicationProblemOccured");
            writeCalls.Should().Be(2, "2 messages are valid and 1 is invalid (should be skipped)");
        }
        public void WhenWriteWrongDataUdtToChannel_MustThrowException()
        {
            _testee.MonitorEvents();

            Action act = () =>
            {
                var udt = new InvalidDataUdtTest();

                _testee.AddAsyncWriteTask(_tag, udt);
                _testee.WaitWriteComplete();
            };

            act.ShouldNotThrow("DataChannelManager must never throw an exception, but only error events");
            _testee.ShouldRaise("CommunicationProblemOccured");
        }