using MeterVault.Core.Domain; namespace MeterVault.Core.Tests; /// /// The event menu on a meter page is driven by these rules, so they pin which events each mode can /// actually use — an event the normalizer ignores must never be offered as if it fixed something. /// public sealed class MeterEventRulesTests { [Theory] [InlineData(MeterMode.CumulativeCounter)] [InlineData(MeterMode.GenerationCounter)] [InlineData(MeterMode.RuntimeCounter)] public void Registers_offer_swap_and_reset(MeterMode mode) { Assert.Equal([MeterEventType.MeterSwap, MeterEventType.CounterReset, MeterEventType.Note], MeterEventRules.RecordableFor(mode)); Assert.True(MeterEventRules.IsMonotonic(mode)); Assert.True(MeterEventRules.TakesReadings(mode)); } [Fact] public void A_tank_offers_level_and_delivery_and_takes_no_readings() { Assert.Equal([MeterEventType.TankLevel, MeterEventType.Delivery, MeterEventType.Note], MeterEventRules.RecordableFor(MeterMode.ConsumableBalance)); Assert.False(MeterEventRules.TakesReadings(MeterMode.ConsumableBalance)); Assert.False(MeterEventRules.CanRecord(MeterMode.ConsumableBalance, MeterEventType.MeterSwap)); } [Theory] [InlineData(MeterMode.DirectDelta)] [InlineData(MeterMode.InstantRate)] [InlineData(MeterMode.Virtual)] public void Modes_without_a_register_only_take_notes(MeterMode mode) => Assert.Equal([MeterEventType.Note], MeterEventRules.RecordableFor(mode)); [Fact] public void Correction_is_never_offered_because_nothing_reads_it() { foreach (var mode in Enum.GetValues()) { Assert.DoesNotContain(MeterEventType.Correction, MeterEventRules.RecordableFor(mode)); } } }