public async Task Timeout_throws_a_LibPlcTagException()
        {
            // Arrange
            var nativeTag = new Mock <INativeTag>();

            nativeTag                                                       // The initial creation of the tag object returns a status, so we return pending
            .Setup(m => m.plc_tag_create(It.IsAny <string>(), 0))
            .Returns((int)Status.Pending);

            nativeTag                                                       // Subsequent calls to determine the tag status should still return pending
            .Setup(m => m.plc_tag_status(It.IsAny <int>()))
            .Returns((int)Status.Pending);

            var tag = new NativeTagWrapper(nativeTag.Object)
            {
                Timeout = TimeSpan.FromMilliseconds(500)
            };

            // Act


            // Assert
            var ex = await Assert.ThrowsAsync <LibPlcTagException>(async() => {
                await tag.InitializeAsync();
            });

            Assert.Equal(Status.ErrorTimeout.ToString(), ex.Message);
        }
        public async Task Timeout_returns_pending_but_eventually_ok()
        {
            // Arrange
            var nativeTag = new Mock <INativeTag>();

            nativeTag                                                       // The initial creation of the tag object returns a status, so we return pending
            .Setup(m => m.plc_tag_create(It.IsAny <string>(), 0))
            .Returns((int)Status.Pending);

            nativeTag
            .SetupSequence(m => m.plc_tag_status(It.IsAny <int>()))
            .Returns((int)Status.Pending)
            .Returns((int)Status.Pending)
            .Returns((int)Status.Pending)
            .Returns((int)Status.Pending)
            .Returns((int)Status.Pending)
            .Returns((int)Status.Pending)
            .Returns((int)Status.Pending)
            .Returns((int)Status.Ok);

            var tag = new NativeTagWrapper(nativeTag.Object)
            {
                Timeout = TimeSpan.FromMilliseconds(500)
            };

            // Act
            await tag.InitializeAsync();

            // Assert
            Assert.Equal(Status.Ok, tag.GetStatus());
        }
Exemple #3
0
        public void Can_not_use_if_already_disposed()
        {
            // Arrange
            var nativeTag = new Mock <INativeTag>();
            var tag       = new NativeTagWrapper(nativeTag.Object);

            // Act
            tag.Dispose();

            // Assert
            Assert.Throws <ObjectDisposedException>(() => tag.GetStatus());
        }
        public void Status_ok_when_first_created()
        {
            // Arrange
            var nativeTag = new Mock <INativeTag>();
            var tag       = new NativeTagWrapper(nativeTag.Object);

            // Act

            // Assert
            var status = tag.GetStatus();

            Assert.Equal(Status.Ok, status);
        }
        public void Attribute_string_does_not_contain_unset_properties()
        {
            // Arrange
            var nativeTag = new Mock <INativeTag>();
            var tag       = new NativeTagWrapper(nativeTag.Object);

            // Act
            tag.Initialize();


            // Assert
            nativeTag.Verify(m => m.plc_tag_create("", It.IsAny <int>()), Times.Once);
        }
Exemple #6
0
        public void Destroy_is_called_if_initialized_and_disposed()
        {
            // Arrange
            var nativeTag = new Mock <INativeTag>();
            var tag       = new NativeTagWrapper(nativeTag.Object);

            // Act
            tag.Initialize();
            tag.Dispose();

            // Assert
            nativeTag.Verify(m => m.plc_tag_destroy(It.IsAny <int>()), Times.Once);
        }
        public void Attribute_string_formatted_correctly()
        {
            // Arrange
            var nativeTag = new Mock <INativeTag>();
            var tag       = new NativeTagWrapper(nativeTag.Object)
            {
                ElementSize  = 4,
                ElementCount = 10,
                PlcType      = PlcType.Slc500,
                Name         = "TagName",
            };


            // Act
            tag.Initialize();


            // Assert
            nativeTag.Verify(m => m.plc_tag_create("plc=slc500&elem_size=4&elem_count=10&name=TagName", It.IsAny <int>()), Times.Once);
        }
Exemple #8
0
        public void Finalizer_calls_destroy()
        {
            // See https://www.inversionofcontrol.co.uk/unit-testing-finalizers-in-csharp/


            // Arrange
            var    nativeTag = new Mock <INativeTag>();
            Action dispose   = () =>
            {
                // This will go out of scope after dispose() is executed, so the garbage collector will be able to call the finalizer
                var tag = new NativeTagWrapper(nativeTag.Object);
                tag.Initialize();
            };

            // Act
            dispose();
            GC.Collect(0, GCCollectionMode.Forced);
            GC.WaitForPendingFinalizers();

            // Assert
            nativeTag.Verify(m => m.plc_tag_destroy(It.IsAny <int>()), Times.Once);
        }
        public async Task Cancelled_cancellation_token_throws_a_TaskCanceledException()
        {
            // Arrange
            var nativeTag = new Mock <INativeTag>();

            nativeTag                                                       // The initial creation of the tag object returns a status, so we return pending
            .Setup(m => m.plc_tag_create(It.IsAny <string>(), 0))
            .Returns((int)Status.Pending);

            nativeTag                                                       // Subsequent calls to determine the tag status should still return pending
            .Setup(m => m.plc_tag_status(It.IsAny <int>()))
            .Returns((int)Status.Pending);

            var tag = new NativeTagWrapper(nativeTag.Object);
            var cts = new CancellationTokenSource();

            // Act
            cts.CancelAfter(500);

            // Assert
            await Assert.ThrowsAsync <TaskCanceledException>(async() => {
                await tag.InitializeAsync(cts.Token);
            });
        }