- Refactor `ProcessOptoLine` logic to support output buffer resets at configurable repetition intervals. - Add tests: - `ProcessOptoLine_Block_f_h1_h2_h3_f_ShouldResetBuffersOnlyAfterLastF` - `ReadOptoData_FullBlock_ShouldDiscardBuffersAfterClosingF` - `ProcessOptoLine_LastF_AfterH3_ShouldRequestBufferReset` - `ProcessOptoLine_ShouldReset
90 lines
2.1 KiB
C#
90 lines
2.1 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Text;
|
|
using TBF.Rig.RegisterReaders.GenesisRegReader.communication.Utils;
|
|
|
|
namespace TBFTests.Rig.RegisterReaders.GenesisRegReader.implementations
|
|
{
|
|
|
|
|
|
public sealed class FakeSerialDriver : ISerialDriver
|
|
{
|
|
private readonly Queue<string> _lines = new Queue<string>();
|
|
private bool _isOpen;
|
|
|
|
public int OpenCalls { get; private set; }
|
|
public int CloseCalls { get; private set; }
|
|
public int DiscardInCalls { get; private set; }
|
|
public int DiscardOutCalls { get; private set; }
|
|
|
|
|
|
public Encoding Encoding { get; set; } = Encoding.ASCII;
|
|
|
|
public int BytesToRead => _isOpen && _lines.Count > 0 ? 1 : 0;
|
|
public int BytesToWrite => 0;
|
|
|
|
public void EnqueueLine(string line) => _lines.Enqueue(line);
|
|
|
|
public bool IsOpen => _isOpen;
|
|
|
|
public void Open()
|
|
{
|
|
OpenCalls++;
|
|
_isOpen = true;
|
|
}
|
|
|
|
public void Close()
|
|
{
|
|
CloseConnection();
|
|
}
|
|
|
|
public void CloseConnection()
|
|
{
|
|
CloseCalls++;
|
|
_isOpen = false;
|
|
}
|
|
|
|
public void DiscardInBuffer()
|
|
{
|
|
DiscardInCalls++;
|
|
_lines.Clear();
|
|
}
|
|
|
|
public void DiscardOutBuffer()
|
|
{
|
|
DiscardOutCalls++;
|
|
}
|
|
|
|
public string ReadLine()
|
|
{
|
|
if (!_isOpen)
|
|
throw new InvalidOperationException("Port not open.");
|
|
|
|
if (_lines.Count == 0)
|
|
throw new TimeoutException();
|
|
|
|
return _lines.Dequeue();
|
|
}
|
|
|
|
public string ReadExisting()
|
|
{
|
|
if (!_isOpen)
|
|
throw new InvalidOperationException("Port not open.");
|
|
|
|
if (_lines.Count == 0)
|
|
return string.Empty;
|
|
|
|
return _lines.Dequeue();
|
|
}
|
|
|
|
public byte[] SendAndWait(byte[] request, int timeout)
|
|
{
|
|
return Array.Empty<byte>();
|
|
}
|
|
|
|
public void Dispose()
|
|
{
|
|
_isOpen = false;
|
|
}
|
|
}
|
|
} |