diff --git a/Sharprompt.Tests/PaginatorTests.cs b/Sharprompt.Tests/PaginatorTests.cs index 3d9b8c9..de733d9 100644 --- a/Sharprompt.Tests/PaginatorTests.cs +++ b/Sharprompt.Tests/PaginatorTests.cs @@ -87,4 +87,45 @@ public void SelectedItem_EmptyList() Assert.False(selected); } + + [Fact] + public void SelectedItem_ExactMatch() + { + var items = new[] { "Select", "SelectWithEnum", "MultiSelect", "MultiSelectWithEnum" }; + var paginator = new Paginator(items, items.Length, Optional.Empty, x => x); + + paginator.UpdateFilter("Select"); + + var selected = paginator.TryGetSelectedItem(out var selectedItem); + + Assert.True(selected); + Assert.Equal("Select", selectedItem); + } + + [Fact] + public void SelectedItem_ExactMatch_CaseInsensitive() + { + var items = new[] { "Select", "SelectWithEnum", "MultiSelect", "MultiSelectWithEnum" }; + var paginator = new Paginator(items, items.Length, Optional.Empty, x => x); + + paginator.UpdateFilter("select"); + + var selected = paginator.TryGetSelectedItem(out var selectedItem); + + Assert.True(selected); + Assert.Equal("Select", selectedItem); + } + + [Fact] + public void SelectedItem_NoExactMatch() + { + var items = new[] { "Select", "SelectWithEnum", "MultiSelect", "MultiSelectWithEnum" }; + var paginator = new Paginator(items, items.Length, Optional.Empty, x => x); + + paginator.UpdateFilter("Sel"); + + var selected = paginator.TryGetSelectedItem(out _); + + Assert.False(selected); + } } diff --git a/Sharprompt/Internal/Paginator.cs b/Sharprompt/Internal/Paginator.cs index d94e7c2..2c8f424 100644 --- a/Sharprompt/Internal/Paginator.cs +++ b/Sharprompt/Internal/Paginator.cs @@ -49,6 +49,19 @@ public bool TryGetSelectedItem([NotNullWhen(true)] out T? selectedItem) if (_selectedIndex == -1 || _filteredItems.Length == 0) { + if (!string.IsNullOrEmpty(FilterKeyword)) + { + foreach (var item in _filteredItems) + { + if (_textSelector(item).Equals(FilterKeyword, StringComparison.OrdinalIgnoreCase)) + { + selectedItem = item; + + return true; + } + } + } + selectedItem = default; return false;