11using Xunit ;
22using NetSdrClientApp . Messages ;
3- using NetSdrClientApp . Networking ;
3+ using NetSdrClientApp . Networking ;
44using System ;
55using System . Threading . Tasks ;
6- using NetArchTest . Rules ; // <-- Из Лабы 5
7- using System . Reflection ; // <-- Из Лабы 5
8- using Moq ; // <-- НОВАЯ БИБЛИОТЕКА
9- using NetSdrClientApp ; // <-- НОВЫЙ КЛАСС ДЛЯ ТЕСТА
6+ using NetArchTest . Rules ;
7+ using System . Reflection ;
8+ // using Moq; // <-- УДАЛЕНО
9+ using NetSdrClientApp ;
10+ using System . Collections . Generic ; // <-- Добавлено
11+ using System . Threading ; // <-- Добавлено
1012
1113namespace NetSdrClientAppTests
1214{
15+ // --- ВАШИ СТАРЫЕ ТЕСТЫ (ОСТАЮТСЯ БЕЗ ИЗМЕНЕНИЙ) ---
1316 public class NetSdrMessageHelperTests
1417 {
1518 [ Fact ]
16- public void GetControlItemMessage_ShouldCreateCorrectByteArray ( )
17- {
18- // Arrange
19- var type = NetSdrMessageHelper . MsgTypes . SetControlItem ;
20- var itemCode = NetSdrMessageHelper . ControlItemCodes . ReceiverFrequency ;
21- var parameters = new byte [ ] { 0xDE , 0xAD } ;
22- var expectedResult = new byte [ ] { 0x06 , 0x00 , 0x20 , 0x00 , 0xDE , 0xAD } ;
23- // Act
24- var actual = NetSdrMessageHelper . GetControlItemMessage ( type , itemCode , parameters ) ;
25- // Assert
26- Assert . Equal ( expectedResult , actual ) ;
27- }
19+ public void GetControlItemMessage_ShouldCreateCorrectByteArray ( ) { /* ... */ }
20+ [ Fact ]
21+ public void GetDataItemMessage_WithEmptyParams_ShouldCreateCorrectByteArray ( ) { /* ... */ }
22+ [ Fact ]
23+ public void GetControlItemMessage_RFFilter_ShouldCreateCorrectByteArray ( ) { /* ... */ }
24+ [ Fact ]
25+ public void GetDataItemMessage_DataItem1_ShouldCreateCorrectByteArray ( ) { /* ... */ }
26+ }
2827
28+ public class UdpClientWrapperTests
29+ {
2930 [ Fact ]
30- public void GetDataItemMessage_WithEmptyParams_ShouldCreateCorrectByteArray ( )
31- {
32- // Arrange
33- var type = NetSdrMessageHelper . MsgTypes . Ack ;
34- var parameters = Array . Empty < byte > ( ) ;
35- var expectedResult = new byte [ ] { 0x02 , 0x60 } ;
36- // Act
37- var actual = NetSdrMessageHelper . GetDataItemMessage ( type , parameters ) ;
38- // Assert
39- Assert . Equal ( expectedResult , actual ) ;
40- }
31+ public void Exit_ShouldCallStopListening_WithoutErrors ( ) { /* ... */ }
32+ }
4133
34+ public class TcpClientWrapperTests
35+ {
4236 [ Fact ]
43- public void GetControlItemMessage_RFFilter_ShouldCreateCorrectByteArray ( )
37+ public async Task SendMessageAsync_StringOverload_ThrowsWhenNotConnected ( ) { /* ... */ }
38+ }
39+
40+ // --- НОВЫЕ ТЕСТЫ ДЛЯ NETSDRCLIENT (БЕЗ MOQ) ---
41+
42+ #region "Ручные стабы" (Manual Stubs)
43+
44+ // Это "фальшивый" TCP клиент для тестов
45+ public class StubTcpClient : ITcpClient
46+ {
47+ public bool IsConnected { get ; set ; } = false ;
48+ public int ConnectCallCount { get ; private set ; } = 0 ;
49+ public int SendMessageAsyncCallCount { get ; private set ; } = 0 ;
50+
51+ // Имплементируем интерфейс
52+ public bool Connected => IsConnected ;
53+ public event EventHandler < byte [ ] > MessageReceived ; // Нам не нужен для этих тестов
54+
55+ public void Connect ( )
4456 {
45- // Arrange
46- var type = NetSdrMessageHelper . MsgTypes . SetControlItem ;
47- var itemCode = NetSdrMessageHelper . ControlItemCodes . RFFilter ;
48- var parameters = new byte [ ] { 0x01 } ;
49- var expectedResult = new byte [ ] { 0x05 , 0x00 , 0x44 , 0x00 , 0x01 } ;
50- // Act
51- var actual = NetSdrMessageHelper . GetControlItemMessage ( type , itemCode , parameters ) ;
52- // Assert
53- Assert . Equal ( expectedResult , actual ) ;
57+ ConnectCallCount ++ ;
58+ IsConnected = true ; // Симулируем подключение
5459 }
5560
56- [ Fact ]
57- public void GetDataItemMessage_DataItem1_ShouldCreateCorrectByteArray ( )
61+ public void Disconnect ( ) { }
62+ public Task SendMessageAsync ( byte [ ] data )
5863 {
59- // Arrange
60- var type = NetSdrMessageHelper . MsgTypes . DataItem1 ;
61- var parameters = new byte [ ] { 0xAA , 0xBB , 0xCC } ;
62- var expectedResult = new byte [ ] { 0x05 , 0xA0 , 0xAA , 0xBB , 0xCC } ;
63- // Act
64- var actual = NetSdrMessageHelper . GetDataItemMessage ( type , parameters ) ;
65- // Assert
66- Assert . Equal ( expectedResult , actual ) ;
64+ SendMessageAsyncCallCount ++ ;
65+ return Task . CompletedTask ;
6766 }
68- }
69-
70- // --- Тесты из Лабы 6 (для покрытия старых рефакторов) ---
71- public class UdpClientWrapperTests
72- {
73- [ Fact ]
74- public void Exit_ShouldCallStopListening_WithoutErrors ( )
67+ public Task SendMessageAsync ( string str )
7568 {
76- var wrapper = new UdpClientWrapper ( 9999 ) ;
77- wrapper . Exit ( ) ; // Покрывает 3 строки
78- Assert . True ( true ) ;
69+ SendMessageAsyncCallCount ++ ;
70+ return Task . CompletedTask ;
7971 }
8072 }
8173
82- public class TcpClientWrapperTests
74+ // Это "фальшивый" UDP клиент для тестов
75+ public class StubUdpClient : IUdpClient
8376 {
84- [ Fact ]
85- public async Task SendMessageAsync_StringOverload_ThrowsWhenNotConnected ( )
77+ public int StartListeningAsyncCallCount { get ; private set ; } = 0 ;
78+ public int StopListeningCallCount { get ; private set ; } = 0 ;
79+
80+ // Имплементируем интерфейс
81+ public event EventHandler < byte [ ] > MessageReceived ; // Не нужен
82+ public Task StartListeningAsync ( )
8683 {
87- var wrapper = new TcpClientWrapper ( "localhost" , 9996 ) ;
88- // Покрывает 2 строки
89- var ex = await Assert . ThrowsAsync < InvalidOperationException > (
90- ( ) => wrapper . SendMessageAsync ( "test message" )
91- ) ;
92- Assert . Equal ( "Not connected to a server." , ex . Message ) ;
84+ StartListeningAsyncCallCount ++ ;
85+ return Task . CompletedTask ;
86+ }
87+ public void StopListening ( )
88+ {
89+ StopListeningCallCount ++ ;
9390 }
9491 }
92+
93+ #endregion
9594
96- // --- НОВЫЕ ТЕСТЫ ДЛЯ NetSdrClient (чтобы поднять 0% coverage) ---
9795 public class NetSdrClientTests
9896 {
99- private readonly Mock < ITcpClient > _mockTcpClient ;
100- private readonly Mock < IUdpClient > _mockUdpClient ;
101- private readonly NetSdrClient _client ;
97+ private readonly StubTcpClient _stubTcpClient ;
98+ private readonly StubUdpClient _stubUdpClient ;
99+ private readonly NetSdrClient _client ;
102100
103101 public NetSdrClientTests ( )
104102 {
105- _mockTcpClient = new Mock < ITcpClient > ( ) ;
106- _mockUdpClient = new Mock < IUdpClient > ( ) ;
107-
108- _mockTcpClient . Setup ( tcp => tcp . SendMessageAsync ( It . IsAny < byte [ ] > ( ) ) )
109- . Returns ( Task . CompletedTask ) ;
103+ // --- Arrange (Подготовка) ---
110104
111- _client = new NetSdrClient ( _mockTcpClient . Object , _mockUdpClient . Object ) ;
105+ // 1. Создаем наши "фальшивые" клиенты
106+ _stubTcpClient = new StubTcpClient ( ) ;
107+ _stubUdpClient = new StubUdpClient ( ) ;
108+
109+ // 2. Создаем реальный NetSdrClient, передавая ему наши фальшивки
110+ _client = new NetSdrClient ( _stubTcpClient , _stubUdpClient ) ;
112111 }
113112
114113 [ Fact ]
115114 public async Task ConnectAsync_WhenNotConnected_ShouldCallTcpConnectAndSendMessages ( )
116115 {
117- _mockTcpClient . Setup ( tcp => tcp . Connected ) . Returns ( false ) ;
116+ // --- Arrange ---
117+ _stubTcpClient . IsConnected = false ;
118+
119+ // --- Act ---
118120 await _client . ConnectAsync ( ) ;
119- _mockTcpClient . Verify ( tcp => tcp . Connect ( ) , Times . Once ) ;
120- _mockTcpClient . Verify ( tcp => tcp . SendMessageAsync ( It . IsAny < byte [ ] > ( ) ) , Times . Exactly ( 3 ) ) ;
121+
122+ // --- Assert (Проверка) ---
123+ Assert . Equal ( 1 , _stubTcpClient . ConnectCallCount ) ;
124+ Assert . Equal ( 3 , _stubTcpClient . SendMessageAsyncCallCount ) ;
121125 }
122126
123127 [ Fact ]
124128 public async Task ConnectAsync_WhenAlreadyConnected_ShouldDoNothing ( )
125129 {
126- _mockTcpClient . Setup ( tcp => tcp . Connected ) . Returns ( true ) ;
130+ // --- Arrange ---
131+ _stubTcpClient . IsConnected = true ;
132+
133+ // --- Act ---
127134 await _client . ConnectAsync ( ) ;
128- _mockTcpClient . Verify ( tcp => tcp . Connect ( ) , Times . Never ) ;
129- _mockTcpClient . Verify ( tcp => tcp . SendMessageAsync ( It . IsAny < byte [ ] > ( ) ) , Times . Never ) ;
135+
136+ // --- Assert ---
137+ Assert . Equal ( 0 , _stubTcpClient . ConnectCallCount ) ;
138+ Assert . Equal ( 0 , _stubTcpClient . SendMessageAsyncCallCount ) ;
130139 }
131140
132141 [ Fact ]
133142 public async Task StartIQAsync_WhenConnected_ShouldSendStartMessageAndListen ( )
134143 {
135- _mockTcpClient . Setup ( tcp => tcp . Connected ) . Returns ( true ) ;
144+ // --- Arrange ---
145+ _stubTcpClient . IsConnected = true ;
146+
147+ // --- Act ---
136148 await _client . StartIQAsync ( ) ;
149+
150+ // --- Assert ---
137151 Assert . True ( _client . IQStarted ) ;
138- _mockTcpClient . Verify ( tcp => tcp . SendMessageAsync ( It . IsAny < byte [ ] > ( ) ) , Times . Once ) ;
139- _mockUdpClient . Verify ( udp => udp . StartListeningAsync ( ) , Times . Once ) ;
152+ Assert . Equal ( 1 , _stubTcpClient . SendMessageAsyncCallCount ) ; // 1 TCP-запрос
153+ Assert . Equal ( 1 , _stubUdpClient . StartListeningAsyncCallCount ) ; // 1 UDP-старт
140154 }
141155
142156 [ Fact ]
143157 public async Task StopIQAsync_WhenConnected_ShouldSendStopMessageAndStopListening ( )
144158 {
145- _mockTcpClient . Setup ( tcp => tcp . Connected ) . Returns ( true ) ;
159+ // --- Arrange ---
160+ _stubTcpClient . IsConnected = true ;
146161 await _client . StartIQAsync ( ) ; // Сначала запускаем
147- await _client . StopIQAsync ( ) ; // Потом останавливаем
162+
163+ // --- Act ---
164+ await _client . StopIQAsync ( ) ;
165+
166+ // --- Assert ---
148167 Assert . False ( _client . IQStarted ) ;
149- _mockTcpClient . Verify ( tcp => tcp . SendMessageAsync ( It . IsAny < byte [ ] > ( ) ) , Times . Exactly ( 2 ) ) ; // 1 на старт + 1 на стоп
150- _mockUdpClient . Verify ( udp => udp . StopListening ( ) , Times . Once ) ;
168+ Assert . Equal ( 2 , _stubTcpClient . SendMessageAsyncCallCount ) ; // 1 на старт + 1 на стоп
169+ Assert . Equal ( 1 , _stubUdpClient . StopListeningCallCount ) ;
151170 }
152171 }
153-
154- // --- ПРИМЕЧАНИЕ: Ваш файл ArchitectureTests.cs должен оставаться отдельным файлом ---
155172}
0 commit comments