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()); }
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); }
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); }
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); }); }