public void TestCompletenessReportGenerationSomeCustomer()
        {
            var files = Directory.GetFiles("Energiemenge/completeness", "somecustomer*.json");

            Assert.AreEqual(5, files.Count()); // this is just to make sure the files haven't moved
            foreach (string boFile in files)
            {
                JObject json;
                using (StreamReader r = new StreamReader(boFile))
                {
                    string jsonString = r.ReadToEnd();
                    json = JsonConvert.DeserializeObject <JObject>(jsonString);
                }
                Energiemenge       em = (Energiemenge)BoMapper.MapObject((JObject)json["input"], LenientParsing.Strict);
                CompletenessReport cr;
                if (boFile.EndsWith("somecustomer1.json"))
                {
                    cr = em.GetCompletenessReport();
                    Assert.AreEqual((decimal)0.9601, Math.Round(cr.Coverage.Value, 4));
                    Assert.AreEqual("4-5-6-7", cr.Obiskennzahl);
                    Assert.AreEqual(Wertermittlungsverfahren.MESSUNG, cr.wertermittlungsverfahren);
                    Assert.AreEqual(Mengeneinheit.KWH, cr.Einheit);
                    Assert.AreEqual("DEXXX", cr.LokationsId);
                    //Assert.AreEqual(15, cr.values[0].wert);
                    //Assert.AreEqual(TestEnergiemengeExtension.GERMAN_APRIL_2018.Start, cr.values[0].startdatum);
                    string resultString = JsonConvert.SerializeObject(cr, new StringEnumConverter());

                    Assert.IsNotNull(cr.Gaps);
                    Assert.AreEqual(1, cr.Gaps.Count);
                    Assert.AreEqual(new DateTime(2018, 4, 1, 1, 45, 0, DateTimeKind.Utc), cr.Gaps.First().Startdatum);
                    Assert.AreEqual(new DateTime(2018, 4, 2, 6, 30, 0, DateTimeKind.Utc), cr.Gaps.First().Enddatum);
                }
                else if (boFile.EndsWith("somecustomer2.json"))
                {
                    foreach (var combi in em.GetWevObisMeCombinations())
                    {
                        cr = em.GetCompletenessReport(TestEnergiemengeExtension.GERMAN_APRIL_2018, combi.Item1, combi.Item2, combi.Item3);
                        string             resultString = JsonConvert.SerializeObject(cr, new StringEnumConverter());
                        CompletenessReport cr2          = em.GetCompletenessReport(new CompletenessReport.CompletenessReportConfiguration
                        {
                            Einheit = combi.Item3,
                            Obis    = combi.Item2,
                            Wertermittlungsverfahren = combi.Item1,
                            ReferenceTimeFrame       = new BO4E.COM.Zeitraum
                            {
                                Startdatum = TestEnergiemengeExtension.GERMAN_APRIL_2018.Start,
                                Enddatum   = TestEnergiemengeExtension.GERMAN_APRIL_2018.End
                            }
                        });
                        //Assert.AreEqual(cr, cr2, "calling report with configuration instead of loose parameters doesn't work.");
                    }
                }
                else if (boFile.EndsWith("somecustomer3.json"))
                {
                }
                else if (boFile.EndsWith("somecustomer4.json"))
                {
                }
            }
        }
        public void TestNullableCoverage()
        {
            Energiemenge em1 = new Energiemenge()
            {
                LokationsId      = "DE123456789DieseEmhatkeineVerbräuche",
                LokationsTyp     = Lokationstyp.MeLo,
                Energieverbrauch = new List <Verbrauch>() //empty list
            };
            CompletenessReport cr1 = em1.GetCompletenessReport();

            Assert.IsNotNull(cr1);
            Assert.IsNull(cr1.Coverage);
            JsonConvert.SerializeObject(cr1); // must _not_ throw exception

            Energiemenge em2 = new Energiemenge()
            {
                LokationsId      = "54321012345DieseEmhatkeineVerbräuche",
                LokationsTyp     = Lokationstyp.MeLo,
                Energieverbrauch = new List <Verbrauch>() //empty list
            };
            CompletenessReport cr2 = em2.GetCompletenessReport(CHRISTMAS_2018, Wertermittlungsverfahren.MESSUNG, "1-2-3-4", Mengeneinheit.KUBIKMETER);

            Assert.IsNotNull(cr2);
            Assert.IsNotNull(cr2.Coverage);   // not null because no values but configuration given
            Assert.AreEqual(0.0M, cr2.Coverage);
            JsonConvert.SerializeObject(cr2); // must _not_ throw exception

            CompletenessReport cr3 = em2.GetCompletenessReport(CHRISTMAS_2018);

            Assert.IsNotNull(cr3);
            Assert.IsNotNull(cr3.Coverage);
            Assert.AreEqual(0.0M, cr3.Coverage);
            JsonConvert.SerializeObject(cr3); // must _not_ throw exception
        }
        public void TestCompletenessReportGenerationSmard()
        {
            MiniProfiler profiler             = MiniProfiler.StartNew(nameof(TestCompletenessReportGenerationSmard));
            IList <CompletenessReport> crlist = new List <CompletenessReport>();

            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 = (Energiemenge)BoMapper.MapObject(json, LenientParsing.Strict);
                    CompletenessReport cr = em.GetCompletenessReport();
                    crlist.Add(cr);
                    if (boFile.Contains("onshore.json"))
                    {
                        Assert.IsNotNull(cr.UserProperties);
                        Assert.AreEqual <string>("yippi yippi yeah", cr.UserProperties["meineUp0"].Value <string>());
                        Assert.AreEqual <string>("krawall und remmidemmi", cr.UserProperties["meineUp1"].Value <string>());
                    }
                }
            }
            string resultString = JsonConvert.SerializeObject(crlist, new StringEnumConverter());

            profiler.Stop();
            System.Diagnostics.Debug.WriteLine($"Profiler results: {profiler.RenderPlainText()}");
        }
        public void TestFirstLastGap()
        {
            Energiemenge em = new Energiemenge()
            {
                LokationsId      = "DE123455",
                LokationsTyp     = Lokationstyp.MeLo,
                Energieverbrauch = new List <Verbrauch>()
                {
                    new Verbrauch()
                    {
                        Obiskennzahl             = "1234",
                        Wert                     = 123.456M,
                        Wertermittlungsverfahren = Wertermittlungsverfahren.MESSUNG,
                        Startdatum               = new DateTime(2019, 1, 1, 0, 0, 0, DateTimeKind.Utc),
                        Enddatum                 = new DateTime(2019, 1, 4, 0, 0, 0, DateTimeKind.Utc),
                    },
                    new Verbrauch()
                    {
                        Obiskennzahl             = "1234",
                        Wert                     = 123.456M,
                        Wertermittlungsverfahren = Wertermittlungsverfahren.MESSUNG,
                        Startdatum               = new DateTime(2019, 1, 4, 0, 0, 0, DateTimeKind.Utc),
                        Enddatum                 = new DateTime(2019, 1, 7, 0, 0, 0, DateTimeKind.Utc),
                    }
                }
            };

            var cr = em.GetCompletenessReport(new TimeRange(new DateTime(2018, 12, 29, 0, 0, 0, DateTimeKind.Utc), new DateTime(2019, 1, 10, 0, 0, 0, DateTimeKind.Utc)));

            Assert.AreEqual(2, cr.Gaps.Count());
            Assert.AreEqual(new DateTime(2018, 12, 29, 0, 0, 0, DateTimeKind.Utc), cr.Gaps.First().Startdatum);
            Assert.AreEqual(new DateTime(2019, 1, 1, 0, 0, 0, DateTimeKind.Utc), cr.Gaps.First().Enddatum);
            Assert.AreEqual(new DateTime(2019, 1, 7, 0, 0, 0, DateTimeKind.Utc), cr.Gaps.Last().Startdatum);
            Assert.AreEqual(new DateTime(2019, 1, 10, 0, 0, 0, DateTimeKind.Utc), cr.Gaps.Last().Enddatum);
        }
        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 ShowCaseTest()
        {
            var em = new Energiemenge()
            {
                LokationsId      = "DE0123456789012345678901234567890",
                LokationsTyp     = Lokationstyp.MeLo,
                Energieverbrauch = new List <Verbrauch>()
                {
                    new Verbrauch()
                    {
                        Einheit    = Mengeneinheit.KWH,
                        Startdatum = new DateTime(2020, 3, 1, 0, 0, 0, DateTimeKind.Utc),
                        Enddatum   = new DateTime(2020, 3, 8, 0, 0, 0, DateTimeKind.Utc),
                        Wert       = 456.0M,
                        Wertermittlungsverfahren = Wertermittlungsverfahren.MESSUNG
                    },
                    new Verbrauch()
                    {
                        Einheit    = Mengeneinheit.KWH,
                        Startdatum = new DateTime(2020, 3, 25, 0, 0, 0, DateTimeKind.Utc),
                        Enddatum   = new DateTime(2020, 4, 1, 0, 0, 0, DateTimeKind.Utc),
                        Wert       = 123.0M,
                        Wertermittlungsverfahren = Wertermittlungsverfahren.MESSUNG
                    }
                }
            };

            var cr = em.GetCompletenessReport();

            Debug.WriteLine($"{nameof(em)} has a coverage of {Decimal.Round(cr.Coverage.Value * 100.0M)}%.");
            // em has a coverage of 45%.

            Debug.WriteLine($"{nameof(em)} has no values for the following intervals: {string.Join(", ", cr.Gaps.Select(g => g.Startdatum.ToString("yyyy-MM-dd") + " to " + g.Enddatum.ToString("yyyy-MM-dd")))}");
            // em has no values for the following intervals: 2020-03-08 to 2020-03-25
        }