feat: prioritize word starts and app acronyms in search

This commit is contained in:
2026-10-11 21:16:18 +02:00
parent e9ac609884
commit 3714fc516b
3 changed files with 73 additions and 8 deletions
+39 -4
View File
@@ -2,16 +2,51 @@ import ConjureKit
import Foundation
import Testing
@Test func searchRanksExactPrefixSubstringAndFuzzyMatches() {
let names = ["Caramel", "My cl Tool", "Cloud", "Cold", "CL", "Unrelated"]
@Test func searchRanksExactPrefixWordPrefixInitialsSubstringAndFuzzyMatches() {
let names = ["Logic", "Agc Utility", "Great Console", "Google Chrome", "Tool GC Helper", "GCompiler", "GC", "Unrelated"]
let applications = names.map(application)
#expect(ApplicationSearch.results(for: "cl", in: applications).map(\.name) == [
"CL", "Cloud", "My cl Tool", "Cold", "Caramel",
#expect(ApplicationSearch.results(for: "gc", in: applications).map(\.name) == [
"GC", "GCompiler", "Tool GC Helper", "Google Chrome", "Great Console", "Agc Utility", "Logic",
])
#expect(ApplicationSearch.results(for: "zq", in: applications).isEmpty)
}
@Test func wordPrefixesIncludePartialPhrasesWithoutPromotingInteriorSubstrings() {
let applications = ["ADisk Utility", "Open Disk Utility", "Disk Utility"].map(application)
#expect(ApplicationSearch.results(for: "disk u", in: applications).map(\.name) == [
"Disk Utility", "Open Disk Utility", "ADisk Utility",
])
}
@Test func wordStartsHandlePunctuationDigitsAndAccentFolding() {
let cases = [
("ss", "System_Settings", "Mississippi"),
("2m", "Audio 2 MIDI", "A2M Tools"),
(" \n ÉN \t ", "Éditeur Numérique", "Aen Utility"),
("sys", "★ System Settings", "Asystem"),
]
for (query, name, interiorMatch) in cases {
let applications = [interiorMatch, name].map(application)
#expect(ApplicationSearch.results(for: query, in: applications).map(\.name) == [
name, interiorMatch,
])
}
}
@Test func wordInitialsMatchInOrderAndCanSkipWords() {
let applications = ["Vocal", "Avoid Chords", "Voice Control", "Visual Studio Code"].map(application)
#expect(ApplicationSearch.results(for: "vc", in: applications).map(\.name) == [
"Visual Studio Code", "Voice Control", "Vocal", "Avoid Chords",
])
#expect(ApplicationSearch.results(for: "vsc", in: applications).map(\.name) == [
"Visual Studio Code",
])
#expect(ApplicationSearch.results(for: "cv", in: applications).isEmpty)
}
@Test func searchFoldsAccentsAndTrimsWhitespace() {
let applications = ["Decafé", "Caféteria", "Café", "Camera"].map(application)