From 6050267123fd8d7c2aa1b4e921baaa583151ab66 Mon Sep 17 00:00:00 2001 From: Mauro Romito Date: Tue, 18 Mar 2025 12:45:22 +0100 Subject: [PATCH] fix: completion service matches now any character also added a test for it --- .../CompletionSuggestionService.swift | 9 +++--- .../CompletionSuggestionServiceTests.swift | 29 +++++++++++++++++++ 2 files changed, 34 insertions(+), 4 deletions(-) diff --git a/ElementX/Sources/Screens/RoomScreen/ComposerToolbar/CompletionSuggestionService.swift b/ElementX/Sources/Screens/RoomScreen/ComposerToolbar/CompletionSuggestionService.swift index ee29ea029..ec24e280f 100644 --- a/ElementX/Sources/Screens/RoomScreen/ComposerToolbar/CompletionSuggestionService.swift +++ b/ElementX/Sources/Screens/RoomScreen/ComposerToolbar/CompletionSuggestionService.swift @@ -9,7 +9,8 @@ import Combine import Foundation private enum SuggestionTriggerRegex { - static let atOrHash = /[@#]\w*/ + /// Matches any string of characters after an @ or # that is not a whitespace + static let atOrHash = /[@#]\S*/ static let at: Character = "@" static let hash: Character = "#" @@ -138,11 +139,11 @@ final class CompletionSuggestionService: CompletionSuggestionServiceProtocol { guard !searchText.isEmpty else { return true } - let containedInUserID = userID.localizedStandardContains(searchText.lowercased()) + let containedInUserID = userID.localizedStandardContains(searchText) let containedInDisplayName: Bool if let displayName { - containedInDisplayName = displayName.localizedStandardContains(searchText.lowercased()) + containedInDisplayName = displayName.localizedStandardContains(searchText) } else { containedInDisplayName = false } @@ -155,6 +156,6 @@ final class CompletionSuggestionService: CompletionSuggestionServiceProtocol { guard !searchText.isEmpty else { return true } - return roomName.localizedStandardContains(searchText.lowercased()) || roomAlias.localizedStandardContains(searchText.lowercased()) + return roomName.localizedStandardContains(searchText) || roomAlias.localizedStandardContains(searchText) } } diff --git a/UnitTests/Sources/CompletionSuggestionServiceTests.swift b/UnitTests/Sources/CompletionSuggestionServiceTests.swift index b56520101..2e7ed4451 100644 --- a/UnitTests/Sources/CompletionSuggestionServiceTests.swift +++ b/UnitTests/Sources/CompletionSuggestionServiceTests.swift @@ -372,4 +372,33 @@ final class CompletionSuggestionServiceTests: XCTestCase { service.processTextMessage("#pr test @al", selectedRange: .init(location: 9, length: 1)) try await deffered.fulfill() } + + func testSuggestionsContainingNonAlphanumericCharacters() async throws { + let alice: RoomMemberProxyMock = .mockAlice + // We keep the users in the tests since they should not appear in the suggestions when using the room trigger + let members: [RoomMemberProxyMock] = [alice, .mockBob, .mockCharlie, .mockMe] + let roomProxyMock = JoinedRoomProxyMock(.init(id: "roomID", name: "test", members: members)) + let roomSummaryProvider = RoomSummaryProviderMock(.init(state: .loaded(.mockRooms))) + let service = CompletionSuggestionService(roomProxy: roomProxyMock, + roomListPublisher: roomSummaryProvider.roomListPublisher.eraseToAnyPublisher()) + + var deferred = deferFulfillment(service.suggestionsPublisher) { suggestions in + suggestions == [] + } + + try await deferred.fulfill() + + deferred = deferFulfillment(service.suggestionsPublisher) { suggestions in + suggestions == [.init(suggestionType: .room(.init(id: "6", + canonicalAlias: "#prelude-foundation:matrix.org", + name: "Prelude to Foundation", + avatar: .room(id: "6", + name: "Prelude to Foundation", + avatarURL: nil))), + range: .init(), + rawSuggestionText: "#prelude-")] + } + service.setSuggestionTrigger(.init(type: .room, text: "#prelude-", range: .init())) + try await deferred.fulfill() + } }