public ServerClientTests()
        {
            tcpClient = A.Fake <ITcpClient>();
            stream    = A.Fake <INetworkStream>();
            reader    = A.Fake <IMessageStreamReader>();
            sender    = A.Fake <IMessagesSender>();
            config    = A.Fake <ICsConfiguration>();
            mediator  = A.Fake <IMediator>();

            A.CallTo(() => config.Address).Returns(IPAddress.Loopback);
            A.CallTo(() => config.Port).Returns(1234);
            A.CallTo(() => tcpClient.GetStream()).Returns(stream);
            A.CallTo(() => reader.MayHaveMessages).ReturnsLazily(() => messagesRead = !messagesRead);
            A.CallTo(() => reader.ReadAvailable()).ReturnsLazily(() => A.CollectionOfFake <IMessage>(1).ToArray());

            Func <ITcpClient> clientFactory = () =>
            {
                tcpClientCreated = true;
                return(tcpClient);
            };
            Func <INetworkStream, IMessageStreamReader> readerFactory = s =>
            {
                if (s == stream)
                {
                    readerCreated = true;
                    return(reader);
                }
                throw new InvalidOperationException();
            };

            serverClient = new ServerClient(config, sender, mediator, clientFactory, readerFactory);
        }
 public ServerClient(ICsConfiguration config, IMessagesSender sender, IMediator mediator,
                     Func <ITcpClient> tcpClientFactory, Func <INetworkStream, IMessageStreamReader> readerFactory)
 {
     this.config           = config;
     this.sender           = sender;
     this.mediator         = mediator;
     this.tcpClientFactory = _ => tcpClientFactory();
     this.readerFactory    = readerFactory;
 }
 public ServerClient(ICsConfiguration config, IMessagesSender sender, IMediator mediator,
                     Func <IPEndPoint, ITcpClient> tcpClientFactory, Func <INetworkStream, IMessageStreamReader> readerFactory,
                     IPEndPoint endPoint)
 {
     this.config           = config;
     this.sender           = sender;
     this.mediator         = mediator;
     this.tcpClientFactory = tcpClientFactory;
     this.readerFactory    = readerFactory;
     this.endPoint         = endPoint;
 }