feat: add TextInserter with clipboard restore and PassthroughCleaner
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,63 @@
|
||||
import Foundation
|
||||
import Testing
|
||||
@testable import SstCore
|
||||
|
||||
final class FakePasteboard: PasteboardProviding {
|
||||
var items: [PasteboardItem] = []
|
||||
|
||||
func readItems() -> [PasteboardItem] { items }
|
||||
func writeString(_ text: String) {
|
||||
items = [["public.utf8-plain-text": Data(text.utf8)]]
|
||||
}
|
||||
func writeItems(_ items: [PasteboardItem]) { self.items = items }
|
||||
}
|
||||
|
||||
final class FakePaster: KeystrokePosting {
|
||||
var shouldFail = false
|
||||
var onPaste: (() -> Void)?
|
||||
private(set) var pasteCount = 0
|
||||
|
||||
func postPaste() throws {
|
||||
pasteCount += 1
|
||||
if shouldFail { throw TestError() }
|
||||
onPaste?()
|
||||
}
|
||||
}
|
||||
|
||||
struct TextInserterTests {
|
||||
let pasteboard = FakePasteboard()
|
||||
let paster = FakePaster()
|
||||
|
||||
func makeInserter() -> TextInserter {
|
||||
TextInserter(pasteboard: pasteboard, paster: paster, restoreDelay: .zero)
|
||||
}
|
||||
|
||||
@Test func pastesTextThenRestoresPreviousClipboard() async throws {
|
||||
let original: [PasteboardItem] = [["public.utf8-plain-text": Data("oud".utf8)]]
|
||||
pasteboard.items = original
|
||||
var seenAtPaste: Data?
|
||||
paster.onPaste = { seenAtPaste = pasteboard.items.first?["public.utf8-plain-text"] }
|
||||
|
||||
try await makeInserter().insert("hallo")
|
||||
|
||||
#expect(seenAtPaste == Data("hallo".utf8))
|
||||
#expect(paster.pasteCount == 1)
|
||||
#expect(pasteboard.items == original)
|
||||
}
|
||||
|
||||
@Test func failedPasteLeavesTextOnClipboard() async {
|
||||
pasteboard.items = [["public.utf8-plain-text": Data("oud".utf8)]]
|
||||
paster.shouldFail = true
|
||||
|
||||
await #expect(throws: TestError.self) {
|
||||
try await makeInserter().insert("hallo")
|
||||
}
|
||||
|
||||
#expect(pasteboard.items.first?["public.utf8-plain-text"] == Data("hallo".utf8))
|
||||
}
|
||||
|
||||
@Test func passthroughCleanerReturnsTextUnchanged() async throws {
|
||||
let result = try await PassthroughCleaner().clean("hoi", context: CleaningContext())
|
||||
#expect(result == "hoi")
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user