public void PortValueSingleEncoder_Decode_Short(string dataAsString, byte expectedPortId, PortModeInformationDataType expectedDataType, short[] expectedData)
 => PortValueSingleEncoder_Decode <short>(dataAsString, expectedPortId, expectedDataType, expectedData);
        private void PortValueSingleEncoder_Decode <T>(string dataAsString, byte expectedPortId, PortModeInformationDataType expectedDataType, T[] expectedData)
        {
            var knowledge = new ProtocolKnowledge();

            var serviceProvider = new ServiceCollection()
                                  .AddPoweredUp()
                                  .BuildServiceProvider();


            KnowledgeManager.ApplyDynamicProtocolKnowledge(new HubAttachedIOForAttachedDeviceMessage(0x63, DeviceType.TechnicMediumHubTiltSensor, new Version("0.0.0.1"), new Version("0.0.0.1"))
            {
                HubId = 0
            }, knowledge, serviceProvider.GetService <IDeviceFactory>());

            // arrange
            var data = BytesStringUtil.StringToData(dataAsString);

            // act
            var message = MessageEncoder.Decode(data, knowledge) as PortValueSingleMessage;

            // assert
            Assert.Collection(message.Data,
                              d =>
            {
                Assert.Equal(d.PortId, expectedPortId);
                Assert.Equal(d.DataType, expectedDataType);

                if (d is PortValueData <T> actual)
                {
                    Assert.Collection(actual.InputValues, expectedData.Cast <T>().Select <T, Action <T> >(expected => actual => Assert.Equal(expected, actual)).ToArray());
                }
            }
                              );
        }
    public void PortModeInformationEncoder_Decode_ValueFormat(string data, byte expectedPort, byte expectedMode, PortModeInformationType expectedType, byte expectedNr, PortModeInformationDataType expectedDataType, byte expectedFigures, byte expectedDecimals)
    {
        var message = Decode <PortModeInformationForValueFormatMessage>(data);

        // assert
        DefaultAsserts(expectedPort, expectedMode, expectedType, message);
        Assert.Equal(expectedNr, message.NumberOfDatasets);
        Assert.Equal(expectedDataType, message.DatasetType);
        Assert.Equal(expectedFigures, message.TotalFigures);
        Assert.Equal(expectedDecimals, message.Decimals);
    }