public void Setup()
        {
            DateTime now = DateTime.Now;
            Mock <IAltitudeClient> altitudeClientMock = new Mock <IAltitudeClient>();
            Mock <ILogger>         logger             = new Mock <ILogger>();

            algo = new FreezingAlgorithme(altitudeClientMock.Object, logger.Object);
        }
        public static async Task Run([TimerTrigger("0 0 18 * * *")] TimerInfo myTimer, TraceWriter log)
        {
            log.Info($"C# Timer trigger function executed at: {DateTime.Now}");
            DependencyInjection.ConfigureInjection(log);

            using (var scope = DependencyInjection.Container.BeginLifetimeScope())
            {
                FreezingAlgorithme  algorithme          = scope.Resolve <FreezingAlgorithme>();
                DeviceService       deviceService       = scope.Resolve <DeviceService>();
                NotificationService notificationService = scope.Resolve <NotificationService>();
                FreezeService       freezeService       = scope.Resolve <FreezeService>();
                AlarmService        alarmService        = scope.Resolve <AlarmService>();

                OpenWeatherMapClient weatherClient = scope.Resolve <OpenWeatherMapClient>();

                IList <Alarm> alarms = new List <Alarm>();

                try
                {
                    log.Info("Get latest telemtry");
                    Dictionary <Device, Telemetry> telemetries = deviceService.GetLatestTelemetryByDevice();
                    foreach (var item in telemetries)
                    {
                        OwmCurrentWeather current = await weatherClient.GetCurrentWeather(item.Key.Position.Latitude, item.Key.Position.Longitude);

                        OwmForecastWeather forecast = await weatherClient.GetForecastWeather(item.Key.Position.Latitude, item.Key.Position.Longitude);

                        log.Info($"Execute Algorithme (device {item.Key.Id})");
                        FreezeForecast freeze = await algorithme.Execute(item.Value, item.Key, current.Weather, forecast.Forecast, forecast.StationPosition);

                        if (freeze == null)
                        {
                            log.Error($"Unable to calculate the freeze probability (no forecast)");
                            continue;
                        }
                        // TODO : complete process
                        Dictionary <DateTime, FreezingProbability> averageFreezePrediction12h = freezeService.CalculAverageFreezePrediction12h(freeze.FreezingProbabilityList);
                        log.Info($"Create alarms");
                        alarmService.CreateFreezeAlarm(item.Key.Id, item.Key.SiteId, averageFreezePrediction12h);
                        log.Info($"Insert Freeze in Db");
                        freezeService.CreateFreezeAndThawByDevice(item.Key.Id, averageFreezePrediction12h);
                    }

                    notificationService.SendNotifications(alarms);
                    log.Info($"Notifications sent at: {DateTime.Now}");
                }
                catch (AlgorithmeException)
                {
                    throw;
                }
                catch (Exception e)
                {
                    log.Error(e.Message, e);
                    throw;
                }
            }
        }
        public void ExecuteAlgorithmeWithForecast_ElevationOverHundredTest()
        {
            //initialize
            DeviceTest device = new DeviceTest {
                Temperature = 6.0, Humidity = 80
            };

            Mock <IStationPosition> stationDeviceMock = new Mock <IStationPosition>();

            stationDeviceMock.Setup(e => e.Altitude).Returns(1000);
            IStationPosition stationDevice = stationDeviceMock.Object;

            WeatherTest freezingToday = new WeatherTest {
                Temperature = 7.0, Humidity = 80, Date = now
            };
            IList <IWeather> forecastList = new List <IWeather> {
                freezingToday
            };

            WeatherTest tomorrow = new WeatherTest {
                Temperature = 5.5, Humidity = 90, Date = now.AddDays(1)
            };

            forecastList.Add(tomorrow);

            WeatherTest afterTomorrow = new WeatherTest {
                Temperature = -1.0, Humidity = 90, Date = now.AddDays(2)
            };

            forecastList.Add(afterTomorrow);

            Mock <IStationPosition> stationMock = new Mock <IStationPosition>();
            IStationPosition        station     = stationMock.Object;

            Mock <IAltitudeClient> altitudeClient = new Mock <IAltitudeClient>();

            altitudeClient.Setup(o => o.GetAltitude(It.IsAny <double>(), It.IsAny <double>())).ReturnsAsync(new GmeElevation
            {
                Altitude = 0
            });
            Mock <ILogger> logger     = new Mock <ILogger>();
            var            freezeAlgo = new FreezingAlgorithme(altitudeClient.Object, logger.Object);

            //execute
            FreezeForecast freeze = freezeAlgo.Execute(device, stationDevice, freezingToday, forecastList, station).Result;

            Check.That(freeze.FreezingStart.HasValue).IsEqualTo(true);
            Check.That(freeze.FreezingEnd.HasValue).IsEqualTo(true);

            Check.That(stationDevice.Altitude).IsStrictlyGreaterThan(100);

            Check.That(freeze.FreezingProbabilityList.Count).IsEqualTo(forecastList.Count());
            Check.That(freeze.FreezingProbabilityList.GetValueOrDefault(now)).IsEqualTo(FreezeForecast.FreezingProbability.ZERO);
            Check.That(freeze.FreezingProbabilityList.GetValueOrDefault(now.AddDays(1))).IsEqualTo(FreezeForecast.FreezingProbability.HIGH);
            Check.That(freeze.FreezingProbabilityList.GetValueOrDefault(now.AddDays(2))).IsEqualTo(FreezeForecast.FreezingProbability.IMMINENT);
        }
        public static async Task Run([EventHubTrigger("device-data", Connection = "EventHubConnectionString")] string myEventHubMessage, TraceWriter log)
        {
            log.Info($"C# Event Hub trigger function processed a message: {myEventHubMessage}");
            DependencyInjection.ConfigureInjection(log);
            IEnumerable <Telemetry> telemetries = null;

            try
            {
                telemetries = FrameParser.Parse(myEventHubMessage);
                if (!telemetries.Any())
                {
                    return;
                }
            }
            catch (FormatException e)
            {
                log.Error($"Error on parsing frame", e);
                return;
            }

            try
            {
                using (var scope = DependencyInjection.Container.BeginLifetimeScope())
                {
                    DeviceService      deviceService    = scope.Resolve <DeviceService>();
                    AlarmService       alarmService     = scope.Resolve <AlarmService>();
                    TelemetryService   telemetryService = scope.Resolve <TelemetryService>();
                    FreezingAlgorithme algorithme       = scope.Resolve <FreezingAlgorithme>();

                    telemetryService.InsertTelemetries(telemetries);
                    string siteId = deviceService.GetSiteId(telemetries.First().DeviceId);
                    log.Info($"Telemetries inserted");

                    Task <FreezeForecast> forecast = algorithme.Execute(telemetries.Last());
                    log.Info($"FreezeForecast executed");

                    log.Info($"Create humidity alarm ...");
                    alarmService.CreateHumidityAlarm(telemetries.Last(), siteId);
                    log.Info($"Create temperature alarm ...");
                    alarmService.CreateTemperatureAlarm(telemetries.Last(), siteId);
                    log.Info($"Create battery alarm ...");
                    alarmService.CreateBatteryAlarm(telemetries.Last(), siteId);

                    FreezeForecast freeze = await forecast;
                    if (freeze.FreezingStart.HasValue && Freeze(freeze.FreezingProbabilityList.FirstOrDefault().Value))
                    {
                        log.Info($"Create freeze alarm (if not already active)...");
                        alarmService.CreateFreezingAlarm(telemetries.Last(), siteId, freeze.FreezingProbabilityList.FirstOrDefault().Value);
                    }
                    else if (!Freeze(freeze.FreezingProbabilityList.FirstOrDefault().Value))
                    {
                        log.Info($"Set latest freeze alarm as inactive ...");
                        alarmService.SetFreezeAlarmAsInactive(telemetries.Last().DeviceId);
                    }

                    log.Info($"Remove CommunicationFail alarm ...");
                    alarmService.CheckForActiveCommunicationFailureAlarms(telemetries.First().DeviceId);

                    log.Info($"Update last communication date ...");
                    deviceService.UpdateLastCommunication(telemetries.Last().DeviceId, DateTime.UtcNow);
                }
            }
            catch (Exception e)
            {
                log.Error($"Error on processing telemetries", e);
                throw;
            }
        }
        public void ExecuteAlgorithmeWithForecast_ElevationUnderHundredTest()
        {
            //initialize
            DeviceTest device = new DeviceTest {
                Temperature = 6.0, Humidity = 80
            };

            Mock <IStationPosition> stationDeviceMock = new Mock <IStationPosition>();

            stationDeviceMock.Setup(e => e.Altitude).Returns(10);
            IStationPosition stationDevice = stationDeviceMock.Object;


            WeatherTest freezingToday = new WeatherTest {
                Temperature = -6.0, Humidity = 80, Date = now
            };
            //Mock<IWeather> freezingTodayMock = new Mock<IWeather>();

            //freezingTodayMock.Setup(e => e.Temperature).Returns(20);
            //freezingTodayMock.Setup(e => e.Humidity).Returns(80);
            //freezingTodayMock.Setup(e => e.Date).Returns(now);
            //IWeather freezingToday = freezingTodayMock.Object;
            IEnumerable <IWeather> forecastList = new List <IWeather> {
                freezingToday
            };

            //Mock<IWeather> tomorrowMock = new Mock<IWeather>();
            //tomorrowMock.Setup(e => e.Temperature).Returns(-6);
            //tomorrowMock.Setup(e => e.Humidity).Returns(80);
            //tomorrowMock.Setup(e => e.Date).Returns(now.AddDays(1));
            //IWeather tomorrow = tomorrowMock.Object;
            WeatherTest tomorrow = new WeatherTest {
                Temperature = 12.0, Humidity = 80, Date = now.AddDays(1)
            };

            (forecastList as List <IWeather>).Add(tomorrow);

            //Mock<IWeather> afterTomorrowMock = new Mock<IWeather>();
            //afterTomorrowMock.Setup(e => e.Temperature).Returns(-13.0);
            //afterTomorrowMock.Setup(e => e.Humidity).Returns(50.0);
            //afterTomorrowMock.Setup(e => e.Date).Returns(now.AddDays(2));
            //IWeather afterTomorrow = afterTomorrowMock.Object;
            WeatherTest afterTomorrow = new WeatherTest {
                Temperature = -13.0, Humidity = 50, Date = now.AddDays(2)
            };

            (forecastList as List <IWeather>).Add(afterTomorrow);

            //Mock<IWeather> afterMock = new Mock<IWeather>();
            //afterMock.Setup(e => e.Temperature).Returns(-42);
            //afterMock.Setup(e => e.Humidity).Returns(90);
            //afterMock.Setup(e => e.Date).Returns(now.AddDays(3));
            //IWeather after = afterMock.Object;
            WeatherTest after = new WeatherTest {
                Temperature = -42, Humidity = 90, Date = now.AddDays(3)
            };

            (forecastList as List <IWeather>).Add(after);

            //Mock<IWeather> endFreezeingDayMock = new Mock<IWeather>();
            //endFreezeingDayMock.Setup(e => e.Temperature).Returns(-11.0);
            //endFreezeingDayMock.Setup(e => e.Humidity).Returns(1.0);
            //endFreezeingDayMock.Setup(e => e.Date).Returns(now.AddDays(4));
            //IWeather endFreezeingDay = endFreezeingDayMock.Object;
            WeatherTest endFreezeingDay = new WeatherTest {
                Temperature = -11.0, Humidity = 1.0, Date = now.AddDays(4)
            };

            (forecastList as List <IWeather>).Add(endFreezeingDay);

            //Mock<IWeather> endFreezeingMock = new Mock<IWeather>();
            //endFreezeingMock.Setup(e => e.Temperature).Returns(-20);
            //endFreezeingMock.Setup(e => e.Humidity).Returns(85);
            //endFreezeingMock.Setup(e => e.Date).Returns(now.AddDays(5));
            //IWeather endFreezeing = endFreezeingMock.Object;
            WeatherTest endFreezeing = new WeatherTest {
                Temperature = -20, Humidity = 85, Date = now.AddDays(5)
            };

            (forecastList as List <IWeather>).Add(endFreezeing);

            Mock <IStationPosition> stationMock = new Mock <IStationPosition>();
            IStationPosition        station     = stationMock.Object;

            Mock <IAltitudeClient> altitudeClient = new Mock <IAltitudeClient>();

            altitudeClient.Setup(o => o.GetAltitude(It.IsAny <double>(), It.IsAny <double>())).ReturnsAsync(new GmeElevation
            {
                Altitude = 0
            });
            Mock <ILogger> logger     = new Mock <ILogger>();
            var            freezeAlgo = new FreezingAlgorithme(altitudeClient.Object, logger.Object);

            //execute
            FreezeForecast freeze = freezeAlgo.Execute(device, stationDevice, freezingToday, forecastList, station).Result;

            //test
            Check.That(freeze.FreezingStart.HasValue).IsEqualTo(true);
            Check.That(altitudeClient.Object.GetAltitude(0, 0).Result.Altitude - stationDevice.Altitude).IsStrictlyLessThan(Math.Abs(100));
            Console.WriteLine((forecastList as List <IWeather>).Count);
            Check.That(freeze.FreezingProbabilityList.Count).IsEqualTo((forecastList as List <IWeather>).Count);
            Check.That(freeze.FreezingProbabilityList.GetValueOrDefault(now)).IsEqualTo(FreezeForecast.FreezingProbability.HIGH);
            Check.That(freeze.FreezingProbabilityList.GetValueOrDefault(now.AddDays(1))).IsEqualTo(FreezeForecast.FreezingProbability.ZERO);
            Check.That(freeze.FreezingProbabilityList.GetValueOrDefault(now.AddDays(2))).IsEqualTo(FreezeForecast.FreezingProbability.MEDIUM);
            Check.That(freeze.FreezingProbabilityList.GetValueOrDefault(now.AddDays(3))).IsEqualTo(FreezeForecast.FreezingProbability.IMMINENT);
            Check.That(freeze.FreezingProbabilityList.GetValueOrDefault(now.AddDays(4))).IsEqualTo(FreezeForecast.FreezingProbability.MEDIUM);
            Check.That(freeze.FreezingProbabilityList.GetValueOrDefault(now.AddDays(5))).IsEqualTo(FreezeForecast.FreezingProbability.IMMINENT);
            Check.That(freeze.FreezingEnd.HasValue).IsEqualTo(true);
        }