SettingsSearchTests.swift 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. import Foundation
  2. import Testing
  3. @testable import Trio
  4. @Suite("Settings Search Navigation") struct SettingsSearchTests {
  5. @Test("Searching 'Dynamic ISF' finds the Dynamic Settings screen") func searchDynamicISF() {
  6. let results = SettingItems.filteredItems(searchText: "Dynamic ISF")
  7. #expect(!results.isEmpty)
  8. let match = results.first { $0.matchedContent == "Dynamic ISF" }
  9. #expect(match != nil)
  10. #expect(match?.settingItem.view == .dynamicISF)
  11. #expect(match?.scrollLabel == "Dynamic ISF")
  12. }
  13. @Test("All scrollTargetLabels have valid non-empty targets") func scrollTargetLabelsNonEmpty() {
  14. for item in SettingItems.allItems {
  15. guard let labels = item.scrollTargetLabels else { continue }
  16. for (key, value) in labels {
  17. #expect(!value.isEmpty)
  18. #expect(item.searchContents?.contains(key) == true)
  19. }
  20. }
  21. }
  22. @Test("Every searchContents entry produces at least one result") func allSearchContentsAreSearchable() {
  23. for item in SettingItems.allItems {
  24. guard let contents = item.searchContents else { continue }
  25. for content in contents {
  26. let results = SettingItems.filteredItems(searchText: content)
  27. #expect(!results.isEmpty)
  28. }
  29. }
  30. }
  31. @Test("SearchResultTarget is Hashable and equatable by value") func searchResultTargetHashable() {
  32. let a = SearchResultTarget(screen: .dynamicISF, scrollLabel: "Dynamic ISF")
  33. let b = SearchResultTarget(screen: .dynamicISF, scrollLabel: "Dynamic ISF")
  34. let c = SearchResultTarget(screen: .dynamicISF, scrollLabel: "Adjust Basal")
  35. #expect(a == b)
  36. #expect(a != c)
  37. #expect(a.hashValue == b.hashValue)
  38. }
  39. @Test("SettingsSearchHighlight starts nil and accepts assignments")
  40. @MainActor func highlightStateTransitions() {
  41. let highlight = SettingsSearchHighlight()
  42. #expect(highlight.highlightedSetting == nil)
  43. highlight.highlightedSetting = "Dynamic ISF"
  44. #expect(highlight.highlightedSetting == "Dynamic ISF")
  45. highlight.highlightedSetting = nil
  46. #expect(highlight.highlightedSetting == nil)
  47. }
  48. @Test("SettingsSearchHighlight can be set and cleared in sequence")
  49. @MainActor func highlightSequentialUpdates() async {
  50. let highlight = SettingsSearchHighlight()
  51. highlight.highlightedSetting = "First Setting"
  52. #expect(highlight.highlightedSetting == "First Setting")
  53. highlight.highlightedSetting = "Second Setting"
  54. #expect(highlight.highlightedSetting == "Second Setting")
  55. highlight.highlightedSetting = nil
  56. #expect(highlight.highlightedSetting == nil)
  57. }
  58. }