mirror of
https://github.com/OpenLogics/MewtocolNet.git
synced 2025-12-06 03:01:24 +00:00
Fix some of the old tests
- add new examples - fix struct builder - complete array interfaces
This commit is contained in:
@@ -14,124 +14,6 @@ namespace MewtocolTests {
|
||||
this.output = output;
|
||||
}
|
||||
|
||||
private void Test(IRegisterInternal reg, uint expectAddr, string expectPlcName) {
|
||||
|
||||
Assert.NotNull(reg);
|
||||
Assert.StartsWith("auto_prop_register_", reg.Name);
|
||||
Assert.Null(reg.Value);
|
||||
|
||||
Assert.Equal(expectAddr, reg.MemoryAddress);
|
||||
Assert.Equal(expectPlcName, reg.GetMewName());
|
||||
|
||||
output.WriteLine(reg.ToString());
|
||||
|
||||
}
|
||||
|
||||
//actual tests
|
||||
|
||||
[Fact(DisplayName = "Boolean generation")]
|
||||
public void BooleanGen() {
|
||||
|
||||
var interf = Mewtocol.Ethernet("192.168.0.1")
|
||||
.WithRegisterCollections(x =>
|
||||
x.AddCollection(new TestBoolRegisters())
|
||||
).Build();
|
||||
|
||||
output.WriteLine(((MewtocolInterface)interf).memoryManager.ExplainLayout());
|
||||
|
||||
var register1 = interf.GetRegister("auto_prop_register_1");
|
||||
var register2 = interf.GetRegister("auto_prop_register_2");
|
||||
var register3 = interf.GetRegister("auto_prop_register_3");
|
||||
|
||||
Test((IRegisterInternal)register1, 0, "XD");
|
||||
Test((IRegisterInternal)register2, 85, "R85A");
|
||||
Test((IRegisterInternal)register3, 85, "R85B");
|
||||
|
||||
}
|
||||
|
||||
[Fact(DisplayName = "Number 16 bit generation")]
|
||||
public void N16BitGen () {
|
||||
|
||||
var interf = Mewtocol.Ethernet("192.168.0.1")
|
||||
.WithRegisterCollections(x =>
|
||||
x.AddCollection(new Nums16Bit())
|
||||
).Build();
|
||||
|
||||
var register1 = interf.GetRegister("auto_prop_register_1");
|
||||
var register2 = interf.GetRegister("auto_prop_register_2");
|
||||
var register3 = interf.GetRegister("auto_prop_register_3");
|
||||
|
||||
//test generic properties
|
||||
Test((IRegisterInternal)register1, 50, "DT50");
|
||||
Test((IRegisterInternal)register2, 342, "DT342");
|
||||
Test((IRegisterInternal)register3, 899, "DT899");
|
||||
|
||||
}
|
||||
|
||||
[Fact(DisplayName = "Number 32 bit generation")]
|
||||
public void N32BitGen () {
|
||||
|
||||
var interf = Mewtocol.Ethernet("192.168.0.1")
|
||||
.WithRegisterCollections(x => x
|
||||
.AddCollection(new Nums32Bit())
|
||||
).Build();
|
||||
|
||||
output.WriteLine(((MewtocolInterface)interf).memoryManager.ExplainLayout());
|
||||
|
||||
var register1 = interf.GetRegister("auto_prop_register_1");
|
||||
var register2 = interf.GetRegister("auto_prop_register_2");
|
||||
var register3 = interf.GetRegister("auto_prop_register_3");
|
||||
|
||||
//only one generated because same type
|
||||
var register4 = interf.GetRegister("auto_prop_register_4");
|
||||
|
||||
var register6 = interf.GetRegister("auto_prop_register_5");
|
||||
var register7 = interf.GetRegister("auto_prop_register_6");
|
||||
|
||||
//test generic properties
|
||||
Test((IRegisterInternal)register1, 7000, "DDT7000");
|
||||
Test((IRegisterInternal)register2, 7002, "DDT7002");
|
||||
Test((IRegisterInternal)register3, 7004, "DDT7004");
|
||||
|
||||
Test((IRegisterInternal)register4, 7006, "DDT7006");
|
||||
|
||||
Test((IRegisterInternal)register6, 7008, "DDT7008");
|
||||
Test((IRegisterInternal)register7, 7010, "DDT7010");
|
||||
|
||||
}
|
||||
|
||||
[Fact(DisplayName = "String generation")]
|
||||
public void StringGen() {
|
||||
|
||||
var interf = Mewtocol.Ethernet("192.168.0.1")
|
||||
.WithRegisterCollections(x =>
|
||||
x.AddCollection(new TestStringRegisters())
|
||||
).Build();
|
||||
|
||||
var register1 = interf.GetRegister("auto_prop_register_1");
|
||||
|
||||
//test generic properties
|
||||
Test((IRegisterInternal)register1, 7005, "DT7005");
|
||||
|
||||
}
|
||||
|
||||
[Fact(DisplayName = "Byte Array generation")]
|
||||
public void ByteArrGen() {
|
||||
|
||||
var interf = Mewtocol.Ethernet("192.168.0.1")
|
||||
.WithRegisterCollections(x =>
|
||||
x.AddCollection(new TestBitwiseRegisters())
|
||||
).Build();
|
||||
|
||||
var register1 = interf.GetRegister("auto_prop_register_1");
|
||||
//var register2 = interf.GetRegister("auto_prop_register_2");
|
||||
|
||||
//test generic properties
|
||||
Test((IRegisterInternal)register1, 7000, "DT7000");
|
||||
//Test((IRegisterInternal)register2, 7001, "DT7001");
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,22 +0,0 @@
|
||||
using MewtocolNet;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace MewtocolTests.EncapsulatedTests;
|
||||
|
||||
internal class RegisterReadWriteTest {
|
||||
|
||||
public IRegister TargetRegister { get; set; }
|
||||
|
||||
public object IntialValue { get; set; }
|
||||
|
||||
public object IntermediateValue { get; set; }
|
||||
|
||||
public object AfterWriteValue { get; set; }
|
||||
|
||||
public string RegisterPlcAddressName { get; set; }
|
||||
|
||||
}
|
||||
@@ -4,7 +4,7 @@ using System.Collections;
|
||||
|
||||
namespace MewtocolTests.EncapsulatedTests {
|
||||
|
||||
public enum CurrentState : short {
|
||||
public enum CurrentState16 : short {
|
||||
Undefined = 0,
|
||||
State1 = 1,
|
||||
State2 = 2,
|
||||
@@ -51,7 +51,7 @@ namespace MewtocolTests.EncapsulatedTests {
|
||||
public ushort UInt16Type { get; set; }
|
||||
|
||||
[Register("DT50")]
|
||||
public CurrentState Enum16Type { get; set; }
|
||||
public CurrentState16 Enum16Type { get; set; }
|
||||
|
||||
}
|
||||
|
||||
@@ -95,8 +95,6 @@ namespace MewtocolTests.EncapsulatedTests {
|
||||
|
||||
public class TestBitwiseRegisters : RegisterCollection {
|
||||
|
||||
[Register("DT7000")]
|
||||
public BitArray BitArr16 { get; set; }
|
||||
|
||||
//[Register("DT7001")]
|
||||
//public BitArray BitArr32 { get; set; }
|
||||
|
||||
@@ -1,36 +0,0 @@
|
||||
using MewtocolNet;
|
||||
using MewtocolNet.DocAttributes;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using Xunit;
|
||||
using Xunit.Abstractions;
|
||||
|
||||
namespace MewtocolTests;
|
||||
|
||||
public class SkippedChecks {
|
||||
|
||||
private readonly ITestOutputHelper output;
|
||||
|
||||
public SkippedChecks(ITestOutputHelper output) {
|
||||
this.output = output;
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void BuildBCCFrameGeneration() {
|
||||
|
||||
var toSuccess = new List<Type> {
|
||||
|
||||
typeof(PlcCodeTestedAttribute),
|
||||
typeof(PlcEXRTAttribute),
|
||||
typeof(PlcLegacyAttribute),
|
||||
|
||||
};
|
||||
|
||||
Assert.NotNull(toSuccess);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -66,18 +66,18 @@ namespace MewtocolTests {
|
||||
|
||||
}
|
||||
|
||||
[Fact(DisplayName = nameof(MewtocolHelpers.ParseDTByteString))]
|
||||
[Fact(DisplayName = nameof(MewtocolHelpers.ParseDTRawStringAsBytes))]
|
||||
public void ParseDTByteStringGeneration() {
|
||||
|
||||
var testList = new List<string>() {
|
||||
"1112",
|
||||
"1C2C",
|
||||
"FFFF",
|
||||
var testList = new List<byte[]>() {
|
||||
new byte[] {0x11, 0x12},
|
||||
new byte[] {0x1C, 0x2C},
|
||||
new byte[] {0xFF, 0xFF},
|
||||
};
|
||||
|
||||
foreach (var item in testList) {
|
||||
|
||||
Assert.Equal(item, $"%01$RD{item}".BCC_Mew().ParseDTByteString());
|
||||
Assert.Equal(item, $"%01$RD{item.ToHexString()}".BCC_Mew().ParseDTRawStringAsBytes());
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -37,59 +37,6 @@ namespace MewtocolTests
|
||||
|
||||
};
|
||||
|
||||
private List<RegisterReadWriteTest> testRegisterRW = new() {
|
||||
|
||||
new RegisterReadWriteTest {
|
||||
TargetRegister = new BoolRegister(IOType.R, 0xA, 10),
|
||||
RegisterPlcAddressName = "R10A",
|
||||
IntermediateValue = false,
|
||||
AfterWriteValue = true,
|
||||
},
|
||||
new RegisterReadWriteTest {
|
||||
TargetRegister = new NumberRegister<short>(3000),
|
||||
RegisterPlcAddressName = "DT3000",
|
||||
IntermediateValue = (short)0,
|
||||
AfterWriteValue = (short)-513,
|
||||
},
|
||||
new RegisterReadWriteTest {
|
||||
TargetRegister = new NumberRegister<CurrentState>(3001),
|
||||
RegisterPlcAddressName = "DT3001",
|
||||
IntermediateValue = CurrentState.Undefined,
|
||||
AfterWriteValue = CurrentState.State4,
|
||||
},
|
||||
new RegisterReadWriteTest {
|
||||
TargetRegister = new NumberRegister<CurrentState32>(3002),
|
||||
RegisterPlcAddressName = "DDT3002",
|
||||
IntermediateValue = CurrentState32.Undefined,
|
||||
AfterWriteValue = CurrentState32.StateBetween,
|
||||
},
|
||||
new RegisterReadWriteTest {
|
||||
TargetRegister = new NumberRegister<TimeSpan>(3004),
|
||||
RegisterPlcAddressName = "DDT3004",
|
||||
IntermediateValue = TimeSpan.Zero,
|
||||
AfterWriteValue = TimeSpan.FromSeconds(11),
|
||||
},
|
||||
new RegisterReadWriteTest {
|
||||
TargetRegister = new NumberRegister<TimeSpan>(3006),
|
||||
RegisterPlcAddressName = "DDT3006",
|
||||
IntermediateValue = TimeSpan.Zero,
|
||||
AfterWriteValue = PlcFormat.ParsePlcTime("T#50m"),
|
||||
},
|
||||
new RegisterReadWriteTest {
|
||||
TargetRegister = new StringRegister(40),
|
||||
RegisterPlcAddressName = "DT40",
|
||||
IntermediateValue = "Hello",
|
||||
AfterWriteValue = "TestV",
|
||||
},
|
||||
new RegisterReadWriteTest {
|
||||
TargetRegister = RegBuilder.Factory.FromPlcRegName("DT3008").AsBits(5).Build(),
|
||||
RegisterPlcAddressName = "DT3008",
|
||||
IntermediateValue = new BitArray(new bool[] { false, false, false, false, false }),
|
||||
AfterWriteValue = new BitArray(new bool[] { false, true, false, false, false }),
|
||||
},
|
||||
|
||||
};
|
||||
|
||||
public TestLivePLC(ITestOutputHelper output) {
|
||||
|
||||
this.output = output;
|
||||
@@ -141,58 +88,6 @@ namespace MewtocolTests
|
||||
|
||||
}
|
||||
|
||||
[Fact(DisplayName = "Reading / Writing registers from PLC (Ethernet)")]
|
||||
public async void TestRegisterReadWriteAsync() {
|
||||
|
||||
Logger.LogLevel = LogLevel.Verbose;
|
||||
Logger.OnNewLogMessage((d, l, m) => {
|
||||
|
||||
output.WriteLine($"{d:HH:mm:ss:fff} {m}");
|
||||
|
||||
});
|
||||
|
||||
var plc = testPlcInformationData[0];
|
||||
|
||||
output.WriteLine($"\n\n --- Testing: {plc.PLCName} ---\n");
|
||||
|
||||
var client = Mewtocol.Ethernet(plc.PLCIP, plc.PLCPort).Build();
|
||||
|
||||
foreach (var testRW in testRegisterRW) {
|
||||
|
||||
client.AddRegister(testRW.TargetRegister);
|
||||
|
||||
}
|
||||
|
||||
await client.ConnectAsync();
|
||||
Assert.True(client.IsConnected);
|
||||
|
||||
//cycle run mode to reset registers to inital
|
||||
await client.SetOperationModeAsync(false);
|
||||
await client.SetOperationModeAsync(true);
|
||||
|
||||
foreach (var testRW in testRegisterRW) {
|
||||
|
||||
var testRegister = client.Registers.First(x => x.PLCAddressName == testRW.RegisterPlcAddressName);
|
||||
|
||||
//test inital val
|
||||
Assert.Null(testRegister.Value);
|
||||
|
||||
await testRegister.ReadAsync();
|
||||
|
||||
Assert.Equal(testRW.IntermediateValue, testRegister.Value);
|
||||
|
||||
await testRegister.WriteAsync(testRW.AfterWriteValue);
|
||||
await testRegister.ReadAsync();
|
||||
|
||||
//test after write val
|
||||
Assert.Equal(testRW.AfterWriteValue, testRegister.Value);
|
||||
|
||||
}
|
||||
|
||||
client.Disconnect();
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
89
MewtocolTests/TestPublicBuilderPattern.cs
Normal file
89
MewtocolTests/TestPublicBuilderPattern.cs
Normal file
@@ -0,0 +1,89 @@
|
||||
using MewtocolNet;
|
||||
using MewtocolNet.RegisterBuilding;
|
||||
using MewtocolNet.RegisterBuilding.BuilderPatterns;
|
||||
using MewtocolNet.Registers;
|
||||
using MewtocolTests.EncapsulatedTests;
|
||||
using System.Collections;
|
||||
using Xunit;
|
||||
using Xunit.Abstractions;
|
||||
|
||||
namespace MewtocolTests;
|
||||
|
||||
public class TestPublicBuilderPattern {
|
||||
|
||||
private readonly ITestOutputHelper output;
|
||||
|
||||
public TestPublicBuilderPattern(ITestOutputHelper output) => this.output = output;
|
||||
|
||||
private void TestStruct<T> (string buildAddr, uint expectAddr, uint expectByteSize) where T : struct {
|
||||
|
||||
using var interf = (MewtocolInterface)Mewtocol.Ethernet("192.168.115.210").Build();
|
||||
var builder = new RBuild(interf);
|
||||
|
||||
var comparer = new StructRegister<T>(expectAddr, expectByteSize) {
|
||||
attachedInterface = interf,
|
||||
pollLevel = 1,
|
||||
};
|
||||
|
||||
//test building to the internal list
|
||||
builder.Struct<T>(buildAddr).Build();
|
||||
var generated = builder.assembler.assembled.First();
|
||||
Assert.Equivalent(comparer, generated);
|
||||
builder.assembler.assembled.Clear();
|
||||
output.WriteLine(generated.Explain());
|
||||
|
||||
//test building with direct out
|
||||
builder.Struct<T>(buildAddr).Build(out var testRef);
|
||||
Assert.Equivalent(comparer, testRef);
|
||||
builder.assembler.assembled.Clear();
|
||||
output.WriteLine(((Register)testRef).Explain());
|
||||
|
||||
comparer.pollLevel++;
|
||||
|
||||
//test building to the internal list with poll level
|
||||
builder.Struct<T>(buildAddr).PollLevel(2).Build();
|
||||
var generated2 = builder.assembler.assembled.First();
|
||||
Assert.Equivalent(comparer, generated2);
|
||||
builder.assembler.assembled.Clear();
|
||||
output.WriteLine(generated2.Explain());
|
||||
|
||||
//test building direct out with poll level
|
||||
builder.Struct<T>(buildAddr).PollLevel(2).Build(out var testRef2);
|
||||
Assert.Equivalent(comparer, testRef2);
|
||||
builder.assembler.assembled.Clear();
|
||||
output.WriteLine(((Register)testRef2).Explain());
|
||||
|
||||
}
|
||||
|
||||
//16 bit structs
|
||||
|
||||
[Fact(DisplayName = "[16 Bit] short")]
|
||||
public void TestStruct_1() => TestStruct<short>("DT100", 100, 2);
|
||||
|
||||
[Fact(DisplayName = "[16 Bit] ushort")]
|
||||
public void TestStruct_2() => TestStruct<ushort>("DT101", 101, 2);
|
||||
|
||||
[Fact(DisplayName = "[16 Bit] Word")]
|
||||
public void TestStruct_3() => TestStruct<Word>("DT102", 102, 2);
|
||||
|
||||
[Fact(DisplayName = "[16 Bit] Enum")]
|
||||
public void TestStruct_4() => TestStruct<CurrentState16>("DT103", 103, 2);
|
||||
|
||||
//32 bit structs
|
||||
|
||||
[Fact(DisplayName = "[32 Bit] int")]
|
||||
public void TestStruct_5() => TestStruct<int>("DT104", 104, 4);
|
||||
|
||||
[Fact(DisplayName = "[32 Bit] uint")]
|
||||
public void TestStruct_6() => TestStruct<uint>("DT105", 105, 4);
|
||||
|
||||
[Fact(DisplayName = "[32 Bit] DWord")]
|
||||
public void TestStruct_7() => TestStruct<DWord>("DT106", 106, 4);
|
||||
|
||||
[Fact(DisplayName = "[32 Bit] Enum")]
|
||||
public void TestStruct_8() => TestStruct<CurrentState32>("DT107", 107, 4);
|
||||
|
||||
[Fact(DisplayName = "[32 Bit] TimeSpan")]
|
||||
public void TestStruct_9() => TestStruct<TimeSpan>("DT108", 108, 4);
|
||||
|
||||
}
|
||||
63
MewtocolTests/TestPublicBuilderPatternArrays.cs
Normal file
63
MewtocolTests/TestPublicBuilderPatternArrays.cs
Normal file
@@ -0,0 +1,63 @@
|
||||
using MewtocolNet;
|
||||
using MewtocolNet.RegisterBuilding;
|
||||
using MewtocolNet.RegisterBuilding.BuilderPatterns;
|
||||
using MewtocolNet.Registers;
|
||||
using MewtocolTests.EncapsulatedTests;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using Xunit;
|
||||
using Xunit.Abstractions;
|
||||
|
||||
namespace MewtocolTests;
|
||||
|
||||
public class TestPublicBuilderPatternArray {
|
||||
|
||||
private readonly ITestOutputHelper output;
|
||||
|
||||
public TestPublicBuilderPatternArray(ITestOutputHelper output) => this.output = output;
|
||||
|
||||
private void TestArray1D<T> (string buildAddr, int indices1, uint expectAddr, uint expectByteSize) where T : struct {
|
||||
|
||||
using var interf = (MewtocolInterface)Mewtocol.Ethernet("192.168.115.210").Build();
|
||||
var builder = new RBuild(interf);
|
||||
|
||||
var comparer = new ArrayRegister<T>(expectAddr, expectByteSize, new int[] { indices1 }) {
|
||||
attachedInterface = interf,
|
||||
pollLevel = 1
|
||||
};
|
||||
|
||||
//test building to the internal list
|
||||
builder.Struct<T>(buildAddr).AsArray(indices1).Build();
|
||||
var generated = builder.assembler.assembled.First();
|
||||
|
||||
Assert.Equivalent(comparer, generated);
|
||||
|
||||
builder.assembler.assembled.Clear();
|
||||
output.WriteLine(generated.Explain());
|
||||
|
||||
////test building with direct out
|
||||
//builder.Struct<T>(buildAddr).AsArray(indices1).Build(out var testRef);
|
||||
//Assert.Equivalent(comparer, testRef);
|
||||
//builder.assembler.assembled.Clear();
|
||||
//output.WriteLine(((Register)testRef).Explain());
|
||||
|
||||
//comparer.pollLevel++;
|
||||
|
||||
////test building to the internal list with poll level
|
||||
//builder.Struct<T>(buildAddr).AsArray(indices1).PollLevel(2).Build();
|
||||
//var generated2 = builder.assembler.assembled.First();
|
||||
//Assert.Equivalent(comparer, generated2);
|
||||
//builder.assembler.assembled.Clear();
|
||||
//output.WriteLine(generated2.Explain());
|
||||
|
||||
////test building direct out with poll level
|
||||
//builder.Struct<T>(buildAddr).AsArray(indices1).PollLevel(2).Build(out var testRef2);
|
||||
//Assert.Equivalent(comparer, testRef2);
|
||||
//builder.assembler.assembled.Clear();
|
||||
//output.WriteLine(((Register)testRef2).Explain());
|
||||
|
||||
}
|
||||
|
||||
//16 bit structs
|
||||
|
||||
}
|
||||
@@ -1,5 +1,6 @@
|
||||
using MewtocolNet;
|
||||
using MewtocolNet.RegisterBuilding;
|
||||
using MewtocolNet.RegisterBuilding.BuilderPatterns;
|
||||
using MewtocolNet.Registers;
|
||||
using MewtocolTests.EncapsulatedTests;
|
||||
using System.Collections;
|
||||
@@ -123,137 +124,9 @@ public class TestRegisterBuilder {
|
||||
|
||||
foreach (var item in dict) {
|
||||
|
||||
output.WriteLine($"Expected: {item.Key}");
|
||||
|
||||
var built = RegBuilder.Factory.FromPlcRegName(item.Key).AsPlcType(PlcVarType.BOOL).Build();
|
||||
|
||||
output.WriteLine($"{(built?.ToString(true) ?? "null")}\n");
|
||||
Assert.Equivalent(item.Value, built);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
[Fact(DisplayName = "Parsing as Bool Register (Casted)")]
|
||||
public void TestRegisterBuildingBoolCasted () {
|
||||
|
||||
var expect = new BoolRegister(IOType.R, 0x1, 0);
|
||||
var expect2 = new BoolRegister(IOType.Y, 0xA, 103);
|
||||
|
||||
Assert.Equivalent(expect, RegBuilder.Factory.FromPlcRegName("R1").AsPlcType(PlcVarType.BOOL).Build());
|
||||
Assert.Equivalent(expect, RegBuilder.Factory.FromPlcRegName("R1").AsType<bool>().Build());
|
||||
|
||||
Assert.Equivalent(expect2, RegBuilder.Factory.FromPlcRegName("Y103A").AsPlcType(PlcVarType.BOOL).Build());
|
||||
Assert.Equivalent(expect2, RegBuilder.Factory.FromPlcRegName("Y103A").AsType<bool>().Build());
|
||||
|
||||
}
|
||||
|
||||
[Fact(DisplayName = "Parsing as Bool Register (Auto)")]
|
||||
public void TestRegisterBuildingBoolAuto () {
|
||||
|
||||
var expect = new BoolRegister(IOType.R, 0x1, 0);
|
||||
var expect2 = new BoolRegister(IOType.Y, 0xA, 103);
|
||||
|
||||
Assert.Equivalent(expect, RegBuilder.Factory.FromPlcRegName("R1").Build());
|
||||
Assert.Equivalent(expect, RegBuilder.Factory.FromPlcRegName("R1").Build());
|
||||
|
||||
Assert.Equivalent(expect2, RegBuilder.Factory.FromPlcRegName("Y103A").Build());
|
||||
Assert.Equivalent(expect2, RegBuilder.Factory.FromPlcRegName("Y103A").Build());
|
||||
|
||||
}
|
||||
|
||||
[Fact(DisplayName = "Parsing as Number Register (Casted)")]
|
||||
public void TestRegisterBuildingNumericCasted () {
|
||||
|
||||
var expect = new NumberRegister<short>(303);
|
||||
var expect2 = new NumberRegister<int>(10002);
|
||||
var expect3 = new NumberRegister<float>(404);
|
||||
var expect4 = new NumberRegister<TimeSpan>(400);
|
||||
var expect5 = new NumberRegister<CurrentState>(203);
|
||||
var expect6 = new NumberRegister<CurrentState32>(204);
|
||||
|
||||
Assert.Equivalent(expect, RegBuilder.Factory.FromPlcRegName("DT303").AsPlcType(PlcVarType.INT).Build());
|
||||
Assert.Equivalent(expect, RegBuilder.Factory.FromPlcRegName("DT303").AsType<short>().Build());
|
||||
|
||||
Assert.Equivalent(expect2, RegBuilder.Factory.FromPlcRegName("DDT10002").AsPlcType(PlcVarType.DINT).Build());
|
||||
Assert.Equivalent(expect2, RegBuilder.Factory.FromPlcRegName("DDT10002").AsType<int>().Build());
|
||||
|
||||
Assert.Equivalent(expect3, RegBuilder.Factory.FromPlcRegName("DDT404").AsPlcType(PlcVarType.REAL).Build());
|
||||
Assert.Equivalent(expect3, RegBuilder.Factory.FromPlcRegName("DDT404").AsType<float>().Build());
|
||||
|
||||
Assert.Equivalent(expect4, RegBuilder.Factory.FromPlcRegName("DDT400").AsPlcType(PlcVarType.TIME).Build());
|
||||
Assert.Equivalent(expect4, RegBuilder.Factory.FromPlcRegName("DDT400").AsType<TimeSpan>().Build());
|
||||
|
||||
Assert.Equivalent(expect5, RegBuilder.Factory.FromPlcRegName("DT203").AsType<CurrentState>().Build());
|
||||
Assert.Equivalent(expect6, RegBuilder.Factory.FromPlcRegName("DT204").AsType<CurrentState32>().Build());
|
||||
|
||||
}
|
||||
|
||||
[Fact(DisplayName = "Parsing as Number Register (Auto)")]
|
||||
public void TestRegisterBuildingNumericAuto () {
|
||||
|
||||
var expect = new NumberRegister<short>(201);
|
||||
var expect2 = new NumberRegister<int>(10002);
|
||||
|
||||
Assert.Equivalent(expect, RegBuilder.Factory.FromPlcRegName("DT201").Build());
|
||||
Assert.Equivalent(expect2, RegBuilder.Factory.FromPlcRegName("DDT10002").Build());
|
||||
|
||||
}
|
||||
|
||||
[Fact(DisplayName = "Parsing as Bytes Register (Casted)")]
|
||||
public void TestRegisterBuildingByteRangeCasted () {
|
||||
|
||||
var expect = new BytesRegister(305, (uint)35);
|
||||
|
||||
Assert.Equal((uint)18, expect.AddressLength);
|
||||
Assert.Equivalent(expect, RegBuilder.Factory.FromPlcRegName("DT305").AsBytes(35).Build());
|
||||
|
||||
}
|
||||
|
||||
[Fact(DisplayName = "Parsing as Bytes Register (Auto)")]
|
||||
public void TestRegisterBuildingByteRangeAuto () {
|
||||
|
||||
var expect = new BytesRegister(300, (uint)20 * 2);
|
||||
var actual = (BytesRegister)RegBuilder.Factory.FromPlcRegName("DT300-DT319").Build();
|
||||
|
||||
Assert.Equal((uint)20, expect.AddressLength);
|
||||
Assert.Equivalent(expect, actual);
|
||||
|
||||
}
|
||||
|
||||
[Fact(DisplayName = "Parsing as Bit Array")]
|
||||
public void TestRegisterBuildingBitArray () {
|
||||
|
||||
var expect1 = new BytesRegister(311, (ushort)5);
|
||||
var expect2 = new BytesRegister(312, (ushort)16);
|
||||
var expect3 = new BytesRegister(313, (ushort)32);
|
||||
|
||||
var actual1 = (BytesRegister)RegBuilder.Factory.FromPlcRegName("DT311").AsBits(5).Build();
|
||||
var actual2 = (BytesRegister)RegBuilder.Factory.FromPlcRegName("DT312").AsBits(16).Build();
|
||||
var actual3 = (BytesRegister)RegBuilder.Factory.FromPlcRegName("DT313").AsBits(32).Build();
|
||||
|
||||
Assert.Equivalent(expect1, actual1);
|
||||
Assert.Equivalent(expect2, actual2);
|
||||
Assert.Equivalent(expect3, actual3);
|
||||
|
||||
Assert.Equal((uint)1, actual1.AddressLength);
|
||||
Assert.Equal((uint)1, actual2.AddressLength);
|
||||
Assert.Equal((uint)2, actual3.AddressLength);
|
||||
|
||||
}
|
||||
|
||||
[Fact(DisplayName = "Parsing as String Register")]
|
||||
public void TestRegisterBuildingString () {
|
||||
|
||||
var expect1 = new StringRegister(314);
|
||||
|
||||
var actual1 = (StringRegister)RegBuilder.Factory.FromPlcRegName("DT314").AsType<string>().Build();
|
||||
|
||||
Assert.Equivalent(expect1, actual1);
|
||||
|
||||
Assert.Equal((uint)0, actual1.WordsSize);
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -13,113 +13,22 @@ namespace MewtocolTests {
|
||||
this.output = output;
|
||||
}
|
||||
|
||||
[Fact(DisplayName = "Numeric mewtocol query building")]
|
||||
public void NumericRegisterMewtocolIdentifiers() {
|
||||
|
||||
List<IRegisterInternal> registers = new List<IRegisterInternal> {
|
||||
new NumberRegister<short>(50),
|
||||
new NumberRegister<ushort>(50),
|
||||
new NumberRegister<int>(50),
|
||||
new NumberRegister<uint>(50),
|
||||
new NumberRegister<float>(50),
|
||||
new NumberRegister<TimeSpan>(50),
|
||||
new BytesRegister(50, (uint)30),
|
||||
new BytesRegister(50, (uint)31),
|
||||
};
|
||||
|
||||
List<string> expectedIdents = new List<string> {
|
||||
"D0005000050", //single word register
|
||||
"D0005000050", //single word register
|
||||
"D0005000051", //double word register
|
||||
"D0005000051", //double word register
|
||||
"D0005000051", //double word register
|
||||
"D0005000051", //double word register
|
||||
"D0005000064", //variable len register even bytes
|
||||
"D0005000065", //variable len register odd bytes
|
||||
};
|
||||
|
||||
//test mewtocol idents
|
||||
for (int i = 0; i < registers.Count; i++) {
|
||||
|
||||
IRegisterInternal? reg = registers[i];
|
||||
string expect = expectedIdents[i];
|
||||
|
||||
Assert.Equal(expect, reg.BuildMewtocolQuery());
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
[Fact(DisplayName = "PLC register naming convention test")]
|
||||
public void PLCRegisterIdentifiers() {
|
||||
|
||||
List<IRegisterInternal> registers = new List<IRegisterInternal> {
|
||||
//numeric ones
|
||||
new NumberRegister<short>(50, _name: null),
|
||||
new NumberRegister<ushort>(60, _name : null),
|
||||
new NumberRegister<int>(70, _name : null),
|
||||
new NumberRegister<uint>(80, _name : null),
|
||||
new NumberRegister<float>(90, _name : null),
|
||||
new NumberRegister<TimeSpan>(100, _name : null),
|
||||
|
||||
//boolean
|
||||
new BoolRegister(IOType.R, 0, 100),
|
||||
new BoolRegister(IOType.R, 0, 0),
|
||||
new BoolRegister(IOType.X, 5),
|
||||
new BoolRegister(IOType.X, 0xA),
|
||||
new BoolRegister(IOType.X, 0xF, 109),
|
||||
new BoolRegister(IOType.Y, 0xC, 75),
|
||||
|
||||
//string
|
||||
new BytesRegister(999, 5),
|
||||
};
|
||||
|
||||
List<string> expcectedIdents = new List<string> {
|
||||
|
||||
//numeric ones
|
||||
"DT50",
|
||||
"DT60",
|
||||
"DDT70",
|
||||
"DDT80",
|
||||
"DDT90",
|
||||
"DDT100",
|
||||
|
||||
//boolean
|
||||
"R100",
|
||||
"R0",
|
||||
"X5",
|
||||
"XA",
|
||||
"X109F",
|
||||
"Y75C",
|
||||
|
||||
//string
|
||||
"DT999"
|
||||
|
||||
};
|
||||
|
||||
//test mewtocol idents
|
||||
for (int i = 0; i < registers.Count; i++) {
|
||||
|
||||
IRegisterInternal? reg = registers[i];
|
||||
string expect = expcectedIdents[i];
|
||||
|
||||
Assert.Equal(expect, reg.GetMewName());
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
[Fact(DisplayName = "Non allowed (Overflow address)")]
|
||||
public void OverFlowRegisterAddress() {
|
||||
[Fact(DisplayName = "Non allowed Struct Address (Overflow address)")]
|
||||
public void OverFlowStructRegister() {
|
||||
|
||||
var ex = Assert.Throws<NotSupportedException>(() => {
|
||||
|
||||
new NumberRegister<short>(100000, _name: null);
|
||||
new StructRegister<short>(100000, 2);
|
||||
|
||||
});
|
||||
|
||||
output.WriteLine(ex.Message.ToString());
|
||||
|
||||
}
|
||||
|
||||
[Fact(DisplayName = "Non allowed Boolean Address (Overflow address )")]
|
||||
public void OverFlowBoolRegister() {
|
||||
|
||||
var ex1 = Assert.Throws<NotSupportedException>(() => {
|
||||
|
||||
new BoolRegister(IOType.R, _areaAdress: 512);
|
||||
@@ -136,27 +45,6 @@ namespace MewtocolTests {
|
||||
|
||||
output.WriteLine(ex2.Message.ToString());
|
||||
|
||||
var ex3 = Assert.Throws<NotSupportedException>(() => {
|
||||
|
||||
new BytesRegister(100000, 5);
|
||||
|
||||
});
|
||||
|
||||
output.WriteLine(ex3.Message.ToString());
|
||||
|
||||
}
|
||||
|
||||
[Fact(DisplayName = "Non allowed (Wrong data type)")]
|
||||
public void WrongDataTypeRegister() {
|
||||
|
||||
var ex = Assert.Throws<NotSupportedException>(() => {
|
||||
|
||||
new NumberRegister<double>(100, _name: null);
|
||||
|
||||
});
|
||||
|
||||
output.WriteLine(ex.Message.ToString());
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user