From c8e6f2ee36852af3bb45544de3f701ea7397c313 Mon Sep 17 00:00:00 2001 From: Copilot Date: Wed, 10 Jun 2026 23:11:25 -0500 Subject: [PATCH] test: add TierFilterItem and SelectionFilterItem model coverage Cover display text and selection state used by mod list filter sidebar models. --- .../gui-architecture-deferred.md | 2 +- ...-06-04-112-test-filter-item-models-plan.md | 19 +++++ src/ModSync.Tests/FilterItemModelTests.cs | 78 +++++++++++++++++++ 3 files changed, 98 insertions(+), 1 deletion(-) create mode 100644 docs/plans/2026-06-04-112-test-filter-item-models-plan.md create mode 100644 src/ModSync.Tests/FilterItemModelTests.cs diff --git a/docs/knowledgebase/gui-architecture-deferred.md b/docs/knowledgebase/gui-architecture-deferred.md index 84f2c7db..a8e6a36f 100644 --- a/docs/knowledgebase/gui-architecture-deferred.md +++ b/docs/knowledgebase/gui-architecture-deferred.md @@ -62,7 +62,7 @@ Plans: `docs/plans/2026-06-03-012`, `021`–`029`, `033`–`057`. Surface refere | Directory picker init/sync → `SettingsService` | Done | plan `075`, PR pending | | Mod context menu + global flyout → `MenuBuilderService` | Pending | plan `072`, PR #120 | -**Headless tests:** `dotnet test src/ModSync.Tests/ModSync.Tests.csproj --filter SettingsService` (plan `077`, complements PR #123 picker wiring). +**Headless tests:** `dotnet test src/ModSync.Tests/ModSync.Tests.csproj --filter SettingsService` (plan `077`, complements PR #123 picker wiring); `--filter FilterItemModel` (plan `112`). **Agent guidance:** Do not add new feature logic inline without a plan; prefer `src/ModSync.GUI/Services/`. diff --git a/docs/plans/2026-06-04-112-test-filter-item-models-plan.md b/docs/plans/2026-06-04-112-test-filter-item-models-plan.md new file mode 100644 index 00000000..f9094e89 --- /dev/null +++ b/docs/plans/2026-06-04-112-test-filter-item-models-plan.md @@ -0,0 +1,19 @@ +--- +title: "test: TierFilterItem and SelectionFilterItem models" +status: shipped +pr: pending +--- + +# test: TierFilterItem and SelectionFilterItem models + +## Problem + +Filter sidebar models format tier/category labels and selection state but had no dedicated tests beyond `FilterUIService` integration coverage. + +## Solution + +Add `FilterItemModelTests` for `DisplayText`, `EffectiveSelection`, and selection toggles. + +## Verification + +`dotnet test src/ModSync.Tests/ModSync.Tests.csproj --filter FilterItemModel diff --git a/src/ModSync.Tests/FilterItemModelTests.cs b/src/ModSync.Tests/FilterItemModelTests.cs new file mode 100644 index 00000000..d7b50629 --- /dev/null +++ b/src/ModSync.Tests/FilterItemModelTests.cs @@ -0,0 +1,78 @@ +// Copyright 2021-2025 ModSync +// Licensed under the Business Source License 1.1 (BSL 1.1). +// See LICENSE.txt file in the project root for full license information. + +using ModSync.Models; +using Xunit; + +namespace ModSync.Tests +{ + public sealed class FilterItemModelTests + { + [Fact(DisplayName = "TierFilterItem DisplayText formats name and count")] + public void TierFilterItem_DisplayText_FormatsNameAndCount() + { + var item = new TierFilterItem + { + Name = "1 - Essential", + Count = 3, + }; + + Assert.Equal("1 - Essential (3)", item.DisplayText); + } + + [Fact(DisplayName = "TierFilterItem EffectiveSelection reflects selected or included state")] + public void TierFilterItem_EffectiveSelection_ReflectsSelectionState() + { + var item = new TierFilterItem(); + + item.IsIncluded = true; + Assert.True(item.EffectiveSelection); + + item.IsIncluded = false; + item.IsSelected = true; + Assert.True(item.EffectiveSelection); + + item.IsSelected = false; + Assert.False(item.EffectiveSelection); + } + + [Fact(DisplayName = "TierFilterItem count change updates DisplayText")] + public void TierFilterItem_CountChange_UpdatesDisplayText() + { + var item = new TierFilterItem + { + Name = "2 - Recommended", + Count = 1, + }; + + item.Count = 5; + + Assert.Equal("2 - Recommended (5)", item.DisplayText); + } + + [Fact(DisplayName = "SelectionFilterItem DisplayText formats name and count")] + public void SelectionFilterItem_DisplayText_FormatsNameAndCount() + { + var item = new SelectionFilterItem + { + Name = "Patch", + Count = 2, + }; + + Assert.Equal("Patch (2)", item.DisplayText); + } + + [Fact(DisplayName = "SelectionFilterItem IsSelected toggles independently")] + public void SelectionFilterItem_IsSelected_Toggles() + { + var item = new SelectionFilterItem { IsSelected = false }; + + item.IsSelected = true; + Assert.True(item.IsSelected); + + item.IsSelected = false; + Assert.False(item.IsSelected); + } + } +}