static void Main(string[] args) { var teaMaker = new TeaMaker(); var teaShop = new TeaShop(teaMaker); teaShop.TakeOrder("less sugar", 1); teaShop.TakeOrder("more milk", 2); teaShop.TakeOrder("without sugar", 5); teaShop.Serve(); Console.ReadLine(); }
public TeaShop(TeaMaker teaMaker) { mTeaMaker = teaMaker ?? throw new ArgumentNullException("teaMaker", "teaMaker cannot be null"); }
public async Task TestE2E() { var gateway = new Gateway(DefaultGatewayConfiguration); await gateway.Start(); await Task.Delay(500); //2 clients var clients = Enumerable.Range(0, 2) .Select(_ => { var client = new Client(DefaultClientConfiguration); client.Start().Wait(); return(client); }) .ToList(); //2*worker by service var workers = Enumerable.Range(0, 2) .SelectMany(_ => { IWorker makeTea = new TeaMaker(DefaultWorkerConfiguration); IWorker brewBeer = new BeerBrewer(DefaultWorkerConfiguration); makeTea.Start().Wait(); brewBeer.Start().Wait(); return(new IWorker[] { makeTea, brewBeer }); }) .ToList(); var gatewayHeartbeats = clients.Select(client => client.IsConnected) .Concat(workers.Select(worker => worker.IsConnected)); var isGatewayUp = false; var isGatewayUpObservable = Observable.Merge(gatewayHeartbeats) .Subscribe(heartbeat => { isGatewayUp = heartbeat; }); //ensure all heartbeats are fired... await Task.Delay(2000); Assert.IsTrue(isGatewayUp); var teaWorks = clients.SelectMany(client => Enumerable.Range(0, 3).Select(async _ => await client.Send <MakeTea, MakeTeaResult>(new MakeTea()) )).ToList(); var bearWorks = clients.SelectMany(client => Enumerable.Range(0, 3).Select(async _ => await client.Send <BrewBeer, BrewBeerResult>(new BrewBeer()) )).ToList(); var teaResults = await Task.WhenAll(teaWorks); var beerResults = await Task.WhenAll(bearWorks); Assert.IsTrue(teaResults.All(work => null != work)); Assert.IsTrue(beerResults.All(work => null != work)); //all workers should have get at least a job Assert.AreEqual(2, teaResults.Select(result => result.WorkerId).Distinct().Count()); Assert.AreEqual(2, beerResults.Select(result => result.WorkerId).Distinct().Count()); Assert.IsTrue(isGatewayUp); await gateway.Stop(); //ensure all heartbeats are fired... await Task.Delay(2500); Assert.IsFalse(isGatewayUp); gateway = new Gateway(DefaultGatewayConfiguration); await gateway.Start(); //ensure all heartbeats are fired... await Task.Delay(2500); Assert.IsTrue(isGatewayUp); //all commands should be handled Assert.DoesNotThrowAsync(async() => { var works = clients.SelectMany(client => Enumerable.Range(0, 3) .Select(async _ => await client.Send <MakeTea, MakeTeaResult>(new MakeTea()))).ToList(); var results = await Task.WhenAll(works); }); var stop = new[] { gateway.Stop() }.Concat(workers.Select(worker => worker.Stop())).Concat(clients.Select(client => client.Stop())); await Task.WhenAll(stop); }