Dreamine.FullKit.Tests 1.0.0.0
Dreamine.FullKit.Tests 기능을 검증하는 자동화 테스트 프로젝트입니다.
로딩중...
검색중...
일치하는것 없음
FastechProtocolTests.cs
이 파일의 문서화 페이지로 가기
1using Dreamine.IO.Abstractions.Models;
2using Dreamine.IO.Abstractions.Results;
3using Dreamine.IO.Fastech.Ethernet.Controllers;
4using Dreamine.IO.Fastech.Ethernet.Options;
5using Dreamine.IO.Fastech.Ethernet.Protocol;
6using Dreamine.IO.Fastech.Ethernet.Transport;
7
9
18public sealed class FastechProtocolTests
19{
28 [Fact]
30 {
31 var frame = new FastechPlusE16PointProtocol()
32 .BuildReadDigitalInputs(new[] { new IoPoint(0, 0) });
33
34 Assert.Equal(0xAA, frame[0]);
35 Assert.Equal(3, frame[1]);
36 Assert.Equal(0x00, frame[3]);
37 Assert.Equal(0xC0, frame[4]);
38 }
39
48 [Fact]
50 {
51 var protocol = new FastechPlusE16PointProtocol();
52 var response = new byte[]
53 {
54 0xAA, 12, 1, 0x00, 0xC0, 0x00,
55 0b0000_0101, 0b0000_0010, 0, 0, 0, 0, 0, 0
56 };
57
58 var result = protocol.ParseDigitalInputs(response, 10);
59
60 Assert.True(result.IsSuccess);
61 Assert.Equal(new[] { true, false, true, false, false, false, false, false, false, true }, result.Value);
62 }
63
72 [Fact]
74 {
75 var protocol = new FastechPlusE16PointProtocol();
76 var values = new Dictionary<IoPoint, bool>
77 {
78 [new IoPoint(0, 16)] = true
79 };
80
81 Assert.Throws<ArgumentOutOfRangeException>(() => protocol.BuildWriteDigitalOutputs(values));
82 }
83
92 [Fact]
94 {
95 var protocol = new FastechPlusE16PointProtocol();
96 var point = new AnalogIoPoint(0, 0);
97
98 var inputException = Assert.Throws<NotSupportedException>(() => protocol.BuildReadAnalogInputs([point]));
99 var inputParse = protocol.ParseAnalogInputs([], 1);
100 var outputException = Assert.Throws<NotSupportedException>(() => protocol.BuildReadAnalogOutputs([point]));
101 var outputParse = protocol.ParseAnalogOutputs([], 1);
102
103 Assert.Equal(inputException.Message, inputParse.Message);
104 Assert.Equal(outputException.Message, outputParse.Message);
105 Assert.False(inputParse.IsSuccess);
106 Assert.False(outputParse.IsSuccess);
107 }
108
117 [Fact]
119 {
120 var protocol = new UnsupportedFastechEthernetIoProtocol();
121
122 Assert.False(protocol.ParseDigitalInputs(Array.Empty<byte>(), 1).IsSuccess);
123 Assert.False(protocol.ParseDigitalOutputs(Array.Empty<byte>(), 1).IsSuccess);
124 Assert.False(protocol.ParseAnalogInputs(Array.Empty<byte>(), 1).IsSuccess);
125 Assert.Throws<NotSupportedException>(() => protocol.BuildReadDigitalInputs(Array.Empty<IoPoint>()));
126 }
127
144 [Fact]
146 {
147 var transport = new FakeFastechTransport();
148 await using var controller = new FastechEthernetIoController(
149 new FastechEthernetIoOptions(),
150 transport,
152
153 await controller.ConnectAsync();
154
155 var result = await controller.DigitalInputs.ReadAsync([new IoPoint(0, 0)]);
156
157 Assert.False(result.IsSuccess);
158 Assert.Contains("parse failed", result.Message);
159 }
160
169 [Fact]
171 {
172 var options = new FastechEthernetIoOptions();
173
174 Assert.Equal("127.0.0.1", options.Host);
175 Assert.Equal(FastechEthernetIoTransportType.Udp, options.TransportType);
176 }
177
186 private sealed class FakeFastechTransport : IFastechEthernetIoTransport
187 {
196 public bool IsConnected { get; private set; }
197
222 public Task<IoResult> ConnectAsync(CancellationToken cancellationToken = default)
223 {
224 IsConnected = true;
225 return Task.FromResult(IoResult.Success());
226 }
227
252 public Task<IoResult> DisconnectAsync(CancellationToken cancellationToken = default)
253 {
254 IsConnected = false;
255 return Task.FromResult(IoResult.Success());
256 }
257
306 public Task<IoResult<byte[]>> SendAndReceiveAsync(
307 IReadOnlyList<byte> requestFrame,
308 int receiveTimeoutMs,
309 int expectedResponseLength,
310 CancellationToken cancellationToken = default)
311 {
312 return Task.FromResult(IoResult<byte[]>.Success([0xAA, 3, 1, 0, 0xC0, 0]));
313 }
314
331 public ValueTask DisposeAsync()
332 {
333 IsConnected = false;
334 return ValueTask.CompletedTask;
335 }
336 }
337
346 private sealed class ThrowingParseProtocol : IFastechEthernetIoProtocol
347 {
372 public byte[] BuildReadDigitalInputs(IReadOnlyList<IoPoint> points)
373 {
374 return [1];
375 }
376
417 public IoResult<bool[]> ParseDigitalInputs(IReadOnlyList<byte> responseFrame, int count)
418 {
419 throw new InvalidOperationException("parse failed");
420 }
421
446 public byte[] BuildReadDigitalOutputs(IReadOnlyList<IoPoint> points)
447 {
448 return [1];
449 }
450
483 public IoResult<bool[]> ParseDigitalOutputs(IReadOnlyList<byte> responseFrame, int count)
484 {
485 return IoResult<bool[]>.Success([]);
486 }
487
512 public byte[] BuildWriteDigitalOutputs(IReadOnlyDictionary<IoPoint, bool> values)
513 {
514 return [1];
515 }
516
541 public byte[] BuildReadAnalogInputs(IReadOnlyList<AnalogIoPoint> points)
542 {
543 return [1];
544 }
545
578 public IoResult<double[]> ParseAnalogInputs(IReadOnlyList<byte> responseFrame, int count)
579 {
580 return IoResult<double[]>.Success([]);
581 }
582
607 public byte[] BuildReadAnalogOutputs(IReadOnlyList<AnalogIoPoint> points)
608 {
609 return [1];
610 }
611
644 public IoResult<double[]> ParseAnalogOutputs(IReadOnlyList<byte> responseFrame, int count)
645 {
646 return IoResult<double[]>.Success([]);
647 }
648
673 public byte[] BuildWriteAnalogOutputs(IReadOnlyDictionary<AnalogIoPoint, double> values)
674 {
675 return [1];
676 }
677
702 public IoResult ParseWriteResponse(IReadOnlyList<byte> responseFrame)
703 {
704 return IoResult.Success();
705 }
706 }
707}
Task< IoResult > ConnectAsync(CancellationToken cancellationToken=default)
Task< IoResult > DisconnectAsync(CancellationToken cancellationToken=default)
Task< IoResult< byte[]> > SendAndReceiveAsync(IReadOnlyList< byte > requestFrame, int receiveTimeoutMs, int expectedResponseLength, CancellationToken cancellationToken=default)
byte[] BuildReadAnalogOutputs(IReadOnlyList< AnalogIoPoint > points)
byte[] BuildReadAnalogInputs(IReadOnlyList< AnalogIoPoint > points)
IoResult< double[]> ParseAnalogInputs(IReadOnlyList< byte > responseFrame, int count)
byte[] BuildWriteDigitalOutputs(IReadOnlyDictionary< IoPoint, bool > values)
IoResult< double[]> ParseAnalogOutputs(IReadOnlyList< byte > responseFrame, int count)
IoResult< bool[]> ParseDigitalInputs(IReadOnlyList< byte > responseFrame, int count)
IoResult< bool[]> ParseDigitalOutputs(IReadOnlyList< byte > responseFrame, int count)
byte[] BuildWriteAnalogOutputs(IReadOnlyDictionary< AnalogIoPoint, double > values)