/// <summary>
        /// Finds the 2 most profitable days to trade on by comparing the highest and lowest stock prices for the month.
        /// </summary>
        /// <param name="monthlyStocks"></param>
        /// <returns>The two best trading days to buy and sell on.</returns>
        public static MostProfitableStocks FindMostProfitableStocks(List <Stock> monthlyStocks)
        {
            double largestStockPriceDifference = 0;

            MostProfitableStocks mostProfitableMonthlyStocks = null;

            foreach (Stock stockToBuy in monthlyStocks)
            {
                foreach (Stock stockToSell in monthlyStocks.Where(x => x.Day > stockToBuy.Day))
                {
                    double stockPriceDifference = stockToSell.Price - stockToBuy.Price;

                    if (mostProfitableMonthlyStocks == null || stockPriceDifference >= largestStockPriceDifference)
                    {
                        largestStockPriceDifference = stockPriceDifference;

                        mostProfitableMonthlyStocks = new MostProfitableStocks {
                            StockToBuy = stockToBuy, StockToSell = stockToSell
                        };
                    }
                }
            }

            return(mostProfitableMonthlyStocks);
        }
        /// <summary>
        /// Outputs the 2 most profitable stocks of the month to buy and sell to the user
        /// </summary>
        /// <param name="mostProfitableStocks"></param>
        public static void OutputStocks(MostProfitableStocks mostProfitableStocks)
        {
            Console.WriteLine($"{mostProfitableStocks.StockToBuy.Day}({mostProfitableStocks.StockToBuy.Price}), {mostProfitableStocks.StockToSell.Day}({mostProfitableStocks.StockToSell.Price})");

            Console.WriteLine("Press any key to exit...");
            Console.ReadLine();
        }
        public void FindBestDaysToTradeOn_NoStocks()
        {
            // Arrange
            List <Stock> stocks = new List <Stock>();

            // Act
            MostProfitableStocks mostProfitableStocks = ProfitableStockFinder.FindMostProfitableStocks(stocks);

            // Assert
            mostProfitableStocks.Should().BeNull();
        }
        /// <summary>
        /// Main
        /// </summary>
        /// <param name="args">The arguments.</param>
        public static void Main(string[] args)
        {
            string[] stockPricesInput = File.ReadAllText(@"L:\StockPriceInputFiles\ChallengeSampleDataSet1.txt").Split(',');

            List <Stock> monthlyStocks = StockBuilder.BuildStocks(stockPricesInput);

            MostProfitableStocks mostProfitableMonthlystocks = ProfitableStockFinder.FindMostProfitableStocks(monthlyStocks);

            if (mostProfitableMonthlystocks != null)
            {
                OutputMostProfitableStocks.OutputStocks(mostProfitableMonthlystocks);
            }
            else
            {
                Console.WriteLine("No stock prices found in file. Please ensure the input file contains comma seperated decimals only.");
                Console.WriteLine("Press any key to exit...");
                Console.ReadLine();
            }
        }
        public void FindBestDaysToTradeOn_NoDifferenceInMonthlystockPrice()
        {
            // Arrange
            List <Stock> stocks = new List <Stock>
            {
                new Stock
                {
                    Day   = 1,
                    Price = 1.00
                },
                new Stock
                {
                    Day   = 2,
                    Price = 1.00
                },
                new Stock
                {
                    Day   = 3,
                    Price = 1.00
                },
                new Stock
                {
                    Day   = 4,
                    Price = 1.00
                },
                new Stock
                {
                    Day   = 5,
                    Price = 1.00
                },
            };

            // Act
            MostProfitableStocks mostProfitableStocks = ProfitableStockFinder.FindMostProfitableStocks(stocks);

            // Assert
            mostProfitableStocks.StockToBuy.Day.Should().Be(stocks[3].Day);
            mostProfitableStocks.StockToSell.Day.Should().Be(stocks[4].Day);
        }
        public void FindBestDaysToTradeOn_Valid()
        {
            // Arrange
            List <Stock> stocks = new List <Stock>
            {
                new Stock
                {
                    Day   = 1,
                    Price = 1.00
                },
                new Stock
                {
                    Day   = 2,
                    Price = 2.00
                }
            };

            // Act
            MostProfitableStocks mostProfitableStocks = ProfitableStockFinder.FindMostProfitableStocks(stocks);

            // Assert
            mostProfitableStocks.StockToBuy.Should().BeEquivalentTo(stocks.First());
            mostProfitableStocks.StockToSell.Should().BeEquivalentTo(stocks.Last());
        }