diff --git a/docs/knowledgebase/gui-architecture-deferred.md b/docs/knowledgebase/gui-architecture-deferred.md index 7c6dd1a5..3bf3c83a 100644 --- a/docs/knowledgebase/gui-architecture-deferred.md +++ b/docs/knowledgebase/gui-architecture-deferred.md @@ -62,6 +62,7 @@ Plans: `docs/plans/2026-06-03-012`, `021`–`029`, `033`–`057`. Surface refere | Directory picker init/sync → `SettingsService` | Done | plan `075`, PR #123 | | Mod context menu + global flyout → `MenuBuilderService` | Done | plan `072`, PR #130 | +**Headless tests:** `dotnet test src/ModSync.Tests/ModSync.Tests.csproj --filter SettingsService` (plan `077`); `--filter MenuBuilderService` (plan `072`); `--filter FilterItemModel` (plan `112`). **Headless tests:** `dotnet test src/ModSync.Tests/ModSync.Tests.csproj --filter SettingsService` (plan `077`); `--filter MenuBuilderService` (plan `072`); `--filter FileTreeNode` (plan `111`). **Headless tests:** `dotnet test src/ModSync.Tests/ModSync.Tests.csproj --filter SettingsService` (plan `077`); `--filter MenuBuilderService` (plan `072`); `--filter ArchiveEnumerationService` (plan `110`). **Headless tests:** `dotnet test src/ModSync.Tests/ModSync.Tests.csproj --filter SettingsService` (plan `077`); `--filter MenuBuilderService` (plan `072`); `--filter ValidationServiceTests` (plan `109`). 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); + } + } +}