public void Check_Set_Value_From_String(string value, bool targetResult)
        {
            // Arrange
            var item = new BytesPlcItem(0, 0, true, new byte[0]);

            // Act
            var result = item.SetValue(value);

            // Assert
            Assert.That(result, Is.EqualTo(targetResult));
        }
Пример #2
0
        public void CheckTypedValueEquality()
        {
            // Arrange
            var data       = Enumerable.Range(byte.MinValue, byte.MaxValue).Select(value => (byte)value).ToArray();
            var plcItem    = new BytesPlcItem(dataBlock: 1234, position: 10, initialValue: data);
            var typedValue = plcItem.Value;

            // Act
            var underlyingValue = (byte[])((IPlcItem)plcItem).Value;

            // Assert
            Assert.True(typedValue.SequenceEqual(underlyingValue));
        }
Пример #3
0
        public void Check_Initial_Data()
        {
            // Arrange
            var targetValue = TargetValue;
            var targetData  = TargetValue;

            // Act
            var item = new BytesPlcItem(0, 0, targetValue);

            // Assert: Number → Data
            Assert.That(item.Value, Is.EqualTo(targetValue));
            Assert.That((byte[])((IPlcItem)item).Value, Is.EqualTo(targetData));
        }
Пример #4
0
        public void CheckClone()
        {
            // Arrange
            var      data    = Enumerable.Range(byte.MinValue, byte.MaxValue).Select(value => (byte)value).ToArray();
            IPlcItem plcItem = new BytesPlcItem(dataBlock: 1234, position: 10, initialValue: data);             //! Explicitly cast this to 'IPlcItem' so that its 'Value' is a 'BitCollection'.

            // Act
            IPlcItem clonedPlcItem = plcItem.Clone();

            // Assert
            Assert.True(plcItem.Equals(clonedPlcItem));
            Assert.False(Object.ReferenceEquals(plcItem, clonedPlcItem));
            Assert.True(plcItem.Value.Equals(clonedPlcItem.Value));
        }
Пример #5
0
        public void Check_FromData()
        {
            // Arrange
            var targetValue = TargetValue;
            var targetData  = TargetValue;
            var item        = new BytesPlcItem(0, 0, (ushort)targetData.Length);

            // Act: Data → Number
            ((IPlcItem)item).Value.TransferValuesFrom(targetData);

            // Assert
            Assert.That(item.Value, Is.EqualTo(targetValue));
            Assert.That((byte[])((IPlcItem)item).Value, Is.EqualTo(targetData));
        }
Пример #6
0
        public void Check_ToData()
        {
            // Arrange
            var targetValue = TargetValue;
            var targetData  = TargetValue;
            var item        = new BytesPlcItem(0, 0, (ushort)targetData.Length);

            // Act: Number → Data
            item.Value = targetValue;

            // Assert
            Assert.That(item.Value, Is.EqualTo(targetValue));
            Assert.That((byte[])((IPlcItem)item).Value, Is.EqualTo(targetData));
        }
Пример #7
0
        public void Check_Clone()
        {
            var item  = new BytesPlcItem(0, 0, TargetValue);
            var clone = item.Clone();

            // Check equality (Equals is overriden).
            Assert.AreEqual(item, clone);

            // Check the value.
            Assert.AreEqual(item.Value, clone.Value);

            // Check if both items are different references.
            Assert.False(Object.ReferenceEquals(item, clone));
        }
Пример #8
0
        public void ReadBytes()
        {
            var bytesItem = new BytesPlcItem(dataBlock: this.Data.Datablock, position: 0, byteAmount: (ushort)this.Data.TargetBytes.Length);

            base.ExecuteTest
            (
                async(plc) =>
            {
                var result = await plc.ReadItemAsync(bytesItem);
                Assert.True(bytesItem.Value == result);                         //! Because of the conversion, this is sequentially equal, but not referential.
                Assert.True(result.SequenceEqual(this.Data.TargetBytes));
            }
            );
        }
        public void WriteBytes()
        {
            var writeItem = new BytesPlcItem(dataBlock: this.Data.Datablock, position: 4, initialValue: this.Data.WriteBytes);

            //var writeItem = new BytesPlcItem(dataBlock: Data.Datablock, position: 0, initialValue: Data.TargetBytes);

            base.ExecuteTest
            (
                async(plc) =>
            {
                var result = await plc.WriteItemWithValidationAsync(writeItem);
                Assert.True(result);
            }
            );
        }
        public async Task MonitorDifferentIdenticalItems()
        {
            var firstMonitoredItem  = new BytesPlcItem(dataBlock: Data.Datablock, position: Data.StartOfFixedBytes, byteAmount: 2);
            var secondMonitoredItem = new UInt16PlcItem(dataBlock: Data.Datablock, position: Data.StartOfFixedBytes);
            var thirdMonitoredItem  = new BitsPlcItem(dataBlock: Data.Datablock, position: Data.StartOfFixedBytes, bitPosition: BitPosition.X0, bitAmount: 16);

            var differentReadItems = new HashSet <IPlcItem>(new ReferenceComparer());
            var mockPlc            = new MockPlc();
            Func <ICollection <IPlcItem>, CancellationToken, Task> performReadItemsAsyncMock = (plcItems, cancellationToken) =>
            {
                foreach (var plcItem in plcItems)
                {
                    differentReadItems.Add(plcItem);
                }
                return(mockPlc.ReadItemsAsync(plcItems, cancellationToken));
            };

            // Create a mock of MockPlc that signals which items are read.
            var plcMock = new Mock <IPlc>(behavior: MockBehavior.Strict)
            {
                CallBase = true,
            };

            plcMock
            .Setup(x => x.ReadItemsAsync(It.IsAny <IPlcItem[]>(), It.IsAny <CancellationToken>()))
            .Returns(performReadItemsAsyncMock)
            .Verifiable()
            ;

            // Create the monitor with the mocked instance.
            var monitoredPlc = new PollingMonitorablePlc(plcMock.Object);

            // Start monitoring those items.
            monitoredPlc.MonitorItem(firstMonitoredItem);
            monitoredPlc.MonitorItem(secondMonitoredItem);
            monitoredPlc.MonitorItem(thirdMonitoredItem);
            monitoredPlc.Start();
            await Task.Delay(1000);

            monitoredPlc.Stop();
            Assert.AreEqual(1, differentReadItems.Count);
        }
Пример #11
0
        public virtual void ReadUndefinedDatablock()
        {
            // Arrange
            var validItem   = new BytesPlcItem(dataBlock: this.Data.Datablock, position: 0, byteAmount: (ushort)this.Data.TargetBytes.Length);
            var invalidItem = new BytesPlcItem(dataBlock: ushort.MaxValue, position: 1, byteAmount: 100);             //! Hopefully that datablock doesn't exists in the test system...

            base.ExecuteTest
            (
                (plc) =>
            {
                // Act + Assert
                var ex = Assert.ThrowsAsync <ReadPlcException>(() => plc.ReadItemsAsync(new[] { validItem, invalidItem }));
                Assert.That(ex.ValidItems.FirstOrDefault(), Is.EqualTo(validItem));
                Assert.That(ex.FailedItems.FirstOrDefault().FailedItem, Is.EqualTo(invalidItem));

#if NET45
                return(CompletedTask);
#else
                return(System.Threading.Tasks.Task.CompletedTask);
#endif
            }
            );
        }
Пример #12
0
        public void CheckItemBuilder()
        {
            var itemBuilder = new PlcItemBuilder();

            var plcItem = itemBuilder
                          .Construct("Generic")
                          .ForData()
                          .AtDatablock(0)
                          .AtPosition(0, BitPosition.X2)
                          .ForBitAmount(3)
                          .Build()
            ;

            Assert.AreEqual((uint)3, plcItem.Value.Length);

            BitsPlcItem bitsItem = itemBuilder
                                   .ConstructBitsPlcItem()
                                   .ForFlags()
                                   .AtPosition(20, BitPosition.X5)
                                   .ForBitAmount(5)
                                   .Build()
            ;

            Assert.AreEqual((uint)5, ((IPlcItem)bitsItem).Value.Length);

            BitPlcItem bitItem = itemBuilder
                                 .ConstructBitPlcItem("Bit")
                                 .ForData()
                                 .AtDatablock(0)
                                 .AtPosition(5)
                                 .AsSet()
                                 .Build()
            ;

            Assert.AreEqual((uint)1, ((IPlcItem)bitItem).Value.Length);

            BytesPlcItem bytesItem = itemBuilder
                                     .ConstructBytesPlcItem(identifier: "Bytes")
                                     .ForOutput()
                                     .AtPosition(0)
                                     .WithInitialValue(new[] { byte.MinValue, byte.MaxValue })
                                     .Build()
            ;

            Assert.AreEqual((uint)2, ((IPlcItem)bytesItem).Value.ByteLength);

            BytePlcItem byteItem = itemBuilder
                                   .ConstructBytePlcItem("Byte")
                                   .ForInput()
                                   .AtPosition(10)
                                   .WithInitialValue(Byte.MaxValue)
                                   .Build()
            ;

            Assert.AreEqual((uint)sizeof(Byte), ((IPlcItem)byteItem).Value.ByteLength);

            Int16PlcItem int16Item = itemBuilder
                                     .ConstructInt16PlcItem("Int16")
                                     .AtDatablock(0)
                                     .AtPosition(1)
                                     .WithoutInitialValue()
                                     .Build()
            ;

            Assert.AreEqual((uint)sizeof(Int16), ((IPlcItem)int16Item).Value.ByteLength);

            Int32PlcItem int32Item = itemBuilder
                                     .ConstructInt32PlcItem("Int32")
                                     .AtDatablock(0)
                                     .AtPosition(1)
                                     .WithInitialValue(int.MinValue)
                                     .Build()
            ;

            Assert.AreEqual((uint)sizeof(Int32), ((IPlcItem)int32Item).Value.ByteLength);

            Int64PlcItem int64Item = itemBuilder
                                     .ConstructInt64PlcItem("Int64")
                                     .AtDatablock(0)
                                     .AtPosition(1)
                                     .WithInitialValue(long.MinValue)
                                     .Build()
            ;

            Assert.AreEqual((uint)sizeof(Int64), ((IPlcItem)int64Item).Value.ByteLength);

            UInt16PlcItem uInt16Item = itemBuilder
                                       .ConstructUInt16PlcItem("UInt16")
                                       .AtDatablock(0)
                                       .AtPosition(1)
                                       .WithoutInitialValue()
                                       .Build()
            ;

            Assert.AreEqual((uint)sizeof(UInt16), ((IPlcItem)uInt16Item).Value.ByteLength);

            UInt32PlcItem uInt32PlcItem = itemBuilder
                                          .ConstructUInt32PlcItem("UInt32")
                                          .AtDatablock(0)
                                          .AtPosition(1)
                                          .WithInitialValue(uint.MaxValue)
                                          .Build()
            ;

            Assert.AreEqual((uint)sizeof(UInt32), ((IPlcItem)uInt32PlcItem).Value.ByteLength);

            UInt64PlcItem uInt64PlcItem = itemBuilder
                                          .ConstructUInt64PlcItem("UInt64")
                                          .AtDatablock(0)
                                          .AtPosition(1)
                                          .WithInitialValue(ulong.MaxValue)
                                          .Build()
            ;

            Assert.AreEqual((uint)sizeof(UInt64), ((IPlcItem)uInt64PlcItem).Value.ByteLength);

            WordPlcItem wordItem = itemBuilder
                                   .ConstructWordPlcItem("Word")
                                   .AtDatablock(0)
                                   .AtPosition(2)
                                   .WithInitialValue(32458)
                                   .Build()
            ;

            Assert.AreEqual((uint)2, ((IPlcItem)wordItem).Value.ByteLength);

            DWordPlcItem dwordItem = itemBuilder
                                     .ConstructDWordPlcItem("DWord")
                                     .AtDatablock(0)
                                     .AtPosition(2)
                                     .WithInitialValue(uint.MaxValue)
                                     .Build()
            ;

            Assert.AreEqual((uint)4, ((IPlcItem)dwordItem).Value.ByteLength);

            LWordPlcItem lwordItem = itemBuilder
                                     .ConstructLWordPlcItem("LWord")
                                     .AtDatablock(0)
                                     .AtPosition(2)
                                     .WithInitialValue(ulong.MaxValue)
                                     .Build()
            ;

            Assert.AreEqual((uint)8, ((IPlcItem)lwordItem).Value.ByteLength);

            TextPlcItem textItem = itemBuilder
                                   .ConstructTextPlcItem("Text")
                                   .WithEncoding(Encoding.UTF7)
                                   .AtDatablock(0)
                                   .AtPosition(3)
                                   .WithInitialValue("Some String")
                                   .Build()
            ;

            Assert.AreEqual((uint)Encoding.UTF7.GetBytes("Some String").Length, ((IPlcItem)textItem).Value.ByteLength);

            Utf8PlcItem utf8Item = itemBuilder
                                   .ConstructUtf8PlcItem("UTF-8")
                                   .AtDatablock(0)
                                   .AtPosition(4)
                                   .WithLength(10)
                                   .Build()
            ;

            Assert.AreEqual((uint)10, ((IPlcItem)utf8Item).Value.ByteLength);

            var initialText = "String whose length fits into a single byte.";
            DynamicUtf8PlcItem secondDynamicUtf8Item = itemBuilder
                                                       .ConstructUtf8PlcItem("UTF-8")
                                                       .AtDatablock(0)
                                                       .AtPosition(4)
                                                       .WithDynamicItemFromInitialValue(initialText)
                                                       .BuildDynamic()
            ;

            Assert.That(secondDynamicUtf8Item.LengthPlcItem.Value, Is.EqualTo((uint)Encoding.UTF8.GetBytes(initialText).Length));
            Assert.AreEqual(initialText, secondDynamicUtf8Item.Value);

            var items = new []
            {
                plcItem,
                bitsItem,
                bitItem,
                bytesItem,
                byteItem,
                int16Item,
                int32Item,
                int64Item,
                uInt16Item,
                uInt32PlcItem,
                uInt64PlcItem,
                wordItem,
                dwordItem,
                lwordItem,
                textItem,
                utf8Item,
                secondDynamicUtf8Item,
            };

            foreach (var item in items)
            {
                Debug.WriteLine($" -> {item}");
            }
        }