diff --git a/src/ClaudeDo.Ui/Services/InheritanceResolver.cs b/src/ClaudeDo.Ui/Services/InheritanceResolver.cs new file mode 100644 index 0000000..a62f3ec --- /dev/null +++ b/src/ClaudeDo.Ui/Services/InheritanceResolver.cs @@ -0,0 +1,23 @@ +namespace ClaudeDo.Ui.Services; + +public enum InheritSource { Override, List, Global } + +public static class InheritanceResolver +{ + // Task-scope fields: task -> list -> global. + public static (string Value, InheritSource Source) Resolve( + string? taskValue, string? listValue, string? globalValue) + { + if (!string.IsNullOrWhiteSpace(taskValue)) return (taskValue!, InheritSource.Override); + if (!string.IsNullOrWhiteSpace(listValue)) return (listValue!, InheritSource.List); + return (globalValue ?? "", InheritSource.Global); + } + + // List-scope fields: list -> global (lists have no tier above them). + public static (string Value, InheritSource Source) ResolveList( + string? listValue, string? globalValue) + { + if (!string.IsNullOrWhiteSpace(listValue)) return (listValue!, InheritSource.Override); + return (globalValue ?? "", InheritSource.Global); + } +} diff --git a/tests/ClaudeDo.Ui.Tests/InheritanceResolverTests.cs b/tests/ClaudeDo.Ui.Tests/InheritanceResolverTests.cs new file mode 100644 index 0000000..706d2a5 --- /dev/null +++ b/tests/ClaudeDo.Ui.Tests/InheritanceResolverTests.cs @@ -0,0 +1,43 @@ +using ClaudeDo.Ui.Services; +using Xunit; + +namespace ClaudeDo.Ui.Tests; + +public class InheritanceResolverTests +{ + [Fact] + public void Task_value_is_an_override() + { + var (value, source) = InheritanceResolver.Resolve("opus", "sonnet", "haiku"); + Assert.Equal("opus", value); + Assert.Equal(InheritSource.Override, source); + } + + [Fact] + public void Falls_through_to_list() + { + var (value, source) = InheritanceResolver.Resolve(null, "sonnet", "haiku"); + Assert.Equal("sonnet", value); + Assert.Equal(InheritSource.List, source); + } + + [Fact] + public void Falls_through_to_global() + { + var (value, source) = InheritanceResolver.Resolve(" ", null, "haiku"); + Assert.Equal("haiku", value); + Assert.Equal(InheritSource.Global, source); + } + + [Fact] + public void List_scope_treats_list_value_as_override() + { + var (value, source) = InheritanceResolver.ResolveList("sonnet", "haiku"); + Assert.Equal("sonnet", value); + Assert.Equal(InheritSource.Override, source); + + var (value2, source2) = InheritanceResolver.ResolveList(null, "haiku"); + Assert.Equal("haiku", value2); + Assert.Equal(InheritSource.Global, source2); + } +}