public void The_view_is_updated_when_the_timer_fires_and_no_data_is_downloaded()
        {
            // Given
            const string uRL = @"http://hello.world/boo";

            CreateMockFactory();
            var target = new TeamCityMetricsPresenter(CreateConfiguration(uRL: uRL));

            _mockDownload.Setup(m => m.DownloadMetrics(uRL))
            .Returns("");

            TeamCityMetricsEventArgs actualArguments = null;
            var wait = new System.Threading.AutoResetEvent(false);

            target.MetricsUpdated += (s, e) =>
            {
                actualArguments = e;
                wait.Set();
            };

            // When
            _mockTimer.Raise(m => m.Tick += null, _mockTimer.Object, EventArgs.Empty);

            // Then
            Assert.IsTrue(wait.WaitOne(5000), "No event raised when the timer fired");

            Assert.AreEqual(0, actualArguments.Series.Count);

            _mockDownload.VerifyAll();
            _mockTimer.VerifyAll();
        }
        public void The_view_is_updated_when_the_timer_fires_and_a_single_data_series_is_downloaded()
        {
            // Given
            const string uRL = @"http://hello.world/boo";

            CreateMockFactory();
            var target = new TeamCityMetricsPresenter(CreateConfiguration(uRL: uRL));

            _mockDownload.Setup(m => m.DownloadMetrics(uRL))
            .Returns(SingleMetricResult);

            TeamCityMetricsEventArgs actualArguments = null;
            var wait = new System.Threading.AutoResetEvent(false);

            target.MetricsUpdated += (s, e) => {
                actualArguments = e;
                wait.Set();
            };

            // When
            _mockTimer.Raise(m => m.Tick += null, _mockTimer.Object, EventArgs.Empty);

            // Then
            Assert.IsTrue(wait.WaitOne(5000), "No event raised when the timer fired");

            Assert.AreEqual(1, actualArguments.Series.Count);
            var series = actualArguments.Series[0];

            Assert.AreEqual("OpenCppCoverage", series.Name);
            Assert.AreEqual(7, series.Points.Count);

            Assert.AreEqual(new DateTime(2015, 11, 12, 9, 59, 0), series.Points[0].X);
            Assert.AreEqual(82.352941, series.Points[0].Y, 0.00001);

            Assert.AreEqual(new DateTime(2015, 11, 12, 10, 2, 0), series.Points[1].X);
            Assert.AreEqual(82.352941, series.Points[1].Y, 0.00001);

            Assert.AreEqual(new DateTime(2015, 11, 12, 10, 11, 0), series.Points[3].X);
            Assert.AreEqual(51.851852, series.Points[3].Y, 0.00001);

            _mockDownload.VerifyAll();
            _mockTimer.VerifyAll();
        }
        public void The_view_is_updated_when_the_timer_fires_and_multiple_data_series_are_downloaded_from_multiple_urls()
        {
            // Given
            const string uRL  = @"http://hello.world/boo";
            const string uRL2 = @"http://hello.world/hoo";

            CreateMockFactory();
            var target = new TeamCityMetricsPresenter(CreateConfiguration(uRL: uRL, uRL2: uRL2));

            _mockDownload.Setup(m => m.DownloadMetrics(uRL))
            .Returns(MultiMetricResult);

            _mockDownload.Setup(m => m.DownloadMetrics(uRL2))
            .Returns(MultiMetricResult2);

            TeamCityMetricsEventArgs actualArguments = null;
            var wait = new System.Threading.AutoResetEvent(false);

            target.MetricsUpdated += (s, e) =>
            {
                actualArguments = e;
                wait.Set();
            };

            // When
            _mockTimer.Raise(m => m.Tick += null, _mockTimer.Object, EventArgs.Empty);

            // Then
            Assert.IsTrue(wait.WaitOne(5000), "No event raised when the timer fired");

            Assert.AreEqual(7, actualArguments.Series.Count);

            // Check the Average_Complexity series
            var series = actualArguments.Series.First(s => s.Name == "Average_Complexity");

            Assert.AreEqual(6, series.Points.Count);

            // Check the Maximum_Complexity series
            series = actualArguments.Series.First(s => s.Name == "Maximum_Complexity");
            Assert.AreEqual(6, series.Points.Count);

            // Check the Average_Block_Depth series
            series = actualArguments.Series.First(s => s.Name == "Average_Block_Depth");
            Assert.AreEqual(6, series.Points.Count);

            // Check the Maximum_Block_Depth series
            series = actualArguments.Series.First(s => s.Name == "Maximum_Block_Depth");
            Assert.AreEqual(6, series.Points.Count);

            // Check the Line series
            series = actualArguments.Series.First(s => s.Name == "Line");
            Assert.AreEqual(4, series.Points.Count);

            // Check the Method series
            series = actualArguments.Series.First(s => s.Name == "Method");
            Assert.AreEqual(4, series.Points.Count);

            // Check the Class series
            series = actualArguments.Series.First(s => s.Name == "Class");
            Assert.AreEqual(4, series.Points.Count);

            _mockDownload.VerifyAll();
            _mockTimer.VerifyAll();
        }