diff --git a/damus/Views/Posting/UserSearch.swift b/damus/Views/Posting/UserSearch.swift index f39be601..7de3b228 100644 --- a/damus/Views/Posting/UserSearch.swift +++ b/damus/Views/Posting/UserSearch.swift @@ -47,7 +47,7 @@ struct UserSearch: View { tagModel.diff = appended.tag.length - wordRange.length focusWordAttributes = (nil, nil) - newCursorIndex = wordRange.location + appended.tag.string.count + newCursorIndex = wordRange.location + appended.tag.length } var body: some View { diff --git a/damusTests/UserSearchAppendTests.swift b/damusTests/UserSearchAppendTests.swift new file mode 100644 index 00000000..897b7d5e --- /dev/null +++ b/damusTests/UserSearchAppendTests.swift @@ -0,0 +1,54 @@ +// +// Created by Jericho Hasselbush on 9/9/23. +// + + +// Test fix for https://github.com/damus-io/damus/issues/1525 +// Only change in damus source is in UserSearch.swift +// UserSearch.appendUserTag + +import XCTest +@testable import damus + +final class UserSearchAppendTests: XCTestCase { + func testCursorShouldBeAtEndOfEmoji() throws { + let simpleTag = NSMutableAttributedString("@JB55") + let emojiTag = NSMutableAttributedString("@BTCapsule 🏴🧡") + let post = NSMutableAttributedString("A Post") + + var cursorIndex: Int = 0 + appendUserTag(withTag: simpleTag, post: post, word_range: .init(location: 0, length: 0), newCursorIndex: &cursorIndex, spy: simulatedCursor ) + XCTAssertEqual(cursorIndex, simpleTag.length + 1) // +1 for past end of tag + cursorIndex = 0 + appendUserTag(withTag: emojiTag, post: post, word_range: .init(location: 0, length: 0), newCursorIndex: &cursorIndex, spy: simulatedCursor) + XCTAssertEqual(cursorIndex, emojiTag.length + 1) // +1 for past end of tag + } +} + +typealias CursorSpy = (Int, NSMutableAttributedString) -> Void + +var simulatedCursor: CursorSpy = { cursorIndex, tag in + let tagWithSimulatedCursor = NSMutableAttributedString(attributedString: tag) + if tagWithSimulatedCursor.length < cursorIndex { + tagWithSimulatedCursor.append(.init(string: "|")) + } else { + tagWithSimulatedCursor.insert(.init(string: "|"), at: cursorIndex) + } + print(tagWithSimulatedCursor.string) +} + +func appendUserTag(withTag tag: NSMutableAttributedString, + post: NSMutableAttributedString, + word_range: NSRange, + newCursorIndex: inout Int, + spy: CursorSpy = { _, _ in }) { + let appended = append_user_tag(tag: tag, post: post, word_range: word_range) + + // faulty call +// newCursorIndex = word_range.location + appended.tag.string.count + + // good call + newCursorIndex = word_range.location + appended.tag.length + + spy(newCursorIndex, tag) +}