using ZB.MOM.WW.ScadaBridge.CentralUI.Components.Shared; namespace ZB.MOM.WW.ScadaBridge.CentralUI.Tests.Shared; /// /// Coverage for , the number+unit codec behind the /// script form's "Min time between runs" field. /// public class DurationInputTests { // ── Split: TimeSpan -> (value, unit) ─────────────────────────────────── /// Verifies that splitting a null duration returns a blank value with the seconds unit. [Fact] public void Split_Null_ReturnsBlankWithSecondsUnit() { var (value, unit) = DurationInput.Split(null); Assert.Null(value); Assert.Equal("sec", unit); } /// Verifies that splitting a zero duration returns a blank value. [Fact] public void Split_Zero_ReturnsBlank() { var (value, _) = DurationInput.Split(TimeSpan.Zero); Assert.Null(value); } /// Verifies that a whole number of minutes splits into the minute unit. [Fact] public void Split_WholeMinutes_UsesMinuteUnit() { var (value, unit) = DurationInput.Split(TimeSpan.FromMinutes(5)); Assert.Equal("5", value); Assert.Equal("min", unit); } /// Verifies that a whole number of seconds splits into the second unit. [Fact] public void Split_WholeSeconds_UsesSecondUnit() { var (value, unit) = DurationInput.Split(TimeSpan.FromSeconds(30)); Assert.Equal("30", value); Assert.Equal("sec", unit); } /// Verifies that a sub-second duration splits into the millisecond unit. [Fact] public void Split_SubSecond_UsesMillisecondUnit() { var (value, unit) = DurationInput.Split(TimeSpan.FromMilliseconds(250)); Assert.Equal("250", value); Assert.Equal("ms", unit); } // ── Compose: (value, unit) -> TimeSpan? ──────────────────────────────── /// Verifies that composing a blank value returns null. [Fact] public void Compose_Blank_ReturnsNull() => Assert.Null(DurationInput.Compose(null, "sec")); /// Verifies that composing a zero value returns null. [Fact] public void Compose_Zero_ReturnsNull() => Assert.Null(DurationInput.Compose("0", "sec")); /// Verifies that composing a negative value returns null. [Fact] public void Compose_Negative_ReturnsNull() => Assert.Null(DurationInput.Compose("-5", "sec")); /// Verifies that composing a seconds value builds the matching duration. [Fact] public void Compose_SecondsValue_BuildsDuration() => Assert.Equal(TimeSpan.FromSeconds(30), DurationInput.Compose("30", "sec")); /// Verifies that composing a minutes value builds the matching duration. [Fact] public void Compose_MinutesValue_BuildsDuration() => Assert.Equal(TimeSpan.FromMinutes(5), DurationInput.Compose("5", "min")); /// Verifies that composing a milliseconds value builds the matching duration. [Fact] public void Compose_MillisecondsValue_BuildsDuration() => Assert.Equal(TimeSpan.FromMilliseconds(250), DurationInput.Compose("250", "ms")); // ── Round-trip ───────────────────────────────────────────────────────── /// Verifies that splitting and then composing a duration preserves it. /// The duration in milliseconds. [Theory] [InlineData(250)] [InlineData(30000)] [InlineData(300000)] public void RoundTrip_PreservesDuration(long milliseconds) { var original = TimeSpan.FromMilliseconds(milliseconds); var (value, unit) = DurationInput.Split(original); var reparsed = DurationInput.Compose(value, unit); Assert.Equal(original, reparsed); } }