public void Factory_should_create_pool_unit() { var factory = new UnitOfExecutionsFactory(); var poolExec = factory.GetPool(); Check.That(poolExec).IsNotNull(); }
public void Should_publish_price_once_started_and_when_MarketData_is_available() { // Mock and dependencies setup var unitOfExecutionsFactory = new UnitOfExecutionsFactory(); var marketDataProvider = new MarketDataProvider(); var pastaPricer = new PastaPricerEngine(unitOfExecutionsFactory.GetPool(), new[] { "gnocchi(eggs-potatoes-flour)" }, marketDataProvider, this); this.ClearDico(); Check.That(this.lastPrices).IsEmpty(); pastaPricer.Start(); Check.That(this.lastPrices).IsEmpty(); // Turns on market data (note: make the pasta pricer start its dependencies instead?) marketDataProvider.Start(); // A sleep?!? There should be a better way ;-) Thread.Sleep(1000); // It has publish a price now! Check.That(this.lastPrices.Keys).Contains("gnocchi"); }
/// <summary> /// Defines the entry point of the application. /// </summary> /// <param name="args">The arguments.</param> public static void Main() { ThreadPool.SetMinThreads(Environment.ProcessorCount * 2, 0); Console.WriteLine("Welcome to the pasta pricer (powered by the Michonne library)."); Console.WriteLine("Conflation Y/N?"); var option = Console.ReadLine(); bool conflationEnabled = false; if (option.ToUpper().StartsWith("Y")) { conflationEnabled = true; Console.WriteLine("Conflation enabled!\n"); } else { Console.WriteLine("NO Conflation\n"); } Console.WriteLine(" Type 'Enter' to start market data inputs."); Console.WriteLine(" Then type 'Enter' again, to stop market data inputs."); Console.ReadLine(); Console.ForegroundColor = ConsoleColor.DarkGray; var publisher = new ConsolePastaPricerPublisher(); var marketDataProvider = new AggresiveMarketDataProvider(aggressionFactor: 10, timerPeriodInMsec: 1); var unitOfExecutionsFactory = new UnitOfExecutionsFactory(); ThreadPool.SetMaxThreads(Environment.ProcessorCount * 2, 0); ThreadPool.SetMinThreads(Environment.ProcessorCount * 2, 0); var pastaPricer = new PastaPricerEngine(unitOfExecutionsFactory.GetPool(), RecipeHelper.GenerateConfigurations(), marketDataProvider, publisher, conflationEnabled); pastaPricer.Start(); // Turns on market data marketDataProvider.Start(); Console.ReadLine(); Console.WriteLine("----------------\nMarket data is stopping.\n----------------\n"); marketDataProvider.Stop(); publisher.CountPublish(); Console.WriteLine(Environment.NewLine); Console.WriteLine("----------------\nMarket data stopped. Wait a while, and type 'Enter' to exit.\n----------------\n"); Console.ReadLine(); Console.WriteLine("{0} late prices have been published since we stopped the market data.", publisher.PublicationCounter); Console.WriteLine("Type Enter to exit the program."); Console.ReadLine(); }
public void Should_publish_price_for_every_registered_pasta() { this.ClearDico(); // Mock and dependencies setup var marketDataProvider = new MarketDataProvider(); var pastasConfiguration = new[] { "gnocchi(eggs-potatoes-flour)", "spaghetti(eggs-flour)", "organic spaghetti(organic eggs-flour)", "spinach farfalle(eggs-flour-spinach)", "tagliatelle(eggs-flour)", }; var unitOfExecutionsFactory = new UnitOfExecutionsFactory(); var pastaPricer = new PastaPricerEngine(unitOfExecutionsFactory.GetPool(), pastasConfiguration, marketDataProvider, this); pastaPricer.Start(); // Turns on market data (note: make the pasta pricer start its dependencies instead?) marketDataProvider.Start(); // A sleep?!? There should be a better way ;-) Stopwatch timer = new Stopwatch(); timer.Start(); while (timer.ElapsedMilliseconds < 20000) { lock (this.lastPrices) { if (pastasConfiguration.Length == this.lastPrices.Count) { // all price received break; } Monitor.Wait(this.lastPrices, 100); } } Check.That(this.lastPrices.Keys).Contains("gnocchi"); Check.That(this.lastPrices.Keys).Contains("spaghetti"); Check.That(this.lastPrices.Keys).Contains("organic spaghetti"); Check.That(this.lastPrices.Keys).Contains("spinach farfalle"); Check.That(this.lastPrices.Keys).Contains("tagliatelle"); }