@@ -188,5 +188,86 @@ public void ConvertArgThrowsForInvalidType()
188188 MonitorEvent monitorEvent = new MonitorEvent ( SocketEvents . All , addr : "" , arg : socket ! ) ;
189189 Assert . Throws < ArgumentException > ( ( ) => monitorEvent . ConvertArg < int > ( ) ) ;
190190 }
191+
192+ [ Fact ]
193+ public void INetMQMonitorCanBeMocked ( )
194+ {
195+ // This test demonstrates that INetMQMonitor can be mocked for testing
196+ var mockMonitor = new MockNetMQMonitor ( ) ;
197+
198+ // Verify the mock implements the interface
199+ INetMQMonitor monitor = mockMonitor ;
200+
201+ Assert . NotNull ( monitor ) ;
202+ Assert . Equal ( "mock://endpoint" , monitor . Endpoint ) ;
203+ Assert . False ( monitor . IsRunning ) ;
204+
205+ // Verify we can subscribe to events
206+ var eventReceived = false ;
207+ monitor . EventReceived += ( s , e ) => { eventReceived = true ; } ;
208+
209+ // Trigger the event
210+ mockMonitor . RaiseEventReceived ( ) ;
211+
212+ Assert . True ( eventReceived ) ;
213+ }
214+
215+ // Simple mock implementation to demonstrate INetMQMonitor is mockable
216+ private class MockNetMQMonitor : INetMQMonitor
217+ {
218+ public string Endpoint => "mock://endpoint" ;
219+ public bool IsRunning { get ; private set ; }
220+ public TimeSpan Timeout { get ; set ; }
221+
222+ public event EventHandler < NetMQMonitorEventArgs > ? EventReceived ;
223+ #pragma warning disable CS0067 // Event is never used - these are part of the interface contract
224+ public event EventHandler < NetMQMonitorSocketEventArgs > ? Connected ;
225+ public event EventHandler < NetMQMonitorErrorEventArgs > ? ConnectDelayed ;
226+ public event EventHandler < NetMQMonitorIntervalEventArgs > ? ConnectRetried ;
227+ public event EventHandler < NetMQMonitorSocketEventArgs > ? Listening ;
228+ public event EventHandler < NetMQMonitorErrorEventArgs > ? BindFailed ;
229+ public event EventHandler < NetMQMonitorSocketEventArgs > ? Accepted ;
230+ public event EventHandler < NetMQMonitorErrorEventArgs > ? AcceptFailed ;
231+ public event EventHandler < NetMQMonitorSocketEventArgs > ? Closed ;
232+ public event EventHandler < NetMQMonitorErrorEventArgs > ? CloseFailed ;
233+ public event EventHandler < NetMQMonitorSocketEventArgs > ? Disconnected ;
234+ #pragma warning restore CS0067
235+
236+ public void AttachToPoller < T > ( T poller ) where T : INetMQPoller
237+ {
238+ IsRunning = true ;
239+ }
240+
241+ public void DetachFromPoller ( )
242+ {
243+ IsRunning = false ;
244+ }
245+
246+ public void Start ( )
247+ {
248+ IsRunning = true ;
249+ }
250+
251+ public Task StartAsync ( )
252+ {
253+ IsRunning = true ;
254+ return Task . CompletedTask ;
255+ }
256+
257+ public void Stop ( )
258+ {
259+ IsRunning = false ;
260+ }
261+
262+ public void Dispose ( )
263+ {
264+ IsRunning = false ;
265+ }
266+
267+ public void RaiseEventReceived ( )
268+ {
269+ EventReceived ? . Invoke ( this , new NetMQMonitorSocketEventArgs ( null ! , "test" , null ! , SocketEvents . Connected ) ) ;
270+ }
271+ }
191272 }
192273}
0 commit comments