コード例 #1
0
        public void Start_ScraperUsedToRetrieveAllStockNames_VisitsEachStockIndexPage()
        {
            var @lock        = new Object();
            var stockLetters = new List <string>("a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,0-9".Split(','));

            this._scraper
            .Setup(x => x.Scrape(It.IsRegex(@"(?i)^.*?share_map.php\?letter=.*?$")))
            .Returns <string>((url) =>
            {
                lock (@lock)
                {
                    if (stockLetters.Count > 0)
                    {
                        var stockLetter = Regex.Match(url, @"(?i)^.*?share_map.php\?letter=(.*?)$").Groups[1].Value;

                        CollectionAssert.Contains(stockLetters, stockLetter);
                        stockLetters.Remove(stockLetter);
                    }
                }

                return(new ScrapeInfo
                {
                    FinalUrl = url,
                    Success = true,
                    Content = string.Empty
                });
            });

            var receiver = new LiveCharts_co_uk_PriceReceiver(this._scraper.Object, this._stockMarket.Object, 30);

            receiver.Start((stock) => { });

            var stopWatch = new Stopwatch();

            stopWatch.Start();
            while (stockLetters.Any() && (stopWatch.Elapsed < TimeSpan.FromSeconds(60)))
            {
                Thread.Sleep(100);
            }

            receiver.Stop();

            Assert.IsFalse(stockLetters.Any());
        }
コード例 #2
0
        public void Start_StopIsCalledAfterManyIterations_RunsPerpetually()
        {
            var @lock         = new Object();
            var stockLetters  = new List <string>();
            var rerunDetected = false;

            this._scraper
            .Setup(x => x.Scrape(It.IsRegex(@"(?i)^.*?share_map.php\?letter=.*?$")))
            .Returns <string>((url) =>
            {
                lock (@lock)
                {
                    var stockLetter = Regex.Match(url, @"(?i)^.*?share_map.php\?letter=(.*?)$").Groups[1].Value;

                    rerunDetected = rerunDetected || stockLetters.Contains(stockLetter);
                    stockLetters.Add(stockLetter);
                }

                return(new ScrapeInfo
                {
                    FinalUrl = url,
                    Success = true,
                    Content = string.Empty
                });
            });

            var receiver = new LiveCharts_co_uk_PriceReceiver(this._scraper.Object, this._stockMarket.Object, 30);

            receiver.Start((stock) => { });

            var stopWatch = new Stopwatch();

            stopWatch.Start();
            while (!rerunDetected && (stopWatch.Elapsed < TimeSpan.FromSeconds(60)))
            {
                Thread.Sleep(100);
            }

            receiver.Stop();

            Assert.IsTrue(rerunDetected);
        }
コード例 #3
0
        public void Start_WithFilter_CallsFilterForEachStockOnAListPage()
        {
            var @lock             = new Object();
            var completedStockKey = "";

            var filterCalls = new Dictionary <string, int>();

            var filter = new Mock <IPipelineFilter>();

            filter
            .Setup(x => x.Evaluate(It.IsAny <Stock>()))
            .Returns <Stock>((stock) =>
            {
                var key = GetStockKey(stock.Identifier);
                if (!filterCalls.ContainsKey(key))
                {
                    filterCalls.Add(key, 0);
                }

                filterCalls[key]++;

                return(true);
            });

            var receiver = new LiveCharts_co_uk_PriceReceiver(this._scraper.Object, this._stockMarket.Object, filter.Object, 30);

            var stockPricesGathered = new List <StockPrice>();

            // The fact that the receiver has been given a stock price means that all of the stocks
            // on the associated list page must have been catalogued at this point and therefore the
            // stock filter must have been applied to all of them.
            receiver.Start((stockPrice) =>
            {
                lock (@lock)
                {
                    if (string.IsNullOrEmpty(completedStockKey))
                    {
                        receiver.Stop();
                        completedStockKey = stockPrice.Value.Stock.Identifier.Substring(0, 1).ToLower();
                    }
                }
            });

            // Wait for something to happen
            var stopWatch = new Stopwatch();

            stopWatch.Start();
            while (string.IsNullOrEmpty(completedStockKey) && (stopWatch.Elapsed < TimeSpan.FromSeconds(120)))
            {
                Thread.Sleep(1000);
            }

            receiver.Stop();

            Assert.IsNotNullOrEmpty(completedStockKey);

            var listPage       = GetStockListPage(completedStockKey);
            var numberOfStocks = Regex.Matches(listPage, "(?ismx)<span\\sclass\\s?=\\s?[\\\"\\']lookup-one[\\\"\\']").Count;

            Assert.AreEqual(numberOfStocks, filterCalls[GetStockKey(completedStockKey)]);
        }