using Omika.Core.Observability; namespace Omika.Tests.Observability; public class EventCodeTests { [Fact] public void Create_Valid_ProducesCanonicalValue() { EventCode code = EventCode.Create("mob", "sync", 1); Assert.True(code.IsValid); Assert.Equal("OMK-MOB-SYNC-001", code.Value); Assert.Equal("MOB", code.Zone); Assert.Equal("SYNC", code.Domain); Assert.Equal(1, code.Number); } [Theory] [InlineData("M", "SYNC", 1)] [InlineData("MOBILE", "SYNC", 1)] [InlineData("MOB", "S", 1)] public void Create_InvalidZoneOrDomain_Throws(string zone, string domain, int number) { Assert.Throws(() => EventCode.Create(zone, domain, number)); } [Theory] [InlineData("MOB", "SYNC", 0)] [InlineData("MOB", "SYNC", 1000)] [InlineData("MOB", "SYNC", -1)] public void Create_InvalidNumber_Throws(string zone, string domain, int number) { Assert.ThrowsAny(() => EventCode.Create(zone, domain, number)); } [Fact] public void Parse_ValidValue_ReturnsValid() { EventCode code = EventCode.Parse("OMK-MOB-SYNC-001"); Assert.True(code.IsValid); Assert.Equal("OMK-MOB-SYNC-001", code.Value); } [Fact] public void Parse_Lowercase_Canonicalizes() { EventCode code = EventCode.Parse("omk-mob-sync-001"); Assert.True(code.IsValid); Assert.Equal("OMK-MOB-SYNC-001", code.Value); } [Theory] [InlineData(null)] [InlineData("")] [InlineData(" ")] [InlineData("BAD")] [InlineData("OMK-MOB-SYNC")] [InlineData("OMK-MOB-SYNC-0000")] [InlineData("OMK-MOB-SYNC-ABC")] [InlineData("XX-MOB-SYNC-001")] public void Parse_Invalid_ReturnsInvalid(string? value) { Assert.False(EventCode.Parse(value).IsValid); } [Fact] public void Default_IsInvalid() { Assert.False(default(EventCode).IsValid); Assert.Null(default(EventCode).Value); } [Fact] public void Equality_IsCaseSensitiveCanonical() { Assert.Equal(EventCode.Create("MOB", "SYNC", 1), EventCode.Parse("omk-mob-sync-001")); } }