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
                    }
                }
            };

            Debug.WriteLine($"You got Verbrauch data for {Decimal.Round(em.GetCoverage() * 100.0M)}% of the time in between {em.Energieverbrauch.Select(v => v.Startdatum).Min().ToString("yyyy-MM-dd")} and {em.Energieverbrauch.Select(v => v.Enddatum).Max().ToString("yyyy-MM-dd")}");
            // You got Verbrauch data for 45% of the time in between 2020-03-01 and 2020-04-01

            var consumption = em.GetTotalConsumption();

            Debug.WriteLine($"The total consumption is {consumption.Item1}{consumption.Item2}");
            // The total consumption is 579,0KWH

            var consumptionMarch7 = em.GetConsumption(new TimeRange(start: new DateTimeOffset(2020, 3, 7, 0, 0, 0, TimeSpan.Zero).UtcDateTime, end: new DateTimeOffset(2020, 3, 8, 0, 0, 0, TimeSpan.Zero).UtcDateTime));

            Debug.WriteLine($"The total consumption on March 7 is {Decimal.Round(consumptionMarch7.Item1)}{consumptionMarch7.Item2}");
            // The total consumption on March 7 is 65KWH

            // ToDo: show other methods.
        }
        public void TestEnergiemengeObjects()
        {
            foreach (string boFile in Directory.GetFiles("Energiemenge/", "*.json"))
            {
                JObject json;
                using (StreamReader r = new StreamReader(boFile))
                {
                    string jsonString = r.ReadToEnd();
                    json = JsonConvert.DeserializeObject <JObject>(jsonString);
                }
                JObject assertions = (JObject)json["assertions"];
                if (assertions == null)
                {
                    continue;
                }
                //    Assert.IsNotNull(assertions, $"Your test file {boFile} is broken. It has no 'assertions' key on root level.");
                JObject bo = (JObject)json["input"];
                Assert.IsNotNull(bo, $"Your test file {boFile} is broken. It has no 'input' key on root level.");
                Energiemenge em;
                try
                {
                    if (boFile.Contains("wintertime2018.json"))
                    {
                        em = BoMapper.MapObject <Energiemenge>(bo, LenientParsing.DateTime);
                    }
                    else
                    {
                        em = BoMapper.MapObject <Energiemenge>(bo);
                    }
                }
                catch (JsonSerializationException e)
                {
                    Assert.IsTrue(false, $"Your test BO is broken: {e.Message}");
                    return;
                }
                if (json.TryGetValue("fixSapCdsBug", out var fixSapCdsRaw))
                {
                    bool fixit = fixSapCdsRaw.Value <bool>();
                    if (fixit)
                    {
                        em.FixSapCDSBug();
                    }
                }

                foreach (JProperty assertion in assertions.Properties())
                {
                    switch (assertion.Name)
                    {
                    case "totalConsumption":
                        Assert.AreEqual(assertion.Value, em.GetTotalConsumption().Item1);
                        break;

                    case "totalConsumption-2018":
                        Assert.AreEqual(assertion.Value, em.GetConsumption(new TimeRange(new DateTime(2018, 01, 01), new DateTime(2019, 01, 01))).Item1);
                        break;

                    case "load-kW":
                        foreach (JProperty dateAssertion in ((JObject)assertions["load-kW"]).Properties())
                        {
                            if (DateTime.TryParseExact(dateAssertion.Name, "yyyyMMddHHmmss", CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal, out DateTime dt))
                            {
                                Assert.AreEqual(dateAssertion.Value, em.GetLoad(Mengeneinheit.KW, dt.ToUniversalTime()));
                            }
                            else
                            {
                                Assert.IsTrue(false, "Please specify the load dates in the testfiles as yyyyMMddHHmmss");
                            }
                        }
                        break;

                    case "average":
                        try
                        {
                            Assert.AreEqual(Math.Round((decimal)assertion.Value, 12), Math.Round((decimal)em.GetAverage().Item1, 12));
                        }
                        catch (ArgumentException)
                        {
                            Assert.IsTrue(assertion.Value.Type.ToString() == "Null");     // a null value node
                        }
                        break;

                    case "isContinuous":
                        Assert.AreEqual(assertion.Value, em.IsContinuous(), $"{assertion.Name}: {boFile}");
                        break;

                    case "isEvenlySpaced":
                        Assert.AreEqual(assertion.Value, em.IsEvenlySpaced(), $"{assertion.Name}: {boFile}");
                        break;

                    case "isEvenlySpacedWithinDefinition":
                        Assert.AreEqual(assertion.Value, em.IsEvenlySpaced(true), $"{assertion.Name}: {boFile}");
                        break;

                    case "missingTimeRangeCount":
                        Assert.AreEqual(assertion.Value, em.GetMissingTimeRanges().Count, $"{assertion.Name}: {boFile}");
                        break;

                    case "coverage201804":
                        Assert.AreEqual(assertion.Value, Math.Round(em.GetCoverage(GERMAN_APRIL_2018), 4));
                        break;

                    case "coverage201803":
                        Assert.AreEqual(assertion.Value, Math.Round(em.GetCoverage(GERMAN_MARCH_2018), 8));
                        break;

                    case "coverage2018032425":
                        Assert.AreEqual(assertion.Value, Math.Round(em.GetCoverage(march2425), 4));
                        break;

                    case "coverage201804-KWHPROGNOSE1234":
                        Assert.AreEqual(assertion.Value, Math.Round(em.GetCoverage(GERMAN_APRIL_2018, Wertermittlungsverfahren.PROGNOSE, "1-2-3-4", Mengeneinheit.KWH), 4), $"{assertion.Name}: {boFile}");
                        break;

                    case "coverage201804-KWHMESSUNG5678":
                        Assert.AreEqual(assertion.Value, Math.Round(em.GetCoverage(GERMAN_APRIL_2018, Wertermittlungsverfahren.MESSUNG, "5-6-7-8", Mengeneinheit.KWH), 4), $"{assertion.Name}: {boFile}");
                        break;

                    case "jointCoverage":
                        Assert.AreEqual(assertion.Value, Math.Round(em.GetJointCoverage(GERMAN_APRIL_2018), 4), $"{assertion.Name}: {boFile}");
                        break;

                    case "isPure":
                        Assert.AreEqual <bool>((bool)assertion.Value, em.IsPure(), boFile);
                        if (!(bool)assertion.Value)
                        {
                            var pureEms = em.SplitInPureGroups();
                            var emptyEm = em.DeepClone();
                            emptyEm.Energieverbrauch = null;
                            Assert.AreEqual(em.Energieverbrauch.Count, pureEms.Select(x => x.Energieverbrauch.Count).Sum());
                            foreach (var pureEm in pureEms)
                            {
                                Assert.IsTrue(pureEm.IsPure());
                                var emptyPureEm = pureEm.DeepClone();
                                emptyPureEm.Energieverbrauch = null;
                                Assert.AreEqual(emptyEm, emptyPureEm);
                            }
                        }
                        break;

                    case "isPureUserProperties":
                        Assert.AreEqual <bool>((bool)assertion.Value, em.IsPure(true), boFile);
                        break;

                    default:
                        Assert.IsTrue(false, $"Unknown assertion type {assertion.Name} in {boFile}");
                        break;
                    }
                }


                // test normalising for all Energiemenge objects
                if (em.IsPure() && em.IsExtensive() && em.GetTotalConsumption().Item1 != 0.0M)
                {
                    decimal      targetValue  = 1000.0M;
                    Energiemenge emNormalised = em.Normalise(targetValue);
                    Assert.AreEqual(Math.Round(targetValue, 12), Math.Round(emNormalised.GetTotalConsumption().Item1, 12));
                }

                if (em.IsIntensive()) // test this once for one object. that's enough
                {
                    Assert.ThrowsException <ArgumentException>(() => em.GetTotalConsumption(), "It must not be allowed to add up intensive units.");
                }
            }
        }