From 37dabc4150730784a076417652ad18f63a992982 Mon Sep 17 00:00:00 2001 From: Stefan Gmeiner Date: Fri, 11 Feb 2022 13:26:56 +0100 Subject: [PATCH 01/21] #5: Update Twin-ADS Lib to V5. --- NET/CallAds/CallAds.csproj | 2 +- NET/CallAds/PcsCommand2.cs | 34 +- NET/CallAds/Program.cs | 8 +- NET/Directory.Build.props | 12 +- .../Mbc.Ads.Helper.ReadType.csproj | 12 + NET/Mbc.Ads.Helper.ReadType/Program.cs | 82 +++ .../Properties/launchSettings.json | 8 + .../AdsBinaryAccesorFactoryTest.cs | 353 ++++++++++ NET/Mbc.Ads.Mapper.Test/AdsMapperTest.cs | 30 +- .../AdsMapperTestFakePlcData.cs | 665 ++++++++---------- .../AdsSymbolReaderTest.cs | 4 +- .../AdsBinaryAccessorFactory.cs | 647 +++++++++++++++++ NET/Mbc.Ads.Mapper/AdsMapper.cs | 43 +- NET/Mbc.Ads.Mapper/AdsMapperConfiguration.cs | 123 ++-- NET/Mbc.Ads.Mapper/AdsMappingDefinition.cs | 31 +- NET/Mbc.Ads.Mapper/AdsStreamAccessor.cs | 231 ------ NET/Mbc.Ads.Mapper/AdsSymbolReader.cs | 21 +- NET/Mbc.Ads.Mapper/IAdsDataReader.cs | 12 + NET/Mbc.Ads.Mapper/IAdsDataWriter.cs | 12 + NET/Mbc.Ads.Mapper/IAdsSymbolInfo.cs | 11 +- NET/Mbc.Ads.Mapper/Mbc.Ads.Mapper.csproj | 7 +- NET/Mbc.Ads.Utils/Mbc.Ads.Utils.csproj | 4 +- .../SumCommand/SumHandleReadData.cs | 72 ++ .../SumCommand/SumHandleReadStream.cs | 13 +- .../SumCommand/SumHandleWriteData.cs | 89 +++ .../SumCommand/SumHandleWriteStream.cs | 27 +- .../Mbc.Pcs.Net.Alarm.Mediator.csproj | 4 +- .../Mbc.Pcs.Net.Alarm.Service.Test.csproj | 2 +- .../Mbc.Pcs.Net.Alarm.Service.csproj | 4 +- .../Mbc.Pcs.Net.Alarm.Test.csproj | 2 +- .../Mbc.Pcs.Net.Alarm.csproj | 4 +- .../CommandOutputBuilderTest.cs | 2 +- .../CommandWithMapperArgsTest.cs | 6 +- .../Mbc.Pcs.Net.Command.Test.csproj | 2 +- .../MbcPlcCommandTestBase.cs | 2 +- .../PlcCommandAsyncTests.cs | 23 +- .../AdsStreamCommandArgumentHandler.cs | 57 +- .../CommandArgumentHandler.cs | 34 +- .../Mbc.Pcs.Net.Command.csproj | 4 +- NET/Mbc.Pcs.Net.Command/PlcCommand.cs | 8 +- .../PrimitiveCommandArgumentHandler.cs | 34 +- .../Command/AdsCommandConnectionFake.cs | 87 ++- .../Mbc.Pcs.Net.Test.Util.csproj | 4 +- NET/Mbc.Pcs.Net.Test/Mbc.Pcs.Net.Test.csproj | 2 +- NET/Mbc.Pcs.Net.sln | 8 +- .../Connection/PlcAdsConnectionProvider.cs | 33 +- NET/Mbc.Pcs.Net/Mbc.Pcs.Net.csproj | 4 +- NET/Mbc.Pcs.Net/State/PlcAdsStateReader.cs | 21 +- NET/Samples/Cli/Program.cs | 6 +- 49 files changed, 1943 insertions(+), 963 deletions(-) create mode 100644 NET/Mbc.Ads.Helper.ReadType/Mbc.Ads.Helper.ReadType.csproj create mode 100644 NET/Mbc.Ads.Helper.ReadType/Program.cs create mode 100644 NET/Mbc.Ads.Helper.ReadType/Properties/launchSettings.json create mode 100644 NET/Mbc.Ads.Mapper.Test/AdsBinaryAccesorFactoryTest.cs create mode 100644 NET/Mbc.Ads.Mapper/AdsBinaryAccessorFactory.cs delete mode 100644 NET/Mbc.Ads.Mapper/AdsStreamAccessor.cs create mode 100644 NET/Mbc.Ads.Mapper/IAdsDataReader.cs create mode 100644 NET/Mbc.Ads.Mapper/IAdsDataWriter.cs create mode 100644 NET/Mbc.Ads.Utils/SumCommand/SumHandleReadData.cs create mode 100644 NET/Mbc.Ads.Utils/SumCommand/SumHandleWriteData.cs diff --git a/NET/CallAds/CallAds.csproj b/NET/CallAds/CallAds.csproj index 1a6d1b4..4ca5c77 100644 --- a/NET/CallAds/CallAds.csproj +++ b/NET/CallAds/CallAds.csproj @@ -63,7 +63,7 @@ - 4.3.11 + 5.0.528 diff --git a/NET/CallAds/PcsCommand2.cs b/NET/CallAds/PcsCommand2.cs index a1e57f3..69613bc 100644 --- a/NET/CallAds/PcsCommand2.cs +++ b/NET/CallAds/PcsCommand2.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Diagnostics; using System.Threading; +using TwinCAT; using TwinCAT.Ads; namespace AtomizerUI.link @@ -11,27 +12,28 @@ namespace AtomizerUI.link public class PcsCommand2 where Tout : new() { private const int DEFAULT_TIME_OUT_SECOND = 8; - private readonly TcAdsClient _adsClient; + private readonly IAdsConnection _adsClient; /// /// Path to the PLC Command variable /// private readonly string _adsCommandVar; private IDictionary _commandSymbols; - public PcsCommand2(TcAdsClient adsClient, string adsCommandVar) + public PcsCommand2(IAdsConnection adsClient, string adsCommandVar) { if (!adsClient.IsConnected) { throw new AdsException($"The ADS client use in the {nameof(PcsCommand2)} is not connected."); } - _adsClient = adsClient; + _adsClient = adsClient; _adsCommandVar = adsCommandVar; Timeout = TimeSpan.FromSeconds(DEFAULT_TIME_OUT_SECOND); } - public PcsCommand2(TcAdsClient adsClient, string commandVar, TimeSpan timeout) : this(adsClient, commandVar) + public PcsCommand2(IAdsConnection adsClient, string commandVar, TimeSpan timeout) + : this(adsClient, commandVar) { Timeout = timeout; } @@ -76,7 +78,7 @@ public Tout Execute(Tin argsIn) Value = prop.GetValue(argsIn), TcAdsDataType = _commandSymbols[symbolFullPath] }); - } + } } _adsClient.WriteSumVariables(symbolsToWrite); @@ -84,7 +86,7 @@ public Tout Execute(Tin argsIn) _adsClient.WriteObjectVariables(argsIn, _adsCommandVar, _commandSymbols); return Execute(); - } + } public Tout Execute() { @@ -97,7 +99,7 @@ public Tout Execute(CancellationToken cancelToken) try { SetExecuteFlag(); - + var dataExch = new DataExchange(); var cmdHandle = _adsClient.AddDeviceNotificationEx($"{_adsCommandVar}.stHandshake", AdsTransMode.OnChange, TimeSpan.Zero, TimeSpan.Zero, dataExch, typeof(CommandControlData)); @@ -127,7 +129,7 @@ public Tout Execute(CancellationToken cancelToken) var cmdHndl = _adsClient.CreateVariableHandle(_adsCommandVar + ".stHandshake"); try { - var ccd = (CommandControlData) _adsClient.ReadAny(cmdHndl, typeof (CommandControlData)); + var ccd = (CommandControlData)_adsClient.ReadAny(cmdHndl, typeof(CommandControlData)); if (!ccd.Execute && !ccd.Busy) { break; @@ -136,7 +138,7 @@ public Tout Execute(CancellationToken cancelToken) finally { _adsClient.DeleteVariableHandle(cmdHndl); - } + } throw new PcsCommandTimeoutException(); } @@ -146,14 +148,14 @@ public Tout Execute(CancellationToken cancelToken) { _adsClient.DeleteDeviceNotification(cmdHandle); } - } + } finally { _adsClient.AdsNotificationEx -= OnAdsnotificationEx; } // Read Result values - return ReadResult(); + return ReadResult(); } private void ReadSymbols() @@ -169,18 +171,18 @@ private void ReadSymbols() } } - private Tout ReadResult() + private Tout ReadResult() { // Read all output values var test = new Tout(); Tout result = _adsClient.ReadObjectVariables(new Tout(), _adsCommandVar, _commandSymbols); - return result; + return result; } private void SetExecuteFlag() { - _adsClient.WriteVariable(_adsCommandVar + ".stHandshake.bExecute", true); + _adsClient.WriteVariable(_adsCommandVar + ".stHandshake.bExecute", true); } private void ResetExecuteFlag() @@ -192,7 +194,7 @@ void OnAdsnotificationEx(object sender, AdsNotificationExEventArgs e) { if (e.UserData is DataExchange) { - ((DataExchange) e.UserData).Set(e.Value); + ((DataExchange)e.UserData).Set(e.Value); } } @@ -204,7 +206,7 @@ void CheckResultCode(ushort resultCode) { case 0: // Init state - return; + return; case 1: errorMsg = "Running"; break; diff --git a/NET/CallAds/Program.cs b/NET/CallAds/Program.cs index 33d01e1..9a553e7 100644 --- a/NET/CallAds/Program.cs +++ b/NET/CallAds/Program.cs @@ -14,11 +14,8 @@ class Program { static void Main(string[] args) { - var client = new TcAdsClient - { - Synchronize = false - }; - + // TODO bridge to NLog to ILogger + var client = new AdsClient(); client.Connect(851); #if true var command = new PcsCommand2(client, "Commands.AddCommand1"); @@ -33,7 +30,6 @@ static void Main(string[] args) Console.ReadKey(); #endif - #if false var command = new PcsCommand(client, "Commands.stAddCommand") { diff --git a/NET/Directory.Build.props b/NET/Directory.Build.props index 7a32588..5c9f194 100644 --- a/NET/Directory.Build.props +++ b/NET/Directory.Build.props @@ -76,16 +76,6 @@ limitations under the License. all - - all - - - - all - - - - all - + \ No newline at end of file diff --git a/NET/Mbc.Ads.Helper.ReadType/Mbc.Ads.Helper.ReadType.csproj b/NET/Mbc.Ads.Helper.ReadType/Mbc.Ads.Helper.ReadType.csproj new file mode 100644 index 0000000..b16a1b1 --- /dev/null +++ b/NET/Mbc.Ads.Helper.ReadType/Mbc.Ads.Helper.ReadType.csproj @@ -0,0 +1,12 @@ + + + + Exe + net5.0 + + + + + + + diff --git a/NET/Mbc.Ads.Helper.ReadType/Program.cs b/NET/Mbc.Ads.Helper.ReadType/Program.cs new file mode 100644 index 0000000..ae0e553 --- /dev/null +++ b/NET/Mbc.Ads.Helper.ReadType/Program.cs @@ -0,0 +1,82 @@ +using System; +using TwinCAT.Ads; +using TwinCAT.Ads.TypeSystem; +using TwinCAT.TypeSystem; + +namespace Mbc.Ads.Helper.ReadType +{ + class Program + { + static void Main(string[] args) + { + using var client = new AdsClient(); + client.Connect(args[0], 851); + + IAdsSymbol symbol = client.ReadSymbol(args[1]); + + DumpSymbol(symbol); + } + + private static void DumpSymbol(IAdsSymbol symbol) + { + if (symbol is IStructInstance structInst) + { + Console.WriteLine($"Type=IStructType, ByteSize={structInst.ByteSize}"); + + foreach (IMember subItem in ((StructType)structInst.DataType).Members) + { + DumpMember(subItem, " "); + } + } + } + + private static void DumpMember(IMember member, string prefix) + { + Console.WriteLine($"{prefix}Offset={member.Offset} InstanceName={member.InstanceName} DataType.Category={member.DataType.Category}"); + + switch (member.DataType.Category) + { + case DataTypeCategory.Primitive: + DumpPrimitive((IPrimitiveType)member.DataType, prefix + " "); + break; + case DataTypeCategory.Enum: + DumpEnum((IEnumType)member.DataType, prefix + " "); + break; + case DataTypeCategory.Array: + DumpArray((IArrayType)member.DataType, prefix + " "); + break; + case DataTypeCategory.String: + DumpString((IStringType)member.DataType, prefix + " "); + break; + default: + Console.WriteLine($"{prefix} Not dumped"); + break; + } + } + + private static void DumpString(IStringType stringType, string prefix) + { + Console.WriteLine($"{prefix}ManagedType={GetManagedType(stringType)} Length={stringType.Length} ByteSize={stringType.ByteSize} Encoding={stringType.Encoding}"); + } + + private static void DumpArray(IArrayType arrayType, string prefix) + { + Console.WriteLine($"{prefix}ElementType.Category={arrayType.ElementType.Category} ElementType.ManagedType={GetManagedType(arrayType.ElementType)} Dimensions.ElementCount={arrayType.Dimensions.ElementCount}"); + } + + private static void DumpEnum(IEnumType enumType, string prefix) + { + Console.WriteLine($"{prefix} BaseType.ManagedType={GetManagedType(enumType.BaseType)}"); + } + + private static void DumpPrimitive(IPrimitiveType primitiveType, string prefix) + { + Console.WriteLine($"{prefix} ManagedType={GetManagedType(primitiveType)}"); + } + + private static Type GetManagedType(IDataType dataType) + { + return ((IManagedMappableType)dataType).ManagedType; + } + } +} diff --git a/NET/Mbc.Ads.Helper.ReadType/Properties/launchSettings.json b/NET/Mbc.Ads.Helper.ReadType/Properties/launchSettings.json new file mode 100644 index 0000000..b4a9da6 --- /dev/null +++ b/NET/Mbc.Ads.Helper.ReadType/Properties/launchSettings.json @@ -0,0 +1,8 @@ +{ + "profiles": { + "Mbc.Ads.Helper.ReadType": { + "commandName": "Project", + "commandLineArgs": "204.35.225.246.1.1 GVL.stTest" + } + } +} \ No newline at end of file diff --git a/NET/Mbc.Ads.Mapper.Test/AdsBinaryAccesorFactoryTest.cs b/NET/Mbc.Ads.Mapper.Test/AdsBinaryAccesorFactoryTest.cs new file mode 100644 index 0000000..60e9cea --- /dev/null +++ b/NET/Mbc.Ads.Mapper.Test/AdsBinaryAccesorFactoryTest.cs @@ -0,0 +1,353 @@ +using FakeItEasy; +using FluentAssertions; +using System; +using System.Text; +using TwinCAT.PlcOpen; +using TwinCAT.TypeSystem; +using Xunit; + +namespace Mbc.Ads.Mapper.Test +{ + public class AdsBinaryAccesorFactoryTest + { + [Fact] + public void CreatePrimitiveTypeReadFunction_WithBool_CanReadBoolean() + { + IAdsDataReader reader = AdsBinaryAccessorFactory.CreatePrimitiveTypeReadFunction(typeof(bool), 1, null); + + reader.Read(new ReadOnlySpan(new byte[] { 0, 0 })).Should().BeOfType().Which.Should().BeFalse(); + reader.Read(new ReadOnlySpan(new byte[] { 0, 1 })).Should().BeOfType().Which.Should().BeTrue(); + } + + [Fact] + public void CreatePrimitiveTypeReadFunction_WithByte_CanReadBytes() + { + IAdsDataReader reader = AdsBinaryAccessorFactory.CreatePrimitiveTypeReadFunction(typeof(byte), 1, null); + + reader.Read(new ReadOnlySpan(new byte[] { 0, 0 })).Should().BeOfType().Which.Should().Be(0); + reader.Read(new ReadOnlySpan(new byte[] { 0, 255 })).Should().BeOfType().Which.Should().Be(255); + } + + [Fact] + public void CreatePrimitiveTypeReadFunction_WithSByte_CanReadSBytes() + { + IAdsDataReader reader = AdsBinaryAccessorFactory.CreatePrimitiveTypeReadFunction(typeof(sbyte), 1, null); + + reader.Read(new ReadOnlySpan(new byte[] { 0, 128 })).Should().BeOfType().Which.Should().Be(-128); + reader.Read(new ReadOnlySpan(new byte[] { 0, 127 })).Should().BeOfType().Which.Should().Be(127); + } + + [Fact] + public void CreatePrimitiveTypeReadFunction_WithUShort_CanReadUShort() + { + IAdsDataReader reader = AdsBinaryAccessorFactory.CreatePrimitiveTypeReadFunction(typeof(ushort), 1, null); + + reader.Read(new ReadOnlySpan(new byte[] { 0, 0, 0 })).Should().BeOfType().Which.Should().Be(ushort.MinValue); + reader.Read(new ReadOnlySpan(new byte[] { 0, 255, 255 })).Should().BeOfType().Which.Should().Be(ushort.MaxValue); + } + + [Fact] + public void CreatePrimitiveTypeReadFunction_WithShort_CanReadShort() + { + IAdsDataReader reader = AdsBinaryAccessorFactory.CreatePrimitiveTypeReadFunction(typeof(short), 1, null); + + reader.Read(new ReadOnlySpan(new byte[] { 0, 0, 128 })).Should().BeOfType().Which.Should().Be(-32768); + reader.Read(new ReadOnlySpan(new byte[] { 0, 255, 127 })).Should().BeOfType().Which.Should().Be(32767); + } + + [Fact] + public void CreatePrimitiveTypeReadFunction_WithUInt_CanReadUInt() + { + IAdsDataReader reader = AdsBinaryAccessorFactory.CreatePrimitiveTypeReadFunction(typeof(uint), 1, null); + + reader.Read(new ReadOnlySpan(new byte[] { 0, 0, 0, 0, 0 })).Should().BeOfType().Which.Should().Be(0); + reader.Read(new ReadOnlySpan(new byte[] { 0, 255, 255, 255, 255 })).Should().BeOfType().Which.Should().Be(4294967295); + } + + [Fact] + public void CreatePrimitiveTypeReadFunction_WithInt_CanReadInt() + { + IAdsDataReader reader = AdsBinaryAccessorFactory.CreatePrimitiveTypeReadFunction(typeof(int), 1, null); + + reader.Read(new ReadOnlySpan(new byte[] { 0, 0, 0, 0, 128 })).Should().BeOfType().Which.Should().Be(-2147483648); + reader.Read(new ReadOnlySpan(new byte[] { 0, 255, 255, 255, 127 })).Should().BeOfType().Which.Should().Be(2147483647); + } + + [Fact] + public void CreatePrimitiveTypeReadFunction_WithFloat_CanReadFloat() + { + IAdsDataReader reader = AdsBinaryAccessorFactory.CreatePrimitiveTypeReadFunction(typeof(float), 1, null); + + reader.Read(new ReadOnlySpan(new byte[] { 0, 0, 0, 0, 0 })) + .Should().BeOfType().Which.Should().Be(0); + reader.Read(new ReadOnlySpan(new byte[] { 0, 0xFF, 0xFF, 0x7F, 0x7F })) + .Should().BeOfType().Which.Should().Be(float.MaxValue); + reader.Read(new ReadOnlySpan(new byte[] { 0, 0xFF, 0xFF, 0x7F, 0xFF })) + .Should().BeOfType().Which.Should().Be(float.MinValue); + reader.Read(new ReadOnlySpan(new byte[] { 0, 0x01, 0, 0, 0 })) + .Should().BeOfType().Which.Should().Be(float.Epsilon); + reader.Read(new ReadOnlySpan(new byte[] { 0, 0x01, 0, 0, 0x80 })) + .Should().BeOfType().Which.Should().Be(-float.Epsilon); + reader.Read(new ReadOnlySpan(new byte[] { 0, 0, 0, 0x80, 0x7f })) + .Should().BeOfType().Which.Should().Be(float.PositiveInfinity); + reader.Read(new ReadOnlySpan(new byte[] { 0, 0, 0, 0x80, 0xff })) + .Should().BeOfType().Which.Should().Be(float.NegativeInfinity); + reader.Read(new ReadOnlySpan(new byte[] { 0, 0xFF, 0xFF, 0xff, 0x7f })) + .Should().BeOfType().Which.Should().Be(float.NaN); + } + + [Fact] + public void CreatePrimitiveTypeReadFunction_WithDouble_CanReadDouble() + { + IAdsDataReader reader = AdsBinaryAccessorFactory.CreatePrimitiveTypeReadFunction(typeof(double), 1, null); + + reader.Read(new ReadOnlySpan(new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 0 })) + .Should().BeOfType().Which.Should().Be(0); + reader.Read(new ReadOnlySpan(new byte[] { 0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 0x7F })) + .Should().BeOfType().Which.Should().Be(double.MaxValue); + reader.Read(new ReadOnlySpan(new byte[] { 0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 0xFF })) + .Should().BeOfType().Which.Should().Be(double.MinValue); + reader.Read(new ReadOnlySpan(new byte[] { 0, 0x01, 0, 0, 0, 0, 0, 0, 0 })) + .Should().BeOfType().Which.Should().Be(double.Epsilon); + reader.Read(new ReadOnlySpan(new byte[] { 0, 0x01, 0, 0, 0, 0, 0, 0, 0x80 })) + .Should().BeOfType().Which.Should().Be(-double.Epsilon); + reader.Read(new ReadOnlySpan(new byte[] { 0, 0, 0, 0, 0, 0, 0, 0xF0, 0x7f })) + .Should().BeOfType().Which.Should().Be(double.PositiveInfinity); + reader.Read(new ReadOnlySpan(new byte[] { 0, 0, 0, 0, 0, 0, 0, 0xF0, 0xff })) + .Should().BeOfType().Which.Should().Be(double.NegativeInfinity); + reader.Read(new ReadOnlySpan(new byte[] { 0, 0xff, 0, 0, 0, 0, 0, 0xf0, 0x7f })) + .Should().BeOfType().Which.Should().Be(double.NaN); + } + + [Fact] + public void CreatePrimitiveTypeReadFunction_WithTime_CanReadTime() + { + IAdsDataReader reader = AdsBinaryAccessorFactory.CreatePrimitiveTypeReadFunction(typeof(TIME), 1, null); + + reader.Read(new ReadOnlySpan(new byte[] { 0, 0, 0, 0, 0 })) + .Should().BeOfType().Which.Should().Be(new TIME(0).Time); + reader.Read(new ReadOnlySpan(new byte[] { 0, 255, 255, 255, 255 })) + .Should().BeOfType().Which.Should().Be(new TIME(uint.MaxValue).Time); + } + + [Fact] + public void CreatePrimitiveTypeReadFunction_WithDate_CanReadDate() + { + IAdsDataReader reader = AdsBinaryAccessorFactory.CreatePrimitiveTypeReadFunction(typeof(DATE), 1, null); + + reader.Read(new ReadOnlySpan(new byte[] { 0, 0, 0, 0, 0 })) + .Should().BeOfType().Which.Should().Be(new DATE(0).Date); + reader.Read(new ReadOnlySpan(new byte[] { 0, 255, 255, 255, 255 })) + .Should().BeOfType().Which.Should().Be(new DATE(uint.MaxValue).Date); + } + + [Fact] + public void CreatePrimitiveTypeReadFunction_WithDT_CanReadDT() + { + IAdsDataReader reader = AdsBinaryAccessorFactory.CreatePrimitiveTypeReadFunction(typeof(DT), 1, null); + + reader.Read(new ReadOnlySpan(new byte[] { 0, 0, 0, 0, 0 })) + .Should().BeOfType().Which.Should().Be(new DT(0).DateTime); + reader.Read(new ReadOnlySpan(new byte[] { 0, 255, 255, 255, 255 })) + .Should().BeOfType().Which.Should().Be(new DT(uint.MaxValue).DateTime); + } + + [Fact] + public void CreatePrimitiveTypeReadFunction_WithASCIIString_CanReadString() + { + var fakeStringType = A.Fake(); + A.CallTo(() => fakeStringType.Encoding).Returns(Encoding.ASCII); + A.CallTo(() => fakeStringType.Length).Returns(5); + A.CallTo(() => fakeStringType.ByteSize).Returns(6); + A.CallTo(() => fakeStringType.IsFixedLength).Returns(true); + + IAdsDataReader reader = AdsBinaryAccessorFactory.CreatePrimitiveTypeReadFunction(typeof(string), 1, fakeStringType); + + reader.Read(new ReadOnlySpan(new byte[] { 0, 65, 66, 67, 0, 0, 0 })) + .Should().BeOfType().Which.Should().Be("ABC"); + reader.Read(new ReadOnlySpan(new byte[] { 0, 0, 0, 0, 0, 0, 0 })) + .Should().BeOfType().Which.Should().BeEmpty(); + reader.Read(new ReadOnlySpan(new byte[] { 0, 65, 66, 67, 68, 69, 0 })) + .Should().BeOfType().Which.Should().Be("ABCDE"); + } + + [Fact] + public void CreatePrimitiveTypeReadFunction_WithUTF16String_CanReadString() + { + var fakeStringType = A.Fake(); + A.CallTo(() => fakeStringType.Encoding).Returns(Encoding.Unicode); + A.CallTo(() => fakeStringType.Length).Returns(5); + A.CallTo(() => fakeStringType.ByteSize).Returns(10); + A.CallTo(() => fakeStringType.IsFixedLength).Returns(true); + + IAdsDataReader reader = AdsBinaryAccessorFactory.CreatePrimitiveTypeReadFunction(typeof(string), 1, fakeStringType); + + reader.Read(new ReadOnlySpan(new byte[] { 0, 0x41, 0, 0x42, 0, 0x43, 0, 0, 0, 0xFF, 0xFF })) + .Should().BeOfType().Which.Should().Be("ABC"); + reader.Read(new ReadOnlySpan(new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 })) + .Should().BeOfType().Which.Should().BeEmpty(); + reader.Read(new ReadOnlySpan(new byte[] { 0, 0x41, 0, 0x42, 0, 0x43, 0, 0x44, 0, 0x45, 0 })) + .Should().BeOfType().Which.Should().Be("ABCDE"); + } + + [Fact] + public void CreatePrimitiveTypeWriteFunction_WithBool_CanWriteBoolean() + { + IAdsDataWriter writer = AdsBinaryAccessorFactory.CreatePrimitiveTypeWriteFunction(typeof(bool), 1, null); + + WriteAndReturn(writer, true, 2).Should().Equal(0, 1); + WriteAndReturn(writer, false, 2).Should().Equal(0, 0); + } + + [Fact] + public void CreatePrimitiveTypeWriteFunction_WithByte_CanWriteByte() + { + IAdsDataWriter writer = AdsBinaryAccessorFactory.CreatePrimitiveTypeWriteFunction(typeof(byte), 1, null); + + WriteAndReturn(writer, 0, 2).Should().Equal(0, 0); + WriteAndReturn(writer, 255, 2).Should().Equal(0, 255); + } + + [Fact] + public void CreatePrimitiveTypeWriteFunction_WithSByte_CanWriteSByte() + { + IAdsDataWriter writer = AdsBinaryAccessorFactory.CreatePrimitiveTypeWriteFunction(typeof(sbyte), 1, null); + + WriteAndReturn(writer, -128, 2).Should().Equal(0, 128); + WriteAndReturn(writer, 127, 2).Should().Equal(0, 127); + } + + [Fact] + public void CreatePrimitiveTypeWriteFunction_WithUShort_CanWriteUShort() + { + IAdsDataWriter writer = AdsBinaryAccessorFactory.CreatePrimitiveTypeWriteFunction(typeof(ushort), 1, null); + + WriteAndReturn(writer, ushort.MinValue, 3).Should().Equal(0, 0, 0); + WriteAndReturn(writer, ushort.MaxValue, 3).Should().Equal(0, 255, 255); + } + + [Fact] + public void CreatePrimitiveTypeWriteFunction_WithShort_CanWriteShort() + { + IAdsDataWriter writer = AdsBinaryAccessorFactory.CreatePrimitiveTypeWriteFunction(typeof(short), 1, null); + + WriteAndReturn(writer, short.MinValue, 3).Should().Equal(0, 0, 128); + WriteAndReturn(writer, short.MaxValue, 3).Should().Equal(0, 255, 127); + } + + [Fact] + public void CreatePrimitiveTypeWriteFunction_WithUInt_CanWriteUInt() + { + IAdsDataWriter writer = AdsBinaryAccessorFactory.CreatePrimitiveTypeWriteFunction(typeof(uint), 1, null); + + WriteAndReturn(writer, uint.MinValue, 5).Should().Equal(0, 0, 0, 0, 0); + WriteAndReturn(writer, uint.MaxValue, 5).Should().Equal(0, 255, 255, 255, 255); + } + + [Fact] + public void CreatePrimitiveTypeWriteFunction_WithInt_CanWriteInt() + { + IAdsDataWriter writer = AdsBinaryAccessorFactory.CreatePrimitiveTypeWriteFunction(typeof(int), 1, null); + + WriteAndReturn(writer, int.MinValue, 5).Should().Equal(0, 0, 0, 0, 128); + WriteAndReturn(writer, int.MaxValue, 5).Should().Equal(0, 255, 255, 255, 127); + } + + [Fact] + public void CreatePrimitiveTypeWriteFunction_WithFloat_CanWriteFloat() + { + IAdsDataWriter writer = AdsBinaryAccessorFactory.CreatePrimitiveTypeWriteFunction(typeof(float), 1, null); + + WriteAndReturn(writer, 0, 5).Should().Equal(0, 0, 0, 0, 0); + WriteAndReturn(writer, float.MaxValue, 5).Should().Equal(0, 0xFF, 0xFF, 0x7F, 0x7F); + WriteAndReturn(writer, float.MinValue, 5).Should().Equal(0, 0xFF, 0xFF, 0x7F, 0xFF); + WriteAndReturn(writer, float.Epsilon, 5).Should().Equal(0, 0x01, 0, 0, 0); + WriteAndReturn(writer, -float.Epsilon, 5).Should().Equal(0, 0x01, 0, 0, 0x80); + WriteAndReturn(writer, float.PositiveInfinity, 5).Should().Equal(0, 0, 0, 0x80, 0x7f); + WriteAndReturn(writer, float.NegativeInfinity, 5).Should().Equal(0, 0, 0, 0x80, 0xff); + WriteAndReturn(writer, float.NaN, 5).Should().Equal(0, 0, 0, 0xc0, 0xff); + } + + [Fact] + public void CreatePrimitiveTypeWriteFunction_WithDouble_CanWriteDouble() + { + IAdsDataWriter writer = AdsBinaryAccessorFactory.CreatePrimitiveTypeWriteFunction(typeof(double), 1, null); + + WriteAndReturn(writer, 0, 9).Should().Equal(0, 0, 0, 0, 0, 0, 0, 0, 0); + WriteAndReturn(writer, double.MaxValue, 9).Should().Equal(0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 0x7F); + WriteAndReturn(writer, double.MinValue, 9).Should().Equal(0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 0xFF); + WriteAndReturn(writer, double.Epsilon, 9).Should().Equal(0, 0x01, 0, 0, 0, 0, 0, 0, 0); + WriteAndReturn(writer, -double.Epsilon, 9).Should().Equal(0, 0x01, 0, 0, 0, 0, 0, 0, 0x80); + WriteAndReturn(writer, double.PositiveInfinity, 9).Should().Equal(0, 0, 0, 0, 0, 0, 0, 0xF0, 0x7f); + WriteAndReturn(writer, double.NegativeInfinity, 9).Should().Equal(0, 0, 0, 0, 0, 0, 0, 0xF0, 0xff); + WriteAndReturn(writer, double.NaN, 9).Should().Equal(0, 0, 0, 0, 0, 0, 0, 0xf8, 0xff); + } + + [Fact] + public void CreatePrimitiveTypeWriteFunction_WithTime_CanWriteTime() + { + IAdsDataWriter writer = AdsBinaryAccessorFactory.CreatePrimitiveTypeWriteFunction(typeof(TIME), 1, null); + + WriteAndReturn(writer, new TIME(uint.MinValue).Time, 5).Should().Equal(0, 0, 0, 0, 0); + WriteAndReturn(writer, new TIME(uint.MaxValue).Time, 5).Should().Equal(0, 255, 255, 255, 255); + } + + [Fact] + public void CreatePrimitiveTypeWriteFunction_WithDate_CanWriteDate() + { + IAdsDataWriter writer = AdsBinaryAccessorFactory.CreatePrimitiveTypeWriteFunction(typeof(DATE), 1, null); + + WriteAndReturn(writer, new DATE(uint.MinValue).Date, 5).Should().Equal(0, 0, 0, 0, 0); + // DATE contains date without time, so the serialization of max value truncates to the date + WriteAndReturn(writer, new DATE(uint.MaxValue).Date, 5).Should().Equal(0, 0x00, 0xA5, 255, 255); + } + + [Fact] + public void CreatePrimitiveTypeWriteFunction_WithDT_CanWriteDT() + { + IAdsDataWriter writer = AdsBinaryAccessorFactory.CreatePrimitiveTypeWriteFunction(typeof(DT), 1, null); + + WriteAndReturn(writer, new DT(uint.MinValue).DateTime, 5).Should().Equal(0, 0, 0, 0, 0); + WriteAndReturn(writer, new DT(uint.MaxValue).DateTime, 5).Should().Equal(0, 255, 255, 255, 255); + } + + [Fact] + public void CreatePrimitiveTypeWriteFunction_WithASCIIString_CanWriteASCIIString() + { + var fakeStringType = A.Fake(); + A.CallTo(() => fakeStringType.Encoding).Returns(Encoding.ASCII); + A.CallTo(() => fakeStringType.Length).Returns(5); + A.CallTo(() => fakeStringType.ByteSize).Returns(6); + A.CallTo(() => fakeStringType.IsFixedLength).Returns(true); + + IAdsDataWriter writer = AdsBinaryAccessorFactory.CreatePrimitiveTypeWriteFunction(typeof(string), 1, fakeStringType); + + WriteAndReturn(writer, "ABC", 7).Should().Equal(0, 65, 66, 67, 0, 0, 0); + WriteAndReturn(writer, string.Empty, 7).Should().Equal(0, 0, 0, 0, 0, 0, 0); + WriteAndReturn(writer, "ABCDE", 7).Should().Equal(0, 65, 66, 67, 68, 69, 0); + } + + [Fact] + public void CreatePrimitiveTypeWriteFunction_WithUTF16String_CanWriteUTF16String() + { + var fakeStringType = A.Fake(); + A.CallTo(() => fakeStringType.Encoding).Returns(Encoding.Unicode); + A.CallTo(() => fakeStringType.Length).Returns(5); + A.CallTo(() => fakeStringType.ByteSize).Returns(12); + A.CallTo(() => fakeStringType.IsFixedLength).Returns(true); + + IAdsDataWriter writer = AdsBinaryAccessorFactory.CreatePrimitiveTypeWriteFunction(typeof(string), 1, fakeStringType); + + WriteAndReturn(writer, "ABC", 13).Should().Equal(0, 65, 0, 66, 0, 67, 0, 0, 0, 0, 0, 0, 0); + WriteAndReturn(writer, string.Empty, 13).Should().Equal(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); + WriteAndReturn(writer, "ABCDE", 13).Should().Equal(0, 65, 0, 66, 0, 67, 0, 68, 0, 69, 0, 0, 0); + } + + private byte[] WriteAndReturn(IAdsDataWriter writer, T writeValue, int length) + { + var buffer = new byte[length]; + writer.Write((T)writeValue, new Span(buffer)); + return buffer; + } + } +} diff --git a/NET/Mbc.Ads.Mapper.Test/AdsMapperTest.cs b/NET/Mbc.Ads.Mapper.Test/AdsMapperTest.cs index ee73719..15cfd3b 100644 --- a/NET/Mbc.Ads.Mapper.Test/AdsMapperTest.cs +++ b/NET/Mbc.Ads.Mapper.Test/AdsMapperTest.cs @@ -6,7 +6,6 @@ using FluentAssertions; using System; using System.Diagnostics; -using TwinCAT.Ads; using Xunit; using Xunit.Abstractions; @@ -34,7 +33,9 @@ public void AdsMappingConfigurationShouldMapAdsStreamToDataObject() // Act AdsMapper mapper = config.CreateAdsMapper(_fakePlcData.AdsSymbolInfo); - DestinationDataObject mappedResult = mapper.MapStream(_fakePlcData.AdsStream); + + var buffer = new ReadOnlySpan(_fakePlcData.Data); + DestinationDataObject mappedResult = mapper.MapData(buffer); // Assert mappedResult.Should().NotBeNull(); @@ -76,10 +77,10 @@ public void AdsMappingConfigurationPerformance() // Act var stopwatch = Stopwatch.StartNew(); + var buffer = new ReadOnlySpan(_fakePlcData.Data); for (int i = 0; i < 50000; i++) { - _fakePlcData.AdsStream.Position = 0; - mapper.MapStream(_fakePlcData.AdsStream); + DestinationDataObject mappedResult = mapper.MapData(buffer); } stopwatch.Stop(); @@ -101,7 +102,8 @@ public void AdsMappingConfigurationShouldMapAdsStreamToDataObjectWithRequired() // Act AdsMapper mapper = config.CreateAdsMapper(_fakePlcData.AdsSymbolInfo); - DestinationDataObject mappedResult = mapper.MapStream(_fakePlcData.AdsStream); + var buffer = new ReadOnlySpan(_fakePlcData.Data); + DestinationDataObject mappedResult = mapper.MapData(buffer); // Assert throw new NotImplementedException("Required fields not yet implemented"); @@ -120,7 +122,8 @@ public void AdsMappingConfigurationShouldMapAdsStreamToDataObjectWithIgnored() // Act AdsMapper mapper = config.CreateAdsMapper(_fakePlcData.AdsSymbolInfo); - DestinationDataObject mappedResult = mapper.MapStream(_fakePlcData.AdsStream); + var buffer = new ReadOnlySpan(_fakePlcData.Data); + DestinationDataObject mappedResult = mapper.MapData(buffer); // Assert throw new NotImplementedException("Ignored fields not yet implemented"); @@ -135,7 +138,8 @@ public void AdsMappingConfigurationShouldMapAdsStreamToDataObjectWithTimeDataTyp // Act AdsMapper mapper = config.CreateAdsMapper(_fakePlcData.AdsSymbolInfo); - DestinationDataObject mappedResult = mapper.MapStream(_fakePlcData.AdsStream); + var buffer = new ReadOnlySpan(_fakePlcData.Data); + DestinationDataObject mappedResult = mapper.MapData(buffer); // Assert mappedResult.Should().NotBeNull(); @@ -153,7 +157,8 @@ public void AdsMappingConfigurationShouldMapAdsStreamToDataObjectWithSubStructur // Act AdsMapper mapper = config.CreateAdsMapper(_fakePlcData.AdsSymbolInfo); - DestinationDataObject mappedResult = mapper.MapStream(_fakePlcData.AdsStream); + var buffer = new ReadOnlySpan(_fakePlcData.Data); + DestinationDataObject mappedResult = mapper.MapData(buffer); // Assert mappedResult.MotorObject.Should().NotBeNull(); @@ -191,16 +196,17 @@ public void AdsMappingConfigurationShouldMapDataObjectToAdsStream() Utf7String = "ÄÖö@Ü7", UnicodeString = "ÄÖö@Ü8", }; - byte[] expectedData = _fakePlcData.AdsStream.ToArray(); + byte[] expectedData = _fakePlcData.Data; Array.Clear(expectedData, 114, 8); // nested MotorObject + var buffer = new byte[expectedData.Length]; + // Act AdsMapper mapper = config.CreateAdsMapper(_fakePlcData.AdsSymbolInfo); - AdsStream stream = mapper.MapDataObject(dataObject); + mapper.MapDataObject(new Span(buffer), dataObject); // Assert - stream.Should().NotBeNull(); - stream.ToArray().Should().BeEquivalentTo(expectedData); + buffer.Should().BeEquivalentTo(expectedData); } #region " Test Data " diff --git a/NET/Mbc.Ads.Mapper.Test/AdsMapperTestFakePlcData.cs b/NET/Mbc.Ads.Mapper.Test/AdsMapperTestFakePlcData.cs index dc8f932..3d54edc 100644 --- a/NET/Mbc.Ads.Mapper.Test/AdsMapperTestFakePlcData.cs +++ b/NET/Mbc.Ads.Mapper.Test/AdsMapperTestFakePlcData.cs @@ -1,7 +1,11 @@ using FakeItEasy; using System; +using System.Collections; using System.Collections.Generic; -using TwinCAT.Ads; +using System.IO; +using System.Text; +using TwinCAT.Ads.TypeSystem; +using TwinCAT.PlcOpen; using TwinCAT.TypeSystem; namespace Mbc.Ads.Mapper.Test @@ -11,12 +15,12 @@ public class AdsMapperTestFakePlcData : IDisposable public AdsMapperTestFakePlcData() { AdsSymbolInfo = CreateFakeIAdsSymbolInfo(); - AdsStream = CreateAdsStream(); + Data = CreateAdsStream(); } public IAdsSymbolInfo AdsSymbolInfo { get; private set; } - public AdsStream AdsStream { get; private set; } + public byte[] Data { get; private set; } private IAdsSymbolInfo CreateFakeIAdsSymbolInfo() { @@ -25,7 +29,7 @@ private IAdsSymbolInfo CreateFakeIAdsSymbolInfo() STRUCT bBoolValue1 : BOOL := TRUE; nByteValue1 : BYTE := 255; - nSbyteValue1 : BYTE := 127; + nSbyteValue1 : SINT := 127; nUshortValue1 : UINT := 65535; nShortValue1 : INT := 32767; nUintValue1 : UDINT := 4294967295; @@ -55,402 +59,307 @@ private IAdsSymbolInfo CreateFakeIAdsSymbolInfo() ); END_TYPE */ - var tcAdsSymbol5Fake = A.Fake(); - var subItemListFake_ST_Test = new List(); - int streamSize = 122; + IAdsSymbolInfo fakeSymbolInfo = A.Fake(); - A.CallTo(() => tcAdsSymbol5Fake.Category).Returns(DataTypeCategory.Struct); - A.CallTo(() => tcAdsSymbol5Fake.Name).Returns("PCS_Status.aPcsTestPlace[1].stTest"); - A.CallTo(() => tcAdsSymbol5Fake.Size).Returns(streamSize); - A.CallTo(() => tcAdsSymbol5Fake.DataType.Category).Returns(DataTypeCategory.Struct); - A.CallTo(() => tcAdsSymbol5Fake.DataType.HasSubItemInfo).Returns(true); - A.CallTo(() => tcAdsSymbol5Fake.DataType.SubItems).Returns(new ReadOnlySubItemCollection(subItemListFake_ST_Test)); + IAdsSymbol fakeSymbol = A.Fake(x => x.Implements()); + A.CallTo(() => fakeSymbolInfo.Symbol).Returns(fakeSymbol); + A.CallTo(() => fakeSymbol.ByteSize).Returns(120); - IAdsSymbolInfo fakeSymbolInfo = A.Fake(); - A.CallTo(() => fakeSymbolInfo.SymbolsSize).Returns(streamSize); - A.CallTo(() => fakeSymbolInfo.SymbolPath).Returns("PCS_Status.aPcsTestPlace[1].stTest"); - A.CallTo(() => fakeSymbolInfo.Symbol).Returns(tcAdsSymbol5Fake); - - // Start of faked Sub items of Symbol PCS_Status.aPcsTestPlace[1].stTest of type ST_Test - //---------------------------------------------------------- - var subItemFake_bBoolValue1 = A.Fake(); - A.CallTo(() => subItemFake_bBoolValue1.SubItemName).Returns("bBoolValue1"); - A.CallTo(() => subItemFake_bBoolValue1.Offset).Returns(0); - A.CallTo(() => subItemFake_bBoolValue1.Size).Returns(1); - A.CallTo(() => subItemFake_bBoolValue1.Category).Returns(DataTypeCategory.Alias); - A.CallTo(() => subItemFake_bBoolValue1.BaseType.DataTypeId).Returns(AdsDatatypeId.ADST_BIT); - A.CallTo(() => subItemFake_bBoolValue1.BaseType.Category).Returns(DataTypeCategory.Primitive); - A.CallTo(() => subItemFake_bBoolValue1.BaseType.IsPrimitive).Returns(true); - A.CallTo(() => subItemFake_bBoolValue1.BaseType.ManagedType).Returns(typeof(System.Boolean)); - A.CallTo(() => subItemFake_bBoolValue1.BaseType.HasSubItemInfo).Returns(false); - A.CallTo(() => subItemFake_bBoolValue1.BaseType.HasArrayInfo).Returns(false); - A.CallTo(() => subItemFake_bBoolValue1.BaseType.HasEnumInfo).Returns(false); - subItemListFake_ST_Test.Add(subItemFake_bBoolValue1); - - var subItemFake_nByteValue1 = A.Fake(); - A.CallTo(() => subItemFake_nByteValue1.SubItemName).Returns("nByteValue1"); - A.CallTo(() => subItemFake_nByteValue1.Offset).Returns(1); - A.CallTo(() => subItemFake_nByteValue1.Size).Returns(1); - A.CallTo(() => subItemFake_nByteValue1.Category).Returns(DataTypeCategory.Alias); - A.CallTo(() => subItemFake_nByteValue1.BaseType.DataTypeId).Returns(AdsDatatypeId.ADST_UINT8); - A.CallTo(() => subItemFake_nByteValue1.BaseType.Category).Returns(DataTypeCategory.Primitive); - A.CallTo(() => subItemFake_nByteValue1.BaseType.IsPrimitive).Returns(true); - A.CallTo(() => subItemFake_nByteValue1.BaseType.ManagedType).Returns(typeof(System.Byte)); - A.CallTo(() => subItemFake_nByteValue1.BaseType.HasSubItemInfo).Returns(false); - A.CallTo(() => subItemFake_nByteValue1.BaseType.HasArrayInfo).Returns(false); - A.CallTo(() => subItemFake_nByteValue1.BaseType.HasEnumInfo).Returns(false); - subItemListFake_ST_Test.Add(subItemFake_nByteValue1); - - var subItemFake_nSbyteValue1 = A.Fake(); - A.CallTo(() => subItemFake_nSbyteValue1.SubItemName).Returns("nSbyteValue1"); - A.CallTo(() => subItemFake_nSbyteValue1.Offset).Returns(2); - A.CallTo(() => subItemFake_nSbyteValue1.Size).Returns(1); - A.CallTo(() => subItemFake_nSbyteValue1.Category).Returns(DataTypeCategory.Alias); - A.CallTo(() => subItemFake_nSbyteValue1.BaseType.DataTypeId).Returns(AdsDatatypeId.ADST_UINT8); - A.CallTo(() => subItemFake_nSbyteValue1.BaseType.Category).Returns(DataTypeCategory.Primitive); - A.CallTo(() => subItemFake_nSbyteValue1.BaseType.IsPrimitive).Returns(true); - A.CallTo(() => subItemFake_nSbyteValue1.BaseType.ManagedType).Returns(typeof(System.Byte)); - A.CallTo(() => subItemFake_nSbyteValue1.BaseType.HasSubItemInfo).Returns(false); - A.CallTo(() => subItemFake_nSbyteValue1.BaseType.HasArrayInfo).Returns(false); - A.CallTo(() => subItemFake_nSbyteValue1.BaseType.HasEnumInfo).Returns(false); - subItemListFake_ST_Test.Add(subItemFake_nSbyteValue1); - - var subItemFake_nUshortValue1 = A.Fake(); - A.CallTo(() => subItemFake_nUshortValue1.SubItemName).Returns("nUshortValue1"); - A.CallTo(() => subItemFake_nUshortValue1.Offset).Returns(4); - A.CallTo(() => subItemFake_nUshortValue1.Size).Returns(2); - A.CallTo(() => subItemFake_nUshortValue1.Category).Returns(DataTypeCategory.Alias); - A.CallTo(() => subItemFake_nUshortValue1.BaseType.DataTypeId).Returns(AdsDatatypeId.ADST_UINT16); - A.CallTo(() => subItemFake_nUshortValue1.BaseType.Category).Returns(DataTypeCategory.Primitive); - A.CallTo(() => subItemFake_nUshortValue1.BaseType.IsPrimitive).Returns(true); - A.CallTo(() => subItemFake_nUshortValue1.BaseType.ManagedType).Returns(typeof(System.UInt16)); - A.CallTo(() => subItemFake_nUshortValue1.BaseType.HasSubItemInfo).Returns(false); - A.CallTo(() => subItemFake_nUshortValue1.BaseType.HasArrayInfo).Returns(false); - A.CallTo(() => subItemFake_nUshortValue1.BaseType.HasEnumInfo).Returns(false); - subItemListFake_ST_Test.Add(subItemFake_nUshortValue1); - - var subItemFake_nShortValue1 = A.Fake(); - A.CallTo(() => subItemFake_nShortValue1.SubItemName).Returns("nShortValue1"); - A.CallTo(() => subItemFake_nShortValue1.Offset).Returns(6); - A.CallTo(() => subItemFake_nShortValue1.Size).Returns(2); - A.CallTo(() => subItemFake_nShortValue1.Category).Returns(DataTypeCategory.Alias); - A.CallTo(() => subItemFake_nShortValue1.BaseType.DataTypeId).Returns(AdsDatatypeId.ADST_INT16); - A.CallTo(() => subItemFake_nShortValue1.BaseType.Category).Returns(DataTypeCategory.Primitive); - A.CallTo(() => subItemFake_nShortValue1.BaseType.IsPrimitive).Returns(true); - A.CallTo(() => subItemFake_nShortValue1.BaseType.ManagedType).Returns(typeof(System.Int16)); - A.CallTo(() => subItemFake_nShortValue1.BaseType.HasSubItemInfo).Returns(false); - A.CallTo(() => subItemFake_nShortValue1.BaseType.HasArrayInfo).Returns(false); - A.CallTo(() => subItemFake_nShortValue1.BaseType.HasEnumInfo).Returns(false); - subItemListFake_ST_Test.Add(subItemFake_nShortValue1); - - var subItemFake_nUintValue1 = A.Fake(); - A.CallTo(() => subItemFake_nUintValue1.SubItemName).Returns("nUintValue1"); - A.CallTo(() => subItemFake_nUintValue1.Offset).Returns(8); - A.CallTo(() => subItemFake_nUintValue1.Size).Returns(4); - A.CallTo(() => subItemFake_nUintValue1.Category).Returns(DataTypeCategory.Alias); - A.CallTo(() => subItemFake_nUintValue1.BaseType.DataTypeId).Returns(AdsDatatypeId.ADST_UINT32); - A.CallTo(() => subItemFake_nUintValue1.BaseType.Category).Returns(DataTypeCategory.Primitive); - A.CallTo(() => subItemFake_nUintValue1.BaseType.IsPrimitive).Returns(true); - A.CallTo(() => subItemFake_nUintValue1.BaseType.ManagedType).Returns(typeof(System.UInt32)); - A.CallTo(() => subItemFake_nUintValue1.BaseType.HasSubItemInfo).Returns(false); - A.CallTo(() => subItemFake_nUintValue1.BaseType.HasArrayInfo).Returns(false); - A.CallTo(() => subItemFake_nUintValue1.BaseType.HasEnumInfo).Returns(false); - subItemListFake_ST_Test.Add(subItemFake_nUintValue1); - - var subItemFake_nIntValue1 = A.Fake(); - A.CallTo(() => subItemFake_nIntValue1.SubItemName).Returns("nIntValue1"); - A.CallTo(() => subItemFake_nIntValue1.Offset).Returns(12); - A.CallTo(() => subItemFake_nIntValue1.Size).Returns(4); - A.CallTo(() => subItemFake_nIntValue1.Category).Returns(DataTypeCategory.Alias); - A.CallTo(() => subItemFake_nIntValue1.BaseType.DataTypeId).Returns(AdsDatatypeId.ADST_INT32); - A.CallTo(() => subItemFake_nIntValue1.BaseType.Category).Returns(DataTypeCategory.Primitive); - A.CallTo(() => subItemFake_nIntValue1.BaseType.IsPrimitive).Returns(true); - A.CallTo(() => subItemFake_nIntValue1.BaseType.ManagedType).Returns(typeof(System.Int32)); - A.CallTo(() => subItemFake_nIntValue1.BaseType.HasSubItemInfo).Returns(false); - A.CallTo(() => subItemFake_nIntValue1.BaseType.HasArrayInfo).Returns(false); - A.CallTo(() => subItemFake_nIntValue1.BaseType.HasEnumInfo).Returns(false); - subItemListFake_ST_Test.Add(subItemFake_nIntValue1); - - var subItemFake_fFloatValue1 = A.Fake(); - A.CallTo(() => subItemFake_fFloatValue1.SubItemName).Returns("fFloatValue1"); - A.CallTo(() => subItemFake_fFloatValue1.Offset).Returns(16); - A.CallTo(() => subItemFake_fFloatValue1.Size).Returns(4); - A.CallTo(() => subItemFake_fFloatValue1.Category).Returns(DataTypeCategory.Alias); - A.CallTo(() => subItemFake_fFloatValue1.BaseType.DataTypeId).Returns(AdsDatatypeId.ADST_REAL32); - A.CallTo(() => subItemFake_fFloatValue1.BaseType.Category).Returns(DataTypeCategory.Primitive); - A.CallTo(() => subItemFake_fFloatValue1.BaseType.IsPrimitive).Returns(true); - A.CallTo(() => subItemFake_fFloatValue1.BaseType.ManagedType).Returns(typeof(System.Single)); - A.CallTo(() => subItemFake_fFloatValue1.BaseType.HasSubItemInfo).Returns(false); - A.CallTo(() => subItemFake_fFloatValue1.BaseType.HasArrayInfo).Returns(false); - A.CallTo(() => subItemFake_fFloatValue1.BaseType.HasEnumInfo).Returns(false); - subItemListFake_ST_Test.Add(subItemFake_fFloatValue1); - - var subItemFake_fDoubleValue1 = A.Fake(); - A.CallTo(() => subItemFake_fDoubleValue1.SubItemName).Returns("fDoubleValue1"); - A.CallTo(() => subItemFake_fDoubleValue1.Offset).Returns(24); - A.CallTo(() => subItemFake_fDoubleValue1.Size).Returns(8); - A.CallTo(() => subItemFake_fDoubleValue1.Category).Returns(DataTypeCategory.Alias); - A.CallTo(() => subItemFake_fDoubleValue1.BaseType.DataTypeId).Returns(AdsDatatypeId.ADST_REAL64); - A.CallTo(() => subItemFake_fDoubleValue1.BaseType.Category).Returns(DataTypeCategory.Primitive); - A.CallTo(() => subItemFake_fDoubleValue1.BaseType.IsPrimitive).Returns(true); - A.CallTo(() => subItemFake_fDoubleValue1.BaseType.ManagedType).Returns(typeof(System.Double)); - A.CallTo(() => subItemFake_fDoubleValue1.BaseType.HasSubItemInfo).Returns(false); - A.CallTo(() => subItemFake_fDoubleValue1.BaseType.HasArrayInfo).Returns(false); - A.CallTo(() => subItemFake_fDoubleValue1.BaseType.HasEnumInfo).Returns(false); - subItemListFake_ST_Test.Add(subItemFake_fDoubleValue1); - - var subItemFake_fDoubleValue2 = A.Fake(); - A.CallTo(() => subItemFake_fDoubleValue2.SubItemName).Returns("fDoubleValue2"); - A.CallTo(() => subItemFake_fDoubleValue2.Offset).Returns(32); - A.CallTo(() => subItemFake_fDoubleValue2.Size).Returns(8); - A.CallTo(() => subItemFake_fDoubleValue2.Category).Returns(DataTypeCategory.Alias); - A.CallTo(() => subItemFake_fDoubleValue2.BaseType.DataTypeId).Returns(AdsDatatypeId.ADST_REAL64); - A.CallTo(() => subItemFake_fDoubleValue2.BaseType.Category).Returns(DataTypeCategory.Primitive); - A.CallTo(() => subItemFake_fDoubleValue2.BaseType.IsPrimitive).Returns(true); - A.CallTo(() => subItemFake_fDoubleValue2.BaseType.ManagedType).Returns(typeof(System.Double)); - A.CallTo(() => subItemFake_fDoubleValue2.BaseType.HasSubItemInfo).Returns(false); - A.CallTo(() => subItemFake_fDoubleValue2.BaseType.HasArrayInfo).Returns(false); - A.CallTo(() => subItemFake_fDoubleValue2.BaseType.HasEnumInfo).Returns(false); - subItemListFake_ST_Test.Add(subItemFake_fDoubleValue2); - - var subItemFake_fDoubleValue3 = A.Fake(); - A.CallTo(() => subItemFake_fDoubleValue3.SubItemName).Returns("fDoubleValue3"); - A.CallTo(() => subItemFake_fDoubleValue3.Offset).Returns(40); - A.CallTo(() => subItemFake_fDoubleValue3.Size).Returns(8); - A.CallTo(() => subItemFake_fDoubleValue3.Category).Returns(DataTypeCategory.Alias); - A.CallTo(() => subItemFake_fDoubleValue3.BaseType.DataTypeId).Returns(AdsDatatypeId.ADST_REAL64); - A.CallTo(() => subItemFake_fDoubleValue3.BaseType.Category).Returns(DataTypeCategory.Primitive); - A.CallTo(() => subItemFake_fDoubleValue3.BaseType.IsPrimitive).Returns(true); - A.CallTo(() => subItemFake_fDoubleValue3.BaseType.ManagedType).Returns(typeof(System.Double)); - A.CallTo(() => subItemFake_fDoubleValue3.BaseType.HasSubItemInfo).Returns(false); - A.CallTo(() => subItemFake_fDoubleValue3.BaseType.HasArrayInfo).Returns(false); - A.CallTo(() => subItemFake_fDoubleValue3.BaseType.HasEnumInfo).Returns(false); - subItemListFake_ST_Test.Add(subItemFake_fDoubleValue3); - - var subItemFake_fDoubleValue4 = A.Fake(); - A.CallTo(() => subItemFake_fDoubleValue4.SubItemName).Returns("fDoubleValue4"); - A.CallTo(() => subItemFake_fDoubleValue4.Offset).Returns(48); - A.CallTo(() => subItemFake_fDoubleValue4.Size).Returns(8); - A.CallTo(() => subItemFake_fDoubleValue4.Category).Returns(DataTypeCategory.Alias); - A.CallTo(() => subItemFake_fDoubleValue4.BaseType.DataTypeId).Returns(AdsDatatypeId.ADST_REAL64); - A.CallTo(() => subItemFake_fDoubleValue4.BaseType.Category).Returns(DataTypeCategory.Primitive); - A.CallTo(() => subItemFake_fDoubleValue4.BaseType.IsPrimitive).Returns(true); - A.CallTo(() => subItemFake_fDoubleValue4.BaseType.ManagedType).Returns(typeof(System.Double)); - A.CallTo(() => subItemFake_fDoubleValue4.BaseType.HasSubItemInfo).Returns(false); - A.CallTo(() => subItemFake_fDoubleValue4.BaseType.HasArrayInfo).Returns(false); - A.CallTo(() => subItemFake_fDoubleValue4.BaseType.HasEnumInfo).Returns(false); - subItemListFake_ST_Test.Add(subItemFake_fDoubleValue4); - - var subItemFake_tPlcTimeValue1 = A.Fake(); - A.CallTo(() => subItemFake_tPlcTimeValue1.SubItemName).Returns("tPlcTimeValue1"); - A.CallTo(() => subItemFake_tPlcTimeValue1.Offset).Returns(56); - A.CallTo(() => subItemFake_tPlcTimeValue1.Size).Returns(4); - A.CallTo(() => subItemFake_tPlcTimeValue1.Category).Returns(DataTypeCategory.Alias); - A.CallTo(() => subItemFake_tPlcTimeValue1.BaseType.DataTypeId).Returns(AdsDatatypeId.ADST_BIGTYPE); - A.CallTo(() => subItemFake_tPlcTimeValue1.BaseType.Category).Returns(DataTypeCategory.Primitive); - A.CallTo(() => subItemFake_tPlcTimeValue1.BaseType.IsPrimitive).Returns(true); - A.CallTo(() => subItemFake_tPlcTimeValue1.BaseType.ManagedType).Returns(typeof(TwinCAT.PlcOpen.TIME)); - A.CallTo(() => subItemFake_tPlcTimeValue1.BaseType.HasSubItemInfo).Returns(false); - A.CallTo(() => subItemFake_tPlcTimeValue1.BaseType.HasArrayInfo).Returns(false); - A.CallTo(() => subItemFake_tPlcTimeValue1.BaseType.HasEnumInfo).Returns(false); - subItemListFake_ST_Test.Add(subItemFake_tPlcTimeValue1); - - var subItemFake_dPlcDateValue1 = A.Fake(); - A.CallTo(() => subItemFake_dPlcDateValue1.SubItemName).Returns("dPlcDateValue1"); - A.CallTo(() => subItemFake_dPlcDateValue1.Offset).Returns(60); - A.CallTo(() => subItemFake_dPlcDateValue1.Size).Returns(4); - A.CallTo(() => subItemFake_dPlcDateValue1.Category).Returns(DataTypeCategory.Alias); - A.CallTo(() => subItemFake_dPlcDateValue1.BaseType.DataTypeId).Returns(AdsDatatypeId.ADST_BIGTYPE); - A.CallTo(() => subItemFake_dPlcDateValue1.BaseType.Category).Returns(DataTypeCategory.Primitive); - A.CallTo(() => subItemFake_dPlcDateValue1.BaseType.IsPrimitive).Returns(true); - A.CallTo(() => subItemFake_dPlcDateValue1.BaseType.ManagedType).Returns(typeof(TwinCAT.PlcOpen.DATE)); - A.CallTo(() => subItemFake_dPlcDateValue1.BaseType.HasSubItemInfo).Returns(false); - A.CallTo(() => subItemFake_dPlcDateValue1.BaseType.HasArrayInfo).Returns(false); - A.CallTo(() => subItemFake_dPlcDateValue1.BaseType.HasEnumInfo).Returns(false); - subItemListFake_ST_Test.Add(subItemFake_dPlcDateValue1); - - var subItemFake_dtPlcDateTimeValue1 = A.Fake(); - A.CallTo(() => subItemFake_dtPlcDateTimeValue1.SubItemName).Returns("dtPlcDateTimeValue1"); - A.CallTo(() => subItemFake_dtPlcDateTimeValue1.Offset).Returns(64); - A.CallTo(() => subItemFake_dtPlcDateTimeValue1.Size).Returns(4); - A.CallTo(() => subItemFake_dtPlcDateTimeValue1.Category).Returns(DataTypeCategory.Alias); - A.CallTo(() => subItemFake_dtPlcDateTimeValue1.BaseType.DataTypeId).Returns(AdsDatatypeId.ADST_BIGTYPE); - A.CallTo(() => subItemFake_dtPlcDateTimeValue1.BaseType.Category).Returns(DataTypeCategory.Alias); - A.CallTo(() => subItemFake_dtPlcDateTimeValue1.BaseType.IsPrimitive).Returns(true); - A.CallTo(() => subItemFake_dtPlcDateTimeValue1.BaseType.ManagedType).Returns(typeof(TwinCAT.PlcOpen.DT)); - A.CallTo(() => subItemFake_dtPlcDateTimeValue1.BaseType.HasSubItemInfo).Returns(false); - A.CallTo(() => subItemFake_dtPlcDateTimeValue1.BaseType.HasArrayInfo).Returns(false); - A.CallTo(() => subItemFake_dtPlcDateTimeValue1.BaseType.HasEnumInfo).Returns(false); - A.CallTo(() => subItemFake_dtPlcDateTimeValue1.BaseType.BaseType.DataTypeId).Returns(AdsDatatypeId.ADST_BIGTYPE); - A.CallTo(() => subItemFake_dtPlcDateTimeValue1.BaseType.BaseType.Category).Returns(DataTypeCategory.Primitive); - A.CallTo(() => subItemFake_dtPlcDateTimeValue1.BaseType.BaseType.IsPrimitive).Returns(true); - A.CallTo(() => subItemFake_dtPlcDateTimeValue1.BaseType.BaseType.ManagedType).Returns(typeof(TwinCAT.PlcOpen.DT)); - A.CallTo(() => subItemFake_dtPlcDateTimeValue1.BaseType.BaseType.HasSubItemInfo).Returns(false); - A.CallTo(() => subItemFake_dtPlcDateTimeValue1.BaseType.BaseType.Size).Returns(4); - subItemListFake_ST_Test.Add(subItemFake_dtPlcDateTimeValue1); - - var subItemFake_aIntArrayValue = A.Fake(); - A.CallTo(() => subItemFake_aIntArrayValue.SubItemName).Returns("aIntArrayValue"); - A.CallTo(() => subItemFake_aIntArrayValue.Offset).Returns(68); - A.CallTo(() => subItemFake_aIntArrayValue.Size).Returns(12); - A.CallTo(() => subItemFake_aIntArrayValue.Category).Returns(DataTypeCategory.Alias); - A.CallTo(() => subItemFake_aIntArrayValue.BaseType.DataTypeId).Returns(AdsDatatypeId.ADST_INT32); - A.CallTo(() => subItemFake_aIntArrayValue.BaseType.Category).Returns(DataTypeCategory.Array); - A.CallTo(() => subItemFake_aIntArrayValue.BaseType.HasSubItemInfo).Returns(false); - A.CallTo(() => subItemFake_aIntArrayValue.BaseType.HasArrayInfo).Returns(true); - - DimensionCollection subItemFake_aIntArrayValueDimensions = new DimensionCollection(); - subItemFake_aIntArrayValueDimensions.Add(new Dimension(0, 3)); - A.CallTo(() => subItemFake_aIntArrayValue.BaseType.Dimensions).Returns(new ReadOnlyDimensionCollection(subItemFake_aIntArrayValueDimensions)); - A.CallTo(() => subItemFake_aIntArrayValue.BaseType.HasEnumInfo).Returns(false); - A.CallTo(() => subItemFake_aIntArrayValue.BaseType.BaseType.DataTypeId).Returns(AdsDatatypeId.ADST_INT32); - A.CallTo(() => subItemFake_aIntArrayValue.BaseType.BaseType.Category).Returns(DataTypeCategory.Primitive); - A.CallTo(() => subItemFake_aIntArrayValue.BaseType.BaseType.IsPrimitive).Returns(true); - A.CallTo(() => subItemFake_aIntArrayValue.BaseType.BaseType.ManagedType).Returns(typeof(System.Int32)); - A.CallTo(() => subItemFake_aIntArrayValue.BaseType.BaseType.HasSubItemInfo).Returns(false); - A.CallTo(() => subItemFake_aIntArrayValue.BaseType.BaseType.Size).Returns(4); - subItemListFake_ST_Test.Add(subItemFake_aIntArrayValue); - - var subItemFake_eEnumStateValue = A.Fake(); - A.CallTo(() => subItemFake_eEnumStateValue.SubItemName).Returns("eEnumStateValue"); - A.CallTo(() => subItemFake_eEnumStateValue.Offset).Returns(80); - A.CallTo(() => subItemFake_eEnumStateValue.Size).Returns(2); - A.CallTo(() => subItemFake_eEnumStateValue.Category).Returns(DataTypeCategory.Alias); - A.CallTo(() => subItemFake_eEnumStateValue.BaseType.DataTypeId).Returns(AdsDatatypeId.ADST_INT16); - A.CallTo(() => subItemFake_eEnumStateValue.BaseType.Category).Returns(DataTypeCategory.Enum); - A.CallTo(() => subItemFake_eEnumStateValue.BaseType.HasSubItemInfo).Returns(false); - A.CallTo(() => subItemFake_eEnumStateValue.BaseType.HasArrayInfo).Returns(false); - A.CallTo(() => subItemFake_eEnumStateValue.BaseType.HasEnumInfo).Returns(true); - - var subItemFake_eEnumStateValueEnumValues = new List(); - IEnumValue subItemFake_eEnumStateValue_EnumValue_eNone = A.Fake(); - A.CallTo(() => subItemFake_eEnumStateValue_EnumValue_eNone.Primitive).Returns((short)0); - A.CallTo(() => subItemFake_eEnumStateValue_EnumValue_eNone.Name).Returns("eNone"); - subItemFake_eEnumStateValueEnumValues.Add(subItemFake_eEnumStateValue_EnumValue_eNone); - IEnumValue subItemFake_eEnumStateValue_EnumValue_eStartup = A.Fake(); - A.CallTo(() => subItemFake_eEnumStateValue_EnumValue_eStartup.Primitive).Returns((short)1); - A.CallTo(() => subItemFake_eEnumStateValue_EnumValue_eStartup.Name).Returns("eStartup"); - subItemFake_eEnumStateValueEnumValues.Add(subItemFake_eEnumStateValue_EnumValue_eStartup); - IEnumValue subItemFake_eEnumStateValue_EnumValue_eRunning = A.Fake(); - A.CallTo(() => subItemFake_eEnumStateValue_EnumValue_eRunning.Primitive).Returns((short)2); - A.CallTo(() => subItemFake_eEnumStateValue_EnumValue_eRunning.Name).Returns("eRunning"); - subItemFake_eEnumStateValueEnumValues.Add(subItemFake_eEnumStateValue_EnumValue_eRunning); - IEnumValue subItemFake_eEnumStateValue_EnumValue_eStop = A.Fake(); - A.CallTo(() => subItemFake_eEnumStateValue_EnumValue_eStop.Primitive).Returns((short)3); - A.CallTo(() => subItemFake_eEnumStateValue_EnumValue_eStop.Name).Returns("eStop"); - subItemFake_eEnumStateValueEnumValues.Add(subItemFake_eEnumStateValue_EnumValue_eStop); - A.CallTo(() => subItemFake_eEnumStateValue.BaseType.EnumValues).Returns(new ReadOnlyEnumValueCollection(new EnumValueCollection(subItemFake_eEnumStateValueEnumValues))); - A.CallTo(() => subItemFake_eEnumStateValue.BaseType.BaseType.DataTypeId).Returns(AdsDatatypeId.ADST_INT16); - A.CallTo(() => subItemFake_eEnumStateValue.BaseType.BaseType.Category).Returns(DataTypeCategory.Primitive); - A.CallTo(() => subItemFake_eEnumStateValue.BaseType.BaseType.IsPrimitive).Returns(true); - A.CallTo(() => subItemFake_eEnumStateValue.BaseType.BaseType.ManagedType).Returns(typeof(System.Int16)); - A.CallTo(() => subItemFake_eEnumStateValue.BaseType.BaseType.HasSubItemInfo).Returns(false); - A.CallTo(() => subItemFake_eEnumStateValue.BaseType.BaseType.Size).Returns(2); - subItemListFake_ST_Test.Add(subItemFake_eEnumStateValue); - - var subItemFake_sPlcVersion = A.Fake(); - A.CallTo(() => subItemFake_sPlcVersion.SubItemName).Returns("sPlcVersion"); - A.CallTo(() => subItemFake_sPlcVersion.Name).Returns("STRING(6)"); - A.CallTo(() => subItemFake_sPlcVersion.Offset).Returns(82); - A.CallTo(() => subItemFake_sPlcVersion.Size).Returns(11); - A.CallTo(() => subItemFake_sPlcVersion.Category).Returns(DataTypeCategory.Alias); - A.CallTo(() => subItemFake_sPlcVersion.BaseType.DataTypeId).Returns(AdsDatatypeId.ADST_STRING); - A.CallTo(() => subItemFake_sPlcVersion.BaseType.ByteSize).Returns(11); - A.CallTo(() => subItemFake_sPlcVersion.BaseType.Category).Returns(DataTypeCategory.String); - A.CallTo(() => subItemFake_sPlcVersion.BaseType.IsPrimitive).Returns(true); - A.CallTo(() => subItemFake_sPlcVersion.BaseType.IsString).Returns(true); - A.CallTo(() => subItemFake_sPlcVersion.BaseType.ManagedType).Returns(typeof(System.String)); - A.CallTo(() => subItemFake_sPlcVersion.BaseType.HasSubItemInfo).Returns(false); - A.CallTo(() => subItemFake_sPlcVersion.BaseType.HasArrayInfo).Returns(false); - A.CallTo(() => subItemFake_sPlcVersion.BaseType.HasEnumInfo).Returns(false); - subItemListFake_ST_Test.Add(subItemFake_sPlcVersion); - - var subItemFake_sUtf7String = A.Fake(); - A.CallTo(() => subItemFake_sUtf7String.SubItemName).Returns("sUtf7String"); - A.CallTo(() => subItemFake_sUtf7String.Name).Returns("STRING(6)"); - A.CallTo(() => subItemFake_sUtf7String.Offset).Returns(93); - A.CallTo(() => subItemFake_sUtf7String.Size).Returns(7); - A.CallTo(() => subItemFake_sUtf7String.Category).Returns(DataTypeCategory.Alias); - A.CallTo(() => subItemFake_sUtf7String.BaseType.DataTypeId).Returns(AdsDatatypeId.ADST_STRING); - A.CallTo(() => subItemFake_sUtf7String.BaseType.ByteSize).Returns(7); - A.CallTo(() => subItemFake_sUtf7String.BaseType.Category).Returns(DataTypeCategory.String); - A.CallTo(() => subItemFake_sUtf7String.BaseType.IsPrimitive).Returns(true); - A.CallTo(() => subItemFake_sUtf7String.BaseType.IsString).Returns(true); - A.CallTo(() => subItemFake_sUtf7String.BaseType.ManagedType).Returns(typeof(System.String)); - A.CallTo(() => subItemFake_sUtf7String.BaseType.HasSubItemInfo).Returns(false); - A.CallTo(() => subItemFake_sUtf7String.BaseType.HasArrayInfo).Returns(false); - A.CallTo(() => subItemFake_sUtf7String.BaseType.HasEnumInfo).Returns(false); - subItemListFake_ST_Test.Add(subItemFake_sUtf7String); - - var subItemFake_wsUnicodeString = A.Fake(); - A.CallTo(() => subItemFake_wsUnicodeString.SubItemName).Returns("wsUnicodeString"); - A.CallTo(() => subItemFake_wsUnicodeString.Name).Returns("WSTRING(6)"); - A.CallTo(() => subItemFake_wsUnicodeString.Offset).Returns(100); - A.CallTo(() => subItemFake_wsUnicodeString.Size).Returns(14); - A.CallTo(() => subItemFake_wsUnicodeString.Category).Returns(DataTypeCategory.Alias); - A.CallTo(() => subItemFake_wsUnicodeString.BaseType.DataTypeId).Returns(AdsDatatypeId.ADST_WSTRING); - A.CallTo(() => subItemFake_wsUnicodeString.BaseType.ByteSize).Returns(14); - A.CallTo(() => subItemFake_wsUnicodeString.BaseType.Category).Returns(DataTypeCategory.String); - A.CallTo(() => subItemFake_wsUnicodeString.BaseType.IsPrimitive).Returns(false); - A.CallTo(() => subItemFake_wsUnicodeString.BaseType.IsString).Returns(false); - A.CallTo(() => subItemFake_wsUnicodeString.BaseType.ManagedType).Returns(typeof(System.String)); - A.CallTo(() => subItemFake_wsUnicodeString.BaseType.HasSubItemInfo).Returns(false); - A.CallTo(() => subItemFake_wsUnicodeString.BaseType.HasArrayInfo).Returns(false); - A.CallTo(() => subItemFake_wsUnicodeString.BaseType.HasEnumInfo).Returns(false); - subItemListFake_ST_Test.Add(subItemFake_wsUnicodeString); + IStructType fakeStructType = A.Fake(); + A.CallTo(() => fakeSymbol.DataType).Returns(fakeStructType); + + var fakeMembers = new List(); + var fakeMemberCollection = new MockMemberCollection(fakeMembers); + A.CallTo(() => fakeStructType.Members).Returns(fakeMemberCollection); + + fakeMembers.Add(CreateFakePrimitiveMember("bBoolValue1", 0)); + fakeMembers.Add(CreateFakePrimitiveMember("nByteValue1", 1)); + fakeMembers.Add(CreateFakePrimitiveMember("nSbyteValue1", 2)); + fakeMembers.Add(CreateFakePrimitiveMember("nUshortValue1", 4)); + fakeMembers.Add(CreateFakePrimitiveMember("nShortValue1", 6)); + fakeMembers.Add(CreateFakePrimitiveMember("nUintValue1", 8)); + fakeMembers.Add(CreateFakePrimitiveMember("nIntValue1", 12)); + fakeMembers.Add(CreateFakePrimitiveMember("fFloatValue1", 16)); + fakeMembers.Add(CreateFakePrimitiveMember("fDoubleValue1", 24)); + fakeMembers.Add(CreateFakePrimitiveMember("fDoubleValue2", 32)); + fakeMembers.Add(CreateFakePrimitiveMember("fDoubleValue3", 40)); + fakeMembers.Add(CreateFakePrimitiveMember("fDoubleValue4", 48)); + + fakeMembers.Add(CreateFakePrimitiveMember