public void TestRounding()
        {
            string  boFile = Directory.GetFiles("Energiemenge/completeness", "gas_januar_2018.json").First();
            JObject json;

            using (StreamReader r = new StreamReader(boFile))
            {
                string jsonString = r.ReadToEnd();
                json = JsonConvert.DeserializeObject <JObject>(jsonString);
            }
            Energiemenge       em = (Energiemenge)BoMapper.MapObject(JObject.FromObject(json["input"]), LenientParsing.Strict);
            CompletenessReport cr = em.GetCompletenessReport(new TimeRange()
            {
                Start = new DateTime(2017, 12, 31, 23, 0, 0, 0, DateTimeKind.Utc),
                End   = new DateTime(2018, 1, 31, 23, 0, 0, 0, DateTimeKind.Utc)
            });

            Assert.AreEqual(1.0M, cr.Coverage.Value);
            Assert.AreEqual(0, cr.Gaps.Count());

            var dailies = em.GetDailyCompletenessReports(new TimeRange()
            {
                Start = new DateTime(2017, 12, 31, 23, 0, 0, 0, DateTimeKind.Utc),
                End   = new DateTime(2018, 1, 2, 23, 0, 0, 0, DateTimeKind.Utc)
            });

            foreach (var crDaily in dailies)
            {
                Assert.AreEqual(1.0M, crDaily.Value.Coverage.Value, $"error in slice {crDaily.Key}");
            }
            Assert.AreEqual(1.0M, cr.Coverage.Value);
        }
 public void TestDailyCompleteness()
 {
     foreach (string boFile in Directory.GetFiles("Energiemenge/completeness/", "50hz_prognose*.json"))
     {
         using (MiniProfiler.Current.Step($"Processing file {boFile}"))
         {
             JObject json;
             using (StreamReader r = new StreamReader(boFile))
             {
                 string jsonString = r.ReadToEnd();
                 json = JsonConvert.DeserializeObject <JObject>(jsonString);
             }
             Energiemenge em     = BoMapper.MapObject <Energiemenge>(json, LenientParsing.Strict);
             var          result = em.GetDailyCompletenessReports(CHRISTMAS_2018);
             Assert.AreEqual(8, result.Count);
             break; // one test is enough. the rest is covered by the individual completeness report tests.
         }
     }
 }
        public void TestDailyParallization()
        {
            //Energiemenge em ;
            //using (StreamReader r = new StreamReader(Directory.GetFiles("BusinessObjectExtensions/Energiemenge/completeness", "threeyears.json").First()))
            //{
            //    string jsonString = r.ReadToEnd();
            //    em = JsonConvert.DeserializeObject<Energiemenge>(jsonString);
            //}
            Energiemenge     em       = new Energiemenge();
            DateTime         dateTime = DateTime.Parse("2015-01-31 22:45:00");
            List <Verbrauch> listvb   = new List <Verbrauch>();

            for (int u = 0; u < 1500; u++)
            {
                dateTime = dateTime.AddMinutes(15);
                DateTime endDateTime = dateTime.AddMinutes(15);

                listvb.Add(new Verbrauch()
                {
                    Startdatum = dateTime, Enddatum = endDateTime, Einheit = Mengeneinheit.JAHR, Wert = 12
                });
                dateTime = endDateTime;
            }
            em.Energieverbrauch = listvb;

            MiniProfiler mpLinear = MiniProfiler.StartNew("Non-Parallel");

            em.GetMonthlyCompletenessReports(new TimeRange(new DateTime(2015, 1, 1, 23, 00, 0, DateTimeKind.Utc), new DateTime(2019, 12, 31, 23, 0, 0, DateTimeKind.Utc)), useParallelExecution: false);
            mpLinear.Stop();
            Console.Out.Write(mpLinear.RenderPlainText());
            //Assert.IsTrue(mpLinear.DurationMilliseconds < 4000, $"Linear completeness report generation was too slow. Expected less than 4 seconds but was {mpLinear.DurationMilliseconds}ms: {mpLinear.RenderPlainText()}");

            MiniProfiler mpParallel = MiniProfiler.StartNew("Parallel");

            em.GetDailyCompletenessReports(new TimeRange(new DateTime(2015, 1, 01, 23, 0, 0, DateTimeKind.Utc), new DateTime(2019, 12, 31, 23, 0, 0, DateTimeKind.Utc)), useParallelExecution: true);
            mpParallel.Stop();
            Console.Out.Write(mpParallel.RenderPlainText());
            //Assert.IsTrue(mpParallel.DurationMilliseconds < 3000, $"Parallel completeness report generation was too slow. Expected less than 3 seconds but was {mpParallel.DurationMilliseconds}ms: {mpParallel.RenderPlainText()}");
            //Assert.IsTrue(mpParallel.DurationMilliseconds < (int)mpLinear.DurationMilliseconds * 1.25M, $"Parallel: {mpParallel.DurationMilliseconds}, Non-Parallel: {mpLinear.DurationMilliseconds}");
        }
        public void TestDailyCompletenessDST()
        {
            var localStart = TimeZoneInfo.ConvertTimeFromUtc(new DateTime(2018, 3, 24, 23, 0, 0, DateTimeKind.Utc), Verbrauch.CENTRAL_EUROPE_STANDARD_TIME); //, DateTimeKind.Unspecified);
            var localEnd   = TimeZoneInfo.ConvertTimeFromUtc(new DateTime(2018, 3, 26, 22, 0, 0, DateTimeKind.Utc), Verbrauch.CENTRAL_EUROPE_STANDARD_TIME); //, DateTimeKind.Unspecified);

            if (TimeZoneInfo.Local != Verbrauch.CENTRAL_EUROPE_STANDARD_TIME)
            {
                localStart = DateTime.SpecifyKind(TimeZoneInfo.ConvertTime(localStart, TimeZoneInfo.Local, Verbrauch.CENTRAL_EUROPE_STANDARD_TIME), DateTimeKind.Unspecified);
                localEnd   = DateTime.SpecifyKind(TimeZoneInfo.ConvertTime(localEnd, TimeZoneInfo.Local, Verbrauch.CENTRAL_EUROPE_STANDARD_TIME), DateTimeKind.Unspecified);
            }
            else
            {
                localStart = DateTime.SpecifyKind(localStart, DateTimeKind.Unspecified);
                localEnd   = DateTime.SpecifyKind(localEnd, DateTimeKind.Unspecified);
            }
            var utcStart = new DateTime(2018, 3, 24, 23, 0, 0, DateTimeKind.Utc);
            var utcEnd   = new DateTime(2018, 3, 26, 22, 0, 0, DateTimeKind.Utc);

            if (TimeZoneInfo.Local.SupportsDaylightSavingTime && Verbrauch.CENTRAL_EUROPE_STANDARD_TIME == TimeZoneInfo.Local)
            {
                Assert.IsFalse(Verbrauch.CENTRAL_EUROPE_STANDARD_TIME.IsDaylightSavingTime(localStart));
                Assert.IsTrue(Verbrauch.CENTRAL_EUROPE_STANDARD_TIME.IsDaylightSavingTime(localEnd));
            }

            var verbrauchSlices = new List <TimeRange>()
            {
                new TimeRange()
                {
                    Start = utcStart,
                    End   = utcStart.AddHours(1)
                }
            };

            while (verbrauchSlices.Last().End < utcEnd)
            {
                verbrauchSlices.Add(new TimeRange()
                {
                    Start = verbrauchSlices.Last().Start.AddHours(1),
                    End   = verbrauchSlices.Last().End.AddHours(1),
                });
            }
            Assert.AreEqual(2 * 24 - 1, verbrauchSlices.Count);
            Energiemenge em = new Energiemenge()
            {
                LokationsId      = "MeinUnitTest123",
                LokationsTyp     = Lokationstyp.MeLo,
                Energieverbrauch = verbrauchSlices.Select(vs => new BO4E.COM.Verbrauch()
                {
                    Startdatum = vs.Start,
                    Enddatum   = vs.End,
                    Einheit    = Mengeneinheit.KWH,
                    Wert       = (decimal)123.456,
                    Wertermittlungsverfahren = Wertermittlungsverfahren.MESSUNG
                }
                                                          ).ToList()
            };
            var result = em.GetDailyCompletenessReports(new TimeRange(utcStart, utcEnd));

            Assert.AreEqual(2, result.Count);
            Assert.AreEqual(new DateTime(2018, 3, 24, 23, 0, 0, DateTimeKind.Utc), result.First().Value.ReferenceTimeFrame.Startdatum);
            Assert.AreEqual(new DateTime(2018, 3, 25, 22, 0, 0, DateTimeKind.Utc), result.First().Value.ReferenceTimeFrame.Enddatum);
            Assert.AreEqual(new DateTime(2018, 3, 25, 22, 0, 0, DateTimeKind.Utc), result.Last().Value.ReferenceTimeFrame.Startdatum);
            Assert.AreEqual(new DateTime(2018, 3, 26, 22, 0, 0, DateTimeKind.Utc), result.Last().Value.ReferenceTimeFrame.Enddatum);
        }