using MeterVault.Core.Analysis; using MeterVault.Core.Analysis.Virtual; using static MeterVault.Core.Tests.Analysis.VirtualFixtures; namespace MeterVault.Core.Tests; /// /// The electricity derived columns are data-driven virtual expressions, not hardcoded formulas /// (SDD §2.2, §7.4): Netz Einsparung = Haus − Netz, Anlage Eigenverbrauch = Erzeugung − Einsparung. Ported from /// the removed VirtualNormalizer to the evaluator that runs on read (D-29), over month buckets. /// public sealed class VirtualMeterTests { private const int Haus = 1; private const int Netz = 2; private const int Solar = 50; private const int NetzEinsparung = 100; private const int Eigenverbrauch = 101; [Fact] public void Netz_einsparung_is_haus_minus_netz() { var haus = Source(Haus, Monthly((2022, 10, 411), (2022, 11, 742))); // Haus Verbrauch var netz = Source(Netz, Monthly((2022, 10, 416), (2022, 11, 832))); // Netz Verbrauch var result = VirtualEvaluator.Evaluate( NetzEinsparung, Formula.Parse("m1 - m2"), QuantityKind.Consumption, Months(2022, 10, 2), [haus, netz]); Assert.Equal([-5d, -90d], result.Values.Select(v => v.Value!.Value)); } [Fact] public void Eigenverbrauch_is_erzeugung_minus_einsparung() { var october = Months(2022, 10, 1); var einsparung = VirtualEvaluator.Evaluate( NetzEinsparung, Formula.Parse("m1 - m2"), QuantityKind.Consumption, october, [Source(Haus, Monthly((2022, 10, 411))), Source(Netz, Monthly((2022, 10, 416)))]); var solar = Source(Solar, Monthly((2022, 10, 76))); // Solar Erzeugung var result = VirtualEvaluator.Evaluate( Eigenverbrauch, Formula.Parse("m50 - m100"), QuantityKind.Net, october, [solar, VirtualSource.FromEvaluation(einsparung)]); // 76 − (−5) = 81 (Anlage Eigenverbrauch Okt 2022), through the nested Netz Einsparung meter. Assert.Equal([81d], result.Values.Select(v => v.Value!.Value)); } }