using MeterVault.Core.Analysis; using MeterVault.Core.Analysis.Coverage; namespace MeterVault.Core.Tests.Analysis; /// /// Provenance is its own dimension (D-14): which qualities a bucket's amount rests on, whatever its status. /// public sealed class ProvenanceRulesTests { [Fact] public void Each_quality_with_an_amount_sets_its_own_flag() { Assert.Equal(Provenance.Measured, ProvenanceRules.ProvenanceOf(1, 0, 0, 0, false, false)); Assert.Equal(Provenance.Manual, ProvenanceRules.ProvenanceOf(0, 2, 0, 0, false, false)); Assert.Equal(Provenance.Imported, ProvenanceRules.ProvenanceOf(0, 0, 3, 0, false, false)); Assert.Equal(Provenance.Estimated, ProvenanceRules.ProvenanceOf(0, 0, 0, 4, false, false)); } [Fact] public void A_bucket_mixing_imported_months_and_divided_shares_is_both_imported_and_estimated() { var provenance = ProvenanceRules.ProvenanceOf(0, 0, 14, 2.5, false, false); Assert.Equal(Provenance.Imported | Provenance.Estimated, provenance); } [Fact] public void A_negative_amount_is_still_a_contribution_because_savings_and_balances_are_signed() { Assert.Equal(Provenance.Measured, ProvenanceRules.ProvenanceOf(-5, 0, 0, 0, false, false)); } [Fact] public void Float_noise_left_by_dividing_and_resumming_does_not_count_as_a_contribution() { Assert.Equal(Provenance.Manual, ProvenanceRules.ProvenanceOf(1e-12, 7, -1e-10, 0, false, false)); } [Fact] public void Opening_balance_and_derived_are_flags_of_their_own() { Assert.Equal( Provenance.Measured | Provenance.OpeningBalance | Provenance.Derived, ProvenanceRules.ProvenanceOf(3, 0, 0, 0, openingBalance: true, derived: true)); } [Fact] public void A_true_zero_has_no_provenance() { Assert.Equal(Provenance.None, ProvenanceRules.ProvenanceOf(0, 0, 0, 0, false, false)); } [Fact] public void A_derived_value_keeps_everything_its_sources_rest_on() { var derived = ProvenanceRules.Derive([Provenance.Measured, Provenance.Imported | Provenance.Estimated]); Assert.Equal(Provenance.Derived | Provenance.Measured | Provenance.Imported | Provenance.Estimated, derived); Assert.Equal(Provenance.Derived, ProvenanceRules.Derive([])); } }