예제 #1
0
        public void Factory_should_create_pool_unit()
        {
            var factory  = new UnitOfExecutionsFactory();
            var poolExec = factory.GetPool();

            Check.That(poolExec).IsNotNull();
        }
예제 #2
0
        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");
        }
예제 #3
0
        /// <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();
        }
예제 #4
0
        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");
        }