using Shouldly; using Xunit; namespace ZB.MOM.WW.OtOpcUa.Cluster.Tests; public sealed class RoleParserTests { /// Verifies that empty input yields an empty array. /// The raw input string to test (null, empty, or whitespace). [Theory] [InlineData(null)] [InlineData("")] [InlineData(" ")] public void Empty_input_yields_empty_array(string? raw) { RoleParser.Parse(raw).ShouldBeEmpty(); } /// Verifies that a single role 'admin' is parsed correctly. [Fact] public void Single_role_admin() { RoleParser.Parse("admin").ShouldBe(new[] { "admin" }); } /// Verifies that two roles separated by comma are parsed correctly. [Fact] public void Two_roles_csv() { RoleParser.Parse("admin,driver").ShouldBe(new[] { "admin", "driver" }); } /// Verifies that parser tolerates surrounding whitespace. [Fact] public void Whitespace_tolerant() { RoleParser.Parse(" admin , driver ").ShouldBe(new[] { "admin", "driver" }); } /// Verifies that parser is case-insensitive and normalizes to lowercase. [Fact] public void Case_insensitive_normalizes_to_lower() { RoleParser.Parse("ADMIN,Driver").ShouldBe(new[] { "admin", "driver" }); } /// Verifies that duplicate roles are removed. [Fact] public void Duplicate_roles_deduped() { RoleParser.Parse("admin,admin,driver").ShouldBe(new[] { "admin", "driver" }); } /// Verifies that parser throws for unknown roles. [Fact] public void Unknown_role_throws() { Should.Throw(() => RoleParser.Parse("admin,master")); } }