using System; using XplorePlane.Tests.Helpers; using XplorePlane.ViewModels; using Xunit; namespace XplorePlane.Tests.Pipeline { /// /// 测试 OperatorToolboxViewModel 搜索过滤逻辑(任务 6.7) /// public class OperatorToolboxViewModelTests { private OperatorToolboxViewModel CreateVm(string[]? keys = null) { var mock = TestHelpers.CreateMockImageService(keys); return new OperatorToolboxViewModel(mock.Object); } [Fact] public void EmptySearch_ReturnsAllOperators() { var vm = CreateVm(new[] { "Blur", "Sharpen", "Threshold" }); vm.SearchText = string.Empty; Assert.Equal(3, vm.FilteredOperators.Count); } [Fact] public void NullSearch_ReturnsAllOperators() { var vm = CreateVm(new[] { "Blur", "Sharpen", "Threshold" }); vm.SearchText = null!; Assert.Equal(3, vm.FilteredOperators.Count); } [Fact] public void WhitespaceSearch_ReturnsAllOperators() { var vm = CreateVm(new[] { "Blur", "Sharpen", "Threshold" }); vm.SearchText = " "; Assert.Equal(3, vm.FilteredOperators.Count); } [Fact] public void SearchText_FiltersMatchingOperators() { // DisplayName = Key + "算子",所以 "Blur算子" 包含 "Blur" var vm = CreateVm(new[] { "Blur", "Sharpen", "Threshold" }); vm.SearchText = "Blur"; Assert.Single(vm.FilteredOperators); Assert.Equal("Blur", vm.FilteredOperators[0].Key); } [Fact] public void SearchText_CaseInsensitive() { var vm = CreateVm(new[] { "Blur", "Sharpen", "Threshold" }); vm.SearchText = "blur"; Assert.Single(vm.FilteredOperators); } [Fact] public void SearchText_NoMatch_ReturnsEmpty() { var vm = CreateVm(new[] { "Blur", "Sharpen", "Threshold" }); vm.SearchText = "XYZ_NOT_EXIST"; Assert.Empty(vm.FilteredOperators); } [Fact] public void SearchText_PartialMatch_ReturnsMatching() { var vm = CreateVm(new[] { "Blur", "Sharpen", "Threshold" }); vm.SearchText = "算子"; // 所有 DisplayName 都包含"算子" Assert.Equal(3, vm.FilteredOperators.Count); } [Fact] public void FilteredOperators_EachContainsSearchText() { var vm = CreateVm(new[] { "Blur", "Sharpen", "Threshold" }); vm.SearchText = "Sh"; foreach (var op in vm.FilteredOperators) Assert.Contains("Sh", op.DisplayName, StringComparison.OrdinalIgnoreCase); } [Fact] public void NoOperators_EmptySearch_ReturnsEmpty() { var vm = CreateVm(Array.Empty()); vm.SearchText = string.Empty; Assert.Empty(vm.FilteredOperators); } } }