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."); } } }