public void ReturnFalseIfPassedForecastIsNull()
        {
            var relativeDay       = RelativeDay.NextDay;
            var timeSpan          = new TimeSpan(21, 30, 0);
            var referenceDateTime = new DateTime(2019, 07, 29, 18, 30, 34);

            var SpecificationUnderTest = new OpenWeatherTimeSpecification(relativeDay, timeSpan, referenceDateTime);

            Assert.False(SpecificationUnderTest.IsSatisfiedBy(null));
        }
        public void InitializeComparisonDateTimeWithNonDefaultValue()
        {
            RelativeDay relativeDay       = RelativeDay.NextDay;
            TimeSpan    timeSpan          = new TimeSpan(8, 30, 0);
            DateTime    referenceDateTime = new DateTime(2019, 08, 31, 18, 30, 34);

            var SpecificationUnderTest = new OpenWeatherTimeSpecification(relativeDay, timeSpan, referenceDateTime);

            Assert.NotEqual(new DateTime(), SpecificationUnderTest.ComparisonDateTime);
        }
        public void ReturnTrueIfTimeDifferenceMatchesLimitPositive()
        {
            var relativeDay       = RelativeDay.NextDay;
            var timeSpan          = new TimeSpan(22, 30, 0);
            var referenceDateTime = new DateTime(2019, 07, 29, 18, 30, 34);
            var testForecast      = GetTestForecast();

            var SpecificationUnderTest = new OpenWeatherTimeSpecification(relativeDay, timeSpan, referenceDateTime);

            Assert.True(SpecificationUnderTest.IsSatisfiedBy(testForecast));
        }
        public void ReturnFalseIfTimeDifferenceIsOutOfRange()
        {
            var relativeDay       = RelativeDay.NextDay;
            var timeSpan          = new TimeSpan(19, 30, 0);
            var referenceDateTime = new DateTime(2019, 07, 28, 18, 30, 34);
            var testForecast      = GetTestForecast();

            var SpecificationUnderTest = new OpenWeatherTimeSpecification(relativeDay, timeSpan, referenceDateTime);

            Assert.False(SpecificationUnderTest.IsSatisfiedBy(testForecast));
        }
        public void CreateComparisonDateTimeWithExpectedValues()
        {
            RelativeDay relativeDay                = RelativeDay.NextDay;
            TimeSpan    timeSpan                   = new TimeSpan(8, 30, 0);
            DateTime    referenceDateTime          = new DateTime(2019, 08, 31, 18, 30, 34);
            DateTime    expectedComparisonDateTime = new DateTime(2019, 9, 1, 8, 30, 0);

            var SpecificationUnderTest = new OpenWeatherTimeSpecification(relativeDay, timeSpan, referenceDateTime);

            Assert.Equal(expectedComparisonDateTime, SpecificationUnderTest.ComparisonDateTime);
        }
        public void UseTimeZoneInfoFromTimeProviderDuringComparison()
        {
            // Azerbaijan Standard Time UTC+4
            var relativeDay         = RelativeDay.NextDay;
            var timeSpan            = new TimeSpan(1, 0, 0); // will be interpreted as time already shifted to timezone
            var referenceDateTime   = new DateTime(2019, 07, 30, 18, 30, 34);
            var desiredTimeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById("Azerbaijan Standard Time");

            var testForecast = GetTestForecast();

            TimeZoneProvider.TimeZone = desiredTimeZoneInfo;
            var SpecificationUnderTest = new OpenWeatherTimeSpecification(relativeDay, timeSpan, referenceDateTime);

            Assert.True(SpecificationUnderTest.IsSatisfiedBy(testForecast));
        }